diff --git a/DEPS b/DEPS
index 4279eee2c..f432a98b 100644
--- a/DEPS
+++ b/DEPS
@@ -40,7 +40,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '57c9d20102fd53a960293b45e3fed7cb1aac94fd',
+  'skia_revision': 'fcc4a071d9dff4f3bac0bd55dab8f69a4436d15d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
diff --git a/base/android/java/src/org/chromium/base/SysUtils.java b/base/android/java/src/org/chromium/base/SysUtils.java
index e86bd459..5979ca4 100644
--- a/base/android/java/src/org/chromium/base/SysUtils.java
+++ b/base/android/java/src/org/chromium/base/SysUtils.java
@@ -4,6 +4,7 @@
 
 package org.chromium.base;
 
+import android.app.ActivityManager;
 import android.content.Context;
 import android.content.pm.PackageManager;
 import android.os.Build;
@@ -104,6 +105,19 @@
     }
 
     /**
+     * @return Whether or not the system has low available memory.
+     */
+    @CalledByNative
+    private static boolean isCurrentlyLowMemory() {
+        ActivityManager am =
+                (ActivityManager) ContextUtils.getApplicationContext().getSystemService(
+                        Context.ACTIVITY_SERVICE);
+        ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
+        am.getMemoryInfo(info);
+        return info.lowMemory;
+    }
+
+    /**
      * Resets the cached value, if any.
      */
     @VisibleForTesting
diff --git a/base/android/sys_utils.cc b/base/android/sys_utils.cc
index a576644..6201f8c4 100644
--- a/base/android/sys_utils.cc
+++ b/base/android/sys_utils.cc
@@ -16,6 +16,11 @@
   return Java_SysUtils_isLowEndDevice(env);
 }
 
+bool SysUtils::IsCurrentlyLowMemory() {
+  JNIEnv* env = AttachCurrentThread();
+  return Java_SysUtils_isCurrentlyLowMemory(env);
+}
+
 }  // namespace android
 
 }  // namespace base
diff --git a/base/android/sys_utils.h b/base/android/sys_utils.h
index 2edbdd5..b1e368b 100644
--- a/base/android/sys_utils.h
+++ b/base/android/sys_utils.h
@@ -14,6 +14,8 @@
  public:
   // Returns true iff this is a low-end device.
   static bool IsLowEndDeviceFromJni();
+  // Returns true if system has low available memory.
+  static bool IsCurrentlyLowMemory();
 };
 
 }  // namespace android
diff --git a/build/android/pylib/utils/device_dependencies.py b/build/android/pylib/utils/device_dependencies.py
index 9046122..597c883b 100644
--- a/build/android/pylib/utils/device_dependencies.py
+++ b/build/android/pylib/utils/device_dependencies.py
@@ -16,8 +16,12 @@
   re.compile(r'.*\.py'),  # Some test_support targets include python deps.
   re.compile(r'.*\.stamp'),  # Stamp files should never be included.
 
-  # Some test_support targets include python deps.
-  re.compile(r'.*\.mojom\.js'),
+  # Adding dependency on mojom targets adds data dependency on js bindings.
+  # Do not include those files except for JsToCppTest.mojom.js, which is
+  # required by webkit_unit_tests during runtime.
+  # TODO(yzshen): Remove this rule by generating foo_js that targets can
+  # explicitly depend on (crbug.com/603212).
+  re.compile(r'.*(?<!JsToCpp)\.mojom\.js'),
 
   # Chrome external extensions config file.
   re.compile(r'.*external_extensions\.json'),
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index 37bf601..f1f0836 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -472,6 +472,7 @@
     "//components/payments/content/android:java",
     "//components/payments/mojom:mojom_parser_java",
     "//components/policy/android:policy_java",
+    "//components/policy/android:policy_java_test_support",
     "//components/precache/android:precache_java",
     "//components/precache/android:precache_javatests",
     "//components/signin/core/browser/android:java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
index 37d037a..6d265c65 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/locale/LocaleManager.java
@@ -244,6 +244,11 @@
             final Activity activity, final @Nullable Callback<Boolean> onSearchEngineFinalized) {
         assert TemplateUrlService.getInstance().isLoaded();
 
+        if (TemplateUrlService.getInstance().isDefaultSearchManaged()) {
+            if (onSearchEngineFinalized != null) onSearchEngineFinalized.onResult(true);
+            return;
+        }
+
         final int shouldShow = getSearchEnginePromoShowType();
         Callable<PromoDialog> dialogCreator;
         switch (shouldShow) {
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 9f958ec..e0b804ed 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -1459,6 +1459,7 @@
   "javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEngineDialogHelperUtils.java",
   "javatests/src/org/chromium/chrome/browser/locale/DefaultSearchEnginePromoDialogTest.java",
   "javatests/src/org/chromium/chrome/browser/locale/LocaleManagerReferralTest.java",
+  "javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java",
   "javatests/src/org/chromium/chrome/browser/media/RouterTestUtils.java",
   "javatests/src/org/chromium/chrome/browser/media/remote/CastNotificationTest.java",
   "javatests/src/org/chromium/chrome/browser/media/remote/CastPositionTransferTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java
new file mode 100644
index 0000000..35b8457b
--- /dev/null
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/locale/LocaleManagerTest.java
@@ -0,0 +1,87 @@
+// 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.
+
+package org.chromium.chrome.browser.locale;
+
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.Callback;
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.library_loader.ProcessInitException;
+import org.chromium.base.test.util.CallbackHelper;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.chrome.browser.ChromeSwitches;
+import org.chromium.chrome.browser.init.ChromeBrowserInitializer;
+import org.chromium.chrome.browser.searchwidget.SearchActivity;
+import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
+import org.chromium.chrome.test.util.ActivityUtils;
+import org.chromium.policy.test.annotations.Policies;
+
+import java.util.concurrent.TimeoutException;
+
+/**
+ * Integration tests for {@link LocaleManager}.
+ */
+@RunWith(ChromeJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+public class LocaleManagerTest {
+    @Before
+    public void setUp() {
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    ChromeBrowserInitializer
+                            .getInstance(
+                                    InstrumentationRegistry.getInstrumentation().getTargetContext())
+                            .handleSynchronousStartup();
+                } catch (ProcessInitException e) {
+                    Assert.fail("Failed to load browser");
+                }
+            }
+        });
+    }
+
+    @Policies.Add({ @Policies.Item(key = "DefaultSearchProviderEnabled", string = "false") })
+    @SmallTest
+    @Test
+    public void testShowSearchEnginePromoDseDisabled()
+            throws InterruptedException, TimeoutException {
+        final CallbackHelper getShowTypeCallback = new CallbackHelper();
+        LocaleManager.setInstanceForTest(new LocaleManager() {
+            @Override
+            public int getSearchEnginePromoShowType() {
+                getShowTypeCallback.notifyCalled();
+                return LocaleManager.SEARCH_ENGINE_PROMO_DONT_SHOW;
+            }
+        });
+
+        // Launch any activity as an Activity ref is required to attempt to show the activity.
+        final SearchActivity searchActivity = ActivityUtils.waitForActivity(
+                InstrumentationRegistry.getInstrumentation(), SearchActivity.class);
+
+        final CallbackHelper searchEnginesFinalizedCallback = new CallbackHelper();
+        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+            @Override
+            public void run() {
+                LocaleManager.getInstance().showSearchEnginePromoIfNeeded(
+                        searchActivity, new Callback<Boolean>() {
+                            @Override
+                            public void onResult(Boolean result) {
+                                Assert.assertTrue(result);
+                                searchEnginesFinalizedCallback.notifyCalled();
+                            }
+                        });
+            }
+        });
+        searchEnginesFinalizedCallback.waitForCallback(0);
+        Assert.assertEquals(0, getShowTypeCallback.getCallCount());
+    }
+}
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index bad26a43..20a1513 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2321,8 +2321,6 @@
         "safe_browsing/client_side_detection_service.h",
         "safe_browsing/client_side_model_loader.cc",
         "safe_browsing/client_side_model_loader.h",
-        "safe_browsing/disk_image_type_sniffer_mac.cc",
-        "safe_browsing/disk_image_type_sniffer_mac.h",
         "safe_browsing/download_feedback.cc",
         "safe_browsing/download_feedback.h",
         "safe_browsing/download_feedback_service.cc",
diff --git a/chrome/browser/banners/app_banner_manager.cc b/chrome/browser/banners/app_banner_manager.cc
index 9524f7ef..d60e013b 100644
--- a/chrome/browser/banners/app_banner_manager.cc
+++ b/chrome/browser/banners/app_banner_manager.cc
@@ -78,7 +78,7 @@
   }
 
   UpdateState(State::ACTIVE);
-  is_debug_mode_ = is_debug_mode;
+  triggered_by_devtools_ = is_debug_mode;
   page_requested_prompt_ = false;
 
   // We only need to call ReportStatus if we aren't in debug mode (this avoids
@@ -110,6 +110,7 @@
   if (binding_.is_bound())
     binding_.Close();
 
+  UpdateState(State::PENDING_MANIFEST);
   manager_->GetData(
       ParamsToGetManifest(),
       base::Bind(&AppBannerManager::OnDidGetManifest, GetWeakPtr()));
@@ -154,7 +155,7 @@
       has_sufficient_engagement_(false),
       load_finished_(false),
       page_requested_prompt_(false),
-      is_debug_mode_(false),
+      triggered_by_devtools_(false),
       need_to_log_status_(false),
       weak_factory_(this) {
   // Ensure the InstallableManager exists since we have a hard dependency on it.
@@ -193,7 +194,7 @@
 }
 
 bool AppBannerManager::IsDebugMode() const {
-  return is_debug_mode_ ||
+  return triggered_by_devtools_ ||
          base::CommandLine::ForCurrentProcess()->HasSwitch(
              switches::kBypassAppBannerEngagementChecks);
 }
@@ -206,6 +207,7 @@
 }
 
 void AppBannerManager::OnDidGetManifest(const InstallableData& data) {
+  UpdateState(State::ACTIVE);
   if (data.error_code != NO_ERROR_DETECTED) {
     ReportStatus(web_contents(), data.error_code);
     Stop();
@@ -237,6 +239,9 @@
   params.check_installable = true;
   params.fetch_valid_primary_icon = true;
 
+  // Don't wait for the service worker if this was triggered from devtools.
+  params.wait_for_worker = !triggered_by_devtools_;
+
   return params;
 }
 
@@ -245,6 +250,7 @@
     return;
 
   // Fetch and verify the other required information.
+  UpdateState(State::PENDING_INSTALLABLE_CHECK);
   manager_->GetData(ParamsToPerformInstallableCheck(),
                     base::Bind(&AppBannerManager::OnDidPerformInstallableCheck,
                                GetWeakPtr()));
@@ -252,6 +258,7 @@
 
 void AppBannerManager::OnDidPerformInstallableCheck(
     const InstallableData& data) {
+  UpdateState(State::ACTIVE);
   if (data.is_installable)
     TrackDisplayEvent(DISPLAY_EVENT_WEB_APP_BANNER_REQUESTED);
 
@@ -319,21 +326,41 @@
 }
 
 void AppBannerManager::Stop() {
-  if (state_ == State::PENDING_EVENT && !page_requested_prompt_) {
-    TrackBeforeInstallEvent(
-        BEFORE_INSTALL_EVENT_PROMPT_NOT_CALLED_AFTER_PREVENT_DEFAULT);
-    ReportStatus(web_contents(), RENDERER_CANCELLED);
-  } else if (state_ == State::PENDING_ENGAGEMENT &&
-             !has_sufficient_engagement_) {
-    TrackDisplayEvent(DISPLAY_EVENT_NOT_VISITED_ENOUGH);
-    ReportStatus(web_contents(), INSUFFICIENT_ENGAGEMENT);
+  // Record the status if we are currently waiting for data.
+  InstallableStatusCode code = NO_ERROR_DETECTED;
+  switch (state_) {
+    case State::PENDING_EVENT:
+      if (!page_requested_prompt_) {
+        TrackBeforeInstallEvent(
+            BEFORE_INSTALL_EVENT_PROMPT_NOT_CALLED_AFTER_PREVENT_DEFAULT);
+        code = RENDERER_CANCELLED;
+      }
+      break;
+    case State::PENDING_ENGAGEMENT:
+      if (!has_sufficient_engagement_) {
+        TrackDisplayEvent(DISPLAY_EVENT_NOT_VISITED_ENOUGH);
+        code = INSUFFICIENT_ENGAGEMENT;
+      }
+      break;
+    case State::PENDING_MANIFEST:
+      code = WAITING_FOR_MANIFEST;
+      break;
+    case State::PENDING_INSTALLABLE_CHECK:
+      code = WAITING_FOR_INSTALLABLE_CHECK;
+      break;
+    case State::ACTIVE:
+    case State::INACTIVE:
+    case State::COMPLETE:
+      break;
   }
 
+  if (code != NO_ERROR_DETECTED)
+    ReportStatus(web_contents(), code);
+
   // In every non-debug run through the banner pipeline, we should have called
   // ReportStatus() and set need_to_log_status_ to false. The only case where
-  // we don't is if we're still active and waiting for a callback from the
-  // InstallableManager (e.g. the renderer crashes or the browser is shutting
-  // down). These situations are explicitly not logged.
+  // we don't is if we're still active and waiting for native app data, which is
+  // explicitly not logged.
   DCHECK(!need_to_log_status_ || is_active());
 
   weak_factory_.InvalidateWeakPtrs();
diff --git a/chrome/browser/banners/app_banner_manager.h b/chrome/browser/banners/app_banner_manager.h
index d14251b7d..9bd558d 100644
--- a/chrome/browser/banners/app_banner_manager.h
+++ b/chrome/browser/banners/app_banner_manager.h
@@ -101,6 +101,14 @@
     // The banner pipeline is currently running for this page load.
     ACTIVE,
 
+    // The banner pipeline is currently waiting for the page manifest to be
+    // fetched.
+    PENDING_MANIFEST,
+
+    // The banner pipeline is currently waiting for the installability criteria
+    // to be checked.
+    PENDING_INSTALLABLE_CHECK,
+
     // The banner pipeline has finished running, but is waiting for sufficient
     // engagement to trigger the banner.
     PENDING_ENGAGEMENT,
@@ -137,7 +145,7 @@
   virtual int GetIdealPrimaryIconSizeInPx();
   virtual int GetMinimumPrimaryIconSizeInPx();
 
-  // Returns true if |is_debug_mode_| is true or the
+  // Returns true if |triggered_by_devtools_| is true or the
   // kBypassAppBannerEngagementChecks flag is set.
   virtual bool IsDebugMode() const;
 
@@ -212,8 +220,18 @@
   int event_request_id() const { return event_request_id_; }
   bool is_active() const { return state_ == State::ACTIVE; }
   bool is_active_or_pending() const {
-    return state_ == State::ACTIVE || state_ == State::PENDING_ENGAGEMENT ||
-           state_ == State::PENDING_EVENT;
+    switch (state_) {
+      case State::ACTIVE:
+      case State::PENDING_MANIFEST:
+      case State::PENDING_INSTALLABLE_CHECK:
+      case State::PENDING_ENGAGEMENT:
+      case State::PENDING_EVENT:
+        return true;
+      case State::INACTIVE:
+      case State::COMPLETE:
+        return false;
+    }
+    return false;
   }
   bool is_complete() const { return state_ == State::COMPLETE; }
   bool is_pending_engagement() const {
@@ -295,8 +313,8 @@
   // Record whether the page requests for a banner to be shown later on.
   bool page_requested_prompt_;
 
-  // Whether we should be logging errors to the console for this request.
-  bool is_debug_mode_;
+  // Whether the current flow was begun via devtools.
+  bool triggered_by_devtools_;
 
   // Whether the installable status has been logged for this run.
   bool need_to_log_status_;
diff --git a/chrome/browser/chromeos/system_logs/single_log_source.cc b/chrome/browser/chromeos/system_logs/single_log_source.cc
index 0d5b7ae..817c4be3 100644
--- a/chrome/browser/chromeos/system_logs/single_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/single_log_source.cc
@@ -6,7 +6,11 @@
 
 #include "base/bind.h"
 #include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/process/process_info.h"
+#include "base/strings/string_split.h"
 #include "base/task_scheduler/post_task.h"
+#include "base/time/time.h"
 #include "content/public/browser/browser_thread.h"
 
 namespace system_logs {
@@ -16,6 +20,16 @@
 constexpr char kDefaultSystemLogDirPath[] = "/var/log";
 constexpr int kMaxNumAllowedLogRotationsDuringFileRead = 3;
 
+// For log files that contain old logging, start reading from the first
+// timestamp that is less than this amount of time before the current session of
+// Chrome started.
+constexpr base::TimeDelta kLogCutoffTimeBeforeChromeStart =
+    base::TimeDelta::FromMinutes(10);
+
+// A custom timestamp for when the current Chrome session started. Used during
+// testing to override the actual time.
+const base::Time* g_chrome_start_time_for_test = nullptr;
+
 // Converts a logs source type to the corresponding file path, relative to the
 // base system log directory path. In the future, if non-file source types are
 // added, this function should return an empty file path.
@@ -53,10 +67,74 @@
     iter->second += value;
 }
 
+// Returns the time that the current Chrome process started. Will instead return
+// |*g_chrome_start_time_for_test| if it is set.
+base::Time GetChromeStartTime() {
+  if (g_chrome_start_time_for_test)
+    return *g_chrome_start_time_for_test;
+  return base::CurrentProcessInfo::CreationTime();
+}
+
+// Returns the file offset into |path| of the first line that starts with a
+// timestamp no earlier than |time|. Returns 0 if no such offset could be
+// determined (e.g. can't open file, no timestamps present).
+size_t GetFirstFileOffsetWithTime(const base::FilePath& path,
+                                  const base::Time& time) {
+  base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+  if (!file.IsValid())
+    return 0;
+
+  const size_t file_size = file.GetLength();
+  if (file_size == 0)
+    return 0;
+
+  std::string file_contents;
+  file_contents.resize(file_size);
+  size_t size_read = file.ReadAtCurrentPos(&file_contents[0], file_size);
+
+  if (size_read < file_size)
+    return 0;
+
+  std::vector<base::StringPiece> lines = base::SplitStringPiece(
+      file_contents, "\n", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL);
+
+  bool any_timestamp_found = false;
+
+  // Find the first line with timestamp >= |time|. If a line has no timestamp,
+  // just advance to the next line.
+  size_t offset = 0;
+  base::Time timestamp;
+  for (const auto& line : lines) {
+    if (base::Time::FromString(line.as_string().c_str(), &timestamp)) {
+      any_timestamp_found = true;
+
+      if (timestamp >= time)
+        break;
+    }
+
+    // Include the newline in the offset.
+    offset += line.length() + 1;
+  }
+
+  // If the file does not have any timestamps at all, don't skip any contents.
+  if (!any_timestamp_found)
+    return 0;
+
+  if (offset > 0 && offset >= file_size && lines.back().as_string().empty()) {
+    // The last line may or may not have ended with a newline. If it ended with
+    // a newline, |lines| would end with an extra empty line after the newline.
+    // This would have resulted in an extra nonexistent newline being counted
+    // during the computation of |offset|.
+    --offset;
+  }
+  return offset;
+}
+
 }  // namespace
 
-SingleLogSource::SingleLogSource(SupportedSource source)
-    : SystemLogsSource(GetLogFileSourceRelativeFilePath(source).value()),
+SingleLogSource::SingleLogSource(SupportedSource source_type)
+    : SystemLogsSource(GetLogFileSourceRelativeFilePath(source_type).value()),
+      source_type_(source_type),
       log_file_dir_path_(kDefaultSystemLogDirPath),
       num_bytes_read_(0),
       file_inode_(0),
@@ -64,6 +142,12 @@
 
 SingleLogSource::~SingleLogSource() {}
 
+// static
+void SingleLogSource::SetChromeStartTimeForTesting(
+    const base::Time* start_time) {
+  g_chrome_start_time_for_test = start_time;
+}
+
 void SingleLogSource::Fetch(const SysLogsSourceCallback& callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
   DCHECK(!callback.is_null());
@@ -90,6 +174,18 @@
     if (!file_.IsValid())
       return;
 
+    // Determine actual offset from which to start reading.
+    if (source_type_ == SupportedSource::kMessages) {
+      const base::Time earliest_log_time =
+          GetChromeStartTime() - kLogCutoffTimeBeforeChromeStart;
+
+      num_bytes_read_ =
+          GetFirstFileOffsetWithTime(GetLogFilePath(), earliest_log_time);
+    } else {
+      num_bytes_read_ = 0;
+    }
+    file_.Seek(base::File::FROM_BEGIN, num_bytes_read_);
+
     file_inode_ = GetInodeValue(GetLogFilePath());
   }
 
diff --git a/chrome/browser/chromeos/system_logs/single_log_source.h b/chrome/browser/chromeos/system_logs/single_log_source.h
index d4ddaa6..6afca1a7 100644
--- a/chrome/browser/chromeos/system_logs/single_log_source.h
+++ b/chrome/browser/chromeos/system_logs/single_log_source.h
@@ -13,6 +13,10 @@
 #include "chrome/browser/feedback/system_logs/system_logs_fetcher.h"
 #include "components/feedback/anonymizer_tool.h"
 
+namespace base {
+class Time;
+}
+
 namespace system_logs {
 
 // Gathers log data from a single source, possibly incrementally.
@@ -29,6 +33,11 @@
   explicit SingleLogSource(SupportedSource source);
   ~SingleLogSource() override;
 
+  // During testing, use this to set a custom Chrome start time to override the
+  // actual start time. Does not take ownership of |start_time|. Call this again
+  // with |start_time|=nullptr when done with testing.
+  static void SetChromeStartTimeForTesting(const base::Time* start_time);
+
   // system_logs::SystemLogsSource:
   void Fetch(const SysLogsSourceCallback& callback) override;
 
@@ -53,6 +62,9 @@
   // data.
   void ReadFile(size_t num_rotations_allowed, SystemLogsResponse* result);
 
+  // The source type.
+  const SupportedSource source_type_;
+
   // Path to system log file directory.
   base::FilePath log_file_dir_path_;
 
diff --git a/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc b/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc
index df830259..35ad0ee8 100644
--- a/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc
+++ b/chrome/browser/chromeos/system_logs/single_log_source_unittest.cc
@@ -13,12 +13,31 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
+#include "base/strings/string_split.h"
 #include "base/test/scoped_task_environment.h"
+#include "base/time/time.h"
 #include "content/public/test/test_browser_thread_bundle.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace system_logs {
 
+namespace {
+
+// Counts number of lines in a string.
+size_t GetNumLinesInString(const std::string& string) {
+  size_t split_size = base::SplitString(string, "\n", base::KEEP_WHITESPACE,
+                                        base::SPLIT_WANT_ALL)
+                          .size();
+  // If there is an extra newline at the end, it will generate an extra empty
+  // string. Do not count this as an extra line.
+  if (!string.empty() && string.back() == '\n')
+    --split_size;
+
+  return split_size;
+}
+
+}  // namespace
+
 class SingleLogSourceTest : public ::testing::Test {
  public:
   SingleLogSourceTest()
@@ -28,7 +47,9 @@
     InitializeTestLogDir();
   }
 
-  ~SingleLogSourceTest() override {}
+  ~SingleLogSourceTest() override {
+    SingleLogSource::SetChromeStartTimeForTesting(nullptr);
+  }
 
  protected:
   // Sets up a dummy system log directory.
@@ -330,4 +351,123 @@
   EXPECT_EQ("Also no newline here...yet\n", latest_response());
 }
 
+TEST_F(SingleLogSourceTest, ReadRecentLinesFromMessages) {
+  // Write some lines to messages. Use various timestamp styles. Some lines have
+  // timestamps, Some do not. All timestamps are in chronological order.
+  const base::FilePath messages_path = base::FilePath("messages");
+  // All timestamps below include time zone info. Some are EDT (-0400) and
+  // others are PDT (-0700). These make sure that SingleLogSource is able to
+  // read various standard timestamp formats.
+  EXPECT_TRUE(
+      AppendToFile(messages_path, "13 Jun 2017 15:00:00 -0400 : Alpha\n"));
+  EXPECT_TRUE(
+      AppendToFile(messages_path, "13-Jun-2017 15:30 -04:00 : Bravo\n"));
+  EXPECT_TRUE(AppendToFile(messages_path, "Missing timestamp #1\n"));
+  EXPECT_TRUE(
+      AppendToFile(messages_path, "2017-06-13 3:30pm -04:00 : Charlie\n"));
+  EXPECT_TRUE(AppendToFile(messages_path, "\n"));
+  EXPECT_TRUE(
+      AppendToFile(messages_path, "13 Jun 2017 13:30:00 -0700 : Delta\n"));
+  EXPECT_TRUE(
+      AppendToFile(messages_path, "Tue Jun 13 17:00 EDT 2017 : Echo\n"));
+  EXPECT_TRUE(AppendToFile(messages_path, "Missing timestamp #2\n"));
+  EXPECT_TRUE(
+      AppendToFile(messages_path, "2017-06-13T17:30:00.125-04:00 : Foxtrot\n"));
+  EXPECT_TRUE(
+      AppendToFile(messages_path, "2017-06-13 3:00:00 PM PDT : Golf\n"));
+
+  // The timestamp of the first message in file "messages".
+  base::Time first_line_time;
+  EXPECT_TRUE(
+      base::Time::FromString("13 Jun 2017 15:00:00 EDT", &first_line_time));
+
+  // Confirm that it was correctly parsed.
+  base::Time::Exploded exploded;
+  first_line_time.UTCExplode(&exploded);
+  EXPECT_EQ(2017, exploded.year);
+  EXPECT_EQ(6, exploded.month);
+  EXPECT_EQ(2 /* Tue */, exploded.day_of_week);
+  EXPECT_EQ(13, exploded.day_of_month);
+  EXPECT_EQ(15 + 4 /* Convert from EDT to UTC */, exploded.hour);
+  EXPECT_EQ(0, exploded.minute);
+  EXPECT_EQ(0, exploded.second);
+  EXPECT_EQ(0, exploded.millisecond);
+
+  // Provide a fake Chrome start time for testing: 15:00 EDT
+  base::Time chrome_start_time = first_line_time;
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  // Read from messages. The first line of messages should not have been read.
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(1, num_callback_calls());
+  EXPECT_EQ(10U, GetNumLinesInString(latest_response())) << latest_response();
+
+  // Update Chrome start time to: 15:15 EDT
+  chrome_start_time += base::TimeDelta::FromMinutes(15);
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(2, num_callback_calls());
+  EXPECT_EQ(9U, GetNumLinesInString(latest_response())) << latest_response();
+
+  // Update Chrome start time: 15:45 EDT
+  chrome_start_time += base::TimeDelta::FromMinutes(30);
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(3, num_callback_calls());
+  EXPECT_EQ(5U, GetNumLinesInString(latest_response())) << latest_response();
+
+  // Update Chrome start time: 17:10 EDT
+  chrome_start_time = first_line_time + base::TimeDelta::FromHours(2) +
+                      base::TimeDelta::FromMinutes(10);
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(4, num_callback_calls());
+  EXPECT_EQ(4U, GetNumLinesInString(latest_response())) << latest_response();
+
+  // Update Chrome start time: 17:40:00.125 EDT
+  chrome_start_time +=
+      base::TimeDelta::FromMinutes(30) + base::TimeDelta::FromMilliseconds(125);
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(5, num_callback_calls());
+  EXPECT_EQ(2U, GetNumLinesInString(latest_response())) << latest_response();
+
+  // Update Chrome start time: 17:40:00.126 EDT
+  chrome_start_time += base::TimeDelta::FromMilliseconds(1);
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(6, num_callback_calls());
+  EXPECT_EQ(1U, GetNumLinesInString(latest_response())) << latest_response();
+
+  // Update Chrome start time: 18:10 EDT
+  chrome_start_time = first_line_time + base::TimeDelta::FromHours(3) +
+                      base::TimeDelta::FromMinutes(10);
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(7, num_callback_calls());
+  EXPECT_EQ(1U, GetNumLinesInString(latest_response())) << latest_response();
+
+  // Update Chrome start time: 18:15 EDT
+  chrome_start_time += base::TimeDelta::FromMinutes(5);
+  SingleLogSource::SetChromeStartTimeForTesting(&chrome_start_time);
+
+  InitializeSource(SingleLogSource::SupportedSource::kMessages);
+  FetchFromSource();
+  EXPECT_EQ(8, num_callback_calls());
+  EXPECT_EQ(0U, GetNumLinesInString(latest_response())) << latest_response();
+}
+
 }  // namespace system_logs
diff --git a/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc b/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc
index 5068cb52..f6308a3d 100644
--- a/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc
+++ b/chrome/browser/component_updater/component_patcher_operation_out_of_process.cc
@@ -50,18 +50,6 @@
     return;
   }
 
-  content::BrowserThread::PostTask(
-      content::BrowserThread::IO, FROM_HERE,
-      base::Bind(&ChromeOutOfProcessPatcher::PatchOnIOThread, this, operation,
-                 base::Passed(&input_file), base::Passed(&patch_file),
-                 base::Passed(&output_file)));
-}
-
-void ChromeOutOfProcessPatcher::PatchOnIOThread(const std::string& operation,
-                                                base::File input_file,
-                                                base::File patch_file,
-                                                base::File output_file) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
   DCHECK(!utility_process_mojo_client_);
 
   utility_process_mojo_client_ = base::MakeUnique<
@@ -86,8 +74,6 @@
 }
 
 void ChromeOutOfProcessPatcher::PatchDone(int result) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
   utility_process_mojo_client_.reset();  // Terminate the utility process.
   task_runner_->PostTask(FROM_HERE, base::Bind(callback_, result));
 }
diff --git a/chrome/browser/component_updater/component_patcher_operation_out_of_process.h b/chrome/browser/component_updater/component_patcher_operation_out_of_process.h
index e5ebe52..7d50058 100644
--- a/chrome/browser/component_updater/component_patcher_operation_out_of_process.h
+++ b/chrome/browser/component_updater/component_patcher_operation_out_of_process.h
@@ -37,12 +37,6 @@
  private:
   ~ChromeOutOfProcessPatcher() override;
 
-  // Perform a patch operation using chrome::mojom::FilePatcher.
-  void PatchOnIOThread(const std::string& operation,
-                       base::File input_file,
-                       base::File patch_file,
-                       base::File output_file);
-
   // Patch operation result handler.
   void PatchDone(int result);
 
diff --git a/chrome/browser/installable/installable_logging.cc b/chrome/browser/installable/installable_logging.cc
index 00903a71..7d2f89a 100644
--- a/chrome/browser/installable/installable_logging.cc
+++ b/chrome/browser/installable/installable_logging.cc
@@ -86,6 +86,8 @@
     case SHOWING_NATIVE_APP_BANNER:
     case SHOWING_WEB_APP_BANNER:
     case FAILED_TO_CREATE_BANNER:
+    case WAITING_FOR_MANIFEST:
+    case WAITING_FOR_INSTALLABLE_CHECK:
     case MAX_ERROR_CODE:
       return;
     case RENDERER_EXITING:
diff --git a/chrome/browser/installable/installable_logging.h b/chrome/browser/installable/installable_logging.h
index 24236272..94e9784 100644
--- a/chrome/browser/installable/installable_logging.h
+++ b/chrome/browser/installable/installable_logging.h
@@ -47,6 +47,8 @@
   URL_NOT_SUPPORTED_FOR_WEBAPK,
   IN_INCOGNITO,
   NOT_OFFLINE_CAPABLE,
+  WAITING_FOR_MANIFEST,
+  WAITING_FOR_INSTALLABLE_CHECK,
   MAX_ERROR_CODE,
 };
 
diff --git a/chrome/browser/installable/installable_manager.cc b/chrome/browser/installable/installable_manager.cc
index a529d29..5bfa16bb 100644
--- a/chrome/browser/installable/installable_manager.cc
+++ b/chrome/browser/installable/installable_manager.cc
@@ -15,7 +15,6 @@
 #include "content/public/browser/manifest_icon_downloader.h"
 #include "content/public/browser/manifest_icon_selector.h"
 #include "content/public/browser/navigation_handle.h"
-#include "content/public/browser/service_worker_context.h"
 #include "content/public/browser/storage_partition.h"
 #include "net/base/url_util.h"
 #include "third_party/WebKit/public/platform/WebDisplayMode.h"
@@ -77,9 +76,16 @@
   bool fetched = false;
 };
 
-struct InstallableManager::InstallableProperty {
+struct InstallableManager::ValidManifestProperty {
   InstallableStatusCode error = NO_ERROR_DETECTED;
-  bool installable = false;
+  bool is_valid = false;
+  bool fetched = false;
+};
+
+struct InstallableManager::ServiceWorkerProperty {
+  InstallableStatusCode error = NO_ERROR_DETECTED;
+  bool has_worker = false;
+  bool is_waiting = false;
   bool fetched = false;
 };
 
@@ -101,16 +107,34 @@
 
 InstallableManager::InstallableManager(content::WebContents* web_contents)
     : content::WebContentsObserver(web_contents),
-      manifest_(new ManifestProperty()),
-      installable_(new InstallableProperty()),
+      manifest_(base::MakeUnique<ManifestProperty>()),
+      valid_manifest_(base::MakeUnique<ValidManifestProperty>()),
+      worker_(base::MakeUnique<ServiceWorkerProperty>()),
+      service_worker_context_(nullptr),
       page_status_(InstallabilityCheckStatus::NOT_STARTED),
       menu_open_count_(0),
       menu_item_add_to_homescreen_count_(0),
       is_active_(false),
       is_pwa_check_complete_(false),
-      weak_factory_(this) {}
+      weak_factory_(this) {
+  // This is null in unit tests.
+  if (web_contents) {
+    content::StoragePartition* storage_partition =
+        content::BrowserContext::GetStoragePartition(
+            Profile::FromBrowserContext(web_contents->GetBrowserContext()),
+            web_contents->GetSiteInstance());
+    DCHECK(storage_partition);
 
-InstallableManager::~InstallableManager() = default;
+    service_worker_context_ = storage_partition->GetServiceWorkerContext();
+    service_worker_context_->AddObserver(this);
+  }
+}
+
+InstallableManager::~InstallableManager() {
+  // Null in unit tests.
+  if (service_worker_context_)
+    service_worker_context_->RemoveObserver(this);
+}
 
 // static
 bool InstallableManager::IsContentSecure(content::WebContents* web_contents) {
@@ -229,8 +253,12 @@
   if (manifest_->error != NO_ERROR_DETECTED)
     return manifest_->error;
 
-  if (params.check_installable && installable_->error != NO_ERROR_DETECTED)
-    return installable_->error;
+  if (params.check_installable) {
+    if (valid_manifest_->error != NO_ERROR_DETECTED)
+      return valid_manifest_->error;
+    if (worker_->error != NO_ERROR_DETECTED)
+      return worker_->error;
+  }
 
   if (params.fetch_valid_primary_icon) {
     IconProperty& icon = icons_[ParamsForPrimaryIcon(params)];
@@ -255,13 +283,21 @@
   return manifest_->error;
 }
 
-InstallableStatusCode InstallableManager::installable_error() const {
-  return installable_->error;
+InstallableStatusCode InstallableManager::valid_manifest_error() const {
+  return valid_manifest_->error;
 }
 
-void InstallableManager::set_installable_error(
+void InstallableManager::set_valid_manifest_error(
     InstallableStatusCode error_code) {
-  installable_->error = error_code;
+  valid_manifest_->error = error_code;
+}
+
+InstallableStatusCode InstallableManager::worker_error() const {
+  return worker_->error;
+}
+
+bool InstallableManager::worker_waiting() const {
+  return worker_->is_waiting;
 }
 
 InstallableStatusCode InstallableManager::icon_error(
@@ -289,11 +325,12 @@
   //  a. the params did not request it, OR
   //  b. the resource has been fetched/checked.
   return manifest_->fetched &&
-         (!params.check_installable || installable_->fetched) &&
+         (!params.check_installable ||
+          (valid_manifest_->fetched && worker_->fetched)) &&
          (!params.fetch_valid_primary_icon ||
-             IsIconFetched(ParamsForPrimaryIcon(params))) &&
+          IsIconFetched(ParamsForPrimaryIcon(params))) &&
          (!params.fetch_valid_badge_icon ||
-             IsIconFetched(ParamsForBadgeIcon(params)));
+          IsIconFetched(ParamsForBadgeIcon(params)));
 }
 
 void InstallableManager::Reset() {
@@ -317,8 +354,9 @@
   }
 
   page_status_ = InstallabilityCheckStatus::NOT_STARTED;
-  manifest_.reset(new ManifestProperty());
-  installable_.reset(new InstallableProperty());
+  manifest_ = base::MakeUnique<ManifestProperty>();
+  valid_manifest_ = base::MakeUnique<ValidManifestProperty>();
+  worker_ = base::MakeUnique<ServiceWorkerProperty>();
 
   is_active_ = false;
 }
@@ -327,7 +365,8 @@
   DCHECK(!tasks_.empty());
   const InstallableParams& params = tasks_[0].first;
 
-  installable_->fetched = true;
+  valid_manifest_->fetched = true;
+  worker_->fetched = true;
   SetIconFetched(ParamsForPrimaryIcon(params));
   SetIconFetched(ParamsForBadgeIcon(params));
 }
@@ -381,6 +420,12 @@
   if (!check_passed || IsComplete(params)) {
     RecordQueuedMetricsOnTaskCompletion(params, check_passed);
     RunCallback(task, code);
+
+    // Sites can always register a service worker after we finish checking, so
+    // don't cache a missing service worker error to ensure we always check
+    // again.
+    if (worker_error() == NO_MATCHING_SERVICE_WORKER)
+      worker_ = base::MakeUnique<ServiceWorkerProperty>();
     tasks_.erase(tasks_.begin());
     StartNextTask();
     return;
@@ -391,8 +436,10 @@
   } else if (params.fetch_valid_primary_icon &&
              !IsIconFetched(ParamsForPrimaryIcon(params))) {
     CheckAndFetchBestIcon(ParamsForPrimaryIcon(params));
-  } else if (params.check_installable && !installable_->fetched) {
+  } else if (params.check_installable && !valid_manifest_->fetched) {
     CheckInstallable();
+  } else if (params.check_installable && !worker_->fetched) {
+    CheckServiceWorker();
   } else if (params.fetch_valid_badge_icon &&
              !IsIconFetched(ParamsForBadgeIcon(params))) {
     CheckAndFetchBestIcon(ParamsForBadgeIcon(params));
@@ -431,33 +478,29 @@
 }
 
 void InstallableManager::CheckInstallable() {
-  DCHECK(!installable_->fetched);
+  DCHECK(!valid_manifest_->fetched);
   DCHECK(!manifest().IsEmpty());
 
-  if (IsManifestValidForWebApp(manifest())) {
-    CheckServiceWorker();
-  } else {
-    installable_->installable = false;
-    installable_->fetched = true;
-    WorkOnTask();
-  }
+  valid_manifest_->is_valid = IsManifestValidForWebApp(manifest());
+  valid_manifest_->fetched = true;
+  WorkOnTask();
 }
 
 bool InstallableManager::IsManifestValidForWebApp(
     const content::Manifest& manifest) {
   if (manifest.IsEmpty()) {
-    installable_->error = MANIFEST_EMPTY;
+    valid_manifest_->error = MANIFEST_EMPTY;
     return false;
   }
 
   if (!manifest.start_url.is_valid()) {
-    installable_->error = START_URL_NOT_VALID;
+    valid_manifest_->error = START_URL_NOT_VALID;
     return false;
   }
 
   if ((manifest.name.is_null() || manifest.name.string().empty()) &&
       (manifest.short_name.is_null() || manifest.short_name.string().empty())) {
-    installable_->error = MANIFEST_MISSING_NAME_OR_SHORT_NAME;
+    valid_manifest_->error = MANIFEST_MISSING_NAME_OR_SHORT_NAME;
     return false;
   }
 
@@ -466,12 +509,12 @@
   // this check moot. See https://crbug.com/604390.
   if (manifest.display != blink::kWebDisplayModeStandalone &&
       manifest.display != blink::kWebDisplayModeFullscreen) {
-    installable_->error = MANIFEST_DISPLAY_NOT_SUPPORTED;
+    valid_manifest_->error = MANIFEST_DISPLAY_NOT_SUPPORTED;
     return false;
   }
 
   if (!DoesManifestContainRequiredIcon(manifest)) {
-    installable_->error = MANIFEST_MISSING_SUITABLE_ICON;
+    valid_manifest_->error = MANIFEST_MISSING_SUITABLE_ICON;
     return false;
   }
 
@@ -479,22 +522,14 @@
 }
 
 void InstallableManager::CheckServiceWorker() {
-  DCHECK(!installable_->fetched);
+  DCHECK(!worker_->fetched);
   DCHECK(!manifest().IsEmpty());
   DCHECK(manifest().start_url.is_valid());
 
-  content::WebContents* web_contents = GetWebContents();
-
   // Check to see if there is a single service worker controlling this page
   // and the manifest's start url.
-  content::StoragePartition* storage_partition =
-      content::BrowserContext::GetStoragePartition(
-          Profile::FromBrowserContext(web_contents->GetBrowserContext()),
-          web_contents->GetSiteInstance());
-  DCHECK(storage_partition);
-
-  storage_partition->GetServiceWorkerContext()->CheckHasServiceWorker(
-      web_contents->GetLastCommittedURL(), manifest().start_url,
+  service_worker_context_->CheckHasServiceWorker(
+      GetWebContents()->GetLastCommittedURL(), manifest().start_url,
       base::Bind(&InstallableManager::OnDidCheckHasServiceWorker,
                  weak_factory_.GetWeakPtr()));
 }
@@ -506,19 +541,28 @@
 
   switch (capability) {
     case content::ServiceWorkerCapability::SERVICE_WORKER_WITH_FETCH_HANDLER:
-      installable_->installable = true;
+      worker_->has_worker = true;
       break;
     case content::ServiceWorkerCapability::SERVICE_WORKER_NO_FETCH_HANDLER:
-      installable_->installable = false;
-      installable_->error = NOT_OFFLINE_CAPABLE;
+      worker_->has_worker = false;
+      worker_->error = NOT_OFFLINE_CAPABLE;
       break;
     case content::ServiceWorkerCapability::NO_SERVICE_WORKER:
-      installable_->installable = false;
-      installable_->error = NO_MATCHING_SERVICE_WORKER;
+      InstallableParams& params = tasks_[0].first;
+      if (params.wait_for_worker) {
+        // Wait for ServiceWorkerContextObserver::OnRegistrationStored. Set the
+        // param |wait_for_worker| to false so we only wait once per task.
+        params.wait_for_worker = false;
+        worker_->is_waiting = true;
+        OnWaitingForServiceWorker();
+        return;
+      }
+      worker_->has_worker = false;
+      worker_->error = NO_MATCHING_SERVICE_WORKER;
       break;
   }
 
-  installable_->fetched = true;
+  worker_->fetched = true;
   WorkOnTask();
 }
 
@@ -569,6 +613,22 @@
   WorkOnTask();
 }
 
+void InstallableManager::OnRegistrationStored(const GURL& pattern) {
+  // If we aren't currently waiting, either:
+  //   a) we've already failed the check, or
+  //   b) we haven't yet called CheckHasServiceWorker.
+  // Otherwise if the scope doesn't match we keep waiting.
+  if (!worker_->is_waiting || !content::ServiceWorkerContext::ScopeMatches(
+                                  pattern, manifest().start_url)) {
+    return;
+  }
+
+  // This will call CheckHasServiceWorker to check whether the service worker
+  // controls the start_url and if it has a fetch handler.
+  worker_->is_waiting = false;
+  WorkOnTask();
+}
+
 void InstallableManager::DidFinishNavigation(
     content::NavigationHandle* handle) {
   if (handle->IsInMainFrame() && handle->HasCommitted() &&
@@ -591,5 +651,5 @@
 }
 
 bool InstallableManager::is_installable() const {
-  return installable_->installable;
+  return valid_manifest_->is_valid && worker_->has_worker;
 }
diff --git a/chrome/browser/installable/installable_manager.h b/chrome/browser/installable/installable_manager.h
index 6f920437..1a53d37b 100644
--- a/chrome/browser/installable/installable_manager.h
+++ b/chrome/browser/installable/installable_manager.h
@@ -18,6 +18,7 @@
 #include "chrome/browser/installable/installable_logging.h"
 #include "chrome/browser/installable/installable_metrics.h"
 #include "content/public/browser/service_worker_context.h"
+#include "content/public/browser/service_worker_context_observer.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_contents_user_data.h"
 #include "content/public/common/manifest.h"
@@ -44,11 +45,6 @@
   // |fetch_valid_badge_icon| is true.
   int minimum_badge_icon_size_in_px = -1;
 
-  // Check whether the site is installable. That is, it has a manifest valid for
-  // a web app and a service worker controlling the manifest start URL and the
-  // current URL.
-  bool check_installable = false;
-
   // Check whether there is a fetchable, non-empty icon in the manifest
   // conforming to the primary icon size parameters.
   bool fetch_valid_primary_icon = false;
@@ -56,6 +52,16 @@
   // Check whether there is a fetchable, non-empty icon in the manifest
   // conforming to the badge icon size parameters.
   bool fetch_valid_badge_icon = false;
+
+  // Check whether the site is installable. That is, it has a manifest valid for
+  // a web app and a service worker controlling the manifest start URL and the
+  // current URL.
+  bool check_installable = false;
+
+  // Whether or not to wait indefinitely for a service worker. If this is set to
+  // false, the worker status will not be cached and will be re-checked if
+  // GetData() is called again for the current page.
+  bool wait_for_worker = true;
 };
 
 // This struct is passed to an InstallableCallback when the InstallableManager
@@ -104,7 +110,8 @@
 // This class is responsible for fetching the resources required to check and
 // install a site.
 class InstallableManager
-    : public content::WebContentsObserver,
+    : public content::ServiceWorkerContextObserver,
+      public content::WebContentsObserver,
       public content::WebContentsUserData<InstallableManager> {
  public:
   explicit InstallableManager(content::WebContents* web_contents);
@@ -124,10 +131,14 @@
   // when the data is ready; the synchronous execution ensures that the
   // references |callback| receives in its InstallableData argument are valid.
   //
+  // Clients must be prepared for |callback| to not ever be invoked. For
+  // instance, if installability checking is requested, this method will wait
+  // until the site registers a service worker (and hence not invoke |callback|
+  // at all if a service worker is never registered).
+  //
   // Calls requesting data that is already fetched will return the cached data.
-  // This method is marked virtual so clients may mock this object in tests.
-  virtual void GetData(const InstallableParams& params,
-                       const InstallableCallback& callback);
+  void GetData(const InstallableParams& params,
+               const InstallableCallback& callback);
 
   // Called via AppBannerManagerAndroid to record metrics on how often the
   // installable check is completed when the menu or add to homescreen menu item
@@ -137,18 +148,27 @@
   void RecordQueuedMetricsOnTaskCompletion(const InstallableParams& params,
                                            bool check_passed);
 
+ protected:
+  // For mocking in tests.
+  virtual void OnWaitingForServiceWorker() {}
+
  private:
   friend class InstallableManagerBrowserTest;
   friend class InstallableManagerUnitTest;
   FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest,
                            ManagerBeginsInEmptyState);
   FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest, CheckWebapp);
+  FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest,
+                           CheckLazyServiceWorkerPassesWhenWaiting);
+  FRIEND_TEST_ALL_PREFIXES(InstallableManagerBrowserTest,
+                           CheckLazyServiceWorkerNoFetchHandlerFails);
 
   using Task = std::pair<InstallableParams, InstallableCallback>;
   using IconParams = std::tuple<int, int, content::Manifest::Icon::IconPurpose>;
 
   struct ManifestProperty;
-  struct InstallableProperty;
+  struct ValidManifestProperty;
+  struct ServiceWorkerProperty;
   struct IconProperty;
 
   // Returns an IconParams object that queries for a primary icon conforming to
@@ -171,8 +191,10 @@
 
   // Gets/sets parts of particular properties. Exposed for testing.
   InstallableStatusCode manifest_error() const;
-  InstallableStatusCode installable_error() const;
-  void set_installable_error(InstallableStatusCode error_code);
+  InstallableStatusCode valid_manifest_error() const;
+  void set_valid_manifest_error(InstallableStatusCode error_code);
+  InstallableStatusCode worker_error() const;
+  bool worker_waiting() const;
   InstallableStatusCode icon_error(const IconParams& icon_params);
   GURL& icon_url(const IconParams& icon_params);
   const SkBitmap* icon(const IconParams& icon);
@@ -209,8 +231,12 @@
   void OnDidCheckHasServiceWorker(content::ServiceWorkerCapability capability);
 
   void CheckAndFetchBestIcon(const IconParams& params);
-  void OnIconFetched(
-      const GURL icon_url, const IconParams& params, const SkBitmap& bitmap);
+  void OnIconFetched(const GURL icon_url,
+                     const IconParams& params,
+                     const SkBitmap& bitmap);
+
+  // content::ServiceWorkerContextObserver overrides
+  void OnRegistrationStored(const GURL& pattern) override;
 
   // content::WebContentsObserver overrides
   void DidFinishNavigation(content::NavigationHandle* handle) override;
@@ -225,9 +251,14 @@
 
   // Installable properties cached on this object.
   std::unique_ptr<ManifestProperty> manifest_;
-  std::unique_ptr<InstallableProperty> installable_;
+  std::unique_ptr<ValidManifestProperty> valid_manifest_;
+  std::unique_ptr<ServiceWorkerProperty> worker_;
   std::map<IconParams, IconProperty> icons_;
 
+  // Owned by the storage partition attached to the content::WebContents which
+  // this object is scoped to.
+  content::ServiceWorkerContext* service_worker_context_;
+
   // Whether or not the current page is a PWA. This is reset per navigation and
   // is independent of the caching mechanism, i.e. if a PWA check is run
   // multiple times for one page, this will be set on the first check.
diff --git a/chrome/browser/installable/installable_manager_browsertest.cc b/chrome/browser/installable/installable_manager_browsertest.cc
index 58cabb8..d7c9b70 100644
--- a/chrome/browser/installable/installable_manager_browsertest.cc
+++ b/chrome/browser/installable/installable_manager_browsertest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/installable/installable_manager.h"
 
 #include "base/command_line.h"
+#include "base/memory/ptr_util.h"
 #include "base/run_loop.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/ui/browser.h"
@@ -12,6 +13,7 @@
 #include "chrome/common/chrome_switches.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "content/public/test/browser_test_utils.h"
 #include "net/test/embedded_test_server/embedded_test_server.h"
 
 using IconPurpose = content::Manifest::Icon::IconPurpose;
@@ -58,6 +60,25 @@
 
 }  // anonymous namespace
 
+// Used only for testing pages with no service workers. This class will dispatch
+// a RunLoop::QuitClosure when it begins waiting for a service worker to be
+// registered.
+class LazyWorkerInstallableManager : public InstallableManager {
+ public:
+  LazyWorkerInstallableManager(content::WebContents* web_contents,
+                               base::Closure quit_closure)
+      : InstallableManager(web_contents), quit_closure_(quit_closure) {}
+  ~LazyWorkerInstallableManager() override {}
+
+ protected:
+  void OnWaitingForServiceWorker() override {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure_);
+  };
+
+ private:
+  base::Closure quit_closure_;
+};
+
 class CallbackTester {
  public:
   explicit CallbackTester(base::Closure quit_closure)
@@ -214,7 +235,8 @@
   EXPECT_FALSE(manager->is_installable());
 
   EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
-  EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
   EXPECT_TRUE(manager->tasks_.empty());
 }
 
@@ -543,7 +565,8 @@
     EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty()));
     EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams)));
     EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
-    EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error());
+    EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
+    EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
     EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams)));
     EXPECT_TRUE(manager->tasks_.empty());
   }
@@ -579,7 +602,8 @@
     EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty()));
     EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams)));
     EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
-    EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error());
+    EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
+    EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
     EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams)));
     EXPECT_TRUE(manager->tasks_.empty());
   }
@@ -594,7 +618,8 @@
     EXPECT_FALSE(manager->is_installable());
     EXPECT_TRUE(manager->icons_.empty());
     EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
-    EXPECT_EQ(NO_ERROR_DETECTED, manager->installable_error());
+    EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
+    EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
     EXPECT_TRUE(manager->tasks_.empty());
   }
 }
@@ -647,13 +672,15 @@
     EXPECT_EQ(GetStatus(), InstallabilityCheckStatus::NOT_COMPLETED);
   }
 
-  // Fetch the full criteria should fail.
+  // Fetching the full criteria should fail if we don't wait for the worker.
   {
     base::RunLoop run_loop;
     std::unique_ptr<CallbackTester> tester(
         new CallbackTester(run_loop.QuitClosure()));
 
-    RunInstallableManager(tester.get(), GetWebAppParams());
+    InstallableParams params = GetWebAppParams();
+    params.wait_for_worker = false;
+    RunInstallableManager(tester.get(), params);
     run_loop.Run();
 
     EXPECT_FALSE(tester->manifest().IsEmpty());
@@ -671,6 +698,175 @@
 }
 
 IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
+                       CheckLazyServiceWorkerPassesWhenWaiting) {
+  base::RunLoop tester_run_loop, sw_run_loop;
+  std::unique_ptr<CallbackTester> tester(
+      new CallbackTester(tester_run_loop.QuitClosure()));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  auto manager = base::MakeUnique<LazyWorkerInstallableManager>(
+      web_contents, sw_run_loop.QuitClosure());
+
+  // Load a URL with no service worker.
+  GURL test_url = embedded_test_server()->GetURL(
+      "/banners/manifest_no_service_worker.html");
+  ui_test_utils::NavigateToURL(browser(), test_url);
+
+  // Kick off fetching the data. This should block on waiting for a worker.
+  manager->GetData(GetWebAppParams(),
+                   base::Bind(&CallbackTester::OnDidFinishInstallableCheck,
+                              base::Unretained(tester.get())));
+  sw_run_loop.Run();
+
+  // We should now be waiting for the service worker.
+  EXPECT_FALSE(manager->manifest().IsEmpty());
+  EXPECT_FALSE(manager->manifest_url().is_empty());
+  EXPECT_FALSE(manager->is_installable());
+  EXPECT_EQ(1u, manager->icons_.size());
+  EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty()));
+  EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams)));
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams)));
+  EXPECT_TRUE(manager->worker_waiting());
+  EXPECT_FALSE(manager->tasks_.empty());
+
+  // Load the service worker.
+  EXPECT_TRUE(content::ExecuteScript(
+      web_contents, "navigator.serviceWorker.register('service_worker.js');"));
+  tester_run_loop.Run();
+
+  // We should have passed now.
+  EXPECT_FALSE(tester->manifest().IsEmpty());
+  EXPECT_FALSE(tester->manifest_url().is_empty());
+  EXPECT_FALSE(tester->primary_icon_url().is_empty());
+  EXPECT_NE(nullptr, tester->primary_icon());
+  EXPECT_TRUE(tester->is_installable());
+  EXPECT_TRUE(tester->badge_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code());
+  EXPECT_EQ(manager->page_status_,
+            InstallabilityCheckStatus::COMPLETE_PROGRESSIVE_WEB_APP);
+
+  // Verify internal state.
+  EXPECT_FALSE(manager->manifest().IsEmpty());
+  EXPECT_FALSE(manager->manifest_url().is_empty());
+  EXPECT_TRUE(manager->is_installable());
+  EXPECT_EQ(1u, manager->icons_.size());
+  EXPECT_FALSE((manager->icon_url(kPrimaryIconParams).is_empty()));
+  EXPECT_NE(nullptr, (manager->icon(kPrimaryIconParams)));
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->manifest_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->valid_manifest_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, manager->worker_error());
+  EXPECT_EQ(NO_ERROR_DETECTED, (manager->icon_error(kPrimaryIconParams)));
+  EXPECT_FALSE(manager->worker_waiting());
+  EXPECT_TRUE(manager->tasks_.empty());
+}
+
+IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
+                       CheckLazyServiceWorkerNoFetchHandlerFails) {
+  base::RunLoop tester_run_loop, sw_run_loop;
+  std::unique_ptr<CallbackTester> tester(
+      new CallbackTester(tester_run_loop.QuitClosure()));
+
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  auto manager = base::MakeUnique<LazyWorkerInstallableManager>(
+      web_contents, sw_run_loop.QuitClosure());
+
+  // Load a URL with no service worker.
+  GURL test_url = embedded_test_server()->GetURL(
+      "/banners/manifest_no_service_worker.html");
+  ui_test_utils::NavigateToURL(browser(), test_url);
+
+  // Kick off fetching the data. This should block on waiting for a worker.
+  manager->GetData(GetWebAppParams(),
+                   base::Bind(&CallbackTester::OnDidFinishInstallableCheck,
+                              base::Unretained(tester.get())));
+  sw_run_loop.Run();
+
+  // We should now be waiting for the service worker.
+  EXPECT_TRUE(manager->worker_waiting());
+  EXPECT_FALSE(manager->tasks_.empty());
+
+  // Load the service worker with no fetch handler.
+  EXPECT_TRUE(content::ExecuteScript(web_contents,
+                                     "navigator.serviceWorker.register('"
+                                     "service_worker_no_fetch_handler.js');"));
+  tester_run_loop.Run();
+
+  // We should fail the check.
+  EXPECT_FALSE(tester->manifest().IsEmpty());
+  EXPECT_FALSE(tester->manifest_url().is_empty());
+  EXPECT_FALSE(tester->primary_icon_url().is_empty());
+  EXPECT_NE(nullptr, tester->primary_icon());
+  EXPECT_FALSE(tester->is_installable());
+  EXPECT_TRUE(tester->badge_icon_url().is_empty());
+  EXPECT_EQ(nullptr, tester->badge_icon());
+  EXPECT_EQ(NOT_OFFLINE_CAPABLE, tester->error_code());
+  EXPECT_FALSE(manager->worker_waiting());
+  EXPECT_EQ(manager->page_status_,
+            InstallabilityCheckStatus::COMPLETE_NON_PROGRESSIVE_WEB_APP);
+}
+
+IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
+                       CheckServiceWorkerErrorIsNotCached) {
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  base::RunLoop sw_run_loop;
+  auto manager = base::MakeUnique<LazyWorkerInstallableManager>(
+      web_contents, sw_run_loop.QuitClosure());
+
+  // Load a URL with no service worker.
+  GURL test_url = embedded_test_server()->GetURL(
+      "/banners/manifest_no_service_worker.html");
+  ui_test_utils::NavigateToURL(browser(), test_url);
+
+  {
+    base::RunLoop tester_run_loop;
+    std::unique_ptr<CallbackTester> tester(
+        new CallbackTester(tester_run_loop.QuitClosure()));
+
+    InstallableParams params = GetWebAppParams();
+    params.wait_for_worker = false;
+    manager->GetData(params,
+                     base::Bind(&CallbackTester::OnDidFinishInstallableCheck,
+                                base::Unretained(tester.get())));
+    tester_run_loop.Run();
+
+    // We should have returned with an error.
+    EXPECT_FALSE(tester->manifest().IsEmpty());
+    EXPECT_FALSE(tester->is_installable());
+    EXPECT_EQ(NO_MATCHING_SERVICE_WORKER, tester->error_code());
+  }
+
+  {
+    base::RunLoop tester_run_loop;
+    std::unique_ptr<CallbackTester> tester(
+        new CallbackTester(tester_run_loop.QuitClosure()));
+
+    InstallableParams params = GetWebAppParams();
+    params.wait_for_worker = true;
+    manager->GetData(params,
+                     base::Bind(&CallbackTester::OnDidFinishInstallableCheck,
+                                base::Unretained(tester.get())));
+    sw_run_loop.Run();
+
+    EXPECT_TRUE(content::ExecuteScript(
+        web_contents,
+        "navigator.serviceWorker.register('service_worker.js');"));
+    tester_run_loop.Run();
+
+    // The callback should tell us that the page is installable
+    EXPECT_FALSE(tester->manifest().IsEmpty());
+    EXPECT_TRUE(tester->is_installable());
+    EXPECT_EQ(NO_ERROR_DETECTED, tester->error_code());
+  }
+}
+
+IN_PROC_BROWSER_TEST_F(InstallableManagerBrowserTest,
                        CheckPageWithNoServiceWorkerFetchHandler) {
   base::RunLoop run_loop;
   std::unique_ptr<CallbackTester> tester(
diff --git a/chrome/browser/installable/installable_manager_unittest.cc b/chrome/browser/installable/installable_manager_unittest.cc
index deef909..eb5bfa4 100644
--- a/chrome/browser/installable/installable_manager_unittest.cc
+++ b/chrome/browser/installable/installable_manager_unittest.cc
@@ -12,7 +12,8 @@
 
 class InstallableManagerUnitTest : public testing::Test {
  public:
-  InstallableManagerUnitTest() : manager_(new InstallableManager(nullptr)) { }
+  InstallableManagerUnitTest()
+      : manager_(base::MakeUnique<InstallableManager>(nullptr)) {}
 
  protected:
   static base::NullableString16 ToNullableUTF16(const std::string& str) {
@@ -39,12 +40,12 @@
 
   bool IsManifestValid(const content::Manifest& manifest) {
     // Explicitly reset the error code before running the method.
-    manager_->set_installable_error(NO_ERROR_DETECTED);
+    manager_->set_valid_manifest_error(NO_ERROR_DETECTED);
     return manager_->IsManifestValidForWebApp(manifest);
   }
 
   InstallableStatusCode GetErrorCode() {
-    return manager_->installable_error();
+    return manager_->valid_manifest_error();
   }
 
  private:
diff --git a/chrome/browser/media/webrtc/media_stream_devices_controller.cc b/chrome/browser/media/webrtc/media_stream_devices_controller.cc
index 7fd2557..ec4e8ea 100644
--- a/chrome/browser/media/webrtc/media_stream_devices_controller.cc
+++ b/chrome/browser/media/webrtc/media_stream_devices_controller.cc
@@ -447,6 +447,12 @@
     PermissionPromptDelegate* delegate) {
   content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
       request.render_process_id, request.render_frame_id);
+  // The RFH may have been destroyed by the time the request is processed.
+  if (!rfh) {
+    callback.Run(content::MediaStreamDevices(),
+                 content::MEDIA_DEVICE_FAILED_DUE_TO_SHUTDOWN,
+                 std::unique_ptr<content::MediaStreamUI>());
+  }
   content::WebContents* web_contents =
       content::WebContents::FromRenderFrameHost(rfh);
   if (request.request_type == content::MEDIA_OPEN_DEVICE_PEPPER_ONLY) {
diff --git a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.cc b/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.cc
deleted file mode 100644
index ad2231d9..0000000
--- a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.cc
+++ /dev/null
@@ -1,42 +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.
-
-#include "chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h"
-#include "content/public/browser/browser_thread.h"
-
-namespace safe_browsing {
-
-namespace {
-
-const uint8_t kKolySignature[4] = {'k', 'o', 'l', 'y'};
-constexpr size_t kSizeKolySignatureInBytes = sizeof(kKolySignature);
-const size_t kSizeKolyTrailerInBytes = 512;
-
-}  // namespace
-
-DiskImageTypeSnifferMac::DiskImageTypeSnifferMac() {}
-
-// static
-bool DiskImageTypeSnifferMac::IsAppleDiskImage(const base::FilePath& dmg_file) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::FILE);
-
-  base::File file(dmg_file, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  if (!file.IsValid())
-    return false;
-
-  char data[kSizeKolySignatureInBytes];
-
-  if (file.Seek(base::File::FROM_END, -1 * kSizeKolyTrailerInBytes) == -1)
-    return false;
-
-  if (file.ReadAtCurrentPos(data, kSizeKolySignatureInBytes) !=
-      kSizeKolySignatureInBytes)
-    return false;
-
-  return (memcmp(data, kKolySignature, kSizeKolySignatureInBytes) == 0);
-}
-
-DiskImageTypeSnifferMac::~DiskImageTypeSnifferMac() = default;
-
-}  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h b/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h
deleted file mode 100644
index 3044482..0000000
--- a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h
+++ /dev/null
@@ -1,36 +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 CHROME_BROWSER_SAFE_BROWSING_DISK_IMAGE_TYPE_SNIFFER_MAC_H_
-#define CHROME_BROWSER_SAFE_BROWSING_DISK_IMAGE_TYPE_SNIFFER_MAC_H_
-
-#include "base/files/file.h"
-#include "base/files/file_path.h"
-#include "base/memory/ref_counted.h"
-
-namespace safe_browsing {
-
-// This class is used to determine whether a given file is a Mac archive type,
-// regardless of file extension. It does so by determining whether the file has
-// the 'koly' signature typical of Mac archive files.
-class DiskImageTypeSnifferMac
-    : public base::RefCountedThreadSafe<DiskImageTypeSnifferMac> {
- public:
-  DiskImageTypeSnifferMac();
-
-  // Reads trailer from file to see if it is a DMG type. Must be called on the
-  // FILE thread.
-  static bool IsAppleDiskImage(const base::FilePath& dmg_file);
-
- private:
-  friend class base::RefCountedThreadSafe<DiskImageTypeSnifferMac>;
-
-  ~DiskImageTypeSnifferMac();
-
-  DISALLOW_COPY_AND_ASSIGN(DiskImageTypeSnifferMac);
-};
-
-}  // namespace safe_browsing
-
-#endif  // CHROME_BROWSER_SAFE_BROWSING_DISK_IMAGE_TYPE_SNIFFE_MAC_H_
diff --git a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc b/chrome/browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc
deleted file mode 100644
index 13f5a89c..0000000
--- a/chrome/browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc
+++ /dev/null
@@ -1,106 +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.
-
-#include "chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h"
-
-#include "base/files/file_path.h"
-#include "base/macros.h"
-#include "base/path_service.h"
-#include "base/strings/string_number_conversions.h"
-#include "chrome/common/chrome_paths.h"
-#include "content/public/test/test_browser_thread_bundle.h"
-#include "content/public/test/test_utils.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace safe_browsing {
-namespace {
-
-struct ArchiveTestCase {
-  // The disk image file to open.
-  const char* file_name;
-
-  // Expectation regarding the file being recognized as a DMG. As the UDIFParser
-  // class currently only supports certain UDIF features, this is used to
-  // properly test expectations.
-  bool expected_results;
-};
-
-std::ostream& operator<<(std::ostream& os, const ArchiveTestCase& test_case) {
-  os << test_case.file_name;
-  return os;
-}
-
-class DiskImageTypeSnifferMacTest
-    : public testing::TestWithParam<ArchiveTestCase> {
- protected:
-  base::FilePath GetFilePath(const char* file_name) {
-    base::FilePath test_data;
-    EXPECT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &test_data));
-    return test_data.AppendASCII("chrome")
-        .AppendASCII("safe_browsing_dmg")
-        .AppendASCII(file_name);
-  }
-
- private:
-  content::TestBrowserThreadBundle thread_bundle_;
-};
-
-TEST_P(DiskImageTypeSnifferMacTest, SniffDiskImage) {
-  const ArchiveTestCase& test_case = GetParam();
-  DVLOG(1) << "Test case: " << test_case;
-
-  base::FilePath path;
-  ASSERT_NO_FATAL_FAILURE(path = GetFilePath(test_case.file_name));
-
-  ASSERT_EQ(test_case.expected_results,
-            DiskImageTypeSnifferMac::IsAppleDiskImage(path));
-}
-
-const ArchiveTestCase cases[] = {
-    {"dmg_UDBZ_GPTSPUD.dmg", true},
-    {"dmg_UDBZ_NONE.dmg", true},
-    {"dmg_UDBZ_SPUD.dmg", true},
-    {"dmg_UDCO_GPTSPUD.dmg", true},
-    {"dmg_UDCO_NONE.dmg", true},
-    {"dmg_UDCO_SPUD.dmg", true},
-    {"dmg_UDRO_GPTSPUD.dmg", true},
-    {"dmg_UDRO_NONE.dmg", true},
-    {"dmg_UDRO_SPUD.dmg", true},
-    // UDRW not supported.
-    {"dmg_UDRW_GPTSPUD.dmg", false},
-    // UDRW not supported.
-    {"dmg_UDRW_NONE.dmg", false},
-    // UDRW not supported.
-    {"dmg_UDRW_SPUD.dmg", false},
-    // Sparse images not supported.
-    {"dmg_UDSP_GPTSPUD.sparseimage", false},
-    // UDRW not supported.
-    {"dmg_UDSP_NONE.sparseimage", false},
-    // Sparse images not supported.
-    {"dmg_UDSP_SPUD.sparseimage", false},
-    // CD/DVD format not supported.
-    {"dmg_UDTO_GPTSPUD.cdr", false},
-    // CD/DVD format not supported.
-    {"dmg_UDTO_NONE.cdr", false},
-    // CD/DVD format not supported.
-    {"dmg_UDTO_SPUD.cdr", false},
-    {"dmg_UDZO_GPTSPUD.dmg", true},
-    {"dmg_UDZO_SPUD.dmg", true},
-    {"dmg_UFBI_GPTSPUD.dmg", true},
-    {"dmg_UFBI_SPUD.dmg", true},
-    {"mach_o_in_dmg.dmg", true},
-    // Absence of 'koly' signature will cause parsing to fail - even if file has
-    // .dmg extension.
-    {"mach_o_in_dmg_no_koly_signature.dmg", false},
-    // Type sniffer should realize DMG type even without extension.
-    {"mach_o_in_dmg.txt", true}
-
-};
-
-INSTANTIATE_TEST_CASE_P(DiskImageTypeSnifferMacTestInstantiation,
-                        DiskImageTypeSnifferMacTest,
-                        testing::ValuesIn(cases));
-
-}  // namespace
-}  // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/download_protection_service.cc b/chrome/browser/safe_browsing/download_protection_service.cc
index 501f22d..aad28a88 100644
--- a/chrome/browser/safe_browsing/download_protection_service.cc
+++ b/chrome/browser/safe_browsing/download_protection_service.cc
@@ -74,7 +74,6 @@
 #include "net/url_request/url_request_status.h"
 
 #if defined(OS_MACOSX)
-#include "chrome/browser/safe_browsing/disk_image_type_sniffer_mac.h"
 #include "chrome/browser/safe_browsing/sandboxed_dmg_analyzer_mac.h"
 #endif
 
@@ -472,19 +471,7 @@
       StartExtractDmgFeatures();
 #endif
     } else {
-#if defined(OS_MACOSX)
-      // Checks for existence of "koly" signature even if file doesn't have
-      // archive-type extension, then calls ExtractFileOrDmgFeatures() with
-      // result.
-      BrowserThread::PostTaskAndReplyWithResult(
-          BrowserThread::FILE, FROM_HERE,
-          base::Bind(DiskImageTypeSnifferMac::IsAppleDiskImage,
-                     item_->GetTargetFilePath()),
-          base::Bind(&CheckClientDownloadRequest::ExtractFileOrDmgFeatures,
-                     this));
-#else
       StartExtractFileFeatures();
-#endif
     }
   }
 
@@ -792,23 +779,6 @@
     dmg_analysis_start_time_ = base::TimeTicks::Now();
   }
 
-  // Extracts DMG features if file has 'koly' signature, otherwise extracts
-  // regular file features.
-  void ExtractFileOrDmgFeatures(bool download_file_has_koly_signature) {
-    DCHECK_CURRENTLY_ON(BrowserThread::UI);
-    UMA_HISTOGRAM_BOOLEAN(
-        "SBClientDownload."
-        "DownloadFileWithoutDiskImageExtensionHasKolySignature",
-        download_file_has_koly_signature);
-    // Returns if DownloadItem was destroyed during parsing of file metadata.
-    if (item_ == nullptr)
-      return;
-    if (download_file_has_koly_signature)
-      StartExtractDmgFeatures();
-    else
-      StartExtractFileFeatures();
-  }
-
   void OnDmgAnalysisFinished(const ArchiveAnalyzerResults& results) {
     DCHECK_CURRENTLY_ON(BrowserThread::UI);
     DCHECK_EQ(ClientDownloadRequest::MAC_EXECUTABLE, type_);
diff --git a/chrome/browser/safe_browsing/download_protection_service_unittest.cc b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
index e46582e..eee25760 100644
--- a/chrome/browser/safe_browsing/download_protection_service_unittest.cc
+++ b/chrome/browser/safe_browsing/download_protection_service_unittest.cc
@@ -33,7 +33,6 @@
 #include "chrome/browser/safe_browsing/incident_reporting/incident_reporting_service.h"
 #include "chrome/browser/safe_browsing/local_database_manager.h"
 #include "chrome/browser/safe_browsing/safe_browsing_service.h"
-#include "chrome/common/chrome_paths.h"
 #include "chrome/common/safe_browsing/binary_feature_extractor.h"
 #include "chrome/common/safe_browsing/file_type_policies_test_util.h"
 #include "chrome/test/base/testing_profile.h"
@@ -1444,76 +1443,6 @@
        CheckClientDownloadReportCorruptDmg) {
   CheckClientDownloadReportCorruptArchive(DMG);
 }
-
-// Test that downloaded files with no disk image extension that have a 'koly'
-// trailer are treated as disk images and processed accordingly.
-TEST_F(DownloadProtectionServiceTest,
-       CheckClientDownloadReportDmgWithoutExtension) {
-  net::FakeURLFetcherFactory factory(NULL);
-  PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK,
-                  net::URLRequestStatus::SUCCESS);
-
-  base::FilePath test_data;
-  EXPECT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &test_data));
-  test_data = test_data.AppendASCII("chrome")
-                  .AppendASCII("safe_browsing_dmg")
-                  .AppendASCII("mach_o_in_dmg.txt");
-
-  NiceMockDownloadItem item;
-  PrepareBasicDownloadItemWithFullPaths(
-      &item, {"http://www.evil.com/a.dmg"},                     // url_chain
-      "http://www.google.com/",                                 // referrer
-      test_data,                                                // tmp_path
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("a.dmg")));  // final_path
-
-  RunLoop run_loop;
-  download_service_->CheckClientDownload(
-      &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback,
-                        base::Unretained(this), run_loop.QuitClosure()));
-  run_loop.Run();
-
-  ASSERT_TRUE(HasClientDownloadRequest());
-  EXPECT_TRUE(GetClientDownloadRequest()->archive_valid());
-  ClearClientDownloadRequest();
-
-  Mock::VerifyAndClearExpectations(sb_service_.get());
-  Mock::VerifyAndClearExpectations(binary_feature_extractor_.get());
-}
-
-// Demonstrate that a .dmg file whose a) extension has been changed to .txt and
-// b) 'koly' signature has been removed is not processed as a disk image.
-TEST_F(DownloadProtectionServiceTest, CheckClientDownloadReportDmgWithoutKoly) {
-  net::FakeURLFetcherFactory factory(NULL);
-  PrepareResponse(&factory, ClientDownloadResponse::SAFE, net::HTTP_OK,
-                  net::URLRequestStatus::SUCCESS);
-
-  base::FilePath test_data;
-  EXPECT_TRUE(PathService::Get(chrome::DIR_GEN_TEST_DATA, &test_data));
-  test_data = test_data.AppendASCII("chrome")
-                  .AppendASCII("safe_browsing_dmg")
-                  .AppendASCII("mach_o_in_dmg_no_koly_signature.txt");
-
-  NiceMockDownloadItem item;
-  PrepareBasicDownloadItemWithFullPaths(
-      &item, {"http://www.evil.com/a.dmg"},                     // url_chain
-      "http://www.google.com/",                                 // referrer
-      test_data,                                                // tmp_path
-      temp_dir_.GetPath().Append(FILE_PATH_LITERAL("a.dmg")));  // final_path
-
-  RunLoop run_loop;
-  download_service_->CheckClientDownload(
-      &item, base::Bind(&DownloadProtectionServiceTest::CheckDoneCallback,
-                        base::Unretained(this), run_loop.QuitClosure()));
-  run_loop.Run();
-
-  ASSERT_TRUE(HasClientDownloadRequest());
-  EXPECT_FALSE(GetClientDownloadRequest()->archive_valid());
-  ClearClientDownloadRequest();
-
-  Mock::VerifyAndClearExpectations(sb_service_.get());
-  Mock::VerifyAndClearExpectations(binary_feature_extractor_.get());
-}
-
 #endif
 
 TEST_F(DownloadProtectionServiceTest, CheckClientDownloadValidateRequest) {
@@ -1927,25 +1856,10 @@
     EXPECT_CALL(*sb_service_->mock_database_manager(),
                 MatchDownloadWhitelistUrl(_))
         .WillRepeatedly(Return(false));
-
-#if defined(OS_MACOSX)
-    // Expects that MockDownloadItem will go out of scope while asynchronous
-    // processing is parsing file metadata, and thus ExtractFileOrDmgFeatures()
-    // will return rather than continuing to process the download.
-    EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _))
-        .Times(0);
-    EXPECT_CALL(*binary_feature_extractor_.get(),
-                ExtractImageFeatures(
-                    tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _))
-        .Times(0);
-#else
-    // Expects synchronous processing that continues to extract features from
-    // download even after MockDownloadItem goes out of scope.
     EXPECT_CALL(*binary_feature_extractor_.get(), CheckSignature(tmp_path_, _));
     EXPECT_CALL(*binary_feature_extractor_.get(),
                 ExtractImageFeatures(
                     tmp_path_, BinaryFeatureExtractor::kDefaultOptions, _, _));
-#endif
 
     download_service_->CheckClientDownload(
         &item,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 182c97c..41e6fa7 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -4263,7 +4263,6 @@
       "../browser/safe_browsing/client_side_detection_host_unittest.cc",
       "../browser/safe_browsing/client_side_detection_service_unittest.cc",
       "../browser/safe_browsing/client_side_model_loader_unittest.cc",
-      "../browser/safe_browsing/disk_image_type_sniffer_mac_unittest.cc",
       "../browser/safe_browsing/download_feedback_service_unittest.cc",
       "../browser/safe_browsing/download_feedback_unittest.cc",
       "../browser/safe_browsing/download_protection_service_unittest.cc",
@@ -4949,9 +4948,6 @@
       "$_output_dir/hfs_plus.img",
       "$_output_dir/hfsx_case_sensitive.img",
       "$_output_dir/mach_o_in_dmg.dmg",
-      "$_output_dir/mach_o_in_dmg.txt",
-      "$_output_dir/mach_o_in_dmg_no_koly_signature.dmg",
-      "$_output_dir/mach_o_in_dmg_no_koly_signature.txt",
     ]
     args = [
       rebase_path(shell_script, root_out_dir),
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
index 94e6f21..6457715 100644
--- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeJUnit4ClassRunner.java
@@ -16,6 +16,7 @@
 import org.chromium.chrome.test.ChromeInstrumentationTestRunner.ChromeDisableIfSkipCheck;
 import org.chromium.chrome.test.ChromeInstrumentationTestRunner.ChromeRestrictionSkipCheck;
 import org.chromium.content.browser.test.ChildProcessAllocatorSettingsHook;
+import org.chromium.policy.test.annotations.Policies;
 
 import java.util.List;
 
@@ -40,7 +41,7 @@
 
     private static List<PreTestHook> defaultPreTestHooks() {
         return CollectionUtil.newArrayList(CommandLineFlags.getRegistrationHook(),
-            new ChildProcessAllocatorSettingsHook());
+                new ChildProcessAllocatorSettingsHook(), Policies.getRegistrationHook());
     }
 
 }
diff --git a/chrome/test/data/safe_browsing/dmg/generate_test_data.sh b/chrome/test/data/safe_browsing/dmg/generate_test_data.sh
index cbb266fa..a1a6b655 100755
--- a/chrome/test/data/safe_browsing/dmg/generate_test_data.sh
+++ b/chrome/test/data/safe_browsing/dmg/generate_test_data.sh
@@ -84,23 +84,6 @@
     "${OUT_DIR}/mach_o_in_dmg"
 
   rm -rf "${DMG_SOURCE}"
-
-  # Copy of Mach-O DMG with 'koly' signature overwritten #######################
-  cp "${OUT_DIR}/mach_o_in_dmg.dmg" \
-      "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg"
-  # Gets size of Mach-O DMG copy.
-  SIZE=`stat -f%z "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg"`
-  # Overwrites 'koly' with '????'.
-  printf '\xa1\xa1\xa1\xa1' | dd conv=notrunc \
-      of="${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg" \
-      bs=1 seek=$(($SIZE - 512))
-
-  # Copy of Mach-O DMG with extension changed to .txt.
-  cp "${OUT_DIR}/mach_o_in_dmg.dmg" "${OUT_DIR}/mach_o_in_dmg.txt"
-
-  # Copy of Mach-O DMG with extension changed to .txt and no 'koly' signature ##
-  cp "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.dmg" \
-      "${OUT_DIR}/mach_o_in_dmg_no_koly_signature.txt"
 }
 
 # Silence any stdout, but keep stderr.
diff --git a/components/history/core/browser/top_sites_impl.cc b/components/history/core/browser/top_sites_impl.cc
index 53171ff..9908ad0 100644
--- a/components/history/core/browser/top_sites_impl.cc
+++ b/components/history/core/browser/top_sites_impl.cc
@@ -136,38 +136,25 @@
 bool TopSitesImpl::SetPageThumbnail(const GURL& url,
                                     const gfx::Image& thumbnail,
                                     const ThumbnailScore& score) {
-  DCHECK(thread_checker_.CalledOnValidThread());
+  ThumbnailEvent result = SetPageThumbnailImpl(url, thumbnail, score);
 
-  if (!loaded_) {
-    // TODO(sky): I need to cache these and apply them after the load
-    // completes.
-    return false;
+  UMA_HISTOGRAM_ENUMERATION("Thumbnails.AddedToTopSites", result,
+                            THUMBNAIL_EVENT_COUNT);
+
+  switch (result) {
+    case THUMBNAIL_FAILURE:
+    case THUMBNAIL_TOPSITES_FULL:
+    case THUMBNAIL_KEPT_EXISTING:
+      return false;
+    case THUMBNAIL_ADDED_TEMP:
+    case THUMBNAIL_ADDED_REGULAR:
+      return true;
+    case THUMBNAIL_PROMOTED_TEMP_TO_REGULAR:
+    case THUMBNAIL_EVENT_COUNT:
+      NOTREACHED();
   }
 
-  bool add_temp_thumbnail = false;
-  if (!IsKnownURL(url)) {
-    if (IsNonForcedFull())
-      return false;  // We're full, and this URL is not known to us.
-
-    add_temp_thumbnail = true;
-  }
-
-  if (!can_add_url_to_history_.Run(url))
-    return false;  // It's not a real webpage.
-
-  scoped_refptr<base::RefCountedBytes> thumbnail_data;
-  if (!EncodeBitmap(thumbnail, &thumbnail_data))
-    return false;
-
-  if (add_temp_thumbnail) {
-    // Always remove the existing entry and then add it back. That way if we end
-    // up with too many temp thumbnails we'll prune the oldest first.
-    RemoveTemporaryThumbnailByURL(url);
-    AddTemporaryThumbnail(url, thumbnail_data.get(), score);
-    return true;
-  }
-
-  return SetPageThumbnailEncoded(url, thumbnail_data.get(), score);
+  return false;
 }
 
 // WARNING: this function may be invoked on any thread.
@@ -489,11 +476,51 @@
   }
 }
 
-bool TopSitesImpl::SetPageThumbnailNoDB(
+TopSitesImpl::ThumbnailEvent TopSitesImpl::SetPageThumbnailImpl(
+    const GURL& url,
+    const gfx::Image& thumbnail,
+    const ThumbnailScore& score) {
+  DCHECK(thread_checker_.CalledOnValidThread());
+
+  if (!loaded_) {
+    // TODO(sky): I need to cache these and apply them after the load
+    // completes.
+    return THUMBNAIL_FAILURE;
+  }
+
+  bool add_temp_thumbnail = false;
+  if (!IsKnownURL(url)) {
+    if (IsNonForcedFull()) {
+      // We're full, and this URL is not known to us.
+      return THUMBNAIL_TOPSITES_FULL;
+    }
+
+    add_temp_thumbnail = true;
+  }
+
+  if (!can_add_url_to_history_.Run(url))
+    return THUMBNAIL_FAILURE;  // It's not a real webpage.
+
+  scoped_refptr<base::RefCountedBytes> thumbnail_data;
+  if (!EncodeBitmap(thumbnail, &thumbnail_data))
+    return THUMBNAIL_FAILURE;
+
+  if (add_temp_thumbnail) {
+    // Always remove the existing entry and then add it back. That way if we end
+    // up with too many temp thumbnails we'll prune the oldest first.
+    RemoveTemporaryThumbnailByURL(url);
+    AddTemporaryThumbnail(url, thumbnail_data.get(), score);
+    return THUMBNAIL_ADDED_TEMP;
+  }
+
+  bool success = SetPageThumbnailEncoded(url, thumbnail_data.get(), score);
+  return success ? THUMBNAIL_ADDED_REGULAR : THUMBNAIL_KEPT_EXISTING;
+}
+
+bool TopSitesImpl::SetPageThumbnailInCache(
     const GURL& url,
     const base::RefCountedMemory* thumbnail_data,
     const ThumbnailScore& score) {
-  // This should only be invoked when we know about the url.
   DCHECK(cache_->IsKnownURL(url));
 
   const MostVisitedURL& most_visited =
@@ -524,13 +551,12 @@
     const GURL& url,
     const base::RefCountedMemory* thumbnail,
     const ThumbnailScore& score) {
-  if (!SetPageThumbnailNoDB(url, thumbnail, score))
+  DCHECK(cache_->IsKnownURL(url));
+
+  if (!SetPageThumbnailInCache(url, thumbnail, score))
     return false;
 
   // Update the database.
-  if (!cache_->IsKnownURL(url))
-    return false;
-
   size_t index = cache_->GetURLIndex(url);
   int url_rank = index - cache_->GetNumForcedURLs();
   const MostVisitedURL& most_visited = cache_->top_sites()[index];
@@ -743,8 +769,14 @@
       for (TempImages::iterator it = temp_images_.begin();
            it != temp_images_.end(); ++it) {
         if (canonical_url == cache_->GetCanonicalURL(it->first)) {
-          SetPageThumbnailEncoded(
+          // We can't have a non-temp thumbnail yet, so this should always
+          // successfully set the thumbnail.
+          bool success = SetPageThumbnailEncoded(
               mv.url, it->second.thumbnail.get(), it->second.thumbnail_score);
+          DCHECK(success);
+          UMA_HISTOGRAM_ENUMERATION("Thumbnails.AddedToTopSites",
+                                    THUMBNAIL_PROMOTED_TEMP_TO_REGULAR,
+                                    THUMBNAIL_EVENT_COUNT);
           temp_images_.erase(it);
           break;
         }
diff --git a/components/history/core/browser/top_sites_impl.h b/components/history/core/browser/top_sites_impl.h
index 3024d448..98bc72f 100644
--- a/components/history/core/browser/top_sites_impl.h
+++ b/components/history/core/browser/top_sites_impl.h
@@ -119,6 +119,21 @@
     CALL_LOCATION_FROM_OTHER_PLACES,
   };
 
+  // An enum representing various outcomes of adding a page thumbnail, for use
+  // in UMA histograms. Most of these are recorded from SetPageThumbnail,
+  // except for PROMOTED_TEMP_TO_REGULAR which can happen during SetTopSites.
+  // Do not change existing entries, and only add new ones at the end!
+  enum ThumbnailEvent {
+    THUMBNAIL_FAILURE = 0,
+    THUMBNAIL_TOPSITES_FULL = 1,
+    THUMBNAIL_KEPT_EXISTING = 2,
+    THUMBNAIL_ADDED_TEMP = 3,
+    THUMBNAIL_ADDED_REGULAR = 4,
+    THUMBNAIL_PROMOTED_TEMP_TO_REGULAR = 5,
+    // Add new entries here.
+    THUMBNAIL_EVENT_COUNT = 6
+  };
+
   friend class TopSitesImplTest;
   FRIEND_TEST_ALL_PREFIXES(TopSitesImplTest, DiffMostVisited);
   FRIEND_TEST_ALL_PREFIXES(TopSitesImplTest, DiffMostVisitedWithForced);
@@ -146,14 +161,22 @@
                               const MostVisitedURLList& new_list,
                               TopSitesDelta* delta);
 
-  // Sets the thumbnail without writing to the database.
-  // Returns true if the thumbnail was set, false if the existing one is better.
-  bool SetPageThumbnailNoDB(const GURL& url,
-                            const base::RefCountedMemory* thumbnail_data,
-                            const ThumbnailScore& score);
+  // The actual implementation of SetPageThumbnail. It returns a more detailed
+  // status code (for UMA) rather than just a bool.
+  ThumbnailEvent SetPageThumbnailImpl(const GURL& url,
+                                      const gfx::Image& thumbnail,
+                                      const ThumbnailScore& score);
 
-  // A version of SetPageThumbnail that takes RefCountedBytes as
-  // returned by HistoryService.
+  // Sets the thumbnail without writing to the database, i.e. updates the cache
+  // only. Must only be called for known URLs. Returns true if the thumbnail was
+  // set, false if the existing one (if any) is better.
+  bool SetPageThumbnailInCache(const GURL& url,
+                               const base::RefCountedMemory* thumbnail_data,
+                               const ThumbnailScore& score);
+
+  // The major part of SetPageThumbnail, which sets the thumbnail both in the
+  // cache and in the database. Must only be called for known URLs. Returns true
+  // if the thumbnail was set, false if the existing one (if any) is better.
   bool SetPageThumbnailEncoded(const GURL& url,
                                const base::RefCountedMemory* thumbnail,
                                const ThumbnailScore& score);
diff --git a/components/safe_json/safe_json_parser_impl.cc b/components/safe_json/safe_json_parser_impl.cc
index 8f0ea48..9694dad8 100644
--- a/components/safe_json/safe_json_parser_impl.cc
+++ b/components/safe_json/safe_json_parser_impl.cc
@@ -19,23 +19,12 @@
                                        const ErrorCallback& error_callback)
     : unsafe_json_(unsafe_json),
       success_callback_(success_callback),
-      error_callback_(error_callback) {
-  io_thread_checker_.DetachFromThread();
-}
+      error_callback_(error_callback) {}
 
 SafeJsonParserImpl::~SafeJsonParserImpl() = default;
 
 void SafeJsonParserImpl::Start() {
-  caller_task_runner_ = base::SequencedTaskRunnerHandle::Get();
-
-  content::BrowserThread::PostTask(
-      content::BrowserThread::IO, FROM_HERE,
-      base::Bind(&SafeJsonParserImpl::StartOnIOThread, base::Unretained(this)));
-}
-
-void SafeJsonParserImpl::StartOnIOThread() {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-  DCHECK(io_thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   mojo_json_parser_.reset(
       new content::UtilityProcessMojoClient<mojom::SafeJsonParser>(
           l10n_util::GetStringUTF16(IDS_UTILITY_PROCESS_JSON_PARSER_NAME)));
@@ -50,34 +39,27 @@
 }
 
 void SafeJsonParserImpl::OnConnectionError() {
-  DCHECK(io_thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Shut down the utility process.
   mojo_json_parser_.reset();
 
-  caller_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&SafeJsonParserImpl::ReportResults, base::Unretained(this),
-                 nullptr, "Connection error with the json parser process."));
+  ReportResults(nullptr, "Connection error with the json parser process.");
 }
 
 void SafeJsonParserImpl::OnParseDone(std::unique_ptr<base::Value> result,
                                      const base::Optional<std::string>& error) {
-  DCHECK(io_thread_checker_.CalledOnValidThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   // Shut down the utility process.
   mojo_json_parser_.reset();
 
-  // Call ReportResults() on caller's thread.
-  caller_task_runner_->PostTask(
-      FROM_HERE,
-      base::Bind(&SafeJsonParserImpl::ReportResults, base::Unretained(this),
-                 base::Passed(&result), error.value_or("")));
+  ReportResults(std::move(result), error.value_or(""));
 }
 
 void SafeJsonParserImpl::ReportResults(std::unique_ptr<base::Value> parsed_json,
                                        const std::string& error) {
-  DCHECK(caller_task_runner_->RunsTasksOnCurrentThread());
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   if (error.empty() && parsed_json) {
     if (!success_callback_.is_null())
       success_callback_.Run(std::move(parsed_json));
diff --git a/components/safe_json/safe_json_parser_impl.h b/components/safe_json/safe_json_parser_impl.h
index 03ac995..54da8dc 100644
--- a/components/safe_json/safe_json_parser_impl.h
+++ b/components/safe_json/safe_json_parser_impl.h
@@ -17,7 +17,6 @@
 #include "content/public/browser/utility_process_mojo_client.h"
 
 namespace base {
-class SequencedTaskRunner;
 class Value;
 }
 
@@ -50,16 +49,11 @@
   const std::string unsafe_json_;
   SuccessCallback success_callback_;
   ErrorCallback error_callback_;
-  scoped_refptr<base::SequencedTaskRunner> caller_task_runner_;
 
   std::unique_ptr<content::UtilityProcessMojoClient<mojom::SafeJsonParser>>
       mojo_json_parser_;
 
-  // Used instead of DCHECK_CURRENTLY_ON(BrowserThread::IO) because it's
-  // posssible that it fails when the IO thread message loop is shutting down.
-  // This happens after the IO thread has unregistered from the BrowserThread
-  // list.
-  base::ThreadChecker io_thread_checker_;
+  SEQUENCE_CHECKER(sequence_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(SafeJsonParserImpl);
 };
diff --git a/components/translate/core/browser/BUILD.gn b/components/translate/core/browser/BUILD.gn
index 6f6721e7..4564ee8 100644
--- a/components/translate/core/browser/BUILD.gn
+++ b/components/translate/core/browser/BUILD.gn
@@ -102,6 +102,7 @@
     "mock_translate_ranker.h",
     "ranker_model_loader_unittest.cc",
     "ranker_model_unittest.cc",
+    "translate_accept_languages_unittest.cc",
     "translate_browser_metrics_unittest.cc",
     "translate_language_list_unittest.cc",
     "translate_manager_unittest.cc",
diff --git a/components/translate/core/browser/translate_accept_languages_unittest.cc b/components/translate/core/browser/translate_accept_languages_unittest.cc
new file mode 100644
index 0000000..c3055c47
--- /dev/null
+++ b/components/translate/core/browser/translate_accept_languages_unittest.cc
@@ -0,0 +1,66 @@
+// 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.
+
+#include "components/translate/core/browser/translate_accept_languages.h"
+
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
+#include "components/translate/core/browser/translate_download_manager.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace translate {
+namespace {
+
+TEST(TranslateAcceptLanguagesTest, TestIsAcceptLanguage) {
+  const char* const pref_setting = "translate-accept-languages";
+  TestingPrefServiceSimple prefs;
+  prefs.registry()->RegisterStringPref(pref_setting, "en-US,es,zh-CN");
+  TranslateAcceptLanguages accept_languages(&prefs, pref_setting);
+
+  // All valid.
+  EXPECT_TRUE(accept_languages.IsAcceptLanguage("en"));
+  EXPECT_TRUE(accept_languages.IsAcceptLanguage("en-US"));
+  EXPECT_TRUE(accept_languages.IsAcceptLanguage("es"));
+  EXPECT_TRUE(accept_languages.IsAcceptLanguage("zh-CN"));
+
+  // Not valid language.
+  EXPECT_FALSE(accept_languages.IsAcceptLanguage("xx"));
+
+  // zh-XX cannot be shortened to zh.
+  EXPECT_FALSE(accept_languages.IsAcceptLanguage("zh"));
+}
+
+// RAII class to set the TranslateDownloadManager application locale, and then
+// restore it to the original value when the object goes out of scope.
+class TranslateLocaleRestorer {
+ public:
+  explicit TranslateLocaleRestorer(const std::string& new_locale)
+      : existing_locale_(
+            TranslateDownloadManager::GetInstance()->application_locale()) {
+    TranslateDownloadManager::GetInstance()->set_application_locale(new_locale);
+  }
+  ~TranslateLocaleRestorer() {
+    TranslateDownloadManager::GetInstance()->set_application_locale(
+        existing_locale_);
+  }
+
+ private:
+  const std::string existing_locale_;
+};
+
+TEST(TranslateAcceptLanguagesTest, TestCanBeAcceptLanguage) {
+  TranslateLocaleRestorer locale_restorer("es");
+
+  // Valid accept languages.
+  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("en"));
+  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("en-US"));
+  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("es"));
+  EXPECT_TRUE(TranslateAcceptLanguages::CanBeAcceptLanguage("zh-CN"));
+
+  // Not valid language.
+  EXPECT_FALSE(TranslateAcceptLanguages::CanBeAcceptLanguage("xx"));
+}
+
+}  // namespace
+}  // namespace translate
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 76c3837a..1c89c14 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -342,10 +342,10 @@
     "appcache/appcache_storage.h",
     "appcache/appcache_storage_impl.cc",
     "appcache/appcache_storage_impl.h",
+    "appcache/appcache_subresource_url_factory.cc",
+    "appcache/appcache_subresource_url_factory.h",
     "appcache/appcache_update_job.cc",
     "appcache/appcache_update_job.h",
-    "appcache/appcache_url_loader_factory.cc",
-    "appcache/appcache_url_loader_factory.h",
     "appcache/appcache_url_loader_job.cc",
     "appcache/appcache_url_loader_job.h",
     "appcache/appcache_url_loader_request.cc",
@@ -936,6 +936,7 @@
     "loader/upload_progress_tracker.h",
     "loader/url_loader_factory_impl.cc",
     "loader/url_loader_factory_impl.h",
+    "loader/url_loader_request_handler.cc",
     "loader/url_loader_request_handler.h",
     "loader/wake_lock_resource_throttle.cc",
     "loader/wake_lock_resource_throttle.h",
diff --git a/content/browser/appcache/appcache_request_handler.cc b/content/browser/appcache/appcache_request_handler.cc
index 1e2fe1b..dc0070c 100644
--- a/content/browser/appcache/appcache_request_handler.cc
+++ b/content/browser/appcache/appcache_request_handler.cc
@@ -13,7 +13,7 @@
 #include "content/browser/appcache/appcache_navigation_handle_core.h"
 #include "content/browser/appcache/appcache_policy.h"
 #include "content/browser/appcache/appcache_request.h"
-#include "content/browser/appcache/appcache_url_loader_factory.h"
+#include "content/browser/appcache/appcache_subresource_url_factory.h"
 #include "content/browser/appcache/appcache_url_loader_job.h"
 #include "content/browser/appcache/appcache_url_loader_request.h"
 #include "content/browser/appcache/appcache_url_request_job.h"
@@ -232,11 +232,13 @@
 std::unique_ptr<AppCacheRequestHandler>
 AppCacheRequestHandler::InitializeForNavigationNetworkService(
     const ResourceRequest& request,
-    AppCacheNavigationHandleCore* appcache_handle_core) {
+    AppCacheNavigationHandleCore* appcache_handle_core,
+    URLLoaderFactoryGetter* url_loader_factory_getter) {
   std::unique_ptr<AppCacheRequestHandler> handler =
       appcache_handle_core->host()->CreateRequestHandler(
           AppCacheURLLoaderRequest::Create(request), request.resource_type,
           request.should_reset_appcache);
+  handler->set_network_url_loader_factory_getter(url_loader_factory_getter);
   return handler;
 }
 
@@ -545,4 +547,10 @@
       std::move(callback));
 }
 
+mojom::URLLoaderFactoryPtr
+AppCacheRequestHandler::MaybeCreateSubresourceFactory() {
+  return AppCacheSubresourceURLFactory::CreateURLLoaderFactory(
+      network_url_loader_factory_getter_.get());
+}
+
 }  // namespace content
diff --git a/content/browser/appcache/appcache_request_handler.h b/content/browser/appcache/appcache_request_handler.h
index b0ed05f..9fa3939 100644
--- a/content/browser/appcache/appcache_request_handler.h
+++ b/content/browser/appcache/appcache_request_handler.h
@@ -17,6 +17,7 @@
 #include "content/browser/appcache/appcache_host.h"
 #include "content/browser/appcache/appcache_service_impl.h"
 #include "content/browser/loader/url_loader_request_handler.h"
+#include "content/browser/url_loader_factory_getter.h"
 #include "content/common/content_export.h"
 #include "content/public/common/resource_type.h"
 
@@ -76,7 +77,8 @@
   static std::unique_ptr<AppCacheRequestHandler>
   InitializeForNavigationNetworkService(
       const ResourceRequest& request,
-      AppCacheNavigationHandleCore* appcache_handle_core);
+      AppCacheNavigationHandleCore* appcache_handle_core,
+      URLLoaderFactoryGetter* url_loader_factory_getter);
 
  private:
   friend class AppCacheHost;
@@ -148,6 +150,12 @@
   void MaybeCreateLoader(const ResourceRequest& resource_request,
                          ResourceContext* resource_context,
                          LoaderCallback callback) override;
+  mojom::URLLoaderFactoryPtr MaybeCreateSubresourceFactory() override;
+
+  void set_network_url_loader_factory_getter(
+      URLLoaderFactoryGetter* url_loader_factory_getter) {
+    network_url_loader_factory_getter_ = url_loader_factory_getter;
+  }
 
   // Data members -----------------------------------------------
 
@@ -216,7 +224,12 @@
   // the AppCache, we delete the job.
   std::unique_ptr<AppCacheJob> navigation_request_job_;
 
+  // In the network service world, points to the getter for the network URL
+  // loader.
+  scoped_refptr<URLLoaderFactoryGetter> network_url_loader_factory_getter_;
+
   friend class content::AppCacheRequestHandlerTest;
+
   DISALLOW_COPY_AND_ASSIGN(AppCacheRequestHandler);
 };
 
diff --git a/content/browser/appcache/appcache_subresource_url_factory.cc b/content/browser/appcache/appcache_subresource_url_factory.cc
new file mode 100644
index 0000000..d90257f3
--- /dev/null
+++ b/content/browser/appcache/appcache_subresource_url_factory.cc
@@ -0,0 +1,78 @@
+// 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.
+
+#include "content/browser/appcache/appcache_subresource_url_factory.h"
+
+#include "base/bind.h"
+#include "base/logging.h"
+#include "content/browser/appcache/appcache_request_handler.h"
+#include "content/browser/appcache/appcache_url_loader_job.h"
+#include "content/browser/appcache/appcache_url_loader_request.h"
+#include "content/browser/url_loader_factory_getter.h"
+#include "content/common/resource_request.h"
+#include "content/common/url_loader_factory.mojom.h"
+#include "content/public/browser/browser_thread.h"
+#include "mojo/public/cpp/bindings/binding.h"
+#include "mojo/public/cpp/bindings/binding_set.h"
+#include "mojo/public/cpp/bindings/interface_ptr.h"
+#include "net/traffic_annotation/network_traffic_annotation.h"
+
+namespace content {
+
+// Implements the URLLoaderFactory mojom for AppCache requests.
+AppCacheSubresourceURLFactory::AppCacheSubresourceURLFactory(
+    mojom::URLLoaderFactoryRequest request,
+    URLLoaderFactoryGetter* default_url_loader_factory_getter)
+    : binding_(this, std::move(request)),
+      default_url_loader_factory_getter_(default_url_loader_factory_getter) {
+  binding_.set_connection_error_handler(
+      base::Bind(&AppCacheSubresourceURLFactory::OnConnectionError,
+                 base::Unretained(this)));
+}
+
+AppCacheSubresourceURLFactory::~AppCacheSubresourceURLFactory() {}
+
+// static
+mojom::URLLoaderFactoryPtr
+AppCacheSubresourceURLFactory::CreateURLLoaderFactory(
+    URLLoaderFactoryGetter* default_url_loader_factory_getter) {
+  mojom::URLLoaderFactoryPtr loader_factory;
+  mojom::URLLoaderFactoryRequest request = mojo::MakeRequest(&loader_factory);
+
+  // This instance will get deleted when the client drops the connection.
+  // Please see OnConnectionError() for details.
+  new AppCacheSubresourceURLFactory(std::move(request),
+                                    default_url_loader_factory_getter);
+  return loader_factory;
+}
+
+void AppCacheSubresourceURLFactory::CreateLoaderAndStart(
+    mojom::URLLoaderAssociatedRequest url_loader_request,
+    int32_t routing_id,
+    int32_t request_id,
+    uint32_t options,
+    const ResourceRequest& request,
+    mojom::URLLoaderClientPtr client,
+    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
+  DCHECK_CURRENTLY_ON(BrowserThread::IO);
+  DLOG(WARNING) << "Received request for loading : " << request.url.spec();
+  default_url_loader_factory_getter_->GetNetworkFactory()
+      ->get()
+      ->CreateLoaderAndStart(mojom::URLLoaderAssociatedRequest(), routing_id,
+                             request_id, options, request, std::move(client),
+                             traffic_annotation);
+}
+
+void AppCacheSubresourceURLFactory::SyncLoad(int32_t routing_id,
+                                             int32_t request_id,
+                                             const ResourceRequest& request,
+                                             SyncLoadCallback callback) {
+  NOTREACHED();
+}
+
+void AppCacheSubresourceURLFactory::OnConnectionError() {
+  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
+}
+
+}  // namespace content
\ No newline at end of file
diff --git a/content/browser/appcache/appcache_url_loader_factory.h b/content/browser/appcache/appcache_subresource_url_factory.h
similarity index 73%
rename from content/browser/appcache/appcache_url_loader_factory.h
rename to content/browser/appcache/appcache_subresource_url_factory.h
index 6b1eacb..f55afc47 100644
--- a/content/browser/appcache/appcache_url_loader_factory.h
+++ b/content/browser/appcache/appcache_subresource_url_factory.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef CONTENT_BROWSER_APPCACHE_APPCACHE_URL_LOADER_FACTORY_H_
-#define CONTENT_BROWSER_APPCACHE_APPCACHE_URL_LOADER_FACTORY_H_
+#ifndef CONTENT_BROWSER_APPCACHE_APPCACHE_SUBRESOURCE_URL_FACTORY_H_
+#define CONTENT_BROWSER_APPCACHE_APPCACHE_SUBRESOURCE_URL_FACTORY_H_
 
 #include "base/memory/ref_counted.h"
 #include "content/common/url_loader_factory.mojom.h"
@@ -17,10 +17,10 @@
 class AppCacheServiceImpl;
 class URLLoaderFactoryGetter;
 
-// Implements the URLLoaderFactory mojom for AppCache requests.
-class AppCacheURLLoaderFactory : public mojom::URLLoaderFactory {
+// Implements the URLLoaderFactory mojom for AppCache subresource requests.
+class AppCacheSubresourceURLFactory : public mojom::URLLoaderFactory {
  public:
-  ~AppCacheURLLoaderFactory() override;
+  ~AppCacheSubresourceURLFactory() override;
 
   // Factory function to create an instance of the factory.
   // 1. The |factory_getter| parameter is used to query the network service
@@ -46,8 +46,8 @@
                 SyncLoadCallback callback) override;
 
  private:
-  AppCacheURLLoaderFactory(mojom::URLLoaderFactoryRequest request,
-                           URLLoaderFactoryGetter* factory_getter);
+  AppCacheSubresourceURLFactory(mojom::URLLoaderFactoryRequest request,
+                                URLLoaderFactoryGetter* factory_getter);
 
   void OnConnectionError();
 
@@ -56,9 +56,9 @@
 
   // Used to retrieve the network service factory to pass unhandled requests to
   // the network service.
-  scoped_refptr<URLLoaderFactoryGetter> factory_getter_;
+  scoped_refptr<URLLoaderFactoryGetter> default_url_loader_factory_getter_;
 
-  DISALLOW_COPY_AND_ASSIGN(AppCacheURLLoaderFactory);
+  DISALLOW_COPY_AND_ASSIGN(AppCacheSubresourceURLFactory);
 };
 
 }  // namespace content
diff --git a/content/browser/appcache/appcache_url_loader_factory.cc b/content/browser/appcache/appcache_url_loader_factory.cc
deleted file mode 100644
index 63cd59d3..0000000
--- a/content/browser/appcache/appcache_url_loader_factory.cc
+++ /dev/null
@@ -1,69 +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.
-
-#include "content/browser/appcache/appcache_url_loader_factory.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "content/browser/appcache/appcache_request_handler.h"
-#include "content/browser/appcache/appcache_url_loader_job.h"
-#include "content/browser/appcache/appcache_url_loader_request.h"
-#include "content/browser/url_loader_factory_getter.h"
-#include "content/common/resource_request.h"
-#include "content/common/url_loader_factory.mojom.h"
-#include "content/public/browser/browser_thread.h"
-#include "mojo/public/cpp/bindings/binding.h"
-#include "mojo/public/cpp/bindings/binding_set.h"
-#include "mojo/public/cpp/bindings/interface_ptr.h"
-#include "net/traffic_annotation/network_traffic_annotation.h"
-
-namespace content {
-
-// Implements the URLLoaderFactory mojom for AppCache requests.
-AppCacheURLLoaderFactory::AppCacheURLLoaderFactory(
-    mojom::URLLoaderFactoryRequest request,
-    URLLoaderFactoryGetter* factory_getter)
-    : binding_(this, std::move(request)), factory_getter_(factory_getter) {
-  binding_.set_connection_error_handler(base::Bind(
-      &AppCacheURLLoaderFactory::OnConnectionError, base::Unretained(this)));
-}
-
-AppCacheURLLoaderFactory::~AppCacheURLLoaderFactory() {}
-
-// static
-mojom::URLLoaderFactoryPtr AppCacheURLLoaderFactory::CreateURLLoaderFactory(
-    URLLoaderFactoryGetter* factory_getter) {
-  mojom::URLLoaderFactoryPtr loader_factory;
-  mojom::URLLoaderFactoryRequest request = mojo::MakeRequest(&loader_factory);
-
-  // This instance will get deleted when the client drops the connection.
-  // Please see OnConnectionError() for details.
-  new AppCacheURLLoaderFactory(std::move(request), factory_getter);
-  return loader_factory;
-}
-
-void AppCacheURLLoaderFactory::CreateLoaderAndStart(
-    mojom::URLLoaderAssociatedRequest url_loader_request,
-    int32_t routing_id,
-    int32_t request_id,
-    uint32_t options,
-    const ResourceRequest& request,
-    mojom::URLLoaderClientPtr client,
-    const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) {
-  DCHECK_CURRENTLY_ON(BrowserThread::IO);
-  NOTREACHED() << "Currently not implemented";
-}
-
-void AppCacheURLLoaderFactory::SyncLoad(int32_t routing_id,
-                                        int32_t request_id,
-                                        const ResourceRequest& request,
-                                        SyncLoadCallback callback) {
-  NOTREACHED();
-}
-
-void AppCacheURLLoaderFactory::OnConnectionError() {
-  base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this);
-}
-
-}  // namespace content
\ No newline at end of file
diff --git a/content/browser/frame_host/navigation_request.cc b/content/browser/frame_host/navigation_request.cc
index 54ac9d57..c130d36 100644
--- a/content/browser/frame_host/navigation_request.cc
+++ b/content/browser/frame_host/navigation_request.cc
@@ -573,7 +573,8 @@
     std::unique_ptr<NavigationData> navigation_data,
     const GlobalRequestID& request_id,
     bool is_download,
-    bool is_stream) {
+    bool is_stream,
+    mojom::URLLoaderFactoryPtrInfo subresource_loader_factory_info) {
   DCHECK(state_ == STARTED);
   DCHECK(response);
   TRACE_EVENT_ASYNC_STEP_INTO0("navigation", "NavigationRequest", this,
@@ -646,6 +647,8 @@
   body_ = std::move(body);
   handle_ = std::move(consumer_handle);
 
+  subresource_loader_factory_info_ = std::move(subresource_loader_factory_info);
+
   // Check if the navigation should be allowed to proceed.
   navigation_handle_->WillProcessResponse(
       render_frame_host, response->head.headers.get(),
@@ -922,9 +925,10 @@
 
   DCHECK_EQ(request_params_.has_user_gesture, begin_params_.has_user_gesture);
 
-  render_frame_host->CommitNavigation(response_.get(), std::move(body_),
-                                      std::move(handle_), common_params_,
-                                      request_params_, is_view_source_);
+  render_frame_host->CommitNavigation(
+      response_.get(), std::move(body_), std::move(handle_), common_params_,
+      request_params_, is_view_source_,
+      std::move(subresource_loader_factory_info_));
 
   frame_tree_node_->ResetNavigationRequest(true, true);
 }
diff --git a/content/browser/frame_host/navigation_request.h b/content/browser/frame_host/navigation_request.h
index 7e90d70..73856c4 100644
--- a/content/browser/frame_host/navigation_request.h
+++ b/content/browser/frame_host/navigation_request.h
@@ -205,7 +205,9 @@
                          std::unique_ptr<NavigationData> navigation_data,
                          const GlobalRequestID& request_id,
                          bool is_download,
-                         bool is_stream) override;
+                         bool is_stream,
+                         mojom::URLLoaderFactoryPtrInfo
+                             subresource_url_loader_factory_info) override;
   void OnRequestFailed(bool has_stale_copy_in_cache, int net_error) override;
   void OnRequestStarted(base::TimeTicks timestamp) override;
 
@@ -286,6 +288,10 @@
 
   base::Closure on_start_checks_complete_closure_;
 
+  // Used in the network service world to pass the subressource loader factory
+  // to the renderer. Currently only used by AppCache.
+  mojom::URLLoaderFactoryPtrInfo subresource_loader_factory_info_;
+
   base::WeakPtrFactory<NavigationRequest> weak_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(NavigationRequest);
diff --git a/content/browser/frame_host/navigator_impl.cc b/content/browser/frame_host/navigator_impl.cc
index 8268976..55f3127 100644
--- a/content/browser/frame_host/navigator_impl.cc
+++ b/content/browser/frame_host/navigator_impl.cc
@@ -29,6 +29,7 @@
 #include "content/common/navigation_params.h"
 #include "content/common/page_messages.h"
 #include "content/common/site_isolation_policy.h"
+#include "content/common/url_loader_factory.mojom.h"
 #include "content/common/view_messages.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/content_browser_client.h"
@@ -1173,7 +1174,8 @@
         nullptr,  // response
         nullptr,  // body
         mojo::ScopedDataPipeConsumerHandle(), scoped_request->common_params(),
-        scoped_request->request_params(), scoped_request->is_view_source());
+        scoped_request->request_params(), scoped_request->is_view_source(),
+        mojom::URLLoaderFactoryPtrInfo());
     return;
   }
 
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 3754bebc..d3f875d 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -2990,7 +2990,8 @@
       CSPDisposition::CHECK /* should_check_main_world_csp */);
   if (IsBrowserSideNavigationEnabled()) {
     CommitNavigation(nullptr, nullptr, mojo::ScopedDataPipeConsumerHandle(),
-                     common_params, RequestNavigationParams(), false);
+                     common_params, RequestNavigationParams(), false,
+                     mojom::URLLoaderFactoryPtrInfo());
   } else {
     Navigate(common_params, StartNavigationParams(), RequestNavigationParams());
   }
@@ -3140,7 +3141,8 @@
     mojo::ScopedDataPipeConsumerHandle handle,
     const CommonNavigationParams& common_params,
     const RequestNavigationParams& request_params,
-    bool is_view_source) {
+    bool is_view_source,
+    mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_info) {
   TRACE_EVENT2("navigation", "RenderFrameHostImpl::CommitNavigation",
                "frame_tree_node", frame_tree_node_->frame_tree_node_id(), "url",
                common_params.url.possibly_invalid_spec());
@@ -3171,13 +3173,18 @@
   // TODO(scottmg): Pass a factory for SW, etc. once we have one.
   if (base::CommandLine::ForCurrentProcess()->HasSwitch(
           switches::kEnableNetworkService)) {
-    const auto& schemes = URLDataManagerBackend::GetWebUISchemes();
-    if (std::find(schemes.begin(), schemes.end(), common_params.url.scheme()) !=
-        schemes.end()) {
-      commit_data.url_loader_factory = CreateWebUIURLLoader(frame_tree_node_)
-                                           .PassInterface()
-                                           .PassHandle()
-                                           .release();
+    if (!subresource_url_loader_factory_info.is_valid()) {
+      const auto& schemes = URLDataManagerBackend::GetWebUISchemes();
+      if (std::find(schemes.begin(), schemes.end(),
+                    common_params.url.scheme()) != schemes.end()) {
+        commit_data.url_loader_factory = CreateWebUIURLLoader(frame_tree_node_)
+                                             .PassInterface()
+                                             .PassHandle()
+                                             .release();
+      }
+    } else {
+      commit_data.url_loader_factory =
+          subresource_url_loader_factory_info.PassHandle().release();
     }
   }
   Send(new FrameMsg_CommitNavigation(routing_id_, head, body_url, commit_data,
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index db36975..dc24b89 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -41,6 +41,7 @@
 #include "content/common/frame_replication_state.h"
 #include "content/common/image_downloader/image_downloader.mojom.h"
 #include "content/common/navigation_params.h"
+#include "content/common/url_loader_factory.mojom.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/common/javascript_dialog_type.h"
 #include "content/public/common/previews_state.h"
@@ -523,12 +524,17 @@
 
   // PlzNavigate: Indicates that a navigation is ready to commit and can be
   // handled by this RenderFrame.
-  void CommitNavigation(ResourceResponse* response,
-                        std::unique_ptr<StreamHandle> body,
-                        mojo::ScopedDataPipeConsumerHandle handle,
-                        const CommonNavigationParams& common_params,
-                        const RequestNavigationParams& request_params,
-                        bool is_view_source);
+  // |subresource_url_loader_factory_info| is used in network service land to
+  // allow factories interested in handling subresource requests to the
+  // renderer. E.g. AppCache.
+  void CommitNavigation(
+      ResourceResponse* response,
+      std::unique_ptr<StreamHandle> body,
+      mojo::ScopedDataPipeConsumerHandle handle,
+      const CommonNavigationParams& common_params,
+      const RequestNavigationParams& request_params,
+      bool is_view_source,
+      mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_info);
 
   // PlzNavigate
   // Indicates that a navigation failed and that this RenderFrame should display
diff --git a/content/browser/loader/navigation_url_loader_delegate.h b/content/browser/loader/navigation_url_loader_delegate.h
index 8a71b22..c31a9e0 100644
--- a/content/browser/loader/navigation_url_loader_delegate.h
+++ b/content/browser/loader/navigation_url_loader_delegate.h
@@ -10,6 +10,7 @@
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "content/common/content_export.h"
+#include "content/common/url_loader_factory.mojom.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 
 namespace net {
@@ -38,6 +39,9 @@
   // |body_stream|. |navigation_data| is passed to the NavigationHandle.
   // If --enable-network-service, then |consumer_handle| will be used,
   // otherwise |body_stream|. Only one of these will ever be non-null.
+  // |subresource_url_loader_factory_info| is used in the network service only
+  // for passing factories which are interested in handling subresource
+  // requests like AppCache.
   virtual void OnResponseStarted(
       const scoped_refptr<ResourceResponse>& response,
       std::unique_ptr<StreamHandle> body_stream,
@@ -46,7 +50,8 @@
       std::unique_ptr<NavigationData> navigation_data,
       const GlobalRequestID& request_id,
       bool is_download,
-      bool is_stream) = 0;
+      bool is_stream,
+      mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_info) = 0;
 
   // Called if the request fails before receving a response. |net_error| is a
   // network error code for the failure. |has_stale_copy_in_cache| is true if
diff --git a/content/browser/loader/navigation_url_loader_impl.cc b/content/browser/loader/navigation_url_loader_impl.cc
index b7827ed..71d0c2cb 100644
--- a/content/browser/loader/navigation_url_loader_impl.cc
+++ b/content/browser/loader/navigation_url_loader_impl.cc
@@ -101,10 +101,10 @@
     bool is_stream) {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  delegate_->OnResponseStarted(response, std::move(body),
-                               mojo::ScopedDataPipeConsumerHandle(), ssl_status,
-                               std::move(navigation_data), request_id,
-                               is_download, is_stream);
+  delegate_->OnResponseStarted(
+      response, std::move(body), mojo::ScopedDataPipeConsumerHandle(),
+      ssl_status, std::move(navigation_data), request_id, is_download,
+      is_stream, mojom::URLLoaderFactoryPtrInfo());
 }
 
 void NavigationURLLoaderImpl::NotifyRequestFailed(bool in_cache,
diff --git a/content/browser/loader/navigation_url_loader_network_service.cc b/content/browser/loader/navigation_url_loader_network_service.cc
index df66bde..e4bba52 100644
--- a/content/browser/loader/navigation_url_loader_network_service.cc
+++ b/content/browser/loader/navigation_url_loader_network_service.cc
@@ -75,11 +75,11 @@
   URLLoaderRequestController(
       std::unique_ptr<ResourceRequest> resource_request,
       ResourceContext* resource_context,
-      scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter,
+      scoped_refptr<URLLoaderFactoryGetter> default_url_loader_factory_getter,
       const base::WeakPtr<NavigationURLLoaderNetworkService>& owner)
       : resource_request_(std::move(resource_request)),
         resource_context_(resource_context),
-        url_loader_factory_getter_(url_loader_factory_getter),
+        default_url_loader_factory_getter_(default_url_loader_factory_getter),
         owner_(owner) {}
 
   ~URLLoaderRequestController() override {
@@ -141,7 +141,8 @@
     if (appcache_handle_core) {
       std::unique_ptr<URLLoaderRequestHandler> appcache_handler =
           AppCacheRequestHandler::InitializeForNavigationNetworkService(
-              *resource_request_, appcache_handle_core);
+              *resource_request_, appcache_handle_core,
+              default_url_loader_factory_getter_.get());
       if (appcache_handler)
         handlers_.push_back(std::move(appcache_handler));
     }
@@ -162,6 +163,15 @@
           GetContentClient()->browser()->CreateURLLoaderThrottles(
               web_contents_getter_),
           *resource_request_, this);
+
+      DCHECK_GT(handler_index_, 0U);
+
+      mojom::URLLoaderFactoryPtr subresource_loader_factory =
+          handlers_[handler_index_ - 1]->MaybeCreateSubresourceFactory();
+      if (subresource_loader_factory.get()) {
+        subresource_url_loader_factory_ptr_info_ =
+            subresource_loader_factory.PassInterface();
+      }
       return;
     }
 
@@ -176,9 +186,9 @@
     mojom::URLLoaderFactory* factory = nullptr;
     DCHECK_EQ(handlers_.size(), handler_index_);
     if (resource_request_->url.SchemeIs(url::kBlobScheme)) {
-      factory = url_loader_factory_getter_->GetBlobFactory()->get();
+      factory = default_url_loader_factory_getter_->GetBlobFactory()->get();
     } else {
-      factory = url_loader_factory_getter_->GetNetworkFactory()->get();
+      factory = default_url_loader_factory_getter_->GetNetworkFactory()->get();
     }
     url_loader_ = ThrottlingURLLoader::CreateLoaderAndStart(
         factory,
@@ -196,6 +206,12 @@
     url_loader_->FollowRedirect();
   }
 
+  // Ownership of the URLLoaderFactoryPtrInfo instance is transferred to the
+  // caller.
+  mojom::URLLoaderFactoryPtrInfo GetSubresourceURLLoaderFactory() {
+    return std::move(subresource_url_loader_factory_ptr_info_);
+  }
+
  private:
   // mojom::URLLoaderClient implementation:
   void OnReceiveResponse(
@@ -250,7 +266,7 @@
   ResourceContext* resource_context_;
   base::Callback<WebContents*()> web_contents_getter_;
 
-  scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_;
+  scoped_refptr<URLLoaderFactoryGetter> default_url_loader_factory_getter_;
 
   mojom::URLLoaderFactoryPtr webui_factory_ptr_;
 
@@ -259,6 +275,10 @@
   // This is referenced only on the UI thread.
   base::WeakPtr<NavigationURLLoaderNetworkService> owner_;
 
+  // Currently used by the AppCache loader to pass its factory to the
+  // renderer which enables it to handle subresources.
+  mojom::URLLoaderFactoryPtrInfo subresource_url_loader_factory_ptr_info_;
+
   DISALLOW_COPY_AND_ASSIGN(URLLoaderRequestController);
 };
 
@@ -394,10 +414,11 @@
   // Temporarily, we pass both a stream (null) and the data pipe to the
   // delegate until PlzNavigate has shipped and we can be comfortable fully
   // switching to the data pipe.
-  delegate_->OnResponseStarted(response_, nullptr, std::move(body), ssl_status_,
-                               std::unique_ptr<NavigationData>(),
-                               GlobalRequestID(-1, g_next_request_id),
-                               false /* is_download? */, false /* is_stream */);
+  delegate_->OnResponseStarted(
+      response_, nullptr, std::move(body), ssl_status_,
+      std::unique_ptr<NavigationData>(), GlobalRequestID(-1, g_next_request_id),
+      false /* is_download? */, false /* is_stream */,
+      request_controller_->GetSubresourceURLLoaderFactory());
 }
 
 void NavigationURLLoaderNetworkService::OnComplete(
diff --git a/content/browser/loader/url_loader_request_handler.cc b/content/browser/loader/url_loader_request_handler.cc
new file mode 100644
index 0000000..0925e224
--- /dev/null
+++ b/content/browser/loader/url_loader_request_handler.cc
@@ -0,0 +1,14 @@
+// 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.
+
+#include "content/browser/loader/url_loader_request_handler.h"
+
+namespace content {
+
+mojom::URLLoaderFactoryPtr
+URLLoaderRequestHandler::MaybeCreateSubresourceFactory() {
+  return nullptr;
+}
+
+}  // namespace content
\ No newline at end of file
diff --git a/content/browser/loader/url_loader_request_handler.h b/content/browser/loader/url_loader_request_handler.h
index 11a6e030..f52974c0 100644
--- a/content/browser/loader/url_loader_request_handler.h
+++ b/content/browser/loader/url_loader_request_handler.h
@@ -9,6 +9,7 @@
 #include "base/callback_forward.h"
 #include "base/macros.h"
 #include "content/common/url_loader.mojom.h"
+#include "content/common/url_loader_factory.mojom.h"
 
 namespace content {
 
@@ -33,6 +34,11 @@
   virtual void MaybeCreateLoader(const ResourceRequest& resource_request,
                                  ResourceContext* resource_context,
                                  LoaderCallback callback) = 0;
+
+  // Returns the URLLoaderFactory if any to be used for subsequent URL requests
+  // going forward. Subclasses who want to handle subresource requests etc may
+  // want to override this to return a custom factory.
+  virtual mojom::URLLoaderFactoryPtr MaybeCreateSubresourceFactory();
 };
 
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_context_request_handler.cc b/content/browser/service_worker/service_worker_context_request_handler.cc
index 8677521..364e41f7 100644
--- a/content/browser/service_worker/service_worker_context_request_handler.cc
+++ b/content/browser/service_worker/service_worker_context_request_handler.cc
@@ -209,8 +209,7 @@
   int extra_load_flags = 0;
   base::TimeDelta time_since_last_check =
       base::Time::Now() - registration->last_update_check();
-  if (time_since_last_check >
-          base::TimeDelta::FromHours(kServiceWorkerScriptMaxCacheAgeInHours) ||
+  if (time_since_last_check > kServiceWorkerScriptMaxCacheAge ||
       version_->force_bypass_cache_for_scripts()) {
     extra_load_flags = net::LOAD_BYPASS_CACHE;
   }
diff --git a/content/browser/service_worker/service_worker_job_unittest.cc b/content/browser/service_worker/service_worker_job_unittest.cc
index f6354f2..5938ee65 100644
--- a/content/browser/service_worker/service_worker_job_unittest.cc
+++ b/content/browser/service_worker/service_worker_job_unittest.cc
@@ -920,8 +920,7 @@
     base::TimeDelta time_since_last_check =
         base::Time::Now() - registration->last_update_check();
     if (!is_update || script.GetOrigin() != kNoChangeOrigin ||
-        time_since_last_check > base::TimeDelta::FromHours(
-                                    kServiceWorkerScriptMaxCacheAgeInHours)) {
+        time_since_last_check > kServiceWorkerScriptMaxCacheAge) {
       version->embedded_worker()->OnNetworkAccessedForScriptLoad();
     }
 
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc
index e77a33a..2ab2cb2 100644
--- a/content/browser/service_worker/service_worker_metrics.cc
+++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -493,6 +493,11 @@
       static_cast<int>(preparation),
       static_cast<int>(WorkerPreparationType::NUM_TYPES));
   if (did_navigation_preload) {
+    // TODO(falken): Consider removing this UMA if it turns out the same as
+    // ServiceWorker.NavPreload.WorkerPreparationType. That UMA is logged at
+    // the same time as the other NavPreload metrics (which requires both the
+    // worker to start and the nav preload response to arrive successfuly), so
+    // they are more safely compared together.
     UMA_HISTOGRAM_ENUMERATION(
         "ServiceWorker.ActivatedWorkerPreparationForMainFrame.Type_"
         "NavigationPreloadEnabled",
@@ -843,6 +848,7 @@
     base::TimeDelta worker_start,
     base::TimeDelta response_start,
     EmbeddedWorkerStatus initial_worker_status,
+    StartSituation start_situation,
     ResourceType resource_type) {
   DCHECK_GE(worker_start.ToInternalValue(), 0);
   DCHECK_GE(response_start.ToInternalValue(), 0);
@@ -860,7 +866,14 @@
   if (nav_preload_finished_first) {
     worker_wait_time = worker_start - response_start;
   }
+  const bool worker_start_occurred =
+      initial_worker_status != EmbeddedWorkerStatus::RUNNING;
+  const WorkerPreparationType preparation =
+      GetWorkerPreparationType(initial_worker_status, start_situation);
 
+  UMA_HISTOGRAM_ENUMERATION(
+      "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", preparation,
+      WorkerPreparationType::NUM_TYPES);
   UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.NavPreload.ResponseTime_MainFrame",
                              response_start);
   UMA_HISTOGRAM_BOOLEAN("ServiceWorker.NavPreload.FinishedFirst_MainFrame",
@@ -872,8 +885,6 @@
         "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame", worker_wait_time);
   }
 
-  const bool worker_start_occurred =
-      initial_worker_status != EmbeddedWorkerStatus::RUNNING;
   if (worker_start_occurred) {
     UMA_HISTOGRAM_MEDIUM_TIMES(
         "ServiceWorker.NavPreload.ResponseTime_MainFrame_"
diff --git a/content/browser/service_worker/service_worker_metrics.h b/content/browser/service_worker/service_worker_metrics.h
index 9298deb..0305ca76 100644
--- a/content/browser/service_worker/service_worker_metrics.h
+++ b/content/browser/service_worker/service_worker_metrics.h
@@ -344,6 +344,7 @@
       base::TimeDelta worker_start,
       base::TimeDelta response_start,
       EmbeddedWorkerStatus initial_worker_status,
+      StartSituation start_situation,
       ResourceType resource_type);
 
   // Records the result of trying to handle a request for a service worker
diff --git a/content/browser/service_worker/service_worker_metrics_unittest.cc b/content/browser/service_worker/service_worker_metrics_unittest.cc
index 50efb2c..75b2697 100644
--- a/content/browser/service_worker/service_worker_metrics_unittest.cc
+++ b/content/browser/service_worker/service_worker_metrics_unittest.cc
@@ -24,6 +24,8 @@
 void ExpectNoNavPreloadMainFrameUMA(
     const base::HistogramTester& histogram_tester) {
   histogram_tester.ExpectTotalCount(
+      "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame", 0);
+  histogram_tester.ExpectTotalCount(
       "ServiceWorker.NavPreload.ResponseTime_MainFrame", 0);
   histogram_tester.ExpectTotalCount(
       "ServiceWorker.NavPreload.FinishedFirst_MainFrame", 0);
@@ -33,45 +35,38 @@
       "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame", 0);
 
   histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.ResponseTime_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.ResponseTime_MainFrame_WorkerStartOccurred", 0);
+  histogram_tester.ExpectTotalCount(
+      "ServiceWorker.NavPreload.FinishedFirst_MainFrame_WorkerStartOccurred",
       0);
   histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.FinishedFirst_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_WorkerStartOccurred",
       0);
   histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_"
-      "WorkerStartOccurred",
-      0);
-  histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_WorkerStartOccurred",
       0);
 }
 
 void ExpectNoNavPreloadWorkerStartOccurredUMA(
     const base::HistogramTester& histogram_tester) {
   histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.ResponseTime_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.ResponseTime_MainFrame_WorkerStartOccurred", 0);
+  histogram_tester.ExpectTotalCount(
+      "ServiceWorker.NavPreload.FinishedFirst_MainFrame_WorkerStartOccurred",
       0);
   histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.FinishedFirst_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_WorkerStartOccurred",
       0);
   histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_"
-      "WorkerStartOccurred",
-      0);
-  histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_WorkerStartOccurred",
       0);
 }
 
 }  // namespace
 
+using StartSituation = ServiceWorkerMetrics::StartSituation;
+using WorkerPreparationType = ServiceWorkerMetrics::WorkerPreparationType;
+
 TEST(ServiceWorkerMetricsTest, ActivatedWorkerPreparation) {
   base::TimeDelta time = base::TimeDelta::FromMilliseconds(123);
   {
@@ -82,9 +77,7 @@
         ServiceWorkerMetrics::StartSituation::UNKNOWN,
         false /* did_navigation_preload */);
     histogram_tester.ExpectUniqueSample(
-        kPreparationType,
-        static_cast<int>(ServiceWorkerMetrics::WorkerPreparationType::STARTING),
-        1);
+        kPreparationType, static_cast<int>(WorkerPreparationType::STARTING), 1);
     histogram_tester.ExpectTotalCount(
         kPreparationType + kNavigationPreloadSuffix, 0);
     histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1);
@@ -98,19 +91,14 @@
     // Test preparation when the worker started up during startup.
     base::HistogramTester histogram_tester;
     ServiceWorkerMetrics::RecordActivatedWorkerPreparationForMainFrame(
-        time, EmbeddedWorkerStatus::STOPPED,
-        ServiceWorkerMetrics::StartSituation::DURING_STARTUP,
+        time, EmbeddedWorkerStatus::STOPPED, StartSituation::DURING_STARTUP,
         true /* did_navigation_preload */);
     histogram_tester.ExpectUniqueSample(
         kPreparationType,
-        static_cast<int>(
-            ServiceWorkerMetrics::WorkerPreparationType::START_DURING_STARTUP),
-        1);
+        static_cast<int>(WorkerPreparationType::START_DURING_STARTUP), 1);
     histogram_tester.ExpectUniqueSample(
         kPreparationType + kNavigationPreloadSuffix,
-        static_cast<int>(
-            ServiceWorkerMetrics::WorkerPreparationType::START_DURING_STARTUP),
-        1);
+        static_cast<int>(WorkerPreparationType::START_DURING_STARTUP), 1);
     histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1);
     histogram_tester.ExpectTimeBucketCount(
         kPreparationTime + kNavigationPreloadSuffix, time, 1);
@@ -122,19 +110,14 @@
     // Test preparation when the worker started up in an existing process.
     base::HistogramTester histogram_tester;
     ServiceWorkerMetrics::RecordActivatedWorkerPreparationForMainFrame(
-        time, EmbeddedWorkerStatus::STOPPED,
-        ServiceWorkerMetrics::StartSituation::EXISTING_PROCESS,
+        time, EmbeddedWorkerStatus::STOPPED, StartSituation::EXISTING_PROCESS,
         true /* did_navigation_preload */);
     histogram_tester.ExpectUniqueSample(
         kPreparationType,
-        static_cast<int>(ServiceWorkerMetrics::WorkerPreparationType::
-                             START_IN_EXISTING_PROCESS),
-        1);
+        static_cast<int>(WorkerPreparationType::START_IN_EXISTING_PROCESS), 1);
     histogram_tester.ExpectUniqueSample(
         kPreparationType + kNavigationPreloadSuffix,
-        static_cast<int>(ServiceWorkerMetrics::WorkerPreparationType::
-                             START_IN_EXISTING_PROCESS),
-        1);
+        static_cast<int>(WorkerPreparationType::START_IN_EXISTING_PROCESS), 1);
     histogram_tester.ExpectTimeBucketCount(kPreparationTime, time, 1);
     histogram_tester.ExpectTimeBucketCount(
         kPreparationTime + kNavigationPreloadSuffix, time, 1);
@@ -153,11 +136,15 @@
   base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(123);
   base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789);
   EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::RUNNING;
+  StartSituation start_situation = StartSituation::EXISTING_PROCESS;
   base::HistogramTester histogram_tester;
   ServiceWorkerMetrics::RecordNavigationPreloadResponse(
-      worker_start, response_start, initial_worker_status,
+      worker_start, response_start, initial_worker_status, start_situation,
       RESOURCE_TYPE_MAIN_FRAME);
 
+  histogram_tester.ExpectUniqueSample(
+      "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame",
+      static_cast<int>(WorkerPreparationType::RUNNING), 1);
   histogram_tester.ExpectTimeBucketCount(
       "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1);
   histogram_tester.ExpectUniqueSample(
@@ -176,9 +163,10 @@
   base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(123);
   base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789);
   EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::RUNNING;
+  StartSituation start_situation = StartSituation::EXISTING_PROCESS;
   base::HistogramTester histogram_tester;
   ServiceWorkerMetrics::RecordNavigationPreloadResponse(
-      worker_start, response_start, initial_worker_status,
+      worker_start, response_start, initial_worker_status, start_situation,
       RESOURCE_TYPE_SUB_FRAME);
 
   ExpectNoNavPreloadMainFrameUMA(histogram_tester);
@@ -190,11 +178,15 @@
   base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(234);
   base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789);
   EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED;
+  StartSituation start_situation = StartSituation::NEW_PROCESS;
   base::HistogramTester histogram_tester;
   ServiceWorkerMetrics::RecordNavigationPreloadResponse(
-      worker_start, response_start, initial_worker_status,
+      worker_start, response_start, initial_worker_status, start_situation,
       RESOURCE_TYPE_MAIN_FRAME);
 
+  histogram_tester.ExpectUniqueSample(
+      "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame",
+      static_cast<int>(WorkerPreparationType::START_IN_NEW_PROCESS), 1);
   histogram_tester.ExpectTimeBucketCount(
       "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1);
   histogram_tester.ExpectUniqueSample(
@@ -205,20 +197,16 @@
       "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame", 0);
 
   histogram_tester.ExpectTimeBucketCount(
-      "ServiceWorker.NavPreload.ResponseTime_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.ResponseTime_MainFrame_WorkerStartOccurred",
       response_start, 1);
   histogram_tester.ExpectUniqueSample(
-      "ServiceWorker.NavPreload.FinishedFirst_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.FinishedFirst_MainFrame_WorkerStartOccurred",
       false, 1);
   histogram_tester.ExpectTimeBucketCount(
-      "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.ConcurrentTime_MainFrame_WorkerStartOccurred",
       worker_start, 1);
   histogram_tester.ExpectTotalCount(
-      "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_"
-      "WorkerStartOccurred",
+      "ServiceWorker.NavPreload.WorkerWaitTime_MainFrame_WorkerStartOccurred",
       0);
 }
 
@@ -227,27 +215,31 @@
   base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(234);
   base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789);
   EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED;
+  StartSituation start_situation = StartSituation::EXISTING_PROCESS;
   base::HistogramTester histogram_tester;
   ServiceWorkerMetrics::RecordNavigationPreloadResponse(
-      worker_start, response_start, initial_worker_status,
+      worker_start, response_start, initial_worker_status, start_situation,
       RESOURCE_TYPE_SUB_FRAME);
 
   ExpectNoNavPreloadMainFrameUMA(histogram_tester);
 }
 
-// The worker was already starting up (STARTING). This gets logged the same as
-// if it were STOPPED, since any status other than RUNNING gets logged to the
-// "_WorkerStartOccurred" suffix.
+// The worker was already starting up (STARTING). This gets logged to the
+// _WorkerStartOccurred suffix as well.
 TEST(ServiceWorkerMetricsTest,
-     NavigationPreloadResponse_WorkerStart_BrowserStartup) {
+     NavigationPreloadResponse_WorkerStart_WorkerStarting) {
   base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(234);
   base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(789);
   EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STARTING;
+  StartSituation start_situation = StartSituation::NEW_PROCESS;
   base::HistogramTester histogram_tester;
   ServiceWorkerMetrics::RecordNavigationPreloadResponse(
-      worker_start, response_start, initial_worker_status,
+      worker_start, response_start, initial_worker_status, start_situation,
       RESOURCE_TYPE_MAIN_FRAME);
 
+  histogram_tester.ExpectUniqueSample(
+      "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame",
+      static_cast<int>(WorkerPreparationType::STARTING), 1);
   histogram_tester.ExpectTimeBucketCount(
       "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1);
   histogram_tester.ExpectUniqueSample(
@@ -281,12 +273,15 @@
   base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(2345);
   base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(456);
   base::TimeDelta wait_time = worker_start - response_start;
-  // STOPPING is also logged the same as STOPPED.
   EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPING;
+  StartSituation start_situation = StartSituation::NEW_PROCESS;
   base::HistogramTester histogram_tester;
   ServiceWorkerMetrics::RecordNavigationPreloadResponse(
-      worker_start, response_start, initial_worker_status,
+      worker_start, response_start, initial_worker_status, start_situation,
       RESOURCE_TYPE_MAIN_FRAME);
+  histogram_tester.ExpectUniqueSample(
+      "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame",
+      static_cast<int>(WorkerPreparationType::STOPPING), 1);
   histogram_tester.ExpectTimeBucketCount(
       "ServiceWorker.NavPreload.ResponseTime_MainFrame", response_start, 1);
   histogram_tester.ExpectUniqueSample(
@@ -316,12 +311,28 @@
   base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(2345);
   base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(456);
   EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED;
+  StartSituation start_situation = StartSituation::NEW_PROCESS;
   base::HistogramTester histogram_tester;
   ServiceWorkerMetrics::RecordNavigationPreloadResponse(
-      worker_start, response_start, initial_worker_status,
+      worker_start, response_start, initial_worker_status, start_situation,
       RESOURCE_TYPE_SUB_FRAME);
 
   ExpectNoNavPreloadMainFrameUMA(histogram_tester);
 }
 
+// The worker started up during browser startup.
+TEST(ServiceWorkerMetricsTest, NavigationPreloadResponse_BrowserStartup) {
+  base::TimeDelta worker_start = base::TimeDelta::FromMilliseconds(2345);
+  base::TimeDelta response_start = base::TimeDelta::FromMilliseconds(456);
+  EmbeddedWorkerStatus initial_worker_status = EmbeddedWorkerStatus::STOPPED;
+  StartSituation start_situation = StartSituation::DURING_STARTUP;
+  base::HistogramTester histogram_tester;
+  ServiceWorkerMetrics::RecordNavigationPreloadResponse(
+      worker_start, response_start, initial_worker_status, start_situation,
+      RESOURCE_TYPE_MAIN_FRAME);
+  histogram_tester.ExpectUniqueSample(
+      "ServiceWorker.NavPreload.WorkerPreparationType_MainFrame",
+      static_cast<int>(WorkerPreparationType::START_DURING_STARTUP), 1);
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/service_worker_url_request_job.cc b/content/browser/service_worker/service_worker_url_request_job.cc
index 5633043..01d4344 100644
--- a/content/browser/service_worker/service_worker_url_request_job.cc
+++ b/content/browser/service_worker/service_worker_url_request_job.cc
@@ -288,7 +288,8 @@
     ServiceWorkerMetrics::RecordNavigationPreloadResponse(
         owner_->worker_ready_time_ - owner_->worker_start_time_,
         navigation_preload_response_time_ - owner_->worker_start_time_,
-        owner_->initial_worker_status_, owner_->resource_type_);
+        owner_->initial_worker_status_, owner_->worker_start_situation_,
+        owner_->resource_type_);
     phase_ = Phase::RECORDED;
   }
 
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 306710a..1f755b4 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -11,10 +11,8 @@
 #include <string>
 
 #include "base/command_line.h"
-#include "base/debug/alias.h"
 #include "base/guid.h"
 #include "base/location.h"
-#include "base/macros.h"
 #include "base/memory/ref_counted.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/single_thread_task_runner.h"
@@ -23,16 +21,12 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/time/default_tick_clock.h"
-#include "base/time/time.h"
 #include "content/browser/bad_message.h"
 #include "content/browser/child_process_security_policy_impl.h"
-#include "content/browser/service_worker/embedded_worker_instance.h"
 #include "content/browser/service_worker/embedded_worker_registry.h"
-#include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/service_worker_client_utils.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
-#include "content/browser/service_worker/service_worker_metrics.h"
 #include "content/browser/service_worker/service_worker_registration.h"
 #include "content/common/origin_trials/trial_token_validator.h"
 #include "content/common/service_worker/embedded_worker_messages.h"
@@ -56,14 +50,21 @@
 
 namespace {
 
-// Time to wait until stopping an idle worker.
-const int kIdleWorkerTimeoutSeconds = 30;
+// Timeout for an installed worker to start.
+constexpr base::TimeDelta kStartInstalledWorkerTimeout =
+    base::TimeDelta::FromSeconds(60);
 
-// Default delay for scheduled update.
-const int kUpdateDelaySeconds = 1;
+// Timeout for a request to be handled.
+constexpr base::TimeDelta kRequestTimeout = base::TimeDelta::FromMinutes(5);
+
+// Time to wait until stopping an idle worker.
+constexpr base::TimeDelta kIdleWorkerTimeout = base::TimeDelta::FromSeconds(30);
 
 // Timeout for waiting for a response to a ping.
-const int kPingTimeoutSeconds = 30;
+constexpr base::TimeDelta kPingTimeout = base::TimeDelta::FromSeconds(30);
+
+// Default delay for scheduled update.
+constexpr base::TimeDelta kUpdateDelay = base::TimeDelta::FromSeconds(1);
 
 const char kClaimClientsStateErrorMesage[] =
     "Only the active worker can claim clients.";
@@ -202,11 +203,9 @@
 
 }  // namespace
 
-const int ServiceWorkerVersion::kTimeoutTimerDelaySeconds = 30;
-const int ServiceWorkerVersion::kStartInstalledWorkerTimeoutSeconds = 60;
-const int ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes = 5;
-const int ServiceWorkerVersion::kRequestTimeoutMinutes = 5;
-const int ServiceWorkerVersion::kStopWorkerTimeoutSeconds = 5;
+constexpr base::TimeDelta ServiceWorkerVersion::kTimeoutTimerDelay;
+constexpr base::TimeDelta ServiceWorkerVersion::kStartNewWorkerTimeout;
+constexpr base::TimeDelta ServiceWorkerVersion::kStopWorkerTimeout;
 
 void ServiceWorkerVersion::RestartTick(base::TimeTicks* time) const {
   *time = tick_clock_->NowTicks();
@@ -249,8 +248,7 @@
   // - OnPingTimeout() if the worker hasn't reponded within a certain period.
   // - PingWorker() if we're running ping timer and can send next ping.
   void CheckPingStatus() {
-    if (version_->GetTickDuration(ping_time_) >
-        base::TimeDelta::FromSeconds(kPingTimeoutSeconds)) {
+    if (version_->GetTickDuration(ping_time_) > kPingTimeout) {
       ping_state_ = PING_TIMED_OUT;
       version_->OnPingTimeout();
       return;
@@ -506,8 +504,7 @@
   // Protect |this| until the timer fires, since we may be stopping
   // and soon no one might hold a reference to us.
   context_->ProtectVersion(make_scoped_refptr(this));
-  update_timer_.Start(FROM_HERE,
-                      base::TimeDelta::FromSeconds(kUpdateDelaySeconds),
+  update_timer_.Start(FROM_HERE, kUpdateDelay,
                       base::Bind(&ServiceWorkerVersion::StartUpdate,
                                  weak_factory_.GetWeakPtr()));
 }
@@ -529,9 +526,8 @@
 int ServiceWorkerVersion::StartRequest(
     ServiceWorkerMetrics::EventType event_type,
     const StatusCallback& error_callback) {
-  return StartRequestWithCustomTimeout(
-      event_type, error_callback,
-      base::TimeDelta::FromMinutes(kRequestTimeoutMinutes), KILL_ON_TIMEOUT);
+  return StartRequestWithCustomTimeout(event_type, error_callback,
+                                       kRequestTimeout, KILL_ON_TIMEOUT);
 }
 
 int ServiceWorkerVersion::StartRequestWithCustomTimeout(
@@ -776,9 +772,7 @@
   }
 
   // Reactivate request timeouts, setting them all to the same expiration time.
-  SetAllRequestExpirations(
-      tick_clock_->NowTicks() +
-      base::TimeDelta::FromMinutes(kRequestTimeoutMinutes));
+  SetAllRequestExpirations(tick_clock_->NowTicks() + kRequestTimeout);
 }
 
 void ServiceWorkerVersion::SetMainScriptHttpResponseInfo(
@@ -877,8 +871,7 @@
   // Shorten the interval so stalling in stopped can be fixed quickly. Once the
   // worker stops, the timer is disabled. The interval will be reset to normal
   // when the worker starts up again.
-  SetTimeoutTimerInterval(
-      base::TimeDelta::FromSeconds(kStopWorkerTimeoutSeconds));
+  SetTimeoutTimerInterval(kStopWorkerTimeout);
   for (auto& observer : listeners_)
     observer.OnRunningStateChanged(this);
 }
@@ -1498,9 +1491,8 @@
   // Ping will be activated in OnScriptLoaded.
   ping_controller_->Deactivate();
 
-  timeout_timer_.Start(FROM_HERE,
-                       base::TimeDelta::FromSeconds(kTimeoutTimerDelaySeconds),
-                       this, &ServiceWorkerVersion::OnTimeoutTimer);
+  timeout_timer_.Start(FROM_HERE, kTimeoutTimerDelay, this,
+                       &ServiceWorkerVersion::OnTimeoutTimer);
 }
 
 void ServiceWorkerVersion::StopTimeoutTimer() {
@@ -1536,8 +1528,7 @@
   MarkIfStale();
 
   // Stopping the worker hasn't finished within a certain period.
-  if (GetTickDuration(stop_time_) >
-      base::TimeDelta::FromSeconds(kStopWorkerTimeoutSeconds)) {
+  if (GetTickDuration(stop_time_) > kStopWorkerTimeout) {
     DCHECK_EQ(EmbeddedWorkerStatus::STOPPING, running_status());
     if (IsInstalled(status())) {
       ServiceWorkerMetrics::RecordWorkerStopped(
@@ -1560,18 +1551,16 @@
 
   // Trigger update if worker is stale and we waited long enough for it to go
   // idle.
-  if (GetTickDuration(stale_time_) >
-      base::TimeDelta::FromMinutes(kRequestTimeoutMinutes)) {
+  if (GetTickDuration(stale_time_) > kRequestTimeout) {
     ClearTick(&stale_time_);
     if (!update_timer_.IsRunning())
       ScheduleUpdate();
   }
 
   // Starting a worker hasn't finished within a certain period.
-  const base::TimeDelta start_limit =
-      IsInstalled(status())
-          ? base::TimeDelta::FromSeconds(kStartInstalledWorkerTimeoutSeconds)
-          : base::TimeDelta::FromMinutes(kStartNewWorkerTimeoutMinutes);
+  const base::TimeDelta start_limit = IsInstalled(status())
+                                          ? kStartInstalledWorkerTimeout
+                                          : kStartNewWorkerTimeout;
   if (GetTickDuration(start_time_) > start_limit) {
     DCHECK(running_status() == EmbeddedWorkerStatus::STARTING ||
            running_status() == EmbeddedWorkerStatus::STOPPING)
@@ -1605,8 +1594,7 @@
     return;
 
   // The worker has been idle for longer than a certain period.
-  if (GetTickDuration(idle_time_) >
-      base::TimeDelta::FromSeconds(kIdleWorkerTimeoutSeconds)) {
+  if (GetTickDuration(idle_time_) > kIdleWorkerTimeout) {
     StopWorkerIfIdle();
     return;
   }
@@ -1762,8 +1750,7 @@
     return;
   base::TimeDelta time_since_last_check =
       base::Time::Now() - registration->last_update_check();
-  if (time_since_last_check >
-      base::TimeDelta::FromHours(kServiceWorkerScriptMaxCacheAgeInHours))
+  if (time_since_last_check > kServiceWorkerScriptMaxCacheAge)
     RestartTick(&stale_time_);
 }
 
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index 39130015..b02df70e 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -535,15 +535,14 @@
   };
 
   // The timeout timer interval.
-  static const int kTimeoutTimerDelaySeconds;
-  // Timeout for an installed worker to start.
-  static const int kStartInstalledWorkerTimeoutSeconds;
+  static constexpr base::TimeDelta kTimeoutTimerDelay =
+      base::TimeDelta::FromSeconds(30);
   // Timeout for a new worker to start.
-  static const int kStartNewWorkerTimeoutMinutes;
-  // Timeout for a request to be handled.
-  static const int kRequestTimeoutMinutes;
+  static constexpr base::TimeDelta kStartNewWorkerTimeout =
+      base::TimeDelta::FromMinutes(5);
   // Timeout for the worker to stop.
-  static const int kStopWorkerTimeoutSeconds;
+  static constexpr base::TimeDelta kStopWorkerTimeout =
+      base::TimeDelta::FromSeconds(5);
 
   ~ServiceWorkerVersion() override;
 
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc
index 3b074dd..925ba94 100644
--- a/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -767,10 +767,9 @@
 
   // Simulate it running for past the wait threshold. The update will be
   // scheduled.
-  version_->stale_time_ =
-      base::TimeTicks::Now() -
-      base::TimeDelta::FromMinutes(
-          ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1);
+  version_->stale_time_ = base::TimeTicks::Now() -
+                          ServiceWorkerVersion::kStartNewWorkerTimeout -
+                          base::TimeDelta::FromMinutes(1);
   version_->OnTimeoutTimer();
   EXPECT_TRUE(version_->stale_time_.is_null());
   EXPECT_TRUE(version_->update_timer_.IsRunning());
@@ -782,10 +781,9 @@
   version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
   registration_->SetActiveVersion(version_);
   registration_->set_last_update_check(GetYesterday());
-  base::TimeTicks stale_time =
-      base::TimeTicks::Now() -
-      base::TimeDelta::FromMinutes(
-          ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1);
+  base::TimeTicks stale_time = base::TimeTicks::Now() -
+                               ServiceWorkerVersion::kStartNewWorkerTimeout -
+                               base::TimeDelta::FromMinutes(1);
   version_->stale_time_ = stale_time;
 
   // Stale time is not deferred.
@@ -1134,10 +1132,9 @@
 
   // Simulate timeout.
   EXPECT_TRUE(version_->timeout_timer_.IsRunning());
-  version_->start_time_ =
-      base::TimeTicks::Now() -
-      base::TimeDelta::FromMinutes(
-          ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1);
+  version_->start_time_ = base::TimeTicks::Now() -
+                          ServiceWorkerVersion::kStartNewWorkerTimeout -
+                          base::TimeDelta::FromMinutes(1);
   version_->timeout_timer_.user_task().Run();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status);
@@ -1163,15 +1160,13 @@
 
   // Worker is now stalled in stopping. Verify a fast timeout is in place.
   EXPECT_TRUE(version_->timeout_timer_.IsRunning());
-  EXPECT_EQ(base::TimeDelta::FromSeconds(
-                ServiceWorkerVersion::kStopWorkerTimeoutSeconds),
+  EXPECT_EQ(ServiceWorkerVersion::kStopWorkerTimeout,
             version_->timeout_timer_.GetCurrentDelay());
 
   // Simulate timeout.
-  version_->stop_time_ =
-      base::TimeTicks::Now() -
-      base::TimeDelta::FromSeconds(
-          ServiceWorkerVersion::kStopWorkerTimeoutSeconds + 1);
+  version_->stop_time_ = base::TimeTicks::Now() -
+                         ServiceWorkerVersion::kStopWorkerTimeout -
+                         base::TimeDelta::FromSeconds(1);
   version_->timeout_timer_.user_task().Run();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(SERVICE_WORKER_OK, status);
@@ -1187,8 +1182,7 @@
 
   // The timeout interval should be reset to normal.
   EXPECT_TRUE(version_->timeout_timer_.IsRunning());
-  EXPECT_EQ(base::TimeDelta::FromSeconds(
-                ServiceWorkerVersion::kTimeoutTimerDelaySeconds),
+  EXPECT_EQ(ServiceWorkerVersion::kTimeoutTimerDelay,
             version_->timeout_timer_.GetCurrentDelay());
 }
 
@@ -1215,10 +1209,9 @@
 
   // Simulate timeout. The worker should stop and get restarted.
   EXPECT_TRUE(version_->timeout_timer_.IsRunning());
-  version_->stop_time_ =
-      base::TimeTicks::Now() -
-      base::TimeDelta::FromSeconds(
-          ServiceWorkerVersion::kStopWorkerTimeoutSeconds + 1);
+  version_->stop_time_ = base::TimeTicks::Now() -
+                         ServiceWorkerVersion::kStopWorkerTimeout -
+                         base::TimeDelta::FromSeconds(1);
   version_->timeout_timer_.user_task().Run();
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(SERVICE_WORKER_OK, status);
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc
index f1fc6813..753fd63f4 100644
--- a/content/child/resource_dispatcher.cc
+++ b/content/child/resource_dispatcher.cc
@@ -778,9 +778,18 @@
   // WebURLLoaderImpl::Context::OnReceivedResponse.
   client_ptr->OnReceiveResponse(ResourceResponseHead(), base::nullopt,
                                 mojom::DownloadedTempFilePtr());
+
+  // Abort if the request is cancelled.
+  if (!GetPendingRequestInfo(request_id))
+    return;
+
   // Start streaming now.
   client_ptr->OnStartLoadingResponseBody(std::move(consumer_handle));
 
+  // Abort if the request is cancelled.
+  if (!GetPendingRequestInfo(request_id))
+    return;
+
   // Call OnComplete now too, as it won't get called on the client.
   // TODO(kinuko): Fill this properly.
   ResourceRequestCompletionStatus completion_status;
diff --git a/content/common/service_worker/service_worker_types.h b/content/common/service_worker/service_worker_types.h
index ea22f5c3..a3f10c41 100644
--- a/content/common/service_worker/service_worker_types.h
+++ b/content/common/service_worker/service_worker_types.h
@@ -53,7 +53,8 @@
 
 // The HTTP cache is bypassed for Service Worker scripts if the last network
 // fetch occurred over 24 hours ago.
-static const int kServiceWorkerScriptMaxCacheAgeInHours = 24;
+static constexpr base::TimeDelta kServiceWorkerScriptMaxCacheAge =
+    base::TimeDelta::FromHours(24);
 
 // ServiceWorker provider type.
 enum ServiceWorkerProviderType {
diff --git a/content/public/browser/utility_process_mojo_client.h b/content/public/browser/utility_process_mojo_client.h
index c6ecfdf6..164c1dd3 100644
--- a/content/public/browser/utility_process_mojo_client.h
+++ b/content/public/browser/utility_process_mojo_client.h
@@ -66,7 +66,7 @@
 
   // Starts the utility process and connects to the remote Mojo service.
   void Start() {
-    DCHECK(thread_checker_.CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(error_callback_);
     DCHECK(!start_called_);
 
@@ -79,7 +79,7 @@
 
   // Returns the Mojo service used to make calls to the utility process.
   MojoInterface* service() WARN_UNUSED_RESULT {
-    DCHECK(thread_checker_.CalledOnValidThread());
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     DCHECK(start_called_);
 
     return service_.get();
@@ -174,7 +174,7 @@
   bool start_called_ = false;
 
   // Checks that this class is always accessed from the same thread.
-  base::ThreadChecker thread_checker_;
+  SEQUENCE_CHECKER(sequence_checker_);
 
   DISALLOW_COPY_AND_ASSIGN(UtilityProcessMojoClient);
 };
diff --git a/content/public/test/browser_test_base.cc b/content/public/test/browser_test_base.cc
index e956f2d..f4e1e08 100644
--- a/content/public/test/browser_test_base.cc
+++ b/content/public/test/browser_test_base.cc
@@ -41,6 +41,7 @@
 #include "ui/base/platform_window_defaults.h"
 #include "ui/base/test/material_design_controller_test_api.h"
 #include "ui/compositor/compositor_switches.h"
+#include "ui/gfx/color_space_switches.h"
 #include "ui/gl/gl_implementation.h"
 #include "ui/gl/gl_switches.h"
 
@@ -224,6 +225,10 @@
   if (use_software_gl && !use_software_compositing_)
     command_line->AppendSwitch(switches::kOverrideUseSoftwareGLForTests);
 
+  // Use an sRGB color profile to ensure that the machine's color profile does
+  // not affect the results.
+  command_line->AppendSwitchASCII(switches::kForceColorProfile, "srgb");
+
   test_host_resolver_ = base::MakeUnique<TestHostResolver>();
 
   ContentBrowserSanityChecker scoped_enable_sanity_checks;
@@ -238,6 +243,7 @@
     base::FeatureList::GetInstance()->GetFeatureOverrides(&enabled_features,
                                                           &disabled_features);
   }
+
   if (!enabled_features.empty()) {
     command_line->AppendSwitchASCII(switches::kEnableFeatures,
                                     enabled_features);
diff --git a/content/test/test_navigation_url_loader.cc b/content/test/test_navigation_url_loader.cc
index ee27c8a8..7ea49f2 100644
--- a/content/test/test_navigation_url_loader.cc
+++ b/content/test/test_navigation_url_loader.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "content/browser/loader/navigation_url_loader_delegate.h"
+#include "content/common/url_loader_factory.mojom.h"
 #include "content/public/browser/global_request_id.h"
 #include "content/public/browser/navigation_data.h"
 #include "content/public/browser/render_process_host.h"
@@ -71,7 +72,8 @@
   GlobalRequestID global_id(child_id, ++request_id);
   delegate_->OnResponseStarted(
       response, std::move(body), mojo::ScopedDataPipeConsumerHandle(),
-      SSLStatus(), std::move(navigation_data), global_id, false, false);
+      SSLStatus(), std::move(navigation_data), global_id, false, false,
+      mojom::URLLoaderFactoryPtrInfo());
 }
 
 TestNavigationURLLoader::~TestNavigationURLLoader() {}
diff --git a/content/test/test_navigation_url_loader_delegate.cc b/content/test/test_navigation_url_loader_delegate.cc
index 1d74335d..26ec48c 100644
--- a/content/test/test_navigation_url_loader_delegate.cc
+++ b/content/test/test_navigation_url_loader_delegate.cc
@@ -64,7 +64,8 @@
     std::unique_ptr<NavigationData> navigation_data,
     const GlobalRequestID& request_id,
     bool is_download,
-    bool is_stream) {
+    bool is_stream,
+    mojom::URLLoaderFactoryPtrInfo loader_factory_ptr_info) {
   response_ = response;
   body_ = std::move(body);
   handle_ = std::move(consumer_handle);
diff --git a/content/test/test_navigation_url_loader_delegate.h b/content/test/test_navigation_url_loader_delegate.h
index 1916f3f3..8289309 100644
--- a/content/test/test_navigation_url_loader_delegate.h
+++ b/content/test/test_navigation_url_loader_delegate.h
@@ -55,14 +55,16 @@
   void OnRequestRedirected(
       const net::RedirectInfo& redirect_info,
       const scoped_refptr<ResourceResponse>& response) override;
-  void OnResponseStarted(const scoped_refptr<ResourceResponse>& response,
-                         std::unique_ptr<StreamHandle> body,
-                         mojo::ScopedDataPipeConsumerHandle consumer_handle,
-                         const SSLStatus& ssl_status,
-                         std::unique_ptr<NavigationData> navigation_data,
-                         const GlobalRequestID& request_id,
-                         bool is_download,
-                         bool is_stream) override;
+  void OnResponseStarted(
+      const scoped_refptr<ResourceResponse>& response,
+      std::unique_ptr<StreamHandle> body,
+      mojo::ScopedDataPipeConsumerHandle consumer_handle,
+      const SSLStatus& ssl_status,
+      std::unique_ptr<NavigationData> navigation_data,
+      const GlobalRequestID& request_id,
+      bool is_download,
+      bool is_stream,
+      mojom::URLLoaderFactoryPtrInfo loader_factory_ptr_info) override;
   void OnRequestFailed(bool in_cache, int net_error) override;
   void OnRequestStarted(base::TimeTicks timestamp) override;
 
diff --git a/ios/chrome/browser/web/progress_indicator_egtest.mm b/ios/chrome/browser/web/progress_indicator_egtest.mm
index 54c735ca..93beaf4e 100644
--- a/ios/chrome/browser/web/progress_indicator_egtest.mm
+++ b/ios/chrome/browser/web/progress_indicator_egtest.mm
@@ -163,7 +163,8 @@
 
 // Tests that the progress indicator is shown and has expected progress value
 // after a form is submitted, and the toolbar is visible.
-- (void)testProgressIndicatorShownOnFormSubmit {
+// TODO(crbug.com/734874): Reenable test when fixed.
+- (void)DISABLED_testProgressIndicatorShownOnFormSubmit {
   if (IsIPadIdiom()) {
     EARL_GREY_TEST_SKIPPED(@"Skipped for iPad (no progress view in tablet)");
   }
diff --git a/mojo/public/cpp/bindings/lib/message.cc b/mojo/public/cpp/bindings/lib/message.cc
index 36c6b86a..98f65439 100644
--- a/mojo/public/cpp/bindings/lib/message.cc
+++ b/mojo/public/cpp/bindings/lib/message.cc
@@ -41,10 +41,10 @@
 
 // An internal serialization context used to initialize new serialized messages.
 struct MessageInfo {
-  MessageInfo(size_t total_size, std::vector<ScopedHandle> handles)
-      : total_size(total_size), handles(std::move(handles)) {}
+  MessageInfo(size_t total_size, std::vector<ScopedHandle>* handles)
+      : total_size(total_size), handles(handles) {}
   const size_t total_size;
-  std::vector<ScopedHandle> handles;
+  std::vector<ScopedHandle>* handles;
   internal::Buffer payload_buffer;
 };
 
@@ -53,13 +53,14 @@
                                       size_t* num_handles) {
   auto* info = reinterpret_cast<MessageInfo*>(context);
   *num_bytes = info->total_size;
-  *num_handles = info->handles.size();
+  *num_handles = info->handles ? info->handles->size() : 0;
 }
 
 void SerializeHandlesFromMessageInfo(uintptr_t context, MojoHandle* handles) {
   auto* info = reinterpret_cast<MessageInfo*>(context);
-  for (size_t i = 0; i < info->handles.size(); ++i)
-    handles[i] = info->handles[i].release().value();
+  DCHECK(info->handles);
+  for (size_t i = 0; i < info->handles->size(); ++i)
+    handles[i] = info->handles->at(i).release().value();
 }
 
 void SerializePayloadFromMessageInfo(uintptr_t context, void* storage) {
@@ -141,13 +142,13 @@
                                    uint32_t flags,
                                    size_t payload_size,
                                    size_t payload_interface_id_count,
-                                   std::vector<ScopedHandle> handles,
+                                   std::vector<ScopedHandle>* handles,
                                    ScopedMessageHandle* out_handle,
                                    internal::Buffer* out_buffer) {
   internal::Buffer buffer;
   MessageInfo info(
       ComputeTotalSize(flags, payload_size, payload_interface_id_count),
-      std::move(handles));
+      handles);
   ScopedMessageHandle handle;
   MojoResult rv = mojo::CreateMessage(reinterpret_cast<uintptr_t>(&info),
                                       &kMessageInfoThunks, &handle);
@@ -180,11 +181,10 @@
 Message::Message(uint32_t name,
                  uint32_t flags,
                  size_t payload_size,
-                 size_t payload_interface_id_count,
-                 std::vector<ScopedHandle> handles) {
+                 size_t payload_interface_id_count) {
   CreateSerializedMessageObject(name, flags, payload_size,
-                                payload_interface_id_count, std::move(handles),
-                                &handle_, &payload_buffer_);
+                                payload_interface_id_count, nullptr, &handle_,
+                                &payload_buffer_);
   data_ = payload_buffer_.data();
   data_size_ = payload_buffer_.size();
   transferable_ = true;
@@ -274,8 +274,9 @@
   return array_pointer ? array_pointer->storage() : nullptr;
 }
 
-void Message::AttachHandles(std::vector<ScopedHandle> handles) {
-  if (handles.empty())
+void Message::AttachHandles(std::vector<ScopedHandle>* handles) {
+  DCHECK(handles);
+  if (handles->empty())
     return;
 
   // Sanity-check the current serialized message state. We must have a valid
@@ -290,7 +291,7 @@
       MOJO_GET_SERIALIZED_MESSAGE_CONTENTS_FLAG_NONE);
   DCHECK_EQ(MOJO_RESULT_OK, rv);
 
-  MessageInfo new_info(data_size_, std::move(handles));
+  MessageInfo new_info(data_size_, handles);
   ScopedMessageHandle new_handle;
   rv = mojo::CreateMessage(reinterpret_cast<uintptr_t>(&new_info),
                            &kMessageInfoThunks, &new_handle);
@@ -380,7 +381,9 @@
 
 PassThroughFilter::~PassThroughFilter() {}
 
-bool PassThroughFilter::Accept(Message* message) { return true; }
+bool PassThroughFilter::Accept(Message* message) {
+  return true;
+}
 
 SyncMessageResponseContext::SyncMessageResponseContext()
     : outer_context_(current()) {
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.cc b/mojo/public/cpp/bindings/lib/serialization_context.cc
index d17e3349..8e4d86b 100644
--- a/mojo/public/cpp/bindings/lib/serialization_context.cc
+++ b/mojo/public/cpp/bindings/lib/serialization_context.cc
@@ -7,6 +7,7 @@
 #include <limits>
 
 #include "base/logging.h"
+#include "mojo/public/cpp/bindings/message.h"
 #include "mojo/public/cpp/system/core.h"
 
 namespace mojo {
@@ -46,5 +47,11 @@
   DCHECK(!custom_contexts || custom_contexts->empty());
 }
 
+void SerializationContext::AttachHandlesToMessage(Message* message) {
+  associated_endpoint_handles.swap(
+      *message->mutable_associated_endpoint_handles());
+  message->AttachHandles(handles.mutable_handles());
+}
+
 }  // namespace internal
 }  // namespace mojo
diff --git a/mojo/public/cpp/bindings/lib/serialization_context.h b/mojo/public/cpp/bindings/lib/serialization_context.h
index 2d0d4b4a..6a6e5142 100644
--- a/mojo/public/cpp/bindings/lib/serialization_context.h
+++ b/mojo/public/cpp/bindings/lib/serialization_context.h
@@ -18,6 +18,9 @@
 #include "mojo/public/cpp/system/handle.h"
 
 namespace mojo {
+
+class Message;
+
 namespace internal {
 
 // A container for handles during serialization/deserialization.
@@ -27,6 +30,7 @@
   ~SerializedHandleVector();
 
   size_t size() const { return handles_.size(); }
+  std::vector<mojo::ScopedHandle>* mutable_handles() { return &handles_; }
 
   // Adds a handle to the handle list and returns its index for encoding.
   Handle_Data AddHandle(mojo::ScopedHandle handle);
@@ -57,6 +61,10 @@
 
   ~SerializationContext();
 
+  // Transfers ownership of any accumulated handles and associated endpoint
+  // handles into |*message|.
+  void AttachHandlesToMessage(Message* message);
+
   // Opaque context pointers returned by StringTraits::SetUpContext().
   std::unique_ptr<std::queue<void*>> custom_contexts;
 
diff --git a/mojo/public/cpp/bindings/message.h b/mojo/public/cpp/bindings/message.h
index 07d0a7c..9fabda4 100644
--- a/mojo/public/cpp/bindings/message.h
+++ b/mojo/public/cpp/bindings/message.h
@@ -51,8 +51,7 @@
   Message(uint32_t name,
           uint32_t flags,
           size_t payload_size,
-          size_t payload_interface_id_count,
-          std::vector<ScopedHandle> handles = std::vector<ScopedHandle>());
+          size_t payload_interface_id_count);
 
   // Constructs a new serialized Message object from an existing
   // ScopedMessageHandle; e.g., one read from a message pipe.
@@ -151,8 +150,8 @@
 
   // Attaches handles to this Message. Note that this requires the underlying
   // message object to be reallocated and the payload to be copied into a new
-  // buffer.
-  void AttachHandles(std::vector<ScopedHandle> handles);
+  // buffer. Takes ownership of the contents of |*handles|.
+  void AttachHandles(std::vector<ScopedHandle>* handles);
 
   // Takes a scoped MessageHandle which may be passed to |WriteMessageNew()| for
   // transmission. Note that this invalidates this Message object, taking
diff --git a/mojo/public/cpp/bindings/tests/connector_unittest.cc b/mojo/public/cpp/bindings/tests/connector_unittest.cc
index 63fc1efa..3f5b8f44 100644
--- a/mojo/public/cpp/bindings/tests/connector_unittest.cc
+++ b/mojo/public/cpp/bindings/tests/connector_unittest.cc
@@ -103,7 +103,7 @@
     const size_t size = strlen(text) + 1;  // Plus null terminator.
     Message message(1, 0, size, 0);
     memcpy(message.payload_buffer()->Allocate(size), text, size);
-    message.AttachHandles(std::move(handles));
+    message.AttachHandles(&handles);
     return message;
   }
 
diff --git a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
index 1aaba401..fcf1596 100644
--- a/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
+++ b/mojo/public/tools/bindings/generators/cpp_templates/interface_definition.tmpl
@@ -35,13 +35,9 @@
 {%- macro build_message(struct, input_pattern, struct_display_name,
                         serialization_context, message) -%}
   {{struct_macros.serialize(struct, struct_display_name, input_pattern,
-                            "params", "%s.payload_buffer()"|format(message),
+                            "params", "(%s)->payload_buffer()"|format(message),
                             serialization_context)}}
-  ({{serialization_context}})->associated_endpoint_handles.swap(
-      *{{message}}.mutable_associated_endpoint_handles());
-  std::vector<mojo::ScopedHandle> handles_to_attach;
-  ({{serialization_context}})->handles.Swap(&handles_to_attach);
-  {{message}}.AttachHandles(std::move(handles_to_attach));
+  ({{serialization_context}})->AttachHandlesToMessage({{message}});
 {%- endmacro %}
 
 {#--- Begin #}
@@ -167,7 +163,7 @@
       mojo::Message::kFlagIsSync | mojo::Message::kFlagExpectsResponse,
       size, serialization_context.associated_endpoint_count);
   {{build_message(params_struct, "param_%s", params_description,
-                  "&serialization_context", "message")}}
+                  "&serialization_context", "&message")}}
 
   bool result = false;
   std::unique_ptr<mojo::MessageReceiver> responder(
@@ -194,7 +190,7 @@
   mojo::Message message({{message_name}}, kFlags, size,
                         serialization_context.associated_endpoint_count);
   {{build_message(params_struct, "in_%s", params_description,
-                  "&serialization_context", "message")}}
+                  "&serialization_context", "&message")}}
 
 {%- if method.response_parameters != None %}
   std::unique_ptr<mojo::MessageReceiver> responder(
@@ -276,7 +272,7 @@
   mojo::Message message({{message_name}}, flags, size,
                         serialization_context.associated_endpoint_count);
   {{build_message(response_params_struct, "in_%s", params_description,
-                  "&serialization_context", "message")}}
+                  "&serialization_context", "&message")}}
   message.set_request_id(request_id_);
   ignore_result(responder_->Accept(&message));
   // TODO(darin): Accept() returning false indicates a malformed message, and
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 4ba004e6..325b891 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -1185,8 +1185,6 @@
       "quic/core/crypto/curve25519_key_exchange.h",
       "quic/core/crypto/ephemeral_key_source.h",
       "quic/core/crypto/key_exchange.h",
-      "quic/core/crypto/local_strike_register_client.cc",
-      "quic/core/crypto/local_strike_register_client.h",
       "quic/core/crypto/null_decrypter.cc",
       "quic/core/crypto/null_decrypter.h",
       "quic/core/crypto/null_encrypter.cc",
@@ -1212,9 +1210,6 @@
       "quic/core/crypto/quic_random.h",
       "quic/core/crypto/scoped_evp_aead_ctx.cc",
       "quic/core/crypto/scoped_evp_aead_ctx.h",
-      "quic/core/crypto/strike_register.cc",
-      "quic/core/crypto/strike_register.h",
-      "quic/core/crypto/strike_register_client.h",
       "quic/core/frames/quic_ack_frame.cc",
       "quic/core/frames/quic_ack_frame.h",
       "quic/core/frames/quic_blocked_frame.cc",
@@ -3045,8 +3040,6 @@
     "quic/platform/impl/quic_test_loopback_impl.h",
     "quic/test_tools/crypto_test_utils.cc",
     "quic/test_tools/crypto_test_utils.h",
-    "quic/test_tools/delayed_verify_strike_register_client.cc",
-    "quic/test_tools/delayed_verify_strike_register_client.h",
     "quic/test_tools/failing_proof_source.cc",
     "quic/test_tools/failing_proof_source.h",
     "quic/test_tools/fake_proof_source.cc",
@@ -4873,7 +4866,6 @@
     "quic/core/crypto/crypto_server_test.cc",
     "quic/core/crypto/crypto_utils_test.cc",
     "quic/core/crypto/curve25519_key_exchange_test.cc",
-    "quic/core/crypto/local_strike_register_client_test.cc",
     "quic/core/crypto/null_decrypter_test.cc",
     "quic/core/crypto/null_encrypter_test.cc",
     "quic/core/crypto/p256_key_exchange_test.cc",
@@ -4881,7 +4873,6 @@
     "quic/core/crypto/quic_crypto_client_config_test.cc",
     "quic/core/crypto/quic_crypto_server_config_test.cc",
     "quic/core/crypto/quic_random_test.cc",
-    "quic/core/crypto/strike_register_test.cc",
     "quic/core/frames/quic_frames_test.cc",
     "quic/core/packet_number_indexed_queue_test.cc",
     "quic/core/quic_alarm_test.cc",
diff --git a/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc b/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc
index ea69e90..d3e4d1e5 100644
--- a/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/chromium/bidirectional_stream_quic_impl_unittest.cc
@@ -407,7 +407,7 @@
                       kDefaultServerHostName,
                       Perspective::IS_CLIENT),
         server_maker_(GetParam(),
-                      GetPeerInMemoryConnectionId(connection_id_),
+                      connection_id_,
                       &clock_,
                       kDefaultServerHostName,
                       Perspective::IS_SERVER),
diff --git a/net/quic/chromium/quic_http_stream_test.cc b/net/quic/chromium/quic_http_stream_test.cc
index 9e48dc9b..5af59cc 100644
--- a/net/quic/chromium/quic_http_stream_test.cc
+++ b/net/quic/chromium/quic_http_stream_test.cc
@@ -193,7 +193,7 @@
                       kDefaultServerHostName,
                       Perspective::IS_CLIENT),
         server_maker_(GetParam(),
-                      GetPeerInMemoryConnectionId(connection_id_),
+                      connection_id_,
                       &clock_,
                       kDefaultServerHostName,
                       Perspective::IS_SERVER),
diff --git a/net/quic/core/congestion_control/bbr_sender.cc b/net/quic/core/congestion_control/bbr_sender.cc
index 0d40c3f..fb02690 100644
--- a/net/quic/core/congestion_control/bbr_sender.cc
+++ b/net/quic/core/congestion_control/bbr_sender.cc
@@ -555,26 +555,8 @@
       // Exit recovery if appropriate.
       if (!has_losses && last_acked_packet > end_recovery_at_) {
         recovery_state_ = NOT_IN_RECOVERY;
-        return;
       }
 
-      if (!FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation) {
-        return;
-      }
-
-      // Use "single round in conservation" approach outside of PROBE_BW.
-      if (mode_ != PROBE_BW) {
-        return;
-      }
-
-      // Switch between conservation and growth depending on position in the
-      // gain cycle.
-      if (cycle_current_offset_ == 0 ||
-          cycle_current_offset_ == kGainCycleLength - 1) {
-        recovery_state_ = GROWTH;
-      } else {
-        recovery_state_ = CONSERVATION;
-      }
       break;
   }
 }
diff --git a/net/quic/core/congestion_control/bbr_sender_test.cc b/net/quic/core/congestion_control/bbr_sender_test.cc
index cad6186c..770169f 100644
--- a/net/quic/core/congestion_control/bbr_sender_test.cc
+++ b/net/quic/core/congestion_control/bbr_sender_test.cc
@@ -82,19 +82,18 @@
                   "Receiver",
                   "BBR sender",
                   Perspective::IS_SERVER,
-                  /*connection_id=*/GetPeerInMemoryConnectionId(42)),
+                  /*connection_id=*/42),
         competing_receiver_(&simulator_,
                             "Competing receiver",
                             "Competing sender",
                             Perspective::IS_SERVER,
-                            /*connection_id=*/GetPeerInMemoryConnectionId(43)),
+                            /*connection_id=*/43),
         receiver_multiplexer_("Receiver multiplexer",
                               {&receiver_, &competing_receiver_}) {
     // These will be changed by the appropriate tests as necessary.
     FLAGS_quic_reloadable_flag_quic_bbr_slow_recent_delivery = false;
     FLAGS_quic_reloadable_flag_quic_bbr_add_tso_cwnd = false;
 
-    FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation = true;
     FLAGS_quic_reloadable_flag_quic_bbr_fix_conservation2 = true;
 
     rtt_stats_ = bbr_sender_.connection()->sent_packet_manager().GetRttStats();
@@ -443,13 +442,8 @@
       timeout);
 
   ASSERT_EQ(BbrSender::PROBE_BW, sender_->ExportDebugState().mode);
-  if (FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation) {
-    ASSERT_EQ(BbrSender::CONSERVATION,
-              sender_->ExportDebugState().recovery_state);
-  } else {
-    ASSERT_EQ(BbrSender::NOT_IN_RECOVERY,
-              sender_->ExportDebugState().recovery_state);
-  }
+  ASSERT_EQ(BbrSender::NOT_IN_RECOVERY,
+            sender_->ExportDebugState().recovery_state);
   ASSERT_TRUE(simulator_result);
 }
 
diff --git a/net/quic/core/congestion_control/send_algorithm_interface.cc b/net/quic/core/congestion_control/send_algorithm_interface.cc
index 385d46ed..c0d3bb5 100644
--- a/net/quic/core/congestion_control/send_algorithm_interface.cc
+++ b/net/quic/core/congestion_control/send_algorithm_interface.cc
@@ -29,13 +29,9 @@
   QuicPacketCount max_congestion_window = kDefaultMaxCongestionWindowPackets;
   switch (congestion_control_type) {
     case kBBR:
-      if (FLAGS_quic_reloadable_flag_quic_allow_new_bbr) {
-        return new BbrSender(rtt_stats, unacked_packets,
-                             initial_congestion_window, max_congestion_window,
-                             random);
-      }
-    // Fall back to CUBIC if BBR is disabled.
-    // FALLTHROUGH_INTENDED
+      return new BbrSender(rtt_stats, unacked_packets,
+                           initial_congestion_window, max_congestion_window,
+                           random);
     case kPCC:
       if (FLAGS_quic_reloadable_flag_quic_enable_pcc) {
         QUIC_FLAG_COUNT(quic_reloadable_flag_quic_enable_pcc);
diff --git a/net/quic/core/congestion_control/send_algorithm_test.cc b/net/quic/core/congestion_control/send_algorithm_test.cc
index 166cad36..4eff9d9ff 100644
--- a/net/quic/core/congestion_control/send_algorithm_test.cc
+++ b/net/quic/core/congestion_control/send_algorithm_test.cc
@@ -193,7 +193,7 @@
                   "Receiver",
                   "QUIC sender",
                   Perspective::IS_SERVER,
-                  net::test::GetPeerInMemoryConnectionId(42)) {
+                  42) {
     FLAGS_quic_reloadable_flag_quic_fix_cubic_convex_mode = true;
     FLAGS_quic_reloadable_flag_quic_fix_cubic_bytes_quantization = true;
     FLAGS_quic_reloadable_flag_quic_fix_beta_last_max = true;
diff --git a/net/quic/core/crypto/crypto_handshake_message.cc b/net/quic/core/crypto/crypto_handshake_message.cc
index 0d0813a..d5dee25 100644
--- a/net/quic/core/crypto/crypto_handshake_message.cc
+++ b/net/quic/core/crypto/crypto_handshake_message.cc
@@ -251,9 +251,7 @@
         if (it->second.size() == 8) {
           uint64_t value;
           memcpy(&value, it->second.data(), sizeof(value));
-          if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)) {
-            value = QuicEndian::NetToHost64(value);
-          }
+          value = QuicEndian::NetToHost64(value);
           ret += QuicTextUtils::Uint64ToString(value);
           done = true;
         }
diff --git a/net/quic/core/crypto/crypto_server_test.cc b/net/quic/core/crypto/crypto_server_test.cc
index 1ca1e1e..1da1384dc 100644
--- a/net/quic/core/crypto/crypto_server_test.cc
+++ b/net/quic/core/crypto/crypto_server_test.cc
@@ -24,7 +24,6 @@
 #include "net/quic/platform/api/quic_test.h"
 #include "net/quic/platform/api/quic_text_utils.h"
 #include "net/quic/test_tools/crypto_test_utils.h"
-#include "net/quic/test_tools/delayed_verify_strike_register_client.h"
 #include "net/quic/test_tools/failing_proof_source.h"
 #include "net/quic/test_tools/mock_clock.h"
 #include "net/quic/test_tools/mock_random.h"
@@ -361,11 +360,8 @@
     } else {
       ASSERT_EQ(QUIC_NO_ERROR,
                 out_.GetUint64(kRCID, &server_designated_connection_id));
-      if (QuicUtils::IsConnectionIdWireFormatBigEndian(
-              Perspective::IS_SERVER)) {
-        server_designated_connection_id =
-            QuicEndian::NetToHost64(server_designated_connection_id);
-      }
+      server_designated_connection_id =
+          QuicEndian::NetToHost64(server_designated_connection_id);
       EXPECT_EQ(rand_for_id_generation_.RandUint64(),
                 server_designated_connection_id);
     }
diff --git a/net/quic/core/crypto/local_strike_register_client.cc b/net/quic/core/crypto/local_strike_register_client.cc
deleted file mode 100644
index d0467f9..0000000
--- a/net/quic/core/crypto/local_strike_register_client.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 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.
-
-#include "net/quic/core/crypto/local_strike_register_client.h"
-
-#include "net/quic/core/crypto/crypto_protocol.h"
-
-using std::string;
-
-namespace net {
-
-LocalStrikeRegisterClient::LocalStrikeRegisterClient(
-    unsigned max_entries,
-    uint32_t current_time_external,
-    uint32_t window_secs,
-    const uint8_t orbit[8],
-    StrikeRegister::StartupType startup)
-    : strike_register_(max_entries,
-                       current_time_external,
-                       window_secs,
-                       orbit,
-                       startup) {}
-
-bool LocalStrikeRegisterClient::IsKnownOrbit(QuicStringPiece orbit) const {
-  QuicWriterMutexLock lock(&m_);
-  if (orbit.length() != kOrbitSize) {
-    return false;
-  }
-  return memcmp(orbit.data(), strike_register_.orbit(), kOrbitSize) == 0;
-}
-
-void LocalStrikeRegisterClient::VerifyNonceIsValidAndUnique(
-    QuicStringPiece nonce,
-    QuicWallTime now,
-    ResultCallback* cb) {
-  InsertStatus nonce_error;
-  if (nonce.length() != kNonceSize) {
-    nonce_error = NONCE_INVALID_FAILURE;
-  } else {
-    QuicWriterMutexLock lock(&m_);
-    nonce_error =
-        strike_register_.Insert(reinterpret_cast<const uint8_t*>(nonce.data()),
-                                static_cast<uint32_t>(now.ToUNIXSeconds()));
-  }
-
-  // m_ must not be held when the ResultCallback runs.
-  cb->Run((nonce_error == NONCE_OK), nonce_error);
-}
-
-}  // namespace net
diff --git a/net/quic/core/crypto/local_strike_register_client.h b/net/quic/core/crypto/local_strike_register_client.h
deleted file mode 100644
index 315c415..0000000
--- a/net/quic/core/crypto/local_strike_register_client.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2013 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 NET_QUIC_CORE_CRYPTO_LOCAL_STRIKE_REGISTER_CLIENT_H_
-#define NET_QUIC_CORE_CRYPTO_LOCAL_STRIKE_REGISTER_CLIENT_H_
-
-#include <cstdint>
-
-#include "base/macros.h"
-#include "net/quic/core/crypto/strike_register.h"
-#include "net/quic/core/crypto/strike_register_client.h"
-#include "net/quic/core/quic_time.h"
-#include "net/quic/platform/api/quic_export.h"
-#include "net/quic/platform/api/quic_mutex.h"
-#include "net/quic/platform/api/quic_string_piece.h"
-
-namespace net {
-
-// StrikeRegisterClient implementation that wraps a local in-memory
-// strike register.
-class QUIC_EXPORT_PRIVATE LocalStrikeRegisterClient
-    : public StrikeRegisterClient {
- public:
-  LocalStrikeRegisterClient(unsigned max_entries,
-                            uint32_t current_time_external,
-                            uint32_t window_secs,
-                            const uint8_t orbit[8],
-                            StrikeRegister::StartupType startup);
-
-  bool IsKnownOrbit(QuicStringPiece orbit) const override;
-  void VerifyNonceIsValidAndUnique(QuicStringPiece nonce,
-                                   QuicWallTime now,
-                                   ResultCallback* cb) override;
-
- private:
-  mutable QuicMutex m_;
-  StrikeRegister strike_register_ GUARDED_BY(m_);
-
-  DISALLOW_COPY_AND_ASSIGN(LocalStrikeRegisterClient);
-};
-
-}  // namespace net
-
-#endif  // NET_QUIC_CORE_CRYPTO_LOCAL_STRIKE_REGISTER_CLIENT_H_
diff --git a/net/quic/core/crypto/local_strike_register_client_test.cc b/net/quic/core/crypto/local_strike_register_client_test.cc
deleted file mode 100644
index 79fa94f..0000000
--- a/net/quic/core/crypto/local_strike_register_client_test.cc
+++ /dev/null
@@ -1,133 +0,0 @@
-// Copyright 2013 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.
-
-#include "net/quic/core/crypto/local_strike_register_client.h"
-
-#include <memory>
-
-#include "base/macros.h"
-#include "base/sys_byteorder.h"
-#include "net/quic/core/crypto/crypto_protocol.h"
-#include "net/quic/core/quic_time.h"
-#include "net/quic/platform/api/quic_str_cat.h"
-#include "net/quic/platform/api/quic_test.h"
-
-using std::string;
-
-namespace net {
-namespace test {
-namespace {
-
-class RecordResultCallback : public StrikeRegisterClient::ResultCallback {
- public:
-  // RecordResultCallback stores the argument to RunImpl in
-  // |*saved_value| and sets |*called| to true.  The callback is self
-  // deleting.
-  RecordResultCallback(bool* called,
-                       bool* saved_value,
-                       InsertStatus* saved_nonce_error)
-      : called_(called),
-        saved_value_(saved_value),
-        saved_nonce_error_(saved_nonce_error) {
-    *called_ = false;
-  }
-
- protected:
-  void RunImpl(bool nonce_is_valid_and_unique,
-               InsertStatus nonce_error) override {
-    *called_ = true;
-    *saved_value_ = nonce_is_valid_and_unique;
-    *saved_nonce_error_ = nonce_error;
-  }
-
- private:
-  bool* called_;
-  bool* saved_value_;
-  InsertStatus* saved_nonce_error_;
-
-  DISALLOW_COPY_AND_ASSIGN(RecordResultCallback);
-};
-
-const uint8_t kOrbit[] = "\x12\x34\x56\x78\x9A\xBC\xDE\xF0";
-const uint32_t kCurrentTimeExternalSecs = 12345678;
-size_t kMaxEntries = 100;
-uint32_t kWindowSecs = 60;
-
-class LocalStrikeRegisterClientTest : public QuicTest {
- protected:
-  LocalStrikeRegisterClientTest() {}
-
-  void SetUp() override {
-    strike_register_.reset(new LocalStrikeRegisterClient(
-        kMaxEntries, kCurrentTimeExternalSecs, kWindowSecs, kOrbit,
-        StrikeRegister::NO_STARTUP_PERIOD_NEEDED));
-  }
-
-  std::unique_ptr<LocalStrikeRegisterClient> strike_register_;
-};
-
-TEST_F(LocalStrikeRegisterClientTest, CheckOrbit) {
-  EXPECT_TRUE(strike_register_->IsKnownOrbit(
-      QuicStringPiece(reinterpret_cast<const char*>(kOrbit), kOrbitSize)));
-  EXPECT_FALSE(strike_register_->IsKnownOrbit(
-      QuicStringPiece(reinterpret_cast<const char*>(kOrbit), kOrbitSize - 1)));
-  EXPECT_FALSE(strike_register_->IsKnownOrbit(
-      QuicStringPiece(reinterpret_cast<const char*>(kOrbit), kOrbitSize + 1)));
-  EXPECT_FALSE(strike_register_->IsKnownOrbit(
-      QuicStringPiece(reinterpret_cast<const char*>(kOrbit) + 1, kOrbitSize)));
-}
-
-TEST_F(LocalStrikeRegisterClientTest, IncorrectNonceLength) {
-  string valid_nonce;
-  uint32_t norder = base::HostToNet32(kCurrentTimeExternalSecs);
-  valid_nonce.assign(reinterpret_cast<const char*>(&norder), sizeof(norder));
-  valid_nonce = QuicStrCat(
-      valid_nonce, string(reinterpret_cast<const char*>(kOrbit), kOrbitSize),
-      string(20, '\x17'));  // 20 'random' bytes.
-
-  {
-    // Validation fails if you remove a byte from the nonce.
-    bool called = false;
-    bool is_valid = false;
-    InsertStatus nonce_error = NONCE_UNKNOWN_FAILURE;
-    string short_nonce = valid_nonce.substr(0, valid_nonce.length() - 1);
-    strike_register_->VerifyNonceIsValidAndUnique(
-        short_nonce, QuicWallTime::FromUNIXSeconds(kCurrentTimeExternalSecs),
-        new RecordResultCallback(&called, &is_valid, &nonce_error));
-    EXPECT_TRUE(called);
-    EXPECT_FALSE(is_valid);
-    EXPECT_EQ(NONCE_INVALID_FAILURE, nonce_error);
-  }
-
-  {
-    // Validation fails if you add a byte to the nonce.
-    bool called = false;
-    bool is_valid = false;
-    InsertStatus nonce_error = NONCE_UNKNOWN_FAILURE;
-    string long_nonce = QuicStrCat(valid_nonce, "a");
-    strike_register_->VerifyNonceIsValidAndUnique(
-        long_nonce, QuicWallTime::FromUNIXSeconds(kCurrentTimeExternalSecs),
-        new RecordResultCallback(&called, &is_valid, &nonce_error));
-    EXPECT_TRUE(called);
-    EXPECT_FALSE(is_valid);
-    EXPECT_EQ(NONCE_INVALID_FAILURE, nonce_error);
-  }
-
-  {
-    // Verify that the base nonce validates was valid.
-    bool called = false;
-    bool is_valid = false;
-    InsertStatus nonce_error = NONCE_UNKNOWN_FAILURE;
-    strike_register_->VerifyNonceIsValidAndUnique(
-        valid_nonce, QuicWallTime::FromUNIXSeconds(kCurrentTimeExternalSecs),
-        new RecordResultCallback(&called, &is_valid, &nonce_error));
-    EXPECT_TRUE(called);
-    EXPECT_TRUE(is_valid);
-    EXPECT_EQ(NONCE_OK, nonce_error);
-  }
-}
-
-}  // namespace
-}  // namespace test
-}  // namespace net
diff --git a/net/quic/core/crypto/quic_crypto_client_config.cc b/net/quic/core/crypto/quic_crypto_client_config.cc
index 460a618..8317145 100644
--- a/net/quic/core/crypto/quic_crypto_client_config.cc
+++ b/net/quic/core/crypto/quic_crypto_client_config.cc
@@ -507,9 +507,7 @@
     CryptoHandshakeMessage* out,
     string* error_details) const {
   DCHECK(error_details != nullptr);
-  if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_CLIENT)) {
-    connection_id = QuicEndian::HostToNet64(connection_id);
-  }
+  connection_id = QuicEndian::HostToNet64(connection_id);
 
   FillInchoateClientHello(server_id, preferred_version, cached, rand,
                           /* demand_x509_proof= */ true, out_params, out);
@@ -825,9 +823,7 @@
       *error_details = "Missing kRCID";
       return QUIC_CRYPTO_MESSAGE_PARAMETER_NOT_FOUND;
     }
-    if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_CLIENT)) {
-      connection_id = QuicEndian::NetToHost64(connection_id);
-    }
+    connection_id = QuicEndian::NetToHost64(connection_id);
     cached->add_server_designated_connection_id(connection_id);
     if (!nonce.empty()) {
       cached->add_server_nonce(nonce.as_string());
diff --git a/net/quic/core/crypto/quic_crypto_client_config_test.cc b/net/quic/core/crypto/quic_crypto_client_config_test.cc
index 7ab73aa..a9490e13 100644
--- a/net/quic/core/crypto/quic_crypto_client_config_test.cc
+++ b/net/quic/core/crypto/quic_crypto_client_config_test.cc
@@ -538,9 +538,7 @@
                                     AllSupportedVersions().front(), "", &cached,
                                     out_params, &error));
   EXPECT_TRUE(cached.has_server_designated_connection_id());
-  EXPECT_EQ(QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_CLIENT)
-                ? QuicEndian::NetToHost64(kConnectionId)
-                : kConnectionId,
+  EXPECT_EQ(QuicEndian::NetToHost64(kConnectionId),
             cached.GetNextServerDesignatedConnectionId());
   EXPECT_EQ(server_nonce, cached.GetNextServerNonce());
 }
diff --git a/net/quic/core/crypto/quic_crypto_server_config.cc b/net/quic/core/crypto/quic_crypto_server_config.cc
index 02446b6..0f7ea499 100644
--- a/net/quic/core/crypto/quic_crypto_server_config.cc
+++ b/net/quic/core/crypto/quic_crypto_server_config.cc
@@ -742,9 +742,7 @@
     const QuicReferenceCountedPointer<Config>& requested_config,
     const QuicReferenceCountedPointer<Config>& primary_config,
     std::unique_ptr<ProcessClientHelloResultCallback> done_cb) const {
-  if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_SERVER)) {
-    connection_id = QuicEndian::HostToNet64(connection_id);
-  }
+  connection_id = QuicEndian::HostToNet64(connection_id);
 
   ProcessClientHelloHelper helper(&done_cb);
 
@@ -1470,11 +1468,8 @@
                   << "with server-designated connection ID "
                   << server_designated_connection_id;
     out->set_tag(kSREJ);
-    if (QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective::IS_SERVER)) {
-      server_designated_connection_id =
-          QuicEndian::HostToNet64(server_designated_connection_id);
-    }
-    out->SetValue(kRCID, server_designated_connection_id);
+    out->SetValue(kRCID,
+                  QuicEndian::HostToNet64(server_designated_connection_id));
   } else {
     out->set_tag(kREJ);
   }
diff --git a/net/quic/core/crypto/strike_register.cc b/net/quic/core/crypto/strike_register.cc
deleted file mode 100644
index b5c4e937..0000000
--- a/net/quic/core/crypto/strike_register.cc
+++ /dev/null
@@ -1,516 +0,0 @@
-// Copyright (c) 2013 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.
-
-#include "net/quic/core/crypto/strike_register.h"
-
-#include <algorithm>
-#include <limits>
-
-#include "net/quic/platform/api/quic_logging.h"
-
-namespace net {
-
-namespace {
-
-uint32_t GetInitialHorizon(uint32_t current_time_internal,
-                           uint32_t window_secs,
-                           StrikeRegister::StartupType startup) {
-  if (startup == StrikeRegister::DENY_REQUESTS_AT_STARTUP) {
-    // The horizon is initially set |window_secs| into the future because, if
-    // we just crashed, then we may have accepted nonces in the span
-    // [current_time...current_time+window_secs] and so we conservatively
-    // reject the whole timespan unless |startup| tells us otherwise.
-    return current_time_internal + window_secs + 1;
-  } else {  // startup == StrikeRegister::NO_STARTUP_PERIOD_NEEDED
-    // The orbit can be assumed to be globally unique.  Use a horizon
-    // in the past.
-    return 0;
-  }
-}
-
-}  // namespace
-
-// static
-const uint32_t StrikeRegister::kExternalNodeSize = 24;
-// static
-const uint32_t StrikeRegister::kNil = (1u << 31) | 1;
-// static
-const uint32_t StrikeRegister::kExternalFlag = 1 << 23;
-
-// InternalNode represents a non-leaf node in the critbit tree. See the comment
-// in the .h file for details.
-class StrikeRegister::InternalNode {
- public:
-  void SetChild(unsigned direction, uint32_t child) {
-    data_[direction] = (data_[direction] & 0xff) | (child << 8);
-  }
-
-  void SetCritByte(uint8_t critbyte) {
-    data_[0] = (data_[0] & 0xffffff00) | critbyte;
-  }
-
-  void SetOtherBits(uint8_t otherbits) {
-    data_[1] = (data_[1] & 0xffffff00) | otherbits;
-  }
-
-  void SetNextPtr(uint32_t next) { data_[0] = next; }
-
-  uint32_t next() const { return data_[0]; }
-
-  uint32_t child(unsigned n) const { return data_[n] >> 8; }
-
-  uint8_t critbyte() const { return static_cast<uint8_t>(data_[0]); }
-
-  uint8_t otherbits() const { return static_cast<uint8_t>(data_[1]); }
-
-  // These bytes are organised thus:
-  //   <24 bits> left child
-  //   <8 bits> crit-byte
-  //   <24 bits> right child
-  //   <8 bits> other-bits
-  uint32_t data_[2];
-};
-
-// kCreationTimeFromInternalEpoch contains the number of seconds between the
-// start of the internal epoch and the creation time. This allows us
-// to consider times that are before the creation time.
-static const uint32_t kCreationTimeFromInternalEpoch = 63115200;  // 2 years.
-
-void StrikeRegister::ValidateStrikeRegisterConfig(unsigned max_entries) {
-  // We only have 23 bits of index available.
-  CHECK_LT(max_entries, 1u << 23);
-  CHECK_GT(max_entries, 1u);           // There must be at least two entries.
-  CHECK_EQ(sizeof(InternalNode), 8u);  // in case of compiler changes.
-}
-
-StrikeRegister::StrikeRegister(unsigned max_entries,
-                               uint32_t current_time,
-                               uint32_t window_secs,
-                               const uint8_t orbit[8],
-                               StartupType startup)
-    : max_entries_(max_entries),
-      window_secs_(window_secs),
-      internal_epoch_(current_time > kCreationTimeFromInternalEpoch
-                          ? current_time - kCreationTimeFromInternalEpoch
-                          : 0),
-      horizon_(GetInitialHorizon(ExternalTimeToInternal(current_time),
-                                 window_secs,
-                                 startup)) {
-  memcpy(orbit_, orbit, sizeof(orbit_));
-
-  ValidateStrikeRegisterConfig(max_entries);
-  internal_nodes_ = new InternalNode[max_entries];
-  external_nodes_.reset(new uint8_t[kExternalNodeSize * max_entries]);
-
-  Reset();
-}
-
-StrikeRegister::~StrikeRegister() {
-  delete[] internal_nodes_;
-}
-
-void StrikeRegister::Reset() {
-  // Thread a free list through all of the internal nodes.
-  internal_node_free_head_ = 0;
-  for (unsigned i = 0; i < max_entries_ - 1; i++) {
-    internal_nodes_[i].SetNextPtr(i + 1);
-  }
-  internal_nodes_[max_entries_ - 1].SetNextPtr(kNil);
-
-  // Also thread a free list through the external nodes.
-  external_node_free_head_ = 0;
-  for (unsigned i = 0; i < max_entries_ - 1; i++) {
-    external_node_next_ptr(i) = i + 1;
-  }
-  external_node_next_ptr(max_entries_ - 1) = kNil;
-
-  // This is the root of the tree.
-  internal_node_head_ = kNil;
-}
-
-InsertStatus StrikeRegister::Insert(const uint8_t nonce[32],
-                                    uint32_t current_time_external) {
-  // Make space for the insertion if the strike register is full.
-  while (external_node_free_head_ == kNil || internal_node_free_head_ == kNil) {
-    DropOldestNode();
-  }
-
-  const uint32_t current_time = ExternalTimeToInternal(current_time_external);
-
-  // Check to see if the orbit is correct.
-  if (memcmp(nonce + sizeof(current_time), orbit_, sizeof(orbit_))) {
-    return NONCE_INVALID_ORBIT_FAILURE;
-  }
-
-  const uint32_t nonce_time = ExternalTimeToInternal(TimeFromBytes(nonce));
-
-  // Check that the timestamp is in the valid range.
-  std::pair<uint32_t, uint32_t> valid_range =
-      StrikeRegister::GetValidRange(current_time);
-  if (nonce_time < valid_range.first || nonce_time > valid_range.second) {
-    return NONCE_INVALID_TIME_FAILURE;
-  }
-
-  // We strip the orbit out of the nonce.
-  uint8_t value[24];
-  memcpy(value, nonce, sizeof(nonce_time));
-  memcpy(value + sizeof(nonce_time),
-         nonce + sizeof(nonce_time) + sizeof(orbit_),
-         sizeof(value) - sizeof(nonce_time));
-
-  // Find the best match to |value| in the crit-bit tree. The best match is
-  // simply the value which /could/ match |value|, if any does, so we still
-  // need a memcmp to check.
-  uint32_t best_match_index = BestMatch(value);
-  if (best_match_index == kNil) {
-    // Empty tree. Just insert the new value at the root.
-    uint32_t index = GetFreeExternalNode();
-    memcpy(external_node(index), value, sizeof(value));
-    internal_node_head_ = (index | kExternalFlag) << 8;
-    DCHECK_LE(horizon_, nonce_time);
-    return NONCE_OK;
-  }
-
-  const uint8_t* best_match = external_node(best_match_index);
-  if (memcmp(best_match, value, sizeof(value)) == 0) {
-    // We found the value in the tree.
-    return NONCE_NOT_UNIQUE_FAILURE;
-  }
-
-  // We are going to insert a new entry into the tree, so get the nodes now.
-  uint32_t internal_node_index = GetFreeInternalNode();
-  uint32_t external_node_index = GetFreeExternalNode();
-
-  // If we just evicted the best match, then we have to try and match again.
-  // We know that we didn't just empty the tree because we require that
-  // max_entries_ >= 2. Also, we know that it doesn't match because, if it
-  // did, it would have been returned previously.
-  if (external_node_index == best_match_index) {
-    best_match_index = BestMatch(value);
-    best_match = external_node(best_match_index);
-  }
-
-  // Now we need to find the first bit where we differ from |best_match|.
-  uint8_t differing_byte;
-  uint8_t new_other_bits;
-  for (differing_byte = 0; differing_byte < arraysize(value);
-       differing_byte++) {
-    new_other_bits = value[differing_byte] ^ best_match[differing_byte];
-    if (new_other_bits) {
-      break;
-    }
-  }
-
-  // Once we have the XOR the of first differing byte in new_other_bits we need
-  // to find the most significant differing bit. We could do this with a simple
-  // for loop, testing bits 7..0. Instead we fold the bits so that we end up
-  // with a byte where all the bits below the most significant one, are set.
-  new_other_bits |= new_other_bits >> 1;
-  new_other_bits |= new_other_bits >> 2;
-  new_other_bits |= new_other_bits >> 4;
-  // Now this bit trick results in all the bits set, except the original
-  // most-significant one.
-  new_other_bits = (new_other_bits & ~(new_other_bits >> 1)) ^ 255;
-
-  // Consider the effect of ORing against |new_other_bits|. If |value| did not
-  // have the critical bit set, the result is the same as |new_other_bits|. If
-  // it did, the result is all ones.
-
-  unsigned newdirection;
-  if ((new_other_bits | value[differing_byte]) == 0xff) {
-    newdirection = 1;
-  } else {
-    newdirection = 0;
-  }
-
-  memcpy(external_node(external_node_index), value, sizeof(value));
-  InternalNode* inode = &internal_nodes_[internal_node_index];
-
-  inode->SetChild(newdirection, external_node_index | kExternalFlag);
-  inode->SetCritByte(differing_byte);
-  inode->SetOtherBits(new_other_bits);
-
-  // |where_index| is a pointer to the uint32_t which needs to be updated in
-  // order to insert the new internal node into the tree. The internal nodes
-  // store the child indexes in the top 24-bits of a 32-bit word and, to keep
-  // the code simple, we define that |internal_node_head_| is organised the
-  // same way.
-  DCHECK_EQ(internal_node_head_ & 0xff, 0u);
-  uint32_t* where_index = &internal_node_head_;
-  while (((*where_index >> 8) & kExternalFlag) == 0) {
-    InternalNode* node = &internal_nodes_[*where_index >> 8];
-    if (node->critbyte() > differing_byte) {
-      break;
-    }
-    if (node->critbyte() == differing_byte &&
-        node->otherbits() > new_other_bits) {
-      break;
-    }
-    if (node->critbyte() == differing_byte &&
-        node->otherbits() == new_other_bits) {
-      CHECK(false);
-    }
-
-    uint8_t c = value[node->critbyte()];
-    const int direction =
-        (1 + static_cast<unsigned>(node->otherbits() | c)) >> 8;
-    where_index = &node->data_[direction];
-  }
-
-  inode->SetChild(newdirection ^ 1, *where_index >> 8);
-  *where_index = (*where_index & 0xff) | (internal_node_index << 8);
-
-  DCHECK_LE(horizon_, nonce_time);
-  return NONCE_OK;
-}
-
-const uint8_t* StrikeRegister::orbit() const {
-  return orbit_;
-}
-
-uint32_t StrikeRegister::GetCurrentValidWindowSecs(
-    uint32_t current_time_external) const {
-  uint32_t current_time = ExternalTimeToInternal(current_time_external);
-  std::pair<uint32_t, uint32_t> valid_range =
-      StrikeRegister::GetValidRange(current_time);
-  if (valid_range.second >= valid_range.first) {
-    return valid_range.second - current_time + 1;
-  } else {
-    return 0;
-  }
-}
-
-void StrikeRegister::Validate() {
-  std::set<uint32_t> free_internal_nodes;
-  for (uint32_t i = internal_node_free_head_; i != kNil;
-       i = internal_nodes_[i].next()) {
-    CHECK_LT(i, max_entries_);
-    CHECK_EQ(free_internal_nodes.count(i), 0u);
-    free_internal_nodes.insert(i);
-  }
-
-  std::set<uint32_t> free_external_nodes;
-  for (uint32_t i = external_node_free_head_; i != kNil;
-       i = external_node_next_ptr(i)) {
-    CHECK_LT(i, max_entries_);
-    CHECK_EQ(free_external_nodes.count(i), 0u);
-    free_external_nodes.insert(i);
-  }
-
-  std::set<uint32_t> used_external_nodes;
-  std::set<uint32_t> used_internal_nodes;
-
-  if (internal_node_head_ != kNil &&
-      ((internal_node_head_ >> 8) & kExternalFlag) == 0) {
-    std::vector<std::pair<unsigned, bool>> bits;
-    ValidateTree(internal_node_head_ >> 8, -1, bits, free_internal_nodes,
-                 free_external_nodes, &used_internal_nodes,
-                 &used_external_nodes);
-  }
-}
-
-// static
-uint32_t StrikeRegister::TimeFromBytes(const uint8_t d[4]) {
-  return static_cast<uint32_t>(d[0]) << 24 | static_cast<uint32_t>(d[1]) << 16 |
-         static_cast<uint32_t>(d[2]) << 8 | static_cast<uint32_t>(d[3]);
-}
-
-std::pair<uint32_t, uint32_t> StrikeRegister::GetValidRange(
-    uint32_t current_time_internal) const {
-  if (current_time_internal < horizon_) {
-    // Empty valid range.
-    return std::make_pair(std::numeric_limits<uint32_t>::max(), 0);
-  }
-
-  uint32_t lower_bound;
-  if (current_time_internal >= window_secs_) {
-    lower_bound = std::max(horizon_, current_time_internal - window_secs_);
-  } else {
-    lower_bound = horizon_;
-  }
-
-  // Also limit the upper range based on horizon_.  This makes the
-  // strike register reject inserts that are far in the future and
-  // would consume strike register resources for a long time.  This
-  // allows the strike server to degrade optimally in cases where the
-  // insert rate exceeds |max_entries_ / (2 * window_secs_)| entries
-  // per second.
-  uint32_t upper_bound =
-      current_time_internal +
-      std::min(current_time_internal - horizon_, window_secs_);
-
-  return std::make_pair(lower_bound, upper_bound);
-}
-
-uint32_t StrikeRegister::ExternalTimeToInternal(uint32_t external_time) const {
-  return external_time - internal_epoch_;
-}
-
-uint32_t StrikeRegister::BestMatch(const uint8_t v[24]) const {
-  if (internal_node_head_ == kNil) {
-    return kNil;
-  }
-
-  uint32_t next = internal_node_head_ >> 8;
-  while ((next & kExternalFlag) == 0) {
-    InternalNode* node = &internal_nodes_[next];
-    uint8_t b = v[node->critbyte()];
-    unsigned direction =
-        (1 + static_cast<unsigned>(node->otherbits() | b)) >> 8;
-    next = node->child(direction);
-  }
-
-  return next & ~kExternalFlag;
-}
-
-uint32_t& StrikeRegister::external_node_next_ptr(unsigned i) {
-  return *reinterpret_cast<uint32_t*>(&external_nodes_[i * kExternalNodeSize]);
-}
-
-uint8_t* StrikeRegister::external_node(unsigned i) {
-  return &external_nodes_[i * kExternalNodeSize];
-}
-
-uint32_t StrikeRegister::GetFreeExternalNode() {
-  uint32_t index = external_node_free_head_;
-  DCHECK(index != kNil);
-  external_node_free_head_ = external_node_next_ptr(index);
-  return index;
-}
-
-uint32_t StrikeRegister::GetFreeInternalNode() {
-  uint32_t index = internal_node_free_head_;
-  DCHECK(index != kNil);
-  internal_node_free_head_ = internal_nodes_[index].next();
-  return index;
-}
-
-void StrikeRegister::DropOldestNode() {
-  // DropOldestNode should never be called on an empty tree.
-  DCHECK(internal_node_head_ != kNil);
-
-  // An internal node in a crit-bit tree always has exactly two children.
-  // This means that, if we are removing an external node (which is one of
-  // those children), then we also need to remove an internal node. In order
-  // to do that we keep pointers to the parent (wherep) and grandparent
-  // (whereq) when walking down the tree.
-
-  uint32_t p = internal_node_head_ >> 8, *wherep = &internal_node_head_,
-           *whereq = nullptr;
-  while ((p & kExternalFlag) == 0) {
-    whereq = wherep;
-    InternalNode* inode = &internal_nodes_[p];
-    // We always go left, towards the smallest element, exploiting the fact
-    // that the timestamp is big-endian and at the start of the value.
-    wherep = &inode->data_[0];
-    p = (*wherep) >> 8;
-  }
-
-  const uint32_t ext_index = p & ~kExternalFlag;
-  const uint8_t* ext_node = external_node(ext_index);
-  uint32_t new_horizon = ExternalTimeToInternal(TimeFromBytes(ext_node)) + 1;
-  DCHECK_LE(horizon_, new_horizon);
-  horizon_ = new_horizon;
-
-  if (!whereq) {
-    // We are removing the last element in a tree.
-    internal_node_head_ = kNil;
-    FreeExternalNode(ext_index);
-    return;
-  }
-
-  // |wherep| points to the left child pointer in the parent so we can add
-  // one and dereference to get the right child.
-  const uint32_t other_child = wherep[1];
-  FreeInternalNode((*whereq) >> 8);
-  *whereq = (*whereq & 0xff) | (other_child & 0xffffff00);
-  FreeExternalNode(ext_index);
-}
-
-void StrikeRegister::FreeExternalNode(uint32_t index) {
-  external_node_next_ptr(index) = external_node_free_head_;
-  external_node_free_head_ = index;
-}
-
-void StrikeRegister::FreeInternalNode(uint32_t index) {
-  internal_nodes_[index].SetNextPtr(internal_node_free_head_);
-  internal_node_free_head_ = index;
-}
-
-void StrikeRegister::ValidateTree(
-    uint32_t internal_node,
-    int last_bit,
-    const std::vector<std::pair<unsigned, bool>>& bits,
-    const std::set<uint32_t>& free_internal_nodes,
-    const std::set<uint32_t>& free_external_nodes,
-    std::set<uint32_t>* used_internal_nodes,
-    std::set<uint32_t>* used_external_nodes) {
-  CHECK_LT(internal_node, max_entries_);
-  const InternalNode* i = &internal_nodes_[internal_node];
-  unsigned bit = 0;
-  switch (i->otherbits()) {
-    case 0xff & ~(1 << 7):
-      bit = 0;
-      break;
-    case 0xff & ~(1 << 6):
-      bit = 1;
-      break;
-    case 0xff & ~(1 << 5):
-      bit = 2;
-      break;
-    case 0xff & ~(1 << 4):
-      bit = 3;
-      break;
-    case 0xff & ~(1 << 3):
-      bit = 4;
-      break;
-    case 0xff & ~(1 << 2):
-      bit = 5;
-      break;
-    case 0xff & ~(1 << 1):
-      bit = 6;
-      break;
-    case 0xff & ~1:
-      bit = 7;
-      break;
-    default:
-      CHECK(false);
-  }
-
-  bit += 8 * i->critbyte();
-  if (last_bit > -1) {
-    CHECK_GT(bit, static_cast<unsigned>(last_bit));
-  }
-
-  CHECK_EQ(free_internal_nodes.count(internal_node), 0u);
-
-  for (unsigned child = 0; child < 2; child++) {
-    if (i->child(child) & kExternalFlag) {
-      uint32_t ext = i->child(child) & ~kExternalFlag;
-      CHECK_EQ(free_external_nodes.count(ext), 0u);
-      CHECK_EQ(used_external_nodes->count(ext), 0u);
-      used_external_nodes->insert(ext);
-      const uint8_t* bytes = external_node(ext);
-      for (const std::pair<unsigned, bool>& pair : bits) {
-        unsigned byte = pair.first / 8;
-        DCHECK_LE(byte, 0xffu);
-        unsigned bit_new = pair.first % 8;
-        static const uint8_t kMasks[8] = {0x80, 0x40, 0x20, 0x10,
-                                          0x08, 0x04, 0x02, 0x01};
-        CHECK_EQ((bytes[byte] & kMasks[bit_new]) != 0, pair.second);
-      }
-    } else {
-      uint32_t inter = i->child(child);
-      std::vector<std::pair<unsigned, bool>> new_bits(bits);
-      new_bits.push_back(std::pair<unsigned, bool>(bit, child != 0));
-      CHECK_EQ(free_internal_nodes.count(inter), 0u);
-      CHECK_EQ(used_internal_nodes->count(inter), 0u);
-      used_internal_nodes->insert(inter);
-      ValidateTree(inter, bit, bits, free_internal_nodes, free_external_nodes,
-                   used_internal_nodes, used_external_nodes);
-    }
-  }
-}
-
-}  // namespace net
diff --git a/net/quic/core/crypto/strike_register.h b/net/quic/core/crypto/strike_register.h
deleted file mode 100644
index d12ebc2..0000000
--- a/net/quic/core/crypto/strike_register.h
+++ /dev/null
@@ -1,222 +0,0 @@
-// Copyright (c) 2013 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 NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_H_
-#define NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_H_
-
-#include <cstdint>
-#include <memory>
-#include <set>
-#include <utility>
-#include <vector>
-
-#include "base/macros.h"
-#include "net/quic/platform/api/quic_export.h"
-
-namespace net {
-
-// InsertStatus enum values cannot be changed, they need to be stable.
-enum InsertStatus {
-  NONCE_OK = 0,
-  // The default error value for nonce verification failures from strike
-  // register (covers old strike registers and unknown failures).
-  NONCE_UNKNOWN_FAILURE = 1,
-  // Decrypted nonce had incorrect length.
-  NONCE_INVALID_FAILURE = 2,
-  // Nonce is not unique.
-  NONCE_NOT_UNIQUE_FAILURE = 3,
-  // Nonce's orbit is invalid or incorrect.
-  NONCE_INVALID_ORBIT_FAILURE = 4,
-  // Nonce's timestamp is not in the strike register's valid time range.
-  NONCE_INVALID_TIME_FAILURE = 5,
-  // Strike register's RPC call timed out, nonce couldn't be verified.
-  STRIKE_REGISTER_TIMEOUT = 6,
-  // Strike register is down, nonce couldn't be verified.
-  STRIKE_REGISTER_FAILURE = 7,
-};
-
-// A StrikeRegister is critbit tree which stores a set of observed nonces.
-// We use a critbit tree because:
-//   1) It's immune to algorithmic complexity attacks. If we had used a hash
-//      tree, an attacker could send us a series of values which stretch out one
-//      of the hash chains, causing us to do much more work than normal.
-//   2) We can write it to use a fixed block of memory: avoiding fragmentation
-//      issues and so forth. (We might be able to do that with the STL
-//      algorithms and a custom allocator, but I don't want to go there.)
-//   3) It's simple (compared to balanced binary trees) and doesn't involve
-//      bouncing nearly as many cache lines around.
-//   4) It allows us to query for the oldest element in log(n) time.
-//
-// This code is based on djb's public domain critbit tree from qhasm.
-//
-// A critbit tree has external and internal nodes. External nodes are just the
-// nonce values (which are stored with internal times, see below, and without
-// the orbit values included). Internal nodes contain the bit number at which
-// the tree is branching and exactly two children. The critical bit is stored
-// as a byte number and a byte (|otherbits|) which has all the bits set
-// /except/ the one in question.
-//
-// Internal nodes have exactly two children: an internal node with only a
-// single child would be useless.
-//
-// The branching bit number (considering the MSB to be the 1st bit) is
-// monotonically increasing as you go down the tree.
-//
-// There are two distinct time representations used. External times are those
-// which are exposed to the users of this class. They are expected to be a
-// count of the number of seconds since the UNIX epoch. Internal times are a
-// count of the number of seconds since a point in time a couple of years
-// before the creation time given to the constructor. (See
-// |ExternalTimeToInternal|) This avoids having to worry about overflow since
-// we assume that no process will run for 130 years.
-class QUIC_EXPORT_PRIVATE StrikeRegister {
- public:
-  enum StartupType {
-    // DENY_REQUESTS_AT_STARTUP is the typical mode for a strike register.
-    // Because servers can crash and the strike-register memory-based, the
-    // state of the strike-register may be lost at any time. Thus the previous
-    // instance of the server may have accepted an nonce with time
-    // now+window_secs, which was forgotten in the crash. Therefore
-    // DENY_REQUESTS_AT_STARTUP causes the strike-register to reject all
-    // requests timestampped before window_secs + the creation time (the
-    // quiescent period).
-    DENY_REQUESTS_AT_STARTUP,
-    // NO_STARTUP_PERIOD_NEEDED indicates that no quiescent period is required.
-    // This may be because the strike-register is using an orbit randomly
-    // generated at startup and therefore nonces accepted by the previous
-    // instance of the strike-register are invalid for that reason.
-    NO_STARTUP_PERIOD_NEEDED,
-  };
-
-  // An external node takes 24 bytes as we don't record the orbit.
-  static const uint32_t kExternalNodeSize;
-
-  // We address the nodes by their index in the array. This means that 0 is a
-  // valid index. Therefore this is our invalid index. It also has a one bit
-  // in the LSB position because we tend to store indexes shifted up 8 bits
-  // and this distinguishes kNil from (kExternalFlag | 0) << 8.
-  static const uint32_t kNil;
-
-  // Our pointers from internal nodes can either point to an internal or
-  // external node. We flag the 24th bit to mark a pointer as external.
-  static const uint32_t kExternalFlag;
-
-  // Allows early validation before a strike register is created.
-  static void ValidateStrikeRegisterConfig(unsigned max_entries);
-
-  // Construct a new set which can hold, at most, |max_entries| (which must be
-  // less than 2**23). See the comments around StartupType about initial
-  // behaviour. Otherwise, all nonces that are outside +/- |window_secs| from
-  // the current time will be rejected. Additionally, all nonces that have an
-  // orbit value other than |orbit| will be rejected.
-  //
-  // (Note that this code is independent of the actual units of time used, but
-  // you should use seconds.)
-  StrikeRegister(unsigned max_entries,
-                 uint32_t current_time_external,
-                 uint32_t window_secs,
-                 const uint8_t orbit[8],
-                 StartupType startup);
-
-  ~StrikeRegister();
-
-  void Reset();
-
-  // |Insert| queries to see if |nonce| is
-  //   a) for the wrong orbit
-  //   b) before the current horizon
-  //   c) outside of the valid time window
-  //   d) already in the set of observed nonces
-  // and returns the failure reason if any of these are true. It is also free to
-  // return failure reason for other reasons as it's always safe to reject an
-  // nonce.
-  //
-  // nonces are:
-  //   4 bytes of timestamp (UNIX epoch seconds)
-  //   8 bytes of orbit value (a cluster id)
-  //   20 bytes of random data
-  //
-  // Otherwise, it inserts |nonce| into the observed set and returns NONCE_OK.
-  InsertStatus Insert(const uint8_t nonce[32], uint32_t current_time);
-
-  // orbit returns a pointer to the 8-byte orbit value for this
-  // strike-register.
-  const uint8_t* orbit() const;
-
-  // Time window for which the strike register has complete information.
-  uint32_t GetCurrentValidWindowSecs(uint32_t current_time_external) const;
-
-  // This is a debugging aid which checks the tree for sanity.
-  void Validate();
-
- private:
-  class InternalNode;
-
-  // TimeFromBytes returns a big-endian uint32_t from |d|.
-  static uint32_t TimeFromBytes(const uint8_t d[4]);
-
-  // Range of internal times for which the strike register has
-  // complete information.  A nonce is within the valid range of the
-  // strike register if:
-  //   valid_range.first <= nonce_time_internal <= valid_range.second
-  std::pair<uint32_t, uint32_t> GetValidRange(
-      uint32_t current_time_internal) const;
-
-  // ExternalTimeToInternal converts an external time value into an internal
-  // time value using |internal_epoch_|.
-  uint32_t ExternalTimeToInternal(uint32_t external_time) const;
-
-  // BestMatch returns either kNil, or an external node index which could
-  // possibly match |v|.
-  uint32_t BestMatch(const uint8_t v[24]) const;
-
-  // external_node_next_ptr returns the 'next' pointer embedded in external
-  // node |i|. This is used to thread a free list through the external nodes.
-  uint32_t& external_node_next_ptr(unsigned i);
-
-  uint8_t* external_node(unsigned i);
-
-  uint32_t GetFreeExternalNode();
-
-  uint32_t GetFreeInternalNode();
-
-  // DropOldestNode removes the oldest node in the tree and updates |horizon_|
-  // accordingly.
-  void DropOldestNode();
-
-  void FreeExternalNode(uint32_t index);
-
-  void FreeInternalNode(uint32_t index);
-
-  void ValidateTree(uint32_t internal_node,
-                    int last_bit,
-                    const std::vector<std::pair<unsigned, bool>>& bits,
-                    const std::set<uint32_t>& free_internal_nodes,
-                    const std::set<uint32_t>& free_external_nodes,
-                    std::set<uint32_t>* used_internal_nodes,
-                    std::set<uint32_t>* used_external_nodes);
-
-  const uint32_t max_entries_;
-  const uint32_t window_secs_;
-  // internal_epoch_ contains the external time value of the start of internal
-  // time.
-  const uint32_t internal_epoch_;
-  uint8_t orbit_[8];
-  // The strike register will reject nonces with internal times < |horizon_| .
-  uint32_t horizon_;
-
-  uint32_t internal_node_free_head_;
-  uint32_t external_node_free_head_;
-  uint32_t internal_node_head_;
-  // internal_nodes_ can't be a scoped_ptr because the type isn't defined in
-  // this header.
-  InternalNode* internal_nodes_;
-  std::unique_ptr<uint8_t[]> external_nodes_;
-
-  DISALLOW_COPY_AND_ASSIGN(StrikeRegister);
-};
-
-}  // namespace net
-
-#endif  // NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_H_
diff --git a/net/quic/core/crypto/strike_register_client.h b/net/quic/core/crypto/strike_register_client.h
deleted file mode 100644
index 06291ae4..0000000
--- a/net/quic/core/crypto/strike_register_client.h
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright 2013 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 NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_CLIENT_H_
-#define NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_CLIENT_H_
-
-#include <string>
-
-#include "base/macros.h"
-#include "net/quic/core/crypto/strike_register.h"
-#include "net/quic/core/quic_time.h"
-#include "net/quic/platform/api/quic_export.h"
-#include "net/quic/platform/api/quic_string_piece.h"
-
-namespace net {
-
-// Interface implemented by clients that talk to strike registers
-// implemented as local or remote services.
-class QUIC_EXPORT_PRIVATE StrikeRegisterClient {
- public:
-  // Single use callback that will be invoked once the validation
-  // operation is complete.
-  class QUIC_EXPORT_PRIVATE ResultCallback {
-   public:
-    ResultCallback() {}
-    virtual ~ResultCallback() {}
-    void Run(bool nonce_is_valid_and_unique, InsertStatus nonce_error) {
-      RunImpl(nonce_is_valid_and_unique, nonce_error);
-      delete this;
-    }
-
-   protected:
-    virtual void RunImpl(bool nonce_is_valid_and_unique,
-                         InsertStatus nonce_error) = 0;
-
-   private:
-    DISALLOW_COPY_AND_ASSIGN(ResultCallback);
-  };
-
-  StrikeRegisterClient() {}
-  virtual ~StrikeRegisterClient() {}
-
-  // Returns true iff the strike register knows about the given orbit.
-  virtual bool IsKnownOrbit(QuicStringPiece orbit) const = 0;
-  // Validate a nonce for freshness and uniqueness.
-  // Will invoke cb->Run(ValidateResponse::nonce_is_valid_and_unique(),
-  //                     ValidateResponse::nonce_error())
-  // once the asynchronous operation is complete.
-  virtual void VerifyNonceIsValidAndUnique(QuicStringPiece nonce,
-                                           QuicWallTime now,
-                                           ResultCallback* cb) = 0;
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(StrikeRegisterClient);
-};
-
-}  // namespace net
-
-#endif  // NET_QUIC_CORE_CRYPTO_STRIKE_REGISTER_CLIENT_H_
diff --git a/net/quic/core/crypto/strike_register_test.cc b/net/quic/core/crypto/strike_register_test.cc
deleted file mode 100644
index bcf2ec2..0000000
--- a/net/quic/core/crypto/strike_register_test.cc
+++ /dev/null
@@ -1,408 +0,0 @@
-// Copyright (c) 2013 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.
-
-#include "net/quic/core/crypto/strike_register.h"
-
-#include <cstdint>
-#include <memory>
-#include <set>
-#include <string>
-
-#include "base/rand_util.h"
-#include "net/quic/platform/api/quic_test.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace net {
-
-namespace {
-
-using std::string;
-
-const uint8_t kOrbit[8] = {1, 2, 3, 4, 5, 6, 7, 8};
-
-// StrikeRegisterTests don't look at the random bytes so this function can
-// simply set the random bytes to 0.
-void SetNonce(uint8_t nonce[32], unsigned time, const uint8_t orbit[8]) {
-  nonce[0] = time >> 24;
-  nonce[1] = time >> 16;
-  nonce[2] = time >> 8;
-  nonce[3] = time;
-  memcpy(nonce + 4, orbit, 8);
-  memset(nonce + 12, 0, 20);
-}
-
-class StrikeRegisterTest : public QuicTest {};
-
-TEST_F(StrikeRegisterTest, SimpleHorizon) {
-  // The set must reject values created on or before its own creation time.
-  StrikeRegister set(10 /* max size */, 1000 /* current time */,
-                     100 /* window secs */, kOrbit,
-                     StrikeRegister::DENY_REQUESTS_AT_STARTUP);
-  uint8_t nonce[32];
-  SetNonce(nonce, 999, kOrbit);
-  EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1000));
-  SetNonce(nonce, 1000, kOrbit);
-  EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1000));
-
-  EXPECT_EQ(0u, set.GetCurrentValidWindowSecs(1000 /* current time */));
-  EXPECT_EQ(0u, set.GetCurrentValidWindowSecs(1100 /* current time */));
-  EXPECT_EQ(1u, set.GetCurrentValidWindowSecs(1101 /* current time */));
-  EXPECT_EQ(50u, set.GetCurrentValidWindowSecs(1150 /* current time */));
-  EXPECT_EQ(100u, set.GetCurrentValidWindowSecs(1200 /* current time */));
-  EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1300 /* current time */));
-}
-
-TEST_F(StrikeRegisterTest, NoStartupMode) {
-  // Check that a strike register works immediately if NO_STARTUP_PERIOD_NEEDED
-  // is specified.
-  StrikeRegister set(10 /* max size */, 1000 /* current time */,
-                     100 /* window secs */, kOrbit,
-                     StrikeRegister::NO_STARTUP_PERIOD_NEEDED);
-  uint8_t nonce[32];
-  SetNonce(nonce, 1000, kOrbit);
-  EXPECT_EQ(NONCE_OK, set.Insert(nonce, 1000));
-  EXPECT_EQ(NONCE_NOT_UNIQUE_FAILURE, set.Insert(nonce, 1000));
-
-  EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1000 /* current time */));
-  EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1050 /* current time */));
-  EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1100 /* current time */));
-  EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1200 /* current time */));
-  EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1300 /* current time */));
-}
-
-TEST_F(StrikeRegisterTest, WindowFuture) {
-  // The set must reject values outside the window.
-  StrikeRegister set(10 /* max size */, 1000 /* current time */,
-                     100 /* window secs */, kOrbit,
-                     StrikeRegister::DENY_REQUESTS_AT_STARTUP);
-  uint8_t nonce[32];
-  SetNonce(nonce, 1101, kOrbit);
-  EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1000));
-  SetNonce(nonce, 999, kOrbit);
-  EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1100));
-}
-
-TEST_F(StrikeRegisterTest, BadOrbit) {
-  // The set must reject values with the wrong orbit
-  StrikeRegister set(10 /* max size */, 1000 /* current time */,
-                     100 /* window secs */, kOrbit,
-                     StrikeRegister::DENY_REQUESTS_AT_STARTUP);
-  uint8_t nonce[32];
-  static const uint8_t kBadOrbit[8] = {0, 0, 0, 0, 1, 1, 1, 1};
-  SetNonce(nonce, 1101, kBadOrbit);
-  EXPECT_EQ(NONCE_INVALID_ORBIT_FAILURE, set.Insert(nonce, 1100));
-}
-
-TEST_F(StrikeRegisterTest, OneValue) {
-  StrikeRegister set(10 /* max size */, 1000 /* current time */,
-                     100 /* window secs */, kOrbit,
-                     StrikeRegister::DENY_REQUESTS_AT_STARTUP);
-  uint8_t nonce[32];
-  SetNonce(nonce, 1101, kOrbit);
-  EXPECT_EQ(NONCE_OK, set.Insert(nonce, 1101));
-}
-
-TEST_F(StrikeRegisterTest, RejectDuplicate) {
-  // The set must reject values with the wrong orbit
-  StrikeRegister set(10 /* max size */, 1000 /* current time */,
-                     100 /* window secs */, kOrbit,
-                     StrikeRegister::DENY_REQUESTS_AT_STARTUP);
-  uint8_t nonce[32];
-  SetNonce(nonce, 1101, kOrbit);
-  EXPECT_EQ(NONCE_OK, set.Insert(nonce, 1101));
-  EXPECT_EQ(NONCE_NOT_UNIQUE_FAILURE, set.Insert(nonce, 1101));
-}
-
-TEST_F(StrikeRegisterTest, HorizonUpdating) {
-  StrikeRegister::StartupType startup_types[] = {
-      StrikeRegister::DENY_REQUESTS_AT_STARTUP,
-      StrikeRegister::NO_STARTUP_PERIOD_NEEDED};
-
-  for (size_t type_idx = 0; type_idx < arraysize(startup_types); ++type_idx) {
-    StrikeRegister set(5 /* max size */, 500 /* current time */,
-                       100 /* window secs */, kOrbit, startup_types[type_idx]);
-    uint8_t nonce[6][32];
-    for (unsigned i = 0; i < 5; i++) {
-      SetNonce(nonce[i], 1101 + i, kOrbit);
-      nonce[i][31] = i;
-      EXPECT_EQ(NONCE_OK, set.Insert(nonce[i], 1100));
-    }
-
-    // Valid window is still equal to |window_secs + 1|.
-    EXPECT_EQ(101u, set.GetCurrentValidWindowSecs(1100));
-
-    // This should push the oldest value out and force the horizon to
-    // be updated.
-    SetNonce(nonce[5], 1110, kOrbit);
-    EXPECT_EQ(NONCE_OK, set.Insert(nonce[5], 1110));
-    // Effective horizon is computed based on the timestamp of the
-    // value that was pushed out.
-    EXPECT_EQ(9u, set.GetCurrentValidWindowSecs(1110));
-
-    SetNonce(nonce[5], 1111, kOrbit);
-    EXPECT_EQ(NONCE_OK, set.Insert(nonce[5], 1110));
-    EXPECT_EQ(8u, set.GetCurrentValidWindowSecs(1110));
-
-    // This should be behind the horizon now:
-    SetNonce(nonce[5], 1101, kOrbit);
-    nonce[5][31] = 10;
-    EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce[5], 1110));
-
-    // Insert beyond the valid range.
-    SetNonce(nonce[5], 1117, kOrbit);
-    nonce[5][31] = 2;
-    EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce[5], 1110));
-
-    // Insert at the upper valid range.
-    SetNonce(nonce[5], 1116, kOrbit);
-    nonce[5][31] = 1;
-    EXPECT_EQ(NONCE_OK, set.Insert(nonce[5], 1110));
-
-    // This should be beyond the upper valid range now:
-    SetNonce(nonce[5], 1116, kOrbit);
-    nonce[5][31] = 2;
-    EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce[5], 1110));
-  }
-}
-
-TEST_F(StrikeRegisterTest, InsertMany) {
-  StrikeRegister set(5000 /* max size */, 1000 /* current time */,
-                     500 /* window secs */, kOrbit,
-                     StrikeRegister::DENY_REQUESTS_AT_STARTUP);
-
-  uint8_t nonce[32];
-  SetNonce(nonce, 1101, kOrbit);
-  for (unsigned i = 0; i < 100000; i++) {
-    SetNonce(nonce, 1101 + i / 500, kOrbit);
-    memcpy(nonce + 12, &i, sizeof(i));
-    EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, set.Insert(nonce, 1100));
-  }
-}
-
-// For the following test we create a slow, but simple, version of a
-// StrikeRegister. The behaviour of this object is much easier to understand
-// than the fully fledged version. We then create a test to show, empirically,
-// that the two objects have identical behaviour.
-
-// A SlowStrikeRegister has the same public interface as a StrikeRegister, but
-// is much slower. Hopefully it is also more obviously correct and we can
-// empirically test that their behaviours are identical.
-class SlowStrikeRegister {
- public:
-  SlowStrikeRegister(unsigned max_entries,
-                     uint32_t current_time,
-                     uint32_t window_secs,
-                     const uint8_t orbit[8])
-      : max_entries_(max_entries),
-        window_secs_(window_secs),
-        creation_time_(current_time),
-        horizon_(ExternalTimeToInternal(current_time + window_secs) + 1) {
-    memcpy(orbit_, orbit, sizeof(orbit_));
-  }
-
-  InsertStatus Insert(const uint8_t nonce_bytes[32],
-                      const uint32_t nonce_time_external,
-                      const uint32_t current_time_external) {
-    if (nonces_.size() == max_entries_) {
-      DropOldestEntry();
-    }
-
-    const uint32_t current_time = ExternalTimeToInternal(current_time_external);
-
-    // Check to see if the orbit is correct.
-    if (memcmp(nonce_bytes + 4, orbit_, sizeof(orbit_))) {
-      return NONCE_INVALID_ORBIT_FAILURE;
-    }
-    const uint32_t nonce_time =
-        ExternalTimeToInternal(TimeFromBytes(nonce_bytes));
-    EXPECT_EQ(ExternalTimeToInternal(nonce_time_external), nonce_time);
-    // We have dropped one or more nonces with a time value of |horizon_ - 1|,
-    // so we have to reject anything with a timestamp less than or
-    // equal to that.
-    if (nonce_time < horizon_) {
-      return NONCE_INVALID_TIME_FAILURE;
-    }
-
-    // Check that the timestamp is in the current window.
-    if ((current_time > window_secs_ &&
-         nonce_time < (current_time - window_secs_)) ||
-        nonce_time > (current_time + window_secs_)) {
-      return NONCE_INVALID_TIME_FAILURE;
-    }
-
-    std::pair<uint32_t, string> nonce = std::make_pair(
-        nonce_time, string(reinterpret_cast<const char*>(nonce_bytes), 32));
-
-    std::set<std::pair<uint32_t, string>>::const_iterator it =
-        nonces_.find(nonce);
-    if (it != nonces_.end()) {
-      return NONCE_NOT_UNIQUE_FAILURE;
-    }
-
-    nonces_.insert(nonce);
-    return NONCE_OK;
-  }
-
-  uint32_t GetCurrentValidWindowSecs(
-      const uint32_t current_time_external) const {
-    const uint32_t current_time = ExternalTimeToInternal(current_time_external);
-    if (horizon_ > current_time) {
-      return 0;
-    }
-    return 1 + std::min(current_time - horizon_, window_secs_);
-  }
-
- private:
-  // TimeFromBytes returns a big-endian uint32_t from |d|.
-  static uint32_t TimeFromBytes(const uint8_t d[4]) {
-    return static_cast<uint32_t>(d[0]) << 24 |
-           static_cast<uint32_t>(d[1]) << 16 |
-           static_cast<uint32_t>(d[2]) << 8 | static_cast<uint32_t>(d[3]);
-  }
-
-  uint32_t ExternalTimeToInternal(uint32_t external_time) const {
-    static const uint32_t kCreationTimeFromInternalEpoch = 63115200.0;
-    uint32_t internal_epoch = 0;
-    if (creation_time_ > kCreationTimeFromInternalEpoch) {
-      internal_epoch = creation_time_ - kCreationTimeFromInternalEpoch;
-    }
-
-    return external_time - internal_epoch;
-  }
-
-  void DropOldestEntry() {
-    std::set<std::pair<uint32_t, string>>::iterator oldest = nonces_.begin();
-    horizon_ = oldest->first + 1;
-    nonces_.erase(oldest);
-  }
-
-  const unsigned max_entries_;
-  const unsigned window_secs_;
-  const uint32_t creation_time_;
-  uint8_t orbit_[8];
-  uint32_t horizon_;
-
-  std::set<std::pair<uint32_t, string>> nonces_;
-};
-
-class StrikeRegisterStressTest : public QuicTest {};
-
-TEST_F(StrikeRegisterStressTest, InOrderInsertion) {
-  // Fixed seed gives reproducibility for this test.
-  srand(42);
-
-  unsigned max_entries = 64;
-  uint32_t current_time = 10000, window = 200;
-  std::unique_ptr<StrikeRegister> s1(
-      new StrikeRegister(max_entries, current_time, window, kOrbit,
-                         StrikeRegister::DENY_REQUESTS_AT_STARTUP));
-  std::unique_ptr<SlowStrikeRegister> s2(
-      new SlowStrikeRegister(max_entries, current_time, window, kOrbit));
-
-  uint64_t i;
-  const uint64_t kMaxIterations = 10000;
-  for (i = 0; i < kMaxIterations; i++) {
-    const uint32_t time = current_time + i;
-
-    uint8_t nonce[32];
-    SetNonce(nonce, time, kOrbit);
-
-    // There are 2048 possible nonce values:
-    const uint32_t v = rand() % 2048;
-    nonce[30] = v >> 8;
-    nonce[31] = v;
-
-    const InsertStatus nonce_error2 = s2->Insert(nonce, time, time);
-    const InsertStatus nonce_error1 = s1->Insert(nonce, time);
-    EXPECT_EQ(nonce_error1, nonce_error2);
-
-    // Inserts succeed after the startup period.
-    if (time > current_time + window) {
-      EXPECT_EQ(NONCE_OK, nonce_error1);
-    } else {
-      EXPECT_EQ(NONCE_INVALID_TIME_FAILURE, nonce_error1);
-    }
-    EXPECT_EQ(s1->GetCurrentValidWindowSecs(time),
-              s2->GetCurrentValidWindowSecs(time));
-
-    if (i % 10 == 0) {
-      s1->Validate();
-    }
-
-    if (HasFailure()) {
-      break;
-    }
-  }
-
-  if (i != kMaxIterations) {
-    FAIL() << "Failed after " << i << " iterations";
-  }
-}
-
-TEST_F(StrikeRegisterStressTest, Stress) {
-  // Fixed seed gives reproducibility for this test.
-  srand(42);
-  unsigned max_entries = 64;
-  uint32_t current_time = 10000, window = 200;
-  std::unique_ptr<StrikeRegister> s1(
-      new StrikeRegister(max_entries, current_time, window, kOrbit,
-                         StrikeRegister::DENY_REQUESTS_AT_STARTUP));
-  std::unique_ptr<SlowStrikeRegister> s2(
-      new SlowStrikeRegister(max_entries, current_time, window, kOrbit));
-  uint64_t i;
-
-  // When making changes it's worth removing the limit on this test and running
-  // it for a while. For the initial development an opt binary was left running
-  // for 10 minutes.
-  const uint64_t kMaxIterations = 10000;
-  for (i = 0; i < kMaxIterations; i++) {
-    if (rand() % 1000 == 0) {
-      // 0.1% chance of resetting the sets.
-      max_entries = rand() % 300 + 2;
-      current_time = rand() % 10000;
-      window = rand() % 500;
-      s1.reset(new StrikeRegister(max_entries, current_time, window, kOrbit,
-                                  StrikeRegister::DENY_REQUESTS_AT_STARTUP));
-      s2.reset(
-          new SlowStrikeRegister(max_entries, current_time, window, kOrbit));
-    }
-
-    int32_t time_delta = rand() % (window * 4);
-    time_delta -= window * 2;
-    const uint32_t time = current_time + time_delta;
-    if (time_delta < 0 && time > current_time) {
-      continue;  // overflow
-    }
-
-    uint8_t nonce[32];
-    SetNonce(nonce, time, kOrbit);
-
-    // There are 2048 possible nonce values:
-    const uint32_t v = rand() % 2048;
-    nonce[30] = v >> 8;
-    nonce[31] = v;
-
-    const InsertStatus nonce_error2 = s2->Insert(nonce, time, time);
-    const InsertStatus nonce_error1 = s1->Insert(nonce, time);
-    EXPECT_EQ(nonce_error1, nonce_error2);
-    EXPECT_EQ(s1->GetCurrentValidWindowSecs(time),
-              s2->GetCurrentValidWindowSecs(time));
-
-    if (i % 10 == 0) {
-      s1->Validate();
-    }
-
-    if (HasFailure()) {
-      break;
-    }
-  }
-
-  if (i != kMaxIterations) {
-    FAIL() << "Failed after " << i << " iterations";
-  }
-}
-
-}  // namespace
-
-}  // namespace net
diff --git a/net/quic/core/frames/quic_ack_frame.cc b/net/quic/core/frames/quic_ack_frame.cc
index 0741a15..fdb6e9b 100644
--- a/net/quic/core/frames/quic_ack_frame.cc
+++ b/net/quic/core/frames/quic_ack_frame.cc
@@ -115,23 +115,6 @@
   return packet_number_intervals_.rbegin()->Length();
 }
 
-PacketNumberQueue::const_iterator PacketNumberQueue::lower_bound(
-    QuicPacketNumber packet_number) const {
-  // lower_bound returns the first interval that contains |packet_number| or the
-  // first interval after |packet_number|.
-  auto itr = packet_number_intervals_.Find(packet_number);
-  if (itr != packet_number_intervals_.end()) {
-    return itr;
-  }
-  for (itr = packet_number_intervals_.begin();
-       itr != packet_number_intervals_.end(); ++itr) {
-    if (packet_number < itr->min()) {
-      return itr;
-    }
-  }
-  return packet_number_intervals_.end();
-}
-
 PacketNumberQueue::const_iterator PacketNumberQueue::begin() const {
   return packet_number_intervals_.begin();
 }
diff --git a/net/quic/core/frames/quic_ack_frame.h b/net/quic/core/frames/quic_ack_frame.h
index ef4829c..db33248 100644
--- a/net/quic/core/frames/quic_ack_frame.h
+++ b/net/quic/core/frames/quic_ack_frame.h
@@ -82,7 +82,6 @@
   const_iterator end() const;
   const_reverse_iterator rbegin() const;
   const_reverse_iterator rend() const;
-  const_iterator lower_bound(QuicPacketNumber packet_number) const;
 
   friend QUIC_EXPORT_PRIVATE std::ostream& operator<<(
       std::ostream& os,
diff --git a/net/quic/core/frames/quic_frames_test.cc b/net/quic/core/frames/quic_frames_test.cc
index b0a77377..f591cd7 100644
--- a/net/quic/core/frames/quic_frames_test.cc
+++ b/net/quic/core/frames/quic_frames_test.cc
@@ -242,29 +242,6 @@
   EXPECT_EQ(expected_intervals, actual_intervals);
 }
 
-TEST_F(PacketNumberQueueTest, LowerBoundEquals) {
-  PacketNumberQueue queue;
-  queue.Add(1, 100);
-
-  PacketNumberQueue::const_iterator it = queue.lower_bound(10);
-  ASSERT_NE(queue.end(), it);
-  EXPECT_TRUE(it->Contains(10u));
-
-  it = queue.lower_bound(101);
-  EXPECT_TRUE(queue.end() == it);
-}
-
-TEST_F(PacketNumberQueueTest, LowerBoundGreater) {
-  PacketNumberQueue queue;
-  queue.Add(15, 25);
-  queue.Add(50, 100);
-
-  PacketNumberQueue::const_iterator it = queue.lower_bound(10);
-  ASSERT_NE(queue.end(), it);
-  EXPECT_EQ(15u, it->min());
-  EXPECT_EQ(25u, it->max());
-}
-
 TEST_F(PacketNumberQueueTest, IntervalLengthAndRemoveInterval) {
   PacketNumberQueue queue;
   queue.Add(1, 10);
diff --git a/net/quic/core/quic_connection_test.cc b/net/quic/core/quic_connection_test.cc
index 3f31667..cf14b3e 100644
--- a/net/quic/core/quic_connection_test.cc
+++ b/net/quic/core/quic_connection_test.cc
@@ -704,7 +704,7 @@
         peer_framer_(SupportedVersions(version()),
                      QuicTime::Zero(),
                      Perspective::IS_SERVER),
-        peer_creator_(GetPeerInMemoryConnectionId(connection_id_),
+        peer_creator_(connection_id_,
                       &peer_framer_,
                       &buffer_allocator_,
                       /*delegate=*/nullptr),
@@ -846,8 +846,7 @@
                                    QuicFrame frame,
                                    EncryptionLevel level) {
     QuicPacketHeader header;
-    header.public_header.connection_id =
-        GetPeerInMemoryConnectionId(connection_id_);
+    header.public_header.connection_id = connection_id_;
     header.public_header.packet_number_length = packet_number_length_;
     header.public_header.connection_id_length = connection_id_length_;
     header.packet_number = number;
@@ -958,8 +957,7 @@
     QuicPacketHeader header;
     // Set connection_id to peer's in memory representation as this data packet
     // is created by peer_framer.
-    header.public_header.connection_id =
-        GetPeerInMemoryConnectionId(connection_id_);
+    header.public_header.connection_id = connection_id_;
     header.public_header.packet_number_length = packet_number_length_;
     header.public_header.connection_id_length = connection_id_length_;
     header.packet_number = number;
@@ -976,8 +974,7 @@
     QuicPacketHeader header;
     // Set connection_id to peer's in memory representation as this connection
     // close packet is created by peer_framer.
-    header.public_header.connection_id =
-        GetPeerInMemoryConnectionId(connection_id_);
+    header.public_header.connection_id = connection_id_;
     header.packet_number = number;
 
     QuicConnectionCloseFrame qccf;
@@ -1216,8 +1213,7 @@
   connection_.SetMaxPacketLength(1000);
 
   QuicPacketHeader header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.public_header.version_flag = true;
   header.packet_number = 1;
 
@@ -1250,8 +1246,7 @@
   EXPECT_EQ(1000u, connection_.max_packet_length());
 
   QuicPacketHeader header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.public_header.version_flag = true;
   header.packet_number = 1;
 
@@ -4447,8 +4442,7 @@
 TEST_P(QuicConnectionTest, PublicReset) {
   QuicPublicResetPacket header;
   // Public reset packet in only built by server.
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.public_header.reset_flag = true;
   header.public_header.version_flag = false;
   std::unique_ptr<QuicEncryptedPacket> packet(
@@ -4514,8 +4508,7 @@
   peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
 
   QuicPacketHeader header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.public_header.version_flag = true;
   header.packet_number = 12;
 
@@ -4550,8 +4543,7 @@
   peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
 
   QuicPacketHeader header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.public_header.version_flag = true;
   header.packet_number = 12;
 
@@ -4593,8 +4585,7 @@
   peer_framer_.set_version_for_tests(QUIC_VERSION_UNSUPPORTED);
 
   QuicPacketHeader header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.public_header.version_flag = true;
   header.packet_number = 12;
 
@@ -4623,8 +4614,8 @@
 
   // Send a version negotiation packet.
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      peer_framer_.BuildVersionNegotiationPacket(
-          GetPeerInMemoryConnectionId(connection_id_), AllSupportedVersions()));
+      peer_framer_.BuildVersionNegotiationPacket(connection_id_,
+                                                 AllSupportedVersions()));
   std::unique_ptr<QuicReceivedPacket> received(
       ConstructReceivedPacket(*encrypted, QuicTime::Zero()));
   connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *received);
@@ -4632,8 +4623,7 @@
   // Now force another packet.  The connection should transition into
   // NEGOTIATED_VERSION state and tell the packet creator to StopSendingVersion.
   QuicPacketHeader header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.packet_number = 12;
   header.public_header.version_flag = false;
   QuicFrames frames;
@@ -4659,8 +4649,8 @@
               OnConnectionClosed(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, _,
                                  ConnectionCloseSource::FROM_SELF));
   std::unique_ptr<QuicEncryptedPacket> encrypted(
-      framer_.BuildVersionNegotiationPacket(
-          GetPeerInMemoryConnectionId(connection_id_), AllSupportedVersions()));
+      framer_.BuildVersionNegotiationPacket(connection_id_,
+                                            AllSupportedVersions()));
   std::unique_ptr<QuicReceivedPacket> received(
       ConstructReceivedPacket(*encrypted, QuicTime::Zero()));
   connection_.ProcessUdpPacket(kSelfAddress, kPeerAddress, *received);
@@ -4716,8 +4706,7 @@
 TEST_P(QuicConnectionTest, ProcessFramesIfPacketClosedConnection) {
   // Construct a packet with stream frame and connection close frame.
   QuicPacketHeader header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id_);
+  header.public_header.connection_id = connection_id_;
   header.packet_number = 1;
   header.public_header.version_flag = false;
 
diff --git a/net/quic/core/quic_crypto_client_stream_test.cc b/net/quic/core/quic_crypto_client_stream_test.cc
index 0cb590da..e841dff2 100644
--- a/net/quic/core/quic_crypto_client_stream_test.cc
+++ b/net/quic/core/quic_crypto_client_stream_test.cc
@@ -463,7 +463,7 @@
       client_state->GetNextServerDesignatedConnectionId();
   QuicConnectionId expected_id =
       server_session_->connection()->random_generator()->RandUint64();
-  EXPECT_EQ(GetPeerInMemoryConnectionId(expected_id), server_designated_id);
+  EXPECT_EQ(expected_id, server_designated_id);
   EXPECT_FALSE(client_state->has_server_designated_connection_id());
 }
 
diff --git a/net/quic/core/quic_crypto_server_stream_test.cc b/net/quic/core/quic_crypto_server_stream_test.cc
index 0a6ae1f0..c91de4f 100644
--- a/net/quic/core/quic_crypto_server_stream_test.cc
+++ b/net/quic/core/quic_crypto_server_stream_test.cc
@@ -265,8 +265,7 @@
       client_state->GetNextServerDesignatedConnectionId();
   const QuicConnectionId expected_id =
       server_connection_->random_generator()->RandUint64();
-  EXPECT_EQ(GetPeerInMemoryConnectionId(expected_id),
-            server_designated_connection_id);
+  EXPECT_EQ(expected_id, server_designated_connection_id);
   EXPECT_FALSE(client_state->has_server_designated_connection_id());
   ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0)));
 }
@@ -297,8 +296,7 @@
       client_state->GetNextServerDesignatedConnectionId();
   const QuicConnectionId expected_id =
       server_connection_->random_generator()->RandUint64();
-  EXPECT_EQ(GetPeerInMemoryConnectionId(expected_id),
-            server_designated_connection_id);
+  EXPECT_EQ(expected_id, server_designated_connection_id);
   EXPECT_FALSE(client_state->has_server_designated_connection_id());
   ASSERT_TRUE(client_state->IsComplete(QuicWallTime::FromUNIXSeconds(0)));
 
diff --git a/net/quic/core/quic_data_reader.cc b/net/quic/core/quic_data_reader.cc
index c748efc..71f1003 100644
--- a/net/quic/core/quic_data_reader.cc
+++ b/net/quic/core/quic_data_reader.cc
@@ -13,6 +13,9 @@
 
 namespace net {
 
+#define ENDPOINT \
+  (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
+
 QuicDataReader::QuicDataReader(const char* data,
                                const size_t len,
                                Perspective perspective,
@@ -21,7 +24,9 @@
       len_(len),
       pos_(0),
       perspective_(perspective),
-      endianness_(endianness) {}
+      endianness_(endianness) {
+  QUIC_DVLOG(1) << ENDPOINT << "QuicDataReader";
+}
 
 bool QuicDataReader::ReadUInt8(uint8_t* result) {
   return ReadBytes(result, sizeof(*result));
@@ -137,10 +142,7 @@
   if (!ReadBytes(connection_id, sizeof(*connection_id))) {
     return false;
   }
-
-  if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective_)) {
-    *connection_id = QuicEndian::NetToHost64(*connection_id);
-  }
+  *connection_id = QuicEndian::NetToHost64(*connection_id);
 
   return true;
 }
diff --git a/net/quic/core/quic_data_reader.h b/net/quic/core/quic_data_reader.h
index 755f2fcc..56c53a41 100644
--- a/net/quic/core/quic_data_reader.h
+++ b/net/quic/core/quic_data_reader.h
@@ -144,6 +144,7 @@
   // The location of the next read from our data buffer.
   size_t pos_;
 
+  // TODO(zhongyi): remove this field as it is no longer used.
   // Perspective of this data reader. Please note, although client and server
   // may have different in-memory representation of the same field, the on wire
   // representation must be consistent.
diff --git a/net/quic/core/quic_data_writer.cc b/net/quic/core/quic_data_writer.cc
index 3290dba..e4716b3 100644
--- a/net/quic/core/quic_data_writer.cc
+++ b/net/quic/core/quic_data_writer.cc
@@ -13,6 +13,9 @@
 
 namespace net {
 
+#define ENDPOINT \
+  (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
+
 QuicDataWriter::QuicDataWriter(size_t size,
                                char* buffer,
                                Perspective perspective,
@@ -21,7 +24,9 @@
       capacity_(size),
       length_(0),
       perspective_(perspective),
-      endianness_(endianness) {}
+      endianness_(endianness) {
+  QUIC_DVLOG(1) << ENDPOINT << "QuicDataWriter";
+}
 
 QuicDataWriter::~QuicDataWriter() {}
 
@@ -173,9 +178,7 @@
 }
 
 bool QuicDataWriter::WriteConnectionId(uint64_t connection_id) {
-  if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective_)) {
-    connection_id = QuicEndian::HostToNet64(connection_id);
-  }
+  connection_id = QuicEndian::HostToNet64(connection_id);
 
   return WriteBytes(&connection_id, sizeof(connection_id));
 }
diff --git a/net/quic/core/quic_data_writer.h b/net/quic/core/quic_data_writer.h
index 8c0f400..46df686 100644
--- a/net/quic/core/quic_data_writer.h
+++ b/net/quic/core/quic_data_writer.h
@@ -88,6 +88,7 @@
   size_t capacity_;  // Allocation size of payload (or -1 if buffer is const).
   size_t length_;    // Current length of the buffer.
 
+  // TODO(zhongyi): remove this field as it is no longer used.
   // Perspective of this data writer. Please note, although client and server
   // may have different in-memory representation of the same field, the on wire
   // representation must be consistent.
diff --git a/net/quic/core/quic_data_writer_test.cc b/net/quic/core/quic_data_writer_test.cc
index e44a12b..c6c2d7c3 100644
--- a/net/quic/core/quic_data_writer_test.cc
+++ b/net/quic/core/quic_data_writer_test.cc
@@ -254,9 +254,6 @@
 
 TEST_P(QuicDataWriterTest, WriteConnectionId) {
   uint64_t connection_id = 0x0011223344556677;
-  char little_endian[] = {
-      0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
-  };
   char big_endian[] = {
       0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
   };
@@ -265,12 +262,8 @@
   QuicDataWriter writer(kBufferLength, buffer, GetParam().perspective,
                         GetParam().endianness);
   writer.WriteConnectionId(connection_id);
-  test::CompareCharArraysWithHexError(
-      "connection_id", buffer, kBufferLength,
-      QuicUtils::IsConnectionIdWireFormatBigEndian(GetParam().perspective)
-          ? big_endian
-          : little_endian,
-      kBufferLength);
+  test::CompareCharArraysWithHexError("connection_id", buffer, kBufferLength,
+                                      big_endian, kBufferLength);
 
   uint64_t read_connection_id;
   QuicDataReader reader(buffer, kBufferLength, GetParam().perspective,
diff --git a/net/quic/core/quic_flags_list.h b/net/quic/core/quic_flags_list.h
index d8c39b4..9e7b1ae7 100644
--- a/net/quic/core/quic_flags_list.h
+++ b/net/quic/core/quic_flags_list.h
@@ -7,10 +7,6 @@
 
 // This file contains the list of QUIC protocol flags.
 
-// If true, QUIC BBR congestion control may be enabled via Finch and/or via QUIC
-// connection options.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_allow_new_bbr, true)
-
 // Time period for which a given connection_id should live in the time-wait
 // state.
 QUIC_FLAG(int64_t, FLAGS_quic_time_wait_list_seconds, 200)
@@ -143,18 +139,6 @@
 // If true, enable QUIC v39.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_version_39, true)
 
-// If true, on client side, 8-byte connection ID in public header is read and
-// written in big endian.
-QUIC_FLAG(bool,
-          FLAGS_quic_restart_flag_quic_big_endian_connection_id_client,
-          true)
-
-// If true, on server side, 8-byte connection ID in public header is read and
-// written in big endian.
-QUIC_FLAG(bool,
-          FLAGS_quic_restart_flag_quic_big_endian_connection_id_server,
-          true)
-
 // Simplify QUIC\'s adaptive time loss detection to measure the necessary
 // reordering window for every spurious retransmit.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_fix_adaptive_time_loss, false)
@@ -163,10 +147,6 @@
 // compressed for QUIC version >= 38.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_enable_random_padding, true)
 
-// Use conservation in PROBE_BW ouside of super-unity gain and immediately
-// preceeding cycle.
-QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_extra_conservation, false)
-
 // Increase BBR's inflight limit if recent ack rate is low.
 QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_slow_recent_delivery, false)
 
diff --git a/net/quic/core/quic_flow_controller.h b/net/quic/core/quic_flow_controller.h
index f183741a..6d79a43 100644
--- a/net/quic/core/quic_flow_controller.h
+++ b/net/quic/core/quic_flow_controller.h
@@ -97,10 +97,6 @@
     receive_window_size_limit_ = receive_window_size_limit;
   }
 
-  void set_auto_tune_receive_window(bool enable) {
-    auto_tune_receive_window_ = enable;
-  }
-
   // Should only be called before any data is received.
   void UpdateReceiveWindowSize(QuicStreamOffset size);
 
diff --git a/net/quic/core/quic_flow_controller_test.cc b/net/quic/core/quic_flow_controller_test.cc
index 0c17adb..9feb3c3 100644
--- a/net/quic/core/quic_flow_controller_test.cc
+++ b/net/quic/core/quic_flow_controller_test.cc
@@ -34,27 +34,24 @@
 
 class QuicFlowControllerTest : public QuicTest {
  public:
-  QuicFlowControllerTest()
-      : stream_id_(1234),
-        send_window_(kInitialSessionFlowControlWindowForTest),
-        receive_window_(kInitialSessionFlowControlWindowForTest),
-        connection_(&helper_, &alarm_factory_, Perspective::IS_CLIENT) {}
-
   void Initialize() {
     flow_controller_.reset(new QuicFlowController(
         &connection_, stream_id_, Perspective::IS_CLIENT, send_window_,
-        receive_window_, false, &session_flow_controller_));
+        receive_window_, should_auto_tune_receive_window_,
+        &session_flow_controller_));
   }
 
  protected:
-  QuicStreamId stream_id_;
-  QuicByteCount send_window_;
-  QuicByteCount receive_window_;
+  QuicStreamId stream_id_ = 1234;
+  QuicByteCount send_window_ = kInitialSessionFlowControlWindowForTest;
+  QuicByteCount receive_window_ = kInitialSessionFlowControlWindowForTest;
   std::unique_ptr<QuicFlowController> flow_controller_;
   MockQuicConnectionHelper helper_;
   MockAlarmFactory alarm_factory_;
-  MockQuicConnection connection_;
+  MockQuicConnection connection_ = {&helper_, &alarm_factory_,
+                                    Perspective::IS_CLIENT};
   MockFlowController session_flow_controller_;
+  bool should_auto_tune_receive_window_ = false;
 };
 
 TEST_F(QuicFlowControllerTest, SendingBytes) {
@@ -167,8 +164,9 @@
   // This test will generate two WINDOW_UPDATE frames.
   EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(1);
 
+  should_auto_tune_receive_window_ = true;
   Initialize();
-  flow_controller_->set_auto_tune_receive_window(true);
+  EXPECT_TRUE(flow_controller_->auto_tune_receive_window());
 
   // Make sure clock is inititialized.
   connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
@@ -221,7 +219,7 @@
   EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2);
 
   Initialize();
-  flow_controller_->set_auto_tune_receive_window(false);
+  EXPECT_FALSE(flow_controller_->auto_tune_receive_window());
 
   // Make sure clock is inititialized.
   connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
@@ -273,8 +271,9 @@
   // This test will generate two WINDOW_UPDATE frames.
   EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(1);
 
+  should_auto_tune_receive_window_ = true;
   Initialize();
-  flow_controller_->set_auto_tune_receive_window(true);
+  EXPECT_TRUE(flow_controller_->auto_tune_receive_window());
 
   // Make sure clock is inititialized.
   connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
@@ -330,7 +329,7 @@
   EXPECT_CALL(connection_, SendWindowUpdate(stream_id_, ::testing::_)).Times(2);
 
   Initialize();
-  flow_controller_->set_auto_tune_receive_window(false);
+  EXPECT_FALSE(flow_controller_->auto_tune_receive_window());
 
   // Make sure clock is inititialized.
   connection_.AdvanceTime(QuicTime::Delta::FromMilliseconds(1));
diff --git a/net/quic/core/quic_framer_test.cc b/net/quic/core/quic_framer_test.cc
index a04fdc6..ed3979b 100644
--- a/net/quic/core/quic_framer_test.cc
+++ b/net/quic/core/quic_framer_test.cc
@@ -446,26 +446,6 @@
   test::TestQuicVisitor visitor_;
 };
 
-// Helper function to get index of packets in hex format.
-// For each packet in hex format, integers and floating numbers are in big
-// endian for v38 and up, and connection ID is in big endian according to
-// perspective and flags.
-// There are 4 combinations:
-// 0 : little endian connection ID, little endian integers/floating numbers.
-// 1 : big endian connection ID, little endian integers/floating numbers.
-// 2 : little endian connection ID, big endian integers/floating numbers.
-// 3 : big endian connection ID, big endian integers/floating numbers.
-size_t GetPacketIndex(QuicVersion version, Perspective perspective) {
-  size_t index = 0;
-  if (QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)) {
-    index = 1;
-  }
-  if (version > QUIC_VERSION_38) {
-    index += 2;
-  }
-  return index;
-}
-
 // Run all framer tests with all supported versions of QUIC.
 INSTANTIATE_TEST_CASE_P(QuicFramerTests,
                         QuicFramerTest,
@@ -585,17 +565,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-    // private flags
-    0x00,
-  };
-
-  unsigned char packet_cid_be[kMaxPacketSize + 1] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -610,15 +579,7 @@
 
   memset(packet + header_size, 0, kMaxPacketSize - header_size);
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_QUIC_BUG(framer_.ProcessPacket(encrypted), "Packet too large:1");
 
   ASSERT_TRUE(visitor_.header_.get());
@@ -634,15 +595,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -652,26 +604,15 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -694,8 +635,9 @@
     } else {
       expected_error = "Unable to read packet number.";
     }
-    CheckProcessingFails(packets[index], i, expected_error,
-                         QUIC_INVALID_PACKET_HEADER);
+    CheckProcessingFails(
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
+        expected_error, QUIC_INVALID_PACKET_HEADER);
   }
 }
 
@@ -760,17 +702,6 @@
     // public flags (version)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (version)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -782,17 +713,6 @@
     // public flags (version)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (version)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -801,11 +721,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -831,8 +749,9 @@
     } else {
       expected_error = "Unable to read packet number.";
     }
-    CheckProcessingFails(packets[index], i, expected_error,
-                         QUIC_INVALID_PACKET_HEADER);
+    CheckProcessingFails(
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
+        expected_error, QUIC_INVALID_PACKET_HEADER);
   }
 }
 
@@ -844,15 +763,6 @@
     // public flags (8 byte connection_id and 4 byte packet number)
     0x28,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id and 4 byte packet number)
-    0x28,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -862,26 +772,15 @@
     // public flags (8 byte connection_id and 4 byte packet number)
     0x28,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x56, 0x78, 0x9A, 0xBC,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id and 4 byte packet number)
-    0x28,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x56, 0x78, 0x9A, 0xBC,
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -904,8 +803,9 @@
     } else {
       expected_error = "Unable to read packet number.";
     }
-    CheckProcessingFails(packets[index], i, expected_error,
-                         QUIC_INVALID_PACKET_HEADER);
+    CheckProcessingFails(
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
+        expected_error, QUIC_INVALID_PACKET_HEADER);
   }
 }
 
@@ -917,15 +817,6 @@
     // public flags (8 byte connection_id and 2 byte packet number)
     0x18,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id and 2 byte packet number)
-    0x18,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A,
@@ -935,26 +826,15 @@
     // public flags (8 byte connection_id and 2 byte packet number)
     0x18,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x9A, 0xBC,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id and 2 byte packet number)
-    0x18,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x9A, 0xBC,
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -979,8 +859,9 @@
     } else {
       expected_error = "Unable to read packet number.";
     }
-    CheckProcessingFails(packets[index], i, expected_error,
-                         QUIC_INVALID_PACKET_HEADER);
+    CheckProcessingFails(
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39, i,
+        expected_error, QUIC_INVALID_PACKET_HEADER);
   }
 }
 
@@ -992,30 +873,13 @@
     // public flags (8 byte connection_id and 1 byte packet number)
     0x08,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id and 1 byte packet number)
-    0x08,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC,
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -1040,11 +904,7 @@
     } else {
       expected_error = "Unable to read packet number.";
     }
-    CheckProcessingFails(
-        QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-            ? packet_cid_be
-            : packet,
-        i, expected_error, QUIC_INVALID_PACKET_HEADER);
+    CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
   }
 }
 
@@ -1112,24 +972,6 @@
     // public flags: includes nonce flag
     0x3C,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // nonce
-    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
-    // frame type (padding)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags: includes nonce flag
-    0x3C,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // nonce
     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
@@ -1148,24 +990,6 @@
     // public flags: includes nonce flag
     0x3C,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-    // nonce
-    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
-    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
-    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
-    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
-    // packet number
-    0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
-    // frame type (padding)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags: includes nonce flag
-    0x3C,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // nonce
     0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
@@ -1180,11 +1004,10 @@
     0x00, 0x00, 0x00, 0x00
   };
   // clang-format on
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
 
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   ASSERT_TRUE(visitor_.public_header_->nonce != nullptr);
@@ -1201,23 +1024,6 @@
     // public flags (8 byte connection_id, version flag and an unknown flag)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '0', '0', '0',
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id, version flag and an unknown flag)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '0', '0', '0',
@@ -1234,23 +1040,6 @@
     // public flags (8 byte connection_id, version flag and an unknown flag)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '0', '0', '0',
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id, version flag and an unknown flag)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '0', '0', '0',
@@ -1263,11 +1052,10 @@
     0x00, 0x00, 0x00, 0x00
   };
   // clang-format on
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
 
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -1283,34 +1071,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (padding frame)
-    0x00,
-    // Ignored data (which in this case is a stream frame)
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -1339,15 +1099,7 @@
     return;
   }
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -1360,9 +1112,7 @@
   EXPECT_EQ(28, visitor_.padding_frames_[0]->num_padding_bytes);
   // A packet with no frames is not acceptable.
   CheckProcessingFails(
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? packet_cid_be
-          : packet,
+      packet,
       GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                           !kIncludeVersion, !kIncludeDiversificationNonce,
                           PACKET_6BYTE_PACKET_NUMBER),
@@ -1375,35 +1125,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // paddings
-    0x00, 0x00,
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-    // paddings
-    0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -1432,35 +1153,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // paddings
-    0x00, 0x00,
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-    // paddings
-    0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -1490,11 +1182,9 @@
     return;
   }
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.header_.get());
@@ -1518,31 +1208,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56,
-      0x34, 0x12,
-
-      // frame type (stream frame with fin)
-      0xFF,
-      // stream id
-      0x04, 0x03, 0x02, 0x01,
-      // offset
-      0x54, 0x76, 0x10, 0x32,
-      0xDC, 0xFE, 0x98, 0xBA,
-      // data length
-      0x0c, 0x00,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0xBC, 0x9A, 0x78, 0x56,
@@ -1567,31 +1232,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
-      // frame type (stream frame with fin)
-      0xFF,
-      // stream id
-      0x01, 0x02, 0x03, 0x04,
-      // offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
-      // data length
-      0x00, 0x0c,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0x12, 0x34, 0x56, 0x78,
@@ -1612,11 +1252,10 @@
       'r',  'l',  'd',  '!',
   };
   // clang-format on
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
 
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1632,8 +1271,9 @@
   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
 
   // Now test framing boundaries.
-  CheckStreamFrameBoundaries(packets[index], kQuicMaxStreamIdSize,
-                             !kIncludeVersion);
+  CheckStreamFrameBoundaries(
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
+      kQuicMaxStreamIdSize, !kIncludeVersion);
 }
 
 TEST_P(QuicFramerTest, MissingDiversificationNonce) {
@@ -1648,31 +1288,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56,
-      0x34, 0x12,
-
-      // frame type (stream frame with fin)
-      0xFF,
-      // stream id
-      0x04, 0x03, 0x02, 0x01,
-      // offset
-      0x54, 0x76, 0x10, 0x32,
-      0xDC, 0xFE, 0x98, 0xBA,
-      // data length
-      0x0c, 0x00,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
       // packet number
       0xBC, 0x9A, 0x78, 0x56,
@@ -1697,31 +1312,6 @@
         // public flags (8 byte connection_id)
         0x38,
         // connection_id
-        0x10, 0x32, 0x54, 0x76,
-        0x98, 0xBA, 0xDC, 0xFE,
-        // packet number
-        0x12, 0x34, 0x56, 0x78,
-        0x9A, 0xBC,
-
-        // frame type (stream frame with fin)
-        0xFF,
-        // stream id
-        0x01, 0x02, 0x03, 0x04,
-        // offset
-        0xBA, 0x98, 0xFE, 0xDC,
-        0x32, 0x10, 0x76, 0x54,
-        // data length
-        0x00, 0x0c,
-        // data
-        'h',  'e',  'l',  'l',
-        'o',  ' ',  'w',  'o',
-        'r',  'l',  'd',  '!',
-    };
-
-  unsigned char packet_cid_be39[] = {
-        // public flags (8 byte connection_id)
-        0x38,
-        // connection_id
         0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
         // packet number
         0x12, 0x34, 0x56, 0x78,
@@ -1743,11 +1333,9 @@
     };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_FALSE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
 }
@@ -1758,31 +1346,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFE,
-    // stream id
-    0x04, 0x03, 0x02,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -1807,31 +1370,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xFE,
-    // stream id
-    0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -1853,11 +1391,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1875,7 +1411,9 @@
 
   // Now test framing boundaries.
   const size_t stream_id_size = 3;
-  CheckStreamFrameBoundaries(packets[index], stream_id_size, !kIncludeVersion);
+  CheckStreamFrameBoundaries(
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39, stream_id_size,
+      !kIncludeVersion);
 }
 
 TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
@@ -1884,31 +1422,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFD,
-    // stream id
-    0x04, 0x03,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -1929,32 +1442,7 @@
     'r',  'l',  'd',  '!',
   };
 
-  unsigned char packet39[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
-      // frame type (stream frame with fin)
-      0xFD,
-      // stream id
-      0x03, 0x04,
-      // offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
-      // data length
-      0x00, 0x0c,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-    };
-
-    unsigned char packet_cid_be39[] = {
+    unsigned char packet39[] = {
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
@@ -1979,11 +1467,9 @@
     };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2001,7 +1487,9 @@
 
   // Now test framing boundaries.
   const size_t stream_id_size = 2;
-  CheckStreamFrameBoundaries(packets[index], stream_id_size, !kIncludeVersion);
+  CheckStreamFrameBoundaries(
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39, stream_id_size,
+      !kIncludeVersion);
 }
 
 TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
@@ -2010,31 +1498,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFC,
-    // stream id
-    0x04,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -2055,32 +1518,7 @@
     'r',  'l',  'd',  '!',
   };
 
-  unsigned char packet39[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
-      // frame type (stream frame with fin)
-      0xFC,
-      // stream id
-      0x04,
-      // offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
-      // data length
-      0x00, 0x0c,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-    };
-
-    unsigned char packet_cid_be39[] = {
+    unsigned char packet39[] = {
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
@@ -2105,11 +1543,9 @@
     };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2127,7 +1563,9 @@
 
   // Now test framing boundaries.
   const size_t stream_id_size = 1;
-  CheckStreamFrameBoundaries(packets[index], stream_id_size, !kIncludeVersion);
+  CheckStreamFrameBoundaries(
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39, stream_id_size,
+      !kIncludeVersion);
 }
 
 TEST_P(QuicFramerTest, StreamFrameWithVersion) {
@@ -2136,33 +1574,6 @@
     // public flags (version, 8 byte connection_id)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -2185,34 +1596,7 @@
     'r',  'l',  'd',  '!',
   };
 
-  unsigned char packet39[] = {
-      // public flags (version, 8 byte connection_id)
-      0x39,
-      // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // version tag
-      'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-      // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
-      // frame type (stream frame with fin)
-      0xFF,
-      // stream id
-      0x01, 0x02, 0x03, 0x04,
-      // offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
-      // data length
-      0x00, 0x0c,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-    };
-
-    unsigned char packet_cid_be39[] = {
+    unsigned char packet39[] = {
       // public flags (version, 8 byte connection_id)
       0x39,
       // connection_id
@@ -2239,11 +1623,9 @@
     };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2261,8 +1643,9 @@
   CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
 
   // Now test framing boundaries.
-  CheckStreamFrameBoundaries(packets[index], kQuicMaxStreamIdSize,
-                             kIncludeVersion);
+  CheckStreamFrameBoundaries(
+      framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
+      kQuicMaxStreamIdSize, kIncludeVersion);
 }
 
 TEST_P(QuicFramerTest, RejectPacket) {
@@ -2273,31 +1656,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56,
-      0x34, 0x12,
-
-      // frame type (stream frame with fin)
-      0xFF,
-      // stream id
-      0x04, 0x03, 0x02, 0x01,
-      // offset
-      0x54, 0x76, 0x10, 0x32,
-      0xDC, 0xFE, 0x98, 0xBA,
-      // data length
-      0x0c, 0x00,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0xBC, 0x9A, 0x78, 0x56,
@@ -2322,31 +1680,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78,
-      0x9A, 0xBC,
-
-      // frame type (stream frame with fin)
-      0xFF,
-      // stream id
-      0x01, 0x02, 0x03, 0x04,
-      // offset
-      0xBA, 0x98, 0xFE, 0xDC,
-      0x32, 0x10, 0x76, 0x54,
-      // data length
-      0x00, 0x0c,
-      // data
-      'h',  'e',  'l',  'l',
-      'o',  ' ',  'w',  'o',
-      'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0x12, 0x34, 0x56, 0x78,
@@ -2368,11 +1701,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2392,26 +1723,11 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2425,27 +1741,6 @@
       // public flags (8 byte connection_id)
       0x3C,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
-      // frame type (ack frame)
-      // (one ack block, 2 byte largest observed, 2 byte block length)
-      0x45,
-      // largest acked
-      0x34, 0x12,
-      // Zero delta time.
-      0x00, 0x00,
-      // first ack block length.
-      0x34, 0x12,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x3C,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -2467,27 +1762,6 @@
       // public flags (8 byte connection_id)
       0x3C,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
-      // frame type (ack frame)
-      // (one ack block, 2 byte largest observed, 2 byte block length)
-      0x45,
-      // largest acked
-      0x12, 0x34,
-      // Zero delta time.
-      0x00, 0x00,
-      // first ack block length.
-      0x12, 0x34,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (8 byte connection_id)
-      0x3C,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
@@ -2505,12 +1779,9 @@
       0x00,
   };
   // clang-format on
-
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2546,7 +1817,7 @@
       expected_error = "Unable to read num received packets.";
     }
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -2560,53 +1831,6 @@
       // public flags (8 byte connection_id)
       0x3C,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
-      // frame type (ack frame)
-      // (more than one ack block, 2 byte largest observed, 2 byte block length)
-      0x65,
-      // largest acked
-      0x34, 0x12,
-      // Zero delta time.
-      0x00, 0x00,
-      // num ack blocks ranges.
-      0x04,
-      // first ack block length.
-      0x01, 0x00,
-      // gap to next block.
-      0x01,
-      // ack block length.
-      0xaf, 0x0e,
-      // gap to next block.
-      0xff,
-      // ack block length.
-      0x00, 0x00,
-      // gap to next block.
-      0x91,
-      // ack block length.
-      0xea, 0x01,
-      // gap to next block.
-      0x05,
-      // ack block length.
-      0x04, 0x00,
-      // Number of timestamps.
-      0x02,
-      // Delta from largest observed.
-      0x01,
-      // Delta time.
-      0x10, 0x32, 0x54, 0x76,
-      // Delta from largest observed.
-      0x02,
-      // Delta time.
-      0x10, 0x32,
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x3C,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -2654,53 +1878,6 @@
       // public flags (8 byte connection_id)
       0x3C,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
-      // frame type (ack frame)
-      // (more than one ack block, 2 byte largest observed, 2 byte block length)
-      0x65,
-      // largest acked
-      0x12, 0x34,
-      // Zero delta time.
-      0x00, 0x00,
-      // num ack blocks ranges.
-      0x04,
-      // first ack block length.
-      0x00, 0x01,
-      // gap to next block.
-      0x01,
-      // ack block length.
-      0x0e, 0xaf,
-      // gap to next block.
-      0xff,
-      // ack block length.
-      0x00, 0x00,
-      // gap to next block.
-      0x91,
-      // ack block length.
-      0x01, 0xea,
-      // gap to next block.
-      0x05,
-      // ack block length.
-      0x00, 0x04,
-      // Number of timestamps.
-      0x02,
-      // Delta from largest observed.
-      0x01,
-      // Delta time.
-      0x76, 0x54, 0x32, 0x10,
-      // Delta from largest observed.
-      0x02,
-      // Delta time.
-      0x32, 0x10,
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (8 byte connection_id)
-      0x3C,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
@@ -2744,12 +1921,9 @@
       0x32, 0x10,
   };
   // clang-format on
-
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2836,7 +2010,7 @@
     }
 
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -2850,22 +2024,6 @@
     // public flags (8 byte connection_id)
     0x3C,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xA8, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-    // frame type (stop waiting frame)
-    0x06,
-    // least packet number awaiting an ack, delta from packet number.
-    0x08, 0x00, 0x00, 0x00,
-    0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x3C,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xA8, 0x9A, 0x78, 0x56,
@@ -2881,22 +2039,6 @@
     // public flags (8 byte connection_id)
     0x3C,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xA8,
-    // frame type (stop waiting frame)
-    0x06,
-    // least packet number awaiting an ack, delta from packet number.
-    0x00, 0x00, 0x00, 0x00,
-    0x00, 0x08,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x3C,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -2909,11 +2051,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -2931,7 +2071,7 @@
     string expected_error;
     expected_error = "Unable to read least unacked delta.";
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -2945,29 +2085,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (rst stream frame)
-    0x01,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-
-    // sent byte offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-
-    // error code
-    0x01, 0x00, 0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -2990,29 +2107,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (rst stream frame)
-    0x01,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-
-    // sent byte offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-
-    // error code
-    0x00, 0x00, 0x00, 0x01,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -3032,11 +2126,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -3062,7 +2154,7 @@
       expected_error = "Unable to read rst stream error code.";
     }
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -3076,30 +2168,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (connection close frame)
-    0x02,
-    // error code
-    0x11, 0x00, 0x00, 0x00,
-
-    // error details length
-    0x0d, 0x00,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -3123,30 +2191,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (connection close frame)
-    0x02,
-    // error code
-    0x00, 0x00, 0x00, 0x11,
-
-    // error details length
-    0x00, 0x0d,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -3167,11 +2211,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -3196,7 +2238,7 @@
       expected_error = "Unable to read connection close error details.";
     }
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -3210,31 +2252,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (go away frame)
-    0x03,
-    // error code
-    0x09, 0x00, 0x00, 0x00,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // error details length
-    0x0d, 0x00,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -3259,31 +2276,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (go away frame)
-    0x03,
-    // error code
-    0x00, 0x00, 0x00, 0x09,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // error details length
-    0x00, 0x0d,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -3305,11 +2297,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -3335,7 +2325,7 @@
       expected_error = "Unable to read goaway reason.";
     }
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -3346,25 +2336,6 @@
 TEST_P(QuicFramerTest, WindowUpdateFrame) {
   // clang-format off
   unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (window update frame)
-    0x04,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // byte offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-  };
-
-  unsigned char packet_cid_be[] = {
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
@@ -3383,25 +2354,6 @@
     };
 
   unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (window update frame)
-    0x04,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // byte offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-  };
-
-  unsigned char packet_cid_be39[] = {
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
@@ -3420,11 +2372,9 @@
     };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -3445,7 +2395,7 @@
       expected_error = "Unable to read window byte_offset.";
     }
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -3456,22 +2406,6 @@
 TEST_P(QuicFramerTest, BlockedFrame) {
   // clang-format off
   unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (blocked frame)
-    0x05,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-  };
-
-  unsigned char packet_cid_be[] = {
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
@@ -3487,22 +2421,6 @@
     };
 
   unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (blocked frame)
-    0x05,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-  };
-
-  unsigned char packet_cid_be39[] = {
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
@@ -3518,11 +2436,9 @@
     };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -3537,7 +2453,7 @@
        ++i) {
     string expected_error = "Unable to read stream_id.";
     CheckProcessingFails(
-        packets[index],
+        framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
         i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
                                 !kIncludeVersion, !kIncludeDiversificationNonce,
                                 PACKET_6BYTE_PACKET_NUMBER),
@@ -3548,20 +2464,6 @@
 TEST_P(QuicFramerTest, PingFrame) {
   // clang-format off
   unsigned char packet[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (ping frame)
-    0x07,
-  };
-
-  unsigned char packet_cid_be[] = {
      // public flags (8 byte connection_id)
      0x38,
      // connection_id
@@ -3575,20 +2477,6 @@
     };
 
   unsigned char packet39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (ping frame)
-    0x07,
-  };
-
-  unsigned char packet_cid_be39[] = {
      // public flags (8 byte connection_id)
      0x38,
      // connection_id
@@ -3602,11 +2490,9 @@
     };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
 
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -3625,32 +2511,6 @@
     // public flags (public reset, 8 byte connection_id)
     0x0A,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (2) + padding
-    0x02, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // tag kRSEQ
-    'R', 'S', 'E', 'Q',
-    // end offset 16
-    0x10, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-    // rejected packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12, 0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (public reset, 8 byte connection_id)
-    0x0A,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // message tag (kPRST)
     'P', 'R', 'S', 'T',
@@ -3673,15 +2533,7 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.public_reset_packet_.get());
@@ -3695,41 +2547,20 @@
       visitor_.public_reset_packet_->client_address.host().address_family());
 
   // Now test framing boundaries.
-  if (!QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())) {
-    for (size_t i = 0; i < arraysize(packet); ++i) {
-      string expected_error;
-      QUIC_DLOG(INFO) << "iteration: " << i;
-      if (i < kConnectionIdOffset) {
-        expected_error = "Unable to read public flags.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PACKET_HEADER);
-      } else if (i < kPublicResetPacketMessageTagOffset) {
-        expected_error = "Unable to read ConnectionId.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PACKET_HEADER);
-      } else {
-        expected_error = "Unable to read reset message.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PUBLIC_RST_PACKET);
-      }
-    }
-    return;
-  }
-
-  for (size_t i = 0; i < arraysize(packet_cid_be); ++i) {
+  for (size_t i = 0; i < arraysize(packet); ++i) {
     string expected_error;
     QUIC_DLOG(INFO) << "iteration: " << i;
     if (i < kConnectionIdOffset) {
       expected_error = "Unable to read public flags.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PACKET_HEADER);
     } else if (i < kPublicResetPacketMessageTagOffset) {
       expected_error = "Unable to read ConnectionId.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PACKET_HEADER);
     } else {
       expected_error = "Unable to read reset message.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PUBLIC_RST_PACKET);
     }
   }
@@ -3743,32 +2574,6 @@
     // public flags (public reset, 8 byte connection_id)
     0x0E,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (2) + padding
-    0x02, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // tag kRSEQ
-    'R', 'S', 'E', 'Q',
-    // end offset 16
-    0x10, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-    // rejected packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12, 0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (public reset, 8 byte connection_id)
-    0x0E,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // message tag (kPRST)
     'P', 'R', 'S', 'T',
@@ -3791,15 +2596,7 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.public_reset_packet_.get());
@@ -3813,41 +2610,20 @@
       visitor_.public_reset_packet_->client_address.host().address_family());
 
   // Now test framing boundaries.
-  if (!QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())) {
-    for (size_t i = 0; i < arraysize(packet); ++i) {
-      string expected_error;
-      QUIC_DLOG(INFO) << "iteration: " << i;
-      if (i < kConnectionIdOffset) {
-        expected_error = "Unable to read public flags.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PACKET_HEADER);
-      } else if (i < kPublicResetPacketMessageTagOffset) {
-        expected_error = "Unable to read ConnectionId.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PACKET_HEADER);
-      } else {
-        expected_error = "Unable to read reset message.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PUBLIC_RST_PACKET);
-      }
-    }
-    return;
-  }
-
-  for (size_t i = 0; i < arraysize(packet_cid_be); ++i) {
+  for (size_t i = 0; i < arraysize(packet); ++i) {
     string expected_error;
     QUIC_DLOG(INFO) << "iteration: " << i;
     if (i < kConnectionIdOffset) {
       expected_error = "Unable to read public flags.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PACKET_HEADER);
     } else if (i < kPublicResetPacketMessageTagOffset) {
       expected_error = "Unable to read ConnectionId.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PACKET_HEADER);
     } else {
       expected_error = "Unable to read reset message.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PUBLIC_RST_PACKET);
     }
   }
@@ -3859,34 +2635,6 @@
     // public flags (public reset, 8 byte connection_id)
     0x0A,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (2) + padding
-    0x02, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // tag kRSEQ
-    'R', 'S', 'E', 'Q',
-    // end offset 16
-    0x10, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-    // rejected packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12, 0x00, 0x00,
-    // trailing junk
-    'j', 'u', 'n', 'k',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (public reset, 8 byte connection_id)
-    0x0A,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // message tag (kPRST)
     'P', 'R', 'S', 'T',
@@ -3912,14 +2660,8 @@
   // clang-format on
 
   string expected_error = "Unable to read reset message.";
-  CheckProcessingFails(
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? packet_cid_be
-          : packet,
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      expected_error, QUIC_INVALID_PUBLIC_RST_PACKET);
+  CheckProcessingFails(packet, arraysize(packet), expected_error,
+                       QUIC_INVALID_PUBLIC_RST_PACKET);
 }
 
 TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
@@ -3928,40 +2670,6 @@
     // public flags (public reset, 8 byte connection_id)
     0x0A,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (3) + padding
-    0x03, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // tag kRSEQ
-    'R', 'S', 'E', 'Q',
-    // end offset 16
-    0x10, 0x00, 0x00, 0x00,
-    // tag kCADR
-    'C', 'A', 'D', 'R',
-    // end offset 24
-    0x18, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-    // rejected packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12, 0x00, 0x00,
-    // client address: 4.31.198.44:443
-    0x02, 0x00,
-    0x04, 0x1F, 0xC6, 0x2C,
-    0xBB, 0x01,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (public reset, 8 byte connection_id)
-    0x0A,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // message tag (kPRST)
     'P', 'R', 'S', 'T',
@@ -3992,15 +2700,7 @@
   };
   // clang-format on
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.public_reset_packet_.get());
@@ -4014,41 +2714,20 @@
   EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
 
   // Now test framing boundaries.
-  if (!QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())) {
-    for (size_t i = 0; i < arraysize(packet); ++i) {
-      string expected_error;
-      QUIC_DLOG(INFO) << "iteration: " << i;
-      if (i < kConnectionIdOffset) {
-        expected_error = "Unable to read public flags.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PACKET_HEADER);
-      } else if (i < kPublicResetPacketMessageTagOffset) {
-        expected_error = "Unable to read ConnectionId.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PACKET_HEADER);
-      } else {
-        expected_error = "Unable to read reset message.";
-        CheckProcessingFails(packet, i, expected_error,
-                             QUIC_INVALID_PUBLIC_RST_PACKET);
-      }
-    }
-    return;
-  }
-
-  for (size_t i = 0; i < arraysize(packet_cid_be); ++i) {
+  for (size_t i = 0; i < arraysize(packet); ++i) {
     string expected_error;
     QUIC_DLOG(INFO) << "iteration: " << i;
     if (i < kConnectionIdOffset) {
       expected_error = "Unable to read public flags.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PACKET_HEADER);
     } else if (i < kPublicResetPacketMessageTagOffset) {
       expected_error = "Unable to read ConnectionId.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PACKET_HEADER);
     } else {
       expected_error = "Unable to read reset message.";
-      CheckProcessingFails(packet_cid_be, i, expected_error,
+      CheckProcessingFails(packet, i, expected_error,
                            QUIC_INVALID_PUBLIC_RST_PACKET);
     }
   }
@@ -4060,17 +2739,6 @@
     // public flags (version, 8 byte connection_id)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    'Q', '2', '.', '0',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -4080,15 +2748,7 @@
 
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
@@ -4106,11 +2766,7 @@
       expected_error = "Unable to read supported version in negotiation.";
       error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
     }
-    CheckProcessingFails(
-        QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-            ? packet_cid_be
-            : packet,
-        i, expected_error, error_code);
+    CheckProcessingFails(packet, i, expected_error, error_code);
   }
 }
 
@@ -4120,17 +2776,6 @@
     // public flags (version, 8 byte connection_id)
     0x3D,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-    'Q', '2', '.', '0',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (version, 8 byte connection_id)
-    0x3D,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -4140,15 +2785,7 @@
 
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
 
-  QuicEncryptedPacket encrypted(
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet),
-      false);
+  QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
   ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
@@ -4166,11 +2803,7 @@
       expected_error = "Unable to read supported version in negotiation.";
       error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
     }
-    CheckProcessingFails(
-        QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-            ? packet_cid_be
-            : packet,
-        i, expected_error, error_code);
+    CheckProcessingFails(packet, i, expected_error, error_code);
   }
 }
 
@@ -4188,21 +2821,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be[kMaxPacketSize] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -4217,21 +2835,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be39[kMaxPacketSize] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -4243,21 +2846,20 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   uint64_t header_size = GetPacketHeaderSize(
       framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER);
-  memset((packets[index]) + header_size + 1, 0x00,
-         kMaxPacketSize - header_size - 1);
+  memset((framer_.version() <= QUIC_VERSION_38 ? packet : packet39) +
+             header_size + 1,
+         0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildStreamFramePacketWithNewPaddingFrame) {
@@ -4281,35 +2883,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // paddings
-    0x00, 0x00,
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-    // paddings
-    0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -4338,35 +2911,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // paddings
-    0x00, 0x00,
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-    // paddings
-    0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -4392,15 +2936,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
@@ -4418,20 +2960,6 @@
     // public flags (8 byte connection_id and 4 byte packet number)
     0x28,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be[kMaxPacketSize] = {
-    // public flags (8 byte connection_id and 4 byte packet number)
-    0x28,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -4445,20 +2973,6 @@
     // public flags (8 byte connection_id and 4 byte packet number)
     0x28,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x56, 0x78, 0x9A, 0xBC,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be39[kMaxPacketSize] = {
-    // public flags (8 byte connection_id and 4 byte packet number)
-    0x28,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x56, 0x78, 0x9A, 0xBC,
@@ -4469,21 +2983,20 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   uint64_t header_size = GetPacketHeaderSize(
       framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER);
-  memset((packets[index]) + header_size + 1, 0x00,
-         kMaxPacketSize - header_size - 1);
+  memset((framer_.version() <= QUIC_VERSION_38 ? packet : packet39) +
+             header_size + 1,
+         0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
@@ -4501,20 +3014,6 @@
     // public flags (8 byte connection_id and 2 byte packet number)
     0x18,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be[kMaxPacketSize] = {
-    // public flags (8 byte connection_id and 2 byte packet number)
-    0x18,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A,
@@ -4528,20 +3027,6 @@
     // public flags (8 byte connection_id and 2 byte packet number)
     0x18,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x9A, 0xBC,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be39[kMaxPacketSize] = {
-    // public flags (8 byte connection_id and 2 byte packet number)
-    0x18,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x9A, 0xBC,
@@ -4552,21 +3037,20 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   uint64_t header_size = GetPacketHeaderSize(
       framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER);
-  memset((packets[index]) + header_size + 1, 0x00,
-         kMaxPacketSize - header_size - 1);
+  memset((framer_.version() <= QUIC_VERSION_38 ? packet : packet39) +
+             header_size + 1,
+         0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
@@ -4584,20 +3068,6 @@
     // public flags (8 byte connection_id and 1 byte packet number)
     0x08,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC,
-
-    // frame type (padding frame)
-    0x00,
-    0x00, 0x00, 0x00, 0x00
-  };
-
-  unsigned char packet_cid_be[kMaxPacketSize] = {
-    // public flags (8 byte connection_id and 1 byte packet number)
-    0x08,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC,
@@ -4611,24 +3081,14 @@
   uint64_t header_size = GetPacketHeaderSize(
       framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER);
-  memset((QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet) +
-             header_size + 1,
-         0x00, kMaxPacketSize - header_size - 1);
+  memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(),
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet));
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildStreamFramePacket) {
@@ -4648,29 +3108,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin and no length)
-    0xDF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -4693,29 +3130,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin and no length)
-    0xDF,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -4735,15 +3149,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
@@ -4763,27 +3175,6 @@
       static_cast<unsigned char>(
           FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D),
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // version tag
-      'Q', '0',  GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
-      // frame type (stream frame with fin and no length)
-      0xDF,
-      // stream id
-      0x04, 0x03, 0x02, 0x01,
-      // offset
-      0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA,
-      // data
-      'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (version, 8 byte connection_id)
-      static_cast<unsigned char>(
-          FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D),
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // version tag
       'Q', '0',  GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -4805,27 +3196,6 @@
       static_cast<unsigned char>(
           FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D),
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // version tag
-      'Q', '0',  GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-      // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
-      // frame type (stream frame with fin and no length)
-      0xDF,
-      // stream id
-      0x01, 0x02, 0x03, 0x04,
-      // offset
-      0xBA, 0x98, 0xFE, 0xDC, 0x32, 0x10, 0x76, 0x54,
-      // data
-      'h',  'e',  'l',  'l',  'o',  ' ',  'w',  'o',  'r', 'l', 'd', '!',
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (version, 8 byte connection_id)
-      static_cast<unsigned char>(
-          FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D),
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // version tag
       'Q', '0',  GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -4843,16 +3213,14 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-
   QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
@@ -4861,15 +3229,6 @@
       // public flags (version, 8 byte connection_id)
       0x0D,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // version tag
-      'Q', '0',  GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (version, 8 byte connection_id)
-      0x0D,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // version tag
       'Q', '0',  GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
@@ -4880,15 +3239,9 @@
   std::unique_ptr<QuicEncryptedPacket> data(
       framer_.BuildVersionNegotiationPacket(connection_id,
                                             SupportedVersions(GetParam())));
-  test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(),
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet));
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
@@ -4911,27 +3264,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
-      // frame type (ack frame)
-      // (no ack blocks, 2 byte largest observed, 2 byte block length)
-      0x45,
-      // largest acked
-      0x34, 0x12,
-      // Zero delta time.
-      0x00, 0x00,
-      // first ack block length.
-      0x34, 0x12,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -4953,27 +3285,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
-      // frame type (ack frame)
-      // (no ack blocks, 2 byte largest observed, 2 byte block length)
-      0x45,
-      // largest acked
-      0x12, 0x34,
-      // Zero delta time.
-      0x00, 0x00,
-      // first ack block length.
-      0x12, 0x34,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
@@ -4992,15 +3303,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
@@ -5026,45 +3335,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
-      // frame type (ack frame)
-      // (has ack blocks, 2 byte largest observed, 2 byte block length)
-      0x65,
-      // largest acked
-      0x34, 0x12,
-      // Zero delta time.
-      0x00, 0x00,
-      // num ack blocks ranges.
-      0x04,
-      // first ack block length.
-      0x01, 0x00,
-      // gap to next block.
-      0x01,
-      // ack block length.
-      0xaf, 0x0e,
-      // gap to next block.
-      0xff,
-      // ack block length.
-      0x00, 0x00,
-      // gap to next block.
-      0x91,
-      // ack block length.
-      0xea, 0x01,
-      // gap to next block.
-      0x05,
-      // ack block length.
-      0x04, 0x00,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -5104,45 +3374,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
-      // frame type (ack frame)
-      // (has ack blocks, 2 byte largest observed, 2 byte block length)
-      0x65,
-      // largest acked
-      0x12, 0x34,
-      // Zero delta time.
-      0x00, 0x00,
-      // num ack blocks ranges.
-      0x04,
-      // first ack block length.
-      0x00, 0x01,
-      // gap to next block.
-      0x01,
-      // ack block length.
-      0x0e, 0xaf,
-      // gap to next block.
-      0xff,
-      // ack block length.
-      0x00, 0x00,
-      // gap to next block.
-      0x91,
-      // ack block length.
-      0x01, 0xea,
-      // gap to next block.
-      0x05,
-      // ack block length.
-      0x00, 0x04,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
@@ -5179,15 +3410,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
@@ -5214,99 +3443,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-      // frame type (ack frame)
-      // (has ack blocks, 2 byte largest observed, 2 byte block length)
-      0x65,
-      // largest acked
-      0x34, 0x12,
-      // Zero delta time.
-      0x00, 0x00,
-      // num ack blocks ranges.
-      0xff,
-      // first ack block length.
-      0xdd, 0x0f,
-      // 255 = 4 * 63 + 3
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -5400,99 +3536,6 @@
       // public flags (8 byte connection_id)
       0x38,
       // connection_id
-      0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
-      // packet number
-      0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-      // frame type (ack frame)
-      // (has ack blocks, 2 byte largest observed, 2 byte block length)
-      0x65,
-      // largest acked
-      0x12, 0x34,
-      // Zero delta time.
-      0x00, 0x00,
-      // num ack blocks ranges.
-      0xff,
-      // first ack block length.
-      0x0f, 0xdd,
-      // 255 = 4 * 63 + 3
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01,
-      // num timestamps.
-      0x00,
-  };
-
-  unsigned char packet_cid_be39[] = {
-      // public flags (8 byte connection_id)
-      0x38,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
       // packet number
       0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
@@ -5583,15 +3626,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
@@ -5611,22 +3652,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
-
-    // frame type (stop waiting frame)
-    0x06,
-    // least packet number awaiting an ack, delta from packet number.
-    0x1C, 0x00, 0x00, 0x00,
-    0x00, 0x00,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
@@ -5642,22 +3667,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
-
-    // frame type (stop waiting frame)
-    0x06,
-    // least packet number awaiting an ack, delta from packet number.
-    0x00, 0x00, 0x00, 0x00,
-    0x00, 0x1C,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC,
@@ -5670,15 +3679,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
@@ -5698,27 +3705,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (rst stream frame)
-    0x01,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // sent byte offset
-    0x01, 0x02, 0x03, 0x04,
-    0x05, 0x06, 0x07, 0x08,
-    // error code
-    0x08, 0x07, 0x06, 0x05,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -5739,27 +3725,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (rst stream frame)
-    0x01,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // sent byte offset
-    0x08, 0x07, 0x06, 0x05,
-    0x04, 0x03, 0x02, 0x01,
-    // error code
-    0x05, 0x06, 0x07, 0x08,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -5777,17 +3742,15 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   QuicFrames frames = {QuicFrame(&rst_frame)};
 
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildCloseFramePacket) {
@@ -5808,29 +3771,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (connection close frame)
-    0x02,
-    // error code
-    0x08, 0x07, 0x06, 0x05,
-    // error details length
-    0x0d, 0x00,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -5853,29 +3793,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (connection close frame)
-    0x02,
-    // error code
-    0x05, 0x06, 0x07, 0x08,
-    // error details length
-    0x00, 0x0d,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -5895,15 +3812,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildGoAwayPacket) {
@@ -5925,31 +3840,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (go away frame)
-    0x03,
-    // error code
-    0x08, 0x07, 0x06, 0x05,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // error details length
-    0x0d, 0x00,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -5974,31 +3864,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (go away frame)
-    0x03,
-    // error code
-    0x05, 0x06, 0x07, 0x08,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // error details length
-    0x00, 0x0d,
-    // error details
-    'b',  'e',  'c',  'a',
-    'u',  's',  'e',  ' ',
-    'I',  ' ',  'c',  'a',
-    'n',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -6020,15 +3885,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
@@ -6049,25 +3912,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (window update frame)
-    0x04,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // byte offset
-    0x88, 0x77, 0x66, 0x55,
-    0x44, 0x33, 0x22, 0x11,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -6086,25 +3930,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (window update frame)
-    0x04,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // byte offset
-    0x11, 0x22, 0x33, 0x44,
-    0x55, 0x66, 0x77, 0x88,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -6120,15 +3945,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildBlockedPacket) {
@@ -6148,22 +3971,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (blocked frame)
-    0x05,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -6179,22 +3986,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (blocked frame)
-    0x05,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -6207,15 +3998,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildPingPacket) {
@@ -6232,20 +4021,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (ping frame)
-    0x07,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -6259,20 +4034,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (ping frame)
-    0x07,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -6283,15 +4044,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 // Test that the MTU discovery packet is serialized correctly as a PING packet.
@@ -6309,20 +4068,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (ping frame)
-    0x07,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -6336,20 +4081,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (ping frame)
-    0x07,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -6360,15 +4091,13 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError("constructed packet", data->data(),
-                                      data->length(), AsChars(packets[index]),
-                                      arraysize(packet));
+  test::CompareCharArraysWithHexError(
+      "constructed packet", data->data(), data->length(),
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildPublicResetPacketOld) {
@@ -6384,25 +4113,6 @@
     // public flags (public reset, 8 byte ConnectionId)
     0x0E,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // message tag (kPRST)
-    'P', 'R', 'S', 'T',
-    // num_entries (1) + padding
-    0x01, 0x00, 0x00, 0x00,
-    // tag kRNON
-    'R', 'N', 'O', 'N',
-    // end offset 8
-    0x08, 0x00, 0x00, 0x00,
-    // nonce proof
-    0x89, 0x67, 0x45, 0x23,
-    0x01, 0xEF, 0xCD, 0xAB,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (public reset, 8 byte ConnectionId)
-    0x0E,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // message tag (kPRST)
     'P', 'R', 'S', 'T',
@@ -6421,15 +4131,9 @@
   std::unique_ptr<QuicEncryptedPacket> data(
       framer_.BuildPublicResetPacket(reset_packet));
   ASSERT_TRUE(data != nullptr);
-  test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(),
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet));
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildPublicResetPacket) {
@@ -6445,25 +4149,6 @@
       // public flags (public reset, 8 byte ConnectionId)
       0x0A,
       // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // message tag (kPRST)
-      'P', 'R', 'S', 'T',
-      // num_entries (1) + padding
-      0x01, 0x00, 0x00, 0x00,
-      // tag kRNON
-      'R', 'N', 'O', 'N',
-      // end offset 8
-      0x08, 0x00, 0x00, 0x00,
-      // nonce proof
-      0x89, 0x67, 0x45, 0x23,
-      0x01, 0xEF, 0xCD, 0xAB,
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (public reset, 8 byte ConnectionId)
-      0x0A,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98,
       0x76, 0x54, 0x32, 0x10,
       // message tag (kPRST)
@@ -6484,15 +4169,9 @@
       framer_.BuildPublicResetPacket(reset_packet));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(),
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet));
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, BuildPublicResetPacketWithClientAddress) {
@@ -6510,33 +4189,6 @@
       // public flags (public reset, 8 byte ConnectionId)
       0x0A,
       // connection_id
-      0x10, 0x32, 0x54, 0x76,
-      0x98, 0xBA, 0xDC, 0xFE,
-      // message tag (kPRST)
-      'P', 'R', 'S', 'T',
-      // num_entries (2) + padding
-      0x02, 0x00, 0x00, 0x00,
-      // tag kRNON
-      'R', 'N', 'O', 'N',
-      // end offset 8
-      0x08, 0x00, 0x00, 0x00,
-      // tag kCADR
-      'C', 'A', 'D', 'R',
-      // end offset 16
-      0x10, 0x00, 0x00, 0x00,
-      // nonce proof
-      0x89, 0x67, 0x45, 0x23,
-      0x01, 0xEF, 0xCD, 0xAB,
-      // client address
-      0x02, 0x00,
-      0x7F, 0x00, 0x00, 0x01,
-      0x34, 0x12,
-  };
-
-  unsigned char packet_cid_be[] = {
-      // public flags (public reset, 8 byte ConnectionId)
-      0x0A,
-      // connection_id
       0xFE, 0xDC, 0xBA, 0x98,
       0x76, 0x54, 0x32, 0x10,
       // message tag (kPRST)
@@ -6565,16 +4217,9 @@
       framer_.BuildPublicResetPacket(reset_packet));
   ASSERT_TRUE(data != nullptr);
 
-  test::CompareCharArraysWithHexError(
-      "constructed packet", data->data(), data->length(),
-      AsChars(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-              ? packet_cid_be
-              : packet),
-
-      QuicUtils::IsConnectionIdWireFormatBigEndian(framer_.perspective())
-          ? arraysize(packet_cid_be)
-          : arraysize(packet));
+  test::CompareCharArraysWithHexError("constructed packet", data->data(),
+                                      data->length(), AsChars(packet),
+                                      arraysize(packet));
 }
 
 TEST_P(QuicFramerTest, EncryptPacket) {
@@ -6584,23 +4229,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // redundancy
-    'a',  'b',  'c',  'd',
-    'e',  'f',  'g',  'h',
-    'i',  'j',  'k',  'l',
-    'm',  'n',  'o',  'p',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -6617,23 +4245,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // redundancy
-    'a',  'b',  'c',  'd',
-    'e',  'f',  'g',  'h',
-    'i',  'j',  'k',  'l',
-    'm',  'n',  'o',  'p',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -6646,12 +4257,10 @@
     'm',  'n',  'o',  'p',
   };
   // clang-format on
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
 
   std::unique_ptr<QuicPacket> raw(new QuicPacket(
-      AsChars(packets[index]), arraysize(packet), false,
-      PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER));
   char buffer[kMaxPacketSize];
   size_t encrypted_length = framer_.EncryptPayload(
@@ -6668,25 +4277,6 @@
     // public flags (version, 8 byte connection_id)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '.', '1', '0',
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // redundancy
-    'a',  'b',  'c',  'd',
-    'e',  'f',  'g',  'h',
-    'i',  'j',  'k',  'l',
-    'm',  'n',  'o',  'p',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '.', '1', '0',
@@ -6705,25 +4295,6 @@
     // public flags (version, 8 byte connection_id)
     0x39,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // version tag
-    'Q', '.', '1', '0',
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // redundancy
-    'a',  'b',  'c',  'd',
-    'e',  'f',  'g',  'h',
-    'i',  'j',  'k',  'l',
-    'm',  'n',  'o',  'p',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (version, 8 byte connection_id)
-    0x39,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // version tag
     'Q', '.', '1', '0',
@@ -6739,12 +4310,9 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   std::unique_ptr<QuicPacket> raw(new QuicPacket(
-      AsChars(packets[index]), arraysize(packet), false,
-      PACKET_8BYTE_CONNECTION_ID, kIncludeVersion,
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID, kIncludeVersion,
       !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER));
   char buffer[kMaxPacketSize];
   size_t encrypted_length = framer_.EncryptPayload(
@@ -6862,45 +4430,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-
-    // frame type (ack frame)
-    0x40,
-    // least packet number awaiting an ack
-    0xA0, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-    // largest observed packet number
-    0xBF, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-    // num missing packets
-    0x01,
-    // missing packet
-    0xBE, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -6939,45 +4468,6 @@
     // public flags (8 byte connection_id)
     0x38,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-
-    // frame type (ack frame)
-    0x40,
-    // least packet number awaiting an ack
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xA0,
-    // largest observed packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBF,
-    // num missing packets
-    0x01,
-    // missing packet
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBE,
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x38,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -7013,9 +4503,6 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
   MockFramerVisitor visitor;
   framer_.set_visitor(&visitor);
   EXPECT_CALL(visitor, OnPacket());
@@ -7027,8 +4514,9 @@
   EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
   EXPECT_CALL(visitor, OnDecryptedPacket(_));
 
-  QuicEncryptedPacket encrypted(AsChars(packets[index]), arraysize(packet),
-                                false);
+  QuicEncryptedPacket encrypted(
+      AsChars(framer_.version() <= QUIC_VERSION_38 ? packet : packet39),
+      arraysize(packet), false);
   EXPECT_TRUE(framer_.ProcessPacket(encrypted));
   EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
 }
@@ -7149,33 +4637,6 @@
     // public flags (8 byte connection_id)
     0x3C,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0xBC, 0x9A, 0x78, 0x56,
-    0x34, 0x12,
-    // private flags
-    0x00,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x04, 0x03, 0x02, 0x01,
-    // offset
-    0x54, 0x76, 0x10, 0x32,
-    0xDC, 0xFE, 0x98, 0xBA,
-    // data length
-    0x0c, 0x00,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be[] = {
-    // public flags (8 byte connection_id)
-    0x3C,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0xBC, 0x9A, 0x78, 0x56,
@@ -7202,33 +4663,6 @@
     // public flags (8 byte connection_id)
     0x3C,
     // connection_id
-    0x10, 0x32, 0x54, 0x76,
-    0x98, 0xBA, 0xDC, 0xFE,
-    // packet number
-    0x12, 0x34, 0x56, 0x78,
-    0x9A, 0xBC,
-    // private flags
-    0x00,
-
-    // frame type (stream frame with fin)
-    0xFF,
-    // stream id
-    0x01, 0x02, 0x03, 0x04,
-    // offset
-    0xBA, 0x98, 0xFE, 0xDC,
-    0x32, 0x10, 0x76, 0x54,
-    // data length
-    0x00, 0x0c,
-    // data
-    'h',  'e',  'l',  'l',
-    'o',  ' ',  'w',  'o',
-    'r',  'l',  'd',  '!',
-  };
-
-  unsigned char packet_cid_be39[] = {
-    // public flags (8 byte connection_id)
-    0x3C,
-    // connection_id
     0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
     // packet number
     0x12, 0x34, 0x56, 0x78,
@@ -7252,10 +4686,8 @@
   };
   // clang-format on
 
-  unsigned char* packets[] = {packet, packet_cid_be, packet39, packet_cid_be39};
-  size_t index = GetPacketIndex(framer_.version(), framer_.perspective());
-
-  QuicFramerFuzzFunc(packets[index], arraysize(packet));
+  QuicFramerFuzzFunc(framer_.version() <= QUIC_VERSION_38 ? packet : packet39,
+                     arraysize(packet));
 }
 
 }  // namespace
diff --git a/net/quic/core/quic_sent_packet_manager.cc b/net/quic/core/quic_sent_packet_manager.cc
index 7233e52..5c334833 100644
--- a/net/quic/core/quic_sent_packet_manager.cc
+++ b/net/quic/core/quic_sent_packet_manager.cc
@@ -105,8 +105,7 @@
                           config.GetInitialRoundTripTimeUsToSend())));
   }
   // Configure congestion control.
-  if (FLAGS_quic_reloadable_flag_quic_allow_new_bbr &&
-      config.HasClientRequestedIndependentOption(kTBBR, perspective_)) {
+  if (config.HasClientRequestedIndependentOption(kTBBR, perspective_)) {
     SetSendAlgorithm(kBBR);
   }
   if (config.HasClientRequestedIndependentOption(kRENO, perspective_)) {
diff --git a/net/quic/core/quic_sent_packet_manager_test.cc b/net/quic/core/quic_sent_packet_manager_test.cc
index 25608411..49354b5 100644
--- a/net/quic/core/quic_sent_packet_manager_test.cc
+++ b/net/quic/core/quic_sent_packet_manager_test.cc
@@ -1370,7 +1370,6 @@
 }
 
 TEST_F(QuicSentPacketManagerTest, NegotiateCongestionControlFromOptions) {
-  FLAGS_quic_reloadable_flag_quic_allow_new_bbr = true;
   QuicConfig config;
   QuicTagVector options;
 
@@ -1455,7 +1454,6 @@
 }
 
 TEST_F(QuicSentPacketManagerTest, NegotiateClientCongestionControlFromOptions) {
-  FLAGS_quic_reloadable_flag_quic_allow_new_bbr = true;
   FLAGS_quic_reloadable_flag_quic_enable_pcc = true;
   QuicConfig config;
   QuicTagVector options;
diff --git a/net/quic/core/quic_stream.cc b/net/quic/core/quic_stream.cc
index 94194f4..2aa2ac93 100644
--- a/net/quic/core/quic_stream.cc
+++ b/net/quic/core/quic_stream.cc
@@ -82,8 +82,9 @@
 }
 
 QuicStream::~QuicStream() {
-  QUIC_LOG_IF(WARNING, session_ != nullptr && session_->use_stream_notifier() &&
-                           IsWaitingForAcks())
+  QUIC_DLOG_IF(WARNING, session_ != nullptr &&
+                            session_->use_stream_notifier() &&
+                            IsWaitingForAcks())
       << "Stream destroyed while waiting for acks.";
 }
 
diff --git a/net/quic/core/quic_utils.cc b/net/quic/core/quic_utils.cc
index 62a4cac..078a26ca 100644
--- a/net/quic/core/quic_utils.cc
+++ b/net/quic/core/quic_utils.cc
@@ -210,14 +210,6 @@
 }
 
 // static
-bool QuicUtils::IsConnectionIdWireFormatBigEndian(Perspective perspective) {
-  return (perspective == Perspective::IS_CLIENT &&
-          FLAGS_quic_restart_flag_quic_big_endian_connection_id_client) ||
-         (perspective == Perspective::IS_SERVER &&
-          FLAGS_quic_restart_flag_quic_big_endian_connection_id_server);
-}
-
-// static
 void QuicUtils::CopyToBuffer(QuicIOVector iov,
                              size_t iov_offset,
                              size_t length,
diff --git a/net/quic/core/quic_utils.h b/net/quic/core/quic_utils.h
index 61bff04..52bc8187 100644
--- a/net/quic/core/quic_utils.h
+++ b/net/quic/core/quic_utils.h
@@ -60,12 +60,6 @@
       const QuicSocketAddress& old_address,
       const QuicSocketAddress& new_address);
 
-  // Returns whether connection id needs to be read/write in big endian.
-  // TODO(fayang): Remove this method once deprecating
-  // FLAGS_quic_restart_flag_quic_big_endian_connection_id_client and
-  // FLAGS_quic_restart_flag_quic_big_endian_connection_id_server.
-  static bool IsConnectionIdWireFormatBigEndian(Perspective perspective);
-
   // Copies |length| bytes from iov starting at offset |iov_offset| into buffer.
   // |iov| must be at least iov_offset+length total length and buffer must be
   // at least |length| long.
diff --git a/net/quic/quartc/quartc_factory.cc b/net/quic/quartc/quartc_factory.cc
index c65a86e..08944a5 100644
--- a/net/quic/quartc/quartc_factory.cc
+++ b/net/quic/quartc/quartc_factory.cc
@@ -42,7 +42,7 @@
 
     DCHECK(task_runner_);
     DCHECK(!scheduled_task_);
-    scheduled_task_.reset(task_runner_->Schedule(this, delay_ms).release());
+    scheduled_task_ = task_runner_->Schedule(this, delay_ms);
   }
 
   void CancelImpl() override {
diff --git a/net/quic/test_tools/delayed_verify_strike_register_client.cc b/net/quic/test_tools/delayed_verify_strike_register_client.cc
deleted file mode 100644
index da736d79..0000000
--- a/net/quic/test_tools/delayed_verify_strike_register_client.cc
+++ /dev/null
@@ -1,54 +0,0 @@
-// Copyright 2013 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.
-
-#include "net/quic/test_tools/delayed_verify_strike_register_client.h"
-
-using std::string;
-
-namespace net {
-namespace test {
-
-DelayedVerifyStrikeRegisterClient::DelayedVerifyStrikeRegisterClient(
-    unsigned max_entries,
-    uint32_t current_time_external,
-    uint32_t window_secs,
-    const uint8_t orbit[8],
-    StrikeRegister::StartupType startup)
-    : LocalStrikeRegisterClient(max_entries,
-                                current_time_external,
-                                window_secs,
-                                orbit,
-                                startup),
-      delay_verifications_(false) {}
-
-DelayedVerifyStrikeRegisterClient::~DelayedVerifyStrikeRegisterClient() {}
-
-void DelayedVerifyStrikeRegisterClient::VerifyNonceIsValidAndUnique(
-    QuicStringPiece nonce,
-    QuicWallTime now,
-    ResultCallback* cb) {
-  if (delay_verifications_) {
-    pending_verifications_.push_back(VerifyArgs(nonce, now, cb));
-  } else {
-    LocalStrikeRegisterClient::VerifyNonceIsValidAndUnique(nonce, now, cb);
-  }
-}
-
-int DelayedVerifyStrikeRegisterClient::PendingVerifications() const {
-  return pending_verifications_.size();
-}
-
-void DelayedVerifyStrikeRegisterClient::RunPendingVerifications() {
-  std::vector<VerifyArgs> pending;
-  pending_verifications_.swap(pending);
-  for (std::vector<VerifyArgs>::const_iterator it = pending.begin(),
-                                               end = pending.end();
-       it != end; ++it) {
-    LocalStrikeRegisterClient::VerifyNonceIsValidAndUnique(it->nonce, it->now,
-                                                           it->cb);
-  }
-}
-
-}  // namespace test
-}  // namespace net
diff --git a/net/quic/test_tools/delayed_verify_strike_register_client.h b/net/quic/test_tools/delayed_verify_strike_register_client.h
deleted file mode 100644
index 98be376..0000000
--- a/net/quic/test_tools/delayed_verify_strike_register_client.h
+++ /dev/null
@@ -1,62 +0,0 @@
-// Copyright 2013 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 NET_QUIC_TEST_TOOLS_DELAYED_VERIFY_STRIKE_REGISTER_CLIENT_H_
-#define NET_QUIC_TEST_TOOLS_DELAYED_VERIFY_STRIKE_REGISTER_CLIENT_H_
-
-#include <cstdint>
-#include <string>
-#include <vector>
-
-#include "base/macros.h"
-#include "net/quic/core/crypto/local_strike_register_client.h"
-#include "net/quic/platform/api/quic_string_piece.h"
-
-namespace net {
-namespace test {
-
-// Test helper that allows delaying execution of nonce verification
-// callbacks until a later time.
-class DelayedVerifyStrikeRegisterClient : public LocalStrikeRegisterClient {
- public:
-  DelayedVerifyStrikeRegisterClient(unsigned max_entries,
-                                    uint32_t current_time_external,
-                                    uint32_t window_secs,
-                                    const uint8_t orbit[8],
-                                    StrikeRegister::StartupType startup);
-  ~DelayedVerifyStrikeRegisterClient() override;
-
-  void VerifyNonceIsValidAndUnique(QuicStringPiece nonce,
-                                   QuicWallTime now,
-                                   ResultCallback* cb) override;
-
-  // Start queueing verifications instead of executing them immediately.
-  void StartDelayingVerification() { delay_verifications_ = true; }
-  // Number of verifications that are queued.
-  int PendingVerifications() const;
-  // Run all pending verifications.
-  void RunPendingVerifications();
-
- private:
-  struct VerifyArgs {
-    VerifyArgs(QuicStringPiece in_nonce,
-               QuicWallTime in_now,
-               ResultCallback* in_cb)
-        : nonce(in_nonce.as_string()), now(in_now), cb(in_cb) {}
-
-    std::string nonce;
-    QuicWallTime now;
-    ResultCallback* cb;
-  };
-
-  bool delay_verifications_;
-  std::vector<VerifyArgs> pending_verifications_;
-
-  DISALLOW_COPY_AND_ASSIGN(DelayedVerifyStrikeRegisterClient);
-};
-
-}  // namespace test
-}  // namespace net
-
-#endif  // NET_QUIC_TEST_TOOLS_DELAYED_VERIFY_STRIKE_REGISTER_CLIENT_H_
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc
index e06f266..c339e185 100644
--- a/net/quic/test_tools/quic_test_utils.cc
+++ b/net/quic/test_tools/quic_test_utils.cc
@@ -113,15 +113,6 @@
   }
 }
 
-QuicConnectionId GetPeerInMemoryConnectionId(QuicConnectionId connection_id) {
-  if (FLAGS_quic_restart_flag_quic_big_endian_connection_id_client ==
-      FLAGS_quic_restart_flag_quic_big_endian_connection_id_server) {
-    // Both endpoints have same endianess.
-    return connection_id;
-  }
-  return net::QuicEndian::NetToHost64(connection_id);
-}
-
 MockFramerVisitor::MockFramerVisitor() {
   // By default, we want to accept packets.
   ON_CALL(*this, OnProtocolVersionMismatch(_))
@@ -258,29 +249,23 @@
 MockQuicConnection::MockQuicConnection(MockQuicConnectionHelper* helper,
                                        MockAlarmFactory* alarm_factory,
                                        Perspective perspective)
-    : MockQuicConnection(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)
-              ? QuicEndian::NetToHost64(kTestConnectionId)
-              : kTestConnectionId,
-          QuicSocketAddress(TestPeerIPAddress(), kTestPort),
-          helper,
-          alarm_factory,
-          perspective,
-          AllSupportedVersions()) {}
+    : MockQuicConnection(QuicEndian::NetToHost64(kTestConnectionId),
+                         QuicSocketAddress(TestPeerIPAddress(), kTestPort),
+                         helper,
+                         alarm_factory,
+                         perspective,
+                         AllSupportedVersions()) {}
 
 MockQuicConnection::MockQuicConnection(QuicSocketAddress address,
                                        MockQuicConnectionHelper* helper,
                                        MockAlarmFactory* alarm_factory,
                                        Perspective perspective)
-    : MockQuicConnection(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)
-              ? QuicEndian::NetToHost64(kTestConnectionId)
-              : kTestConnectionId,
-          address,
-          helper,
-          alarm_factory,
-          perspective,
-          AllSupportedVersions()) {}
+    : MockQuicConnection(QuicEndian::NetToHost64(kTestConnectionId),
+                         address,
+                         helper,
+                         alarm_factory,
+                         perspective,
+                         AllSupportedVersions()) {}
 
 MockQuicConnection::MockQuicConnection(QuicConnectionId connection_id,
                                        MockQuicConnectionHelper* helper,
@@ -298,15 +283,12 @@
     MockAlarmFactory* alarm_factory,
     Perspective perspective,
     const QuicVersionVector& supported_versions)
-    : MockQuicConnection(
-          QuicUtils::IsConnectionIdWireFormatBigEndian(perspective)
-              ? QuicEndian::NetToHost64(kTestConnectionId)
-              : kTestConnectionId,
-          QuicSocketAddress(TestPeerIPAddress(), kTestPort),
-          helper,
-          alarm_factory,
-          perspective,
-          supported_versions) {}
+    : MockQuicConnection(QuicEndian::NetToHost64(kTestConnectionId),
+                         QuicSocketAddress(TestPeerIPAddress(), kTestPort),
+                         helper,
+                         alarm_factory,
+                         perspective,
+                         supported_versions) {}
 
 MockQuicConnection::MockQuicConnection(
     QuicConnectionId connection_id,
diff --git a/net/quic/test_tools/quic_test_utils.h b/net/quic/test_tools/quic_test_utils.h
index 7553d65..e6aa723 100644
--- a/net/quic/test_tools/quic_test_utils.h
+++ b/net/quic/test_tools/quic_test_utils.h
@@ -178,10 +178,6 @@
 // Compute SHA-1 hash of the supplied std::string.
 std::string Sha1Hash(QuicStringPiece data);
 
-// Given endpoint in memory |connection_id|, returns peer's in memory connection
-// id.
-QuicConnectionId GetPeerInMemoryConnectionId(QuicConnectionId connection_id);
-
 // Simple random number generator used to compute random numbers suitable
 // for pseudo-randomly dropping packets in tests.  It works by computing
 // the sha1 hash of the current seed, and using the first 64 bits as
diff --git a/net/quic/test_tools/simulator/quic_endpoint_test.cc b/net/quic/test_tools/simulator/quic_endpoint_test.cc
index fffd3638..f402908 100644
--- a/net/quic/test_tools/simulator/quic_endpoint_test.cc
+++ b/net/quic/test_tools/simulator/quic_endpoint_test.cc
@@ -15,7 +15,6 @@
 using ::testing::_;
 using ::testing::NiceMock;
 using ::testing::Return;
-using net::test::GetPeerInMemoryConnectionId;
 
 namespace net {
 namespace simulator {
@@ -48,8 +47,7 @@
   QuicEndpoint endpoint_a(&simulator_, "Endpoint A", "Endpoint B",
                           Perspective::IS_CLIENT, 42);
   QuicEndpoint endpoint_b(&simulator_, "Endpoint B", "Endpoint A",
-                          Perspective::IS_SERVER,
-                          GetPeerInMemoryConnectionId(42));
+                          Perspective::IS_SERVER, 42);
   auto link_a = Link(&endpoint_a, switch_.port(1));
   auto link_b = Link(&endpoint_b, switch_.port(2));
 
@@ -84,8 +82,7 @@
   QuicEndpoint endpoint_a(&simulator_, "Endpoint A", "Endpoint B",
                           Perspective::IS_CLIENT, 42);
   QuicEndpoint endpoint_b(&simulator_, "Endpoint B", "Endpoint A",
-                          Perspective::IS_SERVER,
-                          GetPeerInMemoryConnectionId(42));
+                          Perspective::IS_SERVER, 42);
   auto link_a = Link(&endpoint_a, switch_.port(1));
   auto link_b = Link(&endpoint_b, switch_.port(2));
 
@@ -125,8 +122,7 @@
   QuicEndpoint endpoint_a(&simulator_, "Endpoint A", "Endpoint B",
                           Perspective::IS_CLIENT, 42);
   QuicEndpoint endpoint_b(&simulator_, "Endpoint B", "Endpoint A",
-                          Perspective::IS_SERVER,
-                          GetPeerInMemoryConnectionId(42));
+                          Perspective::IS_SERVER, 42);
   auto link_a = Link(&endpoint_a, switch_.port(1));
   auto link_b = Link(&endpoint_b, switch_.port(2));
 
@@ -154,14 +150,11 @@
   auto endpoint_c = QuicMakeUnique<QuicEndpoint>(
       &simulator_, "Endpoint C", "Endpoint D (C)", Perspective::IS_CLIENT, 44);
   auto endpoint_d_a = QuicMakeUnique<QuicEndpoint>(
-      &simulator_, "Endpoint D (A)", "Endpoint A", Perspective::IS_SERVER,
-      GetPeerInMemoryConnectionId(42));
+      &simulator_, "Endpoint D (A)", "Endpoint A", Perspective::IS_SERVER, 42);
   auto endpoint_d_b = QuicMakeUnique<QuicEndpoint>(
-      &simulator_, "Endpoint D (B)", "Endpoint B", Perspective::IS_SERVER,
-      GetPeerInMemoryConnectionId(43));
+      &simulator_, "Endpoint D (B)", "Endpoint B", Perspective::IS_SERVER, 43);
   auto endpoint_d_c = QuicMakeUnique<QuicEndpoint>(
-      &simulator_, "Endpoint D (C)", "Endpoint C", Perspective::IS_SERVER,
-      GetPeerInMemoryConnectionId(44));
+      &simulator_, "Endpoint D (C)", "Endpoint C", Perspective::IS_SERVER, 44);
   QuicEndpointMultiplexer endpoint_d(
       "Endpoint D",
       {endpoint_d_a.get(), endpoint_d_b.get(), endpoint_d_c.get()});
diff --git a/net/tools/quic/chlo_extractor_test.cc b/net/tools/quic/chlo_extractor_test.cc
index 54f5a310..90de56b 100644
--- a/net/tools/quic/chlo_extractor_test.cc
+++ b/net/tools/quic/chlo_extractor_test.cc
@@ -95,8 +95,7 @@
     EXPECT_TRUE(ChloExtractor::Extract(*packet_, versions, &delegate_))
         << QuicVersionToString(version);
     EXPECT_EQ(version, delegate_.version());
-    EXPECT_EQ(GetPeerInMemoryConnectionId(header_.public_header.connection_id),
-              delegate_.connection_id());
+    EXPECT_EQ(header_.public_header.connection_id, delegate_.connection_id());
     EXPECT_EQ(client_hello.DebugString(Perspective::IS_SERVER),
               delegate_.chlo())
         << QuicVersionToString(version);
diff --git a/net/tools/quic/end_to_end_test.cc b/net/tools/quic/end_to_end_test.cc
index 2278c61d..3d1c0ac 100644
--- a/net/tools/quic/end_to_end_test.cc
+++ b/net/tools/quic/end_to_end_test.cc
@@ -88,9 +88,7 @@
              QuicTag congestion_control_tag,
              bool disable_hpack_dynamic_table,
              bool force_hol_blocking,
-             bool use_cheap_stateless_reject,
-             bool connection_id_big_endian_client,
-             bool connection_id_big_endian_server)
+             bool use_cheap_stateless_reject)
       : client_supported_versions(client_supported_versions),
         server_supported_versions(server_supported_versions),
         negotiated_version(negotiated_version),
@@ -100,9 +98,7 @@
         congestion_control_tag(congestion_control_tag),
         disable_hpack_dynamic_table(disable_hpack_dynamic_table),
         force_hol_blocking(force_hol_blocking),
-        use_cheap_stateless_reject(use_cheap_stateless_reject),
-        connection_id_big_endian_client(connection_id_big_endian_client),
-        connection_id_big_endian_server(connection_id_big_endian_server) {}
+        use_cheap_stateless_reject(use_cheap_stateless_reject) {}
 
   friend std::ostream& operator<<(std::ostream& os, const TestParams& p) {
     os << "{ server_supported_versions: "
@@ -118,11 +114,8 @@
        << QuicTagToString(p.congestion_control_tag);
     os << " disable_hpack_dynamic_table: " << p.disable_hpack_dynamic_table;
     os << " force_hol_blocking: " << p.force_hol_blocking;
-    os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject;
-    os << " connection_id_big_endian_client: "
-       << p.connection_id_big_endian_client;
-    os << " connection_id_big_endian_server: "
-       << p.connection_id_big_endian_server << " }";
+    os << " use_cheap_stateless_reject: " << p.use_cheap_stateless_reject
+       << " }";
     return os;
   }
 
@@ -135,8 +128,6 @@
   bool disable_hpack_dynamic_table;
   bool force_hol_blocking;
   bool use_cheap_stateless_reject;
-  bool connection_id_big_endian_client;
-  bool connection_id_big_endian_server;
 };
 
 // Constructs various test permutations.
@@ -162,7 +153,7 @@
 
   // This must be kept in sync with the number of nested for-loops below as it
   // is used to prune the number of tests that are run.
-  const int kMaxEnabledOptions = 7;
+  const int kMaxEnabledOptions = 5;
   int max_enabled_options = 0;
   std::vector<TestParams> params;
   for (bool server_uses_stateless_rejects_if_peer_supported : {true, false}) {
@@ -172,101 +163,84 @@
         for (bool disable_hpack_dynamic_table : {false}) {
           for (bool force_hol_blocking : {true, false}) {
             for (bool use_cheap_stateless_reject : {true, false}) {
-              for (bool connection_id_big_endian_client : {true, false}) {
-                for (bool connection_id_big_endian_server : {true, false}) {
-                  int enabled_options = 0;
-                  if (force_hol_blocking) {
-                    ++enabled_options;
-                  }
-                  if (congestion_control_tag != kQBIC) {
-                    ++enabled_options;
-                  }
-                  if (disable_hpack_dynamic_table) {
-                    ++enabled_options;
-                  }
-                  if (client_supports_stateless_rejects) {
-                    ++enabled_options;
-                  }
-                  if (server_uses_stateless_rejects_if_peer_supported) {
-                    ++enabled_options;
-                  }
-                  if (use_cheap_stateless_reject) {
-                    ++enabled_options;
-                  }
-                  if (connection_id_big_endian_server) {
-                    ++enabled_options;
-                  }
-                  if (connection_id_big_endian_client) {
-                    ++enabled_options;
-                  }
-                  CHECK_GE(kMaxEnabledOptions, enabled_options);
-                  if (enabled_options > max_enabled_options) {
-                    max_enabled_options = enabled_options;
-                  }
+              int enabled_options = 0;
+              if (force_hol_blocking) {
+                ++enabled_options;
+              }
+              if (congestion_control_tag != kQBIC) {
+                ++enabled_options;
+              }
+              if (disable_hpack_dynamic_table) {
+                ++enabled_options;
+              }
+              if (client_supports_stateless_rejects) {
+                ++enabled_options;
+              }
+              if (server_uses_stateless_rejects_if_peer_supported) {
+                ++enabled_options;
+              }
+              if (use_cheap_stateless_reject) {
+                ++enabled_options;
+              }
+              CHECK_GE(kMaxEnabledOptions, enabled_options);
+              if (enabled_options > max_enabled_options) {
+                max_enabled_options = enabled_options;
+              }
 
-                  // Run tests with no options, a single option, or all the
-                  // options enabled to avoid a combinatorial explosion.
-                  if (enabled_options > 1 &&
-                      enabled_options < kMaxEnabledOptions) {
+              // Run tests with no options, a single option, or all the
+              // options enabled to avoid a combinatorial explosion.
+              if (enabled_options > 1 && enabled_options < kMaxEnabledOptions) {
+                continue;
+              }
+
+              for (const QuicVersionVector& client_versions : version_buckets) {
+                CHECK(!client_versions.empty());
+                if (FilterSupportedVersions(client_versions).empty()) {
+                  continue;
+                }
+                // Add an entry for server and client supporting all
+                // versions.
+                params.push_back(TestParams(
+                    client_versions, all_supported_versions,
+                    client_versions.front(), client_supports_stateless_rejects,
+                    server_uses_stateless_rejects_if_peer_supported,
+                    congestion_control_tag, disable_hpack_dynamic_table,
+                    force_hol_blocking, use_cheap_stateless_reject));
+
+                // Run version negotiation tests tests with no options, or
+                // all the options enabled to avoid a combinatorial
+                // explosion.
+                if (enabled_options > 1 &&
+                    enabled_options < kMaxEnabledOptions) {
+                  continue;
+                }
+
+                // Test client supporting all versions and server supporting
+                // 1 version. Simulate an old server and exercise version
+                // downgrade in the client. Protocol negotiation should
+                // occur.  Skip the i = 0 case because it is essentially the
+                // same as the default case.
+                for (size_t i = 1; i < client_versions.size(); ++i) {
+                  QuicVersionVector server_supported_versions;
+                  server_supported_versions.push_back(client_versions[i]);
+                  if (FilterSupportedVersions(server_supported_versions)
+                          .empty()) {
                     continue;
                   }
-
-                  for (const QuicVersionVector& client_versions :
-                       version_buckets) {
-                    CHECK(!client_versions.empty());
-                    if (FilterSupportedVersions(client_versions).empty()) {
-                      continue;
-                    }
-                    // Add an entry for server and client supporting all
-                    // versions.
-                    params.push_back(TestParams(
-                        client_versions, all_supported_versions,
-                        client_versions.front(),
-                        client_supports_stateless_rejects,
-                        server_uses_stateless_rejects_if_peer_supported,
-                        congestion_control_tag, disable_hpack_dynamic_table,
-                        force_hol_blocking, use_cheap_stateless_reject,
-                        connection_id_big_endian_client,
-                        connection_id_big_endian_server));
-
-                    // Run version negotiation tests tests with no options, or
-                    // all the options enabled to avoid a combinatorial
-                    // explosion.
-                    if (enabled_options > 1 &&
-                        enabled_options < kMaxEnabledOptions) {
-                      continue;
-                    }
-
-                    // Test client supporting all versions and server supporting
-                    // 1 version. Simulate an old server and exercise version
-                    // downgrade in the client. Protocol negotiation should
-                    // occur.  Skip the i = 0 case because it is essentially the
-                    // same as the default case.
-                    for (size_t i = 1; i < client_versions.size(); ++i) {
-                      QuicVersionVector server_supported_versions;
-                      server_supported_versions.push_back(client_versions[i]);
-                      if (FilterSupportedVersions(server_supported_versions)
-                              .empty()) {
-                        continue;
-                      }
-                      params.push_back(TestParams(
-                          client_versions, server_supported_versions,
-                          server_supported_versions.front(),
-                          client_supports_stateless_rejects,
-                          server_uses_stateless_rejects_if_peer_supported,
-                          congestion_control_tag, disable_hpack_dynamic_table,
-                          force_hol_blocking, use_cheap_stateless_reject,
-                          connection_id_big_endian_client,
-                          connection_id_big_endian_server));
-                    }  // End of version for loop.
-                  }    // End of 2nd version for loop.
-                }      // End of connection_id_big_endian_server
-              }        // End of connection_id_big_endian_client
-            }          // End of use_cheap_stateless_reject for loop.
-          }            // End of force_hol_blocking loop.
-        }              // End of disable_hpack_dynamic_table for loop.
-      }                // End of congestion_control_tag for loop.
-    }                  // End of client_supports_stateless_rejects for loop.
+                  params.push_back(TestParams(
+                      client_versions, server_supported_versions,
+                      server_supported_versions.front(),
+                      client_supports_stateless_rejects,
+                      server_uses_stateless_rejects_if_peer_supported,
+                      congestion_control_tag, disable_hpack_dynamic_table,
+                      force_hol_blocking, use_cheap_stateless_reject));
+                }  // End of version for loop.
+              }    // End of 2nd version for loop.
+            }      // End of use_cheap_stateless_reject for loop.
+          }        // End of force_hol_blocking loop.
+        }          // End of disable_hpack_dynamic_table for loop.
+      }            // End of congestion_control_tag for loop.
+    }              // End of client_supports_stateless_rejects for loop.
     CHECK_EQ(kMaxEnabledOptions, max_enabled_options);
   }  // End of server_uses_stateless_rejects_if_peer_supported for loop.
   return params;
@@ -334,11 +308,6 @@
 
     AddToCache("/foo", 200, kFooResponseBody);
     AddToCache("/bar", 200, kBarResponseBody);
-
-    FLAGS_quic_restart_flag_quic_big_endian_connection_id_client =
-        GetParam().connection_id_big_endian_client;
-    FLAGS_quic_restart_flag_quic_big_endian_connection_id_server =
-        GetParam().connection_id_big_endian_server;
   }
 
   ~EndToEndTest() override {
@@ -1354,7 +1323,6 @@
 }
 
 TEST_P(EndToEndTest, NegotiateCongestionControl) {
-  FLAGS_quic_reloadable_flag_quic_allow_new_bbr = true;
   ASSERT_TRUE(Initialize());
 
   // For PCC, the underlying implementation may be a stub with a
@@ -2022,8 +1990,7 @@
   QuicConnectionId connection_id =
       client_->client()->session()->connection()->connection_id();
   QuicPublicResetPacket header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(connection_id);
+  header.public_header.connection_id = connection_id;
   header.public_header.reset_flag = true;
   header.public_header.version_flag = false;
   QuicFramer framer(server_supported_versions_, QuicTime::Zero(),
@@ -2055,8 +2022,7 @@
   QuicConnectionId incorrect_connection_id =
       client_->client()->session()->connection()->connection_id() + 1;
   QuicPublicResetPacket header;
-  header.public_header.connection_id =
-      GetPeerInMemoryConnectionId(incorrect_connection_id);
+  header.public_header.connection_id = incorrect_connection_id;
   header.public_header.reset_flag = true;
   header.public_header.version_flag = false;
   QuicFramer framer(server_supported_versions_, QuicTime::Zero(),
@@ -2119,9 +2085,8 @@
   QuicConnectionId incorrect_connection_id =
       client_->client()->session()->connection()->connection_id() + 1;
   std::unique_ptr<QuicEncryptedPacket> packet(
-      QuicFramer::BuildVersionNegotiationPacket(
-          GetPeerInMemoryConnectionId(incorrect_connection_id),
-          server_supported_versions_));
+      QuicFramer::BuildVersionNegotiationPacket(incorrect_connection_id,
+                                                server_supported_versions_));
   testing::NiceMock<MockQuicConnectionDebugVisitor> visitor;
   client_->client()->session()->connection()->set_debug_visitor(&visitor);
   EXPECT_CALL(visitor, OnIncorrectConnectionId(incorrect_connection_id))
diff --git a/net/tools/quic/platform/impl/quic_socket_utils.cc b/net/tools/quic/platform/impl/quic_socket_utils.cc
index 621767c..e188da2e 100644
--- a/net/tools/quic/platform/impl/quic_socket_utils.cc
+++ b/net/tools/quic/platform/impl/quic_socket_utils.cc
@@ -249,7 +249,7 @@
       (kSpaceForIpv4 < kSpaceForIpv6) ? kSpaceForIpv6 : kSpaceForIpv4;
   char cbuf[kSpaceForIp];
   if (!self_address.IsInitialized()) {
-    hdr.msg_control = 0;
+    hdr.msg_control = nullptr;
     hdr.msg_controllen = 0;
   } else {
     hdr.msg_control = cbuf;
diff --git a/net/tools/quic/quic_client_session_test.cc b/net/tools/quic/quic_client_session_test.cc
index df2a8fa6..87ab095 100644
--- a/net/tools/quic/quic_client_session_test.cc
+++ b/net/tools/quic/quic_client_session_test.cc
@@ -347,9 +347,8 @@
   // Verify that a non-decryptable packet doesn't close the connection.
   QuicConnectionId connection_id = session_->connection()->connection_id();
   std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
-      GetPeerInMemoryConnectionId(connection_id), false, false, 100, "data",
-      PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, nullptr,
-      Perspective::IS_SERVER));
+      connection_id, false, false, 100, "data", PACKET_8BYTE_CONNECTION_ID,
+      PACKET_6BYTE_PACKET_NUMBER, nullptr, Perspective::IS_SERVER));
   std::unique_ptr<QuicReceivedPacket> received(
       ConstructReceivedPacket(*packet, QuicTime::Zero()));
   // Change the last byte of the encrypted data.
@@ -373,9 +372,8 @@
   QuicConnectionId connection_id = session_->connection()->connection_id();
   QuicVersionVector versions = {GetParam()};
   std::unique_ptr<QuicEncryptedPacket> packet(ConstructMisFramedEncryptedPacket(
-      GetPeerInMemoryConnectionId(connection_id), false, false, 100, "data",
-      PACKET_8BYTE_CONNECTION_ID, PACKET_6BYTE_PACKET_NUMBER, &versions,
-      Perspective::IS_SERVER));
+      connection_id, false, false, 100, "data", PACKET_8BYTE_CONNECTION_ID,
+      PACKET_6BYTE_PACKET_NUMBER, &versions, Perspective::IS_SERVER));
   std::unique_ptr<QuicReceivedPacket> received(
       ConstructReceivedPacket(*packet, QuicTime::Zero()));
   EXPECT_CALL(*connection_, CloseConnection(_, _, _)).Times(1);
diff --git a/net/tools/quic/quic_dispatcher_test.cc b/net/tools/quic/quic_dispatcher_test.cc
index 55e39e7..95c73c1 100644
--- a/net/tools/quic/quic_dispatcher_test.cc
+++ b/net/tools/quic/quic_dispatcher_test.cc
@@ -257,9 +257,8 @@
                      QuicPacketNumber packet_number) {
     QuicVersionVector versions(SupportedVersions(version));
     std::unique_ptr<QuicEncryptedPacket> packet(ConstructEncryptedPacket(
-        GetPeerInMemoryConnectionId(connection_id), has_version_flag, false,
-        packet_number, data, connection_id_length, packet_number_length,
-        &versions));
+        connection_id, has_version_flag, false, packet_number, data,
+        connection_id_length, packet_number_length, &versions));
     std::unique_ptr<QuicReceivedPacket> received_packet(
         ConstructReceivedPacket(*packet, helper_.GetClock()->Now()));
 
diff --git a/net/tools/quic/quic_time_wait_list_manager_test.cc b/net/tools/quic/quic_time_wait_list_manager_test.cc
index e81ffae..c9e7a8e 100644
--- a/net/tools/quic/quic_time_wait_list_manager_test.cc
+++ b/net/tools/quic/quic_time_wait_list_manager_test.cc
@@ -154,8 +154,7 @@
                                   std::tr1::get<1>(packet_buffer));
     framer.ProcessPacket(encrypted);
     QuicPublicResetPacket packet = visitor.public_reset_packet();
-    return connection_id_ == GetPeerInMemoryConnectionId(
-                                 packet.public_header.connection_id) &&
+    return connection_id_ == packet.public_header.connection_id &&
            packet.public_header.reset_flag &&
            !packet.public_header.version_flag &&
            net::test::TestPeerIPAddress() == packet.client_address.host() &&
diff --git a/services/preferences/public/cpp/pref_store_client.h b/services/preferences/public/cpp/pref_store_client.h
index b4d8245..b7ca96e9 100644
--- a/services/preferences/public/cpp/pref_store_client.h
+++ b/services/preferences/public/cpp/pref_store_client.h
@@ -12,8 +12,6 @@
 
 namespace prefs {
 
-// TODO(tibell): Make PrefObserverStore use PrefStoreClient as a base class.
-
 // An implementation of PrefStore which uses prefs::mojom::PrefStore as
 // the backing store of the preferences.
 //
diff --git a/services/service_manager/background/tests/BUILD.gn b/services/service_manager/background/tests/BUILD.gn
index ad7b6ff..1e37afde 100644
--- a/services/service_manager/background/tests/BUILD.gn
+++ b/services/service_manager/background/tests/BUILD.gn
@@ -32,9 +32,6 @@
   sources = [
     "test.mojom",
   ]
-
-  # TODO(crbug.com/714018): Convert the implementation to use OnceCallback.
-  use_once_callback = false
 }
 
 service("background_service_manager_test_service") {
diff --git a/services/service_manager/background/tests/test_service.cc b/services/service_manager/background/tests/test_service.cc
index 4290dc8..695a4d24 100644
--- a/services/service_manager/background/tests/test_service.cc
+++ b/services/service_manager/background/tests/test_service.cc
@@ -33,9 +33,7 @@
   }
 
   // mojom::TestService
-  void Test(const TestCallback& callback) override {
-    callback.Run();
-  }
+  void Test(TestCallback callback) override { std::move(callback).Run(); }
 
   void BindTestServiceRequest(const BindSourceInfo& source_info,
                               mojom::TestServiceRequest request) {
diff --git a/services/service_manager/connect_params.cc b/services/service_manager/connect_params.cc
index 7947a75..44a6428 100644
--- a/services/service_manager/connect_params.cc
+++ b/services/service_manager/connect_params.cc
@@ -9,7 +9,7 @@
 ConnectParams::ConnectParams() {}
 ConnectParams::~ConnectParams() {
   if (!start_service_callback_.is_null())
-    start_service_callback_.Run(result_, resolved_identity_);
+    std::move(start_service_callback_).Run(result_, resolved_identity_);
 }
 
 }  // namespace service_manager
diff --git a/services/service_manager/connect_params.h b/services/service_manager/connect_params.h
index c0cbf65..7089ed18 100644
--- a/services/service_manager/connect_params.h
+++ b/services/service_manager/connect_params.h
@@ -62,8 +62,8 @@
   }
 
   void set_start_service_callback(
-      const Connector::StartServiceCallback& callback) {
-    start_service_callback_ = callback;
+      mojom::Connector::StartServiceCallback callback) {
+    start_service_callback_ = std::move(callback);
   }
 
   void set_response_data(mojom::ConnectResult result,
diff --git a/services/service_manager/public/cpp/service_context.cc b/services/service_manager/public/cpp/service_context.cc
index 48dcf7db..a8241d8 100644
--- a/services/service_manager/public/cpp/service_context.cc
+++ b/services/service_manager/public/cpp/service_context.cc
@@ -117,10 +117,10 @@
 // ServiceContext, mojom::Service implementation:
 
 void ServiceContext::OnStart(const Identity& identity,
-                             const OnStartCallback& callback) {
+                             OnStartCallback callback) {
   identity_ = identity;
-  callback.Run(std::move(pending_connector_request_),
-               mojo::MakeRequest(&service_control_));
+  std::move(callback).Run(std::move(pending_connector_request_),
+                          mojo::MakeRequest(&service_control_));
   service_->OnStart();
 }
 
@@ -128,9 +128,9 @@
     const BindSourceInfo& source_info,
     const std::string& interface_name,
     mojo::ScopedMessagePipeHandle interface_pipe,
-    const OnBindInterfaceCallback& callback) {
+    OnBindInterfaceCallback callback) {
   // Acknowledge the request regardless of whether it's accepted.
-  callback.Run();
+  std::move(callback).Run();
 
   BinderRegistry* global_registry =
       GetGlobalBinderRegistryForService(identity_.name());
diff --git a/services/service_manager/public/cpp/service_context.h b/services/service_manager/public/cpp/service_context.h
index c524864..808d1c85 100644
--- a/services/service_manager/public/cpp/service_context.h
+++ b/services/service_manager/public/cpp/service_context.h
@@ -124,11 +124,11 @@
   friend class service_manager::Service;
 
   // mojom::Service:
-  void OnStart(const Identity& info, const OnStartCallback& callback) override;
+  void OnStart(const Identity& info, OnStartCallback callback) override;
   void OnBindInterface(const BindSourceInfo& source_info,
                        const std::string& interface_name,
                        mojo::ScopedMessagePipeHandle interface_pipe,
-                       const OnBindInterfaceCallback& callback) override;
+                       OnBindInterfaceCallback callback) override;
 
   void OnConnectionError();
 
diff --git a/services/service_manager/public/interfaces/BUILD.gn b/services/service_manager/public/interfaces/BUILD.gn
index 9cf87d8..e91d473 100644
--- a/services/service_manager/public/interfaces/BUILD.gn
+++ b/services/service_manager/public/interfaces/BUILD.gn
@@ -23,9 +23,6 @@
     "//mojo/common:common_custom_types",
   ]
 
-  # TODO(crbug.com/714018): Convert the implementation to use OnceCallback.
-  use_once_callback = false
-
   # TODO(crbug.com/699569): Convert to use the new JS bindings.
   use_new_js_bindings = false
 }
diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc
index 9d37a60..abaabd5 100644
--- a/services/service_manager/service_manager.cc
+++ b/services/service_manager/service_manager.cc
@@ -409,12 +409,12 @@
   void BindInterface(const service_manager::Identity& in_target,
                      const std::string& interface_name,
                      mojo::ScopedMessagePipeHandle interface_pipe,
-                     const BindInterfaceCallback& callback) override {
+                     BindInterfaceCallback callback) override {
     Identity target = in_target;
     mojom::ConnectResult result =
         ValidateConnectParams(&target, nullptr, nullptr);
     if (!Succeeded(result)) {
-      callback.Run(result, Identity());
+      std::move(callback).Run(result, Identity());
       return;
     }
 
@@ -423,24 +423,24 @@
     params->set_target(target);
     params->set_interface_request_info(interface_name,
                                        std::move(interface_pipe));
-    params->set_start_service_callback(callback);
+    params->set_start_service_callback(std::move(callback));
     service_manager_->Connect(std::move(params));
   }
 
   void StartService(const Identity& in_target,
-                    const StartServiceCallback& callback) override {
+                    StartServiceCallback callback) override {
     Identity target = in_target;
     mojom::ConnectResult result =
         ValidateConnectParams(&target, nullptr, nullptr);
     if (!Succeeded(result)) {
-      callback.Run(result, Identity());
+      std::move(callback).Run(result, Identity());
       return;
     }
 
     std::unique_ptr<ConnectParams> params(new ConnectParams);
     params->set_source(identity_);
     params->set_target(target);
-    params->set_start_service_callback(callback);
+    params->set_start_service_callback(std::move(callback));
     service_manager_->Connect(std::move(params));
   }
 
@@ -448,12 +448,12 @@
       const Identity& in_target,
       mojo::ScopedMessagePipeHandle service_handle,
       mojom::PIDReceiverRequest pid_receiver_request,
-      const StartServiceWithProcessCallback& callback) override {
+      StartServiceWithProcessCallback callback) override {
     Identity target = in_target;
     mojom::ConnectResult result =
         ValidateConnectParams(&target, nullptr, nullptr);
     if (!Succeeded(result)) {
-      callback.Run(result, Identity());
+      std::move(callback).Run(result, Identity());
       return;
     }
 
@@ -465,7 +465,7 @@
     service.Bind(mojom::ServicePtrInfo(std::move(service_handle), 0));
     params->set_client_process_info(std::move(service),
                                     std::move(pid_receiver_request));
-    params->set_start_service_callback(callback);
+    params->set_start_service_callback(std::move(callback));
     service_manager_->Connect(std::move(params));
   }
 
diff --git a/services/service_manager/tests/connect/BUILD.gn b/services/service_manager/tests/connect/BUILD.gn
index 4782e80..79df3ab 100644
--- a/services/service_manager/tests/connect/BUILD.gn
+++ b/services/service_manager/tests/connect/BUILD.gn
@@ -39,9 +39,6 @@
   deps = [
     "//services/service_manager/public/interfaces",
   ]
-
-  # TODO(crbug.com/714018): Convert the implementation to use OnceCallback.
-  use_once_callback = false
 }
 
 service_manifest("manifest") {
diff --git a/services/service_manager/tests/connect/connect_test_app.cc b/services/service_manager/tests/connect/connect_test_app.cc
index ab4ce52c5..8431a9e 100644
--- a/services/service_manager/tests/connect/connect_test_app.cc
+++ b/services/service_manager/tests/connect/connect_test_app.cc
@@ -111,25 +111,25 @@
   }
 
   // test::mojom::ConnectTestService:
-  void GetTitle(const GetTitleCallback& callback) override {
-    callback.Run("APP");
+  void GetTitle(GetTitleCallback callback) override {
+    std::move(callback).Run("APP");
   }
-  void GetInstance(const GetInstanceCallback& callback) override {
-    callback.Run(context()->identity().instance());
+  void GetInstance(GetInstanceCallback callback) override {
+    std::move(callback).Run(context()->identity().instance());
   }
 
   // test::mojom::StandaloneApp:
   void ConnectToAllowedAppInBlockedPackage(
-      const ConnectToAllowedAppInBlockedPackageCallback& callback) override {
+      ConnectToAllowedAppInBlockedPackageCallback callback) override {
     base::RunLoop run_loop;
     test::mojom::ConnectTestServicePtr test_service;
     context()->connector()->BindInterface("connect_test_a", &test_service);
     test_service.set_connection_error_handler(
         base::Bind(&ConnectTestApp::OnConnectionBlocked, base::Unretained(this),
-                   callback, &run_loop));
-    test_service->GetTitle(
-        base::Bind(&ConnectTestApp::OnGotTitle, base::Unretained(this),
-                   callback, &run_loop));
+                   base::Unretained(&callback), &run_loop));
+    test_service->GetTitle(base::Bind(&ConnectTestApp::OnGotTitle,
+                                      base::Unretained(this),
+                                      base::Unretained(&callback), &run_loop));
     {
       // This message is dispatched as a task on the same run loop, so we need
       // to allow nesting in order to pump additional signals.
@@ -139,7 +139,7 @@
     }
   }
   void ConnectToClassInterface(
-      const ConnectToClassInterfaceCallback& callback) override {
+      ConnectToClassInterfaceCallback callback) override {
     test::mojom::ClassInterfacePtr class_interface;
     context()->connector()->BindInterface("connect_test_class_app",
                                           &class_interface);
@@ -161,18 +161,18 @@
           base::MessageLoop::current());
       loop.Run();
     }
-    callback.Run(ping_response, title_response);
+    std::move(callback).Run(ping_response, title_response);
   }
 
   // test::mojom::BlockedInterface:
-  void GetTitleBlocked(const GetTitleBlockedCallback& callback) override {
-    callback.Run("Called Blocked Interface!");
+  void GetTitleBlocked(GetTitleBlockedCallback callback) override {
+    std::move(callback).Run("Called Blocked Interface!");
   }
 
   // test::mojom::UserIdTest:
   void ConnectToClassAppAsDifferentUser(
       const service_manager::Identity& target,
-      const ConnectToClassAppAsDifferentUserCallback& callback) override {
+      ConnectToClassAppAsDifferentUserCallback callback) override {
     context()->connector()->StartService(target);
     mojom::ConnectResult result;
     Identity resolved_identity;
@@ -185,21 +185,20 @@
           base::MessageLoop::current());
       loop.Run();
     }
-    callback.Run(static_cast<int32_t>(result), resolved_identity);
+    std::move(callback).Run(static_cast<int32_t>(result), resolved_identity);
   }
 
   void OnConnectionBlocked(
-      const ConnectToAllowedAppInBlockedPackageCallback& callback,
+      ConnectToAllowedAppInBlockedPackageCallback* callback,
       base::RunLoop* run_loop) {
-    callback.Run("uninitialized");
+    std::move(*callback).Run("uninitialized");
     run_loop->Quit();
   }
 
-  void OnGotTitle(
-      const ConnectToAllowedAppInBlockedPackageCallback& callback,
-      base::RunLoop* run_loop,
-      const std::string& title) {
-    callback.Run(title);
+  void OnGotTitle(ConnectToAllowedAppInBlockedPackageCallback* callback,
+                  base::RunLoop* run_loop,
+                  const std::string& title) {
+    std::move(*callback).Run(title);
     run_loop->Quit();
   }
 
diff --git a/services/service_manager/tests/connect/connect_test_class_app.cc b/services/service_manager/tests/connect/connect_test_class_app.cc
index 1c054ca..fc7dd5a8c 100644
--- a/services/service_manager/tests/connect/connect_test_class_app.cc
+++ b/services/service_manager/tests/connect/connect_test_class_app.cc
@@ -64,17 +64,15 @@
   }
 
   // test::mojom::ConnectTestService:
-  void GetTitle(const GetTitleCallback& callback) override {
-    callback.Run("CLASS APP");
+  void GetTitle(GetTitleCallback callback) override {
+    std::move(callback).Run("CLASS APP");
   }
-  void GetInstance(const GetInstanceCallback& callback) override {
-    callback.Run(context()->identity().instance());
+  void GetInstance(GetInstanceCallback callback) override {
+    std::move(callback).Run(context()->identity().instance());
   }
 
   // test::mojom::ClassInterface:
-  void Ping(const PingCallback& callback) override {
-    callback.Run("PONG");
-  }
+  void Ping(PingCallback callback) override { std::move(callback).Run("PONG"); }
 
   void HandleQuit() { context()->QuitNow(); }
 
diff --git a/services/service_manager/tests/connect/connect_test_exe.cc b/services/service_manager/tests/connect/connect_test_exe.cc
index a57a94b3..d88e8cf 100644
--- a/services/service_manager/tests/connect/connect_test_exe.cc
+++ b/services/service_manager/tests/connect/connect_test_exe.cc
@@ -43,12 +43,12 @@
   }
 
   // ConnectTestService:
-  void GetTitle(const GetTitleCallback& callback) override {
-    callback.Run("connect_test_exe");
+  void GetTitle(GetTitleCallback callback) override {
+    std::move(callback).Run("connect_test_exe");
   }
 
-  void GetInstance(const GetInstanceCallback& callback) override {
-    callback.Run(context()->identity().instance());
+  void GetInstance(GetInstanceCallback callback) override {
+    std::move(callback).Run(context()->identity().instance());
   }
 
   service_manager::BinderRegistry registry_;
diff --git a/services/service_manager/tests/connect/connect_test_package.cc b/services/service_manager/tests/connect/connect_test_package.cc
index 192a0c89..f8a0972 100644
--- a/services/service_manager/tests/connect/connect_test_package.cc
+++ b/services/service_manager/tests/connect/connect_test_package.cc
@@ -109,23 +109,23 @@
   }
 
   // test::mojom::ConnectTestService:
-  void GetTitle(const GetTitleCallback& callback) override {
-    callback.Run(title_);
+  void GetTitle(GetTitleCallback callback) override {
+    std::move(callback).Run(title_);
   }
 
-  void GetInstance(const GetInstanceCallback& callback) override {
-    callback.Run(context()->identity().instance());
+  void GetInstance(GetInstanceCallback callback) override {
+    std::move(callback).Run(context()->identity().instance());
   }
 
   // test::mojom::BlockedInterface:
-  void GetTitleBlocked(const GetTitleBlockedCallback& callback) override {
-    callback.Run("Called Blocked Interface!");
+  void GetTitleBlocked(GetTitleBlockedCallback callback) override {
+    std::move(callback).Run("Called Blocked Interface!");
   }
 
   // test::mojom::UserIdTest:
   void ConnectToClassAppAsDifferentUser(
       const service_manager::Identity& target,
-      const ConnectToClassAppAsDifferentUserCallback& callback) override {
+      ConnectToClassAppAsDifferentUserCallback callback) override {
     context()->connector()->StartService(target);
     mojom::ConnectResult result;
     Identity resolved_identity;
@@ -138,7 +138,7 @@
           base::MessageLoop::current());
       loop.Run();
     }
-    callback.Run(static_cast<int32_t>(result), resolved_identity);
+    std::move(callback).Run(static_cast<int32_t>(result), resolved_identity);
   }
 
   // base::SimpleThread:
@@ -225,12 +225,12 @@
   }
 
   // test::mojom::ConnectTestService:
-  void GetTitle(const GetTitleCallback& callback) override {
-    callback.Run("ROOT");
+  void GetTitle(GetTitleCallback callback) override {
+    std::move(callback).Run("ROOT");
   }
 
-  void GetInstance(const GetInstanceCallback& callback) override {
-    callback.Run(context()->identity().instance());
+  void GetInstance(GetInstanceCallback callback) override {
+    std::move(callback).Run(context()->identity().instance());
   }
 
   void OnConnectionError() {
diff --git a/services/service_manager/tests/lifecycle/BUILD.gn b/services/service_manager/tests/lifecycle/BUILD.gn
index f738aaf..e5bef8b 100644
--- a/services/service_manager/tests/lifecycle/BUILD.gn
+++ b/services/service_manager/tests/lifecycle/BUILD.gn
@@ -36,9 +36,6 @@
   sources = [
     "lifecycle_unittest.mojom",
   ]
-
-  # TODO(crbug.com/714018): Convert the implementation to use OnceCallback.
-  use_once_callback = false
 }
 
 service_manifest("manifest") {
diff --git a/services/service_manager/tests/lifecycle/app_client.cc b/services/service_manager/tests/lifecycle/app_client.cc
index 2df9e51..028ace0a 100644
--- a/services/service_manager/tests/lifecycle/app_client.cc
+++ b/services/service_manager/tests/lifecycle/app_client.cc
@@ -35,8 +35,8 @@
   bindings_.AddBinding(this, std::move(request));
 }
 
-void AppClient::Ping(const PingCallback& callback) {
-  callback.Run();
+void AppClient::Ping(PingCallback callback) {
+  std::move(callback).Run();
 }
 
 void AppClient::GracefulQuit() {
diff --git a/services/service_manager/tests/lifecycle/app_client.h b/services/service_manager/tests/lifecycle/app_client.h
index ca6e157..2202e95 100644
--- a/services/service_manager/tests/lifecycle/app_client.h
+++ b/services/service_manager/tests/lifecycle/app_client.h
@@ -37,7 +37,7 @@
               mojom::LifecycleControlRequest request);
 
   // LifecycleControl:
-  void Ping(const PingCallback& callback) override;
+  void Ping(PingCallback callback) override;
   void GracefulQuit() override;
   void Crash() override;
   void CloseServiceManagerConnection() override;
diff --git a/services/service_manager/tests/lifecycle/package.cc b/services/service_manager/tests/lifecycle/package.cc
index 8e5be519..68c8a8e 100644
--- a/services/service_manager/tests/lifecycle/package.cc
+++ b/services/service_manager/tests/lifecycle/package.cc
@@ -53,9 +53,7 @@
   }
 
   // LifecycleControl:
-  void Ping(const PingCallback& callback) override {
-    callback.Run();
-  }
+  void Ping(PingCallback callback) override { std::move(callback).Run(); }
 
   void GracefulQuit() override {
     service_manager_connection_closed_callback_.Run();
diff --git a/services/service_manager/tests/lifecycle/parent.cc b/services/service_manager/tests/lifecycle/parent.cc
index 80af49bc..b6f85c2 100644
--- a/services/service_manager/tests/lifecycle/parent.cc
+++ b/services/service_manager/tests/lifecycle/parent.cc
@@ -48,7 +48,7 @@
   }
 
   // service_manager::test::mojom::Parent:
-  void ConnectToChild(const ConnectToChildCallback& callback) override {
+  void ConnectToChild(ConnectToChildCallback callback) override {
     service_manager::test::mojom::LifecycleControlPtr lifecycle;
     context()->connector()->BindInterface("lifecycle_unittest_app", &lifecycle);
     {
@@ -58,7 +58,7 @@
           base::MessageLoop::current());
       loop.Run();
     }
-    callback.Run();
+    std::move(callback).Run();
   }
   void Quit() override {
     base::MessageLoop::current()->QuitWhenIdle();
diff --git a/services/service_manager/tests/shutdown/BUILD.gn b/services/service_manager/tests/shutdown/BUILD.gn
index bab6e0f..cdb4bde 100644
--- a/services/service_manager/tests/shutdown/BUILD.gn
+++ b/services/service_manager/tests/shutdown/BUILD.gn
@@ -35,9 +35,6 @@
   sources = [
     "shutdown_unittest.mojom",
   ]
-
-  # TODO(crbug.com/714018): Convert the implementation to use OnceCallback.
-  use_once_callback = false
 }
 
 service_manifest("shutdown_unittest_manifest") {
diff --git a/services/service_manager/tests/shutdown/shutdown_client_app.cc b/services/service_manager/tests/shutdown/shutdown_client_app.cc
index f74a8f1..21996895 100644
--- a/services/service_manager/tests/shutdown/shutdown_client_app.cc
+++ b/services/service_manager/tests/shutdown/shutdown_client_app.cc
@@ -41,7 +41,7 @@
   }
 
   // mojom::ShutdownTestClientController:
-  void ConnectAndWait(const ConnectAndWaitCallback& callback) override {
+  void ConnectAndWait(ConnectAndWaitCallback callback) override {
     mojom::ShutdownTestServicePtr service;
     context()->connector()->BindInterface("shutdown_service", &service);
 
@@ -58,7 +58,7 @@
     client_binding.set_connection_error_handler(run_loop.QuitClosure());
     run_loop.Run();
 
-    callback.Run();
+    std::move(callback).Run();
   }
 
   BinderRegistry registry_;
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
index 8097e9c..ba9621fc 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/inspector-test.js
@@ -557,7 +557,7 @@
     InspectorTest._pageLoadedCallback = InspectorTest.safeWrap(callback);
 
     if (UI.panels.network)
-        UI.panels.network._networkLogView.reset();
+        NetworkLog.networkLog.reset();
     InspectorTest.resourceTreeModel.reloadPage(hardReload, scriptToEvaluateOnLoad);
 }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js
index d4123b5d1..d3a5cef 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network-test.js
@@ -75,14 +75,14 @@
 InspectorTest.waitForNetworkLogViewNodeForRequest = function(request)
 {
     var networkLogView = UI.panels.network._networkLogView;
-    var node = networkLogView._nodesByRequestId.get(request.requestId());
+    var node = networkLogView.nodeForRequest(request);
     if (node)
         return Promise.resolve(node);
 
-    var promise = InspectorTest.waitForEvent(Network.NetworkLogView.Events.UpdateRequest, networkLogView,
-        updateRequest => updateRequest === request);
-    return promise.then(() => {
-        var node = networkLogView._nodesByRequestId.get(request.requestId());
+    console.assert(networkLogView._staleRequests.has(request));
+
+    return InspectorTest.addSnifferPromise(networkLogView, '_didRefreshForTest').then(() => {
+        var node = networkLogView.nodeForRequest(request);
         console.assert(node);
         return node;
     });
@@ -113,7 +113,7 @@
 
 InspectorTest.networkRequests = function()
 {
-    return NetworkLog.networkLog.requests().slice();
+    return Array.from(NetworkLog.networkLog.requests());
 }
 
 InspectorTest.dumpNetworkRequests = function()
@@ -159,10 +159,12 @@
 
     function innerCallback(msg)
     {
-        if (msg.messageText.indexOf("XHR loaded") !== -1)
-            callback();
-        else
+        if (msg.messageText.indexOf("XHR loaded") !== -1) {
+            if (callback)
+                callback();
+        } else {
             InspectorTest.addConsoleSniffer(innerCallback);
+        }
     }
 
     InspectorTest.addConsoleSniffer(innerCallback);
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html
index 516e385..e2dbe34 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters-internals.html
@@ -40,7 +40,7 @@
 
         Network.NetworkPanel.revealAndFilter(filterArray);
 
-        var nodes = UI.panels.network._networkLogView._nodesByRequestId.valuesArray();
+        var nodes = UI.panels.network._networkLogView.flatNodesList();
         var foundNodesCount = 0;
         for (var i = 0; i < nodes.length; i++) {
             if (!nodes[i][Network.NetworkLogView._isFilteredOutSymbol])
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html
index 2fe1e5b..831e3ce 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-filters.html
@@ -75,7 +75,7 @@
 
             setNetworkLogFilter(filterObj.filterText, filterObj.isRegex);
 
-            var nodes = UI.panels.network._networkLogView._nodesByRequestId.valuesArray();
+            var nodes = UI.panels.network._networkLogView.flatNodesList();
             var foundNodesCount = 0;
             for (var i = 0; i < nodes.length; i++) {
                 if (!nodes[i][Network.NetworkLogView._isFilteredOutSymbol])
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html
index c8f083e..37c98c0 100644
--- a/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html
+++ b/third_party/WebKit/LayoutTests/http/tests/inspector/network/network-xhr-replay.html
@@ -29,25 +29,19 @@
         InspectorTest.assertEquals(request1.requestHeadersText, request2.requestHeadersText, "Requests have different requestHeadersText");
     }
 
-    function testXHRReplay(method, url, async, user, password, headers, withCredentials, payload, type, callback)
+    async function testXHRReplay(method, url, async, user, password, headers, withCredentials, payload, type, callback)
     {
-        InspectorTest.makeXHR(method, url, async, user, password, headers, withCredentials, payload, type, step2);
+        InspectorTest.makeXHR(method, url, async, user, password, headers, withCredentials, payload, type);
 
-        var originalRequest;
-        function step2()
-        {
-            originalRequest = lastRequest();
-            dumpRequest(originalRequest);
-            InspectorTest.NetworkAgent.replayXHR(originalRequest.requestId());
-            InspectorTest.addSniffer(Network.NetworkLogView.prototype, "_appendRequest", step3);
-        }
+        var originalRequest = await InspectorTest.waitForEvent(
+                NetworkLog.NetworkLog.Events.RequestAdded, NetworkLog.networkLog);
+        dumpRequest(originalRequest);
+        InspectorTest.NetworkAgent.replayXHR(originalRequest.requestId());
+        var replayedRequest = await InspectorTest.waitForEvent(
+                NetworkLog.NetworkLog.Events.RequestAdded, NetworkLog.networkLog);
 
-        function step3()
-        {
-            var replayedRequest = lastRequest();
-            assertRequestEqual(originalRequest, replayedRequest);
-            callback();
-        }
+        assertRequestEqual(originalRequest, replayedRequest);
+        callback();
     }
 
 
diff --git a/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html b/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html
index 610b327..15dd824 100644
--- a/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html
+++ b/third_party/WebKit/LayoutTests/inspector/network/network-filter-updated-requests.html
@@ -3,7 +3,7 @@
 <script src="../../http/tests/inspector/inspector-test.js"></script>
 <script src="../../http/tests/inspector/network-test.js"></script>
 <script>
-function test() {
+async function test() {
     var target = UI.panels.network._networkLogView;
     var types = Common.resourceTypes;
 
@@ -14,32 +14,33 @@
     var requestFoo = new SDK.NetworkRequest(InspectorTest.networkManager, "", "", "", "", "");
     requestFoo.setResourceType(types.Script);
     requestFoo.setRequestId("foo");
-    target._appendRequest(requestFoo);
+    InspectorTest.networkManager._dispatcher._startNetworkRequest(requestFoo);
+
     var requestBar = new SDK.NetworkRequest(InspectorTest.networkManager, "", "", "", "", "");
     requestBar.setResourceType(types.Script);
     requestBar.setRequestId("bar");
-    target._appendRequest(requestBar);
-    target._refresh();
+    InspectorTest.networkManager._dispatcher._startNetworkRequest(requestBar);
 
-    function isFilteredOut(request) {
-        return !!target._nodesByRequestId.get(request.requestId())[Network.NetworkLogView._isFilteredOutSymbol];
+    async function isFilteredOut(request) {
+        var node = await InspectorTest.waitForNetworkLogViewNodeForRequest(request);
+        return !!node[Network.NetworkLogView._isFilteredOutSymbol];
     }
 
     InspectorTest.addResult("");
-    InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + isFilteredOut(requestFoo));
-    InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + isFilteredOut(requestBar));
+    InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + await isFilteredOut(requestFoo));
+    InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + await isFilteredOut(requestBar));
 
     InspectorTest.addResult("");
     requestFoo.setResourceType(types.XHR);
-    target._refreshRequest(requestFoo);
+    InspectorTest.networkManager._dispatcher._updateNetworkRequest(requestFoo);
     InspectorTest.addResult("Updated request [" + requestFoo.requestId() + "] type.");
-    target._refreshRequest(requestBar);
+    InspectorTest.networkManager._dispatcher._updateNetworkRequest(requestBar);
     InspectorTest.addResult("Updated request [" + requestBar.requestId() + "].");
     target._refresh();
 
     InspectorTest.addResult("");
-    InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + isFilteredOut(requestFoo));
-    InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + isFilteredOut(requestBar));
+    InspectorTest.addResult("Request [" + requestFoo.requestId() + "] of type '" + requestFoo.resourceType().name() + "' is hidden: " + await isFilteredOut(requestFoo));
+    InspectorTest.addResult("Request [" + requestBar.requestId() + "] of type '" + requestBar.resourceType().name() + "' is hidden: " + await isFilteredOut(requestBar));
 
     InspectorTest.completeTest();
 }
diff --git a/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html b/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html
index b4f6e9c..34b35ae 100644
--- a/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html
+++ b/third_party/WebKit/LayoutTests/inspector/network/network-update-calculator-for-all-requests.html
@@ -7,7 +7,7 @@
     var target = UI.panels.network._networkLogView;
     target._resourceCategoryFilterUI._toggleTypeFilter(Common.resourceTypes.XHR.category().title, false);
     InspectorTest.addResult("Clicked '" + Common.resourceTypes.XHR.name() + "' button.");
-    target.reset();
+    target._reset();
 
     function appendRequest(id, type, startTime, endTime)
     {
@@ -16,10 +16,10 @@
         request.setRequestId(id);
         request.setIssueTime(startTime);
         request.endTime = endTime;
-        target._appendRequest(request);
+        InspectorTest.networkManager._dispatcher._startNetworkRequest(request);
         target._refresh();
 
-        var isFilteredOut = !!target._nodesByRequestId.get(request.requestId())[Network.NetworkLogView._isFilteredOutSymbol];
+        var isFilteredOut = !!target.nodeForRequest(request)[Network.NetworkLogView._isFilteredOutSymbol];
         InspectorTest.addResult("");
         InspectorTest.addResult("Appended request [" + request.requestId() + "] of type '" + request.resourceType().name() + "' is hidden: " + isFilteredOut + " from [" + request.startTime + "] to [" + request.endTime + "]");
         InspectorTest.addResult("Timeline: from [" + target._calculator.minimumBoundary() + "] to [" + target._calculator.maximumBoundary() + "]");
diff --git a/third_party/WebKit/LayoutTests/webshare/idl.html b/third_party/WebKit/LayoutTests/webshare/idl.html
index 3495d0a..c5dfede 100644
--- a/third_party/WebKit/LayoutTests/webshare/idl.html
+++ b/third_party/WebKit/LayoutTests/webshare/idl.html
@@ -1,5 +1,5 @@
 <!DOCTYPE html>
-<link rel="help" href="https://github.com/WICG/web-share/blob/master/docs/interface.md">
+<link rel="help" href="https://wicg.github.io/web-share/">
 <script src=../resources/testharness.js></script>
 <script src=../resources/testharnessreport.js></script>
 <script src=../resources/WebIDLParser.js></script>
@@ -9,14 +9,16 @@
     };
 </script>
 <script type="text/plain" id="tested">
-    dictionary ShareData {
-      DOMString? title;
-      DOMString? text;
-      DOMString? url;
-    };
     partial interface Navigator {
+      [SecureContext]
       Promise<void> share(ShareData data);
     };
+
+    dictionary ShareData {
+      USVString title;
+      USVString text;
+      USVString url;
+    };
 </script>
 <script>
     "use strict";
diff --git a/third_party/WebKit/LayoutTests/webshare/share-arity.html b/third_party/WebKit/LayoutTests/webshare/share-arity.html
index a7fc919..a44dca3 100644
--- a/third_party/WebKit/LayoutTests/webshare/share-arity.html
+++ b/third_party/WebKit/LayoutTests/webshare/share-arity.html
@@ -6,10 +6,6 @@
 <script>
 
 share_test((t, webshare, mock) => {
-  return callWithKeyDown(() => promise_rejects(t, new TypeError(), navigator.share()));
-}, '0 arguments (promise rejection)');
-
-share_test((t, webshare, mock) => {
   mock.pushShareResult('the title', 'the message', 'data:the url', webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share({title: 'the title', text: 'the message', url: 'data:the url', unused: 'unexpected field'}));
 }, 'extra ShareData field (extra field ignored)');
diff --git a/third_party/WebKit/LayoutTests/webshare/share-error.html b/third_party/WebKit/LayoutTests/webshare/share-error.html
index 070d9e7..ce81761c 100644
--- a/third_party/WebKit/LayoutTests/webshare/share-error.html
+++ b/third_party/WebKit/LayoutTests/webshare/share-error.html
@@ -8,7 +8,7 @@
 share_test((t, webshare, mock) => {
   mock.pushShareResult('the title', 'the message', 'data:the url',
                        webshare.ShareError.CANCELED);
-  // promise_rejects doesn't test the exception message, so just undefined.
+  // promise_rejects doesn't test the exception message, so just match against undefined.
   return callWithKeyDown(() => promise_rejects(
       t, new DOMException(undefined, 'AbortError'),
       navigator.share({title: 'the title', text: 'the message', url: 'data:the url'})));
diff --git a/third_party/WebKit/LayoutTests/webshare/share-nonutf8-encoding.html b/third_party/WebKit/LayoutTests/webshare/share-nonutf8-encoding.html
new file mode 100644
index 0000000..aeae78e
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/webshare/share-nonutf8-encoding.html
@@ -0,0 +1,21 @@
+<!DOCTYPE html>
+<meta charset="iso-8859-1">
+<script src="../resources/testharness.js"></script>
+<script src="../resources/testharnessreport.js"></script>
+<script src="../resources/mojo-helpers.js"></script>
+<script src="resources/mock-share-service.js"></script>
+<script>
+
+// Exact same test as in share-success.html, with same expectations. This tests
+// that the page's encoding (ISO-8859-1) is ignored and Unicode characters are
+// always percent-encoded in UTF-8.
+share_test((t, webshare, mock) => {
+  const title = 'f\xe1ncy \u5199\u4f5c \ud83d\ude31';
+  const url = 'https://\u6d4b\u8bd5.example.com/\ud83d\udcc4';
+  const url_ascii = 'https://xn--0zwm56d.example.com/%F0%9F%93%84';
+  mock.pushShareResult(title, '\ufffdx', url_ascii, webshare.ShareError.OK);
+  return callWithKeyDown(() => navigator.share(
+        {title: title, text: '\ud9a3x', url: url}));
+}, 'successful share with Unicode characters');
+
+</script>
diff --git a/third_party/WebKit/LayoutTests/webshare/share-success.html b/third_party/WebKit/LayoutTests/webshare/share-success.html
index c16799c1..29ba63d 100644
--- a/third_party/WebKit/LayoutTests/webshare/share-success.html
+++ b/third_party/WebKit/LayoutTests/webshare/share-success.html
@@ -10,7 +10,7 @@
 }
 
 share_test((t, webshare, mock) => {
-  let url = 'https://www.example.com/some/path?some_query#some_fragment';
+  const url = 'https://www.example.com/some/path?some_query#some_fragment';
   mock.pushShareResult('the title', 'the message', getAbsoluteUrl(url),
                        webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share(
@@ -23,33 +23,55 @@
 }, 'successful share with empty ShareData');
 
 share_test((t, webshare, mock) => {
-  let url = '//www.example.com/some/path?some_query#some_fragment';
+  const url = '//www.example.com/some/path?some_query#some_fragment';
   mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share({url: url}));
 }, 'successful share with URL without a scheme');
 
 share_test((t, webshare, mock) => {
-  let url =  '/some/path?some_query#some_fragment';
+  const url =  '/some/path?some_query#some_fragment';
   mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share({url: url}));
 }, 'successful share with a path-only URL');
 
 share_test((t, webshare, mock) => {
-  let url = 'foo';
+  const url = 'foo';
   mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share({url: url}));
 }, 'successful share with a relative URL');
 
 share_test((t, webshare, mock) => {
-  let url = '';
+  const url = '';
   mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share({url: url}));
 }, 'successful share with an empty URL');
 
 share_test((t, webshare, mock) => {
-  let url = 'data:foo';
+  const url = 'data:foo';
   mock.pushShareResult('', '', getAbsoluteUrl(url), webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share({url: url}));
 }, 'successful share with a data URL');
 
+share_test((t, webshare, mock) => {
+  const url = 'http://example.com/foo\\ab%63\r\n\t "<>`{}';
+  // Expect '\' to normalize to '/', "%63" to normalize to 'c', '\r\n\t'
+  // to be removed, and all the other illegal characters to be percent-escaped.
+  const url_encoded = 'http://example.com/foo/abc%20%22%3C%3E%60%7B%7D';
+  mock.pushShareResult('', '', url_encoded, webshare.ShareError.OK);
+  return callWithKeyDown(() => navigator.share({url: url}));
+}, 'successful share with percent-encoded URL characters');
+
+share_test((t, webshare, mock) => {
+  // Title is a string with BMP and non-BMP characters.
+  // Text contains invalid surrogates which should be converted into U+FFFD.
+  // URL contains non-ASCII characters in host and path.
+  const title = 'f\xe1ncy \u5199\u4f5c \ud83d\ude31';
+  const url = 'https://\u6d4b\u8bd5.example.com/\ud83d\udcc4';
+  // Host is IDNA-encoded. Path is percent-encoded.
+  const url_ascii = 'https://xn--0zwm56d.example.com/%F0%9F%93%84';
+  mock.pushShareResult(title, '\ufffdx', url_ascii, webshare.ShareError.OK);
+  return callWithKeyDown(() => navigator.share(
+        {title: title, text: '\ud9a3x', url: url}));
+}, 'successful share with Unicode characters');
+
 </script>
diff --git a/third_party/WebKit/LayoutTests/webshare/share-types.html b/third_party/WebKit/LayoutTests/webshare/share-types.html
index dcdf202..04dd0f6 100644
--- a/third_party/WebKit/LayoutTests/webshare/share-types.html
+++ b/third_party/WebKit/LayoutTests/webshare/share-types.html
@@ -5,9 +5,39 @@
 <script src="resources/mock-share-service.js"></script>
 <script>
 
+function getAbsoluteUrl(url) {
+  return new URL(url, location).toString();
+}
+
+share_test((t, webshare, mock) => {
+  mock.pushShareResult('', '', '', webshare.ShareError.OK);
+  return callWithKeyDown(() => navigator.share(undefined));
+}, 'share of undefined (expect treated as empty dictionary)');
+
+share_test((t, webshare, mock) => {
+  mock.pushShareResult('', '', '', webshare.ShareError.OK);
+  return callWithKeyDown(() => navigator.share(null));
+}, 'share of null (expect treated as empty dictionary)');
+
 share_test((t, webshare, mock) => {
   mock.pushShareResult('384957', '[object Object]', '', webshare.ShareError.OK);
   return callWithKeyDown(() => navigator.share({title: 384957, text: {}}));
 }, 'share of types other than string (expect implicitly converted to string)');
 
+share_test((t, webshare, mock) => {
+  // A null title should convert into the string 'null' (because the field is
+  // not nullable, it just converts to a string like any other type).
+  mock.pushShareResult('null', '', '', webshare.ShareError.OK);
+  return callWithKeyDown(() => navigator.share({title: null, text: undefined}));
+}, 'share of null/undefined dict values');
+
+promise_test(t => {
+  // URL is invalid in that the URL Parser returns failure (port is too
+  // large).
+  const url = 'http://example.com:65536';
+  return promise_rejects(
+      t, new DOMException(undefined, 'TypeError'),
+      navigator.share({url: url}));
+}, 'share with an invalid URL');
+
 </script>
diff --git a/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html b/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html
index 9e8fad7..038b658 100644
--- a/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html
+++ b/third_party/WebKit/LayoutTests/webshare/share-without-user-gesture.html
@@ -1,13 +1,12 @@
 <!DOCTYPE html>
 <script src="../resources/testharness.js"></script>
 <script src="../resources/testharnessreport.js"></script>
-<script src="../resources/mojo-helpers.js"></script>
-<script src="resources/mock-share-service.js"></script>
 <script>
 
-share_test((t, mock) => {
+promise_test(t => {
+  // promise_rejects doesn't test the exception message, so just match against undefined.
   return promise_rejects(
-      t, new DOMException('Must be handling a user gesture to perform a share request.', 'SecurityError'),
+      t, new DOMException(undefined, 'SecurityError'),
       navigator.share({title: 'the title', text: 'the message', url: 'data:the url'}));
 }, 'share without a user gesture');
 
diff --git a/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl
index 00b2f8b0..c6ea7fd 100644
--- a/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/StyleBuilderFunctions.cpp.tmpl
@@ -460,7 +460,7 @@
   state.Style()->SetGridAutoRepeat{{type}}sInsertionPoint(ComputedStyle::InitialGridAutoRepeat{{type}}sInsertionPoint());
   state.Style()->SetAutoRepeatNamedGrid{{type}}Lines(ComputedStyle::InitialNamedGrid{{type}}Lines());
   state.Style()->SetAutoRepeatOrderedNamedGrid{{type}}Lines(ComputedStyle::InitialOrderedNamedGrid{{type}}Lines());
-  state.Style()->SetGridAutoRepeat{{type}}sType(ComputedStyle::InitialGridAutoRepeatType());
+  state.Style()->SetGridAutoRepeat{{type}}sType(ComputedStyle::InitialGridAutoRepeat{{type}}sType());
 
 }
 
diff --git a/third_party/WebKit/Source/core/css/BUILD.gn b/third_party/WebKit/Source/core/css/BUILD.gn
index b7bd8611..d26178e0 100644
--- a/third_party/WebKit/Source/core/css/BUILD.gn
+++ b/third_party/WebKit/Source/core/css/BUILD.gn
@@ -498,6 +498,8 @@
     "properties/CSSPropertyAnimationNameUtils.h",
     "properties/CSSPropertyBorderImageUtils.cpp",
     "properties/CSSPropertyBorderImageUtils.h",
+    "properties/CSSPropertyBoxShadowUtils.cpp",
+    "properties/CSSPropertyBoxShadowUtils.h",
     "properties/CSSPropertyColumnUtils.cpp",
     "properties/CSSPropertyColumnUtils.h",
     "properties/CSSPropertyCounterUtils.cpp",
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
index b307c84..f03044f 100644
--- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
+++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -145,55 +145,6 @@
 }
 
 template <>
-inline CSSIdentifierValue::CSSIdentifierValue(EColumnFill column_fill)
-    : CSSValue(kIdentifierClass) {
-  switch (column_fill) {
-    case EColumnFill::kAuto:
-      value_id_ = CSSValueAuto;
-      break;
-    case EColumnFill::kBalance:
-      value_id_ = CSSValueBalance;
-      break;
-  }
-}
-
-template <>
-inline EColumnFill CSSIdentifierValue::ConvertTo() const {
-  if (value_id_ == CSSValueBalance)
-    return EColumnFill::kBalance;
-  if (value_id_ == CSSValueAuto)
-    return EColumnFill::kAuto;
-  NOTREACHED();
-  return EColumnFill::kBalance;
-}
-
-template <>
-inline CSSIdentifierValue::CSSIdentifierValue(EColumnSpan column_span)
-    : CSSValue(kIdentifierClass) {
-  switch (column_span) {
-    case EColumnSpan::kAll:
-      value_id_ = CSSValueAll;
-      break;
-    case EColumnSpan::kNone:
-      value_id_ = CSSValueNone;
-      break;
-  }
-}
-
-template <>
-inline EColumnSpan CSSIdentifierValue::ConvertTo() const {
-  switch (value_id_) {
-    case CSSValueAll:
-      return EColumnSpan::kAll;
-    default:
-      NOTREACHED();
-    // fall-through
-    case CSSValueNone:
-      return EColumnSpan::kNone;
-  }
-}
-
-template <>
 inline EBorderStyle CSSIdentifierValue::ConvertTo() const {
   if (value_id_ == CSSValueAuto)  // Valid for CSS outline-style
     return EBorderStyle::kDotted;
@@ -456,10 +407,10 @@
 inline CSSIdentifierValue::CSSIdentifierValue(EBackfaceVisibility e)
     : CSSValue(kIdentifierClass) {
   switch (e) {
-    case kBackfaceVisibilityVisible:
+    case EBackfaceVisibility::kVisible:
       value_id_ = CSSValueVisible;
       break;
-    case kBackfaceVisibilityHidden:
+    case EBackfaceVisibility::kHidden:
       value_id_ = CSSValueHidden;
       break;
   }
@@ -469,15 +420,15 @@
 inline EBackfaceVisibility CSSIdentifierValue::ConvertTo() const {
   switch (value_id_) {
     case CSSValueVisible:
-      return kBackfaceVisibilityVisible;
+      return EBackfaceVisibility::kVisible;
     case CSSValueHidden:
-      return kBackfaceVisibilityHidden;
+      return EBackfaceVisibility::kHidden;
     default:
       break;
   }
 
   NOTREACHED();
-  return kBackfaceVisibilityHidden;
+  return EBackfaceVisibility::kHidden;
 }
 
 template <>
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5
index 85ba864c..a059d82 100644
--- a/third_party/WebKit/Source/core/css/CSSProperties.json5
+++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -637,7 +637,7 @@
       field_template: "storage_only",
       type_name: "EBackfaceVisibility",
       field_group: "rare-non-inherited",
-      default_value: "kBackfaceVisibilityVisible",
+      default_value: "EBackfaceVisibility::kVisible",
       field_size: 1,
     },
     {
@@ -1063,8 +1063,9 @@
     },
     {
       name: "column-fill",
-      field_template: "storage_only",
-      default_value: "EColumnFill::kBalance",
+      field_template: "keyword",
+      keywords: ["balance", "auto"],
+      default_value: "balance",
       field_size: 1,
       field_group: "rare-non-inherited->multi-col",
       getter: "GetColumnFill",
@@ -2911,9 +2912,10 @@
       name: "column-span",
       api_class: true,
       api_methods: ["parseSingleValue"],
-      field_template: "storage_only",
+      field_template: "keyword",
+      keywords: ["none", "all"],
       field_group: "rare-non-inherited->multi-col",
-      default_value: "EColumnSpan::kNone",
+      default_value: "none",
       getter: "GetColumnSpan",
       field_size: 1,
     },
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
index cba547a..7aaf7c4 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
+++ b/third_party/WebKit/Source/core/css/ComputedStyleCSSValueMapping.cpp
@@ -3161,7 +3161,7 @@
       return CSSIdentifierValue::Create(style.Appearance());
     case CSSPropertyBackfaceVisibility:
       return CSSIdentifierValue::Create(
-          (style.BackfaceVisibility() == kBackfaceVisibilityHidden)
+          (style.BackfaceVisibility() == EBackfaceVisibility::kHidden)
               ? CSSValueHidden
               : CSSValueVisible);
     case CSSPropertyWebkitBorderImage:
diff --git a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5 b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
index 97a4a3d..b6a530a 100644
--- a/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
+++ b/third_party/WebKit/Source/core/css/ComputedStyleExtraFields.json5
@@ -1018,19 +1018,19 @@
     },
     {
       name: "GridAutoRepeatColumnsType",
-      field_template: "storage_only",
+      field_template: "keyword",
       type_name: "AutoRepeatType",
       field_group: "rare-non-inherited->grid",
-      field_size: 3,
-      default_value: "AutoRepeatType::kNoAutoRepeat",
+      keywords: ["no-auto-repeat", "auto-fill", "auto-fit"],
+      default_value: "no-auto-repeat",
     },
     {
       name: "GridAutoRepeatRowsType",
-      field_template: "storage_only",
+      field_template: "keyword",
       type_name: "AutoRepeatType",
       field_group: "rare-non-inherited->grid",
-      field_size: 3,
-      default_value: "AutoRepeatType::kNoAutoRepeat",
+      keywords: ["no-auto-repeat", "auto-fill", "auto-fit"],
+      default_value: "no-auto-repeat",
     },
   ],
 }
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
index b408bd3..c6efe230 100644
--- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
+++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -43,6 +43,7 @@
 #include "core/css/properties/CSSPropertyAnimationIterationCountUtils.h"
 #include "core/css/properties/CSSPropertyAnimationNameUtils.h"
 #include "core/css/properties/CSSPropertyBorderImageUtils.h"
+#include "core/css/properties/CSSPropertyBoxShadowUtils.h"
 #include "core/css/properties/CSSPropertyColumnUtils.h"
 #include "core/css/properties/CSSPropertyDescriptor.h"
 #include "core/css/properties/CSSPropertyFontUtils.h"
@@ -498,72 +499,6 @@
   return range_.AtEnd();
 }
 
-static CSSShadowValue* ParseSingleShadow(CSSParserTokenRange& range,
-                                         CSSParserMode css_parser_mode,
-                                         bool allow_inset_and_spread) {
-  CSSIdentifierValue* style = nullptr;
-  CSSValue* color = nullptr;
-
-  if (range.AtEnd())
-    return nullptr;
-  if (range.Peek().Id() == CSSValueInset) {
-    if (!allow_inset_and_spread)
-      return nullptr;
-    style = ConsumeIdent(range);
-  }
-  color = ConsumeColor(range, css_parser_mode);
-
-  CSSPrimitiveValue* horizontal_offset =
-      ConsumeLength(range, css_parser_mode, kValueRangeAll);
-  if (!horizontal_offset)
-    return nullptr;
-
-  CSSPrimitiveValue* vertical_offset =
-      ConsumeLength(range, css_parser_mode, kValueRangeAll);
-  if (!vertical_offset)
-    return nullptr;
-
-  CSSPrimitiveValue* blur_radius =
-      ConsumeLength(range, css_parser_mode, kValueRangeAll);
-  CSSPrimitiveValue* spread_distance = nullptr;
-  if (blur_radius) {
-    // Blur radius must be non-negative.
-    if (blur_radius->GetDoubleValue() < 0)
-      return nullptr;
-    if (allow_inset_and_spread)
-      spread_distance = ConsumeLength(range, css_parser_mode, kValueRangeAll);
-  }
-
-  if (!range.AtEnd()) {
-    if (!color)
-      color = ConsumeColor(range, css_parser_mode);
-    if (range.Peek().Id() == CSSValueInset) {
-      if (!allow_inset_and_spread || style)
-        return nullptr;
-      style = ConsumeIdent(range);
-    }
-  }
-  return CSSShadowValue::Create(horizontal_offset, vertical_offset, blur_radius,
-                                spread_distance, style, color);
-}
-
-static CSSValue* ConsumeShadow(CSSParserTokenRange& range,
-                               CSSParserMode css_parser_mode,
-                               bool allow_inset_and_spread) {
-  if (range.Peek().Id() == CSSValueNone)
-    return ConsumeIdent(range);
-
-  CSSValueList* shadow_value_list = CSSValueList::CreateCommaSeparated();
-  do {
-    if (CSSShadowValue* shadow_value =
-            ParseSingleShadow(range, css_parser_mode, allow_inset_and_spread))
-      shadow_value_list->Append(*shadow_value);
-    else
-      return nullptr;
-  } while (ConsumeCommaIncludingWhitespace(range));
-  return shadow_value_list;
-}
-
 static CSSFunctionValue* ConsumeFilterFunction(
     CSSParserTokenRange& range,
     const CSSParserContext* context) {
@@ -575,7 +510,8 @@
   CSSValue* parsed_value = nullptr;
 
   if (filter_type == CSSValueDropShadow) {
-    parsed_value = ParseSingleShadow(args, context->Mode(), false);
+    parsed_value = CSSPropertyBoxShadowUtils::ParseSingleShadow(
+        args, context->Mode(), AllowInsetAndSpread::kForbid);
   } else {
     if (args.AtEnd()) {
       context->Count(WebFeature::kCSSFilterFunctionNoArguments);
@@ -1561,9 +1497,11 @@
           range_, context_->Mode(), unitless);
     }
     case CSSPropertyTextShadow:
-      return ConsumeShadow(range_, context_->Mode(), false);
+      return CSSPropertyBoxShadowUtils::ConsumeShadow(
+          range_, context_->Mode(), AllowInsetAndSpread::kForbid);
     case CSSPropertyBoxShadow:
-      return ConsumeShadow(range_, context_->Mode(), true);
+      return CSSPropertyBoxShadowUtils::ConsumeShadow(
+          range_, context_->Mode(), AllowInsetAndSpread::kAllow);
     case CSSPropertyFilter:
     case CSSPropertyBackdropFilter:
       return ConsumeFilter(range_, context_);
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.cpp b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.cpp
new file mode 100644
index 0000000..25855af
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.cpp
@@ -0,0 +1,82 @@
+// 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.
+
+#include "core/css/properties/CSSPropertyBoxShadowUtils.h"
+
+#include "core/CSSValueKeywords.h"
+#include "core/css/CSSPrimitiveValue.h"
+#include "core/css/CSSShadowValue.h"
+#include "core/css/parser/CSSParserTokenRange.h"
+#include "core/css/parser/CSSPropertyParserHelpers.h"
+#include "platform/Length.h"
+
+namespace blink {
+
+class CSSIdentifierValue;
+class CSSValue;
+
+CSSValue* CSSPropertyBoxShadowUtils::ConsumeShadow(
+    CSSParserTokenRange& range,
+    CSSParserMode css_parser_mode,
+    AllowInsetAndSpread inset_and_spread) {
+  if (range.Peek().Id() == CSSValueNone)
+    return CSSPropertyParserHelpers::ConsumeIdent(range);
+  return CSSPropertyParserHelpers::ConsumeCommaSeparatedList(
+      ParseSingleShadow, range, css_parser_mode, inset_and_spread);
+}
+
+CSSShadowValue* CSSPropertyBoxShadowUtils::ParseSingleShadow(
+    CSSParserTokenRange& range,
+    CSSParserMode css_parser_mode,
+    AllowInsetAndSpread inset_and_spread) {
+  CSSIdentifierValue* style = nullptr;
+  CSSValue* color = nullptr;
+
+  if (range.AtEnd())
+    return nullptr;
+  if (range.Peek().Id() == CSSValueInset) {
+    if (inset_and_spread != AllowInsetAndSpread::kAllow)
+      return nullptr;
+    style = CSSPropertyParserHelpers::ConsumeIdent(range);
+  }
+  color = CSSPropertyParserHelpers::ConsumeColor(range, css_parser_mode);
+
+  CSSPrimitiveValue* horizontal_offset =
+      CSSPropertyParserHelpers::ConsumeLength(range, css_parser_mode,
+                                              kValueRangeAll);
+  if (!horizontal_offset)
+    return nullptr;
+
+  CSSPrimitiveValue* vertical_offset = CSSPropertyParserHelpers::ConsumeLength(
+      range, css_parser_mode, kValueRangeAll);
+  if (!vertical_offset)
+    return nullptr;
+
+  CSSPrimitiveValue* blur_radius = CSSPropertyParserHelpers::ConsumeLength(
+      range, css_parser_mode, kValueRangeAll);
+  CSSPrimitiveValue* spread_distance = nullptr;
+  if (blur_radius) {
+    // Blur radius must be non-negative.
+    if (blur_radius->GetDoubleValue() < 0)
+      return nullptr;
+    if (inset_and_spread == AllowInsetAndSpread::kAllow) {
+      spread_distance = CSSPropertyParserHelpers::ConsumeLength(
+          range, css_parser_mode, kValueRangeAll);
+    }
+  }
+
+  if (!range.AtEnd()) {
+    if (!color)
+      color = CSSPropertyParserHelpers::ConsumeColor(range, css_parser_mode);
+    if (range.Peek().Id() == CSSValueInset) {
+      if (inset_and_spread != AllowInsetAndSpread::kAllow || style)
+        return nullptr;
+      style = CSSPropertyParserHelpers::ConsumeIdent(range);
+    }
+  }
+  return CSSShadowValue::Create(horizontal_offset, vertical_offset, blur_radius,
+                                spread_distance, style, color);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.h b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.h
new file mode 100644
index 0000000..a039212
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/properties/CSSPropertyBoxShadowUtils.h
@@ -0,0 +1,33 @@
+// 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 CSSPropertyBoxShadowUtils_h
+#define CSSPropertyBoxShadowUtils_h
+
+#include "core/css/parser/CSSParserMode.h"
+#include "platform/wtf/Allocator.h"
+
+namespace blink {
+
+class CSSParserTokenRange;
+class CSSShadowValue;
+class CSSValue;
+
+enum class AllowInsetAndSpread { kAllow, kForbid };
+
+class CSSPropertyBoxShadowUtils {
+  STATIC_ONLY(CSSPropertyBoxShadowUtils);
+
+ public:
+  static CSSValue* ConsumeShadow(CSSParserTokenRange&,
+                                 CSSParserMode,
+                                 AllowInsetAndSpread);
+  static CSSShadowValue* ParseSingleShadow(CSSParserTokenRange&,
+                                           CSSParserMode,
+                                           AllowInsetAndSpread);
+};
+
+}  // namespace blink
+
+#endif  // CSSPropertyBoxShadowUtils_h
diff --git a/third_party/WebKit/Source/core/editing/Position.cpp b/third_party/WebKit/Source/core/editing/Position.cpp
index eab61e4b..1627ec1 100644
--- a/third_party/WebKit/Source/core/editing/Position.cpp
+++ b/third_party/WebKit/Source/core/editing/Position.cpp
@@ -153,6 +153,19 @@
 }
 
 template <typename Strategy>
+static int MinOffsetForNode(Node* anchor_node, int offset) {
+  if (anchor_node->IsCharacterDataNode())
+    return std::min(offset, anchor_node->MaxCharacterOffset());
+
+  int new_offset = 0;
+  for (Node* node = Strategy::FirstChild(*anchor_node);
+       node && new_offset < offset; node = Strategy::NextSibling(*node))
+    new_offset++;
+
+  return new_offset;
+}
+
+template <typename Strategy>
 int PositionTemplate<Strategy>::ComputeOffsetInContainerNode() const {
   if (!anchor_node_)
     return 0;
@@ -163,7 +176,7 @@
     case PositionAnchorType::kAfterChildren:
       return LastOffsetInNode(anchor_node_.Get());
     case PositionAnchorType::kOffsetInAnchor:
-      return MinOffsetForNode(anchor_node_.Get(), offset_);
+      return MinOffsetForNode<Strategy>(anchor_node_.Get(), offset_);
     case PositionAnchorType::kBeforeAnchor:
       return Strategy::Index(*anchor_node_);
     case PositionAnchorType::kAfterAnchor:
@@ -485,21 +498,6 @@
 
 // static
 template <typename Strategy>
-int PositionTemplate<Strategy>::MinOffsetForNode(Node* anchor_node,
-                                                 int offset) {
-  if (anchor_node->IsCharacterDataNode())
-    return std::min(offset, anchor_node->MaxCharacterOffset());
-
-  int new_offset = 0;
-  for (Node* node = Strategy::FirstChild(*anchor_node);
-       node && new_offset < offset; node = Strategy::NextSibling(*node))
-    new_offset++;
-
-  return new_offset;
-}
-
-// static
-template <typename Strategy>
 PositionTemplate<Strategy>
 PositionTemplate<Strategy>::FirstPositionInOrBeforeNode(Node* node) {
   if (!node)
diff --git a/third_party/WebKit/Source/core/editing/Position.h b/third_party/WebKit/Source/core/editing/Position.h
index bb8a72408..5d05192 100644
--- a/third_party/WebKit/Source/core/editing/Position.h
+++ b/third_party/WebKit/Source/core/editing/Position.h
@@ -191,7 +191,6 @@
   static int LastOffsetInNode(Node* anchor_node);
   static PositionTemplate<Strategy> FirstPositionInNode(Node* anchor_node);
   static PositionTemplate<Strategy> LastPositionInNode(Node* anchor_node);
-  static int MinOffsetForNode(Node* anchor_node, int offset);
   static PositionTemplate<Strategy> FirstPositionInOrBeforeNode(
       Node* anchor_node);
   static PositionTemplate<Strategy> LastPositionInOrAfterNode(
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp
index 26347fa5..f8c1e23 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerListEditor.cpp
@@ -22,6 +22,15 @@
          const DocumentMarker* marker_to_insert) {
         return marker_in_list->StartOffset() < marker_to_insert->StartOffset();
       });
+
+  // DCHECK that we're not trying to add a marker that overlaps an existing one
+  // (this method only works for lists which don't allow overlapping markers)
+  if (pos != list->end())
+    DCHECK_LE(marker->EndOffset(), (*pos)->StartOffset());
+
+  if (pos != list->begin())
+    DCHECK_GE(marker->StartOffset(), (*std::prev(pos))->EndOffset());
+
   list->insert(pos - list->begin(), marker);
 }
 
@@ -38,7 +47,7 @@
     if (marker.StartOffset() > end_offset)
       break;
 
-    // pin the marker to the specified range and apply the shift delta
+    // Trim the marker to fit in dst_list's text node
     if (marker.EndOffset() > end_offset)
       marker.SetEndOffset(end_offset);
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.h b/third_party/WebKit/Source/core/layout/LayoutObject.h
index f9c2a00..2c90ea3 100644
--- a/third_party/WebKit/Source/core/layout/LayoutObject.h
+++ b/third_party/WebKit/Source/core/layout/LayoutObject.h
@@ -867,7 +867,7 @@
   bool HasClipPath() const { return Style() && Style()->ClipPath(); }
   bool HasHiddenBackface() const {
     return Style() &&
-           Style()->BackfaceVisibility() == kBackfaceVisibilityHidden;
+           Style()->BackfaceVisibility() == EBackfaceVisibility::kHidden;
   }
   bool HasBackdropFilter() const {
     return Style() && Style()->HasBackdropFilter();
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index d04bd55..99a7f84 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -1170,7 +1170,7 @@
 
   graphics_layer_->SetBackfaceVisibility(
       GetLayoutObject().Style()->BackfaceVisibility() ==
-      kBackfaceVisibilityVisible);
+      EBackfaceVisibility::kVisible);
 }
 
 void CompositedLayerMapping::ComputeGraphicsLayerParentLocation(
@@ -1335,7 +1335,7 @@
   overflow_controls_host_layer_->SetMasksToBounds(true);
   overflow_controls_host_layer_->SetBackfaceVisibility(
       owning_layer_.GetLayoutObject().Style()->BackfaceVisibility() ==
-      kBackfaceVisibilityVisible);
+      EBackfaceVisibility::kVisible);
 }
 
 void CompositedLayerMapping::UpdateChildContainmentLayerGeometry(
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp
index 2cccce8b..43383fe 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositingReasonFinder.cpp
@@ -78,7 +78,7 @@
   if (RequiresCompositingForTransform(layout_object))
     reasons |= kCompositingReason3DTransform;
 
-  if (style.BackfaceVisibility() == kBackfaceVisibilityHidden)
+  if (style.BackfaceVisibility() == EBackfaceVisibility::kHidden)
     reasons |= kCompositingReasonBackfaceVisibilityHidden;
 
   if (RequiresCompositingForAnimation(style))
diff --git a/third_party/WebKit/Source/core/paint/PaintLayer.cpp b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
index 321a433..3c2fa50 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayer.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayer.cpp
@@ -2010,7 +2010,7 @@
   // Check for hit test on backface if backface-visibility is 'hidden'
   if (local_transform_state &&
       GetLayoutObject().Style()->BackfaceVisibility() ==
-          kBackfaceVisibilityHidden) {
+          EBackfaceVisibility::kHidden) {
     TransformationMatrix inverted_matrix =
         local_transform_state->accumulated_transform_.Inverse();
     // If the z-vector of the matrix is negative, the back is facing towards the
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h
index 9ae5c30..c69c2eb 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyle.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -435,14 +435,15 @@
 
   // backface-visibility (aka -webkit-backface-visibility)
   static EBackfaceVisibility InitialBackfaceVisibility() {
-    return kBackfaceVisibilityVisible;
+    return EBackfaceVisibility::kVisible;
   }
   EBackfaceVisibility BackfaceVisibility() const {
     return static_cast<EBackfaceVisibility>(
         rare_non_inherited_data_->backface_visibility_);
   }
   void SetBackfaceVisibility(EBackfaceVisibility b) {
-    SET_VAR(rare_non_inherited_data_, backface_visibility_, b);
+    SET_VAR(rare_non_inherited_data_, backface_visibility_,
+            static_cast<unsigned>(b));
   }
 
   // Background properties.
@@ -625,17 +626,6 @@
                    InitialColumnCount());
   }
 
-  // column-fill
-  static EColumnFill InitialColumnFill() { return EColumnFill::kBalance; }
-  EColumnFill GetColumnFill() const {
-    return static_cast<EColumnFill>(
-        rare_non_inherited_data_->multi_col_data_->column_fill_);
-  }
-  void SetColumnFill(EColumnFill column_fill) {
-    SET_NESTED_VAR(rare_non_inherited_data_, multi_col_data_, column_fill_,
-                   static_cast<unsigned>(column_fill));
-  }
-
   // column-gap (aka -webkit-column-gap)
   float ColumnGap() const {
     return rare_non_inherited_data_->multi_col_data_->column_gap_;
@@ -684,17 +674,6 @@
                             column_rule_, w);
   }
 
-  // column-span (aka -webkit-column-span)
-  static EColumnSpan InitialColumnSpan() { return EColumnSpan::kNone; }
-  EColumnSpan GetColumnSpan() const {
-    return static_cast<EColumnSpan>(
-        rare_non_inherited_data_->multi_col_data_->column_span_);
-  }
-  void SetColumnSpan(EColumnSpan column_span) {
-    SET_NESTED_VAR(rare_non_inherited_data_, multi_col_data_, column_span_,
-                   static_cast<unsigned>(column_span));
-  }
-
   // column-width (aka -webkit-column-width)
   float ColumnWidth() const {
     return rare_non_inherited_data_->multi_col_data_->column_width_;
@@ -1765,14 +1744,6 @@
   bool HasTextCombine() const { return TextCombine() != ETextCombine::kNone; }
 
   // Grid utility functions.
-  AutoRepeatType GridAutoRepeatColumnsType() const {
-    return static_cast<AutoRepeatType>(
-        rare_non_inherited_data_->grid_data_->grid_auto_repeat_columns_type_);
-  }
-  AutoRepeatType GridAutoRepeatRowsType() const {
-    return static_cast<AutoRepeatType>(
-        rare_non_inherited_data_->grid_data_->grid_auto_repeat_rows_type_);
-  }
   GridAutoFlow GetGridAutoFlow() const {
     return static_cast<GridAutoFlow>(
         rare_non_inherited_data_->grid_data_->grid_auto_flow_);
@@ -1795,16 +1766,6 @@
     return (rare_non_inherited_data_->grid_data_->grid_auto_flow_ &
             kInternalAutoFlowAlgorithmDense) == kInternalAutoFlowAlgorithmDense;
   }
-  void SetGridAutoRepeatColumnsType(const AutoRepeatType auto_repeat_type) {
-    SET_NESTED_VAR(rare_non_inherited_data_, grid_data_,
-                   grid_auto_repeat_columns_type_,
-                   static_cast<unsigned>(auto_repeat_type));
-  }
-  void SetGridAutoRepeatRowsType(const AutoRepeatType auto_repeat_type) {
-    SET_NESTED_VAR(rare_non_inherited_data_, grid_data_,
-                   grid_auto_repeat_rows_type_,
-                   static_cast<unsigned>(auto_repeat_type));
-  }
 
   // align-content utility functions.
   ContentPosition AlignContentPosition() const {
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
index ca21928b..b04b54f 100644
--- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
+++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -91,10 +91,6 @@
                          (1 << (kPseudoIdBackdrop - kFirstPublicPseudoId))
 };
 
-enum class EColumnFill { kBalance, kAuto };
-
-enum class EColumnSpan { kNone = 0, kAll };
-
 enum OutlineIsAuto { kOutlineIsAutoOff = 0, kOutlineIsAutoOn };
 
 // Random visual rendering model attributes. Not inherited.
@@ -198,10 +194,7 @@
 
 enum OffsetRotationType { kOffsetRotationAuto, kOffsetRotationFixed };
 
-enum EBackfaceVisibility {
-  kBackfaceVisibilityVisible,
-  kBackfaceVisibilityHidden
-};
+enum class EBackfaceVisibility { kVisible, kHidden };
 
 enum ELineClampType { kLineClampLineCount, kLineClampPercentage };
 
@@ -331,8 +324,6 @@
   kSnapAlignmentCenter
 };
 
-enum AutoRepeatType { kNoAutoRepeat, kAutoFill, kAutoFit };
-
 }  // namespace blink
 
 #endif  // ComputedStyleConstants_h
diff --git a/third_party/WebKit/Source/core/workers/Worklet.cpp b/third_party/WebKit/Source/core/workers/Worklet.cpp
index 21fc3d7..634646ac 100644
--- a/third_party/WebKit/Source/core/workers/Worklet.cpp
+++ b/third_party/WebKit/Source/core/workers/Worklet.cpp
@@ -12,9 +12,26 @@
 #include "core/workers/WorkletPendingTasks.h"
 #include "platform/WebTaskRunner.h"
 #include "platform/wtf/WTF.h"
+#include "public/platform/WebURLRequest.h"
 
 namespace blink {
 
+namespace {
+
+WebURLRequest::FetchCredentialsMode ParseCredentialsOption(
+    const String& credentials_option) {
+  if (credentials_option == "omit")
+    return WebURLRequest::kFetchCredentialsModeOmit;
+  if (credentials_option == "same-origin")
+    return WebURLRequest::kFetchCredentialsModeSameOrigin;
+  if (credentials_option == "include")
+    return WebURLRequest::kFetchCredentialsModeInclude;
+  NOTREACHED();
+  return WebURLRequest::kFetchCredentialsModeOmit;
+}
+
+}  // namespace
+
 Worklet::Worklet(LocalFrame* frame)
     : ContextLifecycleObserver(frame->GetDocument()) {
   DCHECK(IsMainThread());
@@ -75,18 +92,6 @@
     proxy->TerminateWorkletGlobalScope();
 }
 
-WebURLRequest::FetchCredentialsMode Worklet::ParseCredentialsOption(
-    const String& credentials_option) {
-  if (credentials_option == "omit")
-    return WebURLRequest::kFetchCredentialsModeOmit;
-  if (credentials_option == "same-origin")
-    return WebURLRequest::kFetchCredentialsModeSameOrigin;
-  if (credentials_option == "include")
-    return WebURLRequest::kFetchCredentialsModeInclude;
-  NOTREACHED();
-  return WebURLRequest::kFetchCredentialsModeOmit;
-}
-
 WorkletGlobalScopeProxy* Worklet::FindAvailableGlobalScope() const {
   DCHECK(IsMainThread());
   // TODO(nhiroki): Support the case where there are multiple global scopes.
diff --git a/third_party/WebKit/Source/core/workers/Worklet.h b/third_party/WebKit/Source/core/workers/Worklet.h
index 3980eb8..d902fe5c 100644
--- a/third_party/WebKit/Source/core/workers/Worklet.h
+++ b/third_party/WebKit/Source/core/workers/Worklet.h
@@ -12,7 +12,6 @@
 #include "core/workers/WorkletOptions.h"
 #include "platform/bindings/ScriptWrappable.h"
 #include "platform/heap/Handle.h"
-#include "public/platform/WebURLRequest.h"
 
 namespace blink {
 
@@ -51,9 +50,6 @@
   // The Worklet inherits the url and userAgent from the frame->document().
   explicit Worklet(LocalFrame*);
 
-  static WebURLRequest::FetchCredentialsMode ParseCredentialsOption(
-      const String& credentials_option);
-
   // Returns one of available global scopes.
   WorkletGlobalScopeProxy* FindAvailableGlobalScope() const;
 
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js
index b2c8e893..7ed8b3042 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkDataGridNode.js
@@ -681,13 +681,8 @@
    * @return {boolean}
    */
   isNavigationRequest() {
-    return this._isNavigationRequest;
-  }
-
-  markAsNavigationRequest() {
-    this._isNavigationRequest = true;
-    this.refresh();
-    this._updateBackgroundColor();
+    var pageLoad = NetworkLog.networkLog.pageLoadForRequest(this._request);
+    return pageLoad ? pageLoad.mainRequest === this._request : false;
   }
 
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
index 97f9f47..7436810 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkLogView.js
@@ -71,10 +71,8 @@
     this._columns = new Network.NetworkLogViewColumns(
         this, this._timeCalculator, this._durationCalculator, networkLogLargeRowsSetting);
 
-    /** @type {!Map.<string, !Network.NetworkRequestNode>} */
-    this._nodesByRequestId = new Map();
-    /** @type {!Object.<string, boolean>} */
-    this._staleRequestIds = {};
+    /** @type {!Set<!SDK.NetworkRequest>} */
+    this._staleRequests = new Set();
     /** @type {number} */
     this._mainRequestLoadTime = -1;
     /** @type {number} */
@@ -114,12 +112,9 @@
         .addChangeListener(this._invalidateAllItems.bind(this, false), this);
 
     SDK.targetManager.observeModels(SDK.NetworkManager, this);
-    SDK.targetManager.addModelListener(
-        SDK.NetworkManager, SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this);
-    SDK.targetManager.addModelListener(
-        SDK.NetworkManager, SDK.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this);
-    SDK.targetManager.addModelListener(
-        SDK.NetworkManager, SDK.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this);
+    NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestAdded, this._onRequestUpdated, this);
+    NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestUpdated, this._onRequestUpdated, this);
+    NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.Reset, this._reset, this);
 
     this._updateGroupByFrame();
     Common.moduleSetting('network.group-by-frame').addChangeListener(() => this._updateGroupByFrame());
@@ -363,10 +358,10 @@
    * @param {?string} groupKey
    */
   _setGrouping(groupKey) {
+    if (this._activeGroupLookup)
+      this._activeGroupLookup.reset();
     var groupLookup = groupKey ? this._groupLookups.get(groupKey) || null : null;
     this._activeGroupLookup = groupLookup;
-    if (groupLookup)
-      groupLookup.reset();
     this._invalidateAllItems();
   }
 
@@ -379,7 +374,7 @@
    * @return {?Network.NetworkRequestNode}
    */
   nodeForRequest(request) {
-    return this._nodesByRequestId.get(request.requestId());
+    return request[Network.NetworkLogView._networkNodeSymbol] || null;
   }
 
   /**
@@ -402,17 +397,15 @@
    * @param {!SDK.NetworkManager} networkManager
    */
   modelAdded(networkManager) {
-    if (!networkManager.target().parentTarget()) {
-      var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel);
-      if (resourceTreeModel) {
-        resourceTreeModel.addEventListener(
-            SDK.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this);
-        resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this);
-        resourceTreeModel.addEventListener(
-            SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this);
-      }
+    // TODO(allada) Remove dependency on networkManager and instead use NetworkLog and PageLoad for needed data.
+    if (networkManager.target().parentTarget())
+      return;
+    var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel);
+    if (resourceTreeModel) {
+      resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this);
+      resourceTreeModel.addEventListener(
+          SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this);
     }
-    NetworkLog.networkLog.requestsForManager(networkManager).forEach(this._appendRequest.bind(this));
   }
 
   /**
@@ -423,8 +416,6 @@
     if (!networkManager.target().parentTarget()) {
       var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel);
       if (resourceTreeModel) {
-        resourceTreeModel.removeEventListener(
-            SDK.ResourceTreeModel.Events.MainFrameNavigated, this._mainFrameNavigated, this);
         resourceTreeModel.removeEventListener(SDK.ResourceTreeModel.Events.Load, this._loadEventFired, this);
         resourceTreeModel.removeEventListener(
             SDK.ResourceTreeModel.Events.DOMContentLoaded, this._domContentLoadedEventFired, this);
@@ -600,26 +591,24 @@
   }
 
   _updateSummaryBar() {
-    var requestsNumber = this._nodesByRequestId.size;
-
-    if (!requestsNumber) {
-      this._showRecordingHint();
-      return;
-    }
     this._hideRecordingHint();
 
     var transferSize = 0;
-    var selectedRequestsNumber = 0;
+    var selectedNodeNumber = 0;
     var selectedTransferSize = 0;
     var baseTime = -1;
     var maxTime = -1;
-    var nodes = this._nodesByRequestId.valuesArray();
-    for (var i = 0; i < nodes.length; ++i) {
-      var request = nodes[i].request();
+
+    var nodeCount = 0;
+    for (var request of NetworkLog.networkLog.requests()) {
+      var node = request[Network.NetworkLogView._networkNodeSymbol];
+      if (!node)
+        continue;
+      nodeCount++;
       var requestTransferSize = request.transferSize;
       transferSize += requestTransferSize;
-      if (!nodes[i][Network.NetworkLogView._isFilteredOutSymbol]) {
-        selectedRequestsNumber++;
+      if (!node[Network.NetworkLogView._isFilteredOutSymbol]) {
+        selectedNodeNumber++;
         selectedTransferSize += requestTransferSize;
       }
       if (request.url() === request.networkManager().target().inspectedURL() &&
@@ -629,6 +618,11 @@
         maxTime = request.endTime;
     }
 
+    if (!nodeCount) {
+      this._showRecordingHint();
+      return;
+    }
+
     var summaryBar = this._summaryBarElement;
     summaryBar.removeChildren();
     var separator = '\u2002\u2758\u2002';
@@ -644,13 +638,13 @@
       return span;
     }
 
-    if (selectedRequestsNumber !== requestsNumber) {
-      appendChunk(Common.UIString('%d / %d requests', selectedRequestsNumber, requestsNumber));
+    if (selectedNodeNumber !== nodeCount) {
+      appendChunk(Common.UIString('%d / %d requests', selectedNodeNumber, nodeCount));
       appendChunk(separator);
       appendChunk(Common.UIString(
           '%s / %s transferred', Number.bytesToString(selectedTransferSize), Number.bytesToString(transferSize)));
     } else {
-      appendChunk(Common.UIString('%d requests', requestsNumber));
+      appendChunk(Common.UIString('%d requests', nodeCount));
       appendChunk(separator);
       appendChunk(Common.UIString('%s transferred', Number.bytesToString(transferSize)));
     }
@@ -709,9 +703,7 @@
    * @param {boolean=} deferUpdate
    */
   _invalidateAllItems(deferUpdate) {
-    var requestIds = this._nodesByRequestId.keysArray();
-    for (var i = 0; i < requestIds.length; ++i)
-      this._staleRequestIds[requestIds[i]] = true;
+    this._staleRequests = new Set(NetworkLog.networkLog.requests());
     if (deferUpdate)
       this.scheduleRefresh();
     else
@@ -832,10 +824,22 @@
     var nodesToInsert = new Map();
     /** @type {!Array<!Network.NetworkNode>} */
     var nodesToRefresh = [];
-    for (var requestId in this._staleRequestIds) {
-      var node = this._nodesByRequestId.get(requestId);
+
+    /** @type {!Set<!Network.NetworkRequestNode>} */
+    var staleNodes = new Set();
+
+    // While creating nodes it may add more entries into _staleRequests because redirect request nodes update the parent
+    // node so we loop until we have no more stale requests.
+    while (this._staleRequests.size) {
+      var request = this._staleRequests.firstValue();
+      this._staleRequests.delete(request);
+      var node = request[Network.NetworkLogView._networkNodeSymbol];
       if (!node)
-        continue;
+        node = this._createNodeForRequest(request);
+      staleNodes.add(node);
+    }
+
+    for (var node of staleNodes) {
       var isFilteredOut = !this._applyFilter(node);
       if (isFilteredOut && node === this._hoveredNode)
         this._setHoveredNode(null);
@@ -884,13 +888,16 @@
     this._highlightNthMatchedRequestForSearch(
         this._updateMatchCountAndFindMatchIndex(this._currentMatchedRequestNode), false);
 
-    this._staleRequestIds = {};
     this._updateSummaryBar();
 
     if (nodesToInsert.size)
       this._columns.sortByCurrentColumn();
 
     this._dataGrid.updateInstantly();
+    this._didRefreshForTest();
+  }
+
+  _didRefreshForTest() {
   }
 
   /**
@@ -907,7 +914,7 @@
     return groupNode;
   }
 
-  reset() {
+  _reset() {
     this._requestWithHighlightedInitiators = null;
     this.dispatchEventToListeners(Network.NetworkLogView.Events.RequestSelected, null);
 
@@ -925,8 +932,7 @@
 
     if (this._activeGroupLookup)
       this._activeGroupLookup.reset();
-    this._nodesByRequestId.clear();
-    this._staleRequestIds = {};
+    this._staleRequests.clear();
     this._resetSuggestionBuilder();
 
     this._mainRequestLoadTime = -1;
@@ -935,6 +941,7 @@
     this._dataGrid.rootNode().removeChildren();
     this._updateSummaryBar();
     this._dataGrid.setStickToBottom(true);
+    this.scheduleRefresh();
   }
 
   /**
@@ -948,37 +955,17 @@
   }
 
   /**
-   * @param {!Common.Event} event
-   */
-  _onRequestStarted(event) {
-    if (!this._recording)
-      return;
-    var request = /** @type {!SDK.NetworkRequest} */ (event.data);
-    this._appendRequest(request);
-  }
-
-  /**
    * @param {!SDK.NetworkRequest} request
    */
-  _appendRequest(request) {
+  _createNodeForRequest(request) {
     var node = new Network.NetworkRequestNode(this, request);
+    request[Network.NetworkLogView._networkNodeSymbol] = node;
     node[Network.NetworkLogView._isFilteredOutSymbol] = true;
     node[Network.NetworkLogView._isMatchingSearchQuerySymbol] = false;
 
-    // In case of redirect request id is reassigned to a redirected
-    // request and we need to update _nodesByRequestId and search results.
-    var originalRequestNode = this._nodesByRequestId.get(request.requestId());
-    if (originalRequestNode)
-      this._nodesByRequestId.set(originalRequestNode.request().requestId(), originalRequestNode);
-    this._nodesByRequestId.set(request.requestId(), node);
-
-    // Pull all the redirects of the main request upon commit load.
-    if (request.redirects) {
-      for (var i = 0; i < request.redirects.length; ++i)
-        this._refreshRequest(request.redirects[i]);
-    }
-
-    this._refreshRequest(request);
+    if (request.redirects)
+      request.redirects.forEach(this._refreshRequest.bind(this));
+    return node;
   }
 
   /**
@@ -993,9 +980,6 @@
    * @param {!SDK.NetworkRequest} request
    */
   _refreshRequest(request) {
-    if (!this._nodesByRequestId.get(request.requestId()))
-      return;
-
     Network.NetworkLogView._subdomains(request.domain)
         .forEach(
             this._suggestionBuilder.addItem.bind(this._suggestionBuilder, Network.NetworkLogView.FilterType.Domain));
@@ -1037,47 +1021,11 @@
       this._suggestionBuilder.addItem(Network.NetworkLogView.FilterType.SetCookieValue, cookie.value());
     }
 
-    this._staleRequestIds[request.requestId()] = true;
-    this.dispatchEventToListeners(Network.NetworkLogView.Events.UpdateRequest, request);
+    this._staleRequests.add(request);
     this.scheduleRefresh();
   }
 
   /**
-   * @param {!Common.Event} event
-   */
-  _mainFrameNavigated(event) {
-    if (!this._recording)
-      return;
-
-    var frame = /** @type {!SDK.ResourceTreeFrame} */ (event.data);
-    var loaderId = frame.loaderId;
-
-    // Pick provisional load requests.
-    var requestsToPick = [];
-    var networkManager = frame.resourceTreeModel().target().model(SDK.NetworkManager);
-    var requests = networkManager ? NetworkLog.networkLog.requestsForManager(networkManager) : [];
-    for (var i = 0; i < requests.length; ++i) {
-      var request = requests[i];
-      if (request.loaderId === loaderId)
-        requestsToPick.push(request);
-    }
-
-    if (!Common.moduleSetting('network.preserve-log').get()) {
-      this.reset();
-      for (var i = 0; i < requestsToPick.length; ++i)
-        this._appendRequest(requestsToPick[i]);
-    }
-    for (var i = 0; i < requestsToPick.length; ++i) {
-      var request = requestsToPick[i];
-      var node = this._nodesByRequestId.get(request.requestId());
-      if (node) {
-        node.markAsNavigationRequest();
-        break;
-      }
-    }
-  }
-
-  /**
    * @return {number}
    */
   rowHeight() {
@@ -1185,10 +1133,7 @@
   }
 
   _harRequests() {
-    var requests = this._nodesByRequestId.valuesArray().map(function(node) {
-      return node.request();
-    });
-    var httpRequests = requests.filter(Network.NetworkLogView.HTTPRequestsFilter);
+    var httpRequests = NetworkLog.networkLog.requests().filter(Network.NetworkLogView.HTTPRequestsFilter);
     return httpRequests.filter(Network.NetworkLogView.FinishedRequestsFilter);
   }
 
@@ -1238,7 +1183,7 @@
    * @param {string} platform
    */
   _copyAllCurlCommand(platform) {
-    var requests = this._nodesByRequestId.valuesArray().map(node => node.request());
+    var requests = NetworkLog.networkLog.requests();
     var commands = [];
     for (var request of requests)
       commands.push(this._generateCurlCommand(request, platform));
@@ -1601,8 +1546,8 @@
   revealAndHighlightRequest(request) {
     this.removeAllNodeHighlights();
 
-    var node = this._nodesByRequestId.get(request.requestId());
-    if (node) {
+    var node = request[Network.NetworkLogView._networkNodeSymbol];
+    if (node && this.attached) {
       node.reveal();
       this._highlightNode(node);
     }
@@ -1752,6 +1697,7 @@
 
 Network.NetworkLogView._isFilteredOutSymbol = Symbol('isFilteredOut');
 Network.NetworkLogView._isMatchingSearchQuerySymbol = Symbol('isMatchingSearchQuery');
+Network.NetworkLogView._networkNodeSymbol = Symbol('NetworkNode');
 
 Network.NetworkLogView.HTTPSchemas = {
   'http': true,
@@ -1764,8 +1710,7 @@
 Network.NetworkLogView.Events = {
   RequestSelected: Symbol('RequestSelected'),
   SearchCountUpdated: Symbol('SearchCountUpdated'),
-  SearchIndexUpdated: Symbol('SearchIndexUpdated'),
-  UpdateRequest: Symbol('UpdateRequest')
+  SearchIndexUpdated: Symbol('SearchIndexUpdated')
 };
 
 /** @enum {string} */
diff --git a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
index aed4007..f53b6b26 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
+++ b/third_party/WebKit/Source/devtools/front_end/network/NetworkPanel.js
@@ -109,7 +109,9 @@
         Network.NetworkLogView.Events.SearchCountUpdated, this._onSearchCountUpdated, this);
     this._networkLogView.addEventListener(
         Network.NetworkLogView.Events.SearchIndexUpdated, this._onSearchIndexUpdated, this);
-    this._networkLogView.addEventListener(Network.NetworkLogView.Events.UpdateRequest, this._onUpdateRequest, this);
+    NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestAdded, this._onUpdateRequest, this);
+    NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.RequestUpdated, this._onUpdateRequest, this);
+    NetworkLog.networkLog.addEventListener(NetworkLog.NetworkLog.Events.Reset, this._onNetworkLogReset, this);
 
     Components.DataSaverInfobar.maybeShowInPanel(this);
   }
@@ -146,7 +148,7 @@
     this._panelToolbar.appendToolbarItem(UI.Toolbar.createActionButton(this._toggleRecordAction));
 
     this._clearButton = new UI.ToolbarButton(Common.UIString('Clear'), 'largeicon-clear');
-    this._clearButton.addEventListener(UI.ToolbarButton.Events.Click, this._onClearButtonClicked, this);
+    this._clearButton.addEventListener(UI.ToolbarButton.Events.Click, () => NetworkLog.networkLog.reset(), this);
     this._panelToolbar.appendToolbarItem(this._clearButton);
     this._panelToolbar.appendSeparator();
     var recordFilmStripButton = new UI.ToolbarSettingToggle(
@@ -174,7 +176,7 @@
     }
 
     this._panelToolbar.appendSeparator();
-    this._preserveLogSetting = Common.moduleSetting('network.preserve-log');
+    this._preserveLogSetting = Common.moduleSetting('network_log.preserve-log');
     this._panelToolbar.appendToolbarItem(new UI.ToolbarSettingCheckbox(
         this._preserveLogSetting, Common.UIString('Do not clear log on page reload / navigation'),
         Common.UIString('Preserve log')));
@@ -203,7 +205,7 @@
 
   _toggleRecording() {
     if (!this._preserveLogSetting.get() && !this._toggleRecordAction.toggled())
-      this._reset();
+      NetworkLog.networkLog.reset();
     this._toggleRecord(!this._toggleRecordAction.toggled());
   }
 
@@ -215,6 +217,9 @@
     this._networkLogView.setRecording(toggled);
     if (!toggled && this._filmStripRecorder)
       this._filmStripRecorder.stopRecording(this._filmStripAvailable.bind(this));
+    // TODO(einbinder) This should be moved to a setting/action that NetworkLog owns but NetworkPanel controls, but
+    // always be present in the command menu.
+    NetworkLog.networkLog.setIsRecording(toggled);
   }
 
   /**
@@ -239,18 +244,12 @@
     this._networkLogView.addFilmStripFrames(timestamps);
   }
 
-  /**
-   * @param {!Common.Event} event
-   */
-  _onClearButtonClicked(event) {
-    this._reset();
-  }
-
-  _reset() {
-    this._calculator.reset();
-    this._overviewPane.reset();
-    this._networkLogView.reset();
+  _onNetworkLogReset() {
     Network.BlockedURLsPane.reset();
+    if (!this._preserveLogSetting.get()) {
+      this._calculator.reset();
+      this._overviewPane.reset();
+    }
     if (this._filmStripView)
       this._resetFilmStripView();
   }
@@ -259,8 +258,6 @@
    * @param {!Common.Event} event
    */
   _willReloadPage(event) {
-    if (!this._preserveLogSetting.get())
-      this._reset();
     this._toggleRecord(true);
     if (this._pendingStopTimer) {
       clearTimeout(this._pendingStopTimer);
diff --git a/third_party/WebKit/Source/devtools/front_end/network/module.json b/third_party/WebKit/Source/devtools/front_end/network/module.json
index a53b112..7f19972 100644
--- a/third_party/WebKit/Source/devtools/front_end/network/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/network/module.json
@@ -63,26 +63,6 @@
             ]
         },
         {
-            "type": "setting",
-            "category": "Network",
-            "storageType": "session",
-            "title": "Preserve log",
-            "settingName": "network.preserve-log",
-            "settingType": "boolean",
-            "defaultValue": false,
-            "tags": "preserve, clear, reset",
-            "options": [
-                {
-                    "value": true,
-                    "title": "Do not preserve log on page reload / navigation"
-                },
-                {
-                    "value": false,
-                    "title": "Preserve log on page reload / navigation"
-                }
-            ]
-        },
-        {
             "type": "@UI.ActionDelegate",
             "actionId": "network.toggle-recording",
             "iconClass": "largeicon-start-recording",
diff --git a/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js b/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js
index 638f68d2..9c32457b 100644
--- a/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js
+++ b/third_party/WebKit/Source/devtools/front_end/network_log/NetworkLog.js
@@ -31,14 +31,18 @@
 /**
  * @implements {SDK.SDKModelObserver<!SDK.NetworkManager>}
  */
-NetworkLog.NetworkLog = class {
+NetworkLog.NetworkLog = class extends Common.Object {
   constructor() {
+    super();
     /** @type {!Array<!SDK.NetworkRequest>} */
     this._requests = [];
+    /** @type {!Set<!SDK.NetworkRequest>} */
+    this._requestsSet = new Set();
     /** @type {!Map<!SDK.NetworkManager, !Map<string, !SDK.NetworkRequest>>} */
     this._requestsByManagerAndId = new Map();
     /** @type {!Map<!SDK.NetworkManager, !NetworkLog.PageLoad>} */
     this._currentPageLoad = new Map();
+    this._isRecording = true;
     SDK.targetManager.observeModels(SDK.NetworkManager, this);
   }
 
@@ -51,10 +55,16 @@
     eventListeners.push(
         networkManager.addEventListener(SDK.NetworkManager.Events.RequestStarted, this._onRequestStarted, this));
     eventListeners.push(
+        networkManager.addEventListener(SDK.NetworkManager.Events.RequestUpdated, this._onRequestUpdated, this));
+    eventListeners.push(
         networkManager.addEventListener(SDK.NetworkManager.Events.RequestRedirected, this._onRequestRedirect, this));
+    eventListeners.push(
+        networkManager.addEventListener(SDK.NetworkManager.Events.RequestFinished, this._onRequestUpdated, this));
 
     var resourceTreeModel = networkManager.target().model(SDK.ResourceTreeModel);
     if (resourceTreeModel) {
+      eventListeners.push(
+          resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.WillReloadPage, this._willReloadPage, this));
       eventListeners.push(resourceTreeModel.addEventListener(
           SDK.ResourceTreeModel.Events.MainFrameNavigated, this._onMainFrameNavigated, this));
       eventListeners.push(resourceTreeModel.addEventListener(SDK.ResourceTreeModel.Events.Load, this._onLoad, this));
@@ -72,10 +82,32 @@
    */
   modelRemoved(networkManager) {
     this._requestsByManagerAndId.delete(networkManager);
+    this._removeNetworkManagerListeners(networkManager);
+  }
+
+  /**
+   * @param {!SDK.NetworkManager} networkManager
+   */
+  _removeNetworkManagerListeners(networkManager) {
     Common.EventTarget.removeEventListeners(networkManager[NetworkLog.NetworkLog._events]);
   }
 
   /**
+   * @param {boolean} enabled
+   */
+  setIsRecording(enabled) {
+    if (this._isRecording === enabled)
+      return;
+    this._isRecording = enabled;
+    if (enabled) {
+      SDK.targetManager.observeModels(SDK.NetworkManager, this);
+    } else {
+      SDK.targetManager.unobserveModels(SDK.NetworkManager, this);
+      SDK.targetManager.models(SDK.NetworkManager).forEach(this._removeNetworkManagerListeners.bind(this));
+    }
+  }
+
+  /**
    * @param {string} url
    * @return {?SDK.NetworkRequest}
    */
@@ -233,7 +265,12 @@
    * @return {?NetworkLog.PageLoad}
    */
   pageLoadForRequest(request) {
-    return request[NetworkLog.NetworkLog._pageLoadForRequestSymbol];
+    return request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] || null;
+  }
+
+  _willReloadPage() {
+    if (!Common.moduleSetting('network_log.preserve-log').get())
+      this.reset();
   }
 
   /**
@@ -245,24 +282,47 @@
     if (!networkManager)
       return;
 
-    this._currentPageLoad.delete(networkManager);
-    var oldRequests = this.requestsForManager(networkManager);
-    this._requests = this._requests.filter(request => request.networkManager() !== networkManager);
+    var oldManagerRequests = this.requestsForManager(networkManager);
+    var oldRequestsSet = this._requestsSet;
+    this._requests = [];
+    this._requestsSet = new Set();
     var idMap = new Map();
+    // TODO(allada) This should be removed in a future patch, but if somewhere else does a request on this in a reset
+    // event it may cause problems.
     this._requestsByManagerAndId.set(networkManager, idMap);
+    this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.Reset);
 
     // Preserve requests from the new session.
     var currentPageLoad = null;
-    for (var i = 0; i < oldRequests.length; ++i) {
-      var request = oldRequests[i];
-      if (request.loaderId === mainFrame.loaderId) {
-        if (!currentPageLoad)
-          currentPageLoad = new NetworkLog.PageLoad(request);
+    var requestsToAdd = [];
+    for (var request of oldManagerRequests) {
+      if (request.loaderId !== mainFrame.loaderId)
+        continue;
+      if (!currentPageLoad) {
+        currentPageLoad = new NetworkLog.PageLoad(request);
+        if (request.redirects)
+          requestsToAdd.pushAll(request.redirects);
+      }
+      requestsToAdd.push(request);
+    }
+
+    for (var request of requestsToAdd) {
+      oldRequestsSet.delete(request);
+      this._requests.push(request);
+      this._requestsSet.add(request);
+      idMap.set(request.requestId(), request);
+      request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad;
+      this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request);
+    }
+
+    if (Common.moduleSetting('network_log.preserve-log').get()) {
+      for (var request of oldRequestsSet) {
         this._requests.push(request);
-        idMap.set(request.requestId(), request);
-        request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = currentPageLoad;
+        this._requestsSet.add(request);
+        this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request);
       }
     }
+
     if (currentPageLoad)
       this._currentPageLoad.set(networkManager, currentPageLoad);
   }
@@ -273,8 +333,23 @@
   _onRequestStarted(event) {
     var request = /** @type {!SDK.NetworkRequest} */ (event.data);
     this._requests.push(request);
-    this._requestsByManagerAndId.get(request.networkManager()).set(request.requestId(), request);
-    request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] = this._currentPageLoad.get(request.networkManager());
+    this._requestsSet.add(request);
+    var idMap = this._requestsByManagerAndId.get(request.networkManager());
+    if (idMap)
+      idMap.set(request.requestId(), request);
+    request[NetworkLog.NetworkLog._pageLoadForRequestSymbol] =
+        this._currentPageLoad.get(request.networkManager()) || null;
+    this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestAdded, request);
+  }
+
+  /**
+   * @param {!Common.Event} event
+   */
+  _onRequestUpdated(event) {
+    var request = /** @type {!SDK.NetworkRequest} */ (event.data);
+    if (!this._requestsSet.has(request))
+      return;
+    this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.RequestUpdated, request);
   }
 
   /**
@@ -315,6 +390,19 @@
     var map = this._requestsByManagerAndId.get(networkManager);
     return map ? (map.get(requestId) || null) : null;
   }
+
+  reset() {
+    this._requests = [];
+    this._requestsSet.clear();
+    this._requestsByManagerAndId.forEach(map => map.clear());
+    var networkManagers = new Set(SDK.targetManager.models(SDK.NetworkManager));
+    for (var networkManager of this._currentPageLoad.keys()) {
+      if (!networkManagers.has(networkManager))
+        this._currentPageLoad.delete(networkManager);
+    }
+
+    this.dispatchEventToListeners(NetworkLog.NetworkLog.Events.Reset);
+  }
 };
 
 NetworkLog.PageLoad = class {
@@ -329,6 +417,7 @@
     this.loadTime;
     /** @type {number} */
     this.contentLoadTime;
+    this.mainRequest = mainRequest;
   }
 };
 
@@ -337,6 +426,12 @@
 /** @typedef {!{initiators: !Set<!SDK.NetworkRequest>, initiated: !Set<!SDK.NetworkRequest>}} */
 NetworkLog.NetworkLog.InitiatorGraph;
 
+NetworkLog.NetworkLog.Events = {
+  Reset: Symbol('Reset'),
+  RequestAdded: Symbol('RequestAdded'),
+  RequestUpdated: Symbol('RequestUpdated')
+};
+
 /** @typedef {!{type: !SDK.NetworkRequest.InitiatorType, url: string, lineNumber: number, columnNumber: number, scriptId: ?string}} */
 NetworkLog.NetworkLog._InitiatorInfo;
 
diff --git a/third_party/WebKit/Source/devtools/front_end/network_log/module.json b/third_party/WebKit/Source/devtools/front_end/network_log/module.json
index 5cbaa3b..41b2e10b 100644
--- a/third_party/WebKit/Source/devtools/front_end/network_log/module.json
+++ b/third_party/WebKit/Source/devtools/front_end/network_log/module.json
@@ -1,4 +1,26 @@
 {
+    "extensions": [
+        {
+            "type": "setting",
+            "category": "Network",
+            "storageType": "session",
+            "title": "Preserve log",
+            "settingName": "network_log.preserve-log",
+            "settingType": "boolean",
+            "defaultValue": false,
+            "tags": "preserve, clear, reset",
+            "options": [
+                {
+                    "value": true,
+                    "title": "Do not preserve log on page reload / navigation"
+                },
+                {
+                    "value": false,
+                    "title": "Preserve log on page reload / navigation"
+                }
+            ]
+        }
+    ],
     "dependencies": [
         "sdk"
     ],
diff --git a/third_party/WebKit/Source/modules/accessibility/OWNERS b/third_party/WebKit/Source/modules/accessibility/OWNERS
index 5ec44f48..214d52cf 100644
--- a/third_party/WebKit/Source/modules/accessibility/OWNERS
+++ b/third_party/WebKit/Source/modules/accessibility/OWNERS
@@ -1,5 +1,6 @@
 aboxhall@chromium.org
 dmazzoni@chromium.org
+nektar@chromium.org
 
 # TEAM: chromium-accessibility@chromium.org
-# COMPONENT: UI>Accessibility
+# COMPONENT: Blink>Accessibility
diff --git a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
index a90a6064..67e0bf8 100644
--- a/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
+++ b/third_party/WebKit/Source/modules/webshare/NavigatorShare.cpp
@@ -12,6 +12,7 @@
 #include "core/frame/LocalFrame.h"
 #include "core/frame/Navigator.h"
 #include "modules/webshare/ShareData.h"
+#include "platform/bindings/V8ThrowException.h"
 #include "platform/mojo/MojoHelper.h"
 #include "public/platform/InterfaceProvider.h"
 #include "public/platform/Platform.h"
@@ -69,7 +70,6 @@
   if (error == mojom::blink::ShareError::OK) {
     resolver_->Resolve();
   } else {
-    // TODO(mgiuca): Work out which error type to use.
     resolver_->Reject(DOMException::Create(kAbortError, ErrorToString(error)));
   }
 }
@@ -109,6 +109,16 @@
     DOMException* error = DOMException::Create(kSecurityError, error_message);
     return ScriptPromise::RejectWithDOMException(script_state, error);
   }
+
+  Document* doc = ToDocument(ExecutionContext::From(script_state));
+  DCHECK(doc);
+  KURL full_url = doc->CompleteURL(share_data.url());
+  if (!full_url.IsNull() && !full_url.IsValid()) {
+    v8::Local<v8::Value> error = V8ThrowException::CreateTypeError(
+        script_state->GetIsolate(), "Invalid URL");
+    return ScriptPromise::Reject(script_state, error);
+  }
+
   if (!UserGestureIndicator::ProcessingUserGesture()) {
     DOMException* error = DOMException::Create(
         kSecurityError,
@@ -116,8 +126,6 @@
     return ScriptPromise::RejectWithDOMException(script_state, error);
   }
 
-  Document* doc = ToDocument(ExecutionContext::From(script_state));
-  DCHECK(doc);
   if (!service_) {
     LocalFrame* frame = doc->GetFrame();
     DCHECK(frame);
@@ -134,7 +142,7 @@
 
   service_->Share(share_data.hasTitle() ? share_data.title() : g_empty_string,
                   share_data.hasText() ? share_data.text() : g_empty_string,
-                  doc->CompleteURL(share_data.url()),
+                  full_url,
                   ConvertToBaseCallback(WTF::Bind(&ShareClientImpl::Callback,
                                                   WrapPersistent(client))));
 
diff --git a/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl b/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl
index 764b523d..49cdd07f 100644
--- a/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl
+++ b/third_party/WebKit/Source/modules/webshare/NavigatorShare.idl
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// https://github.com/WICG/web-share/blob/master/docs/interface.md
+// https://wicg.github.io/web-share/
 
 [
   OriginTrialEnabled=WebShare
diff --git a/third_party/WebKit/Source/modules/webshare/ShareData.idl b/third_party/WebKit/Source/modules/webshare/ShareData.idl
index 9bb123cc..3911fe7 100644
--- a/third_party/WebKit/Source/modules/webshare/ShareData.idl
+++ b/third_party/WebKit/Source/modules/webshare/ShareData.idl
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// https://github.com/WICG/web-share/blob/master/docs/interface.md
+// https://wicg.github.io/web-share/
 
 dictionary ShareData {
-  DOMString? title;
-  DOMString? text;
-  DOMString? url;
+  USVString title;
+  USVString text;
+  USVString url;
 };
diff --git a/third_party/WebKit/Source/platform/DEPS b/third_party/WebKit/Source/platform/DEPS
index eaaea96..4edbeed 100644
--- a/third_party/WebKit/Source/platform/DEPS
+++ b/third_party/WebKit/Source/platform/DEPS
@@ -23,6 +23,7 @@
     "+base/strings/stringprintf.h",
     "+base/synchronization/waitable_event.h",
     "+base/sys_info.h",
+    "+base/android/sys_utils.h",
     "+base/test",
     "+base/test/fuzzed_data_provider.h",
     "+base/threading/thread_task_runner_handle.h",
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
index e9cf30e..7e08795 100644
--- a/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
+++ b/third_party/WebKit/Source/platform/MemoryCoordinator.cpp
@@ -10,6 +10,10 @@
 #include "platform/instrumentation/tracing/TraceEvent.h"
 #include "platform/wtf/allocator/Partitions.h"
 
+#if OS(ANDROID)
+#include "base/android/sys_utils.h"
+#endif
+
 namespace blink {
 
 // static
@@ -33,6 +37,15 @@
 }
 
 // static
+bool MemoryCoordinator::IsCurrentlyLowMemory() {
+#if OS(ANDROID)
+  return base::android::SysUtils::IsCurrentlyLowMemory();
+#else
+  return false;
+#endif
+}
+
+// static
 void MemoryCoordinator::Initialize() {
   is_low_end_device_ = ::base::SysInfo::IsLowEndDevice();
   physical_memory_mb_ = ::base::SysInfo::AmountOfPhysicalMemoryMB();
diff --git a/third_party/WebKit/Source/platform/MemoryCoordinator.h b/third_party/WebKit/Source/platform/MemoryCoordinator.h
index c8e137b0..3149524 100644
--- a/third_party/WebKit/Source/platform/MemoryCoordinator.h
+++ b/third_party/WebKit/Source/platform/MemoryCoordinator.h
@@ -45,6 +45,11 @@
   // Override the value of the physical memory for testing.
   static void SetPhysicalMemoryMBForTesting(int64_t);
 
+  // Returns true when available memory is low.
+  // This is not cheap and should not be called repeatedly.
+  // TODO(keishi): Remove when MemoryState is ready.
+  static bool IsCurrentlyLowMemory();
+
   // Caches whether this device is a low-end device and the device physical
   // memory in static members. instance() is not used as it's a heap allocated
   // object - meaning it's not thread-safe as well as might break tests counting
diff --git a/third_party/libxml/README.chromium b/third_party/libxml/README.chromium
index d111b700..2622116c 100644
--- a/third_party/libxml/README.chromium
+++ b/third_party/libxml/README.chromium
@@ -1,6 +1,6 @@
 Name: libxml
 URL: http://xmlsoft.org
-Version: 074180119fc90d5fd04ef9e8a5ee1910d6f9ad8e
+Version: 3939178e4cb797417ff033b1e04ab4b038e224d9
 License: MIT
 License File: src/Copyright
 Security Critical: yes
@@ -14,14 +14,10 @@
   chromium/include/libxml/libxml_utils.h.
 - Applied these patches in chromium/*.patch:
   chromium-issue-599427.patch: workaround for VS 2015 Update 2 code-gen bug
-  chromium-issue-620679.patch: See https://crbug.com/620679#c34
   chromium-issue-628581.patch: See https://crbug.com/628581#c18
-  chromium-issue-683629.patch: See https://crbug.com/683629#c9
   libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch:
   See https://crbug.com/708433
   libxml2-2.9.4-security-xpath-nodetab-uaf.patch: See https://crbug.com/705445
-  libxml2-2.9.4-xmlDumpElementContent-null-deref.patch:
-  See https://crbug.com/700750
   chromium-issue-708434.patch: Guard against input counter overflow.
 - Delete various unused files, see chromium/roll.py
 
diff --git a/third_party/libxml/chromium/chromium-issue-620679.patch b/third_party/libxml/chromium/chromium-issue-620679.patch
deleted file mode 100644
index b2c8db9..0000000
--- a/third_party/libxml/chromium/chromium-issue-620679.patch
+++ /dev/null
@@ -1,24 +0,0 @@
-diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c
-index e3136123dca6..33786f08354d 100644
---- a/parser.c
-+++ b/parser.c
-@@ -3426,8 +3426,15 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
-         xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name");
-         return(NULL);
-     }
--    if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r'))
-+    if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) {
-+        if (ctxt->input->base > ctxt->input->cur - (len + 1)) {
-+            return(NULL);
-+        }
-         return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len));
-+    }
-+    if (ctxt->input->base > ctxt->input->cur - len) {
-+        return(NULL);
-+    }
-     return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len));
- }
- 
--- 
-2.12.2.715.g7642488e1d-goog
-
diff --git a/third_party/libxml/chromium/chromium-issue-683629.patch b/third_party/libxml/chromium/chromium-issue-683629.patch
deleted file mode 100644
index 0d068500..0000000
--- a/third_party/libxml/chromium/chromium-issue-683629.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-Fromdiff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c
-index 33786f08354d..745c3da1c72e 100644
---- a/parser.c
-+++ b/parser.c
-@@ -3426,7 +3426,7 @@ xmlParseNameComplex(xmlParserCtxtPtr ctxt) {
-         xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name");
-         return(NULL);
-     }
--    if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) {
-+    if (ctxt->input->cur > ctxt->input->base && (*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) {
-         if (ctxt->input->base > ctxt->input->cur - (len + 1)) {
-             return(NULL);
-         }
--- 
-2.12.2.715.g7642488e1d-goog
-
diff --git a/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch b/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch
index e60fe8fa..d0d877dc 100644
--- a/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch
+++ b/third_party/libxml/chromium/libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch
@@ -2,14 +2,6 @@
 
 --- src/uri.c
 +++ src/uri.c
-@@ -12,6 +12,7 @@
- #include "third_party/libxml/src/libxml.h"
- 
- #include <string.h>
-+#include <limits.h>
- 
- #include "third_party/libxml/src/include/libxml/xmlmemory.h"
- #include "third_party/libxml/src/include/libxml/uri.h"
 @@ -334,7 +335,7 @@ xmlParse3986Port(xmlURIPtr uri, const char **str)
  	    cur++;
  	}
diff --git a/third_party/libxml/chromium/libxml2-2.9.4-xmlDumpElementContent-null-deref.patch b/third_party/libxml/chromium/libxml2-2.9.4-xmlDumpElementContent-null-deref.patch
deleted file mode 100644
index ec28c85..0000000
--- a/third_party/libxml/chromium/libxml2-2.9.4-xmlDumpElementContent-null-deref.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-observed while fuzzing
-
---- src/valid.c
-+++ src/valid.c
-@@ -1172,12 +1172,14 @@ xmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob)
- 	    xmlBufferWriteCHAR(buf, content->name);
- 	    break;
- 	case XML_ELEMENT_CONTENT_SEQ:
-+	    if (content->c1 == NULL) return;
- 	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||
- 	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))
- 		xmlDumpElementContent(buf, content->c1, 1);
- 	    else
- 		xmlDumpElementContent(buf, content->c1, 0);
-             xmlBufferWriteChar(buf, " , ");
-+	    if (content->c2 == NULL) return;
- 	    if ((content->c2->type == XML_ELEMENT_CONTENT_OR) ||
- 	        ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) &&
- 		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))
-@@ -1186,12 +1188,14 @@ xmlDumpElementContent(xmlBufferPtr buf, xmlElementContentPtr content, int glob)
- 		xmlDumpElementContent(buf, content->c2, 0);
- 	    break;
- 	case XML_ELEMENT_CONTENT_OR:
-+	    if (content->c1 == NULL) return;
- 	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||
- 	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))
- 		xmlDumpElementContent(buf, content->c1, 1);
- 	    else
- 		xmlDumpElementContent(buf, content->c1, 0);
-             xmlBufferWriteChar(buf, " | ");
-+	    if (content->c2 == NULL) return;
- 	    if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) ||
- 	        ((content->c2->type == XML_ELEMENT_CONTENT_OR) &&
- 		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))
diff --git a/third_party/libxml/chromium/libxml_utils.cc b/third_party/libxml/chromium/libxml_utils.cc
index 1914cd6..4eed5d6 100644
--- a/third_party/libxml/chromium/libxml_utils.cc
+++ b/third_party/libxml/chromium/libxml_utils.cc
@@ -24,8 +24,7 @@
 
 bool XmlReader::Load(const std::string& input) {
   const int kParseOptions = XML_PARSE_RECOVER |  // recover on errors
-                            XML_PARSE_NONET |    // forbid network access
-                            XML_PARSE_NOXXE;     // no external entities
+                             XML_PARSE_NONET;    // forbid network access
   // TODO(evanm): Verify it's OK to pass NULL for the URL and encoding.
   // The libxml code allows for these, but it's unclear what effect is has.
   reader_ = xmlReaderForMemory(input.data(), static_cast<int>(input.size()),
@@ -35,8 +34,7 @@
 
 bool XmlReader::LoadFile(const std::string& file_path) {
   const int kParseOptions = XML_PARSE_RECOVER |  // recover on errors
-                            XML_PARSE_NONET |    // forbid network access
-                            XML_PARSE_NOXXE;     // no external entities
+                            XML_PARSE_NONET;     // forbid network access
   reader_ = xmlReaderForFile(file_path.c_str(), NULL, kParseOptions);
   return reader_ != NULL;
 }
diff --git a/third_party/libxml/chromium/roll.py b/third_party/libxml/chromium/roll.py
index 44cac5de..fa837c8 100755
--- a/third_party/libxml/chromium/roll.py
+++ b/third_party/libxml/chromium/roll.py
@@ -72,12 +72,9 @@
 
 PATCHES = [
     'chromium-issue-599427.patch',
-    'chromium-issue-620679.patch',
     'chromium-issue-628581.patch',
-    'chromium-issue-683629.patch',
     'libxml2-2.9.4-security-CVE-2017-7376-nanohttp-out-of-bounds-write.patch',
     'libxml2-2.9.4-security-xpath-nodetab-uaf.patch',
-    'libxml2-2.9.4-xmlDumpElementContent-null-deref.patch',
     'chromium-issue-708434.patch',
 ]
 
@@ -343,6 +340,7 @@
                          's/Version: .*$/Version: %s/' % commit)
 
             for patch in PATCHES:
+                print(patch)
                 subprocess.check_call(
                     'cat ../chromium/%s | patch -p1 --fuzz=0' % patch,
                     shell=True)
diff --git a/third_party/libxml/src/HTMLparser.c b/third_party/libxml/src/HTMLparser.c
index d1395fa50..22ec576 100644
--- a/third_party/libxml/src/HTMLparser.c
+++ b/third_party/libxml/src/HTMLparser.c
@@ -2528,8 +2528,12 @@
 	}
     }
 
-    if (ctxt->input->base > ctxt->input->cur - len)
-	return(NULL);
+    if (ctxt->input->cur - ctxt->input->base < len) {
+        /* Sanity check */
+	htmlParseErr(ctxt, XML_ERR_INTERNAL_ERROR,
+                     "unexpected change of input buffer", NULL, NULL);
+        return (NULL);
+    }
 
     return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len));
 }
@@ -4444,7 +4448,7 @@
 htmlParseElementInternal(htmlParserCtxtPtr ctxt) {
     const xmlChar *name;
     const htmlElemDesc * info;
-    htmlParserNodeInfo node_info = { 0, };
+    htmlParserNodeInfo node_info = { NULL, 0, 0, 0, 0 };
     int failed;
 
     if ((ctxt == NULL) || (ctxt->input == NULL)) {
@@ -4941,6 +4945,7 @@
     ctxt->wellFormed = 1;
     ctxt->replaceEntities = 0;
     ctxt->linenumbers = xmlLineNumbersDefaultValue;
+    ctxt->keepBlanks = xmlKeepBlanksDefaultValue;
     ctxt->html = 1;
     ctxt->vctxt.finishDtd = XML_CTXT_FINISH_DTD_0;
     ctxt->vctxt.userData = ctxt;
diff --git a/third_party/libxml/src/Makefile.am b/third_party/libxml/src/Makefile.am
index 9f988b0..51b253e 100644
--- a/third_party/libxml/src/Makefile.am
+++ b/third_party/libxml/src/Makefile.am
@@ -205,7 +205,12 @@
 runtests:
 	[ -d test   ] || $(LN_S) $(srcdir)/test   .
 	[ -d result ] || $(LN_S) $(srcdir)/result .
-	$(CHECKER) ./runtest$(EXEEXT) && $(CHECKER) ./testrecurse$(EXEEXT) &&$(CHECKER) ./testapi$(EXEEXT) && $(CHECKER) ./testchar$(EXEEXT)&& $(CHECKER) ./testdict$(EXEEXT) && $(CHECKER) ./runxmlconf$(EXEEXT)
+	$(CHECKER) ./runtest$(EXEEXT) && \
+	    $(CHECKER) ./testrecurse$(EXEEXT) && \
+	    ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) ./testapi$(EXEEXT) && \
+	    $(CHECKER) ./testchar$(EXEEXT) && \
+	    $(CHECKER) ./testdict$(EXEEXT) && \
+	    $(CHECKER) ./runxmlconf$(EXEEXT)
 	@(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \
 	    $(MAKE) tests ; fi)
 
@@ -224,12 +229,12 @@
 
 tests: XMLtests XMLenttests NStests IDtests Errtests APItests $(READER_TEST) $(TEST_SAX) $(TEST_PUSH) $(TEST_HTML) $(TEST_PHTML) $(TEST_VALID) URItests $(TEST_PATTERN) $(TEST_XPATH) $(TEST_XPTR) $(TEST_XINCLUDE) $(TEST_C14N) $(TEST_DEBUG) $(TEST_CATALOG) $(TEST_REGEXPS) $(TEST_SCHEMAS) $(TEST_SCHEMATRON) $(TEST_THREADS) Timingtests $(TEST_VTIME) $(PYTHON_TESTS) $(TEST_MODULES)
 	@(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \
-	    $(MAKE) tests ; fi)
-	@(cd doc/examples ; $(MAKE) tests)
+	    $(MAKE) -s tests ; fi)
+	@(cd doc/examples ; $(MAKE) -s tests)
 
 APItests: testapi$(EXEEXT)
 	@echo "## Running the API regression tests this may take a little while"
-	-@($(CHECKER) $(top_builddir)/testapi -q)
+	-@(ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) $(top_builddir)/testapi -q)
 
 HTMLtests : testHTML$(EXEEXT)
 	@(echo > .memdump)
@@ -247,7 +252,7 @@
 	      diff -b $(srcdir)/result/HTML/$$name.err error.$$name ; \
 	      $(CHECKER) $(top_builddir)/testHTML result.$$name > result2.$$name 2>error.$$name ; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -268,7 +273,7 @@
 	      diff -b errorcut.$$name errorcut2.$$name ; \
 	      $(CHECKER) $(top_builddir)/testHTML --push result.$$name > result2.$$name 2>error.$$name ; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name error.$$name errorcut.$$name errorcut2.$$name ; \
 	  fi ; fi ; done)
 	@echo "## HTML SAX regression tests"
@@ -282,7 +287,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testHTML --sax $$i > result.$$name.sax ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name.sax ; \
 	  fi ; fi ; done)
 	@echo "## Push HTML SAX regression tests"
@@ -296,7 +301,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testHTML --push --sax $$i 2>&1 > result.$$name.sax ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name.sax ; \
 	  fi ; fi ; done)
 
@@ -317,7 +322,7 @@
 	      $(CHECKER) $(top_builddir)/xmllint result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff result.$$name result2.$$name` ;\
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
 	@echo "## XML regression tests on memory"
@@ -334,7 +339,7 @@
 	      diff $(srcdir)/result/$$name result.$$name ; \
 	      $(CHECKER) $(top_builddir)/xmllint --memory result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"`; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      diff result.$$name result2.$$name ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
@@ -356,7 +361,7 @@
 	      $(CHECKER) $(top_builddir)/xmllint --push result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
 
@@ -377,7 +382,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/namespaces/$$name result.$$name ; \
 	      diff $(srcdir)/result/namespaces/$$name.err error.$$name`; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -398,7 +403,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/xmlid/$$name result.$$name ; \
 	      diff $(srcdir)/result/xmlid/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -419,7 +424,25 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/errors/$$name result.$$name ; \
 	      diff $(srcdir)/result/errors/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
+	      rm result.$$name error.$$name ; \
+	  fi ; fi ; done)
+	@echo "## Error cases regression tests (old 1.0)"
+	-@(for i in $(srcdir)/test/errors10/*.xml ; do \
+	  name=`basename $$i`; \
+	  if [ ! -d $$i ] ; then \
+	  if [ ! -f $(srcdir)/result/errors10/$$name ] ; then \
+	      echo New test file $$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i \
+	         2> $(srcdir)/result/errors10/$$name.err \
+		 > $(srcdir)/result/errors10/$$name ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
+	  else \
+	      log=`$(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i 2> error.$$name > result.$$name ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
+	      diff $(srcdir)/result/errors10/$$name result.$$name ; \
+	      diff $(srcdir)/result/errors10/$$name.err error.$$name` ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Error cases stream regression tests"
@@ -436,7 +459,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --stream $$i 2> error.$$name > /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/errors/$$name.str error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm error.$$name ; \
 	  fi ; fi ; done)
 
@@ -459,7 +482,7 @@
 	      $(CHECKER) $(top_builddir)/xmllint --noent result.$$name 2>&1 > result2.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
 
@@ -477,7 +500,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testURI -base 'http://foo.com/path/to/index.html?orig#help' < $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/URI/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/URI/*.uri ; do \
@@ -491,7 +514,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testURI < $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/URI/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -505,13 +528,13 @@
 	  if [ ! -d $$i ] ; then \
 	  if [ ! -f $(srcdir)/result/XPath/expr/$$name ] ; then \
 	      echo New test file $$name ; \
-	      $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name ; \
+	      $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	  else \
-	      log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i 2>&1 > result.$$name ; \
+	      log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XPath/expr/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ; \
 	  for i in $(srcdir)/test/XPath/docs/* ; do \
@@ -526,10 +549,10 @@
 	      $(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > $(srcdir)/result/XPath/tests/$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	  else \
-	      log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j 2>&1 > result.$$name ; \
+	      log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XPath/tests/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ; fi ; done)
 
@@ -547,13 +570,13 @@
 	  if [ ! -d $$j ] ; then \
 	  if [ ! -f $(srcdir)/result/XPath/xptr/$$name ] ; then \
 	      echo New test file $$name ; \
-	      $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name ; \
+	      $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	  else \
-	      log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j 2>&1 > result.$$name ; \
+	      log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XPath/xptr/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ; fi ; done)
 
@@ -572,7 +595,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name result.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/XInclude/docs/* ; do \
@@ -587,7 +610,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name result.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	@(echo > .memdump)
@@ -604,7 +627,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/XInclude/docs/* ; do \
@@ -619,7 +642,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -640,7 +663,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/scripts/$$name result.$$name ; \
 	      diff $(srcdir)/result/scripts/$$name.err result.$$name.err` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result.$$name.err ; \
 	  fi ; fi ; done)
 
@@ -659,7 +682,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$xml < $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/catalogs/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/catalogs/*.script ; do \
@@ -674,7 +697,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$sgml < $$i > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/catalogs/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Add and del operations on XML Catalogs"
@@ -738,7 +761,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Reader on memory regression tests"
@@ -753,7 +776,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --memory --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@(echo > .memdump)
@@ -769,7 +792,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --walker $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Reader entities substitution regression tests"
@@ -784,7 +807,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --noent --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rde result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -802,7 +825,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testSAX $$i > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.sax result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## SAX2 callbacks regression tests"
@@ -817,7 +840,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testSAX --sax2 $$i > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.sax2 result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -829,7 +852,7 @@
 	  if [ ! -d $$i ] ; then \
 	      log=`$(CHECKER) $(top_builddir)/xmllint --valid --noout --nowarning $$i ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"`;\
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	  fi ; done ; exit 0)
 	@echo "## Validity checking regression tests"
 	-@(for i in $(srcdir)/test/VC/* ; do \
@@ -843,7 +866,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --noout --valid $$i 2> result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/VC/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## General documents valid regression tests"
@@ -859,7 +882,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/valid/$$name result.$$name ; \
 	      diff $(srcdir)/result/valid/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -877,7 +900,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testRegexp -i $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/regexp/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Formal expresssions regression tests"
@@ -892,7 +915,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testRegexp --expr -i $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/expr/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -910,7 +933,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testAutomata $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/automata/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -961,7 +984,7 @@
 			    cmdline="$$cmdline '`cat $(srcdir)/test/c14n/$$m/$$name.ns`'"; \
 			fi; \
 		    fi; \
-		    $$cmdline > $(srcdir)/test/c14n/test.tmp; \
+		    $$cmdline > $(srcdir)/test/c14n/test.tmp 2> /dev/null; \
 		    if [ $$? -eq 0 ]; then \
 			diff  $(srcdir)/result/c14n/$$m/$$name $(srcdir)/test/c14n/test.tmp; \
 			if [ $$? -ne 0 ]; then \
@@ -1002,7 +1025,7 @@
 	          diff $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno".err \
 		       err.$$name;\
 		  grep Unimplemented err.$$name`; \
-	          if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo $$log ; fi ; \
+	          if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ;\
 	  done; done)
@@ -1027,7 +1050,7 @@
 	      diff $(srcdir)/result/relaxng/"$$name"_err \
 		   err.$$name | grep -v "error detected at";\
 	      grep Unimplemented err.$$name`; \
-	      if [ -n "$$log" ] ; then echo schemas $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo schemas $$name result ; echo "$$log" ; fi ; \
 	      rm res.$$name err.$$name ; \
 	  fi; \
 	  for j in $(srcdir)/test/relaxng/"$$name"_*.xml ; do \
@@ -1049,7 +1072,7 @@
 	          diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \
 		       err.$$name | grep -v "error detected at";\
 		  grep Unimplemented err.$$name`; \
-		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \
+		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ; \
 	  done; done)
@@ -1075,7 +1098,7 @@
 		      diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \
 			   err.$$name | grep -v "error detected at";\
 		  fi ; grep Unimplemented err.$$name`; \
-	          if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \
+	          if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ; \
 	  done; done)
@@ -1104,7 +1127,7 @@
 	          diff $(srcdir)/result/schematron/"$$name"_"$$xno".err \
 		       err.$$name | grep -v "error detected at";\
 		  grep Unimplemented err.$$name`; \
-		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \
+		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ; \
 	  done; done)
@@ -1153,7 +1176,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      done ;\
 	      diff $(srcdir)/result/pattern/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ;)
 
diff --git a/third_party/libxml/src/Makefile.in b/third_party/libxml/src/Makefile.in
index b406cce64..b9e3056 100644
--- a/third_party/libxml/src/Makefile.in
+++ b/third_party/libxml/src/Makefile.in
@@ -1907,7 +1907,12 @@
 runtests:
 	[ -d test   ] || $(LN_S) $(srcdir)/test   .
 	[ -d result ] || $(LN_S) $(srcdir)/result .
-	$(CHECKER) ./runtest$(EXEEXT) && $(CHECKER) ./testrecurse$(EXEEXT) &&$(CHECKER) ./testapi$(EXEEXT) && $(CHECKER) ./testchar$(EXEEXT)&& $(CHECKER) ./testdict$(EXEEXT) && $(CHECKER) ./runxmlconf$(EXEEXT)
+	$(CHECKER) ./runtest$(EXEEXT) && \
+	    $(CHECKER) ./testrecurse$(EXEEXT) && \
+	    ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) ./testapi$(EXEEXT) && \
+	    $(CHECKER) ./testchar$(EXEEXT) && \
+	    $(CHECKER) ./testdict$(EXEEXT) && \
+	    $(CHECKER) ./runxmlconf$(EXEEXT)
 	@(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \
 	    $(MAKE) tests ; fi)
 
@@ -1926,12 +1931,12 @@
 
 tests: XMLtests XMLenttests NStests IDtests Errtests APItests $(READER_TEST) $(TEST_SAX) $(TEST_PUSH) $(TEST_HTML) $(TEST_PHTML) $(TEST_VALID) URItests $(TEST_PATTERN) $(TEST_XPATH) $(TEST_XPTR) $(TEST_XINCLUDE) $(TEST_C14N) $(TEST_DEBUG) $(TEST_CATALOG) $(TEST_REGEXPS) $(TEST_SCHEMAS) $(TEST_SCHEMATRON) $(TEST_THREADS) Timingtests $(TEST_VTIME) $(PYTHON_TESTS) $(TEST_MODULES)
 	@(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; \
-	    $(MAKE) tests ; fi)
-	@(cd doc/examples ; $(MAKE) tests)
+	    $(MAKE) -s tests ; fi)
+	@(cd doc/examples ; $(MAKE) -s tests)
 
 APItests: testapi$(EXEEXT)
 	@echo "## Running the API regression tests this may take a little while"
-	-@($(CHECKER) $(top_builddir)/testapi -q)
+	-@(ASAN_OPTIONS="$$ASAN_OPTIONS:detect_leaks=0" $(CHECKER) $(top_builddir)/testapi -q)
 
 HTMLtests : testHTML$(EXEEXT)
 	@(echo > .memdump)
@@ -1949,7 +1954,7 @@
 	      diff -b $(srcdir)/result/HTML/$$name.err error.$$name ; \
 	      $(CHECKER) $(top_builddir)/testHTML result.$$name > result2.$$name 2>error.$$name ; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -1970,7 +1975,7 @@
 	      diff -b errorcut.$$name errorcut2.$$name ; \
 	      $(CHECKER) $(top_builddir)/testHTML --push result.$$name > result2.$$name 2>error.$$name ; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name error.$$name errorcut.$$name errorcut2.$$name ; \
 	  fi ; fi ; done)
 	@echo "## HTML SAX regression tests"
@@ -1984,7 +1989,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testHTML --sax $$i > result.$$name.sax ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name.sax ; \
 	  fi ; fi ; done)
 	@echo "## Push HTML SAX regression tests"
@@ -1998,7 +2003,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testHTML --push --sax $$i 2>&1 > result.$$name.sax ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/HTML/$$name.sax result.$$name.sax` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name.sax ; \
 	  fi ; fi ; done)
 
@@ -2019,7 +2024,7 @@
 	      $(CHECKER) $(top_builddir)/xmllint result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff result.$$name result2.$$name` ;\
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
 	@echo "## XML regression tests on memory"
@@ -2036,7 +2041,7 @@
 	      diff $(srcdir)/result/$$name result.$$name ; \
 	      $(CHECKER) $(top_builddir)/xmllint --memory result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"`; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      diff result.$$name result2.$$name ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
@@ -2058,7 +2063,7 @@
 	      $(CHECKER) $(top_builddir)/xmllint --push result.$$name 2>&1 > result2.$$name | grep -v 'failed to load external entity' ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
 
@@ -2079,7 +2084,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/namespaces/$$name result.$$name ; \
 	      diff $(srcdir)/result/namespaces/$$name.err error.$$name`; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -2100,7 +2105,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/xmlid/$$name result.$$name ; \
 	      diff $(srcdir)/result/xmlid/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -2121,7 +2126,25 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/errors/$$name result.$$name ; \
 	      diff $(srcdir)/result/errors/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
+	      rm result.$$name error.$$name ; \
+	  fi ; fi ; done)
+	@echo "## Error cases regression tests (old 1.0)"
+	-@(for i in $(srcdir)/test/errors10/*.xml ; do \
+	  name=`basename $$i`; \
+	  if [ ! -d $$i ] ; then \
+	  if [ ! -f $(srcdir)/result/errors10/$$name ] ; then \
+	      echo New test file $$name ; \
+	      $(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i \
+	         2> $(srcdir)/result/errors10/$$name.err \
+		 > $(srcdir)/result/errors10/$$name ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
+	  else \
+	      log=`$(CHECKER) $(top_builddir)/xmllint --oldxml10 $$i 2> error.$$name > result.$$name ; \
+	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
+	      diff $(srcdir)/result/errors10/$$name result.$$name ; \
+	      diff $(srcdir)/result/errors10/$$name.err error.$$name` ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Error cases stream regression tests"
@@ -2138,7 +2161,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --stream $$i 2> error.$$name > /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff $(srcdir)/result/errors/$$name.str error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm error.$$name ; \
 	  fi ; fi ; done)
 
@@ -2161,7 +2184,7 @@
 	      $(CHECKER) $(top_builddir)/xmllint --noent result.$$name 2>&1 > result2.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	      diff result.$$name result2.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result2.$$name ; \
 	  fi ; fi ; done)
 
@@ -2179,7 +2202,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testURI -base 'http://foo.com/path/to/index.html?orig#help' < $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/URI/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/URI/*.uri ; do \
@@ -2193,7 +2216,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testURI < $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/URI/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -2207,13 +2230,13 @@
 	  if [ ! -d $$i ] ; then \
 	  if [ ! -f $(srcdir)/result/XPath/expr/$$name ] ; then \
 	      echo New test file $$name ; \
-	      $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name ; \
+	      $(CHECKER) $(top_builddir)/testXPath -f --expr $$i > $(srcdir)/result/XPath/expr/$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	  else \
-	      log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i 2>&1 > result.$$name ; \
+	      log=`$(CHECKER) $(top_builddir)/testXPath -f --expr $$i > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XPath/expr/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ; \
 	  for i in $(srcdir)/test/XPath/docs/* ; do \
@@ -2228,10 +2251,10 @@
 	      $(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > $(srcdir)/result/XPath/tests/$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	  else \
-	      log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j 2>&1 > result.$$name ; \
+	      log=`$(CHECKER) $(top_builddir)/testXPath -f -i $$i $$j > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XPath/tests/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ; fi ; done)
 
@@ -2249,13 +2272,13 @@
 	  if [ ! -d $$j ] ; then \
 	  if [ ! -f $(srcdir)/result/XPath/xptr/$$name ] ; then \
 	      echo New test file $$name ; \
-	      $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name ; \
+	      $(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > $(srcdir)/result/XPath/xptr/$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"; \
 	  else \
-	      log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j 2>&1 > result.$$name ; \
+	      log=`$(CHECKER) $(top_builddir)/testXPath -xptr -f -i $$i $$j > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XPath/xptr/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ; fi ; done)
 
@@ -2274,7 +2297,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name result.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/XInclude/docs/* ; do \
@@ -2289,7 +2312,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name result.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	@(echo > .memdump)
@@ -2306,7 +2329,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/XInclude/docs/* ; do \
@@ -2321,7 +2344,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/XInclude/$$name.err error.$$name ; \
 	      diff $(srcdir)/result/XInclude/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -2342,7 +2365,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/scripts/$$name result.$$name ; \
 	      diff $(srcdir)/result/scripts/$$name.err result.$$name.err` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name result.$$name.err ; \
 	  fi ; fi ; done)
 
@@ -2361,7 +2384,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$xml < $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/catalogs/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	-@(for i in $(srcdir)/test/catalogs/*.script ; do \
@@ -2376,7 +2399,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmlcatalog --shell $$sgml < $$i > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/catalogs/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Add and del operations on XML Catalogs"
@@ -2440,7 +2463,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Reader on memory regression tests"
@@ -2455,7 +2478,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --memory --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@(echo > .memdump)
@@ -2471,7 +2494,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --nonet --debug --walker $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rdr result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Reader entities substitution regression tests"
@@ -2486,7 +2509,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --noent --nonet --debug --stream $$i > result.$$name 2>/dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.rde result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -2504,7 +2527,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testSAX $$i > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.sax result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## SAX2 callbacks regression tests"
@@ -2519,7 +2542,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testSAX --sax2 $$i > result.$$name 2> /dev/null ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/$$name.sax2 result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -2531,7 +2554,7 @@
 	  if [ ! -d $$i ] ; then \
 	      log=`$(CHECKER) $(top_builddir)/xmllint --valid --noout --nowarning $$i ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0"`;\
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	  fi ; done ; exit 0)
 	@echo "## Validity checking regression tests"
 	-@(for i in $(srcdir)/test/VC/* ; do \
@@ -2545,7 +2568,7 @@
 	      log=`$(CHECKER) $(top_builddir)/xmllint --noout --valid $$i 2> result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/VC/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## General documents valid regression tests"
@@ -2561,7 +2584,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/valid/$$name result.$$name ; \
 	      diff $(srcdir)/result/valid/$$name.err error.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name error.$$name ; \
 	  fi ; fi ; done)
 
@@ -2579,7 +2602,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testRegexp -i $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/regexp/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 	@echo "## Formal expresssions regression tests"
@@ -2594,7 +2617,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testRegexp --expr -i $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/expr/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -2612,7 +2635,7 @@
 	      log=`$(CHECKER) $(top_builddir)/testAutomata $$i 2>&1 > result.$$name ; \
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      diff $(srcdir)/result/automata/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done)
 
@@ -2663,7 +2686,7 @@
 			    cmdline="$$cmdline '`cat $(srcdir)/test/c14n/$$m/$$name.ns`'"; \
 			fi; \
 		    fi; \
-		    $$cmdline > $(srcdir)/test/c14n/test.tmp; \
+		    $$cmdline > $(srcdir)/test/c14n/test.tmp 2> /dev/null; \
 		    if [ $$? -eq 0 ]; then \
 			diff  $(srcdir)/result/c14n/$$m/$$name $(srcdir)/test/c14n/test.tmp; \
 			if [ $$? -ne 0 ]; then \
@@ -2704,7 +2727,7 @@
 	          diff $(srcdir)/result/schemas/"$$name"_"$$sno"_"$$xno".err \
 		       err.$$name;\
 		  grep Unimplemented err.$$name`; \
-	          if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo $$log ; fi ; \
+	          if [ -n "$$log" ] ; then echo "$$name"_"$$sno"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ;\
 	  done; done)
@@ -2729,7 +2752,7 @@
 	      diff $(srcdir)/result/relaxng/"$$name"_err \
 		   err.$$name | grep -v "error detected at";\
 	      grep Unimplemented err.$$name`; \
-	      if [ -n "$$log" ] ; then echo schemas $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo schemas $$name result ; echo "$$log" ; fi ; \
 	      rm res.$$name err.$$name ; \
 	  fi; \
 	  for j in $(srcdir)/test/relaxng/"$$name"_*.xml ; do \
@@ -2751,7 +2774,7 @@
 	          diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \
 		       err.$$name | grep -v "error detected at";\
 		  grep Unimplemented err.$$name`; \
-		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \
+		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ; \
 	  done; done)
@@ -2777,7 +2800,7 @@
 		      diff $(srcdir)/result/relaxng/"$$name"_"$$xno".err \
 			   err.$$name | grep -v "error detected at";\
 		  fi ; grep Unimplemented err.$$name`; \
-	          if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \
+	          if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ; \
 	  done; done)
@@ -2806,7 +2829,7 @@
 	          diff $(srcdir)/result/schematron/"$$name"_"$$xno".err \
 		       err.$$name | grep -v "error detected at";\
 		  grep Unimplemented err.$$name`; \
-		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo $$log ; fi ; \
+		  if [ -n "$$log" ] ; then echo "$$name"_"$$xno" result ; echo "$$log" ; fi ; \
 	          rm res.$$name err.$$name ; \
 	       fi ; fi ; \
 	  done; done)
@@ -2855,7 +2878,7 @@
 	      grep "MORY ALLO" .memdump  | grep -v "MEMORY ALLOCATED : 0";\
 	      done ;\
 	      diff $(srcdir)/result/pattern/$$name result.$$name` ; \
-	      if [ -n "$$log" ] ; then echo $$name result ; echo $$log ; fi ; \
+	      if [ -n "$$log" ] ; then echo $$name result ; echo "$$log" ; fi ; \
 	      rm result.$$name ; \
 	  fi ; fi ; done ;)
 
diff --git a/third_party/libxml/src/buf.c b/third_party/libxml/src/buf.c
index 07922ff..3b7601855 100644
--- a/third_party/libxml/src/buf.c
+++ b/third_party/libxml/src/buf.c
@@ -231,7 +231,7 @@
 xmlBufCreateStatic(void *mem, size_t size) {
     xmlBufPtr ret;
 
-    if ((mem == NULL) || (size == 0))
+    if (mem == NULL)
         return(NULL);
 
     ret = (xmlBufPtr) xmlMalloc(sizeof(xmlBuf));
diff --git a/third_party/libxml/src/elfgcchack.h b/third_party/libxml/src/elfgcchack.h
index 1b81dcde..8c52884 100644
--- a/third_party/libxml/src/elfgcchack.h
+++ b/third_party/libxml/src/elfgcchack.h
@@ -6547,16 +6547,6 @@
 #endif
 #endif
 
-#ifdef bottom_xmlIO
-#undef xmlNoXxeExternalEntityLoader
-extern __typeof (xmlNoXxeExternalEntityLoader) xmlNoXxeExternalEntityLoader __attribute((alias("xmlNoXxeExternalEntityLoader__internal_alias")));
-#else
-#ifndef xmlNoXxeExternalEntityLoader
-extern __typeof (xmlNoXxeExternalEntityLoader) xmlNoXxeExternalEntityLoader__internal_alias __attribute((visibility("hidden")));
-#define xmlNoXxeExternalEntityLoader xmlNoXxeExternalEntityLoader__internal_alias
-#endif
-#endif
-
 #ifdef bottom_tree
 #undef xmlNodeAddContent
 extern __typeof (xmlNodeAddContent) xmlNodeAddContent __attribute((alias("xmlNodeAddContent__internal_alias")));
diff --git a/third_party/libxml/src/gentest.py b/third_party/libxml/src/gentest.py
index f1786205..e4a8932 100755
--- a/third_party/libxml/src/gentest.py
+++ b/third_party/libxml/src/gentest.py
@@ -782,6 +782,24 @@
 	test.write("        %s = gen_%s(n_%s, %d);\n" % (nam, type, nam, i))
 	i = i + 1;
 
+    # add checks to avoid out-of-bounds array access
+    i = 0;
+    for arg in t_args:
+        (nam, type, rtype, crtype, info) = arg;
+        # assume that "size", "len", and "start" parameters apply to either
+        # the nearest preceding or following char pointer
+        if type == "int" and (nam == "size" or nam == "len" or nam == "start"):
+            for j in range(i - 1, -1, -1) + range(i + 1, len(t_args)):
+                (bnam, btype) = t_args[j][:2]
+                if btype == "const_char_ptr" or btype == "const_xmlChar_ptr":
+                    test.write(
+                        "        if ((%s != NULL) &&\n"
+                        "            (%s > (int) strlen((const char *) %s) + 1))\n"
+                        "            continue;\n"
+                        % (bnam, nam, bnam))
+                    break
+	i = i + 1;
+
     # do the call, and clanup the result
     if extra_pre_call.has_key(name):
 	test.write("        %s\n"% (extra_pre_call[name]))
diff --git a/third_party/libxml/src/include/libxml/parser.h b/third_party/libxml/src/include/libxml/parser.h
index 63ca1b9..47fbec0 100644
--- a/third_party/libxml/src/include/libxml/parser.h
+++ b/third_party/libxml/src/include/libxml/parser.h
@@ -1111,8 +1111,7 @@
     XML_PARSE_HUGE      = 1<<19,/* relax any hardcoded limit from the parser */
     XML_PARSE_OLDSAX    = 1<<20,/* parse using SAX2 interface before 2.7.0 */
     XML_PARSE_IGNORE_ENC= 1<<21,/* ignore internal document encoding hint */
-    XML_PARSE_BIG_LINES = 1<<22,/* Store big lines numbers in text PSVI field */
-    XML_PARSE_NOXXE	= 1<<23 /* Forbid any external entity loading */
+    XML_PARSE_BIG_LINES = 1<<22 /* Store big lines numbers in text PSVI field */
 } xmlParserOption;
 
 XMLPUBFUN void XMLCALL
diff --git a/third_party/libxml/src/include/libxml/xmlIO.h b/third_party/libxml/src/include/libxml/xmlIO.h
index 8d3fdef5..3e41744d 100644
--- a/third_party/libxml/src/include/libxml/xmlIO.h
+++ b/third_party/libxml/src/include/libxml/xmlIO.h
@@ -300,14 +300,6 @@
 					 xmlParserCtxtPtr ctxt);
 
 /*
- * A predefined entity loader external entity expansion
- */
-XMLPUBFUN xmlParserInputPtr XMLCALL
-	xmlNoXxeExternalEntityLoader	(const char *URL,
-					 const char *ID,
-					 xmlParserCtxtPtr ctxt);
-
-/*
  * xmlNormalizeWindowsPath is obsolete, don't use it.
  * Check xmlCanonicPath in uri.h for a better alternative.
  */
diff --git a/third_party/libxml/src/include/libxml/xmlerror.h b/third_party/libxml/src/include/libxml/xmlerror.h
index 3036062..037c16d5 100644
--- a/third_party/libxml/src/include/libxml/xmlerror.h
+++ b/third_party/libxml/src/include/libxml/xmlerror.h
@@ -470,7 +470,6 @@
     XML_IO_EADDRINUSE, /* 1554 */
     XML_IO_EALREADY, /* 1555 */
     XML_IO_EAFNOSUPPORT, /* 1556 */
-    XML_IO_ILLEGAL_XXE, /* 1557 */
     XML_XINCLUDE_RECURSION=1600,
     XML_XINCLUDE_PARSE_VALUE, /* 1601 */
     XML_XINCLUDE_ENTITY_DEF_MISMATCH, /* 1602 */
diff --git a/third_party/libxml/src/libxml2.spec b/third_party/libxml/src/libxml2.spec
index 5d45692..404a758 100644
--- a/third_party/libxml/src/libxml2.spec
+++ b/third_party/libxml/src/libxml2.spec
@@ -194,6 +194,6 @@
 %endif # with_python3
 
 %changelog
-* Mon Apr 10 2017 Daniel Veillard <veillard@redhat.com>
+* Wed Jun 14 2017 Daniel Veillard <veillard@redhat.com>
 - upstream release 2.9.4 see http://xmlsoft.org/news.html
 
diff --git a/third_party/libxml/src/macos/src/XMLTestPrefix.h b/third_party/libxml/src/macos/src/XMLTestPrefix.h
index 594c9b76..3e84255 100644
--- a/third_party/libxml/src/macos/src/XMLTestPrefix.h
+++ b/third_party/libxml/src/macos/src/XMLTestPrefix.h
Binary files differ
diff --git a/third_party/libxml/src/macos/src/XMLTestPrefix2.h b/third_party/libxml/src/macos/src/XMLTestPrefix2.h
index 0431ed4..55df51e 100644
--- a/third_party/libxml/src/macos/src/XMLTestPrefix2.h
+++ b/third_party/libxml/src/macos/src/XMLTestPrefix2.h
Binary files differ
diff --git a/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp b/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp
index b5d1feb..77d0c93 100644
--- a/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp
+++ b/third_party/libxml/src/macos/src/libxml2_GUSIConfig.cp
Binary files differ
diff --git a/third_party/libxml/src/macos/src/macos_main.c b/third_party/libxml/src/macos/src/macos_main.c
index 4187dfc..2625000 100644
--- a/third_party/libxml/src/macos/src/macos_main.c
+++ b/third_party/libxml/src/macos/src/macos_main.c
Binary files differ
diff --git a/third_party/libxml/src/parser.c b/third_party/libxml/src/parser.c
index e3f3fbd7..ac50643 100644
--- a/third_party/libxml/src/parser.c
+++ b/third_party/libxml/src/parser.c
@@ -43,6 +43,7 @@
 #include <limits.h>
 #include <string.h>
 #include <stdarg.h>
+#include <stddef.h>
 #include <libxml/xmlmemory.h>
 #include <libxml/threads.h>
 #include <libxml/globals.h>
@@ -1093,7 +1094,12 @@
 struct _xmlDefAttrs {
     int nbAttrs;	/* number of defaulted attributes on that element */
     int maxAttrs;       /* the size of the array */
-    const xmlChar *values[5]; /* array of localname/prefix/values/external */
+#if __STDC_VERSION__ >= 199901L
+    /* Using a C99 flexible array member avoids UBSan errors. */
+    const xmlChar *values[]; /* array of localname/prefix/values/external */
+#else
+    const xmlChar *values[5];
+#endif
 };
 
 /**
@@ -2121,7 +2127,6 @@
 	ctxt->input->line++; ctxt->input->col = 1;			\
     } else ctxt->input->col++;						\
     ctxt->input->cur += l;				\
-    if (*ctxt->input->cur == '%') xmlParserHandlePEReference(ctxt);	\
   } while (0)
 
 #define CUR_CHAR(l) xmlCurrentChar(ctxt, &l)
@@ -3412,13 +3417,6 @@
 	    len += l;
 	    NEXTL(l);
 	    c = CUR_CHAR(l);
-	    if (c == 0) {
-		count = 0;
-		GROW;
-                if (ctxt->instate == XML_PARSER_EOF)
-                    return(NULL);
-		c = CUR_CHAR(l);
-	    }
 	}
     }
     if ((len > XML_MAX_NAME_LENGTH) &&
@@ -3426,15 +3424,18 @@
         xmlFatalErr(ctxt, XML_ERR_NAME_TOO_LONG, "Name");
         return(NULL);
     }
-    if (ctxt->input->cur > ctxt->input->base && (*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r')) {
-        if (ctxt->input->base > ctxt->input->cur - (len + 1)) {
-            return(NULL);
-        }
+    if (ctxt->input->cur - ctxt->input->base < len) {
+        /*
+         * There were a couple of bugs where PERefs lead to to a change
+         * of the buffer. Check the buffer size to avoid passing an invalid
+         * pointer to xmlDictLookup.
+         */
+        xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
+                    "unexpected change of input buffer");
+        return (NULL);
+    }
+    if ((*ctxt->input->cur == '\n') && (ctxt->input->cur[-1] == '\r'))
         return(xmlDictLookup(ctxt->dict, ctxt->input->cur - (len + 1), len));
-    }
-    if (ctxt->input->base > ctxt->input->cur - len) {
-        return(NULL);
-    }
     return(xmlDictLookup(ctxt->dict, ctxt->input->cur - len, len));
 }
 
@@ -5718,7 +5719,7 @@
 	    }
 	}
 	if (ctxt->instate == XML_PARSER_EOF)
-	    return;
+	    goto done;
 	SKIP_BLANKS;
 	if (RAW != '>') {
 	    xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_NOT_FINISHED,
@@ -5749,17 +5750,17 @@
 		    cur = xmlSAX2GetEntity(ctxt, name);
 		}
 	    }
-            if (cur != NULL) {
-	        if (cur->orig != NULL)
-		    xmlFree(orig);
-		else
-		    cur->orig = orig;
-	    } else
-		xmlFree(orig);
+            if ((cur != NULL) && (cur->orig == NULL)) {
+		cur->orig = orig;
+                orig = NULL;
+	    }
 	}
+
+done:
 	if (value != NULL) xmlFree(value);
 	if (URI != NULL) xmlFree(URI);
 	if (literal != NULL) xmlFree(literal);
+        if (orig != NULL) xmlFree(orig);
     }
 }
 
@@ -6112,7 +6113,6 @@
 	SKIP_BLANKS;
 	GROW;
 	while ((RAW != '>') && (ctxt->instate != XML_PARSER_EOF)) {
-	    const xmlChar *check = CUR_PTR;
 	    int type;
 	    int def;
 	    xmlChar *defaultValue = NULL;
@@ -6172,15 +6172,6 @@
 		}
 		SKIP_BLANKS;
 	    }
-	    if (check == CUR_PTR) {
-		xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR,
-		            "in xmlParseAttributeListDecl\n");
-		if (defaultValue != NULL)
-		    xmlFree(defaultValue);
-	        if (tree != NULL)
-		    xmlFreeEnumeration(tree);
-		break;
-	    }
 	    if ((ctxt->sax != NULL) && (!ctxt->disableSAX) &&
 		(ctxt->sax->attributeDecl != NULL))
 		ctxt->sax->attributeDecl(ctxt->userData, elemName, attrName,
@@ -6285,7 +6276,7 @@
 	    if (elem == NULL) {
 		xmlFatalErrMsg(ctxt, XML_ERR_NAME_REQUIRED,
 			"xmlParseElementMixedContentDecl : Name expected\n");
-		xmlFreeDocElementContent(ctxt->myDoc, cur);
+		xmlFreeDocElementContent(ctxt->myDoc, ret);
 		return(NULL);
 	    }
 	    SKIP_BLANKS;
@@ -8353,6 +8344,7 @@
 	entity = ctxt->sax->getParameterEntity(ctxt->userData, name);
     if (ctxt->instate == XML_PARSER_EOF) {
 	xmlFree(name);
+	*str = ptr;
 	return(NULL);
     }
     if (entity == NULL) {
@@ -9410,8 +9402,7 @@
     const xmlChar **atts = ctxt->atts;
     int maxatts = ctxt->maxatts;
     int nratts, nbatts, nbdef;
-    int i, j, nbNs, attval, oldline, oldcol, inputNr;
-    const xmlChar *base;
+    int i, j, nbNs, attval;
     unsigned long cur;
     int nsNr = ctxt->nsNr;
 
@@ -9425,13 +9416,8 @@
      *       The Shrinking is only possible once the full set of attribute
      *       callbacks have been done.
      */
-reparse:
     SHRINK;
-    base = ctxt->input->base;
     cur = ctxt->input->cur - ctxt->input->base;
-    inputNr = ctxt->inputNr;
-    oldline = ctxt->input->line;
-    oldcol = ctxt->input->col;
     nbatts = 0;
     nratts = 0;
     nbdef = 0;
@@ -9455,8 +9441,6 @@
      */
     SKIP_BLANKS;
     GROW;
-    if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
-        goto base_changed;
 
     while (((RAW != '>') &&
 	   ((RAW != '/') || (NXT(1) != '>')) &&
@@ -9467,203 +9451,174 @@
 
 	attname = xmlParseAttribute2(ctxt, prefix, localname,
 	                             &aprefix, &attvalue, &len, &alloc);
-	if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) {
-	    if ((attvalue != NULL) && (alloc != 0))
-	        xmlFree(attvalue);
-	    attvalue = NULL;
-	    goto base_changed;
-	}
-        if ((attname != NULL) && (attvalue != NULL)) {
-	    if (len < 0) len = xmlStrlen(attvalue);
-            if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) {
-	        const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len);
-		xmlURIPtr uri;
+        if ((attname == NULL) || (attvalue == NULL))
+            goto next_attr;
+	if (len < 0) len = xmlStrlen(attvalue);
 
-                if (URL == NULL) {
-		    xmlErrMemory(ctxt, "dictionary allocation failure");
-		    if ((attvalue != NULL) && (alloc != 0))
-			xmlFree(attvalue);
-		    return(NULL);
-		}
-                if (*URL != 0) {
-		    uri = xmlParseURI((const char *) URL);
-		    if (uri == NULL) {
-			xmlNsErr(ctxt, XML_WAR_NS_URI,
-			         "xmlns: '%s' is not a valid URI\n",
-					   URL, NULL, NULL);
-		    } else {
-			if (uri->scheme == NULL) {
-			    xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
-				      "xmlns: URI %s is not absolute\n",
-				      URL, NULL, NULL);
-			}
-			xmlFreeURI(uri);
-		    }
-		    if (URL == ctxt->str_xml_ns) {
-			if (attname != ctxt->str_xml) {
-			    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
-			 "xml namespace URI cannot be the default namespace\n",
-				     NULL, NULL, NULL);
-			}
-			goto skip_default_ns;
-		    }
-		    if ((len == 29) &&
-			(xmlStrEqual(URL,
-				 BAD_CAST "http://www.w3.org/2000/xmlns/"))) {
-			xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
-			     "reuse of the xmlns namespace name is forbidden\n",
-				 NULL, NULL, NULL);
-			goto skip_default_ns;
-		    }
-		}
-		/*
-		 * check that it's not a defined namespace
-		 */
-		for (j = 1;j <= nbNs;j++)
-		    if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL)
-			break;
-		if (j <= nbNs)
-		    xmlErrAttributeDup(ctxt, NULL, attname);
-		else
-		    if (nsPush(ctxt, NULL, URL) > 0) nbNs++;
-skip_default_ns:
-		if ((attvalue != NULL) && (alloc != 0)) {
-		    xmlFree(attvalue);
-		    attvalue = NULL;
-		}
-		if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
-		    break;
-		if (!IS_BLANK_CH(RAW)) {
-		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
-				   "attributes construct error\n");
-		    break;
-		}
-		SKIP_BLANKS;
-		if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
-		    goto base_changed;
-		continue;
-	    }
-            if (aprefix == ctxt->str_xmlns) {
-	        const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len);
-		xmlURIPtr uri;
+        if ((attname == ctxt->str_xmlns) && (aprefix == NULL)) {
+            const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len);
+            xmlURIPtr uri;
 
-                if (attname == ctxt->str_xml) {
-		    if (URL != ctxt->str_xml_ns) {
-		        xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
-			         "xml namespace prefix mapped to wrong URI\n",
-			         NULL, NULL, NULL);
-		    }
-		    /*
-		     * Do not keep a namespace definition node
-		     */
-		    goto skip_ns;
-		}
+            if (URL == NULL) {
+                xmlErrMemory(ctxt, "dictionary allocation failure");
+                if ((attvalue != NULL) && (alloc != 0))
+                    xmlFree(attvalue);
+                return(NULL);
+            }
+            if (*URL != 0) {
+                uri = xmlParseURI((const char *) URL);
+                if (uri == NULL) {
+                    xmlNsErr(ctxt, XML_WAR_NS_URI,
+                             "xmlns: '%s' is not a valid URI\n",
+                                       URL, NULL, NULL);
+                } else {
+                    if (uri->scheme == NULL) {
+                        xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
+                                  "xmlns: URI %s is not absolute\n",
+                                  URL, NULL, NULL);
+                    }
+                    xmlFreeURI(uri);
+                }
                 if (URL == ctxt->str_xml_ns) {
-		    if (attname != ctxt->str_xml) {
-		        xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
-			         "xml namespace URI mapped to wrong prefix\n",
-			         NULL, NULL, NULL);
-		    }
-		    goto skip_ns;
-		}
-                if (attname == ctxt->str_xmlns) {
-		    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
-			     "redefinition of the xmlns prefix is forbidden\n",
-			     NULL, NULL, NULL);
-		    goto skip_ns;
-		}
-		if ((len == 29) &&
-		    (xmlStrEqual(URL,
-		                 BAD_CAST "http://www.w3.org/2000/xmlns/"))) {
-		    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
-			     "reuse of the xmlns namespace name is forbidden\n",
-			     NULL, NULL, NULL);
-		    goto skip_ns;
-		}
-		if ((URL == NULL) || (URL[0] == 0)) {
-		    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
-		             "xmlns:%s: Empty XML namespace is not allowed\n",
-			          attname, NULL, NULL);
-		    goto skip_ns;
-		} else {
-		    uri = xmlParseURI((const char *) URL);
-		    if (uri == NULL) {
-			xmlNsErr(ctxt, XML_WAR_NS_URI,
-			     "xmlns:%s: '%s' is not a valid URI\n",
-					   attname, URL, NULL);
-		    } else {
-			if ((ctxt->pedantic) && (uri->scheme == NULL)) {
-			    xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
-				      "xmlns:%s: URI %s is not absolute\n",
-				      attname, URL, NULL);
-			}
-			xmlFreeURI(uri);
-		    }
-		}
+                    if (attname != ctxt->str_xml) {
+                        xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+                     "xml namespace URI cannot be the default namespace\n",
+                                 NULL, NULL, NULL);
+                    }
+                    goto next_attr;
+                }
+                if ((len == 29) &&
+                    (xmlStrEqual(URL,
+                             BAD_CAST "http://www.w3.org/2000/xmlns/"))) {
+                    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+                         "reuse of the xmlns namespace name is forbidden\n",
+                             NULL, NULL, NULL);
+                    goto next_attr;
+                }
+            }
+            /*
+             * check that it's not a defined namespace
+             */
+            for (j = 1;j <= nbNs;j++)
+                if (ctxt->nsTab[ctxt->nsNr - 2 * j] == NULL)
+                    break;
+            if (j <= nbNs)
+                xmlErrAttributeDup(ctxt, NULL, attname);
+            else
+                if (nsPush(ctxt, NULL, URL) > 0) nbNs++;
 
-		/*
-		 * check that it's not a defined namespace
-		 */
-		for (j = 1;j <= nbNs;j++)
-		    if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname)
-			break;
-		if (j <= nbNs)
-		    xmlErrAttributeDup(ctxt, aprefix, attname);
-		else
-		    if (nsPush(ctxt, attname, URL) > 0) nbNs++;
-skip_ns:
-		if ((attvalue != NULL) && (alloc != 0)) {
-		    xmlFree(attvalue);
-		    attvalue = NULL;
-		}
-		if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
-		    break;
-		if (!IS_BLANK_CH(RAW)) {
-		    xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED,
-				   "attributes construct error\n");
-		    break;
-		}
-		SKIP_BLANKS;
-		if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
-		    goto base_changed;
-		continue;
-	    }
+        } else if (aprefix == ctxt->str_xmlns) {
+            const xmlChar *URL = xmlDictLookup(ctxt->dict, attvalue, len);
+            xmlURIPtr uri;
 
-	    /*
-	     * Add the pair to atts
-	     */
-	    if ((atts == NULL) || (nbatts + 5 > maxatts)) {
-	        if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) {
-		    if (attvalue[len] == 0)
-			xmlFree(attvalue);
-		    goto failed;
-		}
-	        maxatts = ctxt->maxatts;
-		atts = ctxt->atts;
-	    }
-	    ctxt->attallocs[nratts++] = alloc;
-	    atts[nbatts++] = attname;
-	    atts[nbatts++] = aprefix;
-	    atts[nbatts++] = NULL; /* the URI will be fetched later */
-	    atts[nbatts++] = attvalue;
-	    attvalue += len;
-	    atts[nbatts++] = attvalue;
-	    /*
-	     * tag if some deallocation is needed
-	     */
-	    if (alloc != 0) attval = 1;
-	} else {
-	    if ((attvalue != NULL) && (attvalue[len] == 0))
-		xmlFree(attvalue);
-	}
+            if (attname == ctxt->str_xml) {
+                if (URL != ctxt->str_xml_ns) {
+                    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+                             "xml namespace prefix mapped to wrong URI\n",
+                             NULL, NULL, NULL);
+                }
+                /*
+                 * Do not keep a namespace definition node
+                 */
+                goto next_attr;
+            }
+            if (URL == ctxt->str_xml_ns) {
+                if (attname != ctxt->str_xml) {
+                    xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+                             "xml namespace URI mapped to wrong prefix\n",
+                             NULL, NULL, NULL);
+                }
+                goto next_attr;
+            }
+            if (attname == ctxt->str_xmlns) {
+                xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+                         "redefinition of the xmlns prefix is forbidden\n",
+                         NULL, NULL, NULL);
+                goto next_attr;
+            }
+            if ((len == 29) &&
+                (xmlStrEqual(URL,
+                             BAD_CAST "http://www.w3.org/2000/xmlns/"))) {
+                xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+                         "reuse of the xmlns namespace name is forbidden\n",
+                         NULL, NULL, NULL);
+                goto next_attr;
+            }
+            if ((URL == NULL) || (URL[0] == 0)) {
+                xmlNsErr(ctxt, XML_NS_ERR_XML_NAMESPACE,
+                         "xmlns:%s: Empty XML namespace is not allowed\n",
+                              attname, NULL, NULL);
+                goto next_attr;
+            } else {
+                uri = xmlParseURI((const char *) URL);
+                if (uri == NULL) {
+                    xmlNsErr(ctxt, XML_WAR_NS_URI,
+                         "xmlns:%s: '%s' is not a valid URI\n",
+                                       attname, URL, NULL);
+                } else {
+                    if ((ctxt->pedantic) && (uri->scheme == NULL)) {
+                        xmlNsWarn(ctxt, XML_WAR_NS_URI_RELATIVE,
+                                  "xmlns:%s: URI %s is not absolute\n",
+                                  attname, URL, NULL);
+                    }
+                    xmlFreeURI(uri);
+                }
+            }
 
-failed:
+            /*
+             * check that it's not a defined namespace
+             */
+            for (j = 1;j <= nbNs;j++)
+                if (ctxt->nsTab[ctxt->nsNr - 2 * j] == attname)
+                    break;
+            if (j <= nbNs)
+                xmlErrAttributeDup(ctxt, aprefix, attname);
+            else
+                if (nsPush(ctxt, attname, URL) > 0) nbNs++;
+
+        } else {
+            /*
+             * Add the pair to atts
+             */
+            if ((atts == NULL) || (nbatts + 5 > maxatts)) {
+                if (xmlCtxtGrowAttrs(ctxt, nbatts + 5) < 0) {
+                    goto next_attr;
+                }
+                maxatts = ctxt->maxatts;
+                atts = ctxt->atts;
+            }
+            ctxt->attallocs[nratts++] = alloc;
+            atts[nbatts++] = attname;
+            atts[nbatts++] = aprefix;
+            /*
+             * The namespace URI field is used temporarily to point at the
+             * base of the current input buffer for non-alloced attributes.
+             * When the input buffer is reallocated, all the pointers become
+             * invalid, but they can be reconstructed later.
+             */
+            if (alloc)
+                atts[nbatts++] = NULL;
+            else
+                atts[nbatts++] = ctxt->input->base;
+            atts[nbatts++] = attvalue;
+            attvalue += len;
+            atts[nbatts++] = attvalue;
+            /*
+             * tag if some deallocation is needed
+             */
+            if (alloc != 0) attval = 1;
+            attvalue = NULL; /* moved into atts */
+        }
+
+next_attr:
+        if ((attvalue != NULL) && (alloc != 0)) {
+            xmlFree(attvalue);
+            attvalue = NULL;
+        }
 
 	GROW
         if (ctxt->instate == XML_PARSER_EOF)
             break;
-	if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
-	    goto base_changed;
 	if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
 	    break;
 	if (!IS_BLANK_CH(RAW)) {
@@ -9679,8 +9634,20 @@
 	    break;
 	}
         GROW;
-	if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
-	    goto base_changed;
+    }
+
+    /* Reconstruct attribute value pointers. */
+    for (i = 0, j = 0; j < nratts; i += 5, j++) {
+        if (atts[i+2] != NULL) {
+            /*
+             * Arithmetic on dangling pointers is technically undefined
+             * behavior, but well...
+             */
+            ptrdiff_t offset = ctxt->input->base - atts[i+2];
+            atts[i+2]  = NULL;    /* Reset repurposed namespace URI */
+            atts[i+3] += offset;  /* value */
+            atts[i+4] += offset;  /* valuend */
+        }
     }
 
     /*
@@ -9837,34 +9804,6 @@
     }
 
     return(localname);
-
-base_changed:
-    /*
-     * the attribute strings are valid iif the base didn't changed
-     */
-    if (attval != 0) {
-	for (i = 3,j = 0; j < nratts;i += 5,j++)
-	    if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL))
-	        xmlFree((xmlChar *) atts[i]);
-    }
-
-    /*
-     * We can't switch from one entity to another in the middle
-     * of a start tag
-     */
-    if (inputNr != ctxt->inputNr) {
-        xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
-		    "Start tag doesn't start and stop in the same entity\n");
-	return(NULL);
-    }
-
-    ctxt->input->cur = ctxt->input->base + cur;
-    ctxt->input->line = oldline;
-    ctxt->input->col = oldcol;
-    if (ctxt->wellFormed == 1) {
-	goto reparse;
-    }
-    return(NULL);
 }
 
 /**
@@ -15383,10 +15322,6 @@
 	ctxt->options |= XML_PARSE_NONET;
         options -= XML_PARSE_NONET;
     }
-    if (options & XML_PARSE_NOXXE) {
-	ctxt->options |= XML_PARSE_NOXXE;
-        options -= XML_PARSE_NOXXE;
-    }
     if (options & XML_PARSE_COMPACT) {
 	ctxt->options |= XML_PARSE_COMPACT;
         options -= XML_PARSE_COMPACT;
diff --git a/third_party/libxml/src/parserInternals.c b/third_party/libxml/src/parserInternals.c
index 286fdce..475d35b 100644
--- a/third_party/libxml/src/parserInternals.c
+++ b/third_party/libxml/src/parserInternals.c
@@ -710,16 +710,6 @@
     return((int) *ctxt->input->cur);
 encoding_error:
     /*
-     * An encoding problem may arise from a truncated input buffer
-     * splitting a character in the middle. In that case do not raise
-     * an error but return 0 to endicate an end of stream problem
-     */
-    if (ctxt->input->end - ctxt->input->cur < 4) {
-	*len = 0;
-	return(0);
-    }
-
-    /*
      * If we detect an UTF8 error that probably mean that the
      * input encoding didn't get properly advertised in the
      * declaration header. Report the error and switch the encoding
@@ -729,9 +719,21 @@
     {
         char buffer[150];
 
-	snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
-			ctxt->input->cur[0], ctxt->input->cur[1],
-			ctxt->input->cur[2], ctxt->input->cur[3]);
+        if (ctxt->input->cur[1] == 0) {
+            snprintf(&buffer[0], 149, "Bytes: 0x%02X EOF\n",
+                     ctxt->input->cur[0]);
+        } else if (ctxt->input->cur[2] == 0) {
+            snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X EOF\n",
+                     ctxt->input->cur[0], ctxt->input->cur[1]);
+        } else if (ctxt->input->cur[3] == 0) {
+            snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X EOF\n",
+                     ctxt->input->cur[0], ctxt->input->cur[1],
+                     ctxt->input->cur[2]);
+        } else {
+	    snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
+		     ctxt->input->cur[0], ctxt->input->cur[1],
+		     ctxt->input->cur[2], ctxt->input->cur[3]);
+        }
 	__xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR,
 		     "Input is not proper UTF-8, indicate encoding !\n%s",
 		     BAD_CAST buffer, NULL);
@@ -821,17 +823,6 @@
     *len = 1;
     return ((int) *cur);
 encoding_error:
-
-    /*
-     * An encoding problem may arise from a truncated input buffer
-     * splitting a character in the middle. In that case do not raise
-     * an error but return 0 to endicate an end of stream problem
-     */
-    if ((ctxt == NULL) || (ctxt->input == NULL) ||
-        (ctxt->input->end - ctxt->input->cur < 4)) {
-	*len = 0;
-	return(0);
-    }
     /*
      * If we detect an UTF8 error that probably mean that the
      * input encoding didn't get properly advertised in the
@@ -842,9 +833,19 @@
     {
         char buffer[150];
 
-	snprintf(buffer, 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
-			ctxt->input->cur[0], ctxt->input->cur[1],
-			ctxt->input->cur[2], ctxt->input->cur[3]);
+        if (cur[1] == 0) {
+            snprintf(&buffer[0], 149, "Bytes: 0x%02X EOF\n",
+                     cur[0]);
+        } else if (cur[2] == 0) {
+            snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X EOF\n",
+                     cur[0], cur[1]);
+        } else if (cur[3] == 0) {
+            snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X EOF\n",
+                     cur[0], cur[1], cur[2]);
+        } else {
+	    snprintf(&buffer[0], 149, "Bytes: 0x%02X 0x%02X 0x%02X 0x%02X\n",
+		     cur[0], cur[1], cur[2], cur[3]);
+        }
 	__xmlErrEncoding(ctxt, XML_ERR_INVALID_CHAR,
 		     "Input is not proper UTF-8, indicate encoding !\n%s",
 		     BAD_CAST buffer, NULL);
@@ -1101,8 +1102,15 @@
 	        break;
 	}
     }
-    if (handler == NULL)
+    /*
+     * TODO: We could recover from errors in external entites if we
+     * didn't stop the parser. But most callers of this function don't
+     * check the return value.
+     */
+    if (handler == NULL) {
+        xmlStopParser(ctxt);
 	return(-1);
+    }
     ctxt->charset = XML_CHAR_ENCODING_UTF8;
     ret = xmlSwitchToEncodingInt(ctxt, handler, len);
     if ((ret < 0) || (ctxt->errNo == XML_I18N_CONV_FAILED)) {
@@ -1226,6 +1234,7 @@
                  */
                 nbchars = xmlCharEncFirstLineInput(input->buf, len);
             }
+            xmlBufResetInput(input->buf->buffer, input);
             if (nbchars < 0) {
                 xmlErrInternal(ctxt,
                                "switching encoding: encoder error\n",
@@ -1233,7 +1242,6 @@
                 return (-1);
             }
 	    input->buf->rawconsumed += use - xmlBufUse(input->buf->raw);
-            xmlBufResetInput(input->buf->buffer, input);
         }
         return (0);
     } else if (input->length == 0) {
diff --git a/third_party/libxml/src/pattern.c b/third_party/libxml/src/pattern.c
index 33dee3aa..0eb8d81 100644
--- a/third_party/libxml/src/pattern.c
+++ b/third_party/libxml/src/pattern.c
@@ -969,6 +969,7 @@
 		ERROR5(NULL, NULL, NULL,
 		    "xmlCompileAttributeTest : no namespace bound to prefix %s\n",
 		    prefix);
+	        XML_PAT_FREE_STRING(ctxt, prefix);
 		ctxt->error = 1;
 		goto error;
 	    }
diff --git a/third_party/libxml/src/runtest.c b/third_party/libxml/src/runtest.c
index b2ce693..dcf1405d 100644
--- a/third_party/libxml/src/runtest.c
+++ b/third_party/libxml/src/runtest.c
@@ -1854,6 +1854,7 @@
     const char *base;
     int size, res;
     int cur = 0;
+    int chunkSize = 4;
 
     nb_tests++;
     /*
@@ -1864,17 +1865,21 @@
 	return(-1);
     }
 
+    if (chunkSize > size)
+        chunkSize = size;
+
 #ifdef LIBXML_HTML_ENABLED
     if (options & XML_PARSE_HTML)
-	ctxt = htmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename,
+	ctxt = htmlCreatePushParserCtxt(NULL, NULL, base + cur, chunkSize, filename,
 	                                XML_CHAR_ENCODING_NONE);
     else
 #endif
-    ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename);
+    ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, chunkSize, filename);
     xmlCtxtUseOptions(ctxt, options);
-    cur += 4;
+    cur += chunkSize;
+    chunkSize = 1024;
     do {
-        if (cur + 1024 >= size) {
+        if (cur + chunkSize >= size) {
 #ifdef LIBXML_HTML_ENABLED
 	    if (options & XML_PARSE_HTML)
 		htmlParseChunk(ctxt, base + cur, size - cur, 1);
@@ -1885,11 +1890,11 @@
 	} else {
 #ifdef LIBXML_HTML_ENABLED
 	    if (options & XML_PARSE_HTML)
-		htmlParseChunk(ctxt, base + cur, 1024, 0);
+		htmlParseChunk(ctxt, base + cur, chunkSize, 0);
 	    else
 #endif
-	    xmlParseChunk(ctxt, base + cur, 1024, 0);
-	    cur += 1024;
+	    xmlParseChunk(ctxt, base + cur, chunkSize, 0);
+	    cur += chunkSize;
 	}
     } while (cur < size);
     doc = ctxt->myDoc;
@@ -4214,6 +4219,9 @@
     { "Error cases regression tests",
       errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err",
       0 },
+    { "Error cases regression tests (old 1.0)",
+      errParseTest, "./test/errors10/*.xml", "result/errors10/", "", ".err",
+      XML_PARSE_OLD10 },
 #ifdef LIBXML_READER_ENABLED
     { "Error cases stream regression tests",
       streamParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".str",
diff --git a/third_party/libxml/src/testapi.c b/third_party/libxml/src/testapi.c
index 60f4bdd..b2f6e46b 100644
--- a/third_party/libxml/src/testapi.c
+++ b/third_party/libxml/src/testapi.c
@@ -1480,6 +1480,9 @@
         mem_base = xmlMemBlocks();
         buffer = gen_const_char_ptr(n_buffer, 0);
         size = gen_int(n_size, 1);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = htmlCreateMemoryParserCtxt((const char *)buffer, size);
         desret_htmlParserCtxtPtr(ret_val);
@@ -1547,6 +1550,9 @@
         size = gen_int(n_size, 3);
         filename = gen_fileoutput(n_filename, 4);
         enc = gen_xmlCharEncoding(n_enc, 5);
+        if ((chunk != NULL) &&
+            (size > (int) strlen((const char *) chunk) + 1))
+            continue;
 
         ret_val = htmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename, enc);
         desret_htmlParserCtxtPtr(ret_val);
@@ -1721,6 +1727,9 @@
         URL = gen_filepath(n_URL, 3);
         encoding = gen_const_char_ptr(n_encoding, 4);
         options = gen_int(n_options, 5);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = htmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options);
         desret_htmlDocPtr(ret_val);
@@ -2278,6 +2287,9 @@
         chunk = gen_const_char_ptr(n_chunk, 1);
         size = gen_int(n_size, 2);
         terminate = gen_int(n_terminate, 3);
+        if ((chunk != NULL) &&
+            (size > (int) strlen((const char *) chunk) + 1))
+            continue;
 
         ret_val = htmlParseChunk(ctxt, (const char *)chunk, size, terminate);
         if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}
@@ -2621,6 +2633,9 @@
         URL = gen_filepath(n_URL, 2);
         encoding = gen_const_char_ptr(n_encoding, 3);
         options = gen_int(n_options, 4);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = htmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options);
         desret_htmlDocPtr(ret_val);
@@ -3870,6 +3885,9 @@
         ctx = gen_void_ptr(n_ctx, 0);
         value = gen_const_xmlChar_ptr(n_value, 1);
         len = gen_int(n_len, 2);
+        if ((value != NULL) &&
+            (len > (int) strlen((const char *) value) + 1))
+            continue;
 
         xmlSAX2CDataBlock(ctx, (const xmlChar *)value, len);
         call_tests++;
@@ -3914,6 +3932,9 @@
         ctx = gen_void_ptr(n_ctx, 0);
         ch = gen_const_xmlChar_ptr(n_ch, 1);
         len = gen_int(n_len, 2);
+        if ((ch != NULL) &&
+            (len > (int) strlen((const char *) ch) + 1))
+            continue;
 
         xmlSAX2Characters(ctx, (const xmlChar *)ch, len);
         call_tests++;
@@ -4554,6 +4575,9 @@
         ctx = gen_void_ptr(n_ctx, 0);
         ch = gen_const_xmlChar_ptr(n_ch, 1);
         len = gen_int(n_len, 2);
+        if ((ch != NULL) &&
+            (len > (int) strlen((const char *) ch) + 1))
+            continue;
 
         xmlSAX2IgnorableWhitespace(ctx, (const xmlChar *)ch, len);
         call_tests++;
@@ -8221,6 +8245,9 @@
         dict = gen_xmlDictPtr(n_dict, 0);
         name = gen_const_xmlChar_ptr(n_name, 1);
         len = gen_int(n_len, 2);
+        if ((name != NULL) &&
+            (len > (int) strlen((const char *) name) + 1))
+            continue;
 
         ret_val = xmlDictExists(dict, (const xmlChar *)name, len);
         desret_const_xmlChar_ptr(ret_val);
@@ -8277,6 +8304,9 @@
         dict = gen_xmlDictPtr(n_dict, 0);
         name = gen_const_xmlChar_ptr(n_name, 1);
         len = gen_int(n_len, 2);
+        if ((name != NULL) &&
+            (len > (int) strlen((const char *) name) + 1))
+            continue;
 
         ret_val = xmlDictLookup(dict, (const xmlChar *)name, len);
         desret_const_xmlChar_ptr(ret_val);
@@ -12727,6 +12757,9 @@
         chunk = gen_const_char_ptr(n_chunk, 2);
         size = gen_int(n_size, 3);
         filename = gen_fileoutput(n_filename, 4);
+        if ((chunk != NULL) &&
+            (size > (int) strlen((const char *) chunk) + 1))
+            continue;
 
         ret_val = xmlCreatePushParserCtxt(sax, user_data, (const char *)chunk, size, filename);
         desret_xmlParserCtxtPtr(ret_val);
@@ -12905,6 +12938,9 @@
         URL = gen_filepath(n_URL, 3);
         encoding = gen_const_char_ptr(n_encoding, 4);
         options = gen_parseroptions(n_options, 5);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlCtxtReadMemory(ctxt, (const char *)buffer, size, URL, (const char *)encoding, options);
         desret_xmlDocPtr(ret_val);
@@ -12998,6 +13034,9 @@
         size = gen_int(n_size, 2);
         filename = gen_filepath(n_filename, 3);
         encoding = gen_const_char_ptr(n_encoding, 4);
+        if ((chunk != NULL) &&
+            (size > (int) strlen((const char *) chunk) + 1))
+            continue;
 
         ret_val = xmlCtxtResetPush(ctxt, (const char *)chunk, size, filename, (const char *)encoding);
         desret_int(ret_val);
@@ -13709,6 +13748,9 @@
         chunk = gen_const_char_ptr(n_chunk, 1);
         size = gen_int(n_size, 2);
         terminate = gen_int(n_terminate, 3);
+        if ((chunk != NULL) &&
+            (size > (int) strlen((const char *) chunk) + 1))
+            continue;
 
         ret_val = xmlParseChunk(ctxt, (const char *)chunk, size, terminate);
         if (ctxt != NULL) {xmlFreeDoc(ctxt->myDoc); ctxt->myDoc = NULL;}
@@ -14166,6 +14208,9 @@
         mem_base = xmlMemBlocks();
         buffer = gen_const_char_ptr(n_buffer, 0);
         size = gen_int(n_size, 1);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlParseMemory((const char *)buffer, size);
         desret_xmlDocPtr(ret_val);
@@ -14578,6 +14623,9 @@
         URL = gen_filepath(n_URL, 2);
         encoding = gen_const_char_ptr(n_encoding, 3);
         options = gen_parseroptions(n_options, 4);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlReadMemory((const char *)buffer, size, URL, (const char *)encoding, options);
         desret_xmlDocPtr(ret_val);
@@ -14700,6 +14748,9 @@
         mem_base = xmlMemBlocks();
         buffer = gen_const_char_ptr(n_buffer, 0);
         size = gen_int(n_size, 1);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlRecoverMemory((const char *)buffer, size);
         desret_xmlDocPtr(ret_val);
@@ -15001,6 +15052,9 @@
         buffer = gen_const_char_ptr(n_buffer, 1);
         size = gen_int(n_size, 2);
         recovery = gen_int(n_recovery, 3);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlSAXParseMemory(sax, (const char *)buffer, size, recovery);
         desret_xmlDocPtr(ret_val);
@@ -15062,6 +15116,9 @@
         size = gen_int(n_size, 2);
         recovery = gen_int(n_recovery, 3);
         data = gen_userdata(n_data, 4);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlSAXParseMemoryWithData(sax, (const char *)buffer, size, recovery, data);
         desret_xmlDocPtr(ret_val);
@@ -15177,6 +15234,9 @@
         user_data = gen_userdata(n_user_data, 1);
         buffer = gen_const_char_ptr(n_buffer, 2);
         size = gen_int(n_size, 3);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
         
 #ifdef LIBXML_SAX1_ENABLED
         if (sax == (xmlSAXHandlerPtr)&xmlDefaultSAXHandler) user_data = NULL;
@@ -15948,6 +16008,9 @@
         mem_base = xmlMemBlocks();
         buffer = gen_const_char_ptr(n_buffer, 0);
         size = gen_int(n_size, 1);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlCreateMemoryParserCtxt((const char *)buffer, size);
         desret_xmlParserCtxtPtr(ret_val);
@@ -16603,6 +16666,9 @@
         end = gen_xmlChar(n_end, 4);
         end2 = gen_xmlChar(n_end2, 5);
         end3 = gen_xmlChar(n_end3, 6);
+        if ((str != NULL) &&
+            (len > (int) strlen((const char *) str) + 1))
+            continue;
 
         ret_val = xmlStringLenDecodeEntities(ctxt, (const xmlChar *)str, len, what, end, end2, end3);
         desret_xmlChar_ptr(ret_val);
@@ -17573,6 +17639,9 @@
         mem_base = xmlMemBlocks();
         buffer = gen_const_char_ptr(n_buffer, 0);
         size = gen_int(n_size, 1);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlRelaxNGNewMemParserCtxt((const char *)buffer, size);
         desret_xmlRelaxNGParserCtxtPtr(ret_val);
@@ -17849,6 +17918,9 @@
         ctxt = gen_xmlRelaxNGValidCtxtPtr(n_ctxt, 0);
         data = gen_const_xmlChar_ptr(n_data, 1);
         len = gen_int(n_len, 2);
+        if ((data != NULL) &&
+            (len > (int) strlen((const char *) data) + 1))
+            continue;
 
         ret_val = xmlRelaxNGValidatePushCData(ctxt, (const xmlChar *)data, len);
         desret_int(ret_val);
@@ -18591,6 +18663,9 @@
         buf = gen_xmlBufferPtr(n_buf, 0);
         str = gen_const_xmlChar_ptr(n_str, 1);
         len = gen_int(n_len, 2);
+        if ((str != NULL) &&
+            (len > (int) strlen((const char *) str) + 1))
+            continue;
 
         ret_val = xmlBufferAdd(buf, (const xmlChar *)str, len);
         desret_int(ret_val);
@@ -18637,6 +18712,9 @@
         buf = gen_xmlBufferPtr(n_buf, 0);
         str = gen_const_xmlChar_ptr(n_str, 1);
         len = gen_int(n_len, 2);
+        if ((str != NULL) &&
+            (len > (int) strlen((const char *) str) + 1))
+            continue;
 
         ret_val = xmlBufferAddHead(buf, (const xmlChar *)str, len);
         desret_int(ret_val);
@@ -19209,6 +19287,9 @@
         prefix = gen_const_xmlChar_ptr(n_prefix, 1);
         memory = gen_xmlChar_ptr(n_memory, 2);
         len = gen_int(n_len, 3);
+        if ((prefix != NULL) &&
+            (len > (int) strlen((const char *) prefix) + 1))
+            continue;
 
         ret_val = xmlBuildQName((const xmlChar *)ncname, (const xmlChar *)prefix, memory, len);
         if ((ret_val != NULL) && (ret_val != ncname) &&
@@ -20980,6 +21061,9 @@
         doc = gen_xmlDocPtr(n_doc, 0);
         content = gen_const_xmlChar_ptr(n_content, 1);
         len = gen_int(n_len, 2);
+        if ((content != NULL) &&
+            (len > (int) strlen((const char *) content) + 1))
+            continue;
 
         ret_val = xmlNewCDataBlock(doc, (const xmlChar *)content, len);
         desret_xmlNodePtr(ret_val);
@@ -21553,6 +21637,9 @@
         doc = gen_xmlDocPtr(n_doc, 0);
         content = gen_const_xmlChar_ptr(n_content, 1);
         len = gen_int(n_len, 2);
+        if ((content != NULL) &&
+            (len > (int) strlen((const char *) content) + 1))
+            continue;
 
         ret_val = xmlNewDocTextLen(doc, (const xmlChar *)content, len);
         desret_xmlNodePtr(ret_val);
@@ -22096,6 +22183,9 @@
         mem_base = xmlMemBlocks();
         content = gen_const_xmlChar_ptr(n_content, 0);
         len = gen_int(n_len, 1);
+        if ((content != NULL) &&
+            (len > (int) strlen((const char *) content) + 1))
+            continue;
 
         ret_val = xmlNewTextLen((const xmlChar *)content, len);
         desret_xmlNodePtr(ret_val);
@@ -22209,6 +22299,9 @@
         cur = gen_xmlNodePtr(n_cur, 0);
         content = gen_const_xmlChar_ptr(n_content, 1);
         len = gen_int(n_len, 2);
+        if ((content != NULL) &&
+            (len > (int) strlen((const char *) content) + 1))
+            continue;
 
         xmlNodeAddContentLen(cur, (const xmlChar *)content, len);
         call_tests++;
@@ -22759,6 +22852,9 @@
         cur = gen_xmlNodePtr(n_cur, 0);
         content = gen_const_xmlChar_ptr(n_content, 1);
         len = gen_int(n_len, 2);
+        if ((content != NULL) &&
+            (len > (int) strlen((const char *) content) + 1))
+            continue;
 
         xmlNodeSetContentLen(cur, (const xmlChar *)content, len);
         call_tests++;
@@ -23823,6 +23919,9 @@
         doc = gen_const_xmlDoc_ptr(n_doc, 0);
         value = gen_const_xmlChar_ptr(n_value, 1);
         len = gen_int(n_len, 2);
+        if ((value != NULL) &&
+            (len > (int) strlen((const char *) value) + 1))
+            continue;
 
         ret_val = xmlStringLenGetNodeList((const xmlDoc *)doc, (const xmlChar *)value, len);
         desret_xmlNodePtr(ret_val);
@@ -23869,6 +23968,9 @@
         node = gen_xmlNodePtr(n_node, 0);
         content = gen_const_xmlChar_ptr(n_content, 1);
         len = gen_int(n_len, 2);
+        if ((content != NULL) &&
+            (len > (int) strlen((const char *) content) + 1))
+            continue;
 
         ret_val = xmlTextConcat(node, (const xmlChar *)content, len);
         desret_int(ret_val);
@@ -27125,6 +27227,9 @@
         ctxt = gen_xmlValidCtxtPtr(n_ctxt, 0);
         data = gen_const_xmlChar_ptr(n_data, 1);
         len = gen_int(n_len, 2);
+        if ((data != NULL) &&
+            (len > (int) strlen((const char *) data) + 1))
+            continue;
 
         ret_val = xmlValidatePushCData(ctxt, (const xmlChar *)data, len);
         desret_int(ret_val);
@@ -28661,6 +28766,9 @@
         out = gen_xmlOutputBufferPtr(n_out, 0);
         len = gen_int(n_len, 1);
         buf = gen_const_char_ptr(n_buf, 2);
+        if ((buf != NULL) &&
+            (len > (int) strlen((const char *) buf) + 1))
+            continue;
 
         ret_val = xmlOutputBufferWrite(out, len, (const char *)buf);
         desret_int(ret_val);
@@ -28887,6 +28995,9 @@
         mem = gen_const_char_ptr(n_mem, 0);
         size = gen_int(n_size, 1);
         enc = gen_xmlCharEncoding(n_enc, 2);
+        if ((mem != NULL) &&
+            (size > (int) strlen((const char *) mem) + 1))
+            continue;
 
         ret_val = xmlParserInputBufferCreateMem((const char *)mem, size, enc);
         desret_xmlParserInputBufferPtr(ret_val);
@@ -28933,6 +29044,9 @@
         mem = gen_const_char_ptr(n_mem, 0);
         size = gen_int(n_size, 1);
         enc = gen_xmlCharEncoding(n_enc, 2);
+        if ((mem != NULL) &&
+            (size > (int) strlen((const char *) mem) + 1))
+            continue;
 
         ret_val = xmlParserInputBufferCreateStatic((const char *)mem, size, enc);
         desret_xmlParserInputBufferPtr(ret_val);
@@ -29018,6 +29132,9 @@
         in = gen_xmlParserInputBufferPtr(n_in, 0);
         len = gen_int(n_len, 1);
         buf = gen_const_char_ptr(n_buf, 2);
+        if ((buf != NULL) &&
+            (len > (int) strlen((const char *) buf) + 1))
+            continue;
 
         ret_val = xmlParserInputBufferPush(in, len, (const char *)buf);
         desret_int(ret_val);
@@ -30200,6 +30317,9 @@
         URL = gen_filepath(n_URL, 2);
         encoding = gen_const_char_ptr(n_encoding, 3);
         options = gen_parseroptions(n_options, 4);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlReaderForMemory((const char *)buffer, size, URL, (const char *)encoding, options);
         desret_xmlTextReaderPtr(ret_val);
@@ -30383,6 +30503,9 @@
         URL = gen_filepath(n_URL, 3);
         encoding = gen_const_char_ptr(n_encoding, 4);
         options = gen_parseroptions(n_options, 5);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlReaderNewMemory(reader, (const char *)buffer, size, URL, (const char *)encoding, options);
         desret_int(ret_val);
@@ -34420,6 +34543,9 @@
         mem_base = xmlMemBlocks();
         buffer = gen_const_char_ptr(n_buffer, 0);
         size = gen_int(n_size, 1);
+        if ((buffer != NULL) &&
+            (size > (int) strlen((const char *) buffer) + 1))
+            continue;
 
         ret_val = xmlSchemaNewMemParserCtxt((const char *)buffer, size);
         desret_xmlSchemaParserCtxtPtr(ret_val);
@@ -36304,6 +36430,9 @@
         mem_base = xmlMemBlocks();
         cur = gen_const_char_ptr(n_cur, 0);
         len = gen_int(n_len, 1);
+        if ((cur != NULL) &&
+            (len > (int) strlen((const char *) cur) + 1))
+            continue;
 
         ret_val = xmlCharStrndup((const char *)cur, len);
         desret_xmlChar_ptr(ret_val);
@@ -36743,6 +36872,9 @@
         str1 = gen_const_xmlChar_ptr(n_str1, 0);
         str2 = gen_const_xmlChar_ptr(n_str2, 1);
         len = gen_int(n_len, 2);
+        if ((str2 != NULL) &&
+            (len > (int) strlen((const char *) str2) + 1))
+            continue;
 
         ret_val = xmlStrncasecmp((const xmlChar *)str1, (const xmlChar *)str2, len);
         desret_int(ret_val);
@@ -36789,6 +36921,9 @@
         str1 = gen_const_xmlChar_ptr(n_str1, 0);
         str2 = gen_const_xmlChar_ptr(n_str2, 1);
         len = gen_int(n_len, 2);
+        if ((str2 != NULL) &&
+            (len > (int) strlen((const char *) str2) + 1))
+            continue;
 
         ret_val = xmlStrncatNew((const xmlChar *)str1, (const xmlChar *)str2, len);
         desret_xmlChar_ptr(ret_val);
@@ -36835,6 +36970,9 @@
         str1 = gen_const_xmlChar_ptr(n_str1, 0);
         str2 = gen_const_xmlChar_ptr(n_str2, 1);
         len = gen_int(n_len, 2);
+        if ((str2 != NULL) &&
+            (len > (int) strlen((const char *) str2) + 1))
+            continue;
 
         ret_val = xmlStrncmp((const xmlChar *)str1, (const xmlChar *)str2, len);
         desret_int(ret_val);
@@ -36877,6 +37015,9 @@
         mem_base = xmlMemBlocks();
         cur = gen_const_xmlChar_ptr(n_cur, 0);
         len = gen_int(n_len, 1);
+        if ((cur != NULL) &&
+            (len > (int) strlen((const char *) cur) + 1))
+            continue;
 
         ret_val = xmlStrndup((const xmlChar *)cur, len);
         desret_xmlChar_ptr(ret_val);
@@ -36959,6 +37100,12 @@
         str = gen_const_xmlChar_ptr(n_str, 0);
         start = gen_int(n_start, 1);
         len = gen_int(n_len, 2);
+        if ((str != NULL) &&
+            (start > (int) strlen((const char *) str) + 1))
+            continue;
+        if ((str != NULL) &&
+            (len > (int) strlen((const char *) str) + 1))
+            continue;
 
         ret_val = xmlStrsub((const xmlChar *)str, start, len);
         desret_xmlChar_ptr(ret_val);
@@ -37143,6 +37290,9 @@
         mem_base = xmlMemBlocks();
         utf = gen_const_xmlChar_ptr(n_utf, 0);
         len = gen_int(n_len, 1);
+        if ((utf != NULL) &&
+            (len > (int) strlen((const char *) utf) + 1))
+            continue;
 
         ret_val = xmlUTF8Strndup((const xmlChar *)utf, len);
         desret_xmlChar_ptr(ret_val);
@@ -37221,6 +37371,9 @@
         mem_base = xmlMemBlocks();
         utf = gen_const_xmlChar_ptr(n_utf, 0);
         len = gen_int(n_len, 1);
+        if ((utf != NULL) &&
+            (len > (int) strlen((const char *) utf) + 1))
+            continue;
 
         ret_val = xmlUTF8Strsize((const xmlChar *)utf, len);
         desret_int(ret_val);
@@ -37264,6 +37417,12 @@
         utf = gen_const_xmlChar_ptr(n_utf, 0);
         start = gen_int(n_start, 1);
         len = gen_int(n_len, 2);
+        if ((utf != NULL) &&
+            (start > (int) strlen((const char *) utf) + 1))
+            continue;
+        if ((utf != NULL) &&
+            (len > (int) strlen((const char *) utf) + 1))
+            continue;
 
         ret_val = xmlUTF8Strsub((const xmlChar *)utf, start, len);
         desret_xmlChar_ptr(ret_val);
@@ -44576,6 +44735,12 @@
         data = gen_const_char_ptr(n_data, 1);
         start = gen_int(n_start, 2);
         len = gen_int(n_len, 3);
+        if ((data != NULL) &&
+            (start > (int) strlen((const char *) data) + 1))
+            continue;
+        if ((data != NULL) &&
+            (len > (int) strlen((const char *) data) + 1))
+            continue;
 
         ret_val = xmlTextWriterWriteBase64(writer, (const char *)data, start, len);
         desret_int(ret_val);
@@ -44631,6 +44796,12 @@
         data = gen_const_char_ptr(n_data, 1);
         start = gen_int(n_start, 2);
         len = gen_int(n_len, 3);
+        if ((data != NULL) &&
+            (start > (int) strlen((const char *) data) + 1))
+            continue;
+        if ((data != NULL) &&
+            (len > (int) strlen((const char *) data) + 1))
+            continue;
 
         ret_val = xmlTextWriterWriteBinHex(writer, (const char *)data, start, len);
         desret_int(ret_val);
@@ -45561,6 +45732,9 @@
         writer = gen_xmlTextWriterPtr(n_writer, 0);
         content = gen_const_xmlChar_ptr(n_content, 1);
         len = gen_int(n_len, 2);
+        if ((content != NULL) &&
+            (len > (int) strlen((const char *) content) + 1))
+            continue;
 
         ret_val = xmlTextWriterWriteRawLen(writer, (const xmlChar *)content, len);
         desret_int(ret_val);
diff --git a/third_party/libxml/src/tree.c b/third_party/libxml/src/tree.c
index 9d330b8..e154ec0 100644
--- a/third_party/libxml/src/tree.c
+++ b/third_party/libxml/src/tree.c
@@ -1401,6 +1401,8 @@
 			else if ((ent != NULL) && (ent->children == NULL)) {
 			    xmlNodePtr temp;
 
+                            /* Set to non-NULL value to avoid recursion. */
+			    ent->children = (xmlNodePtr) -1;
 			    ent->children = xmlStringGetNodeList(doc,
 				    (const xmlChar*)node->content);
 			    ent->owner = 1;
@@ -1593,6 +1595,7 @@
 			else if ((ent != NULL) && (ent->children == NULL)) {
 			    xmlNodePtr temp;
 
+                            /* Set to non-NULL value to avoid recursion. */
 			    ent->children = (xmlNodePtr) -1;
 			    ent->children = xmlStringGetNodeList(doc,
 				    (const xmlChar*)node->content);
@@ -1600,6 +1603,7 @@
 			    temp = ent->children;
 			    while (temp) {
 				temp->parent = (xmlNodePtr)ent;
+				ent->last = temp;
 				temp = temp->next;
 			    }
 			}
diff --git a/third_party/libxml/src/uri.c b/third_party/libxml/src/uri.c
index 4b24b13..a56c2c7f 100644
--- a/third_party/libxml/src/uri.c
+++ b/third_party/libxml/src/uri.c
@@ -12,7 +12,6 @@
 #include "libxml.h"
 
 #include <string.h>
-#include <limits.h>
 
 #include <libxml/xmlmemory.h>
 #include <libxml/uri.h>
@@ -2164,7 +2163,6 @@
     xmlChar *val = NULL;
     int ret;
     int ix;
-    int pos = 0;
     int nbslash = 0;
     int len;
     xmlURIPtr ref = NULL;
@@ -2255,19 +2253,22 @@
 	uptr = NULL;
 	len = 1;	/* this is for a string terminator only */
     } else {
-    /*
-     * Next we compare the two strings and find where they first differ
-     */
-	if ((ref->path[pos] == '.') && (ref->path[pos+1] == '/'))
-            pos += 2;
+        xmlChar *rptr = (xmlChar *) ref->path;
+        int pos = 0;
+
+        /*
+         * Next we compare the two strings and find where they first differ
+         */
+	if ((*rptr == '.') && (rptr[1] == '/'))
+            rptr += 2;
 	if ((*bptr == '.') && (bptr[1] == '/'))
             bptr += 2;
-	else if ((*bptr == '/') && (ref->path[pos] != '/'))
+	else if ((*bptr == '/') && (*rptr != '/'))
 	    bptr++;
-	while ((bptr[pos] == ref->path[pos]) && (bptr[pos] != 0))
+	while ((bptr[pos] == rptr[pos]) && (bptr[pos] != 0))
 	    pos++;
 
-	if (bptr[pos] == ref->path[pos]) {
+	if (bptr[pos] == rptr[pos]) {
 	    val = xmlStrdup(BAD_CAST "");
 	    goto done;		/* (I can't imagine why anyone would do this) */
 	}
@@ -2277,25 +2278,25 @@
 	 * beginning of the "unique" suffix of URI
 	 */
 	ix = pos;
-	if ((ref->path[ix] == '/') && (ix > 0))
+	if ((rptr[ix] == '/') && (ix > 0))
 	    ix--;
-	else if ((ref->path[ix] == 0) && (ix > 1) && (ref->path[ix - 1] == '/'))
+	else if ((rptr[ix] == 0) && (ix > 1) && (rptr[ix - 1] == '/'))
 	    ix -= 2;
 	for (; ix > 0; ix--) {
-	    if (ref->path[ix] == '/')
+	    if (rptr[ix] == '/')
 		break;
 	}
 	if (ix == 0) {
-	    uptr = (xmlChar *)ref->path;
+	    uptr = (xmlChar *)rptr;
 	} else {
 	    ix++;
-	    uptr = (xmlChar *)&ref->path[ix];
+	    uptr = (xmlChar *)&rptr[ix];
 	}
 
 	/*
 	 * In base, count the number of '/' from the differing point
 	 */
-	if (bptr[pos] != ref->path[pos]) {/* check for trivial URI == base */
+	if (bptr[pos] != rptr[pos]) {/* check for trivial URI == base */
 	    for (; bptr[ix] != 0; ix++) {
 		if (bptr[ix] == '/')
 		    nbslash++;
@@ -2456,6 +2457,7 @@
 	        xmlFreeURI(uri);
 		return escURI;
 	    }
+            xmlFree(escURI);
 	}
     }
 
diff --git a/third_party/libxml/src/valid.c b/third_party/libxml/src/valid.c
index 26d7221..c51ea29 100644
--- a/third_party/libxml/src/valid.c
+++ b/third_party/libxml/src/valid.c
@@ -1172,33 +1172,33 @@
 	    xmlBufferWriteCHAR(buf, content->name);
 	    break;
 	case XML_ELEMENT_CONTENT_SEQ:
-	    if (content->c1 == NULL) return;
-	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||
-	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))
+	    if ((content->c1 != NULL) &&
+	        ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||
+	         (content->c1->type == XML_ELEMENT_CONTENT_SEQ)))
 		xmlDumpElementContent(buf, content->c1, 1);
 	    else
 		xmlDumpElementContent(buf, content->c1, 0);
             xmlBufferWriteChar(buf, " , ");
-	    if (content->c2 == NULL) return;
-	    if ((content->c2->type == XML_ELEMENT_CONTENT_OR) ||
-	        ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) &&
-		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))
+	    if ((content->c2 != NULL) &&
+	        ((content->c2->type == XML_ELEMENT_CONTENT_OR) ||
+	         ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) &&
+		  (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))))
 		xmlDumpElementContent(buf, content->c2, 1);
 	    else
 		xmlDumpElementContent(buf, content->c2, 0);
 	    break;
 	case XML_ELEMENT_CONTENT_OR:
-	    if (content->c1 == NULL) return;
-	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||
-	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))
+	    if ((content->c1 != NULL) &&
+	        ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||
+	         (content->c1->type == XML_ELEMENT_CONTENT_SEQ)))
 		xmlDumpElementContent(buf, content->c1, 1);
 	    else
 		xmlDumpElementContent(buf, content->c1, 0);
             xmlBufferWriteChar(buf, " | ");
-	    if (content->c2 == NULL) return;
-	    if ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) ||
-	        ((content->c2->type == XML_ELEMENT_CONTENT_OR) &&
-		 (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE)))
+	    if ((content->c2 != NULL) &&
+	        ((content->c2->type == XML_ELEMENT_CONTENT_SEQ) ||
+	         ((content->c2->type == XML_ELEMENT_CONTENT_OR) &&
+		  (content->c2->ocur != XML_ELEMENT_CONTENT_ONCE))))
 		xmlDumpElementContent(buf, content->c2, 1);
 	    else
 		xmlDumpElementContent(buf, content->c2, 0);
@@ -1266,22 +1266,23 @@
         case XML_ELEMENT_CONTENT_PCDATA:
             strcat(buf, "#PCDATA");
 	    break;
-	case XML_ELEMENT_CONTENT_ELEMENT:
-	    if (content->prefix != NULL) {
-		if (size - len < xmlStrlen(content->prefix) + 10) {
-		    strcat(buf, " ...");
-		    return;
-		}
-		strcat(buf, (char *) content->prefix);
-		strcat(buf, ":");
-	    }
-	    if (size - len < xmlStrlen(content->name) + 10) {
+	case XML_ELEMENT_CONTENT_ELEMENT: {
+            int qnameLen = xmlStrlen(content->name);
+
+	    if (content->prefix != NULL)
+                qnameLen += xmlStrlen(content->prefix) + 1;
+	    if (size - len < qnameLen + 10) {
 		strcat(buf, " ...");
 		return;
 	    }
+	    if (content->prefix != NULL) {
+		strcat(buf, (char *) content->prefix);
+		strcat(buf, ":");
+	    }
 	    if (content->name != NULL)
 		strcat(buf, (char *) content->name);
 	    break;
+        }
 	case XML_ELEMENT_CONTENT_SEQ:
 	    if ((content->c1->type == XML_ELEMENT_CONTENT_OR) ||
 	        (content->c1->type == XML_ELEMENT_CONTENT_SEQ))
@@ -1323,6 +1324,7 @@
 		xmlSnprintfElementContent(buf, size, content->c2, 0);
 	    break;
     }
+    if (size - strlen(buf) <= 2) return;
     if (englob)
         strcat(buf, ")");
     switch (content->ocur) {
@@ -4625,6 +4627,12 @@
 	}
     }
 
+    /*
+     * Casting ns to xmlAttrPtr is wrong. We'd need separate functions
+     * xmlAddID and xmlAddRef for namespace declarations, but it makes
+     * no practical sense to use ID types anyway.
+     */
+#if 0
     /* Validity Constraint: ID uniqueness */
     if (attrDecl->atype == XML_ATTRIBUTE_ID) {
         if (xmlAddID(ctxt, doc, value, (xmlAttrPtr) ns) == NULL)
@@ -4636,6 +4644,7 @@
         if (xmlAddRef(ctxt, doc, value, (xmlAttrPtr) ns) == NULL)
 	    ret = 0;
     }
+#endif
 
     /* Validity Constraint: Notation Attributes */
     if (attrDecl->atype == XML_ATTRIBUTE_NOTATION) {
diff --git a/third_party/libxml/src/win32/VC10/README.vc10 b/third_party/libxml/src/win32/VC10/README.vc10
index f7826b0..4805bdc8 100644
--- a/third_party/libxml/src/win32/VC10/README.vc10
+++ b/third_party/libxml/src/win32/VC10/README.vc10
@@ -1,27 +1,27 @@
-
-README file for VC10 project files for libxml2
-----------------------------------------------
-
-to clarify: This is not the readme file for the whole libxml2 project. 
-Rather, it's a readme for the VC10 project files, attached to the libxml2 proejct.
-
-Quick Start
------------
-
-1) To use, load the libxml2.sln solution file into visual studio
-2) check and correct paths for dependent "iconv" project which most certaily 
-are wrong on your environment.
-3) Compile all projects
-
-
-Background Info
----------------
-
-Running of "configure.sh" won't make sense since VS doesn't support
-this kind of build system and the environment is pretty much known already 
-if you're using Visual Studio. Instead, a preconfigured "config.h" file 
-is provided in the "win32\VC10" directory and referenced by the project
-files already.
-
-The compile process is not completely warning-free: Some warnings will 
-appear during compile which can be ignored.
+

+README file for VC10 project files for libxml2

+----------------------------------------------

+

+to clarify: This is not the readme file for the whole libxml2 project. 

+Rather, it's a readme for the VC10 project files, attached to the libxml2 proejct.

+

+Quick Start

+-----------

+

+1) To use, load the libxml2.sln solution file into visual studio

+2) check and correct paths for dependent "iconv" project which most certaily 

+are wrong on your environment.

+3) Compile all projects

+

+

+Background Info

+---------------

+

+Running of "configure.sh" won't make sense since VS doesn't support

+this kind of build system and the environment is pretty much known already 

+if you're using Visual Studio. Instead, a preconfigured "config.h" file 

+is provided in the "win32\VC10" directory and referenced by the project

+files already.

+

+The compile process is not completely warning-free: Some warnings will 

+appear during compile which can be ignored.

diff --git a/third_party/libxml/src/win32/VC10/RuleSet1.ruleset b/third_party/libxml/src/win32/VC10/RuleSet1.ruleset
index 84f383f..9985a6c6 100644
--- a/third_party/libxml/src/win32/VC10/RuleSet1.ruleset
+++ b/third_party/libxml/src/win32/VC10/RuleSet1.ruleset
@@ -1,3 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">
+<?xml version="1.0" encoding="utf-8"?>

+<RuleSet Name="New Rule Set" Description=" " ToolsVersion="10.0">

 </RuleSet>
\ No newline at end of file
diff --git a/third_party/libxml/src/xmlIO.c b/third_party/libxml/src/xmlIO.c
index e6256128..8c6509dd 100644
--- a/third_party/libxml/src/xmlIO.c
+++ b/third_party/libxml/src/xmlIO.c
@@ -210,7 +210,6 @@
     "adddress in use",		/* EADDRINUSE */
     "already in use",		/* EALREADY */
     "unknown address familly",	/* EAFNOSUPPORT */
-    "Attempt to load external entity %s", /* XML_IO_ILLEGAL_XXE */
 };
 
 #if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
@@ -3028,7 +3027,7 @@
     xmlParserInputBufferPtr ret;
     int errcode;
 
-    if (size <= 0) return(NULL);
+    if (size < 0) return(NULL);
     if (mem == NULL) return(NULL);
 
     ret = xmlAllocParserInputBuffer(enc);
@@ -3064,7 +3063,7 @@
                                  xmlCharEncoding enc) {
     xmlParserInputBufferPtr ret;
 
-    if (size <= 0) return(NULL);
+    if (size < 0) return(NULL);
     if (mem == NULL) return(NULL);
 
     ret = (xmlParserInputBufferPtr) xmlMalloc(sizeof(xmlParserInputBuffer));
@@ -4054,22 +4053,13 @@
     xmlGenericError(xmlGenericErrorContext,
                     "xmlDefaultExternalEntityLoader(%s, xxx)\n", URL);
 #endif
-    if (ctxt != NULL) {
+    if ((ctxt != NULL) && (ctxt->options & XML_PARSE_NONET)) {
         int options = ctxt->options;
 
-        if (options & XML_PARSE_NOXXE) {
-            ctxt->options -= XML_PARSE_NOXXE;
-            ret = xmlNoXxeExternalEntityLoader(URL, ID, ctxt);
-            ctxt->options = options;
-            return(ret);
-        }
- 
-        if (options & XML_PARSE_NONET) {
-            ctxt->options -= XML_PARSE_NONET;
-            ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
-            ctxt->options = options;
-            return(ret);
-        }
+	ctxt->options -= XML_PARSE_NONET;
+        ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
+	ctxt->options = options;
+	return(ret);
     }
 #ifdef LIBXML_CATALOG_ENABLED
     resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
@@ -4170,13 +4160,6 @@
     xmlParserInputPtr input = NULL;
     xmlChar *resource = NULL;
 
-    if (ctxt == NULL) {
-        return(NULL);
-    }
-    if (ctxt->input_id == 1) {
-        return xmlDefaultExternalEntityLoader((const char *) URL, ID, ctxt);
-    }
-
 #ifdef LIBXML_CATALOG_ENABLED
     resource = xmlResolveResourceFromCatalog(URL, ID, ctxt);
 #endif
@@ -4199,18 +4182,5 @@
     return(input);
 }
 
-xmlParserInputPtr
-xmlNoXxeExternalEntityLoader(const char *URL, const char *ID,
-                          xmlParserCtxtPtr ctxt) {
-    if (ctxt == NULL) {
-        return(NULL);
-    }
-    if (ctxt->input_id == 1) {
-        return xmlDefaultExternalEntityLoader((const char *) URL, ID, ctxt);
-    }
-    xmlIOErr(XML_IO_ILLEGAL_XXE, (const char *) URL);
-    return(NULL);
-}
-
 #define bottom_xmlIO
 #include "elfgcchack.h"
diff --git a/third_party/libxml/src/xmlmemory.c b/third_party/libxml/src/xmlmemory.c
index f08c8c3..58de2eda 100644
--- a/third_party/libxml/src/xmlmemory.c
+++ b/third_party/libxml/src/xmlmemory.c
@@ -172,6 +172,13 @@
 
     TEST_POINT
 
+    if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
+	xmlGenericError(xmlGenericErrorContext,
+		"xmlMallocLoc : Unsigned overflow\n");
+	xmlMemoryDump();
+	return(NULL);
+    }
+
     p = (MEMHDR *) malloc(RESERVE_SIZE+size);
 
     if (!p) {
@@ -243,7 +250,7 @@
 
     if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
 	xmlGenericError(xmlGenericErrorContext,
-		"xmlMallocAtomicLoc : Unsigned overflow prevented\n");
+		"xmlMallocAtomicLoc : Unsigned overflow\n");
 	xmlMemoryDump();
 	return(NULL);
     }
@@ -352,6 +359,13 @@
 #endif
     xmlMutexUnlock(xmlMemMutex);
 
+    if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
+	xmlGenericError(xmlGenericErrorContext,
+		"xmlReallocLoc : Unsigned overflow\n");
+	xmlMemoryDump();
+	return(NULL);
+    }
+
     tmp = (MEMHDR *) realloc(p,RESERVE_SIZE+size);
     if (!tmp) {
 	 free(p);
@@ -499,6 +513,13 @@
     if (!xmlMemInitialized) xmlInitMemory();
     TEST_POINT
 
+    if (size > (MAX_SIZE_T - RESERVE_SIZE)) {
+	xmlGenericError(xmlGenericErrorContext,
+		"xmlMemStrdupLoc : Unsigned overflow\n");
+	xmlMemoryDump();
+	return(NULL);
+    }
+
     p = (MEMHDR *) malloc(RESERVE_SIZE+size);
     if (!p) {
       goto error;
diff --git a/third_party/libxml/src/xmlsave.c b/third_party/libxml/src/xmlsave.c
index 4a8e3f3..fea135ff 100644
--- a/third_party/libxml/src/xmlsave.c
+++ b/third_party/libxml/src/xmlsave.c
@@ -2109,8 +2109,6 @@
                 xmlBufAdd(buf, base, cur - base);
             if (*cur < 0xC0) {
                 xmlSaveErr(XML_SAVE_NOT_UTF8, (xmlNodePtr) attr, NULL);
-                if (doc != NULL)
-                    doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
 		xmlSerializeHexCharRef(tmp, *cur);
                 xmlBufAdd(buf, (xmlChar *) tmp, -1);
                 cur++;
@@ -2140,9 +2138,6 @@
             }
             if ((l == 1) || (!IS_CHAR(val))) {
                 xmlSaveErr(XML_SAVE_CHAR_INVALID, (xmlNodePtr) attr, NULL);
-                if (doc != NULL)
-                    doc->encoding = xmlStrdup(BAD_CAST "ISO-8859-1");
-
 		xmlSerializeHexCharRef(tmp, *cur);
                 xmlBufAdd(buf, (xmlChar *) tmp, -1);
                 cur++;
diff --git a/third_party/libxml/src/xpath.c b/third_party/libxml/src/xpath.c
index 38f4bd1..92dbb97 100644
--- a/third_party/libxml/src/xpath.c
+++ b/third_party/libxml/src/xpath.c
@@ -17,6 +17,7 @@
 #define IN_LIBXML
 #include "libxml.h"
 
+#include <limits.h>
 #include <string.h>
 
 #ifdef HAVE_SYS_TYPES_H
@@ -3105,7 +3106,8 @@
 		snprintf(buffer, buffersize, "NaN");
 	} else if (number == 0 && xmlXPathGetSign(number) != 0) {
 	    snprintf(buffer, buffersize, "0");
-	} else if (number == ((int) number)) {
+	} else if ((number > INT_MIN) && (number < INT_MAX) &&
+                   (number == (int) number)) {
 	    char work[30];
 	    char *ptr, *cur;
 	    int value = (int) number;
@@ -4021,13 +4023,7 @@
 		set1->nodeTab = temp;
 		set1->nodeMax *= 2;
 	    }
-	    if (n2->type == XML_NAMESPACE_DECL) {
-		xmlNsPtr ns = (xmlNsPtr) n2;
-
-		set1->nodeTab[set1->nodeNr++] =
-		    xmlXPathNodeSetDupNs((xmlNodePtr) ns->next, ns);
-	    } else
-		set1->nodeTab[set1->nodeNr++] = n2;
+	    set1->nodeTab[set1->nodeNr++] = n2;
 skip_node:
 	    {}
 	}
@@ -4196,33 +4192,6 @@
 }
 
 /**
- * xmlXPathNodeSetClear:
- * @set:  the node set to clear
- *
- * Clears the list from all temporary XPath objects (e.g. namespace nodes
- * are feed), but does *not* free the list itself. Sets the length of the
- * list to 0.
- */
-static void
-xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes)
-{
-    if ((set == NULL) || (set->nodeNr <= 0))
-	return;
-    else if (hasNsNodes) {
-	int i;
-	xmlNodePtr node;
-
-	for (i = 0; i < set->nodeNr; i++) {
-	    node = set->nodeTab[i];
-	    if ((node != NULL) &&
-		(node->type == XML_NAMESPACE_DECL))
-		xmlXPathNodeSetFreeNs((xmlNsPtr) node);
-	}
-    }
-    set->nodeNr = 0;
-}
-
-/**
  * xmlXPathNodeSetClearFromPos:
  * @set: the node set to be cleared
  * @pos: the start position to clear from
@@ -4234,7 +4203,7 @@
 static void
 xmlXPathNodeSetClearFromPos(xmlNodeSetPtr set, int pos, int hasNsNodes)
 {
-    if ((set == NULL) || (set->nodeNr <= 0) || (pos >= set->nodeNr))
+    if ((set == NULL) || (pos >= set->nodeNr))
 	return;
     else if ((hasNsNodes)) {
 	int i;
@@ -4251,6 +4220,46 @@
 }
 
 /**
+ * xmlXPathNodeSetClear:
+ * @set:  the node set to clear
+ *
+ * Clears the list from all temporary XPath objects (e.g. namespace nodes
+ * are feed), but does *not* free the list itself. Sets the length of the
+ * list to 0.
+ */
+static void
+xmlXPathNodeSetClear(xmlNodeSetPtr set, int hasNsNodes)
+{
+    xmlXPathNodeSetClearFromPos(set, 0, hasNsNodes);
+}
+
+/**
+ * xmlXPathNodeSetKeepLast:
+ * @set: the node set to be cleared
+ *
+ * Move the last node to the first position and clear temporary XPath objects
+ * (e.g. namespace nodes) from all other nodes. Sets the length of the list
+ * to 1.
+ */
+static void
+xmlXPathNodeSetKeepLast(xmlNodeSetPtr set)
+{
+    int i;
+    xmlNodePtr node;
+
+    if ((set == NULL) || (set->nodeNr <= 1))
+	return;
+    for (i = 0; i < set->nodeNr - 1; i++) {
+        node = set->nodeTab[i];
+        if ((node != NULL) &&
+            (node->type == XML_NAMESPACE_DECL))
+            xmlXPathNodeSetFreeNs((xmlNsPtr) node);
+    }
+    set->nodeTab[0] = set->nodeTab[set->nodeNr-1];
+    set->nodeNr = 1;
+}
+
+/**
  * xmlXPathFreeValueTree:
  * @obj:  the xmlNodeSetPtr to free
  *
@@ -6289,7 +6298,15 @@
  */
 void
 xmlXPathFreeParserContext(xmlXPathParserContextPtr ctxt) {
+    int i;
+
     if (ctxt->valueTab != NULL) {
+        for (i = 0; i < ctxt->valueNr; i++) {
+            if (ctxt->context)
+                xmlXPathReleaseObject(ctxt->context, ctxt->valueTab[i]);
+            else
+                xmlXPathFreeObject(ctxt->valueTab[i]);
+        }
         xmlFree(ctxt->valueTab);
     }
     if (ctxt->comp != NULL) {
@@ -6702,7 +6719,13 @@
 	    valuePush(ctxt, val);
 	    return(xmlXPathCompareValues(ctxt, inf, strict));
 	default:
-	    TODO
+            xmlGenericError(xmlGenericErrorContext,
+                    "xmlXPathCompareNodeSetValue: Can't compare node set "
+                    "and object of type %d\n",
+                    val->type);
+            xmlXPathReleaseObject(ctxt->context, arg);
+            xmlXPathReleaseObject(ctxt->context, val);
+            XP_ERROR0(XPATH_INVALID_TYPE);
     }
     return(0);
 }
@@ -8114,12 +8137,12 @@
 		return(NULL);
 	    return(cur->parent);
 	case XML_ATTRIBUTE_NODE: {
-	    xmlAttrPtr att = (xmlAttrPtr) ctxt->context->node;
+	    xmlAttrPtr att = (xmlAttrPtr) cur;
 
 	    return(att->parent);
 	}
 	case XML_NAMESPACE_DECL: {
-	    xmlNsPtr ns = (xmlNsPtr) ctxt->context->node;
+	    xmlNsPtr ns = (xmlNsPtr) cur;
 
 	    if ((ns->next != NULL) &&
 	        (ns->next->type != XML_NAMESPACE_DECL))
@@ -8236,10 +8259,16 @@
 
     if (cur == NULL) {
         cur = ctxt->context->node;
-        if (cur->type == XML_NAMESPACE_DECL)
-            return(NULL);
-        if (cur->type == XML_ATTRIBUTE_NODE)
+        if (cur->type == XML_ATTRIBUTE_NODE) {
             cur = cur->parent;
+        } else if (cur->type == XML_NAMESPACE_DECL) {
+            xmlNsPtr ns = (xmlNsPtr) cur;
+
+            if ((ns->next == NULL) ||
+                (ns->next->type == XML_NAMESPACE_DECL))
+                return (NULL);
+            cur = (xmlNodePtr) ns->next;
+        }
     }
     if (cur == NULL) return(NULL) ; /* ERROR */
     if (cur->next != NULL) return(cur->next) ;
@@ -8300,10 +8329,16 @@
     if ((ctxt == NULL) || (ctxt->context == NULL)) return(NULL);
     if (cur == NULL) {
         cur = ctxt->context->node;
-        if (cur->type == XML_NAMESPACE_DECL)
-            return(NULL);
-        if (cur->type == XML_ATTRIBUTE_NODE)
-            return(cur->parent);
+        if (cur->type == XML_ATTRIBUTE_NODE) {
+            cur = cur->parent;
+        } else if (cur->type == XML_NAMESPACE_DECL) {
+            xmlNsPtr ns = (xmlNsPtr) cur;
+
+            if ((ns->next == NULL) ||
+                (ns->next->type == XML_NAMESPACE_DECL))
+                return (NULL);
+            cur = (xmlNodePtr) ns->next;
+        }
     }
     if ((cur == NULL) || (cur->type == XML_NAMESPACE_DECL))
 	return (NULL);
@@ -8348,8 +8383,16 @@
         cur = ctxt->context->node;
         if (cur == NULL)
             return (NULL);
-        if (cur->type == XML_NAMESPACE_DECL)
-            return (NULL);
+        if (cur->type == XML_ATTRIBUTE_NODE) {
+            cur = cur->parent;
+        } else if (cur->type == XML_NAMESPACE_DECL) {
+            xmlNsPtr ns = (xmlNsPtr) cur;
+
+            if ((ns->next == NULL) ||
+                (ns->next->type == XML_NAMESPACE_DECL))
+                return (NULL);
+            cur = (xmlNodePtr) ns->next;
+        }
         ctxt->ancestor = cur->parent;
     }
     if (cur->type == XML_NAMESPACE_DECL)
@@ -9634,18 +9677,6 @@
     xmlXPathReleaseObject(ctxt->context, cur);
 }
 
-/*
- * To assure working code on multiple platforms, we want to only depend
- * upon the characteristic truncation of converting a floating point value
- * to an integer.  Unfortunately, because of the different storage sizes
- * of our internal floating point value (double) and integer (int), we
- * can't directly convert (see bug 301162).  This macro is a messy
- * 'workaround'
- */
-#define XTRUNC(f, v)            \
-    f = fmod((v), INT_MAX);     \
-    f = (v) - (f) + (double)((int)(f));
-
 /**
  * xmlXPathFloorFunction:
  * @ctxt:  the XPath Parser context
@@ -9658,19 +9689,11 @@
  */
 void
 xmlXPathFloorFunction(xmlXPathParserContextPtr ctxt, int nargs) {
-    double f;
-
     CHECK_ARITY(1);
     CAST_TO_NUMBER;
     CHECK_TYPE(XPATH_NUMBER);
 
-    XTRUNC(f, ctxt->value->floatval);
-    if (f != ctxt->value->floatval) {
-	if (ctxt->value->floatval > 0)
-	    ctxt->value->floatval = f;
-	else
-	    ctxt->value->floatval = f - 1;
-    }
+    ctxt->value->floatval = floor(ctxt->value->floatval);
 }
 
 /**
@@ -9685,28 +9708,11 @@
  */
 void
 xmlXPathCeilingFunction(xmlXPathParserContextPtr ctxt, int nargs) {
-    double f;
-
     CHECK_ARITY(1);
     CAST_TO_NUMBER;
     CHECK_TYPE(XPATH_NUMBER);
 
-#if 0
     ctxt->value->floatval = ceil(ctxt->value->floatval);
-#else
-    XTRUNC(f, ctxt->value->floatval);
-    if (f != ctxt->value->floatval) {
-	if (ctxt->value->floatval > 0)
-	    ctxt->value->floatval = f + 1;
-	else {
-	    if (ctxt->value->floatval < 0 && f == 0)
-	        ctxt->value->floatval = xmlXPathNZERO;
-	    else
-	        ctxt->value->floatval = f;
-	}
-
-    }
-#endif
 }
 
 /**
@@ -9718,7 +9724,7 @@
  *    number round(number)
  * The round function returns the number that is closest to the
  * argument and that is an integer. If there are two such numbers,
- * then the one that is even is returned.
+ * then the one that is closest to positive infinity is returned.
  */
 void
 xmlXPathRoundFunction(xmlXPathParserContextPtr ctxt, int nargs) {
@@ -9728,25 +9734,21 @@
     CAST_TO_NUMBER;
     CHECK_TYPE(XPATH_NUMBER);
 
-    if ((xmlXPathIsNaN(ctxt->value->floatval)) ||
-	(xmlXPathIsInf(ctxt->value->floatval) == 1) ||
-	(xmlXPathIsInf(ctxt->value->floatval) == -1) ||
-	(ctxt->value->floatval == 0.0))
+    f = ctxt->value->floatval;
+
+    /* Test for zero to keep negative zero unchanged. */
+    if ((xmlXPathIsNaN(f)) || (f == 0.0))
 	return;
 
-    XTRUNC(f, ctxt->value->floatval);
-    if (ctxt->value->floatval < 0) {
-	if (ctxt->value->floatval < f - 0.5)
-	    ctxt->value->floatval = f - 1;
-	else
-	    ctxt->value->floatval = f;
-	if (ctxt->value->floatval == 0)
-	    ctxt->value->floatval = xmlXPathNZERO;
-    } else {
-	if (ctxt->value->floatval < f + 0.5)
-	    ctxt->value->floatval = f;
-	else
-	    ctxt->value->floatval = f + 1;
+    if ((f >= -0.5) && (f < 0.0)) {
+        /* Negative zero. */
+        ctxt->value->floatval = xmlXPathNZERO;
+    }
+    else {
+        double rounded = floor(f);
+        if (f - rounded >= 0.5)
+            rounded += 1.0;
+        ctxt->value->floatval = rounded;
     }
 }
 
@@ -10056,20 +10058,6 @@
 
 #define MAX_FRAC 20
 
-/*
- * These are used as divisors for the fractional part of a number.
- * Since the table includes 1.0 (representing '0' fractional digits),
- * it must be dimensioned at MAX_FRAC+1 (bug 133921)
- */
-static double my_pow10[MAX_FRAC+1] = {
-    1.0, 10.0, 100.0, 1000.0, 10000.0,
-    100000.0, 1000000.0, 10000000.0, 100000000.0, 1000000000.0,
-    10000000000.0, 100000000000.0, 1000000000000.0, 10000000000000.0,
-    100000000000000.0,
-    1000000000000000.0, 10000000000000000.0, 100000000000000000.0,
-    1000000000000000000.0, 10000000000000000000.0, 100000000000000000000.0
-};
-
 /**
  * xmlXPathStringEvalNumber:
  * @str:  A string to scan
@@ -10132,20 +10120,25 @@
 #endif
 
     if (*cur == '.') {
-	int v, frac = 0;
+	int v, frac = 0, max;
 	double fraction = 0;
 
         cur++;
 	if (((*cur < '0') || (*cur > '9')) && (!ok)) {
 	    return(xmlXPathNAN);
 	}
-	while (((*cur >= '0') && (*cur <= '9')) && (frac < MAX_FRAC)) {
+        while (*cur == '0') {
+	    frac = frac + 1;
+	    cur++;
+        }
+        max = frac + MAX_FRAC;
+	while (((*cur >= '0') && (*cur <= '9')) && (frac < max)) {
 	    v = (*cur - '0');
 	    fraction = fraction * 10 + v;
 	    frac = frac + 1;
 	    cur++;
 	}
-	fraction /= my_pow10[frac];
+	fraction /= pow(10.0, frac);
 	ret = ret + fraction;
 	while ((*cur >= '0') && (*cur <= '9'))
 	    cur++;
@@ -10159,7 +10152,8 @@
         cur++;
       }
       while ((*cur >= '0') && (*cur <= '9')) {
-	exponent = exponent * 10 + (*cur - '0');
+        if (exponent < 1000000)
+	  exponent = exponent * 10 + (*cur - '0');
 	cur++;
       }
     }
@@ -10221,20 +10215,25 @@
     }
 #endif
     if (CUR == '.') {
-	int v, frac = 0;
+	int v, frac = 0, max;
 	double fraction = 0;
 
         NEXT;
         if (((CUR < '0') || (CUR > '9')) && (!ok)) {
             XP_ERROR(XPATH_NUMBER_ERROR);
         }
-        while ((CUR >= '0') && (CUR <= '9') && (frac < MAX_FRAC)) {
+        while (CUR == '0') {
+            frac = frac + 1;
+            NEXT;
+        }
+        max = frac + MAX_FRAC;
+        while ((CUR >= '0') && (CUR <= '9') && (frac < max)) {
 	    v = (CUR - '0');
 	    fraction = fraction * 10 + v;
 	    frac = frac + 1;
             NEXT;
         }
-        fraction /= my_pow10[frac];
+        fraction /= pow(10.0, frac);
         ret = ret + fraction;
         while ((CUR >= '0') && (CUR <= '9'))
             NEXT;
@@ -10248,7 +10247,8 @@
 	    NEXT;
 	}
         while ((CUR >= '0') && (CUR <= '9')) {
-            exponent = exponent * 10 + (CUR - '0');
+            if (exponent < 1000000)
+                exponent = exponent * 10 + (CUR - '0');
             NEXT;
         }
         if (is_exponent_negative)
@@ -10379,6 +10379,7 @@
     NEXT;
     name = xmlXPathParseQName(ctxt, &prefix);
     if (name == NULL) {
+        xmlFree(prefix);
 	XP_ERROR(XPATH_VARIABLE_REF_ERROR);
     }
     ctxt->comp->last = -1;
@@ -10452,6 +10453,8 @@
 #endif
 
     if (CUR != '(') {
+	xmlFree(name);
+	xmlFree(prefix);
 	XP_ERROR(XPATH_EXPR_ERROR);
     }
     NEXT;
@@ -10480,6 +10483,8 @@
 	    nbargs++;
 	    if (CUR == ')') break;
 	    if (CUR != ',') {
+		xmlFree(name);
+		xmlFree(prefix);
 		XP_ERROR(XPATH_EXPR_ERROR);
 	    }
 	    NEXT;
@@ -12054,6 +12059,8 @@
 	(exprOp->value4 != NULL) &&
 	(((xmlXPathObjectPtr) exprOp->value4)->type == XPATH_NUMBER))
     {
+        double floatval = ((xmlXPathObjectPtr) exprOp->value4)->floatval;
+
 	/*
 	* We have a "[n]" predicate here.
 	* TODO: Unfortunately this simplistic test here is not
@@ -12064,13 +12071,12 @@
 	* like it "[position() < 5]", is also not detected.
 	* Maybe we could rewrite the AST to ease the optimization.
 	*/
-	*maxPos = (int) ((xmlXPathObjectPtr) exprOp->value4)->floatval;
 
-	if (((xmlXPathObjectPtr) exprOp->value4)->floatval ==
-	    (float) *maxPos)
-	{
-	    return(1);
-	}
+        if ((floatval > INT_MIN) && (floatval < INT_MAX)) {
+	    *maxPos = (int) floatval;
+            if (floatval == (double) *maxPos)
+                return(1);
+        }
     }
     return(0);
 }
@@ -12772,11 +12778,15 @@
                 xmlXPathCompOpEvalFirst(ctxt, &comp->steps[op->ch2],
                                         first);
 	    CHECK_ERROR0;
-            CHECK_TYPE0(XPATH_NODESET);
-            arg2 = valuePop(ctxt);
 
-            CHECK_TYPE0(XPATH_NODESET);
+            arg2 = valuePop(ctxt);
             arg1 = valuePop(ctxt);
+            if ((arg1 == NULL) || (arg1->type != XPATH_NODESET) ||
+                (arg2 == NULL) || (arg2->type != XPATH_NODESET)) {
+	        xmlXPathReleaseObject(ctxt->context, arg1);
+	        xmlXPathReleaseObject(ctxt->context, arg2);
+                XP_ERROR0(XPATH_INVALID_TYPE);
+            }
 
             arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
                                                     arg2->nodesetval);
@@ -12907,11 +12917,15 @@
                 && (ctxt->value->nodesetval != NULL)
                 && (ctxt->value->nodesetval->nodeNr >= 1)) { /* TODO: NOP ? */
             }
-            CHECK_TYPE0(XPATH_NODESET);
-            arg2 = valuePop(ctxt);
 
-            CHECK_TYPE0(XPATH_NODESET);
+            arg2 = valuePop(ctxt);
             arg1 = valuePop(ctxt);
+            if ((arg1 == NULL) || (arg1->type != XPATH_NODESET) ||
+                (arg2 == NULL) || (arg2->type != XPATH_NODESET)) {
+	        xmlXPathReleaseObject(ctxt->context, arg1);
+	        xmlXPathReleaseObject(ctxt->context, arg2);
+                XP_ERROR0(XPATH_INVALID_TYPE);
+            }
 
             arg1->nodesetval = xmlXPathNodeSetMerge(arg1->nodesetval,
                                                     arg2->nodesetval);
@@ -13022,13 +13036,7 @@
 		(ctxt->value->nodesetval != NULL) &&
 		(ctxt->value->nodesetval->nodeTab != NULL) &&
 		(ctxt->value->nodesetval->nodeNr > 1)) {
-		ctxt->value->nodesetval->nodeTab[0] =
-		    ctxt->value->nodesetval->nodeTab[ctxt->
-		    value->
-		    nodesetval->
-		    nodeNr -
-		    1];
-		ctxt->value->nodesetval->nodeNr = 1;
+                xmlXPathNodeSetKeepLast(ctxt->value->nodesetval);
 		*first = *(ctxt->value->nodesetval->nodeTab);
 	    }
 	    return (total);
@@ -13445,11 +13453,15 @@
 	    ctxt->context->contextSize = cs;
             total += xmlXPathCompOpEval(ctxt, &comp->steps[op->ch2]);
 	    CHECK_ERROR0;
-            CHECK_TYPE0(XPATH_NODESET);
-            arg2 = valuePop(ctxt);
 
-            CHECK_TYPE0(XPATH_NODESET);
+            arg2 = valuePop(ctxt);
             arg1 = valuePop(ctxt);
+            if ((arg1 == NULL) || (arg1->type != XPATH_NODESET) ||
+                (arg2 == NULL) || (arg2->type != XPATH_NODESET)) {
+	        xmlXPathReleaseObject(ctxt->context, arg1);
+	        xmlXPathReleaseObject(ctxt->context, arg2);
+                XP_ERROR0(XPATH_INVALID_TYPE);
+            }
 
 	    if ((arg1->nodesetval == NULL) ||
 		((arg2->nodesetval != NULL) &&
@@ -13677,7 +13689,8 @@
                             (ctxt->value->type == XPATH_NODESET) &&
                             (ctxt->value->nodesetval != NULL) &&
                             (ctxt->value->nodesetval->nodeNr > 1))
-                            ctxt->value->nodesetval->nodeNr = 1;
+                            xmlXPathNodeSetClearFromPos(ctxt->value->nodesetval,
+                                                        1, 1);
                         return (total);
                     }
                 }
@@ -13711,15 +13724,8 @@
                             (ctxt->value->type == XPATH_NODESET) &&
                             (ctxt->value->nodesetval != NULL) &&
                             (ctxt->value->nodesetval->nodeTab != NULL) &&
-                            (ctxt->value->nodesetval->nodeNr > 1)) {
-                            ctxt->value->nodesetval->nodeTab[0] =
-                                ctxt->value->nodesetval->nodeTab[ctxt->
-                                                                 value->
-                                                                 nodesetval->
-                                                                 nodeNr -
-                                                                 1];
-                            ctxt->value->nodesetval->nodeNr = 1;
-                        }
+                            (ctxt->value->nodesetval->nodeNr > 1))
+                            xmlXPathNodeSetKeepLast(ctxt->value->nodesetval);
                         return (total);
                     }
                 }
@@ -14908,10 +14914,11 @@
 static int
 xmlXPathCompiledEvalInternal(xmlXPathCompExprPtr comp,
 			     xmlXPathContextPtr ctxt,
-			     xmlXPathObjectPtr *resObj,
+			     xmlXPathObjectPtr *resObjPtr,
 			     int toBool)
 {
     xmlXPathParserContextPtr pctxt;
+    xmlXPathObjectPtr resObj;
 #ifndef LIBXML_THREAD_ENABLED
     static int reentance = 0;
 #endif
@@ -14939,43 +14946,26 @@
     pctxt = xmlXPathCompParserContext(comp, ctxt);
     res = xmlXPathRunEval(pctxt, toBool);
 
-    if (resObj) {
-	if (pctxt->value == NULL) {
-	    xmlGenericError(xmlGenericErrorContext,
-		"xmlXPathCompiledEval: evaluation failed\n");
-	    *resObj = NULL;
-	} else {
-	    *resObj = valuePop(pctxt);
-	}
+    if (pctxt->error != XPATH_EXPRESSION_OK) {
+        resObj = NULL;
+    } else {
+        resObj = valuePop(pctxt);
+        if (resObj == NULL) {
+            if (!toBool)
+                xmlGenericError(xmlGenericErrorContext,
+                    "xmlXPathCompiledEval: No result on the stack.\n");
+        } else if (pctxt->valueNr > 0) {
+            xmlGenericError(xmlGenericErrorContext,
+                "xmlXPathCompiledEval: %d object(s) left on the stack.\n",
+                pctxt->valueNr);
+        }
     }
 
-    /*
-    * Pop all remaining objects from the stack.
-    */
-    if (pctxt->valueNr > 0) {
-	xmlXPathObjectPtr tmp;
-	int stack = 0;
+    if (resObjPtr)
+        *resObjPtr = resObj;
+    else
+        xmlXPathReleaseObject(ctxt, resObj);
 
-	do {
-	    tmp = valuePop(pctxt);
-	    if (tmp != NULL) {
-		stack++;
-		xmlXPathReleaseObject(ctxt, tmp);
-	    }
-	} while (tmp != NULL);
-	if ((stack != 0) &&
-	    ((toBool) || ((resObj) && (*resObj))))
-	{
-	    xmlGenericError(xmlGenericErrorContext,
-		"xmlXPathCompiledEval: %d objects left on the stack.\n",
-		stack);
-	}
-    }
-
-    if ((pctxt->error != XPATH_EXPRESSION_OK) && (resObj) && (*resObj)) {
-	xmlXPathFreeObject(*resObj);
-	*resObj = NULL;
-    }
     pctxt->comp = NULL;
     xmlXPathFreeParserContext(pctxt);
 #ifndef LIBXML_THREAD_ENABLED
@@ -15043,22 +15033,21 @@
         if (ctxt->comp != NULL)
 	    xmlXPathFreeCompExpr(ctxt->comp);
         ctxt->comp = comp;
-	if (ctxt->cur != NULL)
-	    while (*ctxt->cur != 0) ctxt->cur++;
     } else
 #endif
     {
 	xmlXPathCompileExpr(ctxt, 1);
-	if ((ctxt->error == XPATH_EXPRESSION_OK) &&
-	    (ctxt->comp != NULL) &&
-	    (ctxt->comp->nbStep > 1) &&
-	    (ctxt->comp->last >= 0))
-	{
+        CHECK_ERROR;
+
+        /* Check for trailing characters. */
+        if (*ctxt->cur != 0)
+            XP_ERROR(XPATH_EXPR_ERROR);
+
+	if ((ctxt->comp->nbStep > 1) && (ctxt->comp->last >= 0))
 	    xmlXPathOptimizeExpression(ctxt->comp,
 		&ctxt->comp->steps[ctxt->comp->last]);
-	}
     }
-    CHECK_ERROR;
+
     xmlXPathRunEval(ctxt, 0);
 }
 
@@ -15075,8 +15064,7 @@
 xmlXPathObjectPtr
 xmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) {
     xmlXPathParserContextPtr ctxt;
-    xmlXPathObjectPtr res, tmp, init = NULL;
-    int stack = 0;
+    xmlXPathObjectPtr res;
 
     CHECK_CTXT(ctx)
 
@@ -15087,37 +15075,18 @@
         return NULL;
     xmlXPathEvalExpr(ctxt);
 
-    if (ctxt->value == NULL) {
-	xmlGenericError(xmlGenericErrorContext,
-		"xmlXPathEval: evaluation failed\n");
-	res = NULL;
-    } else if ((*ctxt->cur != 0) && (ctxt->comp != NULL)
-#ifdef XPATH_STREAMING
-            && (ctxt->comp->stream == NULL)
-#endif
-	      ) {
-	xmlXPatherror(ctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
+    if (ctxt->error != XPATH_EXPRESSION_OK) {
 	res = NULL;
     } else {
 	res = valuePop(ctxt);
-    }
-
-    do {
-        tmp = valuePop(ctxt);
-	if (tmp != NULL) {
-	    if (tmp != init)
-		stack++;
-	    xmlXPathReleaseObject(ctx, tmp);
+        if (res == NULL) {
+            xmlGenericError(xmlGenericErrorContext,
+                "xmlXPathCompiledEval: No result on the stack.\n");
+        } else if (ctxt->valueNr > 0) {
+            xmlGenericError(xmlGenericErrorContext,
+                "xmlXPathCompiledEval: %d object(s) left on the stack.\n",
+                ctxt->valueNr);
         }
-    } while (tmp != NULL);
-    if ((stack != 0) && (res != NULL)) {
-	xmlGenericError(xmlGenericErrorContext,
-		"xmlXPathEval: %d object left on the stack\n",
-	        stack);
-    }
-    if (ctxt->error != XPATH_EXPRESSION_OK) {
-	xmlXPathFreeObject(res);
-	res = NULL;
     }
 
     xmlXPathFreeParserContext(ctxt);
@@ -15172,46 +15141,11 @@
  * @str:  the XPath expression
  * @ctxt:  the XPath context
  *
- * Evaluate the XPath expression in the given context.
- *
- * Returns the xmlXPathObjectPtr resulting from the evaluation or NULL.
- *         the caller has to free the object.
+ * Alias for xmlXPathEval.
  */
 xmlXPathObjectPtr
 xmlXPathEvalExpression(const xmlChar *str, xmlXPathContextPtr ctxt) {
-    xmlXPathParserContextPtr pctxt;
-    xmlXPathObjectPtr res, tmp;
-    int stack = 0;
-
-    CHECK_CTXT(ctxt)
-
-    xmlXPathInit();
-
-    pctxt = xmlXPathNewParserContext(str, ctxt);
-    if (pctxt == NULL)
-        return NULL;
-    xmlXPathEvalExpr(pctxt);
-
-    if ((*pctxt->cur != 0) || (pctxt->error != XPATH_EXPRESSION_OK)) {
-	xmlXPatherror(pctxt, __FILE__, __LINE__, XPATH_EXPR_ERROR);
-	res = NULL;
-    } else {
-	res = valuePop(pctxt);
-    }
-    do {
-        tmp = valuePop(pctxt);
-	if (tmp != NULL) {
-	    xmlXPathReleaseObject(ctxt, tmp);
-	    stack++;
-	}
-    } while (tmp != NULL);
-    if ((stack != 0) && (res != NULL)) {
-	xmlGenericError(xmlGenericErrorContext,
-		"xmlXPathEvalExpression: %d object left on the stack\n",
-	        stack);
-    }
-    xmlXPathFreeParserContext(pctxt);
-    return(res);
+    return(xmlXPathEval(str, ctxt));
 }
 
 /************************************************************************
diff --git a/third_party/libxml/win32/include/libxml/xmlversion.h b/third_party/libxml/win32/include/libxml/xmlversion.h
index ef885be..b2436d7 100644
--- a/third_party/libxml/win32/include/libxml/xmlversion.h
+++ b/third_party/libxml/win32/include/libxml/xmlversion.h
@@ -1,489 +1,489 @@
-/*
- * Summary: compile-time version informations
- * Description: compile-time version informations for the XML library
- *
- * Copy: See Copyright for the status of this software.
- *
- * Author: Daniel Veillard
- */
-
-#ifndef __XML_VERSION_H__
-#define __XML_VERSION_H__
-
-#include <libxml/xmlexports.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * use those to be sure nothing nasty will happen if
- * your library and includes mismatch
- */
-#ifndef LIBXML2_COMPILING_MSCCDEF
-XMLPUBFUN void XMLCALL xmlCheckVersion(int version);
-#endif /* LIBXML2_COMPILING_MSCCDEF */
-
-/**
- * LIBXML_DOTTED_VERSION:
- *
- * the version string like "1.2.3"
- */
-#define LIBXML_DOTTED_VERSION "2.9.4"
-
-/**
- * LIBXML_VERSION:
- *
- * the version number: 1.2.3 value is 10203
- */
-#define LIBXML_VERSION 20904
-
-/**
- * LIBXML_VERSION_STRING:
- *
- * the version number string, 1.2.3 value is "10203"
- */
-#define LIBXML_VERSION_STRING "20904"
-
-/**
- * LIBXML_VERSION_EXTRA:
- *
- * extra version information, used to show a CVS compilation
- */
-#define LIBXML_VERSION_EXTRA ""
-
-/**
- * LIBXML_TEST_VERSION:
- *
- * Macro to check that the libxml version in use is compatible with
- * the version the software has been compiled against
- */
-#define LIBXML_TEST_VERSION xmlCheckVersion(20904);
-
-#ifndef VMS
-#if 0
-/**
- * WITH_TRIO:
- *
- * defined if the trio support need to be configured in
- */
-#define WITH_TRIO
-#else
-/**
- * WITHOUT_TRIO:
- *
- * defined if the trio support should not be configured in
- */
-#define WITHOUT_TRIO
-#endif
-#else /* VMS */
-/**
- * WITH_TRIO:
- *
- * defined if the trio support need to be configured in
- */
-#define WITH_TRIO 1
-#endif /* VMS */
-
-/**
- * LIBXML_THREAD_ENABLED:
- *
- * Whether the thread support is configured in
- */
-#if 1
-#if defined(_REENTRANT) || defined(__MT__) || \
-    (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L))
-#define LIBXML_THREAD_ENABLED
-#endif
-#endif
-
-/**
- * LIBXML_THREAD_ALLOC_ENABLED:
- *
- * Whether the allocation hooks are per-thread
- */
-#if 0
-#define LIBXML_THREAD_ALLOC_ENABLED
-#endif
-
-/**
- * LIBXML_TREE_ENABLED:
- *
- * Whether the DOM like tree manipulation API support is configured in
- */
-#if 1
-#define LIBXML_TREE_ENABLED
-#endif
-
-/**
- * LIBXML_OUTPUT_ENABLED:
- *
- * Whether the serialization/saving support is configured in
- */
-#if 1
-#define LIBXML_OUTPUT_ENABLED
-#endif
-
-/**
- * LIBXML_PUSH_ENABLED:
- *
- * Whether the push parsing interfaces are configured in
- */
-#if 1
-#define LIBXML_PUSH_ENABLED
-#endif
-
-/**
- * LIBXML_READER_ENABLED:
- *
- * Whether the xmlReader parsing interface is configured in
- */
-#if 1
-#define LIBXML_READER_ENABLED
-#endif
-
-/**
- * LIBXML_PATTERN_ENABLED:
- *
- * Whether the xmlPattern node selection interface is configured in
- */
-#if 1
-#define LIBXML_PATTERN_ENABLED
-#endif
-
-/**
- * LIBXML_WRITER_ENABLED:
- *
- * Whether the xmlWriter saving interface is configured in
- */
-#if 1
-#define LIBXML_WRITER_ENABLED
-#endif
-
-/**
- * LIBXML_SAX1_ENABLED:
- *
- * Whether the older SAX1 interface is configured in
- */
-#if 1
-#define LIBXML_SAX1_ENABLED
-#endif
-
-/**
- * LIBXML_FTP_ENABLED:
- *
- * Whether the FTP support is configured in
- */
-#if 0
-#define LIBXML_FTP_ENABLED
-#endif
-
-/**
- * LIBXML_HTTP_ENABLED:
- *
- * Whether the HTTP support is configured in
- */
-#if 0
-#define LIBXML_HTTP_ENABLED
-#endif
-
-/**
- * LIBXML_VALID_ENABLED:
- *
- * Whether the DTD validation support is configured in
- */
-#if 0
-#define LIBXML_VALID_ENABLED
-#endif
-
-/**
- * LIBXML_HTML_ENABLED:
- *
- * Whether the HTML support is configured in
- */
-#if 1
-#define LIBXML_HTML_ENABLED
-#endif
-
-/**
- * LIBXML_LEGACY_ENABLED:
- *
- * Whether the deprecated APIs are compiled in for compatibility
- */
-#if 0
-#define LIBXML_LEGACY_ENABLED
-#endif
-
-/**
- * LIBXML_C14N_ENABLED:
- *
- * Whether the Canonicalization support is configured in
- */
-#if 0
-#define LIBXML_C14N_ENABLED
-#endif
-
-/**
- * LIBXML_CATALOG_ENABLED:
- *
- * Whether the Catalog support is configured in
- */
-#if 0
-#define LIBXML_CATALOG_ENABLED
-#endif
-
-/**
- * LIBXML_DOCB_ENABLED:
- *
- * Whether the SGML Docbook support is configured in
- */
-#if 0
-#define LIBXML_DOCB_ENABLED
-#endif
-
-/**
- * LIBXML_XPATH_ENABLED:
- *
- * Whether XPath is configured in
- */
-#if 1
-#define LIBXML_XPATH_ENABLED
-#endif
-
-/**
- * LIBXML_XPTR_ENABLED:
- *
- * Whether XPointer is configured in
- */
-#if 0
-#define LIBXML_XPTR_ENABLED
-#endif
-
-/**
- * LIBXML_XINCLUDE_ENABLED:
- *
- * Whether XInclude is configured in
- */
-#if 0
-#define LIBXML_XINCLUDE_ENABLED
-#endif
-
-/**
- * LIBXML_ICONV_ENABLED:
- *
- * Whether iconv support is available
- */
-#if 0
-#define LIBXML_ICONV_ENABLED
-#endif
-
-/**
- * LIBXML_ICU_ENABLED:
- *
- * Whether icu support is available
- */
-#if 1
-#define LIBXML_ICU_ENABLED
-#endif
-
-/**
- * LIBXML_ISO8859X_ENABLED:
- *
- * Whether ISO-8859-* support is made available in case iconv is not
- */
-#if 0
-#define LIBXML_ISO8859X_ENABLED
-#endif
-
-/**
- * LIBXML_DEBUG_ENABLED:
- *
- * Whether Debugging module is configured in
- */
-#if 0
-#define LIBXML_DEBUG_ENABLED
-#endif
-
-/**
- * DEBUG_MEMORY_LOCATION:
- *
- * Whether the memory debugging is configured in
- */
-#if 0
-#define DEBUG_MEMORY_LOCATION
-#endif
-
-/**
- * LIBXML_DEBUG_RUNTIME:
- *
- * Whether the runtime debugging is configured in
- */
-#if 0
-#define LIBXML_DEBUG_RUNTIME
-#endif
-
-/**
- * LIBXML_UNICODE_ENABLED:
- *
- * Whether the Unicode related interfaces are compiled in
- */
-#if 0
-#define LIBXML_UNICODE_ENABLED
-#endif
-
-/**
- * LIBXML_REGEXP_ENABLED:
- *
- * Whether the regular expressions interfaces are compiled in
- */
-#if 0
-#define LIBXML_REGEXP_ENABLED
-#endif
-
-/**
- * LIBXML_AUTOMATA_ENABLED:
- *
- * Whether the automata interfaces are compiled in
- */
-#if 0
-#define LIBXML_AUTOMATA_ENABLED
-#endif
-
-/**
- * LIBXML_EXPR_ENABLED:
- *
- * Whether the formal expressions interfaces are compiled in
- */
-#if 0
-#define LIBXML_EXPR_ENABLED
-#endif
-
-/**
- * LIBXML_SCHEMAS_ENABLED:
- *
- * Whether the Schemas validation interfaces are compiled in
- */
-#if 0
-#define LIBXML_SCHEMAS_ENABLED
-#endif
-
-/**
- * LIBXML_SCHEMATRON_ENABLED:
- *
- * Whether the Schematron validation interfaces are compiled in
- */
-#if 0
-#define LIBXML_SCHEMATRON_ENABLED
-#endif
-
-/**
- * LIBXML_MODULES_ENABLED:
- *
- * Whether the module interfaces are compiled in
- */
-#if 0
-#define LIBXML_MODULES_ENABLED
-/**
- * LIBXML_MODULE_EXTENSION:
- *
- * the string suffix used by dynamic modules (usually shared libraries)
- */
-#define LIBXML_MODULE_EXTENSION ".dll" 
-#endif
-
-/**
- * LIBXML_ZLIB_ENABLED:
- *
- * Whether the Zlib support is compiled in
- */
-#if 0
-#define LIBXML_ZLIB_ENABLED
-#endif
-
-/**
- * LIBXML_LZMA_ENABLED:
- *
- * Whether the Lzma support is compiled in
- */
-#if 0
-#define LIBXML_LZMA_ENABLED
-#endif
-
-#ifdef __GNUC__
-#ifdef HAVE_ANSIDECL_H
-#include <ansidecl.h>
-#endif
-
-/**
- * ATTRIBUTE_UNUSED:
- *
- * Macro used to signal to GCC unused function parameters
- */
-
-#ifndef ATTRIBUTE_UNUSED
-# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)))
-#  define ATTRIBUTE_UNUSED __attribute__((unused))
-# else
-#  define ATTRIBUTE_UNUSED
-# endif
-#endif
-
-/**
- * LIBXML_ATTR_ALLOC_SIZE:
- *
- * Macro used to indicate to GCC this is an allocator function
- */
-
-#ifndef LIBXML_ATTR_ALLOC_SIZE
-# if (!defined(__clang__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))))
-#  define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x)))
-# else
-#  define LIBXML_ATTR_ALLOC_SIZE(x)
-# endif
-#else
-# define LIBXML_ATTR_ALLOC_SIZE(x)
-#endif
-
-/**
- * LIBXML_ATTR_FORMAT:
- *
- * Macro used to indicate to GCC the parameter are printf like
- */
-
-#ifndef LIBXML_ATTR_FORMAT
-# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))
-#  define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args)))
-# else
-#  define LIBXML_ATTR_FORMAT(fmt,args)
-# endif
-#else
-# define LIBXML_ATTR_FORMAT(fmt,args)
-#endif
-
-#else /* ! __GNUC__ */
-/**
- * ATTRIBUTE_UNUSED:
- *
- * Macro used to signal to GCC unused function parameters
- */
-#define ATTRIBUTE_UNUSED
-/**
- * LIBXML_ATTR_ALLOC_SIZE:
- *
- * Macro used to indicate to GCC this is an allocator function
- */
-#define LIBXML_ATTR_ALLOC_SIZE(x)
-/**
- * LIBXML_ATTR_FORMAT:
- *
- * Macro used to indicate to GCC the parameter are printf like
- */
-#define LIBXML_ATTR_FORMAT(fmt,args)
-#endif /* __GNUC__ */
-
-#ifdef __cplusplus
-}
-#endif /* __cplusplus */
-#endif
-
-
+/*

+ * Summary: compile-time version informations

+ * Description: compile-time version informations for the XML library

+ *

+ * Copy: See Copyright for the status of this software.

+ *

+ * Author: Daniel Veillard

+ */

+

+#ifndef __XML_VERSION_H__

+#define __XML_VERSION_H__

+

+#include <libxml/xmlexports.h>

+

+#ifdef __cplusplus

+extern "C" {

+#endif

+

+/*

+ * use those to be sure nothing nasty will happen if

+ * your library and includes mismatch

+ */

+#ifndef LIBXML2_COMPILING_MSCCDEF

+XMLPUBFUN void XMLCALL xmlCheckVersion(int version);

+#endif /* LIBXML2_COMPILING_MSCCDEF */

+

+/**

+ * LIBXML_DOTTED_VERSION:

+ *

+ * the version string like "1.2.3"

+ */

+#define LIBXML_DOTTED_VERSION "2.9.4"

+

+/**

+ * LIBXML_VERSION:

+ *

+ * the version number: 1.2.3 value is 10203

+ */

+#define LIBXML_VERSION 20904

+

+/**

+ * LIBXML_VERSION_STRING:

+ *

+ * the version number string, 1.2.3 value is "10203"

+ */

+#define LIBXML_VERSION_STRING "20904"

+

+/**

+ * LIBXML_VERSION_EXTRA:

+ *

+ * extra version information, used to show a CVS compilation

+ */

+#define LIBXML_VERSION_EXTRA ""

+

+/**

+ * LIBXML_TEST_VERSION:

+ *

+ * Macro to check that the libxml version in use is compatible with

+ * the version the software has been compiled against

+ */

+#define LIBXML_TEST_VERSION xmlCheckVersion(20904);

+

+#ifndef VMS

+#if 0

+/**

+ * WITH_TRIO:

+ *

+ * defined if the trio support need to be configured in

+ */

+#define WITH_TRIO

+#else

+/**

+ * WITHOUT_TRIO:

+ *

+ * defined if the trio support should not be configured in

+ */

+#define WITHOUT_TRIO

+#endif

+#else /* VMS */

+/**

+ * WITH_TRIO:

+ *

+ * defined if the trio support need to be configured in

+ */

+#define WITH_TRIO 1

+#endif /* VMS */

+

+/**

+ * LIBXML_THREAD_ENABLED:

+ *

+ * Whether the thread support is configured in

+ */

+#if 1

+#if defined(_REENTRANT) || defined(__MT__) || \

+    (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0 >= 199506L))

+#define LIBXML_THREAD_ENABLED

+#endif

+#endif

+

+/**

+ * LIBXML_THREAD_ALLOC_ENABLED:

+ *

+ * Whether the allocation hooks are per-thread

+ */

+#if 0

+#define LIBXML_THREAD_ALLOC_ENABLED

+#endif

+

+/**

+ * LIBXML_TREE_ENABLED:

+ *

+ * Whether the DOM like tree manipulation API support is configured in

+ */

+#if 1

+#define LIBXML_TREE_ENABLED

+#endif

+

+/**

+ * LIBXML_OUTPUT_ENABLED:

+ *

+ * Whether the serialization/saving support is configured in

+ */

+#if 1

+#define LIBXML_OUTPUT_ENABLED

+#endif

+

+/**

+ * LIBXML_PUSH_ENABLED:

+ *

+ * Whether the push parsing interfaces are configured in

+ */

+#if 1

+#define LIBXML_PUSH_ENABLED

+#endif

+

+/**

+ * LIBXML_READER_ENABLED:

+ *

+ * Whether the xmlReader parsing interface is configured in

+ */

+#if 1

+#define LIBXML_READER_ENABLED

+#endif

+

+/**

+ * LIBXML_PATTERN_ENABLED:

+ *

+ * Whether the xmlPattern node selection interface is configured in

+ */

+#if 1

+#define LIBXML_PATTERN_ENABLED

+#endif

+

+/**

+ * LIBXML_WRITER_ENABLED:

+ *

+ * Whether the xmlWriter saving interface is configured in

+ */

+#if 1

+#define LIBXML_WRITER_ENABLED

+#endif

+

+/**

+ * LIBXML_SAX1_ENABLED:

+ *

+ * Whether the older SAX1 interface is configured in

+ */

+#if 1

+#define LIBXML_SAX1_ENABLED

+#endif

+

+/**

+ * LIBXML_FTP_ENABLED:

+ *

+ * Whether the FTP support is configured in

+ */

+#if 0

+#define LIBXML_FTP_ENABLED

+#endif

+

+/**

+ * LIBXML_HTTP_ENABLED:

+ *

+ * Whether the HTTP support is configured in

+ */

+#if 0

+#define LIBXML_HTTP_ENABLED

+#endif

+

+/**

+ * LIBXML_VALID_ENABLED:

+ *

+ * Whether the DTD validation support is configured in

+ */

+#if 0

+#define LIBXML_VALID_ENABLED

+#endif

+

+/**

+ * LIBXML_HTML_ENABLED:

+ *

+ * Whether the HTML support is configured in

+ */

+#if 1

+#define LIBXML_HTML_ENABLED

+#endif

+

+/**

+ * LIBXML_LEGACY_ENABLED:

+ *

+ * Whether the deprecated APIs are compiled in for compatibility

+ */

+#if 0

+#define LIBXML_LEGACY_ENABLED

+#endif

+

+/**

+ * LIBXML_C14N_ENABLED:

+ *

+ * Whether the Canonicalization support is configured in

+ */

+#if 0

+#define LIBXML_C14N_ENABLED

+#endif

+

+/**

+ * LIBXML_CATALOG_ENABLED:

+ *

+ * Whether the Catalog support is configured in

+ */

+#if 0

+#define LIBXML_CATALOG_ENABLED

+#endif

+

+/**

+ * LIBXML_DOCB_ENABLED:

+ *

+ * Whether the SGML Docbook support is configured in

+ */

+#if 0

+#define LIBXML_DOCB_ENABLED

+#endif

+

+/**

+ * LIBXML_XPATH_ENABLED:

+ *

+ * Whether XPath is configured in

+ */

+#if 1

+#define LIBXML_XPATH_ENABLED

+#endif

+

+/**

+ * LIBXML_XPTR_ENABLED:

+ *

+ * Whether XPointer is configured in

+ */

+#if 0

+#define LIBXML_XPTR_ENABLED

+#endif

+

+/**

+ * LIBXML_XINCLUDE_ENABLED:

+ *

+ * Whether XInclude is configured in

+ */

+#if 0

+#define LIBXML_XINCLUDE_ENABLED

+#endif

+

+/**

+ * LIBXML_ICONV_ENABLED:

+ *

+ * Whether iconv support is available

+ */

+#if 0

+#define LIBXML_ICONV_ENABLED

+#endif

+

+/**

+ * LIBXML_ICU_ENABLED:

+ *

+ * Whether icu support is available

+ */

+#if 1

+#define LIBXML_ICU_ENABLED

+#endif

+

+/**

+ * LIBXML_ISO8859X_ENABLED:

+ *

+ * Whether ISO-8859-* support is made available in case iconv is not

+ */

+#if 0

+#define LIBXML_ISO8859X_ENABLED

+#endif

+

+/**

+ * LIBXML_DEBUG_ENABLED:

+ *

+ * Whether Debugging module is configured in

+ */

+#if 0

+#define LIBXML_DEBUG_ENABLED

+#endif

+

+/**

+ * DEBUG_MEMORY_LOCATION:

+ *

+ * Whether the memory debugging is configured in

+ */

+#if 0

+#define DEBUG_MEMORY_LOCATION

+#endif

+

+/**

+ * LIBXML_DEBUG_RUNTIME:

+ *

+ * Whether the runtime debugging is configured in

+ */

+#if 0

+#define LIBXML_DEBUG_RUNTIME

+#endif

+

+/**

+ * LIBXML_UNICODE_ENABLED:

+ *

+ * Whether the Unicode related interfaces are compiled in

+ */

+#if 0

+#define LIBXML_UNICODE_ENABLED

+#endif

+

+/**

+ * LIBXML_REGEXP_ENABLED:

+ *

+ * Whether the regular expressions interfaces are compiled in

+ */

+#if 0

+#define LIBXML_REGEXP_ENABLED

+#endif

+

+/**

+ * LIBXML_AUTOMATA_ENABLED:

+ *

+ * Whether the automata interfaces are compiled in

+ */

+#if 0

+#define LIBXML_AUTOMATA_ENABLED

+#endif

+

+/**

+ * LIBXML_EXPR_ENABLED:

+ *

+ * Whether the formal expressions interfaces are compiled in

+ */

+#if 0

+#define LIBXML_EXPR_ENABLED

+#endif

+

+/**

+ * LIBXML_SCHEMAS_ENABLED:

+ *

+ * Whether the Schemas validation interfaces are compiled in

+ */

+#if 0

+#define LIBXML_SCHEMAS_ENABLED

+#endif

+

+/**

+ * LIBXML_SCHEMATRON_ENABLED:

+ *

+ * Whether the Schematron validation interfaces are compiled in

+ */

+#if 0

+#define LIBXML_SCHEMATRON_ENABLED

+#endif

+

+/**

+ * LIBXML_MODULES_ENABLED:

+ *

+ * Whether the module interfaces are compiled in

+ */

+#if 0

+#define LIBXML_MODULES_ENABLED

+/**

+ * LIBXML_MODULE_EXTENSION:

+ *

+ * the string suffix used by dynamic modules (usually shared libraries)

+ */

+#define LIBXML_MODULE_EXTENSION ".dll" 

+#endif

+

+/**

+ * LIBXML_ZLIB_ENABLED:

+ *

+ * Whether the Zlib support is compiled in

+ */

+#if 0

+#define LIBXML_ZLIB_ENABLED

+#endif

+

+/**

+ * LIBXML_LZMA_ENABLED:

+ *

+ * Whether the Lzma support is compiled in

+ */

+#if 0

+#define LIBXML_LZMA_ENABLED

+#endif

+

+#ifdef __GNUC__

+#ifdef HAVE_ANSIDECL_H

+#include <ansidecl.h>

+#endif

+

+/**

+ * ATTRIBUTE_UNUSED:

+ *

+ * Macro used to signal to GCC unused function parameters

+ */

+

+#ifndef ATTRIBUTE_UNUSED

+# if ((__GNUC__ > 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ >= 7)))

+#  define ATTRIBUTE_UNUSED __attribute__((unused))

+# else

+#  define ATTRIBUTE_UNUSED

+# endif

+#endif

+

+/**

+ * LIBXML_ATTR_ALLOC_SIZE:

+ *

+ * Macro used to indicate to GCC this is an allocator function

+ */

+

+#ifndef LIBXML_ATTR_ALLOC_SIZE

+# if (!defined(__clang__) && ((__GNUC__ > 4) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 3))))

+#  define LIBXML_ATTR_ALLOC_SIZE(x) __attribute__((alloc_size(x)))

+# else

+#  define LIBXML_ATTR_ALLOC_SIZE(x)

+# endif

+#else

+# define LIBXML_ATTR_ALLOC_SIZE(x)

+#endif

+

+/**

+ * LIBXML_ATTR_FORMAT:

+ *

+ * Macro used to indicate to GCC the parameter are printf like

+ */

+

+#ifndef LIBXML_ATTR_FORMAT

+# if ((__GNUC__ > 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)))

+#  define LIBXML_ATTR_FORMAT(fmt,args) __attribute__((__format__(__printf__,fmt,args)))

+# else

+#  define LIBXML_ATTR_FORMAT(fmt,args)

+# endif

+#else

+# define LIBXML_ATTR_FORMAT(fmt,args)

+#endif

+

+#else /* ! __GNUC__ */

+/**

+ * ATTRIBUTE_UNUSED:

+ *

+ * Macro used to signal to GCC unused function parameters

+ */

+#define ATTRIBUTE_UNUSED

+/**

+ * LIBXML_ATTR_ALLOC_SIZE:

+ *

+ * Macro used to indicate to GCC this is an allocator function

+ */

+#define LIBXML_ATTR_ALLOC_SIZE(x)

+/**

+ * LIBXML_ATTR_FORMAT:

+ *

+ * Macro used to indicate to GCC the parameter are printf like

+ */

+#define LIBXML_ATTR_FORMAT(fmt,args)

+#endif /* __GNUC__ */

+

+#ifdef __cplusplus

+}

+#endif /* __cplusplus */

+#endif

+

+

diff --git a/tools/luci-go/linux64/isolate.sha1 b/tools/luci-go/linux64/isolate.sha1
index b8593a7..f14d0ea 100644
--- a/tools/luci-go/linux64/isolate.sha1
+++ b/tools/luci-go/linux64/isolate.sha1
@@ -1 +1 @@
-3c0fbcab83730c86bbd5a09e760388dcb7053bc4
+bcc0e73f051cc01452c24babbb4be9d5f4556c55
diff --git a/tools/luci-go/mac64/isolate.sha1 b/tools/luci-go/mac64/isolate.sha1
index bf7e1c1dd..7506974 100644
--- a/tools/luci-go/mac64/isolate.sha1
+++ b/tools/luci-go/mac64/isolate.sha1
@@ -1 +1 @@
-d37a2f34eff58e1fb04038bd52381001479d4aa1
+47ffac85c87dd0a2cfd6c4ded9c29c5bbcc8245d
diff --git a/tools/luci-go/win64/isolate.exe.sha1 b/tools/luci-go/win64/isolate.exe.sha1
index c575f970..9dccf31 100644
--- a/tools/luci-go/win64/isolate.exe.sha1
+++ b/tools/luci-go/win64/isolate.exe.sha1
@@ -1 +1 @@
-d4b894493b1ee5c04ec5bc88e6ea286426540770
+1ed79378fe41640a963f1aa6d1674e8456993d10
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 2de1cc0d..ab2f840 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -956,6 +956,8 @@
   <int value="27" label="Url is not eligible for WebAPKs"/>
   <int value="28" label="Site loaded in incognito window (not reported)"/>
   <int value="29" label="Service worker not offline capable"/>
+  <int value="30" label="Waiting for manifest to be fetched"/>
+  <int value="31" label="Waiting for installability check"/>
 </enum>
 
 <enum name="AppBannersInstallEvent">
@@ -35924,6 +35926,15 @@
   <int value="3" label="Infobar dismissed"/>
 </enum>
 
+<enum name="ThumbnailTopSitesEvent" type="int">
+  <int value="0" label="Not added: Failure"/>
+  <int value="1" label="Not added: TopSites is full"/>
+  <int value="2" label="Not added: Existing thumbnail is better"/>
+  <int value="3" label="Added temp thumbnail"/>
+  <int value="4" label="Added regular thumbnail"/>
+  <int value="5" label="Promoted temp thumbnail to regular"/>
+</enum>
+
 <enum name="TileMemoryBudget">
   <int value="0" label="Within memory budget"/>
   <int value="1" label="Exceeded memory budget"/>
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index fb871b71..7fe5a56 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -64233,18 +64233,6 @@
   </summary>
 </histogram>
 
-<histogram
-    name="SBClientDownload.DownloadFileWithoutDiskImageExtensionHasKolySignature"
-    enum="Boolean">
-  <owner>jialiul@chromium.org</owner>
-  <summary>
-    Records whether download files without an Apple disk image file extension
-    have a 'koly' signature. This can be used to identify distribution of disk
-    image files to Mac users without simply relying on file extension. This
-    metric is logged before Chrome sends SafeBrowsing download pings.
-  </summary>
-</histogram>
-
 <histogram name="SBClientDownload.DownloadRequestDuration" units="ms">
   <owner>mattm@chromium.org</owner>
   <summary>
@@ -68074,6 +68062,30 @@
   </summary>
 </histogram>
 
+<histogram name="ServiceWorker.NavPreload.WorkerPreparationType"
+    enum="ServiceWorkerPreparationType">
+  <owner>falken@chromium.org</owner>
+  <summary>
+    The type of preparation needed for the browser to find and possibly start an
+    active worker to dispatch a FetchEvent for a main frame resource request,
+    when navigation preload also occurred.
+
+    This histogram is recorded when a navigation preload response is succesfully
+    forwarded to the service worker's fetch event (for the case mentioned
+    above), with the same restrictions numbered 1) through 3) as for
+    ServiceWorker.ActivatedWorkerPreparationForMainFrame.Time. The sample is
+    only recorded to the appropriate suffixed histograms.
+
+    This is similar to
+    ServiceWorker.ActivatedWorkerPreparationForMainFrame.Type_NavigationPreloadEnabled.
+    The difference is ServiceWorker.NavPreload.WorkerPreparationType gets logged
+    if the navigation preload successfully occurred, at the same time as the
+    other ServiceWorker.NavPreload.* metrics so is more safely comparable to
+    them. We could deprecate the Type_NavigationPreloadEnabled histogram if it
+    turns out there is no significant difference.
+  </summary>
+</histogram>
+
 <histogram name="ServiceWorker.NavPreload.WorkerWaitTime" units="ms">
   <owner>falken@chromium.org</owner>
   <summary>
@@ -77824,6 +77836,13 @@
   </summary>
 </histogram>
 
+<histogram name="Thumbnails.AddedToTopSites" enum="ThumbnailTopSitesEvent">
+  <owner>treib@chromium.org</owner>
+  <summary>
+    A page thumbnail (for use on the New Tab page) was added to TopSites.
+  </summary>
+</histogram>
+
 <histogram name="Thumbnails.CopyFromSurfaceTime" units="ms">
   <owner>treib@chromium.org</owner>
   <summary>
@@ -89938,6 +89957,7 @@
   <affected-histogram name="ServiceWorker.NavPreload.ConcurrentTime"/>
   <affected-histogram name="ServiceWorker.NavPreload.FinishedFirst"/>
   <affected-histogram name="ServiceWorker.NavPreload.ResponseTime"/>
+  <affected-histogram name="ServiceWorker.NavPreload.WorkerPreparationType"/>
   <affected-histogram name="ServiceWorker.NavPreload.WorkerWaitTime"/>
 </histogram_suffixes>
 
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css
index bc8483a..aeecf06 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -202,6 +202,7 @@
   background: -webkit-image-set(
       url(../images/files/ui/eject.png) 1x,
       url(../images/files/ui/2x/eject.png) 2x) no-repeat center;
+  border-style: none;
   cursor: pointer;
   flex: none;
   height: 40px;
diff --git a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
index 7c599645..7e84b12f 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
+++ b/ui/file_manager/file_manager/foreground/js/ui/directory_tree.js
@@ -656,7 +656,7 @@
  * @private
  */
 VolumeItem.prototype.setupEjectButton_ = function(rowElement) {
-  var ejectButton = cr.doc.createElement('div');
+  var ejectButton = cr.doc.createElement('button');
   // Block other mouse handlers.
   ejectButton.addEventListener(
       'mouseup', function(event) { event.stopPropagation() });
@@ -664,6 +664,7 @@
       'mousedown', function(event) { event.stopPropagation() });
   ejectButton.className = 'root-eject';
   ejectButton.setAttribute('aria-label', str('UNMOUNT_DEVICE_BUTTON_LABEL'));
+  ejectButton.setAttribute('tabindex', '0');
   ejectButton.addEventListener('click', function(event) {
     event.stopPropagation();
     var unmountCommand = cr.doc.querySelector('command#unmount');