diff --git a/DEPS b/DEPS
index afbdcb1..9d5b61c 100644
--- a/DEPS
+++ b/DEPS
@@ -40,11 +40,11 @@
   # 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': '4ed5dac522f66bbe13ed10548dc57a8138234356',
+  'skia_revision': 'fd7819c5d8779e7394277abb49e0a0b2b03d1045',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': '444d885e98c9b91130ad91583f6c5e9ff5b9e67d',
+  'v8_revision': '7e8e04e46a4079e1d459575c2b0e3485ae252537',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling swarming_client
   # and whatever else without interference from each other.
@@ -52,7 +52,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '5978e28d3adc30d09c5cbdf51aa1e4b8dbfff6b1',
+  'angle_revision': '794607025b69599dd2607391cb13e51f39423f5d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling build tools
   # and whatever else without interference from each other.
@@ -64,7 +64,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling PDFium
   # and whatever else without interference from each other.
-  'pdfium_revision': '52998a4ce205708f6e00a007f3d1e57b24eb1c8b',
+  'pdfium_revision': '20eafda108cf9b0ab336fb8ab5d83a011f7b8307',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling openmax_dl
   # and whatever else without interference from each other.
@@ -96,7 +96,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': 'a3798635175e53f40f7548875b4eb9cec5baf055',
+  'catapult_revision': '32bdd960945af3580a61f9640bbfe72677e458ac',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libFuzzer
   # and whatever else without interference from each other.
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 8697e0b2..04c1ca6 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -421,6 +421,8 @@
     "system/night_light/night_light_controller.h",
     "system/night_light/night_light_toggle_button.cc",
     "system/night_light/night_light_toggle_button.h",
+    "system/night_light/time_of_day.cc",
+    "system/night_light/time_of_day.h",
     "system/night_light/tray_night_light.cc",
     "system/night_light/tray_night_light.h",
     "system/overview/overview_button_tray.cc",
@@ -1212,6 +1214,7 @@
     "system/network/tray_network_unittest.cc",
     "system/network/vpn_list_unittest.cc",
     "system/night_light/night_light_controller_unittest.cc",
+    "system/night_light/time_of_day_unittest.cc",
     "system/night_light/tray_night_light_unittest.cc",
     "system/overview/overview_button_tray_unittest.cc",
     "system/palette/mock_palette_tool_delegate.cc",
diff --git a/ash/DEPS b/ash/DEPS
index b667574..57532307 100644
--- a/ash/DEPS
+++ b/ash/DEPS
@@ -18,6 +18,7 @@
   "+services/ui/public",
   "+skia/ext",
   "+third_party/cros_system_api",
+  "+third_party/icu",
   "+third_party/skia",
   "+net",
   "+ui",
diff --git a/ash/public/cpp/ash_pref_names.cc b/ash/public/cpp/ash_pref_names.cc
index 1cb9e585..683f378 100644
--- a/ash/public/cpp/ash_pref_names.cc
+++ b/ash/public/cpp/ash_pref_names.cc
@@ -16,6 +16,24 @@
 // (most warm).
 const char kNightLightTemperature[] = "ash.night_light.color_temperature";
 
+// An integer pref storing the type of automatic scheduling of turning on and
+// off the NightLight feature. Valid values are:
+// 0 -> NightLight is never turned on or off automatically.
+// 1 -> NightLight is turned on and off at the sunset and sunrise times
+// respectively.
+// 2 -> NightLight schedule times are explicitly set by the user.
+//
+// See ash::NightLightController::ScheduleType.
+const char kNightLightScheduleType[] = "ash.night_light.schedule_type";
+
+// Integer prefs storing the start and end times of the automatic schedule at
+// which NightLight turns on and off respectively when the schedule type is set
+// to a custom schedule. The times are represented as the number of minutes from
+// 00:00 (12:00 AM) regardless of the date or the timezone.
+// See ash::TimeOfDayTime.
+const char kNightLightCustomStartTime[] = "ash.night_light.custom_start_time";
+const char kNightLightCustomEndTime[] = "ash.night_light.custom_end_time";
+
 }  // namespace prefs
 
 }  // namespace ash
diff --git a/ash/public/cpp/ash_pref_names.h b/ash/public/cpp/ash_pref_names.h
index ea59a58..5a4e8d4 100644
--- a/ash/public/cpp/ash_pref_names.h
+++ b/ash/public/cpp/ash_pref_names.h
@@ -13,6 +13,9 @@
 
 ASH_PUBLIC_EXPORT extern const char kNightLightEnabled[];
 ASH_PUBLIC_EXPORT extern const char kNightLightTemperature[];
+ASH_PUBLIC_EXPORT extern const char kNightLightScheduleType[];
+ASH_PUBLIC_EXPORT extern const char kNightLightCustomStartTime[];
+ASH_PUBLIC_EXPORT extern const char kNightLightCustomEndTime[];
 
 }  // namespace prefs
 
diff --git a/ash/system/night_light/night_light_controller.cc b/ash/system/night_light/night_light_controller.cc
index cdbc238a..7b82a77d 100644
--- a/ash/system/night_light/night_light_controller.cc
+++ b/ash/system/night_light/night_light_controller.cc
@@ -12,6 +12,7 @@
 #include "base/time/time.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/pref_service.h"
+#include "third_party/icu/source/i18n/astro.h"
 #include "ui/compositor/layer.h"
 #include "ui/compositor/scoped_layer_animation_settings.h"
 
@@ -19,14 +20,65 @@
 
 namespace {
 
+// Default start time at 6:00 PM as an offset from 00:00.
+const int kDefaultStartTimeOffsetMinutes = 18 * 60;
+
+// Default end time at 6:00 AM as an offset from 00:00.
+const int kDefaultEndTimeOffsetMinutes = 6 * 60;
+
 constexpr float kDefaultColorTemperature = 0.5f;
 
-// The duration of the temperature change animation when the change is a result
-// of a manual user setting.
-// TODO(afakhry): Add automatic schedule animation duration when you implement
-// that part. It should be large enough (20 seconds as agreed) to give the user
-// a nice smooth transition.
-constexpr int kManualToggleAnimationDurationSec = 2;
+// The duration of the temperature change animation for
+// AnimationDurationType::kShort.
+constexpr int kManualAnimationDurationSec = 2;
+
+// The duration of the temperature change animation for
+// AnimationDurationType::kLong.
+constexpr int kAutomaticAnimationDurationSec = 20;
+
+class NightLightControllerDelegateImpl : public NightLightController::Delegate {
+ public:
+  NightLightControllerDelegateImpl() {
+    // TODO(afakhry): Implement geolocation position retrieval.
+  }
+  ~NightLightControllerDelegateImpl() override = default;
+
+  // ash::NightLightController::Delegate:
+  base::Time GetNow() const override { return base::Time::Now(); }
+  base::Time GetSunsetTime() const override { return GetSunRiseSet(false); }
+  base::Time GetSunriseTime() const override { return GetSunRiseSet(true); }
+
+ private:
+  base::Time GetSunRiseSet(bool sunrise) const {
+    if (!ValidatePosition()) {
+      return sunrise ? TimeOfDay(kDefaultEndTimeOffsetMinutes).ToTimeToday()
+                     : TimeOfDay(kDefaultStartTimeOffsetMinutes).ToTimeToday();
+    }
+
+    icu::CalendarAstronomer astro(longitude_, latitude_);
+    // For sunset and sunrise times calculations to be correct, the time of the
+    // icu::CalendarAstronomer object should be set to a time near local noon.
+    // This avoids having the computation flopping over into an adjacent day.
+    // See the documentation of icu::CalendarAstronomer::getSunRiseSet().
+    // Note that the icu calendar works with milliseconds since epoch, and
+    // base::Time::FromDoubleT() / ToDoubleT() work with seconds since epoch.
+    const double noon_today_sec = TimeOfDay(12 * 60).ToTimeToday().ToDoubleT();
+    astro.setTime(noon_today_sec * 1000.0);
+    const double sun_rise_set_ms = astro.getSunRiseSet(sunrise);
+    return base::Time::FromDoubleT(sun_rise_set_ms / 1000.0);
+  }
+
+  bool ValidatePosition() const {
+    // TODO(afakhry): Replace with geoposition APIs.
+    return false;
+  }
+
+  // Stub values to be replaced by actual geoposition APIs.
+  double latitude_ = 0.0;
+  double longitude_ = 0.0;
+
+  DISALLOW_COPY_AND_ASSIGN(NightLightControllerDelegateImpl);
+};
 
 // Applies the given |layer_temperature| to all the layers of the root windows
 // with the given |animation_duration|.
@@ -69,6 +121,12 @@
   registry->RegisterBooleanPref(prefs::kNightLightEnabled, false);
   registry->RegisterDoublePref(prefs::kNightLightTemperature,
                                kDefaultColorTemperature);
+  registry->RegisterIntegerPref(prefs::kNightLightScheduleType,
+                                static_cast<int>(ScheduleType::kNone));
+  registry->RegisterIntegerPref(prefs::kNightLightCustomStartTime,
+                                kDefaultStartTimeOffsetMinutes);
+  registry->RegisterIntegerPref(prefs::kNightLightCustomEndTime,
+                                kDefaultEndTimeOffsetMinutes);
 }
 
 void NightLightController::AddObserver(Observer* observer) {
@@ -91,9 +149,40 @@
   return kDefaultColorTemperature;
 }
 
-void NightLightController::SetEnabled(bool enabled) {
-  if (active_user_pref_service_)
+NightLightController::ScheduleType NightLightController::GetScheduleType()
+    const {
+  if (active_user_pref_service_) {
+    return static_cast<ScheduleType>(
+        active_user_pref_service_->GetInteger(prefs::kNightLightScheduleType));
+  }
+
+  return ScheduleType::kNone;
+}
+
+TimeOfDay NightLightController::GetCustomStartTime() const {
+  if (active_user_pref_service_) {
+    return TimeOfDay(active_user_pref_service_->GetInteger(
+        prefs::kNightLightCustomStartTime));
+  }
+
+  return TimeOfDay(kDefaultStartTimeOffsetMinutes);
+}
+
+TimeOfDay NightLightController::GetCustomEndTime() const {
+  if (active_user_pref_service_) {
+    return TimeOfDay(
+        active_user_pref_service_->GetInteger(prefs::kNightLightCustomEndTime));
+  }
+
+  return TimeOfDay(kDefaultEndTimeOffsetMinutes);
+}
+
+void NightLightController::SetEnabled(bool enabled,
+                                      AnimationDuration animation_type) {
+  if (active_user_pref_service_) {
+    animation_duration_ = animation_type;
     active_user_pref_service_->SetBoolean(prefs::kNightLightEnabled, enabled);
+  }
 }
 
 void NightLightController::SetColorTemperature(float temperature) {
@@ -105,8 +194,31 @@
   }
 }
 
+void NightLightController::SetScheduleType(ScheduleType type) {
+  if (active_user_pref_service_) {
+    active_user_pref_service_->SetInteger(prefs::kNightLightScheduleType,
+                                          static_cast<int>(type));
+  }
+}
+
+void NightLightController::SetCustomStartTime(TimeOfDay start_time) {
+  if (active_user_pref_service_) {
+    active_user_pref_service_->SetInteger(
+        prefs::kNightLightCustomStartTime,
+        start_time.offset_minutes_from_zero_hour());
+  }
+}
+
+void NightLightController::SetCustomEndTime(TimeOfDay end_time) {
+  if (active_user_pref_service_) {
+    active_user_pref_service_->SetInteger(
+        prefs::kNightLightCustomEndTime,
+        end_time.offset_minutes_from_zero_hour());
+  }
+}
+
 void NightLightController::Toggle() {
-  SetEnabled(!GetEnabled());
+  SetEnabled(!GetEnabled(), AnimationDuration::kShort);
 }
 
 void NightLightController::OnActiveUserSessionChanged(
@@ -114,15 +226,27 @@
   // Initial login and user switching in multi profiles.
   pref_change_registrar_.reset();
   active_user_pref_service_ = Shell::Get()->GetActiveUserPrefService();
+  delegate_ = base::MakeUnique<NightLightControllerDelegateImpl>();
   InitFromUserPrefs();
 }
 
-void NightLightController::Refresh() {
-  // TODO(afakhry): Add here refreshing of start and end times, when you
-  // implement the automatic schedule settings.
+void NightLightController::SetDelegateForTesting(
+    std::unique_ptr<Delegate> delegate) {
+  delegate_ = std::move(delegate);
+}
+
+void NightLightController::RefreshLayersTemperature() {
   ApplyColorTemperatureToLayers(
       GetEnabled() ? GetColorTemperature() : 0.0f,
-      base::TimeDelta::FromSeconds(kManualToggleAnimationDurationSec));
+      base::TimeDelta::FromSeconds(animation_duration_ ==
+                                           AnimationDuration::kShort
+                                       ? kManualAnimationDurationSec
+                                       : kAutomaticAnimationDurationSec));
+
+  // Reset the animation type back to manual to consume any automatically set
+  // animations.
+  last_animation_duration_ = animation_duration_;
+  animation_duration_ = AnimationDuration::kShort;
   Shell::Get()->SetCursorCompositingEnabled(GetEnabled());
 }
 
@@ -139,6 +263,18 @@
       prefs::kNightLightTemperature,
       base::Bind(&NightLightController::OnColorTemperaturePrefChanged,
                  base::Unretained(this)));
+  pref_change_registrar_->Add(
+      prefs::kNightLightScheduleType,
+      base::Bind(&NightLightController::OnScheduleParamsPrefsChanged,
+                 base::Unretained(this)));
+  pref_change_registrar_->Add(
+      prefs::kNightLightCustomStartTime,
+      base::Bind(&NightLightController::OnScheduleParamsPrefsChanged,
+                 base::Unretained(this)));
+  pref_change_registrar_->Add(
+      prefs::kNightLightCustomEndTime,
+      base::Bind(&NightLightController::OnScheduleParamsPrefsChanged,
+                 base::Unretained(this)));
 }
 
 void NightLightController::InitFromUserPrefs() {
@@ -148,7 +284,7 @@
   }
 
   StartWatchingPrefsChanges();
-  Refresh();
+  Refresh(true /* did_schedule_change */);
   NotifyStatusChanged();
 }
 
@@ -159,13 +295,141 @@
 
 void NightLightController::OnEnabledPrefChanged() {
   DCHECK(active_user_pref_service_);
-  Refresh();
+  Refresh(false /* did_schedule_change */);
   NotifyStatusChanged();
 }
 
 void NightLightController::OnColorTemperaturePrefChanged() {
   DCHECK(active_user_pref_service_);
-  Refresh();
+  RefreshLayersTemperature();
+}
+
+void NightLightController::OnScheduleParamsPrefsChanged() {
+  DCHECK(active_user_pref_service_);
+  Refresh(true /* did_schedule_change */);
+}
+
+void NightLightController::Refresh(bool did_schedule_change) {
+  RefreshLayersTemperature();
+
+  const ScheduleType type = GetScheduleType();
+  switch (type) {
+    case ScheduleType::kNone:
+      timer_.Stop();
+      return;
+
+    case ScheduleType::kSunsetToSunrise:
+      RefreshScheduleTimer(delegate_->GetSunsetTime(),
+                           delegate_->GetSunriseTime(), did_schedule_change);
+      return;
+
+    case ScheduleType::kCustom:
+      RefreshScheduleTimer(GetCustomStartTime().ToTimeToday(),
+                           GetCustomEndTime().ToTimeToday(),
+                           did_schedule_change);
+      return;
+  }
+}
+
+void NightLightController::RefreshScheduleTimer(base::Time start_time,
+                                                base::Time end_time,
+                                                bool did_schedule_change) {
+  if (GetScheduleType() == ScheduleType::kNone) {
+    NOTREACHED();
+    timer_.Stop();
+    return;
+  }
+
+  // NOTE: Users can set any weird combinations.
+  if (end_time <= start_time) {
+    // Example:
+    // Start: 9:00 PM, End: 6:00 AM.
+    //
+    //       6:00                21:00
+    // <----- + ------------------ + ----->
+    //        |                    |
+    //       end                 start
+    //
+    // From our perspective, the end time is always a day later.
+    end_time += base::TimeDelta::FromDays(1);
+  }
+
+  DCHECK_GE(end_time, start_time);
+
+  // The target status that we need to set NightLight to now if a change of
+  // status is needed immediately.
+  bool enable_now = false;
+
+  // Where are we now with respect to the start and end times?
+  const base::Time now = delegate_->GetNow();
+  if (now < start_time) {
+    // Example:
+    // Start: 6:00 PM today, End: 6:00 AM tomorrow, Now: 4:00 PM.
+    //
+    // <----- + ----------- + ----------- + ----->
+    //        |             |             |
+    //       now          start          end
+    //
+    // In this case, we need to disable NightLight immediately if it's enabled.
+    enable_now = false;
+  } else if (now >= start_time && now < end_time) {
+    // Example:
+    // Start: 6:00 PM today, End: 6:00 AM tomorrow, Now: 11:00 PM.
+    //
+    // <----- + ----------- + ----------- + ----->
+    //        |             |             |
+    //      start          now           end
+    //
+    // Start NightLight right away. Our future start time is a day later than
+    // its current value.
+    enable_now = true;
+    start_time += base::TimeDelta::FromDays(1);
+  } else {  // now >= end_time.
+    // Example:
+    // Start: 6:00 PM today, End: 10:00 PM today, Now: 11:00 PM.
+    //
+    // <----- + ----------- + ----------- + ----->
+    //        |             |             |
+    //      start          end           now
+    //
+    // In this case, our future start and end times are a day later from their
+    // current values. NightLight needs to be ended immediately if it's already
+    // enabled.
+    enable_now = false;
+    start_time += base::TimeDelta::FromDays(1);
+    end_time += base::TimeDelta::FromDays(1);
+  }
+
+  // After the above processing, the start and end time are all in the future.
+  DCHECK_GE(start_time, now);
+  DCHECK_GE(end_time, now);
+
+  if (did_schedule_change && enable_now != GetEnabled()) {
+    // If the change in the schedule introduces a change in the status, then
+    // calling SetEnabled() is all we need, since it will trigger a change in
+    // the user prefs to which we will respond by calling Refresh(). This will
+    // end up in this function again, adjusting all the needed schedules.
+    SetEnabled(enable_now, AnimationDuration::kShort);
+    return;
+  }
+
+  // We reach here in one of the following conditions:
+  // 1) If schedule changes don't result in changes in the status, we need to
+  // explicitly update the timer to re-schedule the next toggle to account for
+  // any changes.
+  // 2) The user has just manually toggled the status of NightLight either from
+  // the System Menu or System Settings. In this case, we respect the user
+  // wish and maintain the current status that he desires, but we schedule the
+  // status to be toggled according to the time that corresponds with the
+  // opposite status of the current one.
+  ScheduleNextToggle(GetEnabled() ? end_time - now : start_time - now);
+}
+
+void NightLightController::ScheduleNextToggle(base::TimeDelta delay) {
+  timer_.Start(
+      FROM_HERE, delay,
+      base::Bind(&NightLightController::SetEnabled, base::Unretained(this),
+                 !GetEnabled(), AnimationDuration::kLong));
 }
 
 }  // namespace ash
diff --git a/ash/system/night_light/night_light_controller.h b/ash/system/night_light/night_light_controller.h
index bdef68d..b9eef8f 100644
--- a/ash/system/night_light/night_light_controller.h
+++ b/ash/system/night_light/night_light_controller.h
@@ -9,7 +9,10 @@
 
 #include "ash/ash_export.h"
 #include "ash/session/session_observer.h"
+#include "ash/system/night_light/time_of_day.h"
 #include "base/observer_list.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "components/prefs/pref_change_registrar.h"
 
 class PrefRegistrySimple;
@@ -23,6 +26,46 @@
 // screen.
 class ASH_EXPORT NightLightController : public SessionObserver {
  public:
+  enum class ScheduleType : int {
+    // Automatic toggling of NightLight is turned off.
+    kNone = 0,
+
+    // Turned automatically on at the user's local sunset time, and off at the
+    // user's local sunrise time.
+    kSunsetToSunrise = 1,
+
+    // Toggled automatically based on the custom set start and end times
+    // selected by the user from the system settings.
+    kCustom = 2,
+  };
+
+  enum class AnimationDuration {
+    // Short animation (2 seconds) used for manual changes of NightLight status
+    // and temperature by the user.
+    kShort,
+
+    // Long animation (20 seconds) used for applying the color temperature
+    // gradually as a result of getting into or out of the automatically
+    // scheduled NightLight mode. This gives the user a smooth transition.
+    kLong,
+  };
+
+  // This class enables us to inject fake values for "Now" as well as the sunset
+  // and sunrise times, so that we can reliably test the behavior in various
+  // schedule types and times.
+  class Delegate {
+   public:
+    // NightLightController owns the delegate.
+    virtual ~Delegate() {}
+
+    // Gets the current time.
+    virtual base::Time GetNow() const = 0;
+
+    // Gets the sunset and sunrise times.
+    virtual base::Time GetSunsetTime() const = 0;
+    virtual base::Time GetSunriseTime() const = 0;
+  };
+
   class Observer {
    public:
     // Emitted when the NightLight status is changed.
@@ -40,24 +83,40 @@
 
   static void RegisterPrefs(PrefRegistrySimple* registry);
 
+  AnimationDuration animation_duration() const { return animation_duration_; }
+  AnimationDuration last_animation_duration() const {
+    return last_animation_duration_;
+  }
+  const base::OneShotTimer& timer() const { return timer_; }
+
   void AddObserver(Observer* observer);
   void RemoveObserver(Observer* observer);
 
   // Get the NightLight settings stored in the current active user prefs.
   bool GetEnabled() const;
   float GetColorTemperature() const;
+  ScheduleType GetScheduleType() const;
+  TimeOfDay GetCustomStartTime() const;
+  TimeOfDay GetCustomEndTime() const;
 
   // Set the desired NightLight settings in the current active user prefs.
-  void SetEnabled(bool enabled);
+  void SetEnabled(bool enabled, AnimationDuration animation_type);
   void SetColorTemperature(float temperature);
+  void SetScheduleType(ScheduleType type);
+  void SetCustomStartTime(TimeOfDay start_time);
+  void SetCustomEndTime(TimeOfDay end_time);
 
+  // This is always called as a result of a user action and will always use the
+  // AnimationDurationType::kShort.
   void Toggle();
 
   // ash::SessionObserver:
   void OnActiveUserSessionChanged(const AccountId& account_id) override;
 
+  void SetDelegateForTesting(std::unique_ptr<Delegate> delegate);
+
  private:
-  void Refresh();
+  void RefreshLayersTemperature();
 
   void StartWatchingPrefsChanges();
 
@@ -71,14 +130,50 @@
   // Called when the user pref for the color temperature is changed.
   void OnColorTemperaturePrefChanged();
 
+  // Called when any of the schedule related prefs (schedule type, custom start
+  // and end times) are changed.
+  void OnScheduleParamsPrefsChanged();
+
+  // Refreshes the state of NightLight according to the currently set
+  // parameters. |did_schedule_change| is true when Refresh() is called as a
+  // result of a change in one of the schedule related prefs, and false
+  // otherwise.
+  void Refresh(bool did_schedule_change);
+
+  // Given the desired start and end times that determine the time interval
+  // during which NightLight will be ON, depending on the time of "now", it
+  // refreshes the |timer_| to either schedule the future start or end of
+  // NightLight mode, as well as update the current status if needed.
+  // For |did_schedule_change|, see Refresh() above.
+  // This function should never be called if the schedule type is |kNone|.
+  void RefreshScheduleTimer(base::Time start_time,
+                            base::Time end_time,
+                            bool did_schedule_change);
+
+  // Schedule the upcoming next toggle of NightLight mode. This is used for the
+  // automatic status changes of NightLight which always use an
+  // AnimationDurationType::kLong.
+  void ScheduleNextToggle(base::TimeDelta delay);
+
   // The observed session controller instance from which we know when to
   // initialize the NightLight settings from the user preferences.
   SessionController* const session_controller_;
 
+  std::unique_ptr<Delegate> delegate_;
+
   // The pref service of the currently active user. Can be null in
   // ash_unittests.
   PrefService* active_user_pref_service_ = nullptr;
 
+  // The animation duration of any upcoming future change.
+  AnimationDuration animation_duration_ = AnimationDuration::kShort;
+  // The animation duration of the change that was just performed.
+  AnimationDuration last_animation_duration_ = AnimationDuration::kShort;
+
+  // The timer that schedules the start and end of NightLight when the schedule
+  // type is either kSunsetToSunrise or kCustom.
+  base::OneShotTimer timer_;
+
   // The registrar used to watch NightLight prefs changes in the above
   // |active_user_pref_service_| from outside ash.
   // NOTE: Prefs are how Chrome communicates changes to the NightLight settings
diff --git a/ash/system/night_light/night_light_controller_unittest.cc b/ash/system/night_light/night_light_controller_unittest.cc
index 8307834d..267e325e 100644
--- a/ash/system/night_light/night_light_controller_unittest.cc
+++ b/ash/system/night_light/night_light_controller_unittest.cc
@@ -16,6 +16,8 @@
 #include "ash/test/ash_test_helper.h"
 #include "ash/test/test_session_controller_client.h"
 #include "ash/test/test_shell_delegate.h"
+#include "base/bind.h"
+#include "base/callback_forward.h"
 #include "base/command_line.h"
 #include "base/macros.h"
 #include "components/prefs/testing_pref_service.h"
@@ -64,6 +66,28 @@
   DISALLOW_COPY_AND_ASSIGN(TestObserver);
 };
 
+class TestDelegate : public NightLightController::Delegate {
+ public:
+  TestDelegate() = default;
+  ~TestDelegate() override = default;
+
+  void SetFakeNow(TimeOfDay time) { fake_now_ = time.ToTimeToday(); }
+  void SetFakeSunset(TimeOfDay time) { fake_sunset_ = time.ToTimeToday(); }
+  void SetFakeSunrise(TimeOfDay time) { fake_sunrise_ = time.ToTimeToday(); }
+
+  // ash::NightLightController::Delegate
+  base::Time GetNow() const override { return fake_now_; }
+  base::Time GetSunsetTime() const override { return fake_sunset_; }
+  base::Time GetSunriseTime() const override { return fake_sunrise_; }
+
+ private:
+  base::Time fake_now_;
+  base::Time fake_sunset_;
+  base::Time fake_sunrise_;
+
+  DISALLOW_COPY_AND_ASSIGN(TestDelegate);
+};
+
 class NightLightTest : public test::AshTestBase {
  public:
   NightLightTest() = default;
@@ -76,6 +100,8 @@
     return &user2_pref_service_;
   }
 
+  TestDelegate* delegate() const { return delegate_; }
+
   // ash::test::AshTestBase:
   void SetUp() override {
     // Explicitly enable the NightLight feature for the tests.
@@ -90,6 +116,9 @@
     // Simulate user 1 login.
     InjectTestPrefService(&user1_pref_service_);
     SwitchActiveUser(kUser1Email);
+
+    delegate_ = new TestDelegate;
+    GetController()->SetDelegateForTesting(base::WrapUnique(delegate_));
   }
 
   void CreateTestUserSessions() {
@@ -108,10 +137,17 @@
         pref_service);
   }
 
+  void SetNightLightEnabled(bool enabled) {
+    GetController()->SetEnabled(
+        enabled, NightLightController::AnimationDuration::kShort);
+  }
+
  private:
   TestingPrefServiceSimple user1_pref_service_;
   TestingPrefServiceSimple user2_pref_service_;
 
+  TestDelegate* delegate_ = nullptr;
+
   DISALLOW_COPY_AND_ASSIGN(NightLightTest);
 };
 
@@ -127,7 +163,7 @@
 
   TestObserver observer;
   NightLightController* controller = GetController();
-  controller->SetEnabled(false);
+  SetNightLightEnabled(false);
   ASSERT_FALSE(controller->GetEnabled());
   EXPECT_TRUE(TestLayersTemperature(0.0f));
   controller->Toggle();
@@ -151,7 +187,7 @@
 
   TestObserver observer;
   NightLightController* controller = GetController();
-  controller->SetEnabled(false);
+  SetNightLightEnabled(false);
   ASSERT_FALSE(controller->GetEnabled());
 
   // Setting the temperature while NightLight is disabled only changes the
@@ -164,7 +200,7 @@
 
   // When NightLight is enabled, temperature changes actually affect the root
   // layers temperatures.
-  controller->SetEnabled(true);
+  SetNightLightEnabled(true);
   ASSERT_TRUE(controller->GetEnabled());
   const float temperature2 = 0.7f;
   controller->SetColorTemperature(temperature2);
@@ -175,14 +211,14 @@
   // doesn't change, however the temperatures set on the root layers are all
   // 0.0f. Observers only receive an enabled status change notification; no
   // temperature change notification.
-  controller->SetEnabled(false);
+  SetNightLightEnabled(false);
   ASSERT_FALSE(controller->GetEnabled());
   EXPECT_FALSE(observer.status());
   EXPECT_EQ(temperature2, controller->GetColorTemperature());
   EXPECT_TRUE(TestLayersTemperature(0.0f));
 
   // When re-enabled, the stored temperature is re-applied.
-  controller->SetEnabled(true);
+  SetNightLightEnabled(true);
   EXPECT_TRUE(observer.status());
   ASSERT_TRUE(controller->GetEnabled());
   EXPECT_TRUE(TestLayersTemperature(temperature2));
@@ -198,7 +234,7 @@
 
   // Test start with user1 logged in.
   NightLightController* controller = GetController();
-  controller->SetEnabled(true);
+  SetNightLightEnabled(true);
   EXPECT_TRUE(controller->GetEnabled());
   const float user1_temperature = 0.8f;
   controller->SetColorTemperature(user1_temperature);
@@ -251,6 +287,248 @@
   EXPECT_FALSE(controller->GetEnabled());
 }
 
+// Tests transitioning from kNone to kCustom and back to kNone schedule types.
+TEST_F(NightLightTest, TestScheduleNoneToCustomTransition) {
+  if (Shell::GetAshConfig() == Config::MASH) {
+    // PrefChangeRegistrar doesn't work on mash. crbug.com/721961.
+    return;
+  }
+
+  NightLightController* controller = GetController();
+  // Now is 6:00 PM.
+  delegate()->SetFakeNow(TimeOfDay(18 * 60));
+  SetNightLightEnabled(false);
+  controller->SetScheduleType(NightLightController::ScheduleType::kNone);
+  // Start time is at 3:00 PM and end time is at 8:00 PM.
+  controller->SetCustomStartTime(TimeOfDay(15 * 60));
+  controller->SetCustomEndTime(TimeOfDay(20 * 60));
+
+  //      15:00         18:00         20:00
+  // <----- + ----------- + ----------- + ----->
+  //        |             |             |
+  //      start          now           end
+  //
+  // Even though "Now" is inside the NightLight interval, nothing should change,
+  // since the schedule type is "none".
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+
+  // Now change the schedule type to custom, NightLight should turn on
+  // immediately with a short animation duration, and the timer should be
+  // running with a delay of exactly 2 hours scheduling the end.
+  controller->SetScheduleType(NightLightController::ScheduleType::kCustom);
+  EXPECT_TRUE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(controller->GetColorTemperature()));
+  EXPECT_EQ(NightLightController::AnimationDuration::kShort,
+            controller->last_animation_duration());
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(2),
+            controller->timer().GetCurrentDelay());
+  EXPECT_TRUE(controller->timer().user_task());
+
+  // If the user changes the schedule type to "none", the NightLight status
+  // should not change, but the timer should not be running.
+  controller->SetScheduleType(NightLightController::ScheduleType::kNone);
+  EXPECT_TRUE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(controller->GetColorTemperature()));
+  EXPECT_FALSE(controller->timer().IsRunning());
+}
+
+// Tests what happens when the time now reaches the end of the NightLight
+// interval when NightLight mode is on.
+TEST_F(NightLightTest, TestCustomScheduleReachingEndTime) {
+  if (Shell::GetAshConfig() == Config::MASH) {
+    // PrefChangeRegistrar doesn't work on mash. crbug.com/721961.
+    return;
+  }
+
+  NightLightController* controller = GetController();
+  delegate()->SetFakeNow(TimeOfDay(18 * 60));
+  controller->SetCustomStartTime(TimeOfDay(15 * 60));
+  controller->SetCustomEndTime(TimeOfDay(20 * 60));
+  controller->SetScheduleType(NightLightController::ScheduleType::kCustom);
+  EXPECT_TRUE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(controller->GetColorTemperature()));
+
+  // Simulate reaching the end time by triggering the timer's user task. Make
+  // sure that NightLight ended with a long animation.
+  //
+  //      15:00                      20:00
+  // <----- + ------------------------ + ----->
+  //        |                          |
+  //      start                    end & now
+  //
+  // Now is 8:00 PM.
+  delegate()->SetFakeNow(TimeOfDay(20 * 60));
+  controller->timer().user_task().Run();
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+  EXPECT_EQ(NightLightController::AnimationDuration::kLong,
+            controller->last_animation_duration());
+  // The timer should still be running, but now scheduling the start at 3:00 PM
+  // tomorrow which is 19 hours from "now" (8:00 PM).
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(19),
+            controller->timer().GetCurrentDelay());
+}
+
+// Tests that user toggles from the system menu or system settings override any
+// status set by an automatic schedule.
+TEST_F(NightLightTest, TestExplicitUserTogglesWhileScheduleIsActive) {
+  if (Shell::GetAshConfig() == Config::MASH) {
+    // PrefChangeRegistrar doesn't work on mash. crbug.com/721961.
+    return;
+  }
+
+  // Start with the below custom schedule, where NightLight is off.
+  //
+  //      15:00               20:00          23:00
+  // <----- + ----------------- + ------------ + ---->
+  //        |                   |              |
+  //      start                end            now
+  //
+  NightLightController* controller = GetController();
+  delegate()->SetFakeNow(TimeOfDay(23 * 60));
+  controller->SetCustomStartTime(TimeOfDay(15 * 60));
+  controller->SetCustomEndTime(TimeOfDay(20 * 60));
+  controller->SetScheduleType(NightLightController::ScheduleType::kCustom);
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+
+  // What happens if the user manually turns NightLight on while the schedule
+  // type says it should be off?
+  // User toggles either from the system menu or the System Settings toggle
+  // button must override any automatic schedule, and should be performed with
+  // the short animation duration.
+  controller->Toggle();
+  EXPECT_TRUE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(controller->GetColorTemperature()));
+  EXPECT_EQ(NightLightController::AnimationDuration::kShort,
+            controller->last_animation_duration());
+  // The timer should still be running, but NightLight should automatically
+  // turn off at 8:00 PM tomorrow, which is 21 hours from now (11:00 PM).
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(21),
+            controller->timer().GetCurrentDelay());
+
+  // Manually turning it back off should also be respected, and this time the
+  // start is scheduled at 3:00 PM tomorrow after 19 hours from "now" (8:00 PM).
+  controller->Toggle();
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+  EXPECT_EQ(NightLightController::AnimationDuration::kShort,
+            controller->last_animation_duration());
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(16),
+            controller->timer().GetCurrentDelay());
+}
+
+// Tests that changing the custom start and end times, in such a way that
+// shouldn't change the current status, only updates the timer but doesn't
+// change the status.
+TEST_F(NightLightTest, TestChangingStartTimesThatDontChangeTheStatus) {
+  if (Shell::GetAshConfig() == Config::MASH) {
+    // PrefChangeRegistrar doesn't work on mash. crbug.com/721961.
+    return;
+  }
+
+  //       16:00        18:00         22:00
+  // <----- + ----------- + ----------- + ----->
+  //        |             |             |
+  //       now          start          end
+  //
+  NightLightController* controller = GetController();
+  delegate()->SetFakeNow(TimeOfDay(16 * 60));  // 4:00 PM.
+  SetNightLightEnabled(false);
+  controller->SetScheduleType(NightLightController::ScheduleType::kNone);
+  controller->SetCustomStartTime(TimeOfDay(18 * 60));  // 6:00 PM.
+  controller->SetCustomEndTime(TimeOfDay(22 * 60));    // 10:00 PM.
+
+  // Since now is outside the NightLight interval, changing the schedule type
+  // to kCustom, shouldn't affect the status. Validate the timer is running with
+  // a 2-hour delay.
+  controller->SetScheduleType(NightLightController::ScheduleType::kCustom);
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(2),
+            controller->timer().GetCurrentDelay());
+
+  // Change the start time in such a way that doesn't change the status, but
+  // despite that, confirm that schedule has been updated.
+  controller->SetCustomStartTime(TimeOfDay(19 * 60));  // 7:00 PM.
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(3),
+            controller->timer().GetCurrentDelay());
+
+  // Changing the end time in a similar fashion to the above and expect no
+  // change.
+  controller->SetCustomEndTime(TimeOfDay(23 * 60));  // 11:00 PM.
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(3),
+            controller->timer().GetCurrentDelay());
+}
+
+// Tests the behavior of the sunset to sunrise automatic schedule type.
+TEST_F(NightLightTest, TestSunsetSunrise) {
+  if (Shell::GetAshConfig() == Config::MASH) {
+    // PrefChangeRegistrar doesn't work on mash. crbug.com/721961.
+    return;
+  }
+
+  //       16:00        18:00     20:00      22:00              5:00
+  // <----- + ----------- + ------- + -------- + --------------- + ------->
+  //        |             |         |          |                 |
+  //       now      custom start  sunset   custom end         sunrise
+  //
+  NightLightController* controller = GetController();
+  delegate()->SetFakeNow(TimeOfDay(16 * 60));     // 4:00 PM.
+  delegate()->SetFakeSunset(TimeOfDay(20 * 60));  // 8:00 PM.
+  delegate()->SetFakeSunrise(TimeOfDay(5 * 60));  // 5:00 AM.
+  SetNightLightEnabled(false);
+  controller->SetScheduleType(NightLightController::ScheduleType::kNone);
+  controller->SetCustomStartTime(TimeOfDay(18 * 60));  // 6:00 PM.
+  controller->SetCustomEndTime(TimeOfDay(22 * 60));    // 10:00 PM.
+
+  // Custom times should have no effect when the schedule type is sunset to
+  // sunrise.
+  controller->SetScheduleType(
+      NightLightController::ScheduleType::kSunsetToSunrise);
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(4),
+            controller->timer().GetCurrentDelay());
+
+  // Simulate reaching sunset.
+  delegate()->SetFakeNow(TimeOfDay(20 * 60));  // Now is 8:00 PM.
+  controller->timer().user_task().Run();
+  EXPECT_TRUE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(controller->GetColorTemperature()));
+  EXPECT_EQ(NightLightController::AnimationDuration::kLong,
+            controller->last_animation_duration());
+  // Timer is running scheduling the end at sunrise.
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(9),
+            controller->timer().GetCurrentDelay());
+
+  // Simulate reaching sunrise.
+  delegate()->SetFakeNow(TimeOfDay(5 * 60));  // Now is 5:00 AM.
+  controller->timer().user_task().Run();
+  EXPECT_FALSE(controller->GetEnabled());
+  EXPECT_TRUE(TestLayersTemperature(0.0f));
+  EXPECT_EQ(NightLightController::AnimationDuration::kLong,
+            controller->last_animation_duration());
+  // Timer is running scheduling the start at the next sunset.
+  EXPECT_TRUE(controller->timer().IsRunning());
+  EXPECT_EQ(base::TimeDelta::FromHours(15),
+            controller->timer().GetCurrentDelay());
+}
+
 }  // namespace
 
 }  // namespace ash
diff --git a/ash/system/night_light/time_of_day.cc b/ash/system/night_light/time_of_day.cc
new file mode 100644
index 0000000..b76ca23
--- /dev/null
+++ b/ash/system/night_light/time_of_day.cc
@@ -0,0 +1,57 @@
+// 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 "ash/system/night_light/time_of_day.h"
+
+#include "base/i18n/time_formatting.h"
+#include "base/strings/utf_string_conversions.h"
+
+namespace ash {
+
+namespace {
+
+constexpr int kMaxOffsetMinutes = 24 * 60;
+
+}  // namespace
+
+TimeOfDay::TimeOfDay(int offset_minutes)
+    : offset_minutes_from_zero_hour_(
+          offset_minutes == kMaxOffsetMinutes ? 0 : offset_minutes) {
+  DCHECK_LE(offset_minutes_from_zero_hour_, kMaxOffsetMinutes);
+}
+
+// static
+TimeOfDay TimeOfDay::FromTime(const base::Time& time) {
+  base::Time::Exploded exploded;
+  time.LocalExplode(&exploded);
+  return TimeOfDay(exploded.hour * 60 + exploded.minute);
+}
+
+bool TimeOfDay::operator==(const TimeOfDay& rhs) const {
+  return offset_minutes_from_zero_hour_ == rhs.offset_minutes_from_zero_hour_;
+}
+
+base::Time TimeOfDay::ToTimeToday() const {
+  base::Time::Exploded now;
+  base::Time::Now().LocalExplode(&now);
+  now.hour = (offset_minutes_from_zero_hour_ / 60) % 24;
+  now.minute = offset_minutes_from_zero_hour_ % 60;
+  now.second = 0;
+  now.millisecond = 0;
+  base::Time result;
+  if (base::Time::FromLocalExploded(now, &result))
+    return result;
+
+  // Daylight saving time can cause FromLocalExploded() to fail on the
+  // transition day in the spring when TimeOfDay == 2:30 AM, and the time goes
+  // instantaneously from 1:59 AM 3:00 AM. In this very rare case, it's OK for
+  // this function to fail.
+  return base::Time();
+}
+
+std::string TimeOfDay::ToString() const {
+  return base::UTF16ToUTF8(base::TimeFormatTimeOfDay(ToTimeToday()));
+}
+
+}  // namespace ash
diff --git a/ash/system/night_light/time_of_day.h b/ash/system/night_light/time_of_day.h
new file mode 100644
index 0000000..ed68ea6
--- /dev/null
+++ b/ash/system/night_light/time_of_day.h
@@ -0,0 +1,52 @@
+// 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 ASH_SYSTEM_NIGHT_LIGHT_TIME_OF_DAY_H_
+#define ASH_SYSTEM_NIGHT_LIGHT_TIME_OF_DAY_H_
+
+#include <string>
+
+#include "ash/ash_export.h"
+#include "base/time/time.h"
+
+namespace ash {
+
+// Represents the time of the day as a simple number of minutes since 00:00
+// regardless of the date or the timezone. This makes it simple to persist this
+// as an integer user pref.
+class ASH_EXPORT TimeOfDay {
+ public:
+  // |offset_minutes| is the number of minutes since 00:00. If |offset_minutes|
+  // is equal to the offset minutes in 24 hours, it will be reset to 0 to
+  // represent the time 00:00 (12:00 AM). Offsets greater than the minutes in
+  // 24 hours are not allowed.
+  explicit TimeOfDay(int offset_minutes);
+  TimeOfDay(const TimeOfDay& other) = default;
+  TimeOfDay& operator=(const TimeOfDay& rhs) = default;
+  ~TimeOfDay() = default;
+
+  // Converts to a minutes offset representation from |time| dropping the
+  // seconds and milliseconds.
+  static TimeOfDay FromTime(const base::Time& time);
+
+  bool operator==(const TimeOfDay& rhs) const;
+
+  int offset_minutes_from_zero_hour() const {
+    return offset_minutes_from_zero_hour_;
+  }
+
+  // Converts to an actual point in time today. If this fail for some reason,
+  // base::Time() will be returned.
+  base::Time ToTimeToday() const;
+
+  // Converts to a string in the format "3:07 PM".
+  std::string ToString() const;
+
+ private:
+  int offset_minutes_from_zero_hour_;
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_NIGHT_LIGHT_TIME_OF_DAY_H_
diff --git a/ash/system/night_light/time_of_day_unittest.cc b/ash/system/night_light/time_of_day_unittest.cc
new file mode 100644
index 0000000..5b5cbd0
--- /dev/null
+++ b/ash/system/night_light/time_of_day_unittest.cc
@@ -0,0 +1,72 @@
+// 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 "ash/system/night_light/time_of_day.h"
+
+#include "base/i18n/rtl.h"
+#include "base/test/icu_test_util.h"
+#include "base/time/time.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace ash {
+
+namespace {
+
+TEST(TimeOfDayTest, TestEquality) {
+  // Test created TimeOfDay objects with equal offsets are equal.
+  TimeOfDay time1(18 * 60 + 32);  // 6:32 PM.
+  TimeOfDay time2(18 * 60 + 32);  // 6:32 PM.
+  EXPECT_EQ(time1, time2);
+  TimeOfDay time3(time1);
+  EXPECT_EQ(time1, time3);
+  EXPECT_EQ(time2, time3);
+  TimeOfDay time4(9 * 60 + 59);  // 9:59 AM.
+  EXPECT_FALSE(time1 == time4);
+  time1 = time4;
+  EXPECT_EQ(time1, time4);
+}
+
+TEST(TimeOfDayTest, TestSeveralOffsets) {
+  // Ensure US locale to make sure time format is expected.
+  base::test::ScopedRestoreICUDefaultLocale restore_locale;
+  base::i18n::SetICUDefaultLocale("en_US");
+
+  // 6:32 PM ==> 18:32.
+  TimeOfDay time1(18 * 60 + 32);
+  EXPECT_EQ("6:32 PM", time1.ToString());
+
+  // 9:59 AM.
+  TimeOfDay time2(9 * 60 + 59);
+  EXPECT_EQ("9:59 AM", time2.ToString());
+
+  // Border times: 00:00 and 24:00.
+  TimeOfDay time3(0);
+  TimeOfDay time4(24 * 60);
+  EXPECT_EQ("12:00 AM", time3.ToString());
+  EXPECT_EQ("12:00 AM", time4.ToString());
+}
+
+TEST(TimeOfDayTest, TestFromTime) {
+  // "Now" today and "now" tomorrow should have the same minutes offset from
+  // 00:00.
+  // Assume that "now" is Tuesday May 23, 2017 at 10:30 AM.
+  base::Time::Exploded now;
+  now.year = 2017;
+  now.month = 5;        // May.
+  now.day_of_week = 2;  // Tuesday.
+  now.day_of_month = 23;
+  now.hour = 10;
+  now.minute = 30;
+  now.second = 0;
+  now.millisecond = 0;
+
+  base::Time now_today = base::Time::Now();
+  ASSERT_TRUE(base::Time::FromLocalExploded(now, &now_today));
+  base::Time now_tomorrow = now_today + base::TimeDelta::FromDays(1);
+  EXPECT_EQ(TimeOfDay::FromTime(now_today), TimeOfDay::FromTime(now_tomorrow));
+}
+
+}  // namespace
+
+}  // namespace ash
diff --git a/base/android/field_trial_list.cc b/base/android/field_trial_list.cc
index 5150b812..b2f332b 100644
--- a/base/android/field_trial_list.cc
+++ b/base/android/field_trial_list.cc
@@ -6,8 +6,12 @@
 
 #include <jni.h>
 
+#include <map>
+#include <string>
+
 #include "base/android/jni_string.h"
 #include "base/metrics/field_trial.h"
+#include "base/metrics/field_trial_params.h"
 #include "jni/FieldTrialList_jni.h"
 
 using base::android::ConvertJavaStringToUTF8;
@@ -31,6 +35,18 @@
   return base::FieldTrialList::TrialExists(trial_name);
 }
 
+static ScopedJavaLocalRef<jstring> GetVariationParameter(
+    JNIEnv* env,
+    const JavaParamRef<jclass>& clazz,
+    const JavaParamRef<jstring>& jtrial_name,
+    const JavaParamRef<jstring>& jparameter_key) {
+  std::map<std::string, std::string> parameters;
+  base::GetFieldTrialParams(ConvertJavaStringToUTF8(env, jtrial_name),
+                            &parameters);
+  return ConvertUTF8ToJavaString(
+      env, parameters[ConvertJavaStringToUTF8(env, jparameter_key)]);
+}
+
 namespace base {
 namespace android {
 
diff --git a/base/android/java/src/org/chromium/base/FieldTrialList.java b/base/android/java/src/org/chromium/base/FieldTrialList.java
index cfd7d5c..c3468a4 100644
--- a/base/android/java/src/org/chromium/base/FieldTrialList.java
+++ b/base/android/java/src/org/chromium/base/FieldTrialList.java
@@ -31,6 +31,16 @@
         return nativeTrialExists(trialName);
     }
 
+    /**
+     * @param trialName    The name of the trial with the parameter.
+     * @param parameterKey The key of the parameter.
+     * @return The value of the parameter or an empty string if not found.
+     */
+    public static String getVariationParameter(String trialName, String parameterKey) {
+        return nativeGetVariationParameter(trialName, parameterKey);
+    }
+
     private static native String nativeFindFullName(String trialName);
     private static native boolean nativeTrialExists(String trialName);
+    private static native String nativeGetVariationParameter(String trialName, String parameterKey);
 }
diff --git a/base/test/thread_test_helper.cc b/base/test/thread_test_helper.cc
index 38edc9d..037de2b 100644
--- a/base/test/thread_test_helper.cc
+++ b/base/test/thread_test_helper.cc
@@ -13,15 +13,15 @@
 namespace base {
 
 ThreadTestHelper::ThreadTestHelper(
-    scoped_refptr<SingleThreadTaskRunner> target_thread)
+    scoped_refptr<SequencedTaskRunner> target_sequence)
     : test_result_(false),
-      target_thread_(std::move(target_thread)),
+      target_sequence_(std::move(target_sequence)),
       done_event_(WaitableEvent::ResetPolicy::AUTOMATIC,
                   WaitableEvent::InitialState::NOT_SIGNALED) {}
 
 bool ThreadTestHelper::Run() {
-  if (!target_thread_->PostTask(
-          FROM_HERE, base::BindOnce(&ThreadTestHelper::RunInThread, this))) {
+  if (!target_sequence_->PostTask(
+          FROM_HERE, base::BindOnce(&ThreadTestHelper::RunOnSequence, this))) {
     return false;
   }
   base::ThreadRestrictions::ScopedAllowWait allow_wait;
@@ -33,7 +33,7 @@
 
 ThreadTestHelper::~ThreadTestHelper() {}
 
-void ThreadTestHelper::RunInThread() {
+void ThreadTestHelper::RunOnSequence() {
   RunTest();
   done_event_.Signal();
 }
diff --git a/base/test/thread_test_helper.h b/base/test/thread_test_helper.h
index 829a619..935e7efc 100644
--- a/base/test/thread_test_helper.h
+++ b/base/test/thread_test_helper.h
@@ -8,21 +8,21 @@
 #include "base/compiler_specific.h"
 #include "base/macros.h"
 #include "base/memory/ref_counted.h"
-#include "base/single_thread_task_runner.h"
+#include "base/sequenced_task_runner.h"
 #include "base/synchronization/waitable_event.h"
 
 namespace base {
 
-// Helper class that executes code on a given thread while blocking on the
-// invoking thread. To use, derive from this class and overwrite RunTest. An
-// alternative use of this class is to use it directly.  It will then block
-// until all pending tasks on a given thread have been executed.
+// Helper class that executes code on a given target sequence/thread while
+// blocking on the invoking sequence/thread. To use, derive from this class and
+// overwrite RunTest. An alternative use of this class is to use it directly. It
+// will then block until all pending tasks on a given sequence/thread have been
+// executed.
 class ThreadTestHelper : public RefCountedThreadSafe<ThreadTestHelper> {
  public:
-  explicit ThreadTestHelper(
-      scoped_refptr<SingleThreadTaskRunner> target_thread);
+  explicit ThreadTestHelper(scoped_refptr<SequencedTaskRunner> target_sequence);
 
-  // True if RunTest() was successfully executed on the target thread.
+  // True if RunTest() was successfully executed on the target sequence.
   bool Run() WARN_UNUSED_RESULT;
 
   virtual void RunTest();
@@ -36,10 +36,10 @@
   void set_test_result(bool test_result) { test_result_ = test_result; }
 
  private:
-  void RunInThread();
+  void RunOnSequence();
 
   bool test_result_;
-  scoped_refptr<SingleThreadTaskRunner> target_thread_;
+  scoped_refptr<SequencedTaskRunner> target_sequence_;
   WaitableEvent done_event_;
 
   DISALLOW_COPY_AND_ASSIGN(ThreadTestHelper);
diff --git a/build/android/gyp/util/proguard_util.py b/build/android/gyp/util/proguard_util.py
index 6fc57d9f..be6eae2 100644
--- a/build/android/gyp/util/proguard_util.py
+++ b/build/android/gyp/util/proguard_util.py
@@ -163,12 +163,16 @@
 
   def _WriteFlagsFile(self, out):
     # Quite useful for auditing proguard flags.
-    for config in self._configs:
+    for config in sorted(self._configs):
       out.write('#' * 80 + '\n')
       out.write(config + '\n')
       out.write('#' * 80 + '\n')
       with open(config) as config_file:
-        out.write(config_file.read().rstrip())
+        contents = config_file.read().rstrip()
+      # Remove numbers from generated rule comments to make file more
+      # diff'able.
+      contents = re.sub(r' #generated:\d+', '', contents)
+      out.write(contents)
       out.write('\n\n')
     out.write('#' * 80 + '\n')
     out.write('Command-line\n')
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni
index a679569..b681f02 100644
--- a/build/config/android/internal_rules.gni
+++ b/build/config/android/internal_rules.gni
@@ -852,6 +852,11 @@
                                "testonly",
                              ])
       script = "//build/android/gyp/proguard.py"
+
+      # http://crbug.com/725224. Speculative fix for bots running out of memory.
+      # TODO(agrieve): Change this to an explicit pool once those are supported.
+      #     http://crbug.com/635308
+      console = true
       if (defined(invoker.proguard_jar_path)) {
         _proguard_jar_path = invoker.proguard_jar_path
       } else {
@@ -1029,6 +1034,12 @@
         script = "//build/android/gyp/main_dex_list.py"
         depfile = "$target_gen_dir/$target_name.d"
 
+        # http://crbug.com/725224. Speculative fix for bots running out of
+        #     memory.
+        # TODO(agrieve): Change this to an explicit pool once those are
+        #     supported. http://crbug.com/635308
+        console = true
+
         main_dex_rules = "//build/android/main_dex_classes.flags"
 
         if (defined(invoker.proguard_jar_path)) {
@@ -1095,6 +1106,12 @@
         invoker.output,
       ]
 
+      if (defined(invoker.use_pool) && invoker.use_pool) {
+        # TODO(agrieve): Change this to an explicit pool once those are
+        #     supported. http://crbug.com/635308
+        console = true
+      }
+
       rebased_output = rebase_path(invoker.output, root_build_dir)
 
       args = [
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni
index 6aeabdc..de71733 100644
--- a/build/config/android/rules.gni
+++ b/build/config/android/rules.gni
@@ -2063,6 +2063,9 @@
         }
         args = [ "--inputs=@FileArg($_dex_arg_key)" ]
       }
+
+      # http://crbug.com/725224. Speculative fix for bots running out of memory.
+      use_pool = true
     }
 
     _native_libs_file_arg_dep = ":$build_config_target"
diff --git a/cc/resources/shared_bitmap.cc b/cc/resources/shared_bitmap.cc
index 2eb128a..c863995c 100644
--- a/cc/resources/shared_bitmap.cc
+++ b/cc/resources/shared_bitmap.cc
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "base/logging.h"
+#include "base/memory/shared_memory_handle.h"
 #include "base/numerics/safe_math.h"
 #include "base/rand_util.h"
 #include "base/strings/string_number_conversions.h"
diff --git a/cc/resources/shared_bitmap.h b/cc/resources/shared_bitmap.h
index 464ac5c6..ac91c35 100644
--- a/cc/resources/shared_bitmap.h
+++ b/cc/resources/shared_bitmap.h
@@ -14,6 +14,10 @@
 #include "gpu/command_buffer/common/mailbox.h"
 #include "ui/gfx/geometry/size.h"
 
+namespace base {
+class SharedMemoryHandle;
+}
+
 namespace cc {
 typedef gpu::Mailbox SharedBitmapId;
 
@@ -30,6 +34,10 @@
 
   const SharedBitmapId& id() { return id_; }
 
+  // Returns the shared memory's handle when the back end is base::SharedMemory.
+  // Otherwise, this returns an invalid handle.
+  virtual base::SharedMemoryHandle GetSharedMemoryHandle() const = 0;
+
   // Returns true if the size is valid and false otherwise.
   static bool SizeInBytes(const gfx::Size& size, size_t* size_in_bytes);
   // Dies with a CRASH() if the size can not be represented as a positive number
diff --git a/cc/test/test_shared_bitmap_manager.cc b/cc/test/test_shared_bitmap_manager.cc
index 604f669..ca4b50f 100644
--- a/cc/test/test_shared_bitmap_manager.cc
+++ b/cc/test/test_shared_bitmap_manager.cc
@@ -12,6 +12,7 @@
 namespace cc {
 
 namespace {
+
 class OwnedSharedBitmap : public SharedBitmap {
  public:
   OwnedSharedBitmap(std::unique_ptr<base::SharedMemory> shared_memory,
@@ -21,10 +22,26 @@
 
   ~OwnedSharedBitmap() override {}
 
+  // SharedBitmap:
+  base::SharedMemoryHandle GetSharedMemoryHandle() const override {
+    return shared_memory_->handle();
+  }
+
  private:
   std::unique_ptr<base::SharedMemory> shared_memory_;
 };
 
+class UnownedSharedBitmap : public SharedBitmap {
+ public:
+  UnownedSharedBitmap(uint8_t* pixels, const SharedBitmapId& id)
+      : SharedBitmap(pixels, id) {}
+
+  // SharedBitmap:
+  base::SharedMemoryHandle GetSharedMemoryHandle() const override {
+    return base::SharedMemoryHandle();
+  }
+};
+
 }  // namespace
 
 TestSharedBitmapManager::TestSharedBitmapManager() {}
@@ -48,7 +65,7 @@
   if (bitmap_map_.find(id) == bitmap_map_.end())
     return nullptr;
   uint8_t* pixels = static_cast<uint8_t*>(bitmap_map_[id]->memory());
-  return base::MakeUnique<SharedBitmap>(pixels, id);
+  return base::MakeUnique<UnownedSharedBitmap>(pixels, id);
 }
 
 }  // namespace cc
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
index a2b232b..f87f1633 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenu.java
@@ -299,7 +299,7 @@
         if (currentBackground != null && currentBackground.getConstantState() != null) {
             Drawable backgroundClone =
                     currentBackground.getConstantState().newDrawable(footerView.getResources());
-            newBackground = new LayerDrawable(new Drawable[] {pulse, backgroundClone});
+            newBackground = new LayerDrawable(new Drawable[] {backgroundClone, pulse});
         }
 
         view.setBackground(newBackground);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
index 056449c8..c6587af 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/appmenu/AppMenuAdapter.java
@@ -473,7 +473,7 @@
             background = background.getConstantState().newDrawable(resources);
         }
 
-        LayerDrawable drawable = new LayerDrawable(new Drawable[] {pulse, background});
+        LayerDrawable drawable = new LayerDrawable(new Drawable[] {background, pulse});
         view.setBackground(drawable);
         pulse.start();
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
index 97be0329..8d5c0f97 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
@@ -936,7 +936,7 @@
                     ApiCompatibilityUtils.setTextAppearance(labelView, isEnabled
                             ? R.style.PaymentsUiSectionDefaultText
                             : R.style.PaymentsUiSectionDisabledText);
-                    labelView.setText(convertOptionToString(mOption,
+                    labelView.setText(convertOptionToString(mOption, false, /* excludeMainLabel */
                             mDelegate.isBoldLabelNeeded(OptionSection.this),
                             false /* singleLine */));
                     labelView.setEnabled(isEnabled);
@@ -1063,6 +1063,12 @@
          */
         private boolean mSetDisplaySummaryInSingleLineInNormalMode = true;
 
+        /**
+         * Indicates whether the summary should be split to display in left and right summary
+         * text views in {@link DISPLAY_MODE_NORMAL}.
+         */
+        private boolean mSplitSummaryInDisplayModeNormal;
+
         /** Indicates whether the summary is set to R.style.PaymentsUiSectionDescriptiveText. */
         private boolean mSummaryInDescriptiveText;
 
@@ -1175,6 +1181,18 @@
             mSetDisplaySummaryInSingleLineInNormalMode = singleLine;
         }
 
+        /**
+         * Specify whether the summary should be split to display under DISPLAY_MODE_NORMAL.
+         *
+         * @param splitSummary If true split the display of summary in the left and right
+         *                     text views in {@link DISPLAY_MODE_NORMAL}, the summary is
+         *                     split into 'label' and the rest('sublabel', 'Tertiary label').
+         *                     Otherwise the entire summary is displayed in the left text view.
+         */
+        public void setSplitSummaryInDisplayModeNormal(boolean splitSummary) {
+            mSplitSummaryInDisplayModeNormal = splitSummary;
+        }
+
         /** Updates the View to account for the new {@link SectionInformation} being passed in. */
         public void update(SectionInformation information) {
             mSectionInformation = information;
@@ -1292,9 +1310,20 @@
                             getSummaryLeftTextView(), R.style.PaymentsUiSectionDefaultText);
                     mSummaryInDescriptiveText = false;
                 }
-                setSummaryText(convertOptionToString(selectedItem, false /* useBoldLabel */,
-                                       mSummaryInSingleLine),
-                        null);
+                // Split summary in DISPLAY_MODE_NORMAL if caller specified. The first part is
+                // displayed on the left summary text view aligned to the left. The second part is
+                // displayed on the right summary text view aligned to the right.
+                boolean splitSummary =
+                        mSplitSummaryInDisplayModeNormal && (mDisplayMode == DISPLAY_MODE_NORMAL);
+                if (splitSummary) {
+                    setSummaryText(selectedItem.getLabel(),
+                            convertOptionToString(selectedItem, true /* excludeMainLabel */,
+                                    false /* useBoldLabel */, mSummaryInSingleLine));
+                } else {
+                    setSummaryText(convertOptionToString(selectedItem, false /* excludeMainLabel */,
+                                           false /* useBoldLabel */, mSummaryInSingleLine),
+                            null);
+                }
             }
 
             updateControlLayout();
@@ -1349,17 +1378,20 @@
             }
         }
 
-        private CharSequence convertOptionToString(
-                PaymentOption item, boolean useBoldLabel, boolean singleLine) {
-            SpannableStringBuilder builder = new SpannableStringBuilder(item.getLabel());
+        private CharSequence convertOptionToString(PaymentOption item, boolean excludeMainLabel,
+                boolean useBoldLabel, boolean singleLine) {
+            SpannableStringBuilder builder = new SpannableStringBuilder();
+            if (!excludeMainLabel) {
+                builder.append(item.getLabel());
+                if (useBoldLabel) {
+                    builder.setSpan(
+                            new StyleSpan(android.graphics.Typeface.BOLD), 0, builder.length(), 0);
+                }
+            }
+
             String labelSeparator = singleLine
                     ? getContext().getString(R.string.autofill_address_summary_separator)
                     : "\n";
-            if (useBoldLabel) {
-                builder.setSpan(
-                        new StyleSpan(android.graphics.Typeface.BOLD), 0, builder.length(), 0);
-            }
-
             if (!TextUtils.isEmpty(item.getSublabel())) {
                 if (builder.length() > 0) builder.append(labelSeparator);
                 builder.append(item.getSublabel());
@@ -1398,10 +1430,18 @@
          * Returns the label of the section summary.
          */
         @VisibleForTesting
-        public TextView getSummaryLabelForTest() {
+        public TextView getLeftSummaryLabelForTest() {
             return getSummaryLeftTextView();
         }
 
+        /**
+         * Returns the right summary text view.
+         */
+        @VisibleForTesting
+        public TextView getRightSummaryLabelForTest() {
+            return getSummaryRightTextView();
+        }
+
         /** Returns the number of option labels. */
         @VisibleForTesting
         public int getNumberOfOptionLabelsForTest() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
index d5adeeb..1848ed9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -543,6 +543,10 @@
         // Display the summary of the selected address in multiple lines on bottom sheet.
         mShippingAddressSection.setDisplaySummaryInSingleLineInNormalMode(false);
 
+        // Display selected shipping option name in the left summary text view and
+        // the cost in the right summary text view on bottom sheet.
+        mShippingOptionSection.setSplitSummaryInDisplayModeNormal(true);
+
         // Some sections conditionally allow adding new options.
         mShippingOptionSection.setCanAddItems(false);
         mPaymentMethodSection.setCanAddItems(canAddCards);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
index 5c660be..4731c08 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/SingleWebsitePreferences.java
@@ -313,7 +313,7 @@
             } else if (PREF_PROTECTED_MEDIA_IDENTIFIER_PERMISSION.equals(preference.getKey())) {
                 setUpListPreference(preference, mSite.getProtectedMediaIdentifierPermission());
             } else if (PREF_SUBRESOURCE_FILTER_PERMISSION.equals(preference.getKey())) {
-                setUpListPreference(preference, mSite.getSubresourceFilterPermission());
+                setUpSubresourceFilterPreference(preference);
             }
 
             if (permissionPreferenceKeys.contains(preference.getKey())) {
@@ -497,6 +497,37 @@
     }
 
     /**
+     * Updates the subresource filter list preference based on subresource filter activation. This
+     * has some custom behavior.
+     * 1. If the site is filtering, the permission should show up even if it is set as the default
+     *    (e.g. |preference| is null).
+     * 2. The BLOCK string is custom.
+     */
+    private void setUpSubresourceFilterPreference(Preference preference) {
+        // If the subresource filter is activated, then this site will have resources filtered
+        // unless there is an explicit permission disallowing the filtering.
+        boolean subresourceFilterActivated = WebsitePreferenceBridge.getSubresourceFilterActivated(
+                mSite.getAddress().getOrigin());
+        ContentSetting permission = mSite.getSubresourceFilterPermission();
+
+        // If |permission| is null, there is no explicit (non-default) permission set for this site.
+        // However, if the filtering is activated, we still want to show the permission as BLOCK.
+        if (permission == null && !subresourceFilterActivated) {
+            setUpListPreference(preference, null);
+            return;
+        }
+        setUpListPreference(preference, permission == null ? ContentSetting.BLOCK : permission);
+
+        // The subresource filter permission has a custom BLOCK string.
+        ListPreference listPreference = (ListPreference) preference;
+        Resources res = getResources();
+        listPreference.setEntries(
+                new String[] {res.getString(R.string.website_settings_permissions_allow),
+                        res.getString(R.string.subresource_filter_permission_block)});
+        listPreference.setValueIndex(permission == ContentSetting.ALLOW ? 0 : 1);
+    }
+
+    /**
      * Returns true if the current host matches the default search engine host and location for the
      * default search engine is being granted via x-geo.
      * @param context The current context.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
index df376b27..d0a7c40 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/Website.java
@@ -4,6 +4,7 @@
 
 package org.chromium.chrome.browser.preferences.website;
 
+import org.chromium.chrome.browser.ContentSettingsType;
 import org.chromium.chrome.browser.util.MathUtils;
 
 import java.io.Serializable;
@@ -375,9 +376,15 @@
      * Sets the Subresource Filter permission.
      */
     public void setSubresourceFilterPermission(ContentSetting value) {
-        if (mSubresourceFilterException != null) {
-            mSubresourceFilterException.setContentSetting(value);
+        // It is possible to set the permission without having an existing exception, because we can
+        // show the BLOCK state even when this permission is set to the default. In that case, just
+        // set an exception now to BLOCK to enable changing the permission.
+        if (mSubresourceFilterException == null) {
+            setSubresourceFilterException(new ContentSettingException(
+                    ContentSettingsType.CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER,
+                    getAddress().getOrigin(), ContentSetting.BLOCK, ""));
         }
+        mSubresourceFilterException.setContentSetting(value);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java
index fcbba04d..d8740f6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/website/WebsitePreferenceBridge.java
@@ -240,6 +240,14 @@
         nativeSetDSEGeolocationSetting(setting);
     }
 
+    /**
+     * Returns whether this origin is activated for subresource filtering, and will have
+     * resources filtered unless they are explicitly allowed via a permission.
+     */
+    public static boolean getSubresourceFilterActivated(String origin) {
+        return nativeGetSubresourceFilterActivated(origin);
+    }
+
     private static native void nativeGetGeolocationOrigins(Object list, boolean managedOnly);
     static native int nativeGetGeolocationSettingForOrigin(
             String origin, String embedder, boolean isIncognito);
@@ -284,4 +292,5 @@
             String origin, boolean isIncognito);
     private static native boolean nativeGetDSEGeolocationSetting();
     private static native void nativeSetDSEGeolocationSetting(boolean setting);
+    private static native boolean nativeGetSubresourceFilterActivated(String origin);
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
index 67a74465..3550acc 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/BottomToolbarPhone.java
@@ -446,6 +446,8 @@
             setContentDescription(
                     getResources().getString(R.string.bottom_sheet_accessibility_toolbar));
         }
+
+        mBottomSheet.showHelpBubbleIfNecessary();
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
index 425ecda..9747c715 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/widget/bottomsheet/BottomSheet.java
@@ -41,7 +41,6 @@
 import org.chromium.chrome.browser.fullscreen.ChromeFullscreenManager;
 import org.chromium.chrome.browser.ntp.NativePageFactory;
 import org.chromium.chrome.browser.tab.Tab;
-import org.chromium.chrome.browser.tabmodel.EmptyTabModelSelectorObserver;
 import org.chromium.chrome.browser.tabmodel.TabModel;
 import org.chromium.chrome.browser.tabmodel.TabModelSelector;
 import org.chromium.chrome.browser.toolbar.ActionModeController.ActionBarDelegate;
@@ -227,9 +226,6 @@
     /** Whether the sheet is currently open. */
     private boolean mIsSheetOpen;
 
-    /** Whether the root view has been laid out at least once. **/
-    private boolean mHasRootLayoutOccurred;
-
     /** The activity displaying the bottom sheet. */
     private ChromeActivity mActivity;
 
@@ -557,19 +553,6 @@
      */
     public void setTabModelSelector(TabModelSelector tabModelSelector) {
         mTabModelSelector = tabModelSelector;
-
-        if (mHasRootLayoutOccurred && mTabModelSelector.isTabStateInitialized()) {
-            showHelpBubbleIfNecessary();
-        } else if (!mTabModelSelector.isTabStateInitialized()) {
-            mTabModelSelector.addObserver(new EmptyTabModelSelectorObserver() {
-                @Override
-                public void onTabStateInitialized() {
-                    if (mHasRootLayoutOccurred) showHelpBubbleIfNecessary();
-                    mTabModelSelector.removeObserver(this);
-                }
-            });
-        }
-
         mNtpController.setTabModelSelector(tabModelSelector);
     }
 
@@ -664,13 +647,6 @@
                     cancelAnimation();
                     setSheetState(mCurrentState, false);
                 }
-
-                if (!mHasRootLayoutOccurred && mTabModelSelector != null
-                        && mTabModelSelector.isTabStateInitialized()) {
-                    showHelpBubbleIfNecessary();
-                }
-
-                mHasRootLayoutOccurred = true;
             }
         });
 
@@ -1344,13 +1320,11 @@
                 && !blockPeekingSwipes;
     }
 
-    private void showHelpBubbleIfNecessary() {
-        // The help bubble should only be shown after layout has occurred so that the anchor view is
-        // in the correct position on the screen. It also must be shown after the tab state has been
-        // initialized so that any tab that auto-opens the BottomSheet has had a chance to do so.
-        assert mHasRootLayoutOccurred && mTabModelSelector != null
-                && mTabModelSelector.isTabStateInitialized();
-
+    /**
+     * Show the in-product help bubble for the {@link BottomSheet} if it has not already been shown.
+     * This method must be called after the toolbar has had at least one layout pass.
+     */
+    public void showHelpBubbleIfNecessary() {
         // If FRE is not complete, the FRE screen is likely covering ChromeTabbedActivity so the
         // help bubble should not be shown. Also skip showing if the bottom sheet is already open.
         if (!FirstRunStatus.getFirstRunFlowComplete() || mCurrentState != SHEET_STATE_PEEK) return;
diff --git a/chrome/android/java/strings/android_chrome_strings.grd b/chrome/android/java/strings/android_chrome_strings.grd
index c4bdf29..45bedbe7 100644
--- a/chrome/android/java/strings/android_chrome_strings.grd
+++ b/chrome/android/java/strings/android_chrome_strings.grd
@@ -741,6 +741,9 @@
       <message name="IDS_SUBRESOURCE_FILTER_PERMISSION_TITLE" desc="Title for the subresource filter permission [CHAR-LIMIT=32]" translateable="false">
          Subresource Filter
       </message>
+      <message name="IDS_SUBRESOURCE_FILTER_PERMISSION_BLOCK" desc="The Blocked string for the subresource filter permission" translateable="false">
+         Block (subresource filter)
+      </message>
       <message name="IDS_PUSH_NOTIFICATIONS_PERMISSION_TITLE" desc="Title for the permission for showing push notifications [CHAR-LIMIT=32]">
         Notifications
       </message>
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 1232e38..b27c70c 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -2,6 +2,8 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//components/offline_pages/features/features.gni")
+
 chrome_java_sources = [
   "java/src/com/google/android/apps/chrome/appwidget/bookmarks/BookmarkThumbnailWidgetProvider.java",
   "java/src/org/chromium/chrome/browser/ActivityTabTaskDescriptionHelper.java",
@@ -1806,7 +1808,7 @@
 ]
 
 # Only used for testing, should not be shipped to end users.
-if (!is_official_build) {
+if (enable_offline_pages_harness) {
   chrome_java_sources += [ "java/src/org/chromium/chrome/browser/offlinepages/evaluation/OfflinePageEvaluationBridge.java" ]
   chrome_test_java_sources += [ "javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageSavePageLaterEvaluationTest.java" ]
 }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java
index 024d116..77e62fb 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestAbortTest.java
@@ -12,6 +12,7 @@
 
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeSwitches;
 import org.chromium.chrome.browser.autofill.AutofillTestHelper;
@@ -53,6 +54,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testAbortBeforePayClicked()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
@@ -64,6 +66,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testAbortWhileUnmaskingCard()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
index 9149eb73..3b5e81b84 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestMetricsTest.java
@@ -23,6 +23,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.RetryOnFailure;
 import org.chromium.chrome.R;
 import org.chromium.chrome.browser.ChromeFeatureList;
 import org.chromium.chrome.browser.ChromeSwitches;
@@ -69,6 +70,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testSuccessCheckoutFunnel()
             throws InterruptedException, ExecutionException, TimeoutException {
         // Initiate a payment request.
@@ -109,6 +111,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testAbortMetrics_AbortedByUser_CancelButton()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay());
@@ -139,6 +142,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testAbortMetrics_AbortedByUser_XButton()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay());
@@ -160,6 +164,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testAbortMetrics_AbortedByUser_BackButton()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay());
@@ -187,6 +192,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testAbortMetrics_AbortedByUser_TabClosed()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay());
@@ -208,6 +214,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testAbortMetrics_AbortedByMerchant()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.triggerUIAndWait("ccBuy", mPaymentRequestTestRule.getReadyToPay());
@@ -230,6 +237,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testMetrics_NoMatchingPaymentMethod()
             throws InterruptedException, ExecutionException, TimeoutException {
         // Android Pay is supported but no instruments are present.
@@ -258,6 +266,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testMetrics_NoSupportedPaymentMethod()
             throws InterruptedException, ExecutionException, TimeoutException {
         mPaymentRequestTestRule.openPageAndClickNodeAndWait(
@@ -281,6 +290,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testSelectedPaymentMethod_CreditCard()
             throws InterruptedException, ExecutionException, TimeoutException {
         // Complete a Payment Request with a credit card.
@@ -302,6 +312,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testSelectedPaymentMethod_AndroidPay()
             throws InterruptedException, ExecutionException, TimeoutException {
         // Complete a Payment Request with Android Pay.
@@ -322,6 +333,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     public void testMetrics_SkippedShow()
             throws InterruptedException, ExecutionException, TimeoutException {
         // Complete a Payment Request with Android Pay.
@@ -348,6 +360,7 @@
     @Test
     @MediumTest
     @Feature({"Payments"})
+    @RetryOnFailure
     @CommandLineFlags.Add({"disable-features=" + ChromeFeatureList.WEB_PAYMENTS_SINGLE_APP_UI_SKIP})
     public void testMetrics_SkippedShow_Disabled()
             throws InterruptedException, ExecutionException, TimeoutException {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java
index 299b6fc3..903ebe6d 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestShippingAddressAndOptionTest.java
@@ -74,8 +74,12 @@
 
         // Make sure shipping option summary on bottom sheet is displayed in a single line
         // as expected.
-        Assert.assertEquals("Free global shipping, $0.00",
-                mPaymentRequestTestRule.getShippingOptionSummaryLabel());
+        Assert.assertEquals(
+                "Free global shipping", mPaymentRequestTestRule.getShippingOptionSummaryLabel());
+
+        // Make sure shipping cost is displayed in the right summary text view.
+        Assert.assertEquals(
+                "$0.00", mPaymentRequestTestRule.getShippingOptionCostSummaryLabelOnBottomSheet());
     }
 
     /** Verifies that the shipping address format in fullsheet mode is as expected. */
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
index e25e1e4..fab95e18 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestCommon.java
@@ -404,7 +404,7 @@
             @Override
             public String call() {
                 return mUI.getShippingAddressSectionForTest()
-                        .getSummaryLabelForTest()
+                        .getLeftSummaryLabelForTest()
                         .getText()
                         .toString();
             }
@@ -416,7 +416,19 @@
             @Override
             public String call() {
                 return mUI.getShippingOptionSectionForTest()
-                        .getSummaryLabelForTest()
+                        .getLeftSummaryLabelForTest()
+                        .getText()
+                        .toString();
+            }
+        });
+    }
+
+    protected String getShippingOptionCostSummaryOnBottomSheet() throws ExecutionException {
+        return ThreadUtils.runOnUiThreadBlocking(new Callable<String>() {
+            @Override
+            public String call() {
+                return mUI.getShippingOptionSectionForTest()
+                        .getRightSummaryLabelForTest()
                         .getText()
                         .toString();
             }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java
index 19865e6..dfd0fef 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java
@@ -274,6 +274,13 @@
         return mTestCommon.getShippingOptionSummary();
     }
 
+    /**
+     *  Returns the cost text of the shipping option section on the bottom sheet.
+     */
+    protected String getShippingOptionCostSummaryLabelOnBottomSheet() throws ExecutionException {
+        return mTestCommon.getShippingOptionCostSummaryOnBottomSheet();
+    }
+
     /** Returns the focused view in the card editor view. */
     protected View getCardEditorFocusedView() {
         return mTestCommon.getCardEditorFocusedView();
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index f01e9e4..33b1773 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -4343,7 +4343,7 @@
     ]
 
     # Used for testing only, should not be shipped to end users.
-    if (!is_official_build) {
+    if (enable_offline_pages_harness) {
       sources += [ "../android/java/src/org/chromium/chrome/browser/offlinepages/evaluation/OfflinePageEvaluationBridge.java" ]
     }
     jni_package = "chrome"
diff --git a/chrome/browser/android/preferences/website_preference_bridge.cc b/chrome/browser/android/preferences/website_preference_bridge.cc
index e8585d9..af0537d 100644
--- a/chrome/browser/android/preferences/website_preference_bridge.cc
+++ b/chrome/browser/android/preferences/website_preference_bridge.cc
@@ -823,6 +823,16 @@
   return search_helper->SetDSEGeolocationSetting(setting);
 }
 
+static jboolean GetSubresourceFilterActivated(
+    JNIEnv* env,
+    const JavaParamRef<jclass>& clazz,
+    const JavaParamRef<jstring>& jorigin) {
+  GURL url(ConvertJavaStringToUTF8(env, jorigin));
+  return !!GetHostContentSettingsMap(false)->GetWebsiteSetting(
+      url, GURL(), CONTENT_SETTINGS_TYPE_SUBRESOURCE_FILTER_DATA, std::string(),
+      nullptr);
+}
+
 // Register native methods
 bool RegisterWebsitePreferenceBridge(JNIEnv* env) {
   return RegisterNativesImpl(env);
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
index b0ab216..f6f5635 100644
--- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
+++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -1017,6 +1017,9 @@
 // CrossProcessFrameConnector::TransformPointToRootCoordSpace.
 IN_PROC_BROWSER_TEST_F(WebViewContextMenuInteractiveTest,
                        ContextMenuParamCoordinates) {
+  if (base::FeatureList::IsEnabled(features::kGuestViewCrossProcessFrames))
+    return;
+
   TestHelper("testCoordinates", "web_view/context_menus/coordinates",
              NO_TEST_SERVER);
   ASSERT_TRUE(guest_web_contents());
diff --git a/chrome/browser/global_keyboard_shortcuts_cocoa_mac.mm b/chrome/browser/global_keyboard_shortcuts_cocoa_mac.mm
index 88543bc4..e47c2648 100644
--- a/chrome/browser/global_keyboard_shortcuts_cocoa_mac.mm
+++ b/chrome/browser/global_keyboard_shortcuts_cocoa_mac.mm
@@ -17,40 +17,42 @@
 const std::vector<KeyboardShortcutData>& GetWindowKeyboardShortcutTable() {
   // clang-format off
   CR_DEFINE_STATIC_LOCAL(std::vector<KeyboardShortcutData>, result, ({
-    //cmd   shift  cntrl  option vkeycode      char command
-    //---   -----  -----  ------ --------      ---- -------
+    //cmd   shift  cntrl  option vkeycode               char command
+    //---   -----  -----  ------ --------               ---- -------
     // '{' / '}' characters should be matched earlier than virtual key codes
     // (so we can match alt-8 as '{' on German keyboards).
-    {true,  false, false, false, 0,            '}', IDC_SELECT_NEXT_TAB},
-    {true,  false, false, false, 0,            '{', IDC_SELECT_PREVIOUS_TAB},
-    {false, false, true,  false, kVK_PageDown, 0,   IDC_SELECT_NEXT_TAB},
-    {false, false, true,  false, kVK_Tab,      0,   IDC_SELECT_NEXT_TAB},
-    {false, false, true,  false, kVK_PageUp,   0,   IDC_SELECT_PREVIOUS_TAB},
-    {false, true,  true,  false, kVK_Tab,      0,   IDC_SELECT_PREVIOUS_TAB},
+    {true,  false, false, false, 0,                     '}', IDC_SELECT_NEXT_TAB},
+    {true,  false, false, false, 0,                     '{', IDC_SELECT_PREVIOUS_TAB},
+    {true,  true,  false, false, kVK_ANSI_RightBracket, 0,   IDC_SELECT_NEXT_TAB},
+    {true,  true,  false, false, kVK_ANSI_LeftBracket,  0,   IDC_SELECT_PREVIOUS_TAB},
+    {false, false, true,  false, kVK_PageDown,          0,   IDC_SELECT_NEXT_TAB},
+    {false, false, true,  false, kVK_Tab,               0,   IDC_SELECT_NEXT_TAB},
+    {false, false, true,  false, kVK_PageUp,            0,   IDC_SELECT_PREVIOUS_TAB},
+    {false, true,  true,  false, kVK_Tab,               0,   IDC_SELECT_PREVIOUS_TAB},
 
-    //cmd  shift  cntrl  option vkeycode          char command
-    //---  -----  -----  ------ --------          ---- -------
+    //cmd  shift  cntrl  option vkeycode                char command
+    //---  -----  -----  ------ --------                ---- -------
     // Cmd-0..8 select the nth tab, with cmd-9 being "last tab".
-    {true, false, false, false, kVK_ANSI_1,       0,   IDC_SELECT_TAB_0},
-    {true, false, false, false, kVK_ANSI_Keypad1, 0,   IDC_SELECT_TAB_0},
-    {true, false, false, false, kVK_ANSI_2,       0,   IDC_SELECT_TAB_1},
-    {true, false, false, false, kVK_ANSI_Keypad2, 0,   IDC_SELECT_TAB_1},
-    {true, false, false, false, kVK_ANSI_3,       0,   IDC_SELECT_TAB_2},
-    {true, false, false, false, kVK_ANSI_Keypad3, 0,   IDC_SELECT_TAB_2},
-    {true, false, false, false, kVK_ANSI_4,       0,   IDC_SELECT_TAB_3},
-    {true, false, false, false, kVK_ANSI_Keypad4, 0,   IDC_SELECT_TAB_3},
-    {true, false, false, false, kVK_ANSI_5,       0,   IDC_SELECT_TAB_4},
-    {true, false, false, false, kVK_ANSI_Keypad5, 0,   IDC_SELECT_TAB_4},
-    {true, false, false, false, kVK_ANSI_6,       0,   IDC_SELECT_TAB_5},
-    {true, false, false, false, kVK_ANSI_Keypad6, 0,   IDC_SELECT_TAB_5},
-    {true, false, false, false, kVK_ANSI_7,       0,   IDC_SELECT_TAB_6},
-    {true, false, false, false, kVK_ANSI_Keypad7, 0,   IDC_SELECT_TAB_6},
-    {true, false, false, false, kVK_ANSI_8,       0,   IDC_SELECT_TAB_7},
-    {true, false, false, false, kVK_ANSI_Keypad8, 0,   IDC_SELECT_TAB_7},
-    {true, false, false, false, kVK_ANSI_9,       0,   IDC_SELECT_LAST_TAB},
-    {true, false, false, false, kVK_ANSI_Keypad9, 0,   IDC_SELECT_LAST_TAB},
-    {true, true,  false, false, kVK_ANSI_M,       0,   IDC_SHOW_AVATAR_MENU},
-    {true, false, false, true,  kVK_ANSI_L,       0,   IDC_SHOW_DOWNLOADS},
+    {true, false, false, false, kVK_ANSI_1,             0,   IDC_SELECT_TAB_0},
+    {true, false, false, false, kVK_ANSI_Keypad1,       0,   IDC_SELECT_TAB_0},
+    {true, false, false, false, kVK_ANSI_2,             0,   IDC_SELECT_TAB_1},
+    {true, false, false, false, kVK_ANSI_Keypad2,       0,   IDC_SELECT_TAB_1},
+    {true, false, false, false, kVK_ANSI_3,             0,   IDC_SELECT_TAB_2},
+    {true, false, false, false, kVK_ANSI_Keypad3,       0,   IDC_SELECT_TAB_2},
+    {true, false, false, false, kVK_ANSI_4,             0,   IDC_SELECT_TAB_3},
+    {true, false, false, false, kVK_ANSI_Keypad4,       0,   IDC_SELECT_TAB_3},
+    {true, false, false, false, kVK_ANSI_5,             0,   IDC_SELECT_TAB_4},
+    {true, false, false, false, kVK_ANSI_Keypad5,       0,   IDC_SELECT_TAB_4},
+    {true, false, false, false, kVK_ANSI_6,             0,   IDC_SELECT_TAB_5},
+    {true, false, false, false, kVK_ANSI_Keypad6,       0,   IDC_SELECT_TAB_5},
+    {true, false, false, false, kVK_ANSI_7,             0,   IDC_SELECT_TAB_6},
+    {true, false, false, false, kVK_ANSI_Keypad7,       0,   IDC_SELECT_TAB_6},
+    {true, false, false, false, kVK_ANSI_8,             0,   IDC_SELECT_TAB_7},
+    {true, false, false, false, kVK_ANSI_Keypad8,       0,   IDC_SELECT_TAB_7},
+    {true, false, false, false, kVK_ANSI_9,             0,   IDC_SELECT_LAST_TAB},
+    {true, false, false, false, kVK_ANSI_Keypad9,       0,   IDC_SELECT_LAST_TAB},
+    {true, true,  false, false, kVK_ANSI_M,             0,   IDC_SHOW_AVATAR_MENU},
+    {true, false, false, true,  kVK_ANSI_L,             0,   IDC_SHOW_DOWNLOADS},
   }));
   // clang-format on
   return result;
diff --git a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
index f9a93716..de309085 100644
--- a/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
+++ b/chrome/browser/ntp_snippets/content_suggestions_service_factory.cc
@@ -149,37 +149,88 @@
              offline_pages::kOffliningRecentPagesFeature);
 }
 
-void RegisterRecentTabProvider(OfflinePageModel* offline_page_model,
-                               RequestCoordinator* request_coordinator,
-                               ContentSuggestionsService* service,
-                               PrefService* pref_service) {
+void RegisterRecentTabProviderIfEnabled(ContentSuggestionsService* service,
+                                        Profile* profile,
+                                        OfflinePageModel* offline_page_model) {
+  if (!IsRecentTabProviderEnabled()) {
+    return;
+  }
+
+  RequestCoordinator* request_coordinator =
+      RequestCoordinatorFactory::GetForBrowserContext(profile);
   offline_pages::DownloadUIAdapter* ui_adapter = offline_pages::
       RecentTabsUIAdapterDelegate::GetOrCreateRecentTabsUIAdapter(
           offline_page_model, request_coordinator);
   auto provider = base::MakeUnique<RecentTabSuggestionsProvider>(
-      service, ui_adapter, pref_service);
+      service, ui_adapter, profile->GetPrefs());
   service->RegisterProvider(std::move(provider));
+
+  offline_pages::PrefetchService* prefetch_service =
+      offline_pages::PrefetchServiceFactory::GetForBrowserContext(profile);
+  prefetch_service->ObserveContentSuggestionsService(service);
 }
 
 #endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
 
 #if defined(OS_ANDROID)
 
-void RegisterDownloadsProvider(OfflinePageModel* offline_page_model,
-                               DownloadManager* download_manager,
-                               DownloadHistory* download_history,
-                               ContentSuggestionsService* service,
-                               PrefService* pref_service) {
+bool AreAssetDownloadsEnabled() {
+  return !IsChromeHomeEnabled() &&
+         base::FeatureList::IsEnabled(
+             features::kAssetDownloadSuggestionsFeature);
+}
+
+bool AreOfflinePageDownloadsEnabled() {
+  return !IsChromeHomeEnabled() &&
+         base::FeatureList::IsEnabled(
+             features::kOfflinePageDownloadSuggestionsFeature);
+}
+
+bool IsDownloadsProviderEnabled() {
+  return AreAssetDownloadsEnabled() || AreOfflinePageDownloadsEnabled();
+}
+
+void RegisterDownloadsProviderIfEnabled(ContentSuggestionsService* service,
+                                        Profile* profile,
+                                        OfflinePageModel* offline_page_model) {
+  if (!IsDownloadsProviderEnabled()) {
+    return;
+  }
+
+  offline_page_model =
+      AreOfflinePageDownloadsEnabled() ? offline_page_model : nullptr;
+  DownloadManager* download_manager =
+      AreAssetDownloadsEnabled()
+          ? content::BrowserContext::GetDownloadManager(profile)
+          : nullptr;
+  DownloadCoreService* download_core_service =
+      DownloadCoreServiceFactory::GetForBrowserContext(profile);
+  DownloadHistory* download_history =
+      download_core_service->GetDownloadHistory();
+
   auto provider = base::MakeUnique<DownloadSuggestionsProvider>(
       service, offline_page_model, download_manager, download_history,
-      pref_service, base::MakeUnique<base::DefaultClock>());
+      profile->GetPrefs(), base::MakeUnique<base::DefaultClock>());
   service->RegisterProvider(std::move(provider));
 }
 
 #endif  // OS_ANDROID
 
-void RegisterBookmarkProvider(BookmarkModel* bookmark_model,
-                              ContentSuggestionsService* service) {
+bool IsBookmarkProviderEnabled(BookmarkModel* bookmark_model) {
+  return base::FeatureList::IsEnabled(
+             ntp_snippets::kBookmarkSuggestionsFeature) &&
+         bookmark_model &&  // |bookmark_model| can be null in tests.
+         !IsChromeHomeEnabled();
+}
+
+void RegisterBookmarkProviderIfEnabled(ContentSuggestionsService* service,
+                                       Profile* profile) {
+  BookmarkModel* bookmark_model =
+      BookmarkModelFactory::GetForBrowserContext(profile);
+  if (!IsBookmarkProviderEnabled(bookmark_model)) {
+    return;
+  }
+
   auto provider =
       base::MakeUnique<BookmarkSuggestionsProvider>(service, bookmark_model);
   service->RegisterProvider(std::move(provider));
@@ -193,24 +244,40 @@
          base::FeatureList::IsEnabled(chrome::android::kPhysicalWebFeature);
 }
 
-void RegisterPhysicalWebPageProvider(
+void RegisterPhysicalWebPageProviderIfEnabled(
     ContentSuggestionsService* service,
-    PhysicalWebDataSource* physical_web_data_source,
-    PrefService* pref_service) {
+    Profile* profile) {
+  if (!IsPhysicalWebPageProviderEnabled()) {
+    return;
+  }
+
+  PhysicalWebDataSource* physical_web_data_source =
+      g_browser_process->GetPhysicalWebDataSource();
   auto provider = base::MakeUnique<PhysicalWebPageSuggestionsProvider>(
-      service, physical_web_data_source, pref_service);
+      service, physical_web_data_source, profile->GetPrefs());
   service->RegisterProvider(std::move(provider));
 }
 
 #endif  // OS_ANDROID
 
-void RegisterArticleProvider(SigninManagerBase* signin_manager,
-                             OAuth2TokenService* token_service,
-                             ContentSuggestionsService* service,
-                             LanguageModel* language_model,
-                             UserClassifier* user_classifier,
-                             PrefService* pref_service,
-                             Profile* profile) {
+bool IsArticleProviderEnabled() {
+  return base::FeatureList::IsEnabled(ntp_snippets::kArticleSuggestionsFeature);
+}
+
+void RegisterArticleProviderIfEnabled(ContentSuggestionsService* service,
+                                      Profile* profile,
+                                      SigninManagerBase* signin_manager,
+                                      UserClassifier* user_classifier) {
+  if (!IsArticleProviderEnabled()) {
+    return;
+  }
+
+  PrefService* pref_service = profile->GetPrefs();
+  OAuth2TokenService* token_service =
+      ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
+  LanguageModel* language_model =
+      LanguageModelFactory::GetInstance()->GetForBrowserContext(profile);
+
   scoped_refptr<net::URLRequestContextGetter> request_context =
       content::BrowserContext::GetDefaultStoragePartition(profile)
           ->GetURLRequestContext();
@@ -258,13 +325,24 @@
   service->RegisterProvider(std::move(provider));
 }
 
-void RegisterForeignSessionsProvider(SyncService* sync_service,
-                                     ContentSuggestionsService* service,
-                                     PrefService* pref_service) {
+bool IsForeignSessionsProviderEnabled() {
+  return base::FeatureList::IsEnabled(
+      ntp_snippets::kForeignSessionsSuggestionsFeature);
+}
+
+void RegisterForeignSessionsProviderIfEnabled(
+    ContentSuggestionsService* service,
+    Profile* profile) {
+  if (!IsForeignSessionsProviderEnabled()) {
+    return;
+  }
+
+  SyncService* sync_service =
+      ProfileSyncServiceFactory::GetSyncServiceForBrowserContext(profile);
   std::unique_ptr<TabDelegateSyncAdapter> sync_adapter =
       base::MakeUnique<TabDelegateSyncAdapter>(sync_service);
   auto provider = base::MakeUnique<ForeignSessionsSuggestionsProvider>(
-      service, std::move(sync_adapter), pref_service);
+      service, std::move(sync_adapter), profile->GetPrefs());
   service->RegisterProvider(std::move(provider));
 }
 
@@ -323,6 +401,13 @@
       pref_service, base::MakeUnique<base::DefaultClock>());
   auto* user_classifier_raw = user_classifier.get();
 
+#if BUILDFLAG(ENABLE_OFFLINE_PAGES)
+  OfflinePageModel* offline_page_model =
+      OfflinePageModelFactory::GetForBrowserContext(profile);
+#else
+  OfflinePageModel* offline_page_model = nullptr;
+#endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
+
   // Create the RemoteSuggestionsScheduler.
   PersistentScheduler* persistent_scheduler = nullptr;
 #if defined(OS_ANDROID)
@@ -347,76 +432,19 @@
       pref_service, std::move(category_ranker), std::move(user_classifier),
       std::move(scheduler));
 
+  RegisterArticleProviderIfEnabled(service, profile, signin_manager,
+                                   user_classifier_raw);
+  RegisterBookmarkProviderIfEnabled(service, profile);
+  RegisterForeignSessionsProviderIfEnabled(service, profile);
+
+#if defined(OS_ANDROID)
+  RegisterDownloadsProviderIfEnabled(service, profile, offline_page_model);
+  RegisterPhysicalWebPageProviderIfEnabled(service, profile);
+#endif  // OS_ANDROID
+
 #if BUILDFLAG(ENABLE_OFFLINE_PAGES)
-  OfflinePageModel* offline_page_model =
-      OfflinePageModelFactory::GetForBrowserContext(profile);
-  if (IsRecentTabProviderEnabled()) {
-    RequestCoordinator* request_coordinator =
-        RequestCoordinatorFactory::GetForBrowserContext(profile);
-    RegisterRecentTabProvider(offline_page_model, request_coordinator, service,
-                              pref_service);
-  }
-
-  offline_pages::PrefetchService* prefetch_service =
-      offline_pages::PrefetchServiceFactory::GetForBrowserContext(profile);
-  prefetch_service->ObserveContentSuggestionsService(service);
-#endif  // BUILDFLAG(ENABLE_OFFLINE_PAGES)
-
-#if defined(OS_ANDROID)
-  bool show_asset_downloads =
-      !IsChromeHomeEnabled() &&
-      base::FeatureList::IsEnabled(features::kAssetDownloadSuggestionsFeature);
-  bool show_offline_page_downloads =
-      !IsChromeHomeEnabled() &&
-      base::FeatureList::IsEnabled(
-          features::kOfflinePageDownloadSuggestionsFeature);
-  if (show_asset_downloads || show_offline_page_downloads) {
-    DownloadManager* download_manager =
-        content::BrowserContext::GetDownloadManager(profile);
-    DownloadCoreService* download_core_service =
-        DownloadCoreServiceFactory::GetForBrowserContext(profile);
-    DownloadHistory* download_history =
-        download_core_service->GetDownloadHistory();
-    RegisterDownloadsProvider(
-        show_offline_page_downloads ? offline_page_model : nullptr,
-        show_asset_downloads ? download_manager : nullptr, download_history,
-        service, pref_service);
-  }
-#endif  // OS_ANDROID
-
-  // |bookmark_model| can be null in tests.
-  BookmarkModel* bookmark_model =
-      BookmarkModelFactory::GetForBrowserContext(profile);
-  if (base::FeatureList::IsEnabled(ntp_snippets::kBookmarkSuggestionsFeature) &&
-      bookmark_model && !IsChromeHomeEnabled()) {
-    RegisterBookmarkProvider(bookmark_model, service);
-  }
-
-#if defined(OS_ANDROID)
-  if (IsPhysicalWebPageProviderEnabled()) {
-    PhysicalWebDataSource* physical_web_data_source =
-        g_browser_process->GetPhysicalWebDataSource();
-    RegisterPhysicalWebPageProvider(service, physical_web_data_source,
-                                    pref_service);
-  }
-#endif  // OS_ANDROID
-
-  if (base::FeatureList::IsEnabled(ntp_snippets::kArticleSuggestionsFeature)) {
-    OAuth2TokenService* token_service =
-        ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
-    LanguageModel* language_model =
-        LanguageModelFactory::GetInstance()->GetForBrowserContext(profile);
-    RegisterArticleProvider(signin_manager, token_service, service,
-                            language_model, user_classifier_raw, pref_service,
-                            profile);
-  }
-
-  if (base::FeatureList::IsEnabled(
-          ntp_snippets::kForeignSessionsSuggestionsFeature)) {
-    SyncService* sync_service =
-        ProfileSyncServiceFactory::GetSyncServiceForBrowserContext(profile);
-    RegisterForeignSessionsProvider(sync_service, service, pref_service);
-  }
+  RegisterRecentTabProviderIfEnabled(service, profile, offline_page_model);
+#endif
 
   return service;
 
diff --git a/chrome/browser/resources/omnibox/omnibox.html b/chrome/browser/resources/omnibox/omnibox.html
index aff0ab5..3f34ae2 100644
--- a/chrome/browser/resources/omnibox/omnibox.html
+++ b/chrome/browser/resources/omnibox/omnibox.html
@@ -6,7 +6,9 @@
   <link rel="stylesheet" href="chrome://resources/css/text_defaults.css">
   <link rel="stylesheet" href="omnibox.css">
   <script src="chrome://resources/js/cr.js"></script>
+  <script src="chrome://resources/js/mojo_bindings.js"></script>
   <script src="chrome://resources/js/util.js"></script>
+  <script src="chrome/browser/ui/webui/omnibox/omnibox.mojom.js"></script>
   <script src="omnibox.js"></script>
 </head>
 <body>
diff --git a/chrome/browser/resources/omnibox/omnibox.js b/chrome/browser/resources/omnibox/omnibox.js
index 2570deb..6e82ebf 100644
--- a/chrome/browser/resources/omnibox/omnibox.js
+++ b/chrome/browser/resources/omnibox/omnibox.js
@@ -106,7 +106,7 @@
    * @const
    */
   var PROPERTY_OUTPUT_ORDER = [
-    new PresentationInfoRecord('Provider', '', 'provider_name', true,
+    new PresentationInfoRecord('Provider', '', 'providerName', true,
         'The AutocompleteProvider suggesting this result.'),
     new PresentationInfoRecord('Type', '', 'type', true,
         'The type of the result.'),
@@ -115,7 +115,7 @@
     new PresentationInfoRecord('Contents', '', 'contents', true,
         'The text that is presented identifying the result.'),
     new PresentationInfoRecord(
-        'Can Be Default', '', 'allowed_to_be_default_match', false,
+        'Can Be Default', '', 'allowedToBeDefaultMatch', false,
         'A green checkmark indicates that the result can be the default ' +
         'match (i.e., can be the match that pressing enter in the omnibox ' +
         'navigates to).'),
@@ -123,18 +123,18 @@
         'A green checkmark indicates that the result has been bookmarked.'),
     new PresentationInfoRecord('Description', '', 'description', false,
         'The page title of the result.'),
-    new PresentationInfoRecord('URL', '', 'destination_url', true,
+    new PresentationInfoRecord('URL', '', 'destinationUrl', true,
         'The URL for the result.'),
-    new PresentationInfoRecord('Fill Into Edit', '', 'fill_into_edit', false,
+    new PresentationInfoRecord('Fill Into Edit', '', 'fillIntoEdit', false,
         'The text shown in the omnibox when the result is selected.'),
     new PresentationInfoRecord(
-        'Inline Autocompletion', '', 'inline_autocompletion', false,
+        'Inline Autocompletion', '', 'inlineAutocompletion', false,
         'The text shown in the omnibox as a blue highlight selection ' +
         'following the cursor, if this match is shown inline.'),
     new PresentationInfoRecord('Del', '', 'deletable', false,
         'A green checkmark indicates that the result can be deleted from ' +
         'the visit history.'),
-    new PresentationInfoRecord('Prev', '', 'from_previous', false, ''),
+    new PresentationInfoRecord('Prev', '', 'fromPrevious', false, ''),
     new PresentationInfoRecord(
         'Tran',
         'http://code.google.com/codesearch#OAMlx_jo-ck/src/content/public/' +
@@ -142,11 +142,11 @@
         'transition', false,
         'How the user got to the result.'),
     new PresentationInfoRecord(
-        'Done', '', 'provider_done', false,
+        'Done', '', 'providerDone', false,
         'A green checkmark indicates that the provider is done looking for ' +
         'more results.'),
     new PresentationInfoRecord(
-        'Associated Keyword', '', 'associated_keyword', false,
+        'Associated Keyword', '', 'associatedKeyword', false,
         'If non-empty, a "press tab to search" hint will be shown and will ' +
         'engage this keyword.'),
     new PresentationInfoRecord(
@@ -157,14 +157,14 @@
         'The number of matches that have been marked as duplicates of this ' +
         'match.'),
     new PresentationInfoRecord(
-        'Additional Info', '', 'additional_info', false,
+        'Additional Info', '', 'additionalInfo', false,
         'Provider-specific information about the result.')
   ];
 
   /**
    * Returns an HTML Element of type table row that contains the
    * headers we'll use for labeling the columns.  If we're in
-   * detailed_mode, we use all the headers.  If not, we only use ones
+   * detailedMode, we use all the headers.  If not, we only use ones
    * marked displayAlways.
    */
   function createAutocompleteResultTableHeader() {
@@ -203,9 +203,9 @@
                                                   propertyName) {
     var cell = document.createElement('td');
     if (propertyName in autocompleteSuggestion) {
-      if (propertyName == 'additional_info') {
-        // |additional_info| embeds a two-column table of provider-specific data
-        // within this cell. |additional_info| is an array of
+      if (propertyName == 'additionalInfo') {
+        // |additionalInfo| embeds a two-column table of provider-specific data
+        // within this cell. |additionalInfo| is an array of
         // AutocompleteAdditionalInfo.
         var additionalInfoTable = document.createElement('table');
         for (var i = 0; i < autocompleteSuggestion[propertyName].length; i++) {
@@ -281,18 +281,18 @@
     if (inDetailedMode || showIncompleteResults) {
       var p1 = document.createElement('p');
       p1.textContent = 'elapsed time = ' +
-          result.time_since_omnibox_started_ms + 'ms';
+          result.timeSinceOmniboxStartedMs + 'ms';
       output.appendChild(p1);
       var p2 = document.createElement('p');
       p2.textContent = 'all providers done = ' + result.done;
       output.appendChild(p2);
       var p3 = document.createElement('p');
       p3.textContent = 'host = ' + result.host;
-      if ('is_typed_host' in result) {
-        // Only output the is_typed_host information if available.  (It may
+      if ('isTypedHost' in result) {
+        // Only output the isTypedHost information if available.  (It may
         // be missing if the history database lookup failed.)
-        p3.textContent = p3.textContent + ' has is_typed_host = ' +
-            result.is_typed_host;
+        p3.textContent = p3.textContent + ' has isTypedHost = ' +
+            result.isTypedHost;
       }
       output.appendChild(p3);
     }
@@ -305,7 +305,7 @@
 
     // Add combined/merged result table.
     var p = document.createElement('p');
-    p.appendChild(addResultTableToOutput(result.combined_results));
+    p.appendChild(addResultTableToOutput(result.combinedResults));
     output.appendChild(p);
 
     // Move forward only if you want to display per provider results.
@@ -322,8 +322,8 @@
     // Add the per-provider result tables with labels. We do not append the
     // combined/merged result table since we already have the per provider
     // results.
-    for (var i = 0; i < result.results_by_provider.length; i++) {
-      var providerResults = result.results_by_provider[i];
+    for (var i = 0; i < result.resultsByProvider.length; i++) {
+      var providerResults = result.resultsByProvider[i];
       // If we have no results we do not display anything.
       if (providerResults.results.length == 0) {
         continue;
@@ -414,39 +414,30 @@
   var browserProxy = null;
 
   function initializeProxies() {
-    return importModules([
-      'mojo/public/js/bindings',
-      'chrome/browser/ui/webui/omnibox/omnibox.mojom',
-      'content/public/renderer/frame_interfaces',
-    ]).then(function(modules) {
-      var bindings = modules[0];
-      var mojom = modules[1];
-      var frameInterfaces = modules[2];
+    browserProxy = new mojom.OmniboxPageHandlerPtr;
+    Mojo.bindInterface(mojom.OmniboxPageHandler.name,
+                       mojo.makeRequest(browserProxy).handle);
 
-      browserProxy = new mojom.OmniboxPageHandlerPtr(
-          frameInterfaces.getInterface(mojom.OmniboxPageHandler.name));
+    /** @constructor */
+    var OmniboxPageImpl = function(request) {
+      this.binding_ = new mojo.Binding(mojom.OmniboxPage, this, request);
+    };
 
-      /** @constructor */
-      var OmniboxPageImpl = function() {
-        this.binding = new bindings.Binding(mojom.OmniboxPage, this);
-      };
+    OmniboxPageImpl.prototype = {
+      /** @override */
+      handleNewAutocompleteResult: function(result) {
+        progressiveAutocompleteResults.push(result);
+        refresh();
+      },
+    };
 
-      OmniboxPageImpl.prototype = {
-        /** @override */
-        handleNewAutocompleteResult: function(result) {
-          progressiveAutocompleteResults.push(result);
-          refresh();
-        },
-      };
-
-      pageImpl = new OmniboxPageImpl();
-      browserProxy.setClientPage(pageImpl.binding.createInterfacePtrAndBind());
-    });
+    var client = new mojom.OmniboxPagePtr;
+    pageImpl = new OmniboxPageImpl(mojo.makeRequest(client));
+    browserProxy.setClientPage(client);
   }
 
   document.addEventListener('DOMContentLoaded', function() {
-    return initializeProxies().then(function() {
-      initialize();
-    });
+    initializeProxies();
+    initialize();
   });
 })();
diff --git a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_cell.mm b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_cell.mm
index 2350df54..d0f2a2e3 100644
--- a/chrome/browser/ui/cocoa/omnibox/omnibox_popup_cell.mm
+++ b/chrome/browser/ui/cocoa/omnibox/omnibox_popup_cell.mm
@@ -636,6 +636,7 @@
       cellFrame, NSOffsetRect(cellFrame, origin.x, origin.y));
   renderRect.size.width =
       std::min(NSWidth(renderRect), static_cast<CGFloat>(maxWidth));
+  renderRect.size.height = std::min(NSWidth(renderRect), kDefaultTextHeight);
   if (!NSIsEmptyRect(renderRect)) {
     [attributedString drawWithRect:FlipIfRTL(renderRect, cellFrame)
                            options:NSStringDrawingUsesLineFragmentOrigin |
diff --git a/chrome/browser/ui/layout_constants.cc b/chrome/browser/ui/layout_constants.cc
index 9fd179c6..06dbe30d3 100644
--- a/chrome/browser/ui/layout_constants.cc
+++ b/chrome/browser/ui/layout_constants.cc
@@ -12,8 +12,10 @@
   const bool hybrid = ui::MaterialDesignController::GetMode() ==
                       ui::MaterialDesignController::MATERIAL_HYBRID;
   switch (constant) {
+    case LOCATION_BAR_BUBBLE_VERTICAL_PADDING:
+      return hybrid ? 1 : 3;
     case LOCATION_BAR_BUBBLE_FONT_VERTICAL_PADDING:
-      return hybrid ? 4 : 2;
+      return hybrid ? 3 : 2;
     case LOCATION_BAR_BUBBLE_ANCHOR_VERTICAL_INSET:
       if (ui::MaterialDesignController::IsSecondaryUiMaterial())
         return 1;
diff --git a/chrome/browser/ui/layout_constants.h b/chrome/browser/ui/layout_constants.h
index aff8a33..fbd87d7 100644
--- a/chrome/browser/ui/layout_constants.h
+++ b/chrome/browser/ui/layout_constants.h
@@ -9,6 +9,10 @@
 #include "ui/gfx/geometry/size.h"
 
 enum LayoutConstant {
+  // The vertical padding (additional to TOOLBAR_ELEMENT_PADDING) above and
+  // below location bar bubbles.
+  LOCATION_BAR_BUBBLE_VERTICAL_PADDING,
+
   // The vertical padding between the edge of a location bar bubble and its
   // contained text.
   LOCATION_BAR_BUBBLE_FONT_VERTICAL_PADDING,
diff --git a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
index 0cc5107..f12b9907 100644
--- a/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
+++ b/chrome/browser/ui/views/importer/import_lock_dialog_view.cc
@@ -63,10 +63,7 @@
 void ImportLockDialogView::Layout() {
   gfx::Rect bounds(GetLocalBounds());
   const ChromeLayoutProvider* provider = ChromeLayoutProvider::Get();
-  bounds.Inset(provider->GetDistanceMetric(
-                   views::DISTANCE_DIALOG_CONTENTS_HORIZONTAL_MARGIN),
-               provider->GetDistanceMetric(
-                   views::DISTANCE_DIALOG_CONTENTS_VERTICAL_MARGIN));
+  bounds.Inset(provider->GetInsetsMetric(views::INSETS_DIALOG_CONTENTS));
   description_label_->SetBoundsRect(bounds);
 }
 
diff --git a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
index de83948..210a4c6 100644
--- a/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
+++ b/chrome/browser/ui/views/location_bar/icon_label_bubble_view.cc
@@ -123,7 +123,7 @@
   // the bubble should be smaller, so use an empty border to shrink down the
   // content bounds so the background gets painted correctly.
   SetBorder(views::CreateEmptyBorder(
-      gfx::Insets(LocationBarView::kBubbleVerticalPadding, 0)));
+      gfx::Insets(GetLayoutConstant(LOCATION_BAR_BUBBLE_VERTICAL_PADDING), 0)));
 
   set_notify_enter_exit_on_child(true);
 
diff --git a/chrome/browser/ui/views/location_bar/keyword_hint_view.cc b/chrome/browser/ui/views/location_bar/keyword_hint_view.cc
index 4e4dcc61..5a19d58 100644
--- a/chrome/browser/ui/views/location_bar/keyword_hint_view.cc
+++ b/chrome/browser/ui/views/location_bar/keyword_hint_view.cc
@@ -11,6 +11,7 @@
 #include "base/macros.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/search_engines/template_url_service_factory.h"
+#include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/views/location_bar/background_with_1_px_border.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_view.h"
 #include "chrome/grit/generated_resources.h"
@@ -65,7 +66,7 @@
   chip_label_->SetBackgroundColor(tab_bg_color);
 
   chip_container_->SetBorder(views::CreateEmptyBorder(
-      gfx::Insets(LocationBarView::kBubbleVerticalPadding, 0)));
+      gfx::Insets(GetLayoutConstant(LOCATION_BAR_BUBBLE_VERTICAL_PADDING), 0)));
   chip_container_->SetBackground(base::MakeUnique<BackgroundWith1PxBorder>(
       tab_bg_color, tab_border_color));
   chip_container_->AddChildView(chip_label_);
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc
index 3603e71..0d88605 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.cc
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -173,7 +173,7 @@
 
   // Determine the font for use inside the bubbles.
   const int bubble_padding =
-      kBubbleVerticalPadding +
+      GetLayoutConstant(LOCATION_BAR_BUBBLE_VERTICAL_PADDING) +
       GetLayoutConstant(LOCATION_BAR_BUBBLE_FONT_VERTICAL_PADDING);
   const int bubble_height = location_height - (bubble_padding * 2);
 
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.h b/chrome/browser/ui/views/location_bar/location_bar_view.h
index 3f567992..506285c 100644
--- a/chrome/browser/ui/views/location_bar/location_bar_view.h
+++ b/chrome/browser/ui/views/location_bar/location_bar_view.h
@@ -106,9 +106,6 @@
   // each icon view should be kIconWidth + 2 * kIconInteriorPadding.
   static constexpr int kIconInteriorPadding = 4;
 
-  // The additional vertical padding of a bubble.
-  static constexpr int kBubbleVerticalPadding = 3;
-
   // The location bar view's class name.
   static const char kViewClassName[];
 
diff --git a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
index 4250a66..b6a7a62 100644
--- a/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
+++ b/chrome/browser/ui/views/passwords/account_chooser_dialog_view.cc
@@ -43,8 +43,9 @@
   views::ColumnSet* column_set = layout->AddColumnSet(type);
   const int horizontal_padding =
       type == SINGLE_VIEW_COLUMN_SET
-          ? ChromeLayoutProvider::Get()->GetDistanceMetric(
-                views::DISTANCE_DIALOG_CONTENTS_HORIZONTAL_MARGIN)
+          ? ChromeLayoutProvider::Get()
+                ->GetInsetsMetric(views::INSETS_DIALOG_CONTENTS)
+                .left()
           : 0;
   column_set->AddPaddingColumn(0, horizontal_padding);
   column_set->AddColumn(views::GridLayout::FILL,
diff --git a/chrome/browser/ui/views/profiles/profile_chooser_view.cc b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
index bfc03b8..f68f6d6 100644
--- a/chrome/browser/ui/views/profiles/profile_chooser_view.cc
+++ b/chrome/browser/ui/views/profiles/profile_chooser_view.cc
@@ -481,9 +481,9 @@
     int back_button_width = back_button_->GetPreferredSize().width();
     back_button_->SetBounds(0, 0, back_button_width, height());
     int label_padding =
-        back_button_width +
-        ChromeLayoutProvider::Get()->GetDistanceMetric(
-            views::DISTANCE_DIALOG_CONTENTS_HORIZONTAL_MARGIN);
+        back_button_width + ChromeLayoutProvider::Get()
+                                ->GetInsetsMetric(views::INSETS_DIALOG_CONTENTS)
+                                .left();
     int label_width = width() - 2 * label_padding;
     DCHECK_GT(label_width, 0);
     title_label_->SetBounds(label_padding, 0, label_width, height());
diff --git a/chrome/browser/ui/webui/omnibox/BUILD.gn b/chrome/browser/ui/webui/omnibox/BUILD.gn
index 30f9b31..bf547a0 100644
--- a/chrome/browser/ui/webui/omnibox/BUILD.gn
+++ b/chrome/browser/ui/webui/omnibox/BUILD.gn
@@ -8,7 +8,4 @@
   sources = [
     "omnibox.mojom",
   ]
-
-  # TODO(crbug.com/699569): Convert to use the new JS bindings.
-  use_new_js_bindings = false
 }
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_ui.cc b/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
index 439115e..2568cda 100644
--- a/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
+++ b/chrome/browser/ui/webui/omnibox/omnibox_ui.cc
@@ -20,7 +20,7 @@
       content::WebUIDataSource::Create(chrome::kChromeUIOmniboxHost);
   source->AddResourcePath("omnibox.css", IDR_OMNIBOX_CSS);
   source->AddResourcePath("omnibox.js", IDR_OMNIBOX_JS);
-  source->AddResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom",
+  source->AddResourcePath("chrome/browser/ui/webui/omnibox/omnibox.mojom.js",
                           IDR_OMNIBOX_MOJO_JS);
   source->SetDefaultResource(IDR_OMNIBOX_HTML);
 
diff --git a/chrome/common/net/x509_certificate_model_unittest.cc b/chrome/common/net/x509_certificate_model_unittest.cc
index 0aeb057..450844d 100644
--- a/chrome/common/net/x509_certificate_model_unittest.cc
+++ b/chrome/common/net/x509_certificate_model_unittest.cc
@@ -76,8 +76,8 @@
 
     EXPECT_EQ("Certificate Subject Key ID", extensions[1].name);
     EXPECT_EQ(
-        "notcrit\nKey ID: BC F7 30 D1 3C C0 F2 79 FA EF 9F C9 6C 5C 93 F3\n8A "
-        "68 AB 83",
+        "notcrit\nKey ID: 9B 26 0B 8A 98 A9 BB 1D B9 1F 1C E3 1A 40 33 ED\n8E "
+        "17 88 AB",
         extensions[1].value);
 
     EXPECT_EQ("Certificate Key Usage", extensions[2].name);
@@ -330,10 +330,10 @@
         net::GetTestCertsDirectory(), "root_ca_cert.pem"));
     ASSERT_TRUE(cert.get());
 
-    EXPECT_EQ("PKCS #1 SHA-1 With RSA Encryption",
+    EXPECT_EQ("PKCS #1 SHA-256 With RSA Encryption",
               x509_certificate_model::ProcessSecAlgorithmSignature(
                   cert->os_cert_handle()));
-    EXPECT_EQ("PKCS #1 SHA-1 With RSA Encryption",
+    EXPECT_EQ("PKCS #1 SHA-256 With RSA Encryption",
               x509_certificate_model::ProcessSecAlgorithmSignatureWrap(
                   cert->os_cert_handle()));
     EXPECT_EQ("PKCS #1 RSA Encryption",
@@ -365,22 +365,22 @@
 
     EXPECT_EQ(
         "Modulus (2048 bits):\n"
-        "  B6 49 41 E3 42 01 51 A8 7F 3C 7A 71 D3 FB CD 91\n"
-        "35 17 84 1A 8E F6 36 C7 D1 70 1D FA 86 F3 6E BB\n"
-        "76 6F E8 32 2E 37 FD 38 92 3D 68 E4 8A 7D 42 33\n"
-        "14 46 1B DC 04 F6 91 6E 54 40 C4 0A 09 FD EC 2D\n"
-        "62 E2 5E E1 BA 2C 9C C1 B1 60 4C DA C7 F8 22 5C\n"
-        "82 20 65 42 1E 56 77 75 4F EB 90 2C 4A EA 57 0E\n"
-        "22 8D 6C 95 AC 11 EA CC D7 EE F6 70 0D 09 DD A6\n"
-        "35 61 5D C9 76 6D B0 F2 1E BF 30 86 D8 77 52 36\n"
-        "95 97 0E D1 46 C5 ED 81 3D 1B B0 F2 61 95 3C C1\n"
-        "40 38 EF 5F 5D BA 61 9F EF 2B 9C 9F 85 89 74 70\n"
-        "63 D5 76 E8 35 7E CE 01 E1 F3 11 11 90 1C 0D F5\n"
-        "FD 8D CE 10 6C AD 7C 55 1A 21 6F D7 2D F4 78 15\n"
-        "EA 2F 38 BD 91 9E 3C 1D 07 46 F5 43 C1 82 8B AF\n"
-        "12 53 65 19 8A 69 69 66 06 B2 DA 0B FA 2A 00 A1\n"
-        "2A 15 84 49 F1 01 BF 9B 30 06 D0 15 A0 1F 9D 51\n"
-        "91 47 E1 53 5F EF 5E EC C2 61 79 C2 14 9F C4 E3\n"
+        "  C6 81 1F 92 73 B6 58 85 D9 8D AC B7 20 FD C7 BF\n"
+        "40 B2 EA FA E5 0B 52 01 8F 9A C1 EB 7A 80 C1 F3\n"
+        "89 A4 3E D5 1B 61 CC B5 CF 80 B1 1A DB BB 25 E0\n"
+        "18 BF 92 69 26 50 CD E7 3F FF 0D 3C B4 1F 14 12\n"
+        "AB 67 37 DE 07 03 6C 12 74 82 36 AC C3 D4 D3 64\n"
+        "9F 91 ED 5B F6 A9 7A A4 9C 98 E8 65 6C 94 E1 CB\n"
+        "55 73 AE F8 1D 50 B0 78 E5 74 FF B1 37 2C CB 19\n"
+        "3D A4 8C E7 76 4E 86 5C 3F DF B3 ED 45 23 4F 54\n"
+        "9B 33 C6 89 5E 13 1D DD 7D 59 A5 07 34 28 86 27\n"
+        "1F FA 9E 53 4F 2A B6 42 AD 37 12 62 F5 72 36 B6\n"
+        "02 12 40 44 FE C7 9E 95 89 43 51 5E B4 6E C7 67\n"
+        "80 58 43 BE CC 07 28 BD 59 FF 1C 4C 8D 90 42 F4\n"
+        "CF FD 54 00 4F 48 72 2B E1 67 3C 84 17 68 95 BF\n"
+        "CA 07 7B DF 86 9D 56 E3 32 E3 70 87 B7 F8 3A F7\n"
+        "E3 6E 65 14 7C BB 76 B7 17 F1 42 8C 6F 2A 34 64\n"
+        "10 35 14 8C 85 F6 57 BF F3 5C 55 9D AD 03 10 F3\n"
         "\n"
         "  Public Exponent (24 bits):\n"
         "  01 00 01",
@@ -409,22 +409,22 @@
   ASSERT_TRUE(cert.get());
 
   EXPECT_EQ(
-      "57 07 29 FB 7F E8 FF B0 E6 D8 58 6A C3 90 A1 38\n"
-      "1C B4 F3 68 B1 EC E8 89 23 24 D7 A8 F2 21 C3 60\n"
-      "E4 A4 49 5C 00 BF DF C7 82 78 80 2B 18 F7 AD DD\n"
-      "D0 62 5E A7 B0 CC F0 AA B4 CE 70 12 59 65 67 76\n"
-      "05 00 18 9A FF C4 2A 17 E3 F1 55 D8 BE 5C 5E EB\n"
-      "CA CB 53 87 10 D5 09 32 36 A7 5E 41 F4 53 DA 7E\n"
-      "56 60 D2 7E 4E 9A A5 08 5F 5D 75 E9 E7 30 CB 22\n"
-      "E9 EF 19 49 83 A5 23 A1 F8 60 4C E5 36 D5 39 78\n"
-      "18 F1 5E BF CE AA 0B 53 81 2C 78 A9 0A 6B DB 13\n"
-      "10 21 14 7F 1B 70 3D 89 1A 40 8A 06 2C 5D 50 19\n"
-      "62 F9 C7 45 89 F2 3D 66 05 3D 7D 75 5B 55 1E 80\n"
-      "42 72 A1 9A 7C 6D 0A 74 F6 EE A6 21 6C 3A 98 FB\n"
-      "77 82 5F F2 6B 56 E6 DD 9B 8E 50 F0 C6 AE FD EA\n"
-      "A6 05 07 A9 26 06 56 B3 B2 D9 B2 37 A0 21 3E 79\n"
-      "06 1F B9 51 BE F4 B1 49 4D 90 B5 33 E5 0E C7 5E\n"
-      "5B 40 C5 6A 04 D1 43 7A 94 6A A4 4F 61 FC 82 E0",
+      "5B 53 FF 6D D5 0A 43 A5 0F D4 7D C6 5D 88 E3 98\n"
+      "9D 67 EB 32 82 B3 0F F5 C1 78 F8 05 4A BF BC 21\n"
+      "05 EE 21 08 2C B2 15 A1 B8 B2 F6 A3 15 61 E4 C1\n"
+      "AD 84 A4 A7 40 0C 87 09 5F 2B 1B F9 4D 6C 92 7D\n"
+      "CB 7E 2B B0 01 0A ED 40 E5 4E AF 1A F1 0D EC 1D\n"
+      "9E 96 C7 D4 61 64 39 23 FA 5F 29 C4 2A 3A B8 ED\n"
+      "8A 72 50 6A AC 45 04 76 09 A8 3D 57 D7 F0 4B AE\n"
+      "46 B4 83 C1 14 50 2A 19 59 53 B2 4D AE FC 2F 40\n"
+      "49 C8 AD 4D 9D C8 22 8D 8C 01 DB 31 33 5A F4 BC\n"
+      "4C 9B ED D7 E3 43 D9 E8 1D 53 8B 30 D8 81 9E 72\n"
+      "AB 9E CE B8 F5 83 93 F2 72 DB DE CD B0 52 9A 45\n"
+      "4D CF E7 21 D8 CE 16 64 8F 42 AF C1 87 A8 F9 D5\n"
+      "E2 03 DD BA 6B 1B 7C 7D A0 38 33 61 39 B4 DD 5C\n"
+      "69 17 79 02 3A EC 1D 6F 5E BB 13 FB A6 82 5D 07\n"
+      "20 FC 86 FE 6E 8B AC E1 C2 18 A2 FE 3F 95 66 D3\n"
+      "69 8A 00 06 2C 56 37 34 B9 B6 31 DE 0F F6 44 39",
       x509_certificate_model::ProcessRawBitsSignatureWrap(
           cert->os_cert_handle()));
 }
diff --git a/chrome/test/base/mash_browser_tests_main.cc b/chrome/test/base/mash_browser_tests_main.cc
index dbdeaf1..aca66ca7 100644
--- a/chrome/test/base/mash_browser_tests_main.cc
+++ b/chrome/test/base/mash_browser_tests_main.cc
@@ -18,6 +18,7 @@
 #include "base/process/launch.h"
 #include "base/run_loop.h"
 #include "base/sys_info.h"
+#include "base/task_scheduler/task_scheduler.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "base/values.h"
 #include "chrome/app/mash/embedded_services.h"
@@ -189,9 +190,14 @@
     base::debug::EnableInProcessStackDumping();
 #endif
 
+    base::TaskScheduler::CreateAndStartWithDefaultParams("StandaloneService");
+
     command_line->AppendSwitch(ui::switches::kUseTestConfig);
     service_manager::RunStandaloneService(base::Bind(&StartEmbeddedService));
     *exit_code = 0;
+
+    base::TaskScheduler::GetInstance()->Shutdown();
+
     return true;
   }
 
diff --git a/chrome/test/chromedriver/VERSION b/chrome/test/chromedriver/VERSION
index 072e6513..81b133a 100644
--- a/chrome/test/chromedriver/VERSION
+++ b/chrome/test/chromedriver/VERSION
@@ -1 +1 @@
-2.29
+2.30
diff --git a/chrome/test/data/webui/bluetooth_internals_browsertest.js b/chrome/test/data/webui/bluetooth_internals_browsertest.js
index a7ab6ad..4cf4ec1 100644
--- a/chrome/test/data/webui/bluetooth_internals_browsertest.js
+++ b/chrome/test/data/webui/bluetooth_internals_browsertest.js
@@ -38,7 +38,7 @@
     ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js',
     ROOT_PATH + 'ui/webui/resources/js/cr.js',
     ROOT_PATH + 'ui/webui/resources/js/util.js',
-    ROOT_PATH + 'chrome/test/data/webui/settings/test_browser_proxy.js',
+    ROOT_PATH + 'chrome/test/data/webui/test_browser_proxy.js',
   ],
 
   preLoad: function() {
@@ -57,10 +57,10 @@
          * page.
          *
          * @constructor
-         * @extends {TestBrowserProxyBase}
+         * @extends {TestBrowserProxy}
          */
         var TestAdapterFactoryProxy = function() {
-          settings.TestBrowserProxy.call(this, [
+          TestBrowserProxy.call(this, [
             'getAdapter',
           ]);
 
@@ -71,7 +71,7 @@
         };
 
         TestAdapterFactoryProxy.prototype = {
-          __proto__: settings.TestBrowserProxy.prototype,
+          __proto__: TestBrowserProxy.prototype,
           getAdapter: function() {
             this.methodCalled('getAdapter');
 
@@ -85,10 +85,10 @@
         /**
          * A test adapter proxy for the chrome://bluetooth-internals page.
          * @constructor
-         * @extends {TestBrowserProxyBase}
+         * @extends {TestBrowserProxy}
          */
         var TestAdapterProxy = function() {
-          settings.TestBrowserProxy.call(this, [
+          TestBrowserProxy.call(this, [
             'getInfo',
             'getDevices',
             'setClient',
@@ -101,7 +101,7 @@
         };
 
         TestAdapterProxy.prototype = {
-          __proto__: settings.TestBrowserProxy.prototype,
+          __proto__: TestBrowserProxy.prototype,
 
           connectToDevice: function(address) {
             assert(this.deviceProxyMap.has(address), 'Device does not exist');
@@ -149,11 +149,11 @@
          * page. Proxies are generated by a TestAdapterProxy which provides
          * the DeviceInfo.
          * @constructor
-         * @extends {TestBrowserProxyBase}
+         * @extends {TestBrowserProxy}
          * @param {!device.DeviceInfo} info
          */
         var TestDeviceProxy = function(info) {
-          settings.TestBrowserProxy.call(this, [
+          TestBrowserProxy.call(this, [
             'getInfo',
             'getServices',
           ]);
@@ -164,7 +164,7 @@
         }
 
         TestDeviceProxy.prototype = {
-          __proto__: settings.TestBrowserProxy.prototype,
+          __proto__: TestBrowserProxy.prototype,
 
           disconnect: function() {
             this.binding.close();
diff --git a/chrome/test/data/webui/md_user_manager/test_profile_browser_proxy.js b/chrome/test/data/webui/md_user_manager/test_profile_browser_proxy.js
index 3f803a8..aa78559 100644
--- a/chrome/test/data/webui/md_user_manager/test_profile_browser_proxy.js
+++ b/chrome/test/data/webui/md_user_manager/test_profile_browser_proxy.js
@@ -7,10 +7,10 @@
  *
  * @constructor
  * @implements {signin.ProfileBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestProfileBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'getAvailableIcons',
     'getSignedInUsers',
     'launchGuestUser',
@@ -39,7 +39,7 @@
 };
 
 TestProfileBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /**
    * @param {!Array<!AvatarIcon>} icons
diff --git a/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js b/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js
index e204d7c..931f2be 100644
--- a/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js
+++ b/chrome/test/data/webui/md_user_manager/user_manager_browsertest.js
@@ -25,7 +25,7 @@
 
   /** @override */
   extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([
-    '../settings/test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'control_bar_tests.js',
     'create_profile_tests.js',
     'import_supervised_user_tests.js',
diff --git a/chrome/test/data/webui/print_preview/native_layer_stub.js b/chrome/test/data/webui/print_preview/native_layer_stub.js
index 92f9f29..33aca5f 100644
--- a/chrome/test/data/webui/print_preview/native_layer_stub.js
+++ b/chrome/test/data/webui/print_preview/native_layer_stub.js
@@ -6,10 +6,10 @@
   /**
   * Test version of the native layer.
   * @constructor
-  * @extends {settings.TestBrowserProxy}
+  * @extends {TestBrowserProxy}
   */
   function NativeLayerStub() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
         'getInitialSettings', 'getPrinters', 'setupPrinter' ]);
 
     /**
@@ -65,7 +65,7 @@
   }
 
   NativeLayerStub.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     getInitialSettings: function() {
diff --git a/chrome/test/data/webui/print_preview/print_preview_destination_search_test.js b/chrome/test/data/webui/print_preview/print_preview_destination_search_test.js
index f22b75ff..eb665ca 100644
--- a/chrome/test/data/webui/print_preview/print_preview_destination_search_test.js
+++ b/chrome/test/data/webui/print_preview/print_preview_destination_search_test.js
@@ -25,7 +25,7 @@
 
   /** @override */
   extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([
-      ROOT_PATH + 'chrome/test/data/webui/settings/test_browser_proxy.js',
+      ROOT_PATH + 'chrome/test/data/webui/test_browser_proxy.js',
       'native_layer_stub.js',
     ]),
 
diff --git a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
index ef6c932..f0f47db 100644
--- a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
+++ b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
@@ -55,7 +55,7 @@
     ROOT_PATH + 'third_party/mocha/mocha.js',
     ROOT_PATH + 'chrome/test/data/webui/mocha_adapter.js',
     ROOT_PATH + 'ui/webui/resources/js/util.js',
-    ROOT_PATH + 'chrome/test/data/webui/settings/test_browser_proxy.js',
+    ROOT_PATH + 'chrome/test/data/webui/test_browser_proxy.js',
     'print_preview_tests.js',
     'native_layer_stub.js',
   ],
diff --git a/chrome/test/data/webui/settings/about_page_tests.js b/chrome/test/data/webui/settings/about_page_tests.js
index 32837a6..d2d69132 100644
--- a/chrome/test/data/webui/settings/about_page_tests.js
+++ b/chrome/test/data/webui/settings/about_page_tests.js
@@ -6,7 +6,7 @@
   /**
    * @constructor
    * @implements {settings.AboutPageBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestAboutPageBrowserProxy = function() {
     var methodNames = [
@@ -27,7 +27,7 @@
     if (cr.isMac)
       methodNames.push('promoteUpdater');
 
-    settings.TestBrowserProxy.call(this, methodNames);
+    TestBrowserProxy.call(this, methodNames);
 
     /** @private {!UpdateStatus} */
     this.updateStatus_ = UpdateStatus.UPDATED;
@@ -53,7 +53,7 @@
   };
 
   TestAboutPageBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @param {!UpdateStatus} updateStatus */
     setUpdateStatus: function(updateStatus) {
diff --git a/chrome/test/data/webui/settings/android_apps_page_test.js b/chrome/test/data/webui/settings/android_apps_page_test.js
index 64cf36d..ccc51f0 100644
--- a/chrome/test/data/webui/settings/android_apps_page_test.js
+++ b/chrome/test/data/webui/settings/android_apps_page_test.js
@@ -5,17 +5,17 @@
 /**
  * @constructor
  * @implements {settings.AndroidAppsBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 function TestAndroidAppsBrowserProxy() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'requestAndroidAppsInfo',
     'showAndroidAppsSettings',
   ]);
 }
 
 TestAndroidAppsBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @override */
   requestAndroidAppsInfo: function() {
diff --git a/chrome/test/data/webui/settings/appearance_fonts_page_test.js b/chrome/test/data/webui/settings/appearance_fonts_page_test.js
index 84f90d5..6cf466a4 100644
--- a/chrome/test/data/webui/settings/appearance_fonts_page_test.js
+++ b/chrome/test/data/webui/settings/appearance_fonts_page_test.js
@@ -5,10 +5,10 @@
 /**
  * @constructor
  * @implements {settings.FontsBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestFontsBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'fetchFontsData',
     'observeAdvancedFontExtensionAvailable',
     'openAdvancedFontSettings',
@@ -22,7 +22,7 @@
 };
 
 TestFontsBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @override */
   fetchFontsData: function() {
diff --git a/chrome/test/data/webui/settings/appearance_page_test.js b/chrome/test/data/webui/settings/appearance_page_test.js
index bc3cb04..dd7e859c 100644
--- a/chrome/test/data/webui/settings/appearance_page_test.js
+++ b/chrome/test/data/webui/settings/appearance_page_test.js
@@ -5,10 +5,10 @@
 /**
  * @constructor
  * @implements {settings.AppearanceBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestAppearanceBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'getDefaultZoom',
     'getThemeInfo',
     'isSupervised',
@@ -29,7 +29,7 @@
 };
 
 TestAppearanceBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @override */
   getDefaultZoom: function() {
@@ -289,4 +289,4 @@
           assertEquals(homeUrlInput.value, 'test');
         });
   });
-});
\ No newline at end of file
+});
diff --git a/chrome/test/data/webui/settings/basic_page_browsertest.js b/chrome/test/data/webui/settings/basic_page_browsertest.js
index 66533a1..fcf5a38 100644
--- a/chrome/test/data/webui/settings/basic_page_browsertest.js
+++ b/chrome/test/data/webui/settings/basic_page_browsertest.js
@@ -17,7 +17,7 @@
 
   /** @override */
   extraLibraries: SettingsPageBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
   ]),
 };
 
@@ -39,10 +39,10 @@
    * This fake SearchManager just hides and re-displays the sections on search.
    *
    * @implements {SearchManager}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestSearchManager = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'search',
     ]);
 
@@ -51,7 +51,7 @@
   }
 
   TestSearchManager.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     search: function(text, page) {
diff --git a/chrome/test/data/webui/settings/certificate_manager_page_test.js b/chrome/test/data/webui/settings/certificate_manager_page_test.js
index 5204b80..712d2e38 100644
--- a/chrome/test/data/webui/settings/certificate_manager_page_test.js
+++ b/chrome/test/data/webui/settings/certificate_manager_page_test.js
@@ -10,10 +10,10 @@
    *
    * @constructor
    * @implements {settings.CertificatesBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestCertificatesBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'deleteCertificate',
       'editCaCertificateTrust',
       'exportCertificate',
@@ -37,7 +37,7 @@
   };
 
   TestCertificatesBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /**
      * @param {!CaTrustInfo} caTrustInfo
diff --git a/chrome/test/data/webui/settings/chrome_cleanup_page_test.js b/chrome/test/data/webui/settings/chrome_cleanup_page_test.js
index fb7fb53..cd619a6 100644
--- a/chrome/test/data/webui/settings/chrome_cleanup_page_test.js
+++ b/chrome/test/data/webui/settings/chrome_cleanup_page_test.js
@@ -5,10 +5,10 @@
 /**
  * @constructor
  * @implements {settings.ChromeCleanupProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestChromeCleanupProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'dismissCleanupPage',
     'getChromeCleanupVisibility',
     'registerChromeCleanupObserver',
@@ -18,7 +18,7 @@
 };
 
 TestChromeCleanupProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @override */
   dismissCleanupPage: function() {
diff --git a/chrome/test/data/webui/settings/cr_settings_browsertest.js b/chrome/test/data/webui/settings/cr_settings_browsertest.js
index 1cf266d6..c402224 100644
--- a/chrome/test/data/webui/settings/cr_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/cr_settings_browsertest.js
@@ -188,7 +188,7 @@
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     'test_util.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_lifetime_browser_proxy.js',
     'about_page_tests.js',
   ]),
@@ -344,7 +344,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'fingerprint_browsertest_chromeos.js',
   ]),
 };
@@ -370,7 +370,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'people_page_change_picture_test.js',
   ]),
 };
@@ -397,7 +397,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'people_page_manage_profile_test.js',
   ]),
 };
@@ -424,7 +424,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'people_page_test.js',
   ]),
 };
@@ -450,7 +450,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'people_page_sync_page_test.js',
   ]),
 };
@@ -499,7 +499,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_lifetime_browser_proxy.js',
     'test_reset_browser_proxy.js',
     'reset_page_test.js',
@@ -526,7 +526,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_reset_browser_proxy.js',
     'reset_profile_banner_test.js',
   ]),
@@ -551,7 +551,7 @@
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'appearance_page_test.js',
   ]),
 };
@@ -576,7 +576,7 @@
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'appearance_fonts_page_test.js',
   ]),
 };
@@ -601,7 +601,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'chrome_cleanup_page_test.js',
   ]),
 };
@@ -626,7 +626,7 @@
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'downloads_page_test.js',
   ]),
 };
@@ -652,7 +652,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'default_browser_browsertest.js',
   ]),
 };
@@ -678,7 +678,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'import_data_dialog_test.js',
   ]),
 };
@@ -703,7 +703,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_search_engines_browser_proxy.js',
     'search_page_test.js',
   ]),
@@ -730,7 +730,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_extension_control_browser_proxy.js',
     'test_search_engines_browser_proxy.js',
     'search_engines_page_test.js',
@@ -760,7 +760,7 @@
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     'test_util.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'certificate_manager_page_test.js',
   ]),
 };
@@ -788,7 +788,7 @@
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js',
     'test_util.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_privacy_page_browser_proxy.js',
     'privacy_page_test.js',
   ]),
@@ -818,7 +818,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'site_data_details_subpage_tests.js',
   ]),
@@ -842,7 +842,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'category_default_setting_tests.js',
   ]),
@@ -866,7 +866,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'category_setting_exceptions_tests.js',
   ]),
@@ -895,7 +895,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'all_sites_tests.js',
   ]),
@@ -919,7 +919,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'site_details_tests.js',
   ]),
@@ -943,7 +943,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'site_details_permission_tests.js',
   ]),
@@ -972,7 +972,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'site_list_tests.js',
   ]),
@@ -1004,7 +1004,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'zoom_levels_tests.js',
   ]),
@@ -1028,7 +1028,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'usb_devices_tests.js',
   ]),
@@ -1052,7 +1052,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'protocol_handlers_tests.js',
   ]),
@@ -1074,7 +1074,7 @@
   browsePreload: 'chrome://md-settings/site_settings/site_data.html',
 
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_site_settings_prefs_browser_proxy.js',
     'site_data_test.js',
   ]),
@@ -1249,7 +1249,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_lifetime_browser_proxy.js',
     'system_page_tests.js',
   ]),
@@ -1272,7 +1272,7 @@
   browsePreload: 'chrome://md-settings/on_startup_page/startup_urls_page.html',
 
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'startup_urls_page_test.js',
   ]),
 };
@@ -1299,7 +1299,7 @@
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     '../fake_chrome_event.js',
     'fake_settings_private.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'fake_language_settings_private.js',
     'edit_dictionary_page_test.js',
   ]),
@@ -1327,7 +1327,7 @@
     ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js',
     '../fake_chrome_event.js',
     'test_util.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'fake_language_settings_private.js',
     'fake_settings_private.js',
     'fake_input_method_private.js',
@@ -1357,7 +1357,7 @@
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     '../fake_chrome_event.js',
     'test_util.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'fake_settings_private.js',
     'fake_language_settings_private.js',
     'fake_input_method_private.js',
@@ -1503,7 +1503,7 @@
 
   /** @override */
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_util.js',
     'settings_main_test.js',
   ]),
@@ -1590,7 +1590,7 @@
   browsePreload: 'chrome://md-settings/privacy_page/privacy_page.html',
 
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_privacy_page_browser_proxy.js',
     'metrics_reporting_tests.js',
   ]),
@@ -1626,7 +1626,7 @@
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     ROOT_PATH + 'ui/webui/resources/js/assert.js',
     'test_util.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'cups_printer_page_tests.js',
   ]),
 };
@@ -1655,7 +1655,7 @@
 
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
     ROOT_PATH + 'ui/webui/resources/js/promise_resolver.js',
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'android_apps_page_test.js',
   ]),
 };
@@ -1703,7 +1703,7 @@
       'chrome://md-settings/controls/extension_controlled_indicator.html',
 
   extraLibraries: CrSettingsBrowserTest.prototype.extraLibraries.concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
     'test_extension_control_browser_proxy.js',
     'extension_controlled_indicator_tests.js',
   ]),
diff --git a/chrome/test/data/webui/settings/cups_printer_page_tests.js b/chrome/test/data/webui/settings/cups_printer_page_tests.js
index 329dc84..715fd44 100644
--- a/chrome/test/data/webui/settings/cups_printer_page_tests.js
+++ b/chrome/test/data/webui/settings/cups_printer_page_tests.js
@@ -5,10 +5,10 @@
 /**
  * @constructor
  * @implements {settings.CupsPrintersBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestCupsPrintersBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'getCupsPrintersList',
     'getCupsPrinterManufacturersList',
     'getCupsPrinterModelsList',
@@ -18,7 +18,7 @@
 };
 
 TestCupsPrintersBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   printerList: [],
   manufacturers: [],
diff --git a/chrome/test/data/webui/settings/default_browser_browsertest.js b/chrome/test/data/webui/settings/default_browser_browsertest.js
index c312ecc..4ad425d6 100644
--- a/chrome/test/data/webui/settings/default_browser_browsertest.js
+++ b/chrome/test/data/webui/settings/default_browser_browsertest.js
@@ -10,10 +10,10 @@
    *
    * @constructor
    * @implements {settings.DefaultBrowserBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestDefaultBrowserBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'requestDefaultBrowserState',
       'setAsDefaultBrowser',
     ]);
@@ -28,7 +28,7 @@
   };
 
   TestDefaultBrowserBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     requestDefaultBrowserState: function() {
diff --git a/chrome/test/data/webui/settings/downloads_page_test.js b/chrome/test/data/webui/settings/downloads_page_test.js
index c9f50ce..7d3f971 100644
--- a/chrome/test/data/webui/settings/downloads_page_test.js
+++ b/chrome/test/data/webui/settings/downloads_page_test.js
@@ -5,10 +5,10 @@
 /**
  * @constructor
  * @implements {settings.DownloadsBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestDownloadsBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'initializeDownloads',
     'selectDownloadLocation',
     'resetAutoOpenFileTypes',
@@ -16,7 +16,7 @@
 };
 
 TestDownloadsBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @override */
   initializeDownloads: function() {
diff --git a/chrome/test/data/webui/settings/easy_unlock_browsertest_chromeos.js b/chrome/test/data/webui/settings/easy_unlock_browsertest_chromeos.js
index b95b73d..dc0f9c0 100644
--- a/chrome/test/data/webui/settings/easy_unlock_browsertest_chromeos.js
+++ b/chrome/test/data/webui/settings/easy_unlock_browsertest_chromeos.js
@@ -18,7 +18,7 @@
 
   /** @override */
   extraLibraries: PolymerTest.getLibraries(ROOT_PATH).concat([
-    'test_browser_proxy.js',
+    '../test_browser_proxy.js',
   ]),
 };
 
@@ -36,10 +36,10 @@
    *
    * @constructor
    * @implements {settings.EasyUnlockBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestEasyUnlockBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'getEnabledStatus',
       'startTurnOnFlow',
       'getTurnOffFlowStatus',
@@ -52,7 +52,7 @@
   };
 
   TestEasyUnlockBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /**
      * @param {boolean} easyUnlockEnabled
diff --git a/chrome/test/data/webui/settings/fake_language_settings_private.js b/chrome/test/data/webui/settings/fake_language_settings_private.js
index 9bd3bfdc..f95ded0 100644
--- a/chrome/test/data/webui/settings/fake_language_settings_private.js
+++ b/chrome/test/data/webui/settings/fake_language_settings_private.js
@@ -32,7 +32,7 @@
     this.onInputMethodRemoved = new FakeChromeEvent();
 
     // List of method names expected to be tested with whenCalled()
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'getSpellcheckWords',
     ]);
 
@@ -110,7 +110,7 @@
   }
 
   FakeLanguageSettingsPrivate.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
     // Methods for use in testing.
 
     /** @param {SettingsPrefsElement} */
diff --git a/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js b/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js
index 8a42a3a..0c3dee9 100644
--- a/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js
+++ b/chrome/test/data/webui/settings/fingerprint_browsertest_chromeos.js
@@ -5,10 +5,10 @@
 /**
  * @constructor
  * @implements {settings.FingerprintBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestFingerprintBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'getFingerprintsList',
     'getNumFingerprints',
     'startEnroll',
@@ -25,7 +25,7 @@
 };
 
 TestFingerprintBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @ param {!Array<string>} fingerprints */
   setFingerprints: function(fingerprints) {
diff --git a/chrome/test/data/webui/settings/import_data_dialog_test.js b/chrome/test/data/webui/settings/import_data_dialog_test.js
index 66c6220..4f29a779 100644
--- a/chrome/test/data/webui/settings/import_data_dialog_test.js
+++ b/chrome/test/data/webui/settings/import_data_dialog_test.js
@@ -5,10 +5,10 @@
 /**
  * @constructor
  * @implements {settings.ImportDataBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestImportDataBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'initializeImportDialog',
     'importFromBookmarksFile',
     'importData',
@@ -19,7 +19,7 @@
 };
 
 TestImportDataBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @param {!Array<!settings.BrowserProfile} browserProfiles */
   setBrowserProfiles: function(browserProfiles) {
diff --git a/chrome/test/data/webui/settings/people_page_change_picture_test.js b/chrome/test/data/webui/settings/people_page_change_picture_test.js
index 5a20bf9..a9492a3 100644
--- a/chrome/test/data/webui/settings/people_page_change_picture_test.js
+++ b/chrome/test/data/webui/settings/people_page_change_picture_test.js
@@ -6,10 +6,10 @@
   /**
    * @constructor
    * @implements {settings.ChangePictureBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestChangePictureBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'initialize',
       'selectDefaultImage',
       'selectOldImage',
@@ -20,7 +20,7 @@
   };
 
   TestChangePictureBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     initialize: function() {
diff --git a/chrome/test/data/webui/settings/people_page_manage_profile_test.js b/chrome/test/data/webui/settings/people_page_manage_profile_test.js
index c9ccb2f..0af15d9 100644
--- a/chrome/test/data/webui/settings/people_page_manage_profile_test.js
+++ b/chrome/test/data/webui/settings/people_page_manage_profile_test.js
@@ -6,10 +6,10 @@
   /**
    * @constructor
    * @implements {settings.ManageProfileBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestManageProfileBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'getAvailableIcons',
       'setProfileIconToGaiaAvatar',
       'setProfileIconToDefaultAvatar',
@@ -24,7 +24,7 @@
   };
 
   TestManageProfileBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @param {!ProfileShortcutStatus} status */
     setProfileShortcutStatus: function(status) {
diff --git a/chrome/test/data/webui/settings/people_page_sync_page_test.js b/chrome/test/data/webui/settings/people_page_sync_page_test.js
index d222865b..686ff4c2 100644
--- a/chrome/test/data/webui/settings/people_page_sync_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_sync_page_test.js
@@ -6,10 +6,10 @@
   /**
    * @constructor
    * @implements {settings.SyncBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestSyncBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'didNavigateToSyncPage',
       'didNavigateAwayFromSyncPage',
       'setSyncDatatypes',
@@ -21,7 +21,7 @@
   };
 
   TestSyncBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     didNavigateToSyncPage: function() {
diff --git a/chrome/test/data/webui/settings/people_page_test.js b/chrome/test/data/webui/settings/people_page_test.js
index 16c7a47..ca99ca1 100644
--- a/chrome/test/data/webui/settings/people_page_test.js
+++ b/chrome/test/data/webui/settings/people_page_test.js
@@ -6,10 +6,10 @@
   /**
    * @constructor
    * @implements {settings.ProfileInfoBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestProfileInfoBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'getProfileInfo',
       'getProfileStatsCount',
       'getProfileManagesSupervisedUsers',
@@ -22,7 +22,7 @@
   };
 
   TestProfileInfoBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     getProfileInfo: function() {
@@ -45,17 +45,17 @@
   /**
    * @constructor
    * @implements {settings.SyncBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestSyncBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'getSyncStatus',
       'signOut',
     ]);
   };
 
   TestSyncBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     getSyncStatus: function() {
diff --git a/chrome/test/data/webui/settings/privacy_page_test.js b/chrome/test/data/webui/settings/privacy_page_test.js
index 50bd749..3af6cd7a 100644
--- a/chrome/test/data/webui/settings/privacy_page_test.js
+++ b/chrome/test/data/webui/settings/privacy_page_test.js
@@ -9,7 +9,7 @@
    * @implements {settings.ClearBrowsingDataBrowserProxy}
    */
   function TestClearBrowsingDataBrowserProxy() {
-    settings.TestBrowserProxy.call(
+    TestBrowserProxy.call(
         this, ['initialize', 'clearBrowsingData', 'getImportantSites']);
 
     /**
@@ -28,7 +28,7 @@
   }
 
   TestClearBrowsingDataBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @param {!Promise} promise */
     setClearBrowsingDataPromise: function(promise) {
diff --git a/chrome/test/data/webui/settings/settings_main_test.js b/chrome/test/data/webui/settings/settings_main_test.js
index 590af52..9d03322 100644
--- a/chrome/test/data/webui/settings/settings_main_test.js
+++ b/chrome/test/data/webui/settings/settings_main_test.js
@@ -10,10 +10,10 @@
    * TestProxy).
    *
    * @implements {SearchManager}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestSearchManager = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'search',
     ]);
 
@@ -25,7 +25,7 @@
   }
 
   TestSearchManager.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /**
      * @param {boolean} matchesFound
diff --git a/chrome/test/data/webui/settings/startup_urls_page_test.js b/chrome/test/data/webui/settings/startup_urls_page_test.js
index 1377b75..fa2aec6 100644
--- a/chrome/test/data/webui/settings/startup_urls_page_test.js
+++ b/chrome/test/data/webui/settings/startup_urls_page_test.js
@@ -6,10 +6,10 @@
   /**
    * @constructor
    * @implements {settings.StartupUrlsPageBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   function TestStartupUrlsPageBrowserProxy() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'addStartupPage',
       'editStartupPage',
       'loadStartupPages',
@@ -23,7 +23,7 @@
   }
 
   TestStartupUrlsPageBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @param {boolean} isValid */
     setUrlValidity: function(isValid) {
diff --git a/chrome/test/data/webui/settings/system_page_tests.js b/chrome/test/data/webui/settings/system_page_tests.js
index 1a29b99..7e27668 100644
--- a/chrome/test/data/webui/settings/system_page_tests.js
+++ b/chrome/test/data/webui/settings/system_page_tests.js
@@ -11,11 +11,11 @@
  * @implements {settings.SystemPageBrowserProxy}
  */
 function TestSystemPageBrowserProxy() {
-  settings.TestBrowserProxy.call(this, ['showProxySettings']);
+  TestBrowserProxy.call(this, ['showProxySettings']);
 }
 
 TestSystemPageBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @override */
   showProxySettings: function() {
diff --git a/chrome/test/data/webui/settings/test_browser_proxy.js b/chrome/test/data/webui/settings/test_browser_proxy.js
deleted file mode 100644
index 9d88210..0000000
--- a/chrome/test/data/webui/settings/test_browser_proxy.js
+++ /dev/null
@@ -1,89 +0,0 @@
-// Copyright 2016 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.
-
-cr.define('settings', function() {
-  /**
-   * A base class for all test browser proxies to inherit from. Provides helper
-   * methods for allowing tests to track when a method was called.
-   *
-   * Subclasses are responsible for calling |methodCalled|, when a method is
-   * called, which will trigger callers of |whenCalled| to get notified.
-   * For example:
-   * --------------------------------------------------------------------------
-   * var MyTestBrowserProxy = function() {
-   *   TestBrowserProxy.call(this, ['myMethod']);
-   * };
-   * MyTestBrowserProxy.prototype = function() {
-   *   __proto__: TestBrowserProxy.prototype,
-   *
-   *   myMethod: function(someId) {
-   *     this.methodCalled('myMethod', someId);
-   *   },
-   * };
-   *
-   * // Test code sample
-   *
-   * var testBrowserProxy = new MyTestBrowserProxy();
-   * // ...Replacing real proxy with test proxy....
-   * simulateClickFooButton();
-   * testBrowserProxy.whenCalled('fooMethod').then(function(id) {
-   *   assertEquals(EXPECTED_ID, id);
-   * });
-   * --------------------------------------------------------------------------
-   *
-   * @constructor
-   * @param {!Array<string>} methodNames Names of all methods whose calls
-   *     need to be tracked.
-   */
-  var TestBrowserProxy = function(methodNames) {
-    /** @private {!Map<string, !PromiseResolver>} */
-    this.resolverMap_ = new Map();
-    methodNames.forEach(this.resetResolver, this);
-  };
-
-  TestBrowserProxy.prototype = {
-    /**
-     * Called by subclasses when a tracked method is called from the code that
-     * is being tested.
-     * @param {string} methodName
-     * @param {*=} opt_arg Optional argument to be forwarded to the testing
-     *     code, useful for checking whether the proxy method was called with
-     *     the expected arguments.
-     * @protected
-     */
-    methodCalled: function(methodName, opt_arg) {
-      this.resolverMap_.get(methodName).resolve(opt_arg);
-    },
-
-    /**
-     * @param {string} methodName
-     * @return {!Promise} A promise that is resolved when the given method
-     *     is called.
-     */
-    whenCalled: function(methodName) {
-      return this.resolverMap_.get(methodName).promise;
-    },
-
-    /**
-     * Resets the PromiseResolver associated with the given method.
-     * @param {string} methodName
-     */
-    resetResolver: function(methodName) {
-      this.resolverMap_.set(methodName, new PromiseResolver());
-    },
-
-    /**
-     * Resets all PromiseResolvers.
-     */
-    reset: function() {
-      this.resolverMap_.forEach(function(value, methodName) {
-        this.resolverMap_.set(methodName, new PromiseResolver());
-      }.bind(this));
-    },
-  };
-
-  return {
-    TestBrowserProxy: TestBrowserProxy,
-  };
-});
diff --git a/chrome/test/data/webui/settings/test_extension_control_browser_proxy.js b/chrome/test/data/webui/settings/test_extension_control_browser_proxy.js
index 2d08c2a9..3a70370 100644
--- a/chrome/test/data/webui/settings/test_extension_control_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_extension_control_browser_proxy.js
@@ -5,17 +5,17 @@
 /**
  * @constructor
  * @implements {settings.ExtensionControlBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 function TestExtensionControlBrowserProxy() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'disableExtension',
     'manageExtension',
   ]);
 }
 
 TestExtensionControlBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @override */
   disableExtension: function(extensionId) {
diff --git a/chrome/test/data/webui/settings/test_languages_browser_proxy.js b/chrome/test/data/webui/settings/test_languages_browser_proxy.js
index 5451cdc8..5304454 100644
--- a/chrome/test/data/webui/settings/test_languages_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_languages_browser_proxy.js
@@ -6,14 +6,14 @@
   /**
    * @constructor
    * @implements {settings.LanguagesBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestLanguagesBrowserProxy = function() {
     var methodNames = [];
     if (cr.isChromeOS || cr.isWindows)
       methodNames.push('getProspectiveUILanguage');
 
-    settings.TestBrowserProxy.call(this, methodNames);
+    TestBrowserProxy.call(this, methodNames);
 
     /** @private {!LanguageSettingsPrivate} */
     this.languageSettingsPrivate_ = new settings.FakeLanguageSettingsPrivate();
@@ -23,7 +23,7 @@
   };
 
   TestLanguagesBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     getLanguageSettingsPrivate: function() {
diff --git a/chrome/test/data/webui/settings/test_lifetime_browser_proxy.js b/chrome/test/data/webui/settings/test_lifetime_browser_proxy.js
index dac0dcc..cb9f37e 100644
--- a/chrome/test/data/webui/settings/test_lifetime_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_lifetime_browser_proxy.js
@@ -8,18 +8,18 @@
    *
    * @constructor
    * @implements {settings.LifetimeBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestLifetimeBrowserProxy = function() {
     var methodNames = ['restart', 'relaunch'];
     if (cr.isChromeOS)
       methodNames.push('signOutAndRestart', 'factoryReset');
 
-    settings.TestBrowserProxy.call(this, methodNames);
+    TestBrowserProxy.call(this, methodNames);
   };
 
   TestLifetimeBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     restart: function() {
diff --git a/chrome/test/data/webui/settings/test_privacy_page_browser_proxy.js b/chrome/test/data/webui/settings/test_privacy_page_browser_proxy.js
index 57bf33c..87424be7 100644
--- a/chrome/test/data/webui/settings/test_privacy_page_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_privacy_page_browser_proxy.js
@@ -8,7 +8,7 @@
  * @implements {settings.PrivacyPageBrowserProxy}
  */
 function TestPrivacyPageBrowserProxy() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'getMetricsReporting',
     'getSafeBrowsingExtendedReporting',
     'setMetricsReportingEnabled',
@@ -18,7 +18,7 @@
 }
 
 TestPrivacyPageBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /** @type {!MetricsReporting} */
   metricsReporting: {
diff --git a/chrome/test/data/webui/settings/test_reset_browser_proxy.js b/chrome/test/data/webui/settings/test_reset_browser_proxy.js
index 04780db..a6046d9 100644
--- a/chrome/test/data/webui/settings/test_reset_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_reset_browser_proxy.js
@@ -6,10 +6,10 @@
   /**
    * @constructor
    * @implements {settings.ResetBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestResetBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'performResetProfileSettings',
       'onHideResetProfileDialog',
       'onHideResetProfileBanner',
@@ -21,7 +21,7 @@
   };
 
   TestResetBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     performResetProfileSettings: function(sendSettings, requestOrigin) {
diff --git a/chrome/test/data/webui/settings/test_search_engines_browser_proxy.js b/chrome/test/data/webui/settings/test_search_engines_browser_proxy.js
index d1b0b2d..02dc557 100644
--- a/chrome/test/data/webui/settings/test_search_engines_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_search_engines_browser_proxy.js
@@ -10,10 +10,10 @@
    *
    * @constructor
    * @implements {settings.SearchEnginesBrowserProxy}
-   * @extends {settings.TestBrowserProxy}
+   * @extends {TestBrowserProxy}
    */
   var TestSearchEnginesBrowserProxy = function() {
-    settings.TestBrowserProxy.call(this, [
+    TestBrowserProxy.call(this, [
       'getSearchEnginesList',
       'removeSearchEngine',
       'searchEngineEditCancelled',
@@ -47,7 +47,7 @@
   };
 
   TestSearchEnginesBrowserProxy.prototype = {
-    __proto__: settings.TestBrowserProxy.prototype,
+    __proto__: TestBrowserProxy.prototype,
 
     /** @override */
     setDefaultSearchEngine: function(modelIndex) {
diff --git a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
index 97633e7..1ef3034 100644
--- a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
+++ b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.js
@@ -76,10 +76,10 @@
  *
  * @constructor
  * @implements {settings.SiteSettingsPrefsBrowserProxy}
- * @extends {settings.TestBrowserProxy}
+ * @extends {TestBrowserProxy}
  */
 var TestSiteSettingsPrefsBrowserProxy = function() {
-  settings.TestBrowserProxy.call(this, [
+  TestBrowserProxy.call(this, [
     'fetchUsbDevices',
     'fetchZoomLevels',
     'getCookieDetails',
@@ -123,7 +123,7 @@
 };
 
 TestSiteSettingsPrefsBrowserProxy.prototype = {
-  __proto__: settings.TestBrowserProxy.prototype,
+  __proto__: TestBrowserProxy.prototype,
 
   /**
    * Pretends an incognito session started or ended.
diff --git a/chrome/test/data/webui/test_browser_proxy.js b/chrome/test/data/webui/test_browser_proxy.js
new file mode 100644
index 0000000..9d124ea
--- /dev/null
+++ b/chrome/test/data/webui/test_browser_proxy.js
@@ -0,0 +1,83 @@
+// Copyright 2016 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.
+
+/**
+ * A base class for all test browser proxies to inherit from. Provides helper
+ * methods for allowing tests to track when a method was called.
+ *
+ * Subclasses are responsible for calling |methodCalled|, when a method is
+ * called, which will trigger callers of |whenCalled| to get notified.
+ * For example:
+ * --------------------------------------------------------------------------
+ * var MyTestBrowserProxy = function() {
+ *   TestBrowserProxy.call(this, ['myMethod']);
+ * };
+ * MyTestBrowserProxy.prototype = function() {
+ *   __proto__: TestBrowserProxy.prototype,
+ *
+ *   myMethod: function(someId) {
+ *     this.methodCalled('myMethod', someId);
+ *   },
+ * };
+ *
+ * // Test code sample
+ *
+ * var testBrowserProxy = new MyTestBrowserProxy();
+ * // ...Replacing real proxy with test proxy....
+ * simulateClickFooButton();
+ * testBrowserProxy.whenCalled('fooMethod').then(function(id) {
+ *   assertEquals(EXPECTED_ID, id);
+ * });
+ * --------------------------------------------------------------------------
+ *
+ * @constructor
+ * @param {!Array<string>} methodNames Names of all methods whose calls
+ *     need to be tracked.
+ */
+var TestBrowserProxy = function(methodNames) {
+  /** @private {!Map<string, !PromiseResolver>} */
+  this.resolverMap_ = new Map();
+  methodNames.forEach(this.resetResolver, this);
+};
+
+TestBrowserProxy.prototype = {
+  /**
+   * Called by subclasses when a tracked method is called from the code that
+   * is being tested.
+   * @param {string} methodName
+   * @param {*=} opt_arg Optional argument to be forwarded to the testing
+   *     code, useful for checking whether the proxy method was called with
+   *     the expected arguments.
+   * @protected
+   */
+  methodCalled: function(methodName, opt_arg) {
+    this.resolverMap_.get(methodName).resolve(opt_arg);
+  },
+
+  /**
+   * @param {string} methodName
+   * @return {!Promise} A promise that is resolved when the given method
+   *     is called.
+   */
+  whenCalled: function(methodName) {
+    return this.resolverMap_.get(methodName).promise;
+  },
+
+  /**
+   * Resets the PromiseResolver associated with the given method.
+   * @param {string} methodName
+   */
+  resetResolver: function(methodName) {
+    this.resolverMap_.set(methodName, new PromiseResolver());
+  },
+
+  /**
+   * Resets all PromiseResolvers.
+   */
+  reset: function() {
+    this.resolverMap_.forEach(function(value, methodName) {
+      this.resolverMap_.set(methodName, new PromiseResolver());
+    }.bind(this));
+  },
+};
diff --git a/components/certificate_reporting/error_report_unittest.cc b/components/certificate_reporting/error_report_unittest.cc
index 18c548c..03667c5 100644
--- a/components/certificate_reporting/error_report_unittest.cc
+++ b/components/certificate_reporting/error_report_unittest.cc
@@ -41,7 +41,7 @@
 
 const char kDummyHostname[] = "dummy.hostname.com";
 const char kDummyFailureLog[] = "dummy failure log";
-const char kTestCertFilename[] = "test_mail_google_com.pem";
+const char kTestCertFilename[] = "x509_verify_results.chain.pem";
 
 const net::CertStatus kCertStatus =
     net::CERT_STATUS_COMMON_NAME_INVALID | net::CERT_STATUS_REVOKED;
@@ -76,10 +76,17 @@
 }
 
 std::string GetPEMEncodedChain() {
-  base::FilePath cert_path =
-      net::GetTestCertsDirectory().AppendASCII(kTestCertFilename);
   std::string cert_data;
-  EXPECT_TRUE(base::ReadFileToString(cert_path, &cert_data));
+  std::vector<std::string> pem_certs;
+  scoped_refptr<net::X509Certificate> cert =
+      net::ImportCertFromFile(net::GetTestCertsDirectory(), kTestCertFilename);
+  if (!cert || !cert->GetPEMEncodedChain(&pem_certs)) {
+    ADD_FAILURE();
+    return cert_data;
+  }
+  for (const auto& cert : pem_certs) {
+    cert_data += cert;
+  }
   return cert_data;
 }
 
diff --git a/components/sync/protocol/proto_value_conversions.cc b/components/sync/protocol/proto_value_conversions.cc
index a565797..7df21d5 100644
--- a/components/sync/protocol/proto_value_conversions.cc
+++ b/components/sync/protocol/proto_value_conversions.cc
@@ -112,22 +112,26 @@
   void Visit(const P& parent_proto,
              const char* field_name,
              const google::protobuf::RepeatedPtrField<F>& repeated_field) {
-    std::unique_ptr<base::ListValue> list(new base::ListValue());
-    for (const auto& field : repeated_field) {
-      list->Append(ToValue(field));
+    if (!repeated_field.empty()) {
+      std::unique_ptr<base::ListValue> list(new base::ListValue());
+      for (const auto& field : repeated_field) {
+        list->Append(ToValue(field));
+      }
+      value_->Set(field_name, std::move(list));
     }
-    value_->Set(field_name, std::move(list));
   }
 
   template <class P, class F>
   void Visit(const P& parent_proto,
              const char* field_name,
              const google::protobuf::RepeatedField<F>& repeated_field) {
-    std::unique_ptr<base::ListValue> list(new base::ListValue());
-    for (const auto& field : repeated_field) {
-      list->Append(ToValue(field));
+    if (!repeated_field.empty()) {
+      std::unique_ptr<base::ListValue> list(new base::ListValue());
+      for (const auto& field : repeated_field) {
+        list->Append(ToValue(field));
+      }
+      value_->Set(field_name, std::move(list));
     }
-    value_->Set(field_name, std::move(list));
   }
 
   template <class P, class F>
diff --git a/components/viz/display_compositor/host_shared_bitmap_manager.cc b/components/viz/display_compositor/host_shared_bitmap_manager.cc
index d781c94..0b8b359a 100644
--- a/components/viz/display_compositor/host_shared_bitmap_manager.cc
+++ b/components/viz/display_compositor/host_shared_bitmap_manager.cc
@@ -51,6 +51,13 @@
       manager_->FreeSharedMemoryFromMap(id());
   }
 
+  // cc::SharedBitmap:
+  base::SharedMemoryHandle GetSharedMemoryHandle() const override {
+    if (!bitmap_data_->memory)
+      return base::SharedMemoryHandle();
+    return bitmap_data_->memory->handle();
+  }
+
  private:
   scoped_refptr<BitmapData> bitmap_data_;
   HostSharedBitmapManager* manager_;
diff --git a/components/viz/display_compositor/host_shared_bitmap_manager_unittest.cc b/components/viz/display_compositor/host_shared_bitmap_manager_unittest.cc
index ee7a92f1..c129e1d 100644
--- a/components/viz/display_compositor/host_shared_bitmap_manager_unittest.cc
+++ b/components/viz/display_compositor/host_shared_bitmap_manager_unittest.cc
@@ -133,5 +133,27 @@
   client.DidDeleteSharedBitmap(id);
 }
 
+TEST_F(HostSharedBitmapManagerTest, SharedMemoryHandle) {
+  gfx::Size bitmap_size(1, 1);
+  size_t size_in_bytes;
+  EXPECT_TRUE(cc::SharedBitmap::SizeInBytes(bitmap_size, &size_in_bytes));
+  std::unique_ptr<base::SharedMemory> bitmap(new base::SharedMemory());
+  auto shared_memory_guid = bitmap->handle().GetGUID();
+  bitmap->CreateAndMapAnonymous(size_in_bytes);
+  memset(bitmap->memory(), 0xff, size_in_bytes);
+  cc::SharedBitmapId id = cc::SharedBitmap::GenerateId();
+
+  HostSharedBitmapManagerClient client(manager_.get());
+  base::SharedMemoryHandle handle = bitmap->handle().Duplicate();
+  client.ChildAllocatedSharedBitmap(size_in_bytes, handle, id);
+
+  std::unique_ptr<cc::SharedBitmap> shared_bitmap;
+  shared_bitmap = manager_->GetSharedBitmapFromId(gfx::Size(1, 1), id);
+  EXPECT_EQ(shared_bitmap->GetSharedMemoryHandle().GetGUID(),
+            shared_memory_guid);
+
+  client.DidDeleteSharedBitmap(id);
+}
+
 }  // namespace
 }  // namespace viz
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index b16b295..def8a56 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -1122,6 +1122,8 @@
     "renderer_host/input/motion_event_web.h",
     "renderer_host/input/mouse_wheel_event_queue.cc",
     "renderer_host/input/mouse_wheel_event_queue.h",
+    "renderer_host/input/mouse_wheel_phase_handler.cc",
+    "renderer_host/input/mouse_wheel_phase_handler.h",
     "renderer_host/input/mouse_wheel_rails_filter_mac.cc",
     "renderer_host/input/mouse_wheel_rails_filter_mac.h",
     "renderer_host/input/passthrough_touch_event_queue.cc",
diff --git a/content/browser/loader/resource_loader_unittest.cc b/content/browser/loader/resource_loader_unittest.cc
index ff068e7..715b4818 100644
--- a/content/browser/loader/resource_loader_unittest.cc
+++ b/content/browser/loader/resource_loader_unittest.cc
@@ -194,11 +194,6 @@
 
 // Set up dummy values to use in test HTTPS requests.
 
-scoped_refptr<net::X509Certificate> GetTestCert() {
-  return net::ImportCertFromFile(net::GetTestCertsDirectory(),
-                                 "test_mail_google_com.pem");
-}
-
 const net::CertStatus kTestCertError = net::CERT_STATUS_DATE_INVALID;
 const int kTestSecurityBits = 256;
 // SSL3 TLS_DHE_RSA_WITH_AES_256_CBC_SHA
@@ -222,7 +217,8 @@
   void GetResponseInfo(net::HttpResponseInfo* info) override {
     // Get the original response info, but override the SSL info.
     net::URLRequestJob::GetResponseInfo(info);
-    info->ssl_info.cert = GetTestCert();
+    info->ssl_info.cert =
+        net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem");
     info->ssl_info.cert_status = kTestCertError;
     info->ssl_info.security_bits = kTestSecurityBits;
     info->ssl_info.connection_status = kTestConnectionStatus;
@@ -599,7 +595,8 @@
   // Set up the test client cert store.
   int store_request_count;
   std::vector<std::string> store_requested_authorities;
-  net::CertificateList dummy_certs(1, GetTestCert());
+  net::CertificateList dummy_certs(
+      1, net::ImportCertFromFile(net::GetTestCertsDirectory(), "ok_cert.pem"));
   std::unique_ptr<ClientCertStoreStub> test_store(new ClientCertStoreStub(
       dummy_certs, &store_request_count, &store_requested_authorities));
   SetClientCertStore(std::move(test_store));
diff --git a/content/browser/renderer_host/input/mouse_wheel_phase_handler.cc b/content/browser/renderer_host/input/mouse_wheel_phase_handler.cc
new file mode 100644
index 0000000..318561b07
--- /dev/null
+++ b/content/browser/renderer_host/input/mouse_wheel_phase_handler.cc
@@ -0,0 +1,99 @@
+// 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/renderer_host/input/mouse_wheel_phase_handler.h"
+
+#include "content/browser/renderer_host/render_widget_host_impl.h"
+#include "content/browser/renderer_host/render_widget_host_input_event_router.h"
+#include "content/browser/renderer_host/render_widget_host_view_base.h"
+
+namespace content {
+MouseWheelPhaseHandler::MouseWheelPhaseHandler(
+    RenderWidgetHostImpl* const host,
+    RenderWidgetHostViewBase* const host_view)
+    : host_(RenderWidgetHostImpl::From(host)), host_view_(host_view) {}
+
+void MouseWheelPhaseHandler::AddPhaseIfNeededAndScheduleEndEvent(
+    blink::WebMouseWheelEvent& mouse_wheel_event,
+    bool should_route_event) {
+  bool has_phase =
+      mouse_wheel_event.phase != blink::WebMouseWheelEvent::kPhaseNone ||
+      mouse_wheel_event.momentum_phase != blink::WebMouseWheelEvent::kPhaseNone;
+  if (has_phase) {
+    if (mouse_wheel_event.phase == blink::WebMouseWheelEvent::kPhaseEnded) {
+      // Don't send the wheel end event immediately, start a timer instead to
+      // see whether momentum phase of the scrolling starts or not.
+      ScheduleMouseWheelEndDispatching(mouse_wheel_event, should_route_event);
+    } else if (mouse_wheel_event.phase ==
+               blink::WebMouseWheelEvent::kPhaseBegan) {
+      // A new scrolling sequence has started, send the pending wheel end
+      // event to end the previous scrolling sequence.
+      DispatchPendingWheelEndEvent();
+    } else if (mouse_wheel_event.momentum_phase ==
+               blink::WebMouseWheelEvent::kPhaseBegan) {
+      // Momentum phase has started, drop the pending wheel end event to make
+      // sure that no wheel end event will be sent during the momentum phase
+      // of scrolling.
+      IgnorePendingWheelEndEvent();
+    }
+  } else {  // !has_phase
+    if (!mouse_wheel_end_dispatch_timer_.IsRunning()) {
+      mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseBegan;
+      ScheduleMouseWheelEndDispatching(mouse_wheel_event, should_route_event);
+    } else {  // mouse_wheel_end_dispatch_timer_.IsRunning()
+      bool non_zero_delta =
+          mouse_wheel_event.delta_x || mouse_wheel_event.delta_y;
+      mouse_wheel_event.phase =
+          non_zero_delta ? blink::WebMouseWheelEvent::kPhaseChanged
+                         : blink::WebMouseWheelEvent::kPhaseStationary;
+      mouse_wheel_end_dispatch_timer_.Reset();
+    }
+  }
+}
+
+void MouseWheelPhaseHandler::DispatchPendingWheelEndEvent() {
+  if (!mouse_wheel_end_dispatch_timer_.IsRunning())
+    return;
+
+  base::Closure task = mouse_wheel_end_dispatch_timer_.user_task();
+  mouse_wheel_end_dispatch_timer_.Stop();
+  task.Run();
+}
+
+void MouseWheelPhaseHandler::IgnorePendingWheelEndEvent() {
+  mouse_wheel_end_dispatch_timer_.Stop();
+}
+
+void MouseWheelPhaseHandler::SendSyntheticWheelEventWithPhaseEnded(
+    blink::WebMouseWheelEvent last_mouse_wheel_event,
+    bool should_route_event) {
+  DCHECK(host_view_->wheel_scroll_latching_enabled());
+  blink::WebMouseWheelEvent mouse_wheel_event = last_mouse_wheel_event;
+  mouse_wheel_event.delta_x = 0;
+  mouse_wheel_event.delta_y = 0;
+  mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseEnded;
+  mouse_wheel_event.dispatch_type =
+      blink::WebInputEvent::DispatchType::kEventNonBlocking;
+  if (should_route_event) {
+    host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent(
+        host_view_, &mouse_wheel_event,
+        ui::LatencyInfo(ui::SourceEventType::WHEEL));
+  } else {
+    host_view_->ProcessMouseWheelEvent(
+        mouse_wheel_event, ui::LatencyInfo(ui::SourceEventType::WHEEL));
+  }
+}
+
+void MouseWheelPhaseHandler::ScheduleMouseWheelEndDispatching(
+    blink::WebMouseWheelEvent wheel_event,
+    bool should_route_event) {
+  mouse_wheel_end_dispatch_timer_.Start(
+      FROM_HERE,
+      base::TimeDelta::FromMilliseconds(
+          kDefaultMouseWheelLatchingTransactionMs),
+      base::Bind(&MouseWheelPhaseHandler::SendSyntheticWheelEventWithPhaseEnded,
+                 base::Unretained(this), wheel_event, should_route_event));
+}
+
+}  // namespace content
diff --git a/content/browser/renderer_host/input/mouse_wheel_phase_handler.h b/content/browser/renderer_host/input/mouse_wheel_phase_handler.h
new file mode 100644
index 0000000..aa4a20e4
--- /dev/null
+++ b/content/browser/renderer_host/input/mouse_wheel_phase_handler.h
@@ -0,0 +1,50 @@
+// Copyright (c) 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 MOUSE_WHEEL_PHASE_HANDLER_H_
+#define MOUSE_WHEEL_PHASE_HANDLER_H_
+
+#include "base/timer/timer.h"
+#include "content/browser/renderer_host/render_widget_host_delegate.h"
+
+namespace content {
+class RenderWidgetHostImpl;
+class RenderWidgetHostViewBase;
+
+// The duration after which a synthetic wheel with zero deltas and
+// phase = |kPhaseEnded| will be sent after the last wheel event.
+const int64_t kDefaultMouseWheelLatchingTransactionMs = 100;
+
+class MouseWheelPhaseHandler {
+ public:
+  MouseWheelPhaseHandler(RenderWidgetHostImpl* const host,
+                         RenderWidgetHostViewBase* const host_view);
+  ~MouseWheelPhaseHandler() {}
+
+  void AddPhaseIfNeededAndScheduleEndEvent(
+      blink::WebMouseWheelEvent& mouse_wheel_event,
+      bool should_route_event);
+  void DispatchPendingWheelEndEvent();
+  void IgnorePendingWheelEndEvent();
+  bool HasPendingWheelEndEvent() const {
+    return mouse_wheel_end_dispatch_timer_.IsRunning();
+  }
+
+ private:
+  void SendSyntheticWheelEventWithPhaseEnded(
+      blink::WebMouseWheelEvent last_mouse_wheel_event,
+      bool should_route_event);
+  void ScheduleMouseWheelEndDispatching(blink::WebMouseWheelEvent wheel_event,
+                                        bool should_route_event);
+
+  RenderWidgetHostImpl* const host_;
+  RenderWidgetHostViewBase* const host_view_;
+  base::OneShotTimer mouse_wheel_end_dispatch_timer_;
+
+  DISALLOW_COPY_AND_ASSIGN(MouseWheelPhaseHandler);
+};
+
+}  // namespace content
+
+#endif  // MOUSE_WHEEL_PHASE_HANDLER_H_
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc
index af376b9..492526c2 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.cc
+++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -464,6 +464,7 @@
       observing_root_window_(false),
       prev_top_shown_pix_(0.f),
       prev_bottom_shown_pix_(0.f),
+      mouse_wheel_phase_handler_(widget_host, this),
       weak_ptr_factory_(this) {
   // Set the layer which will hold the content layer for this view. The content
   // layer is managed by the DelegatedFrameHost.
@@ -1823,13 +1824,19 @@
 
   ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL);
   latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
-  if (SiteIsolationPolicy::AreCrossProcessFramesPossible() &&
-      host_->delegate()->GetInputEventRouter()) {
-    blink::WebMouseWheelEvent wheel_event(event);
+  blink::WebMouseWheelEvent wheel_event(event);
+  bool should_route_event =
+      SiteIsolationPolicy::AreCrossProcessFramesPossible() &&
+      host_->delegate()->GetInputEventRouter();
+  if (wheel_scroll_latching_enabled()) {
+    mouse_wheel_phase_handler_.AddPhaseIfNeededAndScheduleEndEvent(
+        wheel_event, should_route_event);
+  }
+  if (should_route_event) {
     host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent(
         this, &wheel_event, latency_info);
   } else {
-    host_->ForwardWheelEventWithLatencyInfo(event, latency_info);
+    host_->ForwardWheelEventWithLatencyInfo(wheel_event, latency_info);
   }
 }
 
@@ -1844,8 +1851,33 @@
 
   ui::LatencyInfo latency_info =
       ui::WebInputEventTraits::CreateLatencyInfoForWebGestureEvent(event);
-  if (SiteIsolationPolicy::AreCrossProcessFramesPossible() &&
-      host_->delegate()->GetInputEventRouter()) {
+  if (wheel_scroll_latching_enabled()) {
+    if (event.source_device ==
+        blink::WebGestureDevice::kWebGestureDeviceTouchscreen) {
+      if (event.GetType() == blink::WebInputEvent::kGestureScrollBegin) {
+        // If there is a current scroll going on and a new scroll that isn't
+        // wheel based, send a synthetic wheel event with kPhaseEnded to cancel
+        // the current scroll.
+        mouse_wheel_phase_handler_.DispatchPendingWheelEndEvent();
+      } else if (event.GetType() == blink::WebInputEvent::kGestureScrollEnd) {
+        // Make sure that the next wheel event will have phase = |kPhaseBegan|.
+        // This is for maintaining the correct phase info when some of the wheel
+        // events get ignored while a touchscreen scroll is going on.
+        mouse_wheel_phase_handler_.IgnorePendingWheelEndEvent();
+      }
+
+    } else if (event.GetType() == blink::WebInputEvent::kGestureFlingStart &&
+               event.source_device ==
+                   blink::WebGestureDevice::kWebGestureDeviceTouchpad) {
+      // Ignore the pending wheel end event to avoid sending a wheel event with
+      // kPhaseEnded before a GFS.
+      mouse_wheel_phase_handler_.IgnorePendingWheelEndEvent();
+    }
+  }
+  bool should_route_event =
+      SiteIsolationPolicy::AreCrossProcessFramesPossible() &&
+      host_->delegate()->GetInputEventRouter();
+  if (should_route_event) {
     blink::WebGestureEvent gesture_event(event);
     host_->delegate()->GetInputEventRouter()->RouteGestureEvent(
         this, &gesture_event, latency_info);
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h
index b1816871..d7900c6 100644
--- a/content/browser/renderer_host/render_widget_host_view_android.h
+++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -24,6 +24,7 @@
 #include "components/viz/frame_sinks/frame_evictor.h"
 #include "content/browser/accessibility/browser_accessibility_manager.h"
 #include "content/browser/android/content_view_core_impl_observer.h"
+#include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h"
 #include "content/browser/renderer_host/input/stylus_text_selector.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/renderer_host/text_input_manager.h"
@@ -430,6 +431,8 @@
 
   base::ObserverList<DestructionObserver> destruction_observers_;
 
+  MouseWheelPhaseHandler mouse_wheel_phase_handler_;
+
   base::WeakPtrFactory<RenderWidgetHostViewAndroid> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewAndroid);
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index b6c9b0d4..6866b14 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -1804,7 +1804,7 @@
                     INPUT_EVENT_ACK_STATE_CONSUMED);
   sink_->ClearMessages();
 
-  // Let the RenderWidgetHostViewEventHandler::mouse_wheel_phase_timer_ fire. A
+  // Let the MouseWheelPhaseHandler::mouse_wheel_end_dispatch_timer_ fire. A
   // synthetic wheel event with zero deltas and kPhaseEnded will be sent.
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
@@ -1866,7 +1866,7 @@
                     INPUT_EVENT_ACK_STATE_CONSUMED);
   sink_->ClearMessages();
 
-  // Let the RenderWidgetHostViewEventHandler::mouse_wheel_phase_timer_ fire. No
+  // Let the MouseWheelPhaseHandler::mouse_wheel_end_dispatch_timer_ fire. No
   // synthetic wheel event will be sent since the timer has stopped.
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
diff --git a/content/browser/renderer_host/render_widget_host_view_base.h b/content/browser/renderer_host/render_widget_host_view_base.h
index ab9c08b..f416bcf9 100644
--- a/content/browser/renderer_host/render_widget_host_view_base.h
+++ b/content/browser/renderer_host/render_widget_host_view_base.h
@@ -69,10 +69,6 @@
 
 namespace content {
 
-// The duration after which a synthetic wheel with zero deltas and
-// phase = |kPhaseEnded| will be sent after the last wheel event.
-const int64_t kDefaultMouseWheelLatchingTransactionMs = 100;
-
 class BrowserAccessibilityDelegate;
 class BrowserAccessibilityManager;
 class RenderWidgetHostImpl;
diff --git a/content/browser/renderer_host/render_widget_host_view_event_handler.cc b/content/browser/renderer_host/render_widget_host_view_event_handler.cc
index 995d2e5..213ed4a 100644
--- a/content/browser/renderer_host/render_widget_host_view_event_handler.cc
+++ b/content/browser/renderer_host/render_widget_host_view_event_handler.cc
@@ -138,7 +138,8 @@
       popup_child_host_view_(nullptr),
       popup_child_event_handler_(nullptr),
       delegate_(delegate),
-      window_(nullptr) {}
+      window_(nullptr),
+      mouse_wheel_phase_handler_(host, host_view) {}
 
 RenderWidgetHostViewEventHandler::~RenderWidgetHostViewEventHandler() {}
 
@@ -341,7 +342,8 @@
     if (mouse_wheel_event.delta_x != 0 || mouse_wheel_event.delta_y != 0) {
       bool should_route_event = ShouldRouteEvent(event);
       if (host_view_->wheel_scroll_latching_enabled())
-        AddPhaseAndScheduleEndEvent(mouse_wheel_event, should_route_event);
+        mouse_wheel_phase_handler_.AddPhaseIfNeededAndScheduleEndEvent(
+            mouse_wheel_event, should_route_event);
       if (should_route_event) {
         host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent(
             host_view_, &mouse_wheel_event, *event->latency());
@@ -410,7 +412,8 @@
     blink::WebMouseWheelEvent mouse_wheel_event = ui::MakeWebMouseWheelEvent(
         *event, base::Bind(&GetScreenLocationFromEvent));
     if (host_view_->wheel_scroll_latching_enabled())
-      AddPhaseAndScheduleEndEvent(mouse_wheel_event, should_route_event);
+      mouse_wheel_phase_handler_.AddPhaseIfNeededAndScheduleEndEvent(
+          mouse_wheel_event, should_route_event);
     if (should_route_event) {
       host_->delegate()->GetInputEventRouter()->RouteGestureEvent(
           host_view_, &gesture_event,
@@ -435,9 +438,9 @@
     }
     if (event->type() == ui::ET_SCROLL_FLING_START) {
       RecordAction(base::UserMetricsAction("TrackpadScrollFling"));
-      // Stop the timer to avoid sending a synthetic wheel event with
-      // kPhaseEnded.
-      mouse_wheel_end_dispatch_timer_.Stop();
+      // Ignore the pending wheel end event to avoid sending a wheel event with
+      // kPhaseEnded before a GFS.
+      mouse_wheel_phase_handler_.IgnorePendingWheelEndEvent();
     }
   }
 
@@ -532,20 +535,15 @@
   if (gesture.GetType() != blink::WebInputEvent::kUndefined) {
     if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN) {
       RecordAction(base::UserMetricsAction("TouchscreenScroll"));
-
-      if (mouse_wheel_end_dispatch_timer_.IsRunning()) {
-        // If there is a current scroll going on and a new scroll that isn't
-        // wheel based send a synthetic wheel event with kPhaseEnded to cancel
-        // the current scroll.
-        base::Closure task = mouse_wheel_end_dispatch_timer_.user_task();
-        mouse_wheel_end_dispatch_timer_.Stop();
-        task.Run();
-      }
+      // If there is a current scroll going on and a new scroll that isn't
+      // wheel based send a synthetic wheel event with kPhaseEnded to cancel
+      // the current scroll.
+      mouse_wheel_phase_handler_.DispatchPendingWheelEndEvent();
     } else if (event->type() == ui::ET_GESTURE_SCROLL_END) {
       // Make sure that the next wheel event will have phase = |kPhaseBegan|.
       // This is for maintaining the correct phase info when some of the wheel
       // events get ignored while a touchscreen scroll is going on.
-      mouse_wheel_end_dispatch_timer_.Stop();
+      mouse_wheel_phase_handler_.IgnorePendingWheelEndEvent();
     } else if (event->type() == ui::ET_SCROLL_FLING_START) {
       RecordAction(base::UserMetricsAction("TouchscreenScrollFling"));
     }
@@ -911,51 +909,4 @@
   host_->ForwardTouchEventWithLatencyInfo(event, latency);
 }
 
-void RenderWidgetHostViewEventHandler::SendSyntheticWheelEventWithPhaseEnded(
-    blink::WebMouseWheelEvent last_mouse_wheel_event,
-    bool should_route_event) {
-  DCHECK(host_view_->wheel_scroll_latching_enabled());
-  blink::WebMouseWheelEvent mouse_wheel_event = last_mouse_wheel_event;
-  mouse_wheel_event.delta_x = 0;
-  mouse_wheel_event.delta_y = 0;
-  mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseEnded;
-  mouse_wheel_event.dispatch_type =
-      blink::WebInputEvent::DispatchType::kEventNonBlocking;
-  if (should_route_event) {
-    host_->delegate()->GetInputEventRouter()->RouteMouseWheelEvent(
-        host_view_, &mouse_wheel_event,
-        ui::LatencyInfo(ui::SourceEventType::WHEEL));
-  } else {
-    ProcessMouseWheelEvent(mouse_wheel_event,
-                           ui::LatencyInfo(ui::SourceEventType::WHEEL));
-  }
-}
-
-void RenderWidgetHostViewEventHandler::AddPhaseAndScheduleEndEvent(
-    blink::WebMouseWheelEvent& mouse_wheel_event,
-    bool should_route_event) {
-  DCHECK_EQ(blink::WebMouseWheelEvent::kPhaseNone, mouse_wheel_event.phase);
-  DCHECK_EQ(blink::WebMouseWheelEvent::kPhaseNone,
-            mouse_wheel_event.momentum_phase);
-
-  if (!mouse_wheel_end_dispatch_timer_.IsRunning()) {
-    mouse_wheel_event.phase = blink::WebMouseWheelEvent::kPhaseBegan;
-    mouse_wheel_end_dispatch_timer_.Start(
-        FROM_HERE,
-        base::TimeDelta::FromMilliseconds(
-            kDefaultMouseWheelLatchingTransactionMs),
-        base::Bind(&RenderWidgetHostViewEventHandler::
-                       SendSyntheticWheelEventWithPhaseEnded,
-                   base::Unretained(this), mouse_wheel_event,
-                   should_route_event));
-  } else {
-    bool non_zero_delta =
-        mouse_wheel_event.delta_x || mouse_wheel_event.delta_y;
-    mouse_wheel_event.phase = non_zero_delta
-                                  ? blink::WebMouseWheelEvent::kPhaseChanged
-                                  : blink::WebMouseWheelEvent::kPhaseStationary;
-    mouse_wheel_end_dispatch_timer_.Reset();
-  }
-}
-
 }  // namespace content
diff --git a/content/browser/renderer_host/render_widget_host_view_event_handler.h b/content/browser/renderer_host/render_widget_host_view_event_handler.h
index c0bdfce4..24815cc 100644
--- a/content/browser/renderer_host/render_widget_host_view_event_handler.h
+++ b/content/browser/renderer_host/render_widget_host_view_event_handler.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/macros.h"
-#include "base/timer/timer.h"
+#include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/native_web_keyboard_event.h"
 #include "ui/aura/window_tracker.h"
@@ -189,11 +189,6 @@
                               const ui::LatencyInfo& latency);
   void ProcessTouchEvent(const blink::WebTouchEvent& event,
                          const ui::LatencyInfo& latency);
-  void SendSyntheticWheelEventWithPhaseEnded(
-      blink::WebMouseWheelEvent last_mouse_wheel_event,
-      bool should_route_event);
-  void AddPhaseAndScheduleEndEvent(blink::WebMouseWheelEvent& mouse_wheel_event,
-                                   bool should_route_event);
 
   // Whether return characters should be passed on to the RenderWidgetHostImpl.
   bool accept_return_character_;
@@ -255,8 +250,7 @@
   ui::EventHandler* popup_child_event_handler_;
   Delegate* const delegate_;
   aura::Window* window_;
-
-  base::OneShotTimer mouse_wheel_end_dispatch_timer_;
+  MouseWheelPhaseHandler mouse_wheel_phase_handler_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidgetHostViewEventHandler);
 };
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.h b/content/browser/renderer_host/render_widget_host_view_mac.h
index 17803a94..a60dce5f 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.h
+++ b/content/browser/renderer_host/render_widget_host_view_mac.h
@@ -24,6 +24,7 @@
 #include "base/time/time.h"
 #include "cc/surfaces/surface_id.h"
 #include "content/browser/renderer_host/browser_compositor_view_mac.h"
+#include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h"
 #include "content/browser/renderer_host/input/mouse_wheel_rails_filter_mac.h"
 #include "content/browser/renderer_host/render_widget_host_view_base.h"
 #include "content/browser/renderer_host/text_input_manager.h"
@@ -411,6 +412,10 @@
   // opaqueness changes.
   void UpdateBackgroundColorFromRenderer(SkColor color);
 
+  bool HasPendingWheelEndEventForTesting() {
+    return mouse_wheel_phase_handler_.HasPendingWheelEndEvent();
+  }
+
   // These member variables should be private, but the associated ObjC class
   // needs access to them and can't be made a friend.
 
@@ -428,6 +433,8 @@
   // determine if pinch gestures need to be thresholded.
   bool page_at_minimum_scale_;
 
+  MouseWheelPhaseHandler mouse_wheel_phase_handler_;
+
   NSWindow* pepper_fullscreen_window() const {
     return pepper_fullscreen_window_;
   }
@@ -487,12 +494,6 @@
   // Get the focused view that should be used for retrieving the text selection.
   RenderWidgetHostViewBase* GetFocusedViewForTextSelection();
 
-  void ScheduleMouseWheelEndDispatching(blink::WebMouseWheelEvent wheel_event,
-                                        bool should_route_event);
-  void DispatchPendingWheelEndEvent();
-  void IgnorePendingWheelEndEvent();
-  bool HasPendingWheelEndEvent();
-
   // Returns the RenderWidgetHostDelegate corresponding to the currently focused
   // RenderWidgetHost. It is different from |render_widget_host_->delegate()|
   // when there are focused inner WebContentses on the page. Also, this method
@@ -575,8 +576,6 @@
   SkColor background_color_ = SK_ColorTRANSPARENT;
   SkColor last_frame_root_background_color_ = SK_ColorTRANSPARENT;
 
-  base::OneShotTimer mouse_wheel_end_dispatch_timer_;
-
   // Factory used to safely scope delayed calls to ShutdownHost().
   base::WeakPtrFactory<RenderWidgetHostViewMac> weak_factory_;
 
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index b71d8d6..9f5af20 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -440,6 +440,7 @@
                                                  bool is_guest_view_hack)
     : render_widget_host_(RenderWidgetHostImpl::From(widget)),
       page_at_minimum_scale_(true),
+      mouse_wheel_phase_handler_(RenderWidgetHostImpl::From(widget), this),
       is_loading_(false),
       allow_pause_for_resize_or_repaint_(true),
       is_guest_view_hack_(is_guest_view_hack),
@@ -1751,50 +1752,6 @@
   UpdateScreenInfo(cocoa_view_);
 }
 
-void RenderWidgetHostViewMac::ScheduleMouseWheelEndDispatching(
-    blink::WebMouseWheelEvent wheel_event,
-    bool should_route_event) {
-  mouse_wheel_end_dispatch_timer_.Start(
-      FROM_HERE,
-      base::TimeDelta::FromMilliseconds(
-          kDefaultMouseWheelLatchingTransactionMs),
-      base::Bind(
-          &RenderWidgetHostViewMac::SendSyntheticWheelEventWithPhaseEnded,
-          base::Unretained(this), wheel_event, should_route_event));
-}
-
-void RenderWidgetHostViewMac::DispatchPendingWheelEndEvent() {
-  if (mouse_wheel_end_dispatch_timer_.IsRunning()) {
-    base::Closure task = mouse_wheel_end_dispatch_timer_.user_task();
-    mouse_wheel_end_dispatch_timer_.Stop();
-    task.Run();
-  }
-}
-
-void RenderWidgetHostViewMac::IgnorePendingWheelEndEvent() {
-  mouse_wheel_end_dispatch_timer_.Stop();
-}
-
-bool RenderWidgetHostViewMac::HasPendingWheelEndEvent() {
-  return mouse_wheel_end_dispatch_timer_.IsRunning();
-}
-
-void RenderWidgetHostViewMac::SendSyntheticWheelEventWithPhaseEnded(
-    blink::WebMouseWheelEvent wheel_event,
-    bool should_route_event) {
-  wheel_event.dispatch_type =
-      blink::WebInputEvent::DispatchType::kEventNonBlocking;
-  if (should_route_event) {
-    render_widget_host_->delegate()
-        ->GetInputEventRouter()
-        ->RouteMouseWheelEvent(this, &wheel_event,
-                               ui::LatencyInfo(ui::SourceEventType::WHEEL));
-  } else {
-    ProcessMouseWheelEvent(wheel_event,
-                           ui::LatencyInfo(ui::SourceEventType::WHEEL));
-  }
-}
-
 }  // namespace content
 
 // RenderWidgetHostViewCocoa ---------------------------------------------------
@@ -2396,7 +2353,8 @@
         event, self);
     webEvent.rails_mode = mouseWheelFilter_.UpdateRailsMode(webEvent);
     if (renderWidgetHostView_->wheel_scroll_latching_enabled()) {
-      renderWidgetHostView_->ScheduleMouseWheelEndDispatching(webEvent, false);
+      renderWidgetHostView_->mouse_wheel_phase_handler_
+          .AddPhaseIfNeededAndScheduleEndEvent(webEvent, false);
     } else {
       ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL);
       latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
@@ -2609,25 +2567,15 @@
     ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL);
     latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
     if (renderWidgetHostView_->wheel_scroll_latching_enabled()) {
+      renderWidgetHostView_->mouse_wheel_phase_handler_
+          .AddPhaseIfNeededAndScheduleEndEvent(
+              webEvent, renderWidgetHostView_->ShouldRouteEvent(webEvent));
       if (webEvent.phase == blink::WebMouseWheelEvent::kPhaseEnded) {
-        // Don't send the wheel end event immediately, start a timer instead to
-        // see whether momentum phase of the scrolling starts or not.
-        renderWidgetHostView_->ScheduleMouseWheelEndDispatching(
-            webEvent, renderWidgetHostView_->ShouldRouteEvent(webEvent));
+        // A wheel end event is scheduled and will get dispatched if momentum
+        // phase doesn't start in 100ms. Don't sent the wheel end event
+        // immediately.
         return;
       }
-      if (webEvent.phase == blink::WebMouseWheelEvent::kPhaseBegan) {
-        // A new scrolling sequence has started, send the pending wheel end
-        // event to end the previous scrolling sequence.
-        renderWidgetHostView_->DispatchPendingWheelEndEvent();
-
-      } else if (webEvent.momentum_phase ==
-                 blink::WebMouseWheelEvent::kPhaseBegan) {
-        // Momentum phase has started, drop the pending wheel end event to make
-        // sure that no wheel end event will be sent during the momentum phase
-        // of scrolling.
-        renderWidgetHostView_->IgnorePendingWheelEndEvent();
-      }
     }
 
     if (renderWidgetHostView_->ShouldRouteEvent(webEvent)) {
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
index 7bf0b1c..eaeffae 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -1387,7 +1387,7 @@
       MockScrollWheelEventWithPhase(@selector(phaseEnded), 0);
   [view->cocoa_view() scrollWheel:wheelEvent2];
   ASSERT_EQ(0U, process_host->sink().message_count());
-  DCHECK(view->HasPendingWheelEndEvent());
+  DCHECK(view->HasPendingWheelEndEventForTesting());
   process_host->sink().ClearMessages();
 
   host->ShutdownAndDestroyWidget(true);
@@ -1433,7 +1433,7 @@
       MockScrollWheelEventWithPhase(@selector(phaseEnded), 0);
   [view->cocoa_view() scrollWheel:wheelEvent2];
   ASSERT_EQ(0U, process_host->sink().message_count());
-  DCHECK(view->HasPendingWheelEndEvent());
+  DCHECK(view->HasPendingWheelEndEventForTesting());
   process_host->sink().ClearMessages();
 
   // Send a wheel event with momentum phase started, this should stop the wheel
@@ -1443,7 +1443,7 @@
   ASSERT_TRUE(wheelEvent3);
   [view->cocoa_view() scrollWheel:wheelEvent3];
   ASSERT_EQ(1U, process_host->sink().message_count());
-  DCHECK(!view->HasPendingWheelEndEvent());
+  DCHECK(!view->HasPendingWheelEndEventForTesting());
   process_host->sink().ClearMessages();
 
   host->ShutdownAndDestroyWidget(true);
@@ -1489,7 +1489,7 @@
       MockScrollWheelEventWithPhase(@selector(phaseEnded), 0);
   [view->cocoa_view() scrollWheel:wheelEvent2];
   ASSERT_EQ(0U, process_host->sink().message_count());
-  DCHECK(view->HasPendingWheelEndEvent());
+  DCHECK(view->HasPendingWheelEndEventForTesting());
   process_host->sink().ClearMessages();
 
   // Send a wheel event with phase started, this should stop the wheel end
@@ -1500,7 +1500,7 @@
   ASSERT_TRUE(wheelEvent3);
   [view->cocoa_view() scrollWheel:wheelEvent3];
   ASSERT_EQ(2U, process_host->sink().message_count());
-  DCHECK(!view->HasPendingWheelEndEvent());
+  DCHECK(!view->HasPendingWheelEndEventForTesting());
   process_host->sink().ClearMessages();
 
   host->ShutdownAndDestroyWidget(true);
diff --git a/content/browser/webui/shared_resources_data_source.cc b/content/browser/webui/shared_resources_data_source.cc
index 9442629c..d9aaee7d 100644
--- a/content/browser/webui/shared_resources_data_source.cc
+++ b/content/browser/webui/shared_resources_data_source.cc
@@ -39,6 +39,13 @@
     {"../../views/resources/default_200_percent/common/", "images/2x/apps/"},
     {"../../webui/resources/cr_elements/", "cr_elements/"}};
 
+const struct {
+  const char* const path;
+  const int resource_id;
+} kAdditionalResourceMapEntries[] = {
+    {"js/mojo_bindings.js", IDR_WEBUI_MOJO_BINDINGS_JS},
+};
+
 void AddResource(const std::string& path,
                  int resource_id,
                  ResourcesMap* resources_map) {
@@ -60,7 +67,10 @@
       }
     }
   }
-
+  for (size_t i = 0; i < arraysize(kAdditionalResourceMapEntries); ++i) {
+    const auto& entry = kAdditionalResourceMapEntries[i];
+    AddResource(entry.path, entry.resource_id, result);
+  }
   return result;
 }
 
diff --git a/content/child/resource_dispatcher.cc b/content/child/resource_dispatcher.cc
index f9768451..8e78c10 100644
--- a/content/child/resource_dispatcher.cc
+++ b/content/child/resource_dispatcher.cc
@@ -666,11 +666,13 @@
     scoped_refptr<base::SingleThreadTaskRunner> task_runner =
         loading_task_runner ? loading_task_runner : thread_task_runner_;
     std::unique_ptr<URLLoaderClientImpl> client(
-        new URLLoaderClientImpl(request_id, this, std::move(task_runner)));
+        new URLLoaderClientImpl(request_id, this, task_runner));
     std::unique_ptr<ThrottlingURLLoader> url_loader =
         ThrottlingURLLoader::CreateLoaderAndStart(
             url_loader_factory, std::move(throttles), routing_id, request_id,
-            mojom::kURLLoadOptionNone, std::move(request), client.get());
+            mojom::kURLLoadOptionNone, std::move(request), client.get(),
+            std::move(task_runner));
+    ;
     pending_requests_[request_id]->url_loader = std::move(url_loader);
     pending_requests_[request_id]->url_loader_client = std::move(client);
   } else {
diff --git a/content/child/url_loader_client_impl.cc b/content/child/url_loader_client_impl.cc
index 6671134..e49889b3 100644
--- a/content/child/url_loader_client_impl.cc
+++ b/content/child/url_loader_client_impl.cc
@@ -17,8 +17,7 @@
     int request_id,
     ResourceDispatcher* resource_dispatcher,
     scoped_refptr<base::SingleThreadTaskRunner> task_runner)
-    : binding_(this),
-      request_id_(request_id),
+    : request_id_(request_id),
       resource_dispatcher_(resource_dispatcher),
       task_runner_(std::move(task_runner)),
       weak_factory_(this) {}
@@ -28,10 +27,6 @@
     body_consumer_->Cancel();
 }
 
-void URLLoaderClientImpl::Bind(mojom::URLLoaderClientPtr* client_ptr) {
-  binding_.Bind(mojo::MakeRequest(client_ptr), task_runner_);
-}
-
 void URLLoaderClientImpl::SetDefersLoading() {
   is_deferred_ = true;
   if (body_consumer_)
diff --git a/content/child/url_loader_client_impl.h b/content/child/url_loader_client_impl.h
index 39fb7db..872c678 100644
--- a/content/child/url_loader_client_impl.h
+++ b/content/child/url_loader_client_impl.h
@@ -13,7 +13,6 @@
 #include "content/common/content_export.h"
 #include "content/common/url_loader.mojom.h"
 #include "ipc/ipc_message.h"
-#include "mojo/public/cpp/bindings/binding.h"
 #include "mojo/public/cpp/system/data_pipe.h"
 
 namespace base {
@@ -37,8 +36,6 @@
                       scoped_refptr<base::SingleThreadTaskRunner> task_runner);
   ~URLLoaderClientImpl() override;
 
-  void Bind(mojom::URLLoaderClientPtr* client_ptr);
-
   // Sets |is_deferred_|. From now, the received messages are not dispatched
   // to clients until UnsetDefersLoading is called.
   void SetDefersLoading();
@@ -69,7 +66,6 @@
   bool NeedsStoringMessage() const;
   void StoreAndDispatch(const IPC::Message& message);
 
-  mojo::Binding<mojom::URLLoaderClient> binding_;
   scoped_refptr<URLResponseBodyConsumer> body_consumer_;
   mojom::DownloadedTempFilePtr downloaded_file_;
   std::vector<IPC::Message> deferred_messages_;
diff --git a/content/common/throttling_url_loader.cc b/content/common/throttling_url_loader.cc
index 9f258c9..df1ef23 100644
--- a/content/common/throttling_url_loader.cc
+++ b/content/common/throttling_url_loader.cc
@@ -4,8 +4,50 @@
 
 #include "content/common/throttling_url_loader.h"
 
+#include "base/single_thread_task_runner.h"
+
 namespace content {
 
+ThrottlingURLLoader::StartInfo::StartInfo(
+    mojom::URLLoaderFactory* in_url_loader_factory,
+    int32_t in_routing_id,
+    int32_t in_request_id,
+    uint32_t in_options,
+    std::unique_ptr<ResourceRequest> in_url_request,
+    scoped_refptr<base::SingleThreadTaskRunner> in_task_runner)
+    : url_loader_factory(in_url_loader_factory),
+      routing_id(in_routing_id),
+      request_id(in_request_id),
+      options(in_options),
+      url_request(std::move(in_url_request)),
+      task_runner(std::move(in_task_runner)) {}
+
+ThrottlingURLLoader::StartInfo::~StartInfo() = default;
+
+ThrottlingURLLoader::ResponseInfo::ResponseInfo(
+    const ResourceResponseHead& in_response_head,
+    const base::Optional<net::SSLInfo>& in_ssl_info,
+    mojom::DownloadedTempFilePtr in_downloaded_file)
+    : response_head(in_response_head),
+      ssl_info(in_ssl_info),
+      downloaded_file(std::move(in_downloaded_file)) {}
+
+ThrottlingURLLoader::ResponseInfo::~ResponseInfo() = default;
+
+ThrottlingURLLoader::RedirectInfo::RedirectInfo(
+    const net::RedirectInfo& in_redirect_info,
+    const ResourceResponseHead& in_response_head)
+    : redirect_info(in_redirect_info), response_head(in_response_head) {}
+
+ThrottlingURLLoader::RedirectInfo::~RedirectInfo() = default;
+
+ThrottlingURLLoader::PriorityInfo::PriorityInfo(
+    net::RequestPriority in_priority,
+    int32_t in_intra_priority_value)
+    : priority(in_priority), intra_priority_value(in_intra_priority_value) {}
+
+ThrottlingURLLoader::PriorityInfo::~PriorityInfo() = default;
+
 // static
 std::unique_ptr<ThrottlingURLLoader> ThrottlingURLLoader::CreateLoaderAndStart(
     mojom::URLLoaderFactory* factory,
@@ -14,11 +56,12 @@
     int32_t request_id,
     uint32_t options,
     std::unique_ptr<ResourceRequest> url_request,
-    mojom::URLLoaderClient* client) {
+    mojom::URLLoaderClient* client,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   std::unique_ptr<ThrottlingURLLoader> loader(
       new ThrottlingURLLoader(std::move(throttles), client));
   loader->Start(factory, routing_id, request_id, options,
-                std::move(url_request));
+                std::move(url_request), std::move(task_runner));
   return loader;
 }
 
@@ -33,9 +76,8 @@
                                       int32_t intra_priority_value) {
   if (!url_loader_ && !cancelled_by_throttle_) {
     DCHECK_EQ(DEFERRED_START, deferred_stage_);
-    set_priority_cached_ = true;
-    priority_ = priority;
-    intra_priority_value_ = intra_priority_value;
+    priority_info_ =
+        base::MakeUnique<PriorityInfo>(priority, intra_priority_value);
     return;
   }
 
@@ -55,11 +97,13 @@
   }
 }
 
-void ThrottlingURLLoader::Start(mojom::URLLoaderFactory* factory,
-                                int32_t routing_id,
-                                int32_t request_id,
-                                uint32_t options,
-                                std::unique_ptr<ResourceRequest> url_request) {
+void ThrottlingURLLoader::Start(
+    mojom::URLLoaderFactory* factory,
+    int32_t routing_id,
+    int32_t request_id,
+    uint32_t options,
+    std::unique_ptr<ResourceRequest> url_request,
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
   DCHECK_EQ(DEFERRED_NONE, deferred_stage_);
   DCHECK(!cancelled_by_throttle_);
 
@@ -72,18 +116,17 @@
 
     if (deferred) {
       deferred_stage_ = DEFERRED_START;
-      url_loader_factory_ = factory;
-      routing_id_ = routing_id;
-      request_id_ = request_id;
-      options_ = options;
-      url_request_ = std::move(url_request);
+      start_info_ = base::MakeUnique<StartInfo>(factory, routing_id, request_id,
+                                                options, std::move(url_request),
+                                                std::move(task_runner));
       return;
     }
   }
 
-  factory->CreateLoaderAndStart(mojo::MakeRequest(&url_loader_), routing_id,
-                                request_id, options, *url_request,
-                                client_binding_.CreateInterfacePtrAndBind());
+  factory->CreateLoaderAndStart(
+      mojo::MakeRequest(&url_loader_), routing_id, request_id, options,
+      *url_request,
+      client_binding_.CreateInterfacePtrAndBind(std::move(task_runner)));
 }
 
 void ThrottlingURLLoader::OnReceiveResponse(
@@ -101,9 +144,8 @@
 
     if (deferred) {
       deferred_stage_ = DEFERRED_RESPONSE;
-      response_head_ = response_head;
-      ssl_info_ = ssl_info;
-      downloaded_file_ = std::move(downloaded_file);
+      response_info_ = base::MakeUnique<ResponseInfo>(
+          response_head, ssl_info, std::move(downloaded_file));
       client_binding_.PauseIncomingMethodCallProcessing();
       return;
     }
@@ -127,8 +169,8 @@
 
     if (deferred) {
       deferred_stage_ = DEFERRED_REDIRECT;
-      redirect_info_ = redirect_info;
-      response_head_ = response_head;
+      redirect_info_ =
+          base::MakeUnique<RedirectInfo>(redirect_info, response_head);
       client_binding_.PauseIncomingMethodCallProcessing();
       return;
     }
@@ -212,25 +254,31 @@
 
   switch (deferred_stage_) {
     case DEFERRED_START: {
-      url_loader_factory_->CreateLoaderAndStart(
-          mojo::MakeRequest(&url_loader_), routing_id_, request_id_, options_,
-          *url_request_, client_binding_.CreateInterfacePtrAndBind());
+      start_info_->url_loader_factory->CreateLoaderAndStart(
+          mojo::MakeRequest(&url_loader_), start_info_->routing_id,
+          start_info_->request_id, start_info_->options,
+          *start_info_->url_request,
+          client_binding_.CreateInterfacePtrAndBind(
+              std::move(start_info_->task_runner)));
 
-      if (set_priority_cached_) {
-        set_priority_cached_ = false;
-        url_loader_->SetPriority(priority_, intra_priority_value_);
+      if (priority_info_) {
+        auto priority_info = std::move(priority_info_);
+        url_loader_->SetPriority(priority_info->priority,
+                                 priority_info->intra_priority_value);
       }
       break;
     }
     case DEFERRED_REDIRECT: {
       client_binding_.ResumeIncomingMethodCallProcessing();
-      forwarding_client_->OnReceiveRedirect(redirect_info_, response_head_);
+      forwarding_client_->OnReceiveRedirect(redirect_info_->redirect_info,
+                                            redirect_info_->response_head);
       break;
     }
     case DEFERRED_RESPONSE: {
       client_binding_.ResumeIncomingMethodCallProcessing();
-      forwarding_client_->OnReceiveResponse(response_head_, ssl_info_,
-                                            std::move(downloaded_file_));
+      forwarding_client_->OnReceiveResponse(
+          response_info_->response_head, response_info_->ssl_info,
+          std::move(response_info_->downloaded_file));
       break;
     }
     default:
diff --git a/content/common/throttling_url_loader.h b/content/common/throttling_url_loader.h
index 202d51dc..98dc5e4 100644
--- a/content/common/throttling_url_loader.h
+++ b/content/common/throttling_url_loader.h
@@ -7,12 +7,18 @@
 
 #include <memory>
 
+#include "base/memory/ref_counted.h"
+#include "base/threading/thread_task_runner_handle.h"
 #include "content/common/content_export.h"
 #include "content/common/url_loader.mojom.h"
 #include "content/common/url_loader_factory.mojom.h"
 #include "content/public/common/url_loader_throttle.h"
 #include "mojo/public/cpp/bindings/binding.h"
 
+namespace base {
+class SingleThreadTaskRunner;
+}
+
 namespace content {
 
 namespace mojom {
@@ -34,7 +40,9 @@
       int32_t request_id,
       uint32_t options,
       std::unique_ptr<ResourceRequest> url_request,
-      mojom::URLLoaderClient* client);
+      mojom::URLLoaderClient* client,
+      scoped_refptr<base::SingleThreadTaskRunner> task_runner =
+          base::ThreadTaskRunnerHandle::Get());
 
   ~ThrottlingURLLoader() override;
 
@@ -49,7 +57,8 @@
              int32_t routing_id,
              int32_t request_id,
              uint32_t options,
-             std::unique_ptr<ResourceRequest> url_request);
+             std::unique_ptr<ResourceRequest> url_request,
+             scoped_refptr<base::SingleThreadTaskRunner> task_runner);
 
   // mojom::URLLoaderClient implementation:
   void OnReceiveResponse(const ResourceResponseHead& response_head,
@@ -87,27 +96,60 @@
 
   mojom::URLLoaderAssociatedPtr url_loader_;
 
+  struct StartInfo {
+    StartInfo(mojom::URLLoaderFactory* in_url_loader_factory,
+              int32_t in_routing_id,
+              int32_t in_request_id,
+              uint32_t in_options,
+              std::unique_ptr<ResourceRequest> in_url_request,
+              scoped_refptr<base::SingleThreadTaskRunner> in_task_runner);
+    ~StartInfo();
+
+    mojom::URLLoaderFactory* url_loader_factory;
+    int32_t routing_id;
+    int32_t request_id;
+    uint32_t options;
+    std::unique_ptr<ResourceRequest> url_request;
+    // |task_runner_| is used to set up |client_binding_|.
+    scoped_refptr<base::SingleThreadTaskRunner> task_runner;
+  };
   // Set if start is deferred.
-  mojom::URLLoaderFactory* url_loader_factory_ = nullptr;
-  int32_t routing_id_ = -1;
-  int32_t request_id_ = -1;
-  uint32_t options_ = mojom::kURLLoadOptionNone;
-  std::unique_ptr<ResourceRequest> url_request_;
+  std::unique_ptr<StartInfo> start_info_;
 
-  // Set if either response or redirect is deferred.
-  ResourceResponseHead response_head_;
+  struct ResponseInfo {
+    ResponseInfo(const ResourceResponseHead& in_response_head,
+                 const base::Optional<net::SSLInfo>& in_ssl_info,
+                 mojom::DownloadedTempFilePtr in_downloaded_file);
+    ~ResponseInfo();
 
+    ResourceResponseHead response_head;
+    base::Optional<net::SSLInfo> ssl_info;
+    mojom::DownloadedTempFilePtr downloaded_file;
+  };
   // Set if response is deferred.
-  base::Optional<net::SSLInfo> ssl_info_;
-  mojom::DownloadedTempFilePtr downloaded_file_;
+  std::unique_ptr<ResponseInfo> response_info_;
 
+  struct RedirectInfo {
+    RedirectInfo(const net::RedirectInfo& in_redirect_info,
+                 const ResourceResponseHead& in_response_head);
+    ~RedirectInfo();
+
+    net::RedirectInfo redirect_info;
+    ResourceResponseHead response_head;
+  };
   // Set if redirect is deferred.
-  net::RedirectInfo redirect_info_;
+  std::unique_ptr<RedirectInfo> redirect_info_;
 
+  struct PriorityInfo {
+    PriorityInfo(net::RequestPriority in_priority,
+                 int32_t in_intra_priority_value);
+    ~PriorityInfo();
+
+    net::RequestPriority priority;
+    int32_t intra_priority_value;
+  };
   // Set if request is deferred and SetPriority() is called.
-  bool set_priority_cached_ = false;
-  net::RequestPriority priority_ = net::MINIMUM_PRIORITY;
-  int32_t intra_priority_value_ = 0;
+  std::unique_ptr<PriorityInfo> priority_info_;
 
   DISALLOW_COPY_AND_ASSIGN(ThrottlingURLLoader);
 };
diff --git a/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm b/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm
index 814e302..0b2f3c1 100644
--- a/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm
+++ b/ios/chrome/browser/ui/payments/credit_card_edit_mediator.mm
@@ -49,6 +49,12 @@
 @property(nonatomic, strong)
     NSMutableDictionary<NSNumber*, EditorField*>* fieldsMap;
 
+// The reference to the autofill::CREDIT_CARD_EXP_MONTH field.
+@property(nonatomic, strong) EditorField* creditCardExpMonthField;
+
+// The reference to the autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR field.
+@property(nonatomic, strong) EditorField* creditCardExpYearField;
+
 @end
 
 @implementation CreditCardEditViewControllerMediator
@@ -59,6 +65,8 @@
 @synthesize paymentRequest = _paymentRequest;
 @synthesize creditCard = _creditCard;
 @synthesize fieldsMap = _fieldsMap;
+@synthesize creditCardExpMonthField = _creditCardExpMonthField;
+@synthesize creditCardExpYearField = _creditCardExpYearField;
 
 - (instancetype)initWithPaymentRequest:(PaymentRequest*)paymentRequest
                             creditCard:(autofill::CreditCard*)creditCard {
@@ -83,7 +91,10 @@
 
 - (void)setConsumer:(id<PaymentRequestEditConsumer>)consumer {
   _consumer = consumer;
+
   [self.consumer setEditorFields:[self createEditorFields]];
+  [self loadMonths];
+  [self loadYears];
 }
 
 - (void)setBillingProfile:(autofill::AutofillProfile*)billingProfile {
@@ -155,6 +166,55 @@
 
 #pragma mark - Helper methods
 
+// Queries the month numbers.
+- (void)loadMonths {
+  NSMutableArray<NSString*>* months = [[NSMutableArray alloc] init];
+
+  for (int month = 1; month <= 12; month++) {
+    NSString* monthString = [NSString stringWithFormat:@"%02d", month];
+    [months addObject:monthString];
+  }
+
+  // Notify the view controller asynchronously to allow for the view to update.
+  __weak CreditCardEditViewControllerMediator* weakSelf = self;
+  dispatch_async(dispatch_get_main_queue(), ^{
+    [weakSelf.consumer setOptions:months
+                   forEditorField:weakSelf.creditCardExpMonthField];
+  });
+}
+
+// Queries the year numbers.
+- (void)loadYears {
+  NSMutableArray<NSString*>* years = [[NSMutableArray alloc] init];
+
+  NSDateComponents* dateComponents =
+      [[NSCalendar currentCalendar] components:NSCalendarUnitYear
+                                      fromDate:[NSDate date]];
+
+  int currentYear = [dateComponents year];
+  bool foundCardExpirationYear = false;
+  for (int year = currentYear; year < currentYear + 10; year++) {
+    NSString* yearString = [NSString stringWithFormat:@"%04d", year];
+    if ([yearString isEqualToString:_creditCardExpYearField.value])
+      foundCardExpirationYear = true;
+    [years addObject:yearString];
+  }
+
+  // Ensure that the expiration year on a user's saved card is
+  // always available as one of the options to select from. This is
+  // useful in the case that the user's card is expired.
+  if (!foundCardExpirationYear) {
+    [years insertObject:_creditCardExpYearField.value atIndex:0];
+  }
+
+  // Notify the view controller asynchronously to allow for the view to update.
+  __weak CreditCardEditViewControllerMediator* weakSelf = self;
+  dispatch_async(dispatch_get_main_queue(), ^{
+    [weakSelf.consumer setOptions:years
+                   forEditorField:weakSelf.creditCardExpYearField];
+  });
+}
+
 - (NSArray<EditorField*>*)createEditorFields {
   NSMutableArray<EditorField*>* fields = [[NSMutableArray alloc] init];
 
@@ -220,11 +280,16 @@
   }
   [fields addObject:creditCardNameField];
 
+  NSDateComponents* dateComponents = [[NSCalendar currentCalendar]
+      components:NSCalendarUnitMonth | NSCalendarUnitYear
+        fromDate:[NSDate date]];
+
   // Expiration month field.
+  int currentMonth = [dateComponents month];
   NSString* creditCardExpMonth =
       _creditCard
           ? [NSString stringWithFormat:@"%02d", _creditCard->expiration_month()]
-          : nil;
+          : [NSString stringWithFormat:@"%02d", currentMonth];
   fieldKey = [NSNumber numberWithInt:AutofillUITypeCreditCardExpMonth];
   EditorField* expirationMonthField = self.fieldsMap[fieldKey];
   if (!expirationMonthField) {
@@ -236,13 +301,15 @@
                       required:YES];
     [self.fieldsMap setObject:expirationMonthField forKey:fieldKey];
   }
+  self.creditCardExpMonthField = expirationMonthField;
   [fields addObject:expirationMonthField];
 
   // Expiration year field.
+  int currentYear = [dateComponents year];
   NSString* creditCardExpYear =
       _creditCard
           ? [NSString stringWithFormat:@"%04d", _creditCard->expiration_year()]
-          : nil;
+          : [NSString stringWithFormat:@"%04d", currentYear];
   fieldKey = [NSNumber numberWithInt:AutofillUITypeCreditCardExpYear];
   EditorField* expirationYearField = self.fieldsMap[fieldKey];
   if (!expirationYearField) {
@@ -254,6 +321,7 @@
                       required:YES];
     [self.fieldsMap setObject:expirationYearField forKey:fieldKey];
   }
+  self.creditCardExpYearField = expirationYearField;
   [fields addObject:expirationYearField];
 
   // The billing address field appears after the expiration year field.
diff --git a/ios/web/public/test/BUILD.gn b/ios/web/public/test/BUILD.gn
index 90975bd2..6c8c1fd 100644
--- a/ios/web/public/test/BUILD.gn
+++ b/ios/web/public/test/BUILD.gn
@@ -3,6 +3,7 @@
 # found in the LICENSE file.
 
 source_set("test") {
+  configs += [ "//build/config/compiler:enable_arc" ]
   testonly = true
 
   deps = [
diff --git a/ios/web/public/test/fakes/crw_test_web_state_observer.h b/ios/web/public/test/fakes/crw_test_web_state_observer.h
index 9879352..f0c4bda 100644
--- a/ios/web/public/test/fakes/crw_test_web_state_observer.h
+++ b/ios/web/public/test/fakes/crw_test_web_state_observer.h
@@ -11,6 +11,9 @@
 // Test implementation of CRWWebStateObserver protocol.
 @interface CRWTestWebStateObserver : NSObject<CRWWebStateObserver>
 
+// Arguments passed to |webState:navigationItemsPrunedCount:|.
+@property(nonatomic, readonly)
+    web::TestNavigationItemsPrunedInfo* navigationItemsPrunedInfo;
 // Arguments passed to |webState:didStartNavigation:|.
 @property(nonatomic, readonly)
     web::TestDidStartNavigationInfo* didStartNavigationInfo;
diff --git a/ios/web/public/test/fakes/crw_test_web_state_observer.mm b/ios/web/public/test/fakes/crw_test_web_state_observer.mm
index 2d806c22..0571b1c 100644
--- a/ios/web/public/test/fakes/crw_test_web_state_observer.mm
+++ b/ios/web/public/test/fakes/crw_test_web_state_observer.mm
@@ -23,6 +23,9 @@
 }
 
 @implementation CRWTestWebStateObserver {
+  // Arguments passed to |webState:navigationItemsPrunedCount:|.
+  std::unique_ptr<web::TestNavigationItemsPrunedInfo>
+      _navigationItemsPrunedInfo;
   // Arguments passed to |webState:didStartNavigation:|.
   std::unique_ptr<web::TestDidStartNavigationInfo> _didStartNavigationInfo;
   // Arguments passed to |webState:didFinishNavigationForURL:|.
@@ -62,6 +65,10 @@
   std::unique_ptr<web::TestStartLoadingInfo> _startLoadingInfo;
 }
 
+- (web::TestNavigationItemsPrunedInfo*)navigationItemsPrunedInfo {
+  return _navigationItemsPrunedInfo.get();
+}
+
 - (web::TestDidStartNavigationInfo*)didStartNavigationInfo {
   return _didStartNavigationInfo.get();
 }
@@ -130,6 +137,14 @@
 #pragma mark CRWWebStateObserver methods -
 
 - (void)webState:(web::WebState*)webState
+    navigationItemsPrunedCount:(size_t)pruned_item_count {
+  _navigationItemsPrunedInfo =
+      base::MakeUnique<web::TestNavigationItemsPrunedInfo>();
+  _navigationItemsPrunedInfo->web_state = webState;
+  _navigationItemsPrunedInfo->count = pruned_item_count;
+}
+
+- (void)webState:(web::WebState*)webState
     didStartNavigation:(web::NavigationContext*)navigation {
   ASSERT_TRUE(!navigation->GetError() || !navigation->IsSameDocument());
   _didStartNavigationInfo = base::MakeUnique<web::TestDidStartNavigationInfo>();
diff --git a/ios/web/public/test/js_test_util.h b/ios/web/public/test/js_test_util.h
index ea21a50..c7b1e80 100644
--- a/ios/web/public/test/js_test_util.h
+++ b/ios/web/public/test/js_test_util.h
@@ -27,7 +27,11 @@
 
 // Executes JavaScript on |web_view| and returns the result as an id.
 // |error| can be null and will be updated only if script execution fails.
-id ExecuteJavaScript(WKWebView* web_view, NSString* script, NSError** error);
+// TODO(crbug.com/730062): Remove __unsafe_unretained when all callers are
+// are converted to ARC.
+id ExecuteJavaScript(WKWebView* web_view,
+                     NSString* script,
+                     NSError* __unsafe_unretained* error);
 
 // Executes JavaScript on |web_view| and returns the result as an id.
 // Fails if there was an error during script execution.
diff --git a/ios/web/public/test/js_test_util.mm b/ios/web/public/test/js_test_util.mm
index 9ddf9a8..4f9c7545 100644
--- a/ios/web/public/test/js_test_util.mm
+++ b/ios/web/public/test/js_test_util.mm
@@ -7,22 +7,25 @@
 #import <WebKit/WebKit.h>
 
 #include "base/logging.h"
-#import "base/mac/scoped_nsobject.h"
 #include "base/strings/sys_string_conversions.h"
 #import "ios/testing/wait_util.h"
 #import "ios/web/public/web_state/js/crw_js_injection_manager.h"
 #import "ios/web/public/web_state/js/crw_js_injection_receiver.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace web {
 
 id ExecuteJavaScript(CRWJSInjectionManager* manager, NSString* script) {
-  __block base::scoped_nsobject<NSString> result;
+  __block NSString* result;
   __block bool completed = false;
   [manager executeJavaScript:script
            completionHandler:^(id execution_result, NSError* error) {
              DCHECK(!error);
-             result.reset([execution_result copy]);
+             result = [execution_result copy];
              completed = true;
            }];
 
@@ -35,12 +38,12 @@
       << "CRWJSInjectionManager failed to complete javascript execution.\n"
       << base::SysNSStringToUTF8(
              [[NSThread callStackSymbols] componentsJoinedByString:@"\n"]);
-  return [[result retain] autorelease];
+  return result;
 }
 
 id ExecuteJavaScript(CRWJSInjectionReceiver* receiver, NSString* script) {
-  base::scoped_nsobject<CRWJSInjectionManager> manager(
-      [[CRWJSInjectionManager alloc] initWithReceiver:receiver]);
+  CRWJSInjectionManager* manager =
+      [[CRWJSInjectionManager alloc] initWithReceiver:receiver];
   return ExecuteJavaScript(manager, script);
 }
 
@@ -48,14 +51,16 @@
   return ExecuteJavaScript(web_view, script, nullptr);
 }
 
-id ExecuteJavaScript(WKWebView* web_view, NSString* script, NSError** error) {
-  __block base::scoped_nsobject<id> result;
+id ExecuteJavaScript(WKWebView* web_view,
+                     NSString* script,
+                     NSError* __unsafe_unretained* error) {
+  __block id result;
   __block bool completed = false;
+  __block NSError* temp_error = nil;
   [web_view evaluateJavaScript:script
              completionHandler:^(id script_result, NSError* script_error) {
-               result.reset([script_result copy]);
-               if (error)
-                 *error = [[script_error copy] autorelease];
+               result = [script_result copy];
+               temp_error = [script_error copy];
                completed = true;
              }];
   BOOL success = testing::WaitUntilConditionOrTimeout(
@@ -66,7 +71,11 @@
   EXPECT_TRUE(success) << "WKWebView failed to complete javascript execution.\n"
                        << base::SysNSStringToUTF8([[NSThread callStackSymbols]
                               componentsJoinedByString:@"\n"]);
-  return [[result retain] autorelease];
+  if (error) {
+    NSError* __autoreleasing auto_released_error = temp_error;
+    *error = auto_released_error;
+  }
+  return result;
 }
 
 }  // namespace web
diff --git a/ios/web/public/test/native_controller_test_util.mm b/ios/web/public/test/native_controller_test_util.mm
index bee41ab..18ea8ad 100644
--- a/ios/web/public/test/native_controller_test_util.mm
+++ b/ios/web/public/test/native_controller_test_util.mm
@@ -7,6 +7,10 @@
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/web_state_impl.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace web {
 namespace test {
 
diff --git a/ios/web/public/test/navigation_test_util.mm b/ios/web/public/test/navigation_test_util.mm
index fb8904d..c546cec8 100644
--- a/ios/web/public/test/navigation_test_util.mm
+++ b/ios/web/public/test/navigation_test_util.mm
@@ -6,6 +6,10 @@
 
 #import "ios/web/public/navigation_manager.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 using web::NavigationManager;
 
 namespace web {
diff --git a/ios/web/public/test/scoped_testing_web_client.mm b/ios/web/public/test/scoped_testing_web_client.mm
index 98807ea..2c883f8 100644
--- a/ios/web/public/test/scoped_testing_web_client.mm
+++ b/ios/web/public/test/scoped_testing_web_client.mm
@@ -7,6 +7,10 @@
 #include "base/logging.h"
 #import "ios/web/public/web_client.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace web {
 
 ScopedTestingWebClient::ScopedTestingWebClient(
diff --git a/ios/web/public/test/test_redirect_observer.mm b/ios/web/public/test/test_redirect_observer.mm
index d5762072..c162911 100644
--- a/ios/web/public/test/test_redirect_observer.mm
+++ b/ios/web/public/test/test_redirect_observer.mm
@@ -11,6 +11,10 @@
 #include "ios/web/public/web_state/navigation_context.h"
 #import "ios/web/public/web_state/web_state.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace {
 // The key under which TestRedirectObservers are stored in a WebState's user
 // data.
diff --git a/ios/web/public/test/web_test.mm b/ios/web/public/test/web_test.mm
index e3525b9..c9943dc9 100644
--- a/ios/web/public/test/web_test.mm
+++ b/ios/web/public/test/web_test.mm
@@ -9,6 +9,10 @@
 #include "ios/web/public/web_state/global_web_state_observer.h"
 #import "ios/web/public/test/fakes/test_web_client.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace web {
 
 class WebTestRenderProcessCrashObserver : public GlobalWebStateObserver {
diff --git a/ios/web/public/test/web_test_with_web_state.mm b/ios/web/public/test/web_test_with_web_state.mm
index 963c635..cdad447 100644
--- a/ios/web/public/test/web_test_with_web_state.mm
+++ b/ios/web/public/test/web_test_with_web_state.mm
@@ -13,6 +13,10 @@
 #import "ios/web/web_state/ui/crw_web_controller.h"
 #import "ios/web/web_state/web_state_impl.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 namespace {
 // Returns CRWWebController for the given |web_state|.
 CRWWebController* GetWebController(web::WebState* web_state) {
@@ -127,18 +131,18 @@
 }
 
 id WebTestWithWebState::ExecuteJavaScript(NSString* script) {
-  __block base::scoped_nsprotocol<id> executionResult;
+  __block id executionResult;
   __block bool executionCompleted = false;
   [GetWebController(web_state())
       executeJavaScript:script
       completionHandler:^(id result, NSError* error) {
-        executionResult.reset([result copy]);
+        executionResult = [result copy];
         executionCompleted = true;
       }];
   base::test::ios::WaitUntilCondition(^{
     return executionCompleted;
   });
-  return [[executionResult retain] autorelease];
+  return executionResult;
 }
 
 void WebTestWithWebState::DestroyWebState() {
diff --git a/ios/web/public/test/web_view_interaction_test_util.mm b/ios/web/public/test/web_view_interaction_test_util.mm
index 9e629c5..ba7c730 100644
--- a/ios/web/public/test/web_view_interaction_test_util.mm
+++ b/ios/web/public/test/web_view_interaction_test_util.mm
@@ -14,6 +14,10 @@
 #import "ios/web/web_state/ui/crw_web_view_proxy_impl.h"
 #import "ios/web/web_state/web_state_impl.h"
 
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
 using web::NavigationManager;
 
 namespace web {
@@ -30,7 +34,7 @@
   __block std::unique_ptr<base::Value> result;
   __block bool did_finish = false;
   web_state->ExecuteJavaScript(base::UTF8ToUTF16(script),
-                               base::BindBlock(^(const base::Value* value) {
+                               base::BindBlockArc(^(const base::Value* value) {
                                  if (value)
                                    result = value->CreateDeepCopy();
                                  did_finish = true;
diff --git a/ios/web/public/web_state/web_state_observer_bridge.h b/ios/web/public/web_state/web_state_observer_bridge.h
index 7712ad7b..f60b59ab 100644
--- a/ios/web/public/web_state/web_state_observer_bridge.h
+++ b/ios/web/public/web_state/web_state_observer_bridge.h
@@ -18,6 +18,10 @@
 @protocol CRWWebStateObserver<NSObject>
 @optional
 
+// Invoked by WebStateObserverBridge::NavigationItemsPruned.
+- (void)webState:(web::WebState*)webState
+    navigationItemsPrunedCount:(size_t)pruned_item_count;
+
 // Invoked by WebStateObserverBridge::NavigationItemCommitted.
 - (void)webState:(web::WebState*)webState
     didCommitNavigationWithDetails:
@@ -99,6 +103,7 @@
   ~WebStateObserverBridge() override;
 
   // web::WebStateObserver methods.
+  void NavigationItemsPruned(size_t pruned_item_count) override;
   void NavigationItemCommitted(
       const LoadCommittedDetails& load_details) override;
   void DidStartNavigation(NavigationContext* navigation_context) override;
diff --git a/ios/web/web_state/web_state_observer_bridge.mm b/ios/web/web_state/web_state_observer_bridge.mm
index 04a67543..24d3e00a 100644
--- a/ios/web/web_state/web_state_observer_bridge.mm
+++ b/ios/web/web_state/web_state_observer_bridge.mm
@@ -14,6 +14,14 @@
 WebStateObserverBridge::~WebStateObserverBridge() {
 }
 
+void WebStateObserverBridge::NavigationItemsPruned(size_t pruned_item_count) {
+  SEL selector = @selector(webState:navigationItemsPrunedCount:);
+  if ([observer_ respondsToSelector:selector]) {
+    [observer_ webState:web_state()
+        navigationItemsPrunedCount:pruned_item_count];
+  }
+}
+
 void WebStateObserverBridge::NavigationItemCommitted(
     const web::LoadCommittedDetails& load_detatils) {
   SEL selector = @selector(webState:didCommitNavigationWithDetails:);
diff --git a/ios/web/web_state/web_state_observer_bridge_unittest.mm b/ios/web/web_state/web_state_observer_bridge_unittest.mm
index 9b19baa..2bebe8d 100644
--- a/ios/web/web_state/web_state_observer_bridge_unittest.mm
+++ b/ios/web/web_state/web_state_observer_bridge_unittest.mm
@@ -38,6 +38,17 @@
   scoped_refptr<net::HttpResponseHeaders> response_headers_;
 };
 
+// Tests |webState:navigationItemsPrunedCount:| forwarding.
+TEST_F(WebStateObserverBridgeTest, NavigationItemsPruned) {
+  ASSERT_FALSE([observer_ navigationItemsPrunedInfo]);
+
+  bridge_->NavigationItemsPruned(1);
+
+  ASSERT_TRUE([observer_ navigationItemsPrunedInfo]);
+  EXPECT_EQ(&test_web_state_, [observer_ navigationItemsPrunedInfo]->web_state);
+  EXPECT_EQ(1, [observer_ navigationItemsPrunedInfo]->count);
+}
+
 // Tests |webState:didStartNavigation:| forwarding.
 TEST_F(WebStateObserverBridgeTest, DidStartNavigation) {
   ASSERT_FALSE([observer_ didStartNavigationInfo]);
diff --git a/ios/web_view/BUILD.gn b/ios/web_view/BUILD.gn
index 2907892..fbc8174 100644
--- a/ios/web_view/BUILD.gn
+++ b/ios/web_view/BUILD.gn
@@ -168,9 +168,9 @@
   ]
 }
 
-# Same framework as ChromeWebView above, but also exposes CroNet.
+# Same framework as ChromeWebView above, but also exposes Cronet.
 ios_framework_bundle("cronet_web_view_combined") {
-  output_name = "CroNetChromeWebView"
+  output_name = "CronetChromeWebView"
   info_plist = "Info.plist"
 
   public_headers = ios_web_view_public_headers
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm
index d2992789..616defce 100644
--- a/ios/web_view/internal/cwv_web_view.mm
+++ b/ios/web_view/internal/cwv_web_view.mm
@@ -77,12 +77,16 @@
 @property(nonatomic, readwrite) double estimatedProgress;
 @property(nonatomic, readwrite) BOOL canGoBack;
 @property(nonatomic, readwrite) BOOL canGoForward;
+@property(nonatomic, readwrite) NSURL* lastCommittedURL;
 @property(nonatomic, readwrite) BOOL loading;
 @property(nonatomic, readwrite, copy) NSString* title;
+@property(nonatomic, readwrite) NSURL* visibleURL;
 
 // Updates the availability of the back/forward navigation properties exposed
 // through |canGoBack| and |canGoForward|.
 - (void)updateNavigationAvailability;
+// Updates the URLs exposed through |lastCommittedURL| and |visibleURL|.
+- (void)updateCurrentURLs;
 
 @end
 
@@ -94,12 +98,14 @@
 @synthesize canGoForward = _canGoForward;
 @synthesize configuration = _configuration;
 @synthesize estimatedProgress = _estimatedProgress;
+@synthesize lastCommittedURL = _lastCommittedURL;
 @synthesize loading = _loading;
 @synthesize navigationDelegate = _navigationDelegate;
 @synthesize title = _title;
 @synthesize translationController = _translationController;
 @synthesize UIDelegate = _UIDelegate;
 @synthesize scrollView = _scrollView;
+@synthesize visibleURL = _visibleURL;
 
 + (NSString*)userAgentProduct {
   return gUserAgentProduct;
@@ -135,14 +141,6 @@
   return self;
 }
 
-- (NSURL*)visibleURL {
-  return net::NSURLWithGURL(_webState->GetVisibleURL());
-}
-
-- (NSURL*)lastCommittedURL {
-  return net::NSURLWithGURL(_webState->GetLastCommittedURL());
-}
-
 - (void)goBack {
   if (_webState->GetNavigationManager())
     _webState->GetNavigationManager()->GoBack();
@@ -173,6 +171,7 @@
   params.extra_headers.reset([request.allHTTPHeaderFields copy]);
   params.post_data.reset([request.HTTPBody copy]);
   _webState->GetNavigationManager()->LoadURLWithParams(params);
+  [self updateCurrentURLs];
 }
 
 - (void)evaluateJavaScript:(NSString*)javaScriptString
@@ -191,6 +190,11 @@
 // WebStateObserver implementation.
 
 - (void)webState:(web::WebState*)webState
+    navigationItemsPruned:(size_t)pruned_item_count {
+  [self updateCurrentURLs];
+}
+
+- (void)webState:(web::WebState*)webState
     didStartNavigation:(web::NavigationContext*)navigation {
   [self updateNavigationAvailability];
   SEL selector = @selector(webViewDidStartProvisionalNavigation:);
@@ -210,6 +214,7 @@
 - (void)webState:(web::WebState*)webState
     didFinishNavigation:(web::NavigationContext*)navigation {
   [self updateNavigationAvailability];
+  [self updateCurrentURLs];
 }
 
 - (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success {
@@ -388,4 +393,9 @@
       _webState && _webState->GetNavigationManager()->CanGoForward();
 }
 
+- (void)updateCurrentURLs {
+  self.lastCommittedURL = net::NSURLWithGURL(_webState->GetLastCommittedURL());
+  self.visibleURL = net::NSURLWithGURL(_webState->GetVisibleURL());
+}
+
 @end
diff --git a/ios/web_view/public/cwv_web_view.h b/ios/web_view/public/cwv_web_view.h
index ad7592b..1265614 100644
--- a/ios/web_view/public/cwv_web_view.h
+++ b/ios/web_view/public/cwv_web_view.h
@@ -42,10 +42,10 @@
 // Whether or not this web view is loading a page. KVO compliant.
 @property(nonatomic, readonly, getter=isLoading) BOOL loading;
 
-// The URL displayed in the url bar.
+// The URL displayed in the url bar. KVO Compliant.
 @property(nonatomic, readonly) NSURL* visibleURL;
 
-// The URL of the current document.
+// The URL of the current document. KVO Compliant.
 @property(nonatomic, readonly) NSURL* lastCommittedURL;
 
 // The current page title. KVO compliant.
diff --git a/ios/web_view/test/chrome_web_view_kvo_inttest.mm b/ios/web_view/test/chrome_web_view_kvo_inttest.mm
index a15f365..c7badae 100644
--- a/ios/web_view/test/chrome_web_view_kvo_inttest.mm
+++ b/ios/web_view/test/chrome_web_view_kvo_inttest.mm
@@ -153,4 +153,43 @@
   EXPECT_FALSE([observer.lastValue boolValue]);
 }
 
+// Tests that CWVWebView correctly reports |visibleURL| and |lastCommittedURL|.
+TEST_F(ChromeWebViewKvoTest, URLs) {
+  Observer* last_committed_url_observer = [[Observer alloc] init];
+  [last_committed_url_observer setObservedObject:web_view_
+                                         keyPath:@"lastCommittedURL"];
+
+  Observer* visible_url_observer = [[Observer alloc] init];
+  [visible_url_observer setObservedObject:web_view_ keyPath:@"visibleURL"];
+
+  GURL page_2 = GetUrlForPageWithTitle("Page 2");
+  NSURL* page_2_url = net::NSURLWithGURL(page_2);
+
+  std::string page_1_html = base::StringPrintf(
+      "<a id='link_1' href='%s'>Link 1</a>", page_2.spec().c_str());
+  NSURL* page_1_url =
+      net::NSURLWithGURL(GetUrlForPageWithTitleAndBody("Page 1", page_1_html));
+
+  [web_view_ loadRequest:[NSURLRequest requestWithURL:page_1_url]];
+
+  // |visibleURL| will update immediately
+  EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);
+
+  WaitForPageLoadCompletion(web_view_);
+  EXPECT_NSEQ(page_1_url, last_committed_url_observer.lastValue);
+  EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);
+
+  // Navigate to page 2.
+  EXPECT_TRUE(test::TapChromeWebViewElementWithId(web_view_, @"link_1"));
+  WaitForPageLoadCompletion(web_view_);
+  EXPECT_NSEQ(page_2_url, last_committed_url_observer.lastValue);
+  EXPECT_NSEQ(page_2_url, visible_url_observer.lastValue);
+
+  // Navigate back to page 1.
+  [web_view_ goBack];
+  WaitForPageLoadCompletion(web_view_);
+  EXPECT_NSEQ(page_1_url, last_committed_url_observer.lastValue);
+  EXPECT_NSEQ(page_1_url, visible_url_observer.lastValue);
+}
+
 }  // namespace ios_web_view
diff --git a/media/gpu/dxva_video_decode_accelerator_win.cc b/media/gpu/dxva_video_decode_accelerator_win.cc
index c2c4629..0fdf3d6c 100644
--- a/media/gpu/dxva_video_decode_accelerator_win.cc
+++ b/media/gpu/dxva_video_decode_accelerator_win.cc
@@ -1300,7 +1300,7 @@
     static const gfx::Size kCachedH264Resolution = GetMaxResolutionForGUIDs(
         kDefaultMax, {DXVA2_ModeH264_E, DXVA2_Intel_ModeH264_E},
         {gfx::Size(2560, 1440), gfx::Size(3840, 2160), gfx::Size(4096, 2160),
-         gfx::Size(4096, 2304), gfx::Size(7680, 4320)});
+         gfx::Size(4096, 2304)});
     return kCachedH264Resolution;
   }
 
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 43ecc96..3bfe976 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -2387,7 +2387,6 @@
     "data/ssl/certificates/start_after_expiry.pem",
     "data/ssl/certificates/subjectAltName_sanity_check.pem",
     "data/ssl/certificates/subjectAltName_www_example_com.pem",
-    "data/ssl/certificates/test_mail_google_com.pem",
     "data/ssl/certificates/thawte.single.pem",
     "data/ssl/certificates/tls_feature_extension.pem",
     "data/ssl/certificates/tripadvisor-verisign-chain.pem",
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index 60fc941..a32173c 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -804,36 +804,36 @@
       // C=FR, ST=France, L=Paris, O=PM/SGDN, OU=DCSSI,
       // CN=IGC/A/emailAddress=igca@sgdn.pm.gouv.fr
       {
-          {0x79, 0x23, 0xd5, 0x8d, 0x0f, 0xe0, 0x3c, 0xe6, 0xab, 0xad, 0xae,
-           0x27, 0x1a, 0x6d, 0x94, 0xf4, 0x14, 0xd1, 0xa8, 0x73},
+          {0x79, 0x23, 0xd5, 0x8d, 0x0f, 0xe0, 0x3c, 0xe6, 0xab, 0xad,
+           0xae, 0x27, 0x1a, 0x6d, 0x94, 0xf4, 0x14, 0xd1, 0xa8, 0x73},
           kDomainsANSSI,
       },
       // C=IN, O=India PKI, CN=CCA India 2007
       // Expires: July 4th 2015.
       {
-          {0xfe, 0xe3, 0x95, 0x21, 0x2d, 0x5f, 0xea, 0xfc, 0x7e, 0xdc, 0xcf,
-           0x88, 0x3f, 0x1e, 0xc0, 0x58, 0x27, 0xd8, 0xb8, 0xe4},
+          {0xfe, 0xe3, 0x95, 0x21, 0x2d, 0x5f, 0xea, 0xfc, 0x7e, 0xdc,
+           0xcf, 0x88, 0x3f, 0x1e, 0xc0, 0x58, 0x27, 0xd8, 0xb8, 0xe4},
           kDomainsIndiaCCA,
       },
       // C=IN, O=India PKI, CN=CCA India 2011
       // Expires: March 11 2016.
       {
-          {0xf1, 0x42, 0xf6, 0xa2, 0x7d, 0x29, 0x3e, 0xa8, 0xf9, 0x64, 0x52,
-           0x56, 0xed, 0x07, 0xa8, 0x63, 0xf2, 0xdb, 0x1c, 0xdf},
+          {0xf1, 0x42, 0xf6, 0xa2, 0x7d, 0x29, 0x3e, 0xa8, 0xf9, 0x64,
+           0x52, 0x56, 0xed, 0x07, 0xa8, 0x63, 0xf2, 0xdb, 0x1c, 0xdf},
           kDomainsIndiaCCA,
       },
       // C=IN, O=India PKI, CN=CCA India 2014
       // Expires: March 5 2024.
       {
-          {0x36, 0x8c, 0x4a, 0x1e, 0x2d, 0xb7, 0x81, 0xe8, 0x6b, 0xed, 0x5a,
-           0x0a, 0x42, 0xb8, 0xc5, 0xcf, 0x6d, 0xb3, 0x57, 0xe1},
+          {0x36, 0x8c, 0x4a, 0x1e, 0x2d, 0xb7, 0x81, 0xe8, 0x6b, 0xed,
+           0x5a, 0x0a, 0x42, 0xb8, 0xc5, 0xcf, 0x6d, 0xb3, 0x57, 0xe1},
           kDomainsIndiaCCA,
       },
       // Not a real certificate - just for testing. This is the SPKI hash of
       // the keys used in net/data/ssl/certificates/name_constraint_*.pem.
       {
-          {0x48, 0x49, 0x4a, 0xc5, 0x5a, 0x3e, 0xcd, 0xc5, 0x62, 0x9f, 0xef,
-           0x23, 0x14, 0xad, 0x05, 0xa9, 0x2a, 0x5c, 0x39, 0xc0},
+          {0x7b, 0x29, 0x02, 0xb7, 0x17, 0x63, 0x7f, 0xef, 0x53, 0x70,
+           0xff, 0x9d, 0x95, 0xee, 0x11, 0x64, 0xe7, 0x2e, 0x59, 0xf2},
           kDomainsTest,
       },
   };
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 9f84e0e..beae1af 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -1236,16 +1236,16 @@
 
   std::vector<std::string> expected_public_key_hashes = {
       // Target
-      "sha1/fSQl8GTgpmark/9mDK9qzIIGfFE=",
-      "sha256/5I5+4ndAhwDiWd1WqfBgDkKAAIEhsq0MfAx25Hoc+dA=",
+      "sha1/eykCtxdjf+9TcP+dle4RZOcuWfI=",
+      "sha256/jpsUnwFFTO7e+l5zQDYhutkf7uA+dCVsWfRvv0UDX40=",
 
       // Intermediate
-      "sha1/7+0Ms07hEkAc6zVPOo+uLtMEwfU=",
-      "sha256/MtnqgdSwAIgEjse7SpxnmyKoo/RTiL9CDIWwFnz4nas=",
+      "sha1/UCuWOTyNcmLrd/Ie2jTjCHyGV7M=",
+      "sha256/D9u0epgvPYlG9YiVp7V+IMT+xhUpB5BhsS/INjDXc4Y=",
 
       // Trust anchor
-      "sha1/dJwvO4gEVIZvretArGyBNggjlrQ=",
-      "sha256/z7x1Szes+eQOqJp6rBK3u/tQMs55FYojZHUCFiBcjuc="};
+      "sha1/7lRAdhiny84OU7rosLno5A+v0ls=",
+      "sha256/VypP3VWL7OaqTJ7mIBehWYlv8khPuFHpWiearZI2YjI="};
 
   // |public_key_hashes| does not have an ordering guarantee.
   EXPECT_THAT(expected_public_key_hashes,
diff --git a/net/cookies/cookie_monster.cc b/net/cookies/cookie_monster.cc
index 94d76d5..b015999 100644
--- a/net/cookies/cookie_monster.cc
+++ b/net/cookies/cookie_monster.cc
@@ -222,14 +222,12 @@
 };
 
 // For a CookieItVector iterator range [|it_begin|, |it_end|),
-// sorts the first |num_sort| + 1 elements by LastAccessDate().
-// The + 1 element exists so for any interval of length <= |num_sort| starting
-// from |cookies_its_begin|, a LastAccessDate() bound can be found.
+// sorts the first |num_sort| elements by LastAccessDate().
 void SortLeastRecentlyAccessed(CookieMonster::CookieItVector::iterator it_begin,
                                CookieMonster::CookieItVector::iterator it_end,
                                size_t num_sort) {
-  DCHECK_LT(static_cast<int>(num_sort), it_end - it_begin);
-  std::partial_sort(it_begin, it_begin + num_sort + 1, it_end, LRACookieSorter);
+  DCHECK_LE(static_cast<int>(num_sort), it_end - it_begin);
+  std::partial_sort(it_begin, it_begin + num_sort, it_end, LRACookieSorter);
 }
 
 // Given a single cookie vector |cookie_its|, pushs all of the secure cookies in
@@ -2022,18 +2020,44 @@
       SplitCookieVectorIntoSecureAndNonSecure(cookie_its, &secure_cookie_its,
                                               &non_secure_cookie_its);
       size_t non_secure_purge_goal =
-          std::min<size_t>(purge_goal, non_secure_cookie_its.size() - 1);
+          std::min<size_t>(purge_goal, non_secure_cookie_its.size());
 
+      base::Time earliest_non_secure_access_time;
       size_t just_deleted = GarbageCollectLeastRecentlyAccessed(
-          current, safe_date, non_secure_purge_goal, non_secure_cookie_its);
+          current, safe_date, non_secure_purge_goal, non_secure_cookie_its,
+          &earliest_non_secure_access_time);
       num_deleted += just_deleted;
 
-      if (just_deleted < purge_goal && secure_cookie_its.size() > 0) {
-        size_t secure_purge_goal = std::min<size_t>(
-            purge_goal - just_deleted, secure_cookie_its.size() - 1);
+      if (secure_cookie_its.size() == 0) {
+        // This case is unlikely, but should still update
+        // |earliest_access_time_| if only have non-secure cookies.
+        earliest_access_time_ = earliest_non_secure_access_time;
+        // Garbage collection can't delete all cookies.
+        DCHECK(!earliest_access_time_.is_null());
+      } else if (just_deleted < purge_goal) {
+        size_t secure_purge_goal = std::min<size_t>(purge_goal - just_deleted,
+                                                    secure_cookie_its.size());
+        base::Time earliest_secure_access_time;
         num_deleted += GarbageCollectLeastRecentlyAccessed(
-            current, safe_date, secure_purge_goal, secure_cookie_its);
+            current, safe_date, secure_purge_goal, secure_cookie_its,
+            &earliest_secure_access_time);
+
+        if (!earliest_non_secure_access_time.is_null() &&
+            earliest_non_secure_access_time < earliest_secure_access_time) {
+          earliest_access_time_ = earliest_non_secure_access_time;
+        } else {
+          earliest_access_time_ = earliest_secure_access_time;
+        }
+
+        // Garbage collection can't delete all cookies.
+        DCHECK(!earliest_access_time_.is_null());
       }
+
+      // If there are secure cookies, but deleting non-secure cookies was enough
+      // to meet the purge goal, secure cookies are never examined, so
+      // |earliest_access_time_| can't be determined. Leaving it alone will mean
+      // it's no later than the real earliest last access time, so this won't
+      // lead to any problems.
     }
   }
 
@@ -2132,13 +2156,17 @@
     const base::Time& current,
     const base::Time& safe_date,
     size_t purge_goal,
-    CookieItVector cookie_its) {
+    CookieItVector cookie_its,
+    base::Time* earliest_time) {
+  DCHECK_LE(purge_goal, cookie_its.size());
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  // Sorts up to *and including* |cookie_its[purge_goal]|, so
-  // |earliest_access_time| will be properly assigned even if
+  // Sorts up to *and including* |cookie_its[purge_goal]| (if it exists), so
+  // |earliest_time| will be properly assigned even if
   // |global_purge_it| == |cookie_its.begin() + purge_goal|.
-  SortLeastRecentlyAccessed(cookie_its.begin(), cookie_its.end(), purge_goal);
+  SortLeastRecentlyAccessed(
+      cookie_its.begin(), cookie_its.end(),
+      cookie_its.size() < purge_goal ? purge_goal + 1 : purge_goal);
   // Find boundary to cookies older than safe_date.
   CookieItVector::iterator global_purge_it = LowerBoundAccessDate(
       cookie_its.begin(), cookie_its.begin() + purge_goal, safe_date);
@@ -2146,8 +2174,8 @@
   size_t num_deleted =
       GarbageCollectDeleteRange(current, DELETE_COOKIE_EVICTED_GLOBAL,
                                 cookie_its.begin(), global_purge_it);
-  // Set access day to the oldest cookie that wasn't deleted.
-  earliest_access_time_ = (*global_purge_it)->second->LastAccessDate();
+  if (global_purge_it != cookie_its.end())
+    *earliest_time = (*global_purge_it)->second->LastAccessDate();
   return num_deleted;
 }
 
diff --git a/net/cookies/cookie_monster.h b/net/cookies/cookie_monster.h
index 1ddbccc..219b5b0 100644
--- a/net/cookies/cookie_monster.h
+++ b/net/cookies/cookie_monster.h
@@ -257,8 +257,9 @@
 
   // For garbage collection constants.
   FRIEND_TEST_ALL_PREFIXES(CookieMonsterTest, TestHostGarbageCollection);
-  FRIEND_TEST_ALL_PREFIXES(CookieMonsterTest, TestTotalGarbageCollection);
   FRIEND_TEST_ALL_PREFIXES(CookieMonsterTest, GarbageCollectionTriggers);
+  FRIEND_TEST_ALL_PREFIXES(CookieMonsterTest,
+                           GarbageCollectWithSecureCookiesOnly);
   FRIEND_TEST_ALL_PREFIXES(CookieMonsterTest, TestGCTimes);
 
   // For validation of key values.
@@ -605,10 +606,14 @@
   // Helper for GarbageCollect(). Deletes cookies in |cookie_its| from least to
   // most recently used, but only before |safe_date|. Also will stop deleting
   // when the number of remaining cookies hits |purge_goal|.
+  //
+  // Sets |earliest_time| to be the earliest last access time of a cookie that
+  // was not deleted, or base::Time() if no such cookie exists.
   size_t GarbageCollectLeastRecentlyAccessed(const base::Time& current,
                                              const base::Time& safe_date,
                                              size_t purge_goal,
-                                             CookieItVector cookie_its);
+                                             CookieItVector cookie_its,
+                                             base::Time* earliest_time);
 
   // Find the key (for lookup in cookies_) based on the given domain.
   // See comment on keys before the CookieMap typedef.
@@ -712,12 +717,12 @@
   // Approximate date of access time of least recently accessed cookie
   // in |cookies_|.  Note that this is not guaranteed to be accurate, only a)
   // to be before or equal to the actual time, and b) to be accurate
-  // immediately after a garbage collection that scans through all the cookies.
-  // This value is used to determine whether global garbage collection might
-  // find cookies to purge.
-  // Note: The default Time() constructor will create a value that compares
-  // earlier than any other time value, which is wanted.  Thus this
-  // value is not initialized.
+  // immediately after a garbage collection that scans through all the cookies
+  // (When garbage collection does not scan through all cookies, it may not be
+  // updated). This value is used to determine whether global garbage collection
+  // might find cookies to purge. Note: The default Time() constructor will
+  // create a value that compares earlier than any other time value, which is
+  // wanted.  Thus this value is not initialized.
   base::Time earliest_access_time_;
 
   // During loading, holds the set of all loaded cookie creation times. Used to
diff --git a/net/cookies/cookie_monster_unittest.cc b/net/cookies/cookie_monster_unittest.cc
index 3b958f2..da46fd9 100644
--- a/net/cookies/cookie_monster_unittest.cc
+++ b/net/cookies/cookie_monster_unittest.cc
@@ -2222,6 +2222,25 @@
   }
 }
 
+// Tests garbage collection when there are only secure cookies.
+// See https://crbug/730000
+TEST_F(CookieMonsterTest, GarbageCollectWithSecureCookiesOnly) {
+  // Create a CookieMonster at its cookie limit. A bit confusing, but the second
+  // number is a subset of the first number.
+  std::unique_ptr<CookieMonster> cm = CreateMonsterFromStoreForGC(
+      CookieMonster::kMaxCookies /* num_secure_cookies */,
+      CookieMonster::kMaxCookies /* num_old_secure_cookies */,
+      0 /* num_non_secure_cookies */, 0 /* num_old_non_secure_cookies */,
+      CookieMonster::kSafeFromGlobalPurgeDays * 2 /* days_old */);
+  EXPECT_EQ(CookieMonster::kMaxCookies, GetAllCookies(cm.get()).size());
+
+  // Trigger purge with a secure cookie (So there are still no insecure
+  // cookies).
+  SetCookie(cm.get(), GURL("https://newdomain.com"), "b=2; Secure");
+  EXPECT_EQ(CookieMonster::kMaxCookies - CookieMonster::kPurgeCookies,
+            GetAllCookies(cm.get()).size());
+}
+
 // Tests that if the main load event happens before the loaded event for a
 // particular key, the tasks for that key run first.
 TEST_F(CookieMonsterTest, WhileLoadingLoadCompletesBeforeKeyLoadCompletes) {
diff --git a/net/data/ssl/certificates/10_year_validity.pem b/net/data/ssl/certificates/10_year_validity.pem
index 007bda4..47e0e10e 100644
--- a/net/data/ssl/certificates/10_year_validity.pem
+++ b/net/data/ssl/certificates/10_year_validity.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 5 (0x5)
+        Serial Number: 12 (0xc)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Oct 30 00:00:00 2008 GMT
             Not After : Oct 29 00:00:00 2018 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:d7:0b:1b:f7:ce:03:86:eb:bd:cb:41:5b:31:e2:
-                    a7:fe:b8:2e:a6:3d:e9:ed:c5:21:ca:e7:aa:1e:8f:
-                    fb:e8:46:05:1f:64:af:7c:72:33:6b:80:41:a9:0b:
-                    79:ad:da:b2:4c:bd:28:76:0b:87:92:2a:fc:10:36:
-                    19:90:ec:97:e6:00:d3:a7:f6:7c:7c:41:a7:26:5d:
-                    e7:f9:64:49:1f:1e:89:09:a3:08:e6:14:f8:da:52:
-                    be:d8:f1:b2:8b:2a:ad:a8:15:02:df:de:89:86:d2:
-                    88:3d:b5:2a:72:c4:77:18:f2:8e:48:2c:5f:9d:85:
-                    77:2a:9d:36:3d:62:ea:04:1b:ad:3f:7e:53:3d:c9:
-                    3f:5e:de:02:0c:2f:1e:a5:b2:9c:d1:03:ce:5d:a6:
-                    88:28:29:bc:40:96:6d:e8:fd:99:1f:31:73:ab:a6:
-                    2b:de:51:28:e4:0f:24:12:29:6d:69:11:63:10:06:
-                    c0:ab:b6:d1:7a:2c:9e:85:ee:93:4c:5e:2a:3d:82:
-                    36:60:5f:ae:cd:d4:e3:3c:c9:33:5b:5e:fe:f8:8f:
-                    7d:6b:09:01:99:dd:51:cf:c3:2c:69:ca:28:fc:0b:
-                    4f:95:89:52:b1:f7:6b:0f:c9:46:31:b0:61:88:ac:
-                    0e:c5:2e:45:9a:f3:64:33:01:7c:d4:52:b9:f3:69:
-                    af:91
+                    00:ae:21:b3:7f:5c:19:df:fd:97:51:cd:d4:30:35:
+                    eb:50:4e:66:03:78:79:10:82:cb:02:5f:af:63:30:
+                    4a:54:ef:3e:3b:b8:76:7f:73:23:88:a7:4f:3c:65:
+                    78:1b:11:ea:49:f1:25:d4:cc:17:67:12:51:ce:a1:
+                    f6:15:57:c6:9c:19:3c:8c:f0:9d:ce:c5:5e:a4:36:
+                    d7:61:d3:21:21:c7:33:78:47:d6:74:e9:fa:b8:d8:
+                    f2:f4:01:b4:ac:9f:69:d0:09:bc:1a:7c:35:7c:12:
+                    c4:54:ba:5b:2b:80:37:6c:75:fe:08:36:44:bc:f1:
+                    3b:a9:c9:2b:a0:97:f8:75:4f:cd:27:24:f0:66:5e:
+                    8b:b9:b0:b1:49:50:80:80:00:de:83:e3:cb:09:c5:
+                    14:6e:9a:1f:28:0d:4a:7a:3b:90:19:13:e6:d0:32:
+                    08:6f:97:5f:2a:3e:a7:88:ef:98:01:fd:0c:2c:2b:
+                    ba:5c:24:33:1d:b7:c3:48:55:d5:e3:5e:c0:ea:e9:
+                    b2:8b:f5:b4:5d:10:50:48:88:59:0b:48:a5:80:94:
+                    2a:34:d6:b8:47:e6:ee:23:cc:e1:72:cf:ce:97:34:
+                    99:01:2f:66:7e:d4:39:be:5a:0a:01:47:8e:1d:5f:
+                    83:34:bf:69:6b:12:63:4c:47:25:0d:4c:b0:07:db:
+                    32:c7
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                F4:E5:35:90:3B:34:F5:54:E9:40:D2:16:33:BE:45:0C:1C:AE:05:7B
+                66:B2:C9:2E:D5:94:64:B0:57:CC:2C:7C:47:3E:4C:32:A0:62:1D:ED
             X509v3 Authority Key Identifier: 
-                keyid:68:27:28:DC:F4:82:CD:72:02:F3:82:88:1E:BC:30:00:E6:7E:79:23
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         08:2e:a1:67:a4:4b:5c:4e:5c:63:a8:c5:21:93:6e:ef:37:97:
-         5a:96:89:01:65:4d:2e:b8:78:58:28:ce:33:a7:6b:7f:85:c1:
-         d2:0c:5a:bd:ff:f8:96:4b:13:99:6a:9b:f8:ff:32:93:75:99:
-         6f:44:7b:13:0b:df:cd:d0:2e:2f:5d:2b:41:8e:aa:05:f0:1c:
-         60:27:e7:76:b5:8f:20:45:f8:6c:22:f9:34:f1:c7:70:41:1c:
-         9f:6c:d4:08:7f:fb:aa:8f:4e:3b:69:b5:61:e5:e0:b0:bd:0e:
-         c8:d4:6c:45:8a:f4:2c:3d:3a:16:3b:b4:59:4d:6c:1e:a6:fb:
-         00:ab:d2:9e:0b:00:02:ae:47:c7:06:14:c0:69:0d:21:96:f8:
-         86:d6:f2:ad:34:dd:69:66:63:ed:b3:65:50:89:ef:83:c0:d0:
-         d6:63:a3:5f:e8:64:2b:25:22:92:78:c2:29:e4:84:8b:8e:69:
-         2b:9e:0f:59:e7:b1:06:4c:e8:67:9c:95:8a:b8:4f:26:ed:09:
-         2b:37:69:12:68:9d:6d:03:70:06:bf:45:79:d7:0d:78:d8:9b:
-         df:68:54:2e:56:b4:e5:82:22:50:4d:09:98:fc:ae:0c:28:cc:
-         d6:a6:ce:04:7b:ea:10:d4:03:97:a8:76:3c:d6:4c:ac:0b:20:
-         2e:4c:22:89
+         5d:52:44:7e:39:ff:d6:01:44:8a:a3:f2:b2:13:98:d2:cd:e1:
+         00:09:23:2d:05:3a:73:39:96:c6:88:c2:c1:5f:b8:8a:2b:18:
+         8c:71:df:56:87:ed:8d:d1:14:36:c3:ef:58:8a:99:ce:88:ba:
+         f3:80:d6:7f:31:2e:3d:3a:22:7d:de:1b:33:94:33:b1:e4:cb:
+         30:bc:a6:48:fa:f9:1f:f3:12:a8:9f:38:5c:10:7d:50:d2:65:
+         ab:10:06:19:de:2f:a5:42:3f:70:1b:99:79:96:9d:e2:74:2a:
+         90:b7:a7:37:61:23:3e:b9:c2:ae:d8:1a:a5:00:60:c6:e8:48:
+         ce:98:3e:0a:04:12:0c:ce:e1:3b:7a:14:e8:0a:44:78:51:37:
+         0d:98:05:f5:d6:43:f1:4e:a3:48:0b:ea:44:da:03:6a:90:a2:
+         be:85:91:b6:07:43:ec:32:f8:d8:36:7f:d9:17:c9:ee:7b:50:
+         d6:ef:2b:1f:f2:9c:41:35:9d:7d:8a:34:87:df:3e:c7:78:55:
+         cc:89:b5:30:07:13:66:a8:ab:f8:72:9f:13:ed:58:14:25:85:
+         06:1d:56:5b:84:5b:8a:53:22:73:55:17:08:0a:38:d7:1e:2f:
+         74:58:d2:2b:72:64:a0:40:eb:ac:1a:bd:c6:65:ea:a4:3e:13:
+         62:04:39:e0
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBBTANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMDgxMDMwMDAwMDAwWhcNMTgxMDI5MDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1wsb984Dhuu9y0FbMeKn/rgupj3p
-7cUhyueqHo/76EYFH2SvfHIza4BBqQt5rdqyTL0odguHkir8EDYZkOyX5gDTp/Z8
-fEGnJl3n+WRJHx6JCaMI5hT42lK+2PGyiyqtqBUC396JhtKIPbUqcsR3GPKOSCxf
-nYV3Kp02PWLqBButP35TPck/Xt4CDC8epbKc0QPOXaaIKCm8QJZt6P2ZHzFzq6Yr
-3lEo5A8kEiltaRFjEAbAq7bReiyehe6TTF4qPYI2YF+uzdTjPMkzW17++I99awkB
-md1Rz8Msacoo/AtPlYlSsfdrD8lGMbBhiKwOxS5FmvNkMwF81FK582mvkQIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU9OU1kDs09VTpQNIWM75FDByu
-BXswHwYDVR0jBBgwFoAUaCco3PSCzXIC84KIHrwwAOZ+eSMwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAAguoWekS1xOXGOoxSGTbu83l1qWiQFlTS64eFgozjOna3+FwdIMWr3/
-+JZLE5lqm/j/MpN1mW9EexML383QLi9dK0GOqgXwHGAn53a1jyBF+Gwi+TTxx3BB
-HJ9s1Ah/+6qPTjtptWHl4LC9DsjUbEWK9Cw9OhY7tFlNbB6m+wCr0p4LAAKuR8cG
-FMBpDSGW+IbW8q003WlmY+2zZVCJ74PA0NZjo1/oZCslIpJ4winkhIuOaSueD1nn
-sQZM6GeclYq4TybtCSs3aRJonW0DcAa/RXnXDXjYm99oVC5WtOWCIlBNCZj8rgwo
-zNamzgR76hDUA5eodjzWTKwLIC5MIok=
+MIIDvzCCAqegAwIBAgIBDDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTA4MTAzMDAw
+MDAwMFoXDTE4MTAyOTAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAK4hs39cGd/9l1HN1DA161BOZgN4eRCCywJfr2MwSlTvPju4dn9zI4in
+TzxleBsR6knxJdTMF2cSUc6h9hVXxpwZPIzwnc7FXqQ212HTISHHM3hH1nTp+rjY
+8vQBtKyfadAJvBp8NXwSxFS6WyuAN2x1/gg2RLzxO6nJK6CX+HVPzSck8GZei7mw
+sUlQgIAA3oPjywnFFG6aHygNSno7kBkT5tAyCG+XXyo+p4jvmAH9DCwrulwkMx23
+w0hV1eNewOrpsov1tF0QUEiIWQtIpYCUKjTWuEfm7iPM4XLPzpc0mQEvZn7UOb5a
+CgFHjh1fgzS/aWsSY0xHJQ1MsAfbMscCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFGayyS7VlGSwV8wsfEc+TDKgYh3tMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQBdUkR+Of/WAUSKo/Ky
+E5jSzeEACSMtBTpzOZbGiMLBX7iKKxiMcd9Wh+2N0RQ2w+9YipnOiLrzgNZ/MS49
+OiJ93hszlDOx5MswvKZI+vkf8xKonzhcEH1Q0mWrEAYZ3i+lQj9wG5l5lp3idCqQ
+t6c3YSM+ucKu2BqlAGDG6EjOmD4KBBIMzuE7ehToCkR4UTcNmAX11kPxTqNIC+pE
+2gNqkKK+hZG2B0PsMvjYNn/ZF8nue1DW7ysf8pxBNZ19ijSH3z7HeFXMibUwBxNm
+qKv4cp8T7VgUJYUGHVZbhFuKUyJzVRcICjjXHi90WNIrcmSgQOusGr3GZeqkPhNi
+BDng
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/11_year_validity.pem b/net/data/ssl/certificates/11_year_validity.pem
index 3e69b63..50eb089 100644
--- a/net/data/ssl/certificates/11_year_validity.pem
+++ b/net/data/ssl/certificates/11_year_validity.pem
@@ -1,82 +1,84 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 6 (0x6)
+        Serial Number: 13 (0xd)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Oct 30 00:00:00 2014 GMT
-            Not After : Oct 30 00:00:00 2025 GMT
+            Not After : Jun  2 17:10:52 2028 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:d7:f7:09:26:5f:1c:c4:93:f4:16:d5:84:61:f5:
-                    d9:93:eb:f2:c6:38:96:7f:a7:fe:ea:6b:88:68:bd:
-                    8a:81:5a:47:16:eb:54:5f:db:3c:98:21:b7:89:49:
-                    cf:3c:c3:4d:ad:7f:54:d0:16:34:16:cb:66:4b:c9:
-                    86:c6:42:72:62:68:85:5d:ee:2c:18:9e:2f:99:06:
-                    89:f4:a6:8f:cd:65:48:d0:0f:98:08:46:ad:3c:30:
-                    0c:0c:85:50:66:66:2e:39:2a:d1:4c:6b:be:46:ce:
-                    33:be:d1:ec:2a:66:a7:a0:39:4a:c2:74:2a:1a:08:
-                    d1:06:4d:ec:9d:42:69:61:8f:7c:e3:89:9f:a3:e4:
-                    fe:65:bd:12:1d:1e:e8:81:9d:f4:89:93:9c:80:7c:
-                    14:aa:00:da:ed:f9:49:1a:f6:b0:c9:80:c7:fb:79:
-                    b6:b5:26:88:74:52:fd:38:3a:cc:49:81:43:2a:d7:
-                    73:7f:a5:9e:78:a4:ca:55:2d:65:ee:1b:42:73:c4:
-                    07:3a:18:1e:45:9b:d5:26:be:d2:34:9d:ad:58:98:
-                    a7:27:70:c4:aa:61:36:51:59:4a:4c:49:b4:4e:7f:
-                    59:63:3a:9f:fb:4d:5b:fd:b6:79:35:eb:06:9e:9b:
-                    fb:90:40:99:4c:ec:07:fd:c4:2e:1a:fa:66:f5:ad:
-                    b8:bd
+                    00:d2:33:c9:3e:ee:c5:00:08:54:d0:a9:26:f1:21:
+                    21:86:20:92:dc:1f:c9:0f:95:c3:60:8b:72:14:51:
+                    60:44:6e:b6:bd:f4:59:28:70:4c:df:87:e0:c9:2c:
+                    db:c8:b3:4d:c8:72:92:0e:ab:55:a5:10:8e:e4:cf:
+                    77:23:77:25:a5:62:95:fc:32:b3:da:66:2f:ae:23:
+                    5e:3d:aa:1d:87:96:61:a5:eb:86:39:e1:74:a2:1d:
+                    a2:50:e1:93:e6:dc:ab:70:99:e4:e4:49:72:6c:00:
+                    e8:53:06:1f:86:19:37:79:83:2e:a5:69:b7:80:4c:
+                    06:f4:1c:6f:61:76:6b:71:da:ef:0d:2d:30:20:8c:
+                    d1:69:9b:c1:63:00:6f:8f:af:6e:f0:0f:64:bd:fd:
+                    3a:17:dd:fe:62:44:b2:74:33:2d:98:de:04:e1:e9:
+                    e7:92:1d:bf:9b:dc:3c:90:b9:db:1d:ba:cf:84:72:
+                    27:54:e9:59:10:37:44:db:5e:1c:ba:45:16:9c:9b:
+                    85:7d:c2:8f:74:da:8c:12:4f:fc:64:8f:4d:7b:91:
+                    84:2b:10:b6:a3:ab:f6:0d:f0:27:73:55:0c:2d:1c:
+                    2b:2f:7d:bc:46:70:c7:25:c1:b2:0c:2a:21:e5:a2:
+                    42:7f:91:4c:e7:f6:50:76:26:82:78:f0:50:88:45:
+                    68:71
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                97:61:9A:BC:B0:3B:CC:C3:44:D4:34:31:0A:3F:58:9E:4B:EB:33:95
+                49:8C:47:E1:3D:FB:65:5C:B5:B9:78:5A:DC:3D:AC:DC:C2:55:84:BA
             X509v3 Authority Key Identifier: 
-                keyid:CA:0B:EE:C3:20:AD:63:FC:89:FA:71:69:49:E6:38:78:EC:F9:C6:55
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         30:97:5c:3b:08:b5:5c:f4:13:ad:16:4a:b4:2f:a9:10:f5:9c:
-         5b:58:11:d8:87:53:3c:41:fb:ba:0e:98:7a:5a:aa:9c:b4:1e:
-         f6:ee:da:56:52:6a:ac:74:2f:6b:d8:c3:4e:b2:c5:ef:6b:55:
-         2d:6e:1a:83:2c:63:ac:69:a0:1a:2b:18:a2:18:e7:30:9a:5a:
-         35:c2:8e:1d:5f:4e:68:e3:40:97:78:e6:f1:37:5b:d9:ea:06:
-         84:b3:65:4a:12:0c:7d:66:c4:97:f9:d1:6d:66:21:8e:52:fc:
-         61:6b:0a:78:c7:0d:75:2d:8b:c6:1b:80:5a:f1:e7:ad:7f:a5:
-         84:e6:16:b9:f7:89:84:84:0b:44:f7:a6:38:d6:3f:34:87:4e:
-         17:08:2b:18:00:d7:c5:25:4c:35:40:95:78:a2:26:ef:96:5e:
-         d1:9f:a3:0f:62:ca:5a:2e:13:4e:cd:43:3e:31:dd:3d:b1:77:
-         c2:23:b7:79:f4:1a:fa:81:07:ae:9d:c5:8a:4c:15:24:43:97:
-         d7:b4:d8:c1:11:ba:08:66:76:5d:05:be:13:00:63:2c:77:21:
-         25:fc:38:95:8d:e6:f0:10:90:22:38:57:9a:62:7e:5a:1f:71:
-         3a:bf:3b:b0:d7:29:0d:8a:df:e5:0d:00:72:74:92:0e:9b:4a:
-         7e:97:98:b4
+         16:b3:2e:6b:4a:d1:8b:ea:56:72:cd:e7:e7:51:1f:70:19:48:
+         52:5c:6f:b6:ba:e0:f1:0a:0f:38:aa:ed:de:8c:32:56:74:1d:
+         69:30:ee:68:ba:2b:7e:6b:93:f0:69:7f:5f:bb:18:88:41:3e:
+         86:3a:00:f8:23:f9:d1:ab:53:9d:50:ea:2e:37:37:0d:0a:cc:
+         af:22:90:11:29:f3:b6:d4:28:47:83:75:66:19:19:88:a0:20:
+         6b:64:7b:95:32:5d:85:14:c6:a6:77:11:a5:c4:72:72:c1:aa:
+         3a:dd:ee:dc:28:71:4e:1e:ae:d5:1d:74:3e:71:8a:da:7e:f8:
+         4c:2c:20:6c:01:ee:33:90:27:3a:5d:87:75:73:4c:24:c0:ad:
+         b0:6e:a3:32:bc:e4:93:53:73:40:cb:37:55:4b:d2:d5:79:b9:
+         86:bc:69:35:d1:33:11:4a:33:ad:d1:78:18:99:c8:b0:fb:c6:
+         82:40:87:56:47:ff:f1:ec:2a:07:53:ea:7f:17:a8:78:3c:21:
+         e5:e7:6e:54:16:02:8b:71:c9:fb:41:c4:f7:f0:1d:9d:8e:5b:
+         94:6f:2c:25:12:95:02:ca:08:d5:42:16:fd:b8:dc:d8:4b:07:
+         8f:bb:b2:4e:51:e8:32:87:61:a1:96:de:ff:24:86:4f:41:38:
+         65:18:f0:b8
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBBjANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTQxMDMwMDAwMDAwWhcNMjUxMDMwMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA1/cJJl8cxJP0FtWEYfXZk+vyxjiW
-f6f+6muIaL2KgVpHFutUX9s8mCG3iUnPPMNNrX9U0BY0FstmS8mGxkJyYmiFXe4s
-GJ4vmQaJ9KaPzWVI0A+YCEatPDAMDIVQZmYuOSrRTGu+Rs4zvtHsKmanoDlKwnQq
-GgjRBk3snUJpYY9844mfo+T+Zb0SHR7ogZ30iZOcgHwUqgDa7flJGvawyYDH+3m2
-tSaIdFL9ODrMSYFDKtdzf6WeeKTKVS1l7htCc8QHOhgeRZvVJr7SNJ2tWJinJ3DE
-qmE2UVlKTEm0Tn9ZYzqf+01b/bZ5NesGnpv7kECZTOwH/cQuGvpm9a24vQIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUl2GavLA7zMNE1DQxCj9Ynkvr
-M5UwHwYDVR0jBBgwFoAUygvuwyCtY/yJ+nFpSeY4eOz5xlUwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBADCXXDsItVz0E60WSrQvqRD1nFtYEdiHUzxB+7oOmHpaqpy0Hvbu2lZS
-aqx0L2vYw06yxe9rVS1uGoMsY6xpoBorGKIY5zCaWjXCjh1fTmjjQJd45vE3W9nq
-BoSzZUoSDH1mxJf50W1mIY5S/GFrCnjHDXUti8YbgFrx561/pYTmFrn3iYSEC0T3
-pjjWPzSHThcIKxgA18UlTDVAlXiiJu+WXtGfow9iylouE07NQz4x3T2xd8Ijt3n0
-GvqBB66dxYpMFSRDl9e02MERughmdl0FvhMAYyx3ISX8OJWN5vAQkCI4V5piflof
-cTq/O7DXKQ2K3+UNAHJ0kg6bSn6XmLQ=
+MIIDvzCCAqegAwIBAgIBDTANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE0MTAzMDAw
+MDAwMFoXDTI4MDYwMjE3MTA1MlowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANIzyT7uxQAIVNCpJvEhIYYgktwfyQ+Vw2CLchRRYERutr30WShwTN+H
+4Mks28izTchykg6rVaUQjuTPdyN3JaVilfwys9pmL64jXj2qHYeWYaXrhjnhdKId
+olDhk+bcq3CZ5ORJcmwA6FMGH4YZN3mDLqVpt4BMBvQcb2F2a3Ha7w0tMCCM0Wmb
+wWMAb4+vbvAPZL39Ohfd/mJEsnQzLZjeBOHp55Idv5vcPJC52x26z4RyJ1TpWRA3
+RNteHLpFFpybhX3Cj3TajBJP/GSPTXuRhCsQtqOr9g3wJ3NVDC0cKy99vEZwxyXB
+sgwqIeWiQn+RTOf2UHYmgnjwUIhFaHECAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFEmMR+E9+2Vctbl4Wtw9rNzCVYS6MB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQAWsy5rStGL6lZyzefn
+UR9wGUhSXG+2uuDxCg84qu3ejDJWdB1pMO5ouit+a5PwaX9fuxiIQT6GOgD4I/nR
+q1OdUOouNzcNCsyvIpARKfO21ChHg3VmGRmIoCBrZHuVMl2FFMamdxGlxHJywao6
+3e7cKHFOHq7VHXQ+cYrafvhMLCBsAe4zkCc6XYd1c0wkwK2wbqMyvOSTU3NAyzdV
+S9LVebmGvGk10TMRSjOt0XgYmciw+8aCQIdWR//x7CoHU+p/F6h4PCHl525UFgKL
+ccn7QcT38B2djluUbywlEpUCygjVQhb9uNzYSwePu7JOUegyh2Ghlt7/JIZPQThl
+GPC4
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/39_months_after_2015_04.pem b/net/data/ssl/certificates/39_months_after_2015_04.pem
index 5027de85..d988960a 100644
--- a/net/data/ssl/certificates/39_months_after_2015_04.pem
+++ b/net/data/ssl/certificates/39_months_after_2015_04.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 7 (0x7)
+        Serial Number: 14 (0xe)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Apr  2 00:00:00 2015 GMT
             Not After : Jul  2 00:00:00 2018 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:eb:c3:3b:8e:08:b4:9d:a5:ab:35:d2:ab:9e:bb:
-                    3f:e6:fc:c0:5f:59:f0:40:f9:1d:d3:90:09:78:27:
-                    1d:78:71:9f:40:6b:71:f4:3b:1c:63:f4:44:1e:fc:
-                    09:66:5b:6d:20:d3:dd:42:f5:12:d0:ce:65:8b:28:
-                    5e:99:14:86:38:ca:e0:f6:2b:df:d8:99:e8:c6:4c:
-                    b6:7e:3a:dd:45:89:4b:a5:98:81:26:14:4b:97:39:
-                    be:ad:2d:53:64:fb:3d:2e:e8:e2:e7:92:3b:ed:81:
-                    29:67:96:0c:0d:67:ed:6c:52:27:c7:fb:61:43:57:
-                    bc:5f:c5:08:2d:3f:97:92:33:f1:a4:a6:ea:02:c8:
-                    cd:bd:01:62:d3:63:2b:91:c4:b6:5d:03:13:11:bc:
-                    b2:72:13:90:2f:db:0d:34:79:e8:01:a0:fd:23:ed:
-                    22:10:c9:d8:ad:60:e1:79:a5:75:24:aa:13:7c:4d:
-                    71:c5:1d:94:92:ad:25:66:fa:b8:91:12:42:cd:8c:
-                    2e:e9:2e:5f:3f:b5:1f:ae:7e:09:7b:88:b8:93:c2:
-                    58:65:33:7b:2f:a2:71:45:e0:d4:79:1c:d4:8c:e7:
-                    6d:ff:bf:b3:59:b9:b0:a0:f2:fc:e6:8a:7d:31:1a:
-                    bc:2e:38:3a:ce:16:85:47:a3:87:c5:f6:43:21:cb:
-                    56:eb
+                    00:ab:bd:7c:d8:34:99:c9:fa:d9:7e:0a:ac:77:89:
+                    fb:de:ee:b0:ec:59:45:f6:a0:15:b9:60:2a:0a:8f:
+                    77:a7:43:dc:62:e6:20:9e:ef:9f:c3:4f:59:f4:cb:
+                    23:32:85:0f:a4:66:77:f6:bc:f2:1b:d1:b7:dc:c3:
+                    66:a0:83:37:73:2a:6a:80:9b:a1:aa:8c:18:ad:49:
+                    b0:44:e8:cf:11:da:0d:52:ab:59:50:d4:87:c8:98:
+                    4f:fc:7e:46:49:53:e5:3b:10:dd:29:7b:0b:fa:38:
+                    76:7e:b5:a6:a8:9b:e4:20:b8:99:18:7d:57:46:dd:
+                    33:46:7a:2a:ae:dc:3b:18:1b:68:b3:36:37:6d:1a:
+                    ec:78:f5:65:0f:5d:f9:1b:ec:68:7d:a4:83:79:ad:
+                    cc:a0:68:4f:6c:5b:36:c1:48:0b:3f:3e:4c:ae:91:
+                    de:4a:db:f6:a9:82:c2:54:9d:6f:28:db:00:bb:0f:
+                    a4:44:43:40:c3:b0:e3:ec:f8:57:8c:c1:db:bb:00:
+                    64:15:48:06:7b:01:da:34:bc:ac:c1:61:ec:07:76:
+                    80:08:86:94:34:c4:d8:db:65:80:6a:7f:c0:b9:61:
+                    f5:3c:92:99:45:ce:17:92:81:81:32:43:39:35:ac:
+                    a4:04:5a:d6:f0:5e:01:3e:f2:3f:3b:74:c9:33:77:
+                    87:c1
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                A9:39:E6:EB:3E:23:03:3A:4E:81:DC:F7:6D:77:83:46:8B:F0:8C:0E
+                10:E9:95:5F:D7:78:0F:A8:F8:3C:89:9A:36:AA:E9:F2:52:C3:60:30
             X509v3 Authority Key Identifier: 
-                keyid:CA:0B:EE:C3:20:AD:63:FC:89:FA:71:69:49:E6:38:78:EC:F9:C6:55
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         ad:bd:f3:9d:e7:c9:0c:41:fa:c2:1c:a4:59:03:e3:ab:64:b0:
-         c9:3a:f6:9a:d8:fb:05:52:95:0d:d9:d0:fa:10:d4:2e:66:81:
-         b5:3b:11:01:f6:93:8d:2b:2f:f4:97:50:3c:36:3a:de:5d:eb:
-         3e:93:d8:84:86:a2:dd:08:a7:b7:50:0b:df:18:a7:b7:5a:4b:
-         d3:99:69:ae:04:70:60:6f:76:1e:6f:69:15:fe:98:6e:a7:aa:
-         d8:7f:05:2e:da:16:fc:ff:fd:15:19:e2:3c:9e:82:70:29:0e:
-         79:fb:2c:41:59:86:3d:aa:53:ee:b3:10:79:3e:d6:d6:5d:b1:
-         b9:bf:5a:83:3a:d4:3b:1e:98:97:bb:cf:79:ee:83:d1:4d:31:
-         42:5e:7f:44:19:15:1f:65:bd:6c:ad:c1:b8:dc:2b:bb:64:d3:
-         76:eb:8c:d6:79:7a:ab:55:20:9b:02:79:c5:f8:80:01:45:c8:
-         0d:ce:54:be:5d:24:44:ea:52:54:f3:e2:9b:cd:20:7d:70:e6:
-         d2:ed:d6:51:d0:0c:fa:5d:73:93:40:39:37:bf:f6:4a:98:46:
-         e9:41:d7:21:3a:a9:3f:06:c8:b1:12:c9:3e:a6:69:cb:fd:e0:
-         05:5f:03:e6:e4:8d:20:25:b6:18:2f:74:a4:50:a0:cb:1b:6e:
-         46:d1:ad:a2
+         05:a5:b1:fe:ec:c3:19:31:04:40:47:70:79:b6:c3:99:ca:ff:
+         26:f8:26:88:fc:c9:fc:30:27:d7:15:4e:cb:df:45:09:1e:ea:
+         bc:ac:9f:99:3a:a7:cc:bf:dd:93:a7:96:ff:5b:b9:9a:bb:49:
+         1d:3c:ab:53:97:c8:83:4a:87:3d:e0:81:d1:47:68:ac:ea:1f:
+         bc:88:3c:74:17:39:34:23:4d:28:a5:db:20:16:c7:ea:08:ef:
+         c4:bc:f4:8c:5a:94:b0:f6:1a:23:e3:c3:e3:a6:ef:52:f8:70:
+         d1:59:95:21:e7:57:b6:bb:c8:05:6a:c7:7e:ba:b8:36:4b:75:
+         5c:6c:74:1f:0d:a0:18:c9:ad:db:9a:b6:f8:eb:63:25:b8:88:
+         48:b7:43:68:dd:6c:ce:0b:4f:c5:1f:7b:5f:94:c6:29:62:77:
+         2a:85:9c:61:8b:a7:67:c8:17:5b:2f:a7:a5:0b:d2:d8:eb:1d:
+         8f:ed:67:93:3a:df:f1:29:e9:97:71:a3:01:48:3d:be:f5:15:
+         5d:f5:32:bc:18:52:9f:9c:3b:64:e8:a9:55:32:91:6d:c9:cc:
+         84:65:16:39:4c:ad:20:2b:e9:e9:46:f3:71:7c:44:45:05:6f:
+         68:86:66:5e:0c:e2:7d:86:65:9c:6e:e5:39:2d:a8:03:30:b2:
+         e2:77:5d:70
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBBzANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTUwNDAyMDAwMDAwWhcNMTgwNzAyMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA68M7jgi0naWrNdKrnrs/5vzAX1nw
-QPkd05AJeCcdeHGfQGtx9DscY/REHvwJZlttINPdQvUS0M5liyhemRSGOMrg9ivf
-2Jnoxky2fjrdRYlLpZiBJhRLlzm+rS1TZPs9Luji55I77YEpZ5YMDWftbFInx/th
-Q1e8X8UILT+XkjPxpKbqAsjNvQFi02MrkcS2XQMTEbyychOQL9sNNHnoAaD9I+0i
-EMnYrWDheaV1JKoTfE1xxR2Ukq0lZvq4kRJCzYwu6S5fP7Ufrn4Je4i4k8JYZTN7
-L6JxReDUeRzUjOdt/7+zWbmwoPL85op9MRq8Ljg6zhaFR6OHxfZDIctW6wIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUqTnm6z4jAzpOgdz3bXeDRovw
-jA4wHwYDVR0jBBgwFoAUygvuwyCtY/yJ+nFpSeY4eOz5xlUwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAK29853nyQxB+sIcpFkD46tksMk69prY+wVSlQ3Z0PoQ1C5mgbU7EQH2
-k40rL/SXUDw2Ot5d6z6T2ISGot0Ip7dQC98Yp7daS9OZaa4EcGBvdh5vaRX+mG6n
-qth/BS7aFvz//RUZ4jyegnApDnn7LEFZhj2qU+6zEHk+1tZdsbm/WoM61DsemJe7
-z3nug9FNMUJef0QZFR9lvWytwbjcK7tk03brjNZ5eqtVIJsCecX4gAFFyA3OVL5d
-JETqUlTz4pvNIH1w5tLt1lHQDPpdc5NAOTe/9kqYRulB1yE6qT8GyLESyT6macv9
-4AVfA+bkjSAlthgvdKRQoMsbbkbRraI=
+MIIDvzCCAqegAwIBAgIBDjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE1MDQwMjAw
+MDAwMFoXDTE4MDcwMjAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKu9fNg0mcn62X4KrHeJ+97usOxZRfagFblgKgqPd6dD3GLmIJ7vn8NP
+WfTLIzKFD6Rmd/a88hvRt9zDZqCDN3MqaoCboaqMGK1JsETozxHaDVKrWVDUh8iY
+T/x+RklT5TsQ3Sl7C/o4dn61pqib5CC4mRh9V0bdM0Z6Kq7cOxgbaLM2N20a7Hj1
+ZQ9d+RvsaH2kg3mtzKBoT2xbNsFICz8+TK6R3krb9qmCwlSdbyjbALsPpERDQMOw
+4+z4V4zB27sAZBVIBnsB2jS8rMFh7Ad2gAiGlDTE2NtlgGp/wLlh9TySmUXOF5KB
+gTJDOTWspARa1vBeAT7yPzt0yTN3h8ECAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFBDplV/XeA+o+DyJmjaq6fJSw2AwMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQAFpbH+7MMZMQRAR3B5
+tsOZyv8m+CaI/Mn8MCfXFU7L30UJHuq8rJ+ZOqfMv92Tp5b/W7mau0kdPKtTl8iD
+Soc94IHRR2is6h+8iDx0Fzk0I00opdsgFsfqCO/EvPSMWpSw9hoj48Pjpu9S+HDR
+WZUh51e2u8gFasd+urg2S3VcbHQfDaAYya3bmrb462MluIhIt0No3WzOC0/FH3tf
+lMYpYncqhZxhi6dnyBdbL6elC9LY6x2P7WeTOt/xKemXcaMBSD2+9RVd9TK8GFKf
+nDtk6KlVMpFtycyEZRY5TK0gK+npRvNxfERFBW9ohmZeDOJ9hmWcbuU5LagDMLLi
+d11w
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/40_months_after_2015_04.pem b/net/data/ssl/certificates/40_months_after_2015_04.pem
index 870fefa..df5acc8c 100644
--- a/net/data/ssl/certificates/40_months_after_2015_04.pem
+++ b/net/data/ssl/certificates/40_months_after_2015_04.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 8 (0x8)
+        Serial Number: 15 (0xf)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Apr  2 00:00:00 2015 GMT
             Not After : Aug  1 00:00:00 2018 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ca:f6:72:04:1c:c2:c0:19:16:2a:2c:f4:c2:6d:
-                    39:46:7e:c5:df:2f:5e:47:1c:9f:38:56:fd:22:69:
-                    fc:ba:f1:50:fb:93:33:13:8e:f7:c0:c7:3f:54:68:
-                    89:f7:d0:1a:59:98:f2:57:a3:4b:01:c5:0a:85:a9:
-                    44:85:4e:60:8b:87:60:c3:a7:90:d1:4b:92:a1:22:
-                    26:ac:87:bb:30:f9:55:78:57:d3:38:14:3d:d9:6a:
-                    6e:90:76:75:54:2e:9c:ba:95:d2:65:37:54:de:07:
-                    e5:b0:a1:91:c1:d6:f1:e2:2e:93:49:9e:4e:c3:66:
-                    92:19:77:b4:ee:7d:18:99:37:27:2e:04:59:a0:ea:
-                    c7:d4:6c:56:c6:72:6f:0f:b3:5e:3b:c0:1a:26:4d:
-                    6b:4d:c4:7f:66:1f:e3:72:83:0a:39:b5:08:4d:c2:
-                    c0:49:b9:32:33:e3:7a:ba:00:36:b2:c3:0b:bd:d0:
-                    4a:d2:88:e7:bd:f9:6a:32:99:8a:c3:aa:9e:7a:1d:
-                    ae:71:35:d6:3a:a9:c1:ea:a6:2f:18:e1:15:a2:b7:
-                    db:8e:02:3b:ab:aa:a4:2c:d6:4f:60:d2:8d:bc:4a:
-                    0d:7c:d8:5e:0a:fb:fe:83:96:10:1f:d5:14:ab:0e:
-                    74:da:b8:b4:51:25:ec:ad:76:13:dd:1a:c7:55:e4:
-                    26:c7
+                    00:b9:66:bc:55:7c:ca:70:eb:2e:6a:8b:11:8c:af:
+                    1e:2d:e2:ae:a5:b9:96:be:0a:16:08:2b:98:d6:8c:
+                    a6:24:87:a8:0e:2e:23:f0:5a:8b:fa:6e:b7:dc:b2:
+                    2a:56:57:d7:76:91:69:c3:23:44:f3:40:74:d7:83:
+                    6d:fb:94:d9:e8:e6:34:96:2d:cb:43:02:69:c4:5f:
+                    c0:01:09:9a:0f:55:5b:f5:b8:77:5e:ab:0b:58:46:
+                    1f:d4:42:59:43:3f:5a:92:5a:ca:22:8d:a9:18:ff:
+                    ac:48:e9:f3:a4:a4:f3:d5:9b:e8:23:70:cd:26:f2:
+                    02:0b:e3:1e:a5:e6:ea:46:0f:39:06:fb:1b:f3:e9:
+                    ce:65:df:15:e6:3f:72:c0:03:72:5e:3d:e0:4c:94:
+                    27:8c:ee:76:44:49:eb:f0:27:0f:d9:fc:02:fe:e5:
+                    fd:70:d8:fe:8a:a6:99:61:52:76:b9:6b:af:89:50:
+                    84:ab:2b:c9:2a:13:0d:3b:f8:fe:50:61:a8:e0:57:
+                    e1:f6:14:66:00:55:15:b3:99:03:be:fe:6f:24:39:
+                    12:b6:8b:bd:d5:60:7f:21:c2:24:68:07:62:dd:73:
+                    72:49:0a:09:cc:65:27:7c:37:0e:00:9b:b5:8a:4f:
+                    70:fb:c5:14:34:42:cb:27:4b:22:50:8d:5b:17:0f:
+                    9b:85
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                29:36:90:2F:BA:C1:EA:FD:D8:E1:4F:5E:D7:C2:9A:15:EA:1A:35:3C
+                CE:65:A6:37:A7:B6:38:4B:38:A3:6E:80:C7:7C:13:FB:51:C2:45:B6
             X509v3 Authority Key Identifier: 
-                keyid:CA:0B:EE:C3:20:AD:63:FC:89:FA:71:69:49:E6:38:78:EC:F9:C6:55
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         a5:a6:54:39:60:ca:39:94:e0:da:01:a1:3a:7b:1f:c1:33:61:
-         4f:8d:57:2e:20:31:4f:11:29:bd:c3:8c:db:90:48:b3:3d:d6:
-         c9:ad:0b:5e:45:d3:fa:ee:1e:b4:ed:44:bf:21:d1:6a:b7:87:
-         bc:38:97:95:e1:d1:02:26:58:ac:b6:fc:01:8a:f1:cf:b6:a2:
-         1a:b5:01:6c:fb:ce:33:61:be:d6:88:63:a7:94:76:2f:62:c2:
-         2b:53:fb:d5:f8:12:0d:bd:d1:31:73:2c:65:87:a7:09:e2:49:
-         9f:7a:38:c5:91:65:d8:69:10:93:ec:99:eb:17:c9:af:b3:1b:
-         5e:34:2a:94:31:e8:8e:d2:19:86:46:c8:9b:0f:10:1f:ed:d3:
-         c8:d6:98:11:93:86:5d:49:01:19:db:01:c4:73:82:b2:41:6d:
-         be:0d:45:b0:4c:ad:e9:77:25:0f:a8:ff:a6:8e:60:8f:ca:58:
-         19:b2:cb:9b:88:a2:44:2b:a2:2f:58:aa:09:6a:2a:55:51:e3:
-         7c:68:35:8a:83:09:c9:c7:44:ae:ea:9c:58:b5:4f:33:0f:24:
-         f9:ee:9f:11:a0:28:04:98:7d:f8:e9:9c:48:d3:7c:8e:08:18:
-         b9:92:21:40:75:0f:36:96:ff:0f:ff:30:23:5c:0b:9d:e5:9a:
-         5e:24:50:e3
+         25:63:1e:16:83:f3:48:52:80:be:0b:82:4c:24:27:58:44:b0:
+         1a:38:e4:4d:49:b8:86:43:a2:c7:59:31:40:74:3b:a7:18:07:
+         30:7d:f6:5c:e5:f3:1f:49:d3:32:1c:f1:b9:47:c8:52:5b:19:
+         93:a9:6b:80:41:96:a9:35:ce:d1:ff:9d:82:c6:13:ca:04:56:
+         38:fc:df:cf:5a:54:5f:77:a9:28:c5:c6:0b:0b:56:04:e8:37:
+         73:d3:8e:b9:6f:c8:92:46:ab:35:07:5e:55:06:d2:fc:ac:8b:
+         e2:c7:4d:6c:30:1f:db:c1:29:b9:1b:2a:e1:b3:43:37:33:42:
+         ad:3a:fa:20:96:46:f5:84:ea:15:c2:83:c9:12:c7:71:54:37:
+         53:88:45:00:aa:62:d9:c1:f5:1e:c5:f1:11:95:7d:31:54:21:
+         56:37:1d:36:b0:42:c8:a8:6d:83:01:8d:14:f8:e3:88:05:b6:
+         81:43:d3:19:5d:3b:f4:6b:81:cf:2b:e8:cd:57:54:0e:6f:7a:
+         ef:fc:47:e6:3c:a9:cb:14:4a:6e:29:c7:00:ae:86:c3:fe:74:
+         38:92:37:bd:6a:08:97:f5:5c:26:b6:15:41:11:7a:1e:b9:71:
+         e7:9e:73:6b:f4:10:03:76:43:86:91:02:f8:30:4c:e7:bc:af:
+         55:10:bf:52
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCDANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTUwNDAyMDAwMDAwWhcNMTgwODAxMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvZyBBzCwBkWKiz0wm05Rn7F3y9e
-RxyfOFb9Imn8uvFQ+5MzE473wMc/VGiJ99AaWZjyV6NLAcUKhalEhU5gi4dgw6eQ
-0UuSoSImrIe7MPlVeFfTOBQ92WpukHZ1VC6cupXSZTdU3gflsKGRwdbx4i6TSZ5O
-w2aSGXe07n0YmTcnLgRZoOrH1GxWxnJvD7NeO8AaJk1rTcR/Zh/jcoMKObUITcLA
-SbkyM+N6ugA2ssMLvdBK0ojnvflqMpmKw6qeeh2ucTXWOqnB6qYvGOEVorfbjgI7
-q6qkLNZPYNKNvEoNfNheCvv+g5YQH9UUqw502ri0USXsrXYT3RrHVeQmxwIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUKTaQL7rB6v3Y4U9e18KaFeoa
-NTwwHwYDVR0jBBgwFoAUygvuwyCtY/yJ+nFpSeY4eOz5xlUwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAKWmVDlgyjmU4NoBoTp7H8EzYU+NVy4gMU8RKb3DjNuQSLM91smtC15F
-0/ruHrTtRL8h0Wq3h7w4l5Xh0QImWKy2/AGK8c+2ohq1AWz7zjNhvtaIY6eUdi9i
-witT+9X4Eg290TFzLGWHpwniSZ96OMWRZdhpEJPsmesXya+zG140KpQx6I7SGYZG
-yJsPEB/t08jWmBGThl1JARnbAcRzgrJBbb4NRbBMrel3JQ+o/6aOYI/KWBmyy5uI
-okQroi9YqglqKlVR43xoNYqDCcnHRK7qnFi1TzMPJPnunxGgKASYffjpnEjTfI4I
-GLmSIUB1DzaW/w//MCNcC53lml4kUOM=
+MIIDvzCCAqegAwIBAgIBDzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE1MDQwMjAw
+MDAwMFoXDTE4MDgwMTAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALlmvFV8ynDrLmqLEYyvHi3irqW5lr4KFggrmNaMpiSHqA4uI/Bai/pu
+t9yyKlZX13aRacMjRPNAdNeDbfuU2ejmNJYty0MCacRfwAEJmg9VW/W4d16rC1hG
+H9RCWUM/WpJayiKNqRj/rEjp86Sk89Wb6CNwzSbyAgvjHqXm6kYPOQb7G/PpzmXf
+FeY/csADcl494EyUJ4zudkRJ6/AnD9n8Av7l/XDY/oqmmWFSdrlrr4lQhKsrySoT
+DTv4/lBhqOBX4fYUZgBVFbOZA77+byQ5EraLvdVgfyHCJGgHYt1zckkKCcxlJ3w3
+DgCbtYpPcPvFFDRCyydLIlCNWxcPm4UCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFM5lpjentjhLOKNugMd8E/tRwkW2MB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQAlYx4Wg/NIUoC+C4JM
+JCdYRLAaOORNSbiGQ6LHWTFAdDunGAcwffZc5fMfSdMyHPG5R8hSWxmTqWuAQZap
+Nc7R/52CxhPKBFY4/N/PWlRfd6koxcYLC1YE6Ddz0465b8iSRqs1B15VBtL8rIvi
+x01sMB/bwSm5Gyrhs0M3M0KtOvoglkb1hOoVwoPJEsdxVDdTiEUAqmLZwfUexfER
+lX0xVCFWNx02sELIqG2DAY0U+OOIBbaBQ9MZXTv0a4HPK+jNV1QOb3rv/EfmPKnL
+FEpuKccArobD/nQ4kje9agiX9VwmthVBEXoeuXHnnnNr9BADdkOGkQL4MEznvK9V
+EL9S
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/60_months_after_2012_07.pem b/net/data/ssl/certificates/60_months_after_2012_07.pem
index 38b5824..dab4d76 100644
--- a/net/data/ssl/certificates/60_months_after_2012_07.pem
+++ b/net/data/ssl/certificates/60_months_after_2012_07.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 9 (0x9)
+        Serial Number: 16 (0x10)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Oct 30 00:00:00 2014 GMT
             Not After : Sep 30 00:00:00 2019 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:d0:ce:ff:98:a7:74:c4:bd:de:de:d3:b3:5a:fe:
-                    14:0f:ee:44:f8:08:cc:5e:bf:79:c9:be:0a:dc:ce:
-                    b9:73:c4:af:c2:3d:35:6a:6f:a3:ed:5e:21:63:a2:
-                    e1:39:c5:c3:0c:82:dd:da:e7:5f:c1:21:5d:34:0d:
-                    e9:e3:2a:bf:6f:a8:9e:5a:74:a9:6c:57:83:c1:35:
-                    f6:ce:58:78:0d:56:5a:f1:72:b9:62:12:76:50:fe:
-                    71:ef:e7:44:bb:47:e1:a4:fa:d6:03:5e:8f:a9:24:
-                    50:8f:e2:c2:8a:65:b6:57:8f:ee:0c:c9:2c:b9:9c:
-                    05:cf:38:36:c0:72:d6:fe:d6:da:2b:95:24:a4:93:
-                    d2:62:6d:a4:b0:03:d1:36:1e:75:16:91:3e:f6:0f:
-                    a0:b5:8f:77:75:af:b2:10:bc:78:9f:9c:73:31:ac:
-                    06:11:d9:32:29:9c:da:66:ff:fc:d8:b3:70:8f:f8:
-                    df:67:06:e1:9c:a1:ea:ec:f1:e8:92:52:aa:9e:35:
-                    c6:0c:d2:62:24:b0:ef:3e:9c:49:a7:b6:ee:de:2e:
-                    9c:56:6d:f5:0d:bb:e3:84:2b:b0:e2:7f:be:35:5a:
-                    02:50:d2:70:c4:a0:ed:a1:ab:28:99:d0:62:80:ef:
-                    c1:26:6a:39:ab:28:e0:73:86:f4:da:50:91:ac:b4:
-                    e3:21
+                    00:d7:ad:de:70:7e:14:f1:ca:94:be:98:67:43:26:
+                    f8:b3:52:cf:da:cf:a3:ef:1b:68:c6:bd:89:ed:dd:
+                    1d:c0:75:ee:5c:1c:bb:a4:da:d2:68:91:d9:52:ca:
+                    49:9c:f4:fd:2e:03:de:da:01:51:6e:11:53:e0:9f:
+                    3b:3b:f9:df:ed:18:ec:9c:54:90:4f:17:39:fd:5f:
+                    d0:b3:37:1f:40:fe:8a:43:17:27:ed:81:d4:36:0b:
+                    8c:c8:0d:d1:a0:79:0b:2a:36:76:80:c0:11:d0:2c:
+                    30:2f:e0:97:8f:9a:2a:39:c7:98:81:91:c7:09:30:
+                    12:10:5f:8c:7f:bd:8f:42:20:e2:82:dd:26:3c:1f:
+                    2c:d1:9b:3c:92:25:8e:46:54:19:24:87:cc:e4:84:
+                    d1:63:20:06:a9:08:53:cd:a6:81:bd:91:94:2b:4e:
+                    05:84:32:93:d6:ce:56:1d:80:6d:4f:bc:ef:cb:d0:
+                    bc:d4:c8:ce:ff:ac:1f:41:cc:4e:fb:2e:14:a3:54:
+                    84:14:e4:5b:8b:f8:a4:d8:40:d9:11:12:1d:c5:6a:
+                    d0:e7:13:e5:cb:97:9e:d2:61:64:c3:58:3a:c1:e2:
+                    07:5a:b8:32:27:b9:fa:67:4d:69:05:8e:c5:92:03:
+                    c1:e8:b6:0e:94:a4:91:64:99:72:50:bb:d0:5b:68:
+                    2c:0d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                F3:14:F0:CF:F0:35:C1:32:21:09:26:7C:D4:17:38:F6:09:58:FB:F4
+                BA:4E:4A:D5:D7:99:D0:37:13:7B:64:37:1A:0B:1F:5E:9D:93:1F:F4
             X509v3 Authority Key Identifier: 
-                keyid:85:AE:CA:C3:6C:F0:FC:C1:65:AF:18:CA:AB:FF:25:3F:54:9A:BF:EC
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         a0:ae:29:07:a4:72:63:78:32:8c:41:e1:e0:43:9f:e7:a3:88:
-         c7:75:25:55:e7:22:eb:18:8a:d3:af:11:e4:08:bd:70:4a:dc:
-         90:3f:14:64:3b:ad:22:57:09:68:cf:94:1e:b9:93:2d:41:c2:
-         f9:04:7e:a1:51:48:ab:34:29:e4:34:c2:2c:7d:0f:34:fe:ae:
-         e9:c1:18:28:07:9f:96:71:76:76:2f:e7:7f:bd:9d:84:97:4a:
-         0c:b1:b3:2a:a9:c6:7e:78:9e:cb:f7:29:8a:82:74:15:8e:91:
-         bc:36:26:38:f4:c8:94:e0:02:ff:47:fb:1e:ca:fd:f9:fb:fe:
-         7d:15:cd:6f:36:7b:08:54:38:fd:ca:d0:c7:22:84:7e:58:5b:
-         f3:a4:7b:49:cb:9b:e0:23:36:2c:eb:b1:6d:34:12:7a:f1:12:
-         67:59:02:d9:9f:4d:3a:01:3e:06:aa:00:37:c0:be:fe:de:6c:
-         c6:b4:33:17:df:d2:b3:95:4c:ef:4a:8e:39:03:2c:2e:56:5c:
-         82:2e:c7:0b:be:51:52:05:8f:74:5d:5c:24:2d:15:4e:c4:41:
-         86:26:e6:96:28:91:a7:06:94:ab:14:7a:1f:0c:0b:aa:b5:97:
-         f0:25:b6:4a:15:8a:d8:b8:09:01:22:fc:4c:43:cf:de:45:dc:
-         0a:95:77:f6
+         a2:e4:6c:8f:21:3b:6c:ee:16:f3:58:41:35:18:e2:a7:88:e5:
+         d5:7b:a5:4c:e3:36:9d:d9:f5:ba:98:38:6c:da:b8:b3:4e:fa:
+         c8:38:fa:a9:89:62:90:cb:ec:6a:26:ac:f3:7b:5c:f1:68:06:
+         dd:34:0f:fc:39:27:8f:fa:e9:c8:8e:81:0e:57:ca:40:6d:ee:
+         79:a7:f7:02:28:18:60:2c:a7:81:c6:45:a2:2d:fc:2c:bc:87:
+         76:3a:e1:b5:52:67:99:1b:0b:d6:f3:57:d5:29:ec:ee:a5:ea:
+         1d:9c:29:ec:f9:f9:cf:48:72:86:15:99:a1:e6:55:e1:b6:e4:
+         50:15:25:58:71:5e:26:a7:af:03:21:ce:ca:62:cd:98:d5:d4:
+         0c:32:4a:05:82:35:2a:bd:06:ce:c2:05:01:55:82:ee:98:e2:
+         a7:07:55:1e:0c:4b:48:05:42:89:29:08:13:0a:f5:1d:7c:9f:
+         a4:09:99:35:bb:9b:44:ad:81:87:75:8a:b1:a0:bf:2d:46:c6:
+         5b:90:84:03:20:6f:6e:d3:b9:52:44:06:28:3f:16:f2:75:27:
+         66:01:70:39:79:39:84:ed:e5:61:b0:83:22:c9:f1:ad:ca:8a:
+         6c:26:4a:c7:05:9a:7f:9f:29:6f:ed:a9:1e:8d:29:b5:08:26:
+         21:61:c2:54
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCTANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTQxMDMwMDAwMDAwWhcNMTkwOTMwMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0M7/mKd0xL3e3tOzWv4UD+5E+AjM
-Xr95yb4K3M65c8Svwj01am+j7V4hY6LhOcXDDILd2udfwSFdNA3p4yq/b6ieWnSp
-bFeDwTX2zlh4DVZa8XK5YhJ2UP5x7+dEu0fhpPrWA16PqSRQj+LCimW2V4/uDMks
-uZwFzzg2wHLW/tbaK5UkpJPSYm2ksAPRNh51FpE+9g+gtY93da+yELx4n5xzMawG
-EdkyKZzaZv/82LNwj/jfZwbhnKHq7PHoklKqnjXGDNJiJLDvPpxJp7bu3i6cVm31
-DbvjhCuw4n++NVoCUNJwxKDtoasomdBigO/BJmo5qyjgc4b02lCRrLTjIQIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU8xTwz/A1wTIhCSZ81Bc49glY
-+/QwHwYDVR0jBBgwFoAUha7Kw2zw/MFlrxjKq/8lP1Sav+wwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAKCuKQekcmN4MoxB4eBDn+ejiMd1JVXnIusYitOvEeQIvXBK3JA/FGQ7
-rSJXCWjPlB65ky1BwvkEfqFRSKs0KeQ0wix9DzT+runBGCgHn5ZxdnYv53+9nYSX
-Sgyxsyqpxn54nsv3KYqCdBWOkbw2Jjj0yJTgAv9H+x7K/fn7/n0VzW82ewhUOP3K
-0McihH5YW/Oke0nLm+AjNizrsW00EnrxEmdZAtmfTToBPgaqADfAvv7ebMa0Mxff
-0rOVTO9KjjkDLC5WXIIuxwu+UVIFj3RdXCQtFU7EQYYm5pYokacGlKsUeh8MC6q1
-l/AltkoViti4CQEi/ExDz95F3AqVd/Y=
+MIIDvzCCAqegAwIBAgIBEDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE0MTAzMDAw
+MDAwMFoXDTE5MDkzMDAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANet3nB+FPHKlL6YZ0Mm+LNSz9rPo+8baMa9ie3dHcB17lwcu6Ta0miR
+2VLKSZz0/S4D3toBUW4RU+CfOzv53+0Y7JxUkE8XOf1f0LM3H0D+ikMXJ+2B1DYL
+jMgN0aB5Cyo2doDAEdAsMC/gl4+aKjnHmIGRxwkwEhBfjH+9j0Ig4oLdJjwfLNGb
+PJIljkZUGSSHzOSE0WMgBqkIU82mgb2RlCtOBYQyk9bOVh2AbU+878vQvNTIzv+s
+H0HMTvsuFKNUhBTkW4v4pNhA2RESHcVq0OcT5cuXntJhZMNYOsHiB1q4Mie5+mdN
+aQWOxZIDwei2DpSkkWSZclC70FtoLA0CAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFLpOStXXmdA3E3tkNxoLH16dkx/0MB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCi5GyPITts7hbzWEE1
+GOKniOXVe6VM4zad2fW6mDhs2rizTvrIOPqpiWKQy+xqJqzze1zxaAbdNA/8OSeP
++unIjoEOV8pAbe55p/cCKBhgLKeBxkWiLfwsvId2OuG1UmeZGwvW81fVKezupeod
+nCns+fnPSHKGFZmh5lXhtuRQFSVYcV4mp68DIc7KYs2Y1dQMMkoFgjUqvQbOwgUB
+VYLumOKnB1UeDEtIBUKJKQgTCvUdfJ+kCZk1u5tErYGHdYqxoL8tRsZbkIQDIG9u
+07lSRAYoPxbydSdmAXA5eTmE7eVhsIMiyfGtyopsJkrHBZp/nylv7akejSm1CCYh
+YcJU
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/61_months_after_2012_07.pem b/net/data/ssl/certificates/61_months_after_2012_07.pem
index eebdbc37..ef21ce9 100644
--- a/net/data/ssl/certificates/61_months_after_2012_07.pem
+++ b/net/data/ssl/certificates/61_months_after_2012_07.pem
@@ -1,82 +1,84 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 10 (0xa)
+        Serial Number: 17 (0x11)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Oct 30 00:00:00 2014 GMT
-            Not After : Dec 19 23:35:24 2019 GMT
+            Not After : Jun  9 17:10:52 2022 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ce:0e:90:96:f2:40:37:c6:86:dd:af:b7:23:d5:
-                    01:87:bc:1e:9f:0d:f1:4b:eb:6f:85:14:64:fe:e4:
-                    47:f7:52:a8:52:22:9c:2e:6f:b5:f6:36:c0:70:27:
-                    e5:a9:8a:da:bd:04:06:1e:97:a4:48:06:56:2d:2a:
-                    d1:81:2f:be:4e:22:68:34:54:de:38:df:1e:84:b7:
-                    5f:17:89:a7:98:62:db:94:9e:ac:df:91:a6:d5:91:
-                    b5:c7:ae:89:6e:30:c1:5a:37:23:b8:d9:f8:b4:53:
-                    1b:f7:63:4f:2b:f9:c3:c7:37:1f:66:c7:e1:1c:d9:
-                    2b:68:b9:e5:58:65:68:e9:01:0b:fb:24:01:57:bc:
-                    c5:94:b8:c8:27:dd:c9:b4:44:16:30:2b:cd:11:62:
-                    68:48:07:22:4b:b7:e5:e9:42:34:17:4e:f3:c9:d1:
-                    77:7d:97:9a:ec:ec:58:35:5b:3e:2c:21:31:fe:57:
-                    98:16:3f:fc:cb:00:7b:4d:6b:d9:99:3e:29:69:ae:
-                    ef:01:64:4c:f7:cd:18:15:bd:48:19:e3:db:c1:a2:
-                    d2:40:c2:69:53:43:39:cd:a6:c2:3a:57:23:39:27:
-                    7c:9f:1f:21:3f:bc:e1:f9:0b:37:59:f0:fc:c1:6f:
-                    cf:2e:a9:59:d2:0d:32:dd:70:64:9a:e7:e8:eb:e4:
-                    69:53
+                    00:e1:6a:f0:32:d3:9e:18:77:0f:08:d1:d0:03:11:
+                    ac:65:b3:11:e5:dd:5f:ee:74:f5:ff:c8:b1:56:80:
+                    fd:ad:af:82:24:95:c0:7d:99:d2:62:46:bb:fb:9e:
+                    75:40:5e:15:d0:9e:d9:29:0a:3f:25:bd:83:a5:da:
+                    c6:41:99:59:b2:8e:7b:3e:bb:2d:0c:8f:ea:f9:26:
+                    e5:c6:8f:4a:68:0b:fa:84:3c:1b:57:db:53:eb:6c:
+                    af:9a:8a:7b:9b:b0:fb:cc:92:3e:8a:ea:24:d0:3c:
+                    ff:06:c6:f0:79:b2:1b:8d:3f:3f:d6:ed:08:8c:48:
+                    9c:40:fa:f9:28:95:d1:f3:5e:8d:1b:4b:63:c4:d3:
+                    48:77:34:ee:82:db:6e:53:6b:32:ba:db:23:87:07:
+                    85:ad:26:9b:1b:d0:bb:2f:6b:48:c0:17:d0:2a:af:
+                    04:c2:87:10:5c:16:71:4c:a5:21:0d:5b:c0:80:1c:
+                    c5:7c:39:4b:ca:93:23:5a:37:e4:fb:d2:7d:2c:f8:
+                    1b:20:bc:06:01:76:05:63:07:bd:3d:b7:6f:b2:dd:
+                    68:d9:88:76:9e:23:17:9a:8d:d1:58:b6:a9:9a:81:
+                    72:c0:8c:2b:8b:b3:e0:c5:93:b1:50:49:d3:ef:de:
+                    9b:e0:1f:75:77:cb:61:ae:f4:7a:f8:40:2e:88:77:
+                    67:bf
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                37:7B:6E:B4:DC:15:72:1F:4E:DB:39:37:A4:B1:F2:B7:7C:F8:C3:D5
+                ED:25:EF:01:D1:A8:70:5C:5B:FD:6B:2C:9E:5E:69:2F:49:21:C1:DA
             X509v3 Authority Key Identifier: 
-                keyid:CA:0B:EE:C3:20:AD:63:FC:89:FA:71:69:49:E6:38:78:EC:F9:C6:55
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         90:d9:88:2f:6e:fe:22:5c:be:f3:97:f7:50:4e:a2:de:cc:7b:
-         33:c3:27:f3:38:15:46:f7:02:44:d4:87:84:23:15:44:8c:17:
-         6f:10:bc:15:1a:83:bd:6d:94:dd:f4:9f:aa:91:01:85:80:27:
-         88:af:e1:7a:54:9f:04:97:10:8b:05:b1:a2:4f:04:ff:36:a9:
-         c6:79:7d:2f:a1:49:f5:9a:ff:bb:5c:d8:f6:3f:54:d0:27:13:
-         fc:90:4b:e1:3f:ea:c8:98:65:3b:28:44:26:cb:45:14:62:f4:
-         b4:71:3a:d8:68:a2:ec:51:64:a3:d8:3b:80:a4:17:36:89:d3:
-         8b:de:2a:1b:dc:2d:3f:4b:9e:ab:34:09:8c:44:30:da:1a:09:
-         2f:61:cf:4b:7d:2f:14:7e:10:a3:a9:df:c6:db:68:77:43:92:
-         d1:df:93:ee:a6:54:f4:4d:cc:ea:a8:7a:b5:75:fc:25:1f:8e:
-         6b:8e:50:ee:13:aa:7b:19:bc:63:0c:3f:b3:af:ee:2d:f3:42:
-         40:dd:de:26:18:44:e0:06:a7:4d:17:93:a3:9d:81:da:1f:7f:
-         81:55:46:5e:8f:44:5a:06:4a:fb:7c:43:95:20:97:d8:5b:d8:
-         c0:8c:31:03:21:ce:16:4a:f0:8f:41:69:6d:25:71:c9:79:3b:
-         82:d2:2c:22
+         19:1d:92:62:5e:9f:3a:4b:20:2c:2e:1a:25:31:1d:95:b4:21:
+         d3:ec:ee:77:60:85:85:40:1c:eb:7f:22:9e:ab:1f:74:74:d5:
+         cc:4b:af:c4:cc:4f:60:ab:05:14:f1:35:20:b7:ec:92:56:0e:
+         2d:b4:de:65:f2:50:31:19:ad:9e:7e:bb:50:05:e4:e7:d8:5d:
+         ed:d1:f8:58:75:5d:72:23:97:30:e6:e8:ac:83:35:1d:6a:5f:
+         94:2f:55:59:1e:a5:a5:a1:90:86:d9:5b:0f:54:59:05:11:01:
+         ee:a7:fe:c9:a3:13:32:13:d8:c4:55:95:c6:cf:fa:be:a5:ff:
+         57:4d:e7:15:de:7e:82:8d:7f:d1:3b:49:0f:98:dc:28:c7:af:
+         62:aa:f8:bd:a4:db:aa:a5:56:d3:49:91:5a:86:28:b0:5a:90:
+         b9:7d:9f:e0:cc:f2:e3:dc:5e:f0:bf:92:38:7d:b8:d2:f4:af:
+         83:ef:c7:02:60:e7:6b:12:d7:b9:ea:20:e7:3b:e4:75:61:cf:
+         98:58:af:fe:11:81:08:b6:98:cc:ce:4f:d5:9c:93:88:c6:a7:
+         52:31:53:d0:d0:cf:c5:65:e4:b3:0a:ef:4b:01:73:e3:8c:40:
+         10:a4:52:4d:08:4c:85:8d:27:ad:f6:2f:4a:7a:9c:4b:d4:99:
+         94:07:be:90
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCjANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTQxMDMwMDAwMDAwWhcNMTkxMjE5MjMzNTI0WjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzg6QlvJAN8aG3a+3I9UBh7wenw3x
-S+tvhRRk/uRH91KoUiKcLm+19jbAcCflqYravQQGHpekSAZWLSrRgS++TiJoNFTe
-ON8ehLdfF4mnmGLblJ6s35Gm1ZG1x66JbjDBWjcjuNn4tFMb92NPK/nDxzcfZsfh
-HNkraLnlWGVo6QEL+yQBV7zFlLjIJ93JtEQWMCvNEWJoSAciS7fl6UI0F07zydF3
-fZea7OxYNVs+LCEx/leYFj/8ywB7TWvZmT4paa7vAWRM980YFb1IGePbwaLSQMJp
-U0M5zabCOlcjOSd8nx8hP7zh+Qs3WfD8wW/PLqlZ0g0y3XBkmufo6+RpUwIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUN3tutNwVch9O2zk3pLHyt3z4
-w9UwHwYDVR0jBBgwFoAUygvuwyCtY/yJ+nFpSeY4eOz5xlUwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAJDZiC9u/iJcvvOX91BOot7MezPDJ/M4FUb3AkTUh4QjFUSMF28QvBUa
-g71tlN30n6qRAYWAJ4iv4XpUnwSXEIsFsaJPBP82qcZ5fS+hSfWa/7tc2PY/VNAn
-E/yQS+E/6siYZTsoRCbLRRRi9LRxOthoouxRZKPYO4CkFzaJ04veKhvcLT9Lnqs0
-CYxEMNoaCS9hz0t9LxR+EKOp38bbaHdDktHfk+6mVPRNzOqoerV1/CUfjmuOUO4T
-qnsZvGMMP7Ov7i3zQkDd3iYYROAGp00Xk6Odgdoff4FVRl6PRFoGSvt8Q5Ugl9hb
-2MCMMQMhzhZK8I9BaW0lccl5O4LSLCI=
+MIIDvzCCAqegAwIBAgIBETANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE0MTAzMDAw
+MDAwMFoXDTIyMDYwOTE3MTA1MlowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAOFq8DLTnhh3DwjR0AMRrGWzEeXdX+509f/IsVaA/a2vgiSVwH2Z0mJG
+u/uedUBeFdCe2SkKPyW9g6XaxkGZWbKOez67LQyP6vkm5caPSmgL+oQ8G1fbU+ts
+r5qKe5uw+8ySPorqJNA8/wbG8HmyG40/P9btCIxInED6+SiV0fNejRtLY8TTSHc0
+7oLbblNrMrrbI4cHha0mmxvQuy9rSMAX0CqvBMKHEFwWcUylIQ1bwIAcxXw5S8qT
+I1o35PvSfSz4GyC8BgF2BWMHvT23b7LdaNmIdp4jF5qN0Vi2qZqBcsCMK4uz4MWT
+sVBJ0+/em+AfdXfLYa70evhALoh3Z78CAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFO0l7wHRqHBcW/1rLJ5eaS9JIcHaMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQAZHZJiXp86SyAsLhol
+MR2VtCHT7O53YIWFQBzrfyKeqx90dNXMS6/EzE9gqwUU8TUgt+ySVg4ttN5l8lAx
+Ga2efrtQBeTn2F3t0fhYdV1yI5cw5uisgzUdal+UL1VZHqWloZCG2VsPVFkFEQHu
+p/7JoxMyE9jEVZXGz/q+pf9XTecV3n6CjX/RO0kPmNwox69iqvi9pNuqpVbTSZFa
+hiiwWpC5fZ/gzPLj3F7wv5I4fbjS9K+D78cCYOdrEte56iDnO+R1Yc+YWK/+EYEI
+tpjMzk/VnJOIxqdSMVPQ0M/FZeSzCu9LAXPjjEAQpFJNCEyFjSet9i9KepxL1JmU
+B76Q
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/README b/net/data/ssl/certificates/README
index db150677..c465ad3 100644
--- a/net/data/ssl/certificates/README
+++ b/net/data/ssl/certificates/README
@@ -99,12 +99,6 @@
      https://www.google.com:443.
 - unittest.originbound.key.der: matching PrivateKeyInfo.
 
-- test_mail_google_com.pem : A certificate signed by the test CA for
-    "mail.google.com". Because it is signed by that CA instead of the true CA
-    for that host, it will fail the
-    TransportSecurityState::IsChainOfPublicKeysPermitted test. Format
-    intentionally does not include diagnostic output.
-
 - multivalue_rdn.pem : A regression test for http://crbug.com/101009. A
      certificate with all of the AttributeTypeAndValues stored within a single
      RelativeDistinguishedName, rather than one AVA per RDN as normally seen.
diff --git a/net/data/ssl/certificates/bad_validity.pem b/net/data/ssl/certificates/bad_validity.pem
index adbca9d..cb51391 100644
--- a/net/data/ssl/certificates/bad_validity.pem
+++ b/net/data/ssl/certificates/bad_validity.pem
@@ -1,37 +1,37 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDRJAE3URWl3WBC
-/nCjgXcKbjJG0CdMnh7fM+UT3Q/K3bf/QNiupIOVN8CN4HcsinlHHcXFcRGGL64Z
-xHq2RklGs8+Hm1UwhrAQ7BUjvcufCtmui1H5MDhr+511RWDVB9Qf4rzqLJWXVaYj
-o9Ris5DwMk9MDJ9+9YIkORzcehJMwuTBjxhAKR/TqnGi9yLg4Pwy4UgVMKPFXaPd
-JFYWVgpmiR36qgJFHpRJyH/vt0eS8iQP+5jbMh28RS+EVnKMGDcDFgeHNbJhftui
-aVGb3JwL16QEIiFKci4ItM3gEXmMlryTJ72rFnGDO0l2v4GRmXtS4+k4LqsrwKeZ
-fDgifeUFAgMBAAECggEATFOllfiju+r1LL4LgcDIHyhkdO+WyCGVBsS7v+oXz2Pn
-uOKDsgkcdKLqRV08YScQZ+H3wb0oNh7EnWbVmhxAter9vHH2P0WIkER42phz7dFZ
-7JewDQ+KJ+6mYpw1YMoAorpvU899sMNzZOJvqq36IY9a3VhmBUG4g1vMqrJqZ1S4
-nVKWHCbC0ErTIKUVTyIwTB2agJCA63bFz+ZMvnW9zLVj+nGRBx95F8JM5m1EYvzB
-jZsGYz18Q7gp7zSlfUbxyWSjBmw5/HhskhUrInOqVHc/c9mijVWfrkzitwFWqEij
-vgpGLUKzvcAueCU6Tp+CBH3GGLy8IaUzJYuO5+wQqQKBgQDpdH5zRAeyIXWQEbzy
-KOImRFETIJ4KcBoKWr+I4/IHneIPmOKtDBHZQvqTvAb00tsM7VF/3RGsSsYY8yJC
-zNkTog/wh/wkZhxlvwsu5a7/dBaXz0g4mvFlavve202e8wufSiSb0f1tyDrUwyRI
-YscSrY2rLZhg9g6HNkMVjIta6wKBgQDlVmgjiDSIvhzInO80NKaVN4SDJsKTjbzV
-DhHdsW7RgFQpuEQChbNxHkW6RjQdO0A01/4TRjmfWOrPKXY9TFUBFQw1Jbi/W/da
-T6p1QlFaJUxXKQB1KnW/mtOS6GEm+2vcVKg87qUGCZtvtdt1l/N5lBBofCO2kLOu
-Qv+31lPjzwKBgDVngMW9ekU1gj9Cz4ZV8+XtGt7VR1H78vkLaWVXP7aeV2haAQC1
-EiAxQkEpci3vTkzWvR4S5EgVktuCQwQk+EOVfy/266cn9LcRzO0dfbrSQ5jWwh6w
-0yfwIU4JvOfvkWkO/PDoSKEkfNDPEy276u5K5W2TMJh9sTUdJJt5WyehAoGAaq2P
-0X9pGHZ+gx7k8f7PwjdJ74vXFLXosZ5S1zHS36b2/1UUZav1tVekjapcUYCfNDWI
-nUScRzAgQW8C7i6Ul+VHgW1ji7fmzl6iZtsLZohVA3IyIU436YHGit6HWo+3M405
-mOZVYwKTCBqq0/9zpQknvMKKBkE3I4dM1iHfcecCgYALR2AVz10mLwrtNc9vcnfF
-wZk+x6NQRaEMp2hnQOccfF4Vt4PRD6YwwA6n6CJny8Eofo4k6LkpO982jakBh2SD
-qU3Njrc0lZF6IaGNHqoYk+P0Fz6HuVIyT62FKsL7RreWfgGDeFmiLNYoKefenRa/
-54tB1YReM49UiW4CbBvwqQ==
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0v9KXM+UTW3dl
+vXMadSibR1nmtzDoRjNtWFvaHwr/5OQt8h34iehkLvbDzdejjtf3zefYDhDD51bS
+/OXm007i/4JNGGOHsKPe2u8KN3ustbdDzvIHOd8U6cOkQT5+aEc0m3thxBjmE86z
+tKbgugPu5OvnqvRtvpdbqgaXUAHQeLjWkrDk4rlDiLWuFGR9UnDUBRwJJdXiT8mo
+gttBMcO+RG8L1P2/we7ZYr87j7UAyNHfXUoTrXHkS1/R2XJMg9iTQL9szS9mDgTW
+uUMoJMkl/Vlw/j3yqQpOwpvE3p5XXl0WJeZ4tkRJKZ32v3T7hdYN8WVY8ivWjxBJ
+yAAtiOItAgMBAAECggEAXuyGumXEnl/g2oueEX0J8FKOgj4e7z0+8OQAiRLYgf9B
+XmfTGZ3DcCnB6p8F6p2wCjIW2j64y0mJLZEnZAwBV/F8CuUOEErSJM2x0BnHV7Kv
+JmtebDEWWTNTTcX9/gDhtF0bdQK5WMt6OKJdKZRHUITk52u+pov7jWZDw99+tG5w
+InCv1RekWbAGZWLs9hyzpOpvp0tGM2O9+XCWQh/LLeLb5rJkTcH8NKv9Xh+tLeSU
+i/FER+rQHsMVA4uHdBmRgPsBnPrJopcKWQImRXDGidEd5AUWLIECQdnZI8pbtmjV
+0HZj+UuUlDFdALmCHX+NxR4Z+hyi+E96ZWw/J9FHwQKBgQDYX0e873Sf4tDOn0cZ
+Olof3cXPri8ezKoeAD8tfY0bxLIoOwDUtJXZeGEZD3sduDJDCdvS1M/eeW04ePlx
+kTmcDecaYm4t3KYzbPauudbMQEQFvsoivp8ct/synPcRtGPTHg+GUHaqWT1d4DjT
+WClxx67ugD/YQYs5UY/uLjm4tQKBgQDV2lh1Uk3xBj15FZrzg/7GM7bK3L/Xcxzz
+VewAksKuVEyoqHfZAo6P/xOiQkwc9kBoet43MiNyph/kYssQowE+Pg+WffB1Ve4F
+kVsq6z1mwAfnYD6m4GHxfrV6VxwM3ItiX+PiKQ4YWsbyjc/vC4ZRSarLwbk8Woya
+lNucr2hGmQKBgF5sdioFdaewm98Psz9XL61oYsLXCMkwF60v/mIjwEi19emIljw8
+8ogM+JKvJtM5ZvXKf5vqMyyrYPacFH9zGOj5SDlDa0GoYP9gNebaQtqv0P+Q2zV+
+aoFl6MGVrlyTlFy1aaD7zE1a1GT7TNEuUCfPNI/wd+wv7kn9RgpzMc1hAoGBAJrh
+5Zkq/+olc9ZDcJMXsSkJgUURdhvrcjdGroOHx1oNEexA/3P7ZxchTa4ByDBdpS5G
+drSRKp05dfWqG5o0BI140z9SfRnuH1KHAPlnoHPPdqn7ycSA1E7cT0GI33btMEIS
+YvCEfYHkFRzM2qEtvp0W9o1WA/uTNSwrzZaAb8xZAoGAZZLwniPa8zkd+4WAPSN6
+LVj+1dGasfL/zftFhVxu0/KCpdggghG26Ej0ieG71k8Xg9tpZDJvo9Kj0s8Hu4Zu
+TnhwwRVyUHls+Gl0t8XXV/ryRLHB8zY45k6A+Yvc/iOYQVmY2rE4kB4PDsrJ+d5P
+wA1o1OPvcx28oBjHViWoWJQ=
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 5 (0x5)
+        Serial Number: 8 (0x8)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Jan  1 00:00:00 1 GMT
             Not After : Jan  1 00:00:00 1 GMT
@@ -40,70 +40,71 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:d1:24:01:37:51:15:a5:dd:60:42:fe:70:a3:81:
-                    77:0a:6e:32:46:d0:27:4c:9e:1e:df:33:e5:13:dd:
-                    0f:ca:dd:b7:ff:40:d8:ae:a4:83:95:37:c0:8d:e0:
-                    77:2c:8a:79:47:1d:c5:c5:71:11:86:2f:ae:19:c4:
-                    7a:b6:46:49:46:b3:cf:87:9b:55:30:86:b0:10:ec:
-                    15:23:bd:cb:9f:0a:d9:ae:8b:51:f9:30:38:6b:fb:
-                    9d:75:45:60:d5:07:d4:1f:e2:bc:ea:2c:95:97:55:
-                    a6:23:a3:d4:62:b3:90:f0:32:4f:4c:0c:9f:7e:f5:
-                    82:24:39:1c:dc:7a:12:4c:c2:e4:c1:8f:18:40:29:
-                    1f:d3:aa:71:a2:f7:22:e0:e0:fc:32:e1:48:15:30:
-                    a3:c5:5d:a3:dd:24:56:16:56:0a:66:89:1d:fa:aa:
-                    02:45:1e:94:49:c8:7f:ef:b7:47:92:f2:24:0f:fb:
-                    98:db:32:1d:bc:45:2f:84:56:72:8c:18:37:03:16:
-                    07:87:35:b2:61:7e:db:a2:69:51:9b:dc:9c:0b:d7:
-                    a4:04:22:21:4a:72:2e:08:b4:cd:e0:11:79:8c:96:
-                    bc:93:27:bd:ab:16:71:83:3b:49:76:bf:81:91:99:
-                    7b:52:e3:e9:38:2e:ab:2b:c0:a7:99:7c:38:22:7d:
-                    e5:05
+                    00:b4:bf:d2:97:33:e5:13:5b:77:65:bd:73:1a:75:
+                    28:9b:47:59:e6:b7:30:e8:46:33:6d:58:5b:da:1f:
+                    0a:ff:e4:e4:2d:f2:1d:f8:89:e8:64:2e:f6:c3:cd:
+                    d7:a3:8e:d7:f7:cd:e7:d8:0e:10:c3:e7:56:d2:fc:
+                    e5:e6:d3:4e:e2:ff:82:4d:18:63:87:b0:a3:de:da:
+                    ef:0a:37:7b:ac:b5:b7:43:ce:f2:07:39:df:14:e9:
+                    c3:a4:41:3e:7e:68:47:34:9b:7b:61:c4:18:e6:13:
+                    ce:b3:b4:a6:e0:ba:03:ee:e4:eb:e7:aa:f4:6d:be:
+                    97:5b:aa:06:97:50:01:d0:78:b8:d6:92:b0:e4:e2:
+                    b9:43:88:b5:ae:14:64:7d:52:70:d4:05:1c:09:25:
+                    d5:e2:4f:c9:a8:82:db:41:31:c3:be:44:6f:0b:d4:
+                    fd:bf:c1:ee:d9:62:bf:3b:8f:b5:00:c8:d1:df:5d:
+                    4a:13:ad:71:e4:4b:5f:d1:d9:72:4c:83:d8:93:40:
+                    bf:6c:cd:2f:66:0e:04:d6:b9:43:28:24:c9:25:fd:
+                    59:70:fe:3d:f2:a9:0a:4e:c2:9b:c4:de:9e:57:5e:
+                    5d:16:25:e6:78:b6:44:49:29:9d:f6:bf:74:fb:85:
+                    d6:0d:f1:65:58:f2:2b:d6:8f:10:49:c8:00:2d:88:
+                    e2:2d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                54:54:26:B6:D4:1D:A7:E4:36:BE:65:51:D0:DC:4C:D5:34:44:3A:6B
+                E0:DC:E0:2F:07:88:74:3A:9F:D3:30:A3:71:8A:F9:D6:A5:E5:A6:53
             X509v3 Authority Key Identifier: 
-                keyid:F2:E4:D0:1B:1C:0E:46:12:B0:B1:D5:22:9E:F1:3F:84:B8:3B:6E:05
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         21:b6:a9:04:41:10:aa:62:e5:d3:fd:5b:55:c4:b6:4a:b4:f0:
-         c6:8f:53:7f:56:e4:09:c1:0f:83:7c:a3:6d:ad:e7:46:9f:47:
-         d0:a5:bc:be:04:9c:a0:37:a9:2d:92:2a:5b:9d:23:51:25:4c:
-         f1:f7:f0:0f:42:8b:59:63:dc:d3:f4:64:a3:d4:37:7c:2a:43:
-         33:9a:8f:68:36:b3:b2:74:0d:28:f6:3b:49:73:9e:f7:58:72:
-         a6:76:1c:db:84:94:94:30:2a:9e:db:40:30:eb:57:a4:80:35:
-         8b:56:ae:84:49:34:8e:4e:17:ab:b4:f0:b3:ad:17:6d:00:7d:
-         08:5d:d9:74:35:c0:6d:68:a8:19:f7:cd:5d:f4:37:a1:8d:6d:
-         3f:a5:13:40:8c:0f:3e:24:91:73:30:09:0b:27:97:40:fa:39:
-         27:49:e6:44:2d:06:77:99:f8:f7:18:4c:d1:1e:27:6d:60:12:
-         a2:c9:a6:75:20:ff:5f:63:89:37:01:47:12:e9:16:75:49:5b:
-         ee:dd:9e:a6:e3:de:15:9b:5f:f3:2b:cd:cc:5f:14:68:29:92:
-         84:79:7d:1a:46:3e:e0:14:01:d4:18:11:39:fa:57:cb:90:b0:
-         8a:96:6a:12:7a:45:43:c4:a5:16:bc:56:5d:54:55:75:c7:bd:
-         f1:86:d4:d9
+         86:50:e0:4c:98:8e:43:69:c2:2f:f5:2e:2e:64:30:28:0f:49:
+         48:d1:9a:61:bc:49:01:f8:84:0a:04:91:d4:04:ee:9d:02:fd:
+         00:2b:6d:57:d5:23:c7:62:eb:e2:96:15:90:bb:1d:3a:8f:98:
+         32:1b:0f:04:d1:e8:ce:e6:4f:a3:2b:3a:41:9c:04:15:b2:30:
+         3d:ef:f9:d1:8f:73:f2:f6:f9:0b:2e:8a:05:ce:ec:8f:1d:f1:
+         84:c0:ba:a3:ef:c3:1a:83:fb:19:1e:03:fd:46:3b:97:28:55:
+         af:0a:e9:3f:36:90:a0:8a:a6:13:ff:d1:10:ac:d1:7e:79:54:
+         ae:fe:74:b9:7c:3f:8c:b4:e1:3c:5d:0b:18:92:69:00:04:0a:
+         be:0a:c9:bd:57:ec:9b:c3:8d:d9:07:fd:97:5b:04:e9:b1:29:
+         d9:82:8e:f6:fe:ce:76:2c:b3:d4:3b:f3:06:6d:30:a6:b5:1d:
+         4b:f0:8c:57:07:1d:0e:23:6e:e4:50:fb:ef:74:d7:78:ff:be:
+         31:97:66:ce:9f:a8:98:48:21:97:56:29:d5:c2:6e:66:6f:9e:
+         f3:ad:cc:92:f0:ad:fb:0b:e7:90:42:f3:27:13:69:35:71:bb:
+         ee:9d:fd:dc:ee:3b:62:c4:2a:98:ca:15:6f:15:d9:f9:0f:82:
+         eb:fe:80:03
 -----BEGIN CERTIFICATE-----
-MIIDMjCCAhqgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwIhgPMDAwMTAxMDEwMDAwMDBaGA8wMDAxMDEwMTAwMDAwMFowGzEZ
-MBcGA1UEAxMQTGVhZiBDZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBANEkATdRFaXdYEL+cKOBdwpuMkbQJ0yeHt8z5RPdD8rdt/9A2K6k
-g5U3wI3gdyyKeUcdxcVxEYYvrhnEerZGSUazz4ebVTCGsBDsFSO9y58K2a6LUfkw
-OGv7nXVFYNUH1B/ivOoslZdVpiOj1GKzkPAyT0wMn371giQ5HNx6EkzC5MGPGEAp
-H9OqcaL3IuDg/DLhSBUwo8Vdo90kVhZWCmaJHfqqAkUelEnIf++3R5LyJA/7mNsy
-HbxFL4RWcowYNwMWB4c1smF+26JpUZvcnAvXpAQiIUpyLgi0zeAReYyWvJMnvasW
-cYM7SXa/gZGZe1Lj6TguqyvAp5l8OCJ95QUCAwEAAaOBgDB+MAwGA1UdEwEB/wQC
-MAAwHQYDVR0OBBYEFFRUJrbUHafkNr5lUdDcTNU0RDprMB8GA1UdIwQYMBaAFPLk
-0BscDkYSsLHVIp7xP4S4O24FMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcD
-AjAPBgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQAhtqkEQRCqYuXT
-/VtVxLZKtPDGj1N/VuQJwQ+DfKNtredGn0fQpby+BJygN6ktkipbnSNRJUzx9/AP
-QotZY9zT9GSj1Dd8KkMzmo9oNrOydA0o9jtJc573WHKmdhzbhJSUMCqe20Aw61ek
-gDWLVq6ESTSOThertPCzrRdtAH0IXdl0NcBtaKgZ981d9DehjW0/pRNAjA8+JJFz
-MAkLJ5dA+jknSeZELQZ3mfj3GEzRHidtYBKiyaZ1IP9fY4k3AUcS6RZ1SVvu3Z6m
-494Vm1/zK83MXxRoKZKEeX0aRj7gFAHUGBE5+lfLkLCKlmoSekVDxKUWvFZdVFV1
-x73xhtTZ
+MIIDfjCCAmagAwIBAgIBCDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMCIYDzAwMDEwMTAx
+MDAwMDAwWhgPMDAwMTAxMDEwMDAwMDBaMBsxGTAXBgNVBAMTEExlYWYgQ2VydGlm
+aWNhdGUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0v9KXM+UTW3dl
+vXMadSibR1nmtzDoRjNtWFvaHwr/5OQt8h34iehkLvbDzdejjtf3zefYDhDD51bS
+/OXm007i/4JNGGOHsKPe2u8KN3ustbdDzvIHOd8U6cOkQT5+aEc0m3thxBjmE86z
+tKbgugPu5OvnqvRtvpdbqgaXUAHQeLjWkrDk4rlDiLWuFGR9UnDUBRwJJdXiT8mo
+gttBMcO+RG8L1P2/we7ZYr87j7UAyNHfXUoTrXHkS1/R2XJMg9iTQL9szS9mDgTW
+uUMoJMkl/Vlw/j3yqQpOwpvE3p5XXl0WJeZ4tkRJKZ32v3T7hdYN8WVY8ivWjxBJ
+yAAtiOItAgMBAAGjgYAwfjAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTg3OAvB4h0
+Op/TMKNxivnWpeWmUzAfBgNVHSMEGDAWgBSbJguKmKm7HbkfHOMaQDPtjheIqzAd
+BgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0RBAgwBocEfwAAATAN
+BgkqhkiG9w0BAQsFAAOCAQEAhlDgTJiOQ2nCL/UuLmQwKA9JSNGaYbxJAfiECgSR
+1ATunQL9ACttV9Ujx2Lr4pYVkLsdOo+YMhsPBNHozuZPoys6QZwEFbIwPe/50Y9z
+8vb5Cy6KBc7sjx3xhMC6o+/DGoP7GR4D/UY7lyhVrwrpPzaQoIqmE//REKzRfnlU
+rv50uXw/jLThPF0LGJJpAAQKvgrJvVfsm8ON2Qf9l1sE6bEp2YKO9v7Odiyz1Dvz
+Bm0wprUdS/CMVwcdDiNu5FD773TXeP++MZdmzp+omEghl1Yp1cJuZm+e863MkvCt
++wvnkELzJxNpNXG77p393O47YsQqmMoVbxXZ+Q+C6/6AAw==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/crlset_by_intermediate_serial.raw b/net/data/ssl/certificates/crlset_by_intermediate_serial.raw
index 5cde6fb..370d488 100644
--- a/net/data/ssl/certificates/crlset_by_intermediate_serial.raw
+++ b/net/data/ssl/certificates/crlset_by_intermediate_serial.raw
Binary files differ
diff --git a/net/data/ssl/certificates/crlset_by_leaf_spki.raw b/net/data/ssl/certificates/crlset_by_leaf_spki.raw
index 750abff..acc4c15 100644
--- a/net/data/ssl/certificates/crlset_by_leaf_spki.raw
+++ b/net/data/ssl/certificates/crlset_by_leaf_spki.raw
Binary files differ
diff --git a/net/data/ssl/certificates/crlset_by_root_serial.raw b/net/data/ssl/certificates/crlset_by_root_serial.raw
index 7478b636..31f6b462 100644
--- a/net/data/ssl/certificates/crlset_by_root_serial.raw
+++ b/net/data/ssl/certificates/crlset_by_root_serial.raw
Binary files differ
diff --git a/net/data/ssl/certificates/expired_cert.pem b/net/data/ssl/certificates/expired_cert.pem
index 9f64afa..c68dbc7c 100644
--- a/net/data/ssl/certificates/expired_cert.pem
+++ b/net/data/ssl/certificates/expired_cert.pem
@@ -1,37 +1,37 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC5dX3Q/ESHxMTt
-IN+IZ4u5ff7fqH6N6zSBxNjWaLPZp81HGjSQHIkDO1WKOitR2to7uC50i7qeavIW
-gpQdWyP4dmjuoSvCXtsHGRfq8Csu7SIwmqgTUh10TiU5BIThhm+EvtqlFZOvjWls
-bzRnqH6DksXEYZxxiLs7geLd2GXm6QkPJ6dyi9RjxXU8v1aK5/oOttOVPvHRNoqA
-Ew78BukQTnK5bDGfloq+/tzsKtYnHwoZyQPfxRXmYvnhrpB2X2AINo68VxflajDB
-kDGgZ7oMrEcWr201II93IHr27chdkHlY7A9yCYYWhwoUvlvFYQAqxZ112EBthRhe
-ZkrTiYgrAgMBAAECggEBALeWo1H6KCzukLLc0+tH9X1OSLxHI+CBcZz0rGKzizZv
-cjpsqpPua4OTfP40zyVcrKRpkzM0Dy07WSMHaHAXBOi07vMrARKMq+2+3Xpo/Zaa
-kDnlH3Tg2N+FbDuhSZmnZ0XVWMQLNAOYzT/WZd4nYfYFmVjp9+A8Jnyl+1r5GQcX
-Acbs2eQ54AWmrxpG7oXS/Ybn5DNWfxj0H4JTr9mtqatgl0kqCVaav0MCva6oe0xV
-U54cDwCrlTgM5YIuMynF/q17dS6YpmICWJEzG18M5+k1XsWzvlLQza5l39i+Z8SH
-/mkWOIlXxjTnlG82ni2ivGB7ts6cK9v8mCx9okBqKwECgYEA2fo+FUAgKbsRJ3jD
-1P/Fc53GsxD5dbqCon5gDqxQy6RrJmWbyHFRvnPBWFYOVTvG85hHtrwtxcfPJ6f3
-ZZlVKSdg4P0RN8iNiI+yfZdueW0DPbt5bwUZ2q7wY34h4W28bJoDyhxyqC3CZabg
-nbhnyKz7yvq4UhYg0EgxgAYOAEsCgYEA2c8jDZNuAG5PC/Vcx4bN2MdRaDXgrcNR
-tmNTf+tV0c/q7VUmiLbtCCfQLgF/MWWCa7Gx3TpXYWeBugQ5javOH4EYt+tx7LKm
-GPUJM5u3S53jL0nu7vY2h5RzJhvqMIKSnRn+ePMYoObNyq2vOLj7xAzy0OCqvb3w
-NKsOvfZUa6ECgYEAruwSRhtftB1adsKC5LscSNukSK6mgcNacevYSe4eKE2Zbwa7
-LO9DGgLqdWkZt2xxC6p4YjxAvybJJpmz/uQ9Yvkm1WZAGvPmIGCwa/jJvsesgi2g
-FWeSh9s7LZxas/zL6Jrvz5FksXGHPuvb9LW3E2M97HWm1LjNPFey4Xn6YmECgYAk
-OcNGusKM58vV3VU1CkKqT1xGzM81l0q73wFAQU/guYgFOShTjLkXpieFv1H8UTnD
-16YReWaXGLQG0DUSTwTVUI9f55TnHT9q3zZMkxWFShlDADTxIZooKpSMPhBRSSZB
-YtVkIGp0OG75yrFd6cZV8SFhhDxhmnmdCOZGyfV4gQKBgFVaCbgC+TmsxOZJ9idK
-k5QMolUGcjB8H5Mtb6wmU8XnT7AAv1VtBIWVu9SU0AeiQDHPNGux5z8fr1QLAxIB
-NrevWo6XsKlSUHruFakIny0XadpKs0eFmyUh0v4H6bcOPifRubSx78seg3fx3Sji
-8TvKB3jMM3QnimiLlaOzI4uR
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDOyfwsFGz4KjJt
+FmfGaisMwi3KJcI5RWUWvll6c94BNuVv643WZGaq/Yfx8bPCvKr9T5Q/1QnkXwRW
+v8eRnocK5obwTQz8l1Md8PXsl81sT982C5Lk+HDBbXNrOlS56Q1W7ggNnC7Yxe09
+KHoFI/BibDgHM/qeneNFmzfUEPVm1XbUgsQmodoV3e6Ncv4UlwjJ1n+3Zy+y09OQ
+MGEjsnpSWnzQkwnYJTpPi8QslnkX4AoUf4Qt+cI5QU90A9ODDTTqRdifLFOH8XD5
+OXPcqGwwdAx22SpUkpp4WHyLbbjthWOBarE4pvVlM6IG8bnOaW23EXgGiJOx0j+F
+PZv8UQ25AgMBAAECggEAWZd1Y/utgo91rYGpkHNrF2oBwLU/QuTn+USbK8yLgOcx
+3J2npB13xdl2TsKzaUmoo3sY9dbtJD5ueM86PcL7KyPZjr8zQzSk1DITul/Cpoys
+XpQBHqbs40DyYqCxGKL6HpGed5cVTOHj+T1SMGvzuBC+7Y/9oz8wunWXaI+4YsaN
+KTcahUeyw3B3nGu59iy8FtIgZE+XpXw6HmIM6fFq2qL9F1yCyOev5qpMQD+WbBVp
+p6GDmt02mgatrIx4hDd//OfGAeLdnlpOHbs2Dzs2BL2j+V0UbatpzCX+9U3zb526
+EYm1n6AOkHIrFRGSiGs/6XcB+rKG1wFqNL2WGFfkCQKBgQD8o7krKl6bzTR0gssg
+BDggFSab5f12o+lm5BB5f8ZcTASSV9+LvlFuTOqg00JWrj3W4ykapGiqy5DUb/TC
+9SUnHMWN+gWAP1byoqrvlsPGRvaOkZZZ8BMFlgaTVdmSYm2jEL41DhiOco7uxeID
+hbGl969Az1DYqk6l0B8eXhvmhwKBgQDRiiIw611fCaWuN9mPZC1WMzKOhddSVqFK
+VX9avQ5RF0BDDze4QmCC3pBOVQ54iUyawk3anMysirD4WFbJSSZ/LyV+ChGbLNW+
+C3WnCOEoGnfXYRO8Anpba4uRODQD8aFSDhOwiX9cnGhn0LK+JWUsO73ubFp232id
+GJp4lnQ5vwKBgQCPMNitr4kJ82fMtakdT2bkQDiu2c8sJEEQ0SjJRHOQMoHQ1D9e
+vBL5Wl0NpE+QQ5fHKN9OO2sbit9emMn4ietx3KvYCaJ+iufkA/CwdRonUmdCbR/z
+f8+4Nc0qStlTT7hmWQIFniSq8CE1EjFE38zNjbHmINrowrZq4qgQlTRpFwKBgH0o
+Pd3sZ7wBfiW+lEOSuYW4VOVOSluTBQnqYYRoUinbcnXbnBOCCjWBDL7NDTSwBcKW
+dnwylgolWSktUsEt4UGsfn93Mib2s8CtBZw8sIgMrzJFeM0eycjbRuT5phAI/quN
+XvNeXWWKws3nmSv8GB9Am+TScYJ5VPoonPOUIl3vAoGBAIopah8JtNrmpWchIO5+
+z7JeELzUWelGbKOoclWOVnaC80RWYaUe9Zf+6FDifSpbEo6Muf2dGm8+uC+DmQX0
+sXscgfZafFYDLIFHjvFrL3kQH06jKhcbD6s48YHlBCHVZx5SJLGbbiVOnYtPubIS
+uCQfr9VlJkIUbJCn5ekytz9K
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 1 (0x1)
+        Serial Number: 2 (0x2)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Jan  1 00:00:00 2006 GMT
             Not After : Jan  1 00:00:00 2007 GMT
@@ -40,71 +40,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b9:75:7d:d0:fc:44:87:c4:c4:ed:20:df:88:67:
-                    8b:b9:7d:fe:df:a8:7e:8d:eb:34:81:c4:d8:d6:68:
-                    b3:d9:a7:cd:47:1a:34:90:1c:89:03:3b:55:8a:3a:
-                    2b:51:da:da:3b:b8:2e:74:8b:ba:9e:6a:f2:16:82:
-                    94:1d:5b:23:f8:76:68:ee:a1:2b:c2:5e:db:07:19:
-                    17:ea:f0:2b:2e:ed:22:30:9a:a8:13:52:1d:74:4e:
-                    25:39:04:84:e1:86:6f:84:be:da:a5:15:93:af:8d:
-                    69:6c:6f:34:67:a8:7e:83:92:c5:c4:61:9c:71:88:
-                    bb:3b:81:e2:dd:d8:65:e6:e9:09:0f:27:a7:72:8b:
-                    d4:63:c5:75:3c:bf:56:8a:e7:fa:0e:b6:d3:95:3e:
-                    f1:d1:36:8a:80:13:0e:fc:06:e9:10:4e:72:b9:6c:
-                    31:9f:96:8a:be:fe:dc:ec:2a:d6:27:1f:0a:19:c9:
-                    03:df:c5:15:e6:62:f9:e1:ae:90:76:5f:60:08:36:
-                    8e:bc:57:17:e5:6a:30:c1:90:31:a0:67:ba:0c:ac:
-                    47:16:af:6d:35:20:8f:77:20:7a:f6:ed:c8:5d:90:
-                    79:58:ec:0f:72:09:86:16:87:0a:14:be:5b:c5:61:
-                    00:2a:c5:9d:75:d8:40:6d:85:18:5e:66:4a:d3:89:
-                    88:2b
+                    00:ce:c9:fc:2c:14:6c:f8:2a:32:6d:16:67:c6:6a:
+                    2b:0c:c2:2d:ca:25:c2:39:45:65:16:be:59:7a:73:
+                    de:01:36:e5:6f:eb:8d:d6:64:66:aa:fd:87:f1:f1:
+                    b3:c2:bc:aa:fd:4f:94:3f:d5:09:e4:5f:04:56:bf:
+                    c7:91:9e:87:0a:e6:86:f0:4d:0c:fc:97:53:1d:f0:
+                    f5:ec:97:cd:6c:4f:df:36:0b:92:e4:f8:70:c1:6d:
+                    73:6b:3a:54:b9:e9:0d:56:ee:08:0d:9c:2e:d8:c5:
+                    ed:3d:28:7a:05:23:f0:62:6c:38:07:33:fa:9e:9d:
+                    e3:45:9b:37:d4:10:f5:66:d5:76:d4:82:c4:26:a1:
+                    da:15:dd:ee:8d:72:fe:14:97:08:c9:d6:7f:b7:67:
+                    2f:b2:d3:d3:90:30:61:23:b2:7a:52:5a:7c:d0:93:
+                    09:d8:25:3a:4f:8b:c4:2c:96:79:17:e0:0a:14:7f:
+                    84:2d:f9:c2:39:41:4f:74:03:d3:83:0d:34:ea:45:
+                    d8:9f:2c:53:87:f1:70:f9:39:73:dc:a8:6c:30:74:
+                    0c:76:d9:2a:54:92:9a:78:58:7c:8b:6d:b8:ed:85:
+                    63:81:6a:b1:38:a6:f5:65:33:a2:06:f1:b9:ce:69:
+                    6d:b7:11:78:06:88:93:b1:d2:3f:85:3d:9b:fc:51:
+                    0d:b9
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                F6:5D:86:15:33:43:5B:6B:25:21:92:16:41:CC:8A:7F:D1:C7:9D:9F
+                AC:97:8A:09:35:95:6A:EB:AD:D3:05:F5:A8:58:AB:E6:58:95:3A:BD
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         8f:22:f8:a0:2d:23:83:e7:62:1f:1f:cb:e3:c8:96:6f:6a:b8:
-         94:29:7d:d5:46:f1:78:02:e2:b6:4e:b0:57:a6:c1:e2:6c:ec:
-         f6:25:5b:7e:85:d8:32:1a:6c:a9:38:39:6f:f1:95:cb:56:94:
-         ab:d8:74:aa:67:cc:7f:8f:25:7c:e6:ff:d9:a0:f1:5e:44:1c:
-         d7:43:50:57:b9:88:02:0e:f5:38:23:44:c3:1c:5a:05:ef:2c:
-         9f:09:8a:dc:8a:fe:60:85:a7:ba:6e:0a:c6:bb:ad:c0:18:01:
-         4d:e8:85:13:50:5b:c4:0e:47:f5:9c:e4:85:cf:7c:d8:c2:9b:
-         34:c1:1b:ce:4b:25:52:1b:07:89:9f:0d:d9:f2:b2:6a:e2:40:
-         ce:18:6d:3e:57:ed:eb:ec:66:5c:52:49:a3:d3:cb:90:81:ee:
-         0b:6e:6f:23:54:d7:78:5b:31:5f:76:28:06:04:db:24:a0:17:
-         f2:f5:33:cd:c6:b1:e0:39:f9:14:36:8b:f4:a0:be:6a:a1:c8:
-         09:45:8c:4c:4e:45:05:50:d4:da:53:63:34:2f:c8:7d:e5:39:
-         e9:9f:e7:96:28:f1:d0:49:bc:94:25:14:4f:7b:1f:44:f2:6d:
-         76:0d:d0:7e:de:8b:b8:b5:7f:6b:a4:7e:d5:7f:e4:32:55:dd:
-         fb:ef:65:d2
+         97:9c:42:d2:b4:6f:c2:fd:d1:85:72:6f:92:9e:de:07:71:e8:
+         cc:6d:97:93:82:2c:0d:62:c0:4a:cd:bc:7a:55:82:08:5a:1f:
+         f9:aa:4a:16:35:de:19:86:25:12:93:0f:65:56:d7:bc:d3:6b:
+         f7:39:de:9e:fa:43:b1:39:b5:5b:d3:32:33:d9:6f:86:0c:f6:
+         12:cc:0b:a7:27:54:36:55:ce:26:6c:e3:64:a2:b2:c6:a6:3e:
+         94:16:ec:4e:c0:f3:cc:6f:54:ff:26:bf:ac:ae:0f:c3:69:a3:
+         80:35:44:e3:28:9e:1b:7e:98:2c:a3:cc:ef:25:0e:25:3f:36:
+         c1:92:38:25:21:bf:d4:e5:0a:51:16:85:d6:36:ef:88:1a:56:
+         2b:71:7c:88:50:c8:99:08:e2:a4:f0:50:12:c7:5f:6b:e8:01:
+         e8:26:06:a3:24:d0:3c:67:9e:88:96:fa:b2:26:47:08:93:94:
+         74:f9:97:0f:c2:28:85:97:e1:dc:f3:1b:66:f1:71:d7:65:4e:
+         34:d1:fa:56:84:be:a3:a9:8e:11:a1:03:fe:14:b8:a6:7f:ee:
+         53:ce:e9:72:57:d8:3d:2d:54:0c:5a:80:1d:6a:4a:16:ab:fe:
+         2b:07:05:cf:c5:a9:10:38:83:32:b5:bb:7c:81:39:a4:16:1a:
+         0e:c5:1d:92
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMDYwMTAxMDAwMDAwWhcNMDcwMTAxMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuXV90PxEh8TE7SDfiGeLuX3+36h+
-jes0gcTY1miz2afNRxo0kByJAztVijorUdraO7gudIu6nmryFoKUHVsj+HZo7qEr
-wl7bBxkX6vArLu0iMJqoE1IddE4lOQSE4YZvhL7apRWTr41pbG80Z6h+g5LFxGGc
-cYi7O4Hi3dhl5ukJDyencovUY8V1PL9Wiuf6DrbTlT7x0TaKgBMO/AbpEE5yuWwx
-n5aKvv7c7CrWJx8KGckD38UV5mL54a6Qdl9gCDaOvFcX5WowwZAxoGe6DKxHFq9t
-NSCPdyB69u3IXZB5WOwPcgmGFocKFL5bxWEAKsWdddhAbYUYXmZK04mIKwIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU9l2GFTNDW2slIZIWQcyKf9HH
-nZ8wHwYDVR0jBBgwFoAUvPcw0TzA8nn675/JbFyT84poq4MwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAI8i+KAtI4PnYh8fy+PIlm9quJQpfdVG8XgC4rZOsFemweJs7PYlW36F
-2DIabKk4OW/xlctWlKvYdKpnzH+PJXzm/9mg8V5EHNdDUFe5iAIO9TgjRMMcWgXv
-LJ8JityK/mCFp7puCsa7rcAYAU3ohRNQW8QOR/Wc5IXPfNjCmzTBG85LJVIbB4mf
-DdnysmriQM4YbT5X7evsZlxSSaPTy5CB7gtubyNU13hbMV92KAYE2ySgF/L1M83G
-seA5+RQ2i/SgvmqhyAlFjExORQVQ1NpTYzQvyH3lOemf55Yo8dBJvJQlFE97H0Ty
-bXYN0H7ei7i1f2ukftV/5DJV3fvvZdI=
+MIIDvzCCAqegAwIBAgIBAjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTA2MDEwMTAw
+MDAwMFoXDTA3MDEwMTAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAM7J/CwUbPgqMm0WZ8ZqKwzCLcolwjlFZRa+WXpz3gE25W/rjdZkZqr9
+h/Hxs8K8qv1PlD/VCeRfBFa/x5GehwrmhvBNDPyXUx3w9eyXzWxP3zYLkuT4cMFt
+c2s6VLnpDVbuCA2cLtjF7T0oegUj8GJsOAcz+p6d40WbN9QQ9WbVdtSCxCah2hXd
+7o1y/hSXCMnWf7dnL7LT05AwYSOyelJafNCTCdglOk+LxCyWeRfgChR/hC35wjlB
+T3QD04MNNOpF2J8sU4fxcPk5c9yobDB0DHbZKlSSmnhYfIttuO2FY4FqsTim9WUz
+ogbxuc5pbbcReAaIk7HSP4U9m/xRDbkCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFKyXigk1lWrrrdMF9ahYq+ZYlTq9MB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCXnELStG/C/dGFcm+S
+nt4HcejMbZeTgiwNYsBKzbx6VYIIWh/5qkoWNd4ZhiUSkw9lVte802v3Od6e+kOx
+ObVb0zIz2W+GDPYSzAunJ1Q2Vc4mbONkorLGpj6UFuxOwPPMb1T/Jr+srg/DaaOA
+NUTjKJ4bfpgso8zvJQ4lPzbBkjglIb/U5QpRFoXWNu+IGlYrcXyIUMiZCOKk8FAS
+x19r6AHoJgajJNA8Z56IlvqyJkcIk5R0+ZcPwiiFl+Hc8xtm8XHXZU400fpWhL6j
+qY4RoQP+FLimf+5TzulyV9g9LVQMWoAdakoWq/4rBwXPxakQOIMytbt8gTmkFhoO
+xR2S
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/intermediate_ca_cert.pem b/net/data/ssl/certificates/intermediate_ca_cert.pem
index 952a230..db82c408 100644
--- a/net/data/ssl/certificates/intermediate_ca_cert.pem
+++ b/net/data/ssl/certificates/intermediate_ca_cert.pem
@@ -1,104 +1,105 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCnUEvP8sppMxqR
-73F9aDqvHusU7mSoK0HG7CtS6WasXU/9LrAxOWwugR6DXVmV0iqZ+/E4Lvk2UlN8
-6rrf+9aY9Mk50TRGZ4NBibzLlPkmPbC2aPeTa9RAJ1JhDyAekVg9YN1KHP5UPwxK
-xFjXEf+oPPHNOfZIm6Ug28yQK/sfYutGTdPvA/j24IIFrypPAO3aYwRwQeYKk+lN
-hdT3K4bzNeFptYH82k/LQpTJ13a6m1ef++/tJu8tU3MvkjFLOHuGZusNLvKTj8W7
-/swTUOkYHRhkmZHa3pYrCHIhI0JnmYaY/m/1jg5hsQp+9bjVpwagU+9/BNsRxAcK
-R5bwk4LVAgMBAAECggEAfI59cfjIkRqXXC9KaNbwYTB+R93Vl5BkboehFR9m7Uim
-ZNCeIHckP1amdZtINw334xy5jl8B7lvJhYRlzJt6PfJ135IL/aHQCDlXEKP9+2cP
-qCxqqxgqMfxUCqes/LStYTw8YZFGEUfCieK0VKA0mHWOeX7+Bz2/579aAbaMQ+c2
-rlLIK9PelGPgRMSNHdNzusBG4qr4OBYeeAJ16gHBg4xVZPdp9ApM0UKN410M+gjx
-509D/HiBhiswMOJBPpxypfbnjMaTUklt0KLGSCkwocrf9K+TnrwfQ1ZWfq2Hmlu3
-B99i6rtsOEMREq8kvV4yqTV0qBFXOmMZbmNFUiBwoQKBgQDal+ILQEywfpAEHAIw
-p/F8WipX1K6XhsSumBRXg12yzE/oik7TOr6a5xML38d3Iml4S5IAhwFSVWZe/spU
-fu2ZUhQOISWOZ+pIw/OJx1KIo1iiHDMOQZ7HC+QVk8zoXkZDRPdxP8UDEORGA7UV
-TqmsNBnSbddCfbX7GAPs28AJvQKBgQDD8fWFxLotZh7RyhAdPdfCJcGhW7bDCAYU
-Vg6T4ZXS6COFUIYlA794BwjtDisCNQUkLOcCI0J/diSXVJ8HbRCWTvMh6ZCM6No0
-gEgMABeUYaDvc2ca+bJ/9jN9YLXyZYfU3RAwX4V/rTcbwJTB/+tnHQLbcb7WyLEg
-gyoDTlHS+QKBgDtv6QreJPworcgwRXgtckA51CGltwOEpZ5Dw+Q32BZx75hvYxeU
-dZdxFYC5DGecd8k54y05iGZ2yisyZJmtGbYC12kwIiIip1W50lK4W/zDTapmuIs7
-1IyS8yXa1nCokbpg2ld024EF6swO3gI5LXGhiRPqwglWXVE1KnwRFJqRAoGAbiMB
-c1gZoc0Fw7vFBPqu3MTmKnFnsAZBjIq2lO62jR7IYHXbgNCzfZ7OqJhPGmV851GJ
-40y4YvagKKN64+ys5x+nT8d95YY4qEv2szAWEOQzVoRSTvpNF9nmJTIH8yCYkdBT
-+iym2BYfpKzBsK3Nvl6zLW+o6gdScEjpg4QxP9kCgYEAt0k4F/1bbnWOA9NFoIEA
-n8d9w4hyFpn4tYNcB/9PvXURDuPurOPEutydd/hFzgdewVu61dsb16rFNoAZOwPp
-+BacwdewsPjrpA5Rr2sH7KsDwjOi+2TUACmt8ZZnAxCr96EeQje/ggUW2ukL7wza
-bm82NyldWSM4JidPhoDyWjA=
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCd6b3kPUov+8L5
+5iIqQhVGHIyPR0zpxVeVH2ZwkyLwlMO7tVvvpG/Ix4mVdboMNr9Oa6k1RwhDnilq
+4sP7A7cftuFRa+17Gcf5zjvcZelmx4OUxNFO7u1kS4HxGupaZBgbak6T0BNskGDK
+0k63JBb4sghYnY2nM0UVNIGtLS2cYO/5K5j+edONLEjbEpH0Lvq/9SbBggWA3Uyo
+cL+nvBA0dznbRwQP7USyZUYiIIhZKA/HDKK0kaWiqsoFn4qbbqPL1KToJHWdIIEi
+W193PsnxHq7rijOMJ1sevm0hG0JyleOeEwN1p1jUvmgS/mOOSxF6NOeja91zrj4Z
+muyRi3OvAgMBAAECggEBAJwu2gyK/fw1YqNtlS78izP7+p2fZJf2AejQ1K3VKQKP
+8IOQHW0I0zLe/9oeRTPdVhtG6mVyat8N6GL6A+IZy54HcBTqzUgquJn++z/CYDWy
+cRbMD0SllY/UCqIf/9gFFb7PxwX1D7EZn1Ia7ZW/kSTKWOzkb30GfXY6p2NTwr/d
+psacQ5v6+o8z3RD2N44gPvrGA2d1P83YT0oIYwKAHtpu6c46CBQmf54lhjs1LdxE
+UgF8w+Y8T8DZQ5WekchIWBcGZLiqBkm49+uBoGtlfrcszZkC3pnX++HoZAYE9ms4
+OCdWhEBHUyhd/os7GjaX+CGUM4nNx0LmoqeJBhBt0qkCgYEAzcsWqVYruimpnES+
+lzFIiFZXI6rYd7hkJ+semFst4UFQM51TE0gXkrzZdIu/rgmRlb05to739V1i2z0B
+TxGka+WzL6j4ZtJjy2WBl35GceoeL5Iwbjs8OiJFr8TAkq9v3TT2iymuUDGSHCCz
+1T9GfS4/zoLNGiqKOxp7O6ZwaC0CgYEAxHBFRtQ1eeKYL5FZwWv2JklivutDWURK
+0dzbzsvKaUf40ZdZe+A6cFomckm7xubHwMckY+8Y011pgF581JWWIaRs8u8jJuWA
+ajjfmFSC0L5uuk6qYHa9eWQu8LvUGmKX9SMs7Mt2h7BS+l+ZDbgr6LngoK1CWGEK
+DLo0/fp7OMsCgYAi++RVUx3J3u1DcHhJ8YnYC31yxcdYytLT6mdgFRf+lADTVWpa
++8VuH4aEBoHGT0AdiXZ3L2S9pGt6w6smSuR9pyXH81yO9jMaz52xKDlHgjoxchOj
+mZRKeasJD1SBWyuUGj3TOHm2jka9W13W4ZPVEfis3ZWKXjLzizPp1wiC3QKBgEMX
+ESIKsiTptg5w9xWveMdEwxvvn/Xp9B/O7aeoRH5GnX1/0okTYQIkWAMqmZ5qDYkS
+uqQC8himS7UTEFFOsZLV5HvoHrpXIc+lkwAkxPTkRU8ONPRzOW0vQTTpAZztVXbc
+x6gsKVRYbU6jvdNItn5qlYRrCEDFC7ijFBw2I0WXAoGARVYDlmIrSvnwqZ07YzPa
+QeLueBBfnHqN+7XAGTctn0MOhE96OgURw0lWVnyoGtTmUAHtdho5EeDDUxQm/n1x
+whGM72yqlFlslpnodQUqAYz1Eqe+RgP9V8KXdUVz652jqZwhuqLBjtAc9e9knwR8
+MTmwsskxSp9DWTu+tCjNrwM=
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
         Serial Number: 1 (0x1)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Dec  9 22:40:07 2016 GMT
-            Not After : Dec  7 22:40:07 2026 GMT
+            Not Before: Jun  5 17:10:45 2017 GMT
+            Not After : Jun  3 17:10:45 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Intermediate CA
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:a7:50:4b:cf:f2:ca:69:33:1a:91:ef:71:7d:68:
-                    3a:af:1e:eb:14:ee:64:a8:2b:41:c6:ec:2b:52:e9:
-                    66:ac:5d:4f:fd:2e:b0:31:39:6c:2e:81:1e:83:5d:
-                    59:95:d2:2a:99:fb:f1:38:2e:f9:36:52:53:7c:ea:
-                    ba:df:fb:d6:98:f4:c9:39:d1:34:46:67:83:41:89:
-                    bc:cb:94:f9:26:3d:b0:b6:68:f7:93:6b:d4:40:27:
-                    52:61:0f:20:1e:91:58:3d:60:dd:4a:1c:fe:54:3f:
-                    0c:4a:c4:58:d7:11:ff:a8:3c:f1:cd:39:f6:48:9b:
-                    a5:20:db:cc:90:2b:fb:1f:62:eb:46:4d:d3:ef:03:
-                    f8:f6:e0:82:05:af:2a:4f:00:ed:da:63:04:70:41:
-                    e6:0a:93:e9:4d:85:d4:f7:2b:86:f3:35:e1:69:b5:
-                    81:fc:da:4f:cb:42:94:c9:d7:76:ba:9b:57:9f:fb:
-                    ef:ed:26:ef:2d:53:73:2f:92:31:4b:38:7b:86:66:
-                    eb:0d:2e:f2:93:8f:c5:bb:fe:cc:13:50:e9:18:1d:
-                    18:64:99:91:da:de:96:2b:08:72:21:23:42:67:99:
-                    86:98:fe:6f:f5:8e:0e:61:b1:0a:7e:f5:b8:d5:a7:
-                    06:a0:53:ef:7f:04:db:11:c4:07:0a:47:96:f0:93:
-                    82:d5
+                    00:9d:e9:bd:e4:3d:4a:2f:fb:c2:f9:e6:22:2a:42:
+                    15:46:1c:8c:8f:47:4c:e9:c5:57:95:1f:66:70:93:
+                    22:f0:94:c3:bb:b5:5b:ef:a4:6f:c8:c7:89:95:75:
+                    ba:0c:36:bf:4e:6b:a9:35:47:08:43:9e:29:6a:e2:
+                    c3:fb:03:b7:1f:b6:e1:51:6b:ed:7b:19:c7:f9:ce:
+                    3b:dc:65:e9:66:c7:83:94:c4:d1:4e:ee:ed:64:4b:
+                    81:f1:1a:ea:5a:64:18:1b:6a:4e:93:d0:13:6c:90:
+                    60:ca:d2:4e:b7:24:16:f8:b2:08:58:9d:8d:a7:33:
+                    45:15:34:81:ad:2d:2d:9c:60:ef:f9:2b:98:fe:79:
+                    d3:8d:2c:48:db:12:91:f4:2e:fa:bf:f5:26:c1:82:
+                    05:80:dd:4c:a8:70:bf:a7:bc:10:34:77:39:db:47:
+                    04:0f:ed:44:b2:65:46:22:20:88:59:28:0f:c7:0c:
+                    a2:b4:91:a5:a2:aa:ca:05:9f:8a:9b:6e:a3:cb:d4:
+                    a4:e8:24:75:9d:20:81:22:5b:5f:77:3e:c9:f1:1e:
+                    ae:eb:8a:33:8c:27:5b:1e:be:6d:21:1b:42:72:95:
+                    e3:9e:13:03:75:a7:58:d4:be:68:12:fe:63:8e:4b:
+                    11:7a:34:e7:a3:6b:dd:73:ae:3e:19:9a:ec:91:8b:
+                    73:af
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                F9:98:21:49:71:FA:8D:B9:20:F7:FE:5D:4D:41:E8:8B:6C:E0:62:C3
+                17:5C:45:F3:D0:AC:1C:10:4C:8B:43:44:20:C4:DD:93:C5:C5:19:3B
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         50:c7:37:47:87:1a:8a:b2:cc:37:d0:f6:4a:46:ee:b5:85:90:
-         35:a5:a0:c8:c7:c7:38:7d:5d:bb:e0:fc:0f:15:d3:75:50:e5:
-         06:08:b5:ec:d7:e8:65:63:03:5a:38:3e:2c:5a:eb:28:a0:3c:
-         70:3f:d4:30:25:20:dd:22:63:08:f0:9b:a9:c8:34:8f:f6:7c:
-         5a:ce:10:72:5c:37:a0:01:a6:5e:1b:a4:60:e7:93:f6:42:61:
-         2c:d1:57:67:16:d9:19:21:52:03:8c:9a:aa:75:10:ca:a1:bc:
-         53:07:f1:6f:52:54:88:50:7d:11:ef:96:82:0d:e9:7d:c1:42:
-         42:42:13:1f:48:ef:49:70:df:e1:30:f9:6f:2f:3d:cd:51:1c:
-         14:9c:bd:12:0c:f2:d7:16:32:4a:d5:6b:4b:21:01:6c:4a:b1:
-         ee:7b:8c:d0:99:7e:5e:1e:ef:10:24:6e:e3:6f:e2:e0:4b:0b:
-         42:79:78:ab:2b:af:54:82:c4:b1:57:a3:f0:6f:16:42:ed:61:
-         fc:69:5e:2b:09:14:4a:61:cc:6a:19:52:66:89:06:48:f1:b5:
-         76:39:68:21:dc:68:9d:11:07:37:80:ae:37:77:b4:69:69:29:
-         ff:f6:fc:f1:50:bc:ee:9a:f9:ab:c8:bf:a6:65:51:cc:89:1e:
-         2f:2c:95:e9
+         3e:f5:d7:fd:82:3b:1e:34:8c:66:a2:f3:5e:18:e1:f1:a9:75:
+         9f:b5:93:e7:0a:8e:cf:0a:33:ed:49:cd:ce:ce:ca:5f:a3:1d:
+         64:76:d3:84:16:fe:9d:88:ac:f4:d1:f8:36:2b:20:80:52:0a:
+         ef:e0:0f:64:27:55:35:a3:7b:c6:8a:7c:a5:c4:29:17:b1:fa:
+         d2:89:5d:13:6b:b8:03:cb:d7:12:d6:ce:24:f0:af:48:17:03:
+         54:99:af:e9:cb:fd:44:44:18:23:61:90:f6:bd:55:65:06:c3:
+         36:98:8d:ea:7d:0f:79:ef:b6:bb:22:28:03:a6:ec:d9:d4:1b:
+         47:ac:2c:25:de:ef:1a:02:69:4c:18:bb:29:48:f4:9d:e1:52:
+         42:64:6c:88:46:68:86:83:fd:24:f5:7d:05:d7:1a:7e:22:bc:
+         49:75:9c:8a:4d:e8:f3:a2:eb:9b:83:70:a7:d6:dd:2f:05:2d:
+         aa:be:d7:ee:7b:8e:75:44:3b:da:df:85:61:bf:e9:3b:13:40:
+         4e:8b:52:08:d9:e4:8c:54:da:41:db:7b:2c:05:5e:99:06:0d:
+         02:8c:8e:19:8e:55:b0:3a:33:18:30:03:a7:ed:4a:e4:f8:58:
+         cc:12:b8:af:d6:66:55:29:ec:01:1f:92:ed:3d:4d:c3:71:3b:
+         e0:2f:70:90
 -----BEGIN CERTIFICATE-----
-MIIDPzCCAiegAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTYxMjA5MjI0MDA3WhcNMjYxMjA3MjI0MDA3WjBrMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTEdMBsGA1UEAwwUVGVzdCBJbnRlcm1lZGlh
-dGUgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnUEvP8sppMxqR
-73F9aDqvHusU7mSoK0HG7CtS6WasXU/9LrAxOWwugR6DXVmV0iqZ+/E4Lvk2UlN8
-6rrf+9aY9Mk50TRGZ4NBibzLlPkmPbC2aPeTa9RAJ1JhDyAekVg9YN1KHP5UPwxK
-xFjXEf+oPPHNOfZIm6Ug28yQK/sfYutGTdPvA/j24IIFrypPAO3aYwRwQeYKk+lN
-hdT3K4bzNeFptYH82k/LQpTJ13a6m1ef++/tJu8tU3MvkjFLOHuGZusNLvKTj8W7
-/swTUOkYHRhkmZHa3pYrCHIhI0JnmYaY/m/1jg5hsQp+9bjVpwagU+9/BNsRxAcK
-R5bwk4LVAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPmYIUlx
-+o25IPf+XU1B6Its4GLDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC
-AQEAUMc3R4cairLMN9D2SkbutYWQNaWgyMfHOH1du+D8DxXTdVDlBgi17NfoZWMD
-Wjg+LFrrKKA8cD/UMCUg3SJjCPCbqcg0j/Z8Ws4Qclw3oAGmXhukYOeT9kJhLNFX
-ZxbZGSFSA4yaqnUQyqG8Uwfxb1JUiFB9Ee+Wgg3pfcFCQkITH0jvSXDf4TD5by89
-zVEcFJy9Egzy1xYyStVrSyEBbEqx7nuM0Jl+Xh7vECRu42/i4EsLQnl4qyuvVILE
-sVej8G8WQu1h/GleKwkUSmHMahlSZokGSPG1djloIdxonREHN4CuN3e0aWkp//b8
-8VC87pr5q8i/pmVRzIkeLyyV6Q==
+MIIDizCCAnOgAwIBAgIBATANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3
+MTA0NVoXDTI3MDYwMzE3MTA0NVowazELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExHTAbBgNVBAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAnem95D1KL/vC+eYiKkIVRhyMj0dM6cVXlR9mcJMi
+8JTDu7Vb76RvyMeJlXW6DDa/TmupNUcIQ54pauLD+wO3H7bhUWvtexnH+c473GXp
+ZseDlMTRTu7tZEuB8RrqWmQYG2pOk9ATbJBgytJOtyQW+LIIWJ2NpzNFFTSBrS0t
+nGDv+SuY/nnTjSxI2xKR9C76v/UmwYIFgN1MqHC/p7wQNHc520cED+1EsmVGIiCI
+WSgPxwyitJGloqrKBZ+Km26jy9Sk6CR1nSCBIltfdz7J8R6u64ozjCdbHr5tIRtC
+cpXjnhMDdadY1L5oEv5jjksRejTno2vdc64+GZrskYtzrwIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQXXEXz0KwcEEyLQ0QgxN2TxcUZOzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAD711/2COx40jGai814Y4fGp
+dZ+1k+cKjs8KM+1Jzc7Oyl+jHWR204QW/p2IrPTR+DYrIIBSCu/gD2QnVTWje8aK
+fKXEKRex+tKJXRNruAPL1xLWziTwr0gXA1SZr+nL/UREGCNhkPa9VWUGwzaYjep9
+D3nvtrsiKAOm7NnUG0esLCXe7xoCaUwYuylI9J3hUkJkbIhGaIaD/ST1fQXXGn4i
+vEl1nIpN6POi65uDcKfW3S8FLaq+1+57jnVEO9rfhWG/6TsTQE6LUgjZ5IxU2kHb
+eywFXpkGDQKMjhmOVbA6MxgwA6ftSuT4WMwSuK/WZlUp7AEfku09TcNxO+AvcJA=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/large_key.pem b/net/data/ssl/certificates/large_key.pem
index fe8a1d6..94cb0c4 100644
--- a/net/data/ssl/certificates/large_key.pem
+++ b/net/data/ssl/certificates/large_key.pem
@@ -1,194 +1,194 @@
 Certificate:
     Data:
         Version: 1 (0x0)
-        Serial Number: 10746871423479549511 (0x95248e9ecb4b8e47)
+        Serial Number: 11333387438568092375 (0x9d4847d419b9b2d7)
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Validity
-            Not Before: Dec  2 20:57:39 2015 GMT
-            Not After : Nov 29 20:57:39 2025 GMT
+            Not Before: Jun  5 17:10:51 2017 GMT
+            Not After : Jun  3 17:10:51 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (8200 bit)
                 Modulus:
-                    00:df:c1:08:64:7a:31:df:14:95:3f:cd:6d:83:9c:
-                    3f:9d:f6:31:ce:29:40:76:5b:4f:9c:f2:5f:a5:bf:
-                    d4:82:eb:67:1d:1a:18:c5:43:53:b6:9c:19:de:87:
-                    da:53:fe:11:e8:cd:49:b6:5c:98:68:dc:ae:b2:3e:
-                    86:03:8a:a5:eb:a5:95:1a:01:b6:b7:67:84:5a:07:
-                    cd:90:06:69:52:db:10:b8:73:f6:0f:e2:43:28:4b:
-                    5f:42:75:c9:78:65:bb:2d:4b:b9:e9:97:09:be:1f:
-                    49:5e:57:86:c7:3f:fb:eb:18:90:57:7e:86:c0:e1:
-                    77:ec:67:6e:27:eb:f7:80:7a:e6:b1:dd:78:c9:f2:
-                    ef:1b:10:3e:e2:6f:89:8b:56:8d:69:d7:f0:1b:1e:
-                    35:d6:41:c6:1a:80:1f:15:be:0e:ae:c9:87:df:e8:
-                    80:a2:85:20:de:32:3a:f8:cc:12:72:eb:41:1e:2b:
-                    2a:29:3f:f7:e1:eb:29:99:ad:b4:8d:79:0a:99:8e:
-                    0f:4a:1f:44:e9:74:b7:17:cb:97:21:7a:7d:d5:6c:
-                    a5:fd:d1:53:b5:21:8c:0a:53:4d:0a:e9:4d:40:52:
-                    0b:35:5f:40:09:09:1f:6d:b6:04:9c:75:f2:ee:32:
-                    89:d8:ff:a3:5b:37:93:69:f0:25:4c:ec:2a:a7:1e:
-                    e2:29:33:ef:07:f4:61:8c:91:a9:bb:f9:89:ba:b2:
-                    dd:98:08:91:bf:77:f6:bb:3b:f7:8a:f7:1c:d7:6b:
-                    17:d3:fa:62:12:2e:bb:d3:bf:78:a3:eb:1e:cb:00:
-                    70:6e:87:3f:9e:eb:fd:2d:32:77:f2:31:af:5c:dc:
-                    15:a7:2c:d9:ae:e7:fb:f8:01:4a:c9:45:f3:87:dc:
-                    c7:cc:14:fe:7f:7d:46:94:08:ac:25:6a:18:02:49:
-                    b5:aa:bd:4f:c5:1a:04:b8:ac:a1:6a:54:01:19:05:
-                    f4:55:e0:08:98:67:f5:ec:61:09:ec:fc:81:9b:88:
-                    77:53:7a:d1:48:4c:8f:e2:b7:0d:06:04:bc:05:6e:
-                    0f:0a:a1:56:07:b1:13:41:90:49:fd:12:70:f6:01:
-                    57:ad:d6:2d:a2:a1:04:cf:d1:29:38:f5:68:76:58:
-                    9b:5d:1e:0f:2c:77:f6:f0:cf:d8:df:c5:d2:23:8b:
-                    34:a9:ae:94:67:74:4b:21:99:7c:bb:de:be:f9:5c:
-                    b6:eb:14:2d:bb:38:56:fb:0c:7c:70:42:42:1b:1b:
-                    3c:98:6d:61:1f:16:32:ce:73:2a:23:9e:eb:e6:d1:
-                    89:0d:30:07:d2:94:09:8c:6d:38:49:e6:07:fd:bd:
-                    23:48:47:6c:ca:c0:da:50:e8:5f:06:08:72:e1:ca:
-                    fd:91:fc:29:fc:26:40:ff:1d:78:16:23:1f:c2:64:
-                    41:04:b6:3c:40:b7:08:27:a6:7d:26:4a:fd:57:af:
-                    ee:ba:e3:93:45:07:64:5c:5f:c0:a7:e8:a2:5b:a7:
-                    3d:da:d3:97:1f:7c:da:77:00:0d:30:3e:e3:ae:fd:
-                    4c:c7:18:e6:62:e0:9d:74:0f:90:00:aa:c2:32:de:
-                    dc:d1:8f:d7:c3:c2:08:bf:d1:bd:7e:21:09:79:32:
-                    8f:1a:12:43:97:91:41:33:bd:d4:2e:3b:a9:6d:06:
-                    23:d1:da:7e:5f:45:27:d5:17:9c:0e:df:2c:d1:66:
-                    cb:ed:ec:e3:c3:6b:ab:0d:ba:71:04:a4:92:a4:71:
-                    55:69:20:35:72:fd:ad:54:a8:cf:44:c3:9d:a1:5a:
-                    94:4d:05:62:5e:98:d6:25:c5:d6:cf:f5:ef:94:c0:
-                    2c:53:87:0b:9f:13:0f:63:c5:97:d5:5b:8a:46:7c:
-                    0e:28:de:66:96:74:df:2a:b2:b0:27:6d:4c:4f:54:
-                    72:d9:2d:ae:58:4f:d3:63:63:93:c2:34:57:66:3b:
-                    38:90:36:a9:a9:95:e6:7d:e8:84:87:68:73:9b:44:
-                    68:d9:69:1f:1c:1b:9d:58:44:77:72:e8:28:c1:1a:
-                    11:bd:5c:40:b7:d0:58:b9:58:91:9f:5b:30:94:33:
-                    fa:f6:be:2a:59:8b:43:cc:e3:04:45:1b:43:7e:d7:
-                    b5:f4:d3:dc:5d:65:ae:6b:d1:92:d2:f7:b6:8f:df:
-                    c6:5c:00:c3:0b:37:28:33:33:dd:05:cb:3c:62:0d:
-                    0b:54:42:ea:9f:6c:e9:f2:ef:c7:ab:7c:5c:cf:18:
-                    55:35:1c:f7:72:8f:c3:d5:1b:c0:09:6f:44:e8:06:
-                    62:44:c4:0b:10:e2:c3:b1:9c:de:73:37:5d:51:bc:
-                    b6:3f:38:1b:75:d9:26:df:4f:1a:eb:63:9c:e1:49:
-                    11:e4:cb:ec:e3:3a:b1:e2:00:8b:92:bb:73:fb:05:
-                    78:81:e7:ac:21:1b:23:c1:8f:8b:9c:52:bb:09:da:
-                    72:23:bf:81:e6:74:18:63:1f:84:9b:5d:06:92:72:
-                    aa:84:50:f4:8f:2a:94:05:8f:42:5f:de:45:05:b2:
-                    be:26:3d:dc:c4:ef:83:cb:aa:b4:67:2f:5c:e2:f9:
-                    b3:9c:1f:f9:92:8f:40:4f:99:df:9a:5e:fd:c5:db:
-                    92:dc:a8:41:13:64:f4:bb:0a:65:87:dc:cf:39:30:
-                    be:9e:3a:86:62:d6:2e:6f:17:8a:d9:77:3a:e2:8d:
-                    8f:08:eb:1e:fd:af:67:22:1d:ff:ff:b8:22:2b:93:
-                    51:1d:12:c7:6b:85:4d:b7:18:96:64:e2:25:06:ec:
-                    45:67:63:2b:b1:23
+                    00:ba:ab:d2:c8:6c:04:5e:23:61:04:38:ed:eb:c1:
+                    ab:c7:5d:fd:21:15:49:2b:91:45:47:4e:b0:83:56:
+                    ce:05:7f:3c:c3:6d:d5:02:2a:a3:f5:9b:0e:26:63:
+                    a2:22:73:4c:89:a5:49:37:f4:0e:be:62:0a:fc:a7:
+                    31:02:a7:74:d1:c1:64:d2:d6:db:21:90:c3:a3:c9:
+                    b6:1f:6a:f7:e9:24:8b:c5:a2:c2:cd:d4:91:16:1b:
+                    69:ba:c3:62:05:90:fc:2f:83:5c:6c:fe:63:c8:31:
+                    78:6e:27:f8:e2:25:a6:36:1d:83:4a:6d:f0:18:be:
+                    7c:56:12:24:d8:be:12:17:7a:f8:0e:58:5b:6d:e7:
+                    00:9e:2e:cc:08:94:3b:b2:71:df:df:c5:f7:b1:bb:
+                    45:41:40:82:c1:bd:90:63:f6:fa:98:ce:c9:83:95:
+                    17:30:5d:b6:4b:43:4d:ee:d9:e3:54:70:4c:87:92:
+                    71:39:3c:f6:53:43:96:a7:94:c7:a9:a8:62:ce:90:
+                    0e:d7:b3:e7:e4:0c:ef:2c:9a:48:30:d1:60:3f:b5:
+                    8f:6b:84:24:62:24:36:0d:3f:2e:82:15:3e:62:67:
+                    12:7f:d4:6e:2c:8b:a8:6d:70:da:55:5e:1f:0d:b9:
+                    cd:55:b1:d4:88:eb:c6:24:3d:68:6e:31:75:20:70:
+                    e2:2e:f9:cf:e8:38:93:47:f7:5a:91:50:9e:ed:c0:
+                    89:a6:2a:4b:04:83:e3:7f:e8:b3:89:c6:f9:3b:64:
+                    91:66:03:8f:3f:87:4a:0f:88:cb:1d:b4:57:cd:d1:
+                    35:6d:fd:33:a2:b3:f2:af:84:d6:76:81:98:c4:bb:
+                    b1:8d:2a:fe:33:80:9a:87:3e:04:6d:aa:c8:19:04:
+                    ea:82:86:5a:4c:d7:e6:a2:f6:cb:90:6f:d9:6b:44:
+                    c0:aa:1f:f4:d1:8e:89:dc:00:80:16:63:18:a4:97:
+                    1e:1d:dd:1a:b6:26:2d:02:a5:ad:77:cd:00:d7:2f:
+                    d2:5a:69:10:d6:7a:1d:d4:35:b4:22:67:fa:fa:d3:
+                    c1:60:ba:6e:24:88:86:84:19:d7:db:84:f9:46:47:
+                    f7:bd:e5:e4:80:09:5a:6c:b7:d9:b6:91:b9:78:5d:
+                    4a:d1:d8:a3:1a:5c:f7:22:d7:64:1d:71:cf:98:6b:
+                    02:20:b3:6d:a3:84:d5:52:31:e1:9c:a8:36:6c:b2:
+                    3b:12:f5:65:99:61:17:66:a8:fe:f7:7c:5a:db:35:
+                    16:66:94:2b:03:9e:c6:3b:c1:f7:f4:d8:0a:8e:af:
+                    64:0f:a4:d2:af:59:87:99:99:e7:4b:eb:6d:23:53:
+                    8b:be:a0:3c:91:85:e6:ae:5a:79:c8:5e:0a:21:1b:
+                    8e:a5:8b:24:fb:5d:f7:8d:78:68:f3:83:df:21:e3:
+                    4d:50:ab:78:f6:93:af:ae:1c:66:77:96:72:8d:6d:
+                    94:83:a4:f3:81:e4:a7:a2:b6:5d:5c:14:0f:bd:9b:
+                    26:1c:5a:4a:2f:6d:dd:b3:3b:e1:c6:79:63:04:1e:
+                    95:f0:41:29:1f:8d:97:7a:3c:f9:bd:11:ea:70:1b:
+                    3d:6e:e1:c2:1c:45:19:5f:20:e1:5d:50:21:b5:9a:
+                    f3:ab:2f:37:59:bc:7a:33:68:28:47:ad:27:f2:dd:
+                    e7:56:ae:53:84:06:0c:72:d2:25:76:b5:71:31:db:
+                    c5:25:d0:46:1a:61:84:8e:3f:e4:df:0e:76:56:fc:
+                    d1:64:08:80:b7:38:79:85:1a:ef:de:02:40:af:d8:
+                    2e:5b:3b:3d:e0:b2:05:05:6f:6c:53:a3:84:d4:8b:
+                    6c:18:61:b2:05:a3:8a:1b:82:51:7f:bd:40:28:c7:
+                    b4:d9:84:a1:40:72:93:4a:7d:00:29:e4:f8:1a:8a:
+                    5e:cc:8f:f3:45:01:b3:51:31:63:03:6a:5c:cc:0c:
+                    21:8c:a3:33:ff:af:21:56:0f:c1:f1:09:55:ca:a4:
+                    50:a8:47:ee:24:ad:d5:05:4b:c0:38:11:d4:ac:84:
+                    06:35:f3:7c:44:3e:b2:24:a2:46:7b:31:c6:e9:7a:
+                    4b:36:b0:db:12:01:c3:23:b5:8c:c8:fa:f2:09:ef:
+                    d8:6d:9f:64:cf:34:6c:c5:aa:85:d4:c3:17:90:7a:
+                    9d:2c:2a:23:31:1b:87:68:16:40:0f:a4:c0:3f:b2:
+                    4b:5e:a8:ec:28:79:55:f8:da:25:06:6c:65:7f:de:
+                    85:d1:f3:da:e4:14:58:fa:9f:71:35:79:4c:81:92:
+                    fa:af:b4:f9:f3:0f:27:2c:22:8b:65:f2:38:1d:da:
+                    c2:2e:a7:46:61:44:f3:74:8e:44:62:ab:7f:39:84:
+                    a9:08:fa:77:f3:7b:de:79:af:ea:b9:5b:ba:4b:2e:
+                    2a:4b:54:d2:8b:53:33:31:c2:ab:2c:63:d6:2d:85:
+                    43:0d:90:aa:dc:23:b5:7a:39:e2:99:6b:03:1b:b4:
+                    c5:86:37:76:6d:38:70:af:3c:0d:69:e5:68:91:dd:
+                    37:35:0f:a4:1a:fd:4c:a0:9d:f9:bd:8d:ec:12:35:
+                    73:60:5b:5b:62:3b:ee:fa:c5:ce:d9:86:7e:c1:00:
+                    c5:d2:6b:86:85:af:f4:03:32:72:00:90:37:82:29:
+                    79:47:43:38:98:73:64:4e:bd:35:5c:a7:6e:d5:4c:
+                    0d:3b:e1:85:e4:0a:36:9b:00:4b:a9:ec:52:14:50:
+                    81:1f:a3:26:a3:b5:1d:a0:76:0a:1b:bb:d6:c5:3f:
+                    c3:41:fa:3e:6f:85
                 Exponent: 65537 (0x10001)
     Signature Algorithm: sha256WithRSAEncryption
-         ba:7f:75:5f:5f:e6:a9:7a:b2:53:a8:d4:02:60:21:29:ce:a5:
-         e3:95:8a:eb:22:d0:54:f3:76:1b:22:a4:bd:2b:fe:a0:0e:f4:
-         46:8a:c4:b4:ee:58:ca:c0:dc:7a:1c:26:30:99:85:ed:e5:ae:
-         3a:23:81:76:5b:b4:e8:50:33:6f:19:52:a6:03:82:c7:13:ce:
-         4f:97:af:d7:42:6e:28:0f:f2:cf:e6:eb:f9:e9:65:40:2e:92:
-         44:87:ac:f7:a3:65:84:a6:46:1e:c6:3c:23:9a:98:13:d8:f3:
-         ce:a0:20:06:d3:6a:ec:db:3f:d7:92:5c:01:a7:e1:c1:d9:ba:
-         6f:1b:41:0f:ff:6d:80:dd:df:69:1b:45:36:f1:e4:1d:72:96:
-         57:3d:8a:80:e3:ae:b4:91:8e:88:40:48:e6:33:0d:e7:ad:3f:
-         aa:d3:c1:96:f2:44:73:bb:51:56:ce:75:b5:e9:2d:f0:a7:9f:
-         68:da:bb:17:9e:b4:c1:a2:81:15:be:28:43:f7:2c:20:35:94:
-         17:33:99:52:33:8b:7b:72:12:27:df:88:29:11:93:2e:55:8a:
-         eb:63:56:14:e9:cb:58:e3:a6:52:e4:21:04:48:fc:09:a0:30:
-         8a:8c:cf:df:b2:6c:5c:d3:96:0a:59:26:70:b5:fa:d0:1a:cf:
-         06:e9:30:f8:a2:45:52:63:43:c9:8d:ee:13:35:c4:6d:fc:f9:
-         16:4f:f7:5c:56:16:1a:1f:17:6c:f6:2e:20:d6:ec:57:0f:fa:
-         34:1c:a7:b5:18:fa:7d:16:54:71:3e:cd:97:70:f8:b9:7d:ea:
-         67:83:50:74:4d:a7:c5:90:a8:51:50:50:61:c9:31:06:63:7a:
-         8d:3c:b9:eb:f5:31:3c:fa:be:4a:1e:2d:02:26:cb:7d:fb:54:
-         21:16:7a:06:72:34:fd:1a:9c:36:9f:d0:4a:bf:df:86:74:0f:
-         fc:df:bf:32:6a:41:ae:24:67:a1:4a:f7:c8:cd:a1:6a:9b:c5:
-         69:db:72:94:b9:85:13:ab:20:25:77:b2:2f:a4:40:ec:e9:0f:
-         68:b2:a8:f7:78:50:f5:5b:30:6b:67:4a:f0:ca:57:18:0d:54:
-         9a:bd:e4:33:24:9c:51:4a:6f:99:92:3e:05:0b:a8:d1:9f:a8:
-         d4:54:28:b0:8b:be:0a:ff:64:76:aa:76:7c:f0:23:3f:c1:8d:
-         91:4f:04:37:2c:30:90:1e:6d:60:41:88:9d:b5:7b:0a:1b:98:
-         e5:15:58:47:d8:fd:11:d0:0f:5d:ec:6c:65:fd:3c:b1:4a:a4:
-         7a:79:bd:e9:4d:4d:39:7b:9b:30:76:11:1c:c5:df:51:5b:7e:
-         7b:44:1e:25:44:35:f3:71:19:3b:d4:7a:5e:db:3a:3c:85:54:
-         0f:b1:d9:1d:ab:69:88:04:a1:2e:37:77:8d:97:aa:24:17:af:
-         54:71:9f:ff:1d:74:e9:f3:7d:c8:79:e9:08:59:5f:dc:0e:d8:
-         b7:5b:fa:ee:4c:07:cf:51:fb:e7:5b:7c:d0:d5:85:f9:08:9c:
-         81:6a:83:f7:15:cd:fc:4d:a5:a7:39:6b:b2:cc:f2:e9:90:b7:
-         ea:e5:5e:3a:a0:a9:1d:e5:8d:2f:80:9b:30:8a:f0:ff:d5:c2:
-         a6:0e:83:7b:80:ec:f4:7b:88:f4:ad:69:01:81:35:94:14:0c:
-         8e:50:93:a5:39:17:5b:06:e0:70:3c:f9:6e:5e:09:89:84:23:
-         74:12:42:82:22:78:bc:aa:64:d3:51:f4:c6:96:8a:33:19:56:
-         bb:21:6f:bd:dd:c9:0b:69:0e:2c:17:5e:67:12:64:08:21:fd:
-         2e:5b:49:14:6e:9f:47:86:a4:99:4b:06:a5:50:20:30:a4:c7:
-         fb:32:d5:b6:5b:74:82:4c:7a:d0:e2:2b:99:7a:67:69:7a:3e:
-         d0:4e:65:eb:d3:ad:41:83:71:e1:c3:c7:69:36:03:ac:e4:0b:
-         cd:26:d7:00:36:88:26:36:22:fe:d4:d5:4f:79:5a:88:10:55:
-         98:0d:e6:e3:49:c8:fb:b5:b3:b8:5c:cb:a3:57:80:a8:06:34:
-         32:57:70:0a:df:78:d4:d1:f9:cc:27:ef:17:2e:38:26:e6:32:
-         ff:7d:a7:f8:44:b3:52:00:4c:a0:af:76:6a:a3:99:c2:a7:73:
-         c8:fd:9c:fa:40:c8:48:0f:83:e8:03:3f:2b:7e:3a:bc:3b:6c:
-         43:af:2b:ca:a3:29:a7:2a:d2:c2:22:90:98:fb:7e:33:79:c3:
-         6d:b9:56:96:bd:6d:f5:57:cf:79:03:77:e6:85:17:d2:7b:5a:
-         67:6d:03:b2:cc:e0:4f:81:56:d7:54:f7:cd:31:c7:bd:cf:d4:
-         19:9f:99:1b:91:69:28:9b:09:27:77:28:de:4f:cb:2a:38:4d:
-         29:28:de:4f:a4:d4:e4:09:a2:a4:ca:dd:86:e4:fd:3b:95:1a:
-         5a:74:9f:3b:af:32:d0:25:7a:67:c3:de:c6:93:0e:8a:6b:1e:
-         79:89:4c:0c:86:91:cf:b5:bd:b3:3d:6c:c0:26:74:83:49:62:
-         cc:51:83:3a:e7:08:bb:17:67:17:c2:fa:9a:af:86:57:b8:44:
-         a6:3f:af:8f:21:85:bd:88:5b:ff:1b:af:78:3b:aa:90:74:ff:
-         3a:f3:18:40:69:4f:35:a6:45:80:ff:99:7b:95:a3:51:1b:e0:
-         26:cc:46:41:dc:4a:ca:54:a2:c1:14:d9:44:36:ba:eb:29
+         5a:d5:96:95:b5:3b:c2:47:95:f1:f1:b0:d7:a3:05:30:7b:80:
+         b1:2c:ef:aa:37:6c:de:df:78:69:76:ff:f0:11:90:a5:e9:86:
+         49:29:73:df:2b:82:a9:7f:d4:64:3f:ce:16:7a:2d:39:8e:be:
+         09:a6:95:c8:c3:e7:9a:75:e5:ff:9f:e0:0f:eb:b2:46:eb:2d:
+         7f:da:67:95:37:45:c2:af:b8:50:1d:29:ef:f7:df:65:c8:36:
+         98:77:d6:e0:e4:37:51:52:75:ff:ad:61:c0:aa:31:b0:bf:46:
+         ec:a4:a7:77:61:ad:b7:bf:6a:47:02:ed:e4:16:52:89:65:07:
+         13:ca:aa:00:2a:5d:e4:dc:40:96:69:3c:41:f1:8f:9c:6d:e3:
+         5c:0b:89:f1:ec:80:08:21:0f:dd:a3:53:1d:f2:f9:1b:82:20:
+         7f:bf:10:04:92:65:a8:2c:9e:3b:c1:2d:37:7c:43:03:df:f1:
+         d0:7b:dc:33:55:52:55:da:6e:f6:bd:71:fe:79:f7:1b:c2:b2:
+         65:c0:3f:5a:72:cc:b5:64:9d:7e:28:0c:29:b7:b4:fe:fc:85:
+         d5:60:a0:63:ee:e6:16:58:d1:d1:0e:0f:52:66:41:22:b8:5e:
+         e8:4f:a2:5c:16:ab:25:ed:93:5e:95:fc:d2:9e:f1:ba:76:6d:
+         ab:da:90:94:72:82:4a:0a:b8:ab:32:f0:6a:f7:57:41:fc:f3:
+         de:1d:79:97:b2:99:d5:d0:21:7b:e8:9a:21:1b:b2:2f:59:b5:
+         d9:45:d8:1a:50:29:24:88:00:97:9c:99:a6:3b:df:60:de:7b:
+         3a:4b:4d:a4:05:38:1f:6f:bd:55:d7:b8:0f:3b:06:36:68:9e:
+         9c:68:16:b5:0a:7d:f9:a6:5b:a0:1d:a9:6e:59:e3:69:12:0d:
+         fd:05:58:47:b3:71:65:13:45:dc:17:72:9d:2a:aa:9d:a9:03:
+         d2:9a:b1:11:0f:f9:9b:46:47:9d:d2:11:3e:94:9b:ea:17:a6:
+         52:73:6c:c3:a0:6a:bf:84:94:fb:28:55:3d:eb:00:0d:0a:9d:
+         68:d6:19:47:82:63:88:b4:1d:c4:30:fa:80:eb:59:08:96:8e:
+         b7:c0:96:ce:05:bc:e7:31:39:7f:9a:c9:63:a3:50:b2:40:33:
+         18:50:e3:12:95:1a:87:39:62:eb:9c:3d:aa:d5:99:77:05:e3:
+         e3:6d:6b:b2:9e:86:30:fd:6f:ef:52:8d:95:7e:7c:e3:0e:2d:
+         e4:e3:f9:d2:66:7e:00:24:3d:9d:fc:b8:88:ca:b9:04:43:79:
+         2c:50:30:85:3e:3a:f1:bb:d1:8a:e3:98:1c:ec:75:21:47:4e:
+         d8:f4:05:f8:c7:75:e0:89:37:2f:91:01:8c:dc:30:b9:16:4a:
+         c7:e4:ed:36:9d:5f:54:90:b8:e6:47:6d:c3:10:9f:16:56:2f:
+         dd:33:e7:2d:8e:0b:d4:97:50:da:e0:83:ee:54:30:b1:d9:cd:
+         71:ff:00:b7:48:4d:e4:28:ac:cf:b1:01:77:bb:a9:dd:b5:3f:
+         87:53:c9:f9:a6:86:3b:8c:fd:ba:aa:75:d7:1c:ca:48:70:6c:
+         c5:64:7c:94:ba:58:17:75:5f:ab:e7:4c:d2:5d:37:3a:9f:cb:
+         b4:37:e8:af:52:3f:5f:b4:bd:99:e9:79:6c:cc:e9:a4:99:2d:
+         d6:98:6d:bc:f4:2d:cf:4f:af:10:df:94:22:68:2a:2a:f4:f9:
+         41:dc:a9:11:05:76:ae:f6:d8:af:1a:bc:27:8f:22:95:13:92:
+         78:7f:60:43:a5:79:e4:4e:85:fc:32:0e:20:79:d9:90:81:ba:
+         9f:f8:05:ba:98:bb:1f:36:52:1b:6a:c1:b9:6a:cc:e6:ea:21:
+         7b:8e:1a:ac:b7:9c:c8:d5:f6:f7:1c:fd:a5:44:c5:7a:02:af:
+         b9:81:fb:d8:7e:89:dd:8b:05:96:a0:3d:b2:6f:af:bc:62:5d:
+         b5:0d:04:d7:09:24:77:d9:74:90:eb:9d:ae:bb:f2:60:83:22:
+         09:86:0a:66:de:69:be:bd:c9:cf:31:e3:b9:32:3b:9d:6a:57:
+         99:5f:6c:ba:c0:29:c0:d8:c6:b0:2b:11:9e:0c:11:0f:8d:67:
+         2e:f3:b8:14:8e:dd:c4:e8:3c:c7:f9:81:8c:6a:77:7e:7d:86:
+         7f:f2:7e:bd:38:03:10:2c:2f:13:e4:69:24:d4:2e:e3:7a:d0:
+         1e:ed:79:49:06:22:6d:94:20:a0:73:22:18:09:01:4d:5b:5f:
+         31:bd:37:13:a7:eb:9c:0a:9a:c1:c3:37:c4:62:07:c8:74:a1:
+         5c:c8:d0:7f:4f:70:4a:53:a4:78:85:50:2a:a4:3e:0e:98:82:
+         4d:2c:70:a0:71:3f:0b:ea:a0:11:e7:6b:00:02:a2:b6:83:99:
+         f3:18:68:ed:2d:2c:ef:02:ca:ab:d0:2c:0c:78:4b:ec:f1:03:
+         f4:d3:b9:df:36:a2:10:6d:3b:75:53:79:4c:6d:34:ae:cc:13:
+         2f:d4:81:98:cd:94:9f:65:b7:20:a9:5e:64:51:01:09:b3:89:
+         2f:bc:3b:38:0f:27:bb:59:72:0e:c0:47:18:65:50:77:48:b4:
+         d1:a8:b6:83:3f:55:86:3f:ac:ee:20:83:38:78:d3:ef:10:48:
+         52:7d:92:ea:dc:5e:ad:24:0f:37:70:4c:a0:16:a2:59:3e:78:
+         56:8f:d4:74:8b:c6:88:a6:3b:17:7c:34:bf:ab:19:21:f2
 -----BEGIN CERTIFICATE-----
-MIIJPjCCBSUCCQCVJI6ey0uORzANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJV
+MIIJPjCCBSUCCQCdSEfUGbmy1zANBgkqhkiG9w0BAQsFADBgMQswCQYDVQQGEwJV
 UzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQ
-MA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMB4XDTE1MTIwMjIw
-NTczOVoXDTI1MTEyOTIwNTczOVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+MA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMB4XDTE3MDYwNTE3
+MTA1MVoXDTI3MDYwMzE3MTA1MVowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
 bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
 Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCBCMwDQYJKoZIhvcNAQEBBQADggQQADCC
-BAsCggQCAN/BCGR6Md8UlT/NbYOcP532Mc4pQHZbT5zyX6W/1ILrZx0aGMVDU7ac
-Gd6H2lP+EejNSbZcmGjcrrI+hgOKpeullRoBtrdnhFoHzZAGaVLbELhz9g/iQyhL
-X0J1yXhluy1LuemXCb4fSV5Xhsc/++sYkFd+hsDhd+xnbifr94B65rHdeMny7xsQ
-PuJviYtWjWnX8BseNdZBxhqAHxW+Dq7Jh9/ogKKFIN4yOvjMEnLrQR4rKik/9+Hr
-KZmttI15CpmOD0ofROl0txfLlyF6fdVspf3RU7UhjApTTQrpTUBSCzVfQAkJH222
-BJx18u4yidj/o1s3k2nwJUzsKqce4ikz7wf0YYyRqbv5ibqy3ZgIkb939rs794r3
-HNdrF9P6YhIuu9O/eKPrHssAcG6HP57r/S0yd/Ixr1zcFacs2a7n+/gBSslF84fc
-x8wU/n99RpQIrCVqGAJJtaq9T8UaBLisoWpUARkF9FXgCJhn9exhCez8gZuId1N6
-0UhMj+K3DQYEvAVuDwqhVgexE0GQSf0ScPYBV63WLaKhBM/RKTj1aHZYm10eDyx3
-9vDP2N/F0iOLNKmulGd0SyGZfLvevvlctusULbs4VvsMfHBCQhsbPJhtYR8WMs5z
-KiOe6+bRiQ0wB9KUCYxtOEnmB/29I0hHbMrA2lDoXwYIcuHK/ZH8KfwmQP8deBYj
-H8JkQQS2PEC3CCemfSZK/Vev7rrjk0UHZFxfwKfoolunPdrTlx982ncADTA+4679
-TMcY5mLgnXQPkACqwjLe3NGP18PCCL/RvX4hCXkyjxoSQ5eRQTO91C47qW0GI9Ha
-fl9FJ9UXnA7fLNFmy+3s48Nrqw26cQSkkqRxVWkgNXL9rVSoz0TDnaFalE0FYl6Y
-1iXF1s/175TALFOHC58TD2PFl9VbikZ8DijeZpZ03yqysCdtTE9UctktrlhP02Nj
-k8I0V2Y7OJA2qamV5n3ohIdoc5tEaNlpHxwbnVhEd3LoKMEaEb1cQLfQWLlYkZ9b
-MJQz+va+KlmLQ8zjBEUbQ37XtfTT3F1lrmvRktL3to/fxlwAwws3KDMz3QXLPGIN
-C1RC6p9s6fLvx6t8XM8YVTUc93KPw9UbwAlvROgGYkTECxDiw7Gc3nM3XVG8tj84
-G3XZJt9PGutjnOFJEeTL7OM6seIAi5K7c/sFeIHnrCEbI8GPi5xSuwnaciO/geZ0
-GGMfhJtdBpJyqoRQ9I8qlAWPQl/eRQWyviY93MTvg8uqtGcvXOL5s5wf+ZKPQE+Z
-35pe/cXbktyoQRNk9LsKZYfczzkwvp46hmLWLm8Xitl3OuKNjwjrHv2vZyId//+4
-IiuTUR0Sx2uFTbcYlmTiJQbsRWdjK7EjAgMBAAEwDQYJKoZIhvcNAQELBQADggQC
-ALp/dV9f5ql6slOo1AJgISnOpeOViusi0FTzdhsipL0r/qAO9EaKxLTuWMrA3Hoc
-JjCZhe3lrjojgXZbtOhQM28ZUqYDgscTzk+Xr9dCbigP8s/m6/npZUAukkSHrPej
-ZYSmRh7GPCOamBPY886gIAbTauzbP9eSXAGn4cHZum8bQQ//bYDd32kbRTbx5B1y
-llc9ioDjrrSRjohASOYzDeetP6rTwZbyRHO7UVbOdbXpLfCnn2jauxeetMGigRW+
-KEP3LCA1lBczmVIzi3tyEiffiCkRky5ViutjVhTpy1jjplLkIQRI/AmgMIqMz9+y
-bFzTlgpZJnC1+tAazwbpMPiiRVJjQ8mN7hM1xG38+RZP91xWFhofF2z2LiDW7FcP
-+jQcp7UY+n0WVHE+zZdw+Ll96meDUHRNp8WQqFFQUGHJMQZjeo08uev1MTz6vkoe
-LQImy337VCEWegZyNP0anDaf0Eq/34Z0D/zfvzJqQa4kZ6FK98jNoWqbxWnbcpS5
-hROrICV3si+kQOzpD2iyqPd4UPVbMGtnSvDKVxgNVJq95DMknFFKb5mSPgULqNGf
-qNRUKLCLvgr/ZHaqdnzwIz/BjZFPBDcsMJAebWBBiJ21ewobmOUVWEfY/RHQD13s
-bGX9PLFKpHp5velNTTl7mzB2ERzF31FbfntEHiVENfNxGTvUel7bOjyFVA+x2R2r
-aYgEoS43d42XqiQXr1Rxn/8ddOnzfch56QhZX9wO2Ldb+u5MB89R++dbfNDVhfkI
-nIFqg/cVzfxNpac5a7LM8umQt+rlXjqgqR3ljS+AmzCK8P/VwqYOg3uA7PR7iPSt
-aQGBNZQUDI5Qk6U5F1sG4HA8+W5eCYmEI3QSQoIieLyqZNNR9MaWijMZVrshb73d
-yQtpDiwXXmcSZAgh/S5bSRRun0eGpJlLBqVQIDCkx/sy1bZbdIJMetDiK5l6Z2l6
-PtBOZevTrUGDceHDx2k2A6zkC80m1wA2iCY2Iv7U1U95WogQVZgN5uNJyPu1s7hc
-y6NXgKgGNDJXcArfeNTR+cwn7xcuOCbmMv99p/hEs1IATKCvdmqjmcKnc8j9nPpA
-yEgPg+gDPyt+Orw7bEOvK8qjKacq0sIikJj7fjN5w225Vpa9bfVXz3kDd+aFF9J7
-WmdtA7LM4E+BVtdU980xx73P1BmfmRuRaSibCSd3KN5Pyyo4TSko3k+k1OQJoqTK
-3Ybk/TuVGlp0nzuvMtAlemfD3saTDoprHnmJTAyGkc+1vbM9bMAmdINJYsxRgzrn
-CLsXZxfC+pqvhle4RKY/r48hhb2IW/8br3g7qpB0/zrzGEBpTzWmRYD/mXuVo1Eb
-4CbMRkHcSspUosEU2UQ2uusp
+BAsCggQCALqr0shsBF4jYQQ47evBq8dd/SEVSSuRRUdOsINWzgV/PMNt1QIqo/Wb
+DiZjoiJzTImlSTf0Dr5iCvynMQKndNHBZNLW2yGQw6PJth9q9+kki8Wiws3UkRYb
+abrDYgWQ/C+DXGz+Y8gxeG4n+OIlpjYdg0pt8Bi+fFYSJNi+Ehd6+A5YW23nAJ4u
+zAiUO7Jx39/F97G7RUFAgsG9kGP2+pjOyYOVFzBdtktDTe7Z41RwTIeScTk89lND
+lqeUx6moYs6QDtez5+QM7yyaSDDRYD+1j2uEJGIkNg0/LoIVPmJnEn/UbiyLqG1w
+2lVeHw25zVWx1IjrxiQ9aG4xdSBw4i75z+g4k0f3WpFQnu3AiaYqSwSD43/os4nG
++TtkkWYDjz+HSg+Iyx20V83RNW39M6Kz8q+E1naBmMS7sY0q/jOAmoc+BG2qyBkE
+6oKGWkzX5qL2y5Bv2WtEwKof9NGOidwAgBZjGKSXHh3dGrYmLQKlrXfNANcv0lpp
+ENZ6HdQ1tCJn+vrTwWC6biSIhoQZ19uE+UZH973l5IAJWmy32baRuXhdStHYoxpc
+9yLXZB1xz5hrAiCzbaOE1VIx4ZyoNmyyOxL1ZZlhF2ao/vd8Wts1FmaUKwOexjvB
+9/TYCo6vZA+k0q9Zh5mZ50vrbSNTi76gPJGF5q5aecheCiEbjqWLJPtd9414aPOD
+3yHjTVCrePaTr64cZneWco1tlIOk84Hkp6K2XVwUD72bJhxaSi9t3bM74cZ5YwQe
+lfBBKR+Nl3o8+b0R6nAbPW7hwhxFGV8g4V1QIbWa86svN1m8ejNoKEetJ/Ld51au
+U4QGDHLSJXa1cTHbxSXQRhphhI4/5N8Odlb80WQIgLc4eYUa794CQK/YLls7PeCy
+BQVvbFOjhNSLbBhhsgWjihuCUX+9QCjHtNmEoUByk0p9ACnk+BqKXsyP80UBs1Ex
+YwNqXMwMIYyjM/+vIVYPwfEJVcqkUKhH7iSt1QVLwDgR1KyEBjXzfEQ+siSiRnsx
+xul6Szaw2xIBwyO1jMj68gnv2G2fZM80bMWqhdTDF5B6nSwqIzEbh2gWQA+kwD+y
+S16o7Ch5VfjaJQZsZX/ehdHz2uQUWPqfcTV5TIGS+q+0+fMPJywii2XyOB3awi6n
+RmFE83SORGKrfzmEqQj6d/N73nmv6rlbuksuKktU0otTMzHCqyxj1i2FQw2Qqtwj
+tXo54plrAxu0xYY3dm04cK88DWnlaJHdNzUPpBr9TKCd+b2N7BI1c2BbW2I77vrF
+ztmGfsEAxdJrhoWv9AMycgCQN4IpeUdDOJhzZE69NVynbtVMDTvhheQKNpsAS6ns
+UhRQgR+jJqO1HaB2Chu71sU/w0H6Pm+FAgMBAAEwDQYJKoZIhvcNAQELBQADggQC
+AFrVlpW1O8JHlfHxsNejBTB7gLEs76o3bN7feGl2//ARkKXphkkpc98rgql/1GQ/
+zhZ6LTmOvgmmlcjD55p15f+f4A/rskbrLX/aZ5U3RcKvuFAdKe/332XINph31uDk
+N1FSdf+tYcCqMbC/Ruykp3dhrbe/akcC7eQWUollBxPKqgAqXeTcQJZpPEHxj5xt
+41wLifHsgAghD92jUx3y+RuCIH+/EASSZagsnjvBLTd8QwPf8dB73DNVUlXabva9
+cf559xvCsmXAP1pyzLVknX4oDCm3tP78hdVgoGPu5hZY0dEOD1JmQSK4XuhPolwW
+qyXtk16V/NKe8bp2bavakJRygkoKuKsy8Gr3V0H8894deZeymdXQIXvomiEbsi9Z
+tdlF2BpQKSSIAJecmaY732DeezpLTaQFOB9vvVXXuA87BjZonpxoFrUKffmmW6Ad
+qW5Z42kSDf0FWEezcWUTRdwXcp0qqp2pA9KasREP+ZtGR53SET6Um+oXplJzbMOg
+ar+ElPsoVT3rAA0KnWjWGUeCY4i0HcQw+oDrWQiWjrfAls4FvOcxOX+ayWOjULJA
+MxhQ4xKVGoc5YuucParVmXcF4+Nta7KehjD9b+9SjZV+fOMOLeTj+dJmfgAkPZ38
+uIjKuQRDeSxQMIU+OvG70YrjmBzsdSFHTtj0BfjHdeCJNy+RAYzcMLkWSsfk7Tad
+X1SQuOZHbcMQnxZWL90z5y2OC9SXUNrgg+5UMLHZzXH/ALdITeQorM+xAXe7qd21
+P4dTyfmmhjuM/bqqddccykhwbMVkfJS6WBd1X6vnTNJdNzqfy7Q36K9SP1+0vZnp
+eWzM6aSZLdaYbbz0Lc9PrxDflCJoKir0+UHcqREFdq722K8avCePIpUTknh/YEOl
+eeROhfwyDiB52ZCBup/4BbqYux82UhtqwblqzObqIXuOGqy3nMjV9vcc/aVExXoC
+r7mB+9h+id2LBZagPbJvr7xiXbUNBNcJJHfZdJDrna678mCDIgmGCmbeab69yc8x
+47kyO51qV5lfbLrAKcDYxrArEZ4MEQ+NZy7zuBSO3cToPMf5gYxqd359hn/yfr04
+AxAsLxPkaSTULuN60B7teUkGIm2UIKBzIhgJAU1bXzG9NxOn65wKmsHDN8RiB8h0
+oVzI0H9PcEpTpHiFUCqkPg6Ygk0scKBxPwvqoBHnawACoraDmfMYaO0tLO8CyqvQ
+LAx4S+zxA/TTud82ohBtO3VTeUxtNK7MEy/UgZjNlJ9ltyCpXmRRAQmziS+8OzgP
+J7tZcg7ARxhlUHdItNGotoM/VYY/rO4ggzh40+8QSFJ9kurcXq0kDzdwTKAWolk+
+eFaP1HSLxoimOxd8NL+rGSHy
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/localhost_cert.pem b/net/data/ssl/certificates/localhost_cert.pem
index 273a9c4..8a34ad36 100644
--- a/net/data/ssl/certificates/localhost_cert.pem
+++ b/net/data/ssl/certificates/localhost_cert.pem
@@ -1,111 +1,112 @@
 -----BEGIN PRIVATE KEY-----
-MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQCvaqKl55EBl974
-UxivDfhGARaIX5OUIO9RVi98YYXMEoIGC9IcUtfFyMNzqyaR30HzslhsQrunl3J9
-voeZAU9zh/jr5kW/PKFL0DMeoKUEToDFCvZaLZoJljRZ8gZxPZ7+qBm/RancIMjm
-mwce/v+rwh7k/gt1SbyhG7wD+8SzxC9ABYRwi9RbuKdfZ+KfpovU2uRPi8JYxSm2
-drgZCs4AEVFiIjvgkNv2rn93wx/blT0f4nse7oFboecSFT3U1Hu1P8MZP/tLEfhj
-PWc/eitEiIKdBVVMMQcO1hQXpbLCTndVhmYOOd18+G/hkkuwynigtDKI8kQQGz64
-em09uCsDAgMBAAECggEBAJyRYjEQWfYBFuuwR4TfxCy/hdwc6r05FEIV2fZ7mQ+H
-qXQ6EsRjEOIhCorwRVHH4rbgBVpDyfiRDYi8iY0AhWjKAVyUwMYrGJBxeV8p5X/N
-jdPRsAbXUvihj4KEqklixcnoQmrdg/nNbWOfFaEN2yfz8N1U/ucl9G4cMhmgG3aS
-94lppp5bqse61wVLKZUJVzBR7V0L8pgei7ZIJsI30k/gB+hqAiDlzL0veuTyhbP3
-wsr32bOCi8cBKro6wQkVIGWtkC7Rghz8VwfsR67Rxg+hsTPEJ34CFCl6TXctEItY
-gEVwRgHdw3Oe/83xlzNfSkkkQ9CQDeL3kvhW0POjbbkCgYEA1Uish6WiLRVQpwnN
-rSZNaLrH06Py20wpd2MKAp3p7JhsY1TO1IP1XPrq3899u8vNL6RjZ6fydspRLOOt
-d9ZkzmOSz4R9J6HQSz3NAQrK2yHw/1RJ0W8IjVHI2R1tYjxvIC+NZiNdLd7vjsRL
-Atz2R9B8hkvDEGB+aj4OqHuFCh8CgYEA0ox04N7yYkG8/i9Z+fQadgqSllgvb6w4
-hvKEhnwweu1q33n/YwZtQ89ElX0speK02ZH60AkNNXRRORVPCV60QhabXzax9Lba
-J+m+NtAYPABwbXPRJq4S5z9toWoqxCxKc36sCJqjdDE637xtEe8ULh2WEGmCctjC
-BpEk9xlMSp0CgYEArsLxu+RYUqCYiYZa5XnxC9OgUSaRpGdvwseAOEy0lI0AoxOm
-tjO6JQnk0qbt26dO5a7JVPIklnmIskOMrBkcWJD2htuEwaixSDXHeQci2ROiqVSj
-d9yHIWTWMjEOo+PpGnJcZkir3R5DJLRq0lnD42xN3KzPlOe8LcnTsPIlPPkCgYEA
-qFZgREI8bM6+ekQFnlDKr0H4vXe4RYLelxZjWtsEL+SOpCp4RAYpaiPXY+X2wpKl
-oaaTb60tAGYFYqxkyssLOCO3CcNDOLLRbUP3Lv/lwGNhgEEvIcvflUAjOQEXPE1l
-IT5P8Xkh4o5R0fxnAAW0jsJc7rZM8+HWD0YQ1fdGBgkCgYEAvsEfq+E0t52Vvn+d
-gxJE+N7Ny6Iu8cy47B0xKkyML//0vOquBun2cUYEqncloLI1a3wp1FykyJMJUX/d
-ZTJl7u5hhLHkhxSDVmyccw4v3Zhsn5/qb18jseE42Nbhtf8VhkZLOSbiHmxjrNdH
-V135E6sqWD6wkvGVbxn3haPe9+o=
+MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQCr/csPH2W5PnS4
+Ei02FKhBPWHuDhF4L4KkDARe+0iCU0lRMclBEgVCefaM20QfPnhNJtfrJ0MVD3nP
+4/iIZHDQXlWgXRGIYpqyysmN3p4L2VBrl2zqrWKWYZqQPRZokFUGYIpujqpF1Th5
+Zz2dDWlqb58gUnPye+HswAmTHNOmEXYQjRjoASS4LKc11ZZmFmQaS6h88v+yGYK7
++ss4kbH2oxRH0OSuiyXPWf9Pl9urA6IobaY2CPgJxl6Cn//+I98IC2heb7/Tciax
+FkwrjO+SmOeb2NCQg4dxcPGIhQmPO2ZrOgw+/uttvfuQ3H80Fls4+VgPmo8EQ3VL
++a5zXo7tAgMBAAECggEAQPqJlRUPoYTvI/v6CMyVJNDEBuRZxUZt3PyNSjU1l8dP
+k9Vza5obUpoxg9XzTrqTSNK8EKOsvHA0XU6LvzvzQ0Xgo82FqjlWqOXkcC0DGQbp
+UzzKcX9AGACYHJZ3uNmOxfIDWvGbcvazd2qB5KwEf6ncPKHqHFqhaIjFFUd2zu56
+4+DcVFKUrMR44KvTk1qe4R00u0kDsxZTLk70fzMkRl0qcy4oyjtOSeSEEqIKgcFS
+jiXv2TM1XpMZ28P2VqA98yPhpuEnZepvTFtBth2fh3Be+rs/WxUiND+1/U4b40rH
+nJr9w6z7xbpQw5FD3fqBhYK5/rsS2ghALYYaRsPuIQKBgQDiP0YJpflCrY1lbFjg
+pdp+oGSqfWB0Ejq1UNnN2vVqFHykyykn+y2Tg2VTC6xsH1gqruy0DRJeHgzLj57K
+5/LA98+xobxBcu1QuU0sMylWlMqmppPrHqNf7+ZzTP0LafbJAzpKGqyOIGMfeb6Z
+94RwVDz9ykp/VzFg/dTTRKutUwKBgQDCm/iP0x9dC0Weif8wV3QzmjOGY4Oq2RZn
+d4OOTL2UIVQq/wGbMomR6X89b/Frs5TCK79VQqffTKkxMWTF+ZZlFG7IFBnUKT84
+KXhqez/jtmyq4flGJ6J6SdrJCXJkXZwt1NLnIPwZctgaugrgh5vEBIln50wTGOXN
+8EgDABEKvwKBgQCzPCsxE5LPlwxQUDBs8BeTf1+gjSjva02lPML/yTno6wf/yY72
+RI/LsCmCS9ox4fcIAYI19bEabLX4QfQrjOuMogWhFJ8+PlzxOYuAu5tBIykUMx02
+BBSruTMZHuHMvAqtHmh8MnuHMPM2CU3NTgBWuPWEnVC9ZwcQbqa/JETZTwKBgQCf
+Oy0yyQT1hX6OTM0vSa87daVJBW27Qerx97j9ms7XQDn1ADfZO42ShOHmbAy2GfbS
+tSbVZTekHr6lEIwq7J/gzsoiDUhg7uraUhxDy9qnwCDD5Sen/lAUDQ/lxEQD2RAr
+8+Io2TVMwUoO/EBgHLUXurqO+JKnYYzOZxcU1V4cUwKBgQCWUtlDJR/gg83Q/HbC
++fPPSifL7nLDuzgDgf6oUp555dsUnU/CSyVhAAGWh/bkYi2Kb0c/5L4pMXlGSHMv
+N/6Ek8JA+teaRojEtHqEkEQw6l6T61BxzpImO+KYw05mk+f/I8VoaG/cQkDLr48B
+k7jie9XxUXWGXk5vCuvZgtcwQg==
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number:
-            12:78:95:65:51:49:92:01:32:10
+        Serial Number: 7 (0x7)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Apr  6 16:18:41 2015 GMT
-            Not After : Apr  3 16:18:41 2025 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=localhost
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:af:6a:a2:a5:e7:91:01:97:de:f8:53:18:af:0d:
-                    f8:46:01:16:88:5f:93:94:20:ef:51:56:2f:7c:61:
-                    85:cc:12:82:06:0b:d2:1c:52:d7:c5:c8:c3:73:ab:
-                    26:91:df:41:f3:b2:58:6c:42:bb:a7:97:72:7d:be:
-                    87:99:01:4f:73:87:f8:eb:e6:45:bf:3c:a1:4b:d0:
-                    33:1e:a0:a5:04:4e:80:c5:0a:f6:5a:2d:9a:09:96:
-                    34:59:f2:06:71:3d:9e:fe:a8:19:bf:45:a9:dc:20:
-                    c8:e6:9b:07:1e:fe:ff:ab:c2:1e:e4:fe:0b:75:49:
-                    bc:a1:1b:bc:03:fb:c4:b3:c4:2f:40:05:84:70:8b:
-                    d4:5b:b8:a7:5f:67:e2:9f:a6:8b:d4:da:e4:4f:8b:
-                    c2:58:c5:29:b6:76:b8:19:0a:ce:00:11:51:62:22:
-                    3b:e0:90:db:f6:ae:7f:77:c3:1f:db:95:3d:1f:e2:
-                    7b:1e:ee:81:5b:a1:e7:12:15:3d:d4:d4:7b:b5:3f:
-                    c3:19:3f:fb:4b:11:f8:63:3d:67:3f:7a:2b:44:88:
-                    82:9d:05:55:4c:31:07:0e:d6:14:17:a5:b2:c2:4e:
-                    77:55:86:66:0e:39:dd:7c:f8:6f:e1:92:4b:b0:ca:
-                    78:a0:b4:32:88:f2:44:10:1b:3e:b8:7a:6d:3d:b8:
-                    2b:03
+                    00:ab:fd:cb:0f:1f:65:b9:3e:74:b8:12:2d:36:14:
+                    a8:41:3d:61:ee:0e:11:78:2f:82:a4:0c:04:5e:fb:
+                    48:82:53:49:51:31:c9:41:12:05:42:79:f6:8c:db:
+                    44:1f:3e:78:4d:26:d7:eb:27:43:15:0f:79:cf:e3:
+                    f8:88:64:70:d0:5e:55:a0:5d:11:88:62:9a:b2:ca:
+                    c9:8d:de:9e:0b:d9:50:6b:97:6c:ea:ad:62:96:61:
+                    9a:90:3d:16:68:90:55:06:60:8a:6e:8e:aa:45:d5:
+                    38:79:67:3d:9d:0d:69:6a:6f:9f:20:52:73:f2:7b:
+                    e1:ec:c0:09:93:1c:d3:a6:11:76:10:8d:18:e8:01:
+                    24:b8:2c:a7:35:d5:96:66:16:64:1a:4b:a8:7c:f2:
+                    ff:b2:19:82:bb:fa:cb:38:91:b1:f6:a3:14:47:d0:
+                    e4:ae:8b:25:cf:59:ff:4f:97:db:ab:03:a2:28:6d:
+                    a6:36:08:f8:09:c6:5e:82:9f:ff:fe:23:df:08:0b:
+                    68:5e:6f:bf:d3:72:26:b1:16:4c:2b:8c:ef:92:98:
+                    e7:9b:d8:d0:90:83:87:71:70:f1:88:85:09:8f:3b:
+                    66:6b:3a:0c:3e:fe:eb:6d:bd:fb:90:dc:7f:34:16:
+                    5b:38:f9:58:0f:9a:8f:04:43:75:4b:f9:ae:73:5e:
+                    8e:ed
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                87:A2:09:4C:8C:84:57:D1:4A:30:35:53:8C:1D:04:01:18:21:15:CA
+                FD:CB:18:66:1A:6B:34:2F:F7:F4:26:D0:37:12:5D:4B:70:93:87:CD
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 DNS:localhost
     Signature Algorithm: sha256WithRSAEncryption
-         9f:37:2e:c1:f9:7d:09:d6:94:52:09:bd:f1:b2:f7:3e:67:6e:
-         10:0b:65:cb:0e:c4:e7:cc:f7:25:9f:01:c0:e1:41:65:eb:bd:
-         61:f8:89:be:73:29:ad:07:15:98:89:ea:f0:77:d6:8e:20:35:
-         2b:0e:f3:64:05:f2:f0:20:73:56:23:0d:51:d9:19:b5:a8:cc:
-         a4:87:bb:63:2f:d1:e0:52:d0:5e:ae:93:c7:90:81:78:36:d4:
-         e6:a5:cc:db:c6:be:af:17:5b:80:83:34:2b:2d:dc:1e:f3:4c:
-         a0:04:70:f4:aa:90:1d:08:65:20:54:e1:32:5f:80:12:3e:76:
-         aa:1b:b9:2f:a7:36:54:99:a3:45:e4:43:1b:08:17:11:81:d0:
-         32:1d:68:c2:d1:b1:33:04:92:95:63:b8:26:18:79:12:ab:77:
-         14:80:58:4a:8a:a4:4e:ec:2e:07:02:22:de:67:92:03:54:0f:
-         31:6e:15:aa:53:6a:40:5b:d0:04:4e:c9:dc:a3:2a:0b:52:c9:
-         8b:92:9b:f4:4a:11:1b:e8:c1:da:54:9b:5c:ac:62:85:ce:ac:
-         9a:3d:0e:f5:4c:be:9d:53:5b:3e:bb:c0:a2:fe:a7:b2:10:eb:
-         02:d5:ce:ea:86:05:6e:77:c3:23:2d:45:c1:37:98:7b:6c:89:
-         13:92:95:8b
+         5f:9d:b6:22:48:7d:cd:6a:8e:f8:06:9f:64:98:f0:a2:66:1b:
+         47:28:5d:97:8c:fd:36:38:bf:0e:ee:d9:3c:45:86:5b:af:6f:
+         12:b2:be:55:10:e5:4d:b9:10:f3:1e:ed:66:ed:f3:7b:5b:c3:
+         e8:90:3a:57:26:db:51:89:1e:9e:cb:78:30:f9:f9:a2:40:da:
+         65:ba:ed:65:c3:75:b3:45:43:be:88:e3:37:41:75:02:96:c0:
+         eb:49:d5:62:6a:5f:71:90:20:ad:8a:29:7e:84:56:aa:f3:24:
+         7f:37:a6:81:89:56:54:e2:fb:e9:27:e7:de:ae:e1:0a:fe:b6:
+         7e:cc:2e:69:9c:f8:8c:f3:64:09:a3:a2:62:99:4f:ff:1d:bb:
+         5a:b3:8b:7e:8a:46:05:6c:32:1f:44:56:de:cf:b1:b7:33:0d:
+         b2:f9:08:76:3d:8e:4a:f4:77:1b:87:96:ae:49:a0:46:b0:97:
+         f8:0d:26:26:d3:70:39:9c:76:eb:6e:dc:0e:38:f6:d7:fe:c3:
+         fc:fe:4f:41:3f:81:3c:d2:da:8a:8a:39:70:da:04:ef:be:39:
+         0f:5a:5f:d7:2e:28:dd:ae:e6:e2:52:8f:55:72:51:ad:51:c6:
+         8b:48:17:bc:13:a5:19:19:f6:70:f3:12:6c:52:45:b1:6c:8c:
+         aa:b1:49:ee
 -----BEGIN CERTIFICATE-----
-MIIDgjCCAmqgAwIBAgIKEniVZVFJkgEyEDANBgkqhkiG9w0BAQsFADAXMRUwEwYD
-VQQDDAxUZXN0IFJvb3QgQ0EwHhcNMTUwNDA2MTYxODQxWhcNMjUwNDAzMTYxODQx
-WjBgMQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwN
-TW91bnRhaW4gVmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJbG9jYWxo
-b3N0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAr2qipeeRAZfe+FMY
-rw34RgEWiF+TlCDvUVYvfGGFzBKCBgvSHFLXxcjDc6smkd9B87JYbEK7p5dyfb6H
-mQFPc4f46+ZFvzyhS9AzHqClBE6AxQr2Wi2aCZY0WfIGcT2e/qgZv0Wp3CDI5psH
-Hv7/q8Ie5P4LdUm8oRu8A/vEs8QvQAWEcIvUW7inX2fin6aL1NrkT4vCWMUptna4
-GQrOABFRYiI74JDb9q5/d8Mf25U9H+J7Hu6BW6HnEhU91NR7tT/DGT/7SxH4Yz1n
-P3orRIiCnQVVTDEHDtYUF6Wywk53VYZmDjndfPhv4ZJLsMp4oLQyiPJEEBs+uHpt
-PbgrAwIDAQABo4GGMIGDMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFIeiCUyMhFfR
-SjA1U4wdBAEYIRXKMB8GA1UdIwQYMBaAFLz3MNE8wPJ5+u+fyWxck/OKaKuDMB0G
-A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAUBgNVHREEDTALgglsb2NhbGhv
-c3QwDQYJKoZIhvcNAQELBQADggEBAJ83LsH5fQnWlFIJvfGy9z5nbhALZcsOxOfM
-9yWfAcDhQWXrvWH4ib5zKa0HFZiJ6vB31o4gNSsO82QF8vAgc1YjDVHZGbWozKSH
-u2Mv0eBS0F6uk8eQgXg21OalzNvGvq8XW4CDNCst3B7zTKAEcPSqkB0IZSBU4TJf
-gBI+dqobuS+nNlSZo0XkQxsIFxGB0DIdaMLRsTMEkpVjuCYYeRKrdxSAWEqKpE7s
-LgcCIt5nkgNUDzFuFapTakBb0AROydyjKgtSyYuSm/RKERvowdpUm1ysYoXOrJo9
-DvVMvp1TWz67wKL+p7IQ6wLVzuqGBW53wyMtRcE3mHtsiROSlYs=
+MIIDxTCCAq2gAwIBAgIBBzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3
+MTA0NloXDTI3MDYwMzE3MTA0NlowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKv9yw8fZbk+dLgSLTYUqEE9Ye4OEXgvgqQMBF77SIJTSVExyUESBUJ5
+9ozbRB8+eE0m1+snQxUPec/j+IhkcNBeVaBdEYhimrLKyY3engvZUGuXbOqtYpZh
+mpA9FmiQVQZgim6OqkXVOHlnPZ0NaWpvnyBSc/J74ezACZMc06YRdhCNGOgBJLgs
+pzXVlmYWZBpLqHzy/7IZgrv6yziRsfajFEfQ5K6LJc9Z/0+X26sDoihtpjYI+AnG
+XoKf//4j3wgLaF5vv9NyJrEWTCuM75KY55vY0JCDh3Fw8YiFCY87Zms6DD7+6229
++5DcfzQWWzj5WA+ajwRDdUv5rnNeju0CAwEAAaOBhjCBgzAMBgNVHRMBAf8EAjAA
+MB0GA1UdDgQWBBT9yxhmGms0L/f0JtA3El1LcJOHzTAfBgNVHSMEGDAWgBSbJguK
+mKm7HbkfHOMaQDPtjheIqzAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+FAYDVR0RBA0wC4IJbG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4IBAQBfnbYiSH3N
+ao74Bp9kmPCiZhtHKF2XjP02OL8O7tk8RYZbr28Ssr5VEOVNuRDzHu1m7fN7W8Po
+kDpXJttRiR6ey3gw+fmiQNpluu1lw3WzRUO+iOM3QXUClsDrSdVial9xkCCtiil+
+hFaq8yR/N6aBiVZU4vvpJ+feruEK/rZ+zC5pnPiM82QJo6JimU//Hbtas4t+ikYF
+bDIfRFbez7G3Mw2y+Qh2PY5K9Hcbh5auSaBGsJf4DSYm03A5nHbrbtwOOPbX/sP8
+/k9BP4E80tqKijlw2gTvvjkPWl/XLijdrubiUo9VclGtUcaLSBe8E6UZGfZw8xJs
+UkWxbIyqsUnu
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/name_constraint_bad.pem b/net/data/ssl/certificates/name_constraint_bad.pem
index 9ee785dc..f311771 100644
--- a/net/data/ssl/certificates/name_constraint_bad.pem
+++ b/net/data/ssl/certificates/name_constraint_bad.pem
@@ -1,109 +1,111 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDD5m1zsjUwajot
-NE67oL3Ln1Gj5dOIy85u4iS4bA29+3VCpDpFSb8q+atKgK4VM4H41gZ4ilk6T4Nw
-bh0z9PDQBIH8s5Yd0Xkqf3Ji0SDRsqBn+kQ2BXKHjup34lQrCgJ2BPoqle9Aj+Jd
-Z2mjnCB2C5E8it8BYziraCdsXLC8wRBDoWFi6laPMuEd910uTaav4/MZ3y6SBJLm
-+Q0URXm5d5msqK7KuAVlgYDdnzS1iRNiGH2fPU/NHw1NMsJyM5b3MEwu72YDzmxS
-9QTpAp5vVPxKbMIhGqkVZpcfEVkB4FMZYueAJtr761dUhzZSSGoB3/D54cghc6ly
-9HySHvFDAgMBAAECggEAfp4WClyZwlQ2i/cuGFm5sr2j7/JhOh64q7ShFU5Jx4ya
-6trpCtWyqN08mGf5nJxxGluDTS/moii4hNe3KljbuSfguGt+0IEO9qfvT+1pcAAr
-a2k34068CuAVrizsR/EtTAjFhPbp7+nP3p0zi1sjJAkv81iy8NunyioEqSZz2Vsw
-ngPFuJeytOgeczoE69yzP1L0BaM46jOKXezXahC31lwtG+U5tLvElU0b/To/7GTg
-+u5qnsJ87wHYkOctXvqH+L1JeMkc7RWCo0h4Kbk3ur1kDokjqUV4FGQSaMyIy0PC
-ndk9WZhUV03v+Lsy3gzBM8261HOiTSMRz/+KrYqAOQKBgQD6ET0Hm11FIUFSeM/I
-Dbxb41oN4ODl4YUgGk/9jPX8/ztvrGddh3VGWD4KUVNlWLioBX/t7FH5paGtd6tg
-ZG8X3n48DaJ5h4u95ulAzcVjrkF4aNahy4aMmofdpe4S3+7HwlBcfIocO9WpAtL0
-pzFjlXivLQgUQow67tbG2dYrPQKBgQDIjDWWSqn6kB1zFyI6Hh9HhfFAKCRvCIzQ
-OvqIOCtExP4U4mE0rUY7RWkFrRTDoMmYCwRuCohL1C4p6i/2AwK1mhS8OgPji7YV
-zgYZuw2lSmp1lqzRmiLaOZxLcEKWlHQ1C9Sq606T7YAhgXi3tDfQ53gb1uFDvt1h
-rE3AkU1WfwKBgHZ2EBk4aljDRjSRcqzshNxquVB1xVRhHzV0AYy1aBpvtnJSk6zk
-7JNkXg95My6BdwhxgobtOnAvHIYWeKLzMQV3qwk71EoKAhL1/m1qjSWJeQ5Xa8W9
-qoGU+uPvJPbgCjerP3JwtORnG/Iymki3o1fviPpDNN6UH+YTGr+cli5pAoGBAKnT
-4gU1kR/4LpgpvPhOTdq5mITl+YR1Txl++G2mcy23TBrPYdXD7jd/HeKKoYzQeibh
-HY06KhVcxwMDqD3CaubyZiDHWEe3Jijs4MmlV3bjv6d4Qzz0NBNsuehAVoNBj+7j
-5+IdhdtLQjgddebLHIExosqgev5tgPeXe/hYk49tAoGBALENmfF8ORreFf+aOd4+
-w/CZB2VaN4p0N6I+w2HPRRJO6Rhk0Pe6NtPkxbUS0x/cm+WOpvSbntH1DOjigL8e
-mo+n2Ym+lrtYmEtB/M2C1k29pwaGYMfEIP3URUuYNEpWvTs6AOY7Sp5QN/X/v9ES
-76pTvCiginWRyEeR+6vrDGM8
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0v9KXM+UTW3dl
+vXMadSibR1nmtzDoRjNtWFvaHwr/5OQt8h34iehkLvbDzdejjtf3zefYDhDD51bS
+/OXm007i/4JNGGOHsKPe2u8KN3ustbdDzvIHOd8U6cOkQT5+aEc0m3thxBjmE86z
+tKbgugPu5OvnqvRtvpdbqgaXUAHQeLjWkrDk4rlDiLWuFGR9UnDUBRwJJdXiT8mo
+gttBMcO+RG8L1P2/we7ZYr87j7UAyNHfXUoTrXHkS1/R2XJMg9iTQL9szS9mDgTW
+uUMoJMkl/Vlw/j3yqQpOwpvE3p5XXl0WJeZ4tkRJKZ32v3T7hdYN8WVY8ivWjxBJ
+yAAtiOItAgMBAAECggEAXuyGumXEnl/g2oueEX0J8FKOgj4e7z0+8OQAiRLYgf9B
+XmfTGZ3DcCnB6p8F6p2wCjIW2j64y0mJLZEnZAwBV/F8CuUOEErSJM2x0BnHV7Kv
+JmtebDEWWTNTTcX9/gDhtF0bdQK5WMt6OKJdKZRHUITk52u+pov7jWZDw99+tG5w
+InCv1RekWbAGZWLs9hyzpOpvp0tGM2O9+XCWQh/LLeLb5rJkTcH8NKv9Xh+tLeSU
+i/FER+rQHsMVA4uHdBmRgPsBnPrJopcKWQImRXDGidEd5AUWLIECQdnZI8pbtmjV
+0HZj+UuUlDFdALmCHX+NxR4Z+hyi+E96ZWw/J9FHwQKBgQDYX0e873Sf4tDOn0cZ
+Olof3cXPri8ezKoeAD8tfY0bxLIoOwDUtJXZeGEZD3sduDJDCdvS1M/eeW04ePlx
+kTmcDecaYm4t3KYzbPauudbMQEQFvsoivp8ct/synPcRtGPTHg+GUHaqWT1d4DjT
+WClxx67ugD/YQYs5UY/uLjm4tQKBgQDV2lh1Uk3xBj15FZrzg/7GM7bK3L/Xcxzz
+VewAksKuVEyoqHfZAo6P/xOiQkwc9kBoet43MiNyph/kYssQowE+Pg+WffB1Ve4F
+kVsq6z1mwAfnYD6m4GHxfrV6VxwM3ItiX+PiKQ4YWsbyjc/vC4ZRSarLwbk8Woya
+lNucr2hGmQKBgF5sdioFdaewm98Psz9XL61oYsLXCMkwF60v/mIjwEi19emIljw8
+8ogM+JKvJtM5ZvXKf5vqMyyrYPacFH9zGOj5SDlDa0GoYP9gNebaQtqv0P+Q2zV+
+aoFl6MGVrlyTlFy1aaD7zE1a1GT7TNEuUCfPNI/wd+wv7kn9RgpzMc1hAoGBAJrh
+5Zkq/+olc9ZDcJMXsSkJgUURdhvrcjdGroOHx1oNEexA/3P7ZxchTa4ByDBdpS5G
+drSRKp05dfWqG5o0BI140z9SfRnuH1KHAPlnoHPPdqn7ycSA1E7cT0GI33btMEIS
+YvCEfYHkFRzM2qEtvp0W9o1WA/uTNSwrzZaAb8xZAoGAZZLwniPa8zkd+4WAPSN6
+LVj+1dGasfL/zftFhVxu0/KCpdggghG26Ej0ieG71k8Xg9tpZDJvo9Kj0s8Hu4Zu
+TnhwwRVyUHls+Gl0t8XXV/ryRLHB8zY45k6A+Yvc/iOYQVmY2rE4kB4PDsrJ+d5P
+wA1o1OPvcx28oBjHViWoWJQ=
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 3 (0x3)
+        Serial Number: 5 (0x5)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Dec 21 20:35:47 2015 GMT
-            Not After : Dec 18 20:35:47 2025 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: CN=Leaf certificate
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:c3:e6:6d:73:b2:35:30:6a:3a:2d:34:4e:bb:a0:
-                    bd:cb:9f:51:a3:e5:d3:88:cb:ce:6e:e2:24:b8:6c:
-                    0d:bd:fb:75:42:a4:3a:45:49:bf:2a:f9:ab:4a:80:
-                    ae:15:33:81:f8:d6:06:78:8a:59:3a:4f:83:70:6e:
-                    1d:33:f4:f0:d0:04:81:fc:b3:96:1d:d1:79:2a:7f:
-                    72:62:d1:20:d1:b2:a0:67:fa:44:36:05:72:87:8e:
-                    ea:77:e2:54:2b:0a:02:76:04:fa:2a:95:ef:40:8f:
-                    e2:5d:67:69:a3:9c:20:76:0b:91:3c:8a:df:01:63:
-                    38:ab:68:27:6c:5c:b0:bc:c1:10:43:a1:61:62:ea:
-                    56:8f:32:e1:1d:f7:5d:2e:4d:a6:af:e3:f3:19:df:
-                    2e:92:04:92:e6:f9:0d:14:45:79:b9:77:99:ac:a8:
-                    ae:ca:b8:05:65:81:80:dd:9f:34:b5:89:13:62:18:
-                    7d:9f:3d:4f:cd:1f:0d:4d:32:c2:72:33:96:f7:30:
-                    4c:2e:ef:66:03:ce:6c:52:f5:04:e9:02:9e:6f:54:
-                    fc:4a:6c:c2:21:1a:a9:15:66:97:1f:11:59:01:e0:
-                    53:19:62:e7:80:26:da:fb:eb:57:54:87:36:52:48:
-                    6a:01:df:f0:f9:e1:c8:21:73:a9:72:f4:7c:92:1e:
-                    f1:43
+                    00:b4:bf:d2:97:33:e5:13:5b:77:65:bd:73:1a:75:
+                    28:9b:47:59:e6:b7:30:e8:46:33:6d:58:5b:da:1f:
+                    0a:ff:e4:e4:2d:f2:1d:f8:89:e8:64:2e:f6:c3:cd:
+                    d7:a3:8e:d7:f7:cd:e7:d8:0e:10:c3:e7:56:d2:fc:
+                    e5:e6:d3:4e:e2:ff:82:4d:18:63:87:b0:a3:de:da:
+                    ef:0a:37:7b:ac:b5:b7:43:ce:f2:07:39:df:14:e9:
+                    c3:a4:41:3e:7e:68:47:34:9b:7b:61:c4:18:e6:13:
+                    ce:b3:b4:a6:e0:ba:03:ee:e4:eb:e7:aa:f4:6d:be:
+                    97:5b:aa:06:97:50:01:d0:78:b8:d6:92:b0:e4:e2:
+                    b9:43:88:b5:ae:14:64:7d:52:70:d4:05:1c:09:25:
+                    d5:e2:4f:c9:a8:82:db:41:31:c3:be:44:6f:0b:d4:
+                    fd:bf:c1:ee:d9:62:bf:3b:8f:b5:00:c8:d1:df:5d:
+                    4a:13:ad:71:e4:4b:5f:d1:d9:72:4c:83:d8:93:40:
+                    bf:6c:cd:2f:66:0e:04:d6:b9:43:28:24:c9:25:fd:
+                    59:70:fe:3d:f2:a9:0a:4e:c2:9b:c4:de:9e:57:5e:
+                    5d:16:25:e6:78:b6:44:49:29:9d:f6:bf:74:fb:85:
+                    d6:0d:f1:65:58:f2:2b:d6:8f:10:49:c8:00:2d:88:
+                    e2:2d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                64:AD:F5:F3:4B:2D:70:3A:13:B7:0D:D6:8F:9F:82:37:C3:58:73:A8
+                E0:DC:E0:2F:07:88:74:3A:9F:D3:30:A3:71:8A:F9:D6:A5:E5:A6:53
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 DNS:test.ExAmPlE.CoM, DNS:test.ExAmPlE.OrG
     Signature Algorithm: sha256WithRSAEncryption
-         af:4e:e7:07:29:47:e4:18:64:96:83:22:3c:21:4c:dc:41:90:
-         c9:28:5b:a7:ce:e9:ad:da:28:04:90:f6:62:c9:6c:0e:a1:98:
-         3a:19:ec:28:f5:b7:cf:07:cd:b3:0c:d0:97:a4:3d:e2:fe:0c:
-         d8:68:f4:cf:57:18:3e:58:f9:ed:1b:2f:f5:11:e4:4d:61:93:
-         b3:f3:1c:bc:53:cf:8b:81:2e:1b:a3:28:f6:df:ae:82:74:99:
-         75:62:51:3d:78:1d:65:3d:eb:0a:7b:60:0e:3a:c7:ff:57:1c:
-         a4:9e:19:66:ef:18:78:b1:d6:1f:27:31:e0:a6:a2:27:42:15:
-         2f:2a:38:e7:4a:0c:3b:8e:4d:c2:a1:27:45:32:0d:c4:b8:51:
-         70:41:a6:1a:2f:13:d0:f8:3d:fa:76:0c:57:ad:3e:86:ec:1c:
-         05:ea:81:d2:33:35:0b:1e:ab:86:2a:94:ee:44:9f:a4:1a:fe:
-         94:0c:7f:f7:e7:17:1f:cc:1c:b8:cc:5a:55:ce:b1:d8:2e:0b:
-         3d:8c:19:fc:c2:6b:da:c8:1d:b7:27:fa:bb:90:04:a6:53:bb:
-         94:7b:cb:a3:ec:80:7e:18:2e:86:aa:41:97:43:c7:25:1f:33:
-         a3:ee:93:00:c5:ec:31:da:0e:40:f2:a2:a9:39:42:a8:e1:65:
-         ed:c7:65:f0
+         92:fd:ff:16:24:68:99:2d:98:cd:7c:63:d8:89:31:a1:5b:51:
+         19:85:21:d9:2c:a0:f9:a0:40:5d:e4:a7:c5:8c:9c:fe:cd:1c:
+         8d:7e:9d:22:fb:0a:66:dc:6a:3d:e9:7a:3c:b6:51:15:f9:49:
+         4b:0b:53:a3:f4:91:0b:f5:0d:78:b5:aa:3b:11:8d:9c:d2:b8:
+         34:e2:53:07:49:d0:97:29:62:ca:6b:25:c0:ab:af:8e:a5:7c:
+         1d:7f:12:52:12:cc:00:f3:78:f8:dd:0d:a0:96:3b:7f:fd:35:
+         69:2c:23:a4:3a:fd:91:3b:c3:57:46:95:d8:a1:07:15:94:22:
+         4a:e8:09:ca:ab:3a:e9:81:3a:3a:3d:6d:90:2c:db:4f:ec:a1:
+         a3:1f:66:20:78:a8:61:55:ac:a8:f2:a5:83:1e:7f:08:98:89:
+         f2:b6:bd:a4:12:71:bd:8e:89:bf:c1:d5:11:a8:3f:4c:13:7a:
+         36:c9:6e:89:bb:d2:20:6d:7c:f2:db:3c:e5:9e:bb:12:7e:52:
+         80:fd:d2:0a:71:7a:28:ab:70:76:1c:5d:e7:22:70:1d:cf:5b:
+         15:0b:df:2f:46:18:79:01:cb:a4:86:b1:0c:e9:3a:1c:ce:58:
+         af:b7:ad:24:e4:b7:4e:7e:06:89:b6:47:49:56:9c:a6:c1:d8:
+         3a:48:e1:a7
 -----BEGIN CERTIFICATE-----
-MIIDTTCCAjWgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTUxMjIxMjAzNTQ3WhcNMjUxMjE4MjAzNTQ3WjAbMRkwFwYD
-VQQDExBMZWFmIGNlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAw+Ztc7I1MGo6LTROu6C9y59Ro+XTiMvObuIkuGwNvft1QqQ6RUm/Kvmr
-SoCuFTOB+NYGeIpZOk+DcG4dM/Tw0ASB/LOWHdF5Kn9yYtEg0bKgZ/pENgVyh47q
-d+JUKwoCdgT6KpXvQI/iXWdpo5wgdguRPIrfAWM4q2gnbFywvMEQQ6FhYupWjzLh
-HfddLk2mr+PzGd8ukgSS5vkNFEV5uXeZrKiuyrgFZYGA3Z80tYkTYhh9nz1PzR8N
-TTLCcjOW9zBMLu9mA85sUvUE6QKeb1T8SmzCIRqpFWaXHxFZAeBTGWLngCba++tX
-VIc2UkhqAd/w+eHIIXOpcvR8kh7xQwIDAQABo4GfMIGcMAwGA1UdEwEB/wQCMAAw
-HQYDVR0OBBYEFGSt9fNLLXA6E7cN1o+fgjfDWHOoMB8GA1UdIwQYMBaAFLz3MNE8
-wPJ5+u+fyWxck/OKaKuDMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAt
-BgNVHREEJjAkghB0ZXN0LkV4QW1QbEUuQ29NghB0ZXN0LkV4QW1QbEUuT3JHMA0G
-CSqGSIb3DQEBCwUAA4IBAQCvTucHKUfkGGSWgyI8IUzcQZDJKFunzumt2igEkPZi
-yWwOoZg6Gewo9bfPB82zDNCXpD3i/gzYaPTPVxg+WPntGy/1EeRNYZOz8xy8U8+L
-gS4boyj2366CdJl1YlE9eB1lPesKe2AOOsf/Vxyknhlm7xh4sdYfJzHgpqInQhUv
-KjjnSgw7jk3CoSdFMg3EuFFwQaYaLxPQ+D36dgxXrT6G7BwF6oHSMzULHquGKpTu
-RJ+kGv6UDH/35xcfzBy4zFpVzrHYLgs9jBn8wmvayB23J/q7kASmU7uUe8uj7IB+
-GC6GqkGXQ8clHzOj7pMAxewx2g5A8qKpOUKo4WXtx2Xw
+MIIDmTCCAoGgAwIBAgIBBTANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3
+MTA0NloXDTI3MDYwMzE3MTA0NlowGzEZMBcGA1UEAxMQTGVhZiBjZXJ0aWZpY2F0
+ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALS/0pcz5RNbd2W9cxp1
+KJtHWea3MOhGM21YW9ofCv/k5C3yHfiJ6GQu9sPN16OO1/fN59gOEMPnVtL85ebT
+TuL/gk0YY4ewo97a7wo3e6y1t0PO8gc53xTpw6RBPn5oRzSbe2HEGOYTzrO0puC6
+A+7k6+eq9G2+l1uqBpdQAdB4uNaSsOTiuUOIta4UZH1ScNQFHAkl1eJPyaiC20Ex
+w75EbwvU/b/B7tlivzuPtQDI0d9dShOtceRLX9HZckyD2JNAv2zNL2YOBNa5Qygk
+ySX9WXD+PfKpCk7Cm8TenldeXRYl5ni2REkpnfa/dPuF1g3xZVjyK9aPEEnIAC2I
+4i0CAwEAAaOBnzCBnDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTg3OAvB4h0Op/T
+MKNxivnWpeWmUzAfBgNVHSMEGDAWgBSbJguKmKm7HbkfHOMaQDPtjheIqzAdBgNV
+HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwLQYDVR0RBCYwJIIQdGVzdC5FeEFt
+UGxFLkNvTYIQdGVzdC5FeEFtUGxFLk9yRzANBgkqhkiG9w0BAQsFAAOCAQEAkv3/
+FiRomS2YzXxj2IkxoVtRGYUh2Syg+aBAXeSnxYyc/s0cjX6dIvsKZtxqPel6PLZR
+FflJSwtTo/SRC/UNeLWqOxGNnNK4NOJTB0nQlyliymslwKuvjqV8HX8SUhLMAPN4
++N0NoJY7f/01aSwjpDr9kTvDV0aV2KEHFZQiSugJyqs66YE6Oj1tkCzbT+yhox9m
+IHioYVWsqPKlgx5/CJiJ8ra9pBJxvY6Jv8HVEag/TBN6NsluibvSIG188ts85Z67
+En5SgP3SCnF6KKtwdhxd5yJwHc9bFQvfL0YYeQHLpIaxDOk6HM5Yr7etJOS3Tn4G
+ibZHSVacpsHYOkjhpw==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/name_constraint_good.pem b/net/data/ssl/certificates/name_constraint_good.pem
index 683deebc..3aae4c9 100644
--- a/net/data/ssl/certificates/name_constraint_good.pem
+++ b/net/data/ssl/certificates/name_constraint_good.pem
@@ -1,110 +1,112 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDD5m1zsjUwajot
-NE67oL3Ln1Gj5dOIy85u4iS4bA29+3VCpDpFSb8q+atKgK4VM4H41gZ4ilk6T4Nw
-bh0z9PDQBIH8s5Yd0Xkqf3Ji0SDRsqBn+kQ2BXKHjup34lQrCgJ2BPoqle9Aj+Jd
-Z2mjnCB2C5E8it8BYziraCdsXLC8wRBDoWFi6laPMuEd910uTaav4/MZ3y6SBJLm
-+Q0URXm5d5msqK7KuAVlgYDdnzS1iRNiGH2fPU/NHw1NMsJyM5b3MEwu72YDzmxS
-9QTpAp5vVPxKbMIhGqkVZpcfEVkB4FMZYueAJtr761dUhzZSSGoB3/D54cghc6ly
-9HySHvFDAgMBAAECggEAfp4WClyZwlQ2i/cuGFm5sr2j7/JhOh64q7ShFU5Jx4ya
-6trpCtWyqN08mGf5nJxxGluDTS/moii4hNe3KljbuSfguGt+0IEO9qfvT+1pcAAr
-a2k34068CuAVrizsR/EtTAjFhPbp7+nP3p0zi1sjJAkv81iy8NunyioEqSZz2Vsw
-ngPFuJeytOgeczoE69yzP1L0BaM46jOKXezXahC31lwtG+U5tLvElU0b/To/7GTg
-+u5qnsJ87wHYkOctXvqH+L1JeMkc7RWCo0h4Kbk3ur1kDokjqUV4FGQSaMyIy0PC
-ndk9WZhUV03v+Lsy3gzBM8261HOiTSMRz/+KrYqAOQKBgQD6ET0Hm11FIUFSeM/I
-Dbxb41oN4ODl4YUgGk/9jPX8/ztvrGddh3VGWD4KUVNlWLioBX/t7FH5paGtd6tg
-ZG8X3n48DaJ5h4u95ulAzcVjrkF4aNahy4aMmofdpe4S3+7HwlBcfIocO9WpAtL0
-pzFjlXivLQgUQow67tbG2dYrPQKBgQDIjDWWSqn6kB1zFyI6Hh9HhfFAKCRvCIzQ
-OvqIOCtExP4U4mE0rUY7RWkFrRTDoMmYCwRuCohL1C4p6i/2AwK1mhS8OgPji7YV
-zgYZuw2lSmp1lqzRmiLaOZxLcEKWlHQ1C9Sq606T7YAhgXi3tDfQ53gb1uFDvt1h
-rE3AkU1WfwKBgHZ2EBk4aljDRjSRcqzshNxquVB1xVRhHzV0AYy1aBpvtnJSk6zk
-7JNkXg95My6BdwhxgobtOnAvHIYWeKLzMQV3qwk71EoKAhL1/m1qjSWJeQ5Xa8W9
-qoGU+uPvJPbgCjerP3JwtORnG/Iymki3o1fviPpDNN6UH+YTGr+cli5pAoGBAKnT
-4gU1kR/4LpgpvPhOTdq5mITl+YR1Txl++G2mcy23TBrPYdXD7jd/HeKKoYzQeibh
-HY06KhVcxwMDqD3CaubyZiDHWEe3Jijs4MmlV3bjv6d4Qzz0NBNsuehAVoNBj+7j
-5+IdhdtLQjgddebLHIExosqgev5tgPeXe/hYk49tAoGBALENmfF8ORreFf+aOd4+
-w/CZB2VaN4p0N6I+w2HPRRJO6Rhk0Pe6NtPkxbUS0x/cm+WOpvSbntH1DOjigL8e
-mo+n2Ym+lrtYmEtB/M2C1k29pwaGYMfEIP3URUuYNEpWvTs6AOY7Sp5QN/X/v9ES
-76pTvCiginWRyEeR+6vrDGM8
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0v9KXM+UTW3dl
+vXMadSibR1nmtzDoRjNtWFvaHwr/5OQt8h34iehkLvbDzdejjtf3zefYDhDD51bS
+/OXm007i/4JNGGOHsKPe2u8KN3ustbdDzvIHOd8U6cOkQT5+aEc0m3thxBjmE86z
+tKbgugPu5OvnqvRtvpdbqgaXUAHQeLjWkrDk4rlDiLWuFGR9UnDUBRwJJdXiT8mo
+gttBMcO+RG8L1P2/we7ZYr87j7UAyNHfXUoTrXHkS1/R2XJMg9iTQL9szS9mDgTW
+uUMoJMkl/Vlw/j3yqQpOwpvE3p5XXl0WJeZ4tkRJKZ32v3T7hdYN8WVY8ivWjxBJ
+yAAtiOItAgMBAAECggEAXuyGumXEnl/g2oueEX0J8FKOgj4e7z0+8OQAiRLYgf9B
+XmfTGZ3DcCnB6p8F6p2wCjIW2j64y0mJLZEnZAwBV/F8CuUOEErSJM2x0BnHV7Kv
+JmtebDEWWTNTTcX9/gDhtF0bdQK5WMt6OKJdKZRHUITk52u+pov7jWZDw99+tG5w
+InCv1RekWbAGZWLs9hyzpOpvp0tGM2O9+XCWQh/LLeLb5rJkTcH8NKv9Xh+tLeSU
+i/FER+rQHsMVA4uHdBmRgPsBnPrJopcKWQImRXDGidEd5AUWLIECQdnZI8pbtmjV
+0HZj+UuUlDFdALmCHX+NxR4Z+hyi+E96ZWw/J9FHwQKBgQDYX0e873Sf4tDOn0cZ
+Olof3cXPri8ezKoeAD8tfY0bxLIoOwDUtJXZeGEZD3sduDJDCdvS1M/eeW04ePlx
+kTmcDecaYm4t3KYzbPauudbMQEQFvsoivp8ct/synPcRtGPTHg+GUHaqWT1d4DjT
+WClxx67ugD/YQYs5UY/uLjm4tQKBgQDV2lh1Uk3xBj15FZrzg/7GM7bK3L/Xcxzz
+VewAksKuVEyoqHfZAo6P/xOiQkwc9kBoet43MiNyph/kYssQowE+Pg+WffB1Ve4F
+kVsq6z1mwAfnYD6m4GHxfrV6VxwM3ItiX+PiKQ4YWsbyjc/vC4ZRSarLwbk8Woya
+lNucr2hGmQKBgF5sdioFdaewm98Psz9XL61oYsLXCMkwF60v/mIjwEi19emIljw8
+8ogM+JKvJtM5ZvXKf5vqMyyrYPacFH9zGOj5SDlDa0GoYP9gNebaQtqv0P+Q2zV+
+aoFl6MGVrlyTlFy1aaD7zE1a1GT7TNEuUCfPNI/wd+wv7kn9RgpzMc1hAoGBAJrh
+5Zkq/+olc9ZDcJMXsSkJgUURdhvrcjdGroOHx1oNEexA/3P7ZxchTa4ByDBdpS5G
+drSRKp05dfWqG5o0BI140z9SfRnuH1KHAPlnoHPPdqn7ycSA1E7cT0GI33btMEIS
+YvCEfYHkFRzM2qEtvp0W9o1WA/uTNSwrzZaAb8xZAoGAZZLwniPa8zkd+4WAPSN6
+LVj+1dGasfL/zftFhVxu0/KCpdggghG26Ej0ieG71k8Xg9tpZDJvo9Kj0s8Hu4Zu
+TnhwwRVyUHls+Gl0t8XXV/ryRLHB8zY45k6A+Yvc/iOYQVmY2rE4kB4PDsrJ+d5P
+wA1o1OPvcx28oBjHViWoWJQ=
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 4 (0x4)
+        Serial Number: 6 (0x6)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Dec 21 20:35:47 2015 GMT
-            Not After : Dec 18 20:35:47 2025 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: CN=Leaf Certificate
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:c3:e6:6d:73:b2:35:30:6a:3a:2d:34:4e:bb:a0:
-                    bd:cb:9f:51:a3:e5:d3:88:cb:ce:6e:e2:24:b8:6c:
-                    0d:bd:fb:75:42:a4:3a:45:49:bf:2a:f9:ab:4a:80:
-                    ae:15:33:81:f8:d6:06:78:8a:59:3a:4f:83:70:6e:
-                    1d:33:f4:f0:d0:04:81:fc:b3:96:1d:d1:79:2a:7f:
-                    72:62:d1:20:d1:b2:a0:67:fa:44:36:05:72:87:8e:
-                    ea:77:e2:54:2b:0a:02:76:04:fa:2a:95:ef:40:8f:
-                    e2:5d:67:69:a3:9c:20:76:0b:91:3c:8a:df:01:63:
-                    38:ab:68:27:6c:5c:b0:bc:c1:10:43:a1:61:62:ea:
-                    56:8f:32:e1:1d:f7:5d:2e:4d:a6:af:e3:f3:19:df:
-                    2e:92:04:92:e6:f9:0d:14:45:79:b9:77:99:ac:a8:
-                    ae:ca:b8:05:65:81:80:dd:9f:34:b5:89:13:62:18:
-                    7d:9f:3d:4f:cd:1f:0d:4d:32:c2:72:33:96:f7:30:
-                    4c:2e:ef:66:03:ce:6c:52:f5:04:e9:02:9e:6f:54:
-                    fc:4a:6c:c2:21:1a:a9:15:66:97:1f:11:59:01:e0:
-                    53:19:62:e7:80:26:da:fb:eb:57:54:87:36:52:48:
-                    6a:01:df:f0:f9:e1:c8:21:73:a9:72:f4:7c:92:1e:
-                    f1:43
+                    00:b4:bf:d2:97:33:e5:13:5b:77:65:bd:73:1a:75:
+                    28:9b:47:59:e6:b7:30:e8:46:33:6d:58:5b:da:1f:
+                    0a:ff:e4:e4:2d:f2:1d:f8:89:e8:64:2e:f6:c3:cd:
+                    d7:a3:8e:d7:f7:cd:e7:d8:0e:10:c3:e7:56:d2:fc:
+                    e5:e6:d3:4e:e2:ff:82:4d:18:63:87:b0:a3:de:da:
+                    ef:0a:37:7b:ac:b5:b7:43:ce:f2:07:39:df:14:e9:
+                    c3:a4:41:3e:7e:68:47:34:9b:7b:61:c4:18:e6:13:
+                    ce:b3:b4:a6:e0:ba:03:ee:e4:eb:e7:aa:f4:6d:be:
+                    97:5b:aa:06:97:50:01:d0:78:b8:d6:92:b0:e4:e2:
+                    b9:43:88:b5:ae:14:64:7d:52:70:d4:05:1c:09:25:
+                    d5:e2:4f:c9:a8:82:db:41:31:c3:be:44:6f:0b:d4:
+                    fd:bf:c1:ee:d9:62:bf:3b:8f:b5:00:c8:d1:df:5d:
+                    4a:13:ad:71:e4:4b:5f:d1:d9:72:4c:83:d8:93:40:
+                    bf:6c:cd:2f:66:0e:04:d6:b9:43:28:24:c9:25:fd:
+                    59:70:fe:3d:f2:a9:0a:4e:c2:9b:c4:de:9e:57:5e:
+                    5d:16:25:e6:78:b6:44:49:29:9d:f6:bf:74:fb:85:
+                    d6:0d:f1:65:58:f2:2b:d6:8f:10:49:c8:00:2d:88:
+                    e2:2d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                64:AD:F5:F3:4B:2D:70:3A:13:B7:0D:D6:8F:9F:82:37:C3:58:73:A8
+                E0:DC:E0:2F:07:88:74:3A:9F:D3:30:A3:71:8A:F9:D6:A5:E5:A6:53
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 DNS:test.ExAmPlE.CoM, DNS:example.notarealtld, DNS:*.test2.ExAmPlE.CoM, DNS:*.example2.notarealtld
     Signature Algorithm: sha256WithRSAEncryption
-         22:eb:19:0b:53:ae:ac:05:af:4f:70:28:c5:ae:8b:c4:6e:d7:
-         2a:7a:58:a4:44:7b:46:be:6e:01:6c:b6:d0:15:48:51:10:c7:
-         27:ae:8a:de:52:82:91:70:36:dd:d7:55:ac:52:b2:c8:33:53:
-         fc:a1:e3:c1:80:6b:e6:46:fb:9c:0d:09:bf:91:c2:ee:25:77:
-         39:69:7c:d2:f1:95:f0:2d:1e:fd:52:eb:1a:38:60:34:db:f4:
-         43:a2:18:a9:b7:25:14:53:1a:1f:42:97:ab:25:7c:bb:25:88:
-         56:fe:ac:d3:6f:5c:fe:90:e4:99:83:91:74:c0:dc:bb:a2:54:
-         91:16:dd:d9:12:a5:22:6f:7a:1e:18:ab:54:63:18:4d:79:7c:
-         cb:16:78:04:2c:4d:32:13:2c:21:30:c9:22:b3:c7:41:7d:85:
-         0f:9f:91:13:88:dd:b6:35:2e:de:a4:b7:72:d3:a0:f1:64:1c:
-         30:b9:65:9e:4f:f3:5b:2b:7d:42:7b:7c:21:54:bf:c2:b0:02:
-         2f:4e:10:2d:40:11:08:70:36:5c:66:e9:b6:3b:6a:9f:dd:7f:
-         f9:42:04:d0:8c:3c:93:54:5d:9f:d2:34:c4:67:d7:7c:ee:3f:
-         22:4f:71:86:af:b1:79:6f:00:b4:65:60:58:ed:ef:16:cd:e5:
-         97:e0:b8:49
+         0e:29:bf:01:d0:62:9a:8d:ca:d5:3b:2a:9e:58:06:70:87:61:
+         96:bc:0e:82:15:4d:98:82:b6:09:0a:22:91:29:ba:7a:17:78:
+         9b:5d:fb:4b:d6:2d:75:4c:bb:75:ea:3f:23:0c:01:43:2c:26:
+         75:22:05:cc:ac:36:8b:53:b3:ac:f1:4a:08:f5:da:d4:4a:4c:
+         35:ae:10:f2:85:12:0f:60:b0:f3:25:8d:30:04:36:59:3e:66:
+         c9:dc:f9:36:4f:dc:71:c5:bb:f3:0b:7a:8b:1c:a8:38:45:fb:
+         cf:46:8c:df:f5:18:92:c0:4f:ac:f3:8c:30:81:a9:05:63:b1:
+         2a:64:d9:25:01:61:53:24:09:0e:51:6b:6e:0c:85:03:b4:23:
+         95:1e:5a:9c:a9:f3:83:c0:2a:8b:a2:97:03:be:ff:6d:4d:9b:
+         c4:8a:e2:d8:88:58:d4:73:32:3e:6a:33:69:2c:5d:d7:b5:97:
+         bb:71:df:5f:1d:d7:1a:8b:e6:00:c8:38:65:f0:ad:24:47:5a:
+         d3:b5:fd:23:e3:61:8a:89:05:7f:07:95:b3:41:61:41:b0:38:
+         c8:a8:ef:90:5b:34:00:81:86:13:e1:4d:1f:f7:29:f2:25:4d:
+         4d:1b:2b:8e:58:75:c6:54:3b:5f:eb:13:09:56:f0:42:cc:16:
+         d2:12:d7:e5
 -----BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTUxMjIxMjAzNTQ3WhcNMjUxMjE4MjAzNTQ3WjAbMRkwFwYD
-VQQDExBMZWFmIENlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAw+Ztc7I1MGo6LTROu6C9y59Ro+XTiMvObuIkuGwNvft1QqQ6RUm/Kvmr
-SoCuFTOB+NYGeIpZOk+DcG4dM/Tw0ASB/LOWHdF5Kn9yYtEg0bKgZ/pENgVyh47q
-d+JUKwoCdgT6KpXvQI/iXWdpo5wgdguRPIrfAWM4q2gnbFywvMEQQ6FhYupWjzLh
-HfddLk2mr+PzGd8ukgSS5vkNFEV5uXeZrKiuyrgFZYGA3Z80tYkTYhh9nz1PzR8N
-TTLCcjOW9zBMLu9mA85sUvUE6QKeb1T8SmzCIRqpFWaXHxFZAeBTGWLngCba++tX
-VIc2UkhqAd/w+eHIIXOpcvR8kh7xQwIDAQABo4HPMIHMMAwGA1UdEwEB/wQCMAAw
-HQYDVR0OBBYEFGSt9fNLLXA6E7cN1o+fgjfDWHOoMB8GA1UdIwQYMBaAFLz3MNE8
-wPJ5+u+fyWxck/OKaKuDMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjBd
-BgNVHREEVjBUghB0ZXN0LkV4QW1QbEUuQ29NghNleGFtcGxlLm5vdGFyZWFsdGxk
-ghMqLnRlc3QyLkV4QW1QbEUuQ29NghYqLmV4YW1wbGUyLm5vdGFyZWFsdGxkMA0G
-CSqGSIb3DQEBCwUAA4IBAQAi6xkLU66sBa9PcCjFrovEbtcqelikRHtGvm4BbLbQ
-FUhREMcnroreUoKRcDbd11WsUrLIM1P8oePBgGvmRvucDQm/kcLuJXc5aXzS8ZXw
-LR79UusaOGA02/RDohiptyUUUxofQperJXy7JYhW/qzTb1z+kOSZg5F0wNy7olSR
-Ft3ZEqUib3oeGKtUYxhNeXzLFngELE0yEywhMMkis8dBfYUPn5ETiN22NS7epLdy
-06DxZBwwuWWeT/NbK31Ce3whVL/CsAIvThAtQBEIcDZcZum2O2qf3X/5QgTQjDyT
-VF2f0jTEZ9d87j8iT3GGr7F5bwC0ZWBY7e8WzeWX4LhJ
+MIIDyTCCArGgAwIBAgIBBjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3
+MTA0NloXDTI3MDYwMzE3MTA0NlowGzEZMBcGA1UEAxMQTGVhZiBDZXJ0aWZpY2F0
+ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALS/0pcz5RNbd2W9cxp1
+KJtHWea3MOhGM21YW9ofCv/k5C3yHfiJ6GQu9sPN16OO1/fN59gOEMPnVtL85ebT
+TuL/gk0YY4ewo97a7wo3e6y1t0PO8gc53xTpw6RBPn5oRzSbe2HEGOYTzrO0puC6
+A+7k6+eq9G2+l1uqBpdQAdB4uNaSsOTiuUOIta4UZH1ScNQFHAkl1eJPyaiC20Ex
+w75EbwvU/b/B7tlivzuPtQDI0d9dShOtceRLX9HZckyD2JNAv2zNL2YOBNa5Qygk
+ySX9WXD+PfKpCk7Cm8TenldeXRYl5ni2REkpnfa/dPuF1g3xZVjyK9aPEEnIAC2I
+4i0CAwEAAaOBzzCBzDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBTg3OAvB4h0Op/T
+MKNxivnWpeWmUzAfBgNVHSMEGDAWgBSbJguKmKm7HbkfHOMaQDPtjheIqzAdBgNV
+HSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwXQYDVR0RBFYwVIIQdGVzdC5FeEFt
+UGxFLkNvTYITZXhhbXBsZS5ub3RhcmVhbHRsZIITKi50ZXN0Mi5FeEFtUGxFLkNv
+TYIWKi5leGFtcGxlMi5ub3RhcmVhbHRsZDANBgkqhkiG9w0BAQsFAAOCAQEADim/
+AdBimo3K1TsqnlgGcIdhlrwOghVNmIK2CQoikSm6ehd4m137S9YtdUy7deo/IwwB
+QywmdSIFzKw2i1OzrPFKCPXa1EpMNa4Q8oUSD2Cw8yWNMAQ2WT5mydz5Nk/cccW7
+8wt6ixyoOEX7z0aM3/UYksBPrPOMMIGpBWOxKmTZJQFhUyQJDlFrbgyFA7QjlR5a
+nKnzg8Aqi6KXA77/bU2bxIri2IhY1HMyPmozaSxd17WXu3HfXx3XGovmAMg4ZfCt
+JEda07X9I+NhiokFfweVs0FhQbA4yKjvkFs0AIGGE+FNH/cp8iVNTRsrjlh1xlQ7
+X+sTCVbwQswW0hLX5Q==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/ok_cert.pem b/net/data/ssl/certificates/ok_cert.pem
index 82239d0..a594b8e 100644
--- a/net/data/ssl/certificates/ok_cert.pem
+++ b/net/data/ssl/certificates/ok_cert.pem
@@ -1,110 +1,112 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC1+PQy2PX0Zcrp
-0Mvd6ZehbpDi9LKyFtCb4plX7XvGW29JwZQAqQ1dtTX0Ons8GAajeFpo/6YFH30Q
-CK4JbNzv3biXnmzOy6DcMysele8d+9Pa+D5X7YuOnoZNEqYMMCPvCEVPIRJCiIcB
-2KUyn7c472Ctt0drO0umXCtWclzRtTiHmew7/8YC74Y47uIFxvBm4hiRUOVXIyeZ
-u9tJJIhmqBSWfhptKuH/GPVqN9KIqHnJuVD1mmgLBJ5oAh2hceCJFboqSAZ6eNPR
-DHeDmIP4ueJgIJIHm9TIwPpaWp0mQMI1ZQDzoOLTIU2lxJGIkBSnXvcTt+oror3X
-hBgat3tdAgMBAAECggEABykz2uhkzWhQEuFvlF0D5YtnUjcU7SMutGO3axliXIzu
-lTVz8I62gvCFngXLIbNEV5x92lHtI5h4oG/nAWHyU9Ii2HyYhY7H1sKAuORnk4N8
-c8p/EZC8hDFC0behJyuhzl9B8vo3ML0UqwLuhU55tFjfMhbbTaH4uSQ5ZF59vpbV
-BLe+j3+0BWINSi65KrE/V9PAlH0IuSir4YYuFcJApZIMdiXGqb1mnnUn4CkMmmeH
-JvRaYvrxD14T/lzMVzBkR0bez5jYe7syspCe+mmyqIS0mTOw8rQER1vL/DHcyJsG
-inG5IazyDaCvgqNAEKzeh0AC3aoel86lURIlt/TrFQKBgQDrSKIvDDXFpYxtpJYt
-Q+gyUqN/QPwGVL39n7kSpBoFWKsP9eSGKjVfD4PJboYjE0pcoci4ohsOHmyHpaqi
-lAzy4oGd5VqEfu4qz65W7xFwZnMnxLv7OZeHzZG7nw2PIT6k57hNd0/IEndFLHZU
-zBm56Ow/Czkb4HA/IR5RQG4SywKBgQDF/qst7PVtWOm6wJ3boJNl7QasWTRKsNxg
-DkEo76dOwq2BSFTO+WYKWFPsOYrlnHbf3Ni869WB/vGwE8IecOH0Ir39plbRb2nc
-WRW13mljwTET9AGb0/nhPkduYPyN7Gjvy1DTTz5e47rk5881siU8dPCSvgygo9DO
-vy+ZlAtddwKBgQCIGa3ndTKtsAO5cNmGOZ/ZbEAzXk3rA54bVgdipxZ+PTpGs0CL
-82KIKJtdK9ff9kqvps5LL0pjMmopVUWNYgLThP7hbUidGCeBED2TABugX0MBoCX1
-Pu1OmzVPyMO5Jcvs7DWKahf2begcVYnlp2LCTeBK350baQrFGc1FxvVlXQKBgHrS
-y7/2oh1OLdgTCxoml6mAC0a5I6493sebsCJD4McED3wGsc2fewRp3M3KuHZNxJSE
-vNMdfVpiG+39o8scfZ7kOnXyTSMo+UOe48/pg/lE7DwTfzf6nKV06/z2H1WvVT2E
-I8SiAO/+V38OqkUGGQFTDbYKPW0dkjfe9BlSdGZrAoGAfbDe3biBtcMw57AKTf78
-i+dku+lnVkAmPOr1I6nnN2qGUdbXjbV2EE88BSo4OF6TF7C6dwicQuv5PxpozCRM
-NkdqZ7UT2h7JX0KybnrIvHefboG/pK/Jjg9cEBhN1P6y6+pyzWKa7Nc1c0pXRqz6
-FzMv6eiJALyDSTm0ChEm6ug=
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0v9KXM+UTW3dl
+vXMadSibR1nmtzDoRjNtWFvaHwr/5OQt8h34iehkLvbDzdejjtf3zefYDhDD51bS
+/OXm007i/4JNGGOHsKPe2u8KN3ustbdDzvIHOd8U6cOkQT5+aEc0m3thxBjmE86z
+tKbgugPu5OvnqvRtvpdbqgaXUAHQeLjWkrDk4rlDiLWuFGR9UnDUBRwJJdXiT8mo
+gttBMcO+RG8L1P2/we7ZYr87j7UAyNHfXUoTrXHkS1/R2XJMg9iTQL9szS9mDgTW
+uUMoJMkl/Vlw/j3yqQpOwpvE3p5XXl0WJeZ4tkRJKZ32v3T7hdYN8WVY8ivWjxBJ
+yAAtiOItAgMBAAECggEAXuyGumXEnl/g2oueEX0J8FKOgj4e7z0+8OQAiRLYgf9B
+XmfTGZ3DcCnB6p8F6p2wCjIW2j64y0mJLZEnZAwBV/F8CuUOEErSJM2x0BnHV7Kv
+JmtebDEWWTNTTcX9/gDhtF0bdQK5WMt6OKJdKZRHUITk52u+pov7jWZDw99+tG5w
+InCv1RekWbAGZWLs9hyzpOpvp0tGM2O9+XCWQh/LLeLb5rJkTcH8NKv9Xh+tLeSU
+i/FER+rQHsMVA4uHdBmRgPsBnPrJopcKWQImRXDGidEd5AUWLIECQdnZI8pbtmjV
+0HZj+UuUlDFdALmCHX+NxR4Z+hyi+E96ZWw/J9FHwQKBgQDYX0e873Sf4tDOn0cZ
+Olof3cXPri8ezKoeAD8tfY0bxLIoOwDUtJXZeGEZD3sduDJDCdvS1M/eeW04ePlx
+kTmcDecaYm4t3KYzbPauudbMQEQFvsoivp8ct/synPcRtGPTHg+GUHaqWT1d4DjT
+WClxx67ugD/YQYs5UY/uLjm4tQKBgQDV2lh1Uk3xBj15FZrzg/7GM7bK3L/Xcxzz
+VewAksKuVEyoqHfZAo6P/xOiQkwc9kBoet43MiNyph/kYssQowE+Pg+WffB1Ve4F
+kVsq6z1mwAfnYD6m4GHxfrV6VxwM3ItiX+PiKQ4YWsbyjc/vC4ZRSarLwbk8Woya
+lNucr2hGmQKBgF5sdioFdaewm98Psz9XL61oYsLXCMkwF60v/mIjwEi19emIljw8
+8ogM+JKvJtM5ZvXKf5vqMyyrYPacFH9zGOj5SDlDa0GoYP9gNebaQtqv0P+Q2zV+
+aoFl6MGVrlyTlFy1aaD7zE1a1GT7TNEuUCfPNI/wd+wv7kn9RgpzMc1hAoGBAJrh
+5Zkq/+olc9ZDcJMXsSkJgUURdhvrcjdGroOHx1oNEexA/3P7ZxchTa4ByDBdpS5G
+drSRKp05dfWqG5o0BI140z9SfRnuH1KHAPlnoHPPdqn7ycSA1E7cT0GI33btMEIS
+YvCEfYHkFRzM2qEtvp0W9o1WA/uTNSwrzZaAb8xZAoGAZZLwniPa8zkd+4WAPSN6
+LVj+1dGasfL/zftFhVxu0/KCpdggghG26Ej0ieG71k8Xg9tpZDJvo9Kj0s8Hu4Zu
+TnhwwRVyUHls+Gl0t8XXV/ryRLHB8zY45k6A+Yvc/iOYQVmY2rE4kB4PDsrJ+d5P
+wA1o1OPvcx28oBjHViWoWJQ=
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 2 (0x2)
+        Serial Number: 3 (0x3)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Aug 14 03:05:29 2014 GMT
-            Not After : Aug 11 03:05:29 2024 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b5:f8:f4:32:d8:f5:f4:65:ca:e9:d0:cb:dd:e9:
-                    97:a1:6e:90:e2:f4:b2:b2:16:d0:9b:e2:99:57:ed:
-                    7b:c6:5b:6f:49:c1:94:00:a9:0d:5d:b5:35:f4:3a:
-                    7b:3c:18:06:a3:78:5a:68:ff:a6:05:1f:7d:10:08:
-                    ae:09:6c:dc:ef:dd:b8:97:9e:6c:ce:cb:a0:dc:33:
-                    2b:1e:95:ef:1d:fb:d3:da:f8:3e:57:ed:8b:8e:9e:
-                    86:4d:12:a6:0c:30:23:ef:08:45:4f:21:12:42:88:
-                    87:01:d8:a5:32:9f:b7:38:ef:60:ad:b7:47:6b:3b:
-                    4b:a6:5c:2b:56:72:5c:d1:b5:38:87:99:ec:3b:ff:
-                    c6:02:ef:86:38:ee:e2:05:c6:f0:66:e2:18:91:50:
-                    e5:57:23:27:99:bb:db:49:24:88:66:a8:14:96:7e:
-                    1a:6d:2a:e1:ff:18:f5:6a:37:d2:88:a8:79:c9:b9:
-                    50:f5:9a:68:0b:04:9e:68:02:1d:a1:71:e0:89:15:
-                    ba:2a:48:06:7a:78:d3:d1:0c:77:83:98:83:f8:b9:
-                    e2:60:20:92:07:9b:d4:c8:c0:fa:5a:5a:9d:26:40:
-                    c2:35:65:00:f3:a0:e2:d3:21:4d:a5:c4:91:88:90:
-                    14:a7:5e:f7:13:b7:ea:2b:a2:bd:d7:84:18:1a:b7:
-                    7b:5d
+                    00:b4:bf:d2:97:33:e5:13:5b:77:65:bd:73:1a:75:
+                    28:9b:47:59:e6:b7:30:e8:46:33:6d:58:5b:da:1f:
+                    0a:ff:e4:e4:2d:f2:1d:f8:89:e8:64:2e:f6:c3:cd:
+                    d7:a3:8e:d7:f7:cd:e7:d8:0e:10:c3:e7:56:d2:fc:
+                    e5:e6:d3:4e:e2:ff:82:4d:18:63:87:b0:a3:de:da:
+                    ef:0a:37:7b:ac:b5:b7:43:ce:f2:07:39:df:14:e9:
+                    c3:a4:41:3e:7e:68:47:34:9b:7b:61:c4:18:e6:13:
+                    ce:b3:b4:a6:e0:ba:03:ee:e4:eb:e7:aa:f4:6d:be:
+                    97:5b:aa:06:97:50:01:d0:78:b8:d6:92:b0:e4:e2:
+                    b9:43:88:b5:ae:14:64:7d:52:70:d4:05:1c:09:25:
+                    d5:e2:4f:c9:a8:82:db:41:31:c3:be:44:6f:0b:d4:
+                    fd:bf:c1:ee:d9:62:bf:3b:8f:b5:00:c8:d1:df:5d:
+                    4a:13:ad:71:e4:4b:5f:d1:d9:72:4c:83:d8:93:40:
+                    bf:6c:cd:2f:66:0e:04:d6:b9:43:28:24:c9:25:fd:
+                    59:70:fe:3d:f2:a9:0a:4e:c2:9b:c4:de:9e:57:5e:
+                    5d:16:25:e6:78:b6:44:49:29:9d:f6:bf:74:fb:85:
+                    d6:0d:f1:65:58:f2:2b:d6:8f:10:49:c8:00:2d:88:
+                    e2:2d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                82:04:1D:BD:05:71:83:6F:F6:98:19:4D:4F:11:46:88:4D:9B:BF:A8
+                E0:DC:E0:2F:07:88:74:3A:9F:D3:30:A3:71:8A:F9:D6:A5:E5:A6:53
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         84:dc:10:04:8d:bd:3f:c1:3e:fb:68:4b:3f:35:e4:5d:02:eb:
-         73:e6:0e:74:16:e4:c5:30:6b:05:94:4e:9c:69:10:5e:7a:af:
-         a4:76:c6:28:a7:1a:c1:5c:7e:1d:5e:1c:5e:87:97:fe:5c:5b:
-         28:47:31:b1:79:4a:f8:36:f6:b1:52:b8:d5:ab:6b:86:ef:ec:
-         3d:ed:50:0b:40:37:65:0b:22:3a:b7:af:d4:04:36:f0:f0:d2:
-         9a:16:69:5d:8b:25:03:f6:05:87:5e:48:bd:25:15:c4:3b:6a:
-         ed:63:d8:87:55:8e:3e:1c:44:de:eb:1b:dd:c4:73:c7:a6:6a:
-         12:6d:48:d5:e5:12:6a:a8:55:26:26:0d:7e:bc:cd:71:85:b1:
-         8a:76:e4:5a:1a:c5:9c:26:bf:d7:5e:57:14:fa:b6:52:cf:85:
-         90:0a:e8:7f:69:e1:b0:94:1b:ac:64:5a:e9:38:cc:53:9e:fd:
-         c6:d4:e1:5e:9c:37:22:2e:4b:d9:81:5f:59:e1:43:a7:7b:ed:
-         a7:23:20:fd:04:91:f0:1d:4e:6c:c0:de:ab:9a:19:2b:4f:00:
-         a3:1d:58:74:c9:32:6e:ee:35:b6:33:4c:64:8d:6e:ec:a8:8e:
-         d7:33:c7:33:c6:92:8a:ce:b5:f6:5d:8e:12:52:ec:9d:0a:cf:
-         4b:3b:dd:f3
+         7a:14:44:2e:50:34:5c:0b:98:e4:5f:76:99:ba:e4:de:64:4a:
+         8c:54:be:c9:5e:0b:e0:16:ac:d7:b0:f6:fc:cc:87:66:c6:bf:
+         ed:10:37:f0:5f:1d:aa:0d:fd:83:a7:1b:6c:ec:5a:b8:be:a5:
+         30:8a:62:b8:a9:5d:ca:ee:17:8b:9d:65:76:f8:50:6f:57:57:
+         9e:49:f6:7b:01:08:fe:49:44:64:76:5c:a8:e3:6a:f8:d7:eb:
+         75:dd:05:1f:f9:9d:1f:b5:1f:76:eb:a2:d2:58:b2:ab:ba:47:
+         88:33:19:3b:de:13:a4:9b:fb:bc:7a:78:53:77:4d:1d:cb:f1:
+         4d:f5:d3:85:04:51:ec:79:53:2c:a5:63:71:22:47:51:20:b8:
+         0e:9a:2c:9f:40:d4:60:c4:d6:1d:39:fd:1e:11:f1:0b:47:c1:
+         e7:e9:68:d9:f3:00:1b:bc:ee:29:ed:14:eb:ce:ed:5c:fd:16:
+         74:33:e3:4b:90:80:f9:e8:1a:db:97:bd:06:0b:68:79:eb:cd:
+         4b:3f:00:0e:69:9e:ff:99:64:39:91:e9:12:c8:98:e6:2d:f1:
+         75:d9:bf:a1:f5:15:40:b7:93:2b:5d:98:24:da:f3:6e:8e:cb:
+         20:19:fe:27:6d:68:78:29:9c:90:ea:aa:ec:ef:bf:19:74:32:
+         e6:c9:f5:27
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBAjANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTQwODE0MDMwNTI5WhcNMjQwODExMDMwNTI5WjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtfj0Mtj19GXK6dDL3emXoW6Q4vSy
-shbQm+KZV+17xltvScGUAKkNXbU19Dp7PBgGo3haaP+mBR99EAiuCWzc7924l55s
-zsug3DMrHpXvHfvT2vg+V+2Ljp6GTRKmDDAj7whFTyESQoiHAdilMp+3OO9grbdH
-aztLplwrVnJc0bU4h5nsO//GAu+GOO7iBcbwZuIYkVDlVyMnmbvbSSSIZqgUln4a
-bSrh/xj1ajfSiKh5yblQ9ZpoCwSeaAIdoXHgiRW6KkgGenjT0Qx3g5iD+LniYCCS
-B5vUyMD6WlqdJkDCNWUA86Di0yFNpcSRiJAUp173E7fqK6K914QYGrd7XQIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUggQdvQVxg2/2mBlNTxFGiE2b
-v6gwHwYDVR0jBBgwFoAUvPcw0TzA8nn675/JbFyT84poq4MwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAITcEASNvT/BPvtoSz815F0C63PmDnQW5MUwawWUTpxpEF56r6R2xiin
-GsFcfh1eHF6Hl/5cWyhHMbF5Svg29rFSuNWra4bv7D3tUAtAN2ULIjq3r9QENvDw
-0poWaV2LJQP2BYdeSL0lFcQ7au1j2IdVjj4cRN7rG93Ec8emahJtSNXlEmqoVSYm
-DX68zXGFsYp25FoaxZwmv9deVxT6tlLPhZAK6H9p4bCUG6xkWuk4zFOe/cbU4V6c
-NyIuS9mBX1nhQ6d77acjIP0EkfAdTmzA3quaGStPAKMdWHTJMm7uNbYzTGSNbuyo
-jtczxzPGkorOtfZdjhJS7J0Kz0s73fM=
+MIIDvzCCAqegAwIBAgIBAzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3
+MTA0NloXDTI3MDYwMzE3MTA0NlowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALS/0pcz5RNbd2W9cxp1KJtHWea3MOhGM21YW9ofCv/k5C3yHfiJ6GQu
+9sPN16OO1/fN59gOEMPnVtL85ebTTuL/gk0YY4ewo97a7wo3e6y1t0PO8gc53xTp
+w6RBPn5oRzSbe2HEGOYTzrO0puC6A+7k6+eq9G2+l1uqBpdQAdB4uNaSsOTiuUOI
+ta4UZH1ScNQFHAkl1eJPyaiC20Exw75EbwvU/b/B7tlivzuPtQDI0d9dShOtceRL
+X9HZckyD2JNAv2zNL2YOBNa5QygkySX9WXD+PfKpCk7Cm8TenldeXRYl5ni2REkp
+nfa/dPuF1g3xZVjyK9aPEEnIAC2I4i0CAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFODc4C8HiHQ6n9Mwo3GK+dal5aZTMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQB6FEQuUDRcC5jkX3aZ
+uuTeZEqMVL7JXgvgFqzXsPb8zIdmxr/tEDfwXx2qDf2Dpxts7Fq4vqUwimK4qV3K
+7heLnWV2+FBvV1eeSfZ7AQj+SURkdlyo42r41+t13QUf+Z0ftR9266LSWLKrukeI
+Mxk73hOkm/u8enhTd00dy/FN9dOFBFHseVMspWNxIkdRILgOmiyfQNRgxNYdOf0e
+EfELR8Hn6WjZ8wAbvO4p7RTrzu1c/RZ0M+NLkID56Brbl70GC2h5681LPwAOaZ7/
+mWQ5kekSyJjmLfF12b+h9RVAt5MrXZgk2vNujssgGf4nbWh4KZyQ6qrs778ZdDLm
+yfUn
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/ok_cert_by_intermediate.pem b/net/data/ssl/certificates/ok_cert_by_intermediate.pem
index 73d2742e..5c92ba6f 100644
--- a/net/data/ssl/certificates/ok_cert_by_intermediate.pem
+++ b/net/data/ssl/certificates/ok_cert_by_intermediate.pem
@@ -1,30 +1,30 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQC/o1248m3ahtTW
-3Qyg28CaxDu3lQaaEdfPjdAc75ncit2HvdkOuRFpr5RXEa+LhhYIWcj+/oa6Jgn+
-8FG6FENkyGWFH8tEOfaTV5g08r8GdzYCatmZBPTiXX/b7fIUXUhysls0st/qVqvT
-iPZYRM9AM/7JtbjD4nNZDabmyVuRkkLB8lgxEuBXX5R8di3SrOfCYqKI6IPPiJ7t
-umcJYbgfWqXhdMqHGDtd0O/CRfUmJRjKmsX3YZuw+xwECgNZ14fGUWU7bnR2UOfC
-UgBaRVmOL2kdg6545QNmFT97QpPwxRqtluTnCTEOTZe1nptjeNMOyifSZCeSwt5r
-Llzwf3jZAgMBAAECggEAKxcAq+VW7hwDH4z0mfbPh/03sD/CDEKW1AR/FwKJBh3z
-UeJOPBFA6RKhuDIx1p1/tsD5gNyaTqDe/oPq3HxR6wdkTFqpyd1+pAK+JqmuajXD
-3ydHZjDHH18GsNz/4bRX5fJUr7TIxFhYqmfRfGd8cmM+lvxVXzY72XpIXPxJqqFk
-40AticFiOdMqVp/6gBBBx8TovTDnJCnvMFanNXh8qsfxwWQNS92U/OJ+uaLj1mLd
-r2pkMh5VIEzfxgWTTNsRLMOksnmLNLNQZ58UJMNfhJpjBCZ0yMw5EArolQLOyl77
-yHlAmSvZWBw216zij6TfcsBmZgdrNsF6GJ92ThwAAQKBgQDgtf8/LUoOv0OGPP8J
-Sa+1Ch+l3Lkezdx0p07hES3wNPcnh8yqLXAVt4CllaJKBJTDP5gqCZXTiLFMVwZY
-P0/NznTom/84CiEsm4EpdAUndPxM8Np+MZezch2aMlODDZEzfGOJs8Wd/a2UC9kW
-VgPIB3hBAZU+k7OSaeMu2BYq2QKBgQDaUnaO+YTJ5QKwZ94+8MI9JIyjIiZss4wk
-Qm1WgYToYUZeOQjg+iDELqlQFCahhPTiba8oovsv3BfHAkE2mMB22BccV8BwtZfg
-fG+goXbhEumYubMKNg0ST5/wVczPncBxfHCgpdg9G15vKmbV/7VEbwBM/idHiLTy
-DIYgPVb+AQKBgA4QlidYKFh/9DQEwVnNeOf1+EEjbZrV+8R5bGB9+MgeKJIa196W
-9XsGf1Dd6siDPORzqIyJCQ2ycpZ6o/UGEXKqR3r/uJvDVow6N31mu6PamKggMyzO
-4dXjgKLUH5IGWV5FnN1TmTzoUeMAUtgpDheJECfRd4vxJr41TnjyIYERAoGALJbV
-AgRyG237a537JS207hnt40+RO3g8MhejDxzq0S802P+bEZ/kW00QZXuIHEr0XN57
-/Le0x6SS8qFCQm1WOa+OoMpHUn20JDQl9E+l4Pgk331l1LsPVmMOzl4ns2uLp2H7
-+sOEc46IbfniAOj106E8FX1+9jw0gI8QQbtlbgECgYA/QsKOQnnUoikpIsKRfJ7x
-S8AERMBXLa1Q9lPtaiCF7lQSkLUfn2goSWVUCEPD6mgsbOcq2hlY9HXQaVispSrm
-aUb8tCSa/cM9Gldxl0Jt1rSW4O0H2mw6vwjihZ0MGMfM921+x95vxNylHZxp2eYZ
-vKJsYp14tT/JqNH+qQN2mQ==
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC0v9KXM+UTW3dl
+vXMadSibR1nmtzDoRjNtWFvaHwr/5OQt8h34iehkLvbDzdejjtf3zefYDhDD51bS
+/OXm007i/4JNGGOHsKPe2u8KN3ustbdDzvIHOd8U6cOkQT5+aEc0m3thxBjmE86z
+tKbgugPu5OvnqvRtvpdbqgaXUAHQeLjWkrDk4rlDiLWuFGR9UnDUBRwJJdXiT8mo
+gttBMcO+RG8L1P2/we7ZYr87j7UAyNHfXUoTrXHkS1/R2XJMg9iTQL9szS9mDgTW
+uUMoJMkl/Vlw/j3yqQpOwpvE3p5XXl0WJeZ4tkRJKZ32v3T7hdYN8WVY8ivWjxBJ
+yAAtiOItAgMBAAECggEAXuyGumXEnl/g2oueEX0J8FKOgj4e7z0+8OQAiRLYgf9B
+XmfTGZ3DcCnB6p8F6p2wCjIW2j64y0mJLZEnZAwBV/F8CuUOEErSJM2x0BnHV7Kv
+JmtebDEWWTNTTcX9/gDhtF0bdQK5WMt6OKJdKZRHUITk52u+pov7jWZDw99+tG5w
+InCv1RekWbAGZWLs9hyzpOpvp0tGM2O9+XCWQh/LLeLb5rJkTcH8NKv9Xh+tLeSU
+i/FER+rQHsMVA4uHdBmRgPsBnPrJopcKWQImRXDGidEd5AUWLIECQdnZI8pbtmjV
+0HZj+UuUlDFdALmCHX+NxR4Z+hyi+E96ZWw/J9FHwQKBgQDYX0e873Sf4tDOn0cZ
+Olof3cXPri8ezKoeAD8tfY0bxLIoOwDUtJXZeGEZD3sduDJDCdvS1M/eeW04ePlx
+kTmcDecaYm4t3KYzbPauudbMQEQFvsoivp8ct/synPcRtGPTHg+GUHaqWT1d4DjT
+WClxx67ugD/YQYs5UY/uLjm4tQKBgQDV2lh1Uk3xBj15FZrzg/7GM7bK3L/Xcxzz
+VewAksKuVEyoqHfZAo6P/xOiQkwc9kBoet43MiNyph/kYssQowE+Pg+WffB1Ve4F
+kVsq6z1mwAfnYD6m4GHxfrV6VxwM3ItiX+PiKQ4YWsbyjc/vC4ZRSarLwbk8Woya
+lNucr2hGmQKBgF5sdioFdaewm98Psz9XL61oYsLXCMkwF60v/mIjwEi19emIljw8
+8ogM+JKvJtM5ZvXKf5vqMyyrYPacFH9zGOj5SDlDa0GoYP9gNebaQtqv0P+Q2zV+
+aoFl6MGVrlyTlFy1aaD7zE1a1GT7TNEuUCfPNI/wd+wv7kn9RgpzMc1hAoGBAJrh
+5Zkq/+olc9ZDcJMXsSkJgUURdhvrcjdGroOHx1oNEexA/3P7ZxchTa4ByDBdpS5G
+drSRKp05dfWqG5o0BI140z9SfRnuH1KHAPlnoHPPdqn7ycSA1E7cT0GI33btMEIS
+YvCEfYHkFRzM2qEtvp0W9o1WA/uTNSwrzZaAb8xZAoGAZZLwniPa8zkd+4WAPSN6
+LVj+1dGasfL/zftFhVxu0/KCpdggghG26Ej0ieG71k8Xg9tpZDJvo9Kj0s8Hu4Zu
+TnhwwRVyUHls+Gl0t8XXV/ryRLHB8zY45k6A+Yvc/iOYQVmY2rE4kB4PDsrJ+d5P
+wA1o1OPvcx28oBjHViWoWJQ=
 -----END PRIVATE KEY-----
 Certificate:
     Data:
@@ -33,80 +33,80 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Intermediate CA
         Validity
-            Not Before: Dec  9 22:40:08 2016 GMT
-            Not After : Dec  7 22:40:08 2026 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:bf:a3:5d:b8:f2:6d:da:86:d4:d6:dd:0c:a0:db:
-                    c0:9a:c4:3b:b7:95:06:9a:11:d7:cf:8d:d0:1c:ef:
-                    99:dc:8a:dd:87:bd:d9:0e:b9:11:69:af:94:57:11:
-                    af:8b:86:16:08:59:c8:fe:fe:86:ba:26:09:fe:f0:
-                    51:ba:14:43:64:c8:65:85:1f:cb:44:39:f6:93:57:
-                    98:34:f2:bf:06:77:36:02:6a:d9:99:04:f4:e2:5d:
-                    7f:db:ed:f2:14:5d:48:72:b2:5b:34:b2:df:ea:56:
-                    ab:d3:88:f6:58:44:cf:40:33:fe:c9:b5:b8:c3:e2:
-                    73:59:0d:a6:e6:c9:5b:91:92:42:c1:f2:58:31:12:
-                    e0:57:5f:94:7c:76:2d:d2:ac:e7:c2:62:a2:88:e8:
-                    83:cf:88:9e:ed:ba:67:09:61:b8:1f:5a:a5:e1:74:
-                    ca:87:18:3b:5d:d0:ef:c2:45:f5:26:25:18:ca:9a:
-                    c5:f7:61:9b:b0:fb:1c:04:0a:03:59:d7:87:c6:51:
-                    65:3b:6e:74:76:50:e7:c2:52:00:5a:45:59:8e:2f:
-                    69:1d:83:ae:78:e5:03:66:15:3f:7b:42:93:f0:c5:
-                    1a:ad:96:e4:e7:09:31:0e:4d:97:b5:9e:9b:63:78:
-                    d3:0e:ca:27:d2:64:27:92:c2:de:6b:2e:5c:f0:7f:
-                    78:d9
+                    00:b4:bf:d2:97:33:e5:13:5b:77:65:bd:73:1a:75:
+                    28:9b:47:59:e6:b7:30:e8:46:33:6d:58:5b:da:1f:
+                    0a:ff:e4:e4:2d:f2:1d:f8:89:e8:64:2e:f6:c3:cd:
+                    d7:a3:8e:d7:f7:cd:e7:d8:0e:10:c3:e7:56:d2:fc:
+                    e5:e6:d3:4e:e2:ff:82:4d:18:63:87:b0:a3:de:da:
+                    ef:0a:37:7b:ac:b5:b7:43:ce:f2:07:39:df:14:e9:
+                    c3:a4:41:3e:7e:68:47:34:9b:7b:61:c4:18:e6:13:
+                    ce:b3:b4:a6:e0:ba:03:ee:e4:eb:e7:aa:f4:6d:be:
+                    97:5b:aa:06:97:50:01:d0:78:b8:d6:92:b0:e4:e2:
+                    b9:43:88:b5:ae:14:64:7d:52:70:d4:05:1c:09:25:
+                    d5:e2:4f:c9:a8:82:db:41:31:c3:be:44:6f:0b:d4:
+                    fd:bf:c1:ee:d9:62:bf:3b:8f:b5:00:c8:d1:df:5d:
+                    4a:13:ad:71:e4:4b:5f:d1:d9:72:4c:83:d8:93:40:
+                    bf:6c:cd:2f:66:0e:04:d6:b9:43:28:24:c9:25:fd:
+                    59:70:fe:3d:f2:a9:0a:4e:c2:9b:c4:de:9e:57:5e:
+                    5d:16:25:e6:78:b6:44:49:29:9d:f6:bf:74:fb:85:
+                    d6:0d:f1:65:58:f2:2b:d6:8f:10:49:c8:00:2d:88:
+                    e2:2d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                1A:DE:3A:BF:17:09:87:0A:D0:12:6B:C9:47:D2:A7:EB:ED:5B:04:99
+                E0:DC:E0:2F:07:88:74:3A:9F:D3:30:A3:71:8A:F9:D6:A5:E5:A6:53
             X509v3 Authority Key Identifier: 
-                keyid:F9:98:21:49:71:FA:8D:B9:20:F7:FE:5D:4D:41:E8:8B:6C:E0:62:C3
+                keyid:17:5C:45:F3:D0:AC:1C:10:4C:8B:43:44:20:C4:DD:93:C5:C5:19:3B
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         8a:ac:de:1c:d2:ca:a7:b3:f8:26:34:2e:a7:b4:ef:7e:26:08:
-         5b:f4:78:ec:37:4a:a8:02:c8:37:cc:45:7c:e3:bd:5c:e3:87:
-         24:ea:4f:1a:dd:f5:d7:a3:de:2f:78:6a:e9:3a:4d:87:3a:9b:
-         7c:5c:5b:59:b4:2f:9e:1d:6d:29:9f:60:c0:d8:b7:87:0c:4b:
-         59:ac:b3:0d:5c:11:4f:24:09:4e:7c:84:72:00:8c:12:b7:84:
-         8a:80:91:97:4e:22:17:e0:5f:83:fd:97:6c:51:b3:03:c0:a2:
-         3c:f8:9e:24:a1:c1:b7:14:a0:6b:30:e8:62:b8:84:87:6b:ae:
-         e0:d2:56:f0:08:f6:d6:0e:1a:8d:5e:8b:06:b3:1e:14:6c:1b:
-         72:e9:46:25:cb:97:b7:d5:4e:79:20:37:05:a4:51:8e:d4:40:
-         3f:de:6f:c7:32:b8:28:2e:2a:08:c0:51:4e:32:1b:6c:c9:c0:
-         03:b3:b6:3e:fd:46:1e:5b:b7:6f:ef:97:ae:df:03:e9:4e:64:
-         39:94:fa:6f:65:71:11:dc:f7:4d:ed:48:c4:3d:7a:55:b8:c6:
-         f5:04:a4:d8:06:cd:c7:42:48:eb:d0:7a:4c:21:db:44:e7:c2:
-         68:a7:45:9f:54:2c:15:71:b5:74:c6:bf:1b:3c:eb:78:89:6f:
-         19:3a:69:02
+         43:f7:63:38:a3:30:3f:ab:e6:6c:42:a1:dd:ff:8d:f6:ad:b2:
+         eb:b6:9e:4b:bd:90:fc:d8:f4:f0:5a:42:fc:be:5b:cc:c7:24:
+         2f:91:48:a6:a1:bb:a2:b7:19:61:21:ac:d3:81:ee:6e:bb:04:
+         2d:16:b5:7e:cb:e6:a3:17:8f:3e:65:4d:1d:8d:c1:da:3d:3b:
+         ad:a1:b3:e8:f5:e3:16:13:17:0a:a3:45:e0:cf:84:b2:3d:e8:
+         38:69:31:46:e8:8c:10:63:0f:5e:6b:f4:10:25:23:98:b8:5c:
+         d9:06:78:83:18:70:09:a6:ef:8f:e9:f5:ff:b3:44:85:35:f6:
+         69:61:0b:2a:8d:de:87:1c:ec:dc:50:c7:67:ef:88:2c:28:de:
+         c0:db:6e:21:20:00:c5:5b:5d:ef:36:c6:0a:e9:06:a3:25:3e:
+         4d:13:fa:f0:3f:bc:fe:9c:68:48:ff:ec:1b:e7:2c:39:ac:88:
+         2b:a0:88:96:11:3e:f0:20:e2:29:fc:bd:d3:d3:ca:24:63:58:
+         17:15:c3:ac:19:21:cb:21:29:fc:53:e7:3b:cf:c2:0a:5e:f4:
+         ce:f1:9e:77:38:d4:c6:90:4e:94:fe:2e:97:cb:1a:94:2a:1e:
+         8c:3b:db:36:65:c6:19:ba:d7:0b:03:22:e5:92:e2:f6:3e:df:
+         99:ce:6b:49
 -----BEGIN CERTIFICATE-----
 MIIDxzCCAq+gAwIBAgIBATANBgkqhkiG9w0BAQsFADBrMQswCQYDVQQGEwJVUzET
 MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
 A1UECgwHVGVzdCBDQTEdMBsGA1UEAwwUVGVzdCBJbnRlcm1lZGlhdGUgQ0EwHhcN
-MTYxMjA5MjI0MDA4WhcNMjYxMjA3MjI0MDA4WjBgMQswCQYDVQQGEwJVUzETMBEG
+MTcwNjA1MTcxMDQ2WhcNMjcwNjAzMTcxMDQ2WjBgMQswCQYDVQQGEwJVUzETMBEG
 A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UE
 CgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv6NduPJt2obU1t0MoNvAmsQ7t5UGmhHXz43QHO+Z3Ird
-h73ZDrkRaa+UVxGvi4YWCFnI/v6GuiYJ/vBRuhRDZMhlhR/LRDn2k1eYNPK/Bnc2
-AmrZmQT04l1/2+3yFF1IcrJbNLLf6lar04j2WETPQDP+ybW4w+JzWQ2m5slbkZJC
-wfJYMRLgV1+UfHYt0qznwmKiiOiDz4ie7bpnCWG4H1ql4XTKhxg7XdDvwkX1JiUY
-yprF92GbsPscBAoDWdeHxlFlO250dlDnwlIAWkVZji9pHYOueOUDZhU/e0KT8MUa
-rZbk5wkxDk2XtZ6bY3jTDson0mQnksLeay5c8H942QIDAQABo4GAMH4wDAYDVR0T
-AQH/BAIwADAdBgNVHQ4EFgQUGt46vxcJhwrQEmvJR9Kn6+1bBJkwHwYDVR0jBBgw
-FoAU+ZghSXH6jbkg9/5dTUHoi2zgYsMwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
-AQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQELBQADggEBAIqs3hzS
-yqez+CY0Lqe0734mCFv0eOw3SqgCyDfMRXzjvVzjhyTqTxrd9dej3i94auk6TYc6
-m3xcW1m0L54dbSmfYMDYt4cMS1mssw1cEU8kCU58hHIAjBK3hIqAkZdOIhfgX4P9
-l2xRswPAojz4niShwbcUoGsw6GK4hIdrruDSVvAI9tYOGo1eiwazHhRsG3LpRiXL
-l7fVTnkgNwWkUY7UQD/eb8cyuCguKgjAUU4yG2zJwAOztj79Rh5bt2/vl67fA+lO
-ZDmU+m9lcRHc903tSMQ9elW4xvUEpNgGzcdCSOvQekwh20TnwminRZ9ULBVxtXTG
-vxs863iJbxk6aQI=
+AAOCAQ8AMIIBCgKCAQEAtL/SlzPlE1t3Zb1zGnUom0dZ5rcw6EYzbVhb2h8K/+Tk
+LfId+InoZC72w83Xo47X983n2A4Qw+dW0vzl5tNO4v+CTRhjh7Cj3trvCjd7rLW3
+Q87yBznfFOnDpEE+fmhHNJt7YcQY5hPOs7Sm4LoD7uTr56r0bb6XW6oGl1AB0Hi4
+1pKw5OK5Q4i1rhRkfVJw1AUcCSXV4k/JqILbQTHDvkRvC9T9v8Hu2WK/O4+1AMjR
+311KE61x5Etf0dlyTIPYk0C/bM0vZg4E1rlDKCTJJf1ZcP498qkKTsKbxN6eV15d
+FiXmeLZESSmd9r90+4XWDfFlWPIr1o8QScgALYjiLQIDAQABo4GAMH4wDAYDVR0T
+AQH/BAIwADAdBgNVHQ4EFgQU4NzgLweIdDqf0zCjcYr51qXlplMwHwYDVR0jBBgw
+FoAUF1xF89CsHBBMi0NEIMTdk8XFGTswHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
+AQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQELBQADggEBAEP3Yzij
+MD+r5mxCod3/jfatsuu2nku9kPzY9PBaQvy+W8zHJC+RSKahu6K3GWEhrNOB7m67
+BC0WtX7L5qMXjz5lTR2Nwdo9O62hs+j14xYTFwqjReDPhLI96DhpMUbojBBjD15r
+9BAlI5i4XNkGeIMYcAmm74/p9f+zRIU19mlhCyqN3occ7NxQx2fviCwo3sDbbiEg
+AMVbXe82xgrpBqMlPk0T+vA/vP6caEj/7BvnLDmsiCugiJYRPvAg4in8vdPTyiRj
+WBcVw6wZIcshKfxT5zvPwgpe9M7xnnc41MaQTpT+LpfLGpQqHow72zZlxhm61wsD
+IuWS4vY+35nOa0k=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/post_june_2016.pem b/net/data/ssl/certificates/post_june_2016.pem
index 2046819..cc272ad 100644
--- a/net/data/ssl/certificates/post_june_2016.pem
+++ b/net/data/ssl/certificates/post_june_2016.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 22 (0x16)
+        Serial Number: 23 (0x17)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Jun  1 00:00:00 2016 GMT
             Not After : Jul  3 00:00:00 2017 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:a0:2c:97:63:20:82:b4:59:56:80:66:89:38:1c:
-                    11:9e:5d:c0:e0:4f:15:07:93:aa:ca:1f:d5:e6:46:
-                    6f:50:1d:47:f3:28:a5:49:20:11:e4:8d:38:74:c1:
-                    6b:ed:95:bb:4e:60:f9:8b:d1:c9:7e:3a:2b:e6:ff:
-                    1a:6c:7c:3e:91:f8:2f:7a:52:ed:a8:9b:8f:fe:be:
-                    ea:ed:cf:45:9d:33:0b:b6:f5:3b:eb:59:68:73:35:
-                    7e:47:e5:c9:2f:c7:5d:fb:bf:0d:f6:e6:09:50:6d:
-                    9a:45:3a:b1:b7:21:6c:ea:83:df:4d:7c:96:84:3a:
-                    1e:2e:22:d1:30:62:48:a5:d4:56:98:6b:77:7e:be:
-                    64:58:4a:18:b8:29:f5:f1:9c:3e:69:8d:33:ca:d5:
-                    e1:7d:11:a5:8c:86:97:b3:8e:d2:fe:a0:3b:15:26:
-                    22:c9:72:ac:4d:02:25:4c:de:75:b2:6d:9c:a1:38:
-                    72:b9:84:f0:0e:83:71:6d:02:32:2b:13:cc:e9:fd:
-                    43:e4:e9:9c:a4:9c:b8:6a:81:d8:3b:5f:91:54:03:
-                    8c:fd:8e:e0:33:68:08:00:63:c7:c9:23:be:a2:50:
-                    94:85:88:d7:1c:23:19:1b:00:60:41:28:a8:a4:58:
-                    db:0b:84:48:39:f7:4e:5a:77:dd:fd:90:e3:2e:a1:
-                    a2:43
+                    00:cc:24:fe:ba:05:d1:11:43:16:d3:95:5f:fa:79:
+                    1a:22:55:fc:43:d5:03:e2:c9:d3:32:53:bc:72:e3:
+                    b6:b9:04:bd:3c:b4:04:55:64:a7:77:ef:ee:00:6e:
+                    5e:14:d5:a8:97:42:33:37:54:43:34:10:85:cd:10:
+                    ad:b4:18:49:9c:a9:63:27:c4:bd:53:4a:39:45:ec:
+                    8b:88:8d:bf:b4:5f:fe:3e:1b:d5:ac:d1:23:fd:0c:
+                    bd:09:3d:0c:8b:79:a0:89:b7:d6:16:73:07:b5:90:
+                    18:49:09:ed:80:26:19:e4:06:fb:71:16:97:f4:16:
+                    53:84:1b:33:92:22:08:c6:43:82:f5:02:d1:a1:4f:
+                    a8:c8:97:46:e0:39:64:6d:b3:4c:e4:45:87:50:5f:
+                    37:aa:7a:de:00:58:bf:b3:68:31:5c:5d:5c:ab:e9:
+                    26:b7:06:4c:25:2f:42:63:d7:5a:ed:0f:45:59:8d:
+                    fc:8a:ef:4f:16:b9:60:b4:bf:c6:a7:1a:50:53:3e:
+                    3b:0f:af:de:eb:12:da:80:c3:ca:bb:8f:03:74:d3:
+                    fc:8a:e4:b2:7e:9a:d5:eb:74:9c:eb:c7:d5:79:6f:
+                    13:0e:ea:b9:5a:90:04:6b:e7:a0:39:fa:e0:ad:29:
+                    6d:2a:c7:3d:e6:06:70:a6:99:f7:4d:02:10:39:51:
+                    4a:13
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                E4:33:1D:DC:72:6A:BD:68:62:A5:08:96:78:ED:40:A6:4A:3D:D4:C6
+                E3:14:30:A9:76:2F:F9:DE:0D:D7:82:DF:8A:8B:5A:FE:84:EF:65:49
             X509v3 Authority Key Identifier: 
-                keyid:43:43:FB:54:41:BE:07:E9:5B:E2:B9:75:97:6A:52:DE:F4:28:02:53
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         22:d0:60:a1:65:62:e8:7c:a8:58:87:5b:21:38:32:94:41:1e:
-         39:9a:f0:4d:eb:9e:14:1c:61:53:5f:f4:f6:d7:d4:29:81:d6:
-         cc:67:ca:83:fc:e6:1e:31:bd:7f:89:76:d2:9e:26:1f:10:2e:
-         a4:61:33:24:a7:eb:ec:26:bb:20:c9:3b:d4:cb:9d:72:31:e0:
-         23:13:b0:5d:d9:df:c9:49:50:84:29:2f:01:31:83:3c:13:6d:
-         d7:81:27:d2:2e:34:26:e8:ae:0d:99:03:31:71:de:e3:16:aa:
-         09:32:79:52:cf:d3:75:e5:0d:ed:a7:99:6c:9c:98:93:72:a2:
-         3d:3e:93:52:51:cd:76:60:a6:d0:b9:52:ec:02:cc:41:9e:5d:
-         66:be:5c:9b:3c:81:e5:9a:17:13:c2:be:2c:c6:ac:26:4e:18:
-         84:a2:12:8a:87:78:61:6c:46:2d:a9:93:8c:e9:f5:7b:a9:f7:
-         c5:58:00:8c:29:eb:23:e6:bf:93:58:f2:f9:7d:79:2b:51:6d:
-         c4:ff:22:3f:67:ab:b6:c7:97:47:98:f8:ef:4d:02:e9:25:0a:
-         34:7d:52:35:5d:72:47:0a:e4:b9:6a:25:41:ab:9a:b1:1c:00:
-         f0:5b:a9:09:2e:12:43:1c:9a:03:9c:61:2c:b9:e8:a3:f1:e6:
-         eb:3e:ee:d9
+         6a:ca:b3:de:fd:7e:b9:3c:8a:ad:4e:e6:a3:40:f1:c4:10:5e:
+         d5:72:9f:ca:6b:ea:de:c3:d6:48:38:59:72:cc:77:b9:c1:9e:
+         7f:a4:02:4f:57:ad:bd:4f:d5:66:a7:82:f3:85:ea:6a:b5:e8:
+         eb:21:a5:bc:cd:89:43:97:50:54:44:5e:b4:e8:98:98:0d:b1:
+         12:69:d3:62:ae:77:0e:1b:3c:02:93:29:49:96:e2:7b:9f:c8:
+         58:84:f3:a0:bb:26:99:71:80:c6:2e:99:4c:00:4f:90:08:e2:
+         e3:cf:9d:f1:71:40:a0:78:8f:dd:e1:ea:28:74:4e:83:3e:60:
+         20:45:d4:68:28:cc:55:0d:d7:4e:7e:48:a7:aa:f4:fa:20:b8:
+         74:76:f5:49:f6:e3:2c:e8:3f:f3:2e:84:a9:81:ce:4e:b9:87:
+         5f:2e:fd:12:8a:ca:fb:53:46:b5:2d:16:57:fd:ca:64:5e:77:
+         26:48:f6:52:29:70:a1:67:c2:5c:10:13:07:5a:1b:d5:9f:38:
+         19:5c:d8:a1:e3:1b:09:3b:ff:56:fd:7d:57:74:5f:9c:14:92:
+         b3:3e:8f:f6:0b:f0:f5:25:4f:0b:05:de:ad:87:9a:4f:e4:b7:
+         b4:2d:de:31:2c:14:49:bf:ef:0a:0c:b6:4f:1e:53:d4:50:23:
+         c7:b4:78:66
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBFjANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTYwNjAxMDAwMDAwWhcNMTcwNzAzMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoCyXYyCCtFlWgGaJOBwRnl3A4E8V
-B5Oqyh/V5kZvUB1H8yilSSAR5I04dMFr7ZW7TmD5i9HJfjor5v8abHw+kfgvelLt
-qJuP/r7q7c9FnTMLtvU761loczV+R+XJL8dd+78N9uYJUG2aRTqxtyFs6oPfTXyW
-hDoeLiLRMGJIpdRWmGt3fr5kWEoYuCn18Zw+aY0zytXhfRGljIaXs47S/qA7FSYi
-yXKsTQIlTN51sm2coThyuYTwDoNxbQIyKxPM6f1D5OmcpJy4aoHYO1+RVAOM/Y7g
-M2gIAGPHySO+olCUhYjXHCMZGwBgQSiopFjbC4RIOfdOWnfd/ZDjLqGiQwIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5DMd3HJqvWhipQiWeO1Apko9
-1MYwHwYDVR0jBBgwFoAUQ0P7VEG+B+lb4rl1l2pS3vQoAlMwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBACLQYKFlYuh8qFiHWyE4MpRBHjma8E3rnhQcYVNf9PbX1CmB1sxnyoP8
-5h4xvX+JdtKeJh8QLqRhMySn6+wmuyDJO9TLnXIx4CMTsF3Z38lJUIQpLwExgzwT
-bdeBJ9IuNCborg2ZAzFx3uMWqgkyeVLP03XlDe2nmWycmJNyoj0+k1JRzXZgptC5
-UuwCzEGeXWa+XJs8geWaFxPCvizGrCZOGISiEoqHeGFsRi2pk4zp9Xup98VYAIwp
-6yPmv5NY8vl9eStRbcT/Ij9nq7bHl0eY+O9NAuklCjR9UjVdckcK5LlqJUGrmrEc
-APBbqQkuEkMcmgOcYSy56KPx5us+7tk=
+MIIDvzCCAqegAwIBAgIBFzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE2MDYwMTAw
+MDAwMFoXDTE3MDcwMzAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMwk/roF0RFDFtOVX/p5GiJV/EPVA+LJ0zJTvHLjtrkEvTy0BFVkp3fv
+7gBuXhTVqJdCMzdUQzQQhc0QrbQYSZypYyfEvVNKOUXsi4iNv7Rf/j4b1azRI/0M
+vQk9DIt5oIm31hZzB7WQGEkJ7YAmGeQG+3EWl/QWU4QbM5IiCMZDgvUC0aFPqMiX
+RuA5ZG2zTORFh1BfN6p63gBYv7NoMVxdXKvpJrcGTCUvQmPXWu0PRVmN/IrvTxa5
+YLS/xqcaUFM+Ow+v3usS2oDDyruPA3TT/Irksn6a1et0nOvH1XlvEw7quVqQBGvn
+oDn64K0pbSrHPeYGcKaZ900CEDlRShMCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFOMUMKl2L/neDdeC34qLWv6E72VJMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQBqyrPe/X65PIqtTuaj
+QPHEEF7Vcp/Ka+rew9ZIOFlyzHe5wZ5/pAJPV629T9Vmp4LzhepqtejrIaW8zYlD
+l1BURF606JiYDbESadNirncOGzwCkylJluJ7n8hYhPOguyaZcYDGLplMAE+QCOLj
+z53xcUCgeI/d4eoodE6DPmAgRdRoKMxVDddOfkinqvT6ILh0dvVJ9uMs6D/zLoSp
+gc5OuYdfLv0Sisr7U0a1LRZX/cpkXncmSPZSKXChZ8JcEBMHWhvVnzgZXNih4xsJ
+O/9W/X1XdF+cFJKzPo/2C/D1JU8LBd6th5pP5Le0Ld4xLBRJv+8KDLZPHlPUUCPH
+tHhm
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/pre_br_validity_bad_121.pem b/net/data/ssl/certificates/pre_br_validity_bad_121.pem
index 2c84c2ba..2bf5369b 100644
--- a/net/data/ssl/certificates/pre_br_validity_bad_121.pem
+++ b/net/data/ssl/certificates/pre_br_validity_bad_121.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 10 (0xa)
+        Serial Number: 20 (0x14)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Jan  1 00:00:00 2008 GMT
             Not After : May  1 00:00:00 2018 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:e0:4b:de:53:9a:c3:32:75:8a:df:91:7b:fa:47:
-                    88:9c:d5:ac:88:6e:84:21:65:07:96:c6:0b:09:f9:
-                    16:b6:3b:1b:ae:9f:3e:48:8b:ac:ef:2e:71:38:3a:
-                    f9:21:b0:71:61:cd:1f:0f:fa:cc:48:d0:f4:2a:0f:
-                    82:90:3a:e5:f4:c5:12:d7:8e:d5:fb:9c:28:82:8e:
-                    49:2a:1f:38:81:21:ca:df:79:30:5d:33:ce:d4:20:
-                    1a:22:65:25:72:fe:72:9b:a2:56:50:c9:4f:cb:ed:
-                    75:18:be:1e:7d:c6:62:26:a8:9d:2d:1a:a4:ab:02:
-                    c2:1d:da:a7:dd:06:6a:0b:f2:97:91:27:dc:f0:c5:
-                    a0:5c:17:fd:18:71:a6:c4:1f:71:27:01:9f:4d:ee:
-                    77:64:51:4d:28:fc:f8:bb:8a:ab:ca:97:f4:ae:58:
-                    89:c0:3a:20:0c:d6:6b:56:c2:ff:d7:b1:6b:78:c8:
-                    2f:4f:46:67:a3:37:7f:66:8b:6b:4d:8d:35:c2:d0:
-                    f1:7b:d7:b8:f2:b0:75:e6:b8:77:bc:16:38:4d:83:
-                    ab:36:3d:48:e2:28:02:a3:35:88:53:aa:e8:01:a0:
-                    a1:2c:99:b1:9d:92:fe:9e:eb:a1:84:90:f5:32:0e:
-                    ff:a2:64:c5:12:7c:8b:57:40:75:bd:e7:81:c0:83:
-                    e2:35
+                    00:9f:eb:e4:9c:a0:87:13:91:5c:dd:4b:ca:0d:15:
+                    66:ba:86:05:e4:f7:32:b3:ea:9b:57:9f:77:a6:52:
+                    39:7d:62:4f:c8:f4:24:c9:47:8d:1f:0a:a2:ce:13:
+                    90:a1:27:ab:4d:7d:ca:66:64:44:7b:5c:82:00:b0:
+                    3a:2f:da:ab:d3:f8:c1:22:09:49:3d:26:96:59:25:
+                    ec:58:9f:2e:82:82:63:6e:dc:4a:87:ad:fd:c1:ef:
+                    44:34:a5:9d:d2:48:25:ca:f5:20:3f:e3:2b:6d:9a:
+                    b7:d1:c5:e9:53:7f:f0:ab:b0:29:5a:1e:a1:8b:fb:
+                    6a:b8:99:5b:61:7f:ca:4d:5c:b9:50:5d:f2:52:de:
+                    ec:06:62:e3:ff:95:2c:51:04:2c:95:6c:56:cf:a1:
+                    2d:78:be:7c:a2:a7:53:1f:52:96:e1:a2:cc:72:c2:
+                    e6:a4:62:da:e8:94:2a:3b:e0:25:f0:6c:d2:a5:16:
+                    ba:1f:75:52:8a:5e:7b:4d:0a:79:c9:14:bf:dc:ac:
+                    8c:d3:03:01:fe:05:8b:00:e8:17:f7:11:9b:ca:f8:
+                    d4:80:58:7f:77:4b:f4:17:87:5f:f4:98:a4:1b:3c:
+                    8c:c8:a4:1d:26:02:4a:24:b5:e8:7c:e0:38:bc:e8:
+                    90:d5:fa:91:6a:3d:97:7c:ed:f5:22:f3:29:3d:3d:
+                    c5:33
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                0F:E1:A5:2E:CA:40:B3:BF:40:51:3A:6B:85:09:E2:D1:00:8F:7D:25
+                09:3A:F7:03:5A:79:7A:04:12:F8:DA:B6:8D:5F:90:7F:FD:9D:EE:67
             X509v3 Authority Key Identifier: 
-                keyid:EE:54:52:3A:28:73:20:9D:56:2D:2A:98:F4:9C:B1:7D:FB:C5:22:47
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         35:f9:a3:c9:fb:f1:1d:52:2e:ce:a4:a6:f3:2a:eb:ec:19:39:
-         fd:4a:c6:ca:f4:2a:b1:cc:c5:62:8e:51:89:ec:8b:2c:11:87:
-         a6:df:7b:ad:5d:91:e0:ed:86:71:4c:89:1f:fa:cd:0d:08:02:
-         cb:c1:74:e4:80:c5:80:48:fb:63:63:c1:f7:c4:71:9b:ea:b6:
-         0e:6b:4f:e3:89:f5:fd:77:a3:fb:50:d1:bc:ec:64:a1:04:f7:
-         e8:e9:5d:57:fd:14:67:1c:19:25:a4:3e:90:31:0a:32:09:46:
-         c7:de:ca:f3:b7:47:d8:bd:5f:e3:45:4f:a9:37:8f:76:d1:bb:
-         0c:a0:3a:70:49:32:a6:ba:35:49:70:2a:cb:c3:b4:02:25:6d:
-         99:f9:4e:ff:49:d9:a0:b4:f5:fb:a5:bf:36:a5:c9:44:29:9a:
-         f8:82:3d:9e:bb:92:33:84:e7:77:7c:26:de:8d:00:78:a8:1b:
-         bd:e8:61:1b:ff:c2:b6:63:97:73:8a:ae:fe:23:07:58:fe:1c:
-         28:70:83:0c:c3:dc:e2:15:4e:2a:a8:9c:79:ba:5b:a1:66:cb:
-         7e:52:61:3a:a7:57:3b:70:1f:6a:e5:b2:57:61:00:be:d0:04:
-         c3:61:aa:50:40:52:a5:c8:8d:b9:3a:a6:48:72:70:21:af:ba:
-         fd:86:8d:57
+         38:14:a7:3c:63:ee:dd:f9:f5:9e:55:09:97:55:fc:3e:2d:09:
+         f8:45:20:c0:05:9c:cd:96:87:f6:2d:d6:e0:9b:34:b8:16:03:
+         40:39:1c:a5:02:c9:01:9d:2d:bb:52:f2:65:45:94:49:43:a0:
+         1a:2f:26:c3:5d:cf:41:66:be:02:0b:37:0b:4e:66:3b:66:13:
+         7f:10:8e:8b:6a:84:4e:50:ec:f0:0c:26:4d:dc:4d:2e:93:4b:
+         19:98:18:12:2d:80:dd:55:12:d4:41:6c:53:50:2f:d7:4e:da:
+         fd:0c:5a:fc:f6:fc:02:30:3f:72:8c:2a:34:1e:9c:0c:96:3f:
+         1f:54:79:97:d4:97:7b:81:bc:5b:22:42:0c:dd:6b:3a:04:30:
+         7b:71:35:df:9b:32:95:86:07:2d:15:ef:a7:1e:8b:ec:fc:27:
+         49:29:fd:a1:7f:01:88:13:6f:5d:8f:6b:be:21:57:2d:5a:c3:
+         cd:30:46:f6:5e:2b:ca:ce:48:f8:5b:ba:f6:40:97:31:c6:c3:
+         ea:31:55:64:9a:8b:93:6c:cb:e5:0e:f7:3d:f2:13:8e:bb:1e:
+         39:09:3e:62:0a:d7:2c:c9:5c:35:db:8b:d7:e6:c8:27:f3:09:
+         e0:3f:e4:98:8d:e5:db:2c:d6:8b:9f:85:24:4f:15:98:af:86:
+         85:b6:13:1f
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCjANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMDgwMTAxMDAwMDAwWhcNMTgwNTAxMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4EveU5rDMnWK35F7+keInNWsiG6E
-IWUHlsYLCfkWtjsbrp8+SIus7y5xODr5IbBxYc0fD/rMSND0Kg+CkDrl9MUS147V
-+5wogo5JKh84gSHK33kwXTPO1CAaImUlcv5ym6JWUMlPy+11GL4efcZiJqidLRqk
-qwLCHdqn3QZqC/KXkSfc8MWgXBf9GHGmxB9xJwGfTe53ZFFNKPz4u4qrypf0rliJ
-wDogDNZrVsL/17FreMgvT0Znozd/ZotrTY01wtDxe9e48rB15rh3vBY4TYOrNj1I
-4igCozWIU6roAaChLJmxnZL+nuuhhJD1Mg7/omTFEnyLV0B1veeBwIPiNQIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUD+GlLspAs79AUTprhQni0QCP
-fSUwHwYDVR0jBBgwFoAU7lRSOihzIJ1WLSqY9JyxffvFIkcwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBADX5o8n78R1SLs6kpvMq6+wZOf1Kxsr0KrHMxWKOUYnsiywRh6bfe61d
-keDthnFMiR/6zQ0IAsvBdOSAxYBI+2NjwffEcZvqtg5rT+OJ9f13o/tQ0bzsZKEE
-9+jpXVf9FGccGSWkPpAxCjIJRsfeyvO3R9i9X+NFT6k3j3bRuwygOnBJMqa6NUlw
-KsvDtAIlbZn5Tv9J2aC09fulvzalyUQpmviCPZ67kjOE53d8Jt6NAHioG73oYRv/
-wrZjl3OKrv4jB1j+HChwgwzD3OIVTiqonHm6W6Fmy35SYTqnVztwH2rlsldhAL7Q
-BMNhqlBAUqXIjbk6pkhycCGvuv2GjVc=
+MIIDvzCCAqegAwIBAgIBFDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTA4MDEwMTAw
+MDAwMFoXDTE4MDUwMTAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAJ/r5JyghxORXN1Lyg0VZrqGBeT3MrPqm1efd6ZSOX1iT8j0JMlHjR8K
+os4TkKEnq019ymZkRHtcggCwOi/aq9P4wSIJST0mllkl7FifLoKCY27cSoet/cHv
+RDSlndJIJcr1ID/jK22at9HF6VN/8KuwKVoeoYv7ariZW2F/yk1cuVBd8lLe7AZi
+4/+VLFEELJVsVs+hLXi+fKKnUx9SluGizHLC5qRi2uiUKjvgJfBs0qUWuh91Uope
+e00KeckUv9ysjNMDAf4FiwDoF/cRm8r41IBYf3dL9BeHX/SYpBs8jMikHSYCSiS1
+6HzgOLzokNX6kWo9l3zt9SLzKT09xTMCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFAk69wNaeXoEEvjato1fkH/9ne5nMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQA4FKc8Y+7d+fWeVQmX
+Vfw+LQn4RSDABZzNlof2LdbgmzS4FgNAORylAskBnS27UvJlRZRJQ6AaLybDXc9B
+Zr4CCzcLTmY7ZhN/EI6LaoROUOzwDCZN3E0uk0sZmBgSLYDdVRLUQWxTUC/XTtr9
+DFr89vwCMD9yjCo0HpwMlj8fVHmX1Jd7gbxbIkIM3Ws6BDB7cTXfmzKVhgctFe+n
+Hovs/CdJKf2hfwGIE29dj2u+IVctWsPNMEb2XivKzkj4W7r2QJcxxsPqMVVkmouT
+bMvlDvc98hOOux45CT5iCtcsyVw124vX5sgn8wngP+SYjeXbLNaLn4UkTxWYr4aF
+thMf
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/pre_br_validity_bad_2020.pem b/net/data/ssl/certificates/pre_br_validity_bad_2020.pem
index 2a4de2d..10a08549 100644
--- a/net/data/ssl/certificates/pre_br_validity_bad_2020.pem
+++ b/net/data/ssl/certificates/pre_br_validity_bad_2020.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 11 (0xb)
+        Serial Number: 21 (0x15)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: May  1 00:00:00 2012 GMT
             Not After : Jul  3 00:00:00 2019 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ac:f5:76:f7:0e:a7:1b:fd:50:52:81:ae:bb:59:
-                    c5:21:00:6f:a4:ef:ca:e0:12:78:4a:f6:78:fc:8a:
-                    c8:d4:76:37:15:9e:7f:46:83:f3:c7:57:fa:ec:79:
-                    c4:51:4e:b5:76:09:07:2d:91:5d:7f:25:95:fa:98:
-                    59:66:84:b4:a3:01:be:3c:cd:2a:71:9e:83:82:94:
-                    4b:28:33:af:0a:57:a0:16:28:8f:9a:2b:7b:50:0c:
-                    e0:0e:3f:58:49:09:70:c5:99:17:ae:df:e0:83:98:
-                    09:0a:a8:a7:d6:ca:b4:86:49:03:86:f5:76:b5:0f:
-                    8a:a8:f2:b9:d3:f5:a5:32:b1:e8:50:5a:cf:45:7a:
-                    b9:81:26:08:69:24:d0:ac:ea:27:c4:69:0e:65:45:
-                    0f:cc:d4:b4:81:81:d0:e0:52:04:17:3e:74:fd:be:
-                    3b:de:29:11:41:7d:91:19:45:03:1a:8b:f9:93:ac:
-                    61:91:ce:4d:da:b2:1b:b1:2e:14:20:c3:44:78:17:
-                    70:1c:1e:cd:e2:86:bf:e4:63:b9:cb:aa:fa:1c:ae:
-                    63:4a:fe:a4:df:71:e7:ad:49:40:97:75:d4:b0:90:
-                    eb:9b:d1:92:07:a8:f1:b7:29:77:d7:17:c9:e6:55:
-                    5d:26:85:09:03:e9:b2:96:18:97:c6:7f:f7:1c:f9:
-                    2d:a7
+                    00:e8:84:db:5e:7d:ea:ce:7c:36:6f:2c:8b:48:0a:
+                    c4:c3:48:44:4a:75:7d:85:c0:86:c3:77:ed:55:4b:
+                    0d:0c:62:9f:90:5b:56:8f:db:80:a5:64:4c:b9:fa:
+                    64:9f:93:1e:bd:b5:bf:94:04:52:fa:9a:db:87:d1:
+                    9a:19:da:d4:5e:47:36:31:24:3e:62:60:34:34:d9:
+                    17:6e:89:14:04:f2:98:32:19:70:f4:5a:2a:a0:26:
+                    90:26:f6:5a:e4:a7:ad:23:d8:18:a3:bd:a0:a3:d5:
+                    e0:de:fb:81:28:39:c4:b9:65:f7:5c:6e:ae:82:ef:
+                    cd:14:75:53:45:31:de:1f:dd:61:de:ff:2d:11:7e:
+                    23:b6:bc:c1:d8:71:71:0c:14:af:d2:03:b2:38:35:
+                    83:39:48:d3:c4:a2:0c:76:c2:93:a7:de:78:56:db:
+                    27:67:92:a1:29:d7:aa:ed:25:27:9e:3e:17:aa:10:
+                    2a:10:d4:e2:db:43:cc:64:99:78:63:85:78:f6:e1:
+                    1e:c7:9a:a2:e2:98:8f:e9:10:93:3e:06:db:14:70:
+                    fb:21:7f:6d:16:a6:13:e2:54:59:eb:66:75:26:e6:
+                    60:12:c1:51:6c:63:7a:1a:cf:18:52:dc:db:a0:7d:
+                    2d:92:ad:f1:4f:e5:2c:1c:14:81:1a:db:63:6a:2f:
+                    75:b1
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                A2:3D:78:98:07:E9:84:62:82:AF:66:FF:8F:00:F4:9F:79:AA:EB:A5
+                A6:5C:B0:9B:17:D4:01:25:77:C5:1A:B6:E6:A2:D8:53:1D:18:93:6C
             X509v3 Authority Key Identifier: 
-                keyid:EE:54:52:3A:28:73:20:9D:56:2D:2A:98:F4:9C:B1:7D:FB:C5:22:47
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         3b:66:76:fa:c8:d3:a1:14:64:26:5b:e5:36:6c:e3:5f:53:fd:
-         dd:50:9e:01:36:2a:3a:08:ec:bc:1e:76:b5:fd:5f:39:a8:79:
-         a8:a7:9f:f0:8d:48:ba:d1:af:77:ed:bf:3a:1b:35:b7:ff:90:
-         1a:09:74:bf:1b:15:19:33:8b:f3:a8:61:da:c7:d0:fe:76:52:
-         15:5a:cf:a5:3d:c7:fc:05:c7:d2:e3:38:d3:ea:19:46:5b:94:
-         8e:75:aa:6e:ab:f3:64:47:7d:f5:65:93:68:54:a5:97:dc:f8:
-         1e:f5:fa:f4:8f:47:f6:d8:c5:85:67:6f:03:2f:82:67:0c:6f:
-         35:2a:e2:f3:c8:56:be:8f:59:3a:6a:fc:0a:e1:40:dc:28:53:
-         d0:1f:60:d1:2b:2c:a9:88:f3:82:63:67:1e:79:4e:0b:d5:90:
-         69:9e:91:af:57:9a:fc:db:5c:44:84:0e:dc:05:f7:91:ec:16:
-         9a:ad:b0:48:62:c5:3c:c0:ca:7f:43:06:34:ae:50:a0:2e:90:
-         fa:21:2b:14:1f:be:51:c3:4f:c6:c4:9e:60:e4:b7:1c:82:f1:
-         ef:9f:97:0c:bc:4a:90:86:35:90:da:e4:e7:83:80:8b:7c:7e:
-         82:89:cc:c3:67:90:42:30:7e:c1:ba:b0:59:ae:f5:29:88:75:
-         16:ff:df:2f
+         47:a5:c1:c8:64:68:17:77:f1:42:e1:2a:ae:0d:0a:6d:17:04:
+         a8:72:aa:7b:0a:46:ee:62:f1:61:28:f5:84:c5:f7:d0:fd:81:
+         41:dc:77:b9:80:2d:24:35:c3:2f:86:ba:74:3b:48:3f:be:59:
+         60:92:11:e8:57:0d:fa:7b:ef:a8:21:20:0d:77:27:c7:5d:51:
+         b3:03:06:a0:9b:5a:12:67:49:65:64:9c:b2:68:fe:1a:50:2e:
+         a9:f6:dd:d2:a5:07:a8:b1:24:65:71:1b:d6:1b:23:c6:7c:28:
+         24:5e:df:1c:56:1d:0b:c5:dd:bb:07:5a:d2:86:55:df:76:95:
+         19:b7:72:53:cb:1d:97:42:3b:7e:c5:98:24:46:73:4e:6d:81:
+         c8:b5:3e:8c:12:ec:6e:a5:51:a5:fa:0d:10:b8:39:4a:dd:26:
+         51:b1:7d:4d:c6:c7:a7:6d:8d:aa:d8:19:da:c0:a0:d7:6d:5f:
+         71:97:8e:16:1f:2a:6f:0b:3d:73:2d:60:1d:9f:07:4f:17:65:
+         26:d9:c5:d6:9d:04:d9:b0:b9:b0:02:48:63:4e:fd:43:ac:7b:
+         5c:87:80:e8:14:9d:59:fc:f8:a6:af:87:30:52:6d:c9:ab:23:
+         b7:88:9a:19:0f:38:a1:fe:78:90:34:1c:a4:19:48:c7:55:01:
+         65:28:69:1b
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCzANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTIwNTAxMDAwMDAwWhcNMTkwNzAzMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArPV29w6nG/1QUoGuu1nFIQBvpO/K
-4BJ4SvZ4/IrI1HY3FZ5/RoPzx1f67HnEUU61dgkHLZFdfyWV+phZZoS0owG+PM0q
-cZ6DgpRLKDOvClegFiiPmit7UAzgDj9YSQlwxZkXrt/gg5gJCqin1sq0hkkDhvV2
-tQ+KqPK50/WlMrHoUFrPRXq5gSYIaSTQrOonxGkOZUUPzNS0gYHQ4FIEFz50/b47
-3ikRQX2RGUUDGov5k6xhkc5N2rIbsS4UIMNEeBdwHB7N4oa/5GO5y6r6HK5jSv6k
-33HnrUlAl3XUsJDrm9GSB6jxtyl31xfJ5lVdJoUJA+mylhiXxn/3HPktpwIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUoj14mAfphGKCr2b/jwD0n3mq
-66UwHwYDVR0jBBgwFoAU7lRSOihzIJ1WLSqY9JyxffvFIkcwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBADtmdvrI06EUZCZb5TZs419T/d1QngE2KjoI7LwedrX9Xzmoeainn/CN
-SLrRr3ftvzobNbf/kBoJdL8bFRkzi/OoYdrH0P52UhVaz6U9x/wFx9LjONPqGUZb
-lI51qm6r82RHffVlk2hUpZfc+B71+vSPR/bYxYVnbwMvgmcMbzUq4vPIVr6PWTpq
-/ArhQNwoU9AfYNErLKmI84JjZx55TgvVkGmeka9XmvzbXESEDtwF95HsFpqtsEhi
-xTzAyn9DBjSuUKAukPohKxQfvlHDT8bEnmDktxyC8e+flwy8SpCGNZDa5OeDgIt8
-foKJzMNnkEIwfsG6sFmu9SmIdRb/3y8=
+MIIDvzCCAqegAwIBAgIBFTANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTEyMDUwMTAw
+MDAwMFoXDTE5MDcwMzAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAOiE21596s58Nm8si0gKxMNIREp1fYXAhsN37VVLDQxin5BbVo/bgKVk
+TLn6ZJ+THr21v5QEUvqa24fRmhna1F5HNjEkPmJgNDTZF26JFATymDIZcPRaKqAm
+kCb2WuSnrSPYGKO9oKPV4N77gSg5xLll91xuroLvzRR1U0Ux3h/dYd7/LRF+I7a8
+wdhxcQwUr9IDsjg1gzlI08SiDHbCk6feeFbbJ2eSoSnXqu0lJ54+F6oQKhDU4ttD
+zGSZeGOFePbhHseaouKYj+kQkz4G2xRw+yF/bRamE+JUWetmdSbmYBLBUWxjehrP
+GFLc26B9LZKt8U/lLBwUgRrbY2ovdbECAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFKZcsJsX1AEld8Uatuai2FMdGJNsMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQBHpcHIZGgXd/FC4Squ
+DQptFwSocqp7CkbuYvFhKPWExffQ/YFB3He5gC0kNcMvhrp0O0g/vllgkhHoVw36
+e++oISANdyfHXVGzAwagm1oSZ0llZJyyaP4aUC6p9t3SpQeosSRlcRvWGyPGfCgk
+Xt8cVh0Lxd27B1rShlXfdpUZt3JTyx2XQjt+xZgkRnNObYHItT6MEuxupVGl+g0Q
+uDlK3SZRsX1NxsenbY2q2BnawKDXbV9xl44WHypvCz1zLWAdnwdPF2Um2cXWnQTZ
+sLmwAkhjTv1DrHtch4DoFJ1Z/Pimr4cwUm3JqyO3iJoZDzih/niQNBykGUjHVQFl
+KGkb
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/pre_br_validity_ok.pem b/net/data/ssl/certificates/pre_br_validity_ok.pem
index 5d082ee..cac2a9f0 100644
--- a/net/data/ssl/certificates/pre_br_validity_ok.pem
+++ b/net/data/ssl/certificates/pre_br_validity_ok.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 9 (0x9)
+        Serial Number: 19 (0x13)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Jan  1 00:00:00 2008 GMT
             Not After : Jan  1 00:00:00 2015 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:bc:a2:44:c7:c5:c4:bb:e2:fd:d2:1f:17:f4:3d:
-                    87:62:65:37:f8:87:78:97:75:04:b3:28:ca:1c:03:
-                    f8:76:9c:07:36:0c:67:35:fa:90:cc:31:73:d3:ec:
-                    b6:d9:a2:38:7b:94:00:59:23:2e:c4:f7:fd:ea:6d:
-                    67:ce:fe:7b:87:40:d3:14:74:71:3e:94:50:0e:3f:
-                    24:e5:83:fc:6a:c4:35:56:b9:a4:22:f0:84:6d:c7:
-                    ce:f1:19:ad:89:51:c7:c8:d4:c0:97:1b:86:64:d2:
-                    c7:04:cf:a3:9e:5d:6f:ed:ea:2e:08:ad:26:39:c7:
-                    1d:bb:29:4a:c0:4e:50:e7:8f:25:65:e2:fb:fe:4f:
-                    ea:62:3f:b4:70:91:1b:f3:cc:24:83:12:c2:38:5b:
-                    5e:ef:bc:c4:23:b8:d5:35:14:63:5f:b3:c1:f1:ad:
-                    35:ea:4d:0f:14:b8:a4:b1:19:c1:31:81:b0:8f:4a:
-                    b3:a9:60:c1:2b:f1:2c:0c:d6:a0:52:d9:e8:a5:78:
-                    d3:0b:b2:6e:88:bb:8d:36:07:2f:2d:d3:71:9d:87:
-                    ca:58:41:18:e9:06:17:ee:a5:bf:35:31:81:b2:2b:
-                    ee:af:92:10:64:22:88:38:3d:1b:08:80:59:ce:97:
-                    62:5e:cb:d1:fa:59:d7:b9:fd:40:42:41:b1:14:47:
-                    c4:0b
+                    00:c9:a8:08:1a:b3:09:5d:20:f4:ee:7b:73:0d:56:
+                    82:3d:da:d7:f3:e4:94:34:04:1f:d1:bf:8f:7b:ac:
+                    d8:ec:4b:b3:d2:da:ba:47:3d:19:12:cb:1d:12:ff:
+                    dd:64:8b:d3:97:9f:56:80:b5:35:00:fa:fb:56:20:
+                    2c:96:d6:e5:73:87:30:72:98:11:ea:87:fa:35:cd:
+                    70:a9:f5:a2:16:b0:6d:64:d6:68:3e:4d:a5:fc:b8:
+                    ec:d7:6e:9a:33:84:88:d7:50:ab:7f:2e:37:52:c4:
+                    21:80:6b:8e:4c:dc:95:c5:9e:a5:dd:46:c6:f0:6d:
+                    bd:d6:03:d0:8b:5a:3c:4b:07:61:90:bb:4e:0b:58:
+                    e5:be:1d:96:e7:66:03:12:96:6c:e7:e4:73:49:10:
+                    20:db:74:3d:ca:bd:c2:4d:47:46:4e:2f:1e:cc:09:
+                    b7:0a:61:14:a0:b7:7a:0c:f1:5e:15:e8:87:4a:b8:
+                    3f:42:a3:73:8e:00:f5:81:e2:b9:1e:6a:b3:11:3e:
+                    f9:84:0e:e8:59:17:fd:dd:8e:af:e2:88:09:88:43:
+                    f6:89:15:af:91:36:b4:f8:b9:9f:a5:75:a1:39:21:
+                    ad:03:fd:c0:60:c5:e7:aa:e3:4e:c3:bf:01:f8:e7:
+                    6b:dd:f7:7a:da:26:12:3c:d7:64:28:2e:da:36:d6:
+                    fa:0b
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                E4:F4:EF:17:AA:96:3F:12:62:E0:E2:FA:98:88:AF:B4:E5:74:4E:4C
+                FB:DF:D4:89:A2:A9:E0:BE:B0:E3:FC:AD:C9:F9:80:85:3C:30:B5:81
             X509v3 Authority Key Identifier: 
-                keyid:EE:54:52:3A:28:73:20:9D:56:2D:2A:98:F4:9C:B1:7D:FB:C5:22:47
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         79:7d:93:8b:4b:3f:7f:02:9b:5c:c2:6e:a6:0c:2a:16:75:79:
-         ee:a6:15:e4:54:e0:3a:20:b7:62:52:1c:85:ae:03:5a:bb:9a:
-         3d:1f:f4:19:af:79:92:c2:e0:78:38:6d:42:39:75:07:ba:07:
-         6f:7c:5a:50:32:10:3b:68:f9:da:c4:a8:07:56:3f:71:ec:6e:
-         65:dc:20:0f:ab:c3:0b:4f:55:15:9e:94:4e:98:c9:f9:d7:6a:
-         f5:e4:49:5d:1d:ba:1f:b9:16:26:b5:6f:2b:e7:52:39:b9:aa:
-         60:58:c3:b9:eb:c5:20:92:a1:cb:a7:06:8f:1f:41:35:b6:c9:
-         a5:7e:9c:ba:77:f6:b3:92:47:ba:57:e2:b3:e5:02:6a:d1:e3:
-         52:d6:35:8b:8c:47:d0:f9:2e:ad:9b:14:43:11:81:f1:c7:38:
-         b0:3e:cc:3b:ca:39:e8:83:01:e4:fb:c9:ff:bb:6b:96:3a:22:
-         e0:4d:d8:06:b8:56:8a:b5:f8:84:12:68:ae:c7:05:00:d3:d7:
-         1f:3d:89:f4:c9:27:68:be:d0:07:cc:c7:d3:eb:d5:60:e3:c2:
-         2a:85:4b:cb:53:5c:d2:92:f6:ef:63:34:f0:a0:1e:40:9b:78:
-         0d:2a:2c:df:36:9c:26:3a:16:82:39:36:5f:d3:5b:ba:24:8c:
-         b0:18:a7:d1
+         4f:9f:49:7d:21:55:a4:d8:63:0c:79:2f:4a:62:cf:31:b9:94:
+         18:e8:27:e3:de:73:53:19:0b:c0:cd:d0:35:89:40:a9:29:4c:
+         64:2f:ae:77:4a:2d:b7:7a:1c:d7:8b:40:8b:5a:44:98:db:83:
+         22:28:e7:4b:cc:4b:6d:49:a3:e4:23:ee:ae:73:c9:37:06:7b:
+         12:c9:83:ef:50:64:bd:71:5b:01:9c:ff:5e:e9:86:91:51:a3:
+         f4:6e:15:07:4f:23:46:82:d7:11:95:79:e7:9c:9c:bb:10:90:
+         f5:da:9a:4e:6f:2a:b5:f5:68:ed:6c:a5:f1:69:6d:f6:aa:6d:
+         02:df:10:c2:b1:7b:35:1d:20:9f:61:85:cb:81:9f:e7:aa:36:
+         12:7a:f0:a3:31:29:a7:b4:a9:62:66:d6:2d:4d:3f:d8:9f:5c:
+         1b:e2:06:31:37:92:51:a7:3f:5d:91:1b:45:c5:4b:be:b2:d8:
+         b9:59:f6:4d:45:52:af:d4:d0:db:f2:85:01:9b:fa:cf:1b:54:
+         85:7c:79:3a:3f:f5:a8:b1:e9:d7:41:21:0b:d0:48:03:d0:ba:
+         ee:4d:cf:1e:df:f5:57:25:d9:1f:dc:34:4f:7b:f7:68:b3:65:
+         aa:e3:0f:50:e8:1f:0e:50:1a:c8:48:22:6b:bc:a1:ae:cc:b3:
+         72:94:c2:24
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCTANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMDgwMTAxMDAwMDAwWhcNMTUwMTAxMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvKJEx8XEu+L90h8X9D2HYmU3+Id4
-l3UEsyjKHAP4dpwHNgxnNfqQzDFz0+y22aI4e5QAWSMuxPf96m1nzv57h0DTFHRx
-PpRQDj8k5YP8asQ1VrmkIvCEbcfO8RmtiVHHyNTAlxuGZNLHBM+jnl1v7eouCK0m
-OccduylKwE5Q548lZeL7/k/qYj+0cJEb88wkgxLCOFte77zEI7jVNRRjX7PB8a01
-6k0PFLiksRnBMYGwj0qzqWDBK/EsDNagUtnopXjTC7JuiLuNNgcvLdNxnYfKWEEY
-6QYX7qW/NTGBsivur5IQZCKIOD0bCIBZzpdiXsvR+lnXuf1AQkGxFEfECwIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQU5PTvF6qWPxJi4OL6mIivtOV0
-TkwwHwYDVR0jBBgwFoAU7lRSOihzIJ1WLSqY9JyxffvFIkcwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAHl9k4tLP38Cm1zCbqYMKhZ1ee6mFeRU4Dogt2JSHIWuA1q7mj0f9Bmv
-eZLC4Hg4bUI5dQe6B298WlAyEDto+drEqAdWP3HsbmXcIA+rwwtPVRWelE6YyfnX
-avXkSV0duh+5Fia1byvnUjm5qmBYw7nrxSCSocunBo8fQTW2yaV+nLp39rOSR7pX
-4rPlAmrR41LWNYuMR9D5Lq2bFEMRgfHHOLA+zDvKOeiDAeT7yf+7a5Y6IuBN2Aa4
-Voq1+IQSaK7HBQDT1x89ifTJJ2i+0AfMx9Pr1WDjwiqFS8tTXNKS9u9jNPCgHkCb
-eA0qLN82nCY6FoI5Nl/TW7okjLAYp9E=
+MIIDvzCCAqegAwIBAgIBEzANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTA4MDEwMTAw
+MDAwMFoXDTE1MDEwMTAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAMmoCBqzCV0g9O57cw1Wgj3a1/PklDQEH9G/j3us2OxLs9Laukc9GRLL
+HRL/3WSL05efVoC1NQD6+1YgLJbW5XOHMHKYEeqH+jXNcKn1ohawbWTWaD5Npfy4
+7NdumjOEiNdQq38uN1LEIYBrjkzclcWepd1GxvBtvdYD0ItaPEsHYZC7TgtY5b4d
+ludmAxKWbOfkc0kQINt0Pcq9wk1HRk4vHswJtwphFKC3egzxXhXoh0q4P0Kjc44A
+9YHiuR5qsxE++YQO6FkX/d2Or+KICYhD9okVr5E2tPi5n6V1oTkhrQP9wGDF56rj
+TsO/Afjna933etomEjzXZCgu2jbW+gsCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFPvf1ImiqeC+sOP8rcn5gIU8MLWBMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQBPn0l9IVWk2GMMeS9K
+Ys8xuZQY6Cfj3nNTGQvAzdA1iUCpKUxkL653Si23ehzXi0CLWkSY24MiKOdLzEtt
+SaPkI+6uc8k3BnsSyYPvUGS9cVsBnP9e6YaRUaP0bhUHTyNGgtcRlXnnnJy7EJD1
+2ppObyq19WjtbKXxaW32qm0C3xDCsXs1HSCfYYXLgZ/nqjYSevCjMSmntKliZtYt
+TT/Yn1wb4gYxN5JRpz9dkRtFxUu+sti5WfZNRVKv1NDb8oUBm/rPG1SFfHk6P/Wo
+senXQSEL0EgD0LruTc8e3/VXJdkf3DRPe/dos2Wq4w9Q6B8OUBrISCJrvKGuzLNy
+lMIk
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/pre_june_2016.pem b/net/data/ssl/certificates/pre_june_2016.pem
index 8018703..10d5aef 100644
--- a/net/data/ssl/certificates/pre_june_2016.pem
+++ b/net/data/ssl/certificates/pre_june_2016.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 21 (0x15)
+        Serial Number: 22 (0x16)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: May  1 00:00:00 2016 GMT
             Not After : Jul  3 00:00:00 2017 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b6:24:4c:22:10:05:0c:31:f6:ff:fa:4f:2f:bb:
-                    d2:24:7a:b0:a3:a7:6a:95:94:13:be:50:9e:2a:6e:
-                    79:bf:79:42:7c:b4:18:9c:d3:df:45:05:12:0f:df:
-                    e9:e7:92:0c:be:1a:32:81:87:de:28:a2:23:e0:6d:
-                    11:3b:28:ee:a8:00:ec:72:e5:10:c2:a0:21:57:e9:
-                    29:1d:12:6b:3a:64:4c:85:89:ba:27:9a:71:de:e8:
-                    5a:6b:e2:0c:10:f0:f1:27:36:ce:b8:7e:b5:c3:cb:
-                    fa:37:2b:a7:bc:ee:d1:89:0a:cd:a5:de:d8:cd:ee:
-                    0b:9b:ee:76:64:83:d6:f3:73:a0:fd:47:cf:84:e6:
-                    0d:7e:fd:4f:42:a5:ca:af:d8:0d:00:f6:0e:52:09:
-                    26:be:57:f1:25:3a:1d:df:4a:c2:bf:c9:9d:43:13:
-                    49:cc:4c:4d:3e:e1:6d:5e:6e:7a:6c:92:01:2f:d7:
-                    97:1b:5d:6b:9d:bb:a4:cd:b6:21:76:e9:41:97:29:
-                    8d:a8:97:27:fe:30:8c:ca:39:62:60:c2:ca:d7:a4:
-                    34:07:62:68:32:5f:3c:52:92:31:f8:2f:59:32:dd:
-                    d7:7a:04:7d:3b:37:06:b9:44:b0:04:81:21:36:41:
-                    29:c4:b0:be:c7:87:d1:02:40:79:9d:6d:a9:1f:41:
-                    fa:d5
+                    00:b7:cf:66:d4:a6:c7:91:a5:b9:1e:8a:91:cf:51:
+                    54:07:f4:c2:a9:8e:ca:88:1f:51:cf:70:e2:93:07:
+                    ff:17:9b:cf:ae:88:85:3d:ab:f6:66:be:ac:d5:ea:
+                    61:d7:54:86:36:12:dd:98:8c:bc:3a:86:54:f0:08:
+                    d3:84:18:ab:ed:11:1a:41:1c:9f:cd:ec:97:8f:22:
+                    5a:f1:cb:d3:c0:bb:c2:ac:45:d4:bd:aa:ab:b3:ac:
+                    ea:5b:da:20:24:e7:9e:03:97:3e:a4:c6:c1:ba:b4:
+                    c4:69:6f:9d:7e:81:3d:58:96:80:0c:91:de:71:9f:
+                    d8:24:73:8e:8b:f0:64:be:4e:9b:c4:3a:c1:9c:ef:
+                    3c:05:06:c7:a7:ba:34:1b:ff:d7:87:96:00:30:db:
+                    6d:74:f2:ae:f4:cb:a6:9e:b9:42:8a:58:6d:3e:e7:
+                    54:11:2e:b8:12:5a:c9:c1:21:d4:a1:c7:ce:5e:3e:
+                    c5:75:03:38:7a:8d:20:13:ef:d8:f8:a4:9c:1e:04:
+                    7b:28:b0:d1:24:e1:14:d3:ff:18:2a:de:a0:c8:00:
+                    47:80:9a:86:c9:3d:0a:48:d8:0c:63:df:7b:1b:f3:
+                    b6:d5:b8:14:1d:7a:40:eb:06:7c:23:b1:77:ab:1a:
+                    60:a2:36:7f:0a:e3:9b:75:01:11:7d:af:29:5b:7b:
+                    f8:21
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                A0:47:EE:7C:C6:CD:E0:DB:3C:82:9B:C6:9E:59:AD:67:65:21:CA:31
+                D5:17:E7:68:DB:E1:51:CE:A3:7C:B7:76:EE:CD:89:C1:33:1E:98:86
             X509v3 Authority Key Identifier: 
-                keyid:43:43:FB:54:41:BE:07:E9:5B:E2:B9:75:97:6A:52:DE:F4:28:02:53
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         b2:27:20:1e:81:14:5b:25:ac:5e:f9:14:14:72:46:b9:0f:a0:
-         f8:fa:cd:58:13:19:e4:a5:ef:f3:2c:6a:c4:2f:9b:dd:d6:91:
-         79:d0:94:a7:4c:96:fc:e4:e1:6f:1e:da:3c:15:02:d3:8f:12:
-         3f:c0:e4:49:3a:e2:cc:89:dd:5e:cc:28:86:6d:ba:b5:b9:dd:
-         06:83:3a:63:fb:9d:6e:29:15:5f:30:eb:7a:fe:8c:2d:cb:22:
-         e9:c7:5c:09:a8:ce:d0:9b:65:47:bc:8e:6a:e8:88:dd:14:bd:
-         74:eb:72:b5:3b:fb:ff:5e:3a:78:c2:48:5a:55:1a:1c:0e:29:
-         06:af:9e:c1:55:ce:16:d0:c7:c5:7f:95:7a:6c:e7:1a:f4:a8:
-         7a:b2:ae:ad:b7:b5:90:c5:62:e7:dd:69:ec:a7:19:ec:6c:c5:
-         54:18:9c:2e:f0:79:6e:e6:b5:85:dd:24:05:8d:5f:c1:33:01:
-         96:b1:37:99:1e:df:42:e4:e5:cf:b1:f9:ea:49:c3:2e:a1:f6:
-         ce:20:19:5b:fd:5a:f6:ef:53:de:19:77:2b:04:df:bb:b9:cb:
-         3b:c6:74:bd:40:9f:57:44:2a:d0:75:30:ca:e4:c7:7b:22:18:
-         73:d4:5a:e9:81:d8:76:85:29:8e:83:13:13:a2:61:ad:b1:12:
-         23:71:35:d9
+         94:67:c8:ba:c7:18:21:a5:11:8c:39:e6:d2:17:47:a5:ac:04:
+         ce:88:a4:86:9d:a7:a9:3f:e2:fc:54:13:28:b3:4d:a4:04:96:
+         21:cc:d1:3f:d2:94:fe:d3:bb:99:49:41:4d:2b:fc:61:be:a1:
+         3c:01:88:03:1b:62:c6:5f:f8:ae:20:70:ba:82:65:50:10:ef:
+         f3:1e:7b:cd:76:c3:a2:77:b9:6f:28:13:3e:6e:76:57:2b:8a:
+         eb:4e:21:86:9d:f2:98:c9:89:f0:bd:c4:2c:62:e9:bd:3b:1f:
+         50:ee:0f:94:65:9f:16:04:1f:27:18:a4:fc:7b:7c:b5:16:72:
+         56:a2:dc:6c:6a:04:e8:45:03:82:d6:f5:54:9e:b2:59:f8:a2:
+         8a:8b:77:ef:a3:ab:b2:b9:2b:a3:a6:40:45:b0:f3:48:3f:4b:
+         18:d2:8d:49:45:ab:a8:34:46:c9:70:9d:02:75:3b:7e:27:9f:
+         11:69:0a:fa:46:25:3e:e0:17:24:32:12:c2:2a:a9:4a:a2:d5:
+         8e:62:b9:2d:3e:75:f9:d0:84:cd:e3:cb:45:16:81:3b:5a:80:
+         7c:d9:96:78:76:9f:df:ae:93:61:8e:b8:31:28:d6:a2:6c:80:
+         86:67:06:33:1b:71:7d:73:62:df:fc:e1:6c:01:b4:6d:73:19:
+         50:fe:1e:47
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBFTANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTYwNTAxMDAwMDAwWhcNMTcwNzAzMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtiRMIhAFDDH2//pPL7vSJHqwo6dq
-lZQTvlCeKm55v3lCfLQYnNPfRQUSD9/p55IMvhoygYfeKKIj4G0ROyjuqADscuUQ
-wqAhV+kpHRJrOmRMhYm6J5px3uhaa+IMEPDxJzbOuH61w8v6NyunvO7RiQrNpd7Y
-ze4Lm+52ZIPW83Og/UfPhOYNfv1PQqXKr9gNAPYOUgkmvlfxJTod30rCv8mdQxNJ
-zExNPuFtXm56bJIBL9eXG11rnbukzbYhdulBlymNqJcn/jCMyjliYMLK16Q0B2Jo
-Ml88UpIx+C9ZMt3XegR9OzcGuUSwBIEhNkEpxLC+x4fRAkB5nW2pH0H61QIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUoEfufMbN4Ns8gpvGnlmtZ2Uh
-yjEwHwYDVR0jBBgwFoAUQ0P7VEG+B+lb4rl1l2pS3vQoAlMwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBALInIB6BFFslrF75FBRyRrkPoPj6zVgTGeSl7/MsasQvm93WkXnQlKdM
-lvzk4W8e2jwVAtOPEj/A5Ek64syJ3V7MKIZturW53QaDOmP7nW4pFV8w63r+jC3L
-IunHXAmoztCbZUe8jmroiN0UvXTrcrU7+/9eOnjCSFpVGhwOKQavnsFVzhbQx8V/
-lXps5xr0qHqyrq23tZDFYufdaeynGexsxVQYnC7weW7mtYXdJAWNX8EzAZaxN5ke
-30Lk5c+x+epJwy6h9s4gGVv9WvbvU94ZdysE37u5yzvGdL1An1dEKtB1MMrkx3si
-GHPUWumB2HaFKY6DExOiYa2xEiNxNdk=
+MIIDvzCCAqegAwIBAgIBFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE2MDUwMTAw
+MDAwMFoXDTE3MDcwMzAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALfPZtSmx5GluR6Kkc9RVAf0wqmOyogfUc9w4pMH/xebz66IhT2r9ma+
+rNXqYddUhjYS3ZiMvDqGVPAI04QYq+0RGkEcn83sl48iWvHL08C7wqxF1L2qq7Os
+6lvaICTnngOXPqTGwbq0xGlvnX6BPViWgAyR3nGf2CRzjovwZL5Om8Q6wZzvPAUG
+x6e6NBv/14eWADDbbXTyrvTLpp65QopYbT7nVBEuuBJaycEh1KHHzl4+xXUDOHqN
+IBPv2PiknB4Eeyiw0SThFNP/GCreoMgAR4Cahsk9CkjYDGPfexvzttW4FB16QOsG
+fCOxd6saYKI2fwrjm3UBEX2vKVt7+CECAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFNUX52jb4VHOo3y3du7NicEzHpiGMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCUZ8i6xxghpRGMOebS
+F0elrATOiKSGnaepP+L8VBMos02kBJYhzNE/0pT+07uZSUFNK/xhvqE8AYgDG2LG
+X/iuIHC6gmVQEO/zHnvNdsOid7lvKBM+bnZXK4rrTiGGnfKYyYnwvcQsYum9Ox9Q
+7g+UZZ8WBB8nGKT8e3y1FnJWotxsagToRQOC1vVUnrJZ+KKKi3fvo6uyuSujpkBF
+sPNIP0sY0o1JRauoNEbJcJ0CdTt+J58RaQr6RiU+4BckMhLCKqlKotWOYrktPnX5
+0ITN48tFFoE7WoB82ZZ4dp/frpNhjrgxKNaibICGZwYzG3F9c2Lf/OFsAbRtcxlQ
+/h5H
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/punycodetest.pem b/net/data/ssl/certificates/punycodetest.pem
index 6a16f6f..8b7fe73 100644
--- a/net/data/ssl/certificates/punycodetest.pem
+++ b/net/data/ssl/certificates/punycodetest.pem
@@ -1,35 +1,35 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 17530995897422524617 (0xf34a9be2b0b330c9)
+        Serial Number: 10431067552074120060 (0x90c298ac257b3b7c)
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=xn--wgv71a119e.com
         Validity
-            Not Before: Aug 25 23:35:52 2014 GMT
-            Not After : Aug 22 23:35:52 2024 GMT
+            Not Before: Jun  5 17:10:47 2017 GMT
+            Not After : Jun  3 17:10:47 2027 GMT
         Subject: CN=xn--wgv71a119e.com
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:cd:fe:21:97:48:33:2f:76:4b:e8:8f:07:40:41:
-                    0f:64:0f:77:29:a5:85:ad:86:44:eb:8d:29:23:b5:
-                    b5:56:b4:09:fc:59:35:ff:d0:df:fe:01:f5:e5:c6:
-                    c6:ee:8e:33:45:fd:fd:a6:d4:ad:e0:7b:cf:fd:5a:
-                    8d:89:c0:87:bc:b9:5c:dd:19:16:d4:7d:1b:48:c0:
-                    29:d6:7f:ff:c7:4f:22:e9:35:32:ee:7e:75:ad:99:
-                    e6:ae:73:d6:fa:db:ec:ba:7b:13:b2:6d:5e:fb:31:
-                    63:6a:7f:80:9b:6f:ab:02:ff:dd:8e:a8:dd:f7:74:
-                    f7:67:1e:e7:53:07:b2:b2:55:a8:6b:df:24:5a:b1:
-                    8a:35:f1:5b:ea:a3:28:fe:d7:53:44:50:c6:b4:8b:
-                    2d:c8:6d:71:4a:43:57:0b:81:66:82:65:f6:db:4b:
-                    32:40:e9:43:3a:e0:aa:f5:7c:62:d8:7a:7e:21:c9:
-                    0f:da:90:11:2c:14:16:6a:2d:fd:8e:f3:cf:4a:ed:
-                    6f:45:23:cb:04:56:95:e9:9e:91:cf:93:bf:ef:6c:
-                    57:1c:c0:64:37:76:7a:38:5d:94:4c:1d:79:e8:63:
-                    a4:80:ea:51:f6:28:37:d2:6f:3c:70:b9:97:32:79:
-                    c2:18:94:66:f3:19:f3:ac:0f:a0:2f:a0:66:9d:d3:
-                    0e:37
+                    00:c7:8e:c3:54:a1:02:4a:e0:97:7a:13:a3:42:57:
+                    03:9e:f5:1e:61:69:35:f3:be:f8:92:2d:fe:47:5e:
+                    0d:dc:7d:b8:79:bb:ce:7d:dd:ce:45:82:ff:ce:23:
+                    56:0d:b3:08:ef:ab:67:02:50:6d:e6:dc:83:e1:9e:
+                    a9:ac:5b:6a:6d:bd:b1:ef:78:d5:5c:4d:1f:d0:47:
+                    d9:b3:d8:d0:5c:ad:fc:76:ac:7f:f7:33:b3:a0:bc:
+                    99:3f:b7:8b:e1:ca:d7:98:78:d4:aa:10:1a:9a:1a:
+                    84:f8:a9:fe:34:96:75:66:1c:36:5f:2d:8d:12:bf:
+                    7e:24:7c:87:b3:d5:f4:07:73:d6:b8:e2:a0:f1:11:
+                    fe:6b:37:0a:cb:0f:e4:23:b3:67:77:3c:16:72:af:
+                    c5:11:62:18:1d:9e:be:f9:ce:62:29:91:2e:7f:2f:
+                    c5:ee:de:98:ef:f8:43:97:cc:65:92:87:4f:70:5d:
+                    62:23:f2:22:dc:48:e1:7c:9e:97:e5:d3:84:27:93:
+                    37:d6:45:ea:e3:1d:de:9f:06:b5:99:2d:2a:70:ab:
+                    76:34:95:7d:3d:43:9f:c8:35:5b:06:cf:94:d9:7c:
+                    ed:cf:a3:b3:0b:f1:ad:b6:9d:cd:44:17:61:c8:97:
+                    7a:26:10:4b:fd:ae:6d:11:a9:87:cc:14:eb:24:32:
+                    eb:9d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
@@ -37,37 +37,37 @@
             X509v3 Subject Alternative Name: 
                 DNS:xn--wgv71a119e.com, DNS:*.xn--wgv71a119e.com, DNS:blahblahblahblah.com
     Signature Algorithm: sha256WithRSAEncryption
-         7d:29:70:ce:ec:60:99:30:82:c4:ba:c3:cc:72:f8:3b:bf:e3:
-         5c:0d:45:7a:23:d5:85:a9:db:a9:f4:fc:11:0d:59:d5:3e:f0:
-         b0:a6:db:82:dd:88:61:d1:17:6a:a9:a7:64:b0:0b:fd:b6:d6:
-         d5:ba:4d:83:72:c8:a1:b5:5b:a3:fb:17:78:14:86:58:09:2d:
-         35:1e:a8:19:75:25:55:38:e5:8d:74:2a:c5:fd:11:95:43:41:
-         a7:d8:1b:50:b7:5a:20:39:8e:bd:06:28:4a:d6:d3:28:3d:1d:
-         46:cc:64:9b:0b:1e:12:c8:64:1a:b5:b8:6f:99:46:78:ca:e3:
-         c1:1f:0c:72:6b:38:e2:7f:86:87:14:0b:13:d1:9b:64:50:d4:
-         c1:e6:36:5e:c0:66:29:3d:e4:61:7b:d0:e2:94:8f:60:d6:91:
-         4a:31:36:f0:e6:70:75:9f:02:f3:d6:90:6a:12:10:a8:35:0e:
-         ab:70:a7:c6:3a:21:e7:c2:ec:b4:42:1f:b5:43:eb:93:b8:60:
-         ee:93:a3:17:aa:e3:23:2a:34:74:9d:b1:91:78:82:8f:6b:85:
-         6e:94:9d:00:4f:65:85:de:c9:30:e2:22:6e:60:7a:c6:98:7e:
-         8f:76:3f:2c:18:09:4b:91:95:53:67:66:c0:44:1e:9e:0a:a1:
-         c1:71:87:9e
+         c4:81:b1:91:37:f7:df:1e:a4:56:f6:03:95:4c:67:2d:b9:a3:
+         ed:e0:2c:37:2d:bd:d1:6a:9e:a2:c4:66:3b:f8:7c:5a:cb:ec:
+         57:64:e6:1d:20:85:cc:24:99:33:9c:cd:38:0e:03:c4:13:f6:
+         b4:c6:d1:ea:6c:bd:34:1b:71:24:15:35:20:be:87:a0:97:0e:
+         32:42:24:18:b8:8b:0f:15:da:73:42:0e:d7:fa:b9:7a:1b:a9:
+         3e:71:64:a0:12:36:91:1f:5f:ae:0d:c4:26:22:fb:19:11:b6:
+         75:92:1e:f4:ef:79:68:ef:9b:fc:3a:a6:11:9d:aa:9e:11:64:
+         74:54:ba:80:a0:b9:3b:28:f9:3d:54:95:25:da:54:8e:38:47:
+         6a:b0:d5:ec:33:a6:3c:b7:60:86:c9:03:ee:7d:5e:3f:c5:f1:
+         e8:4c:1d:4a:20:be:02:43:bd:e2:cc:4c:c6:13:2a:4a:b8:80:
+         67:98:7b:5f:ae:3b:48:16:ba:46:da:a1:0e:88:22:85:f9:48:
+         1b:04:64:0f:09:a5:89:1e:4f:ca:ce:39:60:27:f3:ea:ee:29:
+         ff:27:58:88:ad:eb:1d:ac:6a:46:a5:66:a3:43:e9:7f:ce:01:
+         8a:33:31:a2:fc:64:26:9b:e9:0e:a9:af:76:be:b7:d9:59:6a:
+         71:15:b4:fb
 -----BEGIN CERTIFICATE-----
-MIIDGzCCAgOgAwIBAgIJAPNKm+KwszDJMA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNV
-BAMMEnhuLS13Z3Y3MWExMTllLmNvbTAeFw0xNDA4MjUyMzM1NTJaFw0yNDA4MjIy
-MzM1NTJaMB0xGzAZBgNVBAMMEnhuLS13Z3Y3MWExMTllLmNvbTCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAM3+IZdIMy92S+iPB0BBD2QPdymlha2GROuN
-KSO1tVa0CfxZNf/Q3/4B9eXGxu6OM0X9/abUreB7z/1ajYnAh7y5XN0ZFtR9G0jA
-KdZ//8dPIuk1Mu5+da2Z5q5z1vrb7Lp7E7JtXvsxY2p/gJtvqwL/3Y6o3fd092ce
-51MHsrJVqGvfJFqxijXxW+qjKP7XU0RQxrSLLchtcUpDVwuBZoJl9ttLMkDpQzrg
-qvV8Yth6fiHJD9qQESwUFmot/Y7zz0rtb0UjywRWlemekc+Tv+9sVxzAZDd2ejhd
-lEwdeehjpIDqUfYoN9JvPHC5lzJ5whiUZvMZ86wPoC+gZp3TDjcCAwEAAaNeMFww
+MIIDGzCCAgOgAwIBAgIJAJDCmKwlezt8MA0GCSqGSIb3DQEBCwUAMB0xGzAZBgNV
+BAMMEnhuLS13Z3Y3MWExMTllLmNvbTAeFw0xNzA2MDUxNzEwNDdaFw0yNzA2MDMx
+NzEwNDdaMB0xGzAZBgNVBAMMEnhuLS13Z3Y3MWExMTllLmNvbTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMeOw1ShAkrgl3oTo0JXA571HmFpNfO++JIt
+/kdeDdx9uHm7zn3dzkWC/84jVg2zCO+rZwJQbebcg+Geqaxbam29se941VxNH9BH
+2bPY0Fyt/Hasf/czs6C8mT+3i+HK15h41KoQGpoahPip/jSWdWYcNl8tjRK/fiR8
+h7PV9Adz1rjioPER/ms3CssP5COzZ3c8FnKvxRFiGB2evvnOYimRLn8vxe7emO/4
+Q5fMZZKHT3BdYiPyItxI4Xyel+XThCeTN9ZF6uMd3p8GtZktKnCrdjSVfT1Dn8g1
+WwbPlNl87c+jswvxrbadzUQXYciXeiYQS/2ubRGph8wU6yQy650CAwEAAaNeMFww
 DwYDVR0TAQH/BAUwAwEB/zBJBgNVHREEQjBAghJ4bi0td2d2NzFhMTE5ZS5jb22C
 FCoueG4tLXdndjcxYTExOWUuY29tghRibGFoYmxhaGJsYWhibGFoLmNvbTANBgkq
-hkiG9w0BAQsFAAOCAQEAfSlwzuxgmTCCxLrDzHL4O7/jXA1FeiPVhanbqfT8EQ1Z
-1T7wsKbbgt2IYdEXaqmnZLAL/bbW1bpNg3LIobVbo/sXeBSGWAktNR6oGXUlVTjl
-jXQqxf0RlUNBp9gbULdaIDmOvQYoStbTKD0dRsxkmwseEshkGrW4b5lGeMrjwR8M
-cms44n+GhxQLE9GbZFDUweY2XsBmKT3kYXvQ4pSPYNaRSjE28OZwdZ8C89aQahIQ
-qDUOq3Cnxjoh58LstEIftUPrk7hg7pOjF6rjIyo0dJ2xkXiCj2uFbpSdAE9lhd7J
-MOIibmB6xph+j3Y/LBgJS5GVU2dmwEQengqhwXGHng==
+hkiG9w0BAQsFAAOCAQEAxIGxkTf33x6kVvYDlUxnLbmj7eAsNy290WqeosRmO/h8
+WsvsV2TmHSCFzCSZM5zNOA4DxBP2tMbR6my9NBtxJBU1IL6HoJcOMkIkGLiLDxXa
+c0IO1/q5ehupPnFkoBI2kR9frg3EJiL7GRG2dZIe9O95aO+b/DqmEZ2qnhFkdFS6
+gKC5Oyj5PVSVJdpUjjhHarDV7DOmPLdghskD7n1eP8Xx6EwdSiC+AkO94sxMxhMq
+SriAZ5h7X647SBa6RtqhDogihflIGwRkDwmliR5Pys45YCfz6u4p/ydYiK3rHaxq
+RqVmo0Ppf84BijMxovxkJpvpDqmvdr632VlqcRW0+w==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/reject_intranet_hosts.pem b/net/data/ssl/certificates/reject_intranet_hosts.pem
index e2d43b7..a6b3f64fae 100644
--- a/net/data/ssl/certificates/reject_intranet_hosts.pem
+++ b/net/data/ssl/certificates/reject_intranet_hosts.pem
@@ -1,69 +1,69 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 11446371030079207460 (0x9ed9adce6f317824)
+        Serial Number: 15572396188146182397 (0xd81c43d3b819a8fd)
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=webmail
         Validity
-            Not Before: Mar  1 03:41:00 2017 GMT
-            Not After : Feb 29 03:41:00 2020 GMT
+            Not Before: Jun  5 17:10:47 2017 GMT
+            Not After : Jun  4 17:10:47 2020 GMT
         Subject: CN=webmail
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:be:3d:d3:32:19:9f:d4:0f:b8:fa:83:0d:4d:77:
-                    6a:00:b6:cc:16:45:70:45:a1:1b:29:2c:6b:43:82:
-                    29:9c:f9:9c:b5:37:e5:a8:3b:f8:b9:fa:96:df:7b:
-                    a9:a0:fc:a4:cf:19:49:e7:c3:2b:94:a0:02:d8:5c:
-                    17:f3:84:ec:8b:0c:1b:d6:cd:30:36:d1:41:35:46:
-                    c7:a9:62:73:2a:84:de:cf:59:51:8e:92:38:4a:af:
-                    f6:e0:7e:db:9e:19:7a:d0:8c:79:c8:4d:53:8c:6d:
-                    41:4c:04:b9:08:84:c8:81:eb:6b:65:ac:65:8d:d1:
-                    26:a9:31:3a:61:34:2e:70:91:da:c7:98:ff:73:de:
-                    95:7a:bf:90:6f:a5:94:d7:6f:e0:10:4b:79:ee:44:
-                    4b:a3:46:d1:9b:7d:14:77:7f:9d:74:6f:6c:a4:a7:
-                    8f:53:be:1f:fd:28:e8:c1:a7:03:11:57:fc:cb:08:
-                    d0:96:cd:41:66:cb:4f:e2:9e:22:d3:96:4b:97:f8:
-                    a9:a2:34:58:f3:95:50:59:fd:7f:c9:11:d4:1c:f1:
-                    af:b8:fd:35:55:86:5e:13:bf:e7:60:8f:90:76:50:
-                    c5:ef:06:95:88:b7:99:2e:1d:07:8f:4b:57:9f:5f:
-                    8d:f3:10:76:75:f0:72:0d:9e:48:0b:4e:d9:34:d0:
-                    49:05
+                    00:ea:65:9e:eb:22:3a:b0:1c:eb:57:da:85:42:7e:
+                    2a:3d:f7:a7:54:b5:81:19:71:c3:b5:ae:ee:7e:85:
+                    1a:7a:23:61:76:3b:4e:bc:a6:a6:7f:e7:3d:b5:4b:
+                    b8:d3:c9:df:d2:a2:36:11:9f:9f:bc:36:19:87:4c:
+                    43:89:c1:b3:0e:2c:bd:36:d7:d3:a4:00:52:06:01:
+                    fb:a8:99:49:5c:46:bc:2b:9c:52:6e:b6:d0:e8:7d:
+                    4a:e6:a3:d3:e0:d9:f4:cf:e5:67:e7:37:51:fc:d5:
+                    5f:03:70:9c:b0:4b:c9:f4:db:91:42:86:40:60:73:
+                    d8:7d:38:f1:e4:a8:16:93:e2:83:0f:03:52:9b:9c:
+                    d0:d0:6d:3d:be:04:9c:14:21:b0:e5:97:c9:02:9e:
+                    92:34:2d:02:70:0a:74:21:91:1d:f7:cd:27:49:7f:
+                    93:48:5d:7a:02:d9:00:bd:3f:ab:ce:0c:96:3f:a5:
+                    b0:04:93:b9:14:62:5b:c4:8d:ee:3e:bc:2d:aa:a7:
+                    b5:ca:54:58:98:3f:a3:41:d4:e8:87:08:02:7d:89:
+                    bf:2a:83:ae:ba:92:22:8e:19:3c:55:6b:f8:f4:53:
+                    c3:03:e9:14:1d:5c:80:e1:71:5f:6a:2e:51:cf:d2:
+                    2d:2a:5d:50:58:03:06:70:be:1e:6e:d5:e0:2b:b2:
+                    7d:9d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Alternative Name: 
                 DNS:webmail
     Signature Algorithm: sha256WithRSAEncryption
-         10:c1:6c:f1:d6:5c:a7:94:c6:dd:9d:e4:2c:9b:1a:1a:59:84:
-         35:32:b3:7f:57:d6:4c:01:fa:ed:78:44:ec:2c:cf:2c:72:31:
-         a8:95:c9:50:0d:a5:fe:4c:68:ce:21:b5:bc:4c:a0:b2:84:39:
-         33:24:f8:92:05:9f:ea:c4:0e:31:22:85:27:e4:2a:8a:66:b3:
-         05:96:60:97:0c:2c:86:69:76:ef:ac:15:4f:36:ac:5a:bd:11:
-         69:30:c3:a8:7e:f4:23:ca:7e:3d:83:0f:8b:35:bd:56:d0:5f:
-         fc:fa:98:9e:45:54:04:d3:0a:43:3d:b7:01:ca:0b:4b:5c:61:
-         34:fe:af:f1:8b:c0:bc:0a:b5:dd:52:e6:c2:81:53:c9:ce:fc:
-         39:f4:1a:45:a6:f6:9a:06:eb:57:d9:bb:5e:94:43:98:7f:96:
-         33:1d:5f:9b:c5:73:68:86:96:8f:65:8f:be:b7:f2:c5:8f:f0:
-         0e:7f:63:67:9d:58:1d:d9:cb:fc:78:a0:74:e7:06:94:12:80:
-         03:ab:0a:32:8c:1e:5e:ba:28:a7:eb:ed:3b:55:80:54:38:5b:
-         85:d8:e8:dd:de:51:11:42:7a:20:ef:b7:9f:25:d3:5a:4b:e2:
-         e3:84:36:94:e3:69:aa:c7:bf:22:14:0e:da:a8:da:13:89:c3:
-         6e:7e:8c:32
+         69:b0:cd:3e:65:2f:da:f6:0f:13:e8:ba:91:0d:c6:1a:4c:71:
+         5a:4f:b6:2a:4d:87:29:53:7b:9d:53:c1:fb:bc:46:be:13:34:
+         68:0f:57:6d:85:85:93:5f:69:74:ea:3d:34:8c:bc:c2:64:8e:
+         59:e0:53:d8:ac:35:64:c3:77:19:d6:dd:4d:cc:b9:f3:9e:fb:
+         d7:d8:78:7b:5a:d2:aa:01:72:89:73:a1:a5:b2:75:01:ba:04:
+         33:65:4f:eb:37:d4:41:3b:9c:3f:7a:d6:22:61:e6:fe:8d:92:
+         cf:f1:e0:70:ad:58:2f:5c:37:0c:69:1c:bf:05:f7:ec:9b:cb:
+         87:eb:bd:8d:13:45:bf:ac:3c:80:d7:e4:f1:bd:40:50:dc:25:
+         98:4f:50:13:8c:65:bc:c9:5f:62:33:c3:b6:13:34:22:d2:18:
+         c5:80:77:bb:46:44:68:33:b3:50:f2:dc:de:5a:03:b3:9c:e9:
+         f5:15:65:29:55:56:10:cd:bd:c7:54:59:9e:4a:1a:3b:9c:64:
+         d5:1e:fb:fa:26:d7:ba:5d:14:59:3a:3a:8e:61:98:4e:41:24:
+         4c:c3:a0:25:26:f8:16:ba:d9:22:51:54:69:1e:a4:cf:d9:21:
+         30:de:3a:09:31:55:d5:bd:3d:ab:2f:c0:37:c6:78:54:df:38:
+         8c:02:bb:70
 -----BEGIN CERTIFICATE-----
-MIICvTCCAaWgAwIBAgIJAJ7Zrc5vMXgkMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV
-BAMMB3dlYm1haWwwHhcNMTcwMzAxMDM0MTAwWhcNMjAwMjI5MDM0MTAwWjASMRAw
+MIICvTCCAaWgAwIBAgIJANgcQ9O4Gaj9MA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV
+BAMMB3dlYm1haWwwHhcNMTcwNjA1MTcxMDQ3WhcNMjAwNjA0MTcxMDQ3WjASMRAw
 DgYDVQQDDAd3ZWJtYWlsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-vj3TMhmf1A+4+oMNTXdqALbMFkVwRaEbKSxrQ4IpnPmctTflqDv4ufqW33upoPyk
-zxlJ58MrlKAC2FwX84Tsiwwb1s0wNtFBNUbHqWJzKoTez1lRjpI4Sq/24H7bnhl6
-0Ix5yE1TjG1BTAS5CITIgetrZaxljdEmqTE6YTQucJHax5j/c96Ver+Qb6WU12/g
-EEt57kRLo0bRm30Ud3+ddG9spKePU74f/SjowacDEVf8ywjQls1BZstP4p4i05ZL
-l/ipojRY85VQWf1/yRHUHPGvuP01VYZeE7/nYI+QdlDF7waViLeZLh0Hj0tXn1+N
-8xB2dfByDZ5IC07ZNNBJBQIDAQABoxYwFDASBgNVHREECzAJggd3ZWJtYWlsMA0G
-CSqGSIb3DQEBCwUAA4IBAQAQwWzx1lynlMbdneQsmxoaWYQ1MrN/V9ZMAfrteETs
-LM8scjGolclQDaX+TGjOIbW8TKCyhDkzJPiSBZ/qxA4xIoUn5CqKZrMFlmCXDCyG
-aXbvrBVPNqxavRFpMMOofvQjyn49gw+LNb1W0F/8+pieRVQE0wpDPbcBygtLXGE0
-/q/xi8C8CrXdUubCgVPJzvw59BpFpvaaButX2btelEOYf5YzHV+bxXNohpaPZY++
-t/LFj/AOf2NnnVgd2cv8eKB05waUEoADqwoyjB5euiin6+07VYBUOFuF2Ojd3lER
-Qnog77efJdNaS+LjhDaU42mqx78iFA7aqNoTicNufowy
+6mWe6yI6sBzrV9qFQn4qPfenVLWBGXHDta7ufoUaeiNhdjtOvKamf+c9tUu408nf
+0qI2EZ+fvDYZh0xDicGzDiy9NtfTpABSBgH7qJlJXEa8K5xSbrbQ6H1K5qPT4Nn0
+z+Vn5zdR/NVfA3CcsEvJ9NuRQoZAYHPYfTjx5KgWk+KDDwNSm5zQ0G09vgScFCGw
+5ZfJAp6SNC0CcAp0IZEd980nSX+TSF16AtkAvT+rzgyWP6WwBJO5FGJbxI3uPrwt
+qqe1ylRYmD+jQdTohwgCfYm/KoOuupIijhk8VWv49FPDA+kUHVyA4XFfai5Rz9It
+Kl1QWAMGcL4ebtXgK7J9nQIDAQABoxYwFDASBgNVHREECzAJggd3ZWJtYWlsMA0G
+CSqGSIb3DQEBCwUAA4IBAQBpsM0+ZS/a9g8T6LqRDcYaTHFaT7YqTYcpU3udU8H7
+vEa+EzRoD1dthYWTX2l06j00jLzCZI5Z4FPYrDVkw3cZ1t1NzLnznvvX2Hh7WtKq
+AXKJc6GlsnUBugQzZU/rN9RBO5w/etYiYeb+jZLP8eBwrVgvXDcMaRy/Bffsm8uH
+672NE0W/rDyA1+TxvUBQ3CWYT1ATjGW8yV9iM8O2EzQi0hjFgHe7RkRoM7NQ8tze
+WgOznOn1FWUpVVYQzb3HVFmeSho7nGTVHvv6Jte6XRRZOjqOYZhOQSRMw6AlJvgW
+utkiUVRpHqTP2SEw3joJMVXVvT2rL8A3xnhU3ziMArtw
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/root_ca_cert.pem b/net/data/ssl/certificates/root_ca_cert.pem
index 8ba21b5..73172139 100644
--- a/net/data/ssl/certificates/root_ca_cert.pem
+++ b/net/data/ssl/certificates/root_ca_cert.pem
@@ -1,101 +1,104 @@
 -----BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAtklB40IBUah/PHpx0/vNkTUXhBqO9jbH0XAd+obzbrt2b+gy
-Ljf9OJI9aOSKfUIzFEYb3AT2kW5UQMQKCf3sLWLiXuG6LJzBsWBM2sf4IlyCIGVC
-HlZ3dU/rkCxK6lcOIo1slawR6szX7vZwDQndpjVhXcl2bbDyHr8whth3UjaVlw7R
-RsXtgT0bsPJhlTzBQDjvX126YZ/vK5yfhYl0cGPVdug1fs4B4fMREZAcDfX9jc4Q
-bK18VRohb9ct9HgV6i84vZGePB0HRvVDwYKLrxJTZRmKaWlmBrLaC/oqAKEqFYRJ
-8QG/mzAG0BWgH51RkUfhU1/vXuzCYXnCFJ/E4wIDAQABAoIBAQCeoVG9Owt6zG8t
-akD0gQR7gQBd7d7LVRC+qhrskdP2YRzIdgB1SDQMrvbR+VCrgJiC5CAKcCdCmAip
-8+/okhidxpfIihdCC4hjm7JGEg9Vl7uGBZhsXkLGzC3q4SCwneGnH/uGpJ9S/cBM
-LBmGvzcsFPgObeupuXp6V1cbgfUUjQM4h7OpuETlvPOduMEBLj6MwWyVqq5lzBQf
-p6nUclEmiwL5izyNW6BSTbaBc36ekpAa/qsfIWtCZfmJ6gf5SfGn3alVYcd25rZ6
-1mDig4q+u7U2PBzavmELU+9fvUknSOod6eCyzw1S4PmgvCJrx5fZjfJwOq1vgihb
-w3zuPB/BAoGBAOS6goTVgJHCx1oTeJ6XR4p1tg5pxO5tnwhnWL9OIFE2Hlfbv50G
-sWfMkNGGpuKP34+eQM7bEAz+LTfGbe4eoeRVvxjPFjosmj8pXGMoc7bsYh0Bo14A
-0iUys48UTXLZlyC73wgeOpBTBYakIE13wdpCBxm7OaT3FTjdIiPc+AeVAoGBAMwF
-L0YUf6VeJFfQMkVxclxEbLdqfHIa4fBNR4gu9AwGr72ToCW8MhYWwdYLNRDC/jJD
-zSXbPs1erSfJNgigkvUiwEUMaqvOF3WfyKgJQXnc6MnTK67WbIol4oRe265n6y8P
-gpMaD1OdIsu3zPI9FryS/RJwMe+UjSII3hi7wxyXAoGABaIKQNc5OV3Apxk/qTg0
-jNZlS2mTbgPJHN3es6dq6FUa3jMNPwLBL7s7/c0BIydD7DeLhQykEo3X8z2xy2F5
-vzPVZvkCpSAgFFoiala+ssyThf9aVKBUjJH5Fhb76U4uiKHX1k1YR+GjizNTkFTY
-s1VY82tG+icToLjhdFymxxkCgYEAjLT6sJuMmXF/IS0OrsQaOjZawHjpkQynTMMP
-lYXEfNLTu6yn476S0JcrYkLie0fwZpxKTVSTULJ+O5VS9cpA8F3iOvzgSNNfbJkh
-m3qetLw9tIw2cWOjAfg07FQ7sGItWoyY4nkzntgd2mBOMbceCjpZ3bCRUAmk+Jcj
-De3ZF8sCgYAjbYNkZvUIHMTYTsuO/Tg4karzUebqlBgwOgrztJOtsOSPy9uaroZ3
-zRvTUw1UbdSeGi2QFt24wHOOrBLbGO6bYWKY3QyWnJ7m2gzEC2TijIdJ5n/BIkhE
-ysXW1YMMCGZgOSXvBDHf3AMUZwcnmLY99wAyNKwC+IDqsKbfjP8drA==
+MIIEpAIBAAKCAQEAxoEfknO2WIXZjay3IP3Hv0Cy6vrlC1IBj5rB63qAwfOJpD7V
+G2HMtc+AsRrbuyXgGL+SaSZQzec//w08tB8UEqtnN94HA2wSdII2rMPU02Sfke1b
+9ql6pJyY6GVslOHLVXOu+B1QsHjldP+xNyzLGT2kjOd2ToZcP9+z7UUjT1SbM8aJ
+XhMd3X1ZpQc0KIYnH/qeU08qtkKtNxJi9XI2tgISQET+x56ViUNRXrRux2eAWEO+
+zAcovVn/HEyNkEL0z/1UAE9IcivhZzyEF2iVv8oHe9+GnVbjMuNwh7f4OvfjbmUU
+fLt2txfxQoxvKjRkEDUUjIX2V7/zXFWdrQMQ8wIDAQABAoIBABUQ4PPe2cwdMFBL
+sweKRydxy0sKo0IHSukdiFTgJEfw+3t1u5HzWBE3WzXwXr9GrriRpA0KpuqjDvSX
+SAjpf2zXydVw95eSYYcBxqGhCrYAaLrI0MilhcFwaP3IvbQzHiwMYdYs7kI8IkW/
+WOQ9GbStCQh3C+QbeDDDIcodWzjw1sR5uFUu8WurGPQkQI2gwxzL9dtcU5LeP36G
+wpYZMuE6pJcZ7BmNE880YtUEhGJVWaYLv5b/VqeZ7AMcHV7kb2NlN+tMgxxObFte
+K/1RGemAd2U7TDRQVbsna/hAI1MX/QRXKJ8KsD3J6d6zjWO/SblFBqOPZNygLPtr
+Tqlf9PkCgYEA6N0feYjh4VSfwJKawKIZoVS7IH8klTBmGK4pOkTsUPdDcqiPErQ+
+gG8IIJNtO85wvmt79io/MQP/K0X4he41yvqD1uv9h/gErPZNZdxah0O1s7f28GRE
+AVLKPu82KSHIbjHDyO5JjSZhtM5erdN96J0Fn5crZf9bunopaTMkGY0CgYEA2joS
+U9uMyuwnmJWsb1VY4G59Mc7uz2owRLTZqJpMg7WiQETpE/VL72aQXPLoVHktFjzS
+xBO90krfYzQS3KQVQDgr4rljOHpkInMfgez7UBdbz+4Qp5xTQgltoHlAyOf2JMyU
+c1arW/vkJfpwX9wnZFnMCqwH6gu4DG8sdazA9H8CgYEAjbxZtg3c/twVSI9zZiDE
+XPBH3eXFjJEi846+RVtCQ53dDeMPAqF3EZGDbuCNMkPbV+vwTcs1H06BeANk25A8
+acnFiYGmlaYeonBgd8mByKcr57HnujYtNmj/9QKBAtQvPPNJafmwBxv/iJ+7/S2n
+i3hXveWzYqflW0GUBxY7uNkCgYEAqjiB80deGyr599tIFc/M88M7hI6VWNTLscwf
+u5Qf+tzDIr6d0COWh7bJBLe04a9jq+TlwmxjtJUSip8j11dl/CHUmZVh/7v4P6bs
+/LuNjHur8hUQiK03hFs2V+Y80nmdVjb91LnWEHn7DGS9Iwjm8S/aKLjns3hQp+JQ
+G7oVCKECgYAB2xZOrm4FE6/lwDKlMiZMMq+3YWfoKWTg0BscfCgcOJMunhEX9w3p
+W1Tpq6I4N+l81NVKbnwoUNImfI+JN7VXxmR+w1feierpWSFXrwsDIdpx54KVchuo
+N7/caM0W1tEFrcMKD7ECvJO6IK/vvB+MOe63WAqvaLCrcUd12qk4DA==
 -----END RSA PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 12789565514992013210 (0xb17daa12e8af4f9a)
-    Signature Algorithm: sha1WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Serial Number: 10687961985666567129 (0x945344cc7888cbd9)
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Aug 14 03:05:29 2014 GMT
-            Not After : Aug 11 03:05:29 2024 GMT
-        Subject: CN=Test Root CA
+            Not Before: Jun  5 17:10:44 2017 GMT
+            Not After : Jun  3 17:10:44 2027 GMT
+        Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b6:49:41:e3:42:01:51:a8:7f:3c:7a:71:d3:fb:
-                    cd:91:35:17:84:1a:8e:f6:36:c7:d1:70:1d:fa:86:
-                    f3:6e:bb:76:6f:e8:32:2e:37:fd:38:92:3d:68:e4:
-                    8a:7d:42:33:14:46:1b:dc:04:f6:91:6e:54:40:c4:
-                    0a:09:fd:ec:2d:62:e2:5e:e1:ba:2c:9c:c1:b1:60:
-                    4c:da:c7:f8:22:5c:82:20:65:42:1e:56:77:75:4f:
-                    eb:90:2c:4a:ea:57:0e:22:8d:6c:95:ac:11:ea:cc:
-                    d7:ee:f6:70:0d:09:dd:a6:35:61:5d:c9:76:6d:b0:
-                    f2:1e:bf:30:86:d8:77:52:36:95:97:0e:d1:46:c5:
-                    ed:81:3d:1b:b0:f2:61:95:3c:c1:40:38:ef:5f:5d:
-                    ba:61:9f:ef:2b:9c:9f:85:89:74:70:63:d5:76:e8:
-                    35:7e:ce:01:e1:f3:11:11:90:1c:0d:f5:fd:8d:ce:
-                    10:6c:ad:7c:55:1a:21:6f:d7:2d:f4:78:15:ea:2f:
-                    38:bd:91:9e:3c:1d:07:46:f5:43:c1:82:8b:af:12:
-                    53:65:19:8a:69:69:66:06:b2:da:0b:fa:2a:00:a1:
-                    2a:15:84:49:f1:01:bf:9b:30:06:d0:15:a0:1f:9d:
-                    51:91:47:e1:53:5f:ef:5e:ec:c2:61:79:c2:14:9f:
-                    c4:e3
+                    00:c6:81:1f:92:73:b6:58:85:d9:8d:ac:b7:20:fd:
+                    c7:bf:40:b2:ea:fa:e5:0b:52:01:8f:9a:c1:eb:7a:
+                    80:c1:f3:89:a4:3e:d5:1b:61:cc:b5:cf:80:b1:1a:
+                    db:bb:25:e0:18:bf:92:69:26:50:cd:e7:3f:ff:0d:
+                    3c:b4:1f:14:12:ab:67:37:de:07:03:6c:12:74:82:
+                    36:ac:c3:d4:d3:64:9f:91:ed:5b:f6:a9:7a:a4:9c:
+                    98:e8:65:6c:94:e1:cb:55:73:ae:f8:1d:50:b0:78:
+                    e5:74:ff:b1:37:2c:cb:19:3d:a4:8c:e7:76:4e:86:
+                    5c:3f:df:b3:ed:45:23:4f:54:9b:33:c6:89:5e:13:
+                    1d:dd:7d:59:a5:07:34:28:86:27:1f:fa:9e:53:4f:
+                    2a:b6:42:ad:37:12:62:f5:72:36:b6:02:12:40:44:
+                    fe:c7:9e:95:89:43:51:5e:b4:6e:c7:67:80:58:43:
+                    be:cc:07:28:bd:59:ff:1c:4c:8d:90:42:f4:cf:fd:
+                    54:00:4f:48:72:2b:e1:67:3c:84:17:68:95:bf:ca:
+                    07:7b:df:86:9d:56:e3:32:e3:70:87:b7:f8:3a:f7:
+                    e3:6e:65:14:7c:bb:76:b7:17:f1:42:8c:6f:2a:34:
+                    64:10:35:14:8c:85:f6:57:bf:f3:5c:55:9d:ad:03:
+                    10:f3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
-    Signature Algorithm: sha1WithRSAEncryption
-         57:07:29:fb:7f:e8:ff:b0:e6:d8:58:6a:c3:90:a1:38:1c:b4:
-         f3:68:b1:ec:e8:89:23:24:d7:a8:f2:21:c3:60:e4:a4:49:5c:
-         00:bf:df:c7:82:78:80:2b:18:f7:ad:dd:d0:62:5e:a7:b0:cc:
-         f0:aa:b4:ce:70:12:59:65:67:76:05:00:18:9a:ff:c4:2a:17:
-         e3:f1:55:d8:be:5c:5e:eb:ca:cb:53:87:10:d5:09:32:36:a7:
-         5e:41:f4:53:da:7e:56:60:d2:7e:4e:9a:a5:08:5f:5d:75:e9:
-         e7:30:cb:22:e9:ef:19:49:83:a5:23:a1:f8:60:4c:e5:36:d5:
-         39:78:18:f1:5e:bf:ce:aa:0b:53:81:2c:78:a9:0a:6b:db:13:
-         10:21:14:7f:1b:70:3d:89:1a:40:8a:06:2c:5d:50:19:62:f9:
-         c7:45:89:f2:3d:66:05:3d:7d:75:5b:55:1e:80:42:72:a1:9a:
-         7c:6d:0a:74:f6:ee:a6:21:6c:3a:98:fb:77:82:5f:f2:6b:56:
-         e6:dd:9b:8e:50:f0:c6:ae:fd:ea:a6:05:07:a9:26:06:56:b3:
-         b2:d9:b2:37:a0:21:3e:79:06:1f:b9:51:be:f4:b1:49:4d:90:
-         b5:33:e5:0e:c7:5e:5b:40:c5:6a:04:d1:43:7a:94:6a:a4:4f:
-         61:fc:82:e0
+    Signature Algorithm: sha256WithRSAEncryption
+         5b:53:ff:6d:d5:0a:43:a5:0f:d4:7d:c6:5d:88:e3:98:9d:67:
+         eb:32:82:b3:0f:f5:c1:78:f8:05:4a:bf:bc:21:05:ee:21:08:
+         2c:b2:15:a1:b8:b2:f6:a3:15:61:e4:c1:ad:84:a4:a7:40:0c:
+         87:09:5f:2b:1b:f9:4d:6c:92:7d:cb:7e:2b:b0:01:0a:ed:40:
+         e5:4e:af:1a:f1:0d:ec:1d:9e:96:c7:d4:61:64:39:23:fa:5f:
+         29:c4:2a:3a:b8:ed:8a:72:50:6a:ac:45:04:76:09:a8:3d:57:
+         d7:f0:4b:ae:46:b4:83:c1:14:50:2a:19:59:53:b2:4d:ae:fc:
+         2f:40:49:c8:ad:4d:9d:c8:22:8d:8c:01:db:31:33:5a:f4:bc:
+         4c:9b:ed:d7:e3:43:d9:e8:1d:53:8b:30:d8:81:9e:72:ab:9e:
+         ce:b8:f5:83:93:f2:72:db:de:cd:b0:52:9a:45:4d:cf:e7:21:
+         d8:ce:16:64:8f:42:af:c1:87:a8:f9:d5:e2:03:dd:ba:6b:1b:
+         7c:7d:a0:38:33:61:39:b4:dd:5c:69:17:79:02:3a:ec:1d:6f:
+         5e:bb:13:fb:a6:82:5d:07:20:fc:86:fe:6e:8b:ac:e1:c2:18:
+         a2:fe:3f:95:66:d3:69:8a:00:06:2c:56:37:34:b9:b6:31:de:
+         0f:f6:44:39
 -----BEGIN CERTIFICATE-----
-MIIC8zCCAdugAwIBAgIJALF9qhLor0+aMA0GCSqGSIb3DQEBBQUAMBcxFTATBgNV
-BAMMDFRlc3QgUm9vdCBDQTAeFw0xNDA4MTQwMzA1MjlaFw0yNDA4MTEwMzA1Mjla
-MBcxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBALZJQeNCAVGofzx6cdP7zZE1F4QajvY2x9FwHfqG8267dm/oMi43
-/TiSPWjkin1CMxRGG9wE9pFuVEDECgn97C1i4l7huiycwbFgTNrH+CJcgiBlQh5W
-d3VP65AsSupXDiKNbJWsEerM1+72cA0J3aY1YV3Jdm2w8h6/MIbYd1I2lZcO0UbF
-7YE9G7DyYZU8wUA4719dumGf7yucn4WJdHBj1XboNX7OAeHzERGQHA31/Y3OEGyt
-fFUaIW/XLfR4FeovOL2RnjwdB0b1Q8GCi68SU2UZimlpZgay2gv6KgChKhWESfEB
-v5swBtAVoB+dUZFH4VNf717swmF5whSfxOMCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUvPcw0TzA8nn675/JbFyT84poq4MwDgYDVR0PAQH/BAQD
-AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBXByn7f+j/sObYWGrDkKE4HLTzaLHs6Ikj
-JNeo8iHDYOSkSVwAv9/HgniAKxj3rd3QYl6nsMzwqrTOcBJZZWd2BQAYmv/EKhfj
-8VXYvlxe68rLU4cQ1QkyNqdeQfRT2n5WYNJ+TpqlCF9ddennMMsi6e8ZSYOlI6H4
-YEzlNtU5eBjxXr/OqgtTgSx4qQpr2xMQIRR/G3A9iRpAigYsXVAZYvnHRYnyPWYF
-PX11W1UegEJyoZp8bQp09u6mIWw6mPt3gl/ya1bm3ZuOUPDGrv3qpgUHqSYGVrOy
-2bI3oCE+eQYfuVG+9LFJTZC1M+UOx15bQMVqBNFDepRqpE9h/ILg
+MIIDizCCAnOgAwIBAgIJAJRTRMx4iMvZMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
+aWV3MRAwDgYDVQQKDAdUZXN0IENBMRUwEwYDVQQDDAxUZXN0IFJvb3QgQ0EwHhcN
+MTcwNjA1MTcxMDQ0WhcNMjcwNjAzMTcxMDQ0WjBjMQswCQYDVQQGEwJVUzETMBEG
+A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UE
+CgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAxoEfknO2WIXZjay3IP3Hv0Cy6vrlC1IBj5rB63qA
+wfOJpD7VG2HMtc+AsRrbuyXgGL+SaSZQzec//w08tB8UEqtnN94HA2wSdII2rMPU
+02Sfke1b9ql6pJyY6GVslOHLVXOu+B1QsHjldP+xNyzLGT2kjOd2ToZcP9+z7UUj
+T1SbM8aJXhMd3X1ZpQc0KIYnH/qeU08qtkKtNxJi9XI2tgISQET+x56ViUNRXrRu
+x2eAWEO+zAcovVn/HEyNkEL0z/1UAE9IcivhZzyEF2iVv8oHe9+GnVbjMuNwh7f4
+OvfjbmUUfLt2txfxQoxvKjRkEDUUjIX2V7/zXFWdrQMQ8wIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBSbJguKmKm7HbkfHOMaQDPtjheIqzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFtT/23VCkOlD9R9xl2I45id
+Z+sygrMP9cF4+AVKv7whBe4hCCyyFaG4svajFWHkwa2EpKdADIcJXysb+U1skn3L
+fiuwAQrtQOVOrxrxDewdnpbH1GFkOSP6XynEKjq47YpyUGqsRQR2Cag9V9fwS65G
+tIPBFFAqGVlTsk2u/C9AScitTZ3IIo2MAdsxM1r0vEyb7dfjQ9noHVOLMNiBnnKr
+ns649YOT8nLb3s2wUppFTc/nIdjOFmSPQq/Bh6j51eID3bprG3x9oDgzYTm03Vxp
+F3kCOuwdb167E/umgl0HIPyG/m6LrOHCGKL+P5Vm02mKAAYsVjc0ubYx3g/2RDk=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/sha1_2016.pem b/net/data/ssl/certificates/sha1_2016.pem
index 086f8df..434febf 100644
--- a/net/data/ssl/certificates/sha1_2016.pem
+++ b/net/data/ssl/certificates/sha1_2016.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 1 (0x1)
+        Serial Number: 9 (0x9)
     Signature Algorithm: sha1WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Oct 30 00:00:00 2008 GMT
             Not After : Dec 30 00:00:00 2016 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:bc:e0:e9:f5:9a:f0:36:82:13:c5:f2:2c:79:69:
-                    1e:69:35:c5:3b:31:fd:cf:60:28:e1:40:f8:23:d5:
-                    dc:b1:52:32:e2:09:08:3a:af:39:5a:05:f8:51:ee:
-                    fe:e9:73:c0:80:5a:29:2a:84:c3:14:e5:f7:3e:ab:
-                    b4:f5:e4:2d:e9:f5:ab:5a:b1:37:75:e9:91:4d:40:
-                    8a:64:fa:f4:7d:22:76:9b:6a:d3:7c:8e:8a:c8:c2:
-                    40:42:c2:40:9a:63:be:ad:ac:99:8a:4f:c0:b5:15:
-                    63:d2:4e:76:96:49:73:69:86:da:a9:f1:ea:32:f9:
-                    27:d0:5a:f2:64:35:86:25:ee:cb:a5:7e:d3:35:97:
-                    1f:92:82:4c:c6:23:cc:2a:cd:df:50:7a:37:51:c2:
-                    77:01:0c:76:d5:93:fe:af:57:76:3a:5a:3d:83:d6:
-                    18:03:1a:50:d6:e3:b5:b0:40:aa:16:a8:03:38:3d:
-                    6f:2f:7a:e2:92:6d:b8:04:93:42:0d:27:a5:73:3b:
-                    37:f5:0e:50:f5:d6:9e:db:da:64:b1:d3:32:75:94:
-                    cd:20:0f:f7:73:92:b2:b4:34:1a:9c:79:13:b1:78:
-                    c2:22:0e:45:10:ff:47:ea:df:9a:78:0c:b5:9c:e4:
-                    89:9e:12:c0:e7:ab:bc:01:46:90:d7:05:4d:3f:a5:
-                    7a:0b
+                    00:b6:97:a0:79:d1:5c:5f:c1:13:33:6e:21:f8:2b:
+                    e2:55:d6:bd:bb:2e:4e:78:cf:3d:fc:32:02:69:f7:
+                    1e:57:26:5d:38:18:bd:60:4e:c9:9b:7d:48:47:8e:
+                    e0:b8:7f:de:9e:48:6a:e2:b7:fc:58:aa:38:a5:4d:
+                    ab:b1:6d:ab:ed:f8:ae:7d:9b:2c:e0:cb:af:7b:2d:
+                    10:f8:97:8d:d7:8d:9f:8c:48:32:df:30:69:2a:de:
+                    cc:1f:81:f1:6d:14:2f:56:ac:64:20:9e:90:6b:5a:
+                    63:da:0a:08:f2:c6:89:01:44:15:c7:bb:02:fe:4b:
+                    c5:68:18:7f:47:4c:91:c0:59:bd:72:47:69:28:47:
+                    b8:6d:2a:3b:57:74:59:68:9e:e7:35:1d:a4:a9:3b:
+                    51:9a:74:82:3b:9e:7c:49:d5:f8:d9:72:9b:20:b1:
+                    53:1f:30:9d:20:a0:26:b9:2f:57:18:a4:63:be:8b:
+                    3b:03:31:fd:11:8a:d5:2d:13:67:51:88:c1:9f:2b:
+                    65:da:ea:d3:29:25:3a:60:0f:7f:fc:a0:61:8d:dd:
+                    8e:4f:45:b3:0f:da:ba:a4:1a:13:87:0d:1f:27:31:
+                    c2:37:1a:a6:fc:49:1c:02:82:ff:f8:a8:7f:4d:66:
+                    6e:46:38:4d:37:63:fd:bc:b3:d1:29:cc:de:4c:a5:
+                    c8:5b
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                C7:77:F7:6A:6A:BF:D7:F9:34:CC:B9:74:3F:AC:12:56:46:10:B4:76
+                3C:CC:C9:4A:92:DF:8A:05:12:74:8D:AA:B3:40:EE:69:E4:52:77:62
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha1WithRSAEncryption
-         77:91:04:bc:b5:04:90:6b:1a:dd:f2:26:55:3c:c9:76:f0:de:
-         d5:90:dc:8a:94:c3:87:ba:84:ab:bf:0d:2a:39:ab:87:03:e4:
-         66:0c:fb:cb:fa:b6:d6:9c:0d:56:cf:a4:1c:5e:31:e3:5d:97:
-         8e:b9:2c:c5:9c:a9:32:6a:dd:8d:b9:df:ac:45:04:a4:1f:ca:
-         66:fa:43:bb:62:4c:2f:13:5b:43:9b:7f:e4:2b:82:fa:25:01:
-         f7:30:de:a5:95:90:78:7f:1f:7a:5f:37:11:f6:86:1c:d4:88:
-         e6:36:fa:c6:ae:c5:55:c2:30:97:7b:3a:01:fe:22:b9:c9:67:
-         d1:44:f8:f2:f7:35:2d:bd:b8:7f:cb:2a:61:18:7f:55:8e:f7:
-         bc:e4:6f:ae:d8:4e:60:10:c6:c3:be:b7:c1:0c:d9:9b:c1:d2:
-         23:63:d7:b0:7b:69:87:33:a5:99:65:c8:50:d7:40:e5:1f:43:
-         61:54:91:aa:e7:e0:bd:e3:33:d4:d8:fc:88:8b:04:8d:03:60:
-         8e:c4:57:c8:d3:82:bc:7d:27:96:c6:14:e8:10:08:45:e4:81:
-         da:2c:99:ce:6c:32:70:59:ca:b4:52:21:35:30:12:5f:00:a4:
-         4c:6d:e7:32:71:7c:83:5d:7e:6a:fb:cc:f9:8a:f0:3d:01:d5:
-         c6:39:a7:f5
+         61:42:bd:ce:3e:8a:ca:a0:bc:61:5f:0a:30:cb:86:02:e3:d3:
+         22:a2:c2:d7:b9:b8:79:9b:53:b5:60:14:0a:7f:98:3f:bd:a6:
+         09:03:fc:05:bd:b8:24:00:aa:85:ca:ea:36:c0:58:a7:6e:25:
+         8f:64:a6:9a:77:35:53:f2:c1:be:04:95:c3:2b:dc:1a:9f:42:
+         31:af:5f:1d:06:4d:bb:08:bb:18:b5:48:eb:4a:03:85:be:12:
+         7f:bc:62:d5:44:25:0e:75:a8:7a:63:86:0b:c9:af:0f:03:4c:
+         14:ac:de:50:c1:0b:d9:cd:17:1e:56:e4:43:18:a7:0f:cc:fc:
+         58:e9:d9:7a:62:f7:8b:64:ae:0d:e0:a3:78:75:87:aa:e9:d0:
+         ce:f4:a2:60:46:41:48:eb:04:89:74:55:d6:f1:1f:f0:ed:32:
+         df:fc:cc:86:68:c9:b0:36:4f:9f:db:f0:cf:51:a2:9a:89:43:
+         65:b1:6c:a1:1a:4f:ef:35:ca:d7:c1:d6:c7:96:f5:4e:0a:f6:
+         1d:d1:8f:59:4c:77:20:73:4a:fe:0f:fc:a9:c8:e4:11:d9:3e:
+         71:7e:84:b8:ed:e0:fb:00:5d:1e:7b:7b:c9:5b:2d:51:44:7c:
+         0b:60:f1:13:7a:ff:7b:fa:0b:74:47:bb:99:89:ef:fe:cc:9f:
+         f7:a3:e3:20
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBATANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMDgxMDMwMDAwMDAwWhcNMTYxMjMwMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvODp9ZrwNoITxfIseWkeaTXFOzH9
-z2Ao4UD4I9XcsVIy4gkIOq85WgX4Ue7+6XPAgFopKoTDFOX3Pqu09eQt6fWrWrE3
-demRTUCKZPr0fSJ2m2rTfI6KyMJAQsJAmmO+rayZik/AtRVj0k52lklzaYbaqfHq
-Mvkn0FryZDWGJe7LpX7TNZcfkoJMxiPMKs3fUHo3UcJ3AQx21ZP+r1d2Olo9g9YY
-AxpQ1uO1sECqFqgDOD1vL3rikm24BJNCDSelczs39Q5Q9dae29pksdMydZTNIA/3
-c5KytDQanHkTsXjCIg5FEP9H6t+aeAy1nOSJnhLA56u8AUaQ1wVNP6V6CwIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUx3f3amq/1/k0zLl0P6wSVkYQ
-tHYwHwYDVR0jBBgwFoAUvPcw0TzA8nn675/JbFyT84poq4MwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEF
-BQADggEBAHeRBLy1BJBrGt3yJlU8yXbw3tWQ3IqUw4e6hKu/DSo5q4cD5GYM+8v6
-ttacDVbPpBxeMeNdl465LMWcqTJq3Y2536xFBKQfymb6Q7tiTC8TW0Obf+Qrgvol
-Afcw3qWVkHh/H3pfNxH2hhzUiOY2+sauxVXCMJd7OgH+IrnJZ9FE+PL3NS29uH/L
-KmEYf1WO97zkb67YTmAQxsO+t8EM2ZvB0iNj17B7aYczpZllyFDXQOUfQ2FUkarn
-4L3jM9TY/IiLBI0DYI7EV8jTgrx9J5bGFOgQCEXkgdosmc5sMnBZyrRSITUwEl8A
-pExt5zJxfINdfmr7zPmK8D0B1cY5p/U=
+MIIDvzCCAqegAwIBAgIBCTANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTA4MTAzMDAw
+MDAwMFoXDTE2MTIzMDAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALaXoHnRXF/BEzNuIfgr4lXWvbsuTnjPPfwyAmn3HlcmXTgYvWBOyZt9
+SEeO4Lh/3p5IauK3/FiqOKVNq7Ftq+34rn2bLODLr3stEPiXjdeNn4xIMt8waSre
+zB+B8W0UL1asZCCekGtaY9oKCPLGiQFEFce7Av5LxWgYf0dMkcBZvXJHaShHuG0q
+O1d0WWie5zUdpKk7UZp0gjuefEnV+NlymyCxUx8wnSCgJrkvVxikY76LOwMx/RGK
+1S0TZ1GIwZ8rZdrq0yklOmAPf/ygYY3djk9Fsw/auqQaE4cNHycxwjcapvxJHAKC
+//iof01mbkY4TTdj/byz0SnM3kylyFsCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFDzMyUqS34oFEnSNqrNA7mnkUndiMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBBQUAA4IBAQBhQr3OPorKoLxhXwow
+y4YC49MiosLXubh5m1O1YBQKf5g/vaYJA/wFvbgkAKqFyuo2wFinbiWPZKaadzVT
+8sG+BJXDK9wan0Ixr18dBk27CLsYtUjrSgOFvhJ/vGLVRCUOdah6Y4YLya8PA0wU
+rN5QwQvZzRceVuRDGKcPzPxY6dl6YveLZK4N4KN4dYeq6dDO9KJgRkFI6wSJdFXW
+8R/w7TLf/MyGaMmwNk+f2/DPUaKaiUNlsWyhGk/vNcrXwdbHlvVOCvYd0Y9ZTHcg
+c0r+D/ypyOQR2T5xfoS47eD7AF0ee3vJWy1RRHwLYPETev97+gt0R7uZie/+zJ/3
+o+Mg
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/sha1_dec_2015.pem b/net/data/ssl/certificates/sha1_dec_2015.pem
index 52b12f1..30633aec 100644
--- a/net/data/ssl/certificates/sha1_dec_2015.pem
+++ b/net/data/ssl/certificates/sha1_dec_2015.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 8 (0x8)
+        Serial Number: 10 (0xa)
     Signature Algorithm: sha1WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Dec 31 23:59:59 2015 GMT
             Not After : Dec 30 00:00:00 2016 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:e2:01:60:a4:71:45:a8:f6:30:4a:3d:15:97:19:
-                    b9:00:c8:ef:72:4b:6d:cc:92:d2:6e:69:78:7d:ff:
-                    a9:80:f3:1d:00:ef:28:a1:07:d0:98:c7:f0:c6:d7:
-                    eb:0a:77:42:29:4e:60:d4:a7:11:d0:d0:ae:ed:b6:
-                    1c:9f:a8:63:02:05:e5:0d:c0:a7:07:3c:96:4f:c3:
-                    61:d0:68:c6:a5:06:cf:ab:b6:09:2c:22:44:f4:b7:
-                    97:7e:69:8e:cc:51:3a:2b:0e:4a:cb:7e:8c:3b:6f:
-                    da:13:d5:e8:c3:38:e8:e5:5a:01:03:75:e6:4d:04:
-                    61:fe:4c:bb:ff:38:9e:97:93:14:ff:42:cd:c7:ba:
-                    16:68:d0:0f:5b:2b:7d:d1:59:49:33:5d:22:48:f4:
-                    07:fd:19:0b:f4:f3:14:6c:f5:c5:69:90:28:f1:24:
-                    8c:a5:cc:77:ba:4b:98:bc:00:2e:57:09:ce:8c:e8:
-                    b5:14:39:29:9c:ee:f2:3f:75:5b:9c:92:09:00:6f:
-                    89:60:f1:4f:68:a7:c7:fd:22:6a:b8:4a:92:fc:8d:
-                    bd:ab:fc:bc:b1:68:23:5f:f2:bc:25:8d:61:a8:d2:
-                    91:f1:ba:f6:48:25:05:a6:2c:a4:bb:af:27:c7:b5:
-                    61:3f:62:cd:61:2b:d2:2a:f8:02:46:f4:23:6d:90:
-                    d9:d3
+                    00:b6:91:2d:66:93:a5:7c:3c:60:ef:37:dd:70:95:
+                    ec:f4:16:31:64:f5:02:6b:da:28:b0:56:64:6c:4b:
+                    77:3a:ce:88:14:24:36:7d:7c:18:cc:fd:fb:43:24:
+                    09:e0:d5:6c:4d:32:47:08:61:a6:e1:3b:69:9d:4b:
+                    bf:d4:0f:d1:11:1b:c6:08:6e:b1:ad:76:36:ab:f9:
+                    2e:93:da:23:eb:bd:e3:06:a6:94:8a:7b:12:9b:92:
+                    d4:7b:6a:ee:95:95:3e:76:16:77:da:cc:3a:5b:0e:
+                    5d:45:57:fb:d6:73:0e:7e:0e:2d:98:e0:1a:ae:49:
+                    c0:b6:c5:86:f6:c3:06:cc:91:aa:ec:dc:a6:32:cc:
+                    31:3d:60:ff:21:97:77:98:f7:2a:7b:94:68:5e:48:
+                    91:64:2b:25:93:dd:d4:42:bd:45:3b:40:da:fc:5f:
+                    87:d1:82:60:da:54:1a:92:fb:a6:eb:5e:d4:1b:5a:
+                    5e:88:07:a4:1e:b8:9b:e9:6f:8b:9d:0a:5b:94:78:
+                    07:c9:60:ed:16:ec:2d:67:37:e1:37:2e:db:6c:27:
+                    30:5b:5b:b0:7f:bf:29:d1:a7:c5:57:88:9e:a2:4e:
+                    52:56:5c:44:49:67:2c:fb:e4:29:9e:48:88:8a:2b:
+                    a4:86:d3:5a:bc:66:6c:e8:56:68:1f:4e:6a:74:54:
+                    34:f1
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                5A:67:3F:18:17:60:C4:59:4C:9D:98:C0:8B:B7:2F:77:84:C8:22:A6
+                8F:94:39:15:DD:3B:6D:DE:5D:23:46:53:92:8A:FF:E4:28:CA:54:40
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha1WithRSAEncryption
-         54:f1:c7:bb:ad:7c:c8:6c:4b:6d:54:65:6c:6c:f7:d9:f9:f7:
-         a3:29:0f:df:4c:7f:9c:49:cb:29:b9:e4:14:71:95:e0:ab:1a:
-         c2:13:34:b5:d9:a6:64:a1:ec:64:b4:af:00:45:60:3e:66:a8:
-         59:bd:8f:b7:35:53:6f:46:e4:5c:17:42:d8:76:12:84:26:f0:
-         d2:bc:e9:85:32:7d:fb:d3:4d:7c:c2:af:6e:64:c5:fd:4c:ee:
-         57:b8:bd:fc:31:57:aa:3c:aa:03:6f:9c:db:e4:c4:62:45:48:
-         ba:6a:7a:63:b9:38:44:4f:fc:cb:3d:b4:fd:09:b0:89:f8:7e:
-         c4:cd:ac:06:c0:bd:06:fa:99:64:32:b2:49:6d:df:d1:5f:ae:
-         40:9f:95:cd:f2:7b:ba:b7:aa:c0:e0:f0:e6:0f:bf:04:3f:b4:
-         52:3a:e9:10:02:4d:71:22:ad:29:be:61:7c:d2:1e:c6:e8:52:
-         da:00:cc:2f:e3:0f:68:03:ed:cc:19:c9:da:0f:a3:d1:82:ba:
-         d8:14:40:07:37:4e:55:e9:9a:45:25:bf:eb:cb:4c:13:54:c8:
-         26:b7:41:0b:68:7b:3a:25:a5:67:33:fd:15:63:be:5e:05:a4:
-         09:6d:22:7e:fd:e0:6d:4c:d5:a9:47:c2:30:e4:34:e4:ec:cb:
-         b6:61:32:98
+         3c:ba:22:75:be:4a:28:1d:0b:14:16:f9:6a:24:8b:be:62:f2:
+         aa:38:fe:23:89:b5:50:2c:ab:ea:9e:fb:74:6a:dd:1f:31:bd:
+         6a:d0:16:09:be:a5:af:62:4a:6b:bd:98:d0:d6:4f:8a:3c:05:
+         2c:92:e1:c5:db:5f:e2:64:9c:f5:ba:23:c5:f7:75:53:21:54:
+         a0:9d:ad:2a:36:cb:7a:b8:a7:04:ae:97:17:6b:af:a1:1c:08:
+         14:94:e0:5e:fe:58:51:d2:51:6a:17:fc:89:13:f1:98:76:86:
+         92:66:91:8d:87:c5:6a:db:48:7c:63:7b:b7:db:3c:90:3a:8c:
+         73:5c:db:d0:0b:1b:96:3f:d4:07:ba:69:81:c7:83:3f:81:a7:
+         1d:30:8e:06:1a:95:49:0b:32:d3:b7:ea:e8:04:61:c4:f5:b0:
+         11:77:3d:60:02:e7:dd:3d:93:7d:22:61:81:4c:27:15:07:f1:
+         e5:8c:f1:d2:c6:40:83:03:d7:fc:38:69:aa:75:c0:d1:80:42:
+         cf:9c:92:18:c0:e4:30:df:1a:27:4b:3f:7f:c4:0d:0a:46:96:
+         51:9a:67:84:2b:2d:33:56:c8:52:fb:8b:6d:c7:e0:7e:c0:43:
+         55:69:9c:4c:9d:4b:36:82:be:b9:a7:77:8d:e6:85:90:7e:fb:
+         dc:2e:08:26
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCDANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTUxMjMxMjM1OTU5WhcNMTYxMjMwMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4gFgpHFFqPYwSj0Vlxm5AMjvcktt
-zJLSbml4ff+pgPMdAO8ooQfQmMfwxtfrCndCKU5g1KcR0NCu7bYcn6hjAgXlDcCn
-BzyWT8Nh0GjGpQbPq7YJLCJE9LeXfmmOzFE6Kw5Ky36MO2/aE9Xowzjo5VoBA3Xm
-TQRh/ky7/ziel5MU/0LNx7oWaNAPWyt90VlJM10iSPQH/RkL9PMUbPXFaZAo8SSM
-pcx3ukuYvAAuVwnOjOi1FDkpnO7yP3VbnJIJAG+JYPFPaKfH/SJquEqS/I29q/y8
-sWgjX/K8JY1hqNKR8br2SCUFpiyku68nx7VhP2LNYSvSKvgCRvQjbZDZ0wIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUWmc/GBdgxFlMnZjAi7cvd4TI
-IqYwHwYDVR0jBBgwFoAUvPcw0TzA8nn675/JbFyT84poq4MwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEF
-BQADggEBAFTxx7utfMhsS21UZWxs99n596MpD99Mf5xJyym55BRxleCrGsITNLXZ
-pmSh7GS0rwBFYD5mqFm9j7c1U29G5FwXQth2EoQm8NK86YUyffvTTXzCr25kxf1M
-7le4vfwxV6o8qgNvnNvkxGJFSLpqemO5OERP/Ms9tP0JsIn4fsTNrAbAvQb6mWQy
-sklt39FfrkCflc3ye7q3qsDg8OYPvwQ/tFI66RACTXEirSm+YXzSHsboUtoAzC/j
-D2gD7cwZydoPo9GCutgUQAc3TlXpmkUlv+vLTBNUyCa3QQtoezolpWcz/RVjvl4F
-pAltIn794G1M1alHwjDkNOTsy7ZhMpg=
+MIIDvzCCAqegAwIBAgIBCjANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE1MTIzMTIz
+NTk1OVoXDTE2MTIzMDAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBALaRLWaTpXw8YO833XCV7PQWMWT1AmvaKLBWZGxLdzrOiBQkNn18GMz9
++0MkCeDVbE0yRwhhpuE7aZ1Lv9QP0REbxghusa12Nqv5LpPaI+u94wamlIp7EpuS
+1Htq7pWVPnYWd9rMOlsOXUVX+9ZzDn4OLZjgGq5JwLbFhvbDBsyRquzcpjLMMT1g
+/yGXd5j3KnuUaF5IkWQrJZPd1EK9RTtA2vxfh9GCYNpUGpL7pute1BtaXogHpB64
+m+lvi50KW5R4B8lg7RbsLWc34Tcu22wnMFtbsH+/KdGnxVeInqJOUlZcRElnLPvk
+KZ5IiIorpIbTWrxmbOhWaB9OanRUNPECAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFI+UORXdO23eXSNGU5KK/+QoylRAMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBBQUAA4IBAQA8uiJ1vkooHQsUFvlq
+JIu+YvKqOP4jibVQLKvqnvt0at0fMb1q0BYJvqWvYkprvZjQ1k+KPAUskuHF21/i
+ZJz1uiPF93VTIVSgna0qNst6uKcErpcXa6+hHAgUlOBe/lhR0lFqF/yJE/GYdoaS
+ZpGNh8Vq20h8Y3u32zyQOoxzXNvQCxuWP9QHummBx4M/gacdMI4GGpVJCzLTt+ro
+BGHE9bARdz1gAufdPZN9ImGBTCcVB/HljPHSxkCDA9f8OGmqdcDRgELPnJIYwOQw
+3xonSz9/xA0KRpZRmmeEKy0zVshS+4ttx+B+wENVaZxMnUs2gr65p3eN5oWQfvvc
+Lggm
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/sha1_jan_2016.pem b/net/data/ssl/certificates/sha1_jan_2016.pem
index 318bb95..cda9de5 100644
--- a/net/data/ssl/certificates/sha1_jan_2016.pem
+++ b/net/data/ssl/certificates/sha1_jan_2016.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 9 (0x9)
+        Serial Number: 11 (0xb)
     Signature Algorithm: sha1WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Jan  1 00:00:00 2016 GMT
             Not After : Dec 30 00:00:00 2016 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b4:51:9f:c1:5a:a6:f8:54:6a:4b:a0:76:fe:f8:
-                    71:3e:db:f5:fd:60:16:0a:f8:f5:3e:34:1f:1e:f2:
-                    ba:46:36:2c:7b:10:a7:13:1e:8f:41:e6:d2:cd:53:
-                    9f:3a:99:76:e3:65:4a:c0:0e:e8:6e:08:cd:d0:b6:
-                    dd:7c:d8:9e:5f:c2:52:c6:d5:b5:77:12:b0:1b:79:
-                    d2:ac:27:7a:37:88:21:6b:22:ea:b6:eb:e6:89:15:
-                    e4:f8:e6:46:65:91:37:a5:24:98:44:2b:7a:46:c3:
-                    37:5d:d6:14:b9:3a:14:b7:10:8e:49:ae:b3:74:37:
-                    9e:b4:e6:80:be:bc:9e:ad:86:cb:88:26:66:56:53:
-                    70:80:c5:50:95:1f:a5:d4:a4:b2:34:6e:87:ab:51:
-                    64:2f:57:8f:9d:99:67:a2:13:f7:c8:40:8a:65:ba:
-                    cd:5e:20:f2:b7:16:20:f0:c6:83:c6:06:fc:a9:e1:
-                    fd:45:40:77:46:f5:77:3a:27:12:c5:ed:96:36:75:
-                    77:59:c4:4c:9d:df:d9:fd:e8:9b:bb:15:68:22:58:
-                    1d:0e:25:71:40:88:e9:6d:cf:e1:b5:1b:de:fd:bb:
-                    61:b6:5b:52:04:c9:11:20:d7:2e:4f:eb:fa:04:42:
-                    30:fd:fc:64:4d:b9:23:4a:25:dc:0d:3a:40:64:6d:
-                    2c:91
+                    00:a1:89:77:c3:66:58:98:bc:85:76:2f:a7:0a:23:
+                    52:73:1a:cf:d9:5a:10:50:1e:d9:37:aa:c6:f7:03:
+                    e3:ab:c2:b7:07:72:75:54:b2:e1:cc:9c:99:9a:a6:
+                    a6:f3:b8:5e:b4:f6:ea:c2:09:c6:76:2c:45:b9:e8:
+                    14:cc:ae:8b:99:10:7c:39:52:53:e2:87:70:02:00:
+                    74:ca:9b:3f:81:5e:2b:3b:09:00:51:be:a1:7f:f5:
+                    5e:45:1b:d7:15:44:b4:97:16:f9:d9:18:2d:c8:cc:
+                    e1:dc:f6:34:a6:6d:5d:67:4c:75:64:5c:d2:8c:e9:
+                    1d:90:0c:e2:21:f6:8e:86:d7:3d:4f:92:6a:46:53:
+                    0a:5c:86:98:d9:a4:ad:2a:90:eb:f6:c3:98:dd:86:
+                    af:24:59:a6:c7:b3:80:40:02:8b:20:e8:89:2d:78:
+                    dd:c3:fb:3f:83:16:5d:9c:be:70:73:ec:0c:44:e1:
+                    1d:58:72:61:4c:2d:0d:b0:97:ef:f4:fd:18:93:b1:
+                    07:c1:85:85:c5:6a:9d:c8:86:32:d8:ea:1e:e1:22:
+                    bb:6b:bb:e0:1c:f4:3a:92:f2:b3:1b:36:52:f8:64:
+                    3b:01:32:a0:cd:3f:e9:63:78:93:41:98:05:2c:bf:
+                    0a:cb:e8:e0:18:67:20:03:43:01:82:8a:ed:fb:33:
+                    86:23
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                4A:09:4F:0D:9A:CF:60:FE:BA:18:68:EB:3D:6C:EB:6A:72:65:9A:12
+                15:94:2D:EB:50:FA:06:28:94:5B:58:20:CC:09:20:27:56:7A:2A:3B
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha1WithRSAEncryption
-         1a:da:02:13:a7:42:44:32:f2:89:00:b2:8c:8e:7a:65:8a:0d:
-         d6:7c:bb:d7:04:bd:75:3a:ae:89:b6:df:38:ea:27:a5:94:03:
-         8b:af:07:9d:3e:08:b7:12:62:1c:b6:8a:0a:c8:dd:ea:24:9a:
-         19:00:1f:2f:f9:d8:73:d0:e5:58:11:1f:7c:60:09:62:ac:30:
-         6c:6f:a7:42:1c:01:52:35:fa:c8:04:59:c9:de:49:ec:b1:eb:
-         90:b6:64:4e:fc:58:aa:40:85:57:71:e1:27:64:04:fd:ff:35:
-         c2:d7:6d:52:1f:76:b9:35:a7:b4:d5:3b:dc:fe:ba:0d:84:1a:
-         5b:38:9d:a1:a2:31:47:d3:85:ec:27:03:d8:a8:e1:b6:fc:09:
-         95:a7:f4:54:e4:58:eb:68:47:61:0d:31:bf:8d:13:00:bb:0a:
-         db:2a:ac:16:a4:2f:8a:01:db:51:10:a1:45:47:88:3e:7e:d5:
-         bb:3b:e9:f9:07:50:6e:f3:2b:aa:67:04:4f:ac:b8:78:87:d0:
-         e0:fb:cb:0b:07:d0:7a:98:b4:aa:71:a6:2d:61:26:4a:ee:1c:
-         92:59:f2:5c:15:00:10:f4:1b:38:97:ee:a4:b2:2a:bd:53:d7:
-         2f:3e:32:e8:6a:4f:30:b1:bf:c6:22:27:52:74:e4:c5:23:fd:
-         46:8d:fb:a9
+         b1:06:12:ad:8f:94:6b:ed:de:ed:7a:5e:ef:93:bd:d1:85:48:
+         62:62:f1:92:03:ac:77:d4:24:1e:64:77:55:8a:15:39:ee:41:
+         6f:76:c4:2b:c5:b3:fd:4e:a1:4e:8e:ad:da:f4:41:3f:69:9c:
+         2a:0d:d3:79:a5:53:0f:be:3c:a8:ef:d2:e1:83:60:a9:bd:3e:
+         a8:1e:3a:cd:c6:04:71:b0:14:98:71:2d:35:d3:ff:1f:27:77:
+         5c:69:ab:8f:9e:f4:26:48:f1:03:61:8d:c9:e7:43:fb:ab:95:
+         e2:97:cb:b9:04:cf:3b:10:5c:21:a2:27:f6:b2:43:c2:3f:5b:
+         3c:06:7a:d5:46:09:74:71:49:32:6a:8c:12:b4:d1:a0:4a:4a:
+         85:77:5a:d0:f0:fd:e9:88:94:2e:fc:db:15:8a:b2:85:82:a4:
+         82:b9:0e:36:54:e8:6a:b9:37:55:0a:63:90:56:06:77:9f:34:
+         6c:25:f2:a6:92:08:eb:c5:df:d4:68:52:73:9e:9c:c9:b8:c3:
+         b7:f2:14:c4:5c:78:12:03:5f:8d:09:a7:ac:ba:79:35:62:14:
+         13:e6:fe:64:41:e7:4a:a5:41:b1:0e:ad:e8:2f:16:36:ba:1c:
+         a5:76:4e:fb:70:62:8c:00:f4:22:55:9d:99:61:5a:b6:e5:fb:
+         7e:94:44:c6
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCTANBgkqhkiG9w0BAQUFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTYwMTAxMDAwMDAwWhcNMTYxMjMwMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtFGfwVqm+FRqS6B2/vhxPtv1/WAW
-Cvj1PjQfHvK6RjYsexCnEx6PQebSzVOfOpl242VKwA7obgjN0LbdfNieX8JSxtW1
-dxKwG3nSrCd6N4ghayLqtuvmiRXk+OZGZZE3pSSYRCt6RsM3XdYUuToUtxCOSa6z
-dDeetOaAvryerYbLiCZmVlNwgMVQlR+l1KSyNG6Hq1FkL1ePnZlnohP3yECKZbrN
-XiDytxYg8MaDxgb8qeH9RUB3RvV3OicSxe2WNnV3WcRMnd/Z/eibuxVoIlgdDiVx
-QIjpbc/htRve/bthtltSBMkRINcuT+v6BEIw/fxkTbkjSiXcDTpAZG0skQIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUSglPDZrPYP66GGjrPWzranJl
-mhIwHwYDVR0jBBgwFoAUvPcw0TzA8nn675/JbFyT84poq4MwHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEF
-BQADggEBABraAhOnQkQy8okAsoyOemWKDdZ8u9cEvXU6rom23zjqJ6WUA4uvB50+
-CLcSYhy2igrI3eokmhkAHy/52HPQ5VgRH3xgCWKsMGxvp0IcAVI1+sgEWcneSeyx
-65C2ZE78WKpAhVdx4SdkBP3/NcLXbVIfdrk1p7TVO9z+ug2EGls4naGiMUfThewn
-A9io4bb8CZWn9FTkWOtoR2ENMb+NEwC7CtsqrBakL4oB21EQoUVHiD5+1bs76fkH
-UG7zK6pnBE+suHiH0OD7ywsH0HqYtKpxpi1hJkruHJJZ8lwVABD0GziX7qSyKr1T
-1y8+MuhqTzCxv8YiJ1J05MUj/UaN+6k=
+MIIDvzCCAqegAwIBAgIBCzANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE2MDEwMTAw
+MDAwMFoXDTE2MTIzMDAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKGJd8NmWJi8hXYvpwojUnMaz9laEFAe2TeqxvcD46vCtwdydVSy4cyc
+mZqmpvO4XrT26sIJxnYsRbnoFMyui5kQfDlSU+KHcAIAdMqbP4FeKzsJAFG+oX/1
+XkUb1xVEtJcW+dkYLcjM4dz2NKZtXWdMdWRc0ozpHZAM4iH2jobXPU+SakZTClyG
+mNmkrSqQ6/bDmN2GryRZpsezgEACiyDoiS143cP7P4MWXZy+cHPsDEThHVhyYUwt
+DbCX7/T9GJOxB8GFhcVqnciGMtjqHuEiu2u74Bz0OpLysxs2UvhkOwEyoM0/6WN4
+k0GYBSy/Csvo4BhnIANDAYKK7fszhiMCAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFBWULetQ+gYolFtYIMwJICdWeio7MB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBBQUAA4IBAQCxBhKtj5Rr7d7tel7v
+k73RhUhiYvGSA6x31CQeZHdVihU57kFvdsQrxbP9TqFOjq3a9EE/aZwqDdN5pVMP
+vjyo79Lhg2CpvT6oHjrNxgRxsBSYcS010/8fJ3dcaauPnvQmSPEDYY3J50P7q5Xi
+l8u5BM87EFwhoif2skPCP1s8BnrVRgl0cUkyaowStNGgSkqFd1rQ8P3piJQu/NsV
+irKFgqSCuQ42VOhquTdVCmOQVgZ3nzRsJfKmkgjrxd/UaFJznpzJuMO38hTEXHgS
+A1+NCaesunk1YhQT5v5kQedKpUGxDq3oLxY2uhyldk77cGKMAPQiVZ2ZYVq25ft+
+lETG
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/spdy_pooling.pem b/net/data/ssl/certificates/spdy_pooling.pem
index 54da8c53..f8637f1 100644
--- a/net/data/ssl/certificates/spdy_pooling.pem
+++ b/net/data/ssl/certificates/spdy_pooling.pem
@@ -1,73 +1,73 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 10845081582941097584 (0x9681783d6f55ce70)
+        Serial Number: 10589705580089419423 (0x92f6311e5133a69f)
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Validity
-            Not Before: Aug 19 22:55:06 2014 GMT
-            Not After : Aug 16 22:55:06 2024 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ed:ab:c5:df:a9:49:09:80:5a:8b:e6:4e:02:79:
-                    65:11:73:88:9b:77:7b:84:87:89:a7:a1:0b:b0:79:
-                    44:f5:bf:c6:76:25:76:d3:8d:9b:2c:e1:1a:37:15:
-                    29:6d:a5:d9:2a:1a:48:92:f0:65:0a:bc:bf:ff:a2:
-                    c7:cf:8d:8b:97:51:57:84:0a:6d:e2:db:6f:16:cf:
-                    f7:03:c7:54:43:9e:a9:05:e9:8c:ec:2f:bc:fe:ee:
-                    84:9a:0b:40:39:bf:12:ae:c9:69:b7:ec:29:6a:9f:
-                    f8:ed:0e:57:46:2a:ba:a5:74:c9:6c:f5:e9:ec:d2:
-                    66:fd:0c:91:16:0b:a6:73:7b:e4:4c:82:21:17:9b:
-                    91:63:5a:46:43:08:7b:50:97:83:c7:22:57:bc:9e:
-                    5f:7f:ea:6c:fd:9a:41:27:05:58:11:72:cc:07:bb:
-                    9b:f7:27:1b:13:6e:05:e5:ae:8b:da:9b:9b:0f:f5:
-                    a7:9c:f8:15:bc:64:fa:c1:1d:31:de:4a:98:31:9f:
-                    88:7c:3c:3f:26:94:e9:01:cf:3f:ad:f8:17:ab:66:
-                    81:36:61:b0:a7:ce:67:f9:00:80:90:29:75:6e:02:
-                    5f:16:93:d9:66:8f:a3:d2:64:75:73:d2:e2:8a:04:
-                    5f:ea:c9:e4:7b:68:09:90:4d:12:a1:96:4b:c0:94:
-                    a6:39
+                    00:9b:5b:94:c3:15:5e:59:33:46:02:5f:33:d9:e6:
+                    a6:c3:c7:d4:0c:d1:3f:41:3d:1e:40:4b:6c:75:6f:
+                    90:03:da:59:bb:cf:47:9c:f5:c0:2d:9b:09:7c:2f:
+                    84:83:74:5d:62:40:36:b4:8f:a7:cc:1a:da:f2:0d:
+                    08:0a:00:ab:9e:2d:d6:ef:09:e8:82:bd:08:f3:db:
+                    b2:51:3d:17:a4:cb:4c:48:81:cc:9d:95:6c:9b:cd:
+                    a3:22:ac:58:6e:94:f7:19:ae:c4:9c:c3:78:02:00:
+                    02:e7:0b:f3:9c:7a:f0:64:62:e8:1e:b5:30:0d:3a:
+                    79:f1:3d:b7:6f:64:0f:fa:08:bf:76:b2:49:29:54:
+                    96:b6:8d:08:00:23:0b:90:cb:9d:05:e7:1b:df:2a:
+                    2a:25:67:a0:21:ea:c5:a1:5a:4f:17:88:bd:d6:80:
+                    db:88:75:8c:61:54:9b:dc:09:e9:38:fe:20:8a:6b:
+                    ad:35:97:0e:c4:b5:63:7a:3d:16:aa:b7:4f:af:48:
+                    b6:83:a3:7b:6d:bd:19:37:9c:cb:82:82:93:8c:8a:
+                    10:48:30:dd:22:ac:dc:11:63:cf:43:73:bc:ce:21:
+                    fc:c8:2e:17:86:32:2e:47:ef:ed:7f:39:03:ea:7c:
+                    4d:b6:56:d6:75:f6:cb:cb:be:69:42:09:e7:2d:1c:
+                    7f:f7
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Alternative Name: 
                 DNS:www.example.org, DNS:mail.example.org, DNS:mail.example.com
     Signature Algorithm: sha256WithRSAEncryption
-         97:2f:73:50:6d:4a:6c:87:68:af:ee:f9:4b:eb:23:12:12:bc:
-         c1:9e:26:45:ee:4e:7e:f8:6e:2a:9e:24:ac:4a:a9:31:f8:f3:
-         03:1a:49:8a:40:da:44:de:9f:e6:c6:3b:2b:4e:36:43:6c:50:
-         b6:ef:8a:b5:c0:b0:71:c8:85:bb:6b:d3:dc:a4:da:e6:06:eb:
-         3a:7c:74:af:8d:c9:ba:d5:f4:32:84:81:32:5f:92:33:1f:ea:
-         f9:f0:b6:0b:4c:7a:ad:1f:0a:51:79:26:e5:28:cf:93:1c:a1:
-         59:3b:46:c6:4e:0f:31:8e:00:d6:a6:b3:2c:97:b4:61:b6:38:
-         b7:db:6c:39:2a:2f:50:14:96:40:f2:bd:5d:f0:96:b0:f4:c3:
-         30:59:b7:5f:ba:42:c7:86:4b:71:6d:7a:5d:b0:02:81:b2:c3:
-         62:97:7c:24:03:2e:61:7a:40:ec:f0:21:1b:6f:70:c8:6e:37:
-         73:39:7e:36:2b:b4:5a:c1:e2:28:f9:7d:c0:71:cb:4c:96:cb:
-         94:20:0b:fa:7b:78:d5:87:3b:b6:b2:73:84:ae:72:34:79:7d:
-         7c:e7:1a:c3:9a:d1:ab:67:ac:e0:70:d0:67:de:6c:e8:a5:d8:
-         a0:71:8c:6c:97:7b:a6:09:7a:ca:ec:41:24:a2:43:51:14:07:
-         70:65:e7:93
+         50:4f:a8:9a:be:db:68:69:40:91:4d:cc:d4:e1:bd:93:12:8b:
+         65:e3:9c:9e:51:9f:eb:19:16:ea:4d:84:01:dd:a0:78:0d:e8:
+         af:75:8d:b9:72:c4:79:04:ac:bb:a9:f7:9d:9c:d3:e7:eb:0e:
+         43:a9:64:a3:72:e0:11:ea:25:3f:e3:9c:f0:8d:b5:0b:f9:44:
+         9a:85:59:2e:aa:48:f7:9a:a7:5f:be:a5:1e:86:e7:87:cb:7f:
+         b7:82:81:20:2c:fa:59:5d:aa:29:12:fc:97:5f:3c:09:84:70:
+         69:da:1f:b6:71:82:8f:d4:9f:fd:93:26:88:65:28:dd:6f:ef:
+         0e:8a:dc:a6:c0:af:12:6d:1a:93:7a:cd:81:5c:f7:8f:d4:9b:
+         67:bc:0d:b3:6d:21:b7:4a:22:34:47:7c:7a:64:6f:e3:80:1a:
+         a6:96:d2:98:c6:e8:71:96:27:ec:15:94:50:96:ed:e7:ae:80:
+         fe:e4:a7:69:3a:f8:ca:f7:bc:c6:b4:3f:66:ca:39:8a:75:32:
+         d3:f2:f2:d7:fa:03:97:79:c2:06:e5:2b:46:58:a2:5f:2b:19:
+         30:b7:2a:00:5a:31:17:74:9b:3a:e0:bf:e1:0c:c9:db:ff:5c:
+         15:b8:72:2c:fa:e4:5a:fd:c5:56:32:29:dc:4e:b6:1a:ed:19:
+         01:3d:e0:ce
 -----BEGIN CERTIFICATE-----
-MIIDhTCCAm2gAwIBAgIJAJaBeD1vVc5wMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
+MIIDhTCCAm2gAwIBAgIJAJL2MR5RM6afMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
 BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
-aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMTQw
-ODE5MjI1NTA2WhcNMjQwODE2MjI1NTA2WjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
+aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMTcw
+NjA1MTcxMDQ2WhcNMjcwNjAzMTcxMDQ2WjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UECgwH
 VGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA7avF36lJCYBai+ZOAnllEXOIm3d7hIeJp6ELsHlE9b/GdiV2
-042bLOEaNxUpbaXZKhpIkvBlCry//6LHz42Ll1FXhApt4ttvFs/3A8dUQ56pBemM
-7C+8/u6EmgtAOb8Srslpt+wpap/47Q5XRiq6pXTJbPXp7NJm/QyRFgumc3vkTIIh
-F5uRY1pGQwh7UJeDxyJXvJ5ff+ps/ZpBJwVYEXLMB7ub9ycbE24F5a6L2pubD/Wn
-nPgVvGT6wR0x3kqYMZ+IfDw/JpTpAc8/rfgXq2aBNmGwp85n+QCAkCl1bgJfFpPZ
-Zo+j0mR1c9LiigRf6snke2gJkE0SoZZLwJSmOQIDAQABo0IwQDA+BgNVHREENzA1
+AQ8AMIIBCgKCAQEAm1uUwxVeWTNGAl8z2eamw8fUDNE/QT0eQEtsdW+QA9pZu89H
+nPXALZsJfC+Eg3RdYkA2tI+nzBra8g0ICgCrni3W7wnogr0I89uyUT0XpMtMSIHM
+nZVsm82jIqxYbpT3Ga7EnMN4AgAC5wvznHrwZGLoHrUwDTp58T23b2QP+gi/drJJ
+KVSWto0IACMLkMudBecb3yoqJWegIerFoVpPF4i91oDbiHWMYVSb3AnpOP4gimut
+NZcOxLVjej0WqrdPr0i2g6N7bb0ZN5zLgoKTjIoQSDDdIqzcEWPPQ3O8ziH8yC4X
+hjIuR+/tfzkD6nxNtlbWdfbLy75pQgnnLRx/9wIDAQABo0IwQDA+BgNVHREENzA1
 gg93d3cuZXhhbXBsZS5vcmeCEG1haWwuZXhhbXBsZS5vcmeCEG1haWwuZXhhbXBs
-ZS5jb20wDQYJKoZIhvcNAQELBQADggEBAJcvc1BtSmyHaK/u+UvrIxISvMGeJkXu
-Tn74biqeJKxKqTH48wMaSYpA2kTen+bGOytONkNsULbvirXAsHHIhbtr09yk2uYG
-6zp8dK+NybrV9DKEgTJfkjMf6vnwtgtMeq0fClF5JuUoz5McoVk7RsZODzGOANam
-syyXtGG2OLfbbDkqL1AUlkDyvV3wlrD0wzBZt1+6QseGS3Ftel2wAoGyw2KXfCQD
-LmF6QOzwIRtvcMhuN3M5fjYrtFrB4ij5fcBxy0yWy5QgC/p7eNWHO7ayc4SucjR5
-fXznGsOa0atnrOBw0GfebOil2KBxjGyXe6YJesrsQSSiQ1EUB3Bl55M=
+ZS5jb20wDQYJKoZIhvcNAQELBQADggEBAFBPqJq+22hpQJFNzNThvZMSi2XjnJ5R
+n+sZFupNhAHdoHgN6K91jblyxHkErLup952c0+frDkOpZKNy4BHqJT/jnPCNtQv5
+RJqFWS6qSPeap1++pR6G54fLf7eCgSAs+lldqikS/JdfPAmEcGnaH7Zxgo/Un/2T
+JohlKN1v7w6K3KbArxJtGpN6zYFc94/Um2e8DbNtIbdKIjRHfHpkb+OAGqaW0pjG
+6HGWJ+wVlFCW7eeugP7kp2k6+Mr3vMa0P2bKOYp1MtPy8tf6A5d5wgblK0ZYol8r
+GTC3KgBaMRd0mzrgv+EMydv/XBW4ciz65Fr9xVYyKdxOthrtGQE94M4=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/start_after_expiry.pem b/net/data/ssl/certificates/start_after_expiry.pem
index 7498654..06164e85 100644
--- a/net/data/ssl/certificates/start_after_expiry.pem
+++ b/net/data/ssl/certificates/start_after_expiry.pem
@@ -1,9 +1,9 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 8 (0x8)
+        Serial Number: 18 (0x12)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
             Not Before: Sep  1 00:00:00 2018 GMT
             Not After : Apr  2 00:00:00 2015 GMT
@@ -12,71 +12,73 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:c4:54:f5:42:22:fc:43:f4:68:f9:15:c3:cf:a1:
-                    88:35:58:a3:30:cc:eb:df:54:5c:d7:a0:19:00:7b:
-                    f4:65:6a:68:52:db:a6:52:48:26:ca:86:29:de:5e:
-                    7b:81:60:fb:ee:7d:11:58:38:48:61:1b:36:2b:41:
-                    8e:7a:99:b3:4e:5d:95:7a:4c:14:04:b4:92:ca:a3:
-                    75:41:bf:a9:91:3c:32:b4:02:1c:d3:86:29:b1:b0:
-                    02:ad:08:a9:72:13:79:95:fa:3c:c1:01:8b:e4:76:
-                    1f:21:ed:98:2b:63:07:7a:ce:6b:59:1c:92:5f:d8:
-                    cb:e0:f1:a5:37:74:17:c5:56:f3:34:7f:1b:62:f9:
-                    7a:38:ca:9d:98:c5:e1:de:b3:68:85:92:1c:ef:16:
-                    51:95:b2:18:a9:8b:40:5d:ff:a0:89:2b:20:e6:7d:
-                    64:5c:8b:96:66:eb:b8:c8:7c:f7:7b:74:c8:9c:d2:
-                    3d:8e:c3:d6:94:cc:45:6b:5f:5a:9e:59:94:73:14:
-                    c0:aa:1b:f6:8c:f5:6b:e3:dc:60:bb:b3:d8:05:74:
-                    94:ac:4d:42:1d:8a:d0:da:21:fe:19:49:af:2f:ca:
-                    d1:97:b8:85:a2:07:b4:64:23:3e:48:60:22:36:d5:
-                    f0:71:43:3a:76:47:db:c6:23:88:e8:9e:44:14:05:
-                    44:d3
+                    00:9a:5a:33:cc:a1:02:df:a5:c4:bc:57:68:1b:03:
+                    11:b3:58:58:8e:78:63:8a:02:0e:8a:ec:5d:96:a6:
+                    3b:3f:98:db:3e:ba:d6:56:48:8b:2b:00:3c:ef:e2:
+                    93:08:67:46:68:93:05:2c:63:4c:07:d2:01:6f:36:
+                    72:cb:d1:40:a4:7f:a2:53:0f:ae:72:92:2f:c9:8a:
+                    37:96:7b:a6:a9:a0:32:68:39:5b:03:d1:7b:be:fd:
+                    7c:9d:19:87:87:83:08:f4:66:5b:d4:f5:89:f7:52:
+                    93:16:6a:6c:70:41:d8:0a:4d:fd:3f:08:e1:3a:d5:
+                    26:b5:12:09:d0:0d:3b:6c:34:ae:56:46:0f:12:ab:
+                    39:f9:df:d9:a7:b6:95:ba:d3:96:de:64:42:44:83:
+                    6a:21:9a:2d:a3:5c:eb:ea:d6:9b:63:80:77:0a:12:
+                    b3:12:1e:31:f1:b3:ac:b2:69:ca:01:51:4a:92:0a:
+                    e5:7f:b5:d5:3f:17:d8:b3:e0:d2:14:c7:b1:3d:0a:
+                    be:e2:ef:4f:25:94:0d:d3:39:2b:1e:fd:ff:69:89:
+                    a8:1e:18:38:1e:2f:6b:8b:9d:e5:2e:1c:ce:f0:9f:
+                    c2:f5:d9:14:31:2a:c5:f2:5f:04:d9:dc:ec:80:48:
+                    50:5f:b0:be:b7:50:57:22:40:f1:53:40:8e:97:5f:
+                    66:1d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                98:54:9A:FE:46:04:8F:0F:3A:D6:86:26:71:05:70:71:B1:31:34:4C
+                E8:35:95:5F:B1:76:85:86:C1:35:20:30:76:70:AC:2B:AE:6E:48:DA
             X509v3 Authority Key Identifier: 
-                keyid:BB:9E:AC:B3:7A:32:BA:83:21:C8:AC:02:95:09:0B:CA:68:03:EC:DB
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         09:7d:90:8a:cc:84:00:38:f8:a8:90:48:d3:7e:f0:58:37:dc:
-         ad:1b:87:a9:ef:de:f8:53:a9:23:73:57:10:c9:0c:6b:c4:fd:
-         0b:e6:96:7d:d5:87:a6:f5:45:6e:5b:62:aa:d0:55:58:7f:59:
-         a7:ba:28:22:2a:9d:ea:f7:9a:4b:f7:6b:f9:f1:65:56:d9:ef:
-         5c:9c:b6:45:3d:15:8f:83:d5:b4:cf:78:7e:8e:b6:8a:b7:c5:
-         33:99:1c:8b:49:51:81:d1:eb:01:1c:e5:49:69:2b:99:ad:9f:
-         5f:31:02:3a:f6:41:27:68:2f:2c:08:cd:89:91:86:5b:03:44:
-         d6:51:29:84:58:bc:a7:94:6e:59:b9:dd:0b:20:8e:c7:5c:4e:
-         88:38:77:16:59:59:e4:10:ee:27:9e:aa:dd:c3:fc:2c:a6:96:
-         95:7e:8f:6c:e2:97:f9:80:d3:92:f4:4d:31:2b:bf:76:dc:2e:
-         c1:1e:9b:53:e7:4d:6f:36:08:8e:75:a9:e3:07:46:c4:b5:e3:
-         97:0d:c6:d6:f3:10:36:aa:08:c0:76:1b:90:b8:97:b3:9f:d5:
-         42:c0:59:75:96:50:4c:d5:31:58:61:96:e3:62:da:e9:9f:ec:
-         9f:77:81:13:55:03:e4:fa:b3:93:0d:3a:78:db:7d:d1:dd:26:
-         ad:7e:5f:11
+         a2:76:a0:fc:72:5c:0c:48:59:8e:fb:06:02:1d:de:e6:cd:eb:
+         58:97:0c:4e:b8:f3:d2:af:f5:4c:35:36:fc:17:57:58:cc:f0:
+         fe:67:57:b0:26:f1:07:8f:01:72:62:d9:a0:a4:1f:95:d7:dc:
+         ea:48:0c:47:a2:57:dd:0b:0d:21:81:24:8f:15:0e:c3:7b:6c:
+         3a:46:13:47:4f:fb:bf:b8:f1:74:04:ca:dd:17:40:ed:f4:a9:
+         86:82:9a:b3:a5:1b:0e:2b:e2:f2:1b:c1:30:c9:aa:51:c5:f9:
+         33:58:33:25:21:d1:10:34:6a:4d:89:9d:9e:ef:ef:cf:ed:3b:
+         08:67:47:17:62:3b:5f:f7:81:14:57:86:c7:3c:fc:30:6b:20:
+         8d:26:bc:b6:95:83:8d:84:2a:3a:12:25:02:22:c5:0c:11:cc:
+         eb:61:46:d4:01:f6:65:e0:b9:8d:6c:3e:7b:66:56:d8:c4:2d:
+         b5:c1:46:9f:b6:19:ae:ba:45:47:86:34:77:2d:3f:4d:66:4f:
+         fc:84:83:7a:98:c1:cc:b8:79:4f:21:d6:14:45:27:f1:c9:df:
+         2d:db:b1:45:28:45:c9:73:a6:e6:6c:50:a5:9a:5a:dc:4b:87:
+         9f:7c:fe:29:ed:50:c3:dd:6b:ad:2f:2e:97:1a:02:33:28:6d:
+         68:72:7d:31
 -----BEGIN CERTIFICATE-----
-MIIDczCCAlugAwIBAgIBCDANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTgwOTAxMDAwMDAwWhcNMTUwNDAyMDAwMDAwWjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxFT1QiL8Q/Ro+RXDz6GINVijMMzr
-31Rc16AZAHv0ZWpoUtumUkgmyoYp3l57gWD77n0RWDhIYRs2K0GOepmzTl2VekwU
-BLSSyqN1Qb+pkTwytAIc04YpsbACrQipchN5lfo8wQGL5HYfIe2YK2MHes5rWRyS
-X9jL4PGlN3QXxVbzNH8bYvl6OMqdmMXh3rNohZIc7xZRlbIYqYtAXf+giSsg5n1k
-XIuWZuu4yHz3e3TInNI9jsPWlMxFa19anlmUcxTAqhv2jPVr49xgu7PYBXSUrE1C
-HYrQ2iH+GUmvL8rRl7iFoge0ZCM+SGAiNtXwcUM6dkfbxiOI6J5EFAVE0wIDAQAB
-o4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUmFSa/kYEjw861oYmcQVwcbEx
-NEwwHwYDVR0jBBgwFoAUu56ss3oyuoMhyKwClQkLymgD7NswHQYDVR0lBBYwFAYI
-KwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQEL
-BQADggEBAAl9kIrMhAA4+KiQSNN+8Fg33K0bh6nv3vhTqSNzVxDJDGvE/Qvmln3V
-h6b1RW5bYqrQVVh/Wae6KCIqner3mkv3a/nxZVbZ71yctkU9FY+D1bTPeH6Otoq3
-xTOZHItJUYHR6wEc5UlpK5mtn18xAjr2QSdoLywIzYmRhlsDRNZRKYRYvKeUblm5
-3QsgjsdcTog4dxZZWeQQ7ieeqt3D/CymlpV+j2zil/mA05L0TTErv3bcLsEem1Pn
-TW82CI51qeMHRsS145cNxtbzEDaqCMB2G5C4l7Of1ULAWXWWUEzVMVhhluNi2umf
-7J93gRNVA+T6s5MNOnjbfdHdJq1+XxE=
+MIIDvzCCAqegAwIBAgIBEjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE4MDkwMTAw
+MDAwMFoXDTE1MDQwMjAwMDAwMFowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAJpaM8yhAt+lxLxXaBsDEbNYWI54Y4oCDorsXZamOz+Y2z661lZIiysA
+PO/ikwhnRmiTBSxjTAfSAW82csvRQKR/olMPrnKSL8mKN5Z7pqmgMmg5WwPRe779
+fJ0Zh4eDCPRmW9T1ifdSkxZqbHBB2ApN/T8I4TrVJrUSCdANO2w0rlZGDxKrOfnf
+2ae2lbrTlt5kQkSDaiGaLaNc6+rWm2OAdwoSsxIeMfGzrLJpygFRSpIK5X+11T8X
+2LPg0hTHsT0KvuLvTyWUDdM5Kx79/2mJqB4YOB4va4ud5S4czvCfwvXZFDEqxfJf
+BNnc7IBIUF+wvrdQVyJA8VNAjpdfZh0CAwEAAaOBgDB+MAwGA1UdEwEB/wQCMAAw
+HQYDVR0OBBYEFOg1lV+xdoWGwTUgMHZwrCuubkjaMB8GA1UdIwQYMBaAFJsmC4qY
+qbsduR8c4xpAM+2OF4irMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAP
+BgNVHREECDAGhwR/AAABMA0GCSqGSIb3DQEBCwUAA4IBAQCidqD8clwMSFmO+wYC
+Hd7mzetYlwxOuPPSr/VMNTb8F1dYzPD+Z1ewJvEHjwFyYtmgpB+V19zqSAxHolfd
+Cw0hgSSPFQ7De2w6RhNHT/u/uPF0BMrdF0Dt9KmGgpqzpRsOK+LyG8EwyapRxfkz
+WDMlIdEQNGpNiZ2e7+/P7TsIZ0cXYjtf94EUV4bHPPwwayCNJry2lYONhCo6EiUC
+IsUMEczrYUbUAfZl4LmNbD57ZlbYxC21wUafthmuukVHhjR3LT9NZk/8hIN6mMHM
+uHlPIdYURSfxyd8t27FFKEXJc6bmbFClmlrcS4effP4p7VDD3WutLy6XGgIzKG1o
+cn0x
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/subjectAltName_sanity_check.pem b/net/data/ssl/certificates/subjectAltName_sanity_check.pem
index f2a8881b..5ed3a9b 100644
--- a/net/data/ssl/certificates/subjectAltName_sanity_check.pem
+++ b/net/data/ssl/certificates/subjectAltName_sanity_check.pem
@@ -1,35 +1,35 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 9569410291102924913 (0x84cd5ff577284071)
+        Serial Number: 16251326626457629923 (0xe1884f76aadab4e3)
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Validity
-            Not Before: Aug 19 22:55:06 2014 GMT
-            Not After : Aug 16 22:55:06 2024 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:bd:c6:0f:42:dc:65:92:0b:07:00:60:9a:4e:b0:
-                    84:f0:f1:fa:0b:65:8c:c6:45:ed:bc:ce:af:a4:5c:
-                    4f:78:6f:30:4c:97:42:66:cc:ad:66:4a:11:4a:b5:
-                    8a:57:f0:58:a4:54:1f:f9:ac:82:67:f8:7c:55:36:
-                    d7:c0:b1:5a:06:fa:25:c2:07:36:64:a7:54:c2:62:
-                    67:2d:11:30:77:ef:36:3b:d9:2f:9a:2c:2e:71:2b:
-                    d7:63:f7:1a:fd:e9:b8:c8:4a:a1:d2:b9:d4:dc:06:
-                    ca:68:52:e2:8f:69:ef:2b:a4:7b:1e:4c:db:e5:52:
-                    b2:17:b6:e7:f6:fd:91:11:f2:4f:08:d5:9d:7f:b6:
-                    0b:1d:8f:ff:17:5e:6f:2b:ef:7b:6e:a3:2c:bc:a9:
-                    d0:c3:f4:f1:26:65:4a:23:1e:75:1e:ae:d6:6f:88:
-                    6d:0a:a4:c2:96:34:e0:d4:26:f2:2d:d3:16:26:a3:
-                    3c:ac:1a:b4:be:ef:c0:84:6a:95:4e:71:c6:be:e3:
-                    c4:15:55:5e:94:c3:a8:03:40:34:21:76:48:56:1e:
-                    e4:26:05:c0:47:67:44:59:04:47:b2:38:e0:2d:69:
-                    11:de:9a:6b:18:7f:57:56:6f:7c:6c:da:ff:a6:c5:
-                    db:b0:56:a2:81:de:ae:ca:4b:a0:b3:66:1d:f7:96:
-                    41:33
+                    00:be:1b:08:be:be:01:88:90:32:54:37:9f:95:fc:
+                    22:04:22:e1:ef:a8:28:b5:20:a8:dd:f9:ff:4e:3b:
+                    ca:ca:e2:05:43:a0:6e:bb:db:0c:6c:e8:59:05:83:
+                    2a:65:14:32:83:9b:af:04:61:ab:2b:35:c7:1f:3a:
+                    59:6b:24:3c:91:f1:0e:18:33:23:0a:13:63:80:59:
+                    1e:4d:65:e8:60:67:1e:07:8f:70:19:f5:59:5f:b6:
+                    8b:54:83:c6:a4:33:e8:91:56:9d:f6:90:ab:3d:eb:
+                    6f:e9:91:07:d2:60:5c:d7:4c:36:97:7e:b4:ff:ac:
+                    f0:8a:41:8f:50:fb:c6:bd:ee:d9:00:ac:d9:f6:4f:
+                    c8:49:fc:1c:b5:3e:f6:74:4d:8e:cc:74:cb:4f:af:
+                    f9:a6:42:dc:9f:e1:4b:0e:bb:82:4f:46:06:3d:6a:
+                    68:d6:45:96:3e:9c:c6:60:ac:c6:7e:ed:d7:39:16:
+                    85:c6:91:97:12:6f:74:2a:60:bf:2e:d7:ff:91:d8:
+                    81:46:d4:e9:33:19:5a:04:35:34:96:c2:de:9d:a8:
+                    54:75:ed:91:da:94:ed:91:f5:1d:2a:5e:66:b3:4b:
+                    0f:2f:1f:97:81:83:c4:5e:34:d5:e6:cf:df:e0:a2:
+                    d1:93:e5:64:64:6f:50:5c:7d:bc:4d:1c:2e:93:6a:
+                    ad:65
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
@@ -37,41 +37,41 @@
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.2, IP Address:FE80:0:0:0:0:0:0:1, DNS:test.example, email:test@test.example, othername:<unsupported>, DirName:/CN=127.0.0.3
     Signature Algorithm: sha256WithRSAEncryption
-         9c:b8:a4:26:88:6f:1b:be:93:4d:3f:89:d2:cb:b8:b9:7a:1e:
-         b6:b0:66:8a:df:79:a1:37:c3:ba:92:17:19:bb:4e:d3:4a:21:
-         e2:78:c3:27:6c:4a:d4:11:e0:bf:90:38:ba:9a:3c:f8:54:d1:
-         ac:56:32:4f:b1:d1:6c:b9:92:bf:98:a5:d0:55:91:fc:d7:74:
-         74:33:3d:f9:e2:f2:97:0a:32:5b:05:e4:2e:f9:41:a6:2c:2c:
-         dc:67:58:81:67:b5:84:c3:f2:94:9d:ce:2b:80:ce:48:ec:08:
-         2a:01:78:4c:f5:8c:03:2b:87:06:1d:ed:35:53:09:c7:e5:06:
-         af:3b:fa:6c:42:a5:be:1e:dd:ce:f8:cc:bf:0e:c5:34:91:7c:
-         4c:b5:2f:07:b4:af:76:bc:b3:22:c6:eb:d7:b0:47:00:e4:89:
-         ef:8c:fe:be:f8:6e:15:1f:f9:ac:de:b7:3e:dc:c2:e0:65:7c:
-         d0:8b:5d:90:0e:68:3e:51:2b:5c:74:f0:fd:6a:14:6d:47:a4:
-         45:e8:e5:ba:be:ac:b8:a5:af:0f:c0:ac:99:b7:0c:70:d2:b4:
-         53:4a:5b:9e:3b:21:1d:ba:ad:ac:b1:0a:79:53:c3:9d:d9:d6:
-         1f:a7:d3:5f:99:9a:35:dd:85:1d:8e:ad:f7:ea:42:9d:a9:f3:
-         47:43:11:13
+         27:c1:5a:11:e6:f9:3b:69:a1:61:a9:af:83:21:3c:d0:60:43:
+         b2:e4:27:b7:46:67:d8:ae:dc:b7:51:85:53:25:b8:d8:48:d9:
+         ce:2d:f4:17:2c:75:a1:2d:ad:fe:73:a6:1e:0b:3f:4a:1a:df:
+         85:99:db:57:b0:cc:8d:3d:01:74:11:2e:51:81:c4:4b:2d:ee:
+         bd:05:84:59:ce:a5:40:c5:3d:fa:19:d7:48:32:22:ca:49:d6:
+         e3:74:8f:fb:02:0e:d1:73:76:7a:3d:ca:e8:96:7e:0d:2e:df:
+         79:44:ce:aa:f6:ea:c2:61:d6:54:11:c9:38:85:72:4f:9f:94:
+         b0:f9:d1:84:43:05:5a:8a:37:d4:ce:d7:e9:16:23:7e:10:67:
+         8b:61:00:54:c6:13:da:03:e3:ed:4f:46:eb:44:af:5c:65:e7:
+         93:1d:2e:ab:d3:8e:35:e5:4e:d1:56:ef:09:1b:74:b3:a4:ca:
+         00:83:ea:e0:95:ed:ef:f3:cd:8a:1e:da:71:6d:40:e7:36:56:
+         26:50:9f:5a:86:7f:45:4a:d4:0c:6b:40:68:78:fe:57:0a:e7:
+         96:8c:ec:38:57:ac:89:58:54:e0:14:76:4c:93:40:7d:2e:d7:
+         36:1d:71:5a:ac:73:f8:ad:80:d3:52:48:b4:68:f3:06:ab:b7:
+         5a:b4:2c:1a
 -----BEGIN CERTIFICATE-----
-MIIDyDCCArCgAwIBAgIJAITNX/V3KEBxMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
+MIIDyDCCArCgAwIBAgIJAOGIT3aq2rTjMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
 BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
-aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMTQw
-ODE5MjI1NTA2WhcNMjQwODE2MjI1NTA2WjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
+aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMTcw
+NjA1MTcxMDQ2WhcNMjcwNjAzMTcxMDQ2WjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UECgwH
 VGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAvcYPQtxlkgsHAGCaTrCE8PH6C2WMxkXtvM6vpFxPeG8wTJdC
-ZsytZkoRSrWKV/BYpFQf+ayCZ/h8VTbXwLFaBvolwgc2ZKdUwmJnLREwd+82O9kv
-miwucSvXY/ca/em4yEqh0rnU3AbKaFLij2nvK6R7Hkzb5VKyF7bn9v2REfJPCNWd
-f7YLHY//F15vK+97bqMsvKnQw/TxJmVKIx51Hq7Wb4htCqTCljTg1CbyLdMWJqM8
-rBq0vu/AhGqVTnHGvuPEFVVelMOoA0A0IXZIVh7kJgXAR2dEWQRHsjjgLWkR3ppr
-GH9XVm98bNr/psXbsFaigd6uykugs2Yd95ZBMwIDAQABo4GEMIGBMA8GA1UdEwEB
+AQ8AMIIBCgKCAQEAvhsIvr4BiJAyVDeflfwiBCLh76gotSCo3fn/TjvKyuIFQ6Bu
+u9sMbOhZBYMqZRQyg5uvBGGrKzXHHzpZayQ8kfEOGDMjChNjgFkeTWXoYGceB49w
+GfVZX7aLVIPGpDPokVad9pCrPetv6ZEH0mBc10w2l360/6zwikGPUPvGve7ZAKzZ
+9k/ISfwctT72dE2OzHTLT6/5pkLcn+FLDruCT0YGPWpo1kWWPpzGYKzGfu3XORaF
+xpGXEm90KmC/Ltf/kdiBRtTpMxlaBDU0lsLenahUde2R2pTtkfUdKl5ms0sPLx+X
+gYPEXjTV5s/f4KLRk+VkZG9QXH28TRwuk2qtZQIDAQABo4GEMIGBMA8GA1UdEwEB
 /wQFMAMBAf8wbgYDVR0RBGcwZYcEfwAAAocQ/oAAAAAAAAAAAAAAAAAAAYIMdGVz
 dC5leGFtcGxlgRF0ZXN0QHRlc3QuZXhhbXBsZaASBgMqAwSgCwwJaWdub3JlIG1l
-pBYwFDESMBAGA1UEAwwJMTI3LjAuMC4zMA0GCSqGSIb3DQEBCwUAA4IBAQCcuKQm
-iG8bvpNNP4nSy7i5eh62sGaK33mhN8O6khcZu07TSiHieMMnbErUEeC/kDi6mjz4
-VNGsVjJPsdFsuZK/mKXQVZH813R0Mz354vKXCjJbBeQu+UGmLCzcZ1iBZ7WEw/KU
-nc4rgM5I7AgqAXhM9YwDK4cGHe01UwnH5QavO/psQqW+Ht3O+My/DsU0kXxMtS8H
-tK92vLMixuvXsEcA5InvjP6++G4VH/ms3rc+3MLgZXzQi12QDmg+UStcdPD9ahRt
-R6RF6OW6vqy4pa8PwKyZtwxw0rRTSlueOyEduq2ssQp5U8Od2dYfp9NfmZo13YUd
-jq336kKdqfNHQxET
+pBYwFDESMBAGA1UEAwwJMTI3LjAuMC4zMA0GCSqGSIb3DQEBCwUAA4IBAQAnwVoR
+5vk7aaFhqa+DITzQYEOy5Ce3RmfYrty3UYVTJbjYSNnOLfQXLHWhLa3+c6YeCz9K
+Gt+FmdtXsMyNPQF0ES5RgcRLLe69BYRZzqVAxT36GddIMiLKSdbjdI/7Ag7Rc3Z6
+Pcroln4NLt95RM6q9urCYdZUEck4hXJPn5Sw+dGEQwVaijfUztfpFiN+EGeLYQBU
+xhPaA+PtT0brRK9cZeeTHS6r04415U7RVu8JG3SzpMoAg+rgle3v882KHtpxbUDn
+NlYmUJ9ahn9FStQMa0BoeP5XCueWjOw4V6yJWFTgFHZMk0B9Ltc2HXFarHP4rYDT
+Uki0aPMGq7datCwa
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/subjectAltName_www_example_com.pem b/net/data/ssl/certificates/subjectAltName_www_example_com.pem
index 88a338eee..f08f3fde 100644
--- a/net/data/ssl/certificates/subjectAltName_www_example_com.pem
+++ b/net/data/ssl/certificates/subjectAltName_www_example_com.pem
@@ -1,35 +1,35 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 15837232328995864193 (0xdbc926e4db217e81)
+        Serial Number: 9226305053301513866 (0x800a6b901b6d9e8a)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=localhost
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Validity
-            Not Before: Mar 28 22:42:07 2017 GMT
-            Not After : Mar 26 22:42:07 2027 GMT
-        Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=localhost
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
+        Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b5:12:3c:e3:76:25:c4:e5:9f:ac:69:3a:dd:40:
-                    78:95:ef:1e:f2:b6:c2:74:14:e7:ba:cc:f3:a6:46:
-                    6c:51:1f:2e:4e:9c:99:7a:82:1f:43:bc:28:8a:74:
-                    8e:52:73:59:24:ac:0a:71:c9:b5:30:a9:d3:85:f9:
-                    8c:76:d0:19:43:fe:cb:c0:d6:4b:9e:9b:76:63:84:
-                    ae:99:4d:14:a2:be:ae:81:5d:05:22:b9:46:39:66:
-                    4e:42:10:57:64:26:27:f2:88:7f:55:10:38:83:7a:
-                    dd:6c:09:ae:f1:09:33:04:84:ab:48:53:1c:9c:42:
-                    b4:f7:ee:c5:21:7a:65:56:91:64:99:9b:f4:2c:22:
-                    50:dc:36:35:ac:04:22:eb:5c:2d:4c:6c:4b:16:70:
-                    f7:13:36:f9:32:ec:6d:e8:f7:2e:f2:b9:b8:0c:e2:
-                    99:de:ed:61:7d:66:17:33:67:0e:6e:87:5d:05:65:
-                    e1:98:46:2c:e7:8e:6d:a7:20:ab:87:5b:f3:32:55:
-                    cb:2d:df:76:9b:cf:06:71:5c:06:77:3b:20:49:6b:
-                    47:5e:6e:ae:42:99:8b:8f:9e:c4:ba:4c:50:ec:14:
-                    a1:43:8f:24:e9:9a:c8:ca:ec:b3:e2:26:d4:a5:ba:
-                    c3:f8:90:b1:03:2a:05:72:a4:3f:17:bd:9c:af:68:
-                    e4:17
+                    00:c2:db:bc:7e:99:b1:50:d8:bf:22:12:80:24:5b:
+                    ab:6d:bb:75:86:e1:14:17:9b:e4:c8:f2:99:ef:aa:
+                    be:8f:4a:74:29:a1:ce:24:55:aa:f1:b5:e9:9a:c7:
+                    01:04:e1:87:c9:38:32:ff:fe:f1:26:e4:36:74:62:
+                    84:a7:13:1b:44:b5:4c:9f:41:86:f2:28:7c:d1:24:
+                    3e:c0:f4:4e:0b:81:e8:f1:f7:54:bf:b0:87:2f:19:
+                    17:92:aa:f7:fd:86:b3:bf:2c:5b:23:da:9b:13:ae:
+                    0d:32:4d:b4:94:72:c6:08:05:95:c4:1d:b7:e2:34:
+                    35:6e:44:44:c1:5d:d5:61:78:b9:e9:70:55:e6:a0:
+                    cf:08:1d:7e:85:48:3e:51:33:6b:15:c2:11:f9:37:
+                    db:cf:8b:6a:f0:cc:f7:cc:41:3a:ef:e6:78:3d:03:
+                    9f:ab:79:3f:aa:6f:e5:68:07:21:f0:62:5b:cd:2d:
+                    d6:fb:fc:9f:71:a4:14:34:d7:3d:a3:27:ee:89:4c:
+                    6c:06:62:ab:1a:6e:7b:a4:1a:57:0f:93:2d:e5:c0:
+                    83:43:6d:e8:e3:72:53:58:2d:0f:57:f4:2a:37:84:
+                    bf:d7:7f:f9:4f:5d:9a:96:ce:92:54:86:b4:6c:20:
+                    0e:fe:9a:f1:74:e3:65:3c:03:09:61:ea:6d:00:9a:
+                    70:df
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
@@ -37,39 +37,39 @@
             X509v3 Subject Alternative Name: 
                 DNS:www.example.com
     Signature Algorithm: sha256WithRSAEncryption
-         38:41:86:d5:01:6b:00:3d:61:1e:ad:f1:82:1d:01:fc:c1:98:
-         8e:d7:ea:46:2d:e3:7c:22:3c:ce:f2:64:f0:73:0c:e5:ea:21:
-         3a:8f:63:e1:c0:27:3d:84:ed:0f:aa:0e:d3:ca:76:67:ba:b9:
-         f4:da:fc:d5:ec:07:f4:97:08:2c:55:e4:be:5f:0c:e7:c9:7f:
-         be:81:b5:76:d2:47:6b:be:01:82:8c:75:27:df:78:99:62:55:
-         74:91:d9:c7:37:a3:62:1f:36:0b:ed:9f:54:01:be:87:9a:3d:
-         d5:90:1e:98:13:29:cd:23:9b:d4:a8:d0:c0:18:04:d5:05:55:
-         97:8d:6b:89:14:0a:1b:b4:2b:bd:7d:05:68:87:72:64:9e:b9:
-         66:a2:89:21:2a:ae:a1:b3:ef:22:0d:e1:80:46:52:11:20:3a:
-         a8:7e:18:1e:e1:19:2d:f5:de:cc:b9:f2:ff:6a:88:db:c1:31:
-         dc:34:25:e2:c0:4c:a7:6e:28:6e:b1:10:7b:04:ed:a4:82:3a:
-         81:55:44:1a:87:25:14:69:de:2d:c0:7d:3b:e3:21:c4:21:e5:
-         ca:f6:7c:11:12:d8:7f:c1:b7:f5:45:ca:6b:e5:41:91:5d:d8:
-         db:64:48:01:64:a5:df:85:51:4b:c4:ed:27:e3:2f:b4:71:f4:
-         c6:a1:a2:ad
+         c1:24:33:a1:13:e3:3d:7a:aa:1c:d7:7e:02:27:b3:af:3b:f7:
+         88:de:6a:97:11:28:07:ea:39:3b:11:89:9d:07:e5:7c:0e:b1:
+         0e:5f:0f:6a:5a:b6:e4:35:ed:45:55:2c:b2:ed:c8:5a:af:69:
+         86:87:b6:4e:11:3e:4d:82:a1:f5:11:ce:3c:fb:18:4a:1a:be:
+         e0:31:4c:bb:0d:2b:90:49:58:a7:1a:33:f3:16:84:d1:f4:ec:
+         c9:7a:eb:65:04:ac:03:3e:17:97:ac:fb:db:3a:52:bf:af:22:
+         f7:10:00:a8:ad:d6:0f:a3:c1:f1:6a:9e:78:30:de:0d:03:ad:
+         f6:8e:f6:6f:4b:af:5f:f4:76:ec:23:fa:d1:a0:1f:40:7f:e4:
+         7d:84:cd:5f:42:c3:4c:7d:0e:89:3a:3e:ae:34:18:18:31:45:
+         44:2f:d0:1f:e9:46:f0:ee:f2:c4:c7:a8:4d:f3:2d:c6:66:a5:
+         02:01:a5:0b:7c:3f:91:d0:38:41:ad:d6:3d:0c:0c:3e:43:81:
+         cb:7e:87:95:b2:ae:7e:ff:67:11:ea:98:66:b4:3e:87:95:e3:
+         37:09:e8:de:22:bb:7b:02:00:40:1b:77:a6:09:65:75:45:a0:
+         0a:49:23:32:4e:b1:b5:c3:fb:a2:5b:d5:88:7d:35:04:7d:5b:
+         79:53:f5:a0
 -----BEGIN CERTIFICATE-----
-MIIDcjCCAlqgAwIBAgIJANvJJuTbIX6BMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
+MIIDcjCCAlqgAwIBAgIJAIAKa5AbbZ6KMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
 BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
-aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAlsb2NhbGhvc3QwHhcNMTcw
-MzI4MjI0MjA3WhcNMjcwMzI2MjI0MjA3WjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
+aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMTcw
+NjA1MTcxMDQ2WhcNMjcwNjAzMTcxMDQ2WjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UECgwH
-VGVzdCBDQTESMBAGA1UEAwwJbG9jYWxob3N0MIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEAtRI843YlxOWfrGk63UB4le8e8rbCdBTnuszzpkZsUR8uTpyZ
-eoIfQ7woinSOUnNZJKwKccm1MKnThfmMdtAZQ/7LwNZLnpt2Y4SumU0Uor6ugV0F
-IrlGOWZOQhBXZCYn8oh/VRA4g3rdbAmu8QkzBISrSFMcnEK09+7FIXplVpFkmZv0
-LCJQ3DY1rAQi61wtTGxLFnD3Ezb5Muxt6Pcu8rm4DOKZ3u1hfWYXM2cOboddBWXh
-mEYs545tpyCrh1vzMlXLLd92m88GcVwGdzsgSWtHXm6uQpmLj57EukxQ7BShQ48k
-6ZrIyuyz4ibUpbrD+JCxAyoFcqQ/F72cr2jkFwIDAQABoy8wLTAPBgNVHRMBAf8E
+VGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEAwtu8fpmxUNi/IhKAJFurbbt1huEUF5vkyPKZ76q+j0p0KaHO
+JFWq8bXpmscBBOGHyTgy//7xJuQ2dGKEpxMbRLVMn0GG8ih80SQ+wPROC4Ho8fdU
+v7CHLxkXkqr3/YazvyxbI9qbE64NMk20lHLGCAWVxB234jQ1bkREwV3VYXi56XBV
+5qDPCB1+hUg+UTNrFcIR+Tfbz4tq8Mz3zEE67+Z4PQOfq3k/qm/laAch8GJbzS3W
++/yfcaQUNNc9oyfuiUxsBmKrGm57pBpXD5Mt5cCDQ23o43JTWC0PV/QqN4S/13/5
+T12als6SVIa0bCAO/prxdONlPAMJYeptAJpw3wIDAQABoy8wLTAPBgNVHRMBAf8E
 BTADAQH/MBoGA1UdEQQTMBGCD3d3dy5leGFtcGxlLmNvbTANBgkqhkiG9w0BAQsF
-AAOCAQEAOEGG1QFrAD1hHq3xgh0B/MGYjtfqRi3jfCI8zvJk8HMM5eohOo9j4cAn
-PYTtD6oO08p2Z7q59Nr81ewH9JcILFXkvl8M58l/voG1dtJHa74Bgox1J994mWJV
-dJHZxzejYh82C+2fVAG+h5o91ZAemBMpzSOb1KjQwBgE1QVVl41riRQKG7QrvX0F
-aIdyZJ65ZqKJISquobPvIg3hgEZSESA6qH4YHuEZLfXezLny/2qI28Ex3DQl4sBM
-p24obrEQewTtpII6gVVEGoclFGneLcB9O+MhxCHlyvZ8ERLYf8G39UXKa+VBkV3Y
-22RIAWSl34VRS8TtJ+MvtHH0xqGirQ==
+AAOCAQEAwSQzoRPjPXqqHNd+Aiezrzv3iN5qlxEoB+o5OxGJnQflfA6xDl8Palq2
+5DXtRVUssu3IWq9phoe2ThE+TYKh9RHOPPsYShq+4DFMuw0rkElYpxoz8xaE0fTs
+yXrrZQSsAz4Xl6z72zpSv68i9xAAqK3WD6PB8WqeeDDeDQOt9o72b0uvX/R27CP6
+0aAfQH/kfYTNX0LDTH0OiTo+rjQYGDFFRC/QH+lG8O7yxMeoTfMtxmalAgGlC3w/
+kdA4Qa3WPQwMPkOBy36HlbKufv9nEeqYZrQ+h5XjNwno3iK7ewIAQBt3pglldUWg
+CkkjMk6xtcP7olvViH01BH1beVP1oA==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/test_mail_google_com.pem b/net/data/ssl/certificates/test_mail_google_com.pem
deleted file mode 100644
index d72d562..0000000
--- a/net/data/ssl/certificates/test_mail_google_com.pem
+++ /dev/null
@@ -1,26 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIEXDCCAkSgAwIBAgIBBjANBgkqhkiG9w0BAQUFADBgMRAwDgYDVQQDEwdUZXN0
-IENBMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMN
-TW91bnRhaW4gVmlldzESMBAGA1UEChMJQ2VydCBUZXN0MB4XDTExMTAxMTE5MTYy
-MVoXDTEzMDcyNzAwMDAwMFowbTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm
-b3JuaWExEjAQBgNVBAoTCUNlcnQgVGVzdDEbMBkGA1UECxMSR29hdCBUZWxlcG9y
-dGF0aW9uMRgwFgYDVQQDEw9tYWlsLmdvb2dsZS5jb20wXDANBgkqhkiG9w0BAQEF
-AANLADBIAkEAvy9N7zZ2yuMamRGUDc7KiLHq+OwVkfmvDRsrj77+MMR1DkUx1Qez
-s+tKtm6dyi5mariRL5ChbgIBqNYhb/cecQIDAQABo4HbMIHYMBIGA1UdEwEB/wQI
-MAYBAf8CAQEwDgYDVR0PAQH/BAQDAgIEMB0GA1UdDgQWBBQQFF3/oZUdPuM69r0i
-Gl5tEK5e7TCBkgYDVR0jBIGKMIGHgBRdzn+Z49QZQTFPxs+xJfVar+OXMaFkpGIw
-YDEQMA4GA1UEAxMHVGVzdCBDQTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlm
-b3JuaWExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEjAQBgNVBAoTCUNlcnQgVGVz
-dIIJANRRk9Q/3tlOMA0GCSqGSIb3DQEBBQUAA4ICAQCPO6wgG6cFmu5ZgAN9q+dS
-BVrMiJhHj62Tlw7qNjD+VAfidTTtQPM8T0y2LtNe2epO6jDOyIpRwsKkFi5mozcs
-Dd3CfXAs7fkdY4ZnAxjXhhk1fvMkomR6CfTHEwcGkfwVm2MDozZmYbS83OP+E82B
-+yKA41ppbw75/meJzH4nSECBd/Whzi8AuuX6e3bSae6XEAdhBQoLHyNAvZ0IEeCb
-sI3DvXdpIP0LyYJH6+F/KG5Jugby44HuAK1MBn9/f5tYplucOj5cyw/fYWd8REGD
-Ob71lh9/eZVcYjvbF6LxlizZQ+DNHV2QkHvSQqAACDbpFCUcU9KO5xvN8RaVtFmJ
-sDuHtxDDXFcXHhLh6bcC2KFrsmwEV68jmek0++eMa/W99ADzNWUWCmGoyZQafP2e
-eqQ6Ry8wgH+ZVkhQaaGk4fCKZATpX7//qdj7IzO52Kpx0dwsW7mHxPjdRKQzThkn
-lwFSiKByJDMOm9JbjpGf52JsCX4OSFuHCRcc2TB867xKRfBoAXE06fMS2lTwAcQh
-3vdzO0gEv9WOvdvehvngcrWzGwIdGaP6BBXi+9b5wPBR8ravMPAgQBXg01vME+/+
-TkpEaCFACOttO0YkVqG6lFFT1wigsh3k4/+Eyh/RsLTsFObZBJsMLetbY/XzwhTf
-LyeXa2sT1sk6l+EfrzWS1Q==
------END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/tls_feature_extension.pem b/net/data/ssl/certificates/tls_feature_extension.pem
index d16fcf7..67841a9 100644
--- a/net/data/ssl/certificates/tls_feature_extension.pem
+++ b/net/data/ssl/certificates/tls_feature_extension.pem
@@ -1,21 +1,21 @@
 -----BEGIN CERTIFICATE-----
-MIIDaTCCAlGgAwIBAgIJAKDZZ4Vf7QNDMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
+MIIDaTCCAlGgAwIBAgIJAIeI+/LexiCJMA0GCSqGSIb3DQEBCwUAMGAxCzAJBgNV
 BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
-aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMTYx
-MDIwMjIzMzQzWhcNMTcxMDIwMjIzMzQzWjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
+aWV3MRAwDgYDVQQKDAdUZXN0IENBMRIwEAYDVQQDDAkxMjcuMC4wLjEwHhcNMTcw
+NjA1MTcxMDU0WhcNMTgwNjA1MTcxMDU0WjBgMQswCQYDVQQGEwJVUzETMBEGA1UE
 CAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UECgwH
 VGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEFAAOC
-AQ8AMIIBCgKCAQEA2e6TVVWL8mcllu2KipxZVpOsEuxDB5cwLYshaHyZz2K8azK9
-K/wD2jNe78DGu1o+mYOC05x/CvYk3jFvGGdYeBqbmxN2nFC7z3pVBUlLGvn9Smwa
-ki6sCuoK/bdjQW2HntA+A3vvUwR/j4X8XqnqD7p5vxEDknjpABiIXuE3mF1DPKT0
-2ZMilpW0DdqfvedlWyR0Pmi+iZ/zOSdrIrPpktQN+dcwu5dLsGNRcXD5JceHNuNJ
-+YScGhyh3649aS6WiEZ+hfeLiMkMGfWmU0qST6aJN4m/c6q6rvFwT08Z2SP27wqT
-wXDd51jWCGU+wWPLgFZzky2iz2urgi/P/b7dVwIDAQABoyYwJDAPBgNVHREECDAG
-hwR/AAABMBEGCCsGAQUFBwEYBAUwAwIBBTANBgkqhkiG9w0BAQsFAAOCAQEAHpJs
-jQXY2TN3t9s+bdpXZ6QkELzdRi/RWkSNUIIzisFhDZqJ86VpfFr2NqQpTSy8DO41
-HH8bj0YkGLdMNgSjJpNv5Vap/lSJMcfdD+ijtNDDQ8R42lDMVSKh+Bag2GHuOhyQ
-x8M+GQtKq9UHJ4mnAHYoSALCkrRvUxH+enKdpbrxk9+eY4TecpPoD2CmglX5JILe
-nIMS4GtXPH0r3WB7xcUGqKGQWcyIwI/caMSA3cQUcsMDW4k00NthZmrVyvfZWTvA
-tGdIPih/RILt0kdl/75v8tbHaE1BQQRRV1qP7QrBqPMmqTZyChNiNqMmPOw4MWec
-5giK1nqXMx/+6LJjiA==
+AQ8AMIIBCgKCAQEA8bX3pOpg4m3dEhcMVi7zWkxAStqH6FDJB2K5VfACCP13MZV3
+VO6rGcQyBd2NXQUCO+Ui0Jbiw1D2NfOD8bO0sJzlHjLjeHhDG8odpd6MZxApdCNu
+Gn8TDtpKGadGCwq7PnlbaYu/Oj3keQfS2ACtY/nLOU8O8+zl8cnVR4gR77fhxJqa
+gz3Z/LC8kbMrOQAbDaA6ZAO6uLsnp8ixjrbEjCUJMqSC1L/0VbIZ8wsPKZYAjB0I
+fIWuQlWPwZxCzqmjhE3r9sqw1CgukgXdnt/5yxN5MVfN0QcTLYlJQCq2SfkQQNLv
+GNoAqiW7rK6C5b1LuAdpuiHpNwvg7loAvbZ+wwIDAQABoyYwJDAPBgNVHREECDAG
+hwR/AAABMBEGCCsGAQUFBwEYBAUwAwIBBTANBgkqhkiG9w0BAQsFAAOCAQEA2tLO
+/fXAqNgpstCZPTCt+Wu+jYXf8fqpJJNw4TQln9LswxKZZ2oQnF84GskypCBbMZx3
+g5QjF/t/9BBVBdl71uaOxW4FkvWA4YUXonJgtsa6O97jB/56orNG3bAMqraHkZQx
+ZoRzbWkEC/y6IYTnlD1kMubISiS7uMQFf3ntvpGl6s8YDIlloeV2RsosTx5bfheY
+dkclVi0jtDuctUYdGfBQGiTbt+dorSuQGgmtKNK0zRKYtePS5m6JHHDn5K9TVPjs
+wE65POtysB8hydH6Req+i+VSYunmeztb6VNJkDkPRUNcKDXKnMPNwI8u6GBZsSfR
+Q8XktPLV77UFTMTBoA==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/wildcard.pem b/net/data/ssl/certificates/wildcard.pem
index 6c04784..34500b2 100644
--- a/net/data/ssl/certificates/wildcard.pem
+++ b/net/data/ssl/certificates/wildcard.pem
@@ -1,110 +1,112 @@
 -----BEGIN PRIVATE KEY-----
-MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDfhiVHagGcPZTL
-4aHOnMXM4dYquwuCgl322Pn1H7KXj+zmaWna8ZzP2i9Zp4++aGoSk0ZMxdgMCSrq
-ayCQS6n0Fm5ouEK2dz2EbEWjLMEX4+PRP7Vkh1tE7yS6oQpEGK1nApCSyDqfhmIU
-C5G9o5GupqC3WrIOwAPvpDiEKLpAExetEf7IZd415Tj6yq2umyWzxbYUwqSI0fUv
-0BY84C+2vaVhPNqv5jCSHBW8ueR+gnIto9vkq6JfOp4yuJ1ufqSdpt67gYskieJw
-sBZmyZ3FQYlKj35lPhOnWbRpPTG0L5IhMCRsJ/qR1h2Hrs+dU4+hyLyZpdqic0wL
-3UQnpKtPAgMBAAECggEACpATSOmog9KhKnVSKSpdao4tib1nENbKS/T68ut5jBIA
-Fu9aUj9isqvT2v/BGjVi9dfB1bTvvbndLlC7rDX3JRK+SvKSLH88B/r523ks8s0R
-If1JvCNtW7eVW8BqdMdZwmlrnZQauRknn1zgmT6WjtNO+vstOOc4CGYRSaWHD6oA
-rpg23vKm8JbYLACnlQBgDr/fhHN0PLWrsLEFTYSfvFz8+B//2Rslj4/mJhEfu+aG
-Nr0N6HqIrgzTZarI0nhst9PTJuOMBjyJIByV6T8hchOgLqWqvtTnXq3U4GLsbTh2
-vvKIndORecZV29y+VqIiJLch+OFg4uDR8yqMQndvyQKBgQD5ZRc9YLmXlXPS1PsV
-5mix54ZiX70jm4ZwSmDlX3XboEyJrxJJ0EefqSDz1HxMObzWdPs+dT8JzUezU7ha
-sBpCDY++rj1UUZbOqCmiU3xdpWVea02xCjAhGO43XErnu5FCmyL4xCTSm48t0w01
-3jH9WanO9I3OjngNHawYyarPQwKBgQDlcaYnubY0Vro+JxCuYHYlggYaj9OaNSJ8
-hH9PZ6FG3O7OusP8fSvHKNbzdGkXO72UrGcYJGoaYbdIPKP4k3iJ43M1+wX6VZb2
-ohylWuHmVn4pMkLC+1zKASLd1AKBgdgX2+mpmfHa5Nnv7+6KgYKNAQKE1IMcq++a
-2aateUd1BQKBgQCKFjYi7u50BvVFlFWeD6CCeL5Is9fm4lMy04wJFK0OORiH157Z
-rfAqcBvlxg44qnNrjwQZ1hNcWwRLP5zA4eb4Ecg4fQNKL46/yA6daXpf45dYCzPO
-ReTWPpaPopN68bkBVyKq+PemgSlq5wPWgrvNGptSEsh9yRahtH84jlj8PwKBgGL8
-nwRweI0oBX2e+PFiKFaSO/PlrRLQbaput0YYnVmnI1gI91jM38AyfFnYFSay3V1w
-66FcxHHRSnNdxhgN92j1udTGEZQorNKGqfkktmTbV96KEodwTl3QE6zENLiOvh29
-AJftFIytQuDjEHSs3xfaIa4QyOfrvZl+4QviUNPJAoGAe8cNgvKPVSEZjt+/tW0K
-LPCOZxDsBgwIWcpxFpzTigdw/4AKedccwp0vMRaj44gzKDCVxgnU3qPBEGHqLOAs
-UcV6KEVQrIupPB8ix8y1qpiRsrDqhEcNRyDcTJEaPgjOfNKw80lstromo6dmrpFe
-cO+alA7DDyg+545GrCsgy/Q=
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDTlB8ztLsVMnd6
+2FAK6t96JVwtDdQGDTNMBU41KlKxJS4l+PPuYREZBoRsAvFRuWa/9icP8LWqy4g4
+4Njnz3cMjKd0uzAU4L11mffPTFB6cem9HFjNvfIjoP1XopzKYRSw3zwxxVme0Vwa
+n5OjBi4SORoL6KKGMNo1Jj/npZ6IsyC/zgdPLCGK2gFa8GrKEXfsjpsr0J88N5mT
+SqVo3l+zYWQoNpxvAfLu/GoMAGFVrqR5yUthsIS88tfQMVPx5miPZMsjBpkbW0Wd
+K6AsjAzoBBHFlEmDUT99yi4t9bimKjkm5b85gu5AO5OcnGt1V5YKoOIJ46/bWzjM
+zHKXqnmjAgMBAAECggEAT1Cfwcpmt7OLhsnAd9dEn42R2HHuobYhHMaAYv3SsgW2
+HxYMm7hXqIIA8lzIClLuadflHNynvbc/AdOIfJ4RiurPe7sQc0MswwFNHLEHGl/J
+t9MAl2A1fZXEYy3aiSOLliKZdi79QcRKOtDHj72pV7uAQCadhqCZrIMCQdycabHO
+c30AI3cPKdC4ProHhP9bh0cGrIE31wBJx/6aiLWV94FgiIkj46ZSRvtGd13c7cIx
+soyGbl4ZuLM4K6A5t8cmfyVv5rqS07rCopNFF1Sam7voBTEpDqXoe4WbY0GCMQi7
+96Q6napbgjCZUCN3vYtljmtOL3DhN+P21am+qauPQQKBgQDuGtsvmDYYJo1Ss/CN
+d0YrxB4gIAA1B712HTkW5tH5bpRasAwnHaUplaDl4lE6j4uoih7OyTdgekPBuVO/
+bNdKEPg0oZZuUrL7630JrWh3aq31l9669zLbfjgGqb9TV/oZmuxNTazBNTO1FTjs
+48jL401diqZhNz+iw4gtMmPwBQKBgQDjeuYiUUUI90PobUpS3y9TF1LotjQ8RWXf
+r6qp234zSE8UM/WlHefvzmvMU1G+M8PKyZa4VbzUVI4RBDBNKcUyRJ1HxRnfcZIh
+isZEBqpbjPC0YiFxijZS+lbQJUwYllkASF30Rvss/uaSab7xLb4bKTwLmIHn7tP+
+Iu+IIbr7hwKBgCNdbczF6NLxdvAftcztOEjr2iWfWyiFO8i9UmtqYSmRGQvXNhbh
+OlTQ2pMKaFIwW+fui+De1hDIWCP/6MZ33gosNxFqJrPAKMFuGqZDUU7bU3c01Woj
+qTQcrSmgMMCqQoVnE03wCYaw5jsxKcFVm89ctXL9UvUBhbwhGqrL3zgZAoGBAMQz
+5nbG/fJDwxCf4zEjSyAxx9LsBJXPjZSnYV3r8SeuQHa+ciseZkRSGGw9mQ2ifEdW
+JGeNm7bPz1Eh+b80Pd+jiryyZiRxQocnuOZHkXwxThNnaE0T1tMvFN2mrcGvO8ig
+oljlOBORL7Is/wHqYEPxBtdBjRpMxhA2db9GyI3VAoGAE3QAcl8LZPQJ32TwPLb5
+oCOS9DYz7PgwR6CYfTNINePN0lnt7J6XQyA10nIKYiv7j1LcJjjmEHcYDYqHamuY
+cQDoHD4rZwu3/cpqtldKifopP3mYE5E5wcYVklCZfXl2JohaFt9lQxmgcsRTjLxc
+RaOLpZHusNcyPfIqHZQjD/Q=
 -----END PRIVATE KEY-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 12 (0xc)
+        Serial Number: 4 (0x4)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Dec 30 20:30:57 2015 GMT
-            Not After : Dec 27 20:30:57 2025 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:df:86:25:47:6a:01:9c:3d:94:cb:e1:a1:ce:9c:
-                    c5:cc:e1:d6:2a:bb:0b:82:82:5d:f6:d8:f9:f5:1f:
-                    b2:97:8f:ec:e6:69:69:da:f1:9c:cf:da:2f:59:a7:
-                    8f:be:68:6a:12:93:46:4c:c5:d8:0c:09:2a:ea:6b:
-                    20:90:4b:a9:f4:16:6e:68:b8:42:b6:77:3d:84:6c:
-                    45:a3:2c:c1:17:e3:e3:d1:3f:b5:64:87:5b:44:ef:
-                    24:ba:a1:0a:44:18:ad:67:02:90:92:c8:3a:9f:86:
-                    62:14:0b:91:bd:a3:91:ae:a6:a0:b7:5a:b2:0e:c0:
-                    03:ef:a4:38:84:28:ba:40:13:17:ad:11:fe:c8:65:
-                    de:35:e5:38:fa:ca:ad:ae:9b:25:b3:c5:b6:14:c2:
-                    a4:88:d1:f5:2f:d0:16:3c:e0:2f:b6:bd:a5:61:3c:
-                    da:af:e6:30:92:1c:15:bc:b9:e4:7e:82:72:2d:a3:
-                    db:e4:ab:a2:5f:3a:9e:32:b8:9d:6e:7e:a4:9d:a6:
-                    de:bb:81:8b:24:89:e2:70:b0:16:66:c9:9d:c5:41:
-                    89:4a:8f:7e:65:3e:13:a7:59:b4:69:3d:31:b4:2f:
-                    92:21:30:24:6c:27:fa:91:d6:1d:87:ae:cf:9d:53:
-                    8f:a1:c8:bc:99:a5:da:a2:73:4c:0b:dd:44:27:a4:
-                    ab:4f
+                    00:d3:94:1f:33:b4:bb:15:32:77:7a:d8:50:0a:ea:
+                    df:7a:25:5c:2d:0d:d4:06:0d:33:4c:05:4e:35:2a:
+                    52:b1:25:2e:25:f8:f3:ee:61:11:19:06:84:6c:02:
+                    f1:51:b9:66:bf:f6:27:0f:f0:b5:aa:cb:88:38:e0:
+                    d8:e7:cf:77:0c:8c:a7:74:bb:30:14:e0:bd:75:99:
+                    f7:cf:4c:50:7a:71:e9:bd:1c:58:cd:bd:f2:23:a0:
+                    fd:57:a2:9c:ca:61:14:b0:df:3c:31:c5:59:9e:d1:
+                    5c:1a:9f:93:a3:06:2e:12:39:1a:0b:e8:a2:86:30:
+                    da:35:26:3f:e7:a5:9e:88:b3:20:bf:ce:07:4f:2c:
+                    21:8a:da:01:5a:f0:6a:ca:11:77:ec:8e:9b:2b:d0:
+                    9f:3c:37:99:93:4a:a5:68:de:5f:b3:61:64:28:36:
+                    9c:6f:01:f2:ee:fc:6a:0c:00:61:55:ae:a4:79:c9:
+                    4b:61:b0:84:bc:f2:d7:d0:31:53:f1:e6:68:8f:64:
+                    cb:23:06:99:1b:5b:45:9d:2b:a0:2c:8c:0c:e8:04:
+                    11:c5:94:49:83:51:3f:7d:ca:2e:2d:f5:b8:a6:2a:
+                    39:26:e5:bf:39:82:ee:40:3b:93:9c:9c:6b:75:57:
+                    96:0a:a0:e2:09:e3:af:db:5b:38:cc:cc:72:97:aa:
+                    79:a3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                07:AA:23:37:A2:23:9D:E6:7C:C8:28:0E:5B:F7:E0:46:A7:B9:F7:A9
+                18:0C:EB:51:B9:D3:36:A9:C9:04:AF:F9:2F:14:F0:99:66:D2:76:D4
             X509v3 Authority Key Identifier: 
-                keyid:BC:F7:30:D1:3C:C0:F2:79:FA:EF:9F:C9:6C:5C:93:F3:8A:68:AB:83
+                keyid:9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 DNS:*.example.org
     Signature Algorithm: sha256WithRSAEncryption
-         35:09:35:43:ec:28:b2:fb:91:25:ef:70:8d:77:58:3e:4b:ec:
-         59:3e:53:d7:1f:2c:bc:9c:d7:77:4d:82:93:b5:07:06:cb:9e:
-         dd:3d:0b:77:22:46:7f:d1:87:80:8b:04:ca:9b:97:13:0c:f1:
-         b7:ed:cf:07:f2:5e:cc:cb:63:57:6e:c8:10:de:1d:25:ce:dd:
-         0c:64:35:43:92:9e:59:03:57:b5:04:25:74:4a:40:26:e7:df:
-         99:4e:de:05:13:be:d7:91:b8:72:e0:ea:09:32:58:e3:b7:4f:
-         55:b6:fb:8d:26:31:54:ac:1b:c7:97:34:7a:73:f2:95:5a:ab:
-         54:48:80:19:50:a1:f2:ce:89:3f:06:1a:2c:48:c1:11:7e:62:
-         00:c4:ec:41:7d:5e:6c:9b:81:c8:21:1a:8a:2b:38:dc:8d:36:
-         c7:e0:e2:f5:20:68:6f:f5:af:ab:62:ec:d8:10:6f:99:b7:f4:
-         9a:94:ec:5a:2b:5e:00:62:96:ac:2c:19:b8:dc:ee:c0:da:f9:
-         10:50:9f:1f:2a:80:46:68:9f:f5:95:5f:7e:f8:de:ce:3e:b5:
-         f1:0b:09:55:c0:09:9f:fb:65:07:41:85:a7:6e:7d:04:fb:25:
-         85:dc:c2:d6:4d:0b:00:12:11:be:4c:c1:c2:4a:7d:b4:47:19:
-         51:76:9e:f7
+         bd:72:b4:50:5d:7d:8b:b2:64:49:27:68:99:0c:01:d7:c5:91:
+         15:a2:86:f1:56:69:48:5b:0a:6c:41:02:3d:11:e8:c6:4b:4c:
+         97:f3:dd:d3:8c:24:f9:6d:1f:64:5a:b8:df:78:f7:e0:3f:9c:
+         8d:30:7a:3b:10:15:74:f2:0f:49:ec:7c:53:8d:1f:60:c9:7d:
+         0b:5d:ca:d6:d7:a3:7f:8a:3f:fa:b7:0b:c4:40:dd:55:fb:fb:
+         3d:49:28:82:b9:62:5f:34:84:30:26:1d:71:3c:2b:b9:5e:e1:
+         8c:2d:bf:21:bd:2d:fe:47:71:6e:54:6d:e1:d0:f6:23:58:dd:
+         9e:db:05:cb:f5:5f:11:3f:e6:d0:9d:aa:46:12:56:95:f6:04:
+         cc:21:5e:1e:7f:07:fc:f6:48:88:8b:2c:a3:9a:66:d9:1a:1d:
+         4e:a8:bd:c3:8f:fe:d6:bf:18:c9:f9:a4:f1:31:7e:12:85:83:
+         62:d6:d9:f9:27:20:b4:21:f9:7e:57:52:fa:89:c8:84:78:23:
+         cf:fb:67:8a:a8:db:63:43:11:16:bf:59:c6:ba:21:9a:d8:0e:
+         04:eb:d1:38:42:87:d3:a7:3d:da:83:a6:8f:66:a1:c8:5a:4c:
+         ff:25:3d:3c:bf:c9:bc:d9:85:49:a3:16:d5:e3:b3:8c:77:a6:
+         21:62:93:33
 -----BEGIN CERTIFICATE-----
-MIIDfTCCAmWgAwIBAgIBDDANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTUxMjMwMjAzMDU3WhcNMjUxMjI3MjAzMDU3WjBgMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjAN
-BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA34YlR2oBnD2Uy+GhzpzFzOHWKrsL
-goJd9tj59R+yl4/s5mlp2vGcz9ovWaePvmhqEpNGTMXYDAkq6msgkEup9BZuaLhC
-tnc9hGxFoyzBF+Pj0T+1ZIdbRO8kuqEKRBitZwKQksg6n4ZiFAuRvaORrqagt1qy
-DsAD76Q4hCi6QBMXrRH+yGXeNeU4+sqtrpsls8W2FMKkiNH1L9AWPOAvtr2lYTza
-r+YwkhwVvLnkfoJyLaPb5KuiXzqeMridbn6knabeu4GLJInicLAWZsmdxUGJSo9+
-ZT4Tp1m0aT0xtC+SITAkbCf6kdYdh67PnVOPoci8maXaonNMC91EJ6SrTwIDAQAB
-o4GKMIGHMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFAeqIzeiI53mfMgoDlv34Ean
-ufepMB8GA1UdIwQYMBaAFLz3MNE8wPJ5+u+fyWxck/OKaKuDMB0GA1UdJQQWMBQG
-CCsGAQUFBwMBBggrBgEFBQcDAjAYBgNVHREEETAPgg0qLmV4YW1wbGUub3JnMA0G
-CSqGSIb3DQEBCwUAA4IBAQA1CTVD7Ciy+5El73CNd1g+S+xZPlPXHyy8nNd3TYKT
-tQcGy57dPQt3IkZ/0YeAiwTKm5cTDPG37c8H8l7My2NXbsgQ3h0lzt0MZDVDkp5Z
-A1e1BCV0SkAm59+ZTt4FE77Xkbhy4OoJMljjt09VtvuNJjFUrBvHlzR6c/KVWqtU
-SIAZUKHyzok/BhosSMERfmIAxOxBfV5sm4HIIRqKKzjcjTbH4OL1IGhv9a+rYuzY
-EG+Zt/SalOxaK14AYpasLBm43O7A2vkQUJ8fKoBGaJ/1lV9++N7OPrXxCwlVwAmf
-+2UHQYWnbn0E+yWF3MLWTQsAEhG+TMHCSn20RxlRdp73
+MIIDyTCCArGgAwIBAgIBBDANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3
+MTA0NloXDTI3MDYwMzE3MTA0NlowYDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExEjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBANOUHzO0uxUyd3rYUArq33olXC0N1AYNM0wFTjUqUrElLiX48+5hERkG
+hGwC8VG5Zr/2Jw/wtarLiDjg2OfPdwyMp3S7MBTgvXWZ989MUHpx6b0cWM298iOg
+/VeinMphFLDfPDHFWZ7RXBqfk6MGLhI5GgvoooYw2jUmP+elnoizIL/OB08sIYra
+AVrwasoRd+yOmyvQnzw3mZNKpWjeX7NhZCg2nG8B8u78agwAYVWupHnJS2GwhLzy
+19AxU/HmaI9kyyMGmRtbRZ0roCyMDOgEEcWUSYNRP33KLi31uKYqOSblvzmC7kA7
+k5yca3VXlgqg4gnjr9tbOMzMcpeqeaMCAwEAAaOBijCBhzAMBgNVHRMBAf8EAjAA
+MB0GA1UdDgQWBBQYDOtRudM2qckEr/kvFPCZZtJ21DAfBgNVHSMEGDAWgBSbJguK
+mKm7HbkfHOMaQDPtjheIqzAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIw
+GAYDVR0RBBEwD4INKi5leGFtcGxlLm9yZzANBgkqhkiG9w0BAQsFAAOCAQEAvXK0
+UF19i7JkSSdomQwB18WRFaKG8VZpSFsKbEECPRHoxktMl/Pd04wk+W0fZFq433j3
+4D+cjTB6OxAVdPIPSex8U40fYMl9C13K1tejf4o/+rcLxEDdVfv7PUkogrliXzSE
+MCYdcTwruV7hjC2/Ib0t/kdxblRt4dD2I1jdntsFy/VfET/m0J2qRhJWlfYEzCFe
+Hn8H/PZIiIsso5pm2RodTqi9w4/+1r8Yyfmk8TF+EoWDYtbZ+ScgtCH5fldS+onI
+hHgjz/tniqjbY0MRFr9ZxrohmtgOBOvROEKH06c92oOmj2ahyFpM/yU9PL/JvNmF
+SaMW1eOzjHemIWKTMw==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/x509_verify_results.chain.pem b/net/data/ssl/certificates/x509_verify_results.chain.pem
index 5b1c6bad0..84acc63 100644
--- a/net/data/ssl/certificates/x509_verify_results.chain.pem
+++ b/net/data/ssl/certificates/x509_verify_results.chain.pem
@@ -5,174 +5,234 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Intermediate CA
         Validity
-            Not Before: Dec  9 22:40:08 2016 GMT
-            Not After : Dec  7 22:40:08 2026 GMT
+            Not Before: Jun  5 17:10:46 2017 GMT
+            Not After : Jun  3 17:10:46 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=127.0.0.1
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:bf:a3:5d:b8:f2:6d:da:86:d4:d6:dd:0c:a0:db:
-                    c0:9a:c4:3b:b7:95:06:9a:11:d7:cf:8d:d0:1c:ef:
-                    99:dc:8a:dd:87:bd:d9:0e:b9:11:69:af:94:57:11:
-                    af:8b:86:16:08:59:c8:fe:fe:86:ba:26:09:fe:f0:
-                    51:ba:14:43:64:c8:65:85:1f:cb:44:39:f6:93:57:
-                    98:34:f2:bf:06:77:36:02:6a:d9:99:04:f4:e2:5d:
-                    7f:db:ed:f2:14:5d:48:72:b2:5b:34:b2:df:ea:56:
-                    ab:d3:88:f6:58:44:cf:40:33:fe:c9:b5:b8:c3:e2:
-                    73:59:0d:a6:e6:c9:5b:91:92:42:c1:f2:58:31:12:
-                    e0:57:5f:94:7c:76:2d:d2:ac:e7:c2:62:a2:88:e8:
-                    83:cf:88:9e:ed:ba:67:09:61:b8:1f:5a:a5:e1:74:
-                    ca:87:18:3b:5d:d0:ef:c2:45:f5:26:25:18:ca:9a:
-                    c5:f7:61:9b:b0:fb:1c:04:0a:03:59:d7:87:c6:51:
-                    65:3b:6e:74:76:50:e7:c2:52:00:5a:45:59:8e:2f:
-                    69:1d:83:ae:78:e5:03:66:15:3f:7b:42:93:f0:c5:
-                    1a:ad:96:e4:e7:09:31:0e:4d:97:b5:9e:9b:63:78:
-                    d3:0e:ca:27:d2:64:27:92:c2:de:6b:2e:5c:f0:7f:
-                    78:d9
+                    00:b4:bf:d2:97:33:e5:13:5b:77:65:bd:73:1a:75:
+                    28:9b:47:59:e6:b7:30:e8:46:33:6d:58:5b:da:1f:
+                    0a:ff:e4:e4:2d:f2:1d:f8:89:e8:64:2e:f6:c3:cd:
+                    d7:a3:8e:d7:f7:cd:e7:d8:0e:10:c3:e7:56:d2:fc:
+                    e5:e6:d3:4e:e2:ff:82:4d:18:63:87:b0:a3:de:da:
+                    ef:0a:37:7b:ac:b5:b7:43:ce:f2:07:39:df:14:e9:
+                    c3:a4:41:3e:7e:68:47:34:9b:7b:61:c4:18:e6:13:
+                    ce:b3:b4:a6:e0:ba:03:ee:e4:eb:e7:aa:f4:6d:be:
+                    97:5b:aa:06:97:50:01:d0:78:b8:d6:92:b0:e4:e2:
+                    b9:43:88:b5:ae:14:64:7d:52:70:d4:05:1c:09:25:
+                    d5:e2:4f:c9:a8:82:db:41:31:c3:be:44:6f:0b:d4:
+                    fd:bf:c1:ee:d9:62:bf:3b:8f:b5:00:c8:d1:df:5d:
+                    4a:13:ad:71:e4:4b:5f:d1:d9:72:4c:83:d8:93:40:
+                    bf:6c:cd:2f:66:0e:04:d6:b9:43:28:24:c9:25:fd:
+                    59:70:fe:3d:f2:a9:0a:4e:c2:9b:c4:de:9e:57:5e:
+                    5d:16:25:e6:78:b6:44:49:29:9d:f6:bf:74:fb:85:
+                    d6:0d:f1:65:58:f2:2b:d6:8f:10:49:c8:00:2d:88:
+                    e2:2d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                1A:DE:3A:BF:17:09:87:0A:D0:12:6B:C9:47:D2:A7:EB:ED:5B:04:99
+                E0:DC:E0:2F:07:88:74:3A:9F:D3:30:A3:71:8A:F9:D6:A5:E5:A6:53
             X509v3 Authority Key Identifier: 
-                keyid:F9:98:21:49:71:FA:8D:B9:20:F7:FE:5D:4D:41:E8:8B:6C:E0:62:C3
+                keyid:17:5C:45:F3:D0:AC:1C:10:4C:8B:43:44:20:C4:DD:93:C5:C5:19:3B
 
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
             X509v3 Subject Alternative Name: 
                 IP Address:127.0.0.1
     Signature Algorithm: sha256WithRSAEncryption
-         8a:ac:de:1c:d2:ca:a7:b3:f8:26:34:2e:a7:b4:ef:7e:26:08:
-         5b:f4:78:ec:37:4a:a8:02:c8:37:cc:45:7c:e3:bd:5c:e3:87:
-         24:ea:4f:1a:dd:f5:d7:a3:de:2f:78:6a:e9:3a:4d:87:3a:9b:
-         7c:5c:5b:59:b4:2f:9e:1d:6d:29:9f:60:c0:d8:b7:87:0c:4b:
-         59:ac:b3:0d:5c:11:4f:24:09:4e:7c:84:72:00:8c:12:b7:84:
-         8a:80:91:97:4e:22:17:e0:5f:83:fd:97:6c:51:b3:03:c0:a2:
-         3c:f8:9e:24:a1:c1:b7:14:a0:6b:30:e8:62:b8:84:87:6b:ae:
-         e0:d2:56:f0:08:f6:d6:0e:1a:8d:5e:8b:06:b3:1e:14:6c:1b:
-         72:e9:46:25:cb:97:b7:d5:4e:79:20:37:05:a4:51:8e:d4:40:
-         3f:de:6f:c7:32:b8:28:2e:2a:08:c0:51:4e:32:1b:6c:c9:c0:
-         03:b3:b6:3e:fd:46:1e:5b:b7:6f:ef:97:ae:df:03:e9:4e:64:
-         39:94:fa:6f:65:71:11:dc:f7:4d:ed:48:c4:3d:7a:55:b8:c6:
-         f5:04:a4:d8:06:cd:c7:42:48:eb:d0:7a:4c:21:db:44:e7:c2:
-         68:a7:45:9f:54:2c:15:71:b5:74:c6:bf:1b:3c:eb:78:89:6f:
-         19:3a:69:02
+         43:f7:63:38:a3:30:3f:ab:e6:6c:42:a1:dd:ff:8d:f6:ad:b2:
+         eb:b6:9e:4b:bd:90:fc:d8:f4:f0:5a:42:fc:be:5b:cc:c7:24:
+         2f:91:48:a6:a1:bb:a2:b7:19:61:21:ac:d3:81:ee:6e:bb:04:
+         2d:16:b5:7e:cb:e6:a3:17:8f:3e:65:4d:1d:8d:c1:da:3d:3b:
+         ad:a1:b3:e8:f5:e3:16:13:17:0a:a3:45:e0:cf:84:b2:3d:e8:
+         38:69:31:46:e8:8c:10:63:0f:5e:6b:f4:10:25:23:98:b8:5c:
+         d9:06:78:83:18:70:09:a6:ef:8f:e9:f5:ff:b3:44:85:35:f6:
+         69:61:0b:2a:8d:de:87:1c:ec:dc:50:c7:67:ef:88:2c:28:de:
+         c0:db:6e:21:20:00:c5:5b:5d:ef:36:c6:0a:e9:06:a3:25:3e:
+         4d:13:fa:f0:3f:bc:fe:9c:68:48:ff:ec:1b:e7:2c:39:ac:88:
+         2b:a0:88:96:11:3e:f0:20:e2:29:fc:bd:d3:d3:ca:24:63:58:
+         17:15:c3:ac:19:21:cb:21:29:fc:53:e7:3b:cf:c2:0a:5e:f4:
+         ce:f1:9e:77:38:d4:c6:90:4e:94:fe:2e:97:cb:1a:94:2a:1e:
+         8c:3b:db:36:65:c6:19:ba:d7:0b:03:22:e5:92:e2:f6:3e:df:
+         99:ce:6b:49
 -----BEGIN CERTIFICATE-----
 MIIDxzCCAq+gAwIBAgIBATANBgkqhkiG9w0BAQsFADBrMQswCQYDVQQGEwJVUzET
 MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
 A1UECgwHVGVzdCBDQTEdMBsGA1UEAwwUVGVzdCBJbnRlcm1lZGlhdGUgQ0EwHhcN
-MTYxMjA5MjI0MDA4WhcNMjYxMjA3MjI0MDA4WjBgMQswCQYDVQQGEwJVUzETMBEG
+MTcwNjA1MTcxMDQ2WhcNMjcwNjAzMTcxMDQ2WjBgMQswCQYDVQQGEwJVUzETMBEG
 A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UE
 CgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4xMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEAv6NduPJt2obU1t0MoNvAmsQ7t5UGmhHXz43QHO+Z3Ird
-h73ZDrkRaa+UVxGvi4YWCFnI/v6GuiYJ/vBRuhRDZMhlhR/LRDn2k1eYNPK/Bnc2
-AmrZmQT04l1/2+3yFF1IcrJbNLLf6lar04j2WETPQDP+ybW4w+JzWQ2m5slbkZJC
-wfJYMRLgV1+UfHYt0qznwmKiiOiDz4ie7bpnCWG4H1ql4XTKhxg7XdDvwkX1JiUY
-yprF92GbsPscBAoDWdeHxlFlO250dlDnwlIAWkVZji9pHYOueOUDZhU/e0KT8MUa
-rZbk5wkxDk2XtZ6bY3jTDson0mQnksLeay5c8H942QIDAQABo4GAMH4wDAYDVR0T
-AQH/BAIwADAdBgNVHQ4EFgQUGt46vxcJhwrQEmvJR9Kn6+1bBJkwHwYDVR0jBBgw
-FoAU+ZghSXH6jbkg9/5dTUHoi2zgYsMwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
-AQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQELBQADggEBAIqs3hzS
-yqez+CY0Lqe0734mCFv0eOw3SqgCyDfMRXzjvVzjhyTqTxrd9dej3i94auk6TYc6
-m3xcW1m0L54dbSmfYMDYt4cMS1mssw1cEU8kCU58hHIAjBK3hIqAkZdOIhfgX4P9
-l2xRswPAojz4niShwbcUoGsw6GK4hIdrruDSVvAI9tYOGo1eiwazHhRsG3LpRiXL
-l7fVTnkgNwWkUY7UQD/eb8cyuCguKgjAUU4yG2zJwAOztj79Rh5bt2/vl67fA+lO
-ZDmU+m9lcRHc903tSMQ9elW4xvUEpNgGzcdCSOvQekwh20TnwminRZ9ULBVxtXTG
-vxs863iJbxk6aQI=
+AAOCAQ8AMIIBCgKCAQEAtL/SlzPlE1t3Zb1zGnUom0dZ5rcw6EYzbVhb2h8K/+Tk
+LfId+InoZC72w83Xo47X983n2A4Qw+dW0vzl5tNO4v+CTRhjh7Cj3trvCjd7rLW3
+Q87yBznfFOnDpEE+fmhHNJt7YcQY5hPOs7Sm4LoD7uTr56r0bb6XW6oGl1AB0Hi4
+1pKw5OK5Q4i1rhRkfVJw1AUcCSXV4k/JqILbQTHDvkRvC9T9v8Hu2WK/O4+1AMjR
+311KE61x5Etf0dlyTIPYk0C/bM0vZg4E1rlDKCTJJf1ZcP498qkKTsKbxN6eV15d
+FiXmeLZESSmd9r90+4XWDfFlWPIr1o8QScgALYjiLQIDAQABo4GAMH4wDAYDVR0T
+AQH/BAIwADAdBgNVHQ4EFgQU4NzgLweIdDqf0zCjcYr51qXlplMwHwYDVR0jBBgw
+FoAUF1xF89CsHBBMi0NEIMTdk8XFGTswHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsG
+AQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZIhvcNAQELBQADggEBAEP3Yzij
+MD+r5mxCod3/jfatsuu2nku9kPzY9PBaQvy+W8zHJC+RSKahu6K3GWEhrNOB7m67
+BC0WtX7L5qMXjz5lTR2Nwdo9O62hs+j14xYTFwqjReDPhLI96DhpMUbojBBjD15r
+9BAlI5i4XNkGeIMYcAmm74/p9f+zRIU19mlhCyqN3occ7NxQx2fviCwo3sDbbiEg
+AMVbXe82xgrpBqMlPk0T+vA/vP6caEj/7BvnLDmsiCugiJYRPvAg4in8vdPTyiRj
+WBcVw6wZIcshKfxT5zvPwgpe9M7xnnc41MaQTpT+LpfLGpQqHow72zZlxhm61wsD
+IuWS4vY+35nOa0k=
 -----END CERTIFICATE-----
 Certificate:
     Data:
         Version: 3 (0x2)
         Serial Number: 1 (0x1)
     Signature Algorithm: sha256WithRSAEncryption
-        Issuer: CN=Test Root CA
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
         Validity
-            Not Before: Dec  9 22:40:07 2016 GMT
-            Not After : Dec  7 22:40:07 2026 GMT
+            Not Before: Jun  5 17:10:45 2017 GMT
+            Not After : Jun  3 17:10:45 2027 GMT
         Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Intermediate CA
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:a7:50:4b:cf:f2:ca:69:33:1a:91:ef:71:7d:68:
-                    3a:af:1e:eb:14:ee:64:a8:2b:41:c6:ec:2b:52:e9:
-                    66:ac:5d:4f:fd:2e:b0:31:39:6c:2e:81:1e:83:5d:
-                    59:95:d2:2a:99:fb:f1:38:2e:f9:36:52:53:7c:ea:
-                    ba:df:fb:d6:98:f4:c9:39:d1:34:46:67:83:41:89:
-                    bc:cb:94:f9:26:3d:b0:b6:68:f7:93:6b:d4:40:27:
-                    52:61:0f:20:1e:91:58:3d:60:dd:4a:1c:fe:54:3f:
-                    0c:4a:c4:58:d7:11:ff:a8:3c:f1:cd:39:f6:48:9b:
-                    a5:20:db:cc:90:2b:fb:1f:62:eb:46:4d:d3:ef:03:
-                    f8:f6:e0:82:05:af:2a:4f:00:ed:da:63:04:70:41:
-                    e6:0a:93:e9:4d:85:d4:f7:2b:86:f3:35:e1:69:b5:
-                    81:fc:da:4f:cb:42:94:c9:d7:76:ba:9b:57:9f:fb:
-                    ef:ed:26:ef:2d:53:73:2f:92:31:4b:38:7b:86:66:
-                    eb:0d:2e:f2:93:8f:c5:bb:fe:cc:13:50:e9:18:1d:
-                    18:64:99:91:da:de:96:2b:08:72:21:23:42:67:99:
-                    86:98:fe:6f:f5:8e:0e:61:b1:0a:7e:f5:b8:d5:a7:
-                    06:a0:53:ef:7f:04:db:11:c4:07:0a:47:96:f0:93:
-                    82:d5
+                    00:9d:e9:bd:e4:3d:4a:2f:fb:c2:f9:e6:22:2a:42:
+                    15:46:1c:8c:8f:47:4c:e9:c5:57:95:1f:66:70:93:
+                    22:f0:94:c3:bb:b5:5b:ef:a4:6f:c8:c7:89:95:75:
+                    ba:0c:36:bf:4e:6b:a9:35:47:08:43:9e:29:6a:e2:
+                    c3:fb:03:b7:1f:b6:e1:51:6b:ed:7b:19:c7:f9:ce:
+                    3b:dc:65:e9:66:c7:83:94:c4:d1:4e:ee:ed:64:4b:
+                    81:f1:1a:ea:5a:64:18:1b:6a:4e:93:d0:13:6c:90:
+                    60:ca:d2:4e:b7:24:16:f8:b2:08:58:9d:8d:a7:33:
+                    45:15:34:81:ad:2d:2d:9c:60:ef:f9:2b:98:fe:79:
+                    d3:8d:2c:48:db:12:91:f4:2e:fa:bf:f5:26:c1:82:
+                    05:80:dd:4c:a8:70:bf:a7:bc:10:34:77:39:db:47:
+                    04:0f:ed:44:b2:65:46:22:20:88:59:28:0f:c7:0c:
+                    a2:b4:91:a5:a2:aa:ca:05:9f:8a:9b:6e:a3:cb:d4:
+                    a4:e8:24:75:9d:20:81:22:5b:5f:77:3e:c9:f1:1e:
+                    ae:eb:8a:33:8c:27:5b:1e:be:6d:21:1b:42:72:95:
+                    e3:9e:13:03:75:a7:58:d4:be:68:12:fe:63:8e:4b:
+                    11:7a:34:e7:a3:6b:dd:73:ae:3e:19:9a:ec:91:8b:
+                    73:af
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                F9:98:21:49:71:FA:8D:B9:20:F7:FE:5D:4D:41:E8:8B:6C:E0:62:C3
+                17:5C:45:F3:D0:AC:1C:10:4C:8B:43:44:20:C4:DD:93:C5:C5:19:3B
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         50:c7:37:47:87:1a:8a:b2:cc:37:d0:f6:4a:46:ee:b5:85:90:
-         35:a5:a0:c8:c7:c7:38:7d:5d:bb:e0:fc:0f:15:d3:75:50:e5:
-         06:08:b5:ec:d7:e8:65:63:03:5a:38:3e:2c:5a:eb:28:a0:3c:
-         70:3f:d4:30:25:20:dd:22:63:08:f0:9b:a9:c8:34:8f:f6:7c:
-         5a:ce:10:72:5c:37:a0:01:a6:5e:1b:a4:60:e7:93:f6:42:61:
-         2c:d1:57:67:16:d9:19:21:52:03:8c:9a:aa:75:10:ca:a1:bc:
-         53:07:f1:6f:52:54:88:50:7d:11:ef:96:82:0d:e9:7d:c1:42:
-         42:42:13:1f:48:ef:49:70:df:e1:30:f9:6f:2f:3d:cd:51:1c:
-         14:9c:bd:12:0c:f2:d7:16:32:4a:d5:6b:4b:21:01:6c:4a:b1:
-         ee:7b:8c:d0:99:7e:5e:1e:ef:10:24:6e:e3:6f:e2:e0:4b:0b:
-         42:79:78:ab:2b:af:54:82:c4:b1:57:a3:f0:6f:16:42:ed:61:
-         fc:69:5e:2b:09:14:4a:61:cc:6a:19:52:66:89:06:48:f1:b5:
-         76:39:68:21:dc:68:9d:11:07:37:80:ae:37:77:b4:69:69:29:
-         ff:f6:fc:f1:50:bc:ee:9a:f9:ab:c8:bf:a6:65:51:cc:89:1e:
-         2f:2c:95:e9
+         3e:f5:d7:fd:82:3b:1e:34:8c:66:a2:f3:5e:18:e1:f1:a9:75:
+         9f:b5:93:e7:0a:8e:cf:0a:33:ed:49:cd:ce:ce:ca:5f:a3:1d:
+         64:76:d3:84:16:fe:9d:88:ac:f4:d1:f8:36:2b:20:80:52:0a:
+         ef:e0:0f:64:27:55:35:a3:7b:c6:8a:7c:a5:c4:29:17:b1:fa:
+         d2:89:5d:13:6b:b8:03:cb:d7:12:d6:ce:24:f0:af:48:17:03:
+         54:99:af:e9:cb:fd:44:44:18:23:61:90:f6:bd:55:65:06:c3:
+         36:98:8d:ea:7d:0f:79:ef:b6:bb:22:28:03:a6:ec:d9:d4:1b:
+         47:ac:2c:25:de:ef:1a:02:69:4c:18:bb:29:48:f4:9d:e1:52:
+         42:64:6c:88:46:68:86:83:fd:24:f5:7d:05:d7:1a:7e:22:bc:
+         49:75:9c:8a:4d:e8:f3:a2:eb:9b:83:70:a7:d6:dd:2f:05:2d:
+         aa:be:d7:ee:7b:8e:75:44:3b:da:df:85:61:bf:e9:3b:13:40:
+         4e:8b:52:08:d9:e4:8c:54:da:41:db:7b:2c:05:5e:99:06:0d:
+         02:8c:8e:19:8e:55:b0:3a:33:18:30:03:a7:ed:4a:e4:f8:58:
+         cc:12:b8:af:d6:66:55:29:ec:01:1f:92:ed:3d:4d:c3:71:3b:
+         e0:2f:70:90
 -----BEGIN CERTIFICATE-----
-MIIDPzCCAiegAwIBAgIBATANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDDAxUZXN0
-IFJvb3QgQ0EwHhcNMTYxMjA5MjI0MDA3WhcNMjYxMjA3MjI0MDA3WjBrMQswCQYD
-VQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4g
-VmlldzEQMA4GA1UECgwHVGVzdCBDQTEdMBsGA1UEAwwUVGVzdCBJbnRlcm1lZGlh
-dGUgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCnUEvP8sppMxqR
-73F9aDqvHusU7mSoK0HG7CtS6WasXU/9LrAxOWwugR6DXVmV0iqZ+/E4Lvk2UlN8
-6rrf+9aY9Mk50TRGZ4NBibzLlPkmPbC2aPeTa9RAJ1JhDyAekVg9YN1KHP5UPwxK
-xFjXEf+oPPHNOfZIm6Ug28yQK/sfYutGTdPvA/j24IIFrypPAO3aYwRwQeYKk+lN
-hdT3K4bzNeFptYH82k/LQpTJ13a6m1ef++/tJu8tU3MvkjFLOHuGZusNLvKTj8W7
-/swTUOkYHRhkmZHa3pYrCHIhI0JnmYaY/m/1jg5hsQp+9bjVpwagU+9/BNsRxAcK
-R5bwk4LVAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPmYIUlx
-+o25IPf+XU1B6Its4GLDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOC
-AQEAUMc3R4cairLMN9D2SkbutYWQNaWgyMfHOH1du+D8DxXTdVDlBgi17NfoZWMD
-Wjg+LFrrKKA8cD/UMCUg3SJjCPCbqcg0j/Z8Ws4Qclw3oAGmXhukYOeT9kJhLNFX
-ZxbZGSFSA4yaqnUQyqG8Uwfxb1JUiFB9Ee+Wgg3pfcFCQkITH0jvSXDf4TD5by89
-zVEcFJy9Egzy1xYyStVrSyEBbEqx7nuM0Jl+Xh7vECRu42/i4EsLQnl4qyuvVILE
-sVej8G8WQu1h/GleKwkUSmHMahlSZokGSPG1djloIdxonREHN4CuN3e0aWkp//b8
-8VC87pr5q8i/pmVRzIkeLyyV6Q==
+MIIDizCCAnOgAwIBAgIBATANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzET
+MBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4G
+A1UECgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMB4XDTE3MDYwNTE3
+MTA0NVoXDTI3MDYwMzE3MTA0NVowazELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNh
+bGlmb3JuaWExFjAUBgNVBAcMDU1vdW50YWluIFZpZXcxEDAOBgNVBAoMB1Rlc3Qg
+Q0ExHTAbBgNVBAMMFFRlc3QgSW50ZXJtZWRpYXRlIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAnem95D1KL/vC+eYiKkIVRhyMj0dM6cVXlR9mcJMi
+8JTDu7Vb76RvyMeJlXW6DDa/TmupNUcIQ54pauLD+wO3H7bhUWvtexnH+c473GXp
+ZseDlMTRTu7tZEuB8RrqWmQYG2pOk9ATbJBgytJOtyQW+LIIWJ2NpzNFFTSBrS0t
+nGDv+SuY/nnTjSxI2xKR9C76v/UmwYIFgN1MqHC/p7wQNHc520cED+1EsmVGIiCI
+WSgPxwyitJGloqrKBZ+Km26jy9Sk6CR1nSCBIltfdz7J8R6u64ozjCdbHr5tIRtC
+cpXjnhMDdadY1L5oEv5jjksRejTno2vdc64+GZrskYtzrwIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQXXEXz0KwcEEyLQ0QgxN2TxcUZOzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAD711/2COx40jGai814Y4fGp
+dZ+1k+cKjs8KM+1Jzc7Oyl+jHWR204QW/p2IrPTR+DYrIIBSCu/gD2QnVTWje8aK
+fKXEKRex+tKJXRNruAPL1xLWziTwr0gXA1SZr+nL/UREGCNhkPa9VWUGwzaYjep9
+D3nvtrsiKAOm7NnUG0esLCXe7xoCaUwYuylI9J3hUkJkbIhGaIaD/ST1fQXXGn4i
+vEl1nIpN6POi65uDcKfW3S8FLaq+1+57jnVEO9rfhWG/6TsTQE6LUgjZ5IxU2kHb
+eywFXpkGDQKMjhmOVbA6MxgwA6ftSuT4WMwSuK/WZlUp7AEfku09TcNxO+AvcJA=
 -----END CERTIFICATE-----
+Certificate:
+    Data:
+        Version: 3 (0x2)
+        Serial Number: 10687961985666567129 (0x945344cc7888cbd9)
+    Signature Algorithm: sha256WithRSAEncryption
+        Issuer: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
+        Validity
+            Not Before: Jun  5 17:10:44 2017 GMT
+            Not After : Jun  3 17:10:44 2027 GMT
+        Subject: C=US, ST=California, L=Mountain View, O=Test CA, CN=Test Root CA
+        Subject Public Key Info:
+            Public Key Algorithm: rsaEncryption
+                Public-Key: (2048 bit)
+                Modulus:
+                    00:c6:81:1f:92:73:b6:58:85:d9:8d:ac:b7:20:fd:
+                    c7:bf:40:b2:ea:fa:e5:0b:52:01:8f:9a:c1:eb:7a:
+                    80:c1:f3:89:a4:3e:d5:1b:61:cc:b5:cf:80:b1:1a:
+                    db:bb:25:e0:18:bf:92:69:26:50:cd:e7:3f:ff:0d:
+                    3c:b4:1f:14:12:ab:67:37:de:07:03:6c:12:74:82:
+                    36:ac:c3:d4:d3:64:9f:91:ed:5b:f6:a9:7a:a4:9c:
+                    98:e8:65:6c:94:e1:cb:55:73:ae:f8:1d:50:b0:78:
+                    e5:74:ff:b1:37:2c:cb:19:3d:a4:8c:e7:76:4e:86:
+                    5c:3f:df:b3:ed:45:23:4f:54:9b:33:c6:89:5e:13:
+                    1d:dd:7d:59:a5:07:34:28:86:27:1f:fa:9e:53:4f:
+                    2a:b6:42:ad:37:12:62:f5:72:36:b6:02:12:40:44:
+                    fe:c7:9e:95:89:43:51:5e:b4:6e:c7:67:80:58:43:
+                    be:cc:07:28:bd:59:ff:1c:4c:8d:90:42:f4:cf:fd:
+                    54:00:4f:48:72:2b:e1:67:3c:84:17:68:95:bf:ca:
+                    07:7b:df:86:9d:56:e3:32:e3:70:87:b7:f8:3a:f7:
+                    e3:6e:65:14:7c:bb:76:b7:17:f1:42:8c:6f:2a:34:
+                    64:10:35:14:8c:85:f6:57:bf:f3:5c:55:9d:ad:03:
+                    10:f3
+                Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Basic Constraints: critical
+                CA:TRUE
+            X509v3 Subject Key Identifier: 
+                9B:26:0B:8A:98:A9:BB:1D:B9:1F:1C:E3:1A:40:33:ED:8E:17:88:AB
+            X509v3 Key Usage: critical
+                Certificate Sign, CRL Sign
+    Signature Algorithm: sha256WithRSAEncryption
+         5b:53:ff:6d:d5:0a:43:a5:0f:d4:7d:c6:5d:88:e3:98:9d:67:
+         eb:32:82:b3:0f:f5:c1:78:f8:05:4a:bf:bc:21:05:ee:21:08:
+         2c:b2:15:a1:b8:b2:f6:a3:15:61:e4:c1:ad:84:a4:a7:40:0c:
+         87:09:5f:2b:1b:f9:4d:6c:92:7d:cb:7e:2b:b0:01:0a:ed:40:
+         e5:4e:af:1a:f1:0d:ec:1d:9e:96:c7:d4:61:64:39:23:fa:5f:
+         29:c4:2a:3a:b8:ed:8a:72:50:6a:ac:45:04:76:09:a8:3d:57:
+         d7:f0:4b:ae:46:b4:83:c1:14:50:2a:19:59:53:b2:4d:ae:fc:
+         2f:40:49:c8:ad:4d:9d:c8:22:8d:8c:01:db:31:33:5a:f4:bc:
+         4c:9b:ed:d7:e3:43:d9:e8:1d:53:8b:30:d8:81:9e:72:ab:9e:
+         ce:b8:f5:83:93:f2:72:db:de:cd:b0:52:9a:45:4d:cf:e7:21:
+         d8:ce:16:64:8f:42:af:c1:87:a8:f9:d5:e2:03:dd:ba:6b:1b:
+         7c:7d:a0:38:33:61:39:b4:dd:5c:69:17:79:02:3a:ec:1d:6f:
+         5e:bb:13:fb:a6:82:5d:07:20:fc:86:fe:6e:8b:ac:e1:c2:18:
+         a2:fe:3f:95:66:d3:69:8a:00:06:2c:56:37:34:b9:b6:31:de:
+         0f:f6:44:39
 -----BEGIN CERTIFICATE-----
-MIIC8zCCAdugAwIBAgIJALF9qhLor0+aMA0GCSqGSIb3DQEBBQUAMBcxFTATBgNV
-BAMMDFRlc3QgUm9vdCBDQTAeFw0xNDA4MTQwMzA1MjlaFw0yNDA4MTEwMzA1Mjla
-MBcxFTATBgNVBAMMDFRlc3QgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP
-ADCCAQoCggEBALZJQeNCAVGofzx6cdP7zZE1F4QajvY2x9FwHfqG8267dm/oMi43
-/TiSPWjkin1CMxRGG9wE9pFuVEDECgn97C1i4l7huiycwbFgTNrH+CJcgiBlQh5W
-d3VP65AsSupXDiKNbJWsEerM1+72cA0J3aY1YV3Jdm2w8h6/MIbYd1I2lZcO0UbF
-7YE9G7DyYZU8wUA4719dumGf7yucn4WJdHBj1XboNX7OAeHzERGQHA31/Y3OEGyt
-fFUaIW/XLfR4FeovOL2RnjwdB0b1Q8GCi68SU2UZimlpZgay2gv6KgChKhWESfEB
-v5swBtAVoB+dUZFH4VNf717swmF5whSfxOMCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
-AwEB/zAdBgNVHQ4EFgQUvPcw0TzA8nn675/JbFyT84poq4MwDgYDVR0PAQH/BAQD
-AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBXByn7f+j/sObYWGrDkKE4HLTzaLHs6Ikj
-JNeo8iHDYOSkSVwAv9/HgniAKxj3rd3QYl6nsMzwqrTOcBJZZWd2BQAYmv/EKhfj
-8VXYvlxe68rLU4cQ1QkyNqdeQfRT2n5WYNJ+TpqlCF9ddennMMsi6e8ZSYOlI6H4
-YEzlNtU5eBjxXr/OqgtTgSx4qQpr2xMQIRR/G3A9iRpAigYsXVAZYvnHRYnyPWYF
-PX11W1UegEJyoZp8bQp09u6mIWw6mPt3gl/ya1bm3ZuOUPDGrv3qpgUHqSYGVrOy
-2bI3oCE+eQYfuVG+9LFJTZC1M+UOx15bQMVqBNFDepRqpE9h/ILg
+MIIDizCCAnOgAwIBAgIJAJRTRMx4iMvZMA0GCSqGSIb3DQEBCwUAMGMxCzAJBgNV
+BAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3VudGFpbiBW
+aWV3MRAwDgYDVQQKDAdUZXN0IENBMRUwEwYDVQQDDAxUZXN0IFJvb3QgQ0EwHhcN
+MTcwNjA1MTcxMDQ0WhcNMjcwNjAzMTcxMDQ0WjBjMQswCQYDVQQGEwJVUzETMBEG
+A1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91bnRhaW4gVmlldzEQMA4GA1UE
+CgwHVGVzdCBDQTEVMBMGA1UEAwwMVGVzdCBSb290IENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAxoEfknO2WIXZjay3IP3Hv0Cy6vrlC1IBj5rB63qA
+wfOJpD7VG2HMtc+AsRrbuyXgGL+SaSZQzec//w08tB8UEqtnN94HA2wSdII2rMPU
+02Sfke1b9ql6pJyY6GVslOHLVXOu+B1QsHjldP+xNyzLGT2kjOd2ToZcP9+z7UUj
+T1SbM8aJXhMd3X1ZpQc0KIYnH/qeU08qtkKtNxJi9XI2tgISQET+x56ViUNRXrRu
+x2eAWEO+zAcovVn/HEyNkEL0z/1UAE9IcivhZzyEF2iVv8oHe9+GnVbjMuNwh7f4
+OvfjbmUUfLt2txfxQoxvKjRkEDUUjIX2V7/zXFWdrQMQ8wIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBSbJguKmKm7HbkfHOMaQDPtjheIqzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFtT/23VCkOlD9R9xl2I45id
+Z+sygrMP9cF4+AVKv7whBe4hCCyyFaG4svajFWHkwa2EpKdADIcJXysb+U1skn3L
+fiuwAQrtQOVOrxrxDewdnpbH1GFkOSP6XynEKjq47YpyUGqsRQR2Cag9V9fwS65G
+tIPBFFAqGVlTsk2u/C9AScitTZ3IIo2MAdsxM1r0vEyb7dfjQ9noHVOLMNiBnnKr
+ns649YOT8nLb3s2wUppFTc/nIdjOFmSPQq/Bh6j51eID3bprG3x9oDgzYTm03Vxp
+F3kCOuwdb167E/umgl0HIPyG/m6LrOHCGKL+P5Vm02mKAAYsVjc0ubYx3g/2RDk=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/scripts/generate-test-certs.sh b/net/data/ssl/scripts/generate-test-certs.sh
index abb9bd1..ca8a3ca7 100755
--- a/net/data/ssl/scripts/generate-test-certs.sh
+++ b/net/data/ssl/scripts/generate-test-certs.sh
@@ -6,31 +6,28 @@
 
 # This script generates a set of test (end-entity, intermediate, root)
 # certificates that can be used to test fetching of an intermediate via AIA.
+set -e -x
 
-try() {
-  "$@" || (e=$?; echo "$@" > /dev/stderr; exit $e)
-}
+rm -rf out
+mkdir out
+mkdir out/int
 
-try rm -rf out
-try mkdir out
-try mkdir out/int
-
-try /bin/sh -c "echo 01 > out/2048-sha256-root-serial"
+/bin/sh -c "echo 01 > out/2048-sha256-root-serial"
 touch out/2048-sha256-root-index.txt
 
 # Generate the key
-try openssl genrsa -out out/2048-sha256-root.key 2048
+openssl genrsa -out out/2048-sha256-root.key 2048
 
 # Generate the root certificate
 CA_NAME="req_ca_dn" \
-  try openssl req \
+  openssl req \
     -new \
     -key out/2048-sha256-root.key \
     -out out/2048-sha256-root.req \
     -config ca.cnf
 
 CA_NAME="req_ca_dn" \
-  try openssl x509 \
+  openssl x509 \
     -req -days 3650 \
     -in out/2048-sha256-root.req \
     -signkey out/2048-sha256-root.key \
@@ -39,18 +36,18 @@
     -text > out/2048-sha256-root.pem
 
 # Generate the test intermediate
-try /bin/sh -c "echo 01 > out/int/2048-sha256-int-serial"
+/bin/sh -c "echo 01 > out/int/2048-sha256-int-serial"
 touch out/int/2048-sha256-int-index.txt
 
 CA_NAME="req_intermediate_dn" \
-  try openssl req \
+  openssl req \
     -new \
     -keyout out/int/2048-sha256-int.key \
     -out out/int/2048-sha256-int.req \
     -config ca.cnf
 
 CA_NAME="req_intermediate_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions ca_cert \
     -days 3650 \
@@ -59,27 +56,27 @@
     -config ca.cnf
 
 # Generate the leaf certificate requests
-try openssl req \
+openssl req \
   -new \
   -keyout out/expired_cert.key \
   -out out/expired_cert.req \
   -config ee.cnf
 
-try openssl req \
+openssl req \
   -new \
   -keyout out/ok_cert.key \
   -out out/ok_cert.req \
   -config ee.cnf
 
-try openssl req \
+openssl req \
   -new \
   -keyout out/wildcard.key \
   -out out/wildcard.req \
   -reqexts req_wildcard \
   -config ee.cnf
 
-SUBJECT_NAME=req_localhost_cn \
-try openssl req \
+SUBJECT_NAME="req_localhost_cn" \
+openssl req \
   -new \
   -keyout out/localhost_cert.key \
   -out out/localhost_cert.req \
@@ -88,7 +85,7 @@
 
 # Generate the leaf certificates
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 060101000000Z \
@@ -98,7 +95,7 @@
     -config ca.cnf
 
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -days 3650 \
@@ -109,7 +106,7 @@
 CA_DIR="out/int" \
 CERT_TYPE="int" \
 CA_NAME="req_intermediate_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -days 3650 \
@@ -118,7 +115,7 @@
     -config ca.cnf
 
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -days 3650 \
@@ -127,7 +124,7 @@
     -config ca.cnf
 
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions name_constraint_bad \
     -subj "/CN=Leaf certificate/" \
@@ -137,7 +134,7 @@
     -config ca.cnf
 
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions name_constraint_good \
     -subj "/CN=Leaf Certificate/" \
@@ -147,7 +144,7 @@
     -config ca.cnf
 
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -days 3650 \
@@ -156,7 +153,7 @@
     -config ca.cnf
 
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -subj "/CN=Leaf Certificate/" \
@@ -166,71 +163,71 @@
     -out out/bad_validity.pem \
     -config ca.cnf
 
-try /bin/sh -c "cat out/ok_cert.key out/ok_cert.pem \
+/bin/sh -c "cat out/ok_cert.key out/ok_cert.pem \
     > ../certificates/ok_cert.pem"
-try /bin/sh -c "cat out/wildcard.key out/wildcard.pem \
+/bin/sh -c "cat out/wildcard.key out/wildcard.pem \
     > ../certificates/wildcard.pem"
-try /bin/sh -c "cat out/localhost_cert.key out/localhost_cert.pem \
+/bin/sh -c "cat out/localhost_cert.key out/localhost_cert.pem \
     > ../certificates/localhost_cert.pem"
-try /bin/sh -c "cat out/expired_cert.key out/expired_cert.pem \
+/bin/sh -c "cat out/expired_cert.key out/expired_cert.pem \
     > ../certificates/expired_cert.pem"
-try /bin/sh -c "cat out/2048-sha256-root.key out/2048-sha256-root.pem \
+/bin/sh -c "cat out/2048-sha256-root.key out/2048-sha256-root.pem \
     > ../certificates/root_ca_cert.pem"
-try /bin/sh -c "cat out/ok_cert.key out/name_constraint_bad.pem \
+/bin/sh -c "cat out/ok_cert.key out/name_constraint_bad.pem \
     > ../certificates/name_constraint_bad.pem"
-try /bin/sh -c "cat out/ok_cert.key out/name_constraint_good.pem \
+/bin/sh -c "cat out/ok_cert.key out/name_constraint_good.pem \
     > ../certificates/name_constraint_good.pem"
-try /bin/sh -c "cat out/ok_cert.key out/bad_validity.pem \
+/bin/sh -c "cat out/ok_cert.key out/bad_validity.pem \
     > ../certificates/bad_validity.pem"
-try /bin/sh -c "cat out/ok_cert.key out/int/ok_cert.pem \
+/bin/sh -c "cat out/ok_cert.key out/int/ok_cert.pem \
     > ../certificates/ok_cert_by_intermediate.pem"
-try /bin/sh -c "cat out/int/2048-sha256-int.key out/int/2048-sha256-int.pem \
+/bin/sh -c "cat out/int/2048-sha256-int.key out/int/2048-sha256-int.pem \
     > ../certificates/intermediate_ca_cert.pem"
-try /bin/sh -c "cat out/int/ok_cert.pem out/int/2048-sha256-int.pem \
+/bin/sh -c "cat out/int/ok_cert.pem out/int/2048-sha256-int.pem \
     out/2048-sha256-root.pem \
     > ../certificates/x509_verify_results.chain.pem"
 
 # Now generate the one-off certs
 ## Self-signed cert for SPDY/QUIC/HTTP2 pooling testing
-try openssl req -x509 -days 3650 -extensions req_spdy_pooling \
+openssl req -x509 -days 3650 -extensions req_spdy_pooling \
     -config ../scripts/ee.cnf -newkey rsa:2048 -text \
     -out ../certificates/spdy_pooling.pem
 
 ## SubjectAltName parsing
-try openssl req -x509 -days 3650 -extensions req_san_sanity \
+openssl req -x509 -days 3650 -extensions req_san_sanity \
     -config ../scripts/ee.cnf -newkey rsa:2048 -text \
     -out ../certificates/subjectAltName_sanity_check.pem
 
 ## SubjectAltName containing www.example.com
-try openssl req -x509 -days 3650 -extensions req_san_example \
+openssl req -x509 -days 3650 -extensions req_san_example \
     -config ../scripts/ee.cnf -newkey rsa:2048 -text \
     -out ../certificates/subjectAltName_www_example_com.pem
 
 ## Punycode handling
 SUBJECT_NAME="req_punycode_dn" \
-  try openssl req -x509 -days 3650 -extensions req_punycode \
+  openssl req -x509 -days 3650 -extensions req_punycode \
     -config ../scripts/ee.cnf -newkey rsa:2048 -text \
     -out ../certificates/punycodetest.pem
 
 ## Reject intranet hostnames in "publicly" trusted certs
 # 365 * 3 = 1095
 SUBJECT_NAME="req_intranet_dn" \
-  try openssl req -x509 -days 1095 -extensions req_intranet_san \
+  openssl req -x509 -days 1095 -extensions req_intranet_san \
     -config ../scripts/ee.cnf -newkey rsa:2048 -text \
     -out ../certificates/reject_intranet_hosts.pem
 
 ## Leaf certificate with a large key; Apple's certificate verifier rejects with
 ## a fatal error if the key is bigger than 8192 bits.
-try openssl req -x509 -days 3650 \
+openssl req -x509 -days 3650 \
     -config ../scripts/ee.cnf -newkey rsa:8200 -text \
     -sha256 \
     -out ../certificates/large_key.pem
 
 ## SHA1 certificate expiring in 2016.
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/sha1_2016.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 081030000000Z \
@@ -241,10 +238,10 @@
     -md sha1
 
 ## SHA1 certificate issued the last second before the SHA-1 deprecation date.
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/sha1_dec_2015.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 151231235959Z \
@@ -255,10 +252,10 @@
     -md sha1
 
 ## SHA1 certificate issued on the SHA-1 deprecation date.
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/sha1_jan_2016.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 160101000000Z \
@@ -269,10 +266,10 @@
     -md sha1
 
 ## Validity too long unit test support.
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/10_year_validity.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 081030000000Z \
@@ -281,10 +278,10 @@
     -out ../certificates/10_year_validity.pem \
     -config ca.cnf
 # 365 * 11 = 4015
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/11_year_validity.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 141030000000Z \
@@ -292,10 +289,10 @@
     -in out/11_year_validity.req \
     -out ../certificates/11_year_validity.pem \
     -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/39_months_after_2015_04.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 150402000000Z \
@@ -303,10 +300,10 @@
     -in out/39_months_after_2015_04.req \
     -out ../certificates/39_months_after_2015_04.pem \
     -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/40_months_after_2015_04.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 150402000000Z \
@@ -314,10 +311,10 @@
     -in out/40_months_after_2015_04.req \
     -out ../certificates/40_months_after_2015_04.pem \
     -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/60_months_after_2012_07.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 141030000000Z \
@@ -325,11 +322,11 @@
     -in out/60_months_after_2012_07.req \
     -out ../certificates/60_months_after_2012_07.pem \
     -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/61_months_after_2012_07.req
 # 30 * 61 = 1830
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 141030000000Z \
@@ -338,10 +335,10 @@
     -out ../certificates/61_months_after_2012_07.pem \
     -config ca.cnf
 # start date after expiry date
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/start_after_expiry.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 180901000000Z \
@@ -349,13 +346,13 @@
     -in out/start_after_expiry.req \
     -out ../certificates/start_after_expiry.pem \
     -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/start_after_expiry.req
 # Issued pre-BRs, lifetime < 120 months, expires before 2019-07-01
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/pre_br_validity_ok.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 080101000000Z \
@@ -363,13 +360,13 @@
     -in out/pre_br_validity_ok.req \
     -out ../certificates/pre_br_validity_ok.pem \
     -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/pre_br_validity_ok.req
 # Issued pre-BRs, lifetime > 120 months, expires before 2019-07-01
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/pre_br_validity_bad_121.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 080101000000Z \
@@ -377,13 +374,13 @@
     -in out/pre_br_validity_bad_121.req \
     -out ../certificates/pre_br_validity_bad_121.pem \
     -config ca.cnf
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/pre_br_validity_bad_121.req
 # Issued pre-BRs, lifetime < 120 months, expires after 2019-07-01
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/pre_br_validity_bad_2020.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 120501000000Z \
@@ -393,10 +390,10 @@
     -config ca.cnf
 
 # Issued prior to 1 June 2016 (Symantec CT Enforcement Date)
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/pre_june_2016.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 160501000000Z \
@@ -406,10 +403,10 @@
     -config ca.cnf
 
 # Issued after 1 June 2016 (Symantec CT Enforcement Date)
-try openssl req -config ../scripts/ee.cnf \
+openssl req -config ../scripts/ee.cnf \
   -newkey rsa:2048 -text -out out/post_june_2016.req
 CA_NAME="req_ca_dn" \
-  try openssl ca \
+  openssl ca \
     -batch \
     -extensions user_cert \
     -startdate 160601000000Z \
@@ -419,7 +416,7 @@
     -config ca.cnf
 
 # Includes the TLS feature extension
-try openssl req -x509 -newkey rsa:2048 \
+openssl req -x509 -newkey rsa:2048 \
   -keyout out/tls_feature_extension.key \
   -out ../certificates/tls_feature_extension.pem \
   -days 365 \
@@ -429,7 +426,7 @@
 
 # Regenerate CRLSets
 ## Block a leaf cert directly by SPKI
-try python crlsetutil.py -o ../certificates/crlset_by_leaf_spki.raw \
+python crlsetutil.py -o ../certificates/crlset_by_leaf_spki.raw \
 <<CRLBYLEAFSPKI
 {
   "BlockedBySPKI": ["../certificates/ok_cert.pem"]
@@ -438,7 +435,7 @@
 
 ## Block a leaf cert by issuer-hash-and-serial (ok_cert.pem == serial 3, by
 ## virtue of the serial file and ordering above.
-try python crlsetutil.py -o ../certificates/crlset_by_root_serial.raw \
+python crlsetutil.py -o ../certificates/crlset_by_root_serial.raw \
 <<CRLBYROOTSERIAL
 {
   "BlockedByHash": {
@@ -449,7 +446,7 @@
 
 ## Block a leaf cert by issuer-hash-and-serial. However, this will be issued
 ## from an intermediate CA issued underneath a root.
-try python crlsetutil.py -o ../certificates/crlset_by_intermediate_serial.raw \
+python crlsetutil.py -o ../certificates/crlset_by_intermediate_serial.raw \
 <<CRLSETBYINTERMEDIATESERIAL
 {
   "BlockedByHash": {
diff --git a/net/data/url_request_unittest/hpkp-headers-report-only.html.mock-http-headers b/net/data/url_request_unittest/hpkp-headers-report-only.html.mock-http-headers
index 09ec14aa..0fbf7b4 100644
--- a/net/data/url_request_unittest/hpkp-headers-report-only.html.mock-http-headers
+++ b/net/data/url_request_unittest/hpkp-headers-report-only.html.mock-http-headers
@@ -3,4 +3,4 @@
 Content-Type: text/html; charset=ISO-8859-1
 X-Multiple-Entries: a
 X-Multiple-Entries: b
-Public-Key-Pins-Report-Only: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="+TTrWvvJdM9gwuHiLTApo/2DBT2xb4hBPRJDI9pebXY="; report-uri="https://hpkp-report.test"
+Public-Key-Pins-Report-Only: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="jGdOd9afPNVKLxBnAaqWFl5tM1Dbu/54g4ZDgQcJ4BM="; report-uri="https://hpkp-report.test"
diff --git a/net/data/url_request_unittest/hpkp-headers.html.mock-http-headers b/net/data/url_request_unittest/hpkp-headers.html.mock-http-headers
index 2730136..890cbc1 100644
--- a/net/data/url_request_unittest/hpkp-headers.html.mock-http-headers
+++ b/net/data/url_request_unittest/hpkp-headers.html.mock-http-headers
@@ -3,4 +3,4 @@
 Content-Type: text/html; charset=ISO-8859-1
 X-Multiple-Entries: a
 X-Multiple-Entries: b
-Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="+TTrWvvJdM9gwuHiLTApo/2DBT2xb4hBPRJDI9pebXY="; report-uri="https://hpkp-report.test"
+Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="jGdOd9afPNVKLxBnAaqWFl5tM1Dbu/54g4ZDgQcJ4BM="; report-uri="https://hpkp-report.test"
diff --git a/net/data/url_request_unittest/hsts-and-hpkp-headers.html.mock-http-headers b/net/data/url_request_unittest/hsts-and-hpkp-headers.html.mock-http-headers
index 21d54aa..63751213 100644
--- a/net/data/url_request_unittest/hsts-and-hpkp-headers.html.mock-http-headers
+++ b/net/data/url_request_unittest/hsts-and-hpkp-headers.html.mock-http-headers
@@ -5,4 +5,4 @@
 X-Multiple-Entries: b
 Strict-Transport-Security: max-age=12300
 Strict-Transport-Security: max-age=12300; includeSubdomains
-Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="+TTrWvvJdM9gwuHiLTApo/2DBT2xb4hBPRJDI9pebXY="
+Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="jGdOd9afPNVKLxBnAaqWFl5tM1Dbu/54g4ZDgQcJ4BM="
diff --git a/net/data/url_request_unittest/hsts-and-hpkp-headers2.html.mock-http-headers b/net/data/url_request_unittest/hsts-and-hpkp-headers2.html.mock-http-headers
index 45b26508..719d4b2 100644
--- a/net/data/url_request_unittest/hsts-and-hpkp-headers2.html.mock-http-headers
+++ b/net/data/url_request_unittest/hsts-and-hpkp-headers2.html.mock-http-headers
@@ -4,5 +4,5 @@
 X-Multiple-Entries: a
 X-Multiple-Entries: b
 Strict-Transport-Security: max-age=12300; includeSubdomains
-Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="+TTrWvvJdM9gwuHiLTApo/2DBT2xb4hBPRJDI9pebXY="
-Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="+TTrWvvJdM9gwuHiLTApo/2DBT2xb4hBPRJDI9pebXY="
+Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="jGdOd9afPNVKLxBnAaqWFl5tM1Dbu/54g4ZDgQcJ4BM="
+Public-Key-Pins: max-age=50000; pin-sha256="9999999999999999999999999999999999999999999="; pin-sha256="jGdOd9afPNVKLxBnAaqWFl5tM1Dbu/54g4ZDgQcJ4BM="
diff --git a/net/http/http_stream_factory_impl_job.cc b/net/http/http_stream_factory_impl_job.cc
index d464295..a5be56b 100644
--- a/net/http/http_stream_factory_impl_job.cc
+++ b/net/http/http_stream_factory_impl_job.cc
@@ -220,7 +220,9 @@
       was_alpn_negotiated_(false),
       negotiated_protocol_(kProtoUnknown),
       num_streams_(0),
-      spdy_session_direct_(false),
+      spdy_session_direct_(
+          !(proxy_info.is_https() && origin_url_.SchemeIs(url::kHttpScheme))),
+      spdy_session_key_(GetSpdySessionKey()),
       stream_type_(HttpStreamRequest::BIDIRECTIONAL_STREAM),
       ptr_factory_(this) {
   DCHECK(session);
@@ -398,7 +400,7 @@
   // In the case that we're using an HTTPS proxy for an HTTP url,
   // we look for a SPDY session *to* the proxy, instead of to the
   // origin server.
-  if (IsHttpsProxyAndHttpUrl()) {
+  if (!spdy_session_direct_) {
     return SpdySessionKey(proxy_info_.proxy_server().host_port_pair(),
                           ProxyServer::Direct(), PRIVACY_MODE_DISABLED);
   }
@@ -875,14 +877,12 @@
     return rv;
   }
 
-  SpdySessionKey spdy_session_key = GetSpdySessionKey();
-
   // Check first if we have a spdy session for this group.  If so, then go
   // straight to using that.
   if (CanUseExistingSpdySession()) {
     base::WeakPtr<SpdySession> spdy_session =
         session_->spdy_session_pool()->FindAvailableSession(
-            spdy_session_key, origin_url_, enable_ip_based_pooling_, net_log_);
+            spdy_session_key_, origin_url_, enable_ip_based_pooling_, net_log_);
     if (spdy_session) {
       // If we're preconnecting, but we already have a SpdySession, we don't
       // actually need to preconnect any sockets, so we're done.
@@ -897,7 +897,7 @@
   if (using_ssl_) {
     // Ask |delegate_delegate_| to update the spdy session key for the request
     // that launched this job.
-    delegate_->SetSpdySessionKey(this, spdy_session_key);
+    delegate_->SetSpdySessionKey(this, spdy_session_key_);
   }
 
   if (proxy_info_.is_http() || proxy_info_.is_https())
@@ -929,7 +929,7 @@
   OnHostResolutionCallback resolution_callback =
       CanUseExistingSpdySession()
           ? base::Bind(&Job::OnHostResolution, session_->spdy_session_pool(),
-                       spdy_session_key, origin_url_, enable_ip_based_pooling_)
+                       spdy_session_key_, origin_url_, enable_ip_based_pooling_)
           : OnHostResolutionCallback();
   if (delegate_->for_websockets()) {
     SSLConfig websocket_server_ssl_config = server_ssl_config_;
@@ -961,10 +961,9 @@
   if (result == ERR_SPDY_SESSION_ALREADY_EXISTS) {
     // We found a SPDY connection after resolving the host. This is
     // probably an IP pooled connection.
-    SpdySessionKey spdy_session_key = GetSpdySessionKey();
     existing_spdy_session_ =
         session_->spdy_session_pool()->FindAvailableSession(
-            spdy_session_key, origin_url_, enable_ip_based_pooling_, net_log_);
+            spdy_session_key_, origin_url_, enable_ip_based_pooling_, net_log_);
     if (existing_spdy_session_) {
       using_spdy_ = true;
       next_state_ = STATE_CREATE_STREAM;
@@ -1165,13 +1164,11 @@
 
   CHECK(!stream_.get());
 
-  SpdySessionKey spdy_session_key = GetSpdySessionKey();
   if (!existing_spdy_session_) {
     existing_spdy_session_ =
         session_->spdy_session_pool()->FindAvailableSession(
-            spdy_session_key, origin_url_, enable_ip_based_pooling_, net_log_);
+            spdy_session_key_, origin_url_, enable_ip_based_pooling_, net_log_);
   }
-  bool direct = !IsHttpsProxyAndHttpUrl();
   if (existing_spdy_session_.get()) {
     // We picked up an existing session, so we don't need our socket.
     if (connection_->socket())
@@ -1179,7 +1176,7 @@
     connection_->Reset();
 
     int set_result = SetSpdyHttpStreamOrBidirectionalStreamImpl(
-        existing_spdy_session_, direct);
+        existing_spdy_session_, spdy_session_direct_);
     existing_spdy_session_.reset();
     return set_result;
   }
@@ -1191,7 +1188,7 @@
 
   base::WeakPtr<SpdySession> spdy_session =
       session_->spdy_session_pool()->CreateAvailableSessionFromSocket(
-          spdy_session_key, std::move(connection_), net_log_, using_ssl_);
+          spdy_session_key_, std::move(connection_), net_log_, using_ssl_);
 
   if (!spdy_session->HasAcceptableTransportSecurity()) {
     spdy_session->CloseSessionOnError(
@@ -1200,11 +1197,10 @@
   }
 
   new_spdy_session_ = spdy_session;
-  spdy_session_direct_ = direct;
-  const HostPortPair host_port_pair = spdy_session_key.host_port_pair();
   url::SchemeHostPort scheme_host_port(
-      using_ssl_ ? url::kHttpsScheme : url::kHttpScheme, host_port_pair.host(),
-      host_port_pair.port());
+      using_ssl_ ? url::kHttpsScheme : url::kHttpScheme,
+      spdy_session_key_.host_port_pair().host(),
+      spdy_session_key_.host_port_pair().port());
 
   HttpServerProperties* http_server_properties =
       session_->http_server_properties();
@@ -1275,20 +1271,6 @@
   // TODO(mbelshe): Add other motivations (like EARLY_LOAD_MOTIVATED).
 }
 
-bool HttpStreamFactoryImpl::Job::IsHttpsProxyAndHttpUrl() const {
-  if (!proxy_info_.is_https())
-    return false;
-  DCHECK(!IsSpdyAlternative());
-  if (IsQuicAlternative()) {
-    // We currently only support Alternate-Protocol where the original scheme
-    // is http.
-    // TODO(bnc): This comment is probably incorrect.
-    DCHECK(origin_url_.SchemeIs(url::kHttpScheme));
-    return origin_url_.SchemeIs(url::kHttpScheme);
-  }
-  return request_info_.url.SchemeIs(url::kHttpScheme);
-}
-
 bool HttpStreamFactoryImpl::Job::IsSpdyAlternative() const {
   return alternative_service_.protocol == kProtoHTTP2;
 }
diff --git a/net/http/http_stream_factory_impl_job.h b/net/http/http_stream_factory_impl_job.h
index 1136153..6173224 100644
--- a/net/http/http_stream_factory_impl_job.h
+++ b/net/http/http_stream_factory_impl_job.h
@@ -334,8 +334,6 @@
   // Set the motivation for this request onto the underlying socket.
   void SetSocketMotivation();
 
-  bool IsHttpsProxyAndHttpUrl() const;
-
   // Is this a SPDY or QUIC alternative Job?
   bool IsSpdyAlternative() const;
   bool IsQuicAlternative() const;
@@ -349,6 +347,7 @@
   // After calling, the caller can use ssl_info_.
   void GetSSLInfo();
 
+  // Called in Job constructor. Use |spdy_session_key_| after construction.
   SpdySessionKey GetSpdySessionKey() const;
 
   // Returns true if the current request can use an existing spdy session.
@@ -473,8 +472,10 @@
   // Initialized when we have an existing SpdySession.
   base::WeakPtr<SpdySession> existing_spdy_session_;
 
-  // Only used if |new_spdy_session_| is non-NULL.
-  bool spdy_session_direct_;
+  // True if not connecting to an Https proxy for an Http url.
+  const bool spdy_session_direct_;
+
+  const SpdySessionKey spdy_session_key_;
 
   base::TimeTicks job_stream_ready_start_time_;
 
diff --git a/net/http/http_stream_factory_impl_job_controller_unittest.cc b/net/http/http_stream_factory_impl_job_controller_unittest.cc
index ffc80c4..1f7f730 100644
--- a/net/http/http_stream_factory_impl_job_controller_unittest.cc
+++ b/net/http/http_stream_factory_impl_job_controller_unittest.cc
@@ -148,7 +148,7 @@
   // Return SpdySessionKey of |job|.
   static const SpdySessionKey GetSpdySessionKey(
       const HttpStreamFactoryImpl::Job* job) {
-    return job->GetSpdySessionKey();
+    return job->spdy_session_key_;
   }
 };
 
diff --git a/net/http/transport_security_state_unittest.cc b/net/http/transport_security_state_unittest.cc
index 2b16f21..f7a79c7 100644
--- a/net/http/transport_security_state_unittest.cc
+++ b/net/http/transport_security_state_unittest.cc
@@ -1432,10 +1432,10 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   HashValueVector good_hashes, bad_hashes;
@@ -1540,10 +1540,10 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   HashValueVector good_hashes, bad_hashes;
@@ -1583,10 +1583,10 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   TransportSecurityState state;
@@ -1650,10 +1650,10 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   std::string header =
@@ -1687,10 +1687,10 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   std::string header = "pin-sha256=\"" + std::string(kGoodPin1) +
@@ -1742,10 +1742,10 @@
   // contents don't matter, as long as they are not the real google.com
   // certs in the pins.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   HashValueVector bad_hashes;
@@ -1790,10 +1790,10 @@
   // contents don't matter, as long as they are not the real google.com
   // certs in the pins.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   HashValueVector bad_hashes;
@@ -1830,10 +1830,10 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
 
   HashValueVector good_hashes, bad_hashes;
@@ -1951,6 +1951,14 @@
   ssl_info.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS;
   ssl_info.is_issued_by_known_root = true;
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
+  ssl_info.unverified_cert = cert1;
+  ssl_info.cert = cert2;
 
   TransportSecurityState state;
   TransportSecurityStateTest::EnableStaticExpectCT(&state);
@@ -1975,6 +1983,14 @@
   ssl_info.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS;
   ssl_info.is_issued_by_known_root = false;
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
+  ssl_info.unverified_cert = cert1;
+  ssl_info.cert = cert2;
 
   TransportSecurityState state;
   TransportSecurityStateTest::EnableStaticExpectCT(&state);
@@ -1997,6 +2013,14 @@
   ssl_info.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS;
   ssl_info.is_issued_by_known_root = true;
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
+  ssl_info.unverified_cert = cert1;
+  ssl_info.cert = cert2;
 
   TransportSecurityState state;
   TransportSecurityStateTest::EnableStaticExpectCT(&state);
@@ -2019,6 +2043,14 @@
   ssl_info.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS;
   ssl_info.is_issued_by_known_root = true;
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
+  ssl_info.unverified_cert = cert1;
+  ssl_info.cert = cert2;
 
   TransportSecurityState state;
   TransportSecurityStateTest::EnableStaticExpectCT(&state);
@@ -2042,6 +2074,14 @@
   ssl_info.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_NOT_DIVERSE_SCTS;
   ssl_info.is_issued_by_known_root = true;
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
+  ssl_info.unverified_cert = cert1;
+  ssl_info.cert = cert2;
 
   TransportSecurityState state;
   TransportSecurityStateTest::EnableStaticExpectCT(&state);
@@ -2065,7 +2105,7 @@
       ct::CertPolicyCompliance::CERT_POLICY_NOT_DIVERSE_SCTS;
   ssl_info.is_issued_by_known_root = true;
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
   ASSERT_TRUE(cert1);
@@ -2106,10 +2146,10 @@
       ct::CertPolicyCompliance::CERT_POLICY_NOT_DIVERSE_SCTS;
   ssl_info.is_issued_by_known_root = true;
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
   ssl_info.unverified_cert = cert1;
   ssl_info.cert = cert2;
@@ -2428,9 +2468,11 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
 
   SSLInfo ssl_info;
   ssl_info.cert = cert1;
@@ -2480,9 +2522,11 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
 
   SSLInfo ssl_info;
   ssl_info.cert = cert1;
@@ -2521,9 +2565,11 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
 
   SSLInfo ssl_info;
   ssl_info.cert = cert1;
@@ -2555,9 +2601,11 @@
   // Two dummy certs to use as the server-sent and validated chains. The
   // contents don't matter.
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
 
   SSLInfo ssl_info;
   ssl_info.cert = cert1;
@@ -2908,12 +2956,14 @@
   ssl.ct_compliance_details_available = true;
   ssl.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS;
+
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
+
   SignedCertificateTimestampAndStatusList sct_list;
 
   base::test::ScopedFeatureList feature_list;
@@ -3075,6 +3125,15 @@
   ssl.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS;
 
+  scoped_refptr<X509Certificate> cert1 =
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
+  scoped_refptr<X509Certificate> cert2 =
+      ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
+  ASSERT_TRUE(cert2);
+  ssl.unverified_cert = cert1;
+  ssl.cert = cert2;
+
   base::test::ScopedFeatureList feature_list;
   feature_list.InitAndEnableFeature(
       TransportSecurityState::kDynamicExpectCTFeature);
@@ -3097,14 +3156,16 @@
   ssl.ct_compliance_details_available = true;
   ssl.ct_cert_policy_compliance =
       ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS;
+
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
   ssl.unverified_cert = cert1;
   ssl.cert = cert2;
+
   MakeTestSCTAndStatus(ct::SignedCertificateTimestamp::SCT_EMBEDDED, "test_log",
                        std::string(), std::string(), base::Time::Now(),
                        ct::SCT_STATUS_INVALID_SIGNATURE,
@@ -3137,10 +3198,10 @@
   const base::Time current_time(base::Time::Now());
   const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
   SignedCertificateTimestampAndStatusList sct_list;
   MakeTestSCTAndStatus(ct::SignedCertificateTimestamp::SCT_EMBEDDED, "test_log",
@@ -3266,10 +3327,10 @@
   const base::Time current_time(base::Time::Now());
   const base::Time expiry = current_time + base::TimeDelta::FromSeconds(1000);
   scoped_refptr<X509Certificate> cert1 =
-      ImportCertFromFile(GetTestCertsDirectory(), "test_mail_google_com.pem");
+      ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
+  ASSERT_TRUE(cert1);
   scoped_refptr<X509Certificate> cert2 =
       ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem");
-  ASSERT_TRUE(cert1);
   ASSERT_TRUE(cert2);
   SignedCertificateTimestampAndStatusList sct_list;
   MakeTestSCTAndStatus(ct::SignedCertificateTimestamp::SCT_EMBEDDED, "test_log",
diff --git a/services/ui/public/cpp/bitmap/child_shared_bitmap_manager.cc b/services/ui/public/cpp/bitmap/child_shared_bitmap_manager.cc
index bb4ad834..13eb4fc 100644
--- a/services/ui/public/cpp/bitmap/child_shared_bitmap_manager.cc
+++ b/services/ui/public/cpp/bitmap/child_shared_bitmap_manager.cc
@@ -46,6 +46,13 @@
     (*shared_bitmap_manager_ptr_)->DidDeleteSharedBitmap(id());
   }
 
+  // cc::SharedBitmap:
+  base::SharedMemoryHandle GetSharedMemoryHandle() const override {
+    if (!shared_memory_holder_)
+      return base::SharedMemoryHandle();
+    return shared_memory_holder_->handle();
+  }
+
  private:
   scoped_refptr<cc::mojom::ThreadSafeSharedBitmapManagerAssociatedPtr>
       shared_bitmap_manager_ptr_;
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json
index 5e961605..af0ecbc 100644
--- a/testing/buildbot/chromium.perf.fyi.json
+++ b/testing/buildbot/chromium.perf.fyi.json
@@ -3367,65 +3367,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build248-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -4695,65 +4636,6 @@
       },
       {
         "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device7",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -4813,65 +4695,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build249-m4--device5",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.mobile_infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -4990,65 +4813,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build245-m4--device3",
-              "os": "Android",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -8810,65 +8574,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build145-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build145-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -9922,65 +9627,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build47-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build47-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -10040,65 +9686,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build47-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build47-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -10276,65 +9863,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build145-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:22b1",
-              "id": "build145-b1",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -13996,65 +13524,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build209-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build209-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -15088,65 +14557,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build220-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build220-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -15206,65 +14616,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build220-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build220-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -15442,65 +14793,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build209-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:9874",
-              "id": "build209-b4",
-              "os": "Windows-10-10586",
-              "pool": "Chrome-perf-fyi"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json
index 5347294..001cba0 100644
--- a/testing/buildbot/chromium.perf.json
+++ b/testing/buildbot/chromium.perf.json
@@ -3412,65 +3412,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build14-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build14-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -4760,65 +4701,6 @@
       },
       {
         "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build13-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build13-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -4878,65 +4760,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build48-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build48-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.mobile_infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -5055,65 +4878,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build13-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build13-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -8559,65 +8323,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build74-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build74-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -9907,65 +9612,6 @@
       },
       {
         "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build73-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build73-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -10025,65 +9671,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build75-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build75-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.mobile_infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -10202,65 +9789,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build73-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build73-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -13726,65 +13254,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build16-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build16-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -15074,65 +14543,6 @@
       },
       {
         "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build15-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build15-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -15192,65 +14602,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build45-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build45-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.mobile_infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -15369,65 +14720,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build15-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build15-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -18893,65 +18185,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build10-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build10-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -20241,65 +19474,6 @@
       },
       {
         "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build9-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build9-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -20359,65 +19533,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build49-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build49-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.mobile_infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -20536,65 +19651,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build9-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build9-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -24060,65 +23116,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build18-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build18-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -25408,65 +24405,6 @@
       },
       {
         "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build17-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build17-b1--device7",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -25526,65 +24464,6 @@
       },
       {
         "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build47-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.mobile_infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.mobile_infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build47-b1--device5",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.mobile_infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -25703,65 +24582,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=android-chromium"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build17-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_mobile_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_mobile_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "android_devices": "1",
-              "id": "build17-b1--device3",
-              "os": "Android",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -29448,65 +28268,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build151-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build151-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -30560,65 +29321,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build150-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build150-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -30678,65 +29380,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build152-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build152-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -30914,65 +29557,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build150-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build150-m1",
-              "os": "Ubuntu-14.04",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -34654,65 +33238,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build105-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build105-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -35746,65 +34271,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build104-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build104-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -35864,65 +34330,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build106-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build106-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -36100,65 +34507,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build104-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0166",
-              "id": "build104-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -39820,65 +38168,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build161-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build161-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -40912,65 +39201,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build160-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build160-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -41030,65 +39260,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build162-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build162-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -41266,65 +39437,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build160-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a2e",
-              "id": "build160-m1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -45006,65 +43118,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build126-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build126-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -46098,65 +44151,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build125-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build125-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -46216,65 +44210,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build127-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build127-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -46452,65 +44387,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build125-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1626",
-              "id": "build125-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -50172,65 +48048,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build27-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build27-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -51264,65 +49081,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build26-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build26-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -51382,65 +49140,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build28-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build28-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -51618,65 +49317,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build26-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0a26",
-              "id": "build26-b1",
-              "os": "Mac-10.12",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -55358,65 +52998,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build131-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build131-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -56450,65 +54031,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build130-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build130-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -56568,65 +54090,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build132-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build132-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -56804,65 +54267,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build130-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6821",
-              "id": "build130-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -60544,65 +57948,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build7-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build7-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -61636,65 +58981,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build6-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build6-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -61754,65 +59040,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build30-b4",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build30-b4",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -61990,65 +59217,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build6-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:0d26",
-              "id": "build6-b1",
-              "os": "Mac-10.11",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -65710,65 +62878,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build120-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build120-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -66802,65 +63911,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build119-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build119-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -66920,65 +63970,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build180-b4",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build180-b4",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -67156,65 +64147,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build119-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:1616",
-              "id": "build119-b1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -70896,65 +67828,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build135-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build135-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -71988,65 +68861,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build134-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build134-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -72106,65 +68920,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build136-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build136-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -72342,65 +69097,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build134-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0534",
-              "id": "build134-m1",
-              "os": "Windows-10-10240",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -76142,65 +72838,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build104-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build104-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -77234,65 +73871,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build103-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build103-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -77352,65 +73930,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build105-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build105-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -77588,65 +74107,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build103-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "1002:6613",
-              "id": "build103-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -81368,65 +77828,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build167-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build167-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -82460,65 +78861,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build166-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build166-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -82578,65 +78920,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build168-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build168-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -82814,65 +79097,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build166-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "8086:041a",
-              "id": "build166-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -86614,65 +82838,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build95-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build95-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -87706,65 +83871,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build94-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build94-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -87824,65 +83930,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build96-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build96-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -88060,65 +84107,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build94-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "10de:104a",
-              "id": "build94-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -91840,65 +87828,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build188-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build188-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -92932,65 +88861,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build187-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build187-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -93050,65 +88920,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build189-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build189-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -93286,65 +89097,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build187-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build187-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -97046,65 +92798,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build141-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build141-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -98138,65 +93831,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build140-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build140-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -98256,65 +93890,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build142-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build142-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -98492,65 +94067,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build140-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build140-m1",
-              "os": "Windows-2008ServerR2-SP1",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
@@ -102272,65 +97788,6 @@
       },
       {
         "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build146-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "speedometer-classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "speedometer-classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build146-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "speedometer",
           "-v",
           "--upload-results",
@@ -103364,65 +98821,6 @@
       },
       {
         "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build145-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build145-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.detached_context_age_in_gc",
           "-v",
           "--upload-results",
@@ -103482,65 +98880,6 @@
       },
       {
         "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build147-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.infinite_scroll-classic_tbmv2",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.infinite_scroll-classic_tbmv2.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build147-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "v8.infinite_scroll_tbmv2",
           "-v",
           "--upload-results",
@@ -103718,65 +99057,6 @@
       },
       {
         "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=release_x64"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build145-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": false,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
-          "v8.runtimestats.browsing_desktop_classic",
-          "-v",
-          "--upload-results",
-          "--output-format=chartjson",
-          "--browser=reference",
-          "--output-trace-tag=_ref"
-        ],
-        "isolate_name": "telemetry_perf_tests",
-        "name": "v8.runtimestats.browsing_desktop_classic.reference",
-        "override_compile_targets": [
-          "telemetry_perf_tests"
-        ],
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "gpu": "102b:0532",
-              "id": "build145-m1",
-              "os": "Windows-2012ServerR2-SP0",
-              "pool": "Chrome-perf"
-            }
-          ],
-          "expiration": 36000,
-          "hard_timeout": 10800,
-          "ignore_task_failure": true,
-          "io_timeout": 3600
-        }
-      },
-      {
-        "args": [
           "webrtc",
           "-v",
           "--upload-results",
diff --git a/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service b/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service
index 5be456d..1ac711e 100644
--- a/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service
+++ b/third_party/WebKit/LayoutTests/FlagExpectations/enable-network-service
@@ -15,25 +15,7 @@
 Bug(none) bluetooth/characteristic/notifications/gc-with-pending-start.html [ Timeout ]
 Bug(none) bluetooth/characteristic/readValue/gen-gatt-op-garbage-collection-ran-during-error.html [ Timeout ]
 Bug(none) bluetooth/idl/idl-BluetoothDevice.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/acceptAllDevices/device-with-empty-name.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/acceptAllDevices/device-with-name.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/blocklisted-service-in-filter.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/canonicalizeFilter/device-name-longer-than-29-bytes.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/canonicalizeFilter/max-length-name-unicode.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/canonicalizeFilter/max-length-name.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix-unicode.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/canonicalizeFilter/max-length-namePrefix.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-name.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/canonicalizeFilter/unicode-valid-length-name-namePrefix.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/consumes-user-gesture.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/le-not-supported.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/name-empty-device-from-name-empty-filter.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/not-processing-user-gesture.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/radio-not-present.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/radio-off.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/request-from-iframe.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/same-device.html [ Timeout ]
-Bug(none) bluetooth/requestDevice/single-filter-single-service.html [ Timeout ]
+Bug(none) bluetooth/requestDevice [ Timeout ]
 Bug(none) bluetooth/server/connect/connection-succeeds.html [ Timeout ]
 Bug(none) bluetooth/server/connect/garbage-collection-ran-during-success.html [ Timeout ]
 Bug(none) bluetooth/server/connect/get-same-gatt-server.html [ Timeout ]
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations
index b51725fe..e7dc195 100644
--- a/third_party/WebKit/LayoutTests/TestExpectations
+++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2855,4 +2855,4 @@
 
 crbug.com/729836 [ Win ] fast/workers/worker-document-leak.html [ Pass Failure ]
 
-crbug.com/733071 [ Mac ] css3/blending/svg-blend-multiply-alpha.html [ Failure ]
+crbug.com/733071 css3/blending/svg-blend-multiply-alpha.html [ NeedsRebaseline ]
diff --git a/third_party/WebKit/LayoutTests/css3/blending/svg-blend-multiply-alpha-expected.html b/third_party/WebKit/LayoutTests/css3/blending/svg-blend-multiply-alpha-expected.html
deleted file mode 100644
index e298840..0000000
--- a/third_party/WebKit/LayoutTests/css3/blending/svg-blend-multiply-alpha-expected.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<body>
-<svg xmlns="http://www.w3.org/2000/svg" version="1.1" width="400px" height="400px">
-<g transform="scale(4 4)">
-  <g>
-    <rect x="0" y="0" width="10" height="10" fill="rgba(255,0,0,1)"></rect>
-    <rect x="10" y="0" width="10" height="10" fill="rgba(0,128,0,1)"></rect>
-    <rect x="20" y="0" width="10" height="10" fill="rgba(0,0,128,1)"></rect>
-    <rect x="30" y="0" width="10" height="10" fill="rgba(127,64,0,1)"></rect>
-    <rect x="0" y="10" width="10" height="10" fill="rgba(128,0,0,1)"></rect>
-    <rect x="10" y="10" width="10" height="10" fill="rgba(0,255,0,1)"></rect>
-    <rect x="20" y="10" width="10" height="10" fill="rgba(0,0,128,1)"></rect>
-    <rect x="30" y="10" width="10" height="10" fill="rgba(64,127,0,1)"></rect>
-    <rect x="0" y="20" width="10" height="10" fill="rgba(128,0,0,1)"></rect>
-    <rect x="10" y="20" width="10" height="10" fill="rgba(0,128,0,1)"></rect>
-    <rect x="20" y="20" width="10" height="10" fill="rgba(0,0,255,1)"></rect>
-    <rect x="30" y="20" width="10" height="10" fill="rgba(64,64,0,1)"></rect>
-    <rect x="0" y="30" width="10" height="10" fill="rgba(191,0,0,1)"></rect>
-    <rect x="10" y="30" width="10" height="10" fill="rgba(0,191,0,1)"></rect>
-    <rect x="20" y="30" width="10" height="10" fill="rgba(0,0,128,1)"></rect>
-    <rect x="30" y="30" width="10" height="10" fill="rgba(95,95,0,1)"></rect>
-  </g>
-</g>
-</svg>
-</body>
-</html>
\ No newline at end of file
diff --git a/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-animate-expected.txt b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-animate-expected.txt
new file mode 100644
index 0000000..71b7bdc
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-animate-expected.txt
@@ -0,0 +1,3 @@
+CONSOLE MESSAGE: line 4: test animator constructor called.
+CONSOLE MESSAGE: line 8: test animator animate called.
+
diff --git a/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-animate.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-animate.html
new file mode 100644
index 0000000..99c1b934
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-animate.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+
+<script id="simple_animate" type="text/worklet">
+registerAnimator("test", class {
+  constructor() {
+    console.log("test animator constructor called.");
+  }
+  animate() {
+    if (!this.animated)
+        console.log("test animator animate called.");
+    this.animated = true;
+  }
+});
+</script>
+
+<script src="resources/animation-worklet-tests.js"></script>
diff --git a/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-registration.html b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-registration.html
index 3747631..2e17f95 100644
--- a/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-registration.html
+++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/animation-worklet-animator-registration.html
@@ -1,5 +1,10 @@
 <!DOCTYPE html>
 
+<!--
+TODO(majidvp): The try/catch in above test cases should not be needed but at the moment
+threaded worklet does not correctly pass error to its parent context. It crashes in
+https://codesearch.chromium.org/chromium/src/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp?sq=package:chromium&dr&l=320
+-->
 <script id="duplicate" type="text/worklet">
 try {
   registerAnimator("duplicate", class { animate() {} });
@@ -24,49 +29,8 @@
   constructor() {
     console.log("test animator constructor called.");
   }
-  animate() {
-    console.log("test animator animate called.");
-  }
+  animate() {}
 });
 </script>
 
-<script>
-// TODO(majidvp): The try/catch in above test cases should not be needed but at the moment
-// threaded worklet does not correctly pass error to its parent context. It crashes in
-// https://codesearch.chromium.org/chromium/src/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp?sq=package:chromium&dr&l=320
-
-function runInAnimationWorklet(code) {
-  return window.animationWorklet.addModule(
-    URL.createObjectURL(new Blob([code], {type: 'text/javascript'}))
-  );
-}
-
-// Load test cases in worklet context in sequence and wait until they are resolved.
-function runTests(testcases) {
-  if (window.testRunner) {
-    testRunner.waitUntilDone();
-    testRunner.dumpAsText();
-  }
-
-  const runInSequence = testcases.reduce((chain, testcase) => {
-    return chain.then( _ => {
-        return runInAnimationWorklet(testcase);
-    });
-  }, Promise.resolve());
-
-  // TODO(majidvp): Figure out how to wait on AnimationWorklet, which runs on a separate thread,
-  // to complete its tasks instead of a timeout.
-  runInSequence.then(_ => {
-     setTimeout(_ => {
-      if (window.testRunner)
-        testRunner.notifyDone();
-     }, 100);
-  });
-}
-
-const testcases = Array.prototype.map.call(document.querySelectorAll('script[type$=worklet]'), ($el) => {
-  return $el.textContent;
-});
-
-runTests(testcases);
-</script>
+<script src="resources/animation-worklet-tests.js"></script>
diff --git a/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/resources/animation-worklet-tests.js b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/resources/animation-worklet-tests.js
new file mode 100644
index 0000000..bfb1589
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/virtual/threaded/fast/compositorworker/resources/animation-worklet-tests.js
@@ -0,0 +1,44 @@
+function runInAnimationWorklet(code) {
+  return window.animationWorklet.addModule(
+    URL.createObjectURL(new Blob([code], {type: 'text/javascript'}))
+  );
+}
+
+// Wait for two main thread frames to guarantee that compositor has produced
+// at least one frame.
+function waitTwoAnimationFrames(callback){
+  window.requestAnimationFrame( _=> {
+    window.requestAnimationFrame( _ => {
+      callback();
+    })
+  });
+};
+
+// Load test cases in worklet context in sequence and wait until they are resolved.
+function runTests(testcases) {
+  if (window.testRunner) {
+    testRunner.waitUntilDone();
+    testRunner.dumpAsText();
+  }
+
+  const runInSequence = testcases.reduce((chain, testcase) => {
+    return chain.then( _ => {
+        return runInAnimationWorklet(testcase);
+    });
+  }, Promise.resolve());
+
+  runInSequence.then(_ => {
+    // Wait to guarantee that compositor frame is produced before finishing.
+    // This ensure we see at least one |animate| call in the animation worklet.
+    waitTwoAnimationFrames(_ => {
+      if (window.testRunner)
+        testRunner.notifyDone();
+     });
+  });
+}
+
+const testcases = Array.prototype.map.call(document.querySelectorAll('script[type$=worklet]'), ($el) => {
+  return $el.textContent;
+});
+
+runTests(testcases);
diff --git a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp
index 61332ded..d259515 100644
--- a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.cpp
@@ -338,6 +338,13 @@
   return true;
 }
 
+ScriptValue WorkerOrWorkletScriptController::EvaluateAndReturnValueForTest(
+    const ScriptSourceCode& source_code) {
+  ExecutionState state(this);
+  return Evaluate(source_code.Source(), source_code.Url().GetString(),
+                  source_code.StartPosition(), nullptr, kV8CacheOptionsDefault);
+}
+
 void WorkerOrWorkletScriptController::ForbidExecution() {
   DCHECK(global_scope_->IsContextThread());
   execution_forbidden_ = true;
diff --git a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h
index 38b5133..94d4adf 100644
--- a/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h
+++ b/third_party/WebKit/Source/bindings/core/v8/WorkerOrWorkletScriptController.h
@@ -96,6 +96,8 @@
     return script_state_ && !!script_state_->PerContextData();
   }
 
+  ScriptValue EvaluateAndReturnValueForTest(const ScriptSourceCode&);
+
  private:
   WorkerOrWorkletScriptController(WorkerOrWorkletGlobalScope*, v8::Isolate*);
   class ExecutionState;
diff --git a/third_party/WebKit/Source/build/scripts/templates/CSSPropertyMetadata.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/CSSPropertyMetadata.cpp.tmpl
index de8e258d..ad04ff91 100644
--- a/third_party/WebKit/Source/build/scripts/templates/CSSPropertyMetadata.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/CSSPropertyMetadata.cpp.tmpl
@@ -47,18 +47,18 @@
 
 bool CSSPropertyMetadata::IsEnabledProperty(CSSPropertyID unresolvedProperty) {
   CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
-  static std::bitset<numCSSProperties>* enabledProperties = nullptr;
-  if (!enabledProperties) {
-    enabledProperties = new std::bitset<numCSSProperties>();
-    enabledProperties->set(); // All bits sets to 1.
+  static std::bitset<numCSSProperties>* enabledProperties = []() {
+    std::bitset<numCSSProperties>* props = new std::bitset<numCSSProperties>();
+    props->set(); // All bits sets to 1.
     {% for property in properties_including_aliases if property.runtime_flag %}
     if (!RuntimeEnabledFeatures::{{property.runtime_flag}}Enabled())
-      enabledProperties->reset({{property.property_id}} - {{first_enum_value}});
+      props->reset({{property.property_id}} - {{first_enum_value}});
     {% endfor %}
     {% for property in properties_including_aliases if property.is_internal %}
-    enabledProperties->reset({{property.property_id}} - {{first_enum_value}});
+    props->reset({{property.property_id}} - {{first_enum_value}});
     {% endfor %}
-  }
+    return props;
+  }();
 
   if (unresolvedProperty >= {{first_enum_value}})
     return enabledProperties->test(property - {{first_enum_value}});
diff --git a/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.cpp.tmpl b/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.cpp.tmpl
index 875b9c0..6bec053 100644
--- a/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.cpp.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.cpp.tmpl
@@ -29,20 +29,22 @@
 {% for property_id, property in properties.items() %}
 
 const StylePropertyShorthand& {{property.lower_camel_name}}Shorthand() {
-  static const CSSPropertyID {{property.lower_camel_name}}Properties[] = {
+  static constexpr CSSPropertyID {{property.lower_camel_name}}Properties[] = {
     {% for longhand_id in property.longhand_property_ids %}
     {{longhand_id}},
     {% endfor %}
   };
-  DEFINE_STATIC_LOCAL(StylePropertyShorthand, {{property.lower_camel_name}}Longhands, ({{property_id}}, {{property.lower_camel_name}}Properties, WTF_ARRAY_LENGTH({{property.lower_camel_name}}Properties)));
+
+  static constexpr StylePropertyShorthand {{property.lower_camel_name}}Longhands ({{property_id}}, {{property.lower_camel_name}}Properties, WTF_ARRAY_LENGTH({{property.lower_camel_name}}Properties));
   return {{property.lower_camel_name}}Longhands;
 }
 {% endfor %}
 
 // Returns an empty list if the property is not a shorthand
 const StylePropertyShorthand& shorthandForProperty(CSSPropertyID propertyID) {
-  DEFINE_STATIC_LOCAL(StylePropertyShorthand, emptyShorthand, ());
   // FIXME: We shouldn't switch between shorthand/not shorthand based on a runtime flag
+  static constexpr StylePropertyShorthand emptyShorthand;
+
   if (propertyID == CSSPropertyTextDecoration &&
       !RuntimeEnabledFeatures::CSS3TextDecorationsEnabled())
     return emptyShorthand;
diff --git a/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.h.tmpl b/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.h.tmpl
index 27b81c6a..bcdbbc9 100644
--- a/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.h.tmpl
+++ b/third_party/WebKit/Source/build/scripts/templates/StylePropertyShorthand.h.tmpl
@@ -30,14 +30,14 @@
 class StylePropertyShorthand {
     USING_FAST_MALLOC(StylePropertyShorthand);
  public:
-  StylePropertyShorthand()
+  constexpr StylePropertyShorthand()
       : m_properties(0),
         m_length(0),
         m_shorthandID(CSSPropertyInvalid) {}
 
-  StylePropertyShorthand(CSSPropertyID id,
-                         const CSSPropertyID* properties,
-                         unsigned numProperties)
+  constexpr StylePropertyShorthand(CSSPropertyID id,
+                                   const CSSPropertyID* properties,
+                                   unsigned numProperties)
       : m_properties(properties),
         m_length(numProperties),
         m_shorthandID(id) {}
diff --git a/third_party/WebKit/Source/core/BUILD.gn b/third_party/WebKit/Source/core/BUILD.gn
index 8dc263c..9324450 100644
--- a/third_party/WebKit/Source/core/BUILD.gn
+++ b/third_party/WebKit/Source/core/BUILD.gn
@@ -1186,6 +1186,7 @@
     "css/resolver/MatchResultTest.cpp",
     "css/resolver/ScopedStyleResolverTest.cpp",
     "css/resolver/SharedStyleFinderTest.cpp",
+    "css/threaded/CSSParserThreadedTest.cpp",
     "css/threaded/CSSToLengthConversionDataThreadedTest.cpp",
     "css/threaded/FilterOperationResolverThreadedTest.cpp",
     "dom/AttrTest.cpp",
diff --git a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
index 6159cb5..05800646 100644
--- a/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
+++ b/third_party/WebKit/Source/core/animation/css/CSSAnimations.cpp
@@ -182,9 +182,10 @@
 
   StringKeyframeEffectModel* model =
       StringKeyframeEffectModel::Create(keyframes, &keyframes[0]->Easing());
-  if (animation_index > 0 && model->HasSyntheticKeyframes())
+  if (animation_index > 0 && model->HasSyntheticKeyframes()) {
     UseCounter::Count(element_for_scoping->GetDocument(),
                       UseCounter::kCSSAnimationsStackedNeutralKeyframe);
+  }
   return model;
 }
 
diff --git a/third_party/WebKit/Source/core/css/SelectorChecker.cpp b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
index 2a71d4c..f533d5e 100644
--- a/third_party/WebKit/Source/core/css/SelectorChecker.cpp
+++ b/third_party/WebKit/Source/core/css/SelectorChecker.cpp
@@ -417,9 +417,10 @@
 
     case CSSSelector::kShadowPseudo: {
       if (!is_ua_rule_ && mode_ != kQueryingRules &&
-          context.selector->GetPseudoType() == CSSSelector::kPseudoShadow)
+          context.selector->GetPseudoType() == CSSSelector::kPseudoShadow) {
         Deprecation::CountDeprecation(context.element->GetDocument(),
                                       UseCounter::kCSSSelectorPseudoShadow);
+      }
       // If we're in the same tree-scope as the scoping element, then following
       // a shadow descendant combinator would escape that and thus the scope.
       if (context.scope && context.scope->OwnerShadowHost() &&
@@ -435,9 +436,10 @@
     }
 
     case CSSSelector::kShadowDeep: {
-      if (!is_ua_rule_ && mode_ != kQueryingRules)
+      if (!is_ua_rule_ && mode_ != kQueryingRules) {
         Deprecation::CountDeprecation(context.element->GetDocument(),
                                       UseCounter::kCSSDeepCombinator);
+      }
       if (ShadowRoot* root = context.element->ContainingShadowRoot()) {
         if (root->GetType() == ShadowRootType::kUserAgent)
           return kSelectorFailsCompletely;
@@ -450,9 +452,10 @@
              element = element->ParentOrShadowHostElement()) {
           if (MatchForPseudoContent(next_context, *element, result) ==
               kSelectorMatches) {
-            if (context.element->IsInShadowTree())
+            if (context.element->IsInShadowTree()) {
               UseCounter::Count(context.element->GetDocument(),
                                 UseCounter::kCSSDeepCombinatorAndShadow);
+            }
             return kSelectorMatches;
           }
         }
@@ -464,9 +467,10 @@
            next_context.element =
                ParentOrV0ShadowHostElement(*next_context.element)) {
         MatchStatus match = MatchSelector(next_context, result);
-        if (match == kSelectorMatches && context.element->IsInShadowTree())
+        if (match == kSelectorMatches && context.element->IsInShadowTree()) {
           UseCounter::Count(context.element->GetDocument(),
                             UseCounter::kCSSDeepCombinatorAndShadow);
+        }
         if (match == kSelectorMatches || match == kSelectorFailsCompletely)
           return match;
         if (NextSelectorExceedsScope(next_context))
diff --git a/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp b/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp
index dea64cf..0eb69f6f 100644
--- a/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp
+++ b/third_party/WebKit/Source/core/css/StylePropertyShorthandCustom.cpp
@@ -33,27 +33,27 @@
   // bug: https://www.w3.org/Bugs/Public/show_bug.cgi?id=14790
   // And in the spec (editor's draft) at:
   // http://dev.w3.org/csswg/css3-animations/#animation-shorthand-property
-  static const CSSPropertyID kAnimationPropertiesForParsing[] = {
+  static constexpr CSSPropertyID kAnimationPropertiesForParsing[] = {
       CSSPropertyAnimationDuration,  CSSPropertyAnimationTimingFunction,
       CSSPropertyAnimationDelay,     CSSPropertyAnimationIterationCount,
       CSSPropertyAnimationDirection, CSSPropertyAnimationFillMode,
       CSSPropertyAnimationPlayState, CSSPropertyAnimationName};
-  DEFINE_STATIC_LOCAL(StylePropertyShorthand,
-                      webkit_animation_longhands_for_parsing,
-                      (CSSPropertyAnimation, kAnimationPropertiesForParsing,
-                       WTF_ARRAY_LENGTH(kAnimationPropertiesForParsing)));
+  static constexpr StylePropertyShorthand
+      webkit_animation_longhands_for_parsing(
+          CSSPropertyAnimation, kAnimationPropertiesForParsing,
+          WTF_ARRAY_LENGTH(kAnimationPropertiesForParsing));
   return webkit_animation_longhands_for_parsing;
 }
 
 // Similar to animations, we have property after timing-function and delay after
 // duration
 const StylePropertyShorthand& transitionShorthandForParsing() {
-  static const CSSPropertyID kTransitionProperties[] = {
+  static constexpr CSSPropertyID kTransitionProperties[] = {
       CSSPropertyTransitionDuration, CSSPropertyTransitionTimingFunction,
       CSSPropertyTransitionDelay, CSSPropertyTransitionProperty};
-  DEFINE_STATIC_LOCAL(StylePropertyShorthand, transition_longhands,
-                      (CSSPropertyTransition, kTransitionProperties,
-                       WTF_ARRAY_LENGTH(kTransitionProperties)));
+  static constexpr StylePropertyShorthand transition_longhands(
+      CSSPropertyTransition, kTransitionProperties,
+      WTF_ARRAY_LENGTH(kTransitionProperties));
   return transition_longhands;
 }
 
diff --git a/third_party/WebKit/Source/core/css/StyleSheetList.cpp b/third_party/WebKit/Source/core/css/StyleSheetList.cpp
index f6234b5c..a204fdeb 100644
--- a/third_party/WebKit/Source/core/css/StyleSheetList.cpp
+++ b/third_party/WebKit/Source/core/css/StyleSheetList.cpp
@@ -61,9 +61,10 @@
 }
 
 CSSStyleSheet* StyleSheetList::AnonymousNamedGetter(const AtomicString& name) {
-  if (GetDocument())
+  if (GetDocument()) {
     UseCounter::Count(*GetDocument(),
                       UseCounter::kStyleSheetListAnonymousNamedGetter);
+  }
   HTMLStyleElement* item = GetNamedItem(name);
   if (!item)
     return nullptr;
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
index 051088e..3468e468 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleAdjuster.cpp
@@ -357,12 +357,14 @@
     // because our current behavior is different from the spec and we want to
     // gather compatibility data.
     if (style.PaddingBefore().IsPercentOrCalc() ||
-        style.PaddingAfter().IsPercentOrCalc())
+        style.PaddingAfter().IsPercentOrCalc()) {
       UseCounter::Count(document,
                         UseCounter::kFlexboxPercentagePaddingVertical);
+    }
     if (style.MarginBefore().IsPercentOrCalc() ||
-        style.MarginAfter().IsPercentOrCalc())
+        style.MarginAfter().IsPercentOrCalc()) {
       UseCounter::Count(document, UseCounter::kFlexboxPercentageMarginVertical);
+    }
   }
 }
 
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
index 4db1167..6bdbd0c 100644
--- a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
@@ -745,10 +745,11 @@
         const CSSValue* value =
             it->properties->GetPropertyCSSValue(CSSPropertyDisplay);
         if (value && value->IsIdentifierValue() &&
-            ToCSSIdentifierValue(*value).GetValueID() == CSSValueBlock)
+            ToCSSIdentifierValue(*value).GetValueID() == CSSValueBlock) {
           UseCounter::Count(
               element->GetDocument(),
               UseCounter::kSummaryElementWithDisplayBlockAuthorRule);
+        }
       }
     }
 
diff --git a/third_party/WebKit/Source/core/css/threaded/CSSParserThreadedTest.cpp b/third_party/WebKit/Source/core/css/threaded/CSSParserThreadedTest.cpp
new file mode 100644
index 0000000..3fa53cd
--- /dev/null
+++ b/third_party/WebKit/Source/core/css/threaded/CSSParserThreadedTest.cpp
@@ -0,0 +1,62 @@
+// 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/parser/CSSParser.h"
+#include "core/css/parser/CSSParserContext.h"
+
+#include "core/css/StylePropertySet.h"
+#include "core/css/threaded/MultiThreadedTestUtil.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace blink {
+
+class CSSParserThreadedTest : public MultiThreadedTest {
+ public:
+  static void TestSingle(CSSPropertyID prop, const String& text) {
+    const CSSValue* value = CSSParser::ParseSingleValue(prop, text);
+    ASSERT_TRUE(value);
+    EXPECT_EQ(text, value->CssText());
+  }
+
+  static MutableStylePropertySet* TestValue(CSSPropertyID prop,
+                                            const String& text) {
+    MutableStylePropertySet* style =
+        MutableStylePropertySet::Create(kHTMLStandardMode);
+    CSSParser::ParseValue(style, prop, text, true);
+    return style;
+  }
+};
+
+TSAN_TEST_F(CSSParserThreadedTest, SinglePropertyFilter) {
+  RunOnThreads([]() {
+    TestSingle(CSSPropertyFilter, "sepia(50%)");
+    TestSingle(CSSPropertyFilter, "blur(10px)");
+    TestSingle(CSSPropertyFilter, "brightness(50%) invert(100%)");
+  });
+}
+
+TSAN_TEST_F(CSSParserThreadedTest, SinglePropertyFont) {
+  RunOnThreads([]() {
+    TestSingle(CSSPropertyFontFamily, "serif");
+    TestSingle(CSSPropertyFontFamily, "monospace");
+    TestSingle(CSSPropertyFontFamily, "times");
+    TestSingle(CSSPropertyFontFamily, "arial");
+
+    TestSingle(CSSPropertyFontWeight, "normal");
+    TestSingle(CSSPropertyFontWeight, "bold");
+
+    TestSingle(CSSPropertyFontSize, "10px");
+    TestSingle(CSSPropertyFontSize, "20em");
+  });
+}
+
+TSAN_TEST_F(CSSParserThreadedTest, ValuePropertyFont) {
+  RunOnThreads([]() {
+    MutableStylePropertySet* v = TestValue(CSSPropertyFont, "15px arial");
+    EXPECT_EQ(v->GetPropertyValue(CSSPropertyFontFamily), "arial");
+    EXPECT_EQ(v->GetPropertyValue(CSSPropertyFontSize), "15px");
+  });
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/css/threaded/FilterOperationResolverThreadedTest.cpp b/third_party/WebKit/Source/core/css/threaded/FilterOperationResolverThreadedTest.cpp
index 78b489b..7b506bf 100644
--- a/third_party/WebKit/Source/core/css/threaded/FilterOperationResolverThreadedTest.cpp
+++ b/third_party/WebKit/Source/core/css/threaded/FilterOperationResolverThreadedTest.cpp
@@ -8,8 +8,6 @@
 #include "core/css/parser/CSSParserContext.h"
 #include "core/css/threaded/MultiThreadedTestUtil.h"
 #include "core/style/FilterOperation.h"
-#include "platform/fonts/Font.h"
-#include "platform/fonts/FontDescription.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace blink {
diff --git a/third_party/WebKit/Source/core/dom/AnimationWorkletProxyClient.cpp b/third_party/WebKit/Source/core/dom/AnimationWorkletProxyClient.cpp
new file mode 100644
index 0000000..e5a2980
--- /dev/null
+++ b/third_party/WebKit/Source/core/dom/AnimationWorkletProxyClient.cpp
@@ -0,0 +1,25 @@
+// Copyright 2016 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/dom/AnimationWorkletProxyClient.h"
+
+namespace blink {
+
+AnimationWorkletProxyClient* AnimationWorkletProxyClient::From(
+    WorkerClients* clients) {
+  return static_cast<AnimationWorkletProxyClient*>(
+      Supplement<WorkerClients>::From(clients, SupplementName()));
+}
+
+const char* AnimationWorkletProxyClient::SupplementName() {
+  return "AnimationWorkletProxyClient";
+}
+
+void ProvideAnimationWorkletProxyClientTo(WorkerClients* clients,
+                                          AnimationWorkletProxyClient* client) {
+  clients->ProvideSupplement(AnimationWorkletProxyClient::SupplementName(),
+                             client);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/AnimationWorkletProxyClient.h b/third_party/WebKit/Source/core/dom/AnimationWorkletProxyClient.h
index 64fc6af8..ca3a01ac 100644
--- a/third_party/WebKit/Source/core/dom/AnimationWorkletProxyClient.h
+++ b/third_party/WebKit/Source/core/dom/AnimationWorkletProxyClient.h
@@ -1,4 +1,4 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
+// 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.
 
@@ -7,19 +7,33 @@
 
 #include "core/CoreExport.h"
 #include "core/dom/CompositorProxyClient.h"
+#include "core/workers/WorkerClients.h"
 #include "platform/wtf/Noncopyable.h"
 
 namespace blink {
 
-class CORE_EXPORT AnimationWorkletProxyClient : public GarbageCollectedMixin {
+class WorkletGlobalScope;
+
+class CORE_EXPORT AnimationWorkletProxyClient
+    : public Supplement<WorkerClients> {
   WTF_MAKE_NONCOPYABLE(AnimationWorkletProxyClient);
 
  public:
   AnimationWorkletProxyClient() {}
-  virtual ~AnimationWorkletProxyClient() {}
-  DEFINE_INLINE_VIRTUAL_TRACE() {}
+
+  static AnimationWorkletProxyClient* From(WorkerClients*);
+  static const char* SupplementName();
+
+  virtual void SetGlobalScope(WorkletGlobalScope*) = 0;
+  virtual void Dispose() = 0;
+
+  virtual CompositorProxyClient* GetCompositorProxyClient() = 0;
 };
 
+CORE_EXPORT void ProvideAnimationWorkletProxyClientTo(
+    WorkerClients*,
+    AnimationWorkletProxyClient*);
+
 }  // namespace blink
 
 #endif  // AnimationWorkletProxyClient_h
diff --git a/third_party/WebKit/Source/core/dom/BUILD.gn b/third_party/WebKit/Source/core/dom/BUILD.gn
index 318118e4..be70c986 100644
--- a/third_party/WebKit/Source/core/dom/BUILD.gn
+++ b/third_party/WebKit/Source/core/dom/BUILD.gn
@@ -17,6 +17,7 @@
     "AccessibleNode.cpp",
     "AccessibleNode.h",
     "AncestorList.h",
+    "AnimationWorkletProxyClient.cpp",
     "AnimationWorkletProxyClient.h",
     "Attr.cpp",
     "Attr.h",
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp
index 598cad0..71537b4 100644
--- a/third_party/WebKit/Source/core/dom/Document.cpp
+++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -6300,9 +6300,10 @@
   if (!std::isfinite(force))
     force = 0;
 
-  if (radius_x || radius_y || rotation_angle || force)
+  if (radius_x || radius_y || rotation_angle || force) {
     UseCounter::Count(*this,
                       UseCounter::kDocumentCreateTouchMoreThanSevenArguments);
+  }
 
   // FIXME: It's not clear from the documentation at
   // http://developer.apple.com/library/safari/#documentation/UserExperience/Reference/DocumentAdditionsReference/DocumentAdditions/DocumentAdditions.html
diff --git a/third_party/WebKit/Source/core/dom/ElementFullscreen.cpp b/third_party/WebKit/Source/core/dom/ElementFullscreen.cpp
index 04e7155..34842ff 100644
--- a/third_party/WebKit/Source/core/dom/ElementFullscreen.cpp
+++ b/third_party/WebKit/Source/core/dom/ElementFullscreen.cpp
@@ -14,9 +14,10 @@
 }
 
 void ElementFullscreen::webkitRequestFullscreen(Element& element) {
-  if (element.IsInShadowTree())
+  if (element.IsInShadowTree()) {
     UseCounter::Count(element.GetDocument(),
                       UseCounter::kPrefixedElementRequestFullscreenInShadow);
+  }
   Fullscreen::RequestFullscreen(element, Fullscreen::RequestType::kPrefixed);
 }
 
diff --git a/third_party/WebKit/Source/core/dom/PseudoElement.cpp b/third_party/WebKit/Source/core/dom/PseudoElement.cpp
index a3261b389..913858b 100644
--- a/third_party/WebKit/Source/core/dom/PseudoElement.cpp
+++ b/third_party/WebKit/Source/core/dom/PseudoElement.cpp
@@ -92,9 +92,10 @@
   SetParentOrShadowHostNode(parent);
   SetHasCustomStyleCallbacks();
   if ((pseudo_id == kPseudoIdBefore || pseudo_id == kPseudoIdAfter) &&
-      parent->HasTagName(HTMLNames::inputTag))
+      parent->HasTagName(HTMLNames::inputTag)) {
     UseCounter::Count(parent->GetDocument(),
                       UseCounter::kPseudoBeforeAfterForInputElement);
+  }
 }
 
 PassRefPtr<ComputedStyle> PseudoElement::CustomStyleForLayoutObject() {
diff --git a/third_party/WebKit/Source/core/dom/StyleEngineContext.cpp b/third_party/WebKit/Source/core/dom/StyleEngineContext.cpp
index 4d951ae..e1fa377 100644
--- a/third_party/WebKit/Source/core/dom/StyleEngineContext.cpp
+++ b/third_party/WebKit/Source/core/dom/StyleEngineContext.cpp
@@ -37,9 +37,10 @@
   // treated as before-body.
   if (!added_pending_sheet_before_body_) {
     added_pending_sheet_before_body_ = !document.body();
-    if (!added_pending_sheet_before_body_)
+    if (!added_pending_sheet_before_body_) {
       UseCounter::Count(document,
                         UseCounter::kPendingStylesheetAddedAfterBodyStarted);
+    }
   }
 }
 
diff --git a/third_party/WebKit/Source/core/events/EventTarget.cpp b/third_party/WebKit/Source/core/events/EventTarget.cpp
index 0c48212..f6f2cdee 100644
--- a/third_party/WebKit/Source/core/events/EventTarget.cpp
+++ b/third_party/WebKit/Source/core/events/EventTarget.cpp
@@ -652,9 +652,10 @@
   if (CheckTypeThenUseCount(event, EventTypeNames::beforeunload,
                             UseCounter::kDocumentBeforeUnloadFired)) {
     if (LocalDOMWindow* executing_window = this->ExecutingWindow()) {
-      if (executing_window != executing_window->top())
+      if (executing_window != executing_window->top()) {
         UseCounter::Count(executing_window->document(),
                           UseCounter::kSubFrameBeforeUnloadFired);
+      }
     }
   } else if (CheckTypeThenUseCount(event, EventTypeNames::unload,
                                    UseCounter::kDocumentUnloadFired)) {
@@ -676,9 +677,10 @@
                                    UseCounter::kPointerDownFired)) {
     if (LocalDOMWindow* executing_window = this->ExecutingWindow()) {
       if (event->IsPointerEvent() &&
-          static_cast<PointerEvent*>(event)->pointerType() == "touch")
+          static_cast<PointerEvent*>(event)->pointerType() == "touch") {
         UseCounter::Count(executing_window->document(),
                           UseCounter::kPointerDownFiredForTouch);
+      }
     }
   } else if (CheckTypeThenUseCount(event, EventTypeNames::pointerenter,
                                    UseCounter::kPointerEnterLeaveFired)) {
diff --git a/third_party/WebKit/Source/core/exported/BUILD.gn b/third_party/WebKit/Source/core/exported/BUILD.gn
index 11f0cdb..02badcd 100644
--- a/third_party/WebKit/Source/core/exported/BUILD.gn
+++ b/third_party/WebKit/Source/core/exported/BUILD.gn
@@ -47,6 +47,8 @@
     "WebPerformance.cpp",
     "WebPluginContainerBase.cpp",
     "WebPluginContainerBase.h",
+    "WebPluginContainerImpl.cpp",
+    "WebPluginContainerImpl.h",
     "WebPluginScriptForbiddenScope.cpp",
     "WebRange.cpp",
     "WebRenderTheme.cpp",
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp b/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.cpp
similarity index 98%
rename from third_party/WebKit/Source/web/WebPluginContainerImpl.cpp
rename to third_party/WebKit/Source/core/exported/WebPluginContainerImpl.cpp
index 8ec08159..5582006 100644
--- a/third_party/WebKit/Source/web/WebPluginContainerImpl.cpp
+++ b/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.cpp
@@ -29,7 +29,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-#include "web/WebPluginContainerImpl.h"
+#include "core/exported/WebPluginContainerImpl.h"
 
 #include "bindings/core/v8/ScriptController.h"
 #include "bindings/core/v8/ScriptSourceCode.h"
@@ -563,13 +563,14 @@
   if (Page* page = element_->GetDocument().GetPage()) {
     EventHandlerRegistry& registry = page->GetEventHandlerRegistry();
     if (request_type != kTouchEventRequestTypeNone &&
-        touch_event_request_type_ == kTouchEventRequestTypeNone)
+        touch_event_request_type_ == kTouchEventRequestTypeNone) {
       registry.DidAddEventHandler(
           *element_, EventHandlerRegistry::kTouchStartOrMoveEventBlocking);
-    else if (request_type == kTouchEventRequestTypeNone &&
-             touch_event_request_type_ != kTouchEventRequestTypeNone)
+    } else if (request_type == kTouchEventRequestTypeNone &&
+               touch_event_request_type_ != kTouchEventRequestTypeNone) {
       registry.DidRemoveEventHandler(
           *element_, EventHandlerRegistry::kTouchStartOrMoveEventBlocking);
+    }
   }
   touch_event_request_type_ = request_type;
 }
@@ -579,12 +580,13 @@
     return;
   if (Page* page = element_->GetDocument().GetPage()) {
     EventHandlerRegistry& registry = page->GetEventHandlerRegistry();
-    if (wants_wheel_events)
+    if (wants_wheel_events) {
       registry.DidAddEventHandler(*element_,
                                   EventHandlerRegistry::kWheelEventBlocking);
-    else
+    } else {
       registry.DidRemoveEventHandler(*element_,
                                      EventHandlerRegistry::kWheelEventBlocking);
+    }
   }
 
   wants_wheel_events_ = wants_wheel_events;
@@ -1023,13 +1025,14 @@
           .EnclosingBoundingBox();
   // As a performance optimization, map the clipped rect separately if is
   // different than the unclipped rect.
-  if (layout_clipped_local_rect != unclipped_layout_local_rect)
+  if (layout_clipped_local_rect != unclipped_layout_local_rect) {
     clipped_local_rect =
         box->AbsoluteToLocalQuad(FloatRect(layout_clipped_local_rect),
                                  kTraverseDocumentBoundaries | kUseTransforms)
             .EnclosingBoundingBox();
-  else
+  } else {
     clipped_local_rect = unclipped_int_local_rect;
+  }
 }
 
 void WebPluginContainerImpl::CalculateGeometry(IntRect& window_rect,
diff --git a/third_party/WebKit/Source/web/WebPluginContainerImpl.h b/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.h
similarity index 98%
rename from third_party/WebKit/Source/web/WebPluginContainerImpl.h
rename to third_party/WebKit/Source/core/exported/WebPluginContainerImpl.h
index 1eb34b7..a8096fe9 100644
--- a/third_party/WebKit/Source/web/WebPluginContainerImpl.h
+++ b/third_party/WebKit/Source/core/exported/WebPluginContainerImpl.h
@@ -32,6 +32,7 @@
 #ifndef WebPluginContainerImpl_h
 #define WebPluginContainerImpl_h
 
+#include "core/CoreExport.h"
 #include "core/dom/ContextLifecycleObserver.h"
 #include "core/exported/WebPluginContainerBase.h"
 #include "platform/heap/Handle.h"
@@ -42,7 +43,6 @@
 #include "public/platform/WebCoalescedInputEvent.h"
 #include "public/platform/WebTouchEvent.h"
 #include "public/web/WebPluginContainer.h"
-#include "web/WebExport.h"
 
 namespace blink {
 
@@ -61,7 +61,7 @@
 struct WebPrintParams;
 struct WebPrintPresetOptions;
 
-class WEB_EXPORT WebPluginContainerImpl final : public WebPluginContainerBase {
+class CORE_EXPORT WebPluginContainerImpl final : public WebPluginContainerBase {
   USING_PRE_FINALIZER(WebPluginContainerImpl, PreFinalize);
 
  public:
diff --git a/third_party/WebKit/Source/core/frame/csp/CSPSource.cpp b/third_party/WebKit/Source/core/frame/csp/CSPSource.cpp
index d23e194..5aba84c6 100644
--- a/third_party/WebKit/Source/core/frame/csp/CSPSource.cpp
+++ b/third_party/WebKit/Source/core/frame/csp/CSPSource.cpp
@@ -93,9 +93,10 @@
     // the following count measures when a match fails that would have
     // passed the old, incorrect style, in case a lot of sites were
     // relying on that behavior.
-    if (document && equal_hosts)
+    if (document && equal_hosts) {
       UseCounter::Count(*document,
                         UseCounter::kCSPSourceWildcardWouldMatchExactHost);
+    }
   } else {
     // host-part = 1*host-char *( "." 1*host-char )
     match = equal_hosts;
diff --git a/third_party/WebKit/Source/core/html/HTMLElement.cpp b/third_party/WebKit/Source/core/html/HTMLElement.cpp
index e5e3ab99..7504a48 100644
--- a/third_party/WebKit/Source/core/html/HTMLElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLElement.cpp
@@ -204,9 +204,10 @@
     first_separator = ui_language.find('_');
     if (first_separator != kNotFound)
       ui_language = ui_language.Left(first_separator);
-    if (!DeprecatedEqualIgnoringCase(html_language, ui_language))
+    if (!DeprecatedEqualIgnoringCase(html_language, ui_language)) {
       UseCounter::Count(GetDocument(),
                         UseCounter::kLangAttributeDoesNotMatchToUILocale);
+    }
   } else {
     // The empty string means the language is explicitly unknown.
     AddPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitLocale,
@@ -248,9 +249,10 @@
       AddPropertyToPresentationAttributeStyle(style, CSSPropertyWebkitLineBreak,
                                               CSSValueAfterWhiteSpace);
       UseCounter::Count(GetDocument(), UseCounter::kContentEditableTrue);
-      if (HasTagName(htmlTag))
+      if (HasTagName(htmlTag)) {
         UseCounter::Count(GetDocument(),
                           UseCounter::kContentEditableTrueOnHTML);
+      }
     } else if (DeprecatedEqualIgnoringCase(value, "plaintext-only")) {
       AddPropertyToPresentationAttributeStyle(
           style, CSSPropertyWebkitUserModify, CSSValueReadWritePlaintextOnly);
diff --git a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
index a329e9a..64cde65 100644
--- a/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLFormElement.cpp
@@ -469,9 +469,10 @@
 
   UseCounter::Count(GetDocument(), UseCounter::kFormsSubmitted);
   if (MixedContentChecker::IsMixedFormAction(GetDocument().GetFrame(),
-                                             submission->Action()))
+                                             submission->Action())) {
     UseCounter::Count(GetDocument().GetFrame(),
                       UseCounter::kMixedContentFormsSubmitted);
+  }
 
   // TODO(lukasza): Investigate if the code below can uniformly handle remote
   // and local frames (i.e. by calling virtual Frame::navigate from a timer).
@@ -527,9 +528,10 @@
         attributes_.Action().IsEmpty() ? GetDocument().Url().GetString()
                                        : attributes_.Action());
     if (MixedContentChecker::IsMixedFormAction(GetDocument().GetFrame(),
-                                               action_url))
+                                               action_url)) {
       UseCounter::Count(GetDocument().GetFrame(),
                         UseCounter::kMixedContentFormPresent);
+    }
   } else if (name == targetAttr) {
     attributes_.SetTarget(params.new_value);
   } else if (name == methodAttr) {
diff --git a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
index 9c7764e7..38907b23 100644
--- a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
@@ -362,9 +362,10 @@
       continue;
 
     HTMLSourceElement* source = toHTMLSourceElement(child);
-    if (!source->FastGetAttribute(srcAttr).IsNull())
+    if (!source->FastGetAttribute(srcAttr).IsNull()) {
       Deprecation::CountDeprecation(GetDocument(),
                                     UseCounter::kPictureSourceSrc);
+    }
     String srcset = source->FastGetAttribute(srcsetAttr);
     if (srcset.IsEmpty())
       continue;
diff --git a/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp b/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp
index 7fc8dbe..e80125c6 100644
--- a/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLLabelElement.cpp
@@ -59,10 +59,11 @@
     for (LabelableElement& element :
          Traversal<LabelableElement>::DescendantsOf(*this)) {
       if (element.SupportLabels()) {
-        if (!element.IsFormControlElement())
+        if (!element.IsFormControlElement()) {
           UseCounter::Count(
               GetDocument(),
               UseCounter::kHTMLLabelElementControlForNonFormAssociatedElement);
+        }
         return &element;
       }
     }
@@ -75,10 +76,11 @@
   if (Element* element = GetTreeScope().getElementById(control_id)) {
     if (IsLabelableElement(*element) &&
         ToLabelableElement(*element).SupportLabels()) {
-      if (!element->IsFormControlElement())
+      if (!element->IsFormControlElement()) {
         UseCounter::Count(
             GetDocument(),
             UseCounter::kHTMLLabelElementControlForNonFormAssociatedElement);
+      }
       return ToLabelableElement(element);
     }
   }
diff --git a/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp b/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp
index 257922a..fedf413 100644
--- a/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLScriptElement.cpp
@@ -99,9 +99,10 @@
   ScriptType script_type = ScriptType::kClassic;
   if (insertion_point->isConnected() && HasSourceAttribute() &&
       !Loader()->IsScriptTypeSupported(
-          ScriptLoader::kDisallowLegacyTypeInTypeAttribute, script_type))
+          ScriptLoader::kDisallowLegacyTypeInTypeAttribute, script_type)) {
     UseCounter::Count(GetDocument(),
                       UseCounter::kScriptElementWithInvalidTypeHasSrc);
+  }
   HTMLElement::InsertedInto(insertion_point);
   LogAddElementIfIsolatedWorldAndInDocument("script", srcAttr);
 
diff --git a/third_party/WebKit/Source/core/html/forms/BaseCheckableInputType.cpp b/third_party/WebKit/Source/core/html/forms/BaseCheckableInputType.cpp
index 64aee26..613522e 100644
--- a/third_party/WebKit/Source/core/html/forms/BaseCheckableInputType.cpp
+++ b/third_party/WebKit/Source/core/html/forms/BaseCheckableInputType.cpp
@@ -110,9 +110,10 @@
 }
 
 void BaseCheckableInputType::ReadingChecked() const {
-  if (is_in_click_handler_)
+  if (is_in_click_handler_) {
     UseCounter::Count(GetElement().GetDocument(),
                       UseCounter::kReadingCheckedInClickHandler);
+  }
 }
 
 bool BaseCheckableInputType::IsCheckable() {
diff --git a/third_party/WebKit/Source/core/html/forms/RangeInputType.cpp b/third_party/WebKit/Source/core/html/forms/RangeInputType.cpp
index 900a5877..711e0ad 100644
--- a/third_party/WebKit/Source/core/html/forms/RangeInputType.cpp
+++ b/third_party/WebKit/Source/core/html/forms/RangeInputType.cpp
@@ -94,9 +94,10 @@
 void RangeInputType::CountUsage() {
   CountUsageIfVisible(UseCounter::kInputTypeRange);
   if (const ComputedStyle* style = GetElement().GetComputedStyle()) {
-    if (style->Appearance() == kSliderVerticalPart)
+    if (style->Appearance() == kSliderVerticalPart) {
       UseCounter::Count(GetElement().GetDocument(),
                         UseCounter::kInputTypeRangeVerticalAppearance);
+    }
   }
 }
 
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportChild.cpp b/third_party/WebKit/Source/core/html/imports/HTMLImportChild.cpp
index a38d4894..e87afcc4 100644
--- a/third_party/WebKit/Source/core/html/imports/HTMLImportChild.cpp
+++ b/third_party/WebKit/Source/core/html/imports/HTMLImportChild.cpp
@@ -78,9 +78,10 @@
 
 void HTMLImportChild::DidFinishLoading() {
   StateWillChange();
-  if (GetDocument() && GetDocument()->GetStyleEngine().HasStyleSheets())
+  if (GetDocument() && GetDocument()->GetStyleEngine().HasStyleSheets()) {
     UseCounter::Count(Root()->GetDocument(),
                       UseCounter::kHTMLImportsHasStyleSheets);
+  }
   V0CustomElement::DidFinishLoadingImport(*(Root()->GetDocument()));
 }
 
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp b/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
index fac6a5be..b57d36b 100644
--- a/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
+++ b/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
@@ -75,9 +75,10 @@
   HTMLImport::SyncMode mode = client->IsSync() && !MakesCycle(parent, url)
                                   ? HTMLImport::kSync
                                   : HTMLImport::kAsync;
-  if (mode == HTMLImport::kAsync)
+  if (mode == HTMLImport::kAsync) {
     UseCounter::Count(Root()->GetDocument(),
                       UseCounter::kHTMLImportsAsyncAttribute);
+  }
 
   HTMLImportChild* child = new HTMLImportChild(url, loader, mode);
   child->SetClient(client);
diff --git a/third_party/WebKit/Source/core/input/KeyboardEventManager.cpp b/third_party/WebKit/Source/core/input/KeyboardEventManager.cpp
index 521e138..8c94ecd 100644
--- a/third_party/WebKit/Source/core/input/KeyboardEventManager.cpp
+++ b/third_party/WebKit/Source/core/input/KeyboardEventManager.cpp
@@ -350,9 +350,10 @@
   if (!frame_->GetEditor().Behavior().ShouldNavigateBackOnBackspace())
     return;
   UseCounter::Count(frame_->GetDocument(), UseCounter::kBackspaceNavigatedBack);
-  if (frame_->GetPage()->GetChromeClient().HadFormInteraction())
+  if (frame_->GetPage()->GetChromeClient().HadFormInteraction()) {
     UseCounter::Count(frame_->GetDocument(),
                       UseCounter::kBackspaceNavigatedBackAfterFormInteraction);
+  }
   bool handled_event = frame_->Loader().Client()->NavigateBackForward(
       event->shiftKey() ? 1 : -1);
   if (handled_event)
diff --git a/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp
index f653e7c..d187b809 100644
--- a/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutDeprecatedFlexibleBox.cpp
@@ -269,14 +269,15 @@
   stretching_children_ = false;
   if (!IsAnonymous()) {
     const KURL& url = GetDocument().Url();
-    if (url.ProtocolIs("chrome"))
+    if (url.ProtocolIs("chrome")) {
       UseCounter::Count(GetDocument(), UseCounter::kDeprecatedFlexboxChrome);
-    else if (url.ProtocolIs("chrome-extension"))
+    } else if (url.ProtocolIs("chrome-extension")) {
       UseCounter::Count(GetDocument(),
                         UseCounter::kDeprecatedFlexboxChromeExtension);
-    else
+    } else {
       UseCounter::Count(GetDocument(),
                         UseCounter::kDeprecatedFlexboxWebContent);
+    }
   }
 }
 
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
index 4770719b..b433763 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -162,9 +162,10 @@
   float max_content_flex_fraction =
       max_preferred_logical_width.ToFloat() / flex_grow;
   if (previous_max_content_flex_fraction != -1 &&
-      max_content_flex_fraction != previous_max_content_flex_fraction)
+      max_content_flex_fraction != previous_max_content_flex_fraction) {
     UseCounter::Count(GetDocument(),
                       UseCounter::kFlexboxIntrinsicSizeAlgorithmIsDifferent);
+  }
   return max_content_flex_fraction;
 }
 
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
index 1a5d77a..57ae9acc 100644
--- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -843,9 +843,10 @@
       style.HasWillChangeTransformHint());
 
   if (style.Preserves3D() && style.HasOpacity() &&
-      owning_layer_.Has3DTransformedDescendant())
+      owning_layer_.Has3DTransformedDescendant()) {
     UseCounter::Count(layout_object.GetDocument(),
                       UseCounter::kOpacityWithPreserve3DQuirk);
+  }
 
   return layer_config_changed;
 }
diff --git a/third_party/WebKit/Source/core/loader/WorkletScriptLoader.h b/third_party/WebKit/Source/core/loader/WorkletScriptLoader.h
index f2404f91..e38d938e 100644
--- a/third_party/WebKit/Source/core/loader/WorkletScriptLoader.h
+++ b/third_party/WebKit/Source/core/loader/WorkletScriptLoader.h
@@ -19,7 +19,7 @@
 // classic script. You can access this class only on the main thread.
 // A client of this class receives notifications via Client interface.
 // TODO(nhiroki): Switch to module script loading (https://crbug.com/627945)
-class WorkletScriptLoader final
+class CORE_EXPORT WorkletScriptLoader final
     : public GarbageCollectedFinalized<WorkletScriptLoader>,
       public ResourceOwner<ScriptResource, ScriptResourceClient> {
   USING_GARBAGE_COLLECTED_MIXIN(WorkletScriptLoader);
diff --git a/third_party/WebKit/Source/core/page/PointerLockController.cpp b/third_party/WebKit/Source/core/page/PointerLockController.cpp
index f9aa43b..16a10efe 100644
--- a/third_party/WebKit/Source/core/page/PointerLockController.cpp
+++ b/third_party/WebKit/Source/core/page/PointerLockController.cpp
@@ -51,9 +51,10 @@
 
   UseCounter::CountCrossOriginIframe(
       target->GetDocument(), UseCounter::kElementRequestPointerLockIframe);
-  if (target->IsInShadowTree())
+  if (target->IsInShadowTree()) {
     UseCounter::Count(target->GetDocument(),
                       UseCounter::kElementRequestPointerLockInShadow);
+  }
 
   if (target->GetDocument().IsSandboxed(kSandboxPointerLock)) {
     // FIXME: This message should be moved off the console once a solution to
diff --git a/third_party/WebKit/Source/core/paint/ThemePainter.cpp b/third_party/WebKit/Source/core/paint/ThemePainter.cpp
index 1d778c3..40ba4fc 100644
--- a/third_party/WebKit/Source/core/paint/ThemePainter.cpp
+++ b/third_party/WebKit/Source/core/paint/ThemePainter.cpp
@@ -181,13 +181,14 @@
                         UseCounter::kCSSValueAppearanceTextFieldRendered);
       if (isHTMLInputElement(o.GetNode())) {
         HTMLInputElement* input = toHTMLInputElement(o.GetNode());
-        if (input->type() == InputTypeNames::search)
+        if (input->type() == InputTypeNames::search) {
           UseCounter::Count(o.GetDocument(),
                             UseCounter::kCSSValueAppearanceTextFieldForSearch);
-        else if (input->IsTextField())
+        } else if (input->IsTextField()) {
           UseCounter::Count(
               o.GetDocument(),
               UseCounter::kCSSValueAppearanceTextFieldForTextField);
+        }
       }
       return PaintTextField(o, paint_info, r);
     case kTextAreaPart:
diff --git a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp
index 22750ce..1e6c961 100644
--- a/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp
+++ b/third_party/WebKit/Source/core/svg/animation/SVGSMILElement.cpp
@@ -306,9 +306,10 @@
     return kInsertionDone;
 
   UseCounter::Count(GetDocument(), UseCounter::kSVGSMILElementInDocument);
-  if (GetDocument().IsLoadCompleted())
+  if (GetDocument().IsLoadCompleted()) {
     UseCounter::Count(&GetDocument(),
                       UseCounter::kSVGSMILElementInsertedAfterLoad);
+  }
 
   SVGSVGElement* owner = ownerSVGElement();
   if (!owner)
diff --git a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
index fa261c0..6199c5b 100644
--- a/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
+++ b/third_party/WebKit/Source/core/svg/graphics/SVGImage.cpp
@@ -638,9 +638,10 @@
 
 void SVGImage::UpdateUseCounters(const Document& document) const {
   if (SVGSVGElement* root_element = SvgRootElement(page_.Get())) {
-    if (root_element->TimeContainer()->HasAnimations())
+    if (root_element->TimeContainer()->HasAnimations()) {
       UseCounter::Count(document,
                         UseCounter::kSVGSMILAnimationInImageRegardlessOfCache);
+    }
   }
 }
 
diff --git a/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp b/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp
index ac5b7fd..e7df10c4 100644
--- a/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp
+++ b/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.cpp
@@ -11,6 +11,7 @@
 #include "core/frame/csp/ContentSecurityPolicy.h"
 #include "core/origin_trials/OriginTrialContext.h"
 #include "core/workers/ThreadedWorkletObjectProxy.h"
+#include "core/workers/WorkerClients.h"
 #include "core/workers/WorkerInspectorProxy.h"
 #include "core/workers/WorkerThreadStartupData.h"
 #include "core/workers/WorkletGlobalScope.h"
diff --git a/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.h b/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.h
index eabafbb..68516c2 100644
--- a/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.h
+++ b/third_party/WebKit/Source/core/workers/ThreadedWorkletMessagingProxy.h
@@ -16,6 +16,7 @@
 
 class ScriptSourceCode;
 class ThreadedWorkletObjectProxy;
+class WorkerClients;
 
 class CORE_EXPORT ThreadedWorkletMessagingProxy
     : public ThreadedMessagingProxyBase,
diff --git a/third_party/WebKit/Source/core/workers/WorkletPendingTasks.h b/third_party/WebKit/Source/core/workers/WorkletPendingTasks.h
index 5de3435..80f38e86 100644
--- a/third_party/WebKit/Source/core/workers/WorkletPendingTasks.h
+++ b/third_party/WebKit/Source/core/workers/WorkletPendingTasks.h
@@ -5,6 +5,7 @@
 #ifndef WorkletPendingTasks_h
 #define WorkletPendingTasks_h
 
+#include "core/CoreExport.h"
 #include "bindings/core/v8/ScriptPromiseResolver.h"
 #include "platform/heap/Heap.h"
 
@@ -18,7 +19,8 @@
 // https://drafts.css-houdini.org/worklets/#fetch-and-invoke-a-worklet-script
 //
 // All functions must be accessed on the main thread.
-class WorkletPendingTasks final : public GarbageCollected<WorkletPendingTasks> {
+class CORE_EXPORT WorkletPendingTasks final
+    : public GarbageCollected<WorkletPendingTasks> {
  public:
   WorkletPendingTasks(int counter, ScriptPromiseResolver*);
 
diff --git a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
index be28efee..c111956 100644
--- a/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
+++ b/third_party/WebKit/Source/core/xmlhttprequest/XMLHttpRequest.cpp
@@ -645,10 +645,11 @@
     // exception thrown.
     // Refer : https://xhr.spec.whatwg.org/#sync-warning
     // Use count for XHR synchronous requests on main thread only.
-    if (!GetDocument()->ProcessingBeforeUnload())
+    if (!GetDocument()->ProcessingBeforeUnload()) {
       Deprecation::CountDeprecation(
           GetExecutionContext(),
           UseCounter::kXMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload);
+    }
   }
 
   method_ = FetchUtils::NormalizeMethod(method);
@@ -976,9 +977,10 @@
            Suborigin::SuboriginPolicyOptions::kUnsafeCredentials) &&
        SecurityOrigin::Create(url_)->IsSameSchemeHostPort(GetSecurityOrigin()));
 
-  if (!same_origin_request_ && include_credentials)
+  if (!same_origin_request_ && include_credentials) {
     UseCounter::Count(&execution_context,
                       UseCounter::kXMLHttpRequestCrossOriginWithCredentials);
+  }
 
   // We also remember whether upload events should be allowed for this request
   // in case the upload listeners are added after the request is started.
diff --git a/third_party/WebKit/Source/modules/BUILD.gn b/third_party/WebKit/Source/modules/BUILD.gn
index 845c963..3cb21f1 100644
--- a/third_party/WebKit/Source/modules/BUILD.gn
+++ b/third_party/WebKit/Source/modules/BUILD.gn
@@ -236,6 +236,7 @@
     "canvas/HTMLCanvasElementModuleTest.cpp",
     "canvas2d/CanvasRenderingContext2DAPITest.cpp",
     "canvas2d/CanvasRenderingContext2DTest.cpp",
+    "compositorworker/AnimationWorkletGlobalScopeTest.cpp",
     "compositorworker/AnimationWorkletThreadTest.cpp",
     "compositorworker/CompositorWorkerThreadTest.cpp",
     "credentialmanager/CredentialsContainerTest.cpp",
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp
index 7d1032e..b8d8280 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorklet.cpp
@@ -39,8 +39,10 @@
           document->GetFrame());
 
   WorkerClients* worker_clients = WorkerClients::Create();
-  worklet_messaging_proxy_ = new AnimationWorkletMessagingProxy(
-      GetExecutionContext(), worker_clients, proxy_client);
+  ProvideAnimationWorkletProxyClientTo(worker_clients, proxy_client);
+
+  worklet_messaging_proxy_ =
+      new AnimationWorkletMessagingProxy(GetExecutionContext(), worker_clients);
   worklet_messaging_proxy_->Initialize();
 }
 
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.cpp
index 297d48f..1f8849b 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.cpp
@@ -8,7 +8,9 @@
 
 #include "bindings/core/v8/ExceptionState.h"
 #include "bindings/core/v8/WorkerOrWorkletScriptController.h"
+#include "core/dom/AnimationWorkletProxyClient.h"
 #include "core/dom/ExceptionCode.h"
+#include "core/workers/WorkerClients.h"
 #include "platform/bindings/V8BindingMacros.h"
 #include "platform/bindings/V8ObjectConstructor.h"
 
@@ -40,7 +42,11 @@
                                  std::move(security_origin),
                                  isolate,
                                  thread,
-                                 worker_clients) {}
+                                 worker_clients) {
+  if (AnimationWorkletProxyClient* proxy_client =
+          AnimationWorkletProxyClient::From(Clients()))
+    proxy_client->SetGlobalScope(this);
+}
 
 AnimationWorkletGlobalScope::~AnimationWorkletGlobalScope() {}
 
@@ -60,6 +66,25 @@
   ThreadedWorkletGlobalScope::TraceWrappers(visitor);
 }
 
+void AnimationWorkletGlobalScope::Dispose() {
+  DCHECK(IsContextThread());
+  if (AnimationWorkletProxyClient* proxy_client =
+          AnimationWorkletProxyClient::From(Clients()))
+    proxy_client->Dispose();
+  ThreadedWorkletGlobalScope::Dispose();
+}
+
+void AnimationWorkletGlobalScope::Mutate() {
+  DCHECK(IsContextThread());
+
+  ScriptState* script_state = ScriptController()->GetScriptState();
+  ScriptState::Scope scope(script_state);
+
+  for (Animator* animator : animators_) {
+    animator->Animate(script_state);
+  }
+}
+
 void AnimationWorkletGlobalScope::registerAnimator(
     const String& name,
     const ScriptValue& ctorValue,
@@ -124,13 +149,14 @@
 
   AnimatorDefinition* definition =
       new AnimatorDefinition(isolate, constructor, animate);
+
   animator_definitions_.Set(
       name, TraceWrapperMember<AnimatorDefinition>(this, definition));
 
   // Immediately instantiate an animator for the registered definition.
   // TODO(majidvp): Remove this once you add alternative way to instantiate
-  Animator* animator = CreateInstance(name);
-  animators_.push_back(TraceWrapperMember<Animator>(this, animator));
+  if (Animator* animator = CreateInstance(name))
+    animators_.push_back(TraceWrapperMember<Animator>(this, animator));
 }
 
 Animator* AnimationWorkletGlobalScope::CreateInstance(const String& name) {
@@ -151,4 +177,9 @@
   return new Animator(isolate, definition, instance);
 }
 
+AnimatorDefinition* AnimationWorkletGlobalScope::FindDefinitionForTest(
+    const String& name) {
+  return animator_definitions_.at(name);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.h b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.h
index f525cdc..0df99b16 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.h
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScope.h
@@ -7,6 +7,7 @@
 
 #include "bindings/core/v8/ScriptValue.h"
 #include "core/workers/ThreadedWorkletGlobalScope.h"
+#include "modules/ModulesExport.h"
 #include "modules/compositorworker/Animator.h"
 #include "modules/compositorworker/AnimatorDefinition.h"
 #include "platform/bindings/ScriptWrappable.h"
@@ -14,8 +15,10 @@
 namespace blink {
 
 class ExceptionState;
+class WorkerClients;
 
-class AnimationWorkletGlobalScope : public ThreadedWorkletGlobalScope {
+class MODULES_EXPORT AnimationWorkletGlobalScope
+    : public ThreadedWorkletGlobalScope {
   DEFINE_WRAPPERTYPEINFO();
 
  public:
@@ -28,12 +31,17 @@
   ~AnimationWorkletGlobalScope() override;
   DECLARE_TRACE();
   DECLARE_TRACE_WRAPPERS();
+  void Dispose() override;
+  bool IsAnimationWorkletGlobalScope() const final { return true; }
+
+  Animator* CreateInstance(const String& name);
+  void Mutate();
 
   void registerAnimator(const String& name,
                         const ScriptValue& ctorValue,
                         ExceptionState&);
 
-  Animator* CreateInstance(const String& name);
+  AnimatorDefinition* FindDefinitionForTest(const String& name);
 
  private:
   AnimationWorkletGlobalScope(const KURL&,
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScopeTest.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScopeTest.cpp
new file mode 100644
index 0000000..3a5ee57
--- /dev/null
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletGlobalScopeTest.cpp
@@ -0,0 +1,179 @@
+// 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 "modules/compositorworker/AnimationWorkletGlobalScope.h"
+
+#include "bindings/core/v8/ExceptionState.h"
+#include "bindings/core/v8/ScriptSourceCode.h"
+#include "bindings/core/v8/V8BindingForCore.h"
+#include "bindings/core/v8/WorkerOrWorkletScriptController.h"
+#include "bindings/core/v8/WorkerV8Settings.h"
+#include "core/dom/TaskRunnerHelper.h"
+#include "core/workers/WorkerReportingProxy.h"
+#include "core/workers/WorkerThreadStartupData.h"
+#include "modules/compositorworker/AnimationWorklet.h"
+#include "modules/compositorworker/AnimationWorkletThread.h"
+#include "modules/compositorworker/Animator.h"
+#include "modules/compositorworker/AnimatorDefinition.h"
+#include "platform/CrossThreadFunctional.h"
+#include "platform/WaitableEvent.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#include <memory>
+
+namespace blink {
+
+class AnimationWorkletGlobalScopeTest : public ::testing::Test {
+ public:
+  AnimationWorkletGlobalScopeTest() {}
+
+  void SetUp() override {
+    AnimationWorkletThread::CreateSharedBackingThreadForTest();
+    reporting_proxy_ = WTF::MakeUnique<WorkerReportingProxy>();
+    security_origin_ =
+        SecurityOrigin::Create(KURL(kParsedURLString, "http://fake.url/"));
+  }
+
+  void TearDown() override {
+    AnimationWorkletThread::ClearSharedBackingThread();
+  }
+
+  std::unique_ptr<AnimationWorkletThread> CreateAnimationWorkletThread() {
+    std::unique_ptr<AnimationWorkletThread> thread =
+        AnimationWorkletThread::Create(nullptr, *reporting_proxy_);
+
+    WorkerClients* clients = WorkerClients::Create();
+
+    thread->Start(
+        WorkerThreadStartupData::Create(
+            KURL(kParsedURLString, "http://fake.url/"), "fake user agent", "",
+            nullptr, kDontPauseWorkerGlobalScopeOnStart, nullptr, "",
+            security_origin_.Get(), clients, kWebAddressSpaceLocal, nullptr,
+            nullptr, WorkerV8Settings::Default()),
+        ParentFrameTaskRunners::Create(nullptr));
+    return thread;
+  }
+
+  using TestCalback = void (AnimationWorkletGlobalScopeTest::*)(WorkerThread*,
+                                                                WaitableEvent*);
+  // Create a new animation worklet and run the callback task on it. Terminate
+  // the worklet once the task completion is signaled.
+  void RunTestOnWorkletThread(TestCalback callback) {
+    std::unique_ptr<WorkerThread> worklet = CreateAnimationWorkletThread();
+    WaitableEvent waitable_event;
+    TaskRunnerHelper::Get(TaskType::kUnthrottled, worklet.get())
+        ->PostTask(BLINK_FROM_HERE,
+                   CrossThreadBind(callback, CrossThreadUnretained(this),
+                                   CrossThreadUnretained(worklet.get()),
+                                   CrossThreadUnretained(&waitable_event)));
+    waitable_event.Wait();
+
+    worklet->TerminateAndWait();
+  }
+
+  void RunBasicParsingTestOnWorklet(WorkerThread* thread,
+                                    WaitableEvent* waitable_event) {
+    AnimationWorkletGlobalScope* global_scope =
+        static_cast<AnimationWorkletGlobalScope*>(thread->GlobalScope());
+    ASSERT_TRUE(global_scope);
+    ASSERT_TRUE(global_scope->IsAnimationWorkletGlobalScope());
+    ScriptState* script_state =
+        global_scope->ScriptController()->GetScriptState();
+    ASSERT_TRUE(script_state);
+    v8::Isolate* isolate = script_state->GetIsolate();
+    ASSERT_TRUE(isolate);
+
+    ScriptState::Scope scope(script_state);
+    global_scope->ScriptController()->Evaluate(ScriptSourceCode(
+        R"JS(
+            registerAnimator('test', class {
+              constructor () {}
+              animate () {}
+            });
+
+            registerAnimator('null', null);
+          )JS"));
+
+    AnimatorDefinition* definition =
+        global_scope->FindDefinitionForTest("test");
+    ASSERT_TRUE(definition);
+
+    EXPECT_TRUE(definition->ConstructorLocal(isolate)->IsFunction());
+    EXPECT_TRUE(definition->AnimateLocal(isolate)->IsFunction());
+
+    EXPECT_FALSE(global_scope->FindDefinitionForTest("null"));
+    EXPECT_FALSE(global_scope->FindDefinitionForTest("non-existent"));
+
+    waitable_event->Signal();
+  }
+
+  void RunConstructAndAnimateTestOnWorklet(WorkerThread* thread,
+                                           WaitableEvent* waitable_event) {
+    AnimationWorkletGlobalScope* global_scope =
+        static_cast<AnimationWorkletGlobalScope*>(thread->GlobalScope());
+    ASSERT_TRUE(global_scope);
+    ASSERT_TRUE(global_scope->IsAnimationWorkletGlobalScope());
+    ScriptState* script_state =
+        global_scope->ScriptController()->GetScriptState();
+    ASSERT_TRUE(script_state);
+    v8::Isolate* isolate = script_state->GetIsolate();
+    ASSERT_TRUE(isolate);
+
+    ScriptState::Scope scope(script_state);
+    global_scope->ScriptController()->Evaluate(ScriptSourceCode(
+        R"JS(
+            var constructed = false;
+            var animated = false;
+            registerAnimator('test', class {
+              constructor () {
+                constructed = true;
+              }
+              animate () {
+                animated = true;
+              }
+            });
+          )JS"));
+
+    ScriptValue constructed =
+        global_scope->ScriptController()->EvaluateAndReturnValueForTest(
+            ScriptSourceCode("constructed"));
+    EXPECT_TRUE(ToBoolean(isolate, constructed.V8Value(), ASSERT_NO_EXCEPTION))
+        << "constructor is not invoked";
+
+    ScriptValue animated_before =
+        global_scope->ScriptController()->EvaluateAndReturnValueForTest(
+            ScriptSourceCode("animated"));
+    EXPECT_FALSE(
+        ToBoolean(isolate, animated_before.V8Value(), ASSERT_NO_EXCEPTION))
+        << "animate function is invoked early";
+
+    global_scope->Mutate();
+
+    ScriptValue animated_after =
+        global_scope->ScriptController()->EvaluateAndReturnValueForTest(
+            ScriptSourceCode("animated"));
+
+    EXPECT_TRUE(
+        ToBoolean(isolate, animated_after.V8Value(), ASSERT_NO_EXCEPTION))
+        << "animate function is not invoked";
+
+    waitable_event->Signal();
+  }
+
+ private:
+  RefPtr<SecurityOrigin> security_origin_;
+  std::unique_ptr<WorkerReportingProxy> reporting_proxy_;
+};
+
+TEST_F(AnimationWorkletGlobalScopeTest, BasicParsing) {
+  RunTestOnWorkletThread(
+      &AnimationWorkletGlobalScopeTest::RunBasicParsingTestOnWorklet);
+}
+
+TEST_F(AnimationWorkletGlobalScopeTest, ConstructAndAnimate) {
+  RunTestOnWorkletThread(
+      &AnimationWorkletGlobalScopeTest::RunConstructAndAnimateTestOnWorklet);
+}
+
+}  // namespace blink
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.cpp
index efd8f96..48e3105 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.cpp
@@ -5,16 +5,15 @@
 #include "modules/compositorworker/AnimationWorkletMessagingProxy.h"
 
 #include "core/workers/ThreadedWorkletObjectProxy.h"
+#include "core/workers/WorkerClients.h"
 #include "modules/compositorworker/AnimationWorkletThread.h"
 
 namespace blink {
 
 AnimationWorkletMessagingProxy::AnimationWorkletMessagingProxy(
     ExecutionContext* execution_context,
-    WorkerClients* worker_clients,
-    AnimationWorkletProxyClient* proxy_client)
-    : ThreadedWorkletMessagingProxy(execution_context, worker_clients),
-      proxy_client_(proxy_client) {}
+    WorkerClients* worker_clients)
+    : ThreadedWorkletMessagingProxy(execution_context, worker_clients) {}
 
 AnimationWorkletMessagingProxy::~AnimationWorkletMessagingProxy() {}
 
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.h b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.h
index c94d94c..e3a96fa 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.h
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletMessagingProxy.h
@@ -13,6 +13,7 @@
 namespace blink {
 
 class ExecutionContext;
+class WorkerClients;
 class WorkerThread;
 
 class AnimationWorkletMessagingProxy final
@@ -20,15 +21,12 @@
   USING_FAST_MALLOC(AnimationWorkletMessagingProxy);
 
  public:
-  AnimationWorkletMessagingProxy(ExecutionContext*,
-                                 WorkerClients*,
-                                 AnimationWorkletProxyClient*);
+  AnimationWorkletMessagingProxy(ExecutionContext*, WorkerClients*);
 
  protected:
   ~AnimationWorkletMessagingProxy() override;
 
   std::unique_ptr<WorkerThread> CreateWorkerThread(double origin_time) override;
-  Persistent<AnimationWorkletProxyClient> proxy_client_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.cpp
index b077724..739c78aeb 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.cpp
@@ -21,11 +21,30 @@
   CompositorAnimator::Trace(visitor);
 }
 
+void AnimationWorkletProxyClientImpl::SetGlobalScope(
+    WorkletGlobalScope* global_scope) {
+  DCHECK(global_scope->IsContextThread());
+  DCHECK(global_scope);
+  global_scope_ = static_cast<AnimationWorkletGlobalScope*>(global_scope);
+  mutator_->RegisterCompositorAnimator(this);
+}
+
+void AnimationWorkletProxyClientImpl::Dispose() {
+  DCHECK(global_scope_->IsContextThread());
+  // At worklet scope termination break the reference cycle between
+  // CompositorMutatorImpl and AnimationProxyClientImpl and also the cycle
+  // between AnimationWorkletGlobalScope and AnimationWorkletProxyClientImpl.
+  mutator_->UnregisterCompositorAnimator(this);
+  global_scope_ = nullptr;
+}
+
 bool AnimationWorkletProxyClientImpl::Mutate(
     double monotonic_time_now,
     CompositorMutableStateProvider* provider) {
-  DCHECK(!IsMainThread());
-  // TODO(majidvp): actually call JS |animate| callbacks.
+  DCHECK(global_scope_->IsContextThread());
+
+  if (global_scope_)
+    global_scope_->Mutate();
 
   // Always request another rAF for now.
   return true;
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.h b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.h
index 2778e623..fbcd30d 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.h
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletProxyClientImpl.h
@@ -9,12 +9,14 @@
 #include "core/animation/CompositorProxyClientImpl.h"
 #include "core/dom/AnimationWorkletProxyClient.h"
 #include "modules/ModulesExport.h"
+#include "modules/compositorworker/AnimationWorkletGlobalScope.h"
 #include "platform/heap/Handle.h"
 #include "platform/wtf/Noncopyable.h"
 
 namespace blink {
 
 class CompositorMutatorImpl;
+class WorkletGlobalScope;
 
 // Mediates between one Animator and the associated CompositorMutatorImpl. There
 // is one AnimationWorkletProxyClientImpl per Animator but there may be multiple
@@ -33,15 +35,25 @@
   explicit AnimationWorkletProxyClientImpl(CompositorMutatorImpl*);
   DECLARE_VIRTUAL_TRACE();
 
+  // AnimationWorkletProxyClient:
+  void SetGlobalScope(WorkletGlobalScope*) override;
+  void Dispose() override;
+
   // CompositorAnimator:
   // This method is invoked in compositor thread
   bool Mutate(double monotonic_time_now,
               CompositorMutableStateProvider*) override;
 
+  CompositorProxyClient* GetCompositorProxyClient() override {
+    return compositor_proxy_client_.Get();
+  }
+
  private:
   CrossThreadPersistent<CompositorMutatorImpl> mutator_;
 
   CrossThreadPersistent<CompositorProxyClientImpl> compositor_proxy_client_;
+
+  CrossThreadPersistent<AnimationWorkletGlobalScope> global_scope_;
 };
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThread.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThread.cpp
index 0a84d9b..35b92cae 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThread.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThread.cpp
@@ -40,7 +40,6 @@
     security_origin->TransferPrivilegesFrom(
         std::move(startup_data->starter_origin_privilege_data_));
 
-  // TODO(ikilpatrick): Provide CompositorWorkerProxyClient to WorkerClients.
   return AnimationWorkletGlobalScope::Create(
       startup_data->script_url_, startup_data->user_agent_,
       std::move(security_origin), this->GetIsolate(), this,
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThreadTest.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThreadTest.cpp
index e429afa..9a790e7 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThreadTest.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimationWorkletThreadTest.cpp
@@ -9,6 +9,7 @@
 #include "bindings/core/v8/SourceLocation.h"
 #include "bindings/core/v8/V8GCController.h"
 #include "bindings/core/v8/WorkerOrWorkletScriptController.h"
+#include "core/dom/AnimationWorkletProxyClient.h"
 #include "core/inspector/ConsoleMessage.h"
 #include "core/workers/InProcessWorkerObjectProxy.h"
 #include "core/workers/ParentFrameTaskRunners.h"
@@ -46,6 +47,18 @@
   TestingCompositorSupport compositor_support_;
 };
 
+class TestAnimationWorkletProxyClient
+    : public GarbageCollected<TestAnimationWorkletProxyClient>,
+      public AnimationWorkletProxyClient {
+  USING_GARBAGE_COLLECTED_MIXIN(TestAnimationWorkletProxyClient);
+
+ public:
+  TestAnimationWorkletProxyClient() {}
+  void SetGlobalScope(WorkletGlobalScope*) override {}
+  void Dispose() override {}
+  CompositorProxyClient* GetCompositorProxyClient() override { return nullptr; }
+};
+
 }  // namespace
 
 class AnimationWorkletThreadTest : public ::testing::Test {
@@ -62,13 +75,18 @@
   }
 
   std::unique_ptr<AnimationWorkletThread> CreateAnimationWorkletThread() {
+    WorkerClients* clients = WorkerClients::Create();
+    ProvideAnimationWorkletProxyClientTo(clients,
+                                         new TestAnimationWorkletProxyClient());
+
     std::unique_ptr<AnimationWorkletThread> thread =
         AnimationWorkletThread::Create(nullptr, *reporting_proxy_);
+
     thread->Start(
         WorkerThreadStartupData::Create(
             KURL(kParsedURLString, "http://fake.url/"), "fake user agent", "",
             nullptr, kDontPauseWorkerGlobalScopeOnStart, nullptr, "",
-            security_origin_.Get(), nullptr, kWebAddressSpaceLocal, nullptr,
+            security_origin_.Get(), clients, kWebAddressSpaceLocal, nullptr,
             nullptr, WorkerV8Settings::Default()),
         ParentFrameTaskRunners::Create(nullptr));
     return thread;
diff --git a/third_party/WebKit/Source/modules/compositorworker/Animator.cpp b/third_party/WebKit/Source/modules/compositorworker/Animator.cpp
index 2c7908d..0fa9dc6 100644
--- a/third_party/WebKit/Source/modules/compositorworker/Animator.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/Animator.cpp
@@ -4,8 +4,11 @@
 
 #include "modules/compositorworker/Animator.h"
 
+#include "bindings/core/v8/V8ScriptRunner.h"
+#include "core/dom/ExecutionContext.h"
 #include "modules/compositorworker/AnimatorDefinition.h"
 #include "platform/bindings/ScriptState.h"
+#include "platform/bindings/V8Binding.h"
 
 namespace blink {
 
@@ -25,4 +28,26 @@
   visitor->TraceWrappers(instance_.Cast<v8::Value>());
 }
 
+void Animator::Animate(ScriptState* script_state) const {
+  v8::Isolate* isolate = script_state->GetIsolate();
+
+  v8::Local<v8::Object> instance = instance_.NewLocal(isolate);
+  v8::Local<v8::Function> animate = definition_->AnimateLocal(isolate);
+
+  if (IsUndefinedOrNull(instance) || IsUndefinedOrNull(animate))
+    return;
+
+  ScriptState::Scope scope(script_state);
+  v8::TryCatch block(isolate);
+  block.SetVerbose(true);
+
+  V8ScriptRunner::CallFunction(animate, ExecutionContext::From(script_state),
+                               instance, 0, nullptr, isolate);
+
+  // The animate function may have produced an error!
+  // TODO(majidvp): We should probably just throw here.
+  if (block.HasCaught())
+    return;
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/compositorworker/Animator.h b/third_party/WebKit/Source/modules/compositorworker/Animator.h
index c1b8812..8844819c 100644
--- a/third_party/WebKit/Source/modules/compositorworker/Animator.h
+++ b/third_party/WebKit/Source/modules/compositorworker/Animator.h
@@ -14,6 +14,7 @@
 namespace blink {
 
 class AnimatorDefinition;
+class ScriptState;
 
 class Animator final : public GarbageCollectedFinalized<Animator>,
                        public TraceWrapperBase {
@@ -23,6 +24,8 @@
   DECLARE_TRACE();
   DECLARE_TRACE_WRAPPERS();
 
+  void Animate(ScriptState*) const;
+
  private:
   // This object keeps the definition object, and animator instance alive.
   // It participates in wrapper tracing as it holds onto V8 wrappers.
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.cpp b/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.cpp
index b36aa1f5..212fd98 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.cpp
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.cpp
@@ -30,4 +30,8 @@
   return constructor_.NewLocal(isolate);
 }
 
+v8::Local<v8::Function> AnimatorDefinition::AnimateLocal(v8::Isolate* isolate) {
+  return animate_.NewLocal(isolate);
+}
+
 }  // namespace blink
diff --git a/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.h b/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.h
index 483f3b4..83c0991 100644
--- a/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.h
+++ b/third_party/WebKit/Source/modules/compositorworker/AnimatorDefinition.h
@@ -5,6 +5,7 @@
 #ifndef AnimatorDefinition_h
 #define AnimatorDefinition_h
 
+#include "modules/ModulesExport.h"
 #include "platform/bindings/ScriptWrappable.h"
 #include "platform/bindings/TraceWrapperV8Reference.h"
 #include "platform/heap/Handle.h"
@@ -17,7 +18,7 @@
 // proper type.
 // It can be used to instantiate new animators and also to call the Javascript
 // 'animate' callback on a given instance.
-class AnimatorDefinition final
+class MODULES_EXPORT AnimatorDefinition final
     : public GarbageCollectedFinalized<AnimatorDefinition>,
       public TraceWrapperBase {
  public:
@@ -29,6 +30,7 @@
   DECLARE_TRACE_WRAPPERS();
 
   v8::Local<v8::Function> ConstructorLocal(v8::Isolate*);
+  v8::Local<v8::Function> AnimateLocal(v8::Isolate*);
 
  private:
   // This object keeps the constructor function, and animate function alive.
diff --git a/third_party/WebKit/Source/modules/filesystem/Entry.cpp b/third_party/WebKit/Source/modules/filesystem/Entry.cpp
index 7388a66..6dd24e5 100644
--- a/third_party/WebKit/Source/modules/filesystem/Entry.cpp
+++ b/third_party/WebKit/Source/modules/filesystem/Entry.cpp
@@ -48,19 +48,21 @@
     : EntryBase(file_system, full_path) {}
 
 DOMFileSystem* Entry::filesystem(ScriptState* script_state) const {
-  if (file_system_->GetType() == kFileSystemTypeIsolated)
+  if (file_system_->GetType() == kFileSystemTypeIsolated) {
     UseCounter::Count(
         ExecutionContext::From(script_state),
         UseCounter::kEntry_Filesystem_AttributeGetter_IsolatedFileSystem);
+  }
   return filesystem();
 }
 
 void Entry::getMetadata(ScriptState* script_state,
                         MetadataCallback* success_callback,
                         ErrorCallback* error_callback) {
-  if (file_system_->GetType() == kFileSystemTypeIsolated)
+  if (file_system_->GetType() == kFileSystemTypeIsolated) {
     UseCounter::Count(ExecutionContext::From(script_state),
                       UseCounter::kEntry_GetMetadata_Method_IsolatedFileSystem);
+  }
   file_system_->GetMetadata(this, success_callback,
                             ScriptErrorCallback::Wrap(error_callback));
 }
@@ -70,9 +72,10 @@
                    const String& name,
                    EntryCallback* success_callback,
                    ErrorCallback* error_callback) const {
-  if (file_system_->GetType() == kFileSystemTypeIsolated)
+  if (file_system_->GetType() == kFileSystemTypeIsolated) {
     UseCounter::Count(ExecutionContext::From(script_state),
                       UseCounter::kEntry_MoveTo_Method_IsolatedFileSystem);
+  }
   file_system_->Move(this, parent, name, success_callback,
                      ScriptErrorCallback::Wrap(error_callback));
 }
@@ -82,9 +85,10 @@
                    const String& name,
                    EntryCallback* success_callback,
                    ErrorCallback* error_callback) const {
-  if (file_system_->GetType() == kFileSystemTypeIsolated)
+  if (file_system_->GetType() == kFileSystemTypeIsolated) {
     UseCounter::Count(ExecutionContext::From(script_state),
                       UseCounter::kEntry_CopyTo_Method_IsolatedFileSystem);
+  }
   file_system_->Copy(this, parent, name, success_callback,
                      ScriptErrorCallback::Wrap(error_callback));
 }
@@ -92,9 +96,10 @@
 void Entry::remove(ScriptState* script_state,
                    VoidCallback* success_callback,
                    ErrorCallback* error_callback) const {
-  if (file_system_->GetType() == kFileSystemTypeIsolated)
+  if (file_system_->GetType() == kFileSystemTypeIsolated) {
     UseCounter::Count(ExecutionContext::From(script_state),
                       UseCounter::kEntry_Remove_Method_IsolatedFileSystem);
+  }
   file_system_->Remove(this, success_callback,
                        ScriptErrorCallback::Wrap(error_callback));
 }
@@ -102,17 +107,19 @@
 void Entry::getParent(ScriptState* script_state,
                       EntryCallback* success_callback,
                       ErrorCallback* error_callback) const {
-  if (file_system_->GetType() == kFileSystemTypeIsolated)
+  if (file_system_->GetType() == kFileSystemTypeIsolated) {
     UseCounter::Count(ExecutionContext::From(script_state),
                       UseCounter::kEntry_GetParent_Method_IsolatedFileSystem);
+  }
   file_system_->GetParent(this, success_callback,
                           ScriptErrorCallback::Wrap(error_callback));
 }
 
 String Entry::toURL(ScriptState* script_state) const {
-  if (file_system_->GetType() == kFileSystemTypeIsolated)
+  if (file_system_->GetType() == kFileSystemTypeIsolated) {
     UseCounter::Count(ExecutionContext::From(script_state),
                       UseCounter::kEntry_ToURL_Method_IsolatedFileSystem);
+  }
   return static_cast<const EntryBase*>(this)->toURL();
 }
 
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp b/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp
index d86db661..b232cf7 100644
--- a/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp
+++ b/third_party/WebKit/Source/modules/mediastream/MediaStream.cpp
@@ -318,11 +318,12 @@
     const AtomicString& event_type,
     EventListener* listener,
     const AddEventListenerOptionsResolved& options) {
-  if (event_type == EventTypeNames::active)
+  if (event_type == EventTypeNames::active) {
     UseCounter::Count(GetExecutionContext(), UseCounter::kMediaStreamOnActive);
-  else if (event_type == EventTypeNames::inactive)
+  } else if (event_type == EventTypeNames::inactive) {
     UseCounter::Count(GetExecutionContext(),
                       UseCounter::kMediaStreamOnInactive);
+  }
 
   return EventTargetWithInlineData::AddEventListenerInternal(event_type,
                                                              listener, options);
diff --git a/third_party/WebKit/Source/modules/notifications/Notification.cpp b/third_party/WebKit/Source/modules/notifications/Notification.cpp
index 80367ae..a6bc3b4 100644
--- a/third_party/WebKit/Source/modules/notifications/Notification.cpp
+++ b/third_party/WebKit/Source/modules/notifications/Notification.cpp
@@ -96,16 +96,18 @@
 
   if (context->IsSecureContext()) {
     UseCounter::Count(context, UseCounter::kNotificationSecureOrigin);
-    if (context->IsDocument())
+    if (context->IsDocument()) {
       UseCounter::CountCrossOriginIframe(
           *ToDocument(context), UseCounter::kNotificationAPISecureOriginIframe);
+    }
   } else {
     Deprecation::CountDeprecation(context,
                                   UseCounter::kNotificationInsecureOrigin);
-    if (context->IsDocument())
+    if (context->IsDocument()) {
       Deprecation::CountDeprecationCrossOriginIframe(
           *ToDocument(context),
           UseCounter::kNotificationAPIInsecureOriginIframe);
+    }
   }
 
   WebNotificationData data =
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCIceCandidate.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCIceCandidate.cpp
index 733e2d57..caa1526 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCIceCandidate.cpp
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCIceCandidate.cpp
@@ -58,11 +58,12 @@
 
   // TODO(guidou): Change default value to -1. crbug.com/614958.
   unsigned short sdp_m_line_index = 0;
-  if (candidate_init.hasSdpMLineIndex())
+  if (candidate_init.hasSdpMLineIndex()) {
     sdp_m_line_index = candidate_init.sdpMLineIndex();
-  else
+  } else {
     UseCounter::Count(context,
                       UseCounter::kRTCIceCandidateDefaultSdpMLineIndex);
+  }
 
   return new RTCIceCandidate(WebRTCICECandidate(candidate_init.candidate(),
                                                 sdp_mid, sdp_m_line_index));
diff --git a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
index c7ab4f6..32f99046 100644
--- a/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
+++ b/third_party/WebKit/Source/modules/peerconnection/RTCPeerConnection.cpp
@@ -188,11 +188,12 @@
         candidate.getAsRTCIceCandidateInit();
     // TODO(guidou): Change default value to -1. crbug.com/614958.
     unsigned short sdp_m_line_index = 0;
-    if (ice_candidate_init.hasSdpMLineIndex())
+    if (ice_candidate_init.hasSdpMLineIndex()) {
       sdp_m_line_index = ice_candidate_init.sdpMLineIndex();
-    else
+    } else {
       UseCounter::Count(context,
                         UseCounter::kRTCIceCandidateDefaultSdpMLineIndex);
+    }
     return WebRTCICECandidate(ice_candidate_init.candidate(),
                               ice_candidate_init.sdpMid(), sdp_m_line_index);
   }
@@ -432,12 +433,13 @@
     const RTCConfiguration& rtc_configuration,
     const Dictionary& media_constraints,
     ExceptionState& exception_state) {
-  if (media_constraints.IsObject())
+  if (media_constraints.IsObject()) {
     UseCounter::Count(context,
                       UseCounter::kRTCPeerConnectionConstructorConstraints);
-  else
+  } else {
     UseCounter::Count(context,
                       UseCounter::kRTCPeerConnectionConstructorCompliant);
+  }
 
   WebRTCConfiguration configuration =
       ParseConfiguration(context, rtc_configuration, exception_state);
@@ -589,12 +591,13 @@
 
   if (offer_options) {
     if (offer_options->OfferToReceiveAudio() != -1 ||
-        offer_options->OfferToReceiveVideo() != -1)
+        offer_options->OfferToReceiveVideo() != -1) {
       UseCounter::Count(
           context, UseCounter::kRTCPeerConnectionCreateOfferLegacyOfferOptions);
-    else
+    } else {
       UseCounter::Count(
           context, UseCounter::kRTCPeerConnectionCreateOfferLegacyCompliant);
+    }
 
     peer_handler_->CreateOffer(request, WebRTCOfferOptions(offer_options));
   } else {
@@ -611,12 +614,13 @@
       return ScriptPromise::CastUndefined(script_state);
     }
 
-    if (!constraints.IsEmpty())
+    if (!constraints.IsEmpty()) {
       UseCounter::Count(
           context, UseCounter::kRTCPeerConnectionCreateOfferLegacyConstraints);
-    else
+    } else {
       UseCounter::Count(
           context, UseCounter::kRTCPeerConnectionCreateOfferLegacyCompliant);
+    }
 
     peer_handler_->CreateOffer(request, constraints);
   }
@@ -649,12 +653,13 @@
   ExecutionContext* context = ExecutionContext::From(script_state);
   UseCounter::Count(
       context, UseCounter::kRTCPeerConnectionCreateAnswerLegacyFailureCallback);
-  if (media_constraints.IsObject())
+  if (media_constraints.IsObject()) {
     UseCounter::Count(
         context, UseCounter::kRTCPeerConnectionCreateAnswerLegacyConstraints);
-  else
+  } else {
     UseCounter::Count(
         context, UseCounter::kRTCPeerConnectionCreateAnswerLegacyCompliant);
+  }
 
   if (CallErrorCallbackIfSignalingStateClosed(signaling_state_, error_callback))
     return ScriptPromise::CastUndefined(script_state);
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp
index 797d0fe..ec418b1c 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationAvailability.cpp
@@ -61,9 +61,10 @@
     RegisteredEventListener& registered_listener) {
   EventTargetWithInlineData::AddedEventListener(event_type,
                                                 registered_listener);
-  if (event_type == EventTypeNames::change)
+  if (event_type == EventTypeNames::change) {
     UseCounter::Count(GetExecutionContext(),
                       UseCounter::kPresentationAvailabilityChangeEventListener);
+  }
 }
 
 void PresentationAvailability::AvailabilityChanged(bool value) {
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
index cd5962ba..66fd5d2 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnection.cpp
@@ -225,19 +225,20 @@
     RegisteredEventListener& registered_listener) {
   EventTargetWithInlineData::AddedEventListener(event_type,
                                                 registered_listener);
-  if (event_type == EventTypeNames::connect)
+  if (event_type == EventTypeNames::connect) {
     UseCounter::Count(GetExecutionContext(),
                       UseCounter::kPresentationConnectionConnectEventListener);
-  else if (event_type == EventTypeNames::close)
+  } else if (event_type == EventTypeNames::close) {
     UseCounter::Count(GetExecutionContext(),
                       UseCounter::kPresentationConnectionCloseEventListener);
-  else if (event_type == EventTypeNames::terminate)
+  } else if (event_type == EventTypeNames::terminate) {
     UseCounter::Count(
         GetExecutionContext(),
         UseCounter::kPresentationConnectionTerminateEventListener);
-  else if (event_type == EventTypeNames::message)
+  } else if (event_type == EventTypeNames::message) {
     UseCounter::Count(GetExecutionContext(),
                       UseCounter::kPresentationConnectionMessageEventListener);
+  }
 }
 
 DEFINE_TRACE(PresentationConnection) {
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.cpp b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.cpp
index cee3ca5..ff37b724 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationConnectionList.cpp
@@ -29,10 +29,11 @@
     RegisteredEventListener& registered_listener) {
   EventTargetWithInlineData::AddedEventListener(event_type,
                                                 registered_listener);
-  if (event_type == EventTypeNames::connectionavailable)
+  if (event_type == EventTypeNames::connectionavailable) {
     UseCounter::Count(
         GetExecutionContext(),
         UseCounter::kPresentationRequestConnectionAvailableEventListener);
+  }
 }
 
 void PresentationConnectionList::AddConnection(
diff --git a/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp b/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp
index 8c02fd10..b8ea0651 100644
--- a/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp
+++ b/third_party/WebKit/Source/modules/presentation/PresentationRequest.cpp
@@ -100,10 +100,11 @@
     RegisteredEventListener& registered_listener) {
   EventTargetWithInlineData::AddedEventListener(event_type,
                                                 registered_listener);
-  if (event_type == EventTypeNames::connectionavailable)
+  if (event_type == EventTypeNames::connectionavailable) {
     UseCounter::Count(
         GetExecutionContext(),
         UseCounter::kPresentationRequestConnectionAvailableEventListener);
+  }
 }
 
 bool PresentationRequest::HasPendingActivity() const {
diff --git a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
index 1257bea..c1565e7 100644
--- a/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
+++ b/third_party/WebKit/Source/modules/serviceworkers/ServiceWorkerContainer.cpp
@@ -436,9 +436,10 @@
     return;
   controller_ = ServiceWorker::From(GetExecutionContext(),
                                     WTF::WrapUnique(handle.release()));
-  if (controller_)
+  if (controller_) {
     UseCounter::Count(GetExecutionContext(),
                       UseCounter::kServiceWorkerControlledPage);
+  }
   if (should_notify_controller_change)
     DispatchEvent(Event::Create(EventTypeNames::controllerchange));
 }
diff --git a/third_party/WebKit/Source/web/BUILD.gn b/third_party/WebKit/Source/web/BUILD.gn
index 758d62fe..94c5d94b 100644
--- a/third_party/WebKit/Source/web/BUILD.gn
+++ b/third_party/WebKit/Source/web/BUILD.gn
@@ -123,8 +123,6 @@
     "WebPepperSocketChannelClientProxy.h",
     "WebPepperSocketImpl.cpp",
     "WebPepperSocketImpl.h",
-    "WebPluginContainerImpl.cpp",
-    "WebPluginContainerImpl.h",
     "WebPluginDocument.cpp",
     "WebRemoteFrameImpl.cpp",
     "WebRemoteFrameImpl.h",
diff --git a/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp b/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp
index 344ac29..7750470 100644
--- a/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp
+++ b/third_party/WebKit/Source/web/LocalFrameClientImpl.cpp
@@ -43,6 +43,7 @@
 #include "core/events/UIEventWithKeyState.h"
 #include "core/exported/SharedWorkerRepositoryClientImpl.h"
 #include "core/exported/WebDataSourceImpl.h"
+#include "core/exported/WebPluginContainerImpl.h"
 #include "core/exported/WebViewBase.h"
 #include "core/frame/LocalFrameView.h"
 #include "core/frame/Settings.h"
@@ -107,7 +108,6 @@
 #include "v8/include/v8.h"
 #include "web/WebDevToolsAgentImpl.h"
 #include "web/WebDevToolsFrontendImpl.h"
-#include "web/WebPluginContainerImpl.h"
 
 namespace blink {
 
diff --git a/third_party/polymer/v1_0/find_unused_elements.py b/third_party/polymer/v1_0/find_unused_elements.py
index 5dbacdb..1097d80 100644
--- a/third_party/polymer/v1_0/find_unused_elements.py
+++ b/third_party/polymer/v1_0/find_unused_elements.py
@@ -11,7 +11,13 @@
 import os
 import re
 import subprocess
+import sys
 
+_HERE_PATH = os.path.dirname(__file__)
+_SRC_PATH = os.path.normpath(os.path.join(_HERE_PATH, '..', '..', '..'))
+sys.path.append(os.path.join(_SRC_PATH, 'third_party', 'node'))
+import node
+import node_modules
 
 class UnusedElementsDetector(object):
   """Finds unused Polymer elements."""
@@ -58,8 +64,7 @@
     text = re.sub('<if .*?>', '', text, flags=re.IGNORECASE)
     text = re.sub('</if>', '', text, flags=re.IGNORECASE)
 
-    proc = subprocess.Popen(['uglifyjs', filename], stdout=subprocess.PIPE)
-    return proc.stdout.read()
+    return node.RunNode([node_modules.PathToUglify(), filename])
 
   @staticmethod
   def __StripComments(filename):
@@ -133,11 +138,6 @@
           if not filename.endswith('.html') and not filename.endswith('.js'):
             continue
 
-          # Skip generated files that may include the element source.
-          if filename in ('crisper.js', 'vulcanized.html',
-                          'app.crisper.js', 'app.vulcanized.html'):
-            continue
-
           with open(os.path.join(dirpath, filename)) as f:
             text = f.read()
           if not re.search('/%s/' % element_dir, text):
diff --git a/third_party/polymer/v1_0/reproduce.sh b/third_party/polymer/v1_0/reproduce.sh
index 3781a057..247d1e87 100755
--- a/third_party/polymer/v1_0/reproduce.sh
+++ b/third_party/polymer/v1_0/reproduce.sh
@@ -21,7 +21,6 @@
 check_dep "which npm" "npm" "visiting https://nodejs.org/en/"
 check_dep "which bower" "bower" "npm install -g bower"
 check_dep "which crisper" "crisper" "npm install -g crisper"
-check_dep "which uglifyjs" "uglifyjs" "npm install -g uglifyjs"
 check_dep "which polymer-css-build" "polymer-css-build" \
     "npm install -g polymer-css-build"
 check_dep "which rsync" "rsync" "apt-get install rsync"
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index a26b56d..6cf91122 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -46,7 +46,7 @@
       'Android Cronet MIPS Builder': 'android_cronet_release_bot_minimal_symbols_mipsel',
       'Android Cronet x86 Builder': 'android_cronet_release_bot_minimal_symbols_x86',
       'Android Cronet x86 Builder (dbg)': 'android_cronet_debug_static_bot_x86',
-      'Android MIPS Builder (dbg)': 'android_debug_static_minimal_symbols_mipsel',
+      'Android MIPS Builder (dbg)': 'android_debug_static_bot_mipsel',
       'Android N5X Swarm Builder': 'android_release_bot_minimal_symbols_arm64',
       'Android arm Builder (dbg)': 'android_debug_static_bot',
       'Android arm64 Builder (dbg)': 'android_debug_static_bot_arm64',
@@ -813,8 +813,8 @@
       'android', 'debug_static_bot', 'x86',
     ],
 
-    'android_debug_static_minimal_symbols_mipsel': [
-      'android', 'debug', 'static', 'minimal_symbols', 'mipsel',
+    'android_debug_static_bot_mipsel': [
+      'android', 'debug_static_bot', 'minimal_symbols', 'mipsel',
     ],
 
     'android_debug_trybot_java_coverage': [
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 9c39fab..6dc8e948 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -93534,7 +93534,8 @@
       name="ResourceScheduler.ClientLoadedTime.Other.SwitchedToActive"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="ResourceSchedulerPeakDelayableRequestsInFlight">
+<histogram_suffixes name="ResourceSchedulerPeakDelayableRequestsInFlight"
+    separator=".">
   <suffix name="LayoutBlocking"
       label="Records the highest number of delayable requests that were
              in-flight at the same time when a layout blocking request was
@@ -93547,7 +93548,7 @@
   <affected-histogram name="ResourceScheduler.PeakDelayableRequestsInFlight"/>
 </histogram_suffixes>
 
-<histogram_suffixes name="ResourceSchedulerRequestsCount">
+<histogram_suffixes name="ResourceSchedulerRequestsCount" separator=".">
   <suffix name="All" label="All requests in-flight were counted."/>
   <suffix name="Delayable" label="Delayable requests in-flight were counted."/>
   <suffix name="NonDelayable"
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index 91b908b9..4239762 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -94,8 +94,6 @@
 smoothness.tough_webgl_ad_cases,skyostil@chromium.org,
 smoothness.tough_webgl_cases,"kbr@chromium.org, zmo@chromium.org",
 speedometer,"bmeurer@chromium.org, mvstanton@chromium.org",
-speedometer-classic,hablich@chromium.org,
-speedometer-turbo,hablich@chromium.org,
 start_with_ext.cold.blank_page,,
 start_with_ext.warm.blank_page,,
 start_with_url.cold.startup_pages,pasko@chromium.org,
@@ -126,23 +124,11 @@
 tracing.tracing_with_debug_overhead,"oysteine@chromium.org, nednguyen@chromium.org, zhenw@chromium.org",
 tracing_perftests,"kkraynov@chromium.org, primiano@chromium.org",
 v8.browsing_desktop,ulan@chromium.org,
-v8.browsing_desktop_classic,hablich@chromium.org,
-v8.browsing_desktop_turbo,mvstaton@chromium.org,
 v8.browsing_mobile,ulan@chromium.org,
-v8.browsing_mobile_classic,hablich@chromium.org,
-v8.browsing_mobile_turbo,mvstaton@chromium.org,
 v8.detached_context_age_in_gc,ulan@chromium.org,
-v8.infinite_scroll-classic_tbmv2,hablich@chromium.org,
-v8.infinite_scroll-turbo_tbmv2,mvstaton@chromium.org,
 v8.infinite_scroll_tbmv2,ulan@chromium.org,
-v8.mobile_infinite_scroll-classic_tbmv2,hablich@chromium.org,
-v8.mobile_infinite_scroll-turbo_tbmv2,mvstaton@chromium.org,
 v8.mobile_infinite_scroll_tbmv2,ulan@chromium.org,
 v8.runtime_stats.top_25,cbruni@chromium.org,
 v8.runtimestats.browsing_desktop,mythria@chromium.org,
-v8.runtimestats.browsing_desktop_classic,hablich@chromium.org,
-v8.runtimestats.browsing_desktop_turbo,mythria@chromium.org,
 v8.runtimestats.browsing_mobile,mythria@chromium.org,
-v8.runtimestats.browsing_mobile_classic,hablich@chromium.org,
-v8.runtimestats.browsing_mobile_turbo,mythria@chromium.org,
 webrtc,"qiangchen@chromium.org, ehmaldonado@chromium.org, phoglund@chromium.org",
diff --git a/tools/perf/benchmarks/speedometer.py b/tools/perf/benchmarks/speedometer.py
index ab0cb9af..cf325400 100644
--- a/tools/perf/benchmarks/speedometer.py
+++ b/tools/perf/benchmarks/speedometer.py
@@ -20,8 +20,6 @@
 
 from core import perf_benchmark
 
-from benchmarks import v8_helper
-
 from telemetry import benchmark
 from telemetry import page as page_module
 from telemetry.page import legacy_page_test
@@ -110,26 +108,3 @@
         make_javascript_deterministic=False,
         name='http://browserbench.org/Speedometer/'))
     return ps
-
-
-@benchmark.Owner(emails=['hablich@chromium.org'])
-@benchmark.Disabled('all')
-class SpeedometerTurbo(Speedometer):
-  def SetExtraBrowserOptions(self, options):
-    super(SpeedometerTurbo, self).SetExtraBrowserOptions(options)
-    v8_helper.EnableTurbo(options)
-
-  @classmethod
-  def Name(cls):
-    return 'speedometer-turbo'
-
-
-@benchmark.Owner(emails=['hablich@chromium.org'])
-class SpeedometerClassic(Speedometer):
-  def SetExtraBrowserOptions(self, options):
-    super(SpeedometerClassic, self).SetExtraBrowserOptions(options)
-    v8_helper.EnableClassic(options)
-
-  @classmethod
-  def Name(cls):
-    return 'speedometer-classic'
diff --git a/tools/perf/benchmarks/v8.py b/tools/perf/benchmarks/v8.py
index d8699282..490ad5a 100644
--- a/tools/perf/benchmarks/v8.py
+++ b/tools/perf/benchmarks/v8.py
@@ -97,35 +97,6 @@
   def Name(cls):
     return 'v8.infinite_scroll_tbmv2'
 
-@benchmark.Disabled('all')
-@benchmark.Disabled('android') # Android runs V8MobileInfiniteScroll.
-@benchmark.Owner(emails=['mvstaton@chromium.org'])
-class V8InfiniteScrollTurbo(V8InfiniteScroll):
-  """Measures V8 GC metrics using Ignition+TurboFan."""
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8InfiniteScrollTurbo, self).SetExtraBrowserOptions(options)
-    v8_helper.EnableTurbo(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.infinite_scroll-turbo_tbmv2'
-
-
-@benchmark.Disabled('linux')  # crbug.com/715716
-@benchmark.Disabled('android') # Android runs V8MobileInfiniteScroll.
-@benchmark.Owner(emails=['hablich@chromium.org'])
-class V8InfiniteScrollClassic(V8InfiniteScroll):
-  """Measures V8 GC metrics using the Classic pipeline."""
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8InfiniteScrollClassic, self).SetExtraBrowserOptions(options)
-    v8_helper.EnableClassic(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.infinite_scroll-classic_tbmv2'
-
 
 @benchmark.Enabled('android')
 @benchmark.Owner(emails=['ulan@chromium.org'])
@@ -141,38 +112,6 @@
     return 'v8.mobile_infinite_scroll_tbmv2'
 
 
-@benchmark.Disabled('all') # was enabled only on android
-@benchmark.Owner(emails=['mvstaton@chromium.org'])
-class V8MobileInfiniteScrollTurbo(V8MobileInfiniteScroll):
-  """Measures V8 GC metrics and memory usage while scrolling the top mobile
-  web pages and running Ignition+TurboFan.
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks"""
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8MobileInfiniteScrollTurbo, self).SetExtraBrowserOptions(options)
-    v8_helper.EnableTurbo(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.mobile_infinite_scroll-turbo_tbmv2'
-
-
-@benchmark.Enabled('android')
-@benchmark.Owner(emails=['hablich@chromium.org'])
-class V8MobileInfiniteScrollClassic(V8MobileInfiniteScroll):
-  """Measures V8 GC metrics and memory usage while scrolling the top mobile
-  web pages and running the Classic pipeline.
-  http://www.chromium.org/developers/design-documents/rendering-benchmarks"""
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8MobileInfiniteScrollClassic, self).SetExtraBrowserOptions(options)
-    v8_helper.EnableClassic(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.mobile_infinite_scroll-classic_tbmv2'
-
-
 class _Top25RuntimeStats(perf_benchmark.PerfBenchmark):
   options = {'pageset_repeat': 3}
 
diff --git a/tools/perf/benchmarks/v8_browsing.py b/tools/perf/benchmarks/v8_browsing.py
index 1975580..40fd920 100644
--- a/tools/perf/benchmarks/v8_browsing.py
+++ b/tools/perf/benchmarks/v8_browsing.py
@@ -4,7 +4,6 @@
 
 import re
 
-from benchmarks import v8_helper
 from core import perf_benchmark
 from telemetry import benchmark
 from telemetry.timeline import chrome_trace_config
@@ -167,69 +166,6 @@
 
 
 @benchmark.Disabled('android')
-@benchmark.Disabled('all')
-@benchmark.Owner(emails=['mvstaton@chromium.org'])
-class V8DesktopTurboBrowsingBenchmark(_V8BrowsingBenchmark):
-  PLATFORM = 'desktop'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8DesktopTurboBrowsingBenchmark, self).SetExtraBrowserOptions(
-        options)
-    v8_helper.EnableTurbo(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.browsing_desktop_turbo'
-
-
-
-@benchmark.Enabled('android')
-@benchmark.Disabled('all')
-@benchmark.Owner(emails=['mvstaton@chromium.org'])
-class V8MobileTurboBrowsingBenchmark(_V8BrowsingBenchmark):
-  PLATFORM = 'mobile'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8MobileTurboBrowsingBenchmark, self).SetExtraBrowserOptions(
-        options)
-    v8_helper.EnableTurbo(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.browsing_mobile_turbo'
-
-
-@benchmark.Disabled('android')
-@benchmark.Owner(emails=['hablich@chromium.org'])
-class V8DesktopClassicBrowsingBenchmark(_V8BrowsingBenchmark):
-  PLATFORM = 'desktop'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8DesktopClassicBrowsingBenchmark, self).SetExtraBrowserOptions(
-        options)
-    v8_helper.EnableClassic(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.browsing_desktop_classic'
-
-
-@benchmark.Enabled('android')
-@benchmark.Owner(emails=['hablich@chromium.org'])
-class V8MobileClassicBrowsingBenchmark(_V8BrowsingBenchmark):
-  PLATFORM = 'mobile'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8MobileClassicBrowsingBenchmark, self).SetExtraBrowserOptions(
-        options)
-    v8_helper.EnableClassic(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.browsing_mobile_classic'
-
-
-@benchmark.Disabled('android')
 @benchmark.Owner(emails=['mythria@chromium.org'])
 class V8RuntimeStatsDesktopBrowsingBenchmark(
     _V8RuntimeStatsBrowsingBenchmark):
@@ -240,39 +176,6 @@
     return 'v8.runtimestats.browsing_desktop'
 
 
-@benchmark.Disabled('android')
-@benchmark.Disabled('all')
-@benchmark.Owner(emails=['mythria@chromium.org'])
-class V8RuntimeStatsDesktopTurboBrowsingBenchmark(
-    _V8RuntimeStatsBrowsingBenchmark):
-  PLATFORM = 'desktop'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8RuntimeStatsDesktopTurboBrowsingBenchmark,
-        self).SetExtraBrowserOptions(options)
-    v8_helper.EnableTurbo(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.runtimestats.browsing_desktop_turbo'
-
-
-@benchmark.Disabled('android')
-@benchmark.Owner(emails=['hablich@chromium.org'])
-class V8RuntimeStatsDesktopClassicBrowsingBenchmark(
-    _V8RuntimeStatsBrowsingBenchmark):
-  PLATFORM = 'desktop'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8RuntimeStatsDesktopClassicBrowsingBenchmark,
-        self).SetExtraBrowserOptions(options)
-    v8_helper.EnableClassic(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.runtimestats.browsing_desktop_classic'
-
-
 @benchmark.Enabled('android')
 @benchmark.Owner(emails=['mythria@chromium.org'])
 class V8RuntimeStatsMobileBrowsingBenchmark(
@@ -282,36 +185,3 @@
   @classmethod
   def Name(cls):
     return 'v8.runtimestats.browsing_mobile'
-
-
-@benchmark.Enabled('android')
-@benchmark.Disabled('all')
-@benchmark.Owner(emails=['mythria@chromium.org'])
-class V8RuntimeStatsMobileTurboBrowsingBenchmark(
-    _V8RuntimeStatsBrowsingBenchmark):
-  PLATFORM = 'mobile'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8RuntimeStatsMobileTurboBrowsingBenchmark,
-        self).SetExtraBrowserOptions(options)
-    v8_helper.EnableTurbo(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.runtimestats.browsing_mobile_turbo'
-
-
-@benchmark.Enabled('android')
-@benchmark.Owner(emails=['hablich@chromium.org'])
-class V8RuntimeStatsMobileClassicBrowsingBenchmark(
-    _V8RuntimeStatsBrowsingBenchmark):
-  PLATFORM = 'mobile'
-
-  def SetExtraBrowserOptions(self, options):
-    super(V8RuntimeStatsMobileClassicBrowsingBenchmark,
-        self).SetExtraBrowserOptions(options)
-    v8_helper.EnableClassic(options)
-
-  @classmethod
-  def Name(cls):
-    return 'v8.runtimestats.browsing_mobile_classic'
diff --git a/tools/perf/benchmarks/v8_helper.py b/tools/perf/benchmarks/v8_helper.py
index c2eccf55..065e8dd 100644
--- a/tools/perf/benchmarks/v8_helper.py
+++ b/tools/perf/benchmarks/v8_helper.py
@@ -4,15 +4,6 @@
 
 _JS_FLAGS_SWITCH = '--js-flags='
 
-
-def EnableTurbo(options):
-  AppendJSFlags(options, '--turbo')
-
-
-def EnableClassic(options):
-  AppendJSFlags(options, '--no-turbo')
-
-
 def AppendJSFlags(options, js_flags):
   existing_js_flags = ''
   # There should be only one occurence of --js-flags in the browser flags. When
diff --git a/tools/perf/page_sets/indexeddb_endure_page.py b/tools/perf/page_sets/indexeddb_endure_page.py
index 80feb6e..7f100ba 100644
--- a/tools/perf/page_sets/indexeddb_endure_page.py
+++ b/tools/perf/page_sets/indexeddb_endure_page.py
@@ -29,7 +29,7 @@
   """
 
   def __init__(self):
-    super(IndexedDBEndurePageSet, self).__init__()
+    super(IndexedDBEndurePageSet, self).__init__(verify_names=True)
     tests = [
       'testCreateAndDeleteDatabases',
       'testCreateAndDeleteDatabase',
diff --git a/tools/perf/page_sets/tough_scheduling_cases.py b/tools/perf/page_sets/tough_scheduling_cases.py
index 1a817a1..b7b6edba 100644
--- a/tools/perf/page_sets/tough_scheduling_cases.py
+++ b/tools/perf/page_sets/tough_scheduling_cases.py
@@ -11,7 +11,8 @@
   def __init__(self, url, page_set):
     super(ToughSchedulingCasesPage, self).__init__(
         url=url, page_set=page_set, credentials_path='data/credentials.json',
-        shared_page_state_class=shared_page_state.SharedMobilePageState)
+        shared_page_state_class=shared_page_state.SharedMobilePageState,
+        name=url.split('/')[-1])
     self.archive_data_file = 'data/tough_scheduling_cases.json'
 
   def RunPageInteractions(self, action_runner):
@@ -396,7 +397,8 @@
   def __init__(self):
     super(ToughSchedulingCasesPageSet, self).__init__(
         archive_data_file='data/tough_scheduling_cases.json',
-        cloud_storage_bucket=story.INTERNAL_BUCKET)
+        cloud_storage_bucket=story.INTERNAL_BUCKET,
+        verify_names=True)
 
     # Why: Simple scrolling baseline
     self.AddStory(ToughSchedulingCasesPage(
diff --git a/ui/login/account_picker/md_user_pod_row.css b/ui/login/account_picker/md_user_pod_row.css
index dd0fb65e..23c3764b 100644
--- a/ui/login/account_picker/md_user_pod_row.css
+++ b/ui/login/account_picker/md_user_pod_row.css
@@ -637,7 +637,7 @@
   display: flex;
   flex-direction: column;
   font-size: 13px;
-  margin: 3px 0 0 12px;
+  margin: 10px 0 0 12px;
   width: 220px;
 }
 
diff --git a/ui/login/account_picker/md_user_pod_row.js b/ui/login/account_picker/md_user_pod_row.js
index e637754..6338b8ab 100644
--- a/ui/login/account_picker/md_user_pod_row.js
+++ b/ui/login/account_picker/md_user_pod_row.js
@@ -3866,9 +3866,8 @@
         // elements outside the pod.
         var actionBoxMenu = pod.querySelector('.action-box-menu');
         var actionBoxButton = pod.querySelector('.action-box-button');
-        var MENU_TOP_PADDING = 7;
         actionBoxMenu.style.top =
-            cr.ui.toCssPx(actionBoxButton.offsetHeight + MENU_TOP_PADDING);
+            cr.ui.toCssPx(actionBoxButton.offsetHeight);
         if (this.isPortraitMode_() && pods.length > 1) {
           // Confine the menu inside the pod when it may overlap with outside
           // elements.
@@ -3986,6 +3985,7 @@
       var banner = $('signin-banner');
       banner.textContent = message;
       banner.classList.toggle('message-set', !!message);
+      $('signin-banner-container1').hidden = banner.textContent.length == 0;
     },
 
     /**
diff --git a/ui/login/account_picker/md_user_pod_template.css b/ui/login/account_picker/md_user_pod_template.css
index a3367fe..7b5d8f18 100644
--- a/ui/login/account_picker/md_user_pod_template.css
+++ b/ui/login/account_picker/md_user_pod_template.css
@@ -11,4 +11,5 @@
   margin: 0;
   padding: 0;
   text-transform: none;
+  z-index: 6;
 }
diff --git a/ui/resources/BUILD.gn b/ui/resources/BUILD.gn
index 633cc31..0feee31 100644
--- a/ui/resources/BUILD.gn
+++ b/ui/resources/BUILD.gn
@@ -41,6 +41,13 @@
     "grit/webui_resources_map.h",
     "webui_resources.pak",
   ]
+  grit_flags = [
+    "-E",
+    "root_gen_dir=" + rebase_path(root_gen_dir, root_build_dir),
+  ]
+  deps = [
+    "//mojo/public/js:bindings",
+  ]
 }
 
 if (!is_mac) {
diff --git a/ui/webui/resources/webui_resources.grd b/ui/webui/resources/webui_resources.grd
index 1e03c2e..346e256e 100644
--- a/ui/webui/resources/webui_resources.grd
+++ b/ui/webui/resources/webui_resources.grd
@@ -16,6 +16,9 @@
       <include name="IDR_WEBUI_I18N_TEMPLATE_JS" file="js/i18n_template.js" flattenhtml="true" type="BINDATA" />
       <include name="IDR_WEBUI_JSTEMPLATE_JS" file="js/jstemplate_compiled.js" flattenhtml="true" type="BINDATA" />
       <include name="IDR_WEBUI_ANALYTICS_JS" file="js/analytics.js" flattenhtml="true" type="BINDATA" />
+      <include name="IDR_WEBUI_MOJO_BINDINGS_JS"
+               file="${root_gen_dir}\mojo\public\js\mojo_bindings.js"
+               flattenhtml="true" type="BINDATA" use_base_dir="false" />
       <!-- Roboto Font. Roboto-Regular and Roboto-Light is already available on
            Android, and Roboto-Medium is not used on Android. All 6 weights of
            Roboto are available on Chrome OS.-->