diff --git a/AUTHORS b/AUTHORS
index dc45a9a..56667bc 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -82,6 +82,7 @@
 Arunoday Sarkar <a.sarkar.arun@gmail.com>
 Arunprasad Rajkumar <ararunprasad@gmail.com>
 Arunprasad Rajkumar <arurajku@cisco.com>
+Ashish Kumar Gupta <guptaag@amazon.com>
 Ashlin Joseph <ashlin.j@samsung.com>
 Attila Dusnoki <dati91@gmail.com>
 Avinaash Doreswamy <avi.nitk@samsung.com>
diff --git a/DEPS b/DEPS
index c775ff2..b03f286 100644
--- a/DEPS
+++ b/DEPS
@@ -40,7 +40,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '651cbe9af67b49c5a3ad3788c3a50a003827a8e2',
+  'skia_revision': 'ae9718f1d40556ed5a49e616dbe54087f4d0d546',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # 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': '9a785afee976e60fa2bd3d462cdcb1c3636d97dd',
+  'pdfium_revision': '9a8a965829be736e3d7b0f20f6b1ef21d9af1b6e',
   # 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': 'f94a852c0a3fbd1ebcbbb46889c83a217ca28b12',
+  'catapult_revision': '9b8584120201e28d95740d0777e4f657b2139ff8',
   # 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/common/shelf/shelf_button.cc b/ash/common/shelf/shelf_button.cc
index b39fa9c2..d5d32ff7 100644
--- a/ash/common/shelf/shelf_button.cc
+++ b/ash/common/shelf/shelf_button.cc
@@ -32,7 +32,7 @@
 const int kIconSize = 32;
 const int kAttentionThrobDurationMS = 800;
 const int kMaxAnimationSeconds = 10;
-const int kIndicatorOffsetFromBottom = 2;
+const int kIndicatorOffsetFromBottom = 3;
 const int kIndicatorRadiusDip = 2;
 const SkColor kIndicatorColor = SK_ColorWHITE;
 
@@ -146,11 +146,23 @@
 
     DCHECK_EQ(width(), height());
     DCHECK_EQ(kIndicatorRadiusDip, width() / 2);
+    const float dsf = canvas->UndoDeviceScaleFactor();
+    const int kStrokeWidthPx = 1;
+    gfx::PointF center = gfx::RectF(GetLocalBounds()).CenterPoint();
+    center.Scale(dsf);
+
+    // Fill the center.
     cc::PaintFlags flags;
     flags.setColor(kIndicatorColor);
     flags.setFlags(cc::PaintFlags::kAntiAlias_Flag);
-    canvas->DrawCircle(gfx::Point(width() / 2, height() / 2),
-                       kIndicatorRadiusDip, flags);
+    canvas->DrawCircle(center, dsf * kIndicatorRadiusDip - kStrokeWidthPx,
+                       flags);
+
+    // Stroke the border.
+    flags.setColor(SkColorSetA(SK_ColorBLACK, 0x4D));
+    flags.setStyle(SkPaint::kStroke_Style);
+    canvas->DrawCircle(
+        center, dsf * kIndicatorRadiusDip - kStrokeWidthPx / 2.0f, flags);
   }
 
   // ShelfButtonAnimation::Observer
diff --git a/build/sample_arg_file.gn b/build/sample_arg_file.gn
new file mode 100644
index 0000000..91e9045
--- /dev/null
+++ b/build/sample_arg_file.gn
@@ -0,0 +1,6 @@
+# Build arguments go here. Here are some of the most commonly set ones.
+# Run `gn args <out_dir> --list` for the full list.
+#   is_component_build = true
+#   is_debug = true
+#   symbol_level = 2
+#   use_goma = false
diff --git a/cc/ipc/cc_param_traits_macros.h b/cc/ipc/cc_param_traits_macros.h
index 42e97e4..b740e66 100644
--- a/cc/ipc/cc_param_traits_macros.h
+++ b/cc/ipc/cc_param_traits_macros.h
@@ -197,7 +197,6 @@
   IPC_STRUCT_TRAITS_MEMBER(selection)
   IPC_STRUCT_TRAITS_MEMBER(latency_info)
   IPC_STRUCT_TRAITS_MEMBER(referenced_surfaces)
-  IPC_STRUCT_TRAITS_MEMBER(content_source_id)
 IPC_STRUCT_TRAITS_END()
 
 #endif  // CC_IPC_CC_PARAM_TRAITS_MACROS_H_
diff --git a/cc/ipc/compositor_frame_metadata.mojom b/cc/ipc/compositor_frame_metadata.mojom
index 74deb837..2634925 100644
--- a/cc/ipc/compositor_frame_metadata.mojom
+++ b/cc/ipc/compositor_frame_metadata.mojom
@@ -31,5 +31,4 @@
   array<ui.mojom.LatencyInfo> latency_info;
   array<SurfaceId> referenced_surfaces;
   bool can_activate_before_dependencies;
-  uint32 content_source_id;
 };
diff --git a/cc/ipc/compositor_frame_metadata_struct_traits.cc b/cc/ipc/compositor_frame_metadata_struct_traits.cc
index cdef417..e64f6727 100644
--- a/cc/ipc/compositor_frame_metadata_struct_traits.cc
+++ b/cc/ipc/compositor_frame_metadata_struct_traits.cc
@@ -36,7 +36,6 @@
   out->top_controls_shown_ratio = data.top_controls_shown_ratio();
   out->bottom_controls_height = data.bottom_controls_height();
   out->bottom_controls_shown_ratio = data.bottom_controls_shown_ratio();
-  out->content_source_id = data.content_source_id();
 
   out->root_background_color = data.root_background_color();
   out->can_activate_before_dependencies =
diff --git a/cc/ipc/compositor_frame_metadata_struct_traits.h b/cc/ipc/compositor_frame_metadata_struct_traits.h
index c58ba45b..381edb3 100644
--- a/cc/ipc/compositor_frame_metadata_struct_traits.h
+++ b/cc/ipc/compositor_frame_metadata_struct_traits.h
@@ -111,11 +111,6 @@
     return metadata.can_activate_before_dependencies;
   }
 
-  static uint32_t content_source_id(
-      const cc::CompositorFrameMetadata& metadata) {
-    return metadata.content_source_id;
-  }
-
   static bool Read(cc::mojom::CompositorFrameMetadataDataView data,
                    cc::CompositorFrameMetadata* out);
 };
diff --git a/cc/ipc/struct_traits_unittest.cc b/cc/ipc/struct_traits_unittest.cc
index 5647cb51..8088ac9 100644
--- a/cc/ipc/struct_traits_unittest.cc
+++ b/cc/ipc/struct_traits_unittest.cc
@@ -240,7 +240,6 @@
   const gfx::Vector2dF root_scroll_offset(1234.5f, 6789.1f);
   const float page_scale_factor = 1337.5f;
   const gfx::SizeF scrollable_viewport_size(1337.7f, 1234.5f);
-  const uint32_t content_source_id = 3;
 
   CompositorFrame input;
   input.metadata.device_scale_factor = device_scale_factor;
@@ -249,7 +248,6 @@
   input.metadata.scrollable_viewport_size = scrollable_viewport_size;
   input.render_pass_list.push_back(std::move(render_pass));
   input.resource_list.push_back(resource);
-  input.metadata.content_source_id = content_source_id;
 
   mojom::TraitsTestServicePtr proxy = GetTraitsTestProxy();
   CompositorFrame output;
@@ -259,7 +257,6 @@
   EXPECT_EQ(root_scroll_offset, output.metadata.root_scroll_offset);
   EXPECT_EQ(page_scale_factor, output.metadata.page_scale_factor);
   EXPECT_EQ(scrollable_viewport_size, output.metadata.scrollable_viewport_size);
-  EXPECT_EQ(content_source_id, output.metadata.content_source_id);
 
   ASSERT_EQ(1u, output.resource_list.size());
   TransferableResource out_resource = output.resource_list[0];
diff --git a/cc/output/compositor_frame_metadata.h b/cc/output/compositor_frame_metadata.h
index 59023b43..e383e50 100644
--- a/cc/output/compositor_frame_metadata.h
+++ b/cc/output/compositor_frame_metadata.h
@@ -82,12 +82,6 @@
   // dependencies have been resolved.
   bool can_activate_before_dependencies = true;
 
-  // This is a value that allows the browser to associate compositor frames
-  // with the content that they represent -- typically top-level page loads.
-  // TODO(kenrb, fsamuel): This should eventually by SurfaceID, when they
-  // become available in all renderer processes. See https://crbug.com/695579.
-  uint32_t content_source_id;
-
  private:
   CompositorFrameMetadata(const CompositorFrameMetadata& other);
   CompositorFrameMetadata operator=(const CompositorFrameMetadata&) = delete;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc
index 942d593..4ad7918 100644
--- a/cc/trees/layer_tree_host.cc
+++ b/cc/trees/layer_tree_host.cc
@@ -104,7 +104,6 @@
       debug_state_(settings_.initial_debug_state),
       id_(s_layer_tree_host_sequence_number.GetNext() + 1),
       task_graph_runner_(params->task_graph_runner),
-      content_source_id_(0),
       event_listener_properties_(),
       mutator_host_(params->mutator_host) {
   DCHECK(task_graph_runner_);
@@ -973,13 +972,6 @@
       this, [](Layer* layer) { layer->SetNeedsDisplay(); });
 }
 
-void LayerTreeHost::SetContentSourceId(uint32_t id) {
-  if (content_source_id_ == id)
-    return;
-  content_source_id_ = id;
-  SetNeedsCommit();
-}
-
 void LayerTreeHost::RegisterLayer(Layer* layer) {
   DCHECK(!LayerById(layer->id()));
   DCHECK(!in_paint_layer_contents_);
@@ -1150,8 +1142,6 @@
 
   tree_impl->SetDeviceColorSpace(device_color_space_);
 
-  tree_impl->set_content_source_id(content_source_id_);
-
   if (pending_page_scale_animation_) {
     tree_impl->SetPendingPageScaleAnimation(
         std::move(pending_page_scale_animation_));
diff --git a/cc/trees/layer_tree_host.h b/cc/trees/layer_tree_host.h
index 9a5deabf..809ffb6 100644
--- a/cc/trees/layer_tree_host.h
+++ b/cc/trees/layer_tree_host.h
@@ -309,9 +309,6 @@
     return painted_device_scale_factor_;
   }
 
-  void SetContentSourceId(uint32_t);
-  uint32_t content_source_id() const { return content_source_id_; }
-
   void SetDeviceColorSpace(const gfx::ColorSpace& device_color_space);
   const gfx::ColorSpace& device_color_space() const {
     return device_color_space_;
@@ -573,8 +570,6 @@
   float max_page_scale_factor_ = 1.f;
   gfx::ColorSpace device_color_space_;
 
-  uint32_t content_source_id_;
-
   SkColor background_color_ = SK_ColorWHITE;
   bool has_transparent_background_ = false;
 
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
index 15d72e6e..26208cb4 100644
--- a/cc/trees/layer_tree_host_impl.cc
+++ b/cc/trees/layer_tree_host_impl.cc
@@ -1581,7 +1581,6 @@
   metadata.bottom_controls_shown_ratio =
       browser_controls_offset_manager_->BottomControlsShownRatio();
   metadata.root_background_color = active_tree_->background_color();
-  metadata.content_source_id = active_tree_->content_source_id();
 
   active_tree_->GetViewportSelection(&metadata.selection);
 
diff --git a/cc/trees/layer_tree_host_unittest.cc b/cc/trees/layer_tree_host_unittest.cc
index 1f2059cb..eaf3c475 100644
--- a/cc/trees/layer_tree_host_unittest.cc
+++ b/cc/trees/layer_tree_host_unittest.cc
@@ -7010,32 +7010,5 @@
 
 SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestSubmitFrameResources);
 
-// Ensure that content_source_id is propagated to the frame's metadata.
-class LayerTreeHostTestContentSourceId : public LayerTreeHostTest {
- protected:
-  void BeginTest() override {
-    layer_tree_host()->SetContentSourceId(5);
-    PostSetNeedsCommitToMainThread();
-  }
-
-  DrawResult PrepareToDrawOnThread(LayerTreeHostImpl* host_impl,
-                                   LayerTreeHostImpl::FrameData* frame_data,
-                                   DrawResult draw_result) override {
-    EXPECT_EQ(DRAW_SUCCESS, draw_result);
-    EXPECT_EQ(5U, host_impl->active_tree()->content_source_id());
-    return draw_result;
-  }
-
-  void DisplayReceivedCompositorFrameOnThread(
-      const CompositorFrame& frame) override {
-    EXPECT_EQ(5U, frame.metadata.content_source_id);
-    EndTest();
-  }
-
-  void AfterTest() override {}
-};
-
-SINGLE_AND_MULTI_THREAD_TEST_F(LayerTreeHostTestContentSourceId);
-
 }  // namespace
 }  // namespace cc
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc
index fa6f8add..6dd6aff 100644
--- a/cc/trees/layer_tree_impl.cc
+++ b/cc/trees/layer_tree_impl.cc
@@ -73,7 +73,6 @@
       max_page_scale_factor_(0),
       device_scale_factor_(1.f),
       painted_device_scale_factor_(1.f),
-      content_source_id_(0),
       elastic_overscroll_(elastic_overscroll),
       layers_(new OwnedLayerImplList),
       viewport_size_invalid_(false),
@@ -488,8 +487,6 @@
   target_tree->SetDeviceColorSpace(device_color_space_);
   target_tree->elastic_overscroll()->PushPendingToActive();
 
-  target_tree->set_content_source_id(content_source_id());
-
   target_tree->pending_page_scale_animation_ =
       std::move(pending_page_scale_animation_);
 
diff --git a/cc/trees/layer_tree_impl.h b/cc/trees/layer_tree_impl.h
index 02c6e99..09cd850f 100644
--- a/cc/trees/layer_tree_impl.h
+++ b/cc/trees/layer_tree_impl.h
@@ -229,9 +229,6 @@
     return painted_device_scale_factor_;
   }
 
-  void set_content_source_id(uint32_t id) { content_source_id_ = id; }
-  uint32_t content_source_id() { return content_source_id_; }
-
   void SetDeviceColorSpace(const gfx::ColorSpace& device_color_space);
   const gfx::ColorSpace& device_color_space() const {
     return device_color_space_;
@@ -498,8 +495,6 @@
   float painted_device_scale_factor_;
   gfx::ColorSpace device_color_space_;
 
-  uint32_t content_source_id_;
-
   scoped_refptr<SyncedElasticOverscroll> elastic_overscroll_;
 
   std::unique_ptr<OwnedLayerImplList> layers_;
diff --git a/chrome/VERSION b/chrome/VERSION
index ed06da4..31ec48a2 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=59
 MINOR=0
-BUILD=3030
+BUILD=3031
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
index 29ce08ba..a51f908 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -44,6 +44,7 @@
 import org.chromium.chrome.browser.init.EmptyBrowserParts;
 import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
 import org.chromium.chrome.browser.notifications.NotificationConstants;
+import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 import org.chromium.chrome.browser.offlinepages.downloads.OfflinePageDownloadBridge;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.util.IntentUtils;
@@ -552,11 +553,9 @@
                 mContext.getResources().getString(R.string.download_notification_cancel_button),
                 buildPendingIntent(cancelIntent, notificationId));
 
-        updateNotification(notificationId, builder.build());
-
         int itemType = isOfflinePage ? DownloadSharedPreferenceEntry.ITEM_TYPE_OFFLINE_PAGE
                                      : DownloadSharedPreferenceEntry.ITEM_TYPE_DOWNLOAD;
-        mDownloadSharedPreferenceHelper.addOrReplaceSharedPreferenceEntry(
+        updateNotification(notificationId, builder.build(), downloadGuid, isOfflinePage,
                 new DownloadSharedPreferenceEntry(notificationId, isOffTheRecord,
                         canDownloadWhileMetered, downloadGuid, fileName, itemType, true));
         startTrackingInProgressDownload(downloadGuid);
@@ -599,7 +598,7 @@
                 mDownloadSharedPreferenceHelper.getDownloadSharedPreferenceEntry(downloadGuid);
         if (entry == null) return;
         if (!isResumable) {
-            notifyDownloadFailed(downloadGuid, entry.fileName);
+            notifyDownloadFailed(entry.isOfflinePage(), downloadGuid, entry.fileName);
             return;
         }
         // If download is already paused, do nothing.
@@ -640,11 +639,9 @@
         dismissIntent.putExtra(EXTRA_NOTIFICATION_DISMISSED, true);
         builder.setDeleteIntent(buildPendingIntent(dismissIntent, entry.notificationId));
 
-        updateNotification(entry.notificationId, builder.build());
-        // Update the SharedPreference entry with the new isAutoResumable value.
-        mDownloadSharedPreferenceHelper.addOrReplaceSharedPreferenceEntry(
-                new DownloadSharedPreferenceEntry(
-                        entry.notificationId, entry.isOffTheRecord,
+        updateNotification(entry.notificationId, builder.build(), downloadGuid,
+                entry.isOfflinePage(),
+                new DownloadSharedPreferenceEntry(entry.notificationId, entry.isOffTheRecord,
                         entry.canDownloadWhileMetered, entry.downloadGuid, entry.fileName,
                         entry.itemType, isAutoResumable));
         stopTrackingInProgressDownload(downloadGuid);
@@ -689,19 +686,19 @@
             mDownloadSuccessLargeIcon = getLargeNotificationIcon(bitmap);
         }
         builder.setLargeIcon(mDownloadSuccessLargeIcon);
-        updateNotification(notificationId, builder.build());
-        mDownloadSharedPreferenceHelper.removeSharedPreferenceEntry(downloadGuid);
+        updateNotification(notificationId, builder.build(), downloadGuid, isOfflinePage, null);
         stopTrackingInProgressDownload(downloadGuid);
         return notificationId;
     }
 
     /**
      * Add a download failed notification.
+     * @param isOfflinePage Whether or not the download was for an offline page.
      * @param downloadGuid GUID of the download.
      * @param fileName GUID of the download.
      */
     @VisibleForTesting
-    public void notifyDownloadFailed(String downloadGuid, String fileName) {
+    public void notifyDownloadFailed(boolean isOfflinePage, String downloadGuid, String fileName) {
         // If the download is not in history db, fileName could be empty. Get it from
         // SharedPreferences.
         if (TextUtils.isEmpty(fileName)) {
@@ -715,8 +712,7 @@
         ChromeNotificationBuilder builder =
                 buildNotification(android.R.drawable.stat_sys_download_done, fileName,
                         mContext.getResources().getString(R.string.download_notification_failed));
-        updateNotification(notificationId, builder.build());
-        mDownloadSharedPreferenceHelper.removeSharedPreferenceEntry(downloadGuid);
+        updateNotification(notificationId, builder.build(), downloadGuid, isOfflinePage, null);
         stopTrackingInProgressDownload(downloadGuid);
     }
 
@@ -964,17 +960,33 @@
         }
         return DownloadManagerService.getDownloadManagerService(getApplicationContext());
     }
-
-    /**
-     * Update the notification with id.
-     * @param id Id of the notification that has to be updated.
-     * @param notification the notification object that needs to be updated.
-     */
     @VisibleForTesting
     void updateNotification(int id, Notification notification) {
         mNotificationManager.notify(NOTIFICATION_NAMESPACE, id, notification);
     }
 
+    private void updateNotification(int id, Notification notification, String downloadGuid,
+            boolean isOfflinePage, DownloadSharedPreferenceEntry entry) {
+        updateNotification(id, notification);
+        trackNotificationUma(isOfflinePage, downloadGuid);
+
+        if (entry != null) {
+            mDownloadSharedPreferenceHelper.addOrReplaceSharedPreferenceEntry(entry);
+        } else {
+            mDownloadSharedPreferenceHelper.removeSharedPreferenceEntry(downloadGuid);
+        }
+    }
+
+    private void trackNotificationUma(boolean isOfflinePage, String downloadGuid) {
+        // Check if we already have an entry in the DownloadSharedPreferenceHelper.  This is a
+        // reasonable indicator for whether or not a notification is already showing (or at least if
+        // we had built one for this download before.
+        if (mDownloadSharedPreferenceHelper.hasEntry(downloadGuid)) return;
+        NotificationUmaTracker.getInstance().onNotificationShown(isOfflinePage
+                        ? NotificationUmaTracker.DOWNLOAD_PAGES
+                        : NotificationUmaTracker.DOWNLOAD_FILES);
+    }
+
     /**
      * Checks if an intent requires operations on a download.
      * @param intent An intent to validate.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java
index 0f5bc9d..fa156a5 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java
@@ -53,6 +53,15 @@
     }
 
     /**
+     * Helper method to make querying whether or not an entry exists for {@code guid} easier.
+     * @param guid The guid that represents the download entry.
+     * @return Whether or not that entry currently has metadata.
+     */
+    public boolean hasEntry(String guid) {
+        return getDownloadSharedPreferenceEntry(guid) != null;
+    }
+
+    /**
      * Adds a DownloadSharedPreferenceEntry to SharedPrefs. If an entry with the GUID already exists
      * in SharedPrefs, update it if it has changed.
      * @param pendingEntry A DownloadSharedPreferenceEntry to be added.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
index 7e5d29ab..c27a782 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/download/SystemDownloadNotifier.java
@@ -286,7 +286,8 @@
                 onSuccessNotificationShown(notificationInfo, notificationId);
                 break;
             case DOWNLOAD_NOTIFICATION_TYPE_FAILURE:
-                mBoundService.notifyDownloadFailed(info.getDownloadGuid(), info.getFileName());
+                mBoundService.notifyDownloadFailed(
+                        info.isOfflinePage(), info.getDownloadGuid(), info.getFileName());
                 break;
             case DOWNLOAD_NOTIFICATION_TYPE_CANCEL:
                 mBoundService.notifyDownloadCanceled(info.getDownloadGuid());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
index 3555760..b56b9b6 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationManager.java
@@ -13,6 +13,7 @@
 import org.chromium.chrome.browser.AppHooks;
 import org.chromium.chrome.browser.notifications.ChromeNotificationBuilder;
 import org.chromium.chrome.browser.notifications.NotificationConstants;
+import org.chromium.chrome.browser.notifications.NotificationUmaTracker;
 
 /**
  * Manages the notification indicating that there are incognito tabs opened in Document mode.
@@ -51,6 +52,8 @@
         NotificationManager nm =
                 (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
         nm.notify(INCOGNITO_TABS_OPEN_TAG, INCOGNITO_TABS_OPEN_ID, builder.build());
+        NotificationUmaTracker.getInstance().onNotificationShown(
+                NotificationUmaTracker.CLOSE_INCOGNITO);
     }
 
     /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
new file mode 100644
index 0000000..d97bf8f9
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java
@@ -0,0 +1,93 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.notifications;
+
+import android.content.SharedPreferences;
+import android.support.annotation.IntDef;
+import android.support.v4.app.NotificationManagerCompat;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.library_loader.LibraryLoader;
+import org.chromium.base.metrics.RecordHistogram;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Helper class to make tracking notification UMA stats easier for various features.  Having a
+ * single entry point here to make more complex tracking easier to add in the future.
+ */
+public class NotificationUmaTracker {
+    @Retention(RetentionPolicy.SOURCE)
+    @IntDef({DOWNLOAD_FILES, DOWNLOAD_PAGES, CLOSE_INCOGNITO, SYSTEM_NOTIFICATION_TYPE_BOUNDARY})
+    public @interface SystemNotificationType {}
+
+    /*
+     * A list of notification types.  To add a type to this list please update
+     * SystemNotificationType in histograms.xml and make sure to keep this list in sync.  Additions
+     * should be treated as APPEND ONLY to keep the UMA metric semantics the same over time.
+     *
+     * A SystemNotificationType value can also be saved in shared preferences.
+     */
+    public static final int DOWNLOAD_FILES = 0;
+    public static final int DOWNLOAD_PAGES = 1;
+    public static final int CLOSE_INCOGNITO = 2;
+
+    private static final int SYSTEM_NOTIFICATION_TYPE_BOUNDARY = 3;
+
+    private static final String LAST_SHOWN_NOTIFICATION_TYPE_KEY =
+            "NotificationUmaTracker.LastShownNotificationType";
+
+    private static class LazyHolder {
+        private static final NotificationUmaTracker INSTANCE = new NotificationUmaTracker();
+    }
+
+    /** Cached objects. */
+    private final SharedPreferences mSharedPreferences;
+    private final NotificationManagerCompat mNotificationManager;
+
+    public static NotificationUmaTracker getInstance() {
+        return LazyHolder.INSTANCE;
+    }
+
+    private NotificationUmaTracker() {
+        mSharedPreferences = ContextUtils.getAppSharedPreferences();
+        mNotificationManager = NotificationManagerCompat.from(ContextUtils.getApplicationContext());
+    }
+
+    /**
+     * Logs {@link android.app.Notification} usage, categorized into {@link SystemNotificationType}
+     * types.  Splits the logs by the global enabled state of notifications and also logs the last
+     * notification shown prior to the global notifications state being disabled by the user.
+     * @param type The type of notification that was shown.
+     * @see SystemNotificationType
+     */
+    public void onNotificationShown(@SystemNotificationType int type) {
+        if (mNotificationManager.areNotificationsEnabled()) {
+            saveLastShownNotification(type);
+            recordHistogram("Mobile.SystemNotification.Shown", type);
+        } else {
+            logPotentialBlockedCause();
+            recordHistogram("Mobile.SystemNotification.Blocked", type);
+        }
+    }
+
+    private void saveLastShownNotification(@SystemNotificationType int type) {
+        mSharedPreferences.edit().putInt(LAST_SHOWN_NOTIFICATION_TYPE_KEY, type).apply();
+    }
+
+    private void logPotentialBlockedCause() {
+        int lastType = mSharedPreferences.getInt(LAST_SHOWN_NOTIFICATION_TYPE_KEY, -1);
+        if (lastType == -1) return;
+        mSharedPreferences.edit().remove(LAST_SHOWN_NOTIFICATION_TYPE_KEY).apply();
+
+        recordHistogram("Mobile.SystemNotification.BlockedAfterShown", lastType);
+    }
+
+    private static void recordHistogram(String name, @SystemNotificationType int type) {
+        if (!LibraryLoader.isInitialized()) return;
+        RecordHistogram.recordEnumeratedHistogram(name, type, SYSTEM_NOTIFICATION_TYPE_BOUNDARY);
+    }
+}
\ No newline at end of file
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
index 846049f..751a190 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/preferences/SearchEngineAdapter.java
@@ -82,6 +82,8 @@
 
     private boolean mHasLoadObserver;
 
+    private boolean mIsLocationPermissionChanged;
+
     /**
      * Construct a SearchEngineAdapter.
      * @param context The current context.
@@ -139,7 +141,13 @@
         }
 
         List<TemplateUrl> templateUrls = templateUrlService.getSearchEngines();
-        if (!didSearchEnginesChange(templateUrls)) return;
+        boolean forceRefresh = mIsLocationPermissionChanged;
+        mIsLocationPermissionChanged = false;
+        if (!didSearchEnginesChange(templateUrls)) {
+            if (forceRefresh) notifyDataSetChanged();
+            return;
+        }
+
         mPrepopulatedSearchEngines = new ArrayList<>();
         mRecentSearchEngines = new ArrayList<>();
 
@@ -424,6 +432,7 @@
     }
 
     private void onLocationLinkClicked() {
+        mIsLocationPermissionChanged = true;
         if (!LocationUtils.getInstance().isSystemLocationSettingEnabled()) {
             mContext.startActivity(LocationUtils.getInstance().getSystemLocationSettingsIntent());
         } else {
diff --git a/chrome/android/java_sources.gni b/chrome/android/java_sources.gni
index 27084cd..0f7f5b48 100644
--- a/chrome/android/java_sources.gni
+++ b/chrome/android/java_sources.gni
@@ -558,6 +558,7 @@
   "java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java",
   "java/src/org/chromium/chrome/browser/notifications/NotificationService.java",
   "java/src/org/chromium/chrome/browser/notifications/NotificationSystemStatusUtil.java",
+  "java/src/org/chromium/chrome/browser/notifications/NotificationUmaTracker.java",
   "java/src/org/chromium/chrome/browser/notifications/StandardNotificationBuilder.java",
   "java/src/org/chromium/chrome/browser/notifications/WebApkNotificationClient.java",
   "java/src/org/chromium/chrome/browser/ntp/ChromeHomeNewTabPage.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
index 5ffac6e..a41d5a4 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -294,7 +294,7 @@
                 sharedPrefs, DownloadSharedPreferenceHelper.KEY_PENDING_DOWNLOAD_NOTIFICATIONS);
         assertEquals(2, entries.size());
 
-        service.notifyDownloadFailed(guid2, "failed");
+        service.notifyDownloadFailed(false, guid2, "failed");
         entries = DownloadManagerService.getStoredDownloadInfo(
                 sharedPrefs, DownloadSharedPreferenceHelper.KEY_PENDING_DOWNLOAD_NOTIFICATIONS);
         assertEquals(1, entries.size());
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
index 28284a5..d547137 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/MockDownloadNotificationService.java
@@ -100,12 +100,13 @@
     }
 
     @Override
-    public void notifyDownloadFailed(final String downloadGuid, final String fileName) {
+    public void notifyDownloadFailed(
+            final boolean isOfflinePage, final String downloadGuid, final String fileName) {
         ThreadUtils.runOnUiThreadBlocking(new Runnable() {
             @Override
             public void run() {
                 MockDownloadNotificationService.super.notifyDownloadFailed(
-                        downloadGuid, fileName);
+                        isOfflinePage, downloadGuid, fileName);
             }
         });
     }
diff --git a/chrome/browser/android/offline_pages/background_loader_offliner.cc b/chrome/browser/android/offline_pages/background_loader_offliner.cc
index 0b5478e..bfc55e3 100644
--- a/chrome/browser/android/offline_pages/background_loader_offliner.cc
+++ b/chrome/browser/android/offline_pages/background_loader_offliner.cc
@@ -117,18 +117,24 @@
   return true;
 }
 
-void BackgroundLoaderOffliner::Cancel() {
+void BackgroundLoaderOffliner::Cancel(const CancelCallback& callback) {
   // TODO(chili): We are not able to cancel a pending
-  // OfflinePageModel::SavePage() operation. We just ignore the callback.
-  if (!pending_request_)
-    return;
-
-  if (save_state_ != NONE) {
-    save_state_ = DELETE_AFTER_SAVE;
+  // OfflinePageModel::SavePage() operation. We will notify caller that
+  // cancel completed once the SavePage operation returns.
+  if (!pending_request_) {
+    callback.Run(0LL);
     return;
   }
 
+  if (save_state_ != NONE) {
+    save_state_ = DELETE_AFTER_SAVE;
+    cancel_callback_ = callback;
+    return;
+  }
+
+  int64_t request_id = pending_request_->request_id();
   ResetState();
+  callback.Run(request_id);
 }
 
 bool BackgroundLoaderOffliner::HandleTimeout(const SavePageRequest& request) {
@@ -304,6 +310,7 @@
 
   if (save_state_ == DELETE_AFTER_SAVE) {
     save_state_ = NONE;
+    cancel_callback_.Run(request.request_id());
     return;
   }
 
@@ -338,9 +345,21 @@
           base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES) {
     DVLOG(1) << "App became active, canceling current offlining request";
     SavePageRequest* request = pending_request_.get();
-    Cancel();
-    completion_callback_.Run(*request, RequestStatus::FOREGROUND_CANCELED);
+    // This works because Bind will make a copy of request, and we
+    // should not have to worry about reset being called before cancel callback.
+    Cancel(base::Bind(
+        &BackgroundLoaderOffliner::HandleApplicationStateChangeCancel,
+        weak_ptr_factory_.GetWeakPtr(), *request));
   }
 }
 
+void BackgroundLoaderOffliner::HandleApplicationStateChangeCancel(
+    const SavePageRequest& request,
+    int64_t offline_id) {
+  // If for some reason the request was reset during while waiting for callback
+  // ignore the completion callback.
+  if (pending_request_ && pending_request_->request_id() != offline_id)
+    return;
+  completion_callback_.Run(request, RequestStatus::FOREGROUND_CANCELED);
+}
 }  // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/background_loader_offliner.h b/chrome/browser/android/offline_pages/background_loader_offliner.h
index 7be71548..04572de 100644
--- a/chrome/browser/android/offline_pages/background_loader_offliner.h
+++ b/chrome/browser/android/offline_pages/background_loader_offliner.h
@@ -37,7 +37,7 @@
   // Offliner implementation.
   bool LoadAndSave(const SavePageRequest& request,
                    const CompletionCallback& callback) override;
-  void Cancel() override;
+  void Cancel(const CancelCallback& callback) override;
   bool HandleTimeout(const SavePageRequest& request) override;
 
   // WebContentsObserver implementation.
@@ -68,6 +68,8 @@
   // Called when application state has changed.
   void OnApplicationStateChange(
       base::android::ApplicationState application_state);
+  void HandleApplicationStateChangeCancel(const SavePageRequest& request,
+                                          int64_t offline_id);
 
   std::unique_ptr<background_loader::BackgroundLoaderContents> loader_;
   // Not owned.
@@ -82,6 +84,7 @@
   std::unique_ptr<base::android::ApplicationStatusListener> app_listener_;
   // Whether we are on a low-end device.
   bool is_low_end_device_;
+
   // Save state.
   SaveState save_state_;
   // Page load state.
@@ -89,6 +92,9 @@
   // Seconds to delay before taking snapshot.
   long page_delay_ms_;
 
+  // Callback for cancel.
+  CancelCallback cancel_callback_;
+
   base::WeakPtrFactory<BackgroundLoaderOffliner> weak_ptr_factory_;
   DISALLOW_COPY_AND_ASSIGN(BackgroundLoaderOffliner);
 };
diff --git a/chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc b/chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc
index fdc2061..0b4e691 100644
--- a/chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc
+++ b/chrome/browser/android/offline_pages/background_loader_offliner_unittest.cc
@@ -130,9 +130,14 @@
     return base::Bind(&BackgroundLoaderOfflinerTest::OnCompletion,
                       base::Unretained(this));
   }
+  Offliner::CancelCallback const cancel_callback() {
+    return base::Bind(&BackgroundLoaderOfflinerTest::OnCancel,
+                      base::Unretained(this));
+  }
   Profile* profile() { return &profile_; }
   bool completion_callback_called() { return completion_callback_called_; }
   Offliner::RequestStatus request_status() { return request_status_; }
+  bool cancel_callback_called() { return cancel_callback_called_; }
   bool SaveInProgress() const { return model_->mock_saving(); }
   MockOfflinePageModel* model() const { return model_; }
   const base::HistogramTester& histograms() const { return histogram_tester_; }
@@ -148,11 +153,13 @@
  private:
   void OnCompletion(const SavePageRequest& request,
                     Offliner::RequestStatus status);
+  void OnCancel(int64_t offline_id);
   content::TestBrowserThreadBundle thread_bundle_;
   TestingProfile profile_;
   std::unique_ptr<TestBackgroundLoaderOffliner> offliner_;
   MockOfflinePageModel* model_;
   bool completion_callback_called_;
+  bool cancel_callback_called_;
   Offliner::RequestStatus request_status_;
   base::HistogramTester histogram_tester_;
 
@@ -162,6 +169,7 @@
 BackgroundLoaderOfflinerTest::BackgroundLoaderOfflinerTest()
     : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
       completion_callback_called_(false),
+      cancel_callback_called_(false),
       request_status_(Offliner::RequestStatus::UNKNOWN) {}
 
 BackgroundLoaderOfflinerTest::~BackgroundLoaderOfflinerTest() {}
@@ -180,6 +188,11 @@
   request_status_ = status;
 }
 
+void BackgroundLoaderOfflinerTest::OnCancel(int64_t offline_id) {
+  DCHECK(!cancel_callback_called_);
+  cancel_callback_called_ = true;
+}
+
 TEST_F(BackgroundLoaderOfflinerTest,
        LoadAndSaveBlockThirdPartyCookiesForCustomTabs) {
   base::Time creation_time = base::Time::Now();
@@ -249,7 +262,9 @@
   SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time,
                           kUserRequested);
   EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
-  offliner()->Cancel();
+  offliner()->Cancel(cancel_callback());
+  PumpLoop();
+  EXPECT_TRUE(cancel_callback_called());
   EXPECT_FALSE(offliner()->is_loading());  // Offliner reset.
 }
 
@@ -260,11 +275,13 @@
   EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
   CompleteLoading();
   PumpLoop();
-  offliner()->Cancel();
+  offliner()->Cancel(cancel_callback());
+  PumpLoop();
 
   // Subsequent save callback cause no crash.
   model()->CompleteSavingAsArchiveCreationFailed();
   PumpLoop();
+  EXPECT_TRUE(cancel_callback_called());
   EXPECT_FALSE(completion_callback_called());
   EXPECT_FALSE(SaveInProgress());
   EXPECT_FALSE(offliner()->is_loading());  // Offliner reset.
diff --git a/chrome/browser/android/offline_pages/prerendering_offliner.cc b/chrome/browser/android/offline_pages/prerendering_offliner.cc
index d85f3cbf..89707e1 100644
--- a/chrome/browser/android/offline_pages/prerendering_offliner.cc
+++ b/chrome/browser/android/offline_pages/prerendering_offliner.cc
@@ -210,13 +210,16 @@
   return accepted;
 }
 
-void PrerenderingOffliner::Cancel() {
+void PrerenderingOffliner::Cancel(const CancelCallback& callback) {
+  int64_t request_id = 0LL;
   if (pending_request_) {
+    request_id = pending_request_->request_id();
     pending_request_.reset(nullptr);
     app_listener_.reset(nullptr);
     GetOrCreateLoader()->StopLoading();
     // TODO(dougarnett): Consider ability to cancel SavePage request.
   }
+  callback.Run(request_id);
 }
 
 bool PrerenderingOffliner::HandleTimeout(const SavePageRequest& request) {
@@ -271,10 +274,20 @@
           base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES) {
     DVLOG(1) << "App became active, canceling current offlining request";
     SavePageRequest* request = pending_request_.get();
-    Cancel();
-    completion_callback_.Run(*request,
-                             Offliner::RequestStatus::FOREGROUND_CANCELED);
+    // This works because Bind will make a copy of request, and we
+    // should not have to worry about reset being called before cancel callback.
+    Cancel(base::Bind(&PrerenderingOffliner::HandleApplicationStateChangeCancel,
+                      weak_ptr_factory_.GetWeakPtr(), *request));
   }
 }
 
+void PrerenderingOffliner::HandleApplicationStateChangeCancel(
+    const SavePageRequest& request,
+    int64_t offline_id) {
+  // This shouldn't be immediate, but account for case where request was reset
+  // while waiting for callback.
+  if (pending_request_ && pending_request_->request_id() != offline_id)
+    return;
+  completion_callback_.Run(request, RequestStatus::FOREGROUND_CANCELED);
+}
 }  // namespace offline_pages
diff --git a/chrome/browser/android/offline_pages/prerendering_offliner.h b/chrome/browser/android/offline_pages/prerendering_offliner.h
index 9b1104c..935d3019 100644
--- a/chrome/browser/android/offline_pages/prerendering_offliner.h
+++ b/chrome/browser/android/offline_pages/prerendering_offliner.h
@@ -36,7 +36,7 @@
   // Offliner implementation.
   bool LoadAndSave(const SavePageRequest& request,
                    const CompletionCallback& callback) override;
-  void Cancel() override;
+  void Cancel(const CancelCallback& callback) override;
   bool HandleTimeout(const SavePageRequest& request) override;
 
   // Allows a loader to be injected for testing. This may only be done once
@@ -76,6 +76,8 @@
   // Listener function for changes to application background/foreground state.
   void OnApplicationStateChange(
       base::android::ApplicationState application_state);
+  void HandleApplicationStateChangeCancel(const SavePageRequest& request,
+                                          int64_t offline_id);
 
   // Not owned.
   content::BrowserContext* browser_context_;
diff --git a/chrome/browser/android/offline_pages/prerendering_offliner_unittest.cc b/chrome/browser/android/offline_pages/prerendering_offliner_unittest.cc
index 8cfd398d..2d0a21b 100644
--- a/chrome/browser/android/offline_pages/prerendering_offliner_unittest.cc
+++ b/chrome/browser/android/offline_pages/prerendering_offliner_unittest.cc
@@ -172,6 +172,10 @@
     return base::Bind(&PrerenderingOfflinerTest::OnCompletion,
                       base::Unretained(this));
   }
+  Offliner::CancelCallback const cancel_callback() {
+    return base::Bind(&PrerenderingOfflinerTest::OnCancel,
+                      base::Unretained(this));
+  }
 
   bool SaveInProgress() const { return model_->mock_saving(); }
   MockPrerenderingLoader* loader() { return loader_; }
@@ -179,10 +183,12 @@
   bool completion_callback_called() { return completion_callback_called_; }
   Offliner::RequestStatus request_status() { return request_status_; }
   OfflinerPolicy* policy() { return policy_; }
+  bool cancel_callback_called() { return cancel_callback_called_; }
 
  private:
   void OnCompletion(const SavePageRequest& request,
                     Offliner::RequestStatus status);
+  void OnCancel(int64_t offline_id);
 
   content::TestBrowserThreadBundle thread_bundle_;
   TestingProfile profile_;
@@ -191,6 +197,7 @@
   MockPrerenderingLoader* loader_;
   MockOfflinePageModel* model_;
   bool completion_callback_called_;
+  bool cancel_callback_called_;
   Offliner::RequestStatus request_status_;
   OfflinerPolicy* policy_;
 
@@ -200,6 +207,7 @@
 PrerenderingOfflinerTest::PrerenderingOfflinerTest()
     : thread_bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
       completion_callback_called_(false),
+      cancel_callback_called_(false),
       request_status_(Offliner::RequestStatus::UNKNOWN) {}
 
 PrerenderingOfflinerTest::~PrerenderingOfflinerTest() {}
@@ -221,6 +229,11 @@
   request_status_ = status;
 }
 
+void PrerenderingOfflinerTest::OnCancel(int64_t offline_id) {
+  DCHECK(!cancel_callback_called_);
+  cancel_callback_called_ = true;
+}
+
 TEST_F(PrerenderingOfflinerTest, LoadAndSaveBadUrl) {
   base::Time creation_time = base::Time::Now();
   SavePageRequest request(
@@ -285,7 +298,9 @@
   EXPECT_TRUE(offliner()->LoadAndSave(request, callback()));
   EXPECT_FALSE(loader()->IsIdle());
 
-  offliner()->Cancel();
+  offliner()->Cancel(cancel_callback());
+  PumpLoop();
+  EXPECT_TRUE(cancel_callback_called());
   EXPECT_TRUE(loader()->IsIdle());
 }
 
@@ -303,9 +318,10 @@
   EXPECT_TRUE(loader()->IsLoaded());
   EXPECT_TRUE(SaveInProgress());
 
-  offliner()->Cancel();
+  offliner()->Cancel(cancel_callback());
   PumpLoop();
   EXPECT_FALSE(completion_callback_called());
+  EXPECT_TRUE(cancel_callback_called());
   EXPECT_FALSE(loader()->IsLoaded());
   // Note: save still in progress since it does not support canceling.
   EXPECT_TRUE(SaveInProgress());
diff --git a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
index 8e15742..9db262e 100644
--- a/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/file_manager_private_apitest.cc
@@ -324,9 +324,8 @@
       extensions::SOURCE_NETWORK);
 
   file_manager::VolumeManager::Get(browser()->profile())
-      ->AddVolumeForTesting(
-          make_linked_ptr(file_manager::Volume::CreateForProvidedFileSystem(
-              info, file_manager::MOUNT_CONTEXT_AUTO)));
+      ->AddVolumeForTesting(file_manager::Volume::CreateForProvidedFileSystem(
+          info, file_manager::MOUNT_CONTEXT_AUTO));
 
   // We will call fileManagerPrivate.unmountVolume once. To test that method, we
   // check that UnmountPath is really called with the same value.
diff --git a/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc b/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc
index daf2fb3..529bc17 100644
--- a/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/job_event_router.cc
@@ -48,7 +48,7 @@
 
   // Add new job info.
   UpdateBytes(job_info);
-  drive_jobs_[job_info.job_id] = make_linked_ptr(new drive::JobInfo(job_info));
+  drive_jobs_[job_info.job_id] = base::MakeUnique<drive::JobInfo>(job_info);
 
   ScheduleDriveFileTransferEvent(
       job_info, file_manager_private::TRANSFER_STATE_IN_PROGRESS,
diff --git a/chrome/browser/chromeos/extensions/file_manager/job_event_router.h b/chrome/browser/chromeos/extensions/file_manager/job_event_router.h
index 85e4dc5..ea787a67 100644
--- a/chrome/browser/chromeos/extensions/file_manager/job_event_router.h
+++ b/chrome/browser/chromeos/extensions/file_manager/job_event_router.h
@@ -13,7 +13,6 @@
 #include <string>
 
 #include "base/macros.h"
-#include "base/memory/linked_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
@@ -82,7 +81,7 @@
   base::TimeDelta event_delay_;
 
   // Set of job that are in the job schedular.
-  std::map<drive::JobID, linked_ptr<drive::JobInfo>> drive_jobs_;
+  std::map<drive::JobID, std::unique_ptr<drive::JobInfo>> drive_jobs_;
 
   // Job info of pending event. |ScheduleDriveFileTransferEvent| registers
   // timeout callback to dispatch this.
diff --git a/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc b/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc
index 8b84ea50..13f220e 100644
--- a/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/job_event_router_unittest.cc
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include "base/macros.h"
+#include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
 #include "base/run_loop.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -20,7 +21,7 @@
   JobEventRouterImpl() : JobEventRouter(base::TimeDelta::FromMilliseconds(0)) {
     listener_extension_ids_.insert("extension_a");
   }
-  std::vector<linked_ptr<base::DictionaryValue>> events;
+  std::vector<std::unique_ptr<base::DictionaryValue>> events;
 
   void SetListenerExtensionIds(std::set<std::string> extension_ids) {
     listener_extension_ids_ = extension_ids;
@@ -49,7 +50,7 @@
       std::unique_ptr<base::ListValue> event_args) override {
     const base::DictionaryValue* event;
     event_args->GetDictionary(0, &event);
-    events.push_back(make_linked_ptr(event->DeepCopy()));
+    events.push_back(base::WrapUnique(event->DeepCopy()));
   }
 
  private:
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.cc b/chrome/browser/chromeos/file_manager/volume_manager.cc
index 76f4a5ed..a780ec4 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.cc
+++ b/chrome/browser/chromeos/file_manager/volume_manager.cc
@@ -167,10 +167,10 @@
 }
 
 // static
-Volume* Volume::CreateForDrive(Profile* profile) {
+std::unique_ptr<Volume> Volume::CreateForDrive(Profile* profile) {
   const base::FilePath& drive_path =
       drive::util::GetDriveMountPointPath(profile);
-  Volume* const volume = new Volume;
+  std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_GOOGLE_DRIVE;
   volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
   volume->source_path_ = drive_path;
@@ -183,8 +183,9 @@
 }
 
 // static
-Volume* Volume::CreateForDownloads(const base::FilePath& downloads_path) {
-  Volume* const volume = new Volume;
+std::unique_ptr<Volume> Volume::CreateForDownloads(
+    const base::FilePath& downloads_path) {
+  std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_DOWNLOADS_DIRECTORY;
   volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
   // Keep source_path empty.
@@ -197,10 +198,10 @@
 }
 
 // static
-Volume* Volume::CreateForRemovable(
+std::unique_ptr<Volume> Volume::CreateForRemovable(
     const chromeos::disks::DiskMountManager::MountPointInfo& mount_point,
     const chromeos::disks::DiskMountManager::Disk* disk) {
-  Volume* const volume = new Volume;
+  std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = MountTypeToVolumeType(mount_point.mount_type);
   volume->source_path_ = base::FilePath(mount_point.source_path);
   volume->source_ = mount_point.mount_type == chromeos::MOUNT_TYPE_ARCHIVE
@@ -227,11 +228,11 @@
 }
 
 // static
-Volume* Volume::CreateForProvidedFileSystem(
+std::unique_ptr<Volume> Volume::CreateForProvidedFileSystem(
     const chromeos::file_system_provider::ProvidedFileSystemInfo&
         file_system_info,
     MountContext mount_context) {
-  Volume* const volume = new Volume;
+  std::unique_ptr<Volume> volume(new Volume());
   volume->file_system_id_ = file_system_info.file_system_id();
   volume->extension_id_ = file_system_info.extension_id();
   switch (file_system_info.source()) {
@@ -259,10 +260,10 @@
 }
 
 // static
-Volume* Volume::CreateForMTP(const base::FilePath& mount_path,
-                             const std::string& label,
-                             bool read_only) {
-  Volume* const volume = new Volume;
+std::unique_ptr<Volume> Volume::CreateForMTP(const base::FilePath& mount_path,
+                                             const std::string& label,
+                                             bool read_only) {
+  std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_MTP;
   volume->mount_path_ = mount_path;
   volume->mount_condition_ = chromeos::disks::MOUNT_CONDITION_NONE;
@@ -277,8 +278,9 @@
 }
 
 // static
-Volume* Volume::CreateForMediaView(const std::string& root_document_id) {
-  Volume* const volume = new Volume;
+std::unique_ptr<Volume> Volume::CreateForMediaView(
+    const std::string& root_document_id) {
+  std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = VOLUME_TYPE_MEDIA_VIEW;
   volume->device_type_ = chromeos::DEVICE_TYPE_UNKNOWN;
   volume->source_ = SOURCE_SYSTEM;
@@ -293,11 +295,12 @@
 }
 
 // static
-Volume* Volume::CreateForTesting(const base::FilePath& path,
-                                 VolumeType volume_type,
-                                 chromeos::DeviceType device_type,
-                                 bool read_only) {
-  Volume* const volume = new Volume;
+std::unique_ptr<Volume> Volume::CreateForTesting(
+    const base::FilePath& path,
+    VolumeType volume_type,
+    chromeos::DeviceType device_type,
+    bool read_only) {
+  std::unique_ptr<Volume> volume(new Volume());
   volume->type_ = volume_type;
   volume->device_type_ = device_type;
   // Keep source_path empty.
@@ -310,9 +313,10 @@
 }
 
 // static
-Volume* Volume::CreateForTesting(const base::FilePath& device_path,
-                                 const base::FilePath& mount_path) {
-  Volume* const volume = new Volume;
+std::unique_ptr<Volume> Volume::CreateForTesting(
+    const base::FilePath& device_path,
+    const base::FilePath& mount_path) {
+  std::unique_ptr<Volume> volume(new Volume());
   volume->system_path_prefix_ = device_path;
   volume->mount_path_ = mount_path;
   return volume;
@@ -354,14 +358,14 @@
   DCHECK(success);
 
   DoMountEvent(chromeos::MOUNT_ERROR_NONE,
-               make_linked_ptr(Volume::CreateForDownloads(downloads)));
+               Volume::CreateForDownloads(downloads));
 
   // Subscribe to DriveIntegrationService.
   if (drive_integration_service_) {
     drive_integration_service_->AddObserver(this);
     if (drive_integration_service_->IsMounted()) {
       DoMountEvent(chromeos::MOUNT_ERROR_NONE,
-                   make_linked_ptr(Volume::CreateForDrive(profile_)));
+                   Volume::CreateForDrive(profile_));
     }
   }
 
@@ -381,9 +385,9 @@
     std::vector<ProvidedFileSystemInfo> file_system_info_list =
         file_system_provider_service_->GetProvidedFileSystemInfoList();
     for (size_t i = 0; i < file_system_info_list.size(); ++i) {
-      linked_ptr<Volume> volume(Volume::CreateForProvidedFileSystem(
-          file_system_info_list[i], MOUNT_CONTEXT_AUTO));
-      DoMountEvent(chromeos::MOUNT_ERROR_NONE, volume);
+      std::unique_ptr<Volume> volume = Volume::CreateForProvidedFileSystem(
+          file_system_info_list[i], MOUNT_CONTEXT_AUTO);
+      DoMountEvent(chromeos::MOUNT_ERROR_NONE, std::move(volume));
     }
   }
 
@@ -456,6 +460,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   std::vector<base::WeakPtr<Volume>> result;
+  result.reserve(mounted_volumes_.size());
   for (const auto& pair : mounted_volumes_) {
     result.push_back(pair.second->AsWeakPtr());
   }
@@ -479,13 +484,13 @@
   base::FilePath old_path;
   if (FindDownloadsMountPointPath(profile_, &old_path)) {
     DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
-                   make_linked_ptr(Volume::CreateForDownloads(old_path)));
+                   *Volume::CreateForDownloads(old_path));
   }
 
   bool success = RegisterDownloadsMountPoint(profile_, path);
   DoMountEvent(
       success ? chromeos::MOUNT_ERROR_NONE : chromeos::MOUNT_ERROR_INVALID_PATH,
-      make_linked_ptr(Volume::CreateForDownloads(path)));
+      Volume::CreateForDownloads(path));
   return success;
 }
 
@@ -494,14 +499,14 @@
                                         chromeos::DeviceType device_type,
                                         bool read_only) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DoMountEvent(chromeos::MOUNT_ERROR_NONE,
-               make_linked_ptr(Volume::CreateForTesting(
-                   path, volume_type, device_type, read_only)));
+  DoMountEvent(
+      chromeos::MOUNT_ERROR_NONE,
+      Volume::CreateForTesting(path, volume_type, device_type, read_only));
 }
 
-void VolumeManager::AddVolumeForTesting(const linked_ptr<Volume>& volume) {
+void VolumeManager::AddVolumeForTesting(std::unique_ptr<Volume> volume) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  DoMountEvent(chromeos::MOUNT_ERROR_NONE, volume);
+  DoMountEvent(chromeos::MOUNT_ERROR_NONE, std::move(volume));
 }
 
 void VolumeManager::OnFileSystemMounted() {
@@ -510,15 +515,13 @@
   // Raise mount event.
   // We can pass chromeos::MOUNT_ERROR_NONE even when authentication is failed
   // or network is unreachable. These two errors will be handled later.
-  linked_ptr<Volume> volume(Volume::CreateForDrive(profile_));
-  DoMountEvent(chromeos::MOUNT_ERROR_NONE, volume);
+  DoMountEvent(chromeos::MOUNT_ERROR_NONE, Volume::CreateForDrive(profile_));
 }
 
 void VolumeManager::OnFileSystemBeingUnmounted() {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
-  linked_ptr<Volume> volume(Volume::CreateForDrive(profile_));
-  DoUnmountEvent(chromeos::MOUNT_ERROR_NONE, volume);
+  DoUnmountEvent(chromeos::MOUNT_ERROR_NONE, *Volume::CreateForDrive(profile_));
 }
 
 void VolumeManager::OnDiskEvent(
@@ -628,14 +631,14 @@
   // Notify a mounting/unmounting event to observers.
   const chromeos::disks::DiskMountManager::Disk* const disk =
       disk_mount_manager_->FindDiskBySourcePath(mount_info.source_path);
-  linked_ptr<Volume> volume(Volume::CreateForRemovable(mount_info, disk));
+  std::unique_ptr<Volume> volume = Volume::CreateForRemovable(mount_info, disk);
   switch (event) {
     case chromeos::disks::DiskMountManager::MOUNTING: {
-      DoMountEvent(error_code, volume);
+      DoMountEvent(error_code, std::move(volume));
       return;
     }
     case chromeos::disks::DiskMountManager::UNMOUNTING:
-      DoUnmountEvent(error_code, volume);
+      DoUnmountEvent(error_code, *volume);
       return;
   }
   NOTREACHED();
@@ -693,8 +696,8 @@
       break;
   }
 
-  linked_ptr<Volume> volume(
-      Volume::CreateForProvidedFileSystem(file_system_info, volume_context));
+  std::unique_ptr<Volume> volume =
+      Volume::CreateForProvidedFileSystem(file_system_info, volume_context);
 
   // TODO(mtomasz): Introduce own type, and avoid using MountError internally,
   // since it is related to cros disks only.
@@ -711,7 +714,7 @@
       break;
   }
 
-  DoMountEvent(mount_error, volume);
+  DoMountEvent(mount_error, std::move(volume));
 }
 
 void VolumeManager::OnProvidedFileSystemUnmount(
@@ -723,9 +726,9 @@
   const chromeos::MountError mount_error = error == base::File::FILE_OK
                                                ? chromeos::MOUNT_ERROR_NONE
                                                : chromeos::MOUNT_ERROR_UNKNOWN;
-  linked_ptr<Volume> volume(Volume::CreateForProvidedFileSystem(
-      file_system_info, MOUNT_CONTEXT_UNKNOWN));
-  DoUnmountEvent(mount_error, volume);
+  std::unique_ptr<Volume> volume = Volume::CreateForProvidedFileSystem(
+      file_system_info, MOUNT_CONTEXT_UNKNOWN);
+  DoUnmountEvent(mount_error, *volume);
 }
 
 void VolumeManager::OnExternalStorageDisabledChangedUnmountCallback(
@@ -752,24 +755,18 @@
 
   if (enabled) {
     DoMountEvent(chromeos::MOUNT_ERROR_NONE,
-                 linked_ptr<Volume>(
-                     Volume::CreateForMediaView(arc::kImagesRootDocumentId)));
+                 Volume::CreateForMediaView(arc::kImagesRootDocumentId));
     DoMountEvent(chromeos::MOUNT_ERROR_NONE,
-                 linked_ptr<Volume>(
-                     Volume::CreateForMediaView(arc::kVideosRootDocumentId)));
+                 Volume::CreateForMediaView(arc::kVideosRootDocumentId));
     DoMountEvent(chromeos::MOUNT_ERROR_NONE,
-                 linked_ptr<Volume>(
-                     Volume::CreateForMediaView(arc::kAudioRootDocumentId)));
+                 Volume::CreateForMediaView(arc::kAudioRootDocumentId));
   } else {
     DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
-                   linked_ptr<Volume>(
-                       Volume::CreateForMediaView(arc::kImagesRootDocumentId)));
+                   *Volume::CreateForMediaView(arc::kImagesRootDocumentId));
     DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
-                   linked_ptr<Volume>(
-                       Volume::CreateForMediaView(arc::kVideosRootDocumentId)));
+                   *Volume::CreateForMediaView(arc::kVideosRootDocumentId));
     DoUnmountEvent(chromeos::MOUNT_ERROR_NONE,
-                   linked_ptr<Volume>(
-                       Volume::CreateForMediaView(arc::kAudioRootDocumentId)));
+                   *Volume::CreateForMediaView(arc::kAudioRootDocumentId));
   }
 
   arc_volumes_mounted_ = enabled;
@@ -857,8 +854,8 @@
                  base::Unretained(MTPDeviceMapService::GetInstance()),
                  info.location(), fsid, read_only));
 
-  linked_ptr<Volume> volume(Volume::CreateForMTP(path, label, read_only));
-  DoMountEvent(chromeos::MOUNT_ERROR_NONE, volume);
+  std::unique_ptr<Volume> volume = Volume::CreateForMTP(path, label, read_only);
+  DoMountEvent(chromeos::MOUNT_ERROR_NONE, std::move(volume));
 }
 
 void VolumeManager::OnRemovableStorageDetached(
@@ -866,9 +863,9 @@
   if (!storage_monitor::StorageInfo::IsMTPDevice(info.device_id()))
     return;
 
-  for (const auto mounted_volume : mounted_volumes_) {
+  for (const auto& mounted_volume : mounted_volumes_) {
     if (mounted_volume.second->source_path().value() == info.location()) {
-      DoUnmountEvent(chromeos::MOUNT_ERROR_NONE, mounted_volume.second);
+      DoUnmountEvent(chromeos::MOUNT_ERROR_NONE, *mounted_volume.second.get());
 
       const std::string fsid = GetMountPointNameForMediaStorage(info);
       storage::ExternalMountPoints::GetSystemInstance()->RevokeFileSystem(fsid);
@@ -888,7 +885,7 @@
     return;
   }
 
-  std::vector<linked_ptr<Volume>> archives;
+  std::vector<std::unique_ptr<Volume>> archives;
 
   const chromeos::disks::DiskMountManager::MountPointMap& mount_points =
       disk_mount_manager_->mount_points();
@@ -898,14 +895,13 @@
        ++it) {
     if (it->second.mount_type == chromeos::MOUNT_TYPE_ARCHIVE) {
       // Archives are mounted after other types of volume. See below.
-      archives.push_back(
-          make_linked_ptr(Volume::CreateForRemovable(it->second, NULL)));
+      archives.push_back(Volume::CreateForRemovable(it->second, nullptr));
       continue;
     }
     DoMountEvent(chromeos::MOUNT_ERROR_NONE,
-                 make_linked_ptr(Volume::CreateForRemovable(
+                 Volume::CreateForRemovable(
                      it->second, disk_mount_manager_->FindDiskBySourcePath(
-                                     it->second.source_path))));
+                                     it->second.source_path)));
   }
 
   // We mount archives only if they are opened from currently mounted volumes.
@@ -915,24 +911,26 @@
     if (done[i])
       continue;
 
-    std::vector<linked_ptr<Volume>> chain;
+    std::vector<std::unique_ptr<Volume>> chain;
+    // done[x] = true means archives[x] is null and that volume is in |chain|.
     done[i] = true;
-    chain.push_back(archives[i]);
+    chain.push_back(std::move(archives[i]));
 
     // If archives[i]'s source_path is in another archive, mount it first.
     for (size_t parent = i + 1; parent < archives.size(); ++parent) {
       if (!done[parent] &&
           archives[parent]->mount_path().IsParent(
               chain.back()->source_path())) {
+        // done[parent] started false, so archives[parent] is non-null.
         done[parent] = true;
-        chain.push_back(archives[parent]);
+        chain.push_back(std::move(archives[parent]));
         parent = i + 1;  // Search archives[parent]'s parent from the beginning.
       }
     }
 
     // Mount from the tail of chain.
     for (size_t i = chain.size(); i > 0; --i) {
-      DoMountEvent(chromeos::MOUNT_ERROR_NONE, chain[i - 1]);
+      DoMountEvent(chromeos::MOUNT_ERROR_NONE, std::move(chain[i - 1]));
     }
   }
 }
@@ -946,7 +944,7 @@
 }
 
 void VolumeManager::DoMountEvent(chromeos::MountError error_code,
-                                 const linked_ptr<Volume>& volume) {
+                                 std::unique_ptr<Volume> volume) {
   // Archive files are mounted globally in system. We however don't want to show
   // archives from profile-specific folders (Drive/Downloads) of other users in
   // multi-profile session. To this end, we filter out archives not on the
@@ -971,25 +969,32 @@
     return;
   }
 
+  Volume* raw_volume = volume.get();
   if (error_code == chromeos::MOUNT_ERROR_NONE || volume->mount_condition()) {
-    mounted_volumes_[volume->volume_id()] = volume;
-    UMA_HISTOGRAM_ENUMERATION("FileBrowser.VolumeType", volume->type(),
+    mounted_volumes_[volume->volume_id()] = std::move(volume);
+    UMA_HISTOGRAM_ENUMERATION("FileBrowser.VolumeType", raw_volume->type(),
                               NUM_VOLUME_TYPE);
   }
 
   for (auto& observer : observers_)
-    observer.OnVolumeMounted(error_code, *volume);
+    observer.OnVolumeMounted(error_code, *raw_volume);
 }
 
 void VolumeManager::DoUnmountEvent(chromeos::MountError error_code,
-                                   const linked_ptr<Volume>& volume) {
-  if (mounted_volumes_.find(volume->volume_id()) == mounted_volumes_.end())
+                                   const Volume& volume) {
+  auto iter = mounted_volumes_.find(volume.volume_id());
+  if (iter == mounted_volumes_.end())
     return;
-  if (error_code == chromeos::MOUNT_ERROR_NONE)
-    mounted_volumes_.erase(volume->volume_id());
+  std::unique_ptr<Volume> volume_ref;
+  if (error_code == chromeos::MOUNT_ERROR_NONE) {
+    // It is important to hold a reference to the removed Volume from
+    // |mounted_volumes_|, because OnVolumeMounted() will access it.
+    volume_ref = std::move(iter->second);
+    mounted_volumes_.erase(iter);
+  }
 
   for (auto& observer : observers_)
-    observer.OnVolumeUnmounted(error_code, *volume.get());
+    observer.OnVolumeUnmounted(error_code, volume);
 }
 
 }  // namespace file_manager
diff --git a/chrome/browser/chromeos/file_manager/volume_manager.h b/chrome/browser/chromeos/file_manager/volume_manager.h
index 46014daf..1658d149 100644
--- a/chrome/browser/chromeos/file_manager/volume_manager.h
+++ b/chrome/browser/chromeos/file_manager/volume_manager.h
@@ -14,7 +14,6 @@
 #include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/macros.h"
-#include "base/memory/linked_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list.h"
 #include "chrome/browser/chromeos/arc/arc_session_manager.h"
@@ -80,25 +79,29 @@
   ~Volume();
 
   // Factory static methods for different volume types.
-  static Volume* CreateForDrive(Profile* profile);
-  static Volume* CreateForDownloads(const base::FilePath& downloads_path);
-  static Volume* CreateForRemovable(
+  static std::unique_ptr<Volume> CreateForDrive(Profile* profile);
+  static std::unique_ptr<Volume> CreateForDownloads(
+      const base::FilePath& downloads_path);
+  static std::unique_ptr<Volume> CreateForRemovable(
       const chromeos::disks::DiskMountManager::MountPointInfo& mount_point,
       const chromeos::disks::DiskMountManager::Disk* disk);
-  static Volume* CreateForProvidedFileSystem(
+  static std::unique_ptr<Volume> CreateForProvidedFileSystem(
       const chromeos::file_system_provider::ProvidedFileSystemInfo&
           file_system_info,
       MountContext mount_context);
-  static Volume* CreateForMTP(const base::FilePath& mount_path,
-                              const std::string& label,
-                              bool read_only);
-  static Volume* CreateForMediaView(const std::string& root_document_id);
-  static Volume* CreateForTesting(const base::FilePath& path,
-                                  VolumeType volume_type,
-                                  chromeos::DeviceType device_type,
-                                  bool read_only);
-  static Volume* CreateForTesting(const base::FilePath& device_path,
-                                  const base::FilePath& mount_path);
+  static std::unique_ptr<Volume> CreateForMTP(const base::FilePath& mount_path,
+                                              const std::string& label,
+                                              bool read_only);
+  static std::unique_ptr<Volume> CreateForMediaView(
+      const std::string& root_document_id);
+  static std::unique_ptr<Volume> CreateForTesting(
+      const base::FilePath& path,
+      VolumeType volume_type,
+      chromeos::DeviceType device_type,
+      bool read_only);
+  static std::unique_ptr<Volume> CreateForTesting(
+      const base::FilePath& device_path,
+      const base::FilePath& mount_path);
 
   // Getters for all members. See below for details.
   const std::string& volume_id() const { return volume_id_; }
@@ -270,7 +273,7 @@
                            bool read_only);
 
   // For testing purpose, adds the volume info to the volume manager.
-  void AddVolumeForTesting(const linked_ptr<Volume>& volume);
+  void AddVolumeForTesting(std::unique_ptr<Volume> volume);
 
   // drive::DriveIntegrationServiceObserver overrides.
   void OnFileSystemMounted() override;
@@ -322,9 +325,8 @@
   void OnDiskMountManagerRefreshed(bool success);
   void OnStorageMonitorInitialized();
   void DoMountEvent(chromeos::MountError error_code,
-                    const linked_ptr<Volume>& volume);
-  void DoUnmountEvent(chromeos::MountError error_code,
-                      const linked_ptr<Volume>& volume);
+                    std::unique_ptr<Volume> volume);
+  void DoUnmountEvent(chromeos::MountError error_code, const Volume& volume);
   void OnExternalStorageDisabledChangedUnmountCallback(
       chromeos::MountError error_code);
 
@@ -336,7 +338,7 @@
   chromeos::file_system_provider::Service*
       file_system_provider_service_;  // Not owned by this class.
   GetMtpStorageInfoCallback get_mtp_storage_info_callback_;
-  std::map<std::string, linked_ptr<Volume>> mounted_volumes_;
+  std::map<std::string, std::unique_ptr<Volume>> mounted_volumes_;
   std::unique_ptr<SnapshotManager> snapshot_manager_;
   bool arc_volumes_mounted_ = false;
 
diff --git a/chrome/browser/chromeos/login/test/https_forwarder.py b/chrome/browser/chromeos/login/test/https_forwarder.py
index e68bcca..6578871 100644
--- a/chrome/browser/chromeos/login/test/https_forwarder.py
+++ b/chrome/browser/chromeos/login/test/https_forwarder.py
@@ -9,6 +9,7 @@
 import BaseHTTPServer
 import minica
 import re
+import socket
 import SocketServer
 import sys
 import urllib2
@@ -161,9 +162,32 @@
     host = self.options.host
     ssl_host = self.options.ssl_host
 
+    # Allow |ssl_host| to be an IP address or a domain name, and ensure
+    # it gets added as the appropriate subjectAltName of the generated
+    # certificate.
+    dns_sans = None
+    ip_sans = None
+    ip = None
+    if ip is None:
+      try:
+        ip = socket.inet_pton(socket.AF_INET, ssl_host)
+        ip_sans = [ip]
+      except socket.error:
+        pass
+    if ip is None:
+      try:
+        ip = socket.inet_pton(socket.AF_INET6, ssl_host)
+        ip_sans = [ip]
+      except socket.error:
+        pass
+    if ip is None:
+      dns_sans = [ssl_host]
+
     (pem_cert_and_key, ocsp_der) = minica.GenerateCertKeyAndOCSP(
         subject = self.options.ssl_host,
-        ocsp_url = None)
+        ocsp_url = None,
+        ip_sans = ip_sans,
+        dns_sans = dns_sans)
 
     server = MultiThreadedHTTPSServer((host, port),
                                       RequestForwarder,
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
index d45468b..803684c3 100644
--- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc
+++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -247,6 +247,9 @@
   { key::kEnableSha1ForLocalAnchors,
     ssl_config::prefs::kCertEnableSha1LocalAnchors,
     base::Value::Type::BOOLEAN },
+  { key::kEnableCommonNameFallbackForLocalAnchors,
+    ssl_config::prefs::kCertEnableCommonNameFallbackLocalAnchors,
+    base::Value::Type::BOOLEAN },
   { key::kAuthSchemes,
     prefs::kAuthSchemes,
     base::Value::Type::STRING },
diff --git a/chrome/browser/resources/settings/appearance_page/appearance_page.html b/chrome/browser/resources/settings/appearance_page/appearance_page.html
index de37163..ac2a024 100644
--- a/chrome/browser/resources/settings/appearance_page/appearance_page.html
+++ b/chrome/browser/resources/settings/appearance_page/appearance_page.html
@@ -111,11 +111,11 @@
               hidden="[[!pageVisibility.homeButton]]">
             <settings-radio-group pref="{{prefs.homepage_is_newtabpage}}">
               <controlled-radio-button class="list-item" name="true"
-                  pref="[[prefs.homepage_is_newtabpage]]">
+                  pref="[[prefs.homepage_is_newtabpage]]" ignore-extensions>
                 $i18n{homePageNtp}
               </controlled-radio-button>
               <controlled-radio-button class="list-item" name="false"
-                  pref="[[prefs.homepage_is_newtabpage]]">
+                  pref="[[prefs.homepage_is_newtabpage]]" ignore-extensions>
                 $i18n{other}
                 <!-- TODO(dbeam): this can show double indicators when both
                      homepage and whether to use the NTP as the homepage are
@@ -123,7 +123,7 @@
                 <settings-input no-label-float pref="{{prefs.homepage}}"
                     label="$i18n{exampleDotCom}"
                     can-tab="[[!prefs.homepage_is_newtabpage.value]]"
-                    stop-keyboard-event-propagation>
+                    stop-keyboard-event-propagation ignore-extensions>
                 </settings-input>
               </controlled-radio-button>
               <template is="dom-if" if="[[prefs.homepage.extensionId]]">
diff --git a/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.js b/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.js
index bae9955..ffb43f0 100644
--- a/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.js
+++ b/chrome/browser/resources/settings/controls/settings_boolean_control_behavior.js
@@ -126,7 +126,7 @@
    * @private
    */
   controlDisabled_: function() {
-    return this.disabled || this.isPrefPolicyControlled();
+    return this.disabled || this.isPrefEnforced();
   },
 };
 
diff --git a/chrome/browser/resources/settings/controls/settings_input.js b/chrome/browser/resources/settings/controls/settings_input.js
index 0bee823..2b39de1 100644
--- a/chrome/browser/resources/settings/controls/settings_input.js
+++ b/chrome/browser/resources/settings/controls/settings_input.js
@@ -123,6 +123,6 @@
    * @private
    */
   isDisabled_: function(disabled) {
-    return disabled || this.isPrefPolicyControlled();
+    return disabled || this.isPrefEnforced();
   },
 });
diff --git a/chrome/browser/resources/settings/internet_page/network_proxy.html b/chrome/browser/resources/settings/internet_page/network_proxy.html
index f2c2b8d9..9f251db 100644
--- a/chrome/browser/resources/settings/internet_page/network_proxy.html
+++ b/chrome/browser/resources/settings/internet_page/network_proxy.html
@@ -59,7 +59,8 @@
       <div class="settings-box continuation single-column">
         <div class="layout horizontal center">
           <cr-policy-network-indicator
-              property="[[networkProperties.ProxySettings.Type]]">
+              property="[[networkProperties.ProxySettings.Type]]"
+              ignore-extensions>
           </cr-policy-network-indicator>
           <div>$i18n{networkProxyEnforcedPolicy}</div>
         </div>
diff --git a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
index 940c053..1d1642e 100644
--- a/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
+++ b/chrome/browser/resources/settings/on_startup_page/on_startup_page.html
@@ -14,7 +14,7 @@
       <settings-radio-group id="onStartupRadioGroup"
           pref="{{prefs.session.restore_on_startup}}">
         <controlled-radio-button name="[[prefValues_.OPEN_NEW_TAB]]"
-            pref="[[prefs.session.restore_on_startup]]">
+            pref="[[prefs.session.restore_on_startup]]" ignore-extensions>
           $i18n{onStartupOpenNewTab}
         </controlled-radio-button>
         <template is="dom-if" if="[[showIndicator_(
diff --git a/chrome/browser/resources/settings/settings_ui/settings_ui.js b/chrome/browser/resources/settings/settings_ui/settings_ui.js
index e6fbee50..c05b827 100644
--- a/chrome/browser/resources/settings/settings_ui/settings_ui.js
+++ b/chrome/browser/resources/settings/settings_ui/settings_ui.js
@@ -90,6 +90,8 @@
     }.bind(this));
 
     CrPolicyStrings = {
+      controlledSettingExtension:
+          loadTimeData.getString('controlledSettingExtension'),
       controlledSettingPolicy:
           loadTimeData.getString('controlledSettingPolicy'),
       controlledSettingRecommendedMatches:
diff --git a/chrome/browser/resources/settings/system_page/system_page.html b/chrome/browser/resources/settings/system_page/system_page.html
index 6cd6aa2..d1d8229 100644
--- a/chrome/browser/resources/settings/system_page/system_page.html
+++ b/chrome/browser/resources/settings/system_page/system_page.html
@@ -33,7 +33,7 @@
     </div>
     <div class="settings-box">
       <controlled-button class="primary-button" pref="[[prefs.proxy]]"
-          on-tap="onChangeProxySettingsTap_">
+          on-tap="onChangeProxySettingsTap_" ignore-extensions>
         $i18n{changeProxySettings}
       </controlled-button>
     </div>
diff --git a/chrome/browser/ui/omnibox/omnibox_controller_unittest.cc b/chrome/browser/ui/omnibox/omnibox_controller_unittest.cc
index c46bbb4..16874ca 100644
--- a/chrome/browser/ui/omnibox/omnibox_controller_unittest.cc
+++ b/chrome/browser/ui/omnibox/omnibox_controller_unittest.cc
@@ -6,7 +6,6 @@
 
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
-#include "base/strings/string_util.h"
 #include "chrome/browser/autocomplete/chrome_autocomplete_provider_client.h"
 #include "chrome/browser/autocomplete/chrome_autocomplete_scheme_classifier.h"
 #include "chrome/test/base/testing_profile.h"
@@ -19,6 +18,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
+
 class TestOmniboxClient : public OmniboxClient {
  public:
   explicit TestOmniboxClient(Profile* profile)
@@ -31,62 +31,10 @@
       override {
     return base::MakeUnique<ChromeAutocompleteProviderClient>(profile_);
   }
-  std::unique_ptr<OmniboxNavigationObserver> CreateOmniboxNavigationObserver(
-      const base::string16& text,
-      const AutocompleteMatch& match,
-      const AutocompleteMatch& alternate_nav_match) override {
-    return nullptr;
-  }
-  bool CurrentPageExists() const override { return true; }
-  const GURL& GetURL() const override { return GURL::EmptyGURL(); }
-  const base::string16& GetTitle() const override {
-    return base::EmptyString16();
-  }
-  gfx::Image GetFavicon() const override { return gfx::Image(); }
-  bool IsInstantNTP() const override { return false; }
-  bool IsSearchResultsPage() const override { return false; }
-  bool IsLoading() const override { return false; }
-  bool IsPasteAndGoEnabled() const override { return false; }
-  bool IsNewTabPage(const std::string& url) const override { return false; }
-  bool IsHomePage(const std::string& url) const override { return false; }
   const SessionID& GetSessionID() const override { return session_id_; }
-  bookmarks::BookmarkModel* GetBookmarkModel() override { return nullptr; }
-  TemplateURLService* GetTemplateURLService() override { return nullptr; }
   const AutocompleteSchemeClassifier& GetSchemeClassifier() const override {
     return scheme_classifier_;
   }
-  AutocompleteClassifier* GetAutocompleteClassifier() override {
-    return nullptr;
-  }
-  gfx::Image GetIconIfExtensionMatch(
-      const AutocompleteMatch& match) const override {
-    return gfx::Image();
-  }
-  bool ProcessExtensionKeyword(TemplateURL* template_url,
-                               const AutocompleteMatch& match,
-                               WindowOpenDisposition disposition,
-                               OmniboxNavigationObserver* observer) override {
-    return false;
-  }
-  void OnInputStateChanged() override {}
-  void OnFocusChanged(OmniboxFocusState state,
-                      OmniboxFocusChangeReason reason) override {}
-  void OnResultChanged(const AutocompleteResult& result,
-                       bool default_match_changed,
-                       const base::Callback<void(const SkBitmap& bitmap)>&
-                           on_bitmap_fetched) override {}
-  void OnCurrentMatchChanged(const AutocompleteMatch& match) override {}
-  void OnTextChanged(const AutocompleteMatch& current_match,
-                     bool user_input_in_progress,
-                     base::string16& user_text,
-                     const AutocompleteResult& result,
-                     bool is_popup_open,
-                     bool has_focus) override {}
-  void OnInputAccepted(const AutocompleteMatch& match) override {}
-  void OnRevert() override {}
-  void OnURLOpenedFromOmnibox(OmniboxLog* log) override {}
-  void OnBookmarkLaunched() override {}
-  void DiscardNonCommittedNavigations() override {}
 
  private:
   Profile* profile_;
diff --git a/chrome/browser/ui/webui/policy_indicator_localized_strings_provider.cc b/chrome/browser/ui/webui/policy_indicator_localized_strings_provider.cc
index c36cf177..53157556 100644
--- a/chrome/browser/ui/webui/policy_indicator_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/policy_indicator_localized_strings_provider.cc
@@ -18,6 +18,8 @@
   html_source->AddLocalizedString(
       "controlledSettingRecommendedDiffers",
       IDS_OPTIONS_CONTROLLED_SETTING_HAS_RECOMMENDATION);
+  html_source->AddLocalizedString("controlledSettingExtension",
+                                  IDS_OPTIONS_CONTROLLED_SETTING_EXTENSION);
 #if defined(OS_CHROMEOS)
   html_source->AddLocalizedString("controlledSettingShared",
                                   IDS_OPTIONS_CONTROLLED_SETTING_SHARED);
diff --git a/chrome/test/data/extensions/api_test/platform_keys/ca.cnf b/chrome/test/data/extensions/api_test/platform_keys/ca.cnf
index ddac803..57fa960 100644
--- a/chrome/test/data/extensions/api_test/platform_keys/ca.cnf
+++ b/chrome/test/data/extensions/api_test/platform_keys/ca.cnf
@@ -27,6 +27,7 @@
 subjectKeyIdentifier   = hash
 authorityKeyIdentifier = keyid:always
 extendedKeyUsage       = serverAuth, clientAuth
+subjectAltName         = DNS:${ENV::CN}
 
 [ca_cert]
 # Extensions to add when signing a request for an intermediate/CA cert
@@ -54,4 +55,4 @@
 distinguished_name = dn
 
 [dn]
-CN = $ENV::CN
+CN = ${ENV::CN}
diff --git a/chrome/test/data/extensions/api_test/platform_keys/l1_interm.der b/chrome/test/data/extensions/api_test/platform_keys/l1_interm.der
index f56ea482..501208c 100644
--- a/chrome/test/data/extensions/api_test/platform_keys/l1_interm.der
+++ b/chrome/test/data/extensions/api_test/platform_keys/l1_interm.der
Binary files differ
diff --git a/chrome/test/data/extensions/api_test/platform_keys/l1_leaf.der b/chrome/test/data/extensions/api_test/platform_keys/l1_leaf.der
index 358380c..7cb81071f 100644
--- a/chrome/test/data/extensions/api_test/platform_keys/l1_leaf.der
+++ b/chrome/test/data/extensions/api_test/platform_keys/l1_leaf.der
Binary files differ
diff --git a/chrome/test/data/extensions/api_test/platform_keys/l2_leaf.der b/chrome/test/data/extensions/api_test/platform_keys/l2_leaf.der
index 04774369..e1ad77e 100644
--- a/chrome/test/data/extensions/api_test/platform_keys/l2_leaf.der
+++ b/chrome/test/data/extensions/api_test/platform_keys/l2_leaf.der
Binary files differ
diff --git a/chrome/test/data/extensions/api_test/platform_keys/root.pem b/chrome/test/data/extensions/api_test/platform_keys/root.pem
index 8681990..2f10875 100644
--- a/chrome/test/data/extensions/api_test/platform_keys/root.pem
+++ b/chrome/test/data/extensions/api_test/platform_keys/root.pem
@@ -1,19 +1,19 @@
 -----BEGIN CERTIFICATE-----
-MIIDBDCCAeygAwIBAgIJAPzptz/6abHIMA0GCSqGSIb3DQEBCwUAMA8xDTALBgNV
-BAMMBHJvb3QwHhcNMTUwNTE5MDkzMTQwWhcNMjUwNTE2MDkzMTQwWjAPMQ0wCwYD
-VQQDDARyb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqFm0ruJH
-FcsiLRY+j1LaW2StdCyKSG0LVqb4RYrzuVi1rPbAC9+L9QP1zQL8iwQSGplpvUR6
-lZW2ykL9OgUroje6BQYl9RkUyHF3a3iG5wqHB1ileUmu69+fcCl1ohUfwgWW3QWf
-Kglp1wyThOOaiOclV2K9e/JxEoq8Ng6BvBE4coGr7tHQxajbcjoDkyMC+yXneghn
-yyeNS1qZ+kY3Aw3KQVc+wJ5EyuErM3ARDaT1fVOfiyS2kbpRCqFlhYGdCFp8ebuk
-PY7FJLFvmPp8A41bEqLXgJ4l9ynGHqyYmf+n7PKg6HChRnWGIrha2SsPaIfDX8Sh
-Cf8vaxR3KPAFMwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
-t0RZWqsOg9uMi/BtiODSFRcV2DAfBgNVHSMEGDAWgBRTt0RZWqsOg9uMi/BtiODS
-FRcV2DAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFX09PBL4l+T
-Wp1GjA/oVYtF8D6ZJ0w9+5bcTk8QlwBbNjKa55b6q6vzyx02kXsldJzcQjMoWWLg
-YQ+c1tngd6UoMEdQzGnc93WR2DDNXEZgEGbFfydxRx6PHNtGWN5vRSwANScCG6NA
-PEcIDOT3gZ9sXaogYqzwXwpc0bv3r6Ema9ZPO7QzCVnqJVFyDXHdGDSSZ55jDAep
-yqTSzGLalPWTfkqCULIzRtOT6aAtYUtbNNp3XbxOtw8EMxfBvmD5Rniy0yw43KMI
-raG5YyEDaV72xTKpYs/UDImvT7LgS0XFRP7jH5agqjKkCLy1gBYnue0BAI7qusWA
-3CqAWWi3btw=
+MIIDBDCCAeygAwIBAgIJAPOnDaWbXYCtMA0GCSqGSIb3DQEBBQUAMA8xDTALBgNV
+BAMMBHJvb3QwHhcNMTcwMzAzMDY1NzAxWhcNMjcwMzAxMDY1NzAxWjAPMQ0wCwYD
+VQQDDARyb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqAI+E44b
+WMGGLZxDxKjuOHtOlKxW7V5zrfoLOY+4zoabJ7AsIO6wvNAT8QBkwaEUYvQlkmgT
+f0VtBlxkcS+l+lKHNAlTAPWr1JnL2rckL/s7ll5jGOCeXoaRTNoFm1SSvouN0iKz
+8Ph0Z68F2iC6Z/EdykDvMfkz4sXBcVv2VS9Hf7ruOXed25HMiXtQU/RnhGr72rGx
+TIn7ttb5Yg7Jykey94vIHaOd6+LOWYnTS2wucvR/JQp5u4RfcEnyw2KYknmTJguM
+Y7l72Pcp7lZepvlMdB34oniBD9IkRxxY9qoQF+7PII046jwNgs/mlv8HrkF3ZP8J
+xX150krIhvIbjQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRm
+k2ll7KjvWLmhuU1kp6q2NzNVOjAfBgNVHSMEGDAWgBRmk2ll7KjvWLmhuU1kp6q2
+NzNVOjAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAErO+cG1AMXW
+nYmXUGQNYVqfYjXGGOf8HNoi6nGmYmw7gvR1EVP5OQAQDWH2Ae4RYmPZ685RX3i9
+Y5xOnwc6SDjYEekhkryjm/RdittgdK3bmVmpJ1bh8j3cy8QwMwT1fZaD3oI1Q4Ql
+QeqWkKCE2AP2poKOtYh22/L9BUhMe+F3ZTi8VroV+CEeZcBxO1GRVgL2A8H0QPyz
+vaCBvHSRJWmkXhukPg3qntbJtB8eCSJLHyl4yVRbG6X1H1QByOPZChCUGevRF5Zf
+PrPhzJnBXAatHIYCI9ZlVEaXVScqwXEpnpwcFVcRPKblLX2wTLG4lg01RZYc//vL
+VoN+PcoAMMg=
 -----END CERTIFICATE-----
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json
index 6e04df2..2ad48a9 100644
--- a/chrome/test/data/policy/policy_test_cases.json
+++ b/chrome/test/data/policy/policy_test_cases.json
@@ -693,6 +693,16 @@
     ]
   },
 
+  "EnableCommonNameFallbackForLocalAnchors": {
+    "os": ["win", "linux", "mac", "chromeos", "android"],
+    "test_policy": { "EnableCommonNameFallbackForLocalAnchors": true },
+    "pref_mappings": [
+      { "pref": "ssl.common_name_fallback_enabled_for_local_anchors",
+        "local_state": true
+      }
+    ]
+  },
+
   "AuthSchemes": {
     "os": ["win", "linux", "mac", "chromeos", "android"],
     "test_policy": { "AuthSchemes": "AuthSchemes" },
diff --git a/chrome/test/data/webui/settings/controlled_button_tests.js b/chrome/test/data/webui/settings/controlled_button_tests.js
index 3a66529..100bc4c9 100644
--- a/chrome/test/data/webui/settings/controlled_button_tests.js
+++ b/chrome/test/data/webui/settings/controlled_button_tests.js
@@ -40,7 +40,7 @@
     controlledButton.pref = extensionControlledPref;
     Polymer.dom.flush();
     assertTrue(controlledButton.$$('paper-button').disabled);
-    assertFalse(!!controlledButton.$$('cr-policy-pref-indicator'));
+    assertTrue(!!controlledButton.$$('cr-policy-pref-indicator'));
 
     controlledButton.pref = policyControlledPref;
     Polymer.dom.flush();
diff --git a/components/offline_pages/core/background/offliner.h b/components/offline_pages/core/background/offliner.h
index 2c36452..c50df35 100644
--- a/components/offline_pages/core/background/offliner.h
+++ b/components/offline_pages/core/background/offliner.h
@@ -63,6 +63,9 @@
   // TODO(dougarnett): consider passing back a request id instead of request.
   typedef base::Callback<void(const SavePageRequest&, RequestStatus)>
       CompletionCallback;
+  // Reports that the cancel operation has completed.
+  // TODO(chili): make save operation cancellable.
+  typedef base::Callback<void(int64_t request_id)> CancelCallback;
 
   Offliner() {}
   virtual ~Offliner() {}
@@ -75,7 +78,7 @@
 
   // Clears the currently processing request, if any, and skips running its
   // CompletionCallback.
-  virtual void Cancel() = 0;
+  virtual void Cancel(const CancelCallback& callback) = 0;
 
   // Handles timeout scenario. Returns true if lowbar is met and try to do a
   // snapshot of the current webcontents.
diff --git a/components/offline_pages/core/background/offliner_stub.cc b/components/offline_pages/core/background/offliner_stub.cc
index 3b3c1f56..c007ae0a 100644
--- a/components/offline_pages/core/background/offliner_stub.cc
+++ b/components/offline_pages/core/background/offliner_stub.cc
@@ -34,8 +34,9 @@
   return true;
 }
 
-void OfflinerStub::Cancel() {
+void OfflinerStub::Cancel(const CancelCallback& callback) {
   cancel_called_ = true;
+  callback.Run(0LL);
 }
 
 bool OfflinerStub::HandleTimeout(const SavePageRequest& request) {
diff --git a/components/offline_pages/core/background/offliner_stub.h b/components/offline_pages/core/background/offliner_stub.h
index 821f5ea9..16abb8f7 100644
--- a/components/offline_pages/core/background/offliner_stub.h
+++ b/components/offline_pages/core/background/offliner_stub.h
@@ -19,7 +19,7 @@
   bool LoadAndSave(const SavePageRequest& request,
                    const CompletionCallback& callback) override;
 
-  void Cancel() override;
+  void Cancel(const CancelCallback& callback) override;
 
   void disable_loading() { disable_loading_ = true; }
 
diff --git a/components/offline_pages/core/background/request_coordinator.cc b/components/offline_pages/core/background/request_coordinator.cc
index 5a363c0a..f729bc51 100644
--- a/components/offline_pages/core/background/request_coordinator.cc
+++ b/components/offline_pages/core/background/request_coordinator.cc
@@ -263,35 +263,21 @@
   callback.Run(std::move(requests));
 }
 
-void RequestCoordinator::StopPrerendering(Offliner::RequestStatus stop_status) {
+void RequestCoordinator::StopPrerendering(
+    const Offliner::CancelCallback& final_callback,
+    Offliner::RequestStatus stop_status) {
   if (offliner_ && is_busy_) {
     DCHECK(active_request_.get());
-    offliner_->Cancel();
-
-    if (stop_status == Offliner::RequestStatus::REQUEST_COORDINATOR_TIMED_OUT ||
-        stop_status == Offliner::RequestStatus::BACKGROUND_SCHEDULER_CANCELED) {
-      // Consider watchdog timeout a completed attempt.
-      SavePageRequest request(*active_request_.get());
-      UpdateRequestForCompletedAttempt(request, stop_status);
-    } else {
-      // Otherwise consider this stop an aborted attempt.
-      UpdateRequestForAbortedAttempt(*active_request_.get());
-    }
+    offliner_->Cancel(base::Bind(
+        &RequestCoordinator::HandleCancelUpdateStatusCallback,
+        weak_ptr_factory_.GetWeakPtr(), final_callback, stop_status));
+    return;
   }
 
-  // Stopping offliner means it will not call callback so set last status.
-  last_offlining_status_ = stop_status;
-
-  if (active_request_) {
-    event_logger_.RecordOfflinerResult(active_request_->client_id().name_space,
-                                       last_offlining_status_,
-                                       active_request_->request_id());
-    RecordOfflinerResultUMA(active_request_->client_id(),
-                            active_request_->creation_time(),
-                            last_offlining_status_);
-    is_busy_ = false;
-    active_request_.reset();
-  }
+  UpdateStatusForCancel(stop_status);
+  int64_t request_id =
+      active_request_.get() ? active_request_->request_id() : 0LL;
+  final_callback.Run(request_id);
 }
 
 void RequestCoordinator::GetRequestsForSchedulingCallback(
@@ -322,8 +308,10 @@
   if (active_request_ != nullptr) {
     if (request_ids.end() != std::find(request_ids.begin(), request_ids.end(),
                                        active_request_->request_id())) {
-      StopPrerendering(Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED);
-      active_request_.reset(nullptr);
+      StopPrerendering(
+          base::Bind(&RequestCoordinator::ResetActiveRequestCallback,
+                     weak_ptr_factory_.GetWeakPtr()),
+          Offliner::RequestStatus::REQUEST_COORDINATOR_CANCELED);
       return true;
     }
   }
@@ -505,6 +493,53 @@
     NotifyCompleted(request, status);
 }
 
+void RequestCoordinator::HandleCancelUpdateStatusCallback(
+    const Offliner::CancelCallback& final_callback,
+    Offliner::RequestStatus stop_status,
+    int64_t offline_id) {
+  if (stop_status == Offliner::RequestStatus::REQUEST_COORDINATOR_TIMED_OUT ||
+      stop_status == Offliner::RequestStatus::BACKGROUND_SCHEDULER_CANCELED) {
+    // Consider watchdog timeout a completed attempt.
+    SavePageRequest request(*active_request_.get());
+    UpdateRequestForCompletedAttempt(request, stop_status);
+  } else {
+    // Otherwise consider this stop an aborted attempt.
+    UpdateRequestForAbortedAttempt(*active_request_.get());
+  }
+
+  UpdateStatusForCancel(stop_status);
+  final_callback.Run(offline_id);
+}
+
+void RequestCoordinator::UpdateStatusForCancel(
+    Offliner::RequestStatus stop_status) {
+  // Stopping offliner means it will not call callback so set last status.
+  last_offlining_status_ = stop_status;
+
+  if (active_request_) {
+    event_logger_.RecordOfflinerResult(active_request_->client_id().name_space,
+                                       last_offlining_status_,
+                                       active_request_->request_id());
+    RecordOfflinerResultUMA(active_request_->client_id(),
+                            active_request_->creation_time(),
+                            last_offlining_status_);
+    is_busy_ = false;
+    active_request_.reset();
+  }
+}
+
+void RequestCoordinator::ResetActiveRequestCallback(int64_t offline_id) {
+  active_request_.reset();
+}
+
+void RequestCoordinator::StartSchedulerCallback(int64_t offline_id) {
+  scheduler_callback_.Run(true);
+}
+
+void RequestCoordinator::TryNextRequestCallback(int64_t offline_id) {
+  TryNextRequest(!kStartOfProcessing);
+}
+
 void RequestCoordinator::ScheduleAsNeeded() {
   // Get all requests from queue (there is no filtering mechanism).
   queue_->GetRequests(
@@ -514,10 +549,9 @@
 
 void RequestCoordinator::StopProcessing(Offliner::RequestStatus stop_status) {
   processing_state_ = ProcessingWindowState::STOPPED;
-  StopPrerendering(stop_status);
-
-  // Let the scheduler know we are done processing.
-  scheduler_callback_.Run(true);
+  StopPrerendering(base::Bind(&RequestCoordinator::StartSchedulerCallback,
+                              weak_ptr_factory_.GetWeakPtr()),
+                   stop_status);
 }
 
 void RequestCoordinator::HandleWatchdogTimeout() {
@@ -525,8 +559,9 @@
       Offliner::REQUEST_COORDINATOR_TIMED_OUT;
   if (offliner_->HandleTimeout(*active_request_.get()))
     return;
-  StopPrerendering(watchdog_status);
-  TryNextRequest(!kStartOfProcessing);
+  StopPrerendering(base::Bind(&RequestCoordinator::TryNextRequestCallback,
+                              weak_ptr_factory_.GetWeakPtr()),
+                   watchdog_status);
 }
 
 // Returns true if the caller should expect a callback, false otherwise. For
diff --git a/components/offline_pages/core/background/request_coordinator.h b/components/offline_pages/core/background/request_coordinator.h
index b9d3fae9..770cae3 100644
--- a/components/offline_pages/core/background/request_coordinator.h
+++ b/components/offline_pages/core/background/request_coordinator.h
@@ -274,6 +274,17 @@
   void HandleRemovedRequests(RequestNotifier::BackgroundSavePageResult status,
                              std::unique_ptr<UpdateRequestsResult> result);
 
+  // Handle updating of request status after cancel is called. Will call
+  // HandleCancelRecordResultCallback for UMA handling
+  void HandleCancelUpdateStatusCallback(
+      const Offliner::CancelCallback& next_callback,
+      Offliner::RequestStatus stop_status,
+      int64_t offline_id);
+  void UpdateStatusForCancel(Offliner::RequestStatus stop_status);
+  void ResetActiveRequestCallback(int64_t offline_id);
+  void StartSchedulerCallback(int64_t offline_id);
+  void TryNextRequestCallback(int64_t offline_id);
+
   bool StartProcessingInternal(const ProcessingWindowState processing_state,
                                const base::Callback<void(bool)>& callback);
 
@@ -318,7 +329,8 @@
   void HandleWatchdogTimeout();
 
   // Cancels an in progress pre-rendering, and updates state appropriately.
-  void StopPrerendering(Offliner::RequestStatus stop_status);
+  void StopPrerendering(const Offliner::CancelCallback& callback,
+                        Offliner::RequestStatus stop_status);
 
   // Marks attempt on the request and sends it to offliner in continuation.
   void SendRequestToOffliner(const SavePageRequest& request);
diff --git a/components/omnibox/browser/BUILD.gn b/components/omnibox/browser/BUILD.gn
index d4bc859..926825f 100644
--- a/components/omnibox/browser/BUILD.gn
+++ b/components/omnibox/browser/BUILD.gn
@@ -70,6 +70,7 @@
     "keyword_provider.cc",
     "keyword_provider.h",
     "match_compare.h",
+    "omnibox_client.cc",
     "omnibox_client.h",
     "omnibox_controller.cc",
     "omnibox_controller.h",
diff --git a/components/omnibox/browser/omnibox_client.cc b/components/omnibox/browser/omnibox_client.cc
new file mode 100644
index 0000000..7f85f44
--- /dev/null
+++ b/components/omnibox/browser/omnibox_client.cc
@@ -0,0 +1,81 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/omnibox/browser/omnibox_client.h"
+
+#include "base/strings/string_util.h"
+#include "ui/gfx/image/image.h"
+
+std::unique_ptr<OmniboxNavigationObserver>
+OmniboxClient::CreateOmniboxNavigationObserver(
+    const base::string16& text,
+    const AutocompleteMatch& match,
+    const AutocompleteMatch& alternate_nav_match) {
+  return nullptr;
+}
+
+bool OmniboxClient::CurrentPageExists() const {
+  return true;
+}
+
+const GURL& OmniboxClient::GetURL() const {
+  return GURL::EmptyGURL();
+}
+
+const base::string16& OmniboxClient::GetTitle() const {
+  return base::EmptyString16();
+}
+
+gfx::Image OmniboxClient::GetFavicon() const {
+  return gfx::Image();
+}
+
+bool OmniboxClient::IsInstantNTP() const {
+  return false;
+}
+
+bool OmniboxClient::IsSearchResultsPage() const {
+  return false;
+}
+
+bool OmniboxClient::IsLoading() const {
+  return false;
+}
+
+bool OmniboxClient::IsPasteAndGoEnabled() const {
+  return false;
+}
+
+bool OmniboxClient::IsNewTabPage(const std::string& url) const {
+  return false;
+}
+
+bool OmniboxClient::IsHomePage(const std::string& url) const {
+  return false;
+}
+
+bookmarks::BookmarkModel* OmniboxClient::GetBookmarkModel() {
+  return nullptr;
+}
+
+TemplateURLService* OmniboxClient::GetTemplateURLService() {
+  return nullptr;
+}
+
+AutocompleteClassifier* OmniboxClient::GetAutocompleteClassifier() {
+  return nullptr;
+}
+
+gfx::Image OmniboxClient::GetIconIfExtensionMatch(
+    const AutocompleteMatch& match) const {
+  return gfx::Image();
+}
+
+bool OmniboxClient::ProcessExtensionKeyword(
+    TemplateURL* template_url,
+    const AutocompleteMatch& match,
+    WindowOpenDisposition disposition,
+    OmniboxNavigationObserver* observer) {
+  return false;
+}
diff --git a/components/omnibox/browser/omnibox_client.h b/components/omnibox/browser/omnibox_client.h
index 10a177f..4d8cf2b 100644
--- a/components/omnibox/browser/omnibox_client.h
+++ b/components/omnibox/browser/omnibox_client.h
@@ -43,54 +43,53 @@
   // Returns an OmniboxNavigationObserver specific to the embedder context. May
   // return null if the embedder has no need to observe omnibox navigations.
   virtual std::unique_ptr<OmniboxNavigationObserver>
-  CreateOmniboxNavigationObserver(
-      const base::string16& text,
-      const AutocompleteMatch& match,
-      const AutocompleteMatch& alternate_nav_match) = 0;
+  CreateOmniboxNavigationObserver(const base::string16& text,
+                                  const AutocompleteMatch& match,
+                                  const AutocompleteMatch& alternate_nav_match);
 
   // Returns whether there is any associated current page.  For example, during
   // startup or shutdown, the omnibox may exist but have no attached page.
-  virtual bool CurrentPageExists() const = 0;
+  virtual bool CurrentPageExists() const;
 
   // Returns the URL of the current page.
-  virtual const GURL& GetURL() const = 0;
+  virtual const GURL& GetURL() const;
 
   // Returns the title of the current page.
-  virtual const base::string16& GetTitle() const = 0;
+  virtual const base::string16& GetTitle() const;
 
   // Returns the favicon of the current page.
-  virtual gfx::Image GetFavicon() const = 0;
+  virtual gfx::Image GetFavicon() const;
 
   // Returns true if the visible entry is a New Tab Page rendered by Instant.
-  virtual bool IsInstantNTP() const = 0;
+  virtual bool IsInstantNTP() const;
 
   // Returns true if the committed entry is a search results page.
-  virtual bool IsSearchResultsPage() const = 0;
+  virtual bool IsSearchResultsPage() const;
 
   // Returns whether the current page is loading.
-  virtual bool IsLoading() const = 0;
+  virtual bool IsLoading() const;
 
   // Returns whether paste-and-go functionality is enabled.
-  virtual bool IsPasteAndGoEnabled() const = 0;
+  virtual bool IsPasteAndGoEnabled() const;
 
   // Returns whether |url| corresponds to the new tab page.
-  virtual bool IsNewTabPage(const std::string& url) const = 0;
+  virtual bool IsNewTabPage(const std::string& url) const;
 
   // Returns whether |url| corresponds to the user's home page.
-  virtual bool IsHomePage(const std::string& url) const = 0;
+  virtual bool IsHomePage(const std::string& url) const;
 
   // Returns the session ID of the current page.
   virtual const SessionID& GetSessionID() const = 0;
 
-  virtual bookmarks::BookmarkModel* GetBookmarkModel() = 0;
-  virtual TemplateURLService* GetTemplateURLService() = 0;
+  virtual bookmarks::BookmarkModel* GetBookmarkModel();
+  virtual TemplateURLService* GetTemplateURLService();
   virtual const AutocompleteSchemeClassifier& GetSchemeClassifier() const = 0;
-  virtual AutocompleteClassifier* GetAutocompleteClassifier() = 0;
+  virtual AutocompleteClassifier* GetAutocompleteClassifier();
 
   // Returns the icon corresponding to |match| if match is an extension match
   // and an empty icon otherwise.
   virtual gfx::Image GetIconIfExtensionMatch(
-      const AutocompleteMatch& match) const = 0;
+      const AutocompleteMatch& match) const;
 
   // Checks whether |template_url| is an extension keyword; if so, asks the
   // ExtensionOmniboxEventRouter to process |match| for it and returns true.
@@ -101,25 +100,25 @@
   virtual bool ProcessExtensionKeyword(TemplateURL* template_url,
                                        const AutocompleteMatch& match,
                                        WindowOpenDisposition disposition,
-                                       OmniboxNavigationObserver* observer) = 0;
+                                       OmniboxNavigationObserver* observer);
 
   // Called to notify clients that the omnibox input state has changed.
-  virtual void OnInputStateChanged() = 0;
+  virtual void OnInputStateChanged() {}
 
   // Called to notify clients that the omnibox focus state has changed.
   virtual void OnFocusChanged(OmniboxFocusState state,
-                              OmniboxFocusChangeReason reason) = 0;
+                              OmniboxFocusChangeReason reason) {}
 
   // Called when the autocomplete result has changed. If the embedder supports
   // fetching of bitmaps for URLs (not all embedders do), |on_bitmap_fetched|
   // will be called when the bitmap has been fetched.
-  virtual void OnResultChanged(
-      const AutocompleteResult& result,
-      bool default_match_changed,
-      const BitmapFetchedCallback& on_bitmap_fetched) = 0;
+  virtual void OnResultChanged(const AutocompleteResult& result,
+                               bool default_match_changed,
+                               const BitmapFetchedCallback& on_bitmap_fetched) {
+  }
 
   // Called when the current autocomplete match has changed.
-  virtual void OnCurrentMatchChanged(const AutocompleteMatch& match) = 0;
+  virtual void OnCurrentMatchChanged(const AutocompleteMatch& match) {}
 
   // Called when the text may have changed in the edit.
   virtual void OnTextChanged(const AutocompleteMatch& current_match,
@@ -127,22 +126,22 @@
                              base::string16& user_text,
                              const AutocompleteResult& result,
                              bool is_popup_open,
-                             bool has_focus) = 0;
+                             bool has_focus) {}
 
   // Called when input has been accepted.
-  virtual void OnInputAccepted(const AutocompleteMatch& match) = 0;
+  virtual void OnInputAccepted(const AutocompleteMatch& match) {}
 
   // Called when the edit model is being reverted back to its unedited state.
-  virtual void OnRevert() = 0;
+  virtual void OnRevert() {}
 
   // Called to notify clients that a URL was opened from the omnibox.
-  virtual void OnURLOpenedFromOmnibox(OmniboxLog* log) = 0;
+  virtual void OnURLOpenedFromOmnibox(OmniboxLog* log) {}
 
   // Called when a bookmark is launched from the omnibox.
-  virtual void OnBookmarkLaunched() = 0;
+  virtual void OnBookmarkLaunched() {}
 
   // Discards the state for all pending and transient navigations.
-  virtual void DiscardNonCommittedNavigations() = 0;
+  virtual void DiscardNonCommittedNavigations() {}
 };
 
 #endif  // COMPONENTS_OMNIBOX_BROWSER_OMNIBOX_CLIENT_H_
diff --git a/components/omnibox/browser/omnibox_edit_unittest.cc b/components/omnibox/browser/omnibox_edit_unittest.cc
index a04b15e..b216370 100644
--- a/components/omnibox/browser/omnibox_edit_unittest.cc
+++ b/components/omnibox/browser/omnibox_edit_unittest.cc
@@ -152,56 +152,13 @@
     alternate_nav_match_ = alternate_nav_match;
     return nullptr;
   }
-  bool CurrentPageExists() const override { return true; }
-  const GURL& GetURL() const override { return GURL::EmptyGURL(); }
-  const base::string16& GetTitle() const override {
-    return base::EmptyString16();
-  }
-  gfx::Image GetFavicon() const override { return gfx::Image(); }
-  bool IsInstantNTP() const override { return false; }
-  bool IsSearchResultsPage() const override { return false; }
-  bool IsLoading() const override { return false; }
-  bool IsPasteAndGoEnabled() const override { return false; }
-  bool IsNewTabPage(const std::string& url) const override { return false; }
-  bool IsHomePage(const std::string& url) const override { return false; }
   const SessionID& GetSessionID() const override { return session_id_; }
-  bookmarks::BookmarkModel* GetBookmarkModel() override { return nullptr; }
-  TemplateURLService* GetTemplateURLService() override { return nullptr; }
   const AutocompleteSchemeClassifier& GetSchemeClassifier() const override {
     return scheme_classifier_;
   }
   AutocompleteClassifier* GetAutocompleteClassifier() override {
     return &autocomplete_classifier_;
   }
-  gfx::Image GetIconIfExtensionMatch(
-      const AutocompleteMatch& match) const override {
-    return gfx::Image();
-  }
-  bool ProcessExtensionKeyword(TemplateURL* template_url,
-                               const AutocompleteMatch& match,
-                               WindowOpenDisposition disposition,
-                               OmniboxNavigationObserver* observer) override {
-    return false;
-  }
-  void OnInputStateChanged() override {}
-  void OnFocusChanged(OmniboxFocusState state,
-                      OmniboxFocusChangeReason reason) override {}
-  void OnResultChanged(const AutocompleteResult& result,
-                       bool default_match_changed,
-                       const base::Callback<void(const SkBitmap& bitmap)>&
-                           on_bitmap_fetched) override {}
-  void OnCurrentMatchChanged(const AutocompleteMatch& match) override {}
-  void OnTextChanged(const AutocompleteMatch& current_match,
-                     bool user_input_in_progress,
-                     base::string16& user_text,
-                     const AutocompleteResult& result,
-                     bool is_popup_open,
-                     bool has_focus) override {}
-  void OnInputAccepted(const AutocompleteMatch& match) override {}
-  void OnRevert() override {}
-  void OnURLOpenedFromOmnibox(OmniboxLog* log) override {}
-  void OnBookmarkLaunched() override {}
-  void DiscardNonCommittedNavigations() override {}
 
  private:
   SessionID session_id_;
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json
index 84c9694..9160b019 100644
--- a/components/policy/resources/policy_templates.json
+++ b/components/policy/resources/policy_templates.json
@@ -139,7 +139,7 @@
 #   persistent IDs for all fields (but not for groups!) are needed. These are
 #   specified by the 'id' keys of each policy. NEVER CHANGE EXISTING IDs,
 #   because doing so would break the deployed wire format!
-#   For your editing convenience: highest ID currently used: 365
+#   For your editing convenience: highest ID currently used: 366
 #   And don't forget to also update the EnterprisePolicies enum of
 #   histograms.xml (run tools/metrics/histograms/update_policies.py).
 #
@@ -4850,6 +4850,25 @@
       If this policy is not set, or it is set to false, then <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> follows the publicly announced SHA-1 deprecation schedule.''',
     },
     {
+      'name': 'EnableCommonNameFallbackForLocalAnchors',
+      'type': 'main',
+      'schema': { 'type': 'boolean' },
+      'supported_on': ['chrome.*:58-65', 'chrome_os:58-65', 'android:58-65'],
+      'features': {
+        'dynamic_refresh': True,
+        'per_profile': False,
+      },
+      'example_value': False,
+      'id': 366,
+      'caption': '''Whether to allow certificates issued by local trust anchors that are missing the subjectAlternativeName extension''',
+      'tags': ['system-security'],
+      'desc': '''When this setting is enabled, <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will use the commonName of a server certificate to match a hostname if the certificate is missing a subjectAlternativeName extension, as long as it successfully validates and chains to a locally-installed CA certificates.
+
+      Note that this is not recommended, as this may allow bypassing the nameConstraints extension that restricts the hostnames that a given certificate can be authorized for.
+
+      If this policy is not set, or is set to false, server certificates that lack a subjectAlternativeName extension containing either a DNS name or IP address will not be trusted.''',
+    },
+    {
       'name': 'ForceEphemeralProfiles',
       'type': 'main',
       'schema': { 'type': 'boolean' },
diff --git a/components/ssl_config/ssl_config_prefs.cc b/components/ssl_config/ssl_config_prefs.cc
index 7a515124..c255286 100644
--- a/components/ssl_config/ssl_config_prefs.cc
+++ b/components/ssl_config/ssl_config_prefs.cc
@@ -12,6 +12,8 @@
 const char kCertRevocationCheckingRequiredLocalAnchors[] =
     "ssl.rev_checking.required_for_local_anchors";
 const char kCertEnableSha1LocalAnchors[] = "ssl.sha1_enabled_for_local_anchors";
+const char kCertEnableCommonNameFallbackLocalAnchors[] =
+    "ssl.common_name_fallback_enabled_for_local_anchors";
 const char kSSLVersionMin[] = "ssl.version_min";
 const char kSSLVersionMax[] = "ssl.version_max";
 const char kCipherSuiteBlacklist[] = "ssl.cipher_suites.blacklist";
diff --git a/components/ssl_config/ssl_config_prefs.h b/components/ssl_config/ssl_config_prefs.h
index c10ed21..2f38652 100644
--- a/components/ssl_config/ssl_config_prefs.h
+++ b/components/ssl_config/ssl_config_prefs.h
@@ -11,6 +11,7 @@
 extern const char kCertRevocationCheckingEnabled[];
 extern const char kCertRevocationCheckingRequiredLocalAnchors[];
 extern const char kCertEnableSha1LocalAnchors[];
+extern const char kCertEnableCommonNameFallbackLocalAnchors[];
 extern const char kSSLVersionMin[];
 extern const char kSSLVersionMax[];
 extern const char kCipherSuiteBlacklist[];
diff --git a/components/ssl_config/ssl_config_service_manager_pref.cc b/components/ssl_config/ssl_config_service_manager_pref.cc
index 2bd06679..ee63047 100644
--- a/components/ssl_config/ssl_config_service_manager_pref.cc
+++ b/components/ssl_config/ssl_config_service_manager_pref.cc
@@ -173,6 +173,7 @@
   BooleanPrefMember rev_checking_enabled_;
   BooleanPrefMember rev_checking_required_local_anchors_;
   BooleanPrefMember sha1_local_anchors_enabled_;
+  BooleanPrefMember common_name_fallback_local_anchors_enabled_;
   StringPrefMember ssl_version_min_;
   StringPrefMember ssl_version_max_;
 
@@ -211,6 +212,9 @@
   sha1_local_anchors_enabled_.Init(
       ssl_config::prefs::kCertEnableSha1LocalAnchors, local_state,
       local_state_callback);
+  common_name_fallback_local_anchors_enabled_.Init(
+      ssl_config::prefs::kCertEnableCommonNameFallbackLocalAnchors, local_state,
+      local_state_callback);
   ssl_version_min_.Init(ssl_config::prefs::kSSLVersionMin, local_state,
                         local_state_callback);
   ssl_version_max_.Init(ssl_config::prefs::kSSLVersionMax, local_state,
@@ -238,6 +242,8 @@
       default_config.rev_checking_required_local_anchors);
   registry->RegisterBooleanPref(ssl_config::prefs::kCertEnableSha1LocalAnchors,
                                 false);
+  registry->RegisterBooleanPref(
+      ssl_config::prefs::kCertEnableCommonNameFallbackLocalAnchors, false);
   registry->RegisterStringPref(ssl_config::prefs::kSSLVersionMin,
                                std::string());
   registry->RegisterStringPref(ssl_config::prefs::kSSLVersionMax,
@@ -277,6 +283,8 @@
   config->rev_checking_required_local_anchors =
       rev_checking_required_local_anchors_.GetValue();
   config->sha1_local_anchors_enabled = sha1_local_anchors_enabled_.GetValue();
+  config->common_name_fallback_local_anchors_enabled =
+      common_name_fallback_local_anchors_enabled_.GetValue();
   std::string version_min_str = ssl_version_min_.GetValue();
   std::string version_max_str = ssl_version_max_.GetValue();
   config->version_min = net::kDefaultSSLVersionMin;
diff --git a/components/update_client/request_sender.cc b/components/update_client/request_sender.cc
index 782ada6..b99648a6 100644
--- a/components/update_client/request_sender.cc
+++ b/components/update_client/request_sender.cc
@@ -26,10 +26,10 @@
 namespace {
 
 // This is an ECDSA prime256v1 named-curve key.
-const int kKeyVersion = 7;
+const int kKeyVersion = 6;
 const char kKeyPubBytesBase64[] =
-    "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEj0QKufXIOBN30DtKeOYA5NV64FfY"
-    "HDou4sGqtcNUIlxpTzIbO45rB45QILhW6aDTwwjWLR1YCqpEAGICvFs8dQ==";
+    "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAECEDSRcZPKv8k4JEYbF7MJxxx56m+x8Z+svg5gB"
+    "mRX1J8A9DYRL6NvFkNcmcRtSNemUm7/iqrUnxaadkqcWSODw==";
 
 // The ETag header carries the ECSDA signature of the protocol response, if
 // signing has been used.
diff --git a/components/web_resource/BUILD.gn b/components/web_resource/BUILD.gn
index a80ee8d2..c4b874b 100644
--- a/components/web_resource/BUILD.gn
+++ b/components/web_resource/BUILD.gn
@@ -43,6 +43,7 @@
   sources = [
     "eula_accepted_notifier_unittest.cc",
     "resource_request_allowed_notifier_unittest.cc",
+    "web_resource_service_unittest.cc",
   ]
 
   deps = [
diff --git a/components/web_resource/web_resource_service.cc b/components/web_resource/web_resource_service.cc
index 9d2e5d7..ee7279f0 100644
--- a/components/web_resource/web_resource_service.cc
+++ b/components/web_resource/web_resource_service.cc
@@ -44,7 +44,9 @@
     const char* disable_network_switch,
     const ParseJSONCallback& parse_json_callback)
     : prefs_(prefs),
-      resource_request_allowed_notifier_(prefs, disable_network_switch),
+      resource_request_allowed_notifier_(
+          new ResourceRequestAllowedNotifier(prefs, disable_network_switch)),
+      fetch_scheduled_(false),
       in_fetch_(false),
       web_resource_server_(web_resource_server),
       application_locale_(application_locale),
@@ -54,13 +56,13 @@
       request_context_(request_context),
       parse_json_callback_(parse_json_callback),
       weak_ptr_factory_(this) {
-  resource_request_allowed_notifier_.Init(this);
+  resource_request_allowed_notifier_->Init(this);
   DCHECK(prefs);
 }
 
 void WebResourceService::StartAfterDelay() {
   // If resource requests are not allowed, we'll get a callback when they are.
-  if (resource_request_allowed_notifier_.ResourceRequestsAllowed())
+  if (resource_request_allowed_notifier_->ResourceRequestsAllowed())
     OnResourceRequestsAllowed();
 }
 
@@ -100,15 +102,35 @@
 // Delay initial load of resource data into cache so as not to interfere
 // with startup time.
 void WebResourceService::ScheduleFetch(int64_t delay_ms) {
+  if (fetch_scheduled_)
+    return;
+  fetch_scheduled_ = true;
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::Bind(&WebResourceService::StartFetch,
                             weak_ptr_factory_.GetWeakPtr()),
       base::TimeDelta::FromMilliseconds(delay_ms));
 }
 
+void WebResourceService::SetResourceRequestAllowedNotifier(
+    std::unique_ptr<ResourceRequestAllowedNotifier> notifier) {
+  resource_request_allowed_notifier_ = std::move(notifier);
+  resource_request_allowed_notifier_->Init(this);
+}
+
+bool WebResourceService::GetFetchScheduled() const {
+  return fetch_scheduled_;
+}
+
 // Initializes the fetching of data from the resource server.  Data
 // load calls OnURLFetchComplete.
 void WebResourceService::StartFetch() {
+  // Set to false so that next fetch can be scheduled after this fetch or
+  // if we recieve notification that resource is allowed.
+  fetch_scheduled_ = false;
+  // Check whether fetching is allowed.
+  if (!resource_request_allowed_notifier_->ResourceRequestsAllowed())
+    return;
+
   // First, put our next cache load on the MessageLoop.
   ScheduleFetch(cache_update_delay_ms_);
 
diff --git a/components/web_resource/web_resource_service.h b/components/web_resource/web_resource_service.h
index 1c1103a..d29ab05 100644
--- a/components/web_resource/web_resource_service.h
+++ b/components/web_resource/web_resource_service.h
@@ -64,10 +64,17 @@
   // Then begin updating resources.
   void StartAfterDelay();
 
+  // Sets the ResourceRequestAllowedNotifier to make it configurable.
+  void SetResourceRequestAllowedNotifier(
+      std::unique_ptr<ResourceRequestAllowedNotifier> notifier);
+
  protected:
   PrefService* prefs_;
+  bool GetFetchScheduled() const;
 
  private:
+  friend class WebResourceServiceTest;
+
   // For the subclasses to process the result of a fetch.
   virtual void Unpack(const base::DictionaryValue& parsed_json) = 0;
 
@@ -92,7 +99,15 @@
 
   // Helper class used to tell this service if it's allowed to make network
   // resource requests.
-  ResourceRequestAllowedNotifier resource_request_allowed_notifier_;
+  std::unique_ptr<ResourceRequestAllowedNotifier>
+      resource_request_allowed_notifier_;
+
+  // True if we have scheduled a fetch after start_fetch_delay_ms_
+  // or another one in |cache_update_delay_ms_| time. Set to false
+  // before fetching starts so that next fetch is scheduled. This
+  // is to make sure not more than one fetch is scheduled for given
+  // point in time.
+  bool fetch_scheduled_;
 
   // The tool that fetches the url data from the server.
   std::unique_ptr<net::URLFetcher> url_fetcher_;
diff --git a/components/web_resource/web_resource_service_unittest.cc b/components/web_resource/web_resource_service_unittest.cc
new file mode 100644
index 0000000..fee29fa
--- /dev/null
+++ b/components/web_resource/web_resource_service_unittest.cc
@@ -0,0 +1,154 @@
+// 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 <memory>
+#include <utility>
+
+#include "base/bind.h"
+#include "base/message_loop/message_loop.h"
+#include "base/values.h"
+#include "components/prefs/pref_registry_simple.h"
+#include "components/prefs/testing_pref_service.h"
+#include "components/web_resource/resource_request_allowed_notifier.h"
+#include "components/web_resource/web_resource_service.h"
+#include "net/url_request/test_url_fetcher_factory.h"
+#include "net/url_request/url_request_context_getter.h"
+#include "net/url_request/url_request_status.h"
+#include "net/url_request/url_request_test_util.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace {
+const std::string kTestUrl = "http://www.test.com";
+const std::string kCacheUpdatePath = "cache_update_path";
+std::string error_message_;
+}  // namespace
+
+namespace web_resource {
+
+class TestResourceRequestAllowedNotifier
+    : public ResourceRequestAllowedNotifier {
+ public:
+  TestResourceRequestAllowedNotifier(PrefService* prefs,
+                                     const char* disable_network_switch)
+      : ResourceRequestAllowedNotifier(prefs, disable_network_switch) {}
+
+  ResourceRequestAllowedNotifier::State GetResourceRequestsAllowedState()
+      override {
+    return state_;
+  }
+
+  void SetState(ResourceRequestAllowedNotifier::State state) { state_ = state; }
+
+  void NotifyState(ResourceRequestAllowedNotifier::State state) {
+    SetState(state);
+    SetObserverRequestedForTesting(true);
+    MaybeNotifyObserver();
+  }
+
+ private:
+  ResourceRequestAllowedNotifier::State state_;
+};
+
+class TestWebResourceService : public WebResourceService {
+ public:
+  TestWebResourceService(PrefService* prefs,
+                         const GURL& web_resource_server,
+                         const std::string& application_locale,
+                         const char* last_update_time_pref_name,
+                         int start_fetch_delay_ms,
+                         int cache_update_delay_ms,
+                         net::URLRequestContextGetter* request_context,
+                         const char* disable_network_switch,
+                         const ParseJSONCallback& parse_json_callback)
+      : WebResourceService(prefs,
+                           web_resource_server,
+                           application_locale,
+                           last_update_time_pref_name,
+                           start_fetch_delay_ms,
+                           cache_update_delay_ms,
+                           request_context,
+                           disable_network_switch,
+                           parse_json_callback){};
+
+  void Unpack(const base::DictionaryValue& parsed_json) override{};
+};
+
+class WebResourceServiceTest : public testing::Test {
+ public:
+  WebResourceServiceTest() {}
+
+  void SetUp() override {
+    request_context_getter_ = new net::TestURLRequestContextGetter(
+        base::ThreadTaskRunnerHandle::Get());
+    local_state_.reset(new TestingPrefServiceSimple());
+    local_state_->registry()->RegisterStringPref(kCacheUpdatePath, "0");
+    test_web_resource_service_.reset(new TestWebResourceService(
+        local_state_.get(), GURL(kTestUrl), "", kCacheUpdatePath.c_str(), 100,
+        5000, request_context_getter_.get(), nullptr,
+        base::Bind(web_resource::WebResourceServiceTest::Parse)));
+    error_message_ = "";
+    TestResourceRequestAllowedNotifier* notifier =
+        new TestResourceRequestAllowedNotifier(local_state_.get(), nullptr);
+    notifier->SetState(ResourceRequestAllowedNotifier::ALLOWED);
+    test_web_resource_service_->SetResourceRequestAllowedNotifier(
+        std::unique_ptr<ResourceRequestAllowedNotifier>(notifier));
+  }
+
+  TestResourceRequestAllowedNotifier* resource_notifier() {
+    return static_cast<TestResourceRequestAllowedNotifier*>(
+        test_web_resource_service_->resource_request_allowed_notifier_.get());
+  }
+
+  bool GetFetchScheduled() {
+    return test_web_resource_service_->GetFetchScheduled();
+  }
+
+  void CallScheduleFetch(int64_t delay_ms) {
+    return test_web_resource_service_->ScheduleFetch(delay_ms);
+  }
+
+  static void Parse(const std::string& unsafe_json,
+                    const WebResourceService::SuccessCallback& success_callback,
+                    const WebResourceService::ErrorCallback& error_callback) {
+    std::unique_ptr<base::Value> value;
+    if (!error_message_.empty())
+      error_callback.Run(error_message_);
+    else
+      success_callback.Run(std::move(value));
+  }
+
+  WebResourceService* web_resource_service() {
+    return test_web_resource_service_.get();
+  }
+
+  void CallStartFetch() { test_web_resource_service_->StartFetch(); }
+
+ private:
+  base::MessageLoop message_loop_;  // needed for TestURLFetcherFactory
+  scoped_refptr<net::URLRequestContextGetter> request_context_getter_;
+  std::unique_ptr<TestingPrefServiceSimple> local_state_;
+  std::unique_ptr<TestWebResourceService> test_web_resource_service_;
+};
+
+TEST_F(WebResourceServiceTest, FetchScheduledAfterStartDelayTest) {
+  web_resource_service()->StartAfterDelay();
+  EXPECT_TRUE(GetFetchScheduled());
+}
+
+TEST_F(WebResourceServiceTest, FetchScheduledOnScheduleFetchTest) {
+  web_resource_service()->StartAfterDelay();
+  resource_notifier()->NotifyState(ResourceRequestAllowedNotifier::ALLOWED);
+  EXPECT_TRUE(GetFetchScheduled());
+}
+
+TEST_F(WebResourceServiceTest, FetchScheduledOnStartFetchTest) {
+  resource_notifier()->NotifyState(
+      ResourceRequestAllowedNotifier::DISALLOWED_NETWORK_DOWN);
+  CallStartFetch();
+  EXPECT_FALSE(GetFetchScheduled());
+  resource_notifier()->NotifyState(ResourceRequestAllowedNotifier::ALLOWED);
+  EXPECT_TRUE(GetFetchScheduled());
+}
+
+}  // namespace web_resource
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc
index 419beed..ff676db 100644
--- a/content/browser/frame_host/render_frame_host_impl.cc
+++ b/content/browser/frame_host/render_frame_host_impl.cc
@@ -1305,7 +1305,7 @@
   if (frame_tree_node_->IsMainFrame() && GetView() &&
       !validated_params.was_within_same_page) {
     RenderWidgetHostImpl::From(GetView()->GetRenderWidgetHost())
-        ->StartNewContentRenderingTimeout(validated_params.content_source_id);
+        ->StartNewContentRenderingTimeout();
   }
 }
 
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc
index 4afec65e..15b8995 100644
--- a/content/browser/renderer_host/render_widget_host_impl.cc
+++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -294,7 +294,6 @@
       last_event_type_(blink::WebInputEvent::Undefined),
       new_content_rendering_delay_(
           base::TimeDelta::FromMilliseconds(kNewContentRenderingDelayMs)),
-      current_content_source_id_(0),
       weak_factory_(this) {
   CHECK(delegate_);
   CHECK_NE(MSG_ROUTING_NONE, routing_id_);
@@ -986,9 +985,7 @@
   RendererIsResponsive();
 }
 
-void RenderWidgetHostImpl::StartNewContentRenderingTimeout(
-    uint32_t next_source_id) {
-  current_content_source_id_ = next_source_id;
+void RenderWidgetHostImpl::StartNewContentRenderingTimeout() {
   // It is possible for a compositor frame to arrive before the browser is
   // notified about the page being committed, in which case no timer is
   // necessary.
@@ -1832,13 +1829,7 @@
   if (touch_emulator_)
     touch_emulator_->SetDoubleTapSupportForPageEnabled(!is_mobile_optimized);
 
-  // Ignore this frame if its content has already been unloaded. Source ID
-  // is always zero for an OOPIF because we are only concerned with displaying
-  // stale graphics on top-level frames. We accept frames that have a source ID
-  // greater than |current_content_source_id_| because in some cases the first
-  // compositor frame can arrive before the navigation commit message that
-  // updates that value.
-  if (view_ && frame.metadata.content_source_id >= current_content_source_id_) {
+  if (view_) {
     view_->OnSwapCompositorFrame(compositor_frame_sink_id, std::move(frame));
     view_->DidReceiveRendererFrame();
   } else {
diff --git a/content/browser/renderer_host/render_widget_host_impl.h b/content/browser/renderer_host/render_widget_host_impl.h
index 11dddf1..b6aa99ec 100644
--- a/content/browser/renderer_host/render_widget_host_impl.h
+++ b/content/browser/renderer_host/render_widget_host_impl.h
@@ -325,10 +325,8 @@
   void StopHangMonitorTimeout();
 
   // Starts the rendering timeout, which will clear displayed graphics if
-  // a new compositor frame is not received before it expires. This also causes
-  // any new compositor frames received with content_source_id less than
-  // |next_source_id| to be discarded.
-  void StartNewContentRenderingTimeout(uint32_t next_source_id);
+  // a new compositor frame is not received before it expires.
+  void StartNewContentRenderingTimeout();
 
   // Notification that a new compositor frame has been generated following
   // a page load. This stops |new_content_rendering_timeout_|, or prevents
@@ -891,14 +889,6 @@
   // renderer process before clearing any previously displayed content.
   base::TimeDelta new_content_rendering_delay_;
 
-  // This identifier tags compositor frames according to the page load with
-  // which they are associated, to prevent an unloaded web page from being
-  // drawn after a navigation to a new page has already committed. This is
-  // a no-op for non-top-level RenderWidgets, as that should always be zero.
-  // TODO(kenrb, fsamuel): We should use SurfaceIDs for this purpose when they
-  // are available in the renderer process. See https://crbug.com/695579.
-  uint32_t current_content_source_id_;
-
 #if defined(OS_MACOSX)
   std::unique_ptr<device::PowerSaveBlocker> power_save_blocker_;
 #endif
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index 7b74276..439ffcc 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -1242,7 +1242,7 @@
       base::TimeDelta::FromMicroseconds(10));
 
   // Test immediate start and stop, ensuring that the timeout doesn't fire.
-  host_->StartNewContentRenderingTimeout(0);
+  host_->StartNewContentRenderingTimeout();
   host_->OnFirstPaintAfterLoad();
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
@@ -1254,7 +1254,7 @@
   // Test that the timer doesn't fire if it receives a stop before
   // a start.
   host_->OnFirstPaintAfterLoad();
-  host_->StartNewContentRenderingTimeout(0);
+  host_->StartNewContentRenderingTimeout();
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMicroseconds(20));
@@ -1263,7 +1263,7 @@
   EXPECT_FALSE(host_->new_content_rendering_timeout_fired());
 
   // Test with a long delay to ensure that it does fire this time.
-  host_->StartNewContentRenderingTimeout(0);
+  host_->StartNewContentRenderingTimeout();
   base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
       FROM_HERE, base::MessageLoop::QuitWhenIdleClosure(),
       TimeDelta::FromMicroseconds(20));
@@ -1271,39 +1271,6 @@
   EXPECT_TRUE(host_->new_content_rendering_timeout_fired());
 }
 
-// This tests that a compositor frame received with a stale content source ID
-// in its metadata is properly discarded.
-TEST_F(RenderWidgetHostTest, SwapCompositorFrameWithBadSourceId) {
-  host_->StartNewContentRenderingTimeout(100);
-  host_->OnFirstPaintAfterLoad();
-
-  // First swap a frame with an invalid ID.
-  cc::CompositorFrame frame;
-  frame.metadata.content_source_id = 99;
-  host_->OnMessageReceived(ViewHostMsg_SwapCompositorFrame(
-      0, 0, frame, std::vector<IPC::Message>()));
-  EXPECT_FALSE(
-      static_cast<TestView*>(host_->GetView())->did_swap_compositor_frame());
-  static_cast<TestView*>(host_->GetView())->reset_did_swap_compositor_frame();
-
-  // Test with a valid content ID as a control.
-  frame.metadata.content_source_id = 100;
-  host_->OnMessageReceived(ViewHostMsg_SwapCompositorFrame(
-      0, 0, frame, std::vector<IPC::Message>()));
-  EXPECT_TRUE(
-      static_cast<TestView*>(host_->GetView())->did_swap_compositor_frame());
-  static_cast<TestView*>(host_->GetView())->reset_did_swap_compositor_frame();
-
-  // We also accept frames with higher content IDs, to cover the case where
-  // the browser process receives a compositor frame for a new page before
-  // the corresponding DidCommitProvisionalLoad (it's a race).
-  frame.metadata.content_source_id = 101;
-  host_->OnMessageReceived(ViewHostMsg_SwapCompositorFrame(
-      0, 0, frame, std::vector<IPC::Message>()));
-  EXPECT_TRUE(
-      static_cast<TestView*>(host_->GetView())->did_swap_compositor_frame());
-}
-
 TEST_F(RenderWidgetHostTest, TouchEmulator) {
   simulated_event_time_delta_seconds_ = 0.1;
   // Immediately ack all touches instead of sending them to the renderer.
diff --git a/content/common/frame_messages.h b/content/common/frame_messages.h
index 0442702..023494a3 100644
--- a/content/common/frame_messages.h
+++ b/content/common/frame_messages.h
@@ -301,11 +301,6 @@
   // in BeginNavigationParams.
   IPC_STRUCT_MEMBER(GURL, searchable_form_url)
   IPC_STRUCT_MEMBER(std::string, searchable_form_encoding)
-
-  // This is a non-decreasing value that the browser process can use to
-  // identify and discard compositor frames that correspond to now-unloaded
-  // web content.
-  IPC_STRUCT_MEMBER(uint32_t, content_source_id)
 IPC_STRUCT_END()
 
 IPC_STRUCT_BEGIN(FrameMsg_PostMessage_Params)
diff --git a/content/renderer/gpu/render_widget_compositor.cc b/content/renderer/gpu/render_widget_compositor.cc
index ec1b8579..f1c6a7b5 100644
--- a/content/renderer/gpu/render_widget_compositor.cc
+++ b/content/renderer/gpu/render_widget_compositor.cc
@@ -1130,8 +1130,4 @@
   is_for_oopif_ = is_for_oopif;
 }
 
-void RenderWidgetCompositor::SetContentSourceId(uint32_t id) {
-  layer_tree_host_->SetContentSourceId(id);
-}
-
 }  // namespace content
diff --git a/content/renderer/gpu/render_widget_compositor.h b/content/renderer/gpu/render_widget_compositor.h
index 2367818..99cfc21 100644
--- a/content/renderer/gpu/render_widget_compositor.h
+++ b/content/renderer/gpu/render_widget_compositor.h
@@ -113,7 +113,6 @@
   void SetPaintedDeviceScaleFactor(float device_scale);
   void SetDeviceColorSpace(const gfx::ColorSpace& color_space);
   void SetIsForOopif(bool is_for_oopif);
-  void SetContentSourceId(uint32_t);
 
   // WebLayerTreeView implementation.
   cc::FrameSinkId getFrameSinkId() override;
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
index db3193f..a8cbf916c 100644
--- a/content/renderer/render_frame_impl.cc
+++ b/content/renderer/render_frame_impl.cc
@@ -3617,7 +3617,6 @@
   // For new page navigations, the browser process needs to be notified of the
   // first paint of that page, so it can cancel the timer that waits for it.
   if (is_main_frame_ && !navigation_state->WasWithinSamePage()) {
-    GetRenderWidget()->IncrementContentSourceId();
     render_view_->QueueMessage(
         new ViewHostMsg_DidFirstPaintAfterLoad(render_view_->routing_id_),
         MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE);
@@ -4890,8 +4889,6 @@
   // corresponding FrameNavigationEntry.
   params.page_state = SingleHistoryItemToPageState(item);
 
-  params.content_source_id = GetRenderWidget()->GetContentSourceId();
-
   params.method = request.httpMethod().latin1();
   if (params.method == "POST")
     params.post_id = ExtractPostId(item);
diff --git a/content/renderer/render_widget.cc b/content/renderer/render_widget.cc
index 6a4442fa..f5f43f0 100644
--- a/content/renderer/render_widget.cc
+++ b/content/renderer/render_widget.cc
@@ -378,7 +378,6 @@
       focused_pepper_plugin_(nullptr),
       time_to_first_active_paint_recorded_(true),
       was_shown_time_(base::TimeTicks::Now()),
-      current_content_source_id_(0),
       weak_ptr_factory_(this) {
   DCHECK_NE(routing_id_, MSG_ROUTING_NONE);
   if (!swapped_out)
@@ -1287,7 +1286,6 @@
   compositor_->setViewportSize(physical_backing_size_);
   OnDeviceScaleFactorChanged();
   compositor_->SetDeviceColorSpace(screen_info_.icc_profile.GetColorSpace());
-  compositor_->SetContentSourceId(current_content_source_id_);
   // For background pages and certain tests, we don't want to trigger
   // CompositorFrameSink creation.
   if (compositor_never_visible_ || !RenderThreadImpl::current())
@@ -2302,15 +2300,6 @@
                                      possible_drag_event_info_));
 }
 
-uint32_t RenderWidget::GetContentSourceId() {
-  return current_content_source_id_;
-}
-
-void RenderWidget::IncrementContentSourceId() {
-  if (compositor_)
-    compositor_->SetContentSourceId(++current_content_source_id_);
-}
-
 blink::WebWidget* RenderWidget::GetWebWidget() const {
   return webwidget_internal_;
 }
diff --git a/content/renderer/render_widget.h b/content/renderer/render_widget.h
index e43cd4d..e808bcc2 100644
--- a/content/renderer/render_widget.h
+++ b/content/renderer/render_widget.h
@@ -414,9 +414,6 @@
   virtual void TransferActiveWheelFlingAnimation(
       const blink::WebActiveWheelFlingParameters& params) {}
 
-  uint32_t GetContentSourceId();
-  void IncrementContentSourceId();
-
  protected:
   // Friend RefCounted so that the dtor can be non-public. Using this class
   // without ref-counting is an error.
@@ -850,19 +847,6 @@
   bool time_to_first_active_paint_recorded_;
   base::TimeTicks was_shown_time_;
 
-  // This is initialized to zero and is incremented on each non-same-page
-  // navigation commit by RenderFrameImpl. At that time it is sent to the
-  // compositor so that it can tag compositor frames, and RenderFrameImpl is
-  // responsible for sending it to the browser process to be used to match
-  // each compositor frame to the most recent page navigation before it was
-  // generated.
-  // This only applies to main frames, and is not touched for subframe
-  // RenderWidgets, where there is no concern around displaying unloaded
-  // content.
-  // TODO(kenrb, fsamuel): This should be removed when SurfaceIDs can be used
-  // to replace it. See https://crbug.com/695579.
-  uint32_t current_content_source_id_;
-
   base::WeakPtrFactory<RenderWidget> weak_ptr_factory_;
 
   DISALLOW_COPY_AND_ASSIGN(RenderWidget);
diff --git a/content/test/test_render_view_host.h b/content/test/test_render_view_host.h
index 6a9a4f58..252a22d 100644
--- a/content/test/test_render_view_host.h
+++ b/content/test/test_render_view_host.h
@@ -111,7 +111,6 @@
   bool is_showing() const { return is_showing_; }
   bool is_occluded() const { return is_occluded_; }
   bool did_swap_compositor_frame() const { return did_swap_compositor_frame_; }
-  void reset_did_swap_compositor_frame() { did_swap_compositor_frame_ = false; }
 
  protected:
   RenderWidgetHostImpl* rwh_;
diff --git a/extensions/renderer/api_binding_bridge.cc b/extensions/renderer/api_binding_bridge.cc
index d3b5805e..6d8b2dc6 100644
--- a/extensions/renderer/api_binding_bridge.cc
+++ b/extensions/renderer/api_binding_bridge.cc
@@ -6,6 +6,7 @@
 
 #include "base/values.h"
 #include "extensions/renderer/api_binding_hooks.h"
+#include "extensions/renderer/api_event_handler.h"
 #include "extensions/renderer/api_request_handler.h"
 #include "extensions/renderer/api_signature.h"
 #include "extensions/renderer/api_type_reference_map.h"
@@ -30,6 +31,7 @@
 
 APIBindingBridge::APIBindingBridge(const APITypeReferenceMap* type_refs,
                                    APIRequestHandler* request_handler,
+                                   APIEventHandler* event_handler,
                                    APIBindingHooks* hooks,
                                    v8::Local<v8::Context> context,
                                    v8::Local<v8::Value> api_object,
@@ -38,6 +40,7 @@
                                    const binding::RunJSFunction& run_js)
     : type_refs_(type_refs),
       request_handler_(request_handler),
+      event_handler_(event_handler),
       hooks_(hooks),
       extension_id_(extension_id),
       context_type_(context_type),
@@ -64,7 +67,9 @@
     v8::Isolate* isolate) {
   return Wrappable<APIBindingBridge>::GetObjectTemplateBuilder(isolate)
       .SetMethod("registerCustomHook", &APIBindingBridge::RegisterCustomHook)
-      .SetMethod("sendRequest", &APIBindingBridge::SendRequest);
+      .SetMethod("sendRequest", &APIBindingBridge::SendRequest)
+      .SetMethod("registerEventArgumentMassager",
+                 &APIBindingBridge::RegisterEventArgumentMassager);
 }
 
 void APIBindingBridge::RegisterCustomHook(v8::Isolate* isolate,
@@ -133,4 +138,17 @@
                                  hooks_->GetCustomJSCallback(name, context));
 }
 
+void APIBindingBridge::RegisterEventArgumentMassager(
+    gin::Arguments* arguments,
+    const std::string& event_name,
+    v8::Local<v8::Function> massager) {
+  v8::Isolate* isolate = arguments->isolate();
+  v8::HandleScope handle_scope(isolate);
+  v8::Local<v8::Object> holder;
+  CHECK(arguments->GetHolder(&holder));
+  v8::Local<v8::Context> context = holder->CreationContext();
+
+  event_handler_->RegisterArgumentMassager(context, event_name, massager);
+}
+
 }  // namespace extensions
diff --git a/extensions/renderer/api_binding_bridge.h b/extensions/renderer/api_binding_bridge.h
index 3a3fe64..30dd71b 100644
--- a/extensions/renderer/api_binding_bridge.h
+++ b/extensions/renderer/api_binding_bridge.h
@@ -18,6 +18,7 @@
 
 namespace extensions {
 class APIBindingHooks;
+class APIEventHandler;
 class APIRequestHandler;
 class APITypeReferenceMap;
 
@@ -28,6 +29,7 @@
  public:
   APIBindingBridge(const APITypeReferenceMap* type_refs,
                    APIRequestHandler* request_handler,
+                   APIEventHandler* event_handler,
                    APIBindingHooks* hooks,
                    v8::Local<v8::Context> context,
                    v8::Local<v8::Value> api_object,
@@ -60,12 +62,21 @@
                    const std::string& name,
                    const std::vector<v8::Local<v8::Value>>& request_args);
 
+  // A handler to register an argument massager for a specific event.
+  // Replacement for event_bindings.registerArgumentMassager.
+  void RegisterEventArgumentMassager(gin::Arguments* arguments,
+                                     const std::string& event_name,
+                                     v8::Local<v8::Function> massager);
+
   // Type references. Guaranteed to outlive this object.
   const APITypeReferenceMap* type_refs_;
 
   // The request handler. Guaranteed to outlive this object.
   APIRequestHandler* request_handler_;
 
+  // The event handler. Guaranteed to outlive this object.
+  APIEventHandler* event_handler_;
+
   // The hooks associated with this API. Guaranteed to outlive this object.
   APIBindingHooks* hooks_;
 
diff --git a/extensions/renderer/api_bindings_system.h b/extensions/renderer/api_bindings_system.h
index 5b78708d..2af8601 100644
--- a/extensions/renderer/api_bindings_system.h
+++ b/extensions/renderer/api_bindings_system.h
@@ -85,6 +85,7 @@
                           const CustomTypeHandler& function);
 
   APIRequestHandler* request_handler() { return &request_handler_; }
+  APIEventHandler* event_handler() { return &event_handler_; }
   APITypeReferenceMap* type_reference_map() { return &type_reference_map_; }
 
  private:
diff --git a/extensions/renderer/api_event_handler.cc b/extensions/renderer/api_event_handler.cc
index 2391607..d05e9e4 100644
--- a/extensions/renderer/api_event_handler.cc
+++ b/extensions/renderer/api_event_handler.cc
@@ -33,7 +33,7 @@
     // v8 objects. This helps us avoid cycles in v8 where an event listener
     // could hold a reference to the event, which in turn holds the reference
     // to the listener.
-    for (const auto& pair : event_data) {
+    for (const auto& pair : emitters) {
       EventEmitter* emitter = nullptr;
       gin::Converter<EventEmitter*>::FromV8(
           isolate, pair.second.Get(isolate), &emitter);
@@ -47,9 +47,59 @@
   v8::Isolate* isolate;
 
   // A map from event name -> event emitter.
-  std::map<std::string, v8::Global<v8::Object>> event_data;
+  std::map<std::string, v8::Global<v8::Object>> emitters;
+
+  // A map from event name -> argument massager.
+  std::map<std::string, v8::Global<v8::Function>> massagers;
 };
 
+APIEventPerContextData* GetContextData(v8::Local<v8::Context> context,
+                                       bool should_create) {
+  gin::PerContextData* per_context_data = gin::PerContextData::From(context);
+  if (!per_context_data)
+    return nullptr;
+  auto* data = static_cast<APIEventPerContextData*>(
+      per_context_data->GetUserData(kExtensionAPIEventPerContextKey));
+
+  if (!data && should_create) {
+    auto api_data =
+        base::MakeUnique<APIEventPerContextData>(context->GetIsolate());
+    data = api_data.get();
+    per_context_data->SetUserData(kExtensionAPIEventPerContextKey,
+                                  api_data.release());
+  }
+
+  return data;
+}
+
+void DispatchEvent(const v8::FunctionCallbackInfo<v8::Value>& info) {
+  v8::Isolate* isolate = info.GetIsolate();
+  v8::HandleScope handle_scope(isolate);
+  if (info.Length() != 1 || !info[0]->IsArray()) {
+    NOTREACHED();
+    return;
+  }
+
+  v8::Local<v8::Context> context = isolate->GetCurrentContext();
+  APIEventPerContextData* data = GetContextData(context, false);
+  DCHECK(data);
+  std::string event_name = gin::V8ToString(info.Data());
+  auto iter = data->emitters.find(event_name);
+  if (iter == data->emitters.end())
+    return;
+  v8::Global<v8::Object>& v8_emitter = iter->second;
+
+  std::vector<v8::Local<v8::Value>> args;
+  CHECK(gin::Converter<std::vector<v8::Local<v8::Value>>>::FromV8(
+      isolate, info[0], &args));
+
+  EventEmitter* emitter = nullptr;
+  gin::Converter<EventEmitter*>::FromV8(isolate, v8_emitter.Get(isolate),
+                                        &emitter);
+  CHECK(emitter);
+  emitter->Fire(context, &args);
+}
+
 }  // namespace
 
 APIEventHandler::APIEventHandler(
@@ -67,19 +117,8 @@
   // context directly.
   v8::Context::Scope context_scope(context);
 
-  gin::PerContextData* per_context_data = gin::PerContextData::From(context);
-  DCHECK(per_context_data);
-  APIEventPerContextData* data = static_cast<APIEventPerContextData*>(
-      per_context_data->GetUserData(kExtensionAPIEventPerContextKey));
-  if (!data) {
-    auto api_data =
-        base::MakeUnique<APIEventPerContextData>(context->GetIsolate());
-    data = api_data.get();
-    per_context_data->SetUserData(kExtensionAPIEventPerContextKey,
-                                  api_data.release());
-  }
-
-  DCHECK(data->event_data.find(event_name) == data->event_data.end());
+  APIEventPerContextData* data = GetContextData(context, true);
+  DCHECK(data->emitters.find(event_name) == data->emitters.end());
 
   gin::Handle<EventEmitter> emitter_handle = gin::CreateHandle(
       context->GetIsolate(),
@@ -89,7 +128,7 @@
   CHECK(emitter_value->IsObject());
   v8::Local<v8::Object> emitter_object =
       v8::Local<v8::Object>::Cast(emitter_value);
-  data->event_data[event_name] =
+  data->emitters[event_name] =
       v8::Global<v8::Object>(context->GetIsolate(), emitter_object);
 
   return emitter_object;
@@ -98,46 +137,75 @@
 void APIEventHandler::FireEventInContext(const std::string& event_name,
                                          v8::Local<v8::Context> context,
                                          const base::ListValue& args) {
-  gin::PerContextData* per_context_data = gin::PerContextData::From(context);
-  DCHECK(per_context_data);
-  APIEventPerContextData* data = static_cast<APIEventPerContextData*>(
-      per_context_data->GetUserData(kExtensionAPIEventPerContextKey));
+  APIEventPerContextData* data = GetContextData(context, false);
   if (!data)
     return;
 
-  auto iter = data->event_data.find(event_name);
-  if (iter == data->event_data.end())
+  auto emitter_iter = data->emitters.find(event_name);
+  if (emitter_iter == data->emitters.end())
+    return;
+
+  EventEmitter* emitter = nullptr;
+  gin::Converter<EventEmitter*>::FromV8(
+      context->GetIsolate(), emitter_iter->second.Get(context->GetIsolate()),
+      &emitter);
+  CHECK(emitter);
+
+  if (emitter->listeners()->empty())
     return;
 
   // Note: since we only convert the arguments once, if a listener modifies an
   // object (including an array), other listeners will see that modification.
   // TODO(devlin): This is how it's always been, but should it be?
-  std::vector<v8::Local<v8::Value>> v8_args;
-  v8_args.reserve(args.GetSize());
   std::unique_ptr<content::V8ValueConverter> converter(
       content::V8ValueConverter::create());
-  for (const auto& arg : args)
-    v8_args.push_back(converter->ToV8Value(arg.get(), context));
 
-  EventEmitter* emitter = nullptr;
-  gin::Converter<EventEmitter*>::FromV8(
-      context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter);
-  CHECK(emitter);
+  auto massager_iter = data->massagers.find(event_name);
+  if (massager_iter == data->massagers.end()) {
+    std::vector<v8::Local<v8::Value>> v8_args;
+    v8_args.reserve(args.GetSize());
+    for (const auto& arg : args)
+      v8_args.push_back(converter->ToV8Value(arg.get(), context));
+    emitter->Fire(context, &v8_args);
+  } else {
+    v8::Isolate* isolate = context->GetIsolate();
+    v8::HandleScope handle_scope(isolate);
+    v8::Local<v8::Function> massager = massager_iter->second.Get(isolate);
+    v8::Local<v8::Value> v8_args = converter->ToV8Value(&args, context);
+    DCHECK(!v8_args.IsEmpty());
+    DCHECK(v8_args->IsArray());
 
-  emitter->Fire(context, &v8_args);
+    // Curry in the native dispatch function. Some argument massagers take
+    // extra liberties and call this asynchronously, so we can't just have the
+    // massager return a modified array of arguments.
+    // We don't store this in a template because the Data (event name) is
+    // different for each instance. Luckily, this is called during dispatching
+    // an event, rather than e.g. at initialization time.
+    v8::Local<v8::Function> dispatch_event = v8::Function::New(
+        isolate, &DispatchEvent, gin::StringToSymbol(isolate, event_name));
+
+    v8::Local<v8::Value> massager_args[] = {v8_args, dispatch_event};
+    call_js_.Run(massager, context, arraysize(massager_args), massager_args);
+  }
+}
+
+void APIEventHandler::RegisterArgumentMassager(
+    v8::Local<v8::Context> context,
+    const std::string& event_name,
+    v8::Local<v8::Function> massager) {
+  APIEventPerContextData* data = GetContextData(context, true);
+  DCHECK(data->massagers.find(event_name) == data->massagers.end());
+  data->massagers[event_name].Reset(context->GetIsolate(), massager);
 }
 
 size_t APIEventHandler::GetNumEventListenersForTesting(
     const std::string& event_name,
     v8::Local<v8::Context> context) {
-  gin::PerContextData* per_context_data = gin::PerContextData::From(context);
-  DCHECK(per_context_data);
-  APIEventPerContextData* data = static_cast<APIEventPerContextData*>(
-      per_context_data->GetUserData(kExtensionAPIEventPerContextKey));
+  APIEventPerContextData* data = GetContextData(context, false);
   DCHECK(data);
 
-  auto iter = data->event_data.find(event_name);
-  DCHECK(iter != data->event_data.end());
+  auto iter = data->emitters.find(event_name);
+  DCHECK(iter != data->emitters.end());
   EventEmitter* emitter = nullptr;
   gin::Converter<EventEmitter*>::FromV8(
       context->GetIsolate(), iter->second.Get(context->GetIsolate()), &emitter);
diff --git a/extensions/renderer/api_event_handler.h b/extensions/renderer/api_event_handler.h
index fbf9b42a..36046c8 100644
--- a/extensions/renderer/api_event_handler.h
+++ b/extensions/renderer/api_event_handler.h
@@ -44,6 +44,15 @@
                           v8::Local<v8::Context> context,
                           const base::ListValue& arguments);
 
+  // Registers a |function| to serve as an "argument massager" for the given
+  // |event_name|, mutating the original arguments.
+  // The function is called with two arguments: the array of original arguments
+  // being dispatched to the event, and the function to dispatch the event to
+  // listeners.
+  void RegisterArgumentMassager(v8::Local<v8::Context> context,
+                                const std::string& event_name,
+                                v8::Local<v8::Function> function);
+
   // Returns the EventListeners for a given |event_name| and |context|.
   size_t GetNumEventListenersForTesting(const std::string& event_name,
                                         v8::Local<v8::Context> context);
diff --git a/extensions/renderer/api_event_handler_unittest.cc b/extensions/renderer/api_event_handler_unittest.cc
index e4d39d2..3846ecc 100644
--- a/extensions/renderer/api_event_handler_unittest.cc
+++ b/extensions/renderer/api_event_handler_unittest.cc
@@ -11,6 +11,7 @@
 #include "base/values.h"
 #include "extensions/renderer/api_binding_test.h"
 #include "extensions/renderer/api_binding_test_util.h"
+#include "gin/arguments.h"
 #include "gin/converter.h"
 #include "gin/public/context_holder.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -707,4 +708,156 @@
             handler.GetNumEventListenersForTesting(kEventName1, context_b));
 }
 
+// Test registering an argument massager for a given event.
+TEST_F(APIEventHandlerTest, TestArgumentMassagers) {
+  v8::HandleScope handle_scope(isolate());
+  v8::Local<v8::Context> context = ContextLocal();
+
+  const char kEventName[] = "alpha";
+  APIEventHandler handler(base::Bind(&RunFunctionOnGlobalAndIgnoreResult),
+                          base::Bind(&DoNothingOnEventListenersChanged));
+  v8::Local<v8::Object> event =
+      handler.CreateEventInstance(kEventName, context);
+  ASSERT_FALSE(event.IsEmpty());
+
+  const char kArgumentMassager[] =
+      "(function(originalArgs, dispatch) {\n"
+      "  this.originalArgs = originalArgs;\n"
+      "  dispatch(['primary', 'secondary']);\n"
+      "});";
+  v8::Local<v8::Function> massager =
+      FunctionFromString(context, kArgumentMassager);
+  handler.RegisterArgumentMassager(context, "alpha", massager);
+
+  const char kListenerFunction[] =
+      "(function() { this.eventArgs = Array.from(arguments); })";
+  v8::Local<v8::Function> listener_function =
+      FunctionFromString(context, kListenerFunction);
+  ASSERT_FALSE(listener_function.IsEmpty());
+
+  {
+    const char kAddListenerFunction[] =
+        "(function(event, listener) { event.addListener(listener); })";
+    v8::Local<v8::Function> add_listener_function =
+        FunctionFromString(context, kAddListenerFunction);
+    v8::Local<v8::Value> argv[] = {event, listener_function};
+    RunFunction(add_listener_function, context, arraysize(argv), argv);
+  }
+
+  const char kArguments[] = "['first','second']";
+  std::unique_ptr<base::ListValue> event_args = ListValueFromString(kArguments);
+  ASSERT_TRUE(event_args);
+  handler.FireEventInContext(kEventName, context, *event_args);
+
+  EXPECT_EQ(
+      "[\"first\",\"second\"]",
+      GetStringPropertyFromObject(context->Global(), context, "originalArgs"));
+  EXPECT_EQ(
+      "[\"primary\",\"secondary\"]",
+      GetStringPropertyFromObject(context->Global(), context, "eventArgs"));
+}
+
+// Test registering an argument massager for a given event and dispatching
+// asynchronously.
+TEST_F(APIEventHandlerTest, TestArgumentMassagersAsyncDispatch) {
+  v8::HandleScope handle_scope(isolate());
+  v8::Local<v8::Context> context = ContextLocal();
+
+  const char kEventName[] = "alpha";
+  APIEventHandler handler(base::Bind(&RunFunctionOnGlobalAndIgnoreResult),
+                          base::Bind(&DoNothingOnEventListenersChanged));
+  v8::Local<v8::Object> event =
+      handler.CreateEventInstance(kEventName, context);
+  ASSERT_FALSE(event.IsEmpty());
+
+  const char kArgumentMassager[] =
+      "(function(originalArgs, dispatch) {\n"
+      "  this.originalArgs = originalArgs;\n"
+      "  this.dispatch = dispatch;\n"
+      "});";
+  v8::Local<v8::Function> massager =
+      FunctionFromString(context, kArgumentMassager);
+  handler.RegisterArgumentMassager(context, "alpha", massager);
+
+  const char kListenerFunction[] =
+      "(function() { this.eventArgs = Array.from(arguments); })";
+  v8::Local<v8::Function> listener_function =
+      FunctionFromString(context, kListenerFunction);
+  ASSERT_FALSE(listener_function.IsEmpty());
+
+  {
+    const char kAddListenerFunction[] =
+        "(function(event, listener) { event.addListener(listener); })";
+    v8::Local<v8::Function> add_listener_function =
+        FunctionFromString(context, kAddListenerFunction);
+    v8::Local<v8::Value> argv[] = {event, listener_function};
+    RunFunction(add_listener_function, context, arraysize(argv), argv);
+  }
+
+  const char kArguments[] = "['first','second']";
+  std::unique_ptr<base::ListValue> event_args = ListValueFromString(kArguments);
+  ASSERT_TRUE(event_args);
+  handler.FireEventInContext(kEventName, context, *event_args);
+
+  // The massager should have been triggered, but since it doesn't call
+  // dispatch(), the listener shouldn't have been notified.
+  EXPECT_EQ(
+      "[\"first\",\"second\"]",
+      GetStringPropertyFromObject(context->Global(), context, "originalArgs"));
+  EXPECT_EQ("undefined", GetStringPropertyFromObject(context->Global(), context,
+                                                     "eventArgs"));
+
+  // Dispatch the event.
+  v8::Local<v8::Value> dispatch_value =
+      GetPropertyFromObject(context->Global(), context, "dispatch");
+  ASSERT_FALSE(dispatch_value.IsEmpty());
+  ASSERT_TRUE(dispatch_value->IsFunction());
+  v8::Local<v8::Value> dispatch_args[] = {
+      V8ValueFromScriptSource(context, "['primary', 'secondary']"),
+  };
+  RunFunction(dispatch_value.As<v8::Function>(), context,
+              arraysize(dispatch_args), dispatch_args);
+
+  EXPECT_EQ(
+      "[\"primary\",\"secondary\"]",
+      GetStringPropertyFromObject(context->Global(), context, "eventArgs"));
+}
+
+// Test registering an argument massager and never dispatching.
+TEST_F(APIEventHandlerTest, TestArgumentMassagersNeverDispatch) {
+  v8::HandleScope handle_scope(isolate());
+  v8::Local<v8::Context> context = ContextLocal();
+
+  const char kEventName[] = "alpha";
+  APIEventHandler handler(base::Bind(&RunFunctionOnGlobalAndIgnoreResult),
+                          base::Bind(&DoNothingOnEventListenersChanged));
+  v8::Local<v8::Object> event =
+      handler.CreateEventInstance(kEventName, context);
+  ASSERT_FALSE(event.IsEmpty());
+
+  // A massager that never dispatches.
+  const char kArgumentMassager[] = "(function(originalArgs, dispatch) {})";
+  v8::Local<v8::Function> massager =
+      FunctionFromString(context, kArgumentMassager);
+  handler.RegisterArgumentMassager(context, "alpha", massager);
+
+  const char kListenerFunction[] = "(function() {})";
+  v8::Local<v8::Function> listener_function =
+      FunctionFromString(context, kListenerFunction);
+  ASSERT_FALSE(listener_function.IsEmpty());
+
+  const char kAddListenerFunction[] =
+      "(function(event, listener) { event.addListener(listener); })";
+  v8::Local<v8::Function> add_listener_function =
+      FunctionFromString(context, kAddListenerFunction);
+  v8::Local<v8::Value> argv[] = {event, listener_function};
+  RunFunction(add_listener_function, context, arraysize(argv), argv);
+
+  handler.FireEventInContext(kEventName, context, base::ListValue());
+
+  // Nothing should blow up. (We tested in the previous test that the event
+  // isn't notified without calling dispatch, so all there is to test here is
+  // that we don't crash.)
+}
+
 }  // namespace extensions
diff --git a/extensions/renderer/native_extension_bindings_system.cc b/extensions/renderer/native_extension_bindings_system.cc
index 908d3c2..505f98e0 100644
--- a/extensions/renderer/native_extension_bindings_system.cc
+++ b/extensions/renderer/native_extension_bindings_system.cc
@@ -186,7 +186,8 @@
   gin::Handle<APIBindingBridge> bridge_handle = gin::CreateHandle(
       context->GetIsolate(),
       new APIBindingBridge(bindings_system->type_reference_map(),
-                           bindings_system->request_handler(), hooks, context,
+                           bindings_system->request_handler(),
+                           bindings_system->event_handler(), hooks, context,
                            binding_object, script_context->GetExtensionID(),
                            script_context->GetContextTypeDescription(),
                            base::Bind(&CallJsFunction)));
diff --git a/ios/chrome/browser/browser_state/BUILD.gn b/ios/chrome/browser/browser_state/BUILD.gn
index 94c58d8..6fcca06 100644
--- a/ios/chrome/browser/browser_state/BUILD.gn
+++ b/ios/chrome/browser/browser_state/BUILD.gn
@@ -14,6 +14,7 @@
     "//base",
     "//components/prefs",
     "//components/sync_preferences",
+    "//ios/chrome/browser/net:net_types",
     "//ios/chrome/browser/tabs",
     "//ios/web",
     "//net",
diff --git a/ios/chrome/browser/browser_state/chrome_browser_state.mm b/ios/chrome/browser/browser_state/chrome_browser_state.mm
index 5976860..c916d68 100644
--- a/ios/chrome/browser/browser_state/chrome_browser_state.mm
+++ b/ios/chrome/browser/browser_state/chrome_browser_state.mm
@@ -12,11 +12,11 @@
 #include "components/prefs/json_pref_store.h"
 #include "components/sync_preferences/pref_service_syncable.h"
 #include "ios/chrome/browser/chrome_url_constants.h"
-#include "ios/chrome/browser/net/ios_chrome_url_request_context_getter.h"
 #include "ios/web/public/web_state/web_state.h"
 #include "ios/web/public/web_thread.h"
 #include "ios/web/public/webui/web_ui_ios.h"
 #include "ios/web/webui/url_data_manager_ios_backend.h"
+#include "net/url_request/url_request_context_getter.h"
 #include "net/url_request/url_request_interceptor.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
diff --git a/ios/chrome/browser/native_app_launcher/BUILD.gn b/ios/chrome/browser/native_app_launcher/BUILD.gn
index f873d674d..b312559 100644
--- a/ios/chrome/browser/native_app_launcher/BUILD.gn
+++ b/ios/chrome/browser/native_app_launcher/BUILD.gn
@@ -92,6 +92,7 @@
     "//base/test:test_support",
     "//components/infobars/core",
     "//ios/chrome/browser",
+    "//ios/chrome/browser/infobars:infobars",
     "//ios/chrome/browser/web:test_support",
     "//ios/chrome/test:test_support",
     "//ios/public/provider/chrome/browser",
diff --git a/ios/chrome/browser/native_app_launcher/DEPS b/ios/chrome/browser/native_app_launcher/DEPS
index eb9956d..1c40ab5f 100644
--- a/ios/chrome/browser/native_app_launcher/DEPS
+++ b/ios/chrome/browser/native_app_launcher/DEPS
@@ -5,7 +5,4 @@
     "+ios/web/navigation/navigation_manager_impl.h",
     "+ios/web/web_state/web_state_impl.h",
   ],
-  "^native_app_navigation_controller\.mm$": [
-    "+ios/web/web_state/ui/crw_web_controller.h",
-  ],
 }
diff --git a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.h b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.h
index a343b9e..3beb9c6 100644
--- a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.h
+++ b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.h
@@ -7,9 +7,6 @@
 
 #import <Foundation/Foundation.h>
 
-#import "ios/chrome/browser/native_app_launcher/native_app_navigation_controller_protocol.h"
-#import "ios/web/public/web_state/crw_web_controller_observer.h"
-
 @class Tab;
 
 namespace net {
@@ -23,8 +20,7 @@
 // NativeAppNavigationController brings up a GAL Infobar if the webpage directs
 // it to do so and there are no other circumstances that would suppress its
 // display.
-@interface NativeAppNavigationController
-    : NSObject<CRWWebControllerObserver, NativeAppNavigationControllerProtocol>
+@interface NativeAppNavigationController : NSObject
 
 // Designated initializer. The use of |tab| will be phased out in the future
 // when all the information needed can be fulfilled by |webState|. Use this
diff --git a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.mm b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.mm
index 0db2759..3e6a784 100644
--- a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.mm
+++ b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller.mm
@@ -15,6 +15,7 @@
 #include "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/installation_notifier.h"
 #include "ios/chrome/browser/native_app_launcher/native_app_infobar_delegate.h"
+#import "ios/chrome/browser/native_app_launcher/native_app_navigation_controller_protocol.h"
 #include "ios/chrome/browser/native_app_launcher/native_app_navigation_util.h"
 #import "ios/chrome/browser/open_url_util.h"
 #import "ios/chrome/browser/tabs/tab.h"
@@ -23,8 +24,8 @@
 #import "ios/public/provider/chrome/browser/native_app_launcher/native_app_types.h"
 #import "ios/public/provider/chrome/browser/native_app_launcher/native_app_whitelist_manager.h"
 #include "ios/web/public/web_state/web_state.h"
+#import "ios/web/public/web_state/web_state_observer_bridge.h"
 #include "ios/web/public/web_thread.h"
-#import "ios/web/web_state/ui/crw_web_controller.h"
 #import "net/base/mac/url_conversions.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -33,7 +34,9 @@
 
 using base::UserMetricsAction;
 
-@interface NativeAppNavigationController ()
+@interface NativeAppNavigationController ()<
+    CRWWebStateObserver,
+    NativeAppNavigationControllerProtocol>
 // Shows a native app infobar by looking at the page's URL and by checking
 // wheter that infobar should be bypassed or not.
 - (void)showInfoBarIfNecessary;
@@ -60,6 +63,8 @@
   id<NativeAppMetadata> _metadata;
   // A set of appIds encoded as NSStrings.
   NSMutableSet* _appsPossiblyBeingInstalled;
+  // Allows this class to subscribe for CRWWebStateObserver callbacks.
+  std::unique_ptr<web::WebStateObserverBridge> _webStateObserver;
 }
 
 // Designated initializer. Use this instead of -init.
@@ -78,6 +83,8 @@
     DCHECK(!tab || [tab webState] == webState);
     _tab = tab;
     _appsPossiblyBeingInstalled = [[NSMutableSet alloc] init];
+    _webStateObserver =
+        base::MakeUnique<web::WebStateObserverBridge>(webState, self);
   }
   return self;
 }
@@ -159,8 +166,7 @@
   }
 }
 
-#pragma mark -
-#pragma mark NativeAppNavigationControllerProtocol methods
+#pragma mark - NativeAppNavigationControllerProtocol methods
 
 - (NSString*)appId {
   return [_metadata appId];
@@ -206,18 +212,20 @@
   [_metadata updateWithUserAction:userAction];
 }
 
-#pragma mark -
-#pragma mark CRWWebControllerObserver methods
+#pragma mark - CRWWebStateObserver methods
 
-- (void)pageLoaded:(CRWWebController*)webController {
-  if (![_tab isPrerenderTab])
+- (void)webState:(web::WebState*)webState didLoadPageWithSuccess:(BOOL)success {
+  if (success && ![_tab isPrerenderTab])
     [self showInfoBarIfNecessary];
 }
 
-- (void)webControllerWillClose:(CRWWebController*)webController {
-  [webController removeObserver:self];
+- (void)webStateDestroyed:(web::WebState*)webState {
+  _webState = nullptr;
+  _webStateObserver.reset();
 }
 
+#pragma mark - Private methods
+
 - (void)appDidInstall:(NSNotification*)notification {
   [self removeAppFromNotification:notification];
   [self showInfoBarIfNecessary];
diff --git a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm
index 695085c4..aa23143 100644
--- a/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm
+++ b/ios/chrome/browser/native_app_launcher/native_app_navigation_controller_unittest.mm
@@ -8,6 +8,8 @@
 #include "base/mac/scoped_nsobject.h"
 #include "base/memory/ptr_util.h"
 #include "base/metrics/user_metrics.h"
+#include "base/strings/utf_string_conversions.h"
+#include "ios/chrome/browser/infobars/infobar_manager_impl.h"
 #import "ios/chrome/browser/installation_notifier.h"
 #include "ios/chrome/browser/native_app_launcher/native_app_infobar_delegate.h"
 #import "ios/chrome/browser/native_app_launcher/native_app_navigation_controller.h"
@@ -16,6 +18,7 @@
 #import "ios/public/provider/chrome/browser/native_app_launcher/fake_native_app_metadata.h"
 #import "ios/public/provider/chrome/browser/native_app_launcher/fake_native_app_whitelist_manager.h"
 #include "ios/public/provider/chrome/browser/test_chrome_browser_provider.h"
+#import "testing/gtest_mac.h"
 
 @interface NativeAppNavigationController (Testing)
 - (void)recordInfobarDisplayedOfType:(NativeAppControllerType)type
@@ -117,6 +120,43 @@
   ExpectHandlerCalledAndReset(1);
 }
 
+// Tests presenting NativeAppInfoBar after page is loaded.
+TEST_F(NativeAppNavigationControllerTest, NativeAppInfoBar) {
+  SetExpectedActionName("MobileGALInstallInfoBarDirectNavigation");
+  InfoBarManagerImpl::CreateForWebState(web_state());
+
+  // Set up fake metadata.
+  FakeNativeAppWhitelistManager* fakeManager =
+      [[[FakeNativeAppWhitelistManager alloc] init] autorelease];
+  IOSChromeScopedTestingChromeBrowserProvider provider(
+      base::MakeUnique<FakeChromeBrowserProvider>(fakeManager));
+  FakeNativeAppMetadata* metadata =
+      [[[FakeNativeAppMetadata alloc] init] autorelease];
+  fakeManager.metadata = metadata;
+  metadata.appName = @"App";
+  metadata.appId = @"App-ID";
+
+  // Load the page to trigger infobar presentation.
+  LoadHtml(@"<html><body></body></html>", GURL("http://test.com"));
+
+  // Verify that infobar was presented
+  auto* infobar_manager = InfoBarManagerImpl::FromWebState(web_state());
+  ASSERT_EQ(1U, infobar_manager->infobar_count());
+  infobars::InfoBar* infobar = infobar_manager->infobar_at(0);
+  auto* delegate = infobar->delegate()->AsNativeAppInfoBarDelegate();
+  ASSERT_TRUE(delegate);
+
+  // Verify infobar appearance.
+  EXPECT_EQ("Open this page in the App app?",
+            base::UTF16ToUTF8(delegate->GetInstallText()));
+  EXPECT_EQ("Open this page in the App app?",
+            base::UTF16ToUTF8(delegate->GetLaunchText()));
+  EXPECT_EQ("Open in App", base::UTF16ToUTF8(delegate->GetOpenPolicyText()));
+  EXPECT_EQ("Just once", base::UTF16ToUTF8(delegate->GetOpenOnceText()));
+  EXPECT_EQ("Always", base::UTF16ToUTF8(delegate->GetOpenAlwaysText()));
+  EXPECT_NSEQ(@"App-ID", delegate->GetAppId());
+}
+
 TEST_F(NativeAppNavigationControllerTest,
        TestRemovingAppFromListAfterInstallation) {
   NSString* const kMapsAppName = @"Maps";
diff --git a/ios/chrome/browser/net/BUILD.gn b/ios/chrome/browser/net/BUILD.gn
index 2d147eb..c581c598 100644
--- a/ios/chrome/browser/net/BUILD.gn
+++ b/ios/chrome/browser/net/BUILD.gn
@@ -21,7 +21,6 @@
     "ios_chrome_network_delegate.h",
     "ios_chrome_url_request_context_getter.cc",
     "ios_chrome_url_request_context_getter.h",
-    "net_types.h",
     "proxy_service_factory.cc",
     "proxy_service_factory.h",
     "retryable_url_fetcher.h",
@@ -44,10 +43,21 @@
     "//net:extras",
     "//url",
   ]
-  allow_circular_includes_from = [
-    "//ios/chrome/browser",
-    "//ios/chrome/browser/browser_state",
+  public_deps = [
+    ":net_types",
   ]
+  allow_circular_includes_from = [ "//ios/chrome/browser" ]
+}
+
+source_set("net_types") {
+  sources = [
+    "net_types.h",
+  ]
+  deps = [
+    "//base",
+    "//net",
+  ]
+  configs += [ "//build/config/compiler:enable_arc" ]
 }
 
 source_set("unit_tests") {
diff --git a/ios/chrome/browser/tabs/tab.mm b/ios/chrome/browser/tabs/tab.mm
index 5b58935..7d91c95 100644
--- a/ios/chrome/browser/tabs/tab.mm
+++ b/ios/chrome/browser/tabs/tab.mm
@@ -2199,7 +2199,6 @@
           initWithWebState:self.webState
       requestContextGetter:browserState_->GetRequestContext()
                        tab:self]);
-  [self.webController addObserver:nativeAppNavigationController_];
   DCHECK(nativeAppNavigationController_);
 }
 
diff --git a/ios/chrome/browser/ui/DEPS b/ios/chrome/browser/ui/DEPS
index fa03c9a..0a1586ac 100644
--- a/ios/chrome/browser/ui/DEPS
+++ b/ios/chrome/browser/ui/DEPS
@@ -8,7 +8,6 @@
   # TODO(crbug.com/620489): Remove these exceptions.
   "^browser_view_controller\.mm$": [
     "+ios/web/navigation/crw_session_controller.h",
-    "+ios/web/navigation/crw_session_entry.h",
     "+ios/web/navigation/navigation_manager_impl.h",
     "+ios/web/web_state/ui/crw_web_controller.h",
   ],
diff --git a/ios/chrome/browser/ui/browser_view_controller.mm b/ios/chrome/browser/ui/browser_view_controller.mm
index 6e441ea..c97d780 100644
--- a/ios/chrome/browser/ui/browser_view_controller.mm
+++ b/ios/chrome/browser/ui/browser_view_controller.mm
@@ -172,7 +172,6 @@
 #include "ios/public/provider/chrome/browser/voice/voice_search_controller_delegate.h"
 #include "ios/public/provider/chrome/browser/voice/voice_search_provider.h"
 #import "ios/web/navigation/crw_session_controller.h"
-#import "ios/web/navigation/crw_session_entry.h"
 #include "ios/web/navigation/navigation_manager_impl.h"
 #include "ios/web/public/active_state_manager.h"
 #include "ios/web/public/navigation_item.h"
@@ -1918,11 +1917,10 @@
 
   // Hide the toolbar if displaying phone NTP.
   if (!IsIPadIdiom()) {
-    CRWSessionEntry* entry =
-        [[tab navigationManagerImpl]->GetSessionController() currentEntry];
+    web::NavigationItem* item = [tab navigationManager]->GetVisibleItem();
     BOOL hideToolbar = NO;
-    if (entry) {
-      GURL url = [entry navigationItem]->GetURL();
+    if (item) {
+      GURL url = item->GetURL();
       BOOL isNTP = url.GetOrigin() == GURL(kChromeUINewTabURL);
       hideToolbar = isNTP && !_isOffTheRecord &&
                     ![_toolbarController isOmniboxFirstResponder] &&
@@ -3380,7 +3378,7 @@
   CRWSessionController* sc =
       [tab navigationManagerImpl]->GetSessionController();
   [_toolbarController showTabHistoryPopupInView:[self view]
-                             withSessionEntries:[sc backwardEntries]
+                                      withItems:[sc backwardItems]
                                  forBackHistory:YES];
 }
 
@@ -3397,14 +3395,14 @@
   CRWSessionController* sc =
       [tab navigationManagerImpl]->GetSessionController();
   [_toolbarController showTabHistoryPopupInView:[self view]
-                             withSessionEntries:[sc forwardEntries]
+                                      withItems:[sc forwardItems]
                                  forBackHistory:NO];
 }
 
 - (void)navigateToSelectedEntry:(id)sender {
   DCHECK([sender isKindOfClass:[TabHistoryCell class]]);
   TabHistoryCell* selectedCell = (TabHistoryCell*)sender;
-  [[_model currentTab] goToItem:selectedCell.entry.navigationItem];
+  [[_model currentTab] goToItem:selectedCell.item];
   [_toolbarController dismissTabHistoryPopup];
 }
 
@@ -4816,13 +4814,6 @@
   return [_model currentTab].usesDesktopUserAgent;
 }
 
-- (CRWSessionEntry*)currentSessionEntry {
-  Tab* tab = [_model currentTab];
-  if (![tab navigationManager])
-    return nil;
-  return [[tab navigationManagerImpl]->GetSessionController() currentEntry];
-}
-
 #pragma mark - BookmarkBridgeMethods
 
 // If an added or removed bookmark is the same as the current url, update the
diff --git a/ios/chrome/browser/ui/history/BUILD.gn b/ios/chrome/browser/ui/history/BUILD.gn
index 8926439..74da394 100644
--- a/ios/chrome/browser/ui/history/BUILD.gn
+++ b/ios/chrome/browser/ui/history/BUILD.gn
@@ -210,6 +210,7 @@
     "//components/browsing_data/core",
     "//components/prefs",
     "//components/strings",
+    "//components/url_formatter:url_formatter",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/browser_state",
diff --git a/ios/chrome/browser/ui/history/DEPS b/ios/chrome/browser/ui/history/DEPS
deleted file mode 100644
index cb80df7..0000000
--- a/ios/chrome/browser/ui/history/DEPS
+++ /dev/null
@@ -1,15 +0,0 @@
-specific_include_rules = {
-  # TODO(crbug.com/620907): Remove these exceptions.
-  "^tab_history_cell\.mm$": [
-    "+ios/web/navigation/crw_session_entry.h",
-  ],
-  "tab_history_popup_controller.mm": [
-    "+ios/web/navigation/crw_session_entry.h",
-  ],
-  "tab_history_popup_controller_unittest.mm": [
-    "+ios/web/navigation/crw_session_entry.h",
-  ],
-  "tab_history_view_controller.mm": [
-    "+ios/web/navigation/crw_session_entry.h",
-  ],
-}
diff --git a/ios/chrome/browser/ui/history/tab_history_cell.h b/ios/chrome/browser/ui/history/tab_history_cell.h
index 745a9d5d..590e037f 100644
--- a/ios/chrome/browser/ui/history/tab_history_cell.h
+++ b/ios/chrome/browser/ui/history/tab_history_cell.h
@@ -7,18 +7,20 @@
 
 #import <UIKit/UIKit.h>
 
-@class CRWSessionEntry;
+namespace web {
+class NavigationItem;
+}
 
 // Table cell used in TabHistoryViewController.
 @interface TabHistoryCell : UICollectionViewCell
-@property(strong, nonatomic) CRWSessionEntry* entry;
-@property(weak, nonatomic, readonly) UILabel* titleLabel;
+@property(assign, nonatomic) const web::NavigationItem* item;
+@property(strong, nonatomic, readonly) UILabel* titleLabel;
 @end
 
 // Header for a section of TabHistoryCells.
 @interface TabHistorySectionHeader : UICollectionReusableView
-@property(weak, nonatomic, readonly) UIImageView* iconView;
-@property(weak, nonatomic, readonly) UIView* lineView;
+@property(strong, nonatomic, readonly) UIImageView* iconView;
+@property(strong, nonatomic, readonly) UIView* lineView;
 @end
 
 // Footer for a section of TabHistoryCells.
diff --git a/ios/chrome/browser/ui/history/tab_history_cell.mm b/ios/chrome/browser/ui/history/tab_history_cell.mm
index 2d34024..b2d708a 100644
--- a/ios/chrome/browser/ui/history/tab_history_cell.mm
+++ b/ios/chrome/browser/ui/history/tab_history_cell.mm
@@ -8,7 +8,6 @@
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/browser/ui/uikit_ui_util.h"
 #import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h"
-#import "ios/web/navigation/crw_session_entry.h"
 #include "ios/web/public/navigation_item.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
@@ -42,10 +41,10 @@
 }
 }
 
-@implementation TabHistoryCell {
-  CRWSessionEntry* _entry;
-  UILabel* _titleLabel;
-}
+@implementation TabHistoryCell
+
+@synthesize item = _item;
+@synthesize titleLabel = _titleLabel;
 
 - (instancetype)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
@@ -73,59 +72,34 @@
 
 - (void)layoutSubviews {
   [super layoutSubviews];
-
-  CGRect bounds = [[self contentView] bounds];
-  CGRect frame = AlignRectOriginAndSizeToPixels(bounds);
-  [_titleLabel setFrame:frame];
+  self.titleLabel.frame =
+      AlignRectOriginAndSizeToPixels(self.contentView.bounds);
 }
 
-- (CRWSessionEntry*)entry {
-  return _entry;
-}
+#pragma mark Accessors
 
-- (void)setEntry:(CRWSessionEntry*)entry {
-  _entry = entry;
+- (void)setItem:(const web::NavigationItem*)item {
+  _item = item;
 
-  NSString* title = nil;
-  web::NavigationItem* navigationItem = [_entry navigationItem];
-  if (navigationItem) {
-    // TODO(rohitrao): Can this use GetTitleForDisplay() instead?
-    if (navigationItem->GetTitle().empty())
-      title = base::SysUTF8ToNSString(navigationItem->GetURL().spec());
-    else
-      title = base::SysUTF16ToNSString(navigationItem->GetTitle());
-  }
-
-  [_titleLabel setText:title];
-  [self setAccessibilityLabel:title];
+  self.titleLabel.text =
+      _item ? base::SysUTF16ToNSString(_item->GetTitleForDisplay()) : nil;
+  [self setAccessibilityLabel:self.titleLabel.text];
   [self setNeedsLayout];
 }
 
-- (UILabel*)titleLabel {
-  return _titleLabel;
-}
+#pragma mark UICollectionViewCell
 
 - (void)prepareForReuse {
   [super prepareForReuse];
-  _entry = nil;
-  [_titleLabel setText:nil];
-  [self setAccessibilityLabel:nil];
+  self.item = nullptr;
 }
 
 @end
 
-@implementation TabHistorySectionHeader {
-  UIImageView* _iconView;
-  UIView* _lineView;
-}
+@implementation TabHistorySectionHeader
 
-- (UIImageView*)iconView {
-  return _iconView;
-}
-
-- (UIView*)lineView {
-  return _lineView;
-}
+@synthesize iconView = _iconView;
+@synthesize lineView = _lineView;
 
 - (instancetype)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
@@ -134,17 +108,17 @@
     _iconView = [[UIImageView alloc] initWithFrame:iconFrame];
     [self addSubview:_iconView];
 
-    UIColor* lineColor = UIColorFromRGB(kHeaderLineRGB);
-
     _lineView = [[UIView alloc] initWithFrame:CGRectZero];
-    [[_lineView layer] setCornerRadius:HeaderLineRadius()];
-    [_lineView setBackgroundColor:lineColor];
+    _lineView.layer.cornerRadius = HeaderLineRadius();
+    _lineView.backgroundColor = UIColorFromRGB(kHeaderLineRGB);
     [self addSubview:_lineView];
   }
 
   return self;
 }
 
+#pragma mark UIView
+
 - (void)layoutSubviews {
   [super layoutSubviews];
 
@@ -153,7 +127,7 @@
 
   CGRect iconViewFrame = AlignRectToPixel(bounds);
   iconViewFrame.size = CGSizeMake(kSiteIconViewWidth, kSiteIconViewWidth);
-  [_iconView setFrame:iconViewFrame];
+  self.iconView.frame = iconViewFrame;
 
   CGFloat iconViewMaxY = CGRectGetMaxY(iconViewFrame);
   CGFloat height =
@@ -167,8 +141,7 @@
   lineViewFrame.size.width = HeaderLineWidth();
   lineViewFrame.size.height = height;
   lineViewFrame = AlignRectOriginAndSizeToPixels(lineViewFrame);
-
-  [_lineView setFrame:lineViewFrame];
+  self.lineView.frame = lineViewFrame;
 }
 
 @end
@@ -178,7 +151,7 @@
 - (instancetype)initWithFrame:(CGRect)frame {
   self = [super initWithFrame:frame];
   if (self)
-    [self setBackgroundColor:UIColorFromRGB(kFooterRGB)];
+    self.backgroundColor = UIColorFromRGB(kFooterRGB);
 
   return self;
 }
diff --git a/ios/chrome/browser/ui/history/tab_history_popup_controller.h b/ios/chrome/browser/ui/history/tab_history_popup_controller.h
index 293447f..8cd8a6294 100644
--- a/ios/chrome/browser/ui/history/tab_history_popup_controller.h
+++ b/ios/chrome/browser/ui/history/tab_history_popup_controller.h
@@ -7,20 +7,19 @@
 
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_controller.h"
 
-@class TabHistoryViewController;
+#include "ios/web/public/navigation_item_list.h"
 
 // The view controller for the tab history menu that appears when the user long
 // presses the back or forward button.
 @interface TabHistoryPopupController : PopupMenuController
 
-// Initializes the popup to display |entries| with the given |origin| that is
+// Initializes the popup to display |items| with the given |origin| that is
 // relevant to the |parent|'s coordinate system.
 // |entries| is an array of CRWSessionEntries.
-// TODO(crbug.com/546355): Convert this class to use an array of
-//    NavigationEntries
 - (id)initWithOrigin:(CGPoint)origin
           parentView:(UIView*)parent
-             entries:(NSArray*)entries;
+               items:(const web::NavigationItemList&)items
+    NS_DESIGNATED_INITIALIZER;
 
 @end
 
diff --git a/ios/chrome/browser/ui/history/tab_history_popup_controller.mm b/ios/chrome/browser/ui/history/tab_history_popup_controller.mm
index 832de03..5c6c124 100644
--- a/ios/chrome/browser/ui/history/tab_history_popup_controller.mm
+++ b/ios/chrome/browser/ui/history/tab_history_popup_controller.mm
@@ -15,20 +15,22 @@
 #include "ios/chrome/browser/ui/ui_util.h"
 #import "ios/chrome/common/material_timing.h"
 #import "ios/third_party/material_roboto_font_loader_ios/src/src/MaterialRobotoFontLoader.h"
-#import "ios/web/navigation/crw_session_entry.h"
 #include "ios/web/public/navigation_item.h"
 #import "ui/gfx/ios/NSString+CrStringDrawing.h"
 #include "ui/gfx/ios/uikit_util.h"
+#include "url/gurl.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
 namespace {
-static const CGFloat kTabHistoryMinWidth = 250.0;
-static const CGFloat kTabHistoryMaxWidthLandscapePhone = 350.0;
+const CGFloat kTabHistoryMinWidth = 250.0;
+const CGFloat kTabHistoryMaxWidthLandscapePhone = 350.0;
 // x coordinate for the textLabel in a default table cell with an image.
-static const CGFloat kCellTextXCoordinate = 60.0;
+const CGFloat kCellTextXCoordinate = 60.0;
+// The corner radius for the popover container view.
+const CGFloat kPopoverCornerRadius = 2.0;
 // Inset for the shadows of the contained views.
 NS_INLINE UIEdgeInsets TabHistoryPopupMenuInsets() {
   return UIEdgeInsetsMakeDirected(9, 11, 12, 11);
@@ -41,91 +43,90 @@
 static const CGFloat kHeightPercentage = 0.85;
 }  // anonymous namespace
 
-@interface TabHistoryPopupController () {
-  // TableViewController for the table displaying tab history entries.
-  TabHistoryViewController* tabHistoryTableViewController_;
+@interface TabHistoryPopupController ()
 
-  // Container view of the history entries table.
-  UIView* tabHistoryTableViewContainer_;
-}
-
-// Determines the width for the popup depending on the device, orientation, and
-// CRWSessionEntrys to display.
-- (CGFloat)calculatePopupWidth:(NSArray*)entries;
-
+// The UITableViewController displaying Tab history items.
 @property(nonatomic, strong)
     TabHistoryViewController* tabHistoryTableViewController;
+// The container view that displays |tabHistoryTableViewController|.
 @property(nonatomic, strong) UIView* tabHistoryTableViewContainer;
 
+// Determines the width for the popup depending on the device, orientation, and
+// number of NavigationItems to display.
++ (CGFloat)popupWidthForItems:(const web::NavigationItemList)items;
+
 @end
 
 @implementation TabHistoryPopupController
 
-@synthesize tabHistoryTableViewController = tabHistoryTableViewController_;
-@synthesize tabHistoryTableViewContainer = tabHistoryTableViewContainer_;
+@synthesize tabHistoryTableViewController = _tabHistoryTableViewController;
+@synthesize tabHistoryTableViewContainer = _tabHistoryTableViewContainer;
 
 - (id)initWithOrigin:(CGPoint)origin
           parentView:(UIView*)parent
-             entries:(NSArray*)entries {
+               items:(const web::NavigationItemList&)items {
   DCHECK(parent);
-  self = [super initWithParentView:parent];
-  if (self) {
-    tabHistoryTableViewController_ = [[TabHistoryViewController alloc] init];
-    [tabHistoryTableViewController_ setSessionEntries:entries];
+  if ((self = [super initWithParentView:parent])) {
+    // Create the table view controller.
+    _tabHistoryTableViewController =
+        [[TabHistoryViewController alloc] initWithItems:items];
 
-    UICollectionView* collectionView =
-        [tabHistoryTableViewController_ collectionView];
-    [collectionView setAccessibilityIdentifier:@"Tab History"];
+    // Set up the container view.
+    _tabHistoryTableViewContainer = [[UIView alloc] initWithFrame:CGRectZero];
+    _tabHistoryTableViewContainer.layer.cornerRadius = kPopoverCornerRadius;
+    _tabHistoryTableViewContainer.layer.masksToBounds = YES;
+    [_tabHistoryTableViewContainer
+        addSubview:_tabHistoryTableViewController.view];
 
-    tabHistoryTableViewContainer_ = [[UIView alloc] initWithFrame:CGRectZero];
-    [tabHistoryTableViewContainer_ layer].cornerRadius = 2;
-    [tabHistoryTableViewContainer_ layer].masksToBounds = YES;
-    [tabHistoryTableViewContainer_ addSubview:collectionView];
-
+    // Calculate the optimal popup size.
     LayoutOffset originOffset =
         kHistoryPopupLeadingOffset - TabHistoryPopupMenuInsets().left;
     CGPoint newOrigin = CGPointLayoutOffset(origin, originOffset);
     newOrigin.y += kHistoryPopupYOffset;
-
     CGFloat availableHeight =
         (CGRectGetHeight([parent bounds]) - origin.y) * kHeightPercentage;
     CGFloat optimalHeight =
-        [tabHistoryTableViewController_ optimalHeight:availableHeight];
-    CGFloat popupWidth = [self calculatePopupWidth:entries];
+        [_tabHistoryTableViewController optimalHeight:availableHeight];
+    CGFloat popupWidth = [[self class] popupWidthForItems:items];
     [self setOptimalSize:CGSizeMake(popupWidth, optimalHeight)
                 atOrigin:newOrigin];
-
-    CGRect bounds = [[self popupContainer] bounds];
-    CGRect frame = UIEdgeInsetsInsetRect(bounds, TabHistoryPopupMenuInsets());
-
-    [tabHistoryTableViewContainer_ setFrame:frame];
-    [collectionView setFrame:[tabHistoryTableViewContainer_ bounds]];
-
-    [[self popupContainer] addSubview:tabHistoryTableViewContainer_];
-    CGRect containerFrame = [[self popupContainer] frame];
-    CGPoint destination = CGPointMake(CGRectGetLeadingEdge(containerFrame),
-                                      CGRectGetMinY(containerFrame));
-    [self fadeInPopupFromSource:origin toDestination:destination];
   }
   return self;
 }
 
+- (void)dealloc {
+  [_tabHistoryTableViewContainer removeFromSuperview];
+}
+
+#pragma mark - PopupMenuController
+
 - (void)fadeInPopupFromSource:(CGPoint)source
                 toDestination:(CGPoint)destination {
-  [tabHistoryTableViewContainer_ setAlpha:0];
+  // Add the container view to the popup view and resize.
+  if (!_tabHistoryTableViewContainer.superview)
+    [self.popupContainer addSubview:_tabHistoryTableViewContainer];
+  _tabHistoryTableViewContainer.frame = UIEdgeInsetsInsetRect(
+      self.popupContainer.bounds, TabHistoryPopupMenuInsets());
+  _tabHistoryTableViewController.view.frame =
+      _tabHistoryTableViewContainer.bounds;
+
+  // Set up the animation.
+  [_tabHistoryTableViewContainer setAlpha:0];
   [UIView animateWithDuration:ios::material::kDuration1
                    animations:^{
-                     [tabHistoryTableViewContainer_ setAlpha:1];
+                     [_tabHistoryTableViewContainer setAlpha:1];
                    }];
   [super fadeInPopupFromSource:source toDestination:destination];
 }
 
 - (void)dismissAnimatedWithCompletion:(void (^)(void))completion {
-  [tabHistoryTableViewContainer_ setAlpha:0];
+  [_tabHistoryTableViewContainer setAlpha:0];
   [super dismissAnimatedWithCompletion:completion];
 }
 
-- (CGFloat)calculatePopupWidth:(NSArray*)entries {
+#pragma mark -
+
++ (CGFloat)popupWidthForItems:(const web::NavigationItemList)items {
   CGFloat maxWidth;
 
   // Determine the maximum width for the device and orientation.
@@ -145,8 +146,7 @@
   // Increase the width to fit the text to display but don't exceed maxWidth.
   CGFloat cellWidth = kTabHistoryMinWidth;
   UIFont* font = [[MDFRobotoFontLoader sharedInstance] regularFontOfSize:16];
-  for (CRWSessionEntry* sessionEntry in entries) {
-    web::NavigationItem* item = sessionEntry.navigationItem;
+  for (web::NavigationItem* item : items) {
     // TODO(rohitrao): Can this be replaced with GetTitleForDisplay()?
     NSString* cellText = item->GetTitle().empty()
                              ? base::SysUTF8ToNSString(item->GetURL().spec())
@@ -155,7 +155,7 @@
                            kCellTextXCoordinate;
 
     // If contentWidth is larger than maxWidth, return maxWidth instead of
-    // checking the rest of the entries.
+    // checking the rest of the items.
     if (contentWidth > maxWidth)
       return maxWidth;
     if (contentWidth > cellWidth)
@@ -164,8 +164,4 @@
   return cellWidth;
 }
 
-- (void)dealloc {
-  [tabHistoryTableViewContainer_ removeFromSuperview];
-}
-
 @end
diff --git a/ios/chrome/browser/ui/history/tab_history_popup_controller_egtest.mm b/ios/chrome/browser/ui/history/tab_history_popup_controller_egtest.mm
index 1881fe80..5ed4e78 100644
--- a/ios/chrome/browser/ui/history/tab_history_popup_controller_egtest.mm
+++ b/ios/chrome/browser/ui/history/tab_history_popup_controller_egtest.mm
@@ -11,6 +11,7 @@
 #import "ios/chrome/test/earl_grey/chrome_test_case.h"
 #import "ios/web/public/test/http_server.h"
 #import "ios/web/public/test/http_server_util.h"
+#include "ios/web/public/test/url_test_util.h"
 
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
@@ -31,10 +32,10 @@
   const GURL URL3 = web::test::HttpServer::MakeUrl("http://page3");
   const GURL URL4 = web::test::HttpServer::MakeUrl("http://page4");
   NSString* entry0 = @"New Tab";
-  NSString* entry1 = base::SysUTF8ToNSString(URL1.spec());
-  NSString* entry2 = base::SysUTF8ToNSString(URL2.spec());
-  NSString* entry3 = base::SysUTF8ToNSString(URL3.spec());
-  NSString* entry4 = base::SysUTF8ToNSString(URL4.spec());
+  NSString* entry1 = base::SysUTF16ToNSString(web::GetDisplayTitleForUrl(URL1));
+  NSString* entry2 = base::SysUTF16ToNSString(web::GetDisplayTitleForUrl(URL2));
+  NSString* entry3 = base::SysUTF16ToNSString(web::GetDisplayTitleForUrl(URL3));
+  NSString* entry4 = base::SysUTF16ToNSString(web::GetDisplayTitleForUrl(URL4));
 
   // Create map of canned responses and set up the test HTML server.
   std::map<GURL, std::string> responses;
diff --git a/ios/chrome/browser/ui/history/tab_history_popup_controller_unittest.mm b/ios/chrome/browser/ui/history/tab_history_popup_controller_unittest.mm
index 3782087..6f1e9e7 100644
--- a/ios/chrome/browser/ui/history/tab_history_popup_controller_unittest.mm
+++ b/ios/chrome/browser/ui/history/tab_history_popup_controller_unittest.mm
@@ -11,7 +11,6 @@
 #include "components/sessions/core/session_types.h"
 #import "ios/chrome/browser/ui/history/tab_history_view_controller.h"
 #include "ios/chrome/browser/ui/ui_util.h"
-#import "ios/web/navigation/crw_session_entry.h"
 #include "ios/web/public/navigation_item.h"
 #include "ios/web/public/referrer.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -20,7 +19,7 @@
 #include "ui/gfx/ios/uikit_util.h"
 
 @interface TabHistoryPopupController (Testing)
-- (CGFloat)calculatePopupWidth:(NSArray*)entries;
++ (CGFloat)popupWidthForItems:(const web::NavigationItemList)items;
 @property(nonatomic, retain)
     TabHistoryViewController* tabHistoryTableViewController;
 @end
@@ -32,36 +31,26 @@
 class TabHistoryPopupControllerTest : public PlatformTest {
  protected:
   void SetUp() override {
+    web::Referrer referrer(GURL("http://www.example.com"),
+                           web::ReferrerPolicyDefault);
+    items_.push_back(web::NavigationItem::Create());
+    items_.back()->SetURL(GURL("http://www.example.com/0"));
+    items_.back()->SetReferrer(referrer);
+    items_.push_back(web::NavigationItem::Create());
+    items_.back()->SetURL(GURL("http://www.example.com/1"));
+    items_.back()->SetReferrer(referrer);
+    items_.push_back(web::NavigationItem::Create());
+    items_.back()->SetURL(GURL("http://www.example.com/0"));
+    items_.back()->SetReferrer(referrer);
+
     parent_.reset([[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds]);
     popup_.reset([[TabHistoryPopupController alloc]
         initWithOrigin:CGPointZero
             parentView:parent_
-               entries:testEntriesArray()]);
+                 items:web::CreateRawNavigationItemList(items_)]);
   }
-  void TearDown() override {
-    parent_.reset();
-    popup_.reset();
-  }
-  NSArray* testEntriesArray() {
-    web::Referrer referrer(GURL("http://www.example.com"),
-                           web::ReferrerPolicyDefault);
-    std::unique_ptr<web::NavigationItem> item0 = web::NavigationItem::Create();
-    item0->SetURL(GURL("http://www.example.com/0"));
-    item0->SetReferrer(referrer);
-    CRWSessionEntry* entry0 =
-        [[CRWSessionEntry alloc] initWithNavigationItem:std::move(item0)];
-    std::unique_ptr<web::NavigationItem> item1 = web::NavigationItem::Create();
-    item1->SetURL(GURL("http://www.example.com/1"));
-    item1->SetReferrer(referrer);
-    CRWSessionEntry* entry1 =
-        [[CRWSessionEntry alloc] initWithNavigationItem:std::move(item1)];
-    std::unique_ptr<web::NavigationItem> item2 = web::NavigationItem::Create();
-    item2->SetURL(GURL("http://www.example.com/2"));
-    item2->SetReferrer(referrer);
-    CRWSessionEntry* entry2 =
-        [[CRWSessionEntry alloc] initWithNavigationItem:std::move(item2)];
-    return [NSArray arrayWithObjects:entry0, entry1, entry2, nil];
-  }
+
+  web::ScopedNavigationItemList items_;
   base::scoped_nsobject<UIView> parent_;
   base::scoped_nsobject<TabHistoryPopupController> popup_;
 };
@@ -81,30 +70,6 @@
 }
 
 TEST_F(TabHistoryPopupControllerTest, TestCalculatePopupWidth) {
-  web::Referrer referrer(GURL("http://www.example.com"),
-                         web::ReferrerPolicyDefault);
-  std::unique_ptr<web::NavigationItem> itemShort =
-      web::NavigationItem::Create();
-  itemShort->SetURL(GURL("http://foo.com/"));
-  itemShort->SetReferrer(referrer);
-  CRWSessionEntry* entryShort =
-      [[CRWSessionEntry alloc] initWithNavigationItem:std::move(itemShort)];
-  std::unique_ptr<web::NavigationItem> itemMedium =
-      web::NavigationItem::Create();
-  itemMedium->SetURL(GURL("http://www.example.com/mediumurl"));
-  itemMedium->SetReferrer(referrer);
-  CRWSessionEntry* entryMedium =
-      [[CRWSessionEntry alloc] initWithNavigationItem:std::move(itemMedium)];
-  std::string longURL =
-      "http://www.example.com/this/is/areally/long/url/that/"
-      "is/larger/than/the/maximum/table/width/so/its/text/will/get/cut/off/and/"
-      "the/max/width/is/used/";
-  std::unique_ptr<web::NavigationItem> itemLong = web::NavigationItem::Create();
-  itemLong->SetURL(GURL(longURL));
-  itemLong->SetReferrer(referrer);
-  CRWSessionEntry* entryLong =
-      [[CRWSessionEntry alloc] initWithNavigationItem:std::move(itemLong)];
-
   CGFloat minWidth = kTabHistoryMinWidth;
   CGFloat maxWidth = kTabHistoryMinWidth;
   if (!IsIPadIdiom()) {
@@ -117,19 +82,37 @@
         [UIApplication sharedApplication].keyWindow.frame.size.width * .85);
   }
 
-  CGFloat width =
-      [popup_ calculatePopupWidth:[NSArray arrayWithObjects:entryShort, nil]];
+  // Add an item with a short URL and verify that the minimum width is returned.
+  web::ScopedNavigationItemList items;
+  web::Referrer referrer(GURL("http://www.example.com"),
+                         web::ReferrerPolicyDefault);
+  items.push_back(web::NavigationItem::Create());
+  items.back()->SetURL(GURL("http://foo.com/"));
+  items.back()->SetReferrer(referrer);
+  web::NavigationItemList raw_items = web::CreateRawNavigationItemList(items);
+  CGFloat width = [TabHistoryPopupController popupWidthForItems:raw_items];
   EXPECT_EQ(minWidth, width);
 
-  width =
-      [popup_ calculatePopupWidth:[NSArray arrayWithObjects:entryShort,
-                                                            entryMedium, nil]];
+  // Add an item with a medium URL and verify that the returned width is between
+  // the minimum and maximum.
+  items.push_back(web::NavigationItem::Create());
+  items.back()->SetURL(GURL("http://www.example.com/mediumurl"));
+  items.back()->SetReferrer(referrer);
+  raw_items.push_back(items.back().get());
+  width = [TabHistoryPopupController popupWidthForItems:raw_items];
   EXPECT_GE(width, minWidth);
   EXPECT_LE(width, maxWidth);
 
-  width = [popup_
-      calculatePopupWidth:[NSArray arrayWithObjects:entryShort, entryLong,
-                                                    entryMedium, nil]];
+  // Add an item with a long URL and verify that the maximum width is returned.
+  std::string long_url =
+      "http://www.example.com/this/is/areally/long/url/that/"
+      "is/larger/than/the/maximum/table/width/so/its/text/will/get/cut/off/and/"
+      "the/max/width/is/used/";
+  items.push_back(web::NavigationItem::Create());
+  items.back()->SetURL(GURL(long_url));
+  items.back()->SetReferrer(referrer);
+  raw_items.push_back(items.back().get());
+  width = [TabHistoryPopupController popupWidthForItems:raw_items];
   EXPECT_EQ(maxWidth, width);
 }
 
diff --git a/ios/chrome/browser/ui/history/tab_history_view_controller.h b/ios/chrome/browser/ui/history/tab_history_view_controller.h
index cc7877e..5343bc2 100644
--- a/ios/chrome/browser/ui/history/tab_history_view_controller.h
+++ b/ios/chrome/browser/ui/history/tab_history_view_controller.h
@@ -7,12 +7,21 @@
 
 #import <UIKit/UIKit.h>
 
-// View controller for displaying a list of CRWSessionEntry objects in a table.
+#include "ios/web/public/navigation_item_list.h"
+
+// View controller for displaying a list of NavigationItems in a table.
 @interface TabHistoryViewController : UICollectionViewController
 
-// TODO(crbug.com/546355): Convert this class to use an array of
-//    NavigationEntries.
-@property(nonatomic, strong) NSArray* sessionEntries;
+// Designated initializer that takes a NavigationItemList.
+- (instancetype)initWithItems:(const web::NavigationItemList&)items
+    NS_DESIGNATED_INITIALIZER;
+
+// TabHistoryViewControllers must be initialized with |-initWithItems:|.
+- (instancetype)initWithCoder:(NSCoder*)aDecoder NS_UNAVAILABLE;
+- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout*)layout
+    NS_UNAVAILABLE;
+- (instancetype)initWithNibName:(NSString*)nibNameOrNil
+                         bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE;
 
 // Returns the optimal height needed to display the session entries.
 // The height returned is usually less than the |suggestedHeight| unless
diff --git a/ios/chrome/browser/ui/history/tab_history_view_controller.mm b/ios/chrome/browser/ui/history/tab_history_view_controller.mm
index 954ea175..c66487c 100644
--- a/ios/chrome/browser/ui/history/tab_history_view_controller.mm
+++ b/ios/chrome/browser/ui/history/tab_history_view_controller.mm
@@ -12,7 +12,6 @@
 #import "ios/chrome/browser/ui/history/tab_history_cell.h"
 #include "ios/chrome/browser/ui/rtl_geometry.h"
 #import "ios/third_party/material_components_ios/src/components/Ink/src/MaterialInk.h"
-#import "ios/web/navigation/crw_session_entry.h"
 #include "ios/web/public/favicon_status.h"
 #include "ios/web/public/navigation_item.h"
 #include "ui/gfx/image/image.h"
@@ -26,10 +25,13 @@
 // Visible percentage of the last visible row on the Tools menu if the
 // Tools menu is scrollable.
 const CGFloat kLastRowVisiblePercentage = 0.6;
+// The collection view's a11y ID.
+// TODO(crbug.com/697648): Decide better a11y behavior for this feature.
+NSString* const kCollectionViewIdentifier = @"Tab History";
 // Reuse identifier for cells.
-NSString* cellIdentifier = @"TabHistoryCell";
-NSString* footerIdentifier = @"Footer";
-NSString* headerIdentifier = @"Header";
+NSString* const kCellIdentifier = @"TabHistoryCell";
+NSString* const kFooterIdentifier = @"Footer";
+NSString* const kHeaderIdentifier = @"Header";
 // Height of rows.
 const CGFloat kCellHeight = 48.0;
 // Fraction height for partially visible row.
@@ -71,6 +73,36 @@
   return 1.0 / [[UIScreen mainScreen] scale];
 }
 
+// Returns a vector of of NavigationItemLists where the NavigationItems in
+// |items| are separated by host.
+NS_INLINE std::vector<web::NavigationItemList> PartitionItemsByHost(
+    const web::NavigationItemList& items) {
+  std::vector<web::NavigationItemList> partitionedItems;
+  // Used to store the previous host when partitioning NavigationItems.
+  std::string previousHost;
+  // The NavigationItemList containing NavigationItems with the same host.
+  web::NavigationItemList itemsWithSameHostname;
+  // Separate the items in |items| by host.
+  for (web::NavigationItem* item : items) {
+    std::string currentHost = item->GetURL().host();
+    if (previousHost.empty())
+      previousHost = currentHost;
+    // TODO: This should use some sort of Top Level Domain matching instead of
+    // explicit host match so that images.googe.com matches shopping.google.com.
+    if (previousHost == currentHost) {
+      itemsWithSameHostname.push_back(item);
+    } else {
+      partitionedItems.push_back(itemsWithSameHostname);
+      itemsWithSameHostname = web::NavigationItemList(1, item);
+      previousHost = currentHost;
+    }
+  }
+  // Add the last list contiaining the same host.
+  if (!itemsWithSameHostname.empty())
+    partitionedItems.push_back(itemsWithSameHostname);
+  return partitionedItems;
+}
+
 }  // namespace
 
 @interface TabHistoryViewControllerLayout : UICollectionViewLayout
@@ -219,15 +251,50 @@
 
 @interface TabHistoryViewController ()<MDCInkTouchControllerDelegate> {
   MDCInkTouchController* _inkTouchController;
-  NSArray* _partitionedEntries;
-  NSArray* _sessionEntries;
+  // A vector of NavigationItemLists where the NavigationItems are separated
+  // by hostname.
+  std::vector<web::NavigationItemList> _partitionedItems;
 }
+
+// Returns the NavigationItem corresponding with |indexPath|.
+- (const web::NavigationItem*)itemAtIndexPath:(NSIndexPath*)indexPath;
+
+// Removes all NavigationItem pointers from this class.  Tapping a cell that
+// triggers a navigation may delete NavigationItems, so NavigationItem
+// references should be reset to avoid use-after-free errors.
+- (void)clearNavigationItems;
+
 @end
 
 @implementation TabHistoryViewController
 
-- (NSArray*)sessionEntries {
-  return _sessionEntries;
+- (instancetype)initWithItems:(const web::NavigationItemList&)items {
+  TabHistoryViewControllerLayout* layout =
+      [[TabHistoryViewControllerLayout alloc] init];
+  if ((self = [super initWithCollectionViewLayout:layout])) {
+    // Populate |_partitionedItems|.
+    _partitionedItems = PartitionItemsByHost(items);
+
+    // Set up the UICollectionView.
+    UICollectionView* collectionView = [self collectionView];
+    collectionView.accessibilityIdentifier = kCollectionViewIdentifier;
+    collectionView.backgroundColor = [UIColor whiteColor];
+    [collectionView registerClass:[TabHistoryCell class]
+        forCellWithReuseIdentifier:kCellIdentifier];
+    [collectionView registerClass:[TabHistorySectionHeader class]
+        forSupplementaryViewOfKind:UICollectionElementKindSectionHeader
+               withReuseIdentifier:kHeaderIdentifier];
+    [collectionView registerClass:[TabHistorySectionFooter class]
+        forSupplementaryViewOfKind:UICollectionElementKindSectionFooter
+               withReuseIdentifier:kFooterIdentifier];
+
+    // Set up the ink controller.
+    _inkTouchController =
+        [[MDCInkTouchController alloc] initWithView:collectionView];
+    [_inkTouchController setDelegate:self];
+    [_inkTouchController addInkView];
+  }
+  return self;
 }
 
 #pragma mark Public Methods
@@ -236,9 +303,8 @@
   DCHECK(suggestedHeight >= kCellHeight);
   CGFloat optimalHeight = 0;
 
-  for (NSArray* sectionArray in _partitionedEntries) {
-    NSUInteger sectionItemCount = [sectionArray count];
-    for (NSUInteger i = 0; i < sectionItemCount; ++i) {
+  for (web::NavigationItemList& itemsWithSameHost : _partitionedItems) {
+    for (size_t count = 0; count < itemsWithSameHost.size(); ++count) {
       CGFloat proposedHeight = optimalHeight + kCellHeight;
 
       if (proposedHeight > suggestedHeight) {
@@ -263,153 +329,67 @@
   return optimalHeight;
 }
 
-- (instancetype)init {
-  TabHistoryViewControllerLayout* layout =
-      [[TabHistoryViewControllerLayout alloc] init];
-
-  return [self initWithCollectionViewLayout:layout];
-}
-
-- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout*)layout {
-  self = [super initWithCollectionViewLayout:layout];
-  if (self) {
-    UICollectionView* collectionView = [self collectionView];
-    [collectionView setBackgroundColor:[UIColor whiteColor]];
-
-    [collectionView registerClass:[TabHistoryCell class]
-        forCellWithReuseIdentifier:cellIdentifier];
-
-    [collectionView registerClass:[TabHistorySectionHeader class]
-        forSupplementaryViewOfKind:UICollectionElementKindSectionHeader
-               withReuseIdentifier:headerIdentifier];
-
-    [collectionView registerClass:[TabHistorySectionFooter class]
-        forSupplementaryViewOfKind:UICollectionElementKindSectionFooter
-               withReuseIdentifier:footerIdentifier];
-
-    _inkTouchController =
-        [[MDCInkTouchController alloc] initWithView:collectionView];
-    [_inkTouchController setDelegate:self];
-    [_inkTouchController addInkView];
-  }
-
-  return self;
-}
-
 #pragma mark UICollectionViewDelegate
 
 - (void)collectionView:(UICollectionView*)collectionView
     didSelectItemAtIndexPath:(NSIndexPath*)indexPath {
-  UICollectionViewCell* cell =
-      [collectionView cellForItemAtIndexPath:indexPath];
+  TabHistoryCell* cell = base::mac::ObjCCastStrict<TabHistoryCell>(
+      [collectionView cellForItemAtIndexPath:indexPath]);
   [collectionView chromeExecuteCommand:cell];
+  [self clearNavigationItems];
 }
 
 #pragma mark UICollectionViewDataSource
 
-- (CRWSessionEntry*)entryForIndexPath:(NSIndexPath*)indexPath {
-  NSInteger section = [indexPath section];
-  NSInteger item = [indexPath item];
-
-  DCHECK(section < (NSInteger)[_partitionedEntries count]);
-  DCHECK(item < (NSInteger)[[_partitionedEntries objectAtIndex:section] count]);
-  NSArray* sectionedArray = [_partitionedEntries objectAtIndex:section];
-
-  return [sectionedArray objectAtIndex:item];
-}
-
 - (NSInteger)collectionView:(UICollectionView*)collectionView
      numberOfItemsInSection:(NSInteger)section {
-  DCHECK(section < (NSInteger)[_partitionedEntries count]);
-  return [[_partitionedEntries objectAtIndex:section] count];
+  size_t sectionIdx = static_cast<size_t>(section);
+  DCHECK_LT(sectionIdx, _partitionedItems.size());
+  return _partitionedItems[sectionIdx].size();
 }
 
 - (UICollectionViewCell*)collectionView:(UICollectionView*)collectionView
                  cellForItemAtIndexPath:(NSIndexPath*)indexPath {
   TabHistoryCell* cell =
-      [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier
+      [collectionView dequeueReusableCellWithReuseIdentifier:kCellIdentifier
                                                 forIndexPath:indexPath];
-
-  [cell setEntry:[self entryForIndexPath:indexPath]];
-  [cell setTag:IDC_BACK_FORWARD_IN_TAB_HISTORY];
-
+  cell.item = [self itemAtIndexPath:indexPath];
+  cell.tag = IDC_BACK_FORWARD_IN_TAB_HISTORY;
   return cell;
 }
 
 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView*)view {
-  return [_partitionedEntries count];
+  return _partitionedItems.size();
 }
 
 - (UICollectionReusableView*)collectionView:(UICollectionView*)view
           viewForSupplementaryElementOfKind:(NSString*)kind
                                 atIndexPath:(NSIndexPath*)indexPath {
+  // Return a footer cell if requested.
   if ([kind isEqualToString:UICollectionElementKindSectionFooter]) {
     return [view dequeueReusableSupplementaryViewOfKind:kind
-                                    withReuseIdentifier:footerIdentifier
+                                    withReuseIdentifier:kFooterIdentifier
                                            forIndexPath:indexPath];
   }
-
   DCHECK([kind isEqualToString:UICollectionElementKindSectionHeader]);
-  CRWSessionEntry* sessionEntry = [self entryForIndexPath:indexPath];
-  web::NavigationItem* navigationItem = [sessionEntry navigationItem];
 
+  // Dequeue a header cell and populate its favicon image.
   TabHistorySectionHeader* header =
       [view dequeueReusableSupplementaryViewOfKind:kind
-                               withReuseIdentifier:headerIdentifier
+                               withReuseIdentifier:kHeaderIdentifier
                                       forIndexPath:indexPath];
-
   UIImage* iconImage = nil;
-  const gfx::Image& image = navigationItem->GetFavicon().image;
+  const gfx::Image& image =
+      [self itemAtIndexPath:indexPath]->GetFavicon().image;
   if (!image.IsEmpty())
     iconImage = image.ToUIImage();
   else
     iconImage = [UIImage imageNamed:@"default_favicon"];
-
   [[header iconView] setImage:iconImage];
 
   return header;
 }
 
-- (void)setSessionEntries:(NSArray*)sessionEntries {
-  _sessionEntries = sessionEntries;
-
-  std::string previousHost;
-
-  NSMutableArray* sectionArray = [NSMutableArray array];
-  NSMutableArray* partitionedEntries = [NSMutableArray array];
-
-  NSInteger numberOfEntries = [_sessionEntries count];
-  for (NSInteger index = 0; index < numberOfEntries; ++index) {
-    CRWSessionEntry* sessionEntry = [_sessionEntries objectAtIndex:index];
-    web::NavigationItem* navigationItem = [sessionEntry navigationItem];
-
-    std::string currentHost;
-    if (navigationItem)
-      currentHost = navigationItem->GetURL().host();
-
-    if (previousHost.empty())
-      previousHost = currentHost;
-
-    // TODO: This should use some sort of Top Level Domain matching instead of
-    // explicit host match so that images.googe.com matches shopping.google.com.
-    if (previousHost == currentHost) {
-      [sectionArray addObject:sessionEntry];
-    } else {
-      [partitionedEntries addObject:sectionArray];
-      sectionArray = [NSMutableArray arrayWithObject:sessionEntry];
-      previousHost = currentHost;
-    }
-  }
-
-  if ([sectionArray count])
-    [partitionedEntries addObject:sectionArray];
-
-  if (![partitionedEntries count])
-    partitionedEntries = nil;
-
-  _partitionedEntries = partitionedEntries;
-}
-
 #pragma mark MDCInkTouchControllerDelegate
 
 - (BOOL)inkTouchController:(MDCInkTouchController*)inkTouchController
@@ -431,4 +411,22 @@
   return YES;
 }
 
+#pragma mark -
+
+- (const web::NavigationItem*)itemAtIndexPath:(NSIndexPath*)indexPath {
+  size_t section = static_cast<size_t>([indexPath section]);
+  size_t item = static_cast<size_t>([indexPath item]);
+  DCHECK_LT(section, _partitionedItems.size());
+  DCHECK_LT(item, _partitionedItems[section].size());
+  return _partitionedItems[section][item];
+}
+
+- (void)clearNavigationItems {
+  _partitionedItems.clear();
+  for (UICollectionViewCell* cell in self.collectionView.visibleCells) {
+    TabHistoryCell* historyCell = base::mac::ObjCCast<TabHistoryCell>(cell);
+    historyCell.item = nullptr;
+  }
+}
+
 @end
diff --git a/ios/chrome/browser/ui/preload_controller_delegate.h b/ios/chrome/browser/ui/preload_controller_delegate.h
index e23302e903..46e08c56 100644
--- a/ios/chrome/browser/ui/preload_controller_delegate.h
+++ b/ios/chrome/browser/ui/preload_controller_delegate.h
@@ -7,16 +7,11 @@
 
 #import <UIKit/UIKit.h>
 
-@class CRWSessionEntry;
-
 // A protocol implemented by a delegate of PreloadController
 @protocol PreloadControllerDelegate
 
 // Should preload controller request a desktop site.
 - (BOOL)shouldUseDesktopUserAgent;
-// Return the current sessionEntry from the delegate.
-// TODO(crbug.com/546348): See if this can return a NavigationItem instead.
-- (CRWSessionEntry*)currentSessionEntry;
 @end
 
 #endif  // IOS_CHROME_BROWSER_UI_PRELOAD_CONTROLLER_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.h b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.h
index 16732f5..66febd2 100644
--- a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.h
+++ b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.h
@@ -12,6 +12,7 @@
 #include "ios/chrome/browser/ui/qr_scanner/qr_scanner_view_controller.h"
 #import "ios/chrome/browser/ui/toolbar/toolbar_controller.h"
 #include "ios/public/provider/chrome/browser/voice/voice_search_controller_delegate.h"
+#include "ios/web/public/navigation_item_list.h"
 
 @protocol PreloadProvider;
 @class Tab;
@@ -150,7 +151,7 @@
 
 // Shows the tab history popup inside |view|.
 - (void)showTabHistoryPopupInView:(UIView*)view
-               withSessionEntries:(NSArray*)sessionEntries
+                        withItems:(const web::NavigationItemList&)items
                    forBackHistory:(BOOL)isBackHistory;
 
 // Dismisses the tab history popup.
diff --git a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
index 498ce10..ee215e35 100644
--- a/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
+++ b/ios/chrome/browser/ui/toolbar/web_toolbar_controller.mm
@@ -805,7 +805,7 @@
 }
 
 - (void)showTabHistoryPopupInView:(UIView*)view
-               withSessionEntries:(NSArray*)sessionEntries
+                        withItems:(const web::NavigationItemList&)items
                    forBackHistory:(BOOL)isBackHistory {
   if (_tabHistoryPopupController)
     return;
@@ -826,9 +826,15 @@
   _tabHistoryPopupController.reset([[TabHistoryPopupController alloc]
       initWithOrigin:convertedOrigin
           parentView:view
-             entries:sessionEntries]);
+               items:items]);
   [_tabHistoryPopupController setDelegate:self];
 
+  // Fade in the popup and notify observers.
+  CGRect containerFrame = [[_tabHistoryPopupController popupContainer] frame];
+  CGPoint destination = CGPointMake(CGRectGetLeadingEdge(containerFrame),
+                                    CGRectGetMinY(containerFrame));
+  [_tabHistoryPopupController fadeInPopupFromSource:convertedOrigin
+                                      toDestination:destination];
   [[NSNotificationCenter defaultCenter]
       postNotificationName:kTabHistoryPopupWillShowNotification
                     object:nil];
diff --git a/ios/chrome/browser/web/forms_egtest.mm b/ios/chrome/browser/web/forms_egtest.mm
index afa9c5b..2c598cf 100644
--- a/ios/chrome/browser/web/forms_egtest.mm
+++ b/ios/chrome/browser/web/forms_egtest.mm
@@ -22,6 +22,7 @@
 #import "ios/web/public/test/http_server.h"
 #import "ios/web/public/test/http_server_util.h"
 #include "ios/web/public/test/response_providers/data_response_provider.h"
+#include "ios/web/public/test/url_test_util.h"
 
 namespace {
 
@@ -276,8 +277,9 @@
   [self openBackHistory];
   [self waitForTabHistoryView];
 
-  id<GREYMatcher> historyItem = grey_text(base::SysUTF8ToNSString(
-      TestResponseProvider::GetPrintFormDataUrl().spec()));
+  GURL history_url = TestResponseProvider::GetPrintFormDataUrl();
+  id<GREYMatcher> historyItem = grey_text(
+      base::SysUTF16ToNSString(web::GetDisplayTitleForUrl(history_url)));
   [[EarlGrey selectElementWithMatcher:historyItem] performAction:grey_tap()];
 
   [ChromeEarlGrey waitForPageToFinishLoading];
diff --git a/ios/chrome/browser/web/visible_url_egtest.mm b/ios/chrome/browser/web/visible_url_egtest.mm
index 54f46b05..f14423f 100644
--- a/ios/chrome/browser/web/visible_url_egtest.mm
+++ b/ios/chrome/browser/web/visible_url_egtest.mm
@@ -18,6 +18,7 @@
 #import "ios/web/public/test/http_server.h"
 #include "ios/web/public/test/http_server_util.h"
 #include "ios/web/public/test/response_providers/html_response_provider.h"
+#include "ios/web/public/test/url_test_util.h"
 #include "url/gurl.h"
 
 using chrome_test_util::WebViewContainingText;
@@ -237,8 +238,9 @@
   // though URL1 is a pending URL.
   [[EarlGrey selectElementWithMatcher:chrome_test_util::BackButton()]
       performAction:grey_longPress()];
-  NSString* URL1Spec = base::SysUTF8ToNSString(_testURL1.spec());
-  [[EarlGrey selectElementWithMatcher:grey_text(URL1Spec)]
+  NSString* URL1Title =
+      base::SysUTF16ToNSString(web::GetDisplayTitleForUrl(_testURL1));
+  [[EarlGrey selectElementWithMatcher:grey_text(URL1Title)]
       performAction:grey_tap()];
   GREYAssert([self waitForServerToReceiveRequestWithURL:_testURL1],
              @"Last request URL: %@", self.lastRequestURLSpec);
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index 0f8e5334..150fdef 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -451,6 +451,7 @@
     "public/test/test_redirect_observer.mm",
     "public/test/test_web_thread.h",
     "public/test/test_web_thread_bundle.h",
+    "public/test/url_test_util.h",
     "public/test/web_js_test.h",
     "public/test/web_test.h",
     "public/test/web_test.mm",
@@ -465,6 +466,7 @@
     "test/test_url_constants.h",
     "test/test_web_thread.cc",
     "test/test_web_thread_bundle.cc",
+    "test/url_test_util.mm",
     "test/web_int_test.h",
     "test/web_int_test.mm",
     "test/web_test_suite.mm",
diff --git a/ios/web/navigation/navigation_item_impl.h b/ios/web/navigation/navigation_item_impl.h
index a47f1fa..7601f2d 100644
--- a/ios/web/navigation/navigation_item_impl.h
+++ b/ios/web/navigation/navigation_item_impl.h
@@ -119,6 +119,10 @@
   // non-persisted state, as documented on the members below.
   void ResetForCommit();
 
+  // Returns the title string to be used for a page with |url| if that page
+  // doesn't specify a title.
+  static base::string16 GetDisplayTitleForURL(const GURL& url);
+
  private:
   // The NavigationManItemStorageBuilder functions require access to
   // private variables of NavigationItemImpl.
diff --git a/ios/web/navigation/navigation_item_impl.mm b/ios/web/navigation/navigation_item_impl.mm
index 7e682a9d..6cf8acae 100644
--- a/ios/web/navigation/navigation_item_impl.mm
+++ b/ios/web/navigation/navigation_item_impl.mm
@@ -155,23 +155,8 @@
   if (!cached_display_title_.empty())
     return cached_display_title_;
 
-  // Use the virtual URL first if any, and fall back on using the real URL.
-  base::string16 title;
-  if (!virtual_url_.is_empty()) {
-    title = url_formatter::FormatUrl(virtual_url_);
-  } else if (!url_.is_empty()) {
-    title = url_formatter::FormatUrl(url_);
-  }
-
-  // For file:// URLs use the filename as the title, not the full path.
-  if (url_.SchemeIsFile()) {
-    base::string16::size_type slashpos = title.rfind('/');
-    if (slashpos != base::string16::npos)
-      title = title.substr(slashpos + 1);
-  }
-
-  const size_t kMaxTitleChars = 4 * 1024;
-  gfx::ElideString(title, kMaxTitleChars, &cached_display_title_);
+  cached_display_title_ =
+      NavigationItemImpl::GetDisplayTitleForURL(GetVirtualURL());
   return cached_display_title_;
 }
 
@@ -312,4 +297,23 @@
   SetNavigationInitiationType(web::NavigationInitiationType::NONE);
 }
 
+// static
+base::string16 NavigationItemImpl::GetDisplayTitleForURL(const GURL& url) {
+  if (url.is_empty())
+    return base::string16();
+
+  base::string16 title = url_formatter::FormatUrl(url);
+
+  // For file:// URLs use the filename as the title, not the full path.
+  if (url.SchemeIsFile()) {
+    base::string16::size_type slashpos = title.rfind('/');
+    if (slashpos != base::string16::npos)
+      title = title.substr(slashpos + 1);
+  }
+
+  const size_t kMaxTitleChars = 4 * 1024;
+  gfx::ElideString(title, kMaxTitleChars, &title);
+  return title;
+}
+
 }  // namespace web
diff --git a/ios/web/public/test/url_test_util.h b/ios/web/public/test/url_test_util.h
new file mode 100644
index 0000000..ac159c6
--- /dev/null
+++ b/ios/web/public/test/url_test_util.h
@@ -0,0 +1,20 @@
+// 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 IOS_WEB_PUBLIC_TEST_URL_TEST_UTIL_H_
+#define IOS_WEB_PUBLIC_TEST_URL_TEST_UTIL_H_
+
+#include "base/strings/string16.h"
+
+class GURL;
+
+namespace web {
+
+// Returns a formatted version of |url| that would be used as the fallback title
+// for a page with that URL.
+base::string16 GetDisplayTitleForUrl(const GURL& url);
+
+}  // namespace web
+
+#endif  // IOS_WEB_PUBLIC_TEST_URL_TEST_UTIL_H_
diff --git a/ios/web/test/url_test_util.mm b/ios/web/test/url_test_util.mm
new file mode 100644
index 0000000..bfb9ed5
--- /dev/null
+++ b/ios/web/test/url_test_util.mm
@@ -0,0 +1,15 @@
+// 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 "ios/web/public/test/url_test_util.h"
+
+#import "ios/web/navigation/navigation_item_impl.h"
+
+namespace web {
+
+base::string16 GetDisplayTitleForUrl(const GURL& url) {
+  return NavigationItemImpl::GetDisplayTitleForURL(url);
+}
+
+}  // namespace web
diff --git a/net/BUILD.gn b/net/BUILD.gn
index 63e6426..ceec9ce 100644
--- a/net/BUILD.gn
+++ b/net/BUILD.gn
@@ -4344,6 +4344,7 @@
     "log/trace_net_log_observer_unittest.cc",
     "log/write_to_file_net_log_observer_unittest.cc",
     "nqe/effective_connection_type_unittest.cc",
+    "nqe/event_creator_unittest.cc",
     "nqe/network_qualities_prefs_manager_unittest.cc",
     "nqe/network_quality_estimator_unittest.cc",
     "nqe/network_quality_store_unittest.cc",
diff --git a/net/cert/cert_verifier.h b/net/cert/cert_verifier.h
index be510119..50cc833 100644
--- a/net/cert/cert_verifier.h
+++ b/net/cert/cert_verifier.h
@@ -79,6 +79,11 @@
     // If set, certificates with SHA-1 signatures will be allowed, but only if
     // they are issued by non-public trust anchors.
     VERIFY_ENABLE_SHA1_LOCAL_ANCHORS = 1 << 5,
+
+    // If set, certificates which lack a subjectAltName will be allowed to
+    // match against the commonName of the certificate, but only if they are
+    // issued by non-public trust anchors.
+    VERIFY_ENABLE_COMMON_NAME_FALLBACK_LOCAL_ANCHORS = 1 << 6,
   };
 
   // Parameters to verify |certificate| against the supplied
diff --git a/net/cert/cert_verify_proc.cc b/net/cert/cert_verify_proc.cc
index 175deb6..7ce4eae 100644
--- a/net/cert/cert_verify_proc.cc
+++ b/net/cert/cert_verify_proc.cc
@@ -485,19 +485,14 @@
 
   ComputeSignatureHashAlgorithms(verify_result);
 
-  if (!cert->VerifyNameMatch(hostname,
-                             &verify_result->common_name_fallback_used)) {
+  bool allow_common_name_fallback =
+      !verify_result->is_issued_by_known_root &&
+      (flags & CertVerifier::VERIFY_ENABLE_COMMON_NAME_FALLBACK_LOCAL_ANCHORS);
+  if (!cert->VerifyNameMatch(hostname, allow_common_name_fallback)) {
     verify_result->cert_status |= CERT_STATUS_COMMON_NAME_INVALID;
     rv = MapCertStatusToNetError(verify_result->cert_status);
   }
 
-  UMA_HISTOGRAM_BOOLEAN("Net.CertCommonNameFallback",
-                        verify_result->common_name_fallback_used);
-  if (!verify_result->is_issued_by_known_root) {
-    UMA_HISTOGRAM_BOOLEAN("Net.CertCommonNameFallbackPrivateCA",
-                          verify_result->common_name_fallback_used);
-  }
-
   CheckOCSP(ocsp_response, *verify_result->verified_cert,
             &verify_result->ocsp_result);
 
diff --git a/net/cert/cert_verify_proc_android.cc b/net/cert/cert_verify_proc_android.cc
index 5c29b67..430ae631 100644
--- a/net/cert/cert_verify_proc_android.cc
+++ b/net/cert/cert_verify_proc_android.cc
@@ -398,6 +398,7 @@
     NOTREACHED();
     return ERR_FAILED;
   }
+
   if (IsCertStatusError(verify_result->cert_status))
     return MapCertStatusToNetError(verify_result->cert_status);
 
diff --git a/net/cert/cert_verify_proc_ios.cc b/net/cert/cert_verify_proc_ios.cc
index 42746499..84ecd2a 100644
--- a/net/cert/cert_verify_proc_ios.cc
+++ b/net/cert/cert_verify_proc_ios.cc
@@ -266,6 +266,9 @@
 
   GetCertChainInfo(final_chain, verify_result);
 
+  // iOS lacks the ability to distinguish built-in versus non-built-in roots,
+  // so opt to 'fail open' of any restrictive policies that apply to built-in
+  // roots.
   verify_result->is_issued_by_known_root = false;
 
   if (IsCertStatusError(verify_result->cert_status))
diff --git a/net/cert/cert_verify_proc_mac.cc b/net/cert/cert_verify_proc_mac.cc
index 987eed2..234d959 100644
--- a/net/cert/cert_verify_proc_mac.cc
+++ b/net/cert/cert_verify_proc_mac.cc
@@ -988,8 +988,8 @@
       break;
   }
 
-  // Perform hostname verification independent of SecTrustEvaluate. In order to
-  // do so, mask off any reported name errors first.
+  // Hostname validation is handled by CertVerifyProc, so mask off any errors
+  // that SecTrustEvaluate may have set, as its results are not used.
   verify_result->cert_status &= ~CERT_STATUS_COMMON_NAME_INVALID;
 
   // TODO(wtc): Suppress CERT_STATUS_NO_REVOCATION_MECHANISM for now to be
diff --git a/net/cert/cert_verify_proc_openssl.cc b/net/cert/cert_verify_proc_openssl.cc
index 2d28e49a..13a19d8 100644
--- a/net/cert/cert_verify_proc_openssl.cc
+++ b/net/cert/cert_verify_proc_openssl.cc
@@ -214,6 +214,7 @@
 
   GetCertChainInfo(ctx.get(), verify_result);
   AppendPublicKeyHashes(ctx.get(), &verify_result->public_key_hashes);
+
   if (IsCertStatusError(verify_result->cert_status))
     return MapCertStatusToNetError(verify_result->cert_status);
 
diff --git a/net/cert/cert_verify_proc_unittest.cc b/net/cert/cert_verify_proc_unittest.cc
index 1859645..de1a7c1 100644
--- a/net/cert/cert_verify_proc_unittest.cc
+++ b/net/cert/cert_verify_proc_unittest.cc
@@ -1801,6 +1801,73 @@
   VerifyCertName(".test.example", false);
 }
 
+// Tests that commonName-fallback is handled correctly:
+// - If it's a publicly trusted certificate, the commonName should never
+//   match.
+// - If it chains to a private root, the commonName should not match if
+//   the subjectAltName is absent, and the flags don't allow fallback.
+// - If it chains to a private root, the commonName SHOULD match iff the
+//   subjectAltName is absent and the flags allow a fallback.
+TEST_F(CertVerifyProcNameTest, HandlesCommonNameFallbackLocalAnchors) {
+  scoped_refptr<X509Certificate> cert(
+      ImportCertFromFile(GetTestCertsDirectory(), "salesforce_com_test.pem"));
+  ASSERT_TRUE(cert);
+
+  CertVerifyResult result;
+  scoped_refptr<CertVerifyProc> verify_proc;
+  CertVerifyResult verify_result;
+  int error;
+
+  // Publicly trusted: Always ignores commonName, regardless of flags.
+  result = CertVerifyResult();
+  verify_result = CertVerifyResult();
+  error = 0;
+  result.is_issued_by_known_root = true;
+  verify_proc = new MockCertVerifyProc(result);
+  error = verify_proc->Verify(cert.get(), "prerelna1.pre.salesforce.com",
+                              std::string(), 0, nullptr, CertificateList(),
+                              &verify_result);
+  EXPECT_THAT(error, IsError(ERR_CERT_COMMON_NAME_INVALID));
+  EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID);
+
+  result = CertVerifyResult();
+  verify_result = CertVerifyResult();
+  error = 0;
+  result.is_issued_by_known_root = true;
+  verify_proc = new MockCertVerifyProc(result);
+  error = verify_proc->Verify(
+      cert.get(), "prerelna1.pre.salesforce.com", std::string(),
+      CertVerifier::VERIFY_ENABLE_COMMON_NAME_FALLBACK_LOCAL_ANCHORS, nullptr,
+      CertificateList(), &verify_result);
+  EXPECT_THAT(error, IsError(ERR_CERT_COMMON_NAME_INVALID));
+  EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID);
+
+  // Privately trusted: Ignores commonName by default.
+  result = CertVerifyResult();
+  verify_result = CertVerifyResult();
+  error = 0;
+  result.is_issued_by_known_root = false;
+  verify_proc = new MockCertVerifyProc(result);
+  error = verify_proc->Verify(cert.get(), "prerelna1.pre.salesforce.com",
+                              std::string(), 0, nullptr, CertificateList(),
+                              &verify_result);
+  EXPECT_THAT(error, IsError(ERR_CERT_COMMON_NAME_INVALID));
+  EXPECT_TRUE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID);
+
+  // Privately trusted: Falls back to common name if flags allow.
+  result = CertVerifyResult();
+  verify_result = CertVerifyResult();
+  error = 0;
+  result.is_issued_by_known_root = false;
+  verify_proc = new MockCertVerifyProc(result);
+  error = verify_proc->Verify(
+      cert.get(), "prerelna1.pre.salesforce.com", std::string(),
+      CertVerifier::VERIFY_ENABLE_COMMON_NAME_FALLBACK_LOCAL_ANCHORS, nullptr,
+      CertificateList(), &verify_result);
+  EXPECT_THAT(error, IsOk());
+  EXPECT_FALSE(verify_result.cert_status & CERT_STATUS_COMMON_NAME_INVALID);
+}
+
 // Tests that CertVerifyProc records a histogram correctly when a
 // certificate chaining to a private root contains the TLS feature
 // extension and does not have a stapled OCSP response.
diff --git a/net/cert/internal/path_builder_unittest.cc b/net/cert/internal/path_builder_unittest.cc
index 212b8de3..be5432b5 100644
--- a/net/cert/internal/path_builder_unittest.cc
+++ b/net/cert/internal/path_builder_unittest.cc
@@ -134,7 +134,7 @@
       d_by_d_, e_by_e_, f_by_e_;
 
   SimpleSignaturePolicy signature_policy_;
-  der::GeneralizedTime time_ = {2016, 4, 11, 0, 0, 0};
+  der::GeneralizedTime time_ = {2017, 3, 1, 0, 0, 0};
 };
 
 void AddTrustedCertificate(scoped_refptr<ParsedCertificate> cert,
diff --git a/net/cert/x509_certificate.cc b/net/cert/x509_certificate.cc
index 0d6fe95..782f4a4c 100644
--- a/net/cert/x509_certificate.cc
+++ b/net/cert/x509_certificate.cc
@@ -493,7 +493,7 @@
     const std::string& cert_common_name,
     const std::vector<std::string>& cert_san_dns_names,
     const std::vector<std::string>& cert_san_ip_addrs,
-    bool* common_name_fallback_used) {
+    bool allow_common_name_fallback) {
   DCHECK(!hostname.empty());
   // Perform name verification following http://tools.ietf.org/html/rfc6125.
   // The terminology used in this method is as per that RFC:-
@@ -514,14 +514,17 @@
   if (reference_name.empty())
     return false;
 
-  // Allow fallback to Common name matching?
-  const bool common_name_fallback = cert_san_dns_names.empty() &&
-                                    cert_san_ip_addrs.empty();
-  *common_name_fallback_used = common_name_fallback;
+  if (!allow_common_name_fallback && cert_san_dns_names.empty() &&
+      cert_san_ip_addrs.empty()) {
+    // Common Name matching is not allowed, so fail fast.
+    return false;
+  }
 
   // Fully handle all cases where |hostname| contains an IP address.
   if (host_info.IsIPAddress()) {
-    if (common_name_fallback && host_info.family == url::CanonHostInfo::IPV4) {
+    if (allow_common_name_fallback && cert_san_dns_names.empty() &&
+        cert_san_ip_addrs.empty() &&
+        host_info.family == url::CanonHostInfo::IPV4) {
       // Fallback to Common name matching. As this is deprecated and only
       // supported for compatibility refuse it for IPv6 addresses.
       return reference_name == cert_common_name;
@@ -580,7 +583,8 @@
   // fallback to use the common name instead.
   std::vector<std::string> common_name_as_vector;
   const std::vector<std::string>* presented_names = &cert_san_dns_names;
-  if (common_name_fallback) {
+  if (allow_common_name_fallback && cert_san_dns_names.empty() &&
+      cert_san_ip_addrs.empty()) {
     // Note: there's a small possibility cert_common_name is an international
     // domain name in non-standard encoding (e.g. UTF8String or BMPString
     // instead of A-label). As common name fallback is deprecated we're not
@@ -628,11 +632,11 @@
 }
 
 bool X509Certificate::VerifyNameMatch(const std::string& hostname,
-                                      bool* common_name_fallback_used) const {
+                                      bool allow_common_name_fallback) const {
   std::vector<std::string> dns_names, ip_addrs;
   GetSubjectAltName(&dns_names, &ip_addrs);
   return VerifyHostname(hostname, subject_.common_name, dns_names, ip_addrs,
-                        common_name_fallback_used);
+                        allow_common_name_fallback);
 }
 
 // static
diff --git a/net/cert/x509_certificate.h b/net/cert/x509_certificate.h
index 0aff1be..4567f0e 100644
--- a/net/cert/x509_certificate.h
+++ b/net/cert/x509_certificate.h
@@ -287,11 +287,11 @@
   // Verifies that |hostname| matches this certificate.
   // Does not verify that the certificate is valid, only that the certificate
   // matches this host.
-  // Returns true if it matches, and updates |*common_name_fallback_used|,
-  // setting it to true if a fallback to the CN was used, rather than
-  // subjectAltName.
+  // If |allow_common_name_fallback| is set to true, and iff no SANs are
+  // present of type dNSName or iPAddress, then fallback to using the
+  // certificate's commonName field in the Subject.
   bool VerifyNameMatch(const std::string& hostname,
-                       bool* common_name_fallback_used) const;
+                       bool allow_common_name_fallback) const;
 
   // Obtains the DER encoded certificate data for |cert_handle|. On success,
   // returns true and writes the DER encoded certificate to |*der_encoded|.
@@ -420,14 +420,14 @@
   // extension, if present. Note these IP addresses are NOT ascii-encoded:
   // they must be 4 or 16 bytes of network-ordered data, for IPv4 and IPv6
   // addresses, respectively.
-  // |common_name_fallback_used| will be updated to true if cert_common_name
-  // was used to match the hostname, or false if either of the |cert_san_*|
-  // parameters was used to match the hostname.
+  // If |allow_common_name_fallback| is true, then the |cert_common_name| will
+  // be used if the |cert_san_dns_names| and |cert_san_ip_addrs| parameters are
+  // empty.
   static bool VerifyHostname(const std::string& hostname,
                              const std::string& cert_common_name,
                              const std::vector<std::string>& cert_san_dns_names,
                              const std::vector<std::string>& cert_san_ip_addrs,
-                             bool* common_name_fallback_used);
+                             bool allow_common_name_fallback);
 
   // Reads a single certificate from |pickle_iter| and returns a
   // platform-specific certificate handle. The format of the certificate
diff --git a/net/cert/x509_certificate_unittest.cc b/net/cert/x509_certificate_unittest.cc
index 9cadb266..d2974e56 100644
--- a/net/cert/x509_certificate_unittest.cc
+++ b/net/cert/x509_certificate_unittest.cc
@@ -167,12 +167,11 @@
   EXPECT_EQ("webkit.org", dns_names[1]);
 
   // Test that the wildcard cert matches properly.
-  bool unused = false;
-  EXPECT_TRUE(webkit_cert->VerifyNameMatch("www.webkit.org", &unused));
-  EXPECT_TRUE(webkit_cert->VerifyNameMatch("foo.webkit.org", &unused));
-  EXPECT_TRUE(webkit_cert->VerifyNameMatch("webkit.org", &unused));
-  EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.webkit.com", &unused));
-  EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.foo.webkit.com", &unused));
+  EXPECT_TRUE(webkit_cert->VerifyNameMatch("www.webkit.org", false));
+  EXPECT_TRUE(webkit_cert->VerifyNameMatch("foo.webkit.org", false));
+  EXPECT_TRUE(webkit_cert->VerifyNameMatch("webkit.org", false));
+  EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.webkit.com", false));
+  EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.foo.webkit.com", false));
 }
 
 TEST(X509CertificateTest, ThawteCertParsing) {
@@ -933,6 +932,10 @@
   // Comma separated list of certificate IP Addresses to match against. Each
   // address is x prefixed 16 byte hex code for v6 or dotted-decimals for v4.
   const char* ip_addrs;
+  // Whether to disable matching against the commonName. This is a negative
+  // condition so that tests can omit one or more of the above fields and
+  // allow default initialization to handle this case.
+  bool disable_fallback;
 };
 
 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how
@@ -946,7 +949,8 @@
       << "; hostname: " << data.hostname
       << "; common_name: " << data.common_name
       << "; dns_names: " << base::StringPiece(data.dns_names)
-      << "; ip_addrs: " << base::StringPiece(data.ip_addrs);
+      << "; ip_addrs: " << base::StringPiece(data.ip_addrs)
+      << "; disable_fallback: " << data.disable_fallback;
 }
 
 const CertificateNameVerifyTestData kNameVerifyTestData[] = {
@@ -975,12 +979,15 @@
     { true, "ww%57.foo.com", "", "www.foo.com" },
     { true, "www&.foo.com", "www%26.foo.com" },
     // Common name must not be used if subject alternative name was provided.
-    { false, "www.test.co.jp",  "www.test.co.jp",
+    { false, "www.test.co.jp", "www.test.co.jp",
         "*.test.de,*.jp,www.test.co.uk,www.*.co.jp" },
     { false, "www.bar.foo.com", "www.bar.foo.com",
       "*.foo.com,*.*.foo.com,*.*.bar.foo.com,*..bar.foo.com," },
     { false, "www.bath.org", "www.bath.org", "", "20.30.40.50" },
-    { false, "66.77.88.99", "www.bath.org", "www.bath.org" },
+    { false, "66.77.88.99", "66.77.88.99", "www.bath.org" },
+    // Common name must not be used if fallback is disabled.
+    { false, "www.test.com", "www.test.com", nullptr, nullptr, true },
+    { false, "127.0.0.1", "127.0.0.1", nullptr, nullptr, true },
     // IDN tests
     { true, "xn--poema-9qae5a.com.br", "xn--poema-9qae5a.com.br" },
     { true, "www.xn--poema-9qae5a.com.br", "*.xn--poema-9qae5a.com.br" },
@@ -1143,9 +1150,10 @@
     }
   }
 
-  bool unused = false;
-  EXPECT_EQ(test_data.expected, X509Certificate::VerifyHostname(
-      test_data.hostname, common_name, dns_names, ip_addressses, &unused));
+  EXPECT_EQ(test_data.expected,
+            X509Certificate::VerifyHostname(test_data.hostname, common_name,
+                                            dns_names, ip_addressses,
+                                            !test_data.disable_fallback));
 }
 
 INSTANTIATE_TEST_CASE_P(, X509CertificateNameVerifyTest,
diff --git a/net/data/cert_issuer_source_aia_unittest/generate-certs.py b/net/data/cert_issuer_source_aia_unittest/generate-certs.py
index b758e5a6..bda53fd 100755
--- a/net/data/cert_issuer_source_aia_unittest/generate-certs.py
+++ b/net/data/cert_issuer_source_aia_unittest/generate-certs.py
@@ -85,30 +85,39 @@
 # target certs
 
 target = common.create_end_entity_certificate('target', i_base)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(), 'target_one_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_no_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(), 'target_no_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_two_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(), 'target_two_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_three_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(), 'target_three_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_six_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(), 'target_six_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_file_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(), 'target_file_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_invalid_url_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(), 'target_invalid_url_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_file_and_http_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(),
                             'target_file_and_http_aia.pem')
 
 target = common.create_end_entity_certificate('target', i_invalid_and_http_aia)
+target.get_extensions().set_property('subjectAltName', 'DNS:target')
 common.write_string_to_file(target.get_cert_pem(),
                             'target_invalid_and_http_aia.pem')
diff --git a/net/data/cert_issuer_source_aia_unittest/i.pem b/net/data/cert_issuer_source_aia_unittest/i.pem
index 63ce691..c86a72b9 100644
--- a/net/data/cert_issuer_source_aia_unittest/i.pem
+++ b/net/data/cert_issuer_source_aia_unittest/i.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:a7:94:9a:13:a0:38:6f:f9:cd:27:0d:9d:7d:f3:
-                    0c:fe:a0:dd:39:23:4d:33:d5:d9:88:c5:23:71:a1:
-                    a7:f5:50:c7:c6:38:cb:88:41:87:e8:25:75:14:be:
-                    09:ef:4f:b1:48:c7:50:f6:de:05:85:4a:01:7c:6c:
-                    e9:e1:4e:18:5f:43:38:cb:42:3a:e3:4a:7d:49:86:
-                    f5:30:d8:44:70:4e:c9:77:3d:ba:d2:a4:cc:a5:df:
-                    8c:e9:58:f8:2d:a5:b4:7a:7e:23:4e:0f:89:a0:5f:
-                    0f:f1:47:95:bd:f4:2f:e9:3b:0e:ba:ef:e7:10:03:
-                    0a:94:9d:fe:65:86:49:4d:c2:4f:b6:dc:23:e7:30:
-                    e6:10:64:0c:ed:4e:17:aa:1d:56:1d:6f:b8:3f:e5:
-                    8c:60:8a:f3:67:5a:04:6d:f3:84:98:01:db:11:c6:
-                    e2:c4:fc:0a:5a:33:77:eb:38:35:21:45:c0:b3:30:
-                    c2:95:4b:85:73:03:75:e5:9f:fd:a5:72:aa:21:64:
-                    cd:26:a6:8d:7a:bc:68:6a:36:ab:fe:a6:16:9c:b9:
-                    93:e9:26:cf:cb:3c:9d:a9:26:18:d1:83:61:25:e4:
-                    bc:6a:47:51:78:c9:1e:a2:38:10:8e:92:64:a8:aa:
-                    70:46:d3:cd:d2:5b:56:c3:98:ca:f1:b4:e0:cf:c9:
-                    48:b7
+                    00:ad:aa:76:dc:52:a2:4a:fd:8a:eb:22:f7:e2:32:
+                    88:2d:69:bb:cf:74:55:2d:db:bd:9a:00:41:8f:ea:
+                    28:b3:4a:ad:00:fc:fd:8b:46:32:13:8c:a8:a7:3b:
+                    00:53:60:37:cd:4c:3d:99:02:01:86:3f:f4:1a:b9:
+                    31:91:97:55:b5:5c:73:e5:45:80:63:fd:6f:c5:1d:
+                    16:c4:58:3d:33:eb:ce:2f:5d:bc:a1:fb:3d:13:d5:
+                    d2:34:10:ba:a5:80:49:3e:bb:e4:64:0a:73:84:8b:
+                    a6:3f:de:f4:46:c4:93:30:6c:d4:88:8f:a6:f0:e9:
+                    7b:c5:f2:e9:18:e0:3d:db:2e:81:5c:af:26:cb:14:
+                    f5:9d:51:8f:f5:b6:dc:e6:13:91:77:c8:02:cd:34:
+                    67:29:7f:4d:77:ff:68:10:9f:29:b6:6b:0a:85:17:
+                    45:65:18:bb:f4:ec:aa:ad:ea:6a:95:be:eb:3c:98:
+                    4d:79:3a:20:83:92:49:b0:75:a2:85:dd:0b:78:ee:
+                    91:f4:1a:59:2b:96:ca:08:a7:d8:49:de:37:95:15:
+                    b7:1b:e7:b7:a2:e7:29:65:33:ca:ca:33:b1:93:ce:
+                    a1:b6:23:52:9a:2b:cd:c1:92:24:f1:98:bc:ae:cc:
+                    87:26:e0:63:c5:3e:97:48:71:da:5a:a8:b7:89:d6:
+                    7c:e3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
             X509v3 Authority Key Identifier: 
-                keyid:E5:4E:96:E4:D9:82:36:BD:51:C3:57:BD:E6:DE:3C:C1:46:B4:49:0D
+                keyid:98:1F:DC:C5:E8:30:8D:5A:BA:9B:0C:EF:AD:CC:B8:AE:D4:F1:D1:63
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/Root.cer
@@ -50,39 +50,39 @@
             X509v3 Basic Constraints: critical
                 CA:TRUE
     Signature Algorithm: sha256WithRSAEncryption
-         96:0d:55:2e:09:b5:27:6b:48:e0:88:87:f2:fb:a0:04:99:c2:
-         7d:8c:8c:ad:60:ff:dd:6a:69:f3:cc:08:c9:1e:02:29:7a:73:
-         e3:ee:ef:9e:c1:52:dd:3e:9d:d4:07:6a:39:0b:0a:a2:6a:1e:
-         17:86:b5:8a:e4:53:f2:f7:00:bd:90:95:d2:08:9c:a3:28:2c:
-         4d:38:2d:eb:a4:a8:c4:17:44:1d:f6:57:d8:6d:98:06:3b:a9:
-         24:82:42:4e:8d:25:c9:5e:96:b6:f6:31:95:6c:49:3e:2d:15:
-         37:30:6f:d4:f1:15:ad:c2:49:35:89:76:c6:ac:dc:85:e2:ce:
-         d3:ba:cc:fd:fe:51:3a:a0:e6:56:4c:f8:21:b7:5c:f0:2c:88:
-         fa:9e:e9:85:76:de:8a:aa:48:d1:3f:03:01:41:6e:55:83:80:
-         5a:a0:36:5b:52:41:6e:2f:59:6d:07:fe:15:b1:7b:b7:c6:1b:
-         84:61:61:c5:82:84:98:22:20:45:69:d1:36:ea:7f:db:e0:03:
-         d6:73:a0:a9:6b:70:f2:9b:98:5e:f2:3e:30:c8:f6:b9:c9:35:
-         48:ae:68:21:ea:ec:9f:28:29:d2:88:bb:7e:e4:13:03:f9:79:
-         c9:2d:f7:41:90:28:4e:56:fc:c0:26:49:e4:0c:67:50:26:76:
-         7d:ba:c1:1c
+         54:74:10:33:68:ad:a0:f3:5e:42:ee:63:3c:33:7b:01:4f:aa:
+         8e:78:ec:91:51:c7:e0:31:4d:15:22:3f:88:70:f6:3a:8d:60:
+         72:e6:92:81:7b:34:40:d6:07:6a:a4:a1:42:84:cb:b3:a8:eb:
+         0b:07:6b:06:aa:60:70:4a:86:46:f7:0e:1e:95:c4:5b:ff:4e:
+         c9:86:15:ac:d7:44:ff:d6:7d:37:e7:f2:b9:da:7c:c9:b1:a8:
+         95:41:73:f9:be:b5:f6:8f:a8:d3:5b:05:6d:bd:55:69:dc:0e:
+         4f:c4:b3:45:ac:40:4f:f4:4d:3c:ff:be:9b:47:aa:c8:5f:47:
+         53:91:09:c7:2b:92:4d:4a:15:3f:49:04:40:17:e4:13:ab:26:
+         60:bb:ba:fc:e6:a0:02:d3:7e:af:9d:37:ae:20:ed:c7:be:1d:
+         9c:b6:94:13:73:27:45:2b:eb:0d:b9:64:09:78:97:d8:2f:36:
+         fc:79:a8:76:02:5f:e7:2c:60:af:8f:4d:dc:2a:47:54:65:f1:
+         c3:23:5e:fe:a1:4c:3e:2c:77:b1:f6:a0:32:3d:70:c0:cb:ab:
+         af:d7:cc:a5:19:2f:67:81:f1:19:0a:9c:06:4e:1e:a2:05:96:
+         ee:cb:fa:7a:b2:31:c0:54:a3:6c:66:7a:73:b2:76:85:9d:f2:
+         c5:bc:8d:f4
 -----BEGIN CERTIFICATE-----
 MIIDYjCCAkqgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290
 MB4XDTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowDDEKMAgGA1UEAwwBSTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKeUmhOgOG/5zScNnX3zDP6g
-3TkjTTPV2YjFI3Ghp/VQx8Y4y4hBh+gldRS+Ce9PsUjHUPbeBYVKAXxs6eFOGF9D
-OMtCOuNKfUmG9TDYRHBOyXc9utKkzKXfjOlY+C2ltHp+I04PiaBfD/FHlb30L+k7
-Drrv5xADCpSd/mWGSU3CT7bcI+cw5hBkDO1OF6odVh1vuD/ljGCK82daBG3zhJgB
-2xHG4sT8Clozd+s4NSFFwLMwwpVLhXMDdeWf/aVyqiFkzSamjXq8aGo2q/6mFpy5
-k+kmz8s8nakmGNGDYSXkvGpHUXjJHqI4EI6SZKiqcEbTzdJbVsOYyvG04M/JSLcC
-AwEAAaOByzCByDAdBgNVHQ4EFgQUQJEoIZ2T85wYG/8AnLIIoKOBfSowHwYDVR0j
-BBgwFoAU5U6W5NmCNr1Rw1e95t48wUa0SQ0wNwYIKwYBBQUHAQEEKzApMCcGCCsG
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2qdtxSokr9iusi9+IyiC1p
+u890VS3bvZoAQY/qKLNKrQD8/YtGMhOMqKc7AFNgN81MPZkCAYY/9Bq5MZGXVbVc
+c+VFgGP9b8UdFsRYPTPrzi9dvKH7PRPV0jQQuqWAST675GQKc4SLpj/e9EbEkzBs
+1IiPpvDpe8Xy6RjgPdsugVyvJssU9Z1Rj/W23OYTkXfIAs00Zyl/TXf/aBCfKbZr
+CoUXRWUYu/Tsqq3qapW+6zyYTXk6IIOSSbB1ooXdC3jukfQaWSuWygin2EneN5UV
+txvnt6LnKWUzysozsZPOobYjUporzcGSJPGYvK7MhybgY8U+l0hx2lqot4nWfOMC
+AwEAAaOByzCByDAdBgNVHQ4EFgQUhLoFBk4znRGqevF3H6Rpfkwt1D8wHwYDVR0j
+BBgwFoAUmB/cxegwjVq6mwzvrcy4rtTx0WMwNwYIKwYBBQUHAQEEKzApMCcGCCsG
 AQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUwIzAh
 oB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCWDVUuCbUna0jg
-iIfy+6AEmcJ9jIytYP/damnzzAjJHgIpenPj7u+ewVLdPp3UB2o5Cwqiah4XhrWK
-5FPy9wC9kJXSCJyjKCxNOC3rpKjEF0Qd9lfYbZgGO6kkgkJOjSXJXpa29jGVbEk+
-LRU3MG/U8RWtwkk1iXbGrNyF4s7Tusz9/lE6oOZWTPght1zwLIj6numFdt6KqkjR
-PwMBQW5Vg4BaoDZbUkFuL1ltB/4VsXu3xhuEYWHFgoSYIiBFadE26n/b4APWc6Cp
-a3Dym5he8j4wyPa5yTVIrmgh6uyfKCnSiLt+5BMD+XnJLfdBkChOVvzAJknkDGdQ
-JnZ9usEc
+BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBUdBAzaK2g815C
+7mM8M3sBT6qOeOyRUcfgMU0VIj+IcPY6jWBy5pKBezRA1gdqpKFChMuzqOsLB2sG
+qmBwSoZG9w4elcRb/07JhhWs10T/1n035/K52nzJsaiVQXP5vrX2j6jTWwVtvVVp
+3A5PxLNFrEBP9E08/76bR6rIX0dTkQnHK5JNShU/SQRAF+QTqyZgu7r85qAC036v
+nTeuIO3Hvh2ctpQTcydFK+sNuWQJeJfYLzb8eah2Al/nLGCvj03cKkdUZfHDI17+
+oUw+LHex9qAyPXDAy6uv18ylGS9ngfEZCpwGTh6iBZbuy/p6sjHAVKNsZnpzsnaF
+nfLFvI30
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/i2.pem b/net/data/cert_issuer_source_aia_unittest/i2.pem
index 995570d..fde840a 100644
--- a/net/data/cert_issuer_source_aia_unittest/i2.pem
+++ b/net/data/cert_issuer_source_aia_unittest/i2.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:a7:94:9a:13:a0:38:6f:f9:cd:27:0d:9d:7d:f3:
-                    0c:fe:a0:dd:39:23:4d:33:d5:d9:88:c5:23:71:a1:
-                    a7:f5:50:c7:c6:38:cb:88:41:87:e8:25:75:14:be:
-                    09:ef:4f:b1:48:c7:50:f6:de:05:85:4a:01:7c:6c:
-                    e9:e1:4e:18:5f:43:38:cb:42:3a:e3:4a:7d:49:86:
-                    f5:30:d8:44:70:4e:c9:77:3d:ba:d2:a4:cc:a5:df:
-                    8c:e9:58:f8:2d:a5:b4:7a:7e:23:4e:0f:89:a0:5f:
-                    0f:f1:47:95:bd:f4:2f:e9:3b:0e:ba:ef:e7:10:03:
-                    0a:94:9d:fe:65:86:49:4d:c2:4f:b6:dc:23:e7:30:
-                    e6:10:64:0c:ed:4e:17:aa:1d:56:1d:6f:b8:3f:e5:
-                    8c:60:8a:f3:67:5a:04:6d:f3:84:98:01:db:11:c6:
-                    e2:c4:fc:0a:5a:33:77:eb:38:35:21:45:c0:b3:30:
-                    c2:95:4b:85:73:03:75:e5:9f:fd:a5:72:aa:21:64:
-                    cd:26:a6:8d:7a:bc:68:6a:36:ab:fe:a6:16:9c:b9:
-                    93:e9:26:cf:cb:3c:9d:a9:26:18:d1:83:61:25:e4:
-                    bc:6a:47:51:78:c9:1e:a2:38:10:8e:92:64:a8:aa:
-                    70:46:d3:cd:d2:5b:56:c3:98:ca:f1:b4:e0:cf:c9:
-                    48:b7
+                    00:ad:aa:76:dc:52:a2:4a:fd:8a:eb:22:f7:e2:32:
+                    88:2d:69:bb:cf:74:55:2d:db:bd:9a:00:41:8f:ea:
+                    28:b3:4a:ad:00:fc:fd:8b:46:32:13:8c:a8:a7:3b:
+                    00:53:60:37:cd:4c:3d:99:02:01:86:3f:f4:1a:b9:
+                    31:91:97:55:b5:5c:73:e5:45:80:63:fd:6f:c5:1d:
+                    16:c4:58:3d:33:eb:ce:2f:5d:bc:a1:fb:3d:13:d5:
+                    d2:34:10:ba:a5:80:49:3e:bb:e4:64:0a:73:84:8b:
+                    a6:3f:de:f4:46:c4:93:30:6c:d4:88:8f:a6:f0:e9:
+                    7b:c5:f2:e9:18:e0:3d:db:2e:81:5c:af:26:cb:14:
+                    f5:9d:51:8f:f5:b6:dc:e6:13:91:77:c8:02:cd:34:
+                    67:29:7f:4d:77:ff:68:10:9f:29:b6:6b:0a:85:17:
+                    45:65:18:bb:f4:ec:aa:ad:ea:6a:95:be:eb:3c:98:
+                    4d:79:3a:20:83:92:49:b0:75:a2:85:dd:0b:78:ee:
+                    91:f4:1a:59:2b:96:ca:08:a7:d8:49:de:37:95:15:
+                    b7:1b:e7:b7:a2:e7:29:65:33:ca:ca:33:b1:93:ce:
+                    a1:b6:23:52:9a:2b:cd:c1:92:24:f1:98:bc:ae:cc:
+                    87:26:e0:63:c5:3e:97:48:71:da:5a:a8:b7:89:d6:
+                    7c:e3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
             X509v3 Authority Key Identifier: 
-                keyid:E5:4E:96:E4:D9:82:36:BD:51:C3:57:BD:E6:DE:3C:C1:46:B4:49:0D
+                keyid:98:1F:DC:C5:E8:30:8D:5A:BA:9B:0C:EF:AD:CC:B8:AE:D4:F1:D1:63
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/Root.cer
@@ -50,39 +50,39 @@
             X509v3 Basic Constraints: critical
                 CA:TRUE
     Signature Algorithm: sha256WithRSAEncryption
-         c2:83:63:7b:e6:d6:2b:b3:a7:f1:81:47:38:dc:65:9a:fc:3d:
-         1a:a7:2b:02:6c:98:32:6b:50:93:a9:cf:d1:03:12:b4:d7:b7:
-         15:49:a4:12:9e:95:c6:2b:ad:64:bc:16:4a:d9:b5:4b:3b:aa:
-         d9:d5:39:8d:ec:a6:1d:79:32:53:0a:66:41:c8:78:e4:74:d7:
-         e3:59:93:2e:2a:52:97:91:56:de:59:13:42:fa:a7:5b:80:82:
-         42:82:8c:c8:a2:90:89:45:4f:96:e2:88:3b:b5:52:70:22:3a:
-         f2:5d:2d:4f:2d:12:81:15:d8:10:3c:a1:72:19:07:86:2a:c4:
-         ac:79:2d:0f:a4:fc:8f:d5:18:eb:fc:e4:7e:a8:15:bb:1b:50:
-         5a:64:56:72:c3:96:e2:35:f7:03:54:4f:4a:0f:42:b6:53:61:
-         29:4f:f7:0f:7b:a9:d0:72:0b:43:18:08:4d:6c:35:4b:89:c3:
-         c4:4f:84:e1:c4:85:17:b4:cc:fa:a9:40:ad:aa:66:70:d6:ed:
-         f5:7a:7a:1b:bf:13:b9:68:b7:8a:23:14:29:2a:5a:af:0e:54:
-         28:87:31:7e:b7:34:ab:7f:ff:83:9d:b8:3a:ba:91:f4:93:70:
-         0e:8d:50:2f:67:d3:49:27:bd:db:25:d7:80:f4:58:8b:d3:01:
-         29:39:a9:2c
+         c9:b8:08:55:cd:6e:99:8f:1e:03:b6:00:7b:5f:65:63:6b:1d:
+         f1:27:84:0b:de:63:91:d2:bd:8a:28:ea:b0:f3:d6:a0:f6:11:
+         89:1b:a3:77:1f:f6:da:64:fd:36:24:9f:db:1c:b9:a1:f9:f1:
+         3f:ac:44:ed:08:4b:a2:7f:af:29:a7:01:7d:b9:88:ca:87:49:
+         a9:f1:9a:1d:3c:2e:ec:6b:a4:75:3e:29:29:2d:59:10:eb:39:
+         3a:9c:66:05:34:e9:c4:e9:37:0d:0f:74:be:f0:05:8c:0e:48:
+         e8:2d:c8:fa:81:01:11:b3:48:b3:5d:ba:a5:d6:30:bc:85:78:
+         70:a4:24:fd:36:ac:32:bf:17:5e:72:0a:1f:51:11:ba:c9:f2:
+         53:39:a1:4d:17:2e:de:f7:a4:33:ba:ce:d7:3c:f5:c0:bd:16:
+         22:48:f4:4e:a1:61:a6:62:b1:28:96:e5:9e:29:8f:b6:d3:53:
+         5a:3a:16:dc:3c:31:20:53:72:3d:cd:7a:e4:aa:0a:8d:83:0f:
+         68:74:1b:d5:22:87:31:a3:01:fc:18:7e:f5:35:cd:68:c8:ae:
+         71:e0:50:89:7d:96:e3:dd:df:62:a0:71:f1:56:5f:f6:79:11:
+         6f:28:a6:84:1f:63:a1:29:3e:c3:ef:1a:08:18:f8:95:6b:d7:
+         b6:a5:60:f5
 -----BEGIN CERTIFICATE-----
 MIIDYjCCAkqgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290
 MB4XDTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowDDEKMAgGA1UEAwwBSTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKeUmhOgOG/5zScNnX3zDP6g
-3TkjTTPV2YjFI3Ghp/VQx8Y4y4hBh+gldRS+Ce9PsUjHUPbeBYVKAXxs6eFOGF9D
-OMtCOuNKfUmG9TDYRHBOyXc9utKkzKXfjOlY+C2ltHp+I04PiaBfD/FHlb30L+k7
-Drrv5xADCpSd/mWGSU3CT7bcI+cw5hBkDO1OF6odVh1vuD/ljGCK82daBG3zhJgB
-2xHG4sT8Clozd+s4NSFFwLMwwpVLhXMDdeWf/aVyqiFkzSamjXq8aGo2q/6mFpy5
-k+kmz8s8nakmGNGDYSXkvGpHUXjJHqI4EI6SZKiqcEbTzdJbVsOYyvG04M/JSLcC
-AwEAAaOByzCByDAdBgNVHQ4EFgQUQJEoIZ2T85wYG/8AnLIIoKOBfSowHwYDVR0j
-BBgwFoAU5U6W5NmCNr1Rw1e95t48wUa0SQ0wNwYIKwYBBQUHAQEEKzApMCcGCCsG
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2qdtxSokr9iusi9+IyiC1p
+u890VS3bvZoAQY/qKLNKrQD8/YtGMhOMqKc7AFNgN81MPZkCAYY/9Bq5MZGXVbVc
+c+VFgGP9b8UdFsRYPTPrzi9dvKH7PRPV0jQQuqWAST675GQKc4SLpj/e9EbEkzBs
+1IiPpvDpe8Xy6RjgPdsugVyvJssU9Z1Rj/W23OYTkXfIAs00Zyl/TXf/aBCfKbZr
+CoUXRWUYu/Tsqq3qapW+6zyYTXk6IIOSSbB1ooXdC3jukfQaWSuWygin2EneN5UV
+txvnt6LnKWUzysozsZPOobYjUporzcGSJPGYvK7MhybgY8U+l0hx2lqot4nWfOMC
+AwEAAaOByzCByDAdBgNVHQ4EFgQUhLoFBk4znRGqevF3H6Rpfkwt1D8wHwYDVR0j
+BBgwFoAUmB/cxegwjVq6mwzvrcy4rtTx0WMwNwYIKwYBBQUHAQEEKzApMCcGCCsG
 AQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUwIzAh
 oB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDCg2N75tYrs6fx
-gUc43GWa/D0apysCbJgya1CTqc/RAxK017cVSaQSnpXGK61kvBZK2bVLO6rZ1TmN
-7KYdeTJTCmZByHjkdNfjWZMuKlKXkVbeWRNC+qdbgIJCgozIopCJRU+W4og7tVJw
-IjryXS1PLRKBFdgQPKFyGQeGKsSseS0PpPyP1Rjr/OR+qBW7G1BaZFZyw5biNfcD
-VE9KD0K2U2EpT/cPe6nQcgtDGAhNbDVLicPET4ThxIUXtMz6qUCtqmZw1u31enob
-vxO5aLeKIxQpKlqvDlQohzF+tzSrf/+Dnbg6upH0k3AOjVAvZ9NJJ73bJdeA9FiL
-0wEpOaks
+BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDJuAhVzW6Zjx4D
+tgB7X2Vjax3xJ4QL3mOR0r2KKOqw89ag9hGJG6N3H/baZP02JJ/bHLmh+fE/rETt
+CEuif68ppwF9uYjKh0mp8ZodPC7sa6R1PikpLVkQ6zk6nGYFNOnE6TcND3S+8AWM
+DkjoLcj6gQERs0izXbql1jC8hXhwpCT9NqwyvxdecgofURG6yfJTOaFNFy7e96Qz
+us7XPPXAvRYiSPROoWGmYrEoluWeKY+201NaOhbcPDEgU3I9zXrkqgqNgw9odBvV
+IocxowH8GH71Nc1oyK5x4FCJfZbj3d9ioHHxVl/2eRFvKKaEH2OhKT7D7xoIGPiV
+a9e2pWD1
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/i3.pem b/net/data/cert_issuer_source_aia_unittest/i3.pem
index 064d732..76bd34da 100644
--- a/net/data/cert_issuer_source_aia_unittest/i3.pem
+++ b/net/data/cert_issuer_source_aia_unittest/i3.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:a7:94:9a:13:a0:38:6f:f9:cd:27:0d:9d:7d:f3:
-                    0c:fe:a0:dd:39:23:4d:33:d5:d9:88:c5:23:71:a1:
-                    a7:f5:50:c7:c6:38:cb:88:41:87:e8:25:75:14:be:
-                    09:ef:4f:b1:48:c7:50:f6:de:05:85:4a:01:7c:6c:
-                    e9:e1:4e:18:5f:43:38:cb:42:3a:e3:4a:7d:49:86:
-                    f5:30:d8:44:70:4e:c9:77:3d:ba:d2:a4:cc:a5:df:
-                    8c:e9:58:f8:2d:a5:b4:7a:7e:23:4e:0f:89:a0:5f:
-                    0f:f1:47:95:bd:f4:2f:e9:3b:0e:ba:ef:e7:10:03:
-                    0a:94:9d:fe:65:86:49:4d:c2:4f:b6:dc:23:e7:30:
-                    e6:10:64:0c:ed:4e:17:aa:1d:56:1d:6f:b8:3f:e5:
-                    8c:60:8a:f3:67:5a:04:6d:f3:84:98:01:db:11:c6:
-                    e2:c4:fc:0a:5a:33:77:eb:38:35:21:45:c0:b3:30:
-                    c2:95:4b:85:73:03:75:e5:9f:fd:a5:72:aa:21:64:
-                    cd:26:a6:8d:7a:bc:68:6a:36:ab:fe:a6:16:9c:b9:
-                    93:e9:26:cf:cb:3c:9d:a9:26:18:d1:83:61:25:e4:
-                    bc:6a:47:51:78:c9:1e:a2:38:10:8e:92:64:a8:aa:
-                    70:46:d3:cd:d2:5b:56:c3:98:ca:f1:b4:e0:cf:c9:
-                    48:b7
+                    00:ad:aa:76:dc:52:a2:4a:fd:8a:eb:22:f7:e2:32:
+                    88:2d:69:bb:cf:74:55:2d:db:bd:9a:00:41:8f:ea:
+                    28:b3:4a:ad:00:fc:fd:8b:46:32:13:8c:a8:a7:3b:
+                    00:53:60:37:cd:4c:3d:99:02:01:86:3f:f4:1a:b9:
+                    31:91:97:55:b5:5c:73:e5:45:80:63:fd:6f:c5:1d:
+                    16:c4:58:3d:33:eb:ce:2f:5d:bc:a1:fb:3d:13:d5:
+                    d2:34:10:ba:a5:80:49:3e:bb:e4:64:0a:73:84:8b:
+                    a6:3f:de:f4:46:c4:93:30:6c:d4:88:8f:a6:f0:e9:
+                    7b:c5:f2:e9:18:e0:3d:db:2e:81:5c:af:26:cb:14:
+                    f5:9d:51:8f:f5:b6:dc:e6:13:91:77:c8:02:cd:34:
+                    67:29:7f:4d:77:ff:68:10:9f:29:b6:6b:0a:85:17:
+                    45:65:18:bb:f4:ec:aa:ad:ea:6a:95:be:eb:3c:98:
+                    4d:79:3a:20:83:92:49:b0:75:a2:85:dd:0b:78:ee:
+                    91:f4:1a:59:2b:96:ca:08:a7:d8:49:de:37:95:15:
+                    b7:1b:e7:b7:a2:e7:29:65:33:ca:ca:33:b1:93:ce:
+                    a1:b6:23:52:9a:2b:cd:c1:92:24:f1:98:bc:ae:cc:
+                    87:26:e0:63:c5:3e:97:48:71:da:5a:a8:b7:89:d6:
+                    7c:e3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
             X509v3 Authority Key Identifier: 
-                keyid:E5:4E:96:E4:D9:82:36:BD:51:C3:57:BD:E6:DE:3C:C1:46:B4:49:0D
+                keyid:98:1F:DC:C5:E8:30:8D:5A:BA:9B:0C:EF:AD:CC:B8:AE:D4:F1:D1:63
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/Root.cer
@@ -50,39 +50,39 @@
             X509v3 Basic Constraints: critical
                 CA:TRUE
     Signature Algorithm: sha256WithRSAEncryption
-         b1:46:b0:1d:f8:a1:ea:4c:fc:b3:48:41:66:45:97:39:88:ca:
-         d6:0c:d0:ee:8e:47:40:f0:26:a2:87:af:00:20:a2:39:7f:57:
-         fd:f0:4f:13:b9:6c:0b:ad:5a:6e:ef:d5:e9:6d:54:7c:d3:92:
-         19:e9:f8:0f:23:0c:87:51:b7:54:d4:b7:29:0a:f5:f6:6a:e1:
-         a2:1f:39:17:83:10:9f:52:b2:de:ac:02:a7:6a:04:88:15:bb:
-         f5:b3:0a:63:cf:db:b9:4a:53:c9:c1:f0:62:e0:90:a0:a8:3b:
-         8c:97:eb:cc:a4:e5:93:e6:1a:d4:25:ac:96:7a:a5:fb:ae:b2:
-         ce:2a:07:8f:58:e6:bd:e6:ac:03:38:5a:03:e0:93:e0:3e:fd:
-         11:90:93:86:3f:ca:8c:71:23:9c:af:24:95:20:c1:0e:bd:97:
-         dd:d7:85:8d:98:9b:b9:6d:b2:f9:4d:6a:e3:d0:3c:ea:b4:27:
-         59:cd:38:40:31:67:18:3e:a4:48:f6:9b:d4:20:23:20:1b:0b:
-         b1:57:51:17:79:66:bd:31:b5:01:29:b9:98:87:d1:86:71:34:
-         fc:78:a0:25:fd:49:25:41:09:88:15:53:2d:33:c1:7f:5d:d7:
-         66:2d:12:eb:90:d8:96:26:ee:7a:6c:50:f1:d9:90:0b:11:8d:
-         ff:7a:48:87
+         5e:ed:e2:76:4f:f0:ad:00:c5:37:64:c6:b2:ad:de:8f:90:68:
+         de:96:60:f4:ef:bb:09:0b:df:c8:98:f0:ad:27:79:51:b5:c3:
+         2d:01:f5:fc:3c:4e:a7:4a:b2:c5:b4:b0:52:c3:e7:e1:18:41:
+         4f:34:62:e5:79:b0:86:f8:83:4f:e9:b2:11:67:16:5d:9d:2c:
+         d5:f6:d0:ca:61:d5:44:67:12:24:0f:8e:37:f1:db:77:4c:a2:
+         ad:1c:8a:1f:54:e7:13:7d:f0:b8:e7:c7:21:46:be:7b:5a:f5:
+         23:53:cc:fa:09:cf:b7:a9:29:aa:84:94:69:3e:7b:7b:a3:5d:
+         f6:8f:5e:42:78:36:9c:34:b0:5f:50:d6:0c:53:ff:22:1b:b8:
+         90:5d:ec:eb:1d:2e:28:16:f3:3c:fe:da:a9:77:0b:e1:d0:a7:
+         1a:d2:54:e8:3c:a3:3b:79:b8:5c:30:ec:b4:1f:f1:f1:ff:d6:
+         cc:b8:18:ae:6c:ce:94:4d:fe:00:fc:9f:4e:11:6a:ec:de:33:
+         67:3a:e6:46:40:de:0e:18:6c:6f:79:f7:fc:93:07:f4:90:8b:
+         5e:44:27:8f:fe:1f:e2:91:4c:56:7d:27:df:f2:fc:2f:9a:96:
+         71:8b:40:9a:73:d6:73:41:74:2e:40:c6:eb:17:9c:23:0a:05:
+         9a:9c:47:37
 -----BEGIN CERTIFICATE-----
 MIIDYjCCAkqgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290
 MB4XDTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowDDEKMAgGA1UEAwwBSTCC
-ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKeUmhOgOG/5zScNnX3zDP6g
-3TkjTTPV2YjFI3Ghp/VQx8Y4y4hBh+gldRS+Ce9PsUjHUPbeBYVKAXxs6eFOGF9D
-OMtCOuNKfUmG9TDYRHBOyXc9utKkzKXfjOlY+C2ltHp+I04PiaBfD/FHlb30L+k7
-Drrv5xADCpSd/mWGSU3CT7bcI+cw5hBkDO1OF6odVh1vuD/ljGCK82daBG3zhJgB
-2xHG4sT8Clozd+s4NSFFwLMwwpVLhXMDdeWf/aVyqiFkzSamjXq8aGo2q/6mFpy5
-k+kmz8s8nakmGNGDYSXkvGpHUXjJHqI4EI6SZKiqcEbTzdJbVsOYyvG04M/JSLcC
-AwEAAaOByzCByDAdBgNVHQ4EFgQUQJEoIZ2T85wYG/8AnLIIoKOBfSowHwYDVR0j
-BBgwFoAU5U6W5NmCNr1Rw1e95t48wUa0SQ0wNwYIKwYBBQUHAQEEKzApMCcGCCsG
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK2qdtxSokr9iusi9+IyiC1p
+u890VS3bvZoAQY/qKLNKrQD8/YtGMhOMqKc7AFNgN81MPZkCAYY/9Bq5MZGXVbVc
+c+VFgGP9b8UdFsRYPTPrzi9dvKH7PRPV0jQQuqWAST675GQKc4SLpj/e9EbEkzBs
+1IiPpvDpe8Xy6RjgPdsugVyvJssU9Z1Rj/W23OYTkXfIAs00Zyl/TXf/aBCfKbZr
+CoUXRWUYu/Tsqq3qapW+6zyYTXk6IIOSSbB1ooXdC3jukfQaWSuWygin2EneN5UV
+txvnt6LnKWUzysozsZPOobYjUporzcGSJPGYvK7MhybgY8U+l0hx2lqot4nWfOMC
+AwEAAaOByzCByDAdBgNVHQ4EFgQUhLoFBk4znRGqevF3H6Rpfkwt1D8wHwYDVR0j
+BBgwFoAUmB/cxegwjVq6mwzvrcy4rtTx0WMwNwYIKwYBBQUHAQEEKzApMCcGCCsG
 AQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUwIzAh
 oB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQEAwIB
-BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCxRrAd+KHqTPyz
-SEFmRZc5iMrWDNDujkdA8Caih68AIKI5f1f98E8TuWwLrVpu79XpbVR805IZ6fgP
-IwyHUbdU1LcpCvX2auGiHzkXgxCfUrLerAKnagSIFbv1swpjz9u5SlPJwfBi4JCg
-qDuMl+vMpOWT5hrUJayWeqX7rrLOKgePWOa95qwDOFoD4JPgPv0RkJOGP8qMcSOc
-rySVIMEOvZfd14WNmJu5bbL5TWrj0DzqtCdZzThAMWcYPqRI9pvUICMgGwuxV1EX
-eWa9MbUBKbmYh9GGcTT8eKAl/UklQQmIFVMtM8F/XddmLRLrkNiWJu56bFDx2ZAL
-EY3/ekiH
+BjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBe7eJ2T/CtAMU3
+ZMayrd6PkGjelmD077sJC9/ImPCtJ3lRtcMtAfX8PE6nSrLFtLBSw+fhGEFPNGLl
+ebCG+INP6bIRZxZdnSzV9tDKYdVEZxIkD4438dt3TKKtHIofVOcTffC458chRr57
+WvUjU8z6Cc+3qSmqhJRpPnt7o132j15CeDacNLBfUNYMU/8iG7iQXezrHS4oFvM8
+/tqpdwvh0Kca0lToPKM7ebhcMOy0H/Hx/9bMuBiubM6UTf4A/J9OEWrs3jNnOuZG
+QN4OGGxveff8kwf0kIteRCeP/h/ikUxWfSff8vwvmpZxi0Cac9ZzQXQuQMbrF5wj
+CgWanEc3
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/root.pem b/net/data/cert_issuer_source_aia_unittest/root.pem
index 3889c51..864402e 100644
--- a/net/data/cert_issuer_source_aia_unittest/root.pem
+++ b/net/data/cert_issuer_source_aia_unittest/root.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:c5:4d:a6:fe:7f:c0:31:03:69:d9:4b:40:aa:ea:
-                    7f:d8:a9:ba:5e:7f:05:a9:b1:14:38:11:fd:35:c9:
-                    21:06:4b:ae:91:51:ff:9b:fa:de:78:7b:ec:7f:85:
-                    49:18:91:97:3d:73:1f:71:2d:41:cf:9e:a7:26:d7:
-                    0a:11:51:79:0c:0d:40:18:8e:4d:8b:03:42:a9:25:
-                    e4:e7:26:d9:d9:da:13:27:dd:ad:02:27:b3:53:07:
-                    8b:32:1d:1a:bd:6a:73:59:02:58:3d:8d:dc:e3:8d:
-                    ee:9a:e5:b7:56:5f:b0:5e:a6:f9:cc:0f:13:9e:6f:
-                    cf:73:77:84:23:8a:6b:6c:a5:cd:d8:19:1d:c5:8c:
-                    d2:e3:a5:bc:4e:26:10:49:dc:95:5e:b6:8d:73:7e:
-                    f1:e9:70:11:72:85:ab:b7:29:be:72:13:d0:18:8d:
-                    ab:4c:67:22:7a:03:2e:0c:f8:47:27:af:f8:a1:87:
-                    b2:99:36:65:9d:00:a6:70:87:64:bc:dc:86:c3:0a:
-                    73:06:12:d9:56:9c:72:cf:63:88:85:e7:46:0b:33:
-                    91:8e:4c:76:ab:b7:e0:3a:41:a7:a0:d4:92:d7:c9:
-                    11:d1:c8:77:c1:a9:69:69:57:eb:91:a4:49:a2:57:
-                    15:f1:9d:7d:fa:f9:f0:98:be:4b:0b:1b:d7:92:e4:
-                    50:47
+                    00:e0:76:77:42:80:12:21:1a:78:ca:6b:2d:b4:92:
+                    2a:2e:5d:8b:15:4b:d2:6a:55:6c:7d:a2:ec:db:ba:
+                    c5:54:63:17:bd:a6:a2:6d:a8:46:9a:e1:40:d8:38:
+                    97:b7:05:df:41:d5:8d:32:0c:76:71:e6:a2:b6:ff:
+                    17:37:ef:66:e4:c5:05:15:de:a1:c8:d9:68:48:d2:
+                    92:fb:5a:3e:5d:89:d1:3f:8a:15:a4:37:82:18:fd:
+                    79:58:8a:47:39:15:57:d5:de:45:66:21:af:80:7b:
+                    21:53:be:0b:94:03:e1:4e:a3:32:28:6f:76:9c:ab:
+                    0f:74:df:54:f8:eb:f4:87:c9:a0:0f:21:75:b4:4c:
+                    e7:73:7d:53:78:e5:88:95:90:62:28:47:08:a9:73:
+                    55:dc:ab:b5:d0:f4:c0:cb:68:b7:e4:d7:3f:62:ef:
+                    89:c5:27:e0:1d:5f:a8:88:f2:a1:dd:15:8a:62:ae:
+                    7b:7f:46:da:2f:a6:ef:37:6a:fe:8a:db:e4:91:db:
+                    ec:e4:e8:c0:7c:bb:96:ff:43:e6:02:9e:e4:07:d6:
+                    ca:b9:6d:a0:ba:d9:f9:70:c5:d8:15:10:d8:a1:61:
+                    b7:d4:44:04:67:e5:d2:b9:80:d1:86:c4:e5:40:c5:
+                    02:c5:83:16:7d:7b:db:af:95:66:9b:fb:42:9c:c8:
+                    51:5b
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                E5:4E:96:E4:D9:82:36:BD:51:C3:57:BD:E6:DE:3C:C1:46:B4:49:0D
+                98:1F:DC:C5:E8:30:8D:5A:BA:9B:0C:EF:AD:CC:B8:AE:D4:F1:D1:63
             X509v3 Authority Key Identifier: 
-                keyid:E5:4E:96:E4:D9:82:36:BD:51:C3:57:BD:E6:DE:3C:C1:46:B4:49:0D
+                keyid:98:1F:DC:C5:E8:30:8D:5A:BA:9B:0C:EF:AD:CC:B8:AE:D4:F1:D1:63
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/Root.cer
@@ -50,39 +50,39 @@
             X509v3 Basic Constraints: critical
                 CA:TRUE
     Signature Algorithm: sha256WithRSAEncryption
-         5f:d4:9c:32:27:c2:19:48:51:1a:59:b3:16:7b:55:ec:c5:39:
-         e6:3b:08:0b:31:60:0b:8b:50:57:26:b9:67:12:f8:5b:95:ca:
-         f7:b9:88:28:65:50:ab:c6:60:9a:29:05:92:e6:b6:72:02:f4:
-         e2:95:b8:d9:29:fc:61:62:a4:1f:1e:0b:22:a7:80:5e:08:2c:
-         a2:c5:1c:20:47:cc:dc:6c:8e:95:c1:34:a0:c8:35:f1:48:f6:
-         96:a6:ee:e4:cb:58:55:b2:6e:a5:25:c8:a9:b8:6d:bb:50:dd:
-         0b:3b:83:f2:84:4b:b8:14:30:2c:38:a5:67:89:dd:be:d6:45:
-         80:23:7c:87:02:96:39:22:87:58:ce:fa:7e:0d:2e:60:54:ca:
-         9a:01:70:39:eb:6d:8f:82:d0:68:46:ee:3a:9a:54:df:d8:74:
-         4c:3a:5e:96:d8:4b:c7:86:04:d0:b7:96:f9:b3:c1:a3:a7:95:
-         b8:d7:7e:8b:f1:2a:b7:e0:8c:fb:ce:15:d1:cc:81:4f:40:96:
-         18:a8:aa:d7:97:3d:27:60:1f:ac:60:92:d1:b0:53:77:73:d7:
-         85:c8:6c:8a:36:8f:6a:2d:e7:6a:16:d5:f9:a3:42:e3:84:32:
-         ee:d3:e9:18:41:b6:07:30:87:03:b0:54:c3:2a:49:bc:00:13:
-         d1:79:5e:06
+         bf:ee:de:10:57:08:17:93:3a:c7:4e:74:db:d8:6d:7e:b5:f2:
+         1f:45:3c:5b:70:b1:0f:a4:d2:da:29:4a:49:a5:8d:7e:28:7e:
+         04:9d:a6:a0:6d:47:5d:05:4e:f6:b6:3a:73:66:05:d6:bd:52:
+         6d:1e:2e:3f:f1:37:e2:c0:95:c5:25:ca:dd:4c:32:bb:f4:22:
+         3b:41:4d:0b:31:9c:1a:eb:84:95:90:4e:4e:2f:8a:2d:22:43:
+         41:37:56:4a:0f:d8:6f:ff:54:2b:af:5b:f0:ac:3c:36:39:a3:
+         8f:02:7d:ff:45:25:a0:b9:57:61:15:f3:3a:67:49:da:b8:f4:
+         e5:7d:12:89:08:42:67:14:be:6a:a0:10:27:10:f0:21:78:1d:
+         cf:07:d0:50:7a:0e:7a:a2:00:5a:c1:dc:b9:d5:2a:ba:bb:7a:
+         99:5c:57:d1:14:1b:10:c9:51:9d:82:7b:fe:05:7e:87:fe:05:
+         55:52:3d:88:6a:44:bd:8c:61:f0:0c:5c:de:f6:85:1d:41:a9:
+         10:fa:89:3c:8c:69:f6:99:69:69:b9:18:a5:40:7d:7e:52:04:
+         f8:92:91:be:02:7a:25:42:c8:e4:d3:dd:da:60:82:f2:f3:2c:
+         9f:d9:cb:4c:13:a2:ea:a1:39:b0:35:37:3a:4d:e1:89:9f:24:
+         f3:b2:30:1f
 -----BEGIN CERTIFICATE-----
 MIIDZTCCAk2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDDARSb290
 MB4XDTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowDzENMAsGA1UEAwwEUm9v
-dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVNpv5/wDEDadlLQKrq
-f9ipul5/BamxFDgR/TXJIQZLrpFR/5v63nh77H+FSRiRlz1zH3EtQc+epybXChFR
-eQwNQBiOTYsDQqkl5Ocm2dnaEyfdrQIns1MHizIdGr1qc1kCWD2N3OON7prlt1Zf
-sF6m+cwPE55vz3N3hCOKa2ylzdgZHcWM0uOlvE4mEEnclV62jXN+8elwEXKFq7cp
-vnIT0BiNq0xnInoDLgz4Ryev+KGHspk2ZZ0ApnCHZLzchsMKcwYS2Vaccs9jiIXn
-RgszkY5Mdqu34DpBp6DUktfJEdHId8GpaWlX65GkSaJXFfGdffr58Ji+Swsb15Lk
-UEcCAwEAAaOByzCByDAdBgNVHQ4EFgQU5U6W5NmCNr1Rw1e95t48wUa0SQ0wHwYD
-VR0jBBgwFoAU5U6W5NmCNr1Rw1e95t48wUa0SQ0wNwYIKwYBBQUHAQEEKzApMCcG
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOB2d0KAEiEaeMprLbSS
+Ki5dixVL0mpVbH2i7Nu6xVRjF72mom2oRprhQNg4l7cF30HVjTIMdnHmorb/Fzfv
+ZuTFBRXeocjZaEjSkvtaPl2J0T+KFaQ3ghj9eViKRzkVV9XeRWYhr4B7IVO+C5QD
+4U6jMihvdpyrD3TfVPjr9IfJoA8hdbRM53N9U3jliJWQYihHCKlzVdyrtdD0wMto
+t+TXP2LvicUn4B1fqIjyod0VimKue39G2i+m7zdq/orb5JHb7OTowHy7lv9D5gKe
+5AfWyrltoLrZ+XDF2BUQ2KFht9REBGfl0rmA0YbE5UDFAsWDFn1726+VZpv7QpzI
+UVsCAwEAAaOByzCByDAdBgNVHQ4EFgQUmB/cxegwjVq6mwzvrcy4rtTx0WMwHwYD
+VR0jBBgwFoAUmB/cxegwjVq6mwzvrcy4rtTx0WMwNwYIKwYBBQUHAQEEKzApMCcG
 CCsGAQUFBzAChhtodHRwOi8vdXJsLWZvci1haWEvUm9vdC5jZXIwLAYDVR0fBCUw
 IzAhoB+gHYYbaHR0cDovL3VybC1mb3ItY3JsL1Jvb3QuY3JsMA4GA1UdDwEB/wQE
-AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBf1JwyJ8IZ
-SFEaWbMWe1XsxTnmOwgLMWALi1BXJrlnEvhblcr3uYgoZVCrxmCaKQWS5rZyAvTi
-lbjZKfxhYqQfHgsip4BeCCyixRwgR8zcbI6VwTSgyDXxSPaWpu7ky1hVsm6lJcip
-uG27UN0LO4PyhEu4FDAsOKVnid2+1kWAI3yHApY5IodYzvp+DS5gVMqaAXA5622P
-gtBoRu46mlTf2HRMOl6W2EvHhgTQt5b5s8Gjp5W4136L8Sq34Iz7zhXRzIFPQJYY
-qKrXlz0nYB+sYJLRsFN3c9eFyGyKNo9qLedqFtX5o0LjhDLu0+kYQbYHMIcDsFTD
-Kkm8ABPReV4G
+AwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQC/7t4QVwgX
+kzrHTnTb2G1+tfIfRTxbcLEPpNLaKUpJpY1+KH4EnaagbUddBU72tjpzZgXWvVJt
+Hi4/8TfiwJXFJcrdTDK79CI7QU0LMZwa64SVkE5OL4otIkNBN1ZKD9hv/1Qrr1vw
+rDw2OaOPAn3/RSWguVdhFfM6Z0nauPTlfRKJCEJnFL5qoBAnEPAheB3PB9BQeg56
+ogBawdy51Sq6u3qZXFfRFBsQyVGdgnv+BX6H/gVVUj2IakS9jGHwDFze9oUdQakQ
++ok8jGn2mWlpuRilQH1+UgT4kpG+AnolQsjk093aYILy8yyf2ctME6LqoTmwNTc6
+TeGJnyTzsjAf
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_file_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_file_aia.pem
index d9d08d5..980aa12 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_file_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_file_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ee:22:a3:0e:ba:89:a9:fc:95:d9:52:63:da:11:
-                    41:eb:fe:16:b2:fb:28:bc:f0:46:43:3b:6d:72:04:
-                    33:d1:8c:ab:4c:1a:dc:af:68:7d:a4:61:a4:44:dc:
-                    1f:1f:8f:cf:e5:8b:e5:fa:ec:12:92:19:18:e1:ec:
-                    a3:52:7c:06:c5:a6:9c:f6:af:0b:40:3c:44:cb:64:
-                    a1:8b:60:65:5f:f0:e0:b7:cf:86:38:5a:2d:36:12:
-                    0b:f9:c2:b3:c4:ed:36:13:67:b6:c3:9a:43:97:e5:
-                    44:dc:5d:62:ed:37:da:c7:66:73:fc:67:0e:32:9a:
-                    5f:db:b1:8a:4a:12:a4:a5:47:24:84:b3:0d:3b:32:
-                    bb:98:e9:24:db:58:41:4e:ef:51:a6:07:00:ed:e2:
-                    5d:22:43:b4:48:7f:82:f8:e4:c5:98:7f:4b:df:b0:
-                    9a:e1:78:65:c5:65:bf:7e:09:75:96:e4:9c:93:40:
-                    95:76:02:ae:dd:d0:cf:42:4d:53:c6:45:6c:80:cf:
-                    a9:0c:f6:f5:b6:b2:f7:fd:47:68:53:5d:39:8c:3d:
-                    2b:e3:eb:7e:0a:b6:c9:19:f4:70:3b:df:4b:c0:ad:
-                    27:df:b2:80:a7:1b:4f:cf:2a:51:1a:f4:10:b8:1a:
-                    ff:0f:36:e5:be:4e:b6:89:73:ca:56:5f:3b:89:48:
-                    d0:c7
+                    00:c2:b8:d6:fd:7b:fb:c3:a4:78:0a:f0:bc:2a:2d:
+                    2f:64:dc:94:cd:83:39:63:b6:17:f8:cb:8a:56:b7:
+                    7b:81:99:73:2e:ae:83:d0:94:1b:6c:12:95:1c:d3:
+                    73:c6:b9:e8:ed:68:8f:e7:84:f5:b6:8c:c0:aa:75:
+                    1d:7e:d2:96:d8:27:1e:50:65:9c:5b:88:7d:b8:a4:
+                    ea:3b:9b:ab:68:54:41:97:52:15:b9:be:fa:5e:35:
+                    4a:8c:ae:bf:67:e4:85:79:4a:e4:14:4a:3b:90:6b:
+                    76:43:34:e3:6c:09:1f:56:ce:1b:a2:3d:fa:ce:2b:
+                    7b:fe:12:1f:04:2f:7e:99:ab:7d:a4:34:0a:59:c4:
+                    7a:fa:f8:af:2f:c3:ee:71:12:44:22:17:b7:d7:b4:
+                    72:9e:9b:90:3f:a0:14:aa:aa:d4:3d:a4:bf:aa:bc:
+                    92:6e:bc:97:89:db:8a:cf:45:8a:b9:3e:6b:b7:60:
+                    c0:3f:dc:1c:24:e9:04:01:8d:f5:bb:0f:80:60:c5:
+                    d5:6d:94:43:55:bc:15:6b:c7:f9:ff:e4:d4:b0:2f:
+                    ad:2f:8f:3d:be:84:12:36:59:8b:1d:06:ce:f2:47:
+                    a7:d3:4e:48:0c:f4:42:bf:2f:ae:f3:12:dc:14:21:
+                    4c:35:2f:49:cf:7a:30:17:27:21:89:20:21:20:f1:
+                    0a:95
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                A7:CF:5E:6D:C8:A0:41:B5:7B:39:EA:C3:A5:F9:13:14:80:1E:3C:81
+                FF:42:DD:71:AA:35:67:90:AF:8A:A5:37:2C:D0:81:00:CD:0D:C4:F9
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:file:///dev/null
@@ -49,40 +49,42 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         28:b6:d2:18:91:33:ed:df:67:ec:f5:c1:c7:37:25:1c:ec:95:
-         71:d9:ec:80:4c:e9:8b:d5:66:15:c2:19:e3:47:da:a7:b5:bb:
-         df:59:84:2f:07:96:c5:80:26:d7:d6:df:ce:cd:0b:28:fc:de:
-         c9:cc:b0:43:76:83:46:02:b1:f0:d0:3d:2e:6b:52:be:24:54:
-         ab:03:72:ee:a6:8c:cf:17:81:0b:c3:29:2f:da:ed:7a:e8:43:
-         90:57:97:56:6b:f9:76:25:93:ed:b7:a0:53:f1:ff:83:7e:53:
-         0c:ca:bb:a6:16:25:4d:fc:b6:cd:54:5a:fa:f8:12:a5:8c:46:
-         5a:64:e8:ba:f8:26:2e:15:8d:fa:00:e7:96:f7:47:73:5c:0c:
-         30:68:4b:db:0b:92:31:2d:1a:a0:14:77:10:dc:cb:07:ef:f1:
-         30:76:fa:dd:41:e4:b1:a3:d3:aa:c2:20:f7:77:f4:72:41:5b:
-         38:96:ce:e6:72:60:ff:63:d2:25:8b:99:cd:f6:34:34:73:67:
-         9a:cc:da:d3:76:da:ef:fb:d5:4a:cf:fe:34:27:fb:32:96:5b:
-         bf:b7:72:87:a7:f2:1e:7a:fc:e8:9d:ee:f6:94:44:88:63:47:
-         ec:e9:e8:61:74:9d:28:bd:2c:fd:b7:b3:b2:ed:68:c8:d6:ff:
-         53:93:61:36
+         83:37:89:c7:c3:ff:da:25:ef:02:0e:61:c7:a0:4d:8c:f3:f5:
+         c0:17:3f:12:42:ab:77:b4:e2:a5:38:e4:4f:79:5a:ca:a0:dc:
+         e8:99:3a:46:06:96:ea:49:24:52:5a:f8:9c:00:a7:65:c6:2a:
+         e7:89:b5:e4:7f:a7:22:b9:8b:09:6f:bc:5b:30:fe:6d:6e:32:
+         d6:3c:dd:9d:96:2c:9b:71:a3:2a:0f:ad:a1:ab:33:8f:e9:1f:
+         97:cd:fd:bc:7b:13:c6:d5:9d:40:4f:35:94:3a:0e:c0:a3:87:
+         7b:fa:4e:f4:e0:d7:6c:03:df:96:90:90:5d:f4:69:2e:ad:f0:
+         ce:26:13:a8:8a:69:9d:4c:98:91:06:f1:aa:2b:f8:29:9c:c3:
+         d7:97:58:6f:6f:29:76:45:68:9d:1c:9d:af:5a:1a:51:ba:df:
+         13:81:1a:45:f4:f8:74:37:c9:67:3b:91:86:b8:da:ec:c7:38:
+         77:75:12:5e:5e:22:a3:e7:ed:74:5a:2a:35:4a:ea:0c:7f:40:
+         15:fd:b3:82:ab:b9:0f:f3:da:87:31:22:d5:8d:73:25:a9:dd:
+         f3:1f:03:b0:e4:e5:dc:4a:2f:fd:71:11:79:ee:b8:50:a5:0f:
+         cc:ba:07:90:15:3f:c9:a6:e9:32:ac:fe:77:e9:74:5e:a0:de:
+         f6:24:1a:d4
 -----BEGIN CERTIFICATE-----
-MIIDZDCCAkygAwIBAgIBBjANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIDdzCCAl+gAwIBAgIBBjANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7iKjDrqJqfyV2VJj2hFB
-6/4WsvsovPBGQzttcgQz0YyrTBrcr2h9pGGkRNwfH4/P5Yvl+uwSkhkY4eyjUnwG
-xaac9q8LQDxEy2Shi2BlX/Dgt8+GOFotNhIL+cKzxO02E2e2w5pDl+VE3F1i7Tfa
-x2Zz/GcOMppf27GKShKkpUckhLMNOzK7mOkk21hBTu9RpgcA7eJdIkO0SH+C+OTF
-mH9L37Ca4XhlxWW/fgl1luSck0CVdgKu3dDPQk1TxkVsgM+pDPb1trL3/UdoU105
-jD0r4+t+CrbJGfRwO99LwK0n37KApxtPzypRGvQQuBr/Dzblvk62iXPKVl87iUjQ
-xwIDAQABo4HLMIHIMB0GA1UdDgQWBBSnz15tyKBBtXs56sOl+RMUgB48gTAfBgNV
-HSMEGDAWgBRAkSghnZPznBgb/wCcsgigo4F9KjAsBggrBgEFBQcBAQQgMB4wHAYI
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwrjW/Xv7w6R4CvC8Ki0v
+ZNyUzYM5Y7YX+MuKVrd7gZlzLq6D0JQbbBKVHNNzxrno7WiP54T1tozAqnUdftKW
+2CceUGWcW4h9uKTqO5uraFRBl1IVub76XjVKjK6/Z+SFeUrkFEo7kGt2QzTjbAkf
+Vs4boj36zit7/hIfBC9+mat9pDQKWcR6+vivL8PucRJEIhe317RynpuQP6AUqqrU
+PaS/qrySbryXiduKz0WKuT5rt2DAP9wcJOkEAY31uw+AYMXVbZRDVbwVa8f5/+TU
+sC+tL489voQSNlmLHQbO8ken005IDPRCvy+u8xLcFCFMNS9Jz3owFychiSAhIPEK
+lQIDAQABo4HeMIHbMB0GA1UdDgQWBBT/Qt1xqjVnkK+KpTcs0IEAzQ3E+TAfBgNV
+HSMEGDAWgBSEugUGTjOdEap68XcfpGl+TC3UPzAsBggrBgEFBQcBAQQgMB4wHAYI
 KwYBBQUHMAKGEGZpbGU6Ly8vZGV2L251bGwwKQYDVR0fBCIwIDAeoBygGoYYaHR0
 cDovL3VybC1mb3ItY3JsL0kuY3JsMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU
-BggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBACi20hiRM+3f
-Z+z1wcc3JRzslXHZ7IBM6YvVZhXCGeNH2qe1u99ZhC8HlsWAJtfW387NCyj83snM
-sEN2g0YCsfDQPS5rUr4kVKsDcu6mjM8XgQvDKS/a7XroQ5BXl1Zr+XYlk+23oFPx
-/4N+UwzKu6YWJU38ts1UWvr4EqWMRlpk6Lr4Ji4VjfoA55b3R3NcDDBoS9sLkjEt
-GqAUdxDcywfv8TB2+t1B5LGj06rCIPd39HJBWziWzuZyYP9j0iWLmc32NDRzZ5rM
-2tN22u/71UrP/jQn+zKWW7+3coen8h56/Oid7vaURIhjR+zp6GF0nSi9LP23s7Lt
-aMjW/1OTYTY=
+BggrBgEFBQcDAQYIKwYBBQUHAwIwEQYDVR0RBAowCIIGdGFyZ2V0MA0GCSqGSIb3
+DQEBCwUAA4IBAQCDN4nHw//aJe8CDmHHoE2M8/XAFz8SQqt3tOKlOORPeVrKoNzo
+mTpGBpbqSSRSWvicAKdlxirnibXkf6ciuYsJb7xbMP5tbjLWPN2dliybcaMqD62h
+qzOP6R+Xzf28exPG1Z1ATzWUOg7Ao4d7+k704NdsA9+WkJBd9GkurfDOJhOoimmd
+TJiRBvGqK/gpnMPXl1hvbyl2RWidHJ2vWhpRut8TgRpF9Ph0N8lnO5GGuNrsxzh3
+dRJeXiKj5+10Wio1SuoMf0AV/bOCq7kP89qHMSLVjXMlqd3zHwOw5OXcSi/9cRF5
+7rhQpQ/MugeQFT/JpukyrP536XReoN72JBrU
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_file_and_http_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_file_and_http_aia.pem
index 8066e42..7b6be73c 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_file_and_http_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_file_and_http_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:c8:03:32:ae:0e:d4:6b:f1:27:56:39:2f:62:ae:
-                    56:60:79:57:73:86:89:35:8c:07:ba:b5:d1:55:c7:
-                    a8:fc:91:d7:c9:20:4d:93:bd:7b:5d:40:73:d2:af:
-                    69:91:3b:69:49:58:4c:bb:6f:a9:a3:bc:51:9b:1c:
-                    7d:06:fa:67:3f:50:09:9e:1e:4d:08:8f:12:0a:1a:
-                    be:8c:26:45:b7:2d:73:2d:3e:d8:fe:31:3f:c3:42:
-                    bd:90:44:2b:05:7f:53:68:51:ef:59:88:6c:0e:7d:
-                    e3:cd:7b:65:08:5f:7f:4f:85:11:0b:8d:ce:27:e3:
-                    69:7f:1d:24:6c:ea:12:6e:d0:6a:13:31:d5:8c:d4:
-                    f4:b1:3a:df:20:cb:f4:1f:05:71:6d:17:ee:37:28:
-                    c7:b8:b0:d5:5a:12:cd:7e:40:65:fa:33:49:c6:83:
-                    bd:bb:37:0b:3b:a7:0c:c5:0b:99:ed:b7:d2:9a:ba:
-                    ba:f8:d7:8c:23:ed:12:ad:ac:b3:29:a3:70:71:5c:
-                    42:7b:e5:46:8c:1f:95:0d:cc:22:24:3a:d8:4e:91:
-                    42:1e:c9:a5:77:c2:49:b7:04:68:9c:5e:bb:48:e8:
-                    1b:03:dd:28:69:5f:1a:43:2b:75:0f:86:c1:b0:af:
-                    98:b8:c8:0c:a6:2a:25:d7:73:4d:85:63:df:75:1f:
-                    39:4b
+                    00:b2:4e:8e:4e:eb:87:1c:99:f2:14:5d:b0:e0:b6:
+                    83:01:1a:a7:39:0b:7d:35:ef:d7:4f:b2:76:84:46:
+                    b9:10:fb:5a:ed:08:ed:2a:32:41:72:cb:3b:2b:25:
+                    2d:e6:44:1b:04:71:c6:58:73:8d:1b:a8:1f:dd:56:
+                    0f:c7:4c:1d:03:91:01:fa:a9:43:ed:95:a9:f0:8e:
+                    28:b2:ed:f2:78:84:cc:9a:d2:d6:5e:9e:44:be:70:
+                    29:29:d0:44:80:93:ee:37:72:8c:52:aa:3a:76:5b:
+                    74:46:09:39:22:51:c7:92:70:d7:b1:2c:1f:74:db:
+                    e6:77:f4:b2:84:1c:d8:c1:ff:75:48:fb:6a:a4:43:
+                    c1:cb:02:07:f9:d3:1a:46:52:c7:9a:60:f6:ed:5a:
+                    1f:36:81:fe:a0:56:f9:bd:dd:3a:4a:a7:a0:13:06:
+                    c6:9c:d3:f4:92:e1:0f:fe:2d:41:70:05:7d:2b:e0:
+                    8b:5e:f7:5e:fc:4d:50:0d:36:bf:36:35:6e:ed:66:
+                    c5:0e:b8:73:98:8e:7d:a1:80:1f:cd:37:c9:44:6d:
+                    f2:1b:29:06:f0:51:90:55:2e:a0:ef:43:41:e5:fb:
+                    f8:5b:16:d6:a6:70:2a:24:9b:3a:a2:d1:85:f3:31:
+                    7f:dc:56:ef:28:cd:cc:e3:ca:2a:e1:ed:78:cc:56:
+                    57:69
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                6D:14:70:82:6B:4A:03:46:1B:B4:E3:B1:BC:40:78:FF:7B:28:45:55
+                B5:51:F6:D3:5D:24:43:E0:10:85:9D:4C:5F:DA:EB:69:00:3B:B8:FE
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:file:///dev/null
@@ -50,40 +50,43 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         90:dd:9e:1e:9a:20:5e:bc:dd:ea:be:35:6d:73:5e:9e:17:d7:
-         06:92:2c:d6:05:3d:a5:90:5a:f0:b5:55:d6:1e:d6:78:8d:aa:
-         8b:94:8f:2e:68:64:09:72:ff:a5:95:61:49:33:79:67:4d:1d:
-         53:3b:59:16:82:bc:1b:27:05:7e:f2:41:80:09:e0:b2:92:85:
-         a0:fa:32:f2:99:49:ce:63:5a:c2:f4:89:d0:0f:39:a1:0f:b1:
-         61:0c:fd:a7:b1:d4:8f:a4:b1:9a:4f:da:81:ec:41:ee:c1:5b:
-         1b:3e:df:8e:0f:1c:aa:a6:63:0f:6b:e5:0a:36:a3:e1:72:3c:
-         74:49:cd:2b:eb:f5:d0:c8:87:c0:22:3a:51:7b:58:3b:6c:4b:
-         6a:70:74:be:1c:68:49:7b:9d:62:ef:4a:e8:d2:3f:5a:ec:5f:
-         48:80:55:e0:10:b9:67:8c:12:3c:a2:3b:6a:f6:47:8a:59:30:
-         f9:67:92:59:da:ed:1e:b7:30:ef:2d:bf:53:c2:dd:08:a1:e0:
-         fd:78:4e:fa:36:59:ca:53:f8:62:c1:c4:56:c1:56:73:74:8e:
-         c9:ca:07:14:5e:d4:be:be:b2:38:6a:d4:74:e5:60:7c:e7:d4:
-         8d:30:25:e2:da:85:c9:85:69:46:99:40:56:65:ca:40:59:59:
-         98:9c:18:04
+         34:75:8e:0a:28:46:43:e1:8f:d3:23:62:85:bc:e9:ea:2f:d2:
+         27:de:4b:03:6b:36:02:e0:aa:2a:33:4e:3c:5c:51:38:9e:9b:
+         9a:d9:0c:b3:73:75:c0:e4:d9:f1:cc:5c:fa:39:7a:a7:4b:1c:
+         88:51:72:6e:f6:c1:d8:75:64:2a:a1:16:99:1c:cb:c1:7f:be:
+         be:0b:62:25:13:96:3f:56:41:7e:cd:e2:05:fd:f8:06:fc:3d:
+         9f:b3:92:b2:7a:87:e0:b5:d5:50:8e:95:c3:3d:bf:78:28:01:
+         37:28:e7:d7:d5:67:99:4b:0d:23:93:04:7f:1b:11:c7:22:08:
+         c2:67:06:9b:bf:b0:d8:e2:c4:72:85:39:23:f4:46:77:20:ce:
+         72:f3:17:07:d9:e4:1d:53:0f:ea:c6:10:be:23:b7:25:06:c5:
+         bb:52:f7:f0:df:35:b0:37:9e:d2:94:26:85:e6:8a:ab:dc:e7:
+         6c:13:a5:7a:ad:01:c4:c3:7b:d7:24:39:2f:55:f4:92:52:2b:
+         74:46:d9:af:2a:01:40:5b:94:75:bc:c2:d1:d3:7e:4d:fd:36:
+         50:e5:8f:f3:54:17:3c:d8:b4:2c:e3:be:d9:0d:a3:e9:39:a9:
+         8a:26:dc:80:ab:fe:ce:f2:5c:29:4b:ea:98:55:44:25:93:36:
+         31:6e:24:d5
 -----BEGIN CERTIFICATE-----
-MIIDjDCCAnSgAwIBAgIBCDANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIDoTCCAomgAwIBAgIBCDANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyAMyrg7Ua/EnVjkvYq5W
-YHlXc4aJNYwHurXRVceo/JHXySBNk717XUBz0q9pkTtpSVhMu2+po7xRmxx9Bvpn
-P1AJnh5NCI8SChq+jCZFty1zLT7Y/jE/w0K9kEQrBX9TaFHvWYhsDn3jzXtlCF9/
-T4URC43OJ+Npfx0kbOoSbtBqEzHVjNT0sTrfIMv0HwVxbRfuNyjHuLDVWhLNfkBl
-+jNJxoO9uzcLO6cMxQuZ7bfSmrq6+NeMI+0SrayzKaNwcVxCe+VGjB+VDcwiJDrY
-TpFCHsmld8JJtwRonF67SOgbA90oaV8aQyt1D4bBsK+YuMgMpiol13NNhWPfdR85
-SwIDAQABo4HzMIHwMB0GA1UdDgQWBBRtFHCCa0oDRhu047G8QHj/eyhFVTAfBgNV
-HSMEGDAWgBRAkSghnZPznBgb/wCcsgigo4F9KjBUBggrBgEFBQcBAQRIMEYwHAYI
-KwYBBQUHMAKGEGZpbGU6Ly8vZGV2L251bGwwJgYIKwYBBQUHMAKGGmh0dHA6Ly91
-cmwtZm9yLWFpYTIvSTIuZm9vMCkGA1UdHwQiMCAwHqAcoBqGGGh0dHA6Ly91cmwt
-Zm9yLWNybC9JLmNybDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYBBQUH
-AwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQCQ3Z4emiBevN3qvjVtc16e
-F9cGkizWBT2lkFrwtVXWHtZ4jaqLlI8uaGQJcv+llWFJM3lnTR1TO1kWgrwbJwV+
-8kGACeCykoWg+jLymUnOY1rC9InQDzmhD7FhDP2nsdSPpLGaT9qB7EHuwVsbPt+O
-DxyqpmMPa+UKNqPhcjx0Sc0r6/XQyIfAIjpRe1g7bEtqcHS+HGhJe51i70ro0j9a
-7F9IgFXgELlnjBI8ojtq9keKWTD5Z5JZ2u0etzDvLb9Twt0IoeD9eE76NlnKU/hi
-wcRWwVZzdI7JygcUXtS+vrI4atR05WB859SNMCXi2oXJhWlGmUBWZcpAWVmYnBgE
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsk6OTuuHHJnyFF2w4LaD
+ARqnOQt9Ne/XT7J2hEa5EPta7QjtKjJBcss7KyUt5kQbBHHGWHONG6gf3VYPx0wd
+A5EB+qlD7ZWp8I4osu3yeITMmtLWXp5EvnApKdBEgJPuN3KMUqo6dlt0Rgk5IlHH
+knDXsSwfdNvmd/SyhBzYwf91SPtqpEPBywIH+dMaRlLHmmD27VofNoH+oFb5vd06
+SqegEwbGnNP0kuEP/i1BcAV9K+CLXvde/E1QDTa/NjVu7WbFDrhzmI59oYAfzTfJ
+RG3yGykG8FGQVS6g70NB5fv4WxbWpnAqJJs6otGF8zF/3FbvKM3M48oq4e14zFZX
+aQIDAQABo4IBBzCCAQMwHQYDVR0OBBYEFLVR9tNdJEPgEIWdTF/a62kAO7j+MB8G
+A1UdIwQYMBaAFIS6BQZOM50Rqnrxdx+kaX5MLdQ/MFQGCCsGAQUFBwEBBEgwRjAc
+BggrBgEFBQcwAoYQZmlsZTovLy9kZXYvbnVsbDAmBggrBgEFBQcwAoYaaHR0cDov
+L3VybC1mb3ItYWlhMi9JMi5mb28wKQYDVR0fBCIwIDAeoBygGoYYaHR0cDovL3Vy
+bC1mb3ItY3JsL0kuY3JsMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEF
+BQcDAQYIKwYBBQUHAwIwEQYDVR0RBAowCIIGdGFyZ2V0MA0GCSqGSIb3DQEBCwUA
+A4IBAQA0dY4KKEZD4Y/TI2KFvOnqL9In3ksDazYC4KoqM048XFE4npua2Qyzc3XA
+5NnxzFz6OXqnSxyIUXJu9sHYdWQqoRaZHMvBf76+C2IlE5Y/VkF+zeIF/fgG/D2f
+s5KyeofgtdVQjpXDPb94KAE3KOfX1WeZSw0jkwR/GxHHIgjCZwabv7DY4sRyhTkj
+9EZ3IM5y8xcH2eQdUw/qxhC+I7clBsW7Uvfw3zWwN57SlCaF5oqr3OdsE6V6rQHE
+w3vXJDkvVfSSUit0RtmvKgFAW5R1vMLR035N/TZQ5Y/zVBc82LQs477ZDaPpOamK
+JtyAq/7O8lwpS+qYVUQlkzYxbiTV
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_invalid_and_http_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_invalid_and_http_aia.pem
index ef2e666..b7669e01 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_invalid_and_http_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_invalid_and_http_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b3:04:b7:2a:7f:85:9a:b4:30:29:77:0b:50:c8:
-                    1f:b3:0d:98:9b:f7:4f:ab:32:79:11:fd:73:f7:c4:
-                    af:28:f8:c7:15:66:50:2e:26:ab:76:ca:72:f2:d9:
-                    7f:1a:ee:64:e8:f2:87:4f:8d:32:09:1d:e8:14:fc:
-                    18:c5:13:f5:d7:74:94:61:8b:5f:e0:67:0a:84:fa:
-                    8b:2c:7e:8d:47:5b:7e:91:98:ef:14:58:b0:77:07:
-                    c7:78:12:6c:e1:60:82:f4:fb:44:c3:64:7c:59:52:
-                    f7:bb:ca:a0:28:4e:da:a0:53:95:80:d5:fd:1f:a6:
-                    d7:8b:27:2a:f0:fc:67:e9:b2:c6:54:97:a2:9b:92:
-                    b6:4f:c1:c8:82:2b:a4:ff:2a:d0:c2:7c:83:8d:b2:
-                    0c:29:a1:d9:86:b2:a0:f1:8a:50:fa:e7:e6:a6:f0:
-                    fa:52:85:28:98:da:53:05:d8:62:1e:33:8a:c2:89:
-                    e3:e8:98:f1:64:1a:bc:8d:c0:90:54:7b:8d:c4:00:
-                    77:52:fe:14:f3:79:0f:34:e9:6f:b2:b0:e1:e1:e5:
-                    b5:77:71:c8:f3:cf:3e:38:4c:d4:b0:bf:aa:74:45:
-                    22:7e:18:23:ab:39:b0:a4:09:e3:35:73:8e:4e:91:
-                    b6:c1:77:4f:39:b6:e4:24:95:92:5b:0b:6e:3f:ee:
-                    f9:cf
+                    00:9d:3f:f0:25:34:e1:e0:c3:a7:5a:2b:72:6d:e1:
+                    35:3a:99:eb:b4:12:7b:aa:2b:bc:a6:df:82:01:b1:
+                    e9:8a:39:3a:b1:c5:0f:07:94:0a:97:c9:b0:4e:11:
+                    11:35:02:65:96:36:65:dc:6f:26:00:1e:1e:38:15:
+                    7c:ca:08:2b:66:89:a0:c3:38:ff:03:d5:e3:9d:c0:
+                    98:55:fb:45:d7:57:17:84:6c:6a:af:72:4f:1d:28:
+                    0c:95:77:35:dd:b1:42:66:96:bd:f9:ec:6e:d6:c3:
+                    c2:23:1d:c4:55:43:ae:b2:12:29:22:7b:33:5a:55:
+                    8f:d1:24:ce:e3:e1:b9:42:e4:18:ab:64:48:75:f7:
+                    4d:9e:cf:a0:b9:29:32:71:8c:2b:32:d6:5a:f3:c2:
+                    8d:25:2c:a6:db:d5:fe:b1:46:20:ed:92:be:3a:0f:
+                    93:e7:45:ba:36:80:33:36:0c:df:bd:d0:c9:82:db:
+                    51:96:33:f7:78:9e:b0:7b:4f:04:31:aa:2a:a8:1b:
+                    90:4f:dd:58:16:33:3a:09:4d:1e:c8:18:9f:62:bf:
+                    21:4d:89:eb:a6:0e:25:3b:ae:f0:78:1f:9a:de:bc:
+                    17:06:73:16:7f:49:3b:4c:b3:a8:9e:a3:8d:79:d6:
+                    de:6b:24:67:75:d3:f0:15:d0:91:a0:9c:ff:d7:fa:
+                    09:41
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                11:AD:0A:17:B2:9E:A2:12:F6:B2:82:F7:92:A9:01:AD:9C:D3:98:3B
+                6E:CC:5D:F5:E6:D9:A6:B7:8C:4B:CB:A4:A7:C5:70:66:DA:FA:0E:E6
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:foobar
@@ -50,40 +50,43 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         11:05:b5:d9:cd:93:1b:2e:e1:6a:71:d1:e1:a5:53:7f:b6:75:
-         6f:ac:4a:56:f9:1b:f0:cc:ef:5d:37:56:23:72:75:c5:bb:cb:
-         b7:3e:04:e3:e7:de:af:97:e1:6a:6e:86:f1:55:6b:42:95:a3:
-         16:fa:2f:38:cb:c0:0e:a9:eb:af:91:55:49:d6:65:21:25:83:
-         2a:50:06:68:c4:e7:2d:09:da:0b:8f:d1:ce:30:21:74:66:02:
-         17:3a:6c:5b:67:d7:20:64:69:a7:83:60:bb:08:9e:2f:ae:38:
-         9e:8e:83:9e:5a:24:a8:65:0f:9f:b0:bb:ae:db:4f:ba:b4:4e:
-         80:53:9e:4a:a7:23:ac:7f:db:f1:0e:8b:d9:7c:6c:bd:6c:8e:
-         b3:07:29:d8:9d:88:33:1f:40:ec:33:8b:a7:52:96:cf:e9:8d:
-         15:48:57:cb:77:df:bd:f5:31:ee:64:bc:55:89:48:1b:26:56:
-         73:a8:a5:88:fc:61:5f:d1:9a:28:0f:f7:69:88:0a:87:b0:a9:
-         ca:f4:e4:b2:31:11:b2:b2:15:88:7d:0c:8a:29:5a:ad:1a:29:
-         74:13:06:2f:45:c0:48:83:60:89:fd:8c:7f:a3:4d:9e:5d:1c:
-         a9:61:19:fd:d5:a0:7e:a3:b7:59:a6:bb:bd:72:f2:da:ea:0b:
-         05:05:56:e1
+         58:8b:4c:19:cb:8f:e1:77:47:86:03:f4:27:e8:2c:ff:e6:b3:
+         34:df:9c:97:90:d9:a2:f4:a6:ca:be:aa:0b:5a:03:84:c6:d2:
+         c0:ce:31:c5:8b:30:3a:48:9a:21:42:61:b6:21:96:90:b1:f7:
+         6e:8a:02:d5:fd:ba:2e:4e:22:12:0d:ad:b1:8d:4a:4b:16:ea:
+         86:8c:04:65:fd:9c:55:09:17:f2:cb:f3:b6:94:bc:c5:fb:8e:
+         f3:8c:d9:48:95:7f:b8:3d:50:f0:eb:20:fd:93:89:c6:21:09:
+         39:26:e2:68:d2:34:3f:27:d0:25:5f:b6:e4:7a:ff:8c:da:3c:
+         38:7c:f7:51:97:ad:83:3a:69:98:8b:8a:df:f8:ba:e7:0b:a2:
+         f6:eb:5d:c7:db:7d:8e:00:3c:ae:18:2b:66:77:50:9b:8c:d5:
+         2e:ef:15:e0:eb:da:de:78:78:73:d0:ba:bb:d8:2e:0a:03:f3:
+         05:7b:3b:bc:09:a1:4d:3c:f7:29:63:e1:f5:6b:2f:3c:45:a9:
+         9f:5b:6d:13:82:e6:e1:f1:c1:56:b3:bf:dd:ac:ef:ab:d1:f9:
+         de:dc:32:ce:50:2d:8c:b6:30:f9:13:f8:1f:a2:2e:ea:43:8c:
+         50:d8:d2:b1:a8:af:0a:c4:ef:4c:2f:61:3c:8c:af:34:a2:80:
+         d5:fe:21:2b
 -----BEGIN CERTIFICATE-----
-MIIDgjCCAmqgAwIBAgIBCTANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIDlTCCAn2gAwIBAgIBCTANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAswS3Kn+FmrQwKXcLUMgf
-sw2Ym/dPqzJ5Ef1z98SvKPjHFWZQLiardspy8tl/Gu5k6PKHT40yCR3oFPwYxRP1
-13SUYYtf4GcKhPqLLH6NR1t+kZjvFFiwdwfHeBJs4WCC9PtEw2R8WVL3u8qgKE7a
-oFOVgNX9H6bXiycq8Pxn6bLGVJeim5K2T8HIgiuk/yrQwnyDjbIMKaHZhrKg8YpQ
-+ufmpvD6UoUomNpTBdhiHjOKwonj6JjxZBq8jcCQVHuNxAB3Uv4U83kPNOlvsrDh
-4eW1d3HI888+OEzUsL+qdEUifhgjqzmwpAnjNXOOTpG2wXdPObbkJJWSWwtuP+75
-zwIDAQABo4HpMIHmMB0GA1UdDgQWBBQRrQoXsp6iEvaygveSqQGtnNOYOzAfBgNV
-HSMEGDAWgBRAkSghnZPznBgb/wCcsgigo4F9KjBKBggrBgEFBQcBAQQ+MDwwEgYI
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnT/wJTTh4MOnWitybeE1
+OpnrtBJ7qiu8pt+CAbHpijk6scUPB5QKl8mwThERNQJlljZl3G8mAB4eOBV8yggr
+Zomgwzj/A9XjncCYVftF11cXhGxqr3JPHSgMlXc13bFCZpa9+exu1sPCIx3EVUOu
+shIpInszWlWP0STO4+G5QuQYq2RIdfdNns+guSkycYwrMtZa88KNJSym29X+sUYg
+7ZK+Og+T50W6NoAzNgzfvdDJgttRljP3eJ6we08EMaoqqBuQT91YFjM6CU0eyBif
+Yr8hTYnrpg4lO67weB+a3rwXBnMWf0k7TLOonqONedbeayRnddPwFdCRoJz/1/oJ
+QQIDAQABo4H8MIH5MB0GA1UdDgQWBBRuzF315tmmt4xLy6SnxXBm2voO5jAfBgNV
+HSMEGDAWgBSEugUGTjOdEap68XcfpGl+TC3UPzBKBggrBgEFBQcBAQQ+MDwwEgYI
 KwYBBQUHMAKGBmZvb2JhcjAmBggrBgEFBQcwAoYaaHR0cDovL3VybC1mb3ItYWlh
 Mi9JMi5mb28wKQYDVR0fBCIwIDAeoBygGoYYaHR0cDovL3VybC1mb3ItY3JsL0ku
 Y3JsMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH
-AwIwDQYJKoZIhvcNAQELBQADggEBABEFtdnNkxsu4Wpx0eGlU3+2dW+sSlb5G/DM
-7103ViNydcW7y7c+BOPn3q+X4WpuhvFVa0KVoxb6LzjLwA6p66+RVUnWZSElgypQ
-BmjE5y0J2guP0c4wIXRmAhc6bFtn1yBkaaeDYLsIni+uOJ6Og55aJKhlD5+wu67b
-T7q0ToBTnkqnI6x/2/EOi9l8bL1sjrMHKdidiDMfQOwzi6dSls/pjRVIV8t33731
-Me5kvFWJSBsmVnOopYj8YV/RmigP92mICoewqcr05LIxEbKyFYh9DIopWq0aKXQT
-Bi9FwEiDYIn9jH+jTZ5dHKlhGf3VoH6jt1mmu71y8trqCwUFVuE=
+AwIwEQYDVR0RBAowCIIGdGFyZ2V0MA0GCSqGSIb3DQEBCwUAA4IBAQBYi0wZy4/h
+d0eGA/Qn6Cz/5rM035yXkNmi9KbKvqoLWgOExtLAzjHFizA6SJohQmG2IZaQsfdu
+igLV/bouTiISDa2xjUpLFuqGjARl/ZxVCRfyy/O2lLzF+47zjNlIlX+4PVDw6yD9
+k4nGIQk5JuJo0jQ/J9AlX7bkev+M2jw4fPdRl62DOmmYi4rf+LrnC6L2613H232O
+ADyuGCtmd1CbjNUu7xXg69reeHhz0Lq72C4KA/MFezu8CaFNPPcpY+H1ay88Ramf
+W20Tgubh8cFWs7/drO+r0fne3DLOUC2MtjD5E/gfoi7qQ4xQ2NKxqK8KxO9ML2E8
+jK80ooDV/iEr
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_invalid_url_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_invalid_url_aia.pem
index 2bf9b60..8b7b1a72d 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_invalid_url_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_invalid_url_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:a2:bc:d6:77:b0:d2:ca:cf:ec:a9:ae:5a:5d:88:
-                    50:50:12:9e:76:62:86:dc:61:78:d8:13:b3:e0:4f:
-                    a8:d3:54:57:b5:ce:bf:75:c7:56:27:d2:8e:61:9c:
-                    48:cb:3e:d2:bb:17:69:63:ca:eb:a4:56:bd:90:32:
-                    28:bb:0a:ae:9d:4d:60:40:16:3b:4c:ca:4e:da:55:
-                    d2:84:16:ae:c5:66:eb:bb:8b:3d:33:05:dc:e8:f3:
-                    db:4d:4f:87:5c:eb:11:28:bc:ed:c8:fe:9d:b1:8a:
-                    eb:c3:79:d0:e6:99:41:52:ec:68:97:48:78:4a:c3:
-                    e1:b6:ec:38:1e:38:5b:fe:1b:f5:b4:76:94:d0:f3:
-                    89:50:da:97:0b:f3:5e:86:bd:26:72:de:bb:41:92:
-                    a4:a1:bf:77:55:aa:b1:f3:95:6f:c2:ac:bf:ad:8a:
-                    a6:c4:2b:5e:ed:55:55:a6:c4:fe:6c:68:dd:ea:54:
-                    3f:46:b2:98:e7:fa:54:fa:be:65:7a:5f:4f:c8:45:
-                    d4:5d:7b:a0:56:35:83:d8:f0:e9:7f:63:0f:87:b6:
-                    82:bc:2f:53:5d:01:f2:94:bf:12:37:84:e6:a0:63:
-                    8c:8a:bc:a1:c9:1f:3c:1e:fb:95:60:41:47:bf:60:
-                    1a:f3:7c:99:7d:66:75:99:5d:c2:ca:53:c1:8b:99:
-                    59:37
+                    00:d8:3c:a7:4c:90:77:93:ce:72:3b:a5:61:af:f1:
+                    fd:2f:72:2e:3f:37:2c:7d:94:45:c7:c9:7e:b4:26:
+                    65:2b:d3:42:fb:89:bb:b0:a1:68:e8:4f:4d:c3:dd:
+                    b8:3c:ad:ec:0d:1b:f9:e9:ba:99:f5:74:26:11:2e:
+                    62:e1:e9:4a:d9:07:e3:82:dc:44:66:53:83:bd:aa:
+                    08:4c:9c:14:fa:3f:80:ba:b0:10:48:2d:59:73:cb:
+                    22:65:42:1c:68:c4:9d:fb:94:75:5f:84:11:61:7c:
+                    10:08:a8:48:04:99:75:8a:d2:5e:89:16:0c:04:62:
+                    e2:ae:23:7c:b1:cb:ce:f8:eb:a5:a4:32:66:83:0d:
+                    9e:a7:7c:40:5f:41:c9:e6:63:d0:a6:8b:94:4b:aa:
+                    25:38:db:46:d9:16:14:dd:a0:29:16:99:a8:f4:0a:
+                    87:58:71:3d:b4:a7:e3:d1:10:0e:96:b2:70:fb:59:
+                    09:22:e8:19:9f:c2:1d:11:c6:26:dc:1c:3d:4d:52:
+                    13:c8:3e:38:c8:7e:90:0f:9b:d0:60:03:6b:19:f6:
+                    71:6a:22:a1:1f:00:c5:63:19:36:a3:db:da:6c:b2:
+                    b8:fe:a9:1c:37:19:00:ce:03:60:58:6e:da:cd:31:
+                    7e:ee:69:06:12:36:c4:11:66:53:a2:14:9b:75:af:
+                    eb:2f
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                09:96:BA:42:0D:69:29:BC:6A:FB:3C:58:30:08:12:31:BF:5B:C0:CB
+                43:35:C7:A5:6B:23:40:8A:30:33:E2:B1:4E:51:18:C8:EC:3A:79:F3
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:foobar
@@ -49,39 +49,42 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         40:71:3c:29:92:1a:64:8e:7f:5b:3f:89:2f:33:b6:5f:9f:a7:
-         de:3a:c8:30:97:4d:67:96:c1:28:e0:7e:49:bb:07:05:09:d3:
-         47:62:4f:79:8b:e7:12:ad:59:ff:84:4f:e8:a8:49:99:93:47:
-         e8:14:85:ff:dc:de:4c:e7:e5:69:c8:3c:93:5f:11:d1:0b:e0:
-         98:e3:41:5b:25:5a:90:dd:c1:ce:d9:5c:de:fb:0a:74:fc:fd:
-         52:49:55:cc:cc:85:f3:00:e9:48:5f:72:06:8e:82:4d:54:62:
-         d2:fe:a3:8c:6d:87:6e:30:d7:26:34:d2:db:ec:cf:7e:e6:38:
-         0c:b0:c9:0b:16:09:e1:15:3d:ed:63:87:9d:63:a6:3f:78:29:
-         1a:71:c0:6e:c4:0c:9f:ad:3f:29:0a:7d:7f:3a:09:36:ee:1f:
-         4e:9f:d9:95:0f:c9:21:e4:92:ae:eb:76:bb:b9:41:ca:e3:86:
-         92:54:c7:48:c9:89:d5:0a:5a:f4:b0:48:8a:ef:bd:99:03:dd:
-         93:bc:22:ee:97:78:79:3a:1e:d1:2c:b2:d7:59:d6:79:a3:f9:
-         28:47:e8:9a:fe:21:4b:f4:d8:a7:8b:de:9a:49:d6:6b:86:2c:
-         8f:ad:76:70:e1:f2:12:ad:26:85:c4:4a:d5:48:58:61:fa:79:
-         42:9c:03:6f
+         1b:31:59:4e:06:a8:af:82:35:d2:5f:30:33:ed:8c:58:79:ef:
+         80:fd:b4:e8:ac:45:2a:ed:b8:cf:a7:37:7e:c7:f6:d3:ea:8d:
+         f1:eb:38:87:16:5e:d8:62:0b:56:a1:37:74:18:c3:85:bd:79:
+         c6:9c:06:57:4a:60:3a:d3:17:db:60:4b:f2:19:ff:54:38:04:
+         7a:2b:f1:b6:f7:47:d1:71:51:22:cf:de:b2:14:9b:e4:66:f2:
+         cf:be:98:10:77:1d:8e:f5:7b:51:fe:ca:33:0d:8d:24:d4:be:
+         8f:96:3d:67:0e:ad:b0:3c:28:13:58:05:fd:23:9c:0f:fe:1b:
+         d6:8a:42:e6:c7:ad:c5:66:ca:4a:16:6e:d3:3c:4c:f5:a6:76:
+         7e:68:51:38:af:1c:75:9c:ac:f1:14:5e:11:47:b0:ea:e8:8c:
+         00:2d:00:7e:be:e8:30:e1:16:47:3e:93:6b:e5:30:19:2e:98:
+         56:d0:7f:0f:48:6f:82:59:e5:38:e5:96:15:36:75:94:a1:e8:
+         ce:22:91:0f:32:f1:6c:a2:ed:c4:72:14:51:90:3d:3b:73:cd:
+         12:02:1d:a0:b3:fe:14:e5:ac:b5:b1:3c:18:99:5d:de:2e:fc:
+         3c:e4:9a:1f:ff:65:96:6b:48:2b:dd:d8:c2:d7:a8:5c:85:91:
+         f8:1f:22:a4
 -----BEGIN CERTIFICATE-----
-MIIDWjCCAkKgAwIBAgIBBzANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIDbTCCAlWgAwIBAgIBBzANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAorzWd7DSys/sqa5aXYhQ
-UBKedmKG3GF42BOz4E+o01RXtc6/dcdWJ9KOYZxIyz7SuxdpY8rrpFa9kDIouwqu
-nU1gQBY7TMpO2lXShBauxWbru4s9MwXc6PPbTU+HXOsRKLztyP6dsYrrw3nQ5plB
-Uuxol0h4SsPhtuw4Hjhb/hv1tHaU0POJUNqXC/Nehr0mct67QZKkob93Vaqx85Vv
-wqy/rYqmxCte7VVVpsT+bGjd6lQ/RrKY5/pU+r5lel9PyEXUXXugVjWD2PDpf2MP
-h7aCvC9TXQHylL8SN4TmoGOMiryhyR88HvuVYEFHv2Aa83yZfWZ1mV3CylPBi5lZ
-NwIDAQABo4HBMIG+MB0GA1UdDgQWBBQJlrpCDWkpvGr7PFgwCBIxv1vAyzAfBgNV
-HSMEGDAWgBRAkSghnZPznBgb/wCcsgigo4F9KjAiBggrBgEFBQcBAQQWMBQwEgYI
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2DynTJB3k85yO6Vhr/H9
+L3IuPzcsfZRFx8l+tCZlK9NC+4m7sKFo6E9Nw924PK3sDRv56bqZ9XQmES5i4elK
+2QfjgtxEZlODvaoITJwU+j+AurAQSC1Zc8siZUIcaMSd+5R1X4QRYXwQCKhIBJl1
+itJeiRYMBGLiriN8scvO+OulpDJmgw2ep3xAX0HJ5mPQpouUS6olONtG2RYU3aAp
+Fpmo9AqHWHE9tKfj0RAOlrJw+1kJIugZn8IdEcYm3Bw9TVITyD44yH6QD5vQYANr
+GfZxaiKhHwDFYxk2o9vabLK4/qkcNxkAzgNgWG7azTF+7mkGEjbEEWZTohSbda/r
+LwIDAQABo4HUMIHRMB0GA1UdDgQWBBRDNcelayNAijAz4rFOURjI7Dp58zAfBgNV
+HSMEGDAWgBSEugUGTjOdEap68XcfpGl+TC3UPzAiBggrBgEFBQcBAQQWMBQwEgYI
 KwYBBQUHMAKGBmZvb2JhcjApBgNVHR8EIjAgMB6gHKAahhhodHRwOi8vdXJsLWZv
 ci1jcmwvSS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQWMBQGCCsGAQUFBwMB
-BggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAQHE8KZIaZI5/Wz+JLzO2X5+n
-3jrIMJdNZ5bBKOB+SbsHBQnTR2JPeYvnEq1Z/4RP6KhJmZNH6BSF/9zeTOflacg8
-k18R0QvgmONBWyVakN3Bztlc3vsKdPz9UklVzMyF8wDpSF9yBo6CTVRi0v6jjG2H
-bjDXJjTS2+zPfuY4DLDJCxYJ4RU97WOHnWOmP3gpGnHAbsQMn60/KQp9fzoJNu4f
-Tp/ZlQ/JIeSSrut2u7lByuOGklTHSMmJ1Qpa9LBIiu+9mQPdk7wi7pd4eToe0Syy
-11nWeaP5KEfomv4hS/TYp4vemknWa4Ysj612cOHyEq0mhcRK1UhYYfp5QpwDbw==
+BggrBgEFBQcDAjARBgNVHREECjAIggZ0YXJnZXQwDQYJKoZIhvcNAQELBQADggEB
+ABsxWU4GqK+CNdJfMDPtjFh574D9tOisRSrtuM+nN37H9tPqjfHrOIcWXthiC1ah
+N3QYw4W9ecacBldKYDrTF9tgS/IZ/1Q4BHor8bb3R9FxUSLP3rIUm+Rm8s++mBB3
+HY71e1H+yjMNjSTUvo+WPWcOrbA8KBNYBf0jnA/+G9aKQubHrcVmykoWbtM8TPWm
+dn5oUTivHHWcrPEUXhFHsOrojAAtAH6+6DDhFkc+k2vlMBkumFbQfw9Ib4JZ5Tjl
+lhU2dZSh6M4ikQ8y8Wyi7cRyFFGQPTtzzRICHaCz/hTlrLWxPBiZXd4u/Dzkmh//
+ZZZrSCvd2MLXqFyFkfgfIqQ=
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_no_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_no_aia.pem
index e1279a4..a98b38cb 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_no_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_no_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b3:43:32:88:c1:3b:65:14:01:c1:e3:e7:52:74:
-                    40:83:65:0d:97:4a:0a:64:60:86:72:b8:89:99:da:
-                    f9:ab:21:74:ce:f8:89:f7:34:d8:4c:51:34:3d:56:
-                    1a:a2:fb:90:55:5a:62:e3:ab:16:3b:a8:8f:cd:f7:
-                    43:5a:e9:f0:1c:d5:38:a6:f7:e0:26:11:d7:bb:01:
-                    74:88:a6:e2:86:57:a0:78:ac:d4:1e:01:c6:4b:08:
-                    f7:d3:02:6f:fa:3d:7b:6f:ca:7b:1d:ae:44:59:e2:
-                    86:4a:34:5b:e2:18:c9:fd:f9:a4:39:4e:e0:2a:41:
-                    4e:86:f3:d5:9b:0c:00:a7:b5:81:92:e2:44:56:9d:
-                    02:66:e6:50:02:02:44:b4:5f:02:ac:ae:50:12:75:
-                    7e:62:7e:b7:44:17:e1:e2:43:f7:1a:03:31:84:86:
-                    8a:63:4f:76:73:49:92:ab:8e:61:78:4c:a2:c5:53:
-                    a7:c4:c1:91:20:08:45:fd:4d:97:1f:65:20:d4:e5:
-                    e8:db:67:2c:7b:aa:dd:98:de:d8:3b:0e:af:09:52:
-                    17:af:d8:21:67:08:1d:df:ad:41:f1:62:f2:6e:8e:
-                    f7:0b:80:a8:d4:29:7b:5f:87:e0:a1:96:e3:60:98:
-                    5f:c1:63:b8:eb:01:9d:b7:51:30:01:bd:1b:a7:7e:
-                    be:ad
+                    00:bc:7b:d4:48:5a:3b:ab:be:72:da:b4:1d:81:4d:
+                    42:5b:82:82:c2:10:11:36:b9:59:00:88:18:bd:99:
+                    a2:f0:40:cb:ae:bb:99:81:66:a3:45:ee:cd:da:f1:
+                    83:91:1b:5a:65:33:86:6e:ed:15:eb:54:a9:20:17:
+                    2b:1e:13:fe:69:a0:6c:72:a5:ca:be:2f:d3:d5:14:
+                    2a:91:d5:08:bd:6b:26:e8:a4:a8:19:97:b3:1f:28:
+                    6f:59:54:dc:65:61:34:05:fe:67:80:d3:63:9d:a5:
+                    e7:a2:e0:aa:12:e6:d0:77:ff:72:27:84:23:fa:18:
+                    00:85:e3:fc:66:0b:99:31:0e:a2:fd:c8:ca:cc:64:
+                    da:14:27:b3:9e:cf:a6:10:0a:5a:29:1a:29:b8:6a:
+                    b5:a1:fe:89:ae:51:e7:f2:5b:ab:7f:c6:37:51:44:
+                    81:30:3a:35:e2:28:a8:7f:4b:7a:c8:a3:c9:13:11:
+                    23:de:4a:4b:52:41:cb:64:81:13:1b:d2:ac:cd:c5:
+                    a0:96:b6:a2:c7:f7:55:06:cb:fd:64:be:e1:22:b3:
+                    a0:bd:77:46:be:1e:eb:ea:cd:de:af:a5:89:13:82:
+                    55:12:b8:c4:6b:01:33:69:32:21:18:c3:1c:01:1b:
+                    09:2b:a4:cb:80:23:15:3b:26:ea:c3:01:59:8c:a2:
+                    35:c3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                B7:FF:6C:44:69:C6:FE:C3:8B:69:5F:60:FB:BC:5D:76:FE:50:D3:1A
+                D2:58:5E:31:E6:B5:6D:8F:58:B6:D0:DA:C1:4D:38:43:9A:D3:C1:7A
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             X509v3 CRL Distribution Points: 
 
@@ -46,39 +46,41 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         76:cf:2a:df:5e:f3:e8:b2:b2:13:c6:59:a2:98:4e:46:42:48:
-         9a:a4:5e:d1:3a:c9:5b:4d:4f:69:74:ca:26:af:43:79:52:5c:
-         7d:13:7f:ba:1e:0c:1a:47:6d:72:89:8c:5b:2d:11:de:3f:df:
-         20:3d:32:94:9a:34:87:b6:e1:93:ae:73:98:31:c7:40:b4:ad:
-         95:97:e5:2a:f8:17:c2:2e:a3:ac:7c:d6:a6:db:66:1c:1f:85:
-         ae:7b:e8:cd:d4:95:27:16:80:b0:d8:4c:e9:02:40:61:89:7f:
-         58:40:7e:0d:74:cc:f3:d4:98:f9:eb:18:b9:12:78:17:22:f0:
-         13:aa:0f:1b:c4:12:fc:77:9d:ef:cb:12:e5:99:aa:03:76:ff:
-         41:07:20:3c:3f:5f:cb:de:a4:9c:6f:a0:eb:83:84:d2:32:1b:
-         c9:ee:e8:30:9b:a9:d9:2d:57:72:e0:a1:b1:f2:94:82:fe:8f:
-         05:6d:52:c4:17:96:14:79:be:22:85:27:78:6e:25:fb:56:3c:
-         34:d5:8b:a5:e5:f8:2d:31:6a:d5:fc:7c:e6:9d:8b:fc:d8:42:
-         24:c3:b7:67:99:8a:46:fb:f0:a3:74:fd:eb:71:94:a4:31:b3:
-         94:b1:90:c4:42:04:32:56:0c:c6:70:b0:bd:22:ce:1f:95:f1:
-         25:80:ac:8e
+         59:c0:18:ae:e6:ec:1d:a0:df:9c:07:d9:94:1b:a1:dd:22:14:
+         8f:6f:2c:17:e3:cd:b8:83:17:aa:6d:34:d5:3f:3b:6d:ab:6d:
+         fe:c0:9d:c6:d9:1b:77:32:8b:0d:4e:4f:64:d5:49:c5:71:08:
+         1e:a2:87:0f:28:27:6e:a5:b9:a1:02:da:c4:b7:a8:49:dd:ce:
+         b2:39:67:67:e8:ee:f0:bf:83:bb:0f:21:9f:a2:62:53:1e:7f:
+         a0:84:8a:1b:c4:62:98:06:4d:5d:6b:3f:55:5b:71:e3:4c:fc:
+         6b:4d:38:ed:f7:84:11:26:86:58:2e:7a:1d:4c:8f:30:ea:ab:
+         5d:55:44:2a:ae:35:42:16:bc:c9:ee:88:6c:9f:79:f5:f2:a0:
+         c2:5b:e7:c0:fb:01:11:50:0c:1d:ea:62:79:79:59:cd:34:4b:
+         60:9f:cf:4c:66:eb:8f:28:52:54:ff:6a:df:12:ab:c3:35:8b:
+         31:4d:9e:bc:02:c0:87:5e:ff:80:1f:ba:b4:a4:22:89:2f:ae:
+         f4:fb:07:86:9d:72:b3:36:ac:9e:95:e0:6b:a2:67:54:ef:90:
+         f0:c8:81:92:0d:4e:a4:7f:2b:bb:3e:5e:6c:ed:cf:45:20:76:
+         ab:07:b5:07:48:8d:33:08:a1:89:b8:5f:f8:33:e7:31:42:4a:
+         4f:6e:59:18
 -----BEGIN CERTIFICATE-----
-MIIDNjCCAh6gAwIBAgIBAjANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIDSTCCAjGgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAs0MyiME7ZRQBwePnUnRA
-g2UNl0oKZGCGcriJmdr5qyF0zviJ9zTYTFE0PVYaovuQVVpi46sWO6iPzfdDWunw
-HNU4pvfgJhHXuwF0iKbihlegeKzUHgHGSwj30wJv+j17b8p7Ha5EWeKGSjRb4hjJ
-/fmkOU7gKkFOhvPVmwwAp7WBkuJEVp0CZuZQAgJEtF8CrK5QEnV+Yn63RBfh4kP3
-GgMxhIaKY092c0mSq45heEyixVOnxMGRIAhF/U2XH2Ug1OXo22cse6rdmN7YOw6v
-CVIXr9ghZwgd361B8WLybo73C4Co1Cl7X4fgoZbjYJhfwWO46wGdt1EwAb0bp36+
-rQIDAQABo4GdMIGaMB0GA1UdDgQWBBS3/2xEacb+w4tpX2D7vF12/lDTGjAfBgNV
-HSMEGDAWgBRAkSghnZPznBgb/wCcsgigo4F9KjApBgNVHR8EIjAgMB6gHKAahhho
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHvUSFo7q75y2rQdgU1C
+W4KCwhARNrlZAIgYvZmi8EDLrruZgWajRe7N2vGDkRtaZTOGbu0V61SpIBcrHhP+
+aaBscqXKvi/T1RQqkdUIvWsm6KSoGZezHyhvWVTcZWE0Bf5ngNNjnaXnouCqEubQ
+d/9yJ4Qj+hgAheP8ZguZMQ6i/cjKzGTaFCezns+mEApaKRopuGq1of6JrlHn8lur
+f8Y3UUSBMDo14iiof0t6yKPJExEj3kpLUkHLZIETG9KszcWglraix/dVBsv9ZL7h
+IrOgvXdGvh7r6s3er6WJE4JVErjEawEzaTIhGMMcARsJK6TLgCMVOybqwwFZjKI1
+wwIDAQABo4GwMIGtMB0GA1UdDgQWBBTSWF4x5rVtj1i20NrBTThDmtPBejAfBgNV
+HSMEGDAWgBSEugUGTjOdEap68XcfpGl+TC3UPzApBgNVHR8EIjAgMB6gHKAahhho
 dHRwOi8vdXJsLWZvci1jcmwvSS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
-MBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEAds8q317z
-6LKyE8ZZophORkJImqRe0TrJW01PaXTKJq9DeVJcfRN/uh4MGkdtcomMWy0R3j/f
-ID0ylJo0h7bhk65zmDHHQLStlZflKvgXwi6jrHzWpttmHB+FrnvozdSVJxaAsNhM
-6QJAYYl/WEB+DXTM89SY+esYuRJ4FyLwE6oPG8QS/Hed78sS5ZmqA3b/QQcgPD9f
-y96knG+g64OE0jIbye7oMJup2S1XcuChsfKUgv6PBW1SxBeWFHm+IoUneG4l+1Y8
-NNWLpeX4LTFq1fx85p2L/NhCJMO3Z5mKRvvwo3T963GUpDGzlLGQxEIEMlYMxnCw
-vSLOH5XxJYCsjg==
+MBQGCCsGAQUFBwMBBggrBgEFBQcDAjARBgNVHREECjAIggZ0YXJnZXQwDQYJKoZI
+hvcNAQELBQADggEBAFnAGK7m7B2g35wH2ZQbod0iFI9vLBfjzbiDF6ptNNU/O22r
+bf7AncbZG3cyiw1OT2TVScVxCB6ihw8oJ26luaEC2sS3qEndzrI5Z2fo7vC/g7sP
+IZ+iYlMef6CEihvEYpgGTV1rP1VbceNM/GtNOO33hBEmhlgueh1MjzDqq11VRCqu
+NUIWvMnuiGyfefXyoMJb58D7ARFQDB3qYnl5Wc00S2Cfz0xm648oUlT/at8Sq8M1
+izFNnrwCwIde/4AfurSkIokvrvT7B4adcrM2rJ6V4GuiZ1TvkPDIgZINTqR/K7s+
+Xmztz0UgdqsHtQdIjTMIoYm4X/gz5zFCSk9uWRg=
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_one_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_one_aia.pem
index c89862f7..32c4655 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_one_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_one_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ba:f4:30:40:ee:e8:c3:44:66:c1:07:f4:27:30:
-                    bc:76:aa:df:c1:f9:84:f8:2d:60:d8:a3:96:8c:9e:
-                    e6:9d:ea:d9:98:dc:64:01:3e:ae:9f:82:23:52:64:
-                    60:75:98:9c:2d:ea:55:a3:80:42:be:31:9d:51:49:
-                    a6:ea:e3:9d:a8:cc:89:93:36:3a:a3:33:5c:56:e9:
-                    4b:f0:cf:81:bd:5e:52:05:44:34:ad:25:af:61:b5:
-                    da:d5:30:e9:18:e0:23:64:1c:08:d2:8f:43:8f:84:
-                    3b:62:7e:2e:e8:71:8a:0b:9a:4d:0e:20:90:14:77:
-                    40:83:39:92:93:66:44:7f:c9:94:e0:ba:7b:82:95:
-                    4d:bf:3a:72:8f:00:4c:62:dc:72:a7:43:43:53:0b:
-                    bb:52:b5:3f:42:5b:3b:6a:89:a2:ed:c9:27:0b:49:
-                    74:51:da:0e:53:72:87:7c:4c:30:26:a4:ca:53:59:
-                    8e:4f:75:b7:c8:1e:7b:77:35:d8:5e:f7:9f:f4:1b:
-                    77:31:19:4f:4b:f9:1f:e6:c0:84:9c:21:b0:5f:1d:
-                    5e:24:14:35:ee:80:98:8d:eb:77:06:6f:27:61:fc:
-                    ac:3b:99:f5:d9:86:85:ee:e1:79:90:62:05:b6:58:
-                    a2:9e:31:34:d7:b9:38:39:3b:91:92:37:de:68:e0:
-                    4b:85
+                    00:e6:20:5f:6c:8f:17:bb:ad:da:b9:19:22:1e:19:
+                    dc:04:47:cd:0b:e9:72:33:6f:5e:c6:91:aa:7e:6e:
+                    8b:9a:9d:6a:41:47:3f:67:8e:da:bf:ec:76:d9:e7:
+                    91:58:9a:9a:ab:b5:47:5f:90:c1:c3:31:de:ae:17:
+                    09:b4:6a:b9:07:1a:82:a1:0a:76:df:69:91:5a:01:
+                    ed:ec:bd:1f:cc:9e:c5:27:54:1d:48:f5:16:e0:11:
+                    3d:f0:8c:a6:91:ec:41:35:c0:ea:5f:61:d8:14:a5:
+                    b5:48:7a:fd:fd:f8:9e:30:50:bb:73:70:4b:bb:52:
+                    a8:73:18:90:75:3a:1d:42:7b:d7:0c:26:fd:83:26:
+                    43:47:f6:a8:2e:46:6d:01:96:2d:12:5a:d7:ec:cb:
+                    46:fe:22:c1:3c:a0:8b:43:d6:92:be:ba:0c:05:01:
+                    59:0d:ea:32:ee:d2:fe:63:76:17:f4:a4:c3:74:85:
+                    1e:2f:15:fe:01:b8:1a:27:4f:96:20:55:c2:6e:a4:
+                    b0:3e:ef:ac:07:b9:2f:e3:55:1b:1f:ab:2d:5d:aa:
+                    fc:95:85:9f:ee:e3:25:ee:df:b3:3a:2f:69:04:bb:
+                    e7:37:54:56:3a:02:d2:12:79:05:56:a5:03:3c:47:
+                    f0:12:56:3d:3b:ff:f3:28:8f:73:96:93:38:21:5f:
+                    98:3b
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                F4:04:58:42:C7:F3:33:C8:D7:AE:12:EC:87:E9:98:48:2D:E9:33:1E
+                EF:EB:BB:51:07:08:E2:B1:D5:35:CC:96:47:4C:E6:3E:00:0D:8C:AE
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/I.cer
@@ -49,40 +49,42 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         0f:eb:81:92:ea:ac:d4:ac:84:d7:a2:b0:b0:55:78:47:37:af:
-         e5:0d:97:a6:ff:67:ff:e7:3b:71:8b:0d:67:84:b5:d2:4f:8f:
-         5f:2b:26:f7:92:66:1d:8a:5d:b6:25:24:6f:84:2f:bc:ea:30:
-         1d:f8:34:84:12:ea:69:05:76:d5:61:dd:eb:d3:70:3b:68:58:
-         87:f9:c6:cf:04:6e:8a:e5:02:94:39:9d:a1:45:50:92:00:20:
-         98:d6:6f:a4:45:08:83:f8:3a:f0:67:aa:67:01:79:c9:bc:89:
-         8e:77:68:15:20:00:d0:3d:80:d4:c4:e1:7a:73:cd:16:18:bd:
-         7c:a4:5c:2f:5c:c9:d7:2e:63:e8:38:63:b5:f4:6a:11:c9:1f:
-         8e:3b:44:9a:51:d0:d8:8d:a6:33:ab:12:4c:76:27:36:67:ec:
-         15:2e:93:79:e5:33:b5:7a:74:c6:ac:c2:82:79:4f:cf:96:79:
-         20:81:4f:aa:12:25:03:9c:0c:45:83:65:5e:45:e1:01:00:a2:
-         b7:a4:27:00:4f:ad:c1:2a:e6:66:46:16:44:0e:9d:c4:32:73:
-         72:ae:f9:2b:d9:71:0a:d6:ca:56:a8:9b:8b:c2:44:b5:fe:48:
-         54:c9:b8:60:d8:5d:c2:2f:2c:34:73:66:54:5c:c3:c9:8d:c6:
-         c7:a8:76:d8
+         91:15:64:f2:07:45:63:3c:8b:07:28:31:76:22:df:a1:1e:cd:
+         a0:a1:8f:9c:62:99:f2:22:f6:22:fb:e4:74:ef:77:17:50:16:
+         05:99:46:c5:79:66:19:62:ea:57:38:0c:f2:0d:55:2a:95:7e:
+         10:4f:b4:a9:3a:c7:61:af:37:cd:b5:70:85:c0:9e:db:3a:ca:
+         70:96:ca:2c:7f:e6:c4:47:f3:42:ae:c3:64:14:31:23:4e:7d:
+         24:9b:23:6d:87:69:02:b9:1f:1c:e0:b6:8d:e5:ad:5c:13:f4:
+         9f:a3:d8:3b:08:48:24:e5:df:bf:15:03:a4:5a:c7:8d:39:1c:
+         6d:1c:45:db:3c:ac:63:39:71:fd:33:4c:b7:3c:ec:5c:de:c8:
+         a5:41:d9:75:52:c9:45:cc:b7:fa:14:9f:ba:d1:04:aa:9d:ea:
+         23:93:e2:c6:35:33:e8:f8:2e:6a:13:e5:ce:f0:ed:8a:b0:5b:
+         31:1a:56:91:15:2a:d8:e6:d4:bb:70:91:9d:8d:37:53:09:9a:
+         af:af:84:67:2c:59:c3:2e:da:56:a6:1f:9b:75:c6:80:b0:f4:
+         95:a7:78:15:e3:b5:e9:06:f9:01:63:5b:bf:2f:dd:ff:65:b9:
+         cc:9b:90:a6:de:90:e3:32:f7:48:bf:3b:fa:a0:c3:98:15:58:
+         53:ad:ad:28
 -----BEGIN CERTIFICATE-----
-MIIDbDCCAlSgAwIBAgIBATANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIDfzCCAmegAwIBAgIBATANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuvQwQO7ow0RmwQf0JzC8
-dqrfwfmE+C1g2KOWjJ7mnerZmNxkAT6un4IjUmRgdZicLepVo4BCvjGdUUmm6uOd
-qMyJkzY6ozNcVulL8M+BvV5SBUQ0rSWvYbXa1TDpGOAjZBwI0o9Dj4Q7Yn4u6HGK
-C5pNDiCQFHdAgzmSk2ZEf8mU4Lp7gpVNvzpyjwBMYtxyp0NDUwu7UrU/Qls7aomi
-7cknC0l0UdoOU3KHfEwwJqTKU1mOT3W3yB57dzXYXvef9Bt3MRlPS/kf5sCEnCGw
-Xx1eJBQ17oCYjet3Bm8nYfysO5n12YaF7uF5kGIFtliinjE017k4OTuRkjfeaOBL
-hQIDAQABo4HTMIHQMB0GA1UdDgQWBBT0BFhCx/MzyNeuEuyH6ZhILekzHjAfBgNV
-HSMEGDAWgBRAkSghnZPznBgb/wCcsgigo4F9KjA0BggrBgEFBQcBAQQoMCYwJAYI
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5iBfbI8Xu63auRkiHhnc
+BEfNC+lyM29expGqfm6Lmp1qQUc/Z47av+x22eeRWJqaq7VHX5DBwzHerhcJtGq5
+BxqCoQp232mRWgHt7L0fzJ7FJ1QdSPUW4BE98IymkexBNcDqX2HYFKW1SHr9/fie
+MFC7c3BLu1KocxiQdTodQnvXDCb9gyZDR/aoLkZtAZYtElrX7MtG/iLBPKCLQ9aS
+vroMBQFZDeoy7tL+Y3YX9KTDdIUeLxX+AbgaJ0+WIFXCbqSwPu+sB7kv41UbH6st
+Xar8lYWf7uMl7t+zOi9pBLvnN1RWOgLSEnkFVqUDPEfwElY9O//zKI9zlpM4IV+Y
+OwIDAQABo4HmMIHjMB0GA1UdDgQWBBTv67tRBwjisdU1zJZHTOY+AA2MrjAfBgNV
+HSMEGDAWgBSEugUGTjOdEap68XcfpGl+TC3UPzA0BggrBgEFBQcBAQQoMCYwJAYI
 KwYBBQUHMAKGGGh0dHA6Ly91cmwtZm9yLWFpYS9JLmNlcjApBgNVHR8EIjAgMB6g
 HKAahhhodHRwOi8vdXJsLWZvci1jcmwvSS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0G
-A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjANBgkqhkiG9w0BAQsFAAOCAQEA
-D+uBkuqs1KyE16KwsFV4Rzev5Q2Xpv9n/+c7cYsNZ4S10k+PXysm95JmHYpdtiUk
-b4QvvOowHfg0hBLqaQV21WHd69NwO2hYh/nGzwRuiuUClDmdoUVQkgAgmNZvpEUI
-g/g68GeqZwF5ybyJjndoFSAA0D2A1MThenPNFhi9fKRcL1zJ1y5j6DhjtfRqEckf
-jjtEmlHQ2I2mM6sSTHYnNmfsFS6TeeUztXp0xqzCgnlPz5Z5IIFPqhIlA5wMRYNl
-XkXhAQCit6QnAE+twSrmZkYWRA6dxDJzcq75K9lxCtbKVqibi8JEtf5IVMm4YNhd
-wi8sNHNmVFzDyY3Gx6h22A==
+A1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjARBgNVHREECjAIggZ0YXJnZXQw
+DQYJKoZIhvcNAQELBQADggEBAJEVZPIHRWM8iwcoMXYi36EezaChj5ximfIi9iL7
+5HTvdxdQFgWZRsV5Zhli6lc4DPINVSqVfhBPtKk6x2GvN821cIXAnts6ynCWyix/
+5sRH80Kuw2QUMSNOfSSbI22HaQK5Hxzgto3lrVwT9J+j2DsISCTl378VA6Rax405
+HG0cRds8rGM5cf0zTLc87FzeyKVB2XVSyUXMt/oUn7rRBKqd6iOT4sY1M+j4LmoT
+5c7w7YqwWzEaVpEVKtjm1LtwkZ2NN1MJmq+vhGcsWcMu2lamH5t1xoCw9JWneBXj
+tekG+QFjW78v3f9lucybkKbekOMy90i/O/qgw5gVWFOtrSg=
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_six_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_six_aia.pem
index 1ded810f..f18af2db 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_six_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_six_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b2:52:ee:94:90:a8:1a:32:bb:4f:64:17:a6:31:
-                    ab:08:09:91:ef:ec:ad:0a:e9:fb:5b:fa:6a:1f:e6:
-                    68:2f:53:8b:04:74:32:75:9d:bc:fd:b3:c9:a2:ba:
-                    6a:0d:94:6f:02:e5:c6:06:1a:5c:2a:d2:95:25:6e:
-                    53:86:88:d3:1c:11:db:b8:b8:9a:94:9a:89:65:c6:
-                    c5:6a:2e:b3:4f:07:80:40:d1:21:29:4c:52:84:e9:
-                    b4:a7:2d:f3:21:66:23:24:a7:b3:de:95:a3:79:4f:
-                    26:31:6c:b9:da:76:d6:ec:d4:7e:d1:44:b7:63:d3:
-                    8b:75:ff:04:a0:e2:96:57:5a:85:28:3b:0f:f3:12:
-                    0c:15:b9:7f:39:6a:9a:0b:95:ee:bc:d9:09:00:3e:
-                    b3:04:b5:7e:d8:af:42:6e:c5:cf:0f:d2:9b:71:aa:
-                    14:b6:cb:b0:9b:d6:5f:2c:97:24:c4:3f:27:e6:a7:
-                    47:5a:54:bf:84:68:ea:4f:e1:f0:1a:3b:7a:1b:85:
-                    d3:e9:8e:5f:b5:18:93:36:54:f1:15:e8:6f:52:c9:
-                    b7:5d:90:9d:d5:2f:fb:49:8c:b8:52:4e:34:bf:46:
-                    f4:8f:ee:76:1b:ca:9d:56:4d:f5:96:07:c3:76:60:
-                    66:3b:8c:e7:ef:fc:29:51:6d:0f:f0:f9:fb:db:44:
-                    e3:f5
+                    00:a8:d1:9d:45:4a:dd:38:b7:b6:76:e5:20:8e:f3:
+                    68:3a:98:11:33:6e:35:88:1a:ba:18:48:4c:c8:2e:
+                    72:dd:3d:84:5d:67:ba:99:23:90:14:99:de:7a:6b:
+                    6c:a7:c9:4f:81:72:d1:62:0a:cb:87:41:c3:c8:74:
+                    1e:56:b9:96:bf:ea:0c:c8:ff:a8:1b:17:97:74:6f:
+                    8c:ad:92:42:57:df:6b:e9:d0:4a:9a:0b:05:61:3d:
+                    50:ce:44:0f:22:41:83:10:f9:02:68:fe:94:c8:e4:
+                    5b:49:20:1c:02:2c:76:4e:82:0b:8f:f6:ae:53:c1:
+                    df:c0:48:22:78:1e:6f:03:75:00:26:b3:ad:c1:02:
+                    7f:83:cf:52:7c:6c:58:59:1e:1f:1e:a0:31:b5:38:
+                    91:4c:e4:2e:c9:71:e4:16:96:33:22:a9:cd:df:9a:
+                    b1:9e:84:29:93:b5:74:f6:5f:9c:8c:9a:3b:8f:11:
+                    a0:8d:82:68:ee:ba:2d:eb:b8:5d:62:f2:32:18:2c:
+                    84:94:d2:9f:65:e2:2c:eb:93:93:dd:6f:37:1e:ed:
+                    11:f8:50:ae:d6:e4:68:e3:20:2d:2b:11:cb:fc:37:
+                    cf:14:a7:cf:75:6d:03:44:99:b0:6d:ec:da:a4:fd:
+                    74:5e:d5:7c:58:42:59:22:bd:1e:53:09:00:0b:45:
+                    1e:87
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                D9:D1:6E:42:D5:27:F3:97:CB:FD:15:37:54:E7:C9:A4:EA:F1:FB:D9
+                50:7F:07:06:90:38:D2:E8:2A:77:30:AD:87:F8:5B:26:E3:1D:97:47
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/I.cer
@@ -54,44 +54,46 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         a4:55:b4:2e:7a:ab:a8:51:ce:14:7a:de:8f:6b:15:ae:ce:a1:
-         6f:ea:00:d8:9d:2f:55:55:42:a9:9c:f5:88:56:eb:b6:fa:be:
-         59:42:98:c7:c9:52:5c:52:1a:eb:a8:f7:29:48:fa:c9:66:41:
-         2b:77:24:9d:0b:d9:cf:c4:77:42:a1:44:58:64:a3:13:13:4f:
-         2f:c0:9b:e6:20:f5:35:bd:6d:d7:50:55:2d:30:e9:22:09:e1:
-         03:b9:8f:5f:77:66:14:d4:d7:26:3a:dc:bf:65:07:1e:8b:ee:
-         ca:d5:2a:3d:57:b9:8a:0f:df:27:9a:3e:d6:15:5f:ff:28:b1:
-         af:c6:35:1a:ba:b5:6c:ae:9e:3d:1e:38:2a:77:d7:d2:19:db:
-         a6:4d:5f:28:7e:19:80:d5:71:e5:11:0a:1e:db:46:f5:db:29:
-         4f:bb:d3:4d:3c:f2:6b:84:b1:87:6a:b5:56:b7:b0:76:61:a1:
-         2c:25:6d:6e:79:28:8a:40:fc:18:d9:a7:9c:4c:94:c5:28:75:
-         e9:2f:0d:12:35:d8:17:07:a4:aa:51:fe:b3:a0:57:e8:04:b2:
-         89:c0:c2:c3:85:4c:da:26:0a:f6:53:1a:be:f0:88:f1:a6:ff:
-         d7:85:1f:3d:02:ae:33:7b:b8:10:16:ce:4a:92:de:d5:e5:ef:
-         0c:72:47:3e
+         93:3c:98:46:dc:74:09:e3:f0:fd:dd:80:9d:b5:4d:4f:60:f2:
+         94:fc:4a:7c:f4:60:f6:70:50:0d:00:22:fa:d8:aa:46:88:de:
+         09:43:76:0f:2e:34:a1:d8:6c:a8:0e:7e:a4:09:cb:ae:12:b7:
+         dc:fa:31:1b:9c:ae:89:c1:36:77:13:f7:68:f8:13:f0:1d:b7:
+         b0:8a:6f:01:57:62:41:a1:9a:c9:4a:72:23:8a:37:2b:fc:02:
+         30:06:16:eb:73:56:30:e6:1b:a7:88:b1:59:24:5b:ee:8b:7d:
+         34:b9:12:ba:d8:dd:e1:44:e9:9b:45:b0:5c:75:47:f1:4c:99:
+         ed:98:d7:c3:a8:a9:7e:4e:5b:a1:9f:f2:bc:61:eb:a2:2b:8d:
+         ff:ab:a2:6b:37:88:2a:9f:09:83:eb:a9:48:1c:2f:88:ce:5c:
+         9f:5d:5d:4a:2f:74:ea:c5:2c:c7:e3:c9:b8:71:f0:80:e1:87:
+         f7:eb:cb:9c:23:8c:ad:1a:10:e7:00:6e:99:25:eb:2a:97:2f:
+         31:96:12:27:9e:e9:59:d8:6a:f5:87:e5:66:e3:61:eb:b6:f9:
+         30:27:13:f8:e3:87:27:06:e4:c8:fb:df:f9:49:20:7b:a5:9c:
+         90:2e:30:af:00:50:95:ea:95:1c:b4:90:49:df:b4:18:33:04:
+         8d:ec:c8:57
 -----BEGIN CERTIFICATE-----
-MIIEOTCCAyGgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIETDCCAzSgAwIBAgIBBTANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAslLulJCoGjK7T2QXpjGr
-CAmR7+ytCun7W/pqH+ZoL1OLBHQydZ28/bPJorpqDZRvAuXGBhpcKtKVJW5ThojT
-HBHbuLialJqJZcbFai6zTweAQNEhKUxShOm0py3zIWYjJKez3pWjeU8mMWy52nbW
-7NR+0US3Y9OLdf8EoOKWV1qFKDsP8xIMFbl/OWqaC5XuvNkJAD6zBLV+2K9CbsXP
-D9KbcaoUtsuwm9ZfLJckxD8n5qdHWlS/hGjqT+HwGjt6G4XT6Y5ftRiTNlTxFehv
-Usm3XZCd1S/7SYy4Uk40v0b0j+52G8qdVk31lgfDdmBmO4zn7/wpUW0P8Pn720Tj
-9QIDAQABo4IBnzCCAZswHQYDVR0OBBYEFNnRbkLVJ/OXy/0VN1TnyaTq8fvZMB8G
-A1UdIwQYMBaAFECRKCGdk/OcGBv/AJyyCKCjgX0qMIH+BggrBgEFBQcBAQSB8TCB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqNGdRUrdOLe2duUgjvNo
+OpgRM241iBq6GEhMyC5y3T2EXWe6mSOQFJneemtsp8lPgXLRYgrLh0HDyHQeVrmW
+v+oMyP+oGxeXdG+MrZJCV99r6dBKmgsFYT1QzkQPIkGDEPkCaP6UyORbSSAcAix2
+ToILj/auU8HfwEgieB5vA3UAJrOtwQJ/g89SfGxYWR4fHqAxtTiRTOQuyXHkFpYz
+IqnN35qxnoQpk7V09l+cjJo7jxGgjYJo7rot67hdYvIyGCyElNKfZeIs65OT3W83
+Hu0R+FCu1uRo4yAtKxHL/DfPFKfPdW0DRJmwbezapP10XtV8WEJZIr0eUwkAC0Ue
+hwIDAQABo4IBsjCCAa4wHQYDVR0OBBYEFFB/BwaQONLoKncwrYf4WybjHZdHMB8G
+A1UdIwQYMBaAFIS6BQZOM50Rqnrxdx+kaX5MLdQ/MIH+BggrBgEFBQcBAQSB8TCB
 7jAkBggrBgEFBQcwAoYYaHR0cDovL3VybC1mb3ItYWlhL0kuY2VyMCYGCCsGAQUF
 BzAChhpodHRwOi8vdXJsLWZvci1haWEyL0kyLmZvbzAmBggrBgEFBQcwAoYaaHR0
 cDovL3VybC1mb3ItYWlhMy9JMy5mb28wJgYIKwYBBQUHMAKGGmh0dHA6Ly91cmwt
 Zm9yLWFpYTQvSTQuZm9vMCYGCCsGAQUFBzAChhpodHRwOi8vdXJsLWZvci1haWE1
 L0k1LmZvbzAmBggrBgEFBQcwAoYaaHR0cDovL3VybC1mb3ItYWlhNi9JNi5mb28w
 KQYDVR0fBCIwIDAeoBygGoYYaHR0cDovL3VybC1mb3ItY3JsL0kuY3JsMA4GA1Ud
-DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZI
-hvcNAQELBQADggEBAKRVtC56q6hRzhR63o9rFa7OoW/qANidL1VVQqmc9YhW67b6
-vllCmMfJUlxSGuuo9ylI+slmQSt3JJ0L2c/Ed0KhRFhkoxMTTy/Am+Yg9TW9bddQ
-VS0w6SIJ4QO5j193ZhTU1yY63L9lBx6L7srVKj1XuYoP3yeaPtYVX/8osa/GNRq6
-tWyunj0eOCp319IZ26ZNXyh+GYDVceURCh7bRvXbKU+700088muEsYdqtVa3sHZh
-oSwlbW55KIpA/BjZp5xMlMUodekvDRI12BcHpKpR/rOgV+gEsonAwsOFTNomCvZT
-Gr7wiPGm/9eFHz0CrjN7uBAWzkqS3tXl7wxyRz4=
+DwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwEQYDVR0R
+BAowCIIGdGFyZ2V0MA0GCSqGSIb3DQEBCwUAA4IBAQCTPJhG3HQJ4/D93YCdtU1P
+YPKU/Ep89GD2cFANACL62KpGiN4JQ3YPLjSh2GyoDn6kCcuuErfc+jEbnK6JwTZ3
+E/do+BPwHbewim8BV2JBoZrJSnIjijcr/AIwBhbrc1Yw5huniLFZJFvui300uRK6
+2N3hROmbRbBcdUfxTJntmNfDqKl+Tluhn/K8YeuiK43/q6JrN4gqnwmD66lIHC+I
+zlyfXV1KL3TqxSzH48m4cfCA4Yf368ucI4ytGhDnAG6ZJesqly8xlhInnulZ2Gr1
+h+Vm42HrtvkwJxP444cnBuTI+9/5SSB7pZyQLjCvAFCV6pUctJBJ37QYMwSN7MhX
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_three_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_three_aia.pem
index 18699cf..5f24ab3 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_three_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_three_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ce:0f:06:90:e0:8b:9f:3b:85:b8:f4:fc:73:6c:
-                    5c:8a:8d:b9:1d:cf:03:37:36:ec:c6:da:e6:c3:7b:
-                    ff:59:8b:3b:c7:ef:9d:e4:6f:52:08:c9:89:cb:f6:
-                    a1:98:70:c5:72:a0:49:a8:92:7b:a4:fe:7f:4e:e7:
-                    04:dd:14:5c:64:ed:bd:6e:e0:6b:8a:dd:ff:ac:37:
-                    ba:6d:24:44:0b:0a:51:34:ae:51:a2:3c:50:90:e5:
-                    8e:26:22:f0:93:c0:ae:65:de:a4:cb:58:50:4c:01:
-                    ee:eb:64:d0:31:5c:7c:3a:d5:74:d5:59:b7:5d:bb:
-                    7a:bf:93:46:a8:fd:66:ad:81:5d:af:69:2c:f3:42:
-                    d4:7b:76:9c:12:8b:90:c8:52:38:d8:d5:74:b7:65:
-                    c2:ae:cf:d4:78:78:19:e6:ce:2c:dc:2b:c5:2f:96:
-                    a4:72:18:21:86:2e:77:65:10:a8:47:8b:e0:2a:01:
-                    e4:d2:62:df:61:71:06:04:e3:1e:76:3f:55:a1:79:
-                    d6:11:ed:24:79:3b:f3:13:08:99:d8:88:4f:25:39:
-                    d9:1b:d1:2a:e7:93:a4:ba:01:eb:f1:fc:a4:c8:c3:
-                    8b:d9:91:2d:64:48:5c:9a:1e:d1:35:f9:a0:67:7d:
-                    21:8a:1a:a0:58:75:a4:31:17:73:1a:c0:e3:1c:a5:
-                    b3:19
+                    00:ab:6d:a7:ab:5c:a3:04:f8:18:44:5a:e6:16:3b:
+                    37:be:ec:13:da:6e:5c:55:4e:19:e9:14:d9:f5:0e:
+                    2e:56:bb:52:bb:58:f0:f7:89:e8:a8:85:47:02:f7:
+                    51:1c:b8:29:ce:1b:2c:0a:4e:de:8e:c5:d9:a1:aa:
+                    0f:a3:fd:51:61:fb:7f:e4:e9:05:49:b2:58:6d:10:
+                    fe:11:60:13:24:98:69:17:d1:56:60:93:da:6b:26:
+                    8b:d7:c3:dc:e5:4f:c0:d1:cd:e5:80:21:3c:68:b0:
+                    2e:fc:bf:06:9e:2e:0d:26:bf:12:f3:4a:f0:98:9d:
+                    d8:b0:24:3b:27:46:bf:ca:45:29:96:71:00:48:83:
+                    08:29:22:68:a8:2d:ba:90:38:4b:50:d9:ab:5f:f2:
+                    89:08:ee:43:ac:e0:ca:2b:2a:45:70:08:23:3b:be:
+                    fe:6f:1d:81:a6:6b:df:19:31:d2:a2:58:b2:87:8c:
+                    83:ff:ff:5d:47:4d:50:a7:07:3a:b7:1e:f0:b0:6d:
+                    57:5b:d0:45:06:a5:0e:97:fd:ff:d5:62:71:9f:0d:
+                    bb:35:f0:b8:d1:92:09:42:c9:dd:64:c8:17:8f:3f:
+                    b3:36:dd:ea:5c:58:8e:d6:a4:ed:c1:8e:9f:01:1e:
+                    fd:15:a4:45:97:b8:56:db:85:84:a5:33:82:c1:da:
+                    82:15
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                1B:54:9F:9B:A8:BB:5F:37:19:D9:66:AE:B3:0A:65:58:04:81:29:8D
+                13:C9:D0:AB:5F:EF:0C:5E:23:88:F5:C4:44:2C:0A:3F:3B:13:21:C2
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/I.cer
@@ -51,42 +51,44 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         01:98:3b:ee:4c:4e:91:e7:97:bf:1d:18:2b:bd:f4:a5:ba:75:
-         fd:f1:9f:73:0e:25:dc:4d:7b:e8:69:0a:22:55:4f:96:30:64:
-         e5:05:73:ef:ef:ef:5a:50:48:50:a8:e5:e5:c6:a3:3b:0e:e8:
-         48:b7:6f:0d:d4:ae:5e:2a:15:e5:86:45:02:83:f8:1a:b0:2d:
-         0f:19:df:ed:dd:5d:fb:e4:31:b7:18:5e:de:8a:62:cd:53:77:
-         b0:cf:1c:a0:9a:fc:20:94:6f:37:2a:3b:af:36:65:e1:98:c4:
-         e1:f6:b4:fc:d7:08:c5:6d:90:ba:67:2c:06:ff:1c:62:af:99:
-         f2:f6:40:41:30:6c:4a:66:fb:ae:5f:2b:0e:33:f4:9a:34:62:
-         4d:ca:a1:b9:da:f9:14:7a:ff:87:c7:89:d5:c0:da:1d:6d:5e:
-         7f:81:84:77:53:cb:24:d9:dc:25:51:51:7a:85:c3:9c:22:9f:
-         b9:4f:17:cf:80:b7:21:7c:6d:6d:15:dd:11:23:66:f7:58:77:
-         32:c3:88:2b:6c:e3:db:d7:c8:cb:a8:52:02:f6:85:3f:00:22:
-         5e:33:3f:d6:5b:fc:7d:41:3c:de:0d:6e:c4:83:a8:32:e5:29:
-         40:d7:c4:0f:50:22:9f:5b:55:d8:4f:0c:93:08:cb:c5:b7:fc:
-         b0:f1:24:14
+         11:88:ca:4b:ea:92:84:28:28:21:ff:a6:22:d3:c3:ab:d0:cd:
+         b1:6d:bc:db:4c:0a:80:d0:f9:f0:36:6b:41:9d:1e:fc:75:5a:
+         61:56:66:62:93:9f:ba:77:f5:e1:aa:0d:72:14:ea:07:3b:2d:
+         bd:7d:18:f5:b5:82:e6:28:79:b1:c0:c9:41:26:24:58:fd:73:
+         4e:6a:ec:b2:b0:52:59:c5:7f:a4:9b:26:2a:5a:43:b2:cb:d4:
+         0f:ea:ce:7b:da:e9:f7:0c:10:1b:02:ac:62:4b:03:56:3f:a7:
+         29:d1:93:89:45:2f:24:d0:52:54:a6:56:5a:76:e3:06:b1:12:
+         49:78:cd:a9:30:a0:9c:48:18:35:7f:28:5d:e9:00:8f:f7:69:
+         1a:93:aa:1c:1a:bf:2a:79:68:11:1b:c1:fb:7f:bf:8b:2b:df:
+         09:32:69:d5:19:32:bf:ce:12:09:7b:39:57:75:c7:15:9f:b3:
+         f4:f6:f2:3c:c0:bd:99:c3:57:ab:55:db:55:01:cd:73:f9:52:
+         4c:ae:15:86:24:ad:85:57:a8:a5:2c:80:9a:7a:ed:f6:e8:20:
+         18:34:8f:bf:b9:00:3d:8e:0c:4b:dc:59:3d:86:62:dc:09:f2:
+         03:cd:c0:8c:cd:b9:1d:17:88:ea:44:2c:52:40:89:19:0f:d4:
+         a7:15:ae:67
 -----BEGIN CERTIFICATE-----
-MIIDvzCCAqegAwIBAgIBBDANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIID0jCCArqgAwIBAgIBBDANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzg8GkOCLnzuFuPT8c2xc
-io25Hc8DNzbsxtrmw3v/WYs7x++d5G9SCMmJy/ahmHDFcqBJqJJ7pP5/TucE3RRc
-ZO29buBrit3/rDe6bSRECwpRNK5RojxQkOWOJiLwk8CuZd6ky1hQTAHu62TQMVx8
-OtV01Vm3Xbt6v5NGqP1mrYFdr2ks80LUe3acEouQyFI42NV0t2XCrs/UeHgZ5s4s
-3CvFL5akchghhi53ZRCoR4vgKgHk0mLfYXEGBOMedj9VoXnWEe0keTvzEwiZ2IhP
-JTnZG9Eq55OkugHr8fykyMOL2ZEtZEhcmh7RNfmgZ30hihqgWHWkMRdzGsDjHKWz
-GQIDAQABo4IBJTCCASEwHQYDVR0OBBYEFBtUn5uou183GdlmrrMKZVgEgSmNMB8G
-A1UdIwQYMBaAFECRKCGdk/OcGBv/AJyyCKCjgX0qMIGEBggrBgEFBQcBAQR4MHYw
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq22nq1yjBPgYRFrmFjs3
+vuwT2m5cVU4Z6RTZ9Q4uVrtSu1jw94noqIVHAvdRHLgpzhssCk7ejsXZoaoPo/1R
+Yft/5OkFSbJYbRD+EWATJJhpF9FWYJPaayaL18Pc5U/A0c3lgCE8aLAu/L8Gni4N
+Jr8S80rwmJ3YsCQ7J0a/ykUplnEASIMIKSJoqC26kDhLUNmrX/KJCO5DrODKKypF
+cAgjO77+bx2BpmvfGTHSoliyh4yD//9dR01Qpwc6tx7wsG1XW9BFBqUOl/3/1WJx
+nw27NfC40ZIJQsndZMgXjz+zNt3qXFiO1qTtwY6fAR79FaRFl7hW24WEpTOCwdqC
+FQIDAQABo4IBODCCATQwHQYDVR0OBBYEFBPJ0Ktf7wxeI4j1xEQsCj87EyHCMB8G
+A1UdIwQYMBaAFIS6BQZOM50Rqnrxdx+kaX5MLdQ/MIGEBggrBgEFBQcBAQR4MHYw
 JAYIKwYBBQUHMAKGGGh0dHA6Ly91cmwtZm9yLWFpYS9JLmNlcjAmBggrBgEFBQcw
 AoYaaHR0cDovL3VybC1mb3ItYWlhMi9JMi5mb28wJgYIKwYBBQUHMAKGGmh0dHA6
 Ly91cmwtZm9yLWFpYTMvSTMuZm9vMCkGA1UdHwQiMCAwHqAcoBqGGGh0dHA6Ly91
 cmwtZm9yLWNybC9JLmNybDAOBgNVHQ8BAf8EBAMCBaAwHQYDVR0lBBYwFAYIKwYB
-BQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBCwUAA4IBAQABmDvuTE6R55e/HRgr
-vfSlunX98Z9zDiXcTXvoaQoiVU+WMGTlBXPv7+9aUEhQqOXlxqM7DuhIt28N1K5e
-KhXlhkUCg/gasC0PGd/t3V375DG3GF7eimLNU3ewzxygmvwglG83KjuvNmXhmMTh
-9rT81wjFbZC6ZywG/xxir5ny9kBBMGxKZvuuXysOM/SaNGJNyqG52vkUev+Hx4nV
-wNodbV5/gYR3U8sk2dwlUVF6hcOcIp+5TxfPgLchfG1tFd0RI2b3WHcyw4grbOPb
-18jLqFIC9oU/ACJeMz/WW/x9QTzeDW7Eg6gy5SlA18QPUCKfW1XYTwyTCMvFt/yw
-8SQU
+BQUHAwEGCCsGAQUFBwMCMBEGA1UdEQQKMAiCBnRhcmdldDANBgkqhkiG9w0BAQsF
+AAOCAQEAEYjKS+qShCgoIf+mItPDq9DNsW2820wKgND58DZrQZ0e/HVaYVZmYpOf
+unf14aoNchTqBzstvX0Y9bWC5ih5scDJQSYkWP1zTmrssrBSWcV/pJsmKlpDssvU
+D+rOe9rp9wwQGwKsYksDVj+nKdGTiUUvJNBSVKZWWnbjBrESSXjNqTCgnEgYNX8o
+XekAj/dpGpOqHBq/KnloERvB+3+/iyvfCTJp1Rkyv84SCXs5V3XHFZ+z9PbyPMC9
+mcNXq1XbVQHNc/lSTK4VhiSthVeopSyAmnrt9uggGDSPv7kAPY4MS9xZPYZi3Any
+A83AjM25HReI6kQsUkCJGQ/UpxWuZw==
 -----END CERTIFICATE-----
diff --git a/net/data/cert_issuer_source_aia_unittest/target_two_aia.pem b/net/data/cert_issuer_source_aia_unittest/target_two_aia.pem
index f7de319..c530ecb2 100644
--- a/net/data/cert_issuer_source_aia_unittest/target_two_aia.pem
+++ b/net/data/cert_issuer_source_aia_unittest/target_two_aia.pem
@@ -12,30 +12,30 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ab:cb:9a:c2:db:b8:1c:3d:1a:b7:37:e8:97:9c:
-                    51:f4:8a:61:67:1d:37:8a:88:fe:8a:65:24:54:51:
-                    18:be:9c:13:83:0c:91:0b:52:32:c6:6d:4c:8a:48:
-                    10:06:83:da:81:db:10:2a:77:81:16:d0:85:cd:04:
-                    ce:06:56:3d:53:29:e3:11:6d:25:d9:bd:81:df:50:
-                    bb:42:0c:c4:6a:3b:6c:5c:e5:47:54:25:8b:21:cb:
-                    22:00:8e:31:75:c0:21:29:89:e7:76:5a:2c:97:56:
-                    87:29:ab:35:16:23:41:0d:25:d0:62:7d:91:0e:02:
-                    9c:9a:7b:a3:fa:b6:d9:16:75:36:ea:62:cc:61:ab:
-                    ae:15:9d:71:ff:5a:90:af:b4:a0:b2:d2:99:3b:2d:
-                    92:45:64:44:fd:07:d8:86:c7:47:bf:d4:b5:35:07:
-                    46:a7:93:4f:e9:2b:71:9e:a4:76:78:42:b7:17:1e:
-                    2b:0e:b1:f2:f5:1a:99:d5:ce:d2:9d:f6:99:0a:20:
-                    03:19:4e:f9:e0:45:68:75:e6:08:63:95:f5:34:21:
-                    78:d6:68:06:b4:c8:cb:e3:77:6c:61:ef:c3:12:e8:
-                    71:87:e2:99:2e:5a:2f:b8:d9:d8:51:aa:af:20:47:
-                    c8:cd:eb:73:11:8e:a2:4b:fa:4e:8c:3c:d2:5e:1d:
-                    17:5f
+                    00:c8:62:eb:23:95:cd:33:c8:5e:43:58:e3:1e:90:
+                    82:8d:44:eb:dc:64:d2:cd:fb:09:c2:69:56:11:0f:
+                    d7:8f:cd:20:d7:bc:e3:ae:e9:62:e4:67:3a:d1:31:
+                    14:45:5b:36:e1:33:00:81:2f:f0:c5:ea:1f:57:ff:
+                    fb:99:43:5b:9f:09:01:83:e0:07:f1:00:42:23:9b:
+                    ef:b2:c2:5d:0f:0e:59:2d:ef:e4:20:e7:fd:f1:96:
+                    9a:5e:71:7d:db:dd:36:a8:1d:7b:04:bd:74:d9:e5:
+                    86:d2:34:6e:af:8e:77:8e:35:af:2b:4d:8e:e4:93:
+                    01:23:a3:27:cd:a5:ce:e0:bd:53:f2:1b:e6:f1:e9:
+                    d2:fb:20:49:01:81:f7:2f:51:5c:d7:63:35:42:de:
+                    52:f7:bc:1c:1d:6d:af:01:3a:5f:20:59:ee:5d:d6:
+                    77:1d:cb:d7:ef:14:9e:e1:9f:01:97:7b:bc:a3:d1:
+                    d1:05:6c:64:6c:7d:5a:26:38:b2:5f:f0:a5:3b:f4:
+                    b2:3d:8a:85:f0:25:2d:31:1b:b3:a3:4c:a7:95:2f:
+                    ea:bc:6a:4a:9e:61:19:81:4b:b8:8e:a5:88:3b:36:
+                    35:e8:e2:35:76:17:29:d8:4e:1a:4c:6d:7c:1d:b2:
+                    e9:79:5b:f5:75:76:78:55:2f:e1:03:2f:94:d6:aa:
+                    9e:ff
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Subject Key Identifier: 
-                E8:D5:6F:99:50:16:68:CA:BF:06:34:2A:8B:0A:E2:25:88:40:CF:15
+                E5:73:F2:21:4B:9E:B8:BB:3C:57:17:0F:F8:0E:E1:6A:FC:F3:2A:48
             X509v3 Authority Key Identifier: 
-                keyid:40:91:28:21:9D:93:F3:9C:18:1B:FF:00:9C:B2:08:A0:A3:81:7D:2A
+                keyid:84:BA:05:06:4E:33:9D:11:AA:7A:F1:77:1F:A4:69:7E:4C:2D:D4:3F
 
             Authority Information Access: 
                 CA Issuers - URI:http://url-for-aia/I.cer
@@ -50,41 +50,43 @@
                 Digital Signature, Key Encipherment
             X509v3 Extended Key Usage: 
                 TLS Web Server Authentication, TLS Web Client Authentication
+            X509v3 Subject Alternative Name: 
+                DNS:target
     Signature Algorithm: sha256WithRSAEncryption
-         64:0c:e5:4b:4a:6f:ec:3f:49:37:89:ce:54:6b:72:8a:a9:f1:
-         db:1a:c3:d7:84:9f:d5:29:73:12:ba:a3:03:99:5d:45:b5:62:
-         f6:7e:83:74:f9:ff:d8:49:15:76:7d:65:eb:ad:11:bd:b2:b5:
-         77:15:d3:c2:5f:ad:ca:c2:24:e4:92:8b:5d:10:65:07:6e:99:
-         4e:e5:16:f0:8a:62:ba:91:50:bd:a2:1b:12:c9:d8:a1:c0:49:
-         a1:3a:5d:3c:75:87:4e:07:0d:ce:6f:27:90:94:3d:10:cd:aa:
-         b0:6d:37:ac:97:3a:af:45:f3:86:94:b3:d8:ae:d4:49:27:d6:
-         e2:7e:d7:e1:54:1f:e8:85:86:cd:02:d1:83:ae:c4:2a:63:6b:
-         33:87:ad:70:3b:81:87:a8:2c:30:d1:28:04:cc:a3:5c:75:d0:
-         08:86:67:99:10:5f:be:94:5d:4f:ed:d7:2e:eb:bf:85:61:a1:
-         58:be:8a:61:08:a8:43:38:32:b7:33:09:09:03:61:4d:4d:55:
-         dc:e2:1b:f4:be:3d:d0:76:b0:00:df:72:48:57:f9:1c:3e:bd:
-         83:7a:47:fd:09:53:16:f7:00:32:8f:94:16:0a:ef:19:26:4d:
-         b0:b8:6c:02:f8:51:5e:27:6a:c5:1e:62:c2:5b:5e:c2:a1:d4:
-         82:56:90:fe
+         40:67:ce:6d:fa:82:c3:f7:43:ff:8b:04:2e:c8:57:fa:0c:32:
+         16:7c:f4:6a:90:a5:bd:31:ba:2f:a6:d6:6a:fe:a9:c5:a2:03:
+         2b:87:33:c6:1d:0d:2f:10:aa:15:68:62:a3:5d:bd:d4:3e:2e:
+         21:eb:02:36:88:37:6a:47:6a:61:b4:20:db:ba:12:24:3e:5a:
+         65:84:39:b6:07:9b:69:30:04:a3:44:ee:f1:8f:2a:55:fb:fd:
+         bd:bd:76:f2:0f:a8:20:c3:2c:4a:31:94:59:00:2b:d0:ff:a9:
+         98:7a:ae:9d:e6:f3:38:6f:7a:8d:f7:e0:b5:c4:75:8c:5e:6c:
+         92:47:d4:d2:e0:78:c6:c1:56:f2:10:d3:c0:9f:86:b3:7b:ef:
+         0b:20:07:a5:ab:d7:35:ce:d5:48:d6:67:f6:f3:57:72:e6:e5:
+         e7:81:04:61:dc:a2:f9:47:2b:3f:08:c4:55:41:38:9a:0c:7f:
+         d2:5f:05:ff:4d:34:8c:4b:4c:6a:6e:73:d2:c2:c3:d3:1c:b0:
+         08:6e:17:bb:94:e6:65:6e:da:7e:3f:9c:42:2d:cb:d8:2a:7b:
+         c9:03:6f:15:e2:6d:63:e6:5e:a7:fb:7c:5e:b3:fe:6a:87:9b:
+         de:04:91:f6:bb:50:ad:9e:1c:0c:3f:bf:c5:06:99:f0:3f:ad:
+         1d:37:26:f5
 -----BEGIN CERTIFICATE-----
-MIIDlDCCAnygAwIBAgIBAzANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
+MIIDqTCCApGgAwIBAgIBAzANBgkqhkiG9w0BAQsFADAMMQowCAYDVQQDDAFJMB4X
 DTE1MDEwMTEyMDAwMFoXDTIxMDEwMTEyMDAwMFowETEPMA0GA1UEAwwGdGFyZ2V0
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq8uawtu4HD0atzfol5xR
-9IphZx03ioj+imUkVFEYvpwTgwyRC1Iyxm1MikgQBoPagdsQKneBFtCFzQTOBlY9
-UynjEW0l2b2B31C7QgzEajtsXOVHVCWLIcsiAI4xdcAhKYnndlosl1aHKas1FiNB
-DSXQYn2RDgKcmnuj+rbZFnU26mLMYauuFZ1x/1qQr7SgstKZOy2SRWRE/QfYhsdH
-v9S1NQdGp5NP6StxnqR2eEK3Fx4rDrHy9RqZ1c7SnfaZCiADGU754EVodeYIY5X1
-NCF41mgGtMjL43dsYe/DEuhxh+KZLlovuNnYUaqvIEfIzetzEY6iS/pOjDzSXh0X
-XwIDAQABo4H7MIH4MB0GA1UdDgQWBBTo1W+ZUBZoyr8GNCqLCuIliEDPFTAfBgNV
-HSMEGDAWgBRAkSghnZPznBgb/wCcsgigo4F9KjBcBggrBgEFBQcBAQRQME4wJAYI
-KwYBBQUHMAKGGGh0dHA6Ly91cmwtZm9yLWFpYS9JLmNlcjAmBggrBgEFBQcwAoYa
-aHR0cDovL3VybC1mb3ItYWlhMi9JMi5mb28wKQYDVR0fBCIwIDAeoBygGoYYaHR0
-cDovL3VybC1mb3ItY3JsL0kuY3JsMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAU
-BggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBAGQM5UtKb+w/
-STeJzlRrcoqp8dsaw9eEn9UpcxK6owOZXUW1YvZ+g3T5/9hJFXZ9ZeutEb2ytXcV
-08JfrcrCJOSSi10QZQdumU7lFvCKYrqRUL2iGxLJ2KHASaE6XTx1h04HDc5vJ5CU
-PRDNqrBtN6yXOq9F84aUs9iu1Ekn1uJ+1+FUH+iFhs0C0YOuxCpjazOHrXA7gYeo
-LDDRKATMo1x10AiGZ5kQX76UXU/t1y7rv4VhoVi+imEIqEM4MrczCQkDYU1NVdzi
-G/S+PdB2sADfckhX+Rw+vYN6R/0JUxb3ADKPlBYK7xkmTbC4bAL4UV4nasUeYsJb
-XsKh1IJWkP4=
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyGLrI5XNM8heQ1jjHpCC
+jUTr3GTSzfsJwmlWEQ/Xj80g17zjruli5Gc60TEURVs24TMAgS/wxeofV//7mUNb
+nwkBg+AH8QBCI5vvssJdDw5ZLe/kIOf98ZaaXnF92902qB17BL102eWG0jRur453
+jjWvK02O5JMBI6MnzaXO4L1T8hvm8enS+yBJAYH3L1Fc12M1Qt5S97wcHW2vATpf
+IFnuXdZ3HcvX7xSe4Z8Bl3u8o9HRBWxkbH1aJjiyX/ClO/SyPYqF8CUtMRuzo0yn
+lS/qvGpKnmEZgUu4jqWIOzY16OI1dhcp2E4aTG18HbLpeVv1dXZ4VS/hAy+U1qqe
+/wIDAQABo4IBDzCCAQswHQYDVR0OBBYEFOVz8iFLnri7PFcXD/gO4Wr88ypIMB8G
+A1UdIwQYMBaAFIS6BQZOM50Rqnrxdx+kaX5MLdQ/MFwGCCsGAQUFBwEBBFAwTjAk
+BggrBgEFBQcwAoYYaHR0cDovL3VybC1mb3ItYWlhL0kuY2VyMCYGCCsGAQUFBzAC
+hhpodHRwOi8vdXJsLWZvci1haWEyL0kyLmZvbzApBgNVHR8EIjAgMB6gHKAahhho
+dHRwOi8vdXJsLWZvci1jcmwvSS5jcmwwDgYDVR0PAQH/BAQDAgWgMB0GA1UdJQQW
+MBQGCCsGAQUFBwMBBggrBgEFBQcDAjARBgNVHREECjAIggZ0YXJnZXQwDQYJKoZI
+hvcNAQELBQADggEBAEBnzm36gsP3Q/+LBC7IV/oMMhZ89GqQpb0xui+m1mr+qcWi
+AyuHM8YdDS8QqhVoYqNdvdQ+LiHrAjaIN2pHamG0INu6EiQ+WmWEObYHm2kwBKNE
+7vGPKlX7/b29dvIPqCDDLEoxlFkAK9D/qZh6rp3m8zhveo334LXEdYxebJJH1NLg
+eMbBVvIQ08CfhrN77wsgB6Wr1zXO1UjWZ/bzV3Lm5eeBBGHcovlHKz8IxFVBOJoM
+f9JfBf9NNIxLTGpuc9LCw9McsAhuF7uU5mVu2n4/nEIty9gqe8kDbxXibWPmXqf7
+fF6z/mqHm94Ekfa7UK2eHAw/v8UGmfA/rR03JvU=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/aia-cert.pem b/net/data/ssl/certificates/aia-cert.pem
index ab1d33c..e3da938 100644
--- a/net/data/ssl/certificates/aia-cert.pem
+++ b/net/data/ssl/certificates/aia-cert.pem
@@ -5,31 +5,31 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=AIA Test Intermediate CA
         Validity
-            Not Before: Aug 14 02:46:18 2014 GMT
-            Not After : Aug 11 02:46:18 2024 GMT
+            Not Before: Feb 28 23:02:39 2017 GMT
+            Not After : Feb 26 23:02:39 2027 GMT
         Subject: CN=aia-host.invalid
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:d7:a8:22:68:e9:32:12:5a:49:cb:cb:47:df:93:
-                    34:0d:2e:0e:a0:e8:30:27:a7:69:47:cc:f4:fe:76:
-                    ad:13:95:d2:dc:39:05:ad:62:f7:8f:23:d6:04:1c:
-                    a3:84:30:a0:0f:37:7d:fa:28:d4:f3:4b:e4:0c:ce:
-                    c0:57:96:c4:40:3d:20:20:b0:78:19:1b:a9:7a:ad:
-                    20:4e:a6:39:42:39:48:f5:18:a4:05:03:1a:9e:f5:
-                    cf:54:e2:3e:5d:38:c7:5d:f8:89:d4:5d:39:f0:15:
-                    db:96:26:bb:12:fe:a4:c5:b0:ff:6d:41:f7:f8:25:
-                    81:6d:99:03:93:20:7d:29:25:bd:15:a9:ea:2d:98:
-                    03:5b:54:88:33:a9:e3:88:1a:de:14:42:f4:42:56:
-                    5c:67:9d:3a:9a:69:2c:d2:17:e5:75:ac:28:73:44:
-                    48:22:08:6b:3f:5a:82:4b:76:8a:59:3b:f9:55:51:
-                    b2:02:94:f2:68:12:13:6a:58:cb:c8:2a:01:15:4d:
-                    ed:f5:0f:03:61:4c:c2:94:bf:37:bf:d0:62:ad:51:
-                    2e:5a:eb:8a:e1:db:68:d7:96:14:7b:09:dd:75:12:
-                    5f:fe:72:40:3b:a0:ae:c2:0b:9d:ae:79:13:81:e1:
-                    cb:47:83:cd:ea:07:a6:00:41:a2:b4:08:16:fb:17:
-                    73:dd
+                    00:e2:a9:b9:44:17:83:cf:57:d4:22:86:54:52:d3:
+                    42:7d:03:84:9a:f9:3f:05:16:73:ad:4e:55:d1:d0:
+                    ad:f3:cf:fd:1a:80:38:73:50:b7:fa:13:c8:c6:69:
+                    38:4c:9c:4a:fb:c6:a0:a2:44:f3:7e:66:76:ec:dd:
+                    ef:e9:5d:2a:16:8b:b5:65:e3:78:e7:b7:e5:d1:88:
+                    c8:d8:e0:3a:8f:1c:bb:8c:b3:8d:8e:52:9f:bc:15:
+                    9f:92:12:8e:d5:56:84:dc:c1:f8:b8:58:d5:e9:be:
+                    72:2b:ad:aa:d4:63:b6:69:da:e0:4d:58:af:8a:3a:
+                    f7:85:2f:62:2b:24:c2:49:6f:1c:65:55:8c:92:bb:
+                    c1:23:47:38:9d:51:17:14:92:86:b7:9e:d0:07:1b:
+                    14:38:36:2c:ca:e6:77:b8:03:ec:53:04:44:29:d5:
+                    ae:91:41:52:48:5d:90:50:b0:63:32:97:f5:62:1a:
+                    08:11:96:2a:b4:97:66:1b:b4:56:b5:7e:c2:a9:5b:
+                    89:d8:fe:de:44:7c:ff:61:6e:f3:02:9f:88:30:eb:
+                    4b:80:14:48:84:33:ff:e4:28:c0:e3:5a:6a:55:dd:
+                    48:75:b2:61:e6:e9:f5:3d:3a:55:45:b4:93:4e:e0:
+                    03:c9:a1:de:8c:eb:30:8a:d3:8f:e7:1f:4a:a9:72:
+                    c2:bf
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
@@ -39,38 +39,41 @@
             Authority Information Access: 
                 CA Issuers - URI:http://aia-test.invalid
 
+            X509v3 Subject Alternative Name: 
+                DNS:aia-host.invalid
     Signature Algorithm: sha256WithRSAEncryption
-         c2:4f:77:17:5a:0b:78:99:c2:79:06:00:2a:6d:8a:f6:81:a9:
-         85:c4:99:dd:fc:b8:0e:77:20:14:13:bd:7e:f5:f7:79:87:f2:
-         e6:95:f8:68:4c:59:5c:46:9b:d8:f9:08:ee:ae:9d:11:f2:d6:
-         cc:1d:0a:d8:7c:16:fa:36:87:aa:6c:89:74:f0:66:16:9e:99:
-         ca:83:8a:ff:0d:20:3a:bd:05:38:52:98:f0:b6:74:3f:a8:6e:
-         48:02:86:7d:39:ee:7e:34:db:5c:38:1e:88:90:78:55:08:4c:
-         23:5e:e7:3d:e8:2f:66:b3:f1:30:ce:18:94:65:7c:62:08:50:
-         2f:29:db:aa:3c:f0:3a:a9:b3:ee:ee:19:cc:f7:0a:23:ba:0a:
-         51:f3:c5:af:6d:cc:8c:5f:77:d2:d2:32:f1:df:6d:e2:9c:1b:
-         03:b7:81:61:cc:11:09:94:e3:77:86:15:4e:ec:52:f8:d2:8c:
-         a3:31:83:20:f2:72:78:0e:c1:3d:af:6f:3c:7d:47:27:0b:97:
-         54:5f:be:c7:95:09:bd:5d:d6:a9:b7:27:29:58:fd:85:26:d5:
-         c1:c6:ac:63:17:9f:9c:f7:d8:ff:7c:f4:0a:8d:7d:da:8e:fc:
-         42:3b:43:4d:83:37:f8:62:32:e5:45:58:7b:45:11:19:2d:17:
-         68:ce:23:93
+         a1:98:0f:e0:29:2f:bb:f4:5e:56:15:a1:c6:2f:4a:26:1a:31:
+         b2:8e:85:31:aa:7f:96:db:bc:24:d1:10:88:fd:e1:fa:c0:5b:
+         e2:f3:44:0e:4c:ba:d4:46:3d:52:de:39:c2:4c:2e:bf:7c:f9:
+         37:27:99:1b:b9:6b:13:fc:51:df:a0:51:9f:26:c2:4a:03:cd:
+         f0:d9:5c:b8:1e:6e:f2:2c:52:d4:b0:a2:09:c4:c4:9d:b8:be:
+         a3:98:bf:38:b3:9d:78:f3:14:87:71:18:eb:f1:85:f3:37:7d:
+         f8:63:90:24:81:02:ec:04:33:ff:db:2e:f7:33:36:8c:37:ba:
+         89:94:4e:3a:12:0d:29:9f:ab:34:5f:28:0a:de:f5:cb:6e:f1:
+         ca:f2:e7:43:ea:e7:74:18:3c:e5:b1:12:a5:d8:db:66:64:21:
+         19:ac:bf:c1:cb:6b:a4:4a:2c:f0:11:de:a3:4c:1e:7b:82:f1:
+         28:44:b4:f7:44:06:69:de:cc:bd:88:ef:04:1d:27:57:5e:e4:
+         2f:ba:51:e8:43:50:f1:50:18:9b:7c:84:0e:cd:ac:f3:63:d5:
+         f0:68:39:3b:04:a5:7e:e4:51:17:95:24:7c:b9:31:50:ec:ed:
+         99:ef:a8:9a:02:36:b1:10:46:ea:0b:e1:d2:75:e7:93:7d:a5:
+         07:b1:47:93
 -----BEGIN CERTIFICATE-----
-MIIDHTCCAgWgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhBSUEg
-VGVzdCBJbnRlcm1lZGlhdGUgQ0EwHhcNMTQwODE0MDI0NjE4WhcNMjQwODExMDI0
-NjE4WjAbMRkwFwYDVQQDDBBhaWEtaG9zdC5pbnZhbGlkMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEA16giaOkyElpJy8tH35M0DS4OoOgwJ6dpR8z0/nat
-E5XS3DkFrWL3jyPWBByjhDCgDzd9+ijU80vkDM7AV5bEQD0gILB4GRupeq0gTqY5
-QjlI9RikBQManvXPVOI+XTjHXfiJ1F058BXblia7Ev6kxbD/bUH3+CWBbZkDkyB9
-KSW9FanqLZgDW1SIM6njiBreFEL0QlZcZ506mmks0hfldawoc0RIIghrP1qCS3aK
-WTv5VVGyApTyaBITaljLyCoBFU3t9Q8DYUzClL83v9BirVEuWuuK4dto15YUewnd
-dRJf/nJAO6CuwgudrnkTgeHLR4PN6gemAEGitAgW+xdz3QIDAQABo2QwYjAMBgNV
-HRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAzBggrBgEF
-BQcBAQQnMCUwIwYIKwYBBQUHMAKGF2h0dHA6Ly9haWEtdGVzdC5pbnZhbGlkMA0G
-CSqGSIb3DQEBCwUAA4IBAQDCT3cXWgt4mcJ5BgAqbYr2gamFxJnd/LgOdyAUE71+
-9fd5h/LmlfhoTFlcRpvY+Qjurp0R8tbMHQrYfBb6NoeqbIl08GYWnpnKg4r/DSA6
-vQU4UpjwtnQ/qG5IAoZ9Oe5+NNtcOB6IkHhVCEwjXuc96C9ms/EwzhiUZXxiCFAv
-KduqPPA6qbPu7hnM9wojugpR88WvbcyMX3fS0jLx323inBsDt4FhzBEJlON3hhVO
-7FL40oyjMYMg8nJ4DsE9r288fUcnC5dUX77HlQm9XdaptycpWP2FJtXBxqxjF5+c
-99j/fPQKjX3ajvxCO0NNgzf4YjLlRVh7RREZLRdoziOT
+MIIDOzCCAiOgAwIBAgIBATANBgkqhkiG9w0BAQsFADAjMSEwHwYDVQQDDBhBSUEg
+VGVzdCBJbnRlcm1lZGlhdGUgQ0EwHhcNMTcwMjI4MjMwMjM5WhcNMjcwMjI2MjMw
+MjM5WjAbMRkwFwYDVQQDDBBhaWEtaG9zdC5pbnZhbGlkMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4qm5RBeDz1fUIoZUUtNCfQOEmvk/BRZzrU5V0dCt
+88/9GoA4c1C3+hPIxmk4TJxK+8agokTzfmZ27N3v6V0qFou1ZeN457fl0YjI2OA6
+jxy7jLONjlKfvBWfkhKO1VaE3MH4uFjV6b5yK62q1GO2adrgTVivijr3hS9iKyTC
+SW8cZVWMkrvBI0c4nVEXFJKGt57QBxsUODYsyuZ3uAPsUwREKdWukUFSSF2QULBj
+Mpf1YhoIEZYqtJdmG7RWtX7CqVuJ2P7eRHz/YW7zAp+IMOtLgBRIhDP/5CjA41pq
+Vd1IdbJh5un1PTpVRbSTTuADyaHejOswitOP5x9KqXLCvwIDAQABo4GBMH8wDAYD
+VR0TAQH/BAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwMwYIKwYB
+BQUHAQEEJzAlMCMGCCsGAQUFBzAChhdodHRwOi8vYWlhLXRlc3QuaW52YWxpZDAb
+BgNVHREEFDASghBhaWEtaG9zdC5pbnZhbGlkMA0GCSqGSIb3DQEBCwUAA4IBAQCh
+mA/gKS+79F5WFaHGL0omGjGyjoUxqn+W27wk0RCI/eH6wFvi80QOTLrURj1S3jnC
+TC6/fPk3J5kbuWsT/FHfoFGfJsJKA83w2Vy4Hm7yLFLUsKIJxMSduL6jmL84s514
+8xSHcRjr8YXzN334Y5AkgQLsBDP/2y73MzaMN7qJlE46Eg0pn6s0XygK3vXLbvHK
+8udD6ud0GDzlsRKl2NtmZCEZrL/By2ukSizwEd6jTB57gvEoRLT3RAZp3sy9iO8E
+HSdXXuQvulHoQ1DxUBibfIQOzazzY9XwaDk7BKV+5FEXlSR8uTFQ7O2Z76iaAjax
+EEbqC+HSdeeTfaUHsUeT
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/aia-intermediate.der b/net/data/ssl/certificates/aia-intermediate.der
index f89a1b9..05249254 100644
--- a/net/data/ssl/certificates/aia-intermediate.der
+++ b/net/data/ssl/certificates/aia-intermediate.der
Binary files differ
diff --git a/net/data/ssl/certificates/aia-root.pem b/net/data/ssl/certificates/aia-root.pem
index 866b3ac..a7bee840 100644
--- a/net/data/ssl/certificates/aia-root.pem
+++ b/net/data/ssl/certificates/aia-root.pem
@@ -1,72 +1,72 @@
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 16253959350627671104 (0xe191a9e987cd1c40)
-    Signature Algorithm: sha1WithRSAEncryption
+        Serial Number: 9897276640789498169 (0x895a30aab2078939)
+    Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=AIA Test Root CA
         Validity
-            Not Before: Aug 14 02:46:18 2014 GMT
-            Not After : Aug 11 02:46:18 2024 GMT
+            Not Before: Feb 28 23:02:39 2017 GMT
+            Not After : Feb 26 23:02:39 2027 GMT
         Subject: CN=AIA Test Root CA
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:c4:5c:27:f1:69:03:2f:85:94:57:91:3c:21:13:
-                    f9:61:de:be:1c:99:b4:fe:e5:8c:8a:6d:e1:8c:fa:
-                    26:2d:56:a5:7d:81:00:c2:16:e9:14:8e:70:7a:72:
-                    22:25:66:09:14:32:b1:04:ad:74:fb:64:77:dc:42:
-                    73:b0:7f:0f:e6:8d:04:78:27:ec:42:f6:65:e4:b7:
-                    d9:f6:93:ba:64:2e:a8:ed:f8:df:68:c4:57:c0:72:
-                    ac:ab:b4:b5:0d:31:ce:7f:57:59:eb:27:f0:8a:30:
-                    5c:1a:5f:f0:65:a3:02:dc:ff:f6:c0:0f:56:ac:b6:
-                    aa:05:cc:3a:46:5c:ec:5e:db:55:6b:44:8f:05:63:
-                    17:c2:5a:67:87:87:17:35:48:09:ae:cc:a5:a3:c7:
-                    7e:2c:c5:7a:aa:2e:0a:a2:fc:2f:90:5e:0e:de:d5:
-                    4a:bc:c1:91:11:aa:91:a8:63:9c:74:9d:0a:80:81:
-                    30:3c:a5:f3:f8:5e:7a:19:08:b5:1a:a8:99:84:6a:
-                    20:fa:fe:3e:99:77:d0:6e:3e:4c:e4:c2:f6:2c:ec:
-                    ce:53:bd:de:56:bf:d2:be:0f:7a:b8:86:14:69:eb:
-                    a2:7b:53:cd:91:21:fd:b6:89:1c:a3:0f:4a:6a:12:
-                    89:19:70:e6:c8:d7:6c:10:d4:a7:f2:b8:36:e8:24:
-                    5b:e7
+                    00:99:a5:b7:7f:fe:7e:6c:e5:24:55:70:90:45:42:
+                    fc:a8:e6:af:93:f7:9d:a8:ed:a1:fd:92:21:ec:4d:
+                    be:db:08:9a:65:2a:c8:3e:5d:ec:bc:c9:47:af:43:
+                    f7:20:b1:4f:ee:51:58:23:c2:82:88:85:68:a3:d0:
+                    f2:77:68:ea:c7:64:b1:79:40:07:ac:69:2e:bd:9e:
+                    6d:1d:ec:52:89:df:2e:20:59:e5:af:07:da:8f:8c:
+                    74:d5:84:88:9b:e9:c1:63:68:34:50:85:22:e6:0d:
+                    39:60:83:c8:4d:fd:39:b2:fd:d3:57:68:dc:18:ae:
+                    b1:b7:51:4a:e6:02:9b:56:16:21:0e:a4:06:17:c9:
+                    91:ee:c1:34:ea:36:1e:b0:e9:d4:e5:02:48:29:dd:
+                    e2:6e:c7:5f:28:ef:3a:67:32:04:9e:9e:91:d2:15:
+                    7e:e9:3a:4c:5d:52:9c:72:09:59:a0:b3:36:8c:6a:
+                    c1:86:81:3b:e8:54:f4:35:77:f6:31:b6:6a:ca:60:
+                    fb:5b:34:38:a4:ca:6e:f2:a2:6f:e6:96:83:08:6b:
+                    bf:d5:37:e8:f7:db:60:06:eb:7a:76:cb:00:e8:de:
+                    2a:c0:ad:36:dc:7d:b7:63:f7:e7:b0:b4:a2:2a:7b:
+                    3f:03:d0:70:30:92:f3:f7:00:ca:d2:53:30:b8:a4:
+                    b7:73
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
-    Signature Algorithm: sha1WithRSAEncryption
-         6d:5e:d4:ec:95:4c:ea:ae:0e:d6:02:23:f7:6c:09:62:dd:71:
-         8d:37:83:0d:d0:9f:0c:02:6f:52:63:4a:75:df:d4:02:fd:d9:
-         4c:2b:f3:91:99:b5:08:96:f9:72:fa:95:63:1a:45:20:8c:3b:
-         75:30:6b:cf:b7:b4:15:60:da:8d:74:82:32:b9:58:15:df:b0:
-         85:5d:cf:ac:2e:bb:35:2e:29:92:90:cf:8d:ae:e8:59:74:00:
-         2f:74:1d:12:43:f8:2b:50:66:5e:05:5b:35:e2:86:a1:f2:ea:
-         a7:2d:5f:e8:52:4a:e2:78:be:e3:26:c3:36:55:98:6e:f0:6c:
-         6f:e0:3a:d3:77:17:4f:a8:a8:c4:9a:2b:cb:c8:31:1b:15:1c:
-         a5:b2:2a:2d:5f:06:61:cd:44:90:89:f4:24:32:b8:d4:39:46:
-         f6:c4:6f:de:06:c9:06:b7:62:fc:c1:49:be:85:ed:9d:5f:39:
-         2c:db:b3:25:6b:12:a6:ff:ea:27:72:53:16:b8:0b:63:a3:d1:
-         b9:6c:b5:df:51:af:23:70:21:76:a9:ad:ca:36:b6:bd:3b:0a:
-         96:f7:19:4c:0a:06:89:ef:74:ca:54:b8:ba:52:f9:f8:a1:06:
-         c2:e4:0c:56:26:19:f9:82:50:58:91:2d:87:6b:a2:19:4b:96:
-         c4:b9:c9:0b
+    Signature Algorithm: sha256WithRSAEncryption
+         0d:c5:f4:18:aa:e4:08:e9:9a:d5:99:6c:ab:e3:6c:3a:f7:22:
+         86:67:48:52:91:4b:55:18:e4:ce:c4:bb:2c:43:fe:67:d1:31:
+         ea:3e:29:00:ed:f7:ea:1a:5b:9c:9d:9c:fe:98:ac:9a:22:e2:
+         e2:af:86:90:3c:d0:f0:fa:e4:9d:1e:6f:a1:ad:18:4e:59:bf:
+         fb:d3:00:f7:aa:51:31:cb:b5:8e:79:fc:09:74:6c:aa:04:02:
+         d8:ed:69:22:62:b7:c8:ea:45:64:55:30:71:c2:fe:bd:02:c1:
+         a0:f6:40:aa:f8:ad:cf:d2:02:88:f1:69:fe:65:90:a9:5d:82:
+         8c:57:4c:f1:91:84:9e:c5:0f:5e:90:0d:4e:f1:0d:cf:b4:d4:
+         42:b4:68:78:29:2d:f2:da:5a:0d:7a:1d:16:97:68:54:1c:de:
+         30:04:a2:7a:a4:b7:b6:27:1f:98:94:bf:d6:82:16:fd:75:b2:
+         d5:2c:45:71:75:38:01:4e:8b:92:bb:70:b1:e1:10:37:b8:e0:
+         4d:64:a5:2c:29:9a:57:d9:df:14:95:64:58:a9:87:4e:7c:3f:
+         49:cc:f2:b9:6c:d0:76:fc:1b:2e:83:d9:43:40:87:fd:0f:d5:
+         26:04:fa:a9:cd:a7:07:ac:e2:d3:bc:2a:75:4e:c3:e9:2a:f1:
+         21:b2:62:d6
 -----BEGIN CERTIFICATE-----
-MIIC3DCCAcSgAwIBAgIJAOGRqemHzRxAMA0GCSqGSIb3DQEBBQUAMBsxGTAXBgNV
-BAMMEEFJQSBUZXN0IFJvb3QgQ0EwHhcNMTQwODE0MDI0NjE4WhcNMjQwODExMDI0
-NjE4WjAbMRkwFwYDVQQDDBBBSUEgVGVzdCBSb290IENBMIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAxFwn8WkDL4WUV5E8IRP5Yd6+HJm0/uWMim3hjPom
-LValfYEAwhbpFI5wenIiJWYJFDKxBK10+2R33EJzsH8P5o0EeCfsQvZl5LfZ9pO6
-ZC6o7fjfaMRXwHKsq7S1DTHOf1dZ6yfwijBcGl/wZaMC3P/2wA9WrLaqBcw6Rlzs
-XttVa0SPBWMXwlpnh4cXNUgJrsylo8d+LMV6qi4KovwvkF4O3tVKvMGREaqRqGOc
-dJ0KgIEwPKXz+F56GQi1GqiZhGog+v4+mXfQbj5M5ML2LOzOU73eVr/Svg96uIYU
-aeuie1PNkSH9tokcow9KahKJGXDmyNdsENSn8rg26CRb5wIDAQABoyMwITAPBgNV
-HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEA
-bV7U7JVM6q4O1gIj92wJYt1xjTeDDdCfDAJvUmNKdd/UAv3ZTCvzkZm1CJb5cvqV
-YxpFIIw7dTBrz7e0FWDajXSCMrlYFd+whV3PrC67NS4pkpDPja7oWXQAL3QdEkP4
-K1BmXgVbNeKGofLqpy1f6FJK4ni+4ybDNlWYbvBsb+A603cXT6ioxJory8gxGxUc
-pbIqLV8GYc1EkIn0JDK41DlG9sRv3gbJBrdi/MFJvoXtnV85LNuzJWsSpv/qJ3JT
-FrgLY6PRuWy131GvI3Ahdqmtyja2vTsKlvcZTAoGie90ylS4ulL5+KEGwuQMViYZ
-+YJQWJEth2uiGUuWxLnJCw==
+MIIC3DCCAcSgAwIBAgIJAIlaMKqyB4k5MA0GCSqGSIb3DQEBCwUAMBsxGTAXBgNV
+BAMMEEFJQSBUZXN0IFJvb3QgQ0EwHhcNMTcwMjI4MjMwMjM5WhcNMjcwMjI2MjMw
+MjM5WjAbMRkwFwYDVQQDDBBBSUEgVGVzdCBSb290IENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEAmaW3f/5+bOUkVXCQRUL8qOavk/edqO2h/ZIh7E2+
+2wiaZSrIPl3svMlHr0P3ILFP7lFYI8KCiIVoo9Dyd2jqx2SxeUAHrGkuvZ5tHexS
+id8uIFnlrwfaj4x01YSIm+nBY2g0UIUi5g05YIPITf05sv3TV2jcGK6xt1FK5gKb
+VhYhDqQGF8mR7sE06jYesOnU5QJIKd3ibsdfKO86ZzIEnp6R0hV+6TpMXVKccglZ
+oLM2jGrBhoE76FT0NXf2MbZqymD7WzQ4pMpu8qJv5paDCGu/1Tfo99tgBut6dssA
+6N4qwK023H23Y/fnsLSiKns/A9BwMJLz9wDK0lMwuKS3cwIDAQABoyMwITAPBgNV
+HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEA
+DcX0GKrkCOma1Zlsq+NsOvcihmdIUpFLVRjkzsS7LEP+Z9Ex6j4pAO336hpbnJ2c
+/pismiLi4q+GkDzQ8PrknR5voa0YTlm/+9MA96pRMcu1jnn8CXRsqgQC2O1pImK3
+yOpFZFUwccL+vQLBoPZAqvitz9ICiPFp/mWQqV2CjFdM8ZGEnsUPXpANTvENz7TU
+QrRoeCkt8tpaDXodFpdoVBzeMASieqS3ticfmJS/1oIW/XWy1SxFcXU4AU6Lkrtw
+seEQN7jgTWSlLCmaV9nfFJVkWKmHTnw/SczyuWzQdvwbLoPZQ0CH/Q/VJgT6qc2n
+B6zi07wqdU7D6SrxIbJi1g==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/explicit-policy-chain.pem b/net/data/ssl/certificates/explicit-policy-chain.pem
index e8e76e2..5f6c143e 100644
--- a/net/data/ssl/certificates/explicit-policy-chain.pem
+++ b/net/data/ssl/certificates/explicit-policy-chain.pem
@@ -5,31 +5,31 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=Policy Test Intermediate CA
         Validity
-            Not Before: Aug 14 02:47:04 2014 GMT
-            Not After : Aug 11 02:47:04 2024 GMT
+            Not Before: Feb 28 23:52:34 2017 GMT
+            Not After : Feb 26 23:52:34 2027 GMT
         Subject: CN=policy_test.example
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:d0:68:ed:42:48:45:60:62:ba:1a:cd:d1:9a:a0:
-                    fc:4d:3a:a9:d3:dd:29:84:0b:4b:7f:c6:81:d1:a6:
-                    7c:27:4c:35:ab:81:4d:60:2c:98:94:82:2c:50:50:
-                    27:a5:53:c9:c4:82:99:30:60:5e:87:73:03:d8:b0:
-                    f0:7b:a4:45:28:8f:82:b4:d8:4d:8d:e0:1b:b7:38:
-                    1c:50:54:2a:fe:59:2e:b7:ca:14:5b:0b:5c:5c:40:
-                    fc:87:08:87:37:b7:a4:6c:56:fa:fe:26:98:30:92:
-                    f9:c1:ca:aa:32:b2:61:9e:2c:50:62:4d:b1:78:fe:
-                    0e:a9:fb:91:e6:6b:f7:d0:ac:12:4a:e9:f4:9e:00:
-                    37:9f:6a:9c:d4:b1:05:8e:07:b2:e2:6d:ac:4e:b9:
-                    7a:5a:26:c2:f5:5b:8a:29:52:bd:1d:04:fc:07:38:
-                    e8:f4:d1:18:c5:97:1e:cc:46:35:d7:0f:9d:0d:3e:
-                    98:c4:d9:18:15:46:82:79:78:21:1b:73:17:35:dd:
-                    b9:fb:8c:b7:d4:f7:08:2f:cb:43:c6:2f:25:c7:fc:
-                    22:1e:49:cd:59:dd:a1:0f:53:bf:8e:92:f4:25:5e:
-                    fd:de:f4:98:de:c2:c1:8b:ce:a3:3a:0e:48:94:2a:
-                    b3:c3:b0:48:cf:5f:16:14:83:b1:7b:0f:30:68:83:
-                    d1:37
+                    00:b3:2a:fe:85:4f:88:af:bb:62:62:b7:03:a7:c4:
+                    d7:29:37:d6:73:31:22:93:d1:5f:33:f6:8f:bf:33:
+                    00:a6:ae:72:da:cb:3d:86:3b:f8:22:29:32:a7:4f:
+                    aa:21:fd:43:47:83:18:96:c2:5c:76:f2:9a:6a:e1:
+                    49:84:22:1f:a7:d6:d6:a9:ce:d5:06:17:e3:67:65:
+                    1b:9a:05:38:2b:ee:e5:7b:ed:4e:69:b8:13:78:bc:
+                    41:b5:19:30:6a:13:d7:94:a9:d6:63:96:54:fb:61:
+                    a6:64:3a:ec:2a:83:27:c7:85:6d:57:1b:0a:67:aa:
+                    a2:ac:56:ef:24:24:62:df:46:4d:cc:75:25:db:19:
+                    7c:75:29:41:cc:88:c1:4d:a8:cc:ec:d5:23:a0:34:
+                    e7:96:57:6a:92:f8:34:ce:26:0c:41:29:99:be:54:
+                    db:d9:6f:45:5d:f7:f2:6d:c2:8b:fe:e6:4a:29:4f:
+                    74:8b:70:d5:8f:7f:64:b7:70:c6:2c:5a:01:d5:1d:
+                    6b:bb:ad:9f:3f:44:33:fe:dc:60:9a:79:a6:dc:ac:
+                    fb:79:f9:b5:f0:7f:e0:ea:96:e5:1a:bf:24:3c:e4:
+                    4f:55:3c:64:c0:d2:28:ee:b3:8d:c4:9b:a4:63:60:
+                    eb:ca:28:54:7e:d1:61:e9:cb:f6:14:d1:77:f5:f3:
+                    aa:89
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
@@ -39,40 +39,42 @@
             X509v3 Certificate Policies: 
                 Policy: 1.2.3.4
 
+            X509v3 Subject Alternative Name: 
+                DNS:policy_test.example
     Signature Algorithm: sha256WithRSAEncryption
-         55:fc:fd:62:cd:93:0f:09:1e:6c:d8:ef:95:8c:d9:0c:a9:de:
-         3e:d2:2b:70:83:33:e1:da:b1:72:c0:13:b5:4a:ef:bf:94:38:
-         c3:b3:df:40:52:74:5a:1b:ae:4b:d3:c9:1f:c2:6c:c6:3d:43:
-         fd:03:31:9d:45:a6:26:c2:56:b1:79:36:26:11:c5:dd:23:e1:
-         1b:62:a4:c3:0f:9a:d9:ab:f5:94:53:e2:7a:53:ea:96:48:55:
-         8c:da:e0:11:2a:cc:46:7f:05:e6:90:cb:c8:54:50:38:d2:c8:
-         f9:96:40:65:02:96:7b:2e:6a:46:c2:79:6d:d6:3e:63:2e:77:
-         e8:19:72:94:8a:a2:f4:cd:2a:9f:3d:63:1b:00:c7:57:89:3f:
-         e5:06:a5:ae:b7:f4:5f:3a:20:96:11:5f:2e:fc:7a:61:23:c1:
-         15:b2:8f:07:74:69:4f:74:23:1d:7a:77:02:33:79:47:8c:c4:
-         46:f7:4f:57:16:33:44:13:1d:b5:6d:4f:77:a1:97:41:e9:29:
-         8b:49:f4:38:e3:42:21:10:c5:9c:a2:84:fa:0b:04:5c:2d:30:
-         ab:4e:0a:9c:30:50:a7:62:9b:c1:5c:6d:06:38:34:1a:cc:2b:
-         7f:20:9d:8f:ad:59:8e:4a:da:b8:88:e2:0d:de:cb:65:37:0c:
-         cc:8f:c4:c1
+         c4:94:39:60:06:55:5d:2e:af:55:e2:ab:e5:b5:fc:96:fd:24:
+         c2:08:80:fd:55:e4:d1:5c:c8:44:d2:9f:0c:0f:1a:47:2f:da:
+         33:f9:1b:11:aa:27:1c:81:e0:ba:0e:77:26:97:08:6b:80:2e:
+         81:d6:e2:37:22:33:75:31:33:41:0e:40:1a:bd:b7:8a:3e:95:
+         b6:d4:1f:bf:30:ae:75:e5:45:32:85:67:33:56:c1:42:30:7f:
+         bf:9c:ad:bc:69:91:a9:71:f9:96:1e:85:b9:7b:ea:45:ee:85:
+         1a:50:8e:05:04:69:fc:86:2b:52:54:9b:5e:f6:a0:8f:49:0d:
+         f9:d0:63:94:4e:04:e3:eb:fb:47:17:79:76:00:0c:d1:da:2c:
+         1e:8c:11:04:92:9b:01:a5:38:fb:3f:8b:7f:27:04:07:af:40:
+         8b:f3:62:e0:7e:d2:37:e5:ea:ef:98:ef:92:d7:06:59:ee:e5:
+         83:e0:f5:4a:9a:9e:cf:38:11:e1:f8:f3:9d:3d:21:4c:ea:6b:
+         34:44:e1:2c:5e:eb:0e:cd:77:8a:5a:a8:40:f9:03:ff:f4:47:
+         a7:f8:1d:d0:43:38:b6:06:c2:67:2a:42:92:44:ad:6d:c9:e7:
+         d0:60:89:82:21:fc:c5:ea:e6:21:94:26:a3:76:02:05:c5:4c:
+         34:d3:5f:2d
 -----BEGIN CERTIFICATE-----
-MIIDADCCAeigAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDDBtQb2xp
-Y3kgVGVzdCBJbnRlcm1lZGlhdGUgQ0EwHhcNMTQwODE0MDI0NzA0WhcNMjQwODEx
-MDI0NzA0WjAeMRwwGgYDVQQDDBNwb2xpY3lfdGVzdC5leGFtcGxlMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0GjtQkhFYGK6Gs3RmqD8TTqp090phAtL
-f8aB0aZ8J0w1q4FNYCyYlIIsUFAnpVPJxIKZMGBeh3MD2LDwe6RFKI+CtNhNjeAb
-tzgcUFQq/lkut8oUWwtcXED8hwiHN7ekbFb6/iaYMJL5wcqqMrJhnixQYk2xeP4O
-qfuR5mv30KwSSun0ngA3n2qc1LEFjgey4m2sTrl6WibC9VuKKVK9HQT8Bzjo9NEY
-xZcezEY11w+dDT6YxNkYFUaCeXghG3MXNd25+4y31PcIL8tDxi8lx/wiHknNWd2h
-D1O/jpL0JV793vSY3sLBi86jOg5IlCqzw7BIz18WFIOxew8waIPRNwIDAQABo0Ew
-PzAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAQ
-BgNVHSAECTAHMAUGAyoDBDANBgkqhkiG9w0BAQsFAAOCAQEAVfz9Ys2TDwkebNjv
-lYzZDKnePtIrcIMz4dqxcsATtUrvv5Q4w7PfQFJ0WhuuS9PJH8Jsxj1D/QMxnUWm
-JsJWsXk2JhHF3SPhG2Kkww+a2av1lFPielPqlkhVjNrgESrMRn8F5pDLyFRQONLI
-+ZZAZQKWey5qRsJ5bdY+Yy536BlylIqi9M0qnz1jGwDHV4k/5Qalrrf0XzoglhFf
-Lvx6YSPBFbKPB3RpT3QjHXp3AjN5R4zERvdPVxYzRBMdtW1Pd6GXQekpi0n0OONC
-IRDFnKKE+gsEXC0wq04KnDBQp2KbwVxtBjg0GswrfyCdj61ZjkrauIjiDd7LZTcM
-zI/EwQ==
+MIIDIDCCAgigAwIBAgIBATANBgkqhkiG9w0BAQsFADAmMSQwIgYDVQQDDBtQb2xp
+Y3kgVGVzdCBJbnRlcm1lZGlhdGUgQ0EwHhcNMTcwMjI4MjM1MjM0WhcNMjcwMjI2
+MjM1MjM0WjAeMRwwGgYDVQQDDBNwb2xpY3lfdGVzdC5leGFtcGxlMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyr+hU+Ir7tiYrcDp8TXKTfWczEik9Ff
+M/aPvzMApq5y2ss9hjv4Iikyp0+qIf1DR4MYlsJcdvKaauFJhCIfp9bWqc7VBhfj
+Z2UbmgU4K+7le+1OabgTeLxBtRkwahPXlKnWY5ZU+2GmZDrsKoMnx4VtVxsKZ6qi
+rFbvJCRi30ZNzHUl2xl8dSlBzIjBTajM7NUjoDTnlldqkvg0ziYMQSmZvlTb2W9F
+XffybcKL/uZKKU90i3DVj39kt3DGLFoB1R1ru62fP0Qz/txgmnmm3Kz7efm18H/g
+6pblGr8kPORPVTxkwNIo7rONxJukY2DryihUftFh6cv2FNF39fOqiQIDAQABo2Ew
+XzAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjAQ
+BgNVHSAECTAHMAUGAyoDBDAeBgNVHREEFzAVghNwb2xpY3lfdGVzdC5leGFtcGxl
+MA0GCSqGSIb3DQEBCwUAA4IBAQDElDlgBlVdLq9V4qvltfyW/STCCID9VeTRXMhE
+0p8MDxpHL9oz+RsRqiccgeC6DncmlwhrgC6B1uI3IjN1MTNBDkAavbeKPpW21B+/
+MK515UUyhWczVsFCMH+/nK28aZGpcfmWHoW5e+pF7oUaUI4FBGn8hitSVJte9qCP
+SQ350GOUTgTj6/tHF3l2AAzR2iwejBEEkpsBpTj7P4t/JwQHr0CL82LgftI35erv
+mO+S1wZZ7uWD4PVKmp7POBHh+POdPSFM6ms0ROEsXusOzXeKWqhA+QP/9Een+B3Q
+Qzi2BsJnKkKSRK1tyefQYImCIfzF6uYhlCajdgIFxUw0018t
 -----END CERTIFICATE-----
 Certificate:
     Data:
@@ -81,31 +83,31 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=Policy Test Root CA
         Validity
-            Not Before: Aug 14 02:47:04 2014 GMT
-            Not After : Aug 11 02:47:04 2024 GMT
+            Not Before: Feb 28 23:52:34 2017 GMT
+            Not After : Feb 26 23:52:34 2027 GMT
         Subject: CN=Policy Test Intermediate CA
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ce:aa:c0:cb:1f:fa:f0:d9:e0:a3:69:f6:94:02:
-                    86:7b:89:ce:37:85:c4:df:35:36:cf:24:57:d2:b6:
-                    7a:f5:0b:a6:37:ab:6c:4a:2e:6a:87:c2:d4:64:53:
-                    74:fa:01:42:4c:ee:a5:79:eb:61:fe:9d:47:1f:65:
-                    27:9f:b8:ca:4a:06:92:fa:a7:49:47:51:32:48:7d:
-                    5d:1e:ac:b4:03:33:87:6b:d4:5a:ae:05:45:3e:cc:
-                    10:2d:e5:dc:31:56:cd:1f:22:3b:b8:84:ff:6d:e2:
-                    26:ec:6f:ef:18:7f:8b:a3:fe:d7:7c:81:8a:bf:bb:
-                    0e:63:09:1a:0b:89:02:be:e9:c6:59:c7:28:d8:6d:
-                    41:c2:2a:d2:c2:d5:03:6d:cd:3d:62:47:78:95:36:
-                    67:a2:5e:ae:0a:0c:da:75:df:dc:6d:04:42:0a:f2:
-                    88:70:a9:29:d1:c3:db:17:b7:62:f1:e7:a4:29:a7:
-                    78:de:8a:c1:51:64:5e:39:21:e6:75:40:bf:7c:2e:
-                    bf:c8:8e:c2:86:23:b9:f4:67:80:7e:59:d1:a1:77:
-                    7c:da:ec:ed:37:e9:e8:b9:98:7f:c1:5d:29:9f:c7:
-                    c2:c5:68:89:b7:0f:f1:ec:30:96:72:bf:b0:a0:fd:
-                    0e:ce:92:d2:54:2d:ca:d6:6b:4c:c6:95:60:4e:bd:
-                    25:f9
+                    00:c9:2b:9e:41:e1:bd:db:2c:15:20:25:6b:02:2f:
+                    9d:f5:10:12:22:2e:c4:93:ee:99:1c:92:50:02:d4:
+                    70:49:cc:bf:92:54:e0:04:5a:52:d8:c9:5e:74:1a:
+                    74:57:22:20:7a:8e:d8:bc:d2:02:bb:85:ec:9b:6b:
+                    80:51:d2:a4:47:6e:f6:fb:16:e2:d8:7b:58:5e:e5:
+                    22:62:68:e9:c9:f6:ff:0a:f9:ca:65:da:12:da:24:
+                    55:de:43:ef:51:54:d2:ac:db:ec:d6:13:5b:29:e1:
+                    6e:66:a1:71:f0:88:9b:23:d6:e1:79:aa:b6:76:7d:
+                    63:f6:19:63:14:5e:db:9f:28:1d:07:92:db:69:8f:
+                    fb:d5:4c:de:eb:3a:8b:df:5c:77:26:5e:f4:3f:a2:
+                    ed:19:ad:76:f0:8c:71:9c:cd:d7:c6:0c:95:6a:9b:
+                    ec:4a:e0:50:68:61:19:17:44:09:6c:93:22:03:4a:
+                    f6:e9:4c:ca:88:4d:cd:e1:a6:20:8c:a6:dc:43:f7:
+                    c3:4c:61:89:2d:db:12:74:57:00:8a:a6:e2:0e:1a:
+                    1b:93:12:f9:63:b5:01:12:07:a1:b4:4a:2a:7f:8d:
+                    c8:ab:25:fb:0a:cd:ed:18:ba:32:94:50:b9:6d:3c:
+                    f2:67:45:61:73:84:25:0d:43:86:78:b9:11:e9:51:
+                    e7:95
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
@@ -120,109 +122,109 @@
                 Policy: 1.2.3.5
 
     Signature Algorithm: sha256WithRSAEncryption
-         97:3a:32:09:ae:fd:00:bc:17:22:f5:d0:17:e9:c0:0f:60:af:
-         3c:3d:8e:53:6b:92:80:4d:0f:bc:9c:7e:96:6f:63:c8:7e:d6:
-         f7:68:6d:b6:5f:64:09:fd:03:27:37:1e:0b:b1:ad:e6:7b:14:
-         a6:d5:8c:0b:a2:83:3b:82:1c:db:8d:d8:53:f7:17:22:ef:d8:
-         fd:89:bc:19:b3:f0:fa:cc:bc:9f:47:e8:5d:27:4f:a3:c5:fc:
-         bc:28:6c:ff:12:81:10:0d:10:9b:3b:29:ee:9b:8f:78:01:29:
-         25:0e:97:61:93:1b:68:d2:be:b2:9a:45:c8:e6:34:f2:de:c1:
-         74:c2:21:b8:44:57:41:f6:5c:c1:87:0b:f3:2c:fe:6d:28:8d:
-         fe:e2:6b:95:19:89:27:9a:6e:b9:de:d3:65:7f:85:7c:18:80:
-         d3:ad:48:cc:ed:5f:a2:b4:ee:ef:54:6b:e2:32:b9:b8:1e:34:
-         e4:38:f2:1d:79:fa:2c:d8:cc:6b:3f:bb:65:e1:c1:46:54:86:
-         9f:99:08:6f:65:bd:dc:e3:20:f4:b2:01:80:ee:66:85:d4:4e:
-         66:46:db:45:00:26:e5:16:3f:69:88:04:48:cf:9b:4e:f8:49:
-         e7:ed:26:47:3d:28:72:6c:ae:bc:70:e9:8a:d9:1e:67:84:f6:
-         2c:20:73:0e
+         67:fd:e1:e8:91:20:ed:e6:f6:b3:41:27:07:b8:cc:55:ea:90:
+         7e:cc:11:6a:e9:02:24:95:86:8d:68:72:50:a3:d5:9c:bd:34:
+         78:3b:65:73:78:5c:9a:b6:da:5f:78:01:65:ed:da:5d:fe:fb:
+         cb:ef:a4:22:75:c0:cb:3b:c8:e0:ca:91:08:4d:f4:d9:cf:73:
+         16:09:e9:cc:09:96:6f:97:a6:4f:cb:72:c9:5d:ea:3b:21:bf:
+         e2:0e:18:ac:97:51:b1:81:02:1f:f5:a6:26:25:76:2b:8c:c7:
+         2c:66:be:03:b2:de:5a:6f:c6:bb:44:9f:b2:1a:75:76:4f:bb:
+         d0:2a:67:e3:51:69:9d:1d:6f:0a:8c:f1:d9:1d:16:aa:c3:7d:
+         b8:38:fa:a1:90:2b:15:dc:81:b2:80:66:6e:b6:69:83:03:88:
+         c6:2e:03:2a:ea:9c:5e:ea:98:9c:b3:93:21:d8:f9:6d:2e:ec:
+         40:d3:bf:f5:53:69:b0:0f:4d:d9:6b:6c:ac:bc:f8:e8:12:13:
+         d1:58:16:0a:7f:13:14:31:72:69:90:d3:2f:d1:2e:d0:b2:f7:
+         14:c9:4f:0c:d8:95:21:9f:9d:b8:4d:ae:80:75:3c:92:f9:a7:
+         5a:4a:1c:6c:b2:19:a5:e6:1a:7b:a6:5d:c3:e9:a9:ae:c9:2e:
+         7a:8b:a3:6c
 -----BEGIN CERTIFICATE-----
 MIIDETCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQsFADAeMRwwGgYDVQQDDBNQb2xp
-Y3kgVGVzdCBSb290IENBMB4XDTE0MDgxNDAyNDcwNFoXDTI0MDgxMTAyNDcwNFow
+Y3kgVGVzdCBSb290IENBMB4XDTE3MDIyODIzNTIzNFoXDTI3MDIyNjIzNTIzNFow
 JjEkMCIGA1UEAwwbUG9saWN5IFRlc3QgSW50ZXJtZWRpYXRlIENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzqrAyx/68Nngo2n2lAKGe4nON4XE3zU2
-zyRX0rZ69QumN6tsSi5qh8LUZFN0+gFCTO6leeth/p1HH2Unn7jKSgaS+qdJR1Ey
-SH1dHqy0AzOHa9RargVFPswQLeXcMVbNHyI7uIT/beIm7G/vGH+Lo/7XfIGKv7sO
-YwkaC4kCvunGWcco2G1BwirSwtUDbc09Ykd4lTZnol6uCgzadd/cbQRCCvKIcKkp
-0cPbF7di8eekKad43orBUWReOSHmdUC/fC6/yI7ChiO59GeAflnRoXd82uztN+no
-uZh/wV0pn8fCxWiJtw/x7DCWcr+woP0OzpLSVC3K1mtMxpVgTr0l+QIDAQABo1Iw
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAySueQeG92ywVICVrAi+d9RASIi7Ek+6Z
+HJJQAtRwScy/klTgBFpS2MledBp0VyIgeo7YvNICu4Xsm2uAUdKkR272+xbi2HtY
+XuUiYmjpyfb/CvnKZdoS2iRV3kPvUVTSrNvs1hNbKeFuZqFx8IibI9bheaq2dn1j
+9hljFF7bnygdB5LbaY/71Uze6zqL31x3Jl70P6LtGa128IxxnM3XxgyVapvsSuBQ
+aGEZF0QJbJMiA0r26UzKiE3N4aYgjKbcQ/fDTGGJLdsSdFcAiqbiDhobkxL5Y7UB
+EgehtEoqf43IqyX7Cs3tGLoylFC5bTzyZ0Vhc4QlDUOGeLkR6VHnlQIDAQABo1Iw
 UDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAMBgNVHSQEBTADgAEA
 MB8GA1UdIAQYMBYwBQYDKgMEMAYGBCoDBAUwBQYDKgMFMA0GCSqGSIb3DQEBCwUA
-A4IBAQCXOjIJrv0AvBci9dAX6cAPYK88PY5Ta5KATQ+8nH6Wb2PIftb3aG22X2QJ
-/QMnNx4Lsa3mexSm1YwLooM7ghzbjdhT9xci79j9ibwZs/D6zLyfR+hdJ0+jxfy8
-KGz/EoEQDRCbOynum494ASklDpdhkxto0r6ymkXI5jTy3sF0wiG4RFdB9lzBhwvz
-LP5tKI3+4muVGYknmm653tNlf4V8GIDTrUjM7V+itO7vVGviMrm4HjTkOPIdefos
-2MxrP7tl4cFGVIafmQhvZb3c4yD0sgGA7maF1E5mRttFACblFj9piARIz5tO+Enn
-7SZHPShybK68cOmK2R5nhPYsIHMO
+A4IBAQBn/eHokSDt5vazQScHuMxV6pB+zBFq6QIklYaNaHJQo9WcvTR4O2VzeFya
+ttpfeAFl7dpd/vvL76QidcDLO8jgypEITfTZz3MWCenMCZZvl6ZPy3LJXeo7Ib/i
+Dhisl1GxgQIf9aYmJXYrjMcsZr4Dst5ab8a7RJ+yGnV2T7vQKmfjUWmdHW8KjPHZ
+HRaqw324OPqhkCsV3IGygGZutmmDA4jGLgMq6pxe6pics5Mh2PltLuxA07/1U2mw
+D03Za2ysvPjoEhPRWBYKfxMUMXJpkNMv0S7QsvcUyU8M2JUhn524Ta6AdTyS+ada
+Shxsshml5hp7pl3D6amuyS56i6Ns
 -----END CERTIFICATE-----
 Certificate:
     Data:
         Version: 3 (0x2)
-        Serial Number: 14176371491008760447 (0xc4bc96c2ed8d4a7f)
-    Signature Algorithm: sha1WithRSAEncryption
+        Serial Number: 14437560522667520790 (0xc85c84cd48ccf316)
+    Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=Policy Test Root CA
         Validity
-            Not Before: Aug 14 02:47:04 2014 GMT
-            Not After : Aug 11 02:47:04 2024 GMT
+            Not Before: Feb 28 23:52:34 2017 GMT
+            Not After : Feb 26 23:52:34 2027 GMT
         Subject: CN=Policy Test Root CA
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:be:69:b6:16:0b:d4:be:8d:b3:98:4f:b8:64:64:
-                    5c:2f:37:5a:e7:a8:56:01:19:b0:46:91:b7:1d:05:
-                    51:57:73:c7:cb:68:24:98:26:e6:b6:39:db:bb:4d:
-                    d0:06:6b:03:bc:06:e4:7b:43:2d:48:6a:28:3e:75:
-                    c8:82:f8:27:86:fb:84:a8:b1:90:fe:b9:2a:07:d1:
-                    15:ca:be:0a:a4:e1:88:6a:01:0c:57:27:a3:d1:ad:
-                    f6:00:3b:15:98:e9:80:04:08:ac:26:be:0c:38:28:
-                    44:b5:2c:f1:75:c5:03:de:81:ec:d9:da:60:38:fb:
-                    04:7f:36:df:72:bd:2b:c4:bb:37:88:d5:88:14:73:
-                    51:f8:7f:d6:f4:40:a4:05:0b:26:9a:c9:23:3e:ba:
-                    e0:fc:76:6e:81:69:65:33:c0:d4:8d:78:d4:45:c9:
-                    90:14:60:cb:71:88:21:0c:a9:94:09:45:48:4a:29:
-                    f2:f2:5e:37:34:85:38:35:75:a9:52:06:d3:58:ed:
-                    b8:09:ab:5c:4d:1a:e9:61:79:a0:97:64:99:58:97:
-                    79:70:25:4d:ca:bf:01:6d:e0:6c:29:51:17:79:46:
-                    fd:31:44:be:e6:6a:47:be:1d:4e:75:72:08:5f:b2:
-                    e0:49:e2:54:57:d5:e9:f7:72:b1:ee:aa:ee:41:4b:
-                    e9:f5
+                    00:a0:e3:a7:af:b8:fa:3b:ee:47:d2:5a:ad:21:a2:
+                    71:42:4e:a6:a3:c7:82:94:b9:32:3c:6d:14:39:67:
+                    19:65:64:1f:8b:b5:c4:6d:88:12:2c:85:e2:ef:97:
+                    04:f5:9f:ee:13:65:a7:f5:86:c7:5b:20:1d:fe:47:
+                    71:a7:ab:04:69:52:0f:ea:6c:42:58:7b:89:32:49:
+                    54:14:da:d3:ad:ef:b8:7a:cc:8c:7f:16:0e:2a:b6:
+                    0e:7b:df:a5:ee:26:ff:b0:c9:6b:65:6e:15:02:b5:
+                    f4:4f:e5:6a:e1:b8:45:63:55:f9:61:0d:f6:27:cf:
+                    f3:10:ae:4a:0a:57:25:5c:de:b1:c5:8e:b2:bc:f1:
+                    b9:f2:99:c4:27:1d:53:0b:2b:7c:2a:fd:fc:73:7e:
+                    f4:ad:44:bc:8b:47:23:bd:c1:54:f3:ed:0b:ee:53:
+                    a7:9c:50:bd:32:0a:67:e2:b6:04:3e:c8:5e:da:fb:
+                    ab:7c:5c:c9:68:3c:5a:f2:c6:5e:b9:22:38:f3:10:
+                    b4:2d:e2:87:12:3a:4a:53:54:6b:92:e6:f1:eb:ba:
+                    47:b8:f1:80:3e:2c:2f:87:13:1e:dc:09:bc:a4:0c:
+                    4f:e2:df:db:53:e0:af:5d:34:b1:39:06:7f:8a:7b:
+                    12:e8:6c:01:e7:ce:d7:b7:a6:ac:3d:b7:ba:af:3f:
+                    46:93
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Key Usage: critical
                 Digital Signature, Certificate Sign, CRL Sign
-    Signature Algorithm: sha1WithRSAEncryption
-         12:68:0b:48:46:69:a0:cc:08:f0:16:c0:b8:2a:66:7a:a8:9d:
-         98:c4:9a:c5:07:02:5c:14:4a:75:3a:36:1f:47:6e:21:c4:6a:
-         cd:05:e6:76:b8:f2:f6:37:34:42:14:88:02:35:f9:69:a5:1e:
-         05:ad:8f:98:8e:32:fb:6d:6b:bf:c4:a3:a0:96:d5:b3:92:ec:
-         48:54:34:fe:92:2f:6a:e7:7c:ad:85:66:3e:bc:4c:07:c1:23:
-         08:a8:7d:b1:7e:3c:b0:e1:f1:9a:00:7b:e8:11:b8:c3:46:55:
-         6a:37:b5:be:25:be:02:79:ed:03:59:3f:25:2d:a5:e1:36:a9:
-         10:d7:7e:53:f9:ea:9d:bf:1e:b8:cb:b1:78:54:1f:34:a8:df:
-         af:75:0b:39:d0:96:c9:65:0c:05:df:7f:78:35:19:51:f5:15:
-         13:35:58:fb:2c:78:53:5a:c9:4d:e2:3b:1b:6e:68:57:59:1b:
-         4d:f4:c0:d7:b4:dc:6c:a3:cd:1f:b4:b8:ce:d1:70:f7:cf:15:
-         e7:9b:c9:35:db:30:8e:ce:4b:f6:58:4e:8c:1f:cb:7f:90:fa:
-         5a:40:70:b7:fb:a0:9c:13:d7:7b:45:f4:7f:3f:ea:79:29:da:
-         15:bb:94:dd:d3:a3:11:95:00:8b:2c:32:a9:33:66:59:50:5a:
-         e9:68:32:b4
+    Signature Algorithm: sha256WithRSAEncryption
+         6c:7f:d4:57:18:85:22:1d:87:15:45:3a:16:0d:df:06:3e:9c:
+         ed:1d:99:7b:78:75:90:5c:8f:d2:38:58:46:3e:2b:d2:69:bc:
+         ba:dd:13:7a:96:15:1f:af:3f:e0:a7:b1:3f:5c:f5:ab:af:ac:
+         65:a0:c3:e3:6b:70:25:53:57:46:3d:f6:c0:78:dc:1f:4c:d2:
+         03:42:d4:32:d0:cd:16:38:06:d1:89:1a:c4:37:2c:15:d9:6b:
+         c2:0e:8d:55:3a:a1:57:99:c7:57:18:d4:c5:13:ca:f7:25:92:
+         85:bc:5d:bb:20:8f:ee:52:8c:6e:61:aa:22:3e:37:a1:71:d9:
+         59:e3:e6:5c:de:71:f8:2a:e8:05:f5:b0:ca:40:9d:6a:24:87:
+         9f:48:69:26:65:ef:ad:6a:fd:2f:b2:38:36:f5:1a:5b:f1:5a:
+         ec:35:7a:a5:08:f7:c8:b7:78:90:e2:b9:32:24:6c:e8:cc:b0:
+         57:9e:ab:a7:06:22:c5:0e:cf:22:73:2f:dc:c7:30:eb:83:5d:
+         81:a4:00:ab:a0:01:3b:ce:7f:d9:c3:cc:28:fc:6b:74:cc:be:
+         62:d2:25:b8:a8:3b:c4:15:c4:bb:71:79:4f:df:7d:73:45:e6:
+         16:a4:41:1a:b5:3c:27:61:62:cf:86:1c:6e:d1:4b:f6:49:0a:
+         bd:3f:15:d0
 -----BEGIN CERTIFICATE-----
-MIIC4jCCAcqgAwIBAgIJAMS8lsLtjUp/MA0GCSqGSIb3DQEBBQUAMB4xHDAaBgNV
-BAMME1BvbGljeSBUZXN0IFJvb3QgQ0EwHhcNMTQwODE0MDI0NzA0WhcNMjQwODEx
-MDI0NzA0WjAeMRwwGgYDVQQDDBNQb2xpY3kgVGVzdCBSb290IENBMIIBIjANBgkq
-hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvmm2FgvUvo2zmE+4ZGRcLzda56hWARmw
-RpG3HQVRV3PHy2gkmCbmtjnbu03QBmsDvAbke0MtSGooPnXIgvgnhvuEqLGQ/rkq
-B9EVyr4KpOGIagEMVyej0a32ADsVmOmABAisJr4MOChEtSzxdcUD3oHs2dpgOPsE
-fzbfcr0rxLs3iNWIFHNR+H/W9ECkBQsmmskjPrrg/HZugWllM8DUjXjURcmQFGDL
-cYghDKmUCUVISiny8l43NIU4NXWpUgbTWO24CatcTRrpYXmgl2SZWJd5cCVNyr8B
-beBsKVEXeUb9MUS+5mpHvh1OdXIIX7LgSeJUV9Xp93Kx7qruQUvp9QIDAQABoyMw
-ITAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUF
-AAOCAQEAEmgLSEZpoMwI8BbAuCpmeqidmMSaxQcCXBRKdTo2H0duIcRqzQXmdrjy
-9jc0QhSIAjX5aaUeBa2PmI4y+21rv8SjoJbVs5LsSFQ0/pIvaud8rYVmPrxMB8Ej
-CKh9sX48sOHxmgB76BG4w0ZVaje1viW+AnntA1k/JS2l4TapENd+U/nqnb8euMux
-eFQfNKjfr3ULOdCWyWUMBd9/eDUZUfUVEzVY+yx4U1rJTeI7G25oV1kbTfTA17Tc
-bKPNH7S4ztFw988V55vJNdswjs5L9lhOjB/Lf5D6WkBwt/ugnBPXe0X0fz/qeSna
-FbuU3dOjEZUAiywyqTNmWVBa6WgytA==
+MIIC4jCCAcqgAwIBAgIJAMhchM1IzPMWMA0GCSqGSIb3DQEBCwUAMB4xHDAaBgNV
+BAMME1BvbGljeSBUZXN0IFJvb3QgQ0EwHhcNMTcwMjI4MjM1MjM0WhcNMjcwMjI2
+MjM1MjM0WjAeMRwwGgYDVQQDDBNQb2xpY3kgVGVzdCBSb290IENBMIIBIjANBgkq
+hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoOOnr7j6O+5H0lqtIaJxQk6mo8eClLky
+PG0UOWcZZWQfi7XEbYgSLIXi75cE9Z/uE2Wn9YbHWyAd/kdxp6sEaVIP6mxCWHuJ
+MklUFNrTre+4esyMfxYOKrYOe9+l7ib/sMlrZW4VArX0T+Vq4bhFY1X5YQ32J8/z
+EK5KClclXN6xxY6yvPG58pnEJx1TCyt8Kv38c370rUS8i0cjvcFU8+0L7lOnnFC9
+Mgpn4rYEPshe2vurfFzJaDxa8sZeuSI48xC0LeKHEjpKU1Rrkubx67pHuPGAPiwv
+hxMe3Am8pAxP4t/bU+CvXTSxOQZ/insS6GwB587Xt6asPbe6rz9GkwIDAQABoyMw
+ITAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
+AAOCAQEAbH/UVxiFIh2HFUU6Fg3fBj6c7R2Ze3h1kFyP0jhYRj4r0mm8ut0TepYV
+H68/4KexP1z1q6+sZaDD42twJVNXRj32wHjcH0zSA0LUMtDNFjgG0YkaxDcsFdlr
+wg6NVTqhV5nHVxjUxRPK9yWShbxduyCP7lKMbmGqIj43oXHZWePmXN5x+CroBfWw
+ykCdaiSHn0hpJmXvrWr9L7I4NvUaW/Fa7DV6pQj3yLd4kOK5MiRs6MywV56rpwYi
+xQ7PInMv3Mcw64NdgaQAq6ABO85/2cPMKPxrdMy+YtIluKg7xBXEu3F5T999c0Xm
+FqRBGrU8J2Fiz4YcbtFL9kkKvT8V0A==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-A-by-B.pem b/net/data/ssl/certificates/multi-root-A-by-B.pem
index 01f99c2..451345d 100644
--- a/net/data/ssl/certificates/multi-root-A-by-B.pem
+++ b/net/data/ssl/certificates/multi-root-A-by-B.pem
@@ -1,29 +1,29 @@
 -----BEGIN RSA PRIVATE KEY-----
-MIIEowIBAAKCAQEAyCccGYHApzCTAxz4IbgviiK0iQ/asUCV39xGU/xvNiZmWlNt
-RXjCORaaP4KLusWweKgYvNWnkqXmrOIMgdCU5QzsXgMMF8U1Knurhuu/6GIKj7Al
-snD1EYwWT8F2ROV16JNP6efE5EIKCL5zLMuPc2pAd+szYKy+xSf9sU+ISxWvmP0y
-U66wKgyy9QXzOgYNblz+g/zjYK6ZjqEhwnIC5vRJV+aRMS6+kqGt+HExZHQQM9Cn
-DO0Yx7JQcfy5tq6VoI2sHzzVeaepiFC2As1oYCRFm7bpggjZnNR+KX0r2a5Xf2Jq
-VpaLSjOeX5OCsNEFAybNFfSHf2qa3+kBtdTJEQIDAQABAoIBAHadrupy2fB7OfSz
-W13oYMwVazZ7HdjD9M45JbiqNmI5+Zh4Lp7oRPo+KeWPgS2L8NxgimCGogunpAA6
-6ryYF1VzBjVkyurfZXWq2ulXl2Cpkaa79ms8xA/FHIfhmCyWa/0MKGTvhODdPkMW
-Uv1uGbKFenVW/xjA50HCRHerMZOE1yBaBzrAOGqLm4E/7snbZJ3K5Sx88mu9vAnA
-LBHMiqYwf4E9TJW+2AzDtlTI02/UbcQc4MDgRJc1YQSPz4pdtKbA3IvdDhXdsDCr
-Tum2gCpeUZS4zmXW6NcOBAHvrLdU8sEsodALCZ58hwkTU9YlqKyYE+DbuDd+3H5a
-3WIQbb0CgYEA6ZoLha/chlExbXr/5VcmiDfX/IRjAebG7uHMGC+QlSMxNxUGCuge
-kvw5+AkSsKdwHeSgr426SF3gPAwafK5KiTO4NoaD2pXFOvu5Z0Mpw4iT3kdTk/iO
-o2zTz4abEA0kQaqlhIbD5RrI5zU3K49BH8CkS+Kr5mCqtPu2b1aDac8CgYEA21gH
-/R1eTo4/0lBt+P4+4w8RMtt5Ky6rsZzSC87zJKznAKoGmo2rWCQKcxbZntznsuW3
-LN5MPYXXKqugp3fXebnRJYwBBE9HO39Cl5vb3l2EIYVRwspVeUs9KeTlt2FaiqQ1
-yE+s75bXFh9e3ztj4vOAWKGXi/KI2PHTdfo4tx8CgYEA5eX3BQDIdWAe1vJAOYMF
-pvXemOPpVIu8qIiMBhl5n2zdGKqWIdHDlUCqBFNZk4WVr7W79knzVRkef7ohrycQ
-r+q4luDXjx3q11u5YckVpxwY+p8TwALUzj1iT1DX9noYfo/lCYJf9G/h3Lngq/v2
-SbubdhuEtdvY5Pj82KI5/r0CgYAKDBxBkejR/F4cCicfcrX6vKPzCm6gdcDTn/VX
-KSGmGm1ycFdhGQAyR2RbJT7OshvC7BbZ7UzcvJbAk6AGS80I/GQCLkmVovQGW6v3
-OeJ2ax40UuEN5SrJJZMlqiCDp+f31dHI3S10xBoSH1m/K/9FVBYa+Tvx4yg1l84x
-50ZVzQKBgB6sEgCK7Q4HwOrSVyLvGjABZC41fuZSl58DB1bKdTtXq2ASP1igzmbR
-KEvawdUFqysM1TSz2F+QL4X393VVlSKi69w3LeORcMdOtbew2Rn7msBAHR4JO9sP
-dIdM/ccKebf1tgaTgI+c12yg+e+w7dey1Og0iPtcuMg3TumFX5q3
+MIIEowIBAAKCAQEApBiGPwljnNTABkWlkX/np7g9x/8N6Dn1QyenRCo7UwPjzRMj
+Rl/gJ/CjeiWCsFK7A0+Z4ywbb1QFD39PdPmtsoiFQ2MGrJHxGbfaekJoamil4AJE
+I+vRBQ09WDHuuiCeFhH1rrXDIcyE5xrSwox+RJM2vWwMBzXyTlc/s88hWv8WAulh
+9MxKWiTaVfzG2kTWtypOMb+ggCRV7Vy8a4QSpAPMssLb7x4IvaO/7/w9Uzi5AIrW
+QBrM8mqr50tnHK7/bUMSCMaXS3Pfhc8qpW7OIgLLY2w/AKo7sIeb1RMJMky9cXn/
+BLGajS2gCmXVHlPE6w4UwLnzj29ktB0Rp0DnYQIDAQABAoIBAGRqPXxFmpdV+Uvd
+QrwOsQuJSwUfprr8/IDjuw+TaEocj0Hm/CcMdHb8Yo1Uduy/M4GLLHg/fWpa193r
+4guK3ifqMuJRrrvbctZyE1fNW2gCMb8qo9f3bijROUDHDXcIjrSiuNz4jTgZlxp0
+55P1tS7xhwXTIGkpMeWOroSxs4+incyXj7yD5Wr9xk/01A+W463jPZM69aRzvOAb
+mfxh67PYu6InLbTkNm3iWo7jXSEQbIFv6bPeboOXaxsa9Beo5NTPMaV7ex2mR0m0
+yvZStCXtvwu9wkgvyameX9L2eBJWaMdL9LM9S5LVNrkFngJTbCd+qSYBd4axQ1dP
+nYhuv4ECgYEA2sSzTLywORnUyM4mRZnrQVakqaPy9AuZLIHHcs5mQifgezb99qm+
+GBQTV+xQwwPPPLLxuBICIlYUVl4TP82EUffRog0+eAPkqRuUv9jX8MTLFVzjicD/
+O2LTRW9wyvpu7wOKL2f6Tf+kYjBxKmHAxAZTncBsFkXOyjZDS4DIwdUCgYEAwAXZ
+kpAtavvCmpwKXRFMVhMCRpmXthxXeSmm/piY/O16mHLQfR5zBJ3DNyKUKlyaX1YM
+DNgZKXLiREJZtbgT+Z1aHAybRMFyr37VU0nSMGU5G/I6ysLYsc3iCI/gk6YHM7Xc
+OgqZleJ0s+EGwDx9DeWhLrYWN4W6e0kudrB6CV0CgYBAaI8ddaQwe5FxOXh9H27r
+ArZiF5ntDgkf2Gm/PFNRAOqPfEZTO/ByqF51kWbJs7Js/YY7Glo0f8FnGDV0oG5n
+r52xp1KQBR1qSGuH/DC/e0ELXhjDsuWyN0tacw/zQr4sco9Zm7RPCIf+PKLkxnj5
+fZ9an49zE0RptoYjkZwJrQKBgE29EIxJWlnJestlCL0M176xC2bRn53Wc4NV3YmM
+9cLP0aYONWGyBhaEWBfmI93Sh5y5FT/N7MHfBMNlqTPsRgn0LhrU77cyKd/qlSqW
+5EU7dZdexXZ404mINE4LEXw05w2EPpgw2mTXvS9llnoVAvuxT0O969imhwyKYAkl
+AQLxAoGBAKHMhs0tYdyWuH2J1zokddjOH0uGFkoZxhQmgVPC/WlTg05ClPVSNX5p
+pZcX9Ouk+kvSb8UCWf/ovAwSN66Ri6AmbLt+W8Ibt9+Q9NMeb6XVppWaRTa2b9PX
+WKNuu7TLrunx6XJw9NqXhAecreu7s4FMyn9GnhQ2H5LeJTb1C80D
 -----END RSA PRIVATE KEY-----
 Certificate:
     Data:
@@ -32,76 +32,78 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=B CA - Multi-root
         Validity
-            Not Before: Mar 11 01:37:16 2016 GMT
-            Not After : Mar  9 01:37:16 2026 GMT
+            Not Before: Feb 28 23:46:47 2017 GMT
+            Not After : Feb 26 23:46:47 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:c8:27:1c:19:81:c0:a7:30:93:03:1c:f8:21:b8:
-                    2f:8a:22:b4:89:0f:da:b1:40:95:df:dc:46:53:fc:
-                    6f:36:26:66:5a:53:6d:45:78:c2:39:16:9a:3f:82:
-                    8b:ba:c5:b0:78:a8:18:bc:d5:a7:92:a5:e6:ac:e2:
-                    0c:81:d0:94:e5:0c:ec:5e:03:0c:17:c5:35:2a:7b:
-                    ab:86:eb:bf:e8:62:0a:8f:b0:25:b2:70:f5:11:8c:
-                    16:4f:c1:76:44:e5:75:e8:93:4f:e9:e7:c4:e4:42:
-                    0a:08:be:73:2c:cb:8f:73:6a:40:77:eb:33:60:ac:
-                    be:c5:27:fd:b1:4f:88:4b:15:af:98:fd:32:53:ae:
-                    b0:2a:0c:b2:f5:05:f3:3a:06:0d:6e:5c:fe:83:fc:
-                    e3:60:ae:99:8e:a1:21:c2:72:02:e6:f4:49:57:e6:
-                    91:31:2e:be:92:a1:ad:f8:71:31:64:74:10:33:d0:
-                    a7:0c:ed:18:c7:b2:50:71:fc:b9:b6:ae:95:a0:8d:
-                    ac:1f:3c:d5:79:a7:a9:88:50:b6:02:cd:68:60:24:
-                    45:9b:b6:e9:82:08:d9:9c:d4:7e:29:7d:2b:d9:ae:
-                    57:7f:62:6a:56:96:8b:4a:33:9e:5f:93:82:b0:d1:
-                    05:03:26:cd:15:f4:87:7f:6a:9a:df:e9:01:b5:d4:
-                    c9:11
+                    00:a4:18:86:3f:09:63:9c:d4:c0:06:45:a5:91:7f:
+                    e7:a7:b8:3d:c7:ff:0d:e8:39:f5:43:27:a7:44:2a:
+                    3b:53:03:e3:cd:13:23:46:5f:e0:27:f0:a3:7a:25:
+                    82:b0:52:bb:03:4f:99:e3:2c:1b:6f:54:05:0f:7f:
+                    4f:74:f9:ad:b2:88:85:43:63:06:ac:91:f1:19:b7:
+                    da:7a:42:68:6a:68:a5:e0:02:44:23:eb:d1:05:0d:
+                    3d:58:31:ee:ba:20:9e:16:11:f5:ae:b5:c3:21:cc:
+                    84:e7:1a:d2:c2:8c:7e:44:93:36:bd:6c:0c:07:35:
+                    f2:4e:57:3f:b3:cf:21:5a:ff:16:02:e9:61:f4:cc:
+                    4a:5a:24:da:55:fc:c6:da:44:d6:b7:2a:4e:31:bf:
+                    a0:80:24:55:ed:5c:bc:6b:84:12:a4:03:cc:b2:c2:
+                    db:ef:1e:08:bd:a3:bf:ef:fc:3d:53:38:b9:00:8a:
+                    d6:40:1a:cc:f2:6a:ab:e7:4b:67:1c:ae:ff:6d:43:
+                    12:08:c6:97:4b:73:df:85:cf:2a:a5:6e:ce:22:02:
+                    cb:63:6c:3f:00:aa:3b:b0:87:9b:d5:13:09:32:4c:
+                    bd:71:79:ff:04:b1:9a:8d:2d:a0:0a:65:d5:1e:53:
+                    c4:eb:0e:14:c0:b9:f3:8f:6f:64:b4:1d:11:a7:40:
+                    e7:61
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                FB:91:A9:5F:BC:27:81:98:55:30:BF:57:32:4D:B9:DA:56:DD:52:2C
+                28:6F:58:36:8F:1B:C5:99:18:5B:DC:A5:86:AF:89:F2:B4:3E:AF:51
             X509v3 Authority Key Identifier: 
-                keyid:90:CB:53:EE:36:0A:5A:B0:93:38:C9:11:B7:AC:FD:27:71:99:DC:81
+                keyid:D0:8D:1F:B2:BC:29:96:73:EF:0C:7A:C2:A4:06:96:CF:D5:8C:31:DB
 
             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
-         b9:31:7a:95:b2:ba:3a:b4:f1:16:76:df:eb:d5:b9:af:67:b1:
-         9d:8a:27:04:9b:61:6f:42:3f:c2:b3:cd:65:c4:86:cb:90:fb:
-         9d:3a:ed:fc:b8:74:da:d7:6a:6c:2f:17:68:d1:73:58:f1:a2:
-         bb:8f:d6:b0:a8:7f:b6:a8:b0:74:d1:ea:c4:62:ed:bc:1e:ef:
-         02:6b:d5:e8:2d:15:78:16:1e:90:fa:f4:29:5a:a8:43:ad:d2:
-         58:40:b4:1c:60:4e:cd:bc:6f:1a:39:e4:46:b2:58:93:96:5a:
-         a8:a4:c4:31:73:ed:89:c4:81:27:e1:4c:66:20:7c:27:c4:f9:
-         61:ff:d1:d5:a5:02:93:4c:06:fa:15:33:7a:1f:5f:eb:29:b2:
-         b5:6a:cd:7e:d6:d7:b7:51:a7:01:2f:22:9f:9e:7e:81:98:c4:
-         72:11:36:2c:e7:c6:d0:f0:7d:98:36:ea:b7:a0:aa:13:8f:6e:
-         ae:41:59:9b:e6:c9:bc:9c:e8:93:f5:0c:4e:ca:b4:dd:e3:01:
-         fe:23:6e:fb:fa:b3:61:66:58:f5:fc:07:16:1d:a9:52:ec:a0:
-         29:61:a4:39:ed:41:50:a3:a2:33:72:0e:3c:03:e1:0a:1a:1a:
-         cf:22:73:09:d7:ea:e8:15:fc:73:3c:d4:4e:34:6c:b4:18:94:
-         c4:d3:6e:12
+         07:8f:f9:c6:33:3c:bc:74:20:21:92:46:7a:c5:df:76:18:47:
+         63:0c:5e:e8:f3:97:ec:37:83:0b:4d:a4:1c:6b:0b:a2:28:db:
+         5c:17:d9:91:77:00:4a:db:46:f9:68:ec:2a:f8:b5:82:0c:00:
+         d1:88:0c:7c:b4:2d:e9:48:f5:a2:9d:a9:d5:bb:db:9d:56:96:
+         c5:6c:46:da:23:a3:66:80:a5:9b:93:d0:df:9c:00:75:ac:48:
+         ea:48:b4:22:ee:ff:db:eb:bb:8f:f0:de:16:a1:99:98:85:4c:
+         b3:66:dd:22:96:96:97:48:ae:8a:2d:e9:a5:1c:5c:d9:dd:31:
+         3f:58:7c:bb:2b:db:86:6a:53:e5:af:6d:85:3a:ca:92:5d:56:
+         e2:02:90:d7:eb:98:0f:d8:ba:2a:d1:26:bb:82:5b:80:d5:2d:
+         52:d7:40:4d:0d:0d:1e:fe:c2:89:be:e2:80:4d:cd:91:dc:f3:
+         fa:19:25:3e:ba:a8:cf:48:d3:b6:35:a5:96:6e:a5:12:d1:65:
+         65:a9:92:6b:d0:fc:05:25:7c:fb:76:48:38:15:7e:4f:95:03:
+         b0:c3:55:89:bc:59:be:de:3c:fb:4b:5a:f1:3b:00:c1:03:59:
+         6c:b3:8b:21:7e:84:75:30:19:8c:19:f6:99:40:ec:87:43:3b:
+         89:d0:f5:6d
 -----BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQiBD
-QSAtIE11bHRpLXJvb3QwHhcNMTYwMzExMDEzNzE2WhcNMjYwMzA5MDEzNzE2WjBg
+MIIDeTCCAmGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQiBD
+QSAtIE11bHRpLXJvb3QwHhcNMTcwMjI4MjM0NjQ3WhcNMjcwMjI2MjM0NjQ3WjBg
 MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
 bnRhaW4gVmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4x
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyCccGYHApzCTAxz4Ibgv
-iiK0iQ/asUCV39xGU/xvNiZmWlNtRXjCORaaP4KLusWweKgYvNWnkqXmrOIMgdCU
-5QzsXgMMF8U1Knurhuu/6GIKj7AlsnD1EYwWT8F2ROV16JNP6efE5EIKCL5zLMuP
-c2pAd+szYKy+xSf9sU+ISxWvmP0yU66wKgyy9QXzOgYNblz+g/zjYK6ZjqEhwnIC
-5vRJV+aRMS6+kqGt+HExZHQQM9CnDO0Yx7JQcfy5tq6VoI2sHzzVeaepiFC2As1o
-YCRFm7bpggjZnNR+KX0r2a5Xf2JqVpaLSjOeX5OCsNEFAybNFfSHf2qa3+kBtdTJ
-EQIDAQABo28wbTAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBT7kalfvCeBmFUwv1cy
-TbnaVt1SLDAfBgNVHSMEGDAWgBSQy1PuNgpasJM4yRG3rP0ncZncgTAdBgNVHSUE
-FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBALkxepWy
-ujq08RZ23+vVua9nsZ2KJwSbYW9CP8KzzWXEhsuQ+5067fy4dNrXamwvF2jRc1jx
-oruP1rCof7aosHTR6sRi7bwe7wJr1egtFXgWHpD69ClaqEOt0lhAtBxgTs28bxo5
-5EayWJOWWqikxDFz7YnEgSfhTGYgfCfE+WH/0dWlApNMBvoVM3ofX+spsrVqzX7W
-17dRpwEvIp+efoGYxHIRNiznxtDwfZg26regqhOPbq5BWZvmybyc6JP1DE7KtN3j
-Af4jbvv6s2FmWPX8BxYdqVLsoClhpDntQVCjojNyDjwD4QoaGs8icwnX6ugV/HM8
-1E40bLQYlMTTbhI=
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApBiGPwljnNTABkWlkX/n
+p7g9x/8N6Dn1QyenRCo7UwPjzRMjRl/gJ/CjeiWCsFK7A0+Z4ywbb1QFD39PdPmt
+soiFQ2MGrJHxGbfaekJoamil4AJEI+vRBQ09WDHuuiCeFhH1rrXDIcyE5xrSwox+
+RJM2vWwMBzXyTlc/s88hWv8WAulh9MxKWiTaVfzG2kTWtypOMb+ggCRV7Vy8a4QS
+pAPMssLb7x4IvaO/7/w9Uzi5AIrWQBrM8mqr50tnHK7/bUMSCMaXS3Pfhc8qpW7O
+IgLLY2w/AKo7sIeb1RMJMky9cXn/BLGajS2gCmXVHlPE6w4UwLnzj29ktB0Rp0Dn
+YQIDAQABo4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUKG9YNo8bxZkYW9yl
+hq+J8rQ+r1EwHwYDVR0jBBgwFoAU0I0fsrwplnPvDHrCpAaWz9WMMdswHQYDVR0l
+BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZI
+hvcNAQELBQADggEBAAeP+cYzPLx0ICGSRnrF33YYR2MMXujzl+w3gwtNpBxrC6Io
+21wX2ZF3AErbRvlo7Cr4tYIMANGIDHy0LelI9aKdqdW7251WlsVsRtojo2aApZuT
+0N+cAHWsSOpItCLu/9vru4/w3hahmZiFTLNm3SKWlpdIroot6aUcXNndMT9YfLsr
+24ZqU+WvbYU6ypJdVuICkNfrmA/YuirRJruCW4DVLVLXQE0NDR7+wom+4oBNzZHc
+8/oZJT66qM9I07Y1pZZupRLRZWWpkmvQ/AUlfPt2SDgVfk+VA7DDVYm8Wb7ePPtL
+WvE7AMEDWWyziyF+hHUwGYwZ9plA7IdDO4nQ9W0=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-B-by-C.pem b/net/data/ssl/certificates/multi-root-B-by-C.pem
index 5731bb1..98685b3 100644
--- a/net/data/ssl/certificates/multi-root-B-by-C.pem
+++ b/net/data/ssl/certificates/multi-root-B-by-C.pem
@@ -12,63 +12,63 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ca:e9:f3:21:f4:a0:e7:ba:82:8c:7f:b3:98:44:
-                    20:4a:9a:8b:f9:e5:0c:99:c4:22:72:f7:57:7c:1e:
-                    cc:56:4c:c3:f5:fd:1e:90:a5:1c:bf:2c:c4:c4:29:
-                    29:38:cc:26:9e:1a:1d:e3:e4:db:97:58:35:14:e8:
-                    e2:db:37:05:1c:32:f7:bb:19:22:c2:37:3f:01:76:
-                    8c:17:23:ca:fc:10:69:b4:d1:74:27:b6:10:7e:b7:
-                    c1:07:a2:a1:af:18:4d:5c:2e:13:72:a9:fb:64:b1:
-                    e7:9f:49:41:3c:dc:b8:5f:94:e6:68:05:a5:1f:c8:
-                    56:84:e2:e5:6a:84:71:9c:b8:ac:3e:ec:8e:0c:d2:
-                    f2:5f:11:fd:f4:7f:40:a7:3b:08:01:bb:fd:6f:d0:
-                    a9:16:1d:14:a1:28:20:30:98:ba:1e:22:4e:5b:09:
-                    b9:c1:df:17:60:1b:80:43:97:49:69:cd:6a:4e:58:
-                    08:9c:dc:29:57:3f:1b:bf:d8:5f:32:94:ae:97:b2:
-                    d4:8d:50:1a:d1:8b:03:84:00:fd:87:d9:2e:ed:91:
-                    3d:3f:b7:89:54:46:0a:cd:db:10:62:80:47:60:21:
-                    b3:1d:0e:bc:41:4d:86:d4:9d:52:1b:53:82:1a:9f:
-                    46:91:98:1e:ed:9f:da:69:16:64:24:1c:de:f8:b3:
-                    34:69
+                    00:ca:6c:54:ab:3c:54:33:6c:d7:04:c4:4b:c4:39:
+                    32:db:7a:49:e4:e1:e7:60:c7:35:33:08:59:ba:62:
+                    bf:49:d6:05:1f:07:b8:b6:bd:38:2f:6b:a7:e5:8d:
+                    de:79:27:d8:36:58:92:69:cc:db:8e:6a:89:b4:79:
+                    ab:cf:98:53:08:12:17:9e:51:15:bc:e7:8f:e5:93:
+                    d9:1a:2e:68:a9:93:3c:d3:7a:75:a4:5c:c2:fc:16:
+                    9b:ba:df:49:5d:73:65:ec:b0:cc:1e:ba:cc:98:39:
+                    d1:4e:b2:d6:5f:e8:7f:24:1a:fa:56:b0:0d:33:46:
+                    22:56:4f:5c:f3:16:ad:55:8a:62:3c:bc:50:c2:3a:
+                    58:3e:70:4d:5a:df:99:ec:c7:a6:2c:8f:2a:a5:2e:
+                    11:b8:58:c5:d5:e8:43:2f:40:a5:20:80:32:2a:76:
+                    5e:06:07:48:6d:44:60:ba:21:72:61:e2:1a:ec:64:
+                    5d:72:72:f1:21:9d:04:2f:61:35:0b:2f:f0:c0:fe:
+                    52:b8:c4:41:9c:b6:13:58:21:81:e3:28:27:4d:6c:
+                    24:a3:20:fb:0f:9c:d4:4f:34:3a:d0:d1:08:84:c4:
+                    40:71:44:4f:e8:be:c5:1f:5d:1c:34:64:0b:6c:1c:
+                    24:fa:a9:83:49:c6:f5:4d:7f:63:c0:1a:a9:77:8a:
+                    c0:43
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:CB:53:EE:36:0A:5A:B0:93:38:C9:11:B7:AC:FD:27:71:99:DC:81
+                D0:8D:1F:B2:BC:29:96:73:EF:0C:7A:C2:A4:06:96:CF:D5:8C:31:DB
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         97:cd:ae:5a:26:f4:25:f6:c0:8b:08:d8:df:82:35:d8:76:f3:
-         5d:cc:99:bd:ac:70:c9:41:e0:24:c8:fd:e6:4e:41:2c:d4:69:
-         8d:08:25:fd:f3:32:3a:58:0b:d3:58:9c:81:51:bf:97:a4:bc:
-         00:18:1c:4f:1c:54:04:63:e3:72:87:f4:dc:9e:7b:dc:da:5d:
-         e1:ef:59:6b:f0:1f:3d:0c:11:55:1e:9a:1a:d8:8d:bc:7b:18:
-         b7:4f:92:1c:68:73:82:ec:f3:69:48:0a:86:40:4a:a5:6f:ae:
-         8f:10:2e:12:0b:e8:7e:b9:bc:d7:26:f0:cf:f4:0f:5b:77:f2:
-         ff:77:28:b4:5f:5e:ef:65:08:21:b8:f9:1e:56:b9:69:3b:c4:
-         7f:01:88:c9:7c:ca:d0:e2:df:e5:5e:8d:e9:2e:7d:4a:78:04:
-         8b:c1:dc:d4:58:ac:90:fc:5c:8e:48:2b:60:99:63:37:3f:e5:
-         61:da:8f:58:9f:4d:0a:ee:6c:8d:bc:1f:7e:c4:be:0f:32:4b:
-         11:7a:28:bf:dd:d0:a0:40:42:a8:43:4d:0b:2f:01:0e:73:de:
-         1b:a6:df:49:57:58:89:57:c0:23:76:83:f0:9a:0e:83:d9:9b:
-         cb:eb:ac:3f:89:d1:e8:3c:3e:f1:d5:80:0c:38:18:02:5c:5f:
-         e5:68:5e:cf
+         1e:16:7c:d7:d1:ee:63:a9:a2:b1:87:2c:8b:1e:d3:cf:51:14:
+         ed:12:0b:ec:67:2b:7f:3b:0e:8e:3c:50:bb:d1:dc:3b:40:1a:
+         ec:44:30:c4:f6:65:c2:c3:5d:d8:cb:c2:6c:13:2e:5a:2d:76:
+         c6:6b:5d:65:a5:7e:c2:bf:cb:fc:b1:50:b0:43:47:fc:a3:7b:
+         07:d1:77:50:4f:d2:53:98:8f:a2:00:97:13:d9:b7:83:2e:d9:
+         c4:2a:e6:b1:fc:2d:6c:ce:d1:61:73:aa:40:e0:ce:87:74:43:
+         a2:f7:b5:d9:5f:46:79:97:28:c4:de:15:60:3b:3e:3f:3d:1d:
+         14:f4:87:ef:b9:08:09:2a:fb:d0:d5:1b:4f:77:f9:0d:c9:4b:
+         23:32:1c:06:04:a6:83:aa:00:9c:70:c2:2b:01:42:1e:f6:d6:
+         d3:5c:f9:a8:b7:84:9e:44:12:9a:9f:a8:2a:89:56:69:a6:2f:
+         e9:ee:67:e9:7e:32:b5:ef:6b:4e:f0:12:23:fa:85:3e:03:59:
+         94:db:88:99:04:55:c4:d1:df:df:c6:e2:fd:61:c5:f6:af:dc:
+         4c:e4:52:8f:f2:c8:07:39:dd:99:33:49:85:1e:df:e1:1f:08:
+         6b:e0:d2:1b:93:db:32:05:4b:39:ee:b3:f1:b6:af:18:07:a7:
+         24:9c:1e:75
 -----BEGIN CERTIFICATE-----
 MIIC9jCCAd6gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQyBD
 QSAtIE11bHRpLXJvb3QwHhcNMTYwMTA0MDAwMDAwWhcNMjYwMTAyMDAwMDAwWjAc
 MRowGAYDVQQDDBFCIENBIC0gTXVsdGktcm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMrp8yH0oOe6gox/s5hEIEqai/nlDJnEInL3V3wezFZMw/X9
-HpClHL8sxMQpKTjMJp4aHePk25dYNRTo4ts3BRwy97sZIsI3PwF2jBcjyvwQabTR
-dCe2EH63wQeioa8YTVwuE3Kp+2Sx559JQTzcuF+U5mgFpR/IVoTi5WqEcZy4rD7s
-jgzS8l8R/fR/QKc7CAG7/W/QqRYdFKEoIDCYuh4iTlsJucHfF2AbgEOXSWnNak5Y
-CJzcKVc/G7/YXzKUrpey1I1QGtGLA4QA/YfZLu2RPT+3iVRGCs3bEGKAR2Ahsx0O
-vEFNhtSdUhtTghqfRpGYHu2f2mkWZCQc3vizNGkCAwEAAaNCMEAwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUkMtT7jYKWrCTOMkRt6z9J3GZ3IEwDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCXza5aJvQl9sCLCNjfgjXYdvNdzJm9
-rHDJQeAkyP3mTkEs1GmNCCX98zI6WAvTWJyBUb+XpLwAGBxPHFQEY+Nyh/Tcnnvc
-2l3h71lr8B89DBFVHpoa2I28exi3T5IcaHOC7PNpSAqGQEqlb66PEC4SC+h+ubzX
-JvDP9A9bd/L/dyi0X17vZQghuPkeVrlpO8R/AYjJfMrQ4t/lXo3pLn1KeASLwdzU
-WKyQ/FyOSCtgmWM3P+Vh2o9Yn00K7myNvB9+xL4PMksReii/3dCgQEKoQ00LLwEO
-c94bpt9JV1iJV8AjdoPwmg6D2ZvL66w/idHoPD7x1YAMOBgCXF/laF7P
+ggEPADCCAQoCggEBAMpsVKs8VDNs1wTES8Q5Mtt6SeTh52DHNTMIWbpiv0nWBR8H
+uLa9OC9rp+WN3nkn2DZYkmnM245qibR5q8+YUwgSF55RFbznj+WT2RouaKmTPNN6
+daRcwvwWm7rfSV1zZeywzB66zJg50U6y1l/ofyQa+lawDTNGIlZPXPMWrVWKYjy8
+UMI6WD5wTVrfmezHpiyPKqUuEbhYxdXoQy9ApSCAMip2XgYHSG1EYLohcmHiGuxk
+XXJy8SGdBC9hNQsv8MD+UrjEQZy2E1ghgeMoJ01sJKMg+w+c1E80OtDRCITEQHFE
+T+i+xR9dHDRkC2wcJPqpg0nG9U1/Y8AaqXeKwEMCAwEAAaNCMEAwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU0I0fsrwplnPvDHrCpAaWz9WMMdswDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAeFnzX0e5jqaKxhyyLHtPPURTtEgvs
+Zyt/Ow6OPFC70dw7QBrsRDDE9mXCw13Yy8JsEy5aLXbGa11lpX7Cv8v8sVCwQ0f8
+o3sH0XdQT9JTmI+iAJcT2beDLtnEKuax/C1sztFhc6pA4M6HdEOi97XZX0Z5lyjE
+3hVgOz4/PR0U9IfvuQgJKvvQ1RtPd/kNyUsjMhwGBKaDqgCccMIrAUIe9tbTXPmo
+t4SeRBKan6gqiVZppi/p7mfpfjK172tO8BIj+oU+A1mU24iZBFXE0d/fxuL9YcX2
+r9xM5FKP8sgHOd2ZM0mFHt/hHwhr4NIbk9syBUs57rPxtq8YB6cknB51
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-B-by-F.pem b/net/data/ssl/certificates/multi-root-B-by-F.pem
index d760580..bcaa0da 100644
--- a/net/data/ssl/certificates/multi-root-B-by-F.pem
+++ b/net/data/ssl/certificates/multi-root-B-by-F.pem
@@ -12,63 +12,63 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ca:e9:f3:21:f4:a0:e7:ba:82:8c:7f:b3:98:44:
-                    20:4a:9a:8b:f9:e5:0c:99:c4:22:72:f7:57:7c:1e:
-                    cc:56:4c:c3:f5:fd:1e:90:a5:1c:bf:2c:c4:c4:29:
-                    29:38:cc:26:9e:1a:1d:e3:e4:db:97:58:35:14:e8:
-                    e2:db:37:05:1c:32:f7:bb:19:22:c2:37:3f:01:76:
-                    8c:17:23:ca:fc:10:69:b4:d1:74:27:b6:10:7e:b7:
-                    c1:07:a2:a1:af:18:4d:5c:2e:13:72:a9:fb:64:b1:
-                    e7:9f:49:41:3c:dc:b8:5f:94:e6:68:05:a5:1f:c8:
-                    56:84:e2:e5:6a:84:71:9c:b8:ac:3e:ec:8e:0c:d2:
-                    f2:5f:11:fd:f4:7f:40:a7:3b:08:01:bb:fd:6f:d0:
-                    a9:16:1d:14:a1:28:20:30:98:ba:1e:22:4e:5b:09:
-                    b9:c1:df:17:60:1b:80:43:97:49:69:cd:6a:4e:58:
-                    08:9c:dc:29:57:3f:1b:bf:d8:5f:32:94:ae:97:b2:
-                    d4:8d:50:1a:d1:8b:03:84:00:fd:87:d9:2e:ed:91:
-                    3d:3f:b7:89:54:46:0a:cd:db:10:62:80:47:60:21:
-                    b3:1d:0e:bc:41:4d:86:d4:9d:52:1b:53:82:1a:9f:
-                    46:91:98:1e:ed:9f:da:69:16:64:24:1c:de:f8:b3:
-                    34:69
+                    00:ca:6c:54:ab:3c:54:33:6c:d7:04:c4:4b:c4:39:
+                    32:db:7a:49:e4:e1:e7:60:c7:35:33:08:59:ba:62:
+                    bf:49:d6:05:1f:07:b8:b6:bd:38:2f:6b:a7:e5:8d:
+                    de:79:27:d8:36:58:92:69:cc:db:8e:6a:89:b4:79:
+                    ab:cf:98:53:08:12:17:9e:51:15:bc:e7:8f:e5:93:
+                    d9:1a:2e:68:a9:93:3c:d3:7a:75:a4:5c:c2:fc:16:
+                    9b:ba:df:49:5d:73:65:ec:b0:cc:1e:ba:cc:98:39:
+                    d1:4e:b2:d6:5f:e8:7f:24:1a:fa:56:b0:0d:33:46:
+                    22:56:4f:5c:f3:16:ad:55:8a:62:3c:bc:50:c2:3a:
+                    58:3e:70:4d:5a:df:99:ec:c7:a6:2c:8f:2a:a5:2e:
+                    11:b8:58:c5:d5:e8:43:2f:40:a5:20:80:32:2a:76:
+                    5e:06:07:48:6d:44:60:ba:21:72:61:e2:1a:ec:64:
+                    5d:72:72:f1:21:9d:04:2f:61:35:0b:2f:f0:c0:fe:
+                    52:b8:c4:41:9c:b6:13:58:21:81:e3:28:27:4d:6c:
+                    24:a3:20:fb:0f:9c:d4:4f:34:3a:d0:d1:08:84:c4:
+                    40:71:44:4f:e8:be:c5:1f:5d:1c:34:64:0b:6c:1c:
+                    24:fa:a9:83:49:c6:f5:4d:7f:63:c0:1a:a9:77:8a:
+                    c0:43
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:CB:53:EE:36:0A:5A:B0:93:38:C9:11:B7:AC:FD:27:71:99:DC:81
+                D0:8D:1F:B2:BC:29:96:73:EF:0C:7A:C2:A4:06:96:CF:D5:8C:31:DB
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         64:09:43:15:ae:ac:dc:ad:23:99:24:cb:3a:39:4b:ad:2b:83:
-         f2:69:c3:f8:7e:e8:79:1e:8f:b1:09:0c:17:e6:44:5f:47:33:
-         14:fa:d4:f2:d8:d2:94:a9:75:58:4e:a8:44:8f:71:d0:53:c0:
-         76:5d:8e:39:1c:23:95:3d:89:c7:18:0a:0e:80:37:3d:8d:a6:
-         6d:60:c9:ad:08:a3:7a:8a:e8:00:3e:bf:67:e0:b6:09:b2:3b:
-         55:a6:b8:36:24:00:5e:8d:89:89:53:df:ea:2d:a9:f8:d2:60:
-         5a:e1:7b:f6:6c:a1:29:95:13:75:fe:62:57:cd:b4:0e:50:dc:
-         b5:41:3d:e9:19:0b:33:62:43:af:14:4d:40:c2:48:eb:72:88:
-         65:d3:89:11:f4:98:e8:f7:13:b4:7a:11:8e:39:01:80:a5:2e:
-         27:4a:98:3c:c8:d4:4f:31:70:3f:c2:de:e0:69:6b:59:54:d7:
-         66:07:68:74:72:9c:c2:1c:1c:0c:0d:b9:65:90:47:41:93:2c:
-         ec:d1:f0:51:b7:69:7b:e6:88:d8:f7:f7:0f:f1:4e:8c:e1:e9:
-         50:5d:7a:c3:62:1d:32:76:8e:df:7f:87:34:e4:57:bf:9c:1d:
-         45:4b:3b:07:f2:d1:8b:d6:d0:e6:72:de:7b:4b:23:bf:ee:1b:
-         c7:40:d0:a7
+         b3:af:8e:08:79:4f:56:93:22:e0:3b:9e:1f:22:0d:5d:12:69:
+         3c:13:26:4c:bb:41:9f:89:4b:b6:28:0d:85:37:75:c7:dc:e5:
+         b4:56:ba:3a:34:a7:40:30:ea:dc:7f:36:25:69:b9:c6:be:dd:
+         04:89:6a:f0:5e:14:42:45:bb:fc:fc:be:e6:c3:a2:0d:80:26:
+         30:11:df:21:54:cd:ea:59:25:5e:20:e8:2d:9d:97:64:fc:46:
+         1e:cb:f8:47:9c:90:d9:8e:db:f6:92:ec:76:ff:33:a4:28:16:
+         69:60:94:96:5b:e0:a0:32:ef:6f:8d:2a:06:65:67:6e:06:6a:
+         35:9f:10:04:37:2d:67:ad:9e:c3:2b:2a:fd:cb:1e:0f:d6:6b:
+         25:9d:11:eb:ae:a7:36:8b:b7:1c:11:7d:41:44:8e:37:07:03:
+         54:8d:43:ef:19:af:48:75:9d:78:2c:24:32:ba:72:c6:29:fa:
+         45:f9:9a:3b:59:9a:c9:2e:01:b5:9f:13:70:c9:dd:59:cf:8f:
+         7b:a9:24:c9:dc:c9:b6:52:62:7a:66:7b:2a:60:ee:a4:36:e9:
+         3b:95:04:31:fe:6a:74:e4:e2:3a:98:bc:70:26:1e:6e:03:9d:
+         f6:5c:3b:1b:5e:77:7a:01:71:56:1c:f9:98:e6:3e:ec:aa:c1:
+         e3:bd:35:36
 -----BEGIN CERTIFICATE-----
 MIIC9jCCAd6gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRRiBD
 QSAtIE11bHRpLXJvb3QwHhcNMTYwMTA1MDAwMDAwWhcNMjYwMTAyMDAwMDAwWjAc
 MRowGAYDVQQDDBFCIENBIC0gTXVsdGktcm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMrp8yH0oOe6gox/s5hEIEqai/nlDJnEInL3V3wezFZMw/X9
-HpClHL8sxMQpKTjMJp4aHePk25dYNRTo4ts3BRwy97sZIsI3PwF2jBcjyvwQabTR
-dCe2EH63wQeioa8YTVwuE3Kp+2Sx559JQTzcuF+U5mgFpR/IVoTi5WqEcZy4rD7s
-jgzS8l8R/fR/QKc7CAG7/W/QqRYdFKEoIDCYuh4iTlsJucHfF2AbgEOXSWnNak5Y
-CJzcKVc/G7/YXzKUrpey1I1QGtGLA4QA/YfZLu2RPT+3iVRGCs3bEGKAR2Ahsx0O
-vEFNhtSdUhtTghqfRpGYHu2f2mkWZCQc3vizNGkCAwEAAaNCMEAwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUkMtT7jYKWrCTOMkRt6z9J3GZ3IEwDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQBkCUMVrqzcrSOZJMs6OUutK4PyacP4
-fuh5Ho+xCQwX5kRfRzMU+tTy2NKUqXVYTqhEj3HQU8B2XY45HCOVPYnHGAoOgDc9
-jaZtYMmtCKN6iugAPr9n4LYJsjtVprg2JABejYmJU9/qLan40mBa4Xv2bKEplRN1
-/mJXzbQOUNy1QT3pGQszYkOvFE1Awkjrcohl04kR9Jjo9xO0ehGOOQGApS4nSpg8
-yNRPMXA/wt7gaWtZVNdmB2h0cpzCHBwMDbllkEdBkyzs0fBRt2l75ojY9/cP8U6M
-4elQXXrDYh0ydo7ff4c05Fe/nB1FSzsH8tGL1tDmct57SyO/7hvHQNCn
+ggEPADCCAQoCggEBAMpsVKs8VDNs1wTES8Q5Mtt6SeTh52DHNTMIWbpiv0nWBR8H
+uLa9OC9rp+WN3nkn2DZYkmnM245qibR5q8+YUwgSF55RFbznj+WT2RouaKmTPNN6
+daRcwvwWm7rfSV1zZeywzB66zJg50U6y1l/ofyQa+lawDTNGIlZPXPMWrVWKYjy8
+UMI6WD5wTVrfmezHpiyPKqUuEbhYxdXoQy9ApSCAMip2XgYHSG1EYLohcmHiGuxk
+XXJy8SGdBC9hNQsv8MD+UrjEQZy2E1ghgeMoJ01sJKMg+w+c1E80OtDRCITEQHFE
+T+i+xR9dHDRkC2wcJPqpg0nG9U1/Y8AaqXeKwEMCAwEAAaNCMEAwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU0I0fsrwplnPvDHrCpAaWz9WMMdswDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCzr44IeU9WkyLgO54fIg1dEmk8EyZM
+u0GfiUu2KA2FN3XH3OW0Vro6NKdAMOrcfzYlabnGvt0EiWrwXhRCRbv8/L7mw6IN
+gCYwEd8hVM3qWSVeIOgtnZdk/EYey/hHnJDZjtv2kux2/zOkKBZpYJSWW+CgMu9v
+jSoGZWduBmo1nxAENy1nrZ7DKyr9yx4P1mslnRHrrqc2i7ccEX1BRI43BwNUjUPv
+Ga9IdZ14LCQyunLGKfpF+Zo7WZrJLgG1nxNwyd1Zz497qSTJ3Mm2UmJ6ZnsqYO6k
+Nuk7lQQx/mp05OI6mLxwJh5uA532XDsbXnd6AXFWHPmY5j7sqsHjvTU2
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-BFE.keychain b/net/data/ssl/certificates/multi-root-BFE.keychain
index 80976aa..acb819bf 100644
--- a/net/data/ssl/certificates/multi-root-BFE.keychain
+++ b/net/data/ssl/certificates/multi-root-BFE.keychain
Binary files differ
diff --git a/net/data/ssl/certificates/multi-root-C-by-D.pem b/net/data/ssl/certificates/multi-root-C-by-D.pem
index bab6142..ea171e2 100644
--- a/net/data/ssl/certificates/multi-root-C-by-D.pem
+++ b/net/data/ssl/certificates/multi-root-C-by-D.pem
@@ -12,63 +12,63 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b6:1f:67:e4:9e:db:e0:ff:eb:29:75:ee:68:a2:
-                    4e:95:6e:d2:f6:9d:c9:b6:dc:08:18:70:b5:76:bf:
-                    b7:14:8b:cb:46:c6:6a:2c:fa:43:f9:54:93:fa:bd:
-                    aa:f0:ee:a3:20:5b:2a:cd:08:f7:be:95:36:e4:88:
-                    f8:fd:43:7d:b8:f9:38:b4:d2:4e:22:0b:8b:85:de:
-                    6a:fe:6f:da:3b:4b:0f:26:c1:f8:31:22:36:19:96:
-                    0c:ef:85:7c:72:67:ac:4c:5c:f9:23:a4:29:d8:a5:
-                    1c:b6:ec:95:eb:d3:c2:8d:cb:ae:9a:d7:08:c8:b7:
-                    f7:a0:c6:28:44:5f:24:97:bd:ca:d9:6d:99:9b:17:
-                    47:1f:38:b3:e3:67:6a:b4:75:d6:92:cd:67:62:20:
-                    58:f0:a7:46:85:94:72:76:98:c5:ec:4c:75:1b:a1:
-                    76:67:4b:1f:c8:23:6c:2a:78:66:c2:a7:6b:af:ef:
-                    97:30:34:60:0a:db:98:94:3b:9f:95:3c:34:b6:35:
-                    40:12:fa:1d:bf:66:f4:7b:fd:66:1a:2a:49:8c:24:
-                    60:91:08:f9:61:39:f9:3b:29:98:64:7b:35:04:a9:
-                    f5:af:8d:0f:1e:e7:28:b6:30:32:b4:5f:d4:29:16:
-                    7a:70:8d:db:b9:ba:bf:eb:22:98:5d:94:c8:47:e3:
-                    4b:11
+                    00:b2:c4:16:dc:07:88:ec:7e:a6:b3:25:c8:7b:9c:
+                    e0:07:1e:40:a9:40:c0:4d:c8:73:27:ea:88:d8:58:
+                    1a:1a:12:e3:9a:62:41:4c:a1:e9:b1:ce:c6:b2:f6:
+                    3a:f6:89:3f:40:e6:0f:fb:15:4b:cb:d2:8d:8e:b6:
+                    44:aa:63:fa:3b:c5:cc:af:86:05:70:aa:ec:f4:b3:
+                    79:04:e6:3e:25:ec:ec:29:d6:c9:8b:7b:13:05:a7:
+                    ff:51:5b:ab:4c:bc:d0:e4:bd:61:1a:d2:27:f1:2e:
+                    5f:f4:51:81:c4:23:ba:20:c3:14:08:b4:be:78:49:
+                    b5:13:1f:69:fd:f6:a7:59:91:84:a9:99:10:c8:9c:
+                    63:9e:99:c2:f2:3d:61:9d:6a:6e:d4:26:9b:88:aa:
+                    da:66:b3:0d:c6:99:03:16:13:3a:a4:9a:ff:08:3e:
+                    59:df:a7:44:b7:17:99:3f:63:7f:3a:05:7e:ce:64:
+                    78:34:e6:00:77:69:e6:03:24:a7:12:f3:e8:a8:50:
+                    2b:55:16:fa:6e:65:c6:28:58:82:a4:20:7e:68:22:
+                    e9:81:9e:a2:e8:0f:d6:87:c2:73:dd:c2:0c:cc:a3:
+                    47:54:11:f5:3d:dc:51:52:57:b2:ce:77:8b:7a:ac:
+                    a7:f0:2a:26:36:e6:26:b9:6a:83:da:b2:6f:c0:f6:
+                    1e:f3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:53:F5:80:11:F6:3F:1B:A8:9D:8D:75:0D:56:3B:F2:2B:C5:9C:44
+                E3:D1:05:98:4C:68:53:C2:DC:00:EE:AC:E5:A8:B8:FC:B9:72:D9:67
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         67:11:95:f4:b9:cb:47:e6:50:da:fd:a0:13:78:d7:e1:be:59:
-         ec:86:32:e5:56:3e:9b:8f:db:b0:3b:93:fb:d0:6e:b3:de:7e:
-         10:5b:b4:30:f7:02:e8:3f:ff:4e:91:3a:e8:b8:4a:94:5e:14:
-         7b:f8:84:e5:1f:63:2c:b4:7f:4f:ee:b1:d5:ee:92:79:7d:63:
-         87:a0:e9:57:14:57:11:59:18:54:8b:e3:d1:51:80:a7:2f:51:
-         f2:6f:43:d2:87:e1:59:23:2c:fe:83:38:e1:25:da:b5:34:af:
-         33:17:64:80:08:b6:bd:5f:92:05:2c:81:b0:c3:d3:80:cd:e1:
-         5c:95:d2:ea:1e:d3:af:d9:93:c2:f4:23:ae:51:b0:a4:82:49:
-         2d:ec:fe:d1:18:e3:a3:53:9f:63:4b:38:dc:54:25:ce:4c:90:
-         37:02:e4:67:41:31:ba:7a:13:1a:68:1e:ed:34:0c:3d:66:ba:
-         a3:3a:71:76:5f:5f:89:a1:cd:95:50:f6:5d:1f:c0:91:31:93:
-         5b:58:af:e7:9b:21:e6:57:b1:f4:d7:dd:c1:84:25:5b:83:f7:
-         5f:c9:89:17:5b:6f:54:f2:8b:ed:47:de:27:57:9e:e9:8c:b3:
-         58:2c:c2:77:25:e1:eb:22:06:d1:f6:c5:f4:d7:1a:3d:00:1c:
-         2e:85:e9:70
+         7e:5b:a7:f2:c7:15:33:73:ce:e4:1e:77:ba:35:8b:44:01:57:
+         b1:db:55:d3:54:95:c6:44:27:89:3f:e5:46:98:de:4a:7e:d9:
+         e7:6c:e8:0d:d5:e2:98:31:07:21:9c:bd:01:47:be:0c:e1:b3:
+         22:1e:ea:da:d4:fc:b5:37:5d:94:de:06:9b:69:a5:77:22:d0:
+         96:80:35:9f:02:a0:cd:41:35:b3:21:94:ca:9b:03:4f:68:18:
+         5e:6d:0d:95:95:17:ab:bd:00:9b:d0:78:f7:38:5e:37:df:33:
+         15:2f:3e:64:27:c8:67:5e:c4:14:92:08:90:55:34:8d:73:d9:
+         66:0c:30:dd:42:ab:71:73:b4:26:28:b1:13:90:7b:0a:10:f2:
+         7c:75:07:36:1f:a5:b6:a5:97:ac:20:c7:83:0c:15:cf:5c:34:
+         df:3f:8d:81:3e:c0:43:2a:ca:6f:c4:86:cc:2f:93:e1:5d:18:
+         68:a4:bd:cc:5b:39:fa:40:fa:d4:a7:8b:7a:5d:b7:59:77:48:
+         9b:ab:e0:71:b2:04:1f:79:ea:d1:cd:d3:24:52:5b:4b:21:2f:
+         84:2e:b4:d6:87:1d:4f:fe:e7:6c:94:ff:d0:02:50:6b:bc:2a:
+         1e:21:a5:ac:3e:73:b5:2f:ba:11:c5:6f:8f:f7:8e:eb:08:11:
+         00:cb:e3:2d
 -----BEGIN CERTIFICATE-----
 MIIC+zCCAeOgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRCBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDMwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMBwxGjAYBgNVBAMMEUMgQ0EgLSBNdWx0aS1yb290MIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAth9n5J7b4P/rKXXuaKJOlW7S9p3JttwIGHC1dr+3
-FIvLRsZqLPpD+VST+r2q8O6jIFsqzQj3vpU25Ij4/UN9uPk4tNJOIguLhd5q/m/a
-O0sPJsH4MSI2GZYM74V8cmesTFz5I6Qp2KUctuyV69PCjcuumtcIyLf3oMYoRF8k
-l73K2W2ZmxdHHziz42dqtHXWks1nYiBY8KdGhZRydpjF7Ex1G6F2Z0sfyCNsKnhm
-wqdrr++XMDRgCtuYlDuflTw0tjVAEvodv2b0e/1mGipJjCRgkQj5YTn5OymYZHs1
-BKn1r40PHucotjAytF/UKRZ6cI3bubq/6yKYXZTIR+NLEQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBSQU/WAEfY/G6idjXUNVjvyK8WcRDAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAGcRlfS5y0fmUNr9oBN41+G+
-WeyGMuVWPpuP27A7k/vQbrPefhBbtDD3Aug//06ROui4SpReFHv4hOUfYyy0f0/u
-sdXuknl9Y4eg6VcUVxFZGFSL49FRgKcvUfJvQ9KH4VkjLP6DOOEl2rU0rzMXZIAI
-tr1fkgUsgbDD04DN4VyV0uoe06/Zk8L0I65RsKSCSS3s/tEY46NTn2NLONxUJc5M
-kDcC5GdBMbp6ExpoHu00DD1muqM6cXZfX4mhzZVQ9l0fwJExk1tYr+ebIeZXsfTX
-3cGEJVuD91/JiRdbb1Tyi+1H3idXnumMs1gswncl4esiBtH2xfTXGj0AHC6F6XA=
+AQEFAAOCAQ8AMIIBCgKCAQEAssQW3AeI7H6msyXIe5zgBx5AqUDATchzJ+qI2Fga
+GhLjmmJBTKHpsc7GsvY69ok/QOYP+xVLy9KNjrZEqmP6O8XMr4YFcKrs9LN5BOY+
+JezsKdbJi3sTBaf/UVurTLzQ5L1hGtIn8S5f9FGBxCO6IMMUCLS+eEm1Ex9p/fan
+WZGEqZkQyJxjnpnC8j1hnWpu1CabiKraZrMNxpkDFhM6pJr/CD5Z36dEtxeZP2N/
+OgV+zmR4NOYAd2nmAySnEvPoqFArVRb6bmXGKFiCpCB+aCLpgZ6i6A/Wh8Jz3cIM
+zKNHVBH1PdxRUleyzneLeqyn8ComNuYmuWqD2rJvwPYe8wIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBTj0QWYTGhTwtwA7qzlqLj8uXLZZzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAH5bp/LHFTNzzuQed7o1i0QB
+V7HbVdNUlcZEJ4k/5UaY3kp+2eds6A3V4pgxByGcvQFHvgzhsyIe6trU/LU3XZTe
+BptppXci0JaANZ8CoM1BNbMhlMqbA09oGF5tDZWVF6u9AJvQePc4XjffMxUvPmQn
+yGdexBSSCJBVNI1z2WYMMN1Cq3FztCYosROQewoQ8nx1BzYfpball6wgx4MMFc9c
+NN8/jYE+wEMqym/Ehswvk+FdGGikvcxbOfpA+tSni3pdt1l3SJur4HGyBB956tHN
+0yRSW0shL4QutNaHHU/+52yU/9ACUGu8Kh4hpaw+c7UvuhHFb4/3jusIEQDL4y0=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-C-by-E.pem b/net/data/ssl/certificates/multi-root-C-by-E.pem
index 5ecc8b262..1f8b76c 100644
--- a/net/data/ssl/certificates/multi-root-C-by-E.pem
+++ b/net/data/ssl/certificates/multi-root-C-by-E.pem
@@ -12,63 +12,63 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b6:1f:67:e4:9e:db:e0:ff:eb:29:75:ee:68:a2:
-                    4e:95:6e:d2:f6:9d:c9:b6:dc:08:18:70:b5:76:bf:
-                    b7:14:8b:cb:46:c6:6a:2c:fa:43:f9:54:93:fa:bd:
-                    aa:f0:ee:a3:20:5b:2a:cd:08:f7:be:95:36:e4:88:
-                    f8:fd:43:7d:b8:f9:38:b4:d2:4e:22:0b:8b:85:de:
-                    6a:fe:6f:da:3b:4b:0f:26:c1:f8:31:22:36:19:96:
-                    0c:ef:85:7c:72:67:ac:4c:5c:f9:23:a4:29:d8:a5:
-                    1c:b6:ec:95:eb:d3:c2:8d:cb:ae:9a:d7:08:c8:b7:
-                    f7:a0:c6:28:44:5f:24:97:bd:ca:d9:6d:99:9b:17:
-                    47:1f:38:b3:e3:67:6a:b4:75:d6:92:cd:67:62:20:
-                    58:f0:a7:46:85:94:72:76:98:c5:ec:4c:75:1b:a1:
-                    76:67:4b:1f:c8:23:6c:2a:78:66:c2:a7:6b:af:ef:
-                    97:30:34:60:0a:db:98:94:3b:9f:95:3c:34:b6:35:
-                    40:12:fa:1d:bf:66:f4:7b:fd:66:1a:2a:49:8c:24:
-                    60:91:08:f9:61:39:f9:3b:29:98:64:7b:35:04:a9:
-                    f5:af:8d:0f:1e:e7:28:b6:30:32:b4:5f:d4:29:16:
-                    7a:70:8d:db:b9:ba:bf:eb:22:98:5d:94:c8:47:e3:
-                    4b:11
+                    00:b2:c4:16:dc:07:88:ec:7e:a6:b3:25:c8:7b:9c:
+                    e0:07:1e:40:a9:40:c0:4d:c8:73:27:ea:88:d8:58:
+                    1a:1a:12:e3:9a:62:41:4c:a1:e9:b1:ce:c6:b2:f6:
+                    3a:f6:89:3f:40:e6:0f:fb:15:4b:cb:d2:8d:8e:b6:
+                    44:aa:63:fa:3b:c5:cc:af:86:05:70:aa:ec:f4:b3:
+                    79:04:e6:3e:25:ec:ec:29:d6:c9:8b:7b:13:05:a7:
+                    ff:51:5b:ab:4c:bc:d0:e4:bd:61:1a:d2:27:f1:2e:
+                    5f:f4:51:81:c4:23:ba:20:c3:14:08:b4:be:78:49:
+                    b5:13:1f:69:fd:f6:a7:59:91:84:a9:99:10:c8:9c:
+                    63:9e:99:c2:f2:3d:61:9d:6a:6e:d4:26:9b:88:aa:
+                    da:66:b3:0d:c6:99:03:16:13:3a:a4:9a:ff:08:3e:
+                    59:df:a7:44:b7:17:99:3f:63:7f:3a:05:7e:ce:64:
+                    78:34:e6:00:77:69:e6:03:24:a7:12:f3:e8:a8:50:
+                    2b:55:16:fa:6e:65:c6:28:58:82:a4:20:7e:68:22:
+                    e9:81:9e:a2:e8:0f:d6:87:c2:73:dd:c2:0c:cc:a3:
+                    47:54:11:f5:3d:dc:51:52:57:b2:ce:77:8b:7a:ac:
+                    a7:f0:2a:26:36:e6:26:b9:6a:83:da:b2:6f:c0:f6:
+                    1e:f3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:53:F5:80:11:F6:3F:1B:A8:9D:8D:75:0D:56:3B:F2:2B:C5:9C:44
+                E3:D1:05:98:4C:68:53:C2:DC:00:EE:AC:E5:A8:B8:FC:B9:72:D9:67
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         43:35:08:cc:aa:f8:10:9f:9e:fa:ab:24:dc:c6:e6:9a:23:52:
-         c9:4c:81:33:ba:64:b2:86:a8:29:f4:1f:5a:fa:5a:c4:91:56:
-         16:d1:f9:84:96:89:8c:ac:1f:b6:ea:2f:cb:12:f4:92:ed:3b:
-         85:09:eb:f3:7a:2e:09:39:ec:ee:09:4b:fa:86:3e:62:40:0e:
-         57:72:07:de:fa:53:45:ac:40:1c:0d:0b:4a:67:9a:f7:39:ce:
-         33:5e:d0:17:0b:8a:83:ae:33:6f:96:c0:f0:7a:ac:07:36:c5:
-         86:a9:db:93:aa:2e:fa:71:d1:1a:dd:82:2a:f8:1c:30:2a:b9:
-         7d:29:fa:75:62:76:7c:15:15:75:af:78:6c:7c:53:ae:2e:80:
-         14:0d:0b:eb:0f:b1:6d:fa:df:72:0b:6f:f0:90:96:18:71:df:
-         76:1d:8c:f1:d5:c0:4f:ab:38:1a:eb:e6:a1:dd:1d:dc:60:d4:
-         da:7f:40:db:17:fc:4a:56:65:3a:86:60:83:87:b3:f6:3b:a8:
-         85:ac:2b:14:c2:26:77:8f:ee:a4:6f:11:f2:27:08:3f:bf:86:
-         4a:e3:bd:ef:6b:51:ec:72:a7:51:08:47:16:f8:d3:d7:b1:8d:
-         a1:b1:ca:d3:cd:fd:56:0a:2c:2f:62:27:8c:e1:ff:88:83:ff:
-         83:ab:87:70
+         0d:37:a8:9e:12:c9:fb:45:a2:b9:82:07:4a:2a:34:d2:3b:1d:
+         84:70:b1:4a:85:37:7e:64:31:45:c3:02:9d:32:4e:92:a4:97:
+         72:ed:1d:f2:c3:26:c8:3f:90:e4:24:f4:6e:4b:33:71:98:bc:
+         68:25:26:cc:de:c1:46:a6:a8:83:60:fc:6e:c0:72:98:8f:ce:
+         38:6e:69:9d:ab:d1:5a:f0:a6:c8:07:a1:09:b3:8c:03:09:7b:
+         44:62:73:15:85:71:5f:2c:0a:33:78:f2:a3:10:85:1e:6b:46:
+         d1:a5:f1:9c:13:ba:f7:95:41:a0:fb:de:c9:09:e1:72:a4:92:
+         ff:33:e4:81:25:10:af:90:17:79:df:54:ea:b9:87:0e:f8:6d:
+         09:55:10:46:4c:87:36:37:2f:c0:86:03:ee:7a:b4:d3:27:22:
+         22:d5:9c:2e:e6:38:f0:f4:84:5c:ca:b7:9b:4d:6a:1c:57:7e:
+         24:07:35:13:a0:f9:d6:a3:aa:29:cb:e0:8a:b0:86:1c:41:24:
+         b1:ed:04:30:71:2b:99:d7:0a:a4:51:53:b1:76:2e:be:63:5b:
+         7c:8e:d5:8f:fa:f3:99:58:7d:ce:30:07:5d:1e:ed:e6:bc:0a:
+         d1:a7:cc:17:94:e7:d1:67:07:7c:37:6d:3f:c2:8b:04:9e:77:
+         fb:5b:9c:2d
 -----BEGIN CERTIFICATE-----
 MIIC+zCCAeOgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRSBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDUwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMBwxGjAYBgNVBAMMEUMgQ0EgLSBNdWx0aS1yb290MIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAth9n5J7b4P/rKXXuaKJOlW7S9p3JttwIGHC1dr+3
-FIvLRsZqLPpD+VST+r2q8O6jIFsqzQj3vpU25Ij4/UN9uPk4tNJOIguLhd5q/m/a
-O0sPJsH4MSI2GZYM74V8cmesTFz5I6Qp2KUctuyV69PCjcuumtcIyLf3oMYoRF8k
-l73K2W2ZmxdHHziz42dqtHXWks1nYiBY8KdGhZRydpjF7Ex1G6F2Z0sfyCNsKnhm
-wqdrr++XMDRgCtuYlDuflTw0tjVAEvodv2b0e/1mGipJjCRgkQj5YTn5OymYZHs1
-BKn1r40PHucotjAytF/UKRZ6cI3bubq/6yKYXZTIR+NLEQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBSQU/WAEfY/G6idjXUNVjvyK8WcRDAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAEM1CMyq+BCfnvqrJNzG5poj
-UslMgTO6ZLKGqCn0H1r6WsSRVhbR+YSWiYysH7bqL8sS9JLtO4UJ6/N6Lgk57O4J
-S/qGPmJADldyB976U0WsQBwNC0pnmvc5zjNe0BcLioOuM2+WwPB6rAc2xYap25Oq
-Lvpx0Rrdgir4HDAquX0p+nVidnwVFXWveGx8U64ugBQNC+sPsW3633ILb/CQlhhx
-33YdjPHVwE+rOBrr5qHdHdxg1Np/QNsX/EpWZTqGYIOHs/Y7qIWsKxTCJneP7qRv
-EfInCD+/hkrjve9rUexyp1EIRxb409exjaGxytPN/VYKLC9iJ4zh/4iD/4Orh3A=
+AQEFAAOCAQ8AMIIBCgKCAQEAssQW3AeI7H6msyXIe5zgBx5AqUDATchzJ+qI2Fga
+GhLjmmJBTKHpsc7GsvY69ok/QOYP+xVLy9KNjrZEqmP6O8XMr4YFcKrs9LN5BOY+
+JezsKdbJi3sTBaf/UVurTLzQ5L1hGtIn8S5f9FGBxCO6IMMUCLS+eEm1Ex9p/fan
+WZGEqZkQyJxjnpnC8j1hnWpu1CabiKraZrMNxpkDFhM6pJr/CD5Z36dEtxeZP2N/
+OgV+zmR4NOYAd2nmAySnEvPoqFArVRb6bmXGKFiCpCB+aCLpgZ6i6A/Wh8Jz3cIM
+zKNHVBH1PdxRUleyzneLeqyn8ComNuYmuWqD2rJvwPYe8wIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBTj0QWYTGhTwtwA7qzlqLj8uXLZZzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAA03qJ4SyftFormCB0oqNNI7
+HYRwsUqFN35kMUXDAp0yTpKkl3LtHfLDJsg/kOQk9G5LM3GYvGglJszewUamqINg
+/G7AcpiPzjhuaZ2r0VrwpsgHoQmzjAMJe0RicxWFcV8sCjN48qMQhR5rRtGl8ZwT
+uveVQaD73skJ4XKkkv8z5IElEK+QF3nfVOq5hw74bQlVEEZMhzY3L8CGA+56tNMn
+IiLVnC7mOPD0hFzKt5tNahxXfiQHNROg+dajqinL4IqwhhxBJLHtBDBxK5nXCqRR
+U7F2Lr5jW3yO1Y/685lYfc4wB10e7ea8CtGnzBeU59FnB3w3bT/CiwSed/tbnC0=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-D-by-D.pem b/net/data/ssl/certificates/multi-root-D-by-D.pem
index 3030167..7fd6fa9a 100644
--- a/net/data/ssl/certificates/multi-root-D-by-D.pem
+++ b/net/data/ssl/certificates/multi-root-D-by-D.pem
@@ -12,64 +12,64 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:cd:cf:d9:70:03:4f:4f:f1:9f:93:a1:2c:6e:cb:
-                    2f:20:d7:67:29:ce:99:02:4e:db:7d:6b:5e:6a:3a:
-                    a1:d2:7f:cd:f9:58:bd:34:fe:af:8d:8a:05:34:a2:
-                    67:16:ae:94:88:3b:77:3f:f2:a0:a5:46:2e:05:2e:
-                    b8:a7:2f:ff:e0:df:1d:b8:1e:31:6f:57:f9:aa:55:
-                    9c:83:aa:04:94:cd:e4:0f:99:f4:74:c1:38:8d:4c:
-                    90:67:ba:7e:92:42:59:ff:14:d6:4e:22:31:78:04:
-                    89:63:7d:84:fa:60:e7:d2:0d:61:0b:d8:a5:20:b3:
-                    8a:ce:f1:ef:b7:b0:b5:a6:81:d0:47:50:fb:5a:09:
-                    34:e1:a0:e3:6b:cf:e8:26:38:4d:cb:70:ae:4c:96:
-                    2c:9e:46:18:0c:e3:11:9f:8d:8a:65:c5:b1:03:5c:
-                    61:d9:35:a8:5d:29:08:7c:45:2e:38:13:dc:b0:72:
-                    a6:e6:29:04:85:6a:6d:fd:74:af:60:6c:24:51:e2:
-                    3a:58:38:c1:0f:b2:4e:ac:8e:63:81:36:01:9f:02:
-                    04:de:54:53:4c:fa:5f:67:44:db:f0:ed:ce:3f:f0:
-                    5b:e7:75:b3:72:d5:e8:76:9c:24:73:2b:0c:d9:7c:
-                    dd:85:a8:61:b9:42:d1:69:35:04:88:03:8a:c2:aa:
-                    10:cb
+                    00:b4:b2:8e:83:7f:3b:8b:0f:9f:71:37:18:78:d0:
+                    f5:bc:07:ac:d8:eb:bf:f6:7c:c0:65:dc:00:bf:83:
+                    f7:e4:5e:97:9f:db:24:e4:c1:f9:31:70:b2:51:44:
+                    2c:27:05:6a:1f:1e:35:9c:ea:c4:eb:f8:0a:c4:4b:
+                    14:30:89:e8:75:93:fb:96:32:bc:0e:64:ca:11:74:
+                    4a:ac:26:a0:9c:09:cd:6e:43:cf:6c:56:03:44:ab:
+                    53:81:66:8d:5a:ad:75:1b:31:23:9f:fd:5e:8c:10:
+                    cd:e9:e9:05:80:41:5e:b8:f1:96:3d:5b:17:b2:e1:
+                    a8:47:44:eb:82:30:5e:7a:fe:8f:11:bb:b8:31:8e:
+                    98:4c:a9:f3:2c:91:59:78:f4:63:1c:47:ad:6a:96:
+                    5e:87:39:f3:17:9b:d6:9c:e9:e1:3c:0e:ef:8a:d8:
+                    7e:c3:2d:33:d9:eb:26:29:1d:8a:66:ef:b9:8d:c3:
+                    b1:51:3a:75:56:1b:b8:a9:08:e7:10:db:37:70:c4:
+                    6c:32:c0:e1:2b:f4:84:12:a5:cf:49:83:e1:5a:40:
+                    ab:db:f9:23:c5:7d:c0:03:ac:0e:3e:be:7c:42:92:
+                    fb:b7:71:91:37:04:92:4e:d5:92:31:cf:1b:cd:e4:
+                    27:e5:85:98:ac:20:95:5d:6d:4e:90:fa:c7:6c:2b:
+                    fd:41
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                FA:45:82:63:D1:67:F2:93:F4:6A:6B:44:44:74:1A:D2:B0:CD:12:F6
+                69:E7:FF:33:A6:6B:A0:AD:5A:F1:D3:15:4F:9E:F7:C5:16:2E:C4:B6
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         ac:1c:7c:de:1a:4a:31:54:77:c5:94:7d:6a:0b:9d:c2:c9:d4:
-         3b:2d:71:e4:99:df:ca:02:5c:a0:1c:1c:22:7d:f2:a5:0e:97:
-         7c:91:20:12:c5:b7:f5:56:15:8c:1b:44:b2:32:94:8b:e5:b1:
-         c0:0b:f6:c0:b8:b4:cf:b9:27:d8:49:52:fc:81:9f:48:2a:08:
-         b8:94:a1:3f:78:fe:20:66:f5:ed:3f:61:f6:f7:23:5c:4c:36:
-         49:48:10:07:de:40:62:eb:3b:bb:6b:4b:8e:e4:a7:b3:75:33:
-         2f:4d:11:58:76:1e:1c:d9:b9:dc:1c:33:da:82:2b:5f:fc:51:
-         f1:26:35:7d:5e:eb:67:ba:da:2c:f2:d7:6e:88:b6:a1:34:ed:
-         07:d2:a5:e4:ac:d6:9b:7c:6c:6e:77:aa:11:4e:d0:60:fa:86:
-         94:a0:74:00:60:8b:1c:0b:3e:5d:05:c9:b9:8c:b4:6f:a5:e7:
-         82:c0:6a:ef:60:73:de:1f:74:20:aa:67:c7:d9:c2:81:c7:4c:
-         d7:c9:57:e4:7d:db:80:bd:7d:4f:39:a4:77:d3:2e:65:79:87:
-         ae:05:f7:9c:28:ed:e8:4e:f6:ac:38:3f:8f:36:bb:ae:5e:42:
-         71:d5:a9:5b:a7:df:42:9f:6b:e0:ec:3e:3b:6e:36:11:9b:34:
-         a8:66:ff:d5
+         55:ec:3a:cd:87:dc:96:54:23:68:65:f7:a6:91:3c:37:f0:44:
+         94:2e:2f:3a:af:2c:0d:f4:09:f6:52:69:4f:ad:ac:83:6c:76:
+         76:72:2b:c0:48:ea:c9:76:c0:f5:7a:1e:73:ba:3c:f3:41:93:
+         b4:4b:a5:6a:a3:87:f5:c7:6f:e9:55:ce:e0:8b:8c:83:e6:f0:
+         e0:1c:e8:6a:8f:3b:67:b6:cd:35:6d:0b:1c:16:bf:38:fd:9d:
+         d8:95:a9:3c:b9:4c:05:19:71:f4:a0:2c:1f:83:18:5a:f3:5a:
+         ea:80:49:70:cc:49:84:63:7c:a9:4d:cb:1f:df:96:f2:c4:2c:
+         2c:e8:b0:75:69:8c:a9:71:7e:27:6a:fe:22:c6:77:e0:77:f4:
+         98:05:29:45:18:75:a3:f0:43:40:b2:8d:52:cb:2e:46:fb:37:
+         bb:c6:68:20:c2:2e:01:82:51:f0:00:3a:89:40:9b:ab:9c:c3:
+         5c:f2:a3:3b:f7:00:98:4d:bd:a7:74:37:f6:74:c7:6e:42:4b:
+         aa:8c:cc:c7:85:b2:4b:78:cb:8c:03:7c:e5:85:75:32:a9:89:
+         49:da:ed:3d:9e:5b:a2:c9:b2:2a:08:06:6d:cf:df:83:d4:a9:
+         3d:e9:44:de:70:9c:43:e3:35:24:dd:85:ed:7c:37:4e:02:44:
+         d2:5d:7a:ad
 -----BEGIN CERTIFICATE-----
 MIIDADCCAeigAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRCBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDIwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMCExHzAdBgNVBAMMFkQgUm9vdCBDQSAtIE11bHRpLXJvb3QwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNz9lwA09P8Z+ToSxuyy8g12cpzpkCTtt9
-a15qOqHSf835WL00/q+NigU0omcWrpSIO3c/8qClRi4FLrinL//g3x24HjFvV/mq
-VZyDqgSUzeQPmfR0wTiNTJBnun6SQln/FNZOIjF4BIljfYT6YOfSDWEL2KUgs4rO
-8e+3sLWmgdBHUPtaCTThoONrz+gmOE3LcK5MliyeRhgM4xGfjYplxbEDXGHZNahd
-KQh8RS44E9ywcqbmKQSFam39dK9gbCRR4jpYOMEPsk6sjmOBNgGfAgTeVFNM+l9n
-RNvw7c4/8FvndbNy1eh2nCRzKwzZfN2FqGG5QtFpNQSIA4rCqhDLAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPpFgmPRZ/KT9GprRER0GtKwzRL2
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEArBx83hpKMVR3xZR9
-agudwsnUOy1x5JnfygJcoBwcIn3ypQ6XfJEgEsW39VYVjBtEsjKUi+WxwAv2wLi0
-z7kn2ElS/IGfSCoIuJShP3j+IGb17T9h9vcjXEw2SUgQB95AYus7u2tLjuSns3Uz
-L00RWHYeHNm53Bwz2oIrX/xR8SY1fV7rZ7raLPLXboi2oTTtB9Kl5KzWm3xsbneq
-EU7QYPqGlKB0AGCLHAs+XQXJuYy0b6XngsBq72Bz3h90IKpnx9nCgcdM18lX5H3b
-gL19Tzmkd9MuZXmHrgX3nCjt6E72rDg/jza7rl5CcdWpW6ffQp9r4Ow+O242EZs0
-qGb/1Q==
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0so6DfzuLD59xNxh40PW8B6zY67/2fMBl
+3AC/g/fkXpef2yTkwfkxcLJRRCwnBWofHjWc6sTr+ArESxQwieh1k/uWMrwOZMoR
+dEqsJqCcCc1uQ89sVgNEq1OBZo1arXUbMSOf/V6MEM3p6QWAQV648ZY9Wxey4ahH
+ROuCMF56/o8Ru7gxjphMqfMskVl49GMcR61qll6HOfMXm9ac6eE8Du+K2H7DLTPZ
+6yYpHYpm77mNw7FROnVWG7ipCOcQ2zdwxGwywOEr9IQSpc9Jg+FaQKvb+SPFfcAD
+rA4+vnxCkvu3cZE3BJJO1ZIxzxvN5CflhZisIJVdbU6Q+sdsK/1BAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFGnn/zOma6CtWvHTFU+e98UWLsS2
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVew6zYfcllQjaGX3
+ppE8N/BElC4vOq8sDfQJ9lJpT62sg2x2dnIrwEjqyXbA9Xoec7o880GTtEulaqOH
+9cdv6VXO4IuMg+bw4Bzoao87Z7bNNW0LHBa/OP2d2JWpPLlMBRlx9KAsH4MYWvNa
+6oBJcMxJhGN8qU3LH9+W8sQsLOiwdWmMqXF+J2r+IsZ34Hf0mAUpRRh1o/BDQLKN
+UssuRvs3u8ZoIMIuAYJR8AA6iUCbq5zDXPKjO/cAmE29p3Q39nTHbkJLqozMx4Wy
+S3jLjAN85YV1MqmJSdrtPZ5bosmyKggGbc/fg9SpPelE3nCcQ+M1JN2F7Xw3TgJE
+0l16rQ==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-E-by-E.pem b/net/data/ssl/certificates/multi-root-E-by-E.pem
index 15632dd..4ccd307 100644
--- a/net/data/ssl/certificates/multi-root-E-by-E.pem
+++ b/net/data/ssl/certificates/multi-root-E-by-E.pem
@@ -12,64 +12,64 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b5:60:cb:b4:84:ab:6c:ba:59:52:a9:4c:6a:85:
-                    41:f2:41:17:49:40:3f:3e:e8:70:5c:05:df:dd:64:
-                    9e:fc:be:fb:38:ef:5d:67:ab:0e:de:9c:ea:ad:91:
-                    e1:f4:db:8b:f4:c0:e6:d0:ad:e2:83:15:01:aa:49:
-                    42:97:ae:72:7b:78:e3:20:4e:7e:29:ee:b5:35:6b:
-                    c4:af:d4:54:b0:86:2f:a9:09:a7:3b:8c:05:9e:fd:
-                    b4:b8:1f:3a:aa:d5:b5:d2:91:0f:50:e9:d2:1e:62:
-                    1c:c1:30:07:41:aa:bd:c2:11:3f:cc:c8:0f:a9:7e:
-                    81:69:52:96:86:2a:07:63:7b:f0:23:9e:db:27:88:
-                    8c:dc:aa:8c:66:dd:35:3a:08:60:37:36:41:34:f5:
-                    48:69:23:1a:5b:18:a7:ec:df:68:0a:3c:19:fb:92:
-                    b7:fa:53:9b:f3:70:b6:0d:4c:cb:2f:b7:0e:7e:5f:
-                    94:8c:a3:71:66:09:be:0d:af:db:52:f6:82:3f:88:
-                    64:72:cc:19:79:f4:7b:4d:6e:50:dc:93:88:d5:29:
-                    8a:e1:c8:1f:32:71:9f:d9:0e:14:31:f8:94:11:23:
-                    b1:bf:64:eb:27:3a:64:fb:77:ee:40:8c:a7:03:ed:
-                    1d:ec:8f:ee:25:58:f0:26:91:3c:f8:28:a1:7a:45:
-                    9f:13
+                    00:c0:14:71:12:fe:4f:36:78:5f:3a:b4:1e:d5:bb:
+                    22:92:3e:57:bf:4d:e0:cf:1e:a1:fb:19:6d:88:3a:
+                    59:93:79:57:42:bc:ab:7c:a0:0d:73:35:db:db:ba:
+                    80:ef:a9:80:5b:b0:90:f5:2f:ea:17:7d:2b:92:a4:
+                    5e:88:0a:16:f3:dc:f5:25:3d:7a:8d:8e:9b:e9:22:
+                    74:dc:49:6e:87:ff:67:ae:3a:b8:09:63:63:e7:c2:
+                    bd:77:d7:1b:cb:93:c6:4a:1d:7b:51:25:05:31:cb:
+                    32:66:43:ea:2d:54:59:59:cd:de:d2:84:6f:d8:5a:
+                    c1:5b:6c:2d:67:d5:57:23:25:a0:04:dc:45:64:02:
+                    f0:de:1a:4a:62:c9:76:b5:f6:36:46:74:af:1f:18:
+                    6c:f7:38:cf:34:e3:e1:3f:ad:51:41:cf:92:ed:d5:
+                    27:f7:4a:e3:3c:d5:42:26:51:e3:b2:69:20:b1:1f:
+                    0a:f6:fd:19:3c:8e:98:94:64:eb:fe:e6:67:a0:12:
+                    f6:78:98:0f:44:b8:24:60:7c:de:e2:67:b9:0d:6e:
+                    8c:06:80:43:8e:41:76:1d:09:40:0e:3b:e7:8d:0a:
+                    d9:66:d7:34:6c:ce:7e:f9:25:6a:15:cf:9a:3e:ec:
+                    30:e0:a3:b1:d2:a3:b1:31:f1:62:50:5c:b4:fe:dd:
+                    54:61
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                51:68:BC:D9:1B:1D:7F:8E:0D:4A:33:39:2D:A4:1F:14:29:92:70:8E
+                15:FA:C3:A2:2A:E0:2C:25:C5:BE:D7:BE:91:51:DD:45:F0:F1:5D:64
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         2d:d4:56:d9:90:bb:62:64:66:78:6d:cd:73:26:cc:42:ce:37:
-         f4:bf:e8:8f:e7:1e:00:cb:c2:bd:54:33:0b:a8:e2:04:e1:5f:
-         59:2a:1a:41:70:0f:d6:32:5f:d0:14:86:fa:e2:a7:19:29:49:
-         77:56:b9:d7:e6:eb:39:61:e4:25:67:22:eb:f8:46:86:b7:6b:
-         7d:44:01:0b:18:cb:ba:e5:af:76:ab:c6:fe:43:6c:d8:f6:33:
-         f7:86:0b:22:da:27:78:91:07:55:3f:b2:c5:1e:10:88:09:b3:
-         cf:22:c6:7e:8f:c6:d0:c5:ec:67:90:72:8b:2b:c4:46:81:2c:
-         82:d1:5c:57:4e:d5:af:c4:d2:d8:b2:a7:91:1a:42:b3:57:bc:
-         4e:81:5e:cf:91:af:da:f1:53:29:de:31:6b:d3:69:a4:4d:a9:
-         14:15:96:51:7d:0d:bd:28:11:03:71:d2:85:11:92:1d:96:1a:
-         12:33:0c:4b:cf:c4:40:19:fb:eb:6a:fe:9b:e7:2d:cd:f7:75:
-         a3:66:4e:a6:7d:8e:8c:2e:5d:b8:2c:a8:5e:d7:42:1b:97:00:
-         ba:12:41:8c:9b:f1:ed:91:49:63:5a:11:0d:e4:7d:f0:dc:36:
-         23:0b:1b:e8:5f:be:1f:6d:a7:aa:bb:30:76:e2:36:b2:5a:68:
-         80:f5:75:7e
+         bb:14:68:d2:09:0e:65:58:4d:d7:35:a0:a3:9b:e6:b4:2a:b4:
+         80:32:3e:61:6d:87:19:a6:a8:d2:01:78:cd:07:0b:09:a9:de:
+         5f:aa:86:43:dd:6f:d6:e0:3b:ab:60:71:d2:f0:aa:8f:14:93:
+         42:37:12:55:02:e1:a7:ed:8e:db:c0:83:10:19:f0:f5:1e:35:
+         77:84:9a:c1:79:9c:60:39:6f:50:00:66:73:6e:f0:b8:f7:75:
+         67:3e:fa:3e:0c:d0:d6:54:4a:ae:da:38:06:92:57:39:cc:d9:
+         b1:fa:60:5e:99:07:e6:97:3b:69:4d:e3:02:50:8d:60:76:8e:
+         7e:e3:60:d4:65:41:9b:6c:b8:cc:b2:c4:7a:61:32:cb:67:49:
+         b4:76:25:0c:7e:20:85:24:74:0a:90:0a:ce:73:f9:8e:ba:ce:
+         de:6e:0a:cf:6d:1c:50:67:fa:a2:4e:32:d0:ad:91:35:5e:aa:
+         b3:75:7e:23:14:29:a8:66:2a:82:ed:6c:ed:a9:9d:f6:77:20:
+         3a:e1:0b:ab:1e:ee:1d:8a:20:ff:7f:4f:36:5a:0a:30:5a:c6:
+         9c:aa:53:eb:3f:04:28:8a:6d:70:97:2a:99:d6:0c:db:a5:22:
+         0b:e5:6b:24:cf:6e:2a:c7:4a:6b:cd:82:8e:13:84:18:b6:47:
+         1b:9d:8b:83
 -----BEGIN CERTIFICATE-----
 MIIDADCCAeigAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRSBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDIwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMCExHzAdBgNVBAMMFkUgUm9vdCBDQSAtIE11bHRpLXJvb3QwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1YMu0hKtsullSqUxqhUHyQRdJQD8+6HBc
-Bd/dZJ78vvs4711nqw7enOqtkeH024v0wObQreKDFQGqSUKXrnJ7eOMgTn4p7rU1
-a8Sv1FSwhi+pCac7jAWe/bS4Hzqq1bXSkQ9Q6dIeYhzBMAdBqr3CET/MyA+pfoFp
-UpaGKgdje/AjntsniIzcqoxm3TU6CGA3NkE09UhpIxpbGKfs32gKPBn7krf6U5vz
-cLYNTMsvtw5+X5SMo3FmCb4Nr9tS9oI/iGRyzBl59HtNblDck4jVKYrhyB8ycZ/Z
-DhQx+JQRI7G/ZOsnOmT7d+5AjKcD7R3sj+4lWPAmkTz4KKF6RZ8TAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFFovNkbHX+ODUozOS2kHxQpknCO
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEALdRW2ZC7YmRmeG3N
-cybMQs439L/oj+ceAMvCvVQzC6jiBOFfWSoaQXAP1jJf0BSG+uKnGSlJd1a51+br
-OWHkJWci6/hGhrdrfUQBCxjLuuWvdqvG/kNs2PYz94YLItoneJEHVT+yxR4QiAmz
-zyLGfo/G0MXsZ5ByiyvERoEsgtFcV07Vr8TS2LKnkRpCs1e8ToFez5Gv2vFTKd4x
-a9NppE2pFBWWUX0NvSgRA3HShRGSHZYaEjMMS8/EQBn762r+m+ctzfd1o2ZOpn2O
-jC5duCyoXtdCG5cAuhJBjJvx7ZFJY1oRDeR98Nw2Iwsb6F++H22nqrswduI2slpo
-gPV1fg==
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAFHES/k82eF86tB7VuyKSPle/TeDPHqH7
+GW2IOlmTeVdCvKt8oA1zNdvbuoDvqYBbsJD1L+oXfSuSpF6IChbz3PUlPXqNjpvp
+InTcSW6H/2euOrgJY2Pnwr131xvLk8ZKHXtRJQUxyzJmQ+otVFlZzd7ShG/YWsFb
+bC1n1VcjJaAE3EVkAvDeGkpiyXa19jZGdK8fGGz3OM804+E/rVFBz5Lt1Sf3SuM8
+1UImUeOyaSCxHwr2/Rk8jpiUZOv+5megEvZ4mA9EuCRgfN7iZ7kNbowGgEOOQXYd
+CUAOO+eNCtlm1zRszn75JWoVz5o+7DDgo7HSo7Ex8WJQXLT+3VRhAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFBX6w6Iq4Cwlxb7XvpFR3UXw8V1k
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAuxRo0gkOZVhN1zWg
+o5vmtCq0gDI+YW2HGaao0gF4zQcLCaneX6qGQ91v1uA7q2Bx0vCqjxSTQjcSVQLh
+p+2O28CDEBnw9R41d4SawXmcYDlvUABmc27wuPd1Zz76PgzQ1lRKrto4BpJXOczZ
+sfpgXpkH5pc7aU3jAlCNYHaOfuNg1GVBm2y4zLLEemEyy2dJtHYlDH4ghSR0CpAK
+znP5jrrO3m4Kz20cUGf6ok4y0K2RNV6qs3V+IxQpqGYqgu1s7amd9ncgOuELqx7u
+HYog/39PNloKMFrGnKpT6z8EKIptcJcqmdYM26UiC+VrJM9uKsdKa82CjhOEGLZH
+G52Lgw==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-F-by-E.pem b/net/data/ssl/certificates/multi-root-F-by-E.pem
index 86b2bae..2e1124d 100644
--- a/net/data/ssl/certificates/multi-root-F-by-E.pem
+++ b/net/data/ssl/certificates/multi-root-F-by-E.pem
@@ -12,63 +12,63 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:9d:41:79:88:93:ab:fe:e6:52:28:84:91:9d:c2:
-                    85:a0:2c:97:39:69:25:20:43:85:8c:db:64:8f:41:
-                    f4:b5:25:e6:3e:16:41:fa:40:b7:6c:2c:fc:11:76:
-                    7d:86:b7:47:73:68:ae:e9:2c:7e:5d:8b:21:68:86:
-                    71:11:cd:21:f9:16:a0:20:67:ac:79:40:d0:94:e6:
-                    bf:a2:dd:65:af:da:d3:c5:23:82:0a:a2:1c:a7:bc:
-                    7d:f0:c2:a8:0b:30:ca:20:d6:31:5f:28:c8:74:4b:
-                    09:1e:50:de:d4:51:d9:9c:f5:3d:fe:b0:8d:ee:11:
-                    f2:22:3e:11:09:53:23:77:52:5c:cf:8d:dd:6c:3b:
-                    c4:39:1b:33:c2:00:bc:34:2d:e6:dc:9d:af:e8:36:
-                    ec:ac:c7:e4:73:09:44:ad:59:8d:51:c1:ee:11:60:
-                    5b:b5:c9:d8:cb:48:b0:f9:0a:57:38:d8:e3:be:c5:
-                    4e:38:7e:47:3f:24:66:a1:11:3d:2d:9f:ca:4a:dc:
-                    59:58:fd:cc:56:22:c7:d5:c9:70:2f:ec:66:81:4d:
-                    ee:48:39:97:ef:dd:b6:02:34:b2:90:db:16:a4:60:
-                    9d:18:de:95:87:a1:14:6e:19:ab:88:42:37:57:cf:
-                    20:c4:d8:e3:c6:24:8d:bc:fd:4d:d2:4e:74:06:4a:
-                    c4:3b
+                    00:c3:5d:d7:fd:02:9d:bb:14:27:d9:65:9e:e0:7e:
+                    5c:68:0b:74:71:bb:88:1e:8e:e4:54:57:fd:f6:3f:
+                    06:3a:3c:b1:5c:62:1f:cc:d8:b1:c6:90:c5:22:fc:
+                    f4:2b:47:cf:83:fc:08:d9:fd:f3:aa:b6:e4:22:0c:
+                    88:4a:74:63:2b:13:f1:6a:37:04:0e:de:3b:66:20:
+                    b9:f5:e2:b8:cd:e6:8a:b6:fd:9d:93:b6:6d:8e:72:
+                    71:b3:a1:03:7d:60:7a:94:a5:e9:93:c1:75:99:26:
+                    26:63:3b:33:3a:3e:af:21:96:78:ff:2a:84:55:1d:
+                    21:59:db:6a:cc:ba:d8:c1:cb:8d:ed:e6:ef:b6:67:
+                    aa:85:6d:55:6c:39:8e:32:59:8b:df:ed:f6:40:ce:
+                    46:b7:b6:fe:e6:75:39:ea:59:05:4c:2a:b4:82:95:
+                    db:9e:26:71:71:b5:4c:dc:07:06:6f:31:dd:de:93:
+                    f0:be:eb:55:39:ae:9a:7f:b0:3f:74:06:3c:e6:55:
+                    e5:09:aa:d5:84:56:be:f5:67:c4:3c:47:69:16:a0:
+                    a4:96:72:08:01:28:0b:ce:ba:a8:16:a9:88:79:b9:
+                    ae:40:ed:1a:8b:5e:d8:ab:22:a0:3e:09:08:c5:77:
+                    94:35:af:f5:de:f0:e6:b8:3d:86:02:4e:79:b2:9b:
+                    84:7d
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                CA:CF:14:CE:08:5C:4B:71:AD:DE:DA:70:78:A9:D1:D6:7F:25:76:E4
+                02:E9:36:9C:1C:59:BF:B9:1B:DE:86:93:68:BB:A6:2B:07:FA:05:B7
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         31:f4:da:87:3f:e3:55:1a:c6:e4:fc:71:23:9e:51:de:88:89:
-         f2:c7:b3:7c:8b:f7:c1:71:3a:bc:bd:ff:61:43:2a:3b:4c:6c:
-         2c:eb:7c:f6:00:37:e1:0a:fc:2f:01:73:73:d7:b9:b8:dc:fa:
-         6e:10:fc:55:2b:d6:d3:95:09:27:de:97:28:d5:b6:48:19:a5:
-         0b:13:d3:29:cf:80:86:36:39:41:c1:15:17:74:8c:d7:2f:f6:
-         00:63:06:cb:cb:74:9b:2e:35:1c:b7:d8:38:db:a4:d2:63:c0:
-         f1:97:db:be:1d:10:bc:3b:67:59:99:0d:3e:5f:2d:52:38:ca:
-         80:49:6f:b4:f3:e5:0a:d4:b3:96:ef:45:9c:a4:15:35:af:9c:
-         04:fd:5a:22:0f:44:67:32:0e:79:47:37:87:fb:3c:fb:2f:0a:
-         1d:b3:20:cd:f5:fe:71:f6:c8:f1:0e:f2:ed:8d:a4:8c:c3:af:
-         a0:ce:8e:49:a8:af:ec:55:2c:17:4f:03:7e:6a:a9:ff:ae:46:
-         25:89:0c:54:d7:32:7b:9b:8f:a2:df:ac:44:a8:03:cc:56:9e:
-         d6:cb:f6:af:c9:e4:f8:de:68:4d:0c:11:20:ac:5b:d2:e8:07:
-         b2:29:6f:27:b5:29:a8:fa:09:9d:f1:a1:f7:2c:72:05:07:7d:
-         31:1e:98:d4
+         28:0a:35:5a:36:47:b7:fd:96:b0:42:62:5e:0a:fe:f8:10:70:
+         da:65:67:9c:5a:33:68:4c:ba:5c:e8:3f:f3:04:3f:8f:e5:11:
+         5f:0b:e2:70:2f:9f:6e:10:c4:18:cf:ea:a0:10:cf:52:71:08:
+         34:12:b0:ea:77:f8:ec:f3:72:36:6f:c5:34:e7:9e:67:32:96:
+         14:4f:d4:f9:cb:75:34:64:09:78:6e:95:91:f2:af:ef:46:73:
+         42:01:91:49:db:c9:1c:a6:92:89:f4:8f:02:97:15:2e:20:f7:
+         66:71:d9:28:b8:ad:4b:6b:74:e7:33:b6:25:c8:ea:1d:22:2a:
+         2b:bb:ba:d6:77:5f:db:fb:bf:23:ab:7f:6d:97:89:f3:29:f4:
+         68:31:6c:4b:02:75:61:ec:28:4a:fc:b4:3d:eb:88:4f:73:3e:
+         bb:5e:9d:1b:c6:71:7b:2c:09:0b:03:b1:85:4b:fc:8d:4c:c4:
+         96:b1:1c:ec:9a:85:94:4f:f2:14:b8:14:50:d1:21:0d:dd:4b:
+         af:4a:ab:8a:3c:9b:d4:98:08:d3:2d:56:4c:3b:1e:46:cb:2c:
+         f6:04:bc:ff:d7:85:10:6e:3b:5d:30:a3:29:88:a9:cd:17:de:
+         23:92:2f:1f:52:7c:dc:69:5b:8f:b8:e7:0a:9b:f2:cf:0f:1d:
+         94:b4:ff:1b
 -----BEGIN CERTIFICATE-----
 MIIC+zCCAeOgAwIBAgICEAIwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRSBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDIwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMBwxGjAYBgNVBAMMEUYgQ0EgLSBNdWx0aS1yb290MIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAnUF5iJOr/uZSKISRncKFoCyXOWklIEOFjNtkj0H0
-tSXmPhZB+kC3bCz8EXZ9hrdHc2iu6Sx+XYshaIZxEc0h+RagIGeseUDQlOa/ot1l
-r9rTxSOCCqIcp7x98MKoCzDKINYxXyjIdEsJHlDe1FHZnPU9/rCN7hHyIj4RCVMj
-d1Jcz43dbDvEORszwgC8NC3m3J2v6DbsrMfkcwlErVmNUcHuEWBbtcnYy0iw+QpX
-ONjjvsVOOH5HPyRmoRE9LZ/KStxZWP3MViLH1clwL+xmgU3uSDmX7922AjSykNsW
-pGCdGN6Vh6EUbhmriEI3V88gxNjjxiSNvP1N0k50BkrEOwIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBTKzxTOCFxLca3e2nB4qdHWfyV25DAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBADH02oc/41UaxuT8cSOeUd6I
-ifLHs3yL98FxOry9/2FDKjtMbCzrfPYAN+EK/C8Bc3PXubjc+m4Q/FUr1tOVCSfe
-lyjVtkgZpQsT0ynPgIY2OUHBFRd0jNcv9gBjBsvLdJsuNRy32DjbpNJjwPGX274d
-ELw7Z1mZDT5fLVI4yoBJb7Tz5QrUs5bvRZykFTWvnAT9WiIPRGcyDnlHN4f7PPsv
-Ch2zIM31/nH2yPEO8u2NpIzDr6DOjkmor+xVLBdPA35qqf+uRiWJDFTXMnubj6Lf
-rESoA8xWntbL9q/J5PjeaE0MESCsW9LoB7Ipbye1Kaj6CZ3xofcscgUHfTEemNQ=
+AQEFAAOCAQ8AMIIBCgKCAQEAw13X/QKduxQn2WWe4H5caAt0cbuIHo7kVFf99j8G
+OjyxXGIfzNixxpDFIvz0K0fPg/wI2f3zqrbkIgyISnRjKxPxajcEDt47ZiC59eK4
+zeaKtv2dk7ZtjnJxs6EDfWB6lKXpk8F1mSYmYzszOj6vIZZ4/yqEVR0hWdtqzLrY
+wcuN7ebvtmeqhW1VbDmOMlmL3+32QM5Gt7b+5nU56lkFTCq0gpXbniZxcbVM3AcG
+bzHd3pPwvutVOa6af7A/dAY85lXlCarVhFa+9WfEPEdpFqCklnIIASgLzrqoFqmI
+ebmuQO0ai17YqyKgPgkIxXeUNa/13vDmuD2GAk55spuEfQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQC6TacHFm/uRvehpNou6YrB/oFtzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBACgKNVo2R7f9lrBCYl4K/vgQ
+cNplZ5xaM2hMulzoP/MEP4/lEV8L4nAvn24QxBjP6qAQz1JxCDQSsOp3+OzzcjZv
+xTTnnmcylhRP1PnLdTRkCXhulZHyr+9Gc0IBkUnbyRymkon0jwKXFS4g92Zx2Si4
+rUtrdOcztiXI6h0iKiu7utZ3X9v7vyOrf22XifMp9GgxbEsCdWHsKEr8tD3riE9z
+PrtenRvGcXssCQsDsYVL/I1MxJaxHOyahZRP8hS4FFDRIQ3dS69Kq4o8m9SYCNMt
+Vkw7HkbLLPYEvP/XhRBuO10woymIqc0X3iOSLx9SfNxpW4+45wqb8s8PHZS0/xs=
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-chain1.pem b/net/data/ssl/certificates/multi-root-chain1.pem
index 9861944b..fb53c33 100644
--- a/net/data/ssl/certificates/multi-root-chain1.pem
+++ b/net/data/ssl/certificates/multi-root-chain1.pem
@@ -5,78 +5,80 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=B CA - Multi-root
         Validity
-            Not Before: Mar 11 01:37:16 2016 GMT
-            Not After : Mar  9 01:37:16 2026 GMT
+            Not Before: Feb 28 23:46:47 2017 GMT
+            Not After : Feb 26 23:46:47 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:c8:27:1c:19:81:c0:a7:30:93:03:1c:f8:21:b8:
-                    2f:8a:22:b4:89:0f:da:b1:40:95:df:dc:46:53:fc:
-                    6f:36:26:66:5a:53:6d:45:78:c2:39:16:9a:3f:82:
-                    8b:ba:c5:b0:78:a8:18:bc:d5:a7:92:a5:e6:ac:e2:
-                    0c:81:d0:94:e5:0c:ec:5e:03:0c:17:c5:35:2a:7b:
-                    ab:86:eb:bf:e8:62:0a:8f:b0:25:b2:70:f5:11:8c:
-                    16:4f:c1:76:44:e5:75:e8:93:4f:e9:e7:c4:e4:42:
-                    0a:08:be:73:2c:cb:8f:73:6a:40:77:eb:33:60:ac:
-                    be:c5:27:fd:b1:4f:88:4b:15:af:98:fd:32:53:ae:
-                    b0:2a:0c:b2:f5:05:f3:3a:06:0d:6e:5c:fe:83:fc:
-                    e3:60:ae:99:8e:a1:21:c2:72:02:e6:f4:49:57:e6:
-                    91:31:2e:be:92:a1:ad:f8:71:31:64:74:10:33:d0:
-                    a7:0c:ed:18:c7:b2:50:71:fc:b9:b6:ae:95:a0:8d:
-                    ac:1f:3c:d5:79:a7:a9:88:50:b6:02:cd:68:60:24:
-                    45:9b:b6:e9:82:08:d9:9c:d4:7e:29:7d:2b:d9:ae:
-                    57:7f:62:6a:56:96:8b:4a:33:9e:5f:93:82:b0:d1:
-                    05:03:26:cd:15:f4:87:7f:6a:9a:df:e9:01:b5:d4:
-                    c9:11
+                    00:a4:18:86:3f:09:63:9c:d4:c0:06:45:a5:91:7f:
+                    e7:a7:b8:3d:c7:ff:0d:e8:39:f5:43:27:a7:44:2a:
+                    3b:53:03:e3:cd:13:23:46:5f:e0:27:f0:a3:7a:25:
+                    82:b0:52:bb:03:4f:99:e3:2c:1b:6f:54:05:0f:7f:
+                    4f:74:f9:ad:b2:88:85:43:63:06:ac:91:f1:19:b7:
+                    da:7a:42:68:6a:68:a5:e0:02:44:23:eb:d1:05:0d:
+                    3d:58:31:ee:ba:20:9e:16:11:f5:ae:b5:c3:21:cc:
+                    84:e7:1a:d2:c2:8c:7e:44:93:36:bd:6c:0c:07:35:
+                    f2:4e:57:3f:b3:cf:21:5a:ff:16:02:e9:61:f4:cc:
+                    4a:5a:24:da:55:fc:c6:da:44:d6:b7:2a:4e:31:bf:
+                    a0:80:24:55:ed:5c:bc:6b:84:12:a4:03:cc:b2:c2:
+                    db:ef:1e:08:bd:a3:bf:ef:fc:3d:53:38:b9:00:8a:
+                    d6:40:1a:cc:f2:6a:ab:e7:4b:67:1c:ae:ff:6d:43:
+                    12:08:c6:97:4b:73:df:85:cf:2a:a5:6e:ce:22:02:
+                    cb:63:6c:3f:00:aa:3b:b0:87:9b:d5:13:09:32:4c:
+                    bd:71:79:ff:04:b1:9a:8d:2d:a0:0a:65:d5:1e:53:
+                    c4:eb:0e:14:c0:b9:f3:8f:6f:64:b4:1d:11:a7:40:
+                    e7:61
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                FB:91:A9:5F:BC:27:81:98:55:30:BF:57:32:4D:B9:DA:56:DD:52:2C
+                28:6F:58:36:8F:1B:C5:99:18:5B:DC:A5:86:AF:89:F2:B4:3E:AF:51
             X509v3 Authority Key Identifier: 
-                keyid:90:CB:53:EE:36:0A:5A:B0:93:38:C9:11:B7:AC:FD:27:71:99:DC:81
+                keyid:D0:8D:1F:B2:BC:29:96:73:EF:0C:7A:C2:A4:06:96:CF:D5:8C:31:DB
 
             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
-         b9:31:7a:95:b2:ba:3a:b4:f1:16:76:df:eb:d5:b9:af:67:b1:
-         9d:8a:27:04:9b:61:6f:42:3f:c2:b3:cd:65:c4:86:cb:90:fb:
-         9d:3a:ed:fc:b8:74:da:d7:6a:6c:2f:17:68:d1:73:58:f1:a2:
-         bb:8f:d6:b0:a8:7f:b6:a8:b0:74:d1:ea:c4:62:ed:bc:1e:ef:
-         02:6b:d5:e8:2d:15:78:16:1e:90:fa:f4:29:5a:a8:43:ad:d2:
-         58:40:b4:1c:60:4e:cd:bc:6f:1a:39:e4:46:b2:58:93:96:5a:
-         a8:a4:c4:31:73:ed:89:c4:81:27:e1:4c:66:20:7c:27:c4:f9:
-         61:ff:d1:d5:a5:02:93:4c:06:fa:15:33:7a:1f:5f:eb:29:b2:
-         b5:6a:cd:7e:d6:d7:b7:51:a7:01:2f:22:9f:9e:7e:81:98:c4:
-         72:11:36:2c:e7:c6:d0:f0:7d:98:36:ea:b7:a0:aa:13:8f:6e:
-         ae:41:59:9b:e6:c9:bc:9c:e8:93:f5:0c:4e:ca:b4:dd:e3:01:
-         fe:23:6e:fb:fa:b3:61:66:58:f5:fc:07:16:1d:a9:52:ec:a0:
-         29:61:a4:39:ed:41:50:a3:a2:33:72:0e:3c:03:e1:0a:1a:1a:
-         cf:22:73:09:d7:ea:e8:15:fc:73:3c:d4:4e:34:6c:b4:18:94:
-         c4:d3:6e:12
+         07:8f:f9:c6:33:3c:bc:74:20:21:92:46:7a:c5:df:76:18:47:
+         63:0c:5e:e8:f3:97:ec:37:83:0b:4d:a4:1c:6b:0b:a2:28:db:
+         5c:17:d9:91:77:00:4a:db:46:f9:68:ec:2a:f8:b5:82:0c:00:
+         d1:88:0c:7c:b4:2d:e9:48:f5:a2:9d:a9:d5:bb:db:9d:56:96:
+         c5:6c:46:da:23:a3:66:80:a5:9b:93:d0:df:9c:00:75:ac:48:
+         ea:48:b4:22:ee:ff:db:eb:bb:8f:f0:de:16:a1:99:98:85:4c:
+         b3:66:dd:22:96:96:97:48:ae:8a:2d:e9:a5:1c:5c:d9:dd:31:
+         3f:58:7c:bb:2b:db:86:6a:53:e5:af:6d:85:3a:ca:92:5d:56:
+         e2:02:90:d7:eb:98:0f:d8:ba:2a:d1:26:bb:82:5b:80:d5:2d:
+         52:d7:40:4d:0d:0d:1e:fe:c2:89:be:e2:80:4d:cd:91:dc:f3:
+         fa:19:25:3e:ba:a8:cf:48:d3:b6:35:a5:96:6e:a5:12:d1:65:
+         65:a9:92:6b:d0:fc:05:25:7c:fb:76:48:38:15:7e:4f:95:03:
+         b0:c3:55:89:bc:59:be:de:3c:fb:4b:5a:f1:3b:00:c1:03:59:
+         6c:b3:8b:21:7e:84:75:30:19:8c:19:f6:99:40:ec:87:43:3b:
+         89:d0:f5:6d
 -----BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQiBD
-QSAtIE11bHRpLXJvb3QwHhcNMTYwMzExMDEzNzE2WhcNMjYwMzA5MDEzNzE2WjBg
+MIIDeTCCAmGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQiBD
+QSAtIE11bHRpLXJvb3QwHhcNMTcwMjI4MjM0NjQ3WhcNMjcwMjI2MjM0NjQ3WjBg
 MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
 bnRhaW4gVmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4x
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyCccGYHApzCTAxz4Ibgv
-iiK0iQ/asUCV39xGU/xvNiZmWlNtRXjCORaaP4KLusWweKgYvNWnkqXmrOIMgdCU
-5QzsXgMMF8U1Knurhuu/6GIKj7AlsnD1EYwWT8F2ROV16JNP6efE5EIKCL5zLMuP
-c2pAd+szYKy+xSf9sU+ISxWvmP0yU66wKgyy9QXzOgYNblz+g/zjYK6ZjqEhwnIC
-5vRJV+aRMS6+kqGt+HExZHQQM9CnDO0Yx7JQcfy5tq6VoI2sHzzVeaepiFC2As1o
-YCRFm7bpggjZnNR+KX0r2a5Xf2JqVpaLSjOeX5OCsNEFAybNFfSHf2qa3+kBtdTJ
-EQIDAQABo28wbTAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBT7kalfvCeBmFUwv1cy
-TbnaVt1SLDAfBgNVHSMEGDAWgBSQy1PuNgpasJM4yRG3rP0ncZncgTAdBgNVHSUE
-FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBALkxepWy
-ujq08RZ23+vVua9nsZ2KJwSbYW9CP8KzzWXEhsuQ+5067fy4dNrXamwvF2jRc1jx
-oruP1rCof7aosHTR6sRi7bwe7wJr1egtFXgWHpD69ClaqEOt0lhAtBxgTs28bxo5
-5EayWJOWWqikxDFz7YnEgSfhTGYgfCfE+WH/0dWlApNMBvoVM3ofX+spsrVqzX7W
-17dRpwEvIp+efoGYxHIRNiznxtDwfZg26regqhOPbq5BWZvmybyc6JP1DE7KtN3j
-Af4jbvv6s2FmWPX8BxYdqVLsoClhpDntQVCjojNyDjwD4QoaGs8icwnX6ugV/HM8
-1E40bLQYlMTTbhI=
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApBiGPwljnNTABkWlkX/n
+p7g9x/8N6Dn1QyenRCo7UwPjzRMjRl/gJ/CjeiWCsFK7A0+Z4ywbb1QFD39PdPmt
+soiFQ2MGrJHxGbfaekJoamil4AJEI+vRBQ09WDHuuiCeFhH1rrXDIcyE5xrSwox+
+RJM2vWwMBzXyTlc/s88hWv8WAulh9MxKWiTaVfzG2kTWtypOMb+ggCRV7Vy8a4QS
+pAPMssLb7x4IvaO/7/w9Uzi5AIrWQBrM8mqr50tnHK7/bUMSCMaXS3Pfhc8qpW7O
+IgLLY2w/AKo7sIeb1RMJMky9cXn/BLGajS2gCmXVHlPE6w4UwLnzj29ktB0Rp0Dn
+YQIDAQABo4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUKG9YNo8bxZkYW9yl
+hq+J8rQ+r1EwHwYDVR0jBBgwFoAU0I0fsrwplnPvDHrCpAaWz9WMMdswHQYDVR0l
+BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZI
+hvcNAQELBQADggEBAAeP+cYzPLx0ICGSRnrF33YYR2MMXujzl+w3gwtNpBxrC6Io
+21wX2ZF3AErbRvlo7Cr4tYIMANGIDHy0LelI9aKdqdW7251WlsVsRtojo2aApZuT
+0N+cAHWsSOpItCLu/9vru4/w3hahmZiFTLNm3SKWlpdIroot6aUcXNndMT9YfLsr
+24ZqU+WvbYU6ypJdVuICkNfrmA/YuirRJruCW4DVLVLXQE0NDR7+wom+4oBNzZHc
+8/oZJT66qM9I07Y1pZZupRLRZWWpkmvQ/AUlfPt2SDgVfk+VA7DDVYm8Wb7ePPtL
+WvE7AMEDWWyziyF+hHUwGYwZ9plA7IdDO4nQ9W0=
 -----END CERTIFICATE-----
 Certificate:
     Data:
@@ -92,65 +94,65 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ca:e9:f3:21:f4:a0:e7:ba:82:8c:7f:b3:98:44:
-                    20:4a:9a:8b:f9:e5:0c:99:c4:22:72:f7:57:7c:1e:
-                    cc:56:4c:c3:f5:fd:1e:90:a5:1c:bf:2c:c4:c4:29:
-                    29:38:cc:26:9e:1a:1d:e3:e4:db:97:58:35:14:e8:
-                    e2:db:37:05:1c:32:f7:bb:19:22:c2:37:3f:01:76:
-                    8c:17:23:ca:fc:10:69:b4:d1:74:27:b6:10:7e:b7:
-                    c1:07:a2:a1:af:18:4d:5c:2e:13:72:a9:fb:64:b1:
-                    e7:9f:49:41:3c:dc:b8:5f:94:e6:68:05:a5:1f:c8:
-                    56:84:e2:e5:6a:84:71:9c:b8:ac:3e:ec:8e:0c:d2:
-                    f2:5f:11:fd:f4:7f:40:a7:3b:08:01:bb:fd:6f:d0:
-                    a9:16:1d:14:a1:28:20:30:98:ba:1e:22:4e:5b:09:
-                    b9:c1:df:17:60:1b:80:43:97:49:69:cd:6a:4e:58:
-                    08:9c:dc:29:57:3f:1b:bf:d8:5f:32:94:ae:97:b2:
-                    d4:8d:50:1a:d1:8b:03:84:00:fd:87:d9:2e:ed:91:
-                    3d:3f:b7:89:54:46:0a:cd:db:10:62:80:47:60:21:
-                    b3:1d:0e:bc:41:4d:86:d4:9d:52:1b:53:82:1a:9f:
-                    46:91:98:1e:ed:9f:da:69:16:64:24:1c:de:f8:b3:
-                    34:69
+                    00:ca:6c:54:ab:3c:54:33:6c:d7:04:c4:4b:c4:39:
+                    32:db:7a:49:e4:e1:e7:60:c7:35:33:08:59:ba:62:
+                    bf:49:d6:05:1f:07:b8:b6:bd:38:2f:6b:a7:e5:8d:
+                    de:79:27:d8:36:58:92:69:cc:db:8e:6a:89:b4:79:
+                    ab:cf:98:53:08:12:17:9e:51:15:bc:e7:8f:e5:93:
+                    d9:1a:2e:68:a9:93:3c:d3:7a:75:a4:5c:c2:fc:16:
+                    9b:ba:df:49:5d:73:65:ec:b0:cc:1e:ba:cc:98:39:
+                    d1:4e:b2:d6:5f:e8:7f:24:1a:fa:56:b0:0d:33:46:
+                    22:56:4f:5c:f3:16:ad:55:8a:62:3c:bc:50:c2:3a:
+                    58:3e:70:4d:5a:df:99:ec:c7:a6:2c:8f:2a:a5:2e:
+                    11:b8:58:c5:d5:e8:43:2f:40:a5:20:80:32:2a:76:
+                    5e:06:07:48:6d:44:60:ba:21:72:61:e2:1a:ec:64:
+                    5d:72:72:f1:21:9d:04:2f:61:35:0b:2f:f0:c0:fe:
+                    52:b8:c4:41:9c:b6:13:58:21:81:e3:28:27:4d:6c:
+                    24:a3:20:fb:0f:9c:d4:4f:34:3a:d0:d1:08:84:c4:
+                    40:71:44:4f:e8:be:c5:1f:5d:1c:34:64:0b:6c:1c:
+                    24:fa:a9:83:49:c6:f5:4d:7f:63:c0:1a:a9:77:8a:
+                    c0:43
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:CB:53:EE:36:0A:5A:B0:93:38:C9:11:B7:AC:FD:27:71:99:DC:81
+                D0:8D:1F:B2:BC:29:96:73:EF:0C:7A:C2:A4:06:96:CF:D5:8C:31:DB
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         97:cd:ae:5a:26:f4:25:f6:c0:8b:08:d8:df:82:35:d8:76:f3:
-         5d:cc:99:bd:ac:70:c9:41:e0:24:c8:fd:e6:4e:41:2c:d4:69:
-         8d:08:25:fd:f3:32:3a:58:0b:d3:58:9c:81:51:bf:97:a4:bc:
-         00:18:1c:4f:1c:54:04:63:e3:72:87:f4:dc:9e:7b:dc:da:5d:
-         e1:ef:59:6b:f0:1f:3d:0c:11:55:1e:9a:1a:d8:8d:bc:7b:18:
-         b7:4f:92:1c:68:73:82:ec:f3:69:48:0a:86:40:4a:a5:6f:ae:
-         8f:10:2e:12:0b:e8:7e:b9:bc:d7:26:f0:cf:f4:0f:5b:77:f2:
-         ff:77:28:b4:5f:5e:ef:65:08:21:b8:f9:1e:56:b9:69:3b:c4:
-         7f:01:88:c9:7c:ca:d0:e2:df:e5:5e:8d:e9:2e:7d:4a:78:04:
-         8b:c1:dc:d4:58:ac:90:fc:5c:8e:48:2b:60:99:63:37:3f:e5:
-         61:da:8f:58:9f:4d:0a:ee:6c:8d:bc:1f:7e:c4:be:0f:32:4b:
-         11:7a:28:bf:dd:d0:a0:40:42:a8:43:4d:0b:2f:01:0e:73:de:
-         1b:a6:df:49:57:58:89:57:c0:23:76:83:f0:9a:0e:83:d9:9b:
-         cb:eb:ac:3f:89:d1:e8:3c:3e:f1:d5:80:0c:38:18:02:5c:5f:
-         e5:68:5e:cf
+         1e:16:7c:d7:d1:ee:63:a9:a2:b1:87:2c:8b:1e:d3:cf:51:14:
+         ed:12:0b:ec:67:2b:7f:3b:0e:8e:3c:50:bb:d1:dc:3b:40:1a:
+         ec:44:30:c4:f6:65:c2:c3:5d:d8:cb:c2:6c:13:2e:5a:2d:76:
+         c6:6b:5d:65:a5:7e:c2:bf:cb:fc:b1:50:b0:43:47:fc:a3:7b:
+         07:d1:77:50:4f:d2:53:98:8f:a2:00:97:13:d9:b7:83:2e:d9:
+         c4:2a:e6:b1:fc:2d:6c:ce:d1:61:73:aa:40:e0:ce:87:74:43:
+         a2:f7:b5:d9:5f:46:79:97:28:c4:de:15:60:3b:3e:3f:3d:1d:
+         14:f4:87:ef:b9:08:09:2a:fb:d0:d5:1b:4f:77:f9:0d:c9:4b:
+         23:32:1c:06:04:a6:83:aa:00:9c:70:c2:2b:01:42:1e:f6:d6:
+         d3:5c:f9:a8:b7:84:9e:44:12:9a:9f:a8:2a:89:56:69:a6:2f:
+         e9:ee:67:e9:7e:32:b5:ef:6b:4e:f0:12:23:fa:85:3e:03:59:
+         94:db:88:99:04:55:c4:d1:df:df:c6:e2:fd:61:c5:f6:af:dc:
+         4c:e4:52:8f:f2:c8:07:39:dd:99:33:49:85:1e:df:e1:1f:08:
+         6b:e0:d2:1b:93:db:32:05:4b:39:ee:b3:f1:b6:af:18:07:a7:
+         24:9c:1e:75
 -----BEGIN CERTIFICATE-----
 MIIC9jCCAd6gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQyBD
 QSAtIE11bHRpLXJvb3QwHhcNMTYwMTA0MDAwMDAwWhcNMjYwMTAyMDAwMDAwWjAc
 MRowGAYDVQQDDBFCIENBIC0gTXVsdGktcm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMrp8yH0oOe6gox/s5hEIEqai/nlDJnEInL3V3wezFZMw/X9
-HpClHL8sxMQpKTjMJp4aHePk25dYNRTo4ts3BRwy97sZIsI3PwF2jBcjyvwQabTR
-dCe2EH63wQeioa8YTVwuE3Kp+2Sx559JQTzcuF+U5mgFpR/IVoTi5WqEcZy4rD7s
-jgzS8l8R/fR/QKc7CAG7/W/QqRYdFKEoIDCYuh4iTlsJucHfF2AbgEOXSWnNak5Y
-CJzcKVc/G7/YXzKUrpey1I1QGtGLA4QA/YfZLu2RPT+3iVRGCs3bEGKAR2Ahsx0O
-vEFNhtSdUhtTghqfRpGYHu2f2mkWZCQc3vizNGkCAwEAAaNCMEAwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUkMtT7jYKWrCTOMkRt6z9J3GZ3IEwDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCXza5aJvQl9sCLCNjfgjXYdvNdzJm9
-rHDJQeAkyP3mTkEs1GmNCCX98zI6WAvTWJyBUb+XpLwAGBxPHFQEY+Nyh/Tcnnvc
-2l3h71lr8B89DBFVHpoa2I28exi3T5IcaHOC7PNpSAqGQEqlb66PEC4SC+h+ubzX
-JvDP9A9bd/L/dyi0X17vZQghuPkeVrlpO8R/AYjJfMrQ4t/lXo3pLn1KeASLwdzU
-WKyQ/FyOSCtgmWM3P+Vh2o9Yn00K7myNvB9+xL4PMksReii/3dCgQEKoQ00LLwEO
-c94bpt9JV1iJV8AjdoPwmg6D2ZvL66w/idHoPD7x1YAMOBgCXF/laF7P
+ggEPADCCAQoCggEBAMpsVKs8VDNs1wTES8Q5Mtt6SeTh52DHNTMIWbpiv0nWBR8H
+uLa9OC9rp+WN3nkn2DZYkmnM245qibR5q8+YUwgSF55RFbznj+WT2RouaKmTPNN6
+daRcwvwWm7rfSV1zZeywzB66zJg50U6y1l/ofyQa+lawDTNGIlZPXPMWrVWKYjy8
+UMI6WD5wTVrfmezHpiyPKqUuEbhYxdXoQy9ApSCAMip2XgYHSG1EYLohcmHiGuxk
+XXJy8SGdBC9hNQsv8MD+UrjEQZy2E1ghgeMoJ01sJKMg+w+c1E80OtDRCITEQHFE
+T+i+xR9dHDRkC2wcJPqpg0nG9U1/Y8AaqXeKwEMCAwEAAaNCMEAwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU0I0fsrwplnPvDHrCpAaWz9WMMdswDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAeFnzX0e5jqaKxhyyLHtPPURTtEgvs
+Zyt/Ow6OPFC70dw7QBrsRDDE9mXCw13Yy8JsEy5aLXbGa11lpX7Cv8v8sVCwQ0f8
+o3sH0XdQT9JTmI+iAJcT2beDLtnEKuax/C1sztFhc6pA4M6HdEOi97XZX0Z5lyjE
+3hVgOz4/PR0U9IfvuQgJKvvQ1RtPd/kNyUsjMhwGBKaDqgCccMIrAUIe9tbTXPmo
+t4SeRBKan6gqiVZppi/p7mfpfjK172tO8BIj+oU+A1mU24iZBFXE0d/fxuL9YcX2
+r9xM5FKP8sgHOd2ZM0mFHt/hHwhr4NIbk9syBUs57rPxtq8YB6cknB51
 -----END CERTIFICATE-----
 Certificate:
     Data:
@@ -166,65 +168,65 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b6:1f:67:e4:9e:db:e0:ff:eb:29:75:ee:68:a2:
-                    4e:95:6e:d2:f6:9d:c9:b6:dc:08:18:70:b5:76:bf:
-                    b7:14:8b:cb:46:c6:6a:2c:fa:43:f9:54:93:fa:bd:
-                    aa:f0:ee:a3:20:5b:2a:cd:08:f7:be:95:36:e4:88:
-                    f8:fd:43:7d:b8:f9:38:b4:d2:4e:22:0b:8b:85:de:
-                    6a:fe:6f:da:3b:4b:0f:26:c1:f8:31:22:36:19:96:
-                    0c:ef:85:7c:72:67:ac:4c:5c:f9:23:a4:29:d8:a5:
-                    1c:b6:ec:95:eb:d3:c2:8d:cb:ae:9a:d7:08:c8:b7:
-                    f7:a0:c6:28:44:5f:24:97:bd:ca:d9:6d:99:9b:17:
-                    47:1f:38:b3:e3:67:6a:b4:75:d6:92:cd:67:62:20:
-                    58:f0:a7:46:85:94:72:76:98:c5:ec:4c:75:1b:a1:
-                    76:67:4b:1f:c8:23:6c:2a:78:66:c2:a7:6b:af:ef:
-                    97:30:34:60:0a:db:98:94:3b:9f:95:3c:34:b6:35:
-                    40:12:fa:1d:bf:66:f4:7b:fd:66:1a:2a:49:8c:24:
-                    60:91:08:f9:61:39:f9:3b:29:98:64:7b:35:04:a9:
-                    f5:af:8d:0f:1e:e7:28:b6:30:32:b4:5f:d4:29:16:
-                    7a:70:8d:db:b9:ba:bf:eb:22:98:5d:94:c8:47:e3:
-                    4b:11
+                    00:b2:c4:16:dc:07:88:ec:7e:a6:b3:25:c8:7b:9c:
+                    e0:07:1e:40:a9:40:c0:4d:c8:73:27:ea:88:d8:58:
+                    1a:1a:12:e3:9a:62:41:4c:a1:e9:b1:ce:c6:b2:f6:
+                    3a:f6:89:3f:40:e6:0f:fb:15:4b:cb:d2:8d:8e:b6:
+                    44:aa:63:fa:3b:c5:cc:af:86:05:70:aa:ec:f4:b3:
+                    79:04:e6:3e:25:ec:ec:29:d6:c9:8b:7b:13:05:a7:
+                    ff:51:5b:ab:4c:bc:d0:e4:bd:61:1a:d2:27:f1:2e:
+                    5f:f4:51:81:c4:23:ba:20:c3:14:08:b4:be:78:49:
+                    b5:13:1f:69:fd:f6:a7:59:91:84:a9:99:10:c8:9c:
+                    63:9e:99:c2:f2:3d:61:9d:6a:6e:d4:26:9b:88:aa:
+                    da:66:b3:0d:c6:99:03:16:13:3a:a4:9a:ff:08:3e:
+                    59:df:a7:44:b7:17:99:3f:63:7f:3a:05:7e:ce:64:
+                    78:34:e6:00:77:69:e6:03:24:a7:12:f3:e8:a8:50:
+                    2b:55:16:fa:6e:65:c6:28:58:82:a4:20:7e:68:22:
+                    e9:81:9e:a2:e8:0f:d6:87:c2:73:dd:c2:0c:cc:a3:
+                    47:54:11:f5:3d:dc:51:52:57:b2:ce:77:8b:7a:ac:
+                    a7:f0:2a:26:36:e6:26:b9:6a:83:da:b2:6f:c0:f6:
+                    1e:f3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:53:F5:80:11:F6:3F:1B:A8:9D:8D:75:0D:56:3B:F2:2B:C5:9C:44
+                E3:D1:05:98:4C:68:53:C2:DC:00:EE:AC:E5:A8:B8:FC:B9:72:D9:67
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         67:11:95:f4:b9:cb:47:e6:50:da:fd:a0:13:78:d7:e1:be:59:
-         ec:86:32:e5:56:3e:9b:8f:db:b0:3b:93:fb:d0:6e:b3:de:7e:
-         10:5b:b4:30:f7:02:e8:3f:ff:4e:91:3a:e8:b8:4a:94:5e:14:
-         7b:f8:84:e5:1f:63:2c:b4:7f:4f:ee:b1:d5:ee:92:79:7d:63:
-         87:a0:e9:57:14:57:11:59:18:54:8b:e3:d1:51:80:a7:2f:51:
-         f2:6f:43:d2:87:e1:59:23:2c:fe:83:38:e1:25:da:b5:34:af:
-         33:17:64:80:08:b6:bd:5f:92:05:2c:81:b0:c3:d3:80:cd:e1:
-         5c:95:d2:ea:1e:d3:af:d9:93:c2:f4:23:ae:51:b0:a4:82:49:
-         2d:ec:fe:d1:18:e3:a3:53:9f:63:4b:38:dc:54:25:ce:4c:90:
-         37:02:e4:67:41:31:ba:7a:13:1a:68:1e:ed:34:0c:3d:66:ba:
-         a3:3a:71:76:5f:5f:89:a1:cd:95:50:f6:5d:1f:c0:91:31:93:
-         5b:58:af:e7:9b:21:e6:57:b1:f4:d7:dd:c1:84:25:5b:83:f7:
-         5f:c9:89:17:5b:6f:54:f2:8b:ed:47:de:27:57:9e:e9:8c:b3:
-         58:2c:c2:77:25:e1:eb:22:06:d1:f6:c5:f4:d7:1a:3d:00:1c:
-         2e:85:e9:70
+         7e:5b:a7:f2:c7:15:33:73:ce:e4:1e:77:ba:35:8b:44:01:57:
+         b1:db:55:d3:54:95:c6:44:27:89:3f:e5:46:98:de:4a:7e:d9:
+         e7:6c:e8:0d:d5:e2:98:31:07:21:9c:bd:01:47:be:0c:e1:b3:
+         22:1e:ea:da:d4:fc:b5:37:5d:94:de:06:9b:69:a5:77:22:d0:
+         96:80:35:9f:02:a0:cd:41:35:b3:21:94:ca:9b:03:4f:68:18:
+         5e:6d:0d:95:95:17:ab:bd:00:9b:d0:78:f7:38:5e:37:df:33:
+         15:2f:3e:64:27:c8:67:5e:c4:14:92:08:90:55:34:8d:73:d9:
+         66:0c:30:dd:42:ab:71:73:b4:26:28:b1:13:90:7b:0a:10:f2:
+         7c:75:07:36:1f:a5:b6:a5:97:ac:20:c7:83:0c:15:cf:5c:34:
+         df:3f:8d:81:3e:c0:43:2a:ca:6f:c4:86:cc:2f:93:e1:5d:18:
+         68:a4:bd:cc:5b:39:fa:40:fa:d4:a7:8b:7a:5d:b7:59:77:48:
+         9b:ab:e0:71:b2:04:1f:79:ea:d1:cd:d3:24:52:5b:4b:21:2f:
+         84:2e:b4:d6:87:1d:4f:fe:e7:6c:94:ff:d0:02:50:6b:bc:2a:
+         1e:21:a5:ac:3e:73:b5:2f:ba:11:c5:6f:8f:f7:8e:eb:08:11:
+         00:cb:e3:2d
 -----BEGIN CERTIFICATE-----
 MIIC+zCCAeOgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRCBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDMwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMBwxGjAYBgNVBAMMEUMgQ0EgLSBNdWx0aS1yb290MIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAth9n5J7b4P/rKXXuaKJOlW7S9p3JttwIGHC1dr+3
-FIvLRsZqLPpD+VST+r2q8O6jIFsqzQj3vpU25Ij4/UN9uPk4tNJOIguLhd5q/m/a
-O0sPJsH4MSI2GZYM74V8cmesTFz5I6Qp2KUctuyV69PCjcuumtcIyLf3oMYoRF8k
-l73K2W2ZmxdHHziz42dqtHXWks1nYiBY8KdGhZRydpjF7Ex1G6F2Z0sfyCNsKnhm
-wqdrr++XMDRgCtuYlDuflTw0tjVAEvodv2b0e/1mGipJjCRgkQj5YTn5OymYZHs1
-BKn1r40PHucotjAytF/UKRZ6cI3bubq/6yKYXZTIR+NLEQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBSQU/WAEfY/G6idjXUNVjvyK8WcRDAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAGcRlfS5y0fmUNr9oBN41+G+
-WeyGMuVWPpuP27A7k/vQbrPefhBbtDD3Aug//06ROui4SpReFHv4hOUfYyy0f0/u
-sdXuknl9Y4eg6VcUVxFZGFSL49FRgKcvUfJvQ9KH4VkjLP6DOOEl2rU0rzMXZIAI
-tr1fkgUsgbDD04DN4VyV0uoe06/Zk8L0I65RsKSCSS3s/tEY46NTn2NLONxUJc5M
-kDcC5GdBMbp6ExpoHu00DD1muqM6cXZfX4mhzZVQ9l0fwJExk1tYr+ebIeZXsfTX
-3cGEJVuD91/JiRdbb1Tyi+1H3idXnumMs1gswncl4esiBtH2xfTXGj0AHC6F6XA=
+AQEFAAOCAQ8AMIIBCgKCAQEAssQW3AeI7H6msyXIe5zgBx5AqUDATchzJ+qI2Fga
+GhLjmmJBTKHpsc7GsvY69ok/QOYP+xVLy9KNjrZEqmP6O8XMr4YFcKrs9LN5BOY+
+JezsKdbJi3sTBaf/UVurTLzQ5L1hGtIn8S5f9FGBxCO6IMMUCLS+eEm1Ex9p/fan
+WZGEqZkQyJxjnpnC8j1hnWpu1CabiKraZrMNxpkDFhM6pJr/CD5Z36dEtxeZP2N/
+OgV+zmR4NOYAd2nmAySnEvPoqFArVRb6bmXGKFiCpCB+aCLpgZ6i6A/Wh8Jz3cIM
+zKNHVBH1PdxRUleyzneLeqyn8ComNuYmuWqD2rJvwPYe8wIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBTj0QWYTGhTwtwA7qzlqLj8uXLZZzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAH5bp/LHFTNzzuQed7o1i0QB
+V7HbVdNUlcZEJ4k/5UaY3kp+2eds6A3V4pgxByGcvQFHvgzhsyIe6trU/LU3XZTe
+BptppXci0JaANZ8CoM1BNbMhlMqbA09oGF5tDZWVF6u9AJvQePc4XjffMxUvPmQn
+yGdexBSSCJBVNI1z2WYMMN1Cq3FztCYosROQewoQ8nx1BzYfpball6wgx4MMFc9c
+NN8/jYE+wEMqym/Ehswvk+FdGGikvcxbOfpA+tSni3pdt1l3SJur4HGyBB956tHN
+0yRSW0shL4QutNaHHU/+52yU/9ACUGu8Kh4hpaw+c7UvuhHFb4/3jusIEQDL4y0=
 -----END CERTIFICATE-----
 Certificate:
     Data:
@@ -240,64 +242,64 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:cd:cf:d9:70:03:4f:4f:f1:9f:93:a1:2c:6e:cb:
-                    2f:20:d7:67:29:ce:99:02:4e:db:7d:6b:5e:6a:3a:
-                    a1:d2:7f:cd:f9:58:bd:34:fe:af:8d:8a:05:34:a2:
-                    67:16:ae:94:88:3b:77:3f:f2:a0:a5:46:2e:05:2e:
-                    b8:a7:2f:ff:e0:df:1d:b8:1e:31:6f:57:f9:aa:55:
-                    9c:83:aa:04:94:cd:e4:0f:99:f4:74:c1:38:8d:4c:
-                    90:67:ba:7e:92:42:59:ff:14:d6:4e:22:31:78:04:
-                    89:63:7d:84:fa:60:e7:d2:0d:61:0b:d8:a5:20:b3:
-                    8a:ce:f1:ef:b7:b0:b5:a6:81:d0:47:50:fb:5a:09:
-                    34:e1:a0:e3:6b:cf:e8:26:38:4d:cb:70:ae:4c:96:
-                    2c:9e:46:18:0c:e3:11:9f:8d:8a:65:c5:b1:03:5c:
-                    61:d9:35:a8:5d:29:08:7c:45:2e:38:13:dc:b0:72:
-                    a6:e6:29:04:85:6a:6d:fd:74:af:60:6c:24:51:e2:
-                    3a:58:38:c1:0f:b2:4e:ac:8e:63:81:36:01:9f:02:
-                    04:de:54:53:4c:fa:5f:67:44:db:f0:ed:ce:3f:f0:
-                    5b:e7:75:b3:72:d5:e8:76:9c:24:73:2b:0c:d9:7c:
-                    dd:85:a8:61:b9:42:d1:69:35:04:88:03:8a:c2:aa:
-                    10:cb
+                    00:b4:b2:8e:83:7f:3b:8b:0f:9f:71:37:18:78:d0:
+                    f5:bc:07:ac:d8:eb:bf:f6:7c:c0:65:dc:00:bf:83:
+                    f7:e4:5e:97:9f:db:24:e4:c1:f9:31:70:b2:51:44:
+                    2c:27:05:6a:1f:1e:35:9c:ea:c4:eb:f8:0a:c4:4b:
+                    14:30:89:e8:75:93:fb:96:32:bc:0e:64:ca:11:74:
+                    4a:ac:26:a0:9c:09:cd:6e:43:cf:6c:56:03:44:ab:
+                    53:81:66:8d:5a:ad:75:1b:31:23:9f:fd:5e:8c:10:
+                    cd:e9:e9:05:80:41:5e:b8:f1:96:3d:5b:17:b2:e1:
+                    a8:47:44:eb:82:30:5e:7a:fe:8f:11:bb:b8:31:8e:
+                    98:4c:a9:f3:2c:91:59:78:f4:63:1c:47:ad:6a:96:
+                    5e:87:39:f3:17:9b:d6:9c:e9:e1:3c:0e:ef:8a:d8:
+                    7e:c3:2d:33:d9:eb:26:29:1d:8a:66:ef:b9:8d:c3:
+                    b1:51:3a:75:56:1b:b8:a9:08:e7:10:db:37:70:c4:
+                    6c:32:c0:e1:2b:f4:84:12:a5:cf:49:83:e1:5a:40:
+                    ab:db:f9:23:c5:7d:c0:03:ac:0e:3e:be:7c:42:92:
+                    fb:b7:71:91:37:04:92:4e:d5:92:31:cf:1b:cd:e4:
+                    27:e5:85:98:ac:20:95:5d:6d:4e:90:fa:c7:6c:2b:
+                    fd:41
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                FA:45:82:63:D1:67:F2:93:F4:6A:6B:44:44:74:1A:D2:B0:CD:12:F6
+                69:E7:FF:33:A6:6B:A0:AD:5A:F1:D3:15:4F:9E:F7:C5:16:2E:C4:B6
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         ac:1c:7c:de:1a:4a:31:54:77:c5:94:7d:6a:0b:9d:c2:c9:d4:
-         3b:2d:71:e4:99:df:ca:02:5c:a0:1c:1c:22:7d:f2:a5:0e:97:
-         7c:91:20:12:c5:b7:f5:56:15:8c:1b:44:b2:32:94:8b:e5:b1:
-         c0:0b:f6:c0:b8:b4:cf:b9:27:d8:49:52:fc:81:9f:48:2a:08:
-         b8:94:a1:3f:78:fe:20:66:f5:ed:3f:61:f6:f7:23:5c:4c:36:
-         49:48:10:07:de:40:62:eb:3b:bb:6b:4b:8e:e4:a7:b3:75:33:
-         2f:4d:11:58:76:1e:1c:d9:b9:dc:1c:33:da:82:2b:5f:fc:51:
-         f1:26:35:7d:5e:eb:67:ba:da:2c:f2:d7:6e:88:b6:a1:34:ed:
-         07:d2:a5:e4:ac:d6:9b:7c:6c:6e:77:aa:11:4e:d0:60:fa:86:
-         94:a0:74:00:60:8b:1c:0b:3e:5d:05:c9:b9:8c:b4:6f:a5:e7:
-         82:c0:6a:ef:60:73:de:1f:74:20:aa:67:c7:d9:c2:81:c7:4c:
-         d7:c9:57:e4:7d:db:80:bd:7d:4f:39:a4:77:d3:2e:65:79:87:
-         ae:05:f7:9c:28:ed:e8:4e:f6:ac:38:3f:8f:36:bb:ae:5e:42:
-         71:d5:a9:5b:a7:df:42:9f:6b:e0:ec:3e:3b:6e:36:11:9b:34:
-         a8:66:ff:d5
+         55:ec:3a:cd:87:dc:96:54:23:68:65:f7:a6:91:3c:37:f0:44:
+         94:2e:2f:3a:af:2c:0d:f4:09:f6:52:69:4f:ad:ac:83:6c:76:
+         76:72:2b:c0:48:ea:c9:76:c0:f5:7a:1e:73:ba:3c:f3:41:93:
+         b4:4b:a5:6a:a3:87:f5:c7:6f:e9:55:ce:e0:8b:8c:83:e6:f0:
+         e0:1c:e8:6a:8f:3b:67:b6:cd:35:6d:0b:1c:16:bf:38:fd:9d:
+         d8:95:a9:3c:b9:4c:05:19:71:f4:a0:2c:1f:83:18:5a:f3:5a:
+         ea:80:49:70:cc:49:84:63:7c:a9:4d:cb:1f:df:96:f2:c4:2c:
+         2c:e8:b0:75:69:8c:a9:71:7e:27:6a:fe:22:c6:77:e0:77:f4:
+         98:05:29:45:18:75:a3:f0:43:40:b2:8d:52:cb:2e:46:fb:37:
+         bb:c6:68:20:c2:2e:01:82:51:f0:00:3a:89:40:9b:ab:9c:c3:
+         5c:f2:a3:3b:f7:00:98:4d:bd:a7:74:37:f6:74:c7:6e:42:4b:
+         aa:8c:cc:c7:85:b2:4b:78:cb:8c:03:7c:e5:85:75:32:a9:89:
+         49:da:ed:3d:9e:5b:a2:c9:b2:2a:08:06:6d:cf:df:83:d4:a9:
+         3d:e9:44:de:70:9c:43:e3:35:24:dd:85:ed:7c:37:4e:02:44:
+         d2:5d:7a:ad
 -----BEGIN CERTIFICATE-----
 MIIDADCCAeigAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRCBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDIwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMCExHzAdBgNVBAMMFkQgUm9vdCBDQSAtIE11bHRpLXJvb3QwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDNz9lwA09P8Z+ToSxuyy8g12cpzpkCTtt9
-a15qOqHSf835WL00/q+NigU0omcWrpSIO3c/8qClRi4FLrinL//g3x24HjFvV/mq
-VZyDqgSUzeQPmfR0wTiNTJBnun6SQln/FNZOIjF4BIljfYT6YOfSDWEL2KUgs4rO
-8e+3sLWmgdBHUPtaCTThoONrz+gmOE3LcK5MliyeRhgM4xGfjYplxbEDXGHZNahd
-KQh8RS44E9ywcqbmKQSFam39dK9gbCRR4jpYOMEPsk6sjmOBNgGfAgTeVFNM+l9n
-RNvw7c4/8FvndbNy1eh2nCRzKwzZfN2FqGG5QtFpNQSIA4rCqhDLAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPpFgmPRZ/KT9GprRER0GtKwzRL2
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEArBx83hpKMVR3xZR9
-agudwsnUOy1x5JnfygJcoBwcIn3ypQ6XfJEgEsW39VYVjBtEsjKUi+WxwAv2wLi0
-z7kn2ElS/IGfSCoIuJShP3j+IGb17T9h9vcjXEw2SUgQB95AYus7u2tLjuSns3Uz
-L00RWHYeHNm53Bwz2oIrX/xR8SY1fV7rZ7raLPLXboi2oTTtB9Kl5KzWm3xsbneq
-EU7QYPqGlKB0AGCLHAs+XQXJuYy0b6XngsBq72Bz3h90IKpnx9nCgcdM18lX5H3b
-gL19Tzmkd9MuZXmHrgX3nCjt6E72rDg/jza7rl5CcdWpW6ffQp9r4Ow+O242EZs0
-qGb/1Q==
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC0so6DfzuLD59xNxh40PW8B6zY67/2fMBl
+3AC/g/fkXpef2yTkwfkxcLJRRCwnBWofHjWc6sTr+ArESxQwieh1k/uWMrwOZMoR
+dEqsJqCcCc1uQ89sVgNEq1OBZo1arXUbMSOf/V6MEM3p6QWAQV648ZY9Wxey4ahH
+ROuCMF56/o8Ru7gxjphMqfMskVl49GMcR61qll6HOfMXm9ac6eE8Du+K2H7DLTPZ
+6yYpHYpm77mNw7FROnVWG7ipCOcQ2zdwxGwywOEr9IQSpc9Jg+FaQKvb+SPFfcAD
+rA4+vnxCkvu3cZE3BJJO1ZIxzxvN5CflhZisIJVdbU6Q+sdsK/1BAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFGnn/zOma6CtWvHTFU+e98UWLsS2
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAVew6zYfcllQjaGX3
+ppE8N/BElC4vOq8sDfQJ9lJpT62sg2x2dnIrwEjqyXbA9Xoec7o880GTtEulaqOH
+9cdv6VXO4IuMg+bw4Bzoao87Z7bNNW0LHBa/OP2d2JWpPLlMBRlx9KAsH4MYWvNa
+6oBJcMxJhGN8qU3LH9+W8sQsLOiwdWmMqXF+J2r+IsZ34Hf0mAUpRRh1o/BDQLKN
+UssuRvs3u8ZoIMIuAYJR8AA6iUCbq5zDXPKjO/cAmE29p3Q39nTHbkJLqozMx4Wy
+S3jLjAN85YV1MqmJSdrtPZ5bosmyKggGbc/fg9SpPelE3nCcQ+M1JN2F7Xw3TgJE
+0l16rQ==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-chain2.pem b/net/data/ssl/certificates/multi-root-chain2.pem
index e7b91143..ea5a7f0 100644
--- a/net/data/ssl/certificates/multi-root-chain2.pem
+++ b/net/data/ssl/certificates/multi-root-chain2.pem
@@ -5,78 +5,80 @@
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=B CA - Multi-root
         Validity
-            Not Before: Mar 11 01:37:16 2016 GMT
-            Not After : Mar  9 01:37:16 2026 GMT
+            Not Before: Feb 28 23:46:47 2017 GMT
+            Not After : Feb 26 23:46:47 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:c8:27:1c:19:81:c0:a7:30:93:03:1c:f8:21:b8:
-                    2f:8a:22:b4:89:0f:da:b1:40:95:df:dc:46:53:fc:
-                    6f:36:26:66:5a:53:6d:45:78:c2:39:16:9a:3f:82:
-                    8b:ba:c5:b0:78:a8:18:bc:d5:a7:92:a5:e6:ac:e2:
-                    0c:81:d0:94:e5:0c:ec:5e:03:0c:17:c5:35:2a:7b:
-                    ab:86:eb:bf:e8:62:0a:8f:b0:25:b2:70:f5:11:8c:
-                    16:4f:c1:76:44:e5:75:e8:93:4f:e9:e7:c4:e4:42:
-                    0a:08:be:73:2c:cb:8f:73:6a:40:77:eb:33:60:ac:
-                    be:c5:27:fd:b1:4f:88:4b:15:af:98:fd:32:53:ae:
-                    b0:2a:0c:b2:f5:05:f3:3a:06:0d:6e:5c:fe:83:fc:
-                    e3:60:ae:99:8e:a1:21:c2:72:02:e6:f4:49:57:e6:
-                    91:31:2e:be:92:a1:ad:f8:71:31:64:74:10:33:d0:
-                    a7:0c:ed:18:c7:b2:50:71:fc:b9:b6:ae:95:a0:8d:
-                    ac:1f:3c:d5:79:a7:a9:88:50:b6:02:cd:68:60:24:
-                    45:9b:b6:e9:82:08:d9:9c:d4:7e:29:7d:2b:d9:ae:
-                    57:7f:62:6a:56:96:8b:4a:33:9e:5f:93:82:b0:d1:
-                    05:03:26:cd:15:f4:87:7f:6a:9a:df:e9:01:b5:d4:
-                    c9:11
+                    00:a4:18:86:3f:09:63:9c:d4:c0:06:45:a5:91:7f:
+                    e7:a7:b8:3d:c7:ff:0d:e8:39:f5:43:27:a7:44:2a:
+                    3b:53:03:e3:cd:13:23:46:5f:e0:27:f0:a3:7a:25:
+                    82:b0:52:bb:03:4f:99:e3:2c:1b:6f:54:05:0f:7f:
+                    4f:74:f9:ad:b2:88:85:43:63:06:ac:91:f1:19:b7:
+                    da:7a:42:68:6a:68:a5:e0:02:44:23:eb:d1:05:0d:
+                    3d:58:31:ee:ba:20:9e:16:11:f5:ae:b5:c3:21:cc:
+                    84:e7:1a:d2:c2:8c:7e:44:93:36:bd:6c:0c:07:35:
+                    f2:4e:57:3f:b3:cf:21:5a:ff:16:02:e9:61:f4:cc:
+                    4a:5a:24:da:55:fc:c6:da:44:d6:b7:2a:4e:31:bf:
+                    a0:80:24:55:ed:5c:bc:6b:84:12:a4:03:cc:b2:c2:
+                    db:ef:1e:08:bd:a3:bf:ef:fc:3d:53:38:b9:00:8a:
+                    d6:40:1a:cc:f2:6a:ab:e7:4b:67:1c:ae:ff:6d:43:
+                    12:08:c6:97:4b:73:df:85:cf:2a:a5:6e:ce:22:02:
+                    cb:63:6c:3f:00:aa:3b:b0:87:9b:d5:13:09:32:4c:
+                    bd:71:79:ff:04:b1:9a:8d:2d:a0:0a:65:d5:1e:53:
+                    c4:eb:0e:14:c0:b9:f3:8f:6f:64:b4:1d:11:a7:40:
+                    e7:61
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:FALSE
             X509v3 Subject Key Identifier: 
-                FB:91:A9:5F:BC:27:81:98:55:30:BF:57:32:4D:B9:DA:56:DD:52:2C
+                28:6F:58:36:8F:1B:C5:99:18:5B:DC:A5:86:AF:89:F2:B4:3E:AF:51
             X509v3 Authority Key Identifier: 
-                keyid:90:CB:53:EE:36:0A:5A:B0:93:38:C9:11:B7:AC:FD:27:71:99:DC:81
+                keyid:D0:8D:1F:B2:BC:29:96:73:EF:0C:7A:C2:A4:06:96:CF:D5:8C:31:DB
 
             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
-         b9:31:7a:95:b2:ba:3a:b4:f1:16:76:df:eb:d5:b9:af:67:b1:
-         9d:8a:27:04:9b:61:6f:42:3f:c2:b3:cd:65:c4:86:cb:90:fb:
-         9d:3a:ed:fc:b8:74:da:d7:6a:6c:2f:17:68:d1:73:58:f1:a2:
-         bb:8f:d6:b0:a8:7f:b6:a8:b0:74:d1:ea:c4:62:ed:bc:1e:ef:
-         02:6b:d5:e8:2d:15:78:16:1e:90:fa:f4:29:5a:a8:43:ad:d2:
-         58:40:b4:1c:60:4e:cd:bc:6f:1a:39:e4:46:b2:58:93:96:5a:
-         a8:a4:c4:31:73:ed:89:c4:81:27:e1:4c:66:20:7c:27:c4:f9:
-         61:ff:d1:d5:a5:02:93:4c:06:fa:15:33:7a:1f:5f:eb:29:b2:
-         b5:6a:cd:7e:d6:d7:b7:51:a7:01:2f:22:9f:9e:7e:81:98:c4:
-         72:11:36:2c:e7:c6:d0:f0:7d:98:36:ea:b7:a0:aa:13:8f:6e:
-         ae:41:59:9b:e6:c9:bc:9c:e8:93:f5:0c:4e:ca:b4:dd:e3:01:
-         fe:23:6e:fb:fa:b3:61:66:58:f5:fc:07:16:1d:a9:52:ec:a0:
-         29:61:a4:39:ed:41:50:a3:a2:33:72:0e:3c:03:e1:0a:1a:1a:
-         cf:22:73:09:d7:ea:e8:15:fc:73:3c:d4:4e:34:6c:b4:18:94:
-         c4:d3:6e:12
+         07:8f:f9:c6:33:3c:bc:74:20:21:92:46:7a:c5:df:76:18:47:
+         63:0c:5e:e8:f3:97:ec:37:83:0b:4d:a4:1c:6b:0b:a2:28:db:
+         5c:17:d9:91:77:00:4a:db:46:f9:68:ec:2a:f8:b5:82:0c:00:
+         d1:88:0c:7c:b4:2d:e9:48:f5:a2:9d:a9:d5:bb:db:9d:56:96:
+         c5:6c:46:da:23:a3:66:80:a5:9b:93:d0:df:9c:00:75:ac:48:
+         ea:48:b4:22:ee:ff:db:eb:bb:8f:f0:de:16:a1:99:98:85:4c:
+         b3:66:dd:22:96:96:97:48:ae:8a:2d:e9:a5:1c:5c:d9:dd:31:
+         3f:58:7c:bb:2b:db:86:6a:53:e5:af:6d:85:3a:ca:92:5d:56:
+         e2:02:90:d7:eb:98:0f:d8:ba:2a:d1:26:bb:82:5b:80:d5:2d:
+         52:d7:40:4d:0d:0d:1e:fe:c2:89:be:e2:80:4d:cd:91:dc:f3:
+         fa:19:25:3e:ba:a8:cf:48:d3:b6:35:a5:96:6e:a5:12:d1:65:
+         65:a9:92:6b:d0:fc:05:25:7c:fb:76:48:38:15:7e:4f:95:03:
+         b0:c3:55:89:bc:59:be:de:3c:fb:4b:5a:f1:3b:00:c1:03:59:
+         6c:b3:8b:21:7e:84:75:30:19:8c:19:f6:99:40:ec:87:43:3b:
+         89:d0:f5:6d
 -----BEGIN CERTIFICATE-----
-MIIDZzCCAk+gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQiBD
-QSAtIE11bHRpLXJvb3QwHhcNMTYwMzExMDEzNzE2WhcNMjYwMzA5MDEzNzE2WjBg
+MIIDeTCCAmGgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQiBD
+QSAtIE11bHRpLXJvb3QwHhcNMTcwMjI4MjM0NjQ3WhcNMjcwMjI2MjM0NjQ3WjBg
 MQswCQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNTW91
 bnRhaW4gVmlldzEQMA4GA1UECgwHVGVzdCBDQTESMBAGA1UEAwwJMTI3LjAuMC4x
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyCccGYHApzCTAxz4Ibgv
-iiK0iQ/asUCV39xGU/xvNiZmWlNtRXjCORaaP4KLusWweKgYvNWnkqXmrOIMgdCU
-5QzsXgMMF8U1Knurhuu/6GIKj7AlsnD1EYwWT8F2ROV16JNP6efE5EIKCL5zLMuP
-c2pAd+szYKy+xSf9sU+ISxWvmP0yU66wKgyy9QXzOgYNblz+g/zjYK6ZjqEhwnIC
-5vRJV+aRMS6+kqGt+HExZHQQM9CnDO0Yx7JQcfy5tq6VoI2sHzzVeaepiFC2As1o
-YCRFm7bpggjZnNR+KX0r2a5Xf2JqVpaLSjOeX5OCsNEFAybNFfSHf2qa3+kBtdTJ
-EQIDAQABo28wbTAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBT7kalfvCeBmFUwv1cy
-TbnaVt1SLDAfBgNVHSMEGDAWgBSQy1PuNgpasJM4yRG3rP0ncZncgTAdBgNVHSUE
-FjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwDQYJKoZIhvcNAQELBQADggEBALkxepWy
-ujq08RZ23+vVua9nsZ2KJwSbYW9CP8KzzWXEhsuQ+5067fy4dNrXamwvF2jRc1jx
-oruP1rCof7aosHTR6sRi7bwe7wJr1egtFXgWHpD69ClaqEOt0lhAtBxgTs28bxo5
-5EayWJOWWqikxDFz7YnEgSfhTGYgfCfE+WH/0dWlApNMBvoVM3ofX+spsrVqzX7W
-17dRpwEvIp+efoGYxHIRNiznxtDwfZg26regqhOPbq5BWZvmybyc6JP1DE7KtN3j
-Af4jbvv6s2FmWPX8BxYdqVLsoClhpDntQVCjojNyDjwD4QoaGs8icwnX6ugV/HM8
-1E40bLQYlMTTbhI=
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApBiGPwljnNTABkWlkX/n
+p7g9x/8N6Dn1QyenRCo7UwPjzRMjRl/gJ/CjeiWCsFK7A0+Z4ywbb1QFD39PdPmt
+soiFQ2MGrJHxGbfaekJoamil4AJEI+vRBQ09WDHuuiCeFhH1rrXDIcyE5xrSwox+
+RJM2vWwMBzXyTlc/s88hWv8WAulh9MxKWiTaVfzG2kTWtypOMb+ggCRV7Vy8a4QS
+pAPMssLb7x4IvaO/7/w9Uzi5AIrWQBrM8mqr50tnHK7/bUMSCMaXS3Pfhc8qpW7O
+IgLLY2w/AKo7sIeb1RMJMky9cXn/BLGajS2gCmXVHlPE6w4UwLnzj29ktB0Rp0Dn
+YQIDAQABo4GAMH4wDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUKG9YNo8bxZkYW9yl
+hq+J8rQ+r1EwHwYDVR0jBBgwFoAU0I0fsrwplnPvDHrCpAaWz9WMMdswHQYDVR0l
+BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMA8GA1UdEQQIMAaHBH8AAAEwDQYJKoZI
+hvcNAQELBQADggEBAAeP+cYzPLx0ICGSRnrF33YYR2MMXujzl+w3gwtNpBxrC6Io
+21wX2ZF3AErbRvlo7Cr4tYIMANGIDHy0LelI9aKdqdW7251WlsVsRtojo2aApZuT
+0N+cAHWsSOpItCLu/9vru4/w3hahmZiFTLNm3SKWlpdIroot6aUcXNndMT9YfLsr
+24ZqU+WvbYU6ypJdVuICkNfrmA/YuirRJruCW4DVLVLXQE0NDR7+wom+4oBNzZHc
+8/oZJT66qM9I07Y1pZZupRLRZWWpkmvQ/AUlfPt2SDgVfk+VA7DDVYm8Wb7ePPtL
+WvE7AMEDWWyziyF+hHUwGYwZ9plA7IdDO4nQ9W0=
 -----END CERTIFICATE-----
 Certificate:
     Data:
@@ -92,65 +94,65 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:ca:e9:f3:21:f4:a0:e7:ba:82:8c:7f:b3:98:44:
-                    20:4a:9a:8b:f9:e5:0c:99:c4:22:72:f7:57:7c:1e:
-                    cc:56:4c:c3:f5:fd:1e:90:a5:1c:bf:2c:c4:c4:29:
-                    29:38:cc:26:9e:1a:1d:e3:e4:db:97:58:35:14:e8:
-                    e2:db:37:05:1c:32:f7:bb:19:22:c2:37:3f:01:76:
-                    8c:17:23:ca:fc:10:69:b4:d1:74:27:b6:10:7e:b7:
-                    c1:07:a2:a1:af:18:4d:5c:2e:13:72:a9:fb:64:b1:
-                    e7:9f:49:41:3c:dc:b8:5f:94:e6:68:05:a5:1f:c8:
-                    56:84:e2:e5:6a:84:71:9c:b8:ac:3e:ec:8e:0c:d2:
-                    f2:5f:11:fd:f4:7f:40:a7:3b:08:01:bb:fd:6f:d0:
-                    a9:16:1d:14:a1:28:20:30:98:ba:1e:22:4e:5b:09:
-                    b9:c1:df:17:60:1b:80:43:97:49:69:cd:6a:4e:58:
-                    08:9c:dc:29:57:3f:1b:bf:d8:5f:32:94:ae:97:b2:
-                    d4:8d:50:1a:d1:8b:03:84:00:fd:87:d9:2e:ed:91:
-                    3d:3f:b7:89:54:46:0a:cd:db:10:62:80:47:60:21:
-                    b3:1d:0e:bc:41:4d:86:d4:9d:52:1b:53:82:1a:9f:
-                    46:91:98:1e:ed:9f:da:69:16:64:24:1c:de:f8:b3:
-                    34:69
+                    00:ca:6c:54:ab:3c:54:33:6c:d7:04:c4:4b:c4:39:
+                    32:db:7a:49:e4:e1:e7:60:c7:35:33:08:59:ba:62:
+                    bf:49:d6:05:1f:07:b8:b6:bd:38:2f:6b:a7:e5:8d:
+                    de:79:27:d8:36:58:92:69:cc:db:8e:6a:89:b4:79:
+                    ab:cf:98:53:08:12:17:9e:51:15:bc:e7:8f:e5:93:
+                    d9:1a:2e:68:a9:93:3c:d3:7a:75:a4:5c:c2:fc:16:
+                    9b:ba:df:49:5d:73:65:ec:b0:cc:1e:ba:cc:98:39:
+                    d1:4e:b2:d6:5f:e8:7f:24:1a:fa:56:b0:0d:33:46:
+                    22:56:4f:5c:f3:16:ad:55:8a:62:3c:bc:50:c2:3a:
+                    58:3e:70:4d:5a:df:99:ec:c7:a6:2c:8f:2a:a5:2e:
+                    11:b8:58:c5:d5:e8:43:2f:40:a5:20:80:32:2a:76:
+                    5e:06:07:48:6d:44:60:ba:21:72:61:e2:1a:ec:64:
+                    5d:72:72:f1:21:9d:04:2f:61:35:0b:2f:f0:c0:fe:
+                    52:b8:c4:41:9c:b6:13:58:21:81:e3:28:27:4d:6c:
+                    24:a3:20:fb:0f:9c:d4:4f:34:3a:d0:d1:08:84:c4:
+                    40:71:44:4f:e8:be:c5:1f:5d:1c:34:64:0b:6c:1c:
+                    24:fa:a9:83:49:c6:f5:4d:7f:63:c0:1a:a9:77:8a:
+                    c0:43
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:CB:53:EE:36:0A:5A:B0:93:38:C9:11:B7:AC:FD:27:71:99:DC:81
+                D0:8D:1F:B2:BC:29:96:73:EF:0C:7A:C2:A4:06:96:CF:D5:8C:31:DB
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         97:cd:ae:5a:26:f4:25:f6:c0:8b:08:d8:df:82:35:d8:76:f3:
-         5d:cc:99:bd:ac:70:c9:41:e0:24:c8:fd:e6:4e:41:2c:d4:69:
-         8d:08:25:fd:f3:32:3a:58:0b:d3:58:9c:81:51:bf:97:a4:bc:
-         00:18:1c:4f:1c:54:04:63:e3:72:87:f4:dc:9e:7b:dc:da:5d:
-         e1:ef:59:6b:f0:1f:3d:0c:11:55:1e:9a:1a:d8:8d:bc:7b:18:
-         b7:4f:92:1c:68:73:82:ec:f3:69:48:0a:86:40:4a:a5:6f:ae:
-         8f:10:2e:12:0b:e8:7e:b9:bc:d7:26:f0:cf:f4:0f:5b:77:f2:
-         ff:77:28:b4:5f:5e:ef:65:08:21:b8:f9:1e:56:b9:69:3b:c4:
-         7f:01:88:c9:7c:ca:d0:e2:df:e5:5e:8d:e9:2e:7d:4a:78:04:
-         8b:c1:dc:d4:58:ac:90:fc:5c:8e:48:2b:60:99:63:37:3f:e5:
-         61:da:8f:58:9f:4d:0a:ee:6c:8d:bc:1f:7e:c4:be:0f:32:4b:
-         11:7a:28:bf:dd:d0:a0:40:42:a8:43:4d:0b:2f:01:0e:73:de:
-         1b:a6:df:49:57:58:89:57:c0:23:76:83:f0:9a:0e:83:d9:9b:
-         cb:eb:ac:3f:89:d1:e8:3c:3e:f1:d5:80:0c:38:18:02:5c:5f:
-         e5:68:5e:cf
+         1e:16:7c:d7:d1:ee:63:a9:a2:b1:87:2c:8b:1e:d3:cf:51:14:
+         ed:12:0b:ec:67:2b:7f:3b:0e:8e:3c:50:bb:d1:dc:3b:40:1a:
+         ec:44:30:c4:f6:65:c2:c3:5d:d8:cb:c2:6c:13:2e:5a:2d:76:
+         c6:6b:5d:65:a5:7e:c2:bf:cb:fc:b1:50:b0:43:47:fc:a3:7b:
+         07:d1:77:50:4f:d2:53:98:8f:a2:00:97:13:d9:b7:83:2e:d9:
+         c4:2a:e6:b1:fc:2d:6c:ce:d1:61:73:aa:40:e0:ce:87:74:43:
+         a2:f7:b5:d9:5f:46:79:97:28:c4:de:15:60:3b:3e:3f:3d:1d:
+         14:f4:87:ef:b9:08:09:2a:fb:d0:d5:1b:4f:77:f9:0d:c9:4b:
+         23:32:1c:06:04:a6:83:aa:00:9c:70:c2:2b:01:42:1e:f6:d6:
+         d3:5c:f9:a8:b7:84:9e:44:12:9a:9f:a8:2a:89:56:69:a6:2f:
+         e9:ee:67:e9:7e:32:b5:ef:6b:4e:f0:12:23:fa:85:3e:03:59:
+         94:db:88:99:04:55:c4:d1:df:df:c6:e2:fd:61:c5:f6:af:dc:
+         4c:e4:52:8f:f2:c8:07:39:dd:99:33:49:85:1e:df:e1:1f:08:
+         6b:e0:d2:1b:93:db:32:05:4b:39:ee:b3:f1:b6:af:18:07:a7:
+         24:9c:1e:75
 -----BEGIN CERTIFICATE-----
 MIIC9jCCAd6gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwHDEaMBgGA1UEAwwRQyBD
 QSAtIE11bHRpLXJvb3QwHhcNMTYwMTA0MDAwMDAwWhcNMjYwMTAyMDAwMDAwWjAc
 MRowGAYDVQQDDBFCIENBIC0gTXVsdGktcm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAMrp8yH0oOe6gox/s5hEIEqai/nlDJnEInL3V3wezFZMw/X9
-HpClHL8sxMQpKTjMJp4aHePk25dYNRTo4ts3BRwy97sZIsI3PwF2jBcjyvwQabTR
-dCe2EH63wQeioa8YTVwuE3Kp+2Sx559JQTzcuF+U5mgFpR/IVoTi5WqEcZy4rD7s
-jgzS8l8R/fR/QKc7CAG7/W/QqRYdFKEoIDCYuh4iTlsJucHfF2AbgEOXSWnNak5Y
-CJzcKVc/G7/YXzKUrpey1I1QGtGLA4QA/YfZLu2RPT+3iVRGCs3bEGKAR2Ahsx0O
-vEFNhtSdUhtTghqfRpGYHu2f2mkWZCQc3vizNGkCAwEAAaNCMEAwDwYDVR0TAQH/
-BAUwAwEB/zAdBgNVHQ4EFgQUkMtT7jYKWrCTOMkRt6z9J3GZ3IEwDgYDVR0PAQH/
-BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCXza5aJvQl9sCLCNjfgjXYdvNdzJm9
-rHDJQeAkyP3mTkEs1GmNCCX98zI6WAvTWJyBUb+XpLwAGBxPHFQEY+Nyh/Tcnnvc
-2l3h71lr8B89DBFVHpoa2I28exi3T5IcaHOC7PNpSAqGQEqlb66PEC4SC+h+ubzX
-JvDP9A9bd/L/dyi0X17vZQghuPkeVrlpO8R/AYjJfMrQ4t/lXo3pLn1KeASLwdzU
-WKyQ/FyOSCtgmWM3P+Vh2o9Yn00K7myNvB9+xL4PMksReii/3dCgQEKoQ00LLwEO
-c94bpt9JV1iJV8AjdoPwmg6D2ZvL66w/idHoPD7x1YAMOBgCXF/laF7P
+ggEPADCCAQoCggEBAMpsVKs8VDNs1wTES8Q5Mtt6SeTh52DHNTMIWbpiv0nWBR8H
+uLa9OC9rp+WN3nkn2DZYkmnM245qibR5q8+YUwgSF55RFbznj+WT2RouaKmTPNN6
+daRcwvwWm7rfSV1zZeywzB66zJg50U6y1l/ofyQa+lawDTNGIlZPXPMWrVWKYjy8
+UMI6WD5wTVrfmezHpiyPKqUuEbhYxdXoQy9ApSCAMip2XgYHSG1EYLohcmHiGuxk
+XXJy8SGdBC9hNQsv8MD+UrjEQZy2E1ghgeMoJ01sJKMg+w+c1E80OtDRCITEQHFE
+T+i+xR9dHDRkC2wcJPqpg0nG9U1/Y8AaqXeKwEMCAwEAAaNCMEAwDwYDVR0TAQH/
+BAUwAwEB/zAdBgNVHQ4EFgQU0I0fsrwplnPvDHrCpAaWz9WMMdswDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQAeFnzX0e5jqaKxhyyLHtPPURTtEgvs
+Zyt/Ow6OPFC70dw7QBrsRDDE9mXCw13Yy8JsEy5aLXbGa11lpX7Cv8v8sVCwQ0f8
+o3sH0XdQT9JTmI+iAJcT2beDLtnEKuax/C1sztFhc6pA4M6HdEOi97XZX0Z5lyjE
+3hVgOz4/PR0U9IfvuQgJKvvQ1RtPd/kNyUsjMhwGBKaDqgCccMIrAUIe9tbTXPmo
+t4SeRBKan6gqiVZppi/p7mfpfjK172tO8BIj+oU+A1mU24iZBFXE0d/fxuL9YcX2
+r9xM5FKP8sgHOd2ZM0mFHt/hHwhr4NIbk9syBUs57rPxtq8YB6cknB51
 -----END CERTIFICATE-----
 Certificate:
     Data:
@@ -166,65 +168,65 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b6:1f:67:e4:9e:db:e0:ff:eb:29:75:ee:68:a2:
-                    4e:95:6e:d2:f6:9d:c9:b6:dc:08:18:70:b5:76:bf:
-                    b7:14:8b:cb:46:c6:6a:2c:fa:43:f9:54:93:fa:bd:
-                    aa:f0:ee:a3:20:5b:2a:cd:08:f7:be:95:36:e4:88:
-                    f8:fd:43:7d:b8:f9:38:b4:d2:4e:22:0b:8b:85:de:
-                    6a:fe:6f:da:3b:4b:0f:26:c1:f8:31:22:36:19:96:
-                    0c:ef:85:7c:72:67:ac:4c:5c:f9:23:a4:29:d8:a5:
-                    1c:b6:ec:95:eb:d3:c2:8d:cb:ae:9a:d7:08:c8:b7:
-                    f7:a0:c6:28:44:5f:24:97:bd:ca:d9:6d:99:9b:17:
-                    47:1f:38:b3:e3:67:6a:b4:75:d6:92:cd:67:62:20:
-                    58:f0:a7:46:85:94:72:76:98:c5:ec:4c:75:1b:a1:
-                    76:67:4b:1f:c8:23:6c:2a:78:66:c2:a7:6b:af:ef:
-                    97:30:34:60:0a:db:98:94:3b:9f:95:3c:34:b6:35:
-                    40:12:fa:1d:bf:66:f4:7b:fd:66:1a:2a:49:8c:24:
-                    60:91:08:f9:61:39:f9:3b:29:98:64:7b:35:04:a9:
-                    f5:af:8d:0f:1e:e7:28:b6:30:32:b4:5f:d4:29:16:
-                    7a:70:8d:db:b9:ba:bf:eb:22:98:5d:94:c8:47:e3:
-                    4b:11
+                    00:b2:c4:16:dc:07:88:ec:7e:a6:b3:25:c8:7b:9c:
+                    e0:07:1e:40:a9:40:c0:4d:c8:73:27:ea:88:d8:58:
+                    1a:1a:12:e3:9a:62:41:4c:a1:e9:b1:ce:c6:b2:f6:
+                    3a:f6:89:3f:40:e6:0f:fb:15:4b:cb:d2:8d:8e:b6:
+                    44:aa:63:fa:3b:c5:cc:af:86:05:70:aa:ec:f4:b3:
+                    79:04:e6:3e:25:ec:ec:29:d6:c9:8b:7b:13:05:a7:
+                    ff:51:5b:ab:4c:bc:d0:e4:bd:61:1a:d2:27:f1:2e:
+                    5f:f4:51:81:c4:23:ba:20:c3:14:08:b4:be:78:49:
+                    b5:13:1f:69:fd:f6:a7:59:91:84:a9:99:10:c8:9c:
+                    63:9e:99:c2:f2:3d:61:9d:6a:6e:d4:26:9b:88:aa:
+                    da:66:b3:0d:c6:99:03:16:13:3a:a4:9a:ff:08:3e:
+                    59:df:a7:44:b7:17:99:3f:63:7f:3a:05:7e:ce:64:
+                    78:34:e6:00:77:69:e6:03:24:a7:12:f3:e8:a8:50:
+                    2b:55:16:fa:6e:65:c6:28:58:82:a4:20:7e:68:22:
+                    e9:81:9e:a2:e8:0f:d6:87:c2:73:dd:c2:0c:cc:a3:
+                    47:54:11:f5:3d:dc:51:52:57:b2:ce:77:8b:7a:ac:
+                    a7:f0:2a:26:36:e6:26:b9:6a:83:da:b2:6f:c0:f6:
+                    1e:f3
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                90:53:F5:80:11:F6:3F:1B:A8:9D:8D:75:0D:56:3B:F2:2B:C5:9C:44
+                E3:D1:05:98:4C:68:53:C2:DC:00:EE:AC:E5:A8:B8:FC:B9:72:D9:67
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         43:35:08:cc:aa:f8:10:9f:9e:fa:ab:24:dc:c6:e6:9a:23:52:
-         c9:4c:81:33:ba:64:b2:86:a8:29:f4:1f:5a:fa:5a:c4:91:56:
-         16:d1:f9:84:96:89:8c:ac:1f:b6:ea:2f:cb:12:f4:92:ed:3b:
-         85:09:eb:f3:7a:2e:09:39:ec:ee:09:4b:fa:86:3e:62:40:0e:
-         57:72:07:de:fa:53:45:ac:40:1c:0d:0b:4a:67:9a:f7:39:ce:
-         33:5e:d0:17:0b:8a:83:ae:33:6f:96:c0:f0:7a:ac:07:36:c5:
-         86:a9:db:93:aa:2e:fa:71:d1:1a:dd:82:2a:f8:1c:30:2a:b9:
-         7d:29:fa:75:62:76:7c:15:15:75:af:78:6c:7c:53:ae:2e:80:
-         14:0d:0b:eb:0f:b1:6d:fa:df:72:0b:6f:f0:90:96:18:71:df:
-         76:1d:8c:f1:d5:c0:4f:ab:38:1a:eb:e6:a1:dd:1d:dc:60:d4:
-         da:7f:40:db:17:fc:4a:56:65:3a:86:60:83:87:b3:f6:3b:a8:
-         85:ac:2b:14:c2:26:77:8f:ee:a4:6f:11:f2:27:08:3f:bf:86:
-         4a:e3:bd:ef:6b:51:ec:72:a7:51:08:47:16:f8:d3:d7:b1:8d:
-         a1:b1:ca:d3:cd:fd:56:0a:2c:2f:62:27:8c:e1:ff:88:83:ff:
-         83:ab:87:70
+         0d:37:a8:9e:12:c9:fb:45:a2:b9:82:07:4a:2a:34:d2:3b:1d:
+         84:70:b1:4a:85:37:7e:64:31:45:c3:02:9d:32:4e:92:a4:97:
+         72:ed:1d:f2:c3:26:c8:3f:90:e4:24:f4:6e:4b:33:71:98:bc:
+         68:25:26:cc:de:c1:46:a6:a8:83:60:fc:6e:c0:72:98:8f:ce:
+         38:6e:69:9d:ab:d1:5a:f0:a6:c8:07:a1:09:b3:8c:03:09:7b:
+         44:62:73:15:85:71:5f:2c:0a:33:78:f2:a3:10:85:1e:6b:46:
+         d1:a5:f1:9c:13:ba:f7:95:41:a0:fb:de:c9:09:e1:72:a4:92:
+         ff:33:e4:81:25:10:af:90:17:79:df:54:ea:b9:87:0e:f8:6d:
+         09:55:10:46:4c:87:36:37:2f:c0:86:03:ee:7a:b4:d3:27:22:
+         22:d5:9c:2e:e6:38:f0:f4:84:5c:ca:b7:9b:4d:6a:1c:57:7e:
+         24:07:35:13:a0:f9:d6:a3:aa:29:cb:e0:8a:b0:86:1c:41:24:
+         b1:ed:04:30:71:2b:99:d7:0a:a4:51:53:b1:76:2e:be:63:5b:
+         7c:8e:d5:8f:fa:f3:99:58:7d:ce:30:07:5d:1e:ed:e6:bc:0a:
+         d1:a7:cc:17:94:e7:d1:67:07:7c:37:6d:3f:c2:8b:04:9e:77:
+         fb:5b:9c:2d
 -----BEGIN CERTIFICATE-----
 MIIC+zCCAeOgAwIBAgICEAEwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRSBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDUwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMBwxGjAYBgNVBAMMEUMgQ0EgLSBNdWx0aS1yb290MIIBIjANBgkqhkiG9w0B
-AQEFAAOCAQ8AMIIBCgKCAQEAth9n5J7b4P/rKXXuaKJOlW7S9p3JttwIGHC1dr+3
-FIvLRsZqLPpD+VST+r2q8O6jIFsqzQj3vpU25Ij4/UN9uPk4tNJOIguLhd5q/m/a
-O0sPJsH4MSI2GZYM74V8cmesTFz5I6Qp2KUctuyV69PCjcuumtcIyLf3oMYoRF8k
-l73K2W2ZmxdHHziz42dqtHXWks1nYiBY8KdGhZRydpjF7Ex1G6F2Z0sfyCNsKnhm
-wqdrr++XMDRgCtuYlDuflTw0tjVAEvodv2b0e/1mGipJjCRgkQj5YTn5OymYZHs1
-BKn1r40PHucotjAytF/UKRZ6cI3bubq/6yKYXZTIR+NLEQIDAQABo0IwQDAPBgNV
-HRMBAf8EBTADAQH/MB0GA1UdDgQWBBSQU/WAEfY/G6idjXUNVjvyK8WcRDAOBgNV
-HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAEM1CMyq+BCfnvqrJNzG5poj
-UslMgTO6ZLKGqCn0H1r6WsSRVhbR+YSWiYysH7bqL8sS9JLtO4UJ6/N6Lgk57O4J
-S/qGPmJADldyB976U0WsQBwNC0pnmvc5zjNe0BcLioOuM2+WwPB6rAc2xYap25Oq
-Lvpx0Rrdgir4HDAquX0p+nVidnwVFXWveGx8U64ugBQNC+sPsW3633ILb/CQlhhx
-33YdjPHVwE+rOBrr5qHdHdxg1Np/QNsX/EpWZTqGYIOHs/Y7qIWsKxTCJneP7qRv
-EfInCD+/hkrjve9rUexyp1EIRxb409exjaGxytPN/VYKLC9iJ4zh/4iD/4Orh3A=
+AQEFAAOCAQ8AMIIBCgKCAQEAssQW3AeI7H6msyXIe5zgBx5AqUDATchzJ+qI2Fga
+GhLjmmJBTKHpsc7GsvY69ok/QOYP+xVLy9KNjrZEqmP6O8XMr4YFcKrs9LN5BOY+
+JezsKdbJi3sTBaf/UVurTLzQ5L1hGtIn8S5f9FGBxCO6IMMUCLS+eEm1Ex9p/fan
+WZGEqZkQyJxjnpnC8j1hnWpu1CabiKraZrMNxpkDFhM6pJr/CD5Z36dEtxeZP2N/
+OgV+zmR4NOYAd2nmAySnEvPoqFArVRb6bmXGKFiCpCB+aCLpgZ6i6A/Wh8Jz3cIM
+zKNHVBH1PdxRUleyzneLeqyn8ComNuYmuWqD2rJvwPYe8wIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBTj0QWYTGhTwtwA7qzlqLj8uXLZZzAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAA03qJ4SyftFormCB0oqNNI7
+HYRwsUqFN35kMUXDAp0yTpKkl3LtHfLDJsg/kOQk9G5LM3GYvGglJszewUamqINg
+/G7AcpiPzjhuaZ2r0VrwpsgHoQmzjAMJe0RicxWFcV8sCjN48qMQhR5rRtGl8ZwT
+uveVQaD73skJ4XKkkv8z5IElEK+QF3nfVOq5hw74bQlVEEZMhzY3L8CGA+56tNMn
+IiLVnC7mOPD0hFzKt5tNahxXfiQHNROg+dajqinL4IqwhhxBJLHtBDBxK5nXCqRR
+U7F2Lr5jW3yO1Y/685lYfc4wB10e7ea8CtGnzBeU59FnB3w3bT/CiwSed/tbnC0=
 -----END CERTIFICATE-----
 Certificate:
     Data:
@@ -240,64 +242,64 @@
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:b5:60:cb:b4:84:ab:6c:ba:59:52:a9:4c:6a:85:
-                    41:f2:41:17:49:40:3f:3e:e8:70:5c:05:df:dd:64:
-                    9e:fc:be:fb:38:ef:5d:67:ab:0e:de:9c:ea:ad:91:
-                    e1:f4:db:8b:f4:c0:e6:d0:ad:e2:83:15:01:aa:49:
-                    42:97:ae:72:7b:78:e3:20:4e:7e:29:ee:b5:35:6b:
-                    c4:af:d4:54:b0:86:2f:a9:09:a7:3b:8c:05:9e:fd:
-                    b4:b8:1f:3a:aa:d5:b5:d2:91:0f:50:e9:d2:1e:62:
-                    1c:c1:30:07:41:aa:bd:c2:11:3f:cc:c8:0f:a9:7e:
-                    81:69:52:96:86:2a:07:63:7b:f0:23:9e:db:27:88:
-                    8c:dc:aa:8c:66:dd:35:3a:08:60:37:36:41:34:f5:
-                    48:69:23:1a:5b:18:a7:ec:df:68:0a:3c:19:fb:92:
-                    b7:fa:53:9b:f3:70:b6:0d:4c:cb:2f:b7:0e:7e:5f:
-                    94:8c:a3:71:66:09:be:0d:af:db:52:f6:82:3f:88:
-                    64:72:cc:19:79:f4:7b:4d:6e:50:dc:93:88:d5:29:
-                    8a:e1:c8:1f:32:71:9f:d9:0e:14:31:f8:94:11:23:
-                    b1:bf:64:eb:27:3a:64:fb:77:ee:40:8c:a7:03:ed:
-                    1d:ec:8f:ee:25:58:f0:26:91:3c:f8:28:a1:7a:45:
-                    9f:13
+                    00:c0:14:71:12:fe:4f:36:78:5f:3a:b4:1e:d5:bb:
+                    22:92:3e:57:bf:4d:e0:cf:1e:a1:fb:19:6d:88:3a:
+                    59:93:79:57:42:bc:ab:7c:a0:0d:73:35:db:db:ba:
+                    80:ef:a9:80:5b:b0:90:f5:2f:ea:17:7d:2b:92:a4:
+                    5e:88:0a:16:f3:dc:f5:25:3d:7a:8d:8e:9b:e9:22:
+                    74:dc:49:6e:87:ff:67:ae:3a:b8:09:63:63:e7:c2:
+                    bd:77:d7:1b:cb:93:c6:4a:1d:7b:51:25:05:31:cb:
+                    32:66:43:ea:2d:54:59:59:cd:de:d2:84:6f:d8:5a:
+                    c1:5b:6c:2d:67:d5:57:23:25:a0:04:dc:45:64:02:
+                    f0:de:1a:4a:62:c9:76:b5:f6:36:46:74:af:1f:18:
+                    6c:f7:38:cf:34:e3:e1:3f:ad:51:41:cf:92:ed:d5:
+                    27:f7:4a:e3:3c:d5:42:26:51:e3:b2:69:20:b1:1f:
+                    0a:f6:fd:19:3c:8e:98:94:64:eb:fe:e6:67:a0:12:
+                    f6:78:98:0f:44:b8:24:60:7c:de:e2:67:b9:0d:6e:
+                    8c:06:80:43:8e:41:76:1d:09:40:0e:3b:e7:8d:0a:
+                    d9:66:d7:34:6c:ce:7e:f9:25:6a:15:cf:9a:3e:ec:
+                    30:e0:a3:b1:d2:a3:b1:31:f1:62:50:5c:b4:fe:dd:
+                    54:61
                 Exponent: 65537 (0x10001)
         X509v3 extensions:
             X509v3 Basic Constraints: critical
                 CA:TRUE
             X509v3 Subject Key Identifier: 
-                51:68:BC:D9:1B:1D:7F:8E:0D:4A:33:39:2D:A4:1F:14:29:92:70:8E
+                15:FA:C3:A2:2A:E0:2C:25:C5:BE:D7:BE:91:51:DD:45:F0:F1:5D:64
             X509v3 Key Usage: critical
                 Certificate Sign, CRL Sign
     Signature Algorithm: sha256WithRSAEncryption
-         2d:d4:56:d9:90:bb:62:64:66:78:6d:cd:73:26:cc:42:ce:37:
-         f4:bf:e8:8f:e7:1e:00:cb:c2:bd:54:33:0b:a8:e2:04:e1:5f:
-         59:2a:1a:41:70:0f:d6:32:5f:d0:14:86:fa:e2:a7:19:29:49:
-         77:56:b9:d7:e6:eb:39:61:e4:25:67:22:eb:f8:46:86:b7:6b:
-         7d:44:01:0b:18:cb:ba:e5:af:76:ab:c6:fe:43:6c:d8:f6:33:
-         f7:86:0b:22:da:27:78:91:07:55:3f:b2:c5:1e:10:88:09:b3:
-         cf:22:c6:7e:8f:c6:d0:c5:ec:67:90:72:8b:2b:c4:46:81:2c:
-         82:d1:5c:57:4e:d5:af:c4:d2:d8:b2:a7:91:1a:42:b3:57:bc:
-         4e:81:5e:cf:91:af:da:f1:53:29:de:31:6b:d3:69:a4:4d:a9:
-         14:15:96:51:7d:0d:bd:28:11:03:71:d2:85:11:92:1d:96:1a:
-         12:33:0c:4b:cf:c4:40:19:fb:eb:6a:fe:9b:e7:2d:cd:f7:75:
-         a3:66:4e:a6:7d:8e:8c:2e:5d:b8:2c:a8:5e:d7:42:1b:97:00:
-         ba:12:41:8c:9b:f1:ed:91:49:63:5a:11:0d:e4:7d:f0:dc:36:
-         23:0b:1b:e8:5f:be:1f:6d:a7:aa:bb:30:76:e2:36:b2:5a:68:
-         80:f5:75:7e
+         bb:14:68:d2:09:0e:65:58:4d:d7:35:a0:a3:9b:e6:b4:2a:b4:
+         80:32:3e:61:6d:87:19:a6:a8:d2:01:78:cd:07:0b:09:a9:de:
+         5f:aa:86:43:dd:6f:d6:e0:3b:ab:60:71:d2:f0:aa:8f:14:93:
+         42:37:12:55:02:e1:a7:ed:8e:db:c0:83:10:19:f0:f5:1e:35:
+         77:84:9a:c1:79:9c:60:39:6f:50:00:66:73:6e:f0:b8:f7:75:
+         67:3e:fa:3e:0c:d0:d6:54:4a:ae:da:38:06:92:57:39:cc:d9:
+         b1:fa:60:5e:99:07:e6:97:3b:69:4d:e3:02:50:8d:60:76:8e:
+         7e:e3:60:d4:65:41:9b:6c:b8:cc:b2:c4:7a:61:32:cb:67:49:
+         b4:76:25:0c:7e:20:85:24:74:0a:90:0a:ce:73:f9:8e:ba:ce:
+         de:6e:0a:cf:6d:1c:50:67:fa:a2:4e:32:d0:ad:91:35:5e:aa:
+         b3:75:7e:23:14:29:a8:66:2a:82:ed:6c:ed:a9:9d:f6:77:20:
+         3a:e1:0b:ab:1e:ee:1d:8a:20:ff:7f:4f:36:5a:0a:30:5a:c6:
+         9c:aa:53:eb:3f:04:28:8a:6d:70:97:2a:99:d6:0c:db:a5:22:
+         0b:e5:6b:24:cf:6e:2a:c7:4a:6b:cd:82:8e:13:84:18:b6:47:
+         1b:9d:8b:83
 -----BEGIN CERTIFICATE-----
 MIIDADCCAeigAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwITEfMB0GA1UEAwwWRSBS
 b290IENBIC0gTXVsdGktcm9vdDAeFw0xNjAxMDIwMDAwMDBaFw0yNjAxMDIwMDAw
 MDBaMCExHzAdBgNVBAMMFkUgUm9vdCBDQSAtIE11bHRpLXJvb3QwggEiMA0GCSqG
-SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC1YMu0hKtsullSqUxqhUHyQRdJQD8+6HBc
-Bd/dZJ78vvs4711nqw7enOqtkeH024v0wObQreKDFQGqSUKXrnJ7eOMgTn4p7rU1
-a8Sv1FSwhi+pCac7jAWe/bS4Hzqq1bXSkQ9Q6dIeYhzBMAdBqr3CET/MyA+pfoFp
-UpaGKgdje/AjntsniIzcqoxm3TU6CGA3NkE09UhpIxpbGKfs32gKPBn7krf6U5vz
-cLYNTMsvtw5+X5SMo3FmCb4Nr9tS9oI/iGRyzBl59HtNblDck4jVKYrhyB8ycZ/Z
-DhQx+JQRI7G/ZOsnOmT7d+5AjKcD7R3sj+4lWPAmkTz4KKF6RZ8TAgMBAAGjQjBA
-MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFFovNkbHX+ODUozOS2kHxQpknCO
-MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEALdRW2ZC7YmRmeG3N
-cybMQs439L/oj+ceAMvCvVQzC6jiBOFfWSoaQXAP1jJf0BSG+uKnGSlJd1a51+br
-OWHkJWci6/hGhrdrfUQBCxjLuuWvdqvG/kNs2PYz94YLItoneJEHVT+yxR4QiAmz
-zyLGfo/G0MXsZ5ByiyvERoEsgtFcV07Vr8TS2LKnkRpCs1e8ToFez5Gv2vFTKd4x
-a9NppE2pFBWWUX0NvSgRA3HShRGSHZYaEjMMS8/EQBn762r+m+ctzfd1o2ZOpn2O
-jC5duCyoXtdCG5cAuhJBjJvx7ZFJY1oRDeR98Nw2Iwsb6F++H22nqrswduI2slpo
-gPV1fg==
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDAFHES/k82eF86tB7VuyKSPle/TeDPHqH7
+GW2IOlmTeVdCvKt8oA1zNdvbuoDvqYBbsJD1L+oXfSuSpF6IChbz3PUlPXqNjpvp
+InTcSW6H/2euOrgJY2Pnwr131xvLk8ZKHXtRJQUxyzJmQ+otVFlZzd7ShG/YWsFb
+bC1n1VcjJaAE3EVkAvDeGkpiyXa19jZGdK8fGGz3OM804+E/rVFBz5Lt1Sf3SuM8
+1UImUeOyaSCxHwr2/Rk8jpiUZOv+5megEvZ4mA9EuCRgfN7iZ7kNbowGgEOOQXYd
+CUAOO+eNCtlm1zRszn75JWoVz5o+7DDgo7HSo7Ex8WJQXLT+3VRhAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFBX6w6Iq4Cwlxb7XvpFR3UXw8V1k
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAQEAuxRo0gkOZVhN1zWg
+o5vmtCq0gDI+YW2HGaao0gF4zQcLCaneX6qGQ91v1uA7q2Bx0vCqjxSTQjcSVQLh
+p+2O28CDEBnw9R41d4SawXmcYDlvUABmc27wuPd1Zz76PgzQ1lRKrto4BpJXOczZ
+sfpgXpkH5pc7aU3jAlCNYHaOfuNg1GVBm2y4zLLEemEyy2dJtHYlDH4ghSR0CpAK
+znP5jrrO3m4Kz20cUGf6ok4y0K2RNV6qs3V+IxQpqGYqgu1s7amd9ncgOuELqx7u
+HYog/39PNloKMFrGnKpT6z8EKIptcJcqmdYM26UiC+VrJM9uKsdKa82CjhOEGLZH
+G52Lgw==
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/certificates/multi-root-crlset-C.raw b/net/data/ssl/certificates/multi-root-crlset-C.raw
index 5beec4c..c8ff83b 100644
--- a/net/data/ssl/certificates/multi-root-crlset-C.raw
+++ b/net/data/ssl/certificates/multi-root-crlset-C.raw
Binary files differ
diff --git a/net/data/ssl/certificates/multi-root-crlset-CD-and-FE.raw b/net/data/ssl/certificates/multi-root-crlset-CD-and-FE.raw
index 178cf4dd..4b04356 100644
--- a/net/data/ssl/certificates/multi-root-crlset-CD-and-FE.raw
+++ b/net/data/ssl/certificates/multi-root-crlset-CD-and-FE.raw
Binary files differ
diff --git a/net/data/ssl/certificates/multi-root-crlset-D-and-E.raw b/net/data/ssl/certificates/multi-root-crlset-D-and-E.raw
index 89e7e20f..eacdb4aaf 100644
--- a/net/data/ssl/certificates/multi-root-crlset-D-and-E.raw
+++ b/net/data/ssl/certificates/multi-root-crlset-D-and-E.raw
Binary files differ
diff --git a/net/data/ssl/certificates/multi-root-crlset-E.raw b/net/data/ssl/certificates/multi-root-crlset-E.raw
index 46e4c36..02051b8f 100644
--- a/net/data/ssl/certificates/multi-root-crlset-E.raw
+++ b/net/data/ssl/certificates/multi-root-crlset-E.raw
Binary files differ
diff --git a/net/data/ssl/certificates/multi-root-crlset-unrelated.raw b/net/data/ssl/certificates/multi-root-crlset-unrelated.raw
index 98680b6..83fd62c 100644
--- a/net/data/ssl/certificates/multi-root-crlset-unrelated.raw
+++ b/net/data/ssl/certificates/multi-root-crlset-unrelated.raw
Binary files differ
diff --git a/net/data/ssl/certificates/multi-root.keychain b/net/data/ssl/certificates/multi-root.keychain
index b3aa2bb..40cbb7c5 100644
--- a/net/data/ssl/certificates/multi-root.keychain
+++ b/net/data/ssl/certificates/multi-root.keychain
Binary files differ
diff --git a/net/data/ssl/certificates/reject_intranet_hosts.pem b/net/data/ssl/certificates/reject_intranet_hosts.pem
index 82c767c..e2d43b7 100644
--- a/net/data/ssl/certificates/reject_intranet_hosts.pem
+++ b/net/data/ssl/certificates/reject_intranet_hosts.pem
@@ -1,66 +1,69 @@
 Certificate:
     Data:
-        Version: 1 (0x0)
-        Serial Number: 15826771597900763765 (0xdba3fcea1a1dd275)
+        Version: 3 (0x2)
+        Serial Number: 11446371030079207460 (0x9ed9adce6f317824)
     Signature Algorithm: sha256WithRSAEncryption
         Issuer: CN=webmail
         Validity
-            Not Before: Feb 28 19:43:04 2017 GMT
-            Not After : Feb 28 19:43:04 2020 GMT
+            Not Before: Mar  1 03:41:00 2017 GMT
+            Not After : Feb 29 03:41:00 2020 GMT
         Subject: CN=webmail
         Subject Public Key Info:
             Public Key Algorithm: rsaEncryption
                 Public-Key: (2048 bit)
                 Modulus:
-                    00:c0:ee:1b:56:47:23:82:d2:15:ca:ca:64:05:e3:
-                    ed:ab:0e:d5:b9:0c:ab:53:14:6b:8d:d4:d3:a9:79:
-                    64:b5:f2:16:34:a1:93:48:e0:a5:e7:ac:a9:80:b8:
-                    dc:f2:c1:25:b4:1b:7a:02:01:0d:58:a1:c7:5b:6a:
-                    e5:2a:92:b0:94:c0:62:53:15:fe:6b:f6:7f:73:c8:
-                    b0:2c:66:c2:69:3f:77:02:e6:6e:40:0b:2c:a1:bf:
-                    43:8c:65:cf:c5:8a:b8:38:e1:9b:f2:d4:3b:b2:58:
-                    ca:a2:a5:0d:e9:fe:02:06:13:a9:7a:4d:88:37:fb:
-                    d7:31:50:08:05:03:30:d7:eb:f8:18:50:e9:9a:d6:
-                    6d:97:6d:91:a0:16:51:86:ac:46:63:53:75:21:c3:
-                    64:b5:27:43:14:57:17:10:e1:69:92:9f:ec:83:d2:
-                    67:78:fb:1c:b4:41:34:5d:32:b6:43:f6:9c:40:8e:
-                    a5:00:e2:cc:9b:13:a8:76:30:73:59:18:ff:08:40:
-                    03:24:59:d2:1c:a8:e8:57:a6:63:cc:e1:9a:e5:22:
-                    36:b5:ff:30:a2:b9:b1:93:65:c4:13:f9:ee:98:1e:
-                    8a:3c:91:d6:6b:62:98:16:73:b5:63:8f:f4:ac:f5:
-                    b9:e0:4f:5a:c7:f3:68:2b:04:67:b2:2e:ad:40:6b:
-                    a5:c9
+                    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
                 Exponent: 65537 (0x10001)
+        X509v3 extensions:
+            X509v3 Subject Alternative Name: 
+                DNS:webmail
     Signature Algorithm: sha256WithRSAEncryption
-         3d:88:8e:44:4c:08:ed:d6:78:bd:2e:2a:d2:1e:40:31:12:0c:
-         ab:c4:7d:e8:d6:4d:a4:85:04:26:3c:af:a8:00:b1:ff:d0:89:
-         e8:85:21:c8:7a:5b:5e:ee:b4:0b:30:b9:7f:5c:bf:9a:91:0e:
-         1a:3b:5f:8d:93:86:d4:c2:d4:95:aa:c8:3f:b3:9f:4a:e9:87:
-         3d:17:0f:a8:a2:31:3a:b6:55:b5:ce:24:52:34:71:11:c8:0e:
-         50:b1:50:2e:9f:f8:63:ed:d8:a9:3b:00:15:fc:8a:57:ee:9f:
-         2a:ef:5b:4a:4c:e2:55:38:4b:2a:d3:b0:c5:08:85:96:c2:e0:
-         39:d8:04:17:35:b6:a9:56:55:a4:26:26:82:49:43:9b:8a:dd:
-         0f:c2:c0:8b:cb:4c:91:d9:85:5e:8b:88:95:d8:25:b6:9c:2b:
-         9d:1b:37:4c:59:c5:65:52:60:c4:5f:af:61:0b:1b:b9:14:22:
-         eb:a9:4d:cf:07:3c:89:ae:74:6d:95:e7:eb:02:65:f9:f3:ee:
-         ba:2d:10:6e:7d:22:f6:8a:1d:ce:fc:e3:7a:75:49:ea:37:d1:
-         ce:30:a3:4f:9b:17:9e:71:e4:e0:2e:32:18:0e:76:29:33:31:
-         a0:22:c1:ed:0b:c4:0d:b6:66:37:48:98:98:ca:85:17:24:3c:
-         db:fb:ef:0f
+         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
 -----BEGIN CERTIFICATE-----
-MIICoDCCAYgCCQDbo/zqGh3SdTANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAd3
-ZWJtYWlsMB4XDTE3MDIyODE5NDMwNFoXDTIwMDIyODE5NDMwNFowEjEQMA4GA1UE
-AwwHd2VibWFpbDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMDuG1ZH
-I4LSFcrKZAXj7asO1bkMq1MUa43U06l5ZLXyFjShk0jgpeesqYC43PLBJbQbegIB
-DVihx1tq5SqSsJTAYlMV/mv2f3PIsCxmwmk/dwLmbkALLKG/Q4xlz8WKuDjhm/LU
-O7JYyqKlDen+AgYTqXpNiDf71zFQCAUDMNfr+BhQ6ZrWbZdtkaAWUYasRmNTdSHD
-ZLUnQxRXFxDhaZKf7IPSZ3j7HLRBNF0ytkP2nECOpQDizJsTqHYwc1kY/whAAyRZ
-0hyo6FemY8zhmuUiNrX/MKK5sZNlxBP57pgeijyR1mtimBZztWOP9Kz1ueBPWsfz
-aCsEZ7IurUBrpckCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEAPYiOREwI7dZ4vS4q
-0h5AMRIMq8R96NZNpIUEJjyvqACx/9CJ6IUhyHpbXu60CzC5f1y/mpEOGjtfjZOG
-1MLUlarIP7OfSumHPRcPqKIxOrZVtc4kUjRxEcgOULFQLp/4Y+3YqTsAFfyKV+6f
-Ku9bSkziVThLKtOwxQiFlsLgOdgEFzW2qVZVpCYmgklDm4rdD8LAi8tMkdmFXouI
-ldgltpwrnRs3TFnFZVJgxF+vYQsbuRQi66lNzwc8ia50bZXn6wJl+fPuui0Qbn0i
-9oodzvzjenVJ6jfRzjCjT5sXnnHk4C4yGA52KTMxoCLB7QvEDbZmN0iYmMqFFyQ8
-2/vvDw==
+MIICvTCCAaWgAwIBAgIJAJ7Zrc5vMXgkMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV
+BAMMB3dlYm1haWwwHhcNMTcwMzAxMDM0MTAwWhcNMjAwMjI5MDM0MTAwWjASMRAw
+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
 -----END CERTIFICATE-----
diff --git a/net/data/ssl/scripts/aia-test.cnf b/net/data/ssl/scripts/aia-test.cnf
index 635b033..ea2b6629 100644
--- a/net/data/ssl/scripts/aia-test.cnf
+++ b/net/data/ssl/scripts/aia-test.cnf
@@ -1,6 +1,7 @@
 CA_DIR=out
 CA_NAME=aia-test-root
 AIA_URL=http://aia-test.invalid
+HOST_NAME=aia-host.invalid
 
 [ca]
 default_ca = CA_root
@@ -27,6 +28,7 @@
 basicConstraints       = critical, CA:false
 extendedKeyUsage       = serverAuth, clientAuth
 authorityInfoAccess    = caIssuers;URI:${ENV::AIA_URL}
+subjectAltName         = DNS:${ENV::HOST_NAME}
 
 [ca_cert]
 basicConstraints       = critical, CA:true
diff --git a/net/data/ssl/scripts/ee.cnf b/net/data/ssl/scripts/ee.cnf
index 87e4855..7d91d75c 100644
--- a/net/data/ssl/scripts/ee.cnf
+++ b/net/data/ssl/scripts/ee.cnf
@@ -55,6 +55,9 @@
 [req_extensions]
 subjectAltName = IP:127.0.0.1
 
+[req_intranet_san]
+subjectAltName = DNS:webmail
+
 [req_extensions_with_tls_feature]
 subjectAltName = IP:127.0.0.1
 1.3.6.1.5.5.7.1.24=DER:30:03:02:01:05
diff --git a/net/data/ssl/scripts/generate-aia-certs.sh b/net/data/ssl/scripts/generate-aia-certs.sh
index 706d386ee..5d5672b6 100755
--- a/net/data/ssl/scripts/generate-aia-certs.sh
+++ b/net/data/ssl/scripts/generate-aia-certs.sh
@@ -80,6 +80,7 @@
   -config aia-test.cnf
 
 CA_COMMON_NAME="AIA Test Intermediate CA" \
+  HOST_NAME="aia-host.invalid" \
   CA_DIR=out \
   CA_NAME=aia-test-intermediate \
   AIA_URL=http://aia-test.invalid \
diff --git a/net/data/ssl/scripts/generate-policy-certs.sh b/net/data/ssl/scripts/generate-policy-certs.sh
index bef21f4..cebef5e 100755
--- a/net/data/ssl/scripts/generate-policy-certs.sh
+++ b/net/data/ssl/scripts/generate-policy-certs.sh
@@ -82,6 +82,7 @@
   -config policy.cnf
 
 COMMON_NAME="Policy Test Intermediate CA" \
+  SAN="policy_test.example" \
   CA_DIR=out \
   CA_NAME=policy-intermediate \
   try openssl ca \
diff --git a/net/data/ssl/scripts/generate-test-certs.sh b/net/data/ssl/scripts/generate-test-certs.sh
index 9a1a912..f5395e4 100755
--- a/net/data/ssl/scripts/generate-test-certs.sh
+++ b/net/data/ssl/scripts/generate-test-certs.sh
@@ -210,7 +210,7 @@
 ## Reject intranet hostnames in "publicly" trusted certs
 # 365 * 3 = 1095
 SUBJECT_NAME="req_intranet_dn" \
-  try openssl req -x509 -days 1095 \
+  try openssl req -x509 -days 1095 -extensions req_intranet_san \
     -config ../scripts/ee.cnf -newkey rsa:2048 -text \
     -out ../certificates/reject_intranet_hosts.pem
 
diff --git a/net/data/ssl/scripts/policy.cnf b/net/data/ssl/scripts/policy.cnf
index 12af828..dbb2efa 100644
--- a/net/data/ssl/scripts/policy.cnf
+++ b/net/data/ssl/scripts/policy.cnf
@@ -1,5 +1,6 @@
 CA_DIR=out
 CA_NAME=policy-root
+SAN=policy_test.example
 
 [ca]
 default_ca = CA_root
@@ -26,6 +27,7 @@
 basicConstraints       = critical, CA:false
 extendedKeyUsage       = serverAuth, clientAuth
 certificatePolicies    = 1.2.3.4
+subjectAltName         = DNS:${ENV::SAN}
 
 [ca_cert]
 basicConstraints       = critical, CA:true
diff --git a/net/data/ssl/scripts/redundant-ca.cnf b/net/data/ssl/scripts/redundant-ca.cnf
index 46e395f..4ae60ad 100644
--- a/net/data/ssl/scripts/redundant-ca.cnf
+++ b/net/data/ssl/scripts/redundant-ca.cnf
@@ -25,6 +25,7 @@
 subjectKeyIdentifier   = hash
 authorityKeyIdentifier = keyid:always
 extendedKeyUsage       = serverAuth,clientAuth
+subjectAltName         = IP:127.0.0.1
 
 [ca_cert]
 # Extensions to add when signing a request for an intermediate/CA cert
diff --git a/net/nqe/event_creator.cc b/net/nqe/event_creator.cc
index 930e372..ab5000e3 100644
--- a/net/nqe/event_creator.cc
+++ b/net/nqe/event_creator.cc
@@ -4,6 +4,7 @@
 
 #include "net/nqe/event_creator.h"
 
+#include <stdlib.h>
 #include <memory>
 #include <utility>
 
@@ -21,7 +22,7 @@
 
 namespace {
 
-std::unique_ptr<base::Value> EffectiveConnectionTypeChangedNetLogCallback(
+std::unique_ptr<base::Value> NetworkQualityChangedNetLogCallback(
     base::TimeDelta http_rtt,
     base::TimeDelta transport_rtt,
     int32_t downstream_throughput_kbps,
@@ -36,6 +37,37 @@
   return std::move(dict);
 }
 
+bool MetricChangedMeaningfully(int32_t past_value, int32_t current_value) {
+  if ((past_value == INVALID_RTT_THROUGHPUT) !=
+      (current_value == INVALID_RTT_THROUGHPUT)) {
+    return true;
+  }
+
+  if (past_value == INVALID_RTT_THROUGHPUT &&
+      current_value == INVALID_RTT_THROUGHPUT) {
+    return false;
+  }
+
+  // Create a new entry only if (i) the difference between the two values exceed
+  // the threshold; and, (ii) the ratio of the values also exceeds the
+  // threshold.
+  static const int kMinDifferenceInMetrics = 100;
+  static const float kMinRatio = 1.2f;
+
+  if (std::abs(past_value - current_value) < kMinDifferenceInMetrics) {
+    // The absolute change in the value is not sufficient enough.
+    return false;
+  }
+
+  if (past_value < (kMinRatio * current_value) &&
+      current_value < (kMinRatio * past_value)) {
+    // The relative change in the value is not sufficient enough.
+    return false;
+  }
+
+  return true;
+}
+
 }  // namespace
 
 EventCreator::EventCreator(NetLogWithSource net_log)
@@ -46,7 +78,7 @@
   DCHECK(thread_checker_.CalledOnValidThread());
 }
 
-void EventCreator::MaybeAddEffectiveConnectionTypeChangedEventToNetLog(
+void EventCreator::MaybeAddNetworkQualityChangedEventToNetLog(
     EffectiveConnectionType effective_connection_type,
     const NetworkQuality& network_quality) {
   DCHECK(thread_checker_.CalledOnValidThread());
@@ -54,15 +86,16 @@
   // Check if any of the network quality metrics changed meaningfully.
   bool effective_connection_type_changed =
       past_effective_connection_type_ != effective_connection_type;
-  bool http_rtt_changed = (past_network_quality_.http_rtt() == InvalidRTT()) !=
-                          (network_quality.http_rtt() == InvalidRTT());
-  bool transport_rtt_changed =
-      (past_network_quality_.transport_rtt() == InvalidRTT()) !=
-      (network_quality.transport_rtt() == InvalidRTT());
-  bool kbps_changed =
-      (past_network_quality_.downstream_throughput_kbps() ==
-       INVALID_RTT_THROUGHPUT) !=
-      (network_quality.downstream_throughput_kbps() == INVALID_RTT_THROUGHPUT);
+  bool http_rtt_changed = MetricChangedMeaningfully(
+      past_network_quality_.http_rtt().InMilliseconds(),
+      network_quality.http_rtt().InMilliseconds());
+
+  bool transport_rtt_changed = MetricChangedMeaningfully(
+      past_network_quality_.transport_rtt().InMilliseconds(),
+      network_quality.transport_rtt().InMilliseconds());
+  bool kbps_changed = MetricChangedMeaningfully(
+      past_network_quality_.downstream_throughput_kbps(),
+      network_quality.downstream_throughput_kbps());
 
   if (!effective_connection_type_changed && !http_rtt_changed &&
       !transport_rtt_changed && !kbps_changed) {
@@ -75,7 +108,7 @@
 
   net_log_.AddEvent(
       NetLogEventType::NETWORK_QUALITY_CHANGED,
-      base::Bind(&EffectiveConnectionTypeChangedNetLogCallback,
+      base::Bind(&NetworkQualityChangedNetLogCallback,
                  network_quality.http_rtt(), network_quality.transport_rtt(),
                  network_quality.downstream_throughput_kbps(),
                  effective_connection_type));
diff --git a/net/nqe/event_creator.h b/net/nqe/event_creator.h
index 5000195..4cd87e6 100644
--- a/net/nqe/event_creator.h
+++ b/net/nqe/event_creator.h
@@ -30,11 +30,11 @@
   ~EventCreator();
 
   // May add network quality changed event to the net-internals log if there
-  // is a change in the effective connection type, or if there is a change in
-  // the availability of HTTP RTT, transport RTT or bandwidth.
+  // is a change in the effective connection type, or if there is a meaningful
+  // change in the values of HTTP RTT, transport RTT or bandwidth.
   // |effective_connection_type| is the current effective connection type.
   // |network_quality| is the current network quality.
-  void MaybeAddEffectiveConnectionTypeChangedEventToNetLog(
+  void MaybeAddNetworkQualityChangedEventToNetLog(
       EffectiveConnectionType effective_connection_type,
       const NetworkQuality& network_quality);
 
diff --git a/net/nqe/event_creator_unittest.cc b/net/nqe/event_creator_unittest.cc
new file mode 100644
index 0000000..bc9acfb0
--- /dev/null
+++ b/net/nqe/event_creator_unittest.cc
@@ -0,0 +1,127 @@
+// 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 "net/nqe/event_creator.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/time/time.h"
+#include "net/log/net_log_with_source.h"
+#include "net/log/test_net_log.h"
+#include "net/log/test_net_log_entry.h"
+#include "net/nqe/effective_connection_type.h"
+#include "net/nqe/network_quality.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace net {
+
+namespace nqe {
+
+namespace internal {
+
+namespace {
+
+// Returns the number of entries in |net_log| that have type set to
+// |NetLogEventType::NETWORK_QUALITY_CHANGED|.
+int GetNetworkQualityChangedEntriesCount(BoundTestNetLog* net_log) {
+  TestNetLogEntry::List entries;
+  net_log->GetEntries(&entries);
+
+  int count = 0;
+  for (const auto& entry : entries) {
+    if (entry.type == NetLogEventType::NETWORK_QUALITY_CHANGED)
+      ++count;
+  }
+  return count;
+}
+
+// Verify that the net log events are recorded correctly.
+TEST(NetworkQualityEstimatorEventCreatorTest, Notified) {
+  // std::unique_ptr<BoundTestNetLog>
+  // net_log(base::MakeUnique<BoundTestNetLog>());
+  BoundTestNetLog net_log;
+
+  EventCreator event_creator(net_log.bound());
+
+  NetworkQuality network_quality_100(base::TimeDelta::FromMilliseconds(100),
+                                     base::TimeDelta::FromMilliseconds(100),
+                                     100);
+
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_2G, network_quality_100);
+  EXPECT_EQ(1, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // No new entry should be created since the network quality has not changed.
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_2G, network_quality_100);
+  EXPECT_EQ(1, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should be created since effective connection type has changed.
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_100);
+  EXPECT_EQ(2, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should not be created since HTTP RTT has not changed
+  // meaningfully.
+  NetworkQuality network_quality_http_rtt_110(
+      base::TimeDelta::FromMilliseconds(110),
+      base::TimeDelta::FromMilliseconds(100), 100);
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_http_rtt_110);
+  EXPECT_EQ(2, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should be created since HTTP RTT has changed meaningfully.
+  NetworkQuality network_quality_http_rtt_300(
+      base::TimeDelta::FromMilliseconds(300),
+      base::TimeDelta::FromMilliseconds(100), 100);
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_http_rtt_300);
+  EXPECT_EQ(3, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should be created since transport RTT has changed meaningfully.
+  NetworkQuality network_quality_transport_rtt_300(
+      base::TimeDelta::FromMilliseconds(300),
+      base::TimeDelta::FromMilliseconds(300), 100);
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_transport_rtt_300);
+  EXPECT_EQ(4, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should be created since bandwidth has changed meaningfully.
+  NetworkQuality network_quality_kbps_300(
+      base::TimeDelta::FromMilliseconds(300),
+      base::TimeDelta::FromMilliseconds(300), 300);
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_300);
+  EXPECT_EQ(5, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should not be created since network quality has not changed
+  // meaningfully.
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_300);
+  EXPECT_EQ(5, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should be created since bandwidth has changed meaningfully.
+  NetworkQuality network_quality_kbps_2000(
+      base::TimeDelta::FromMilliseconds(300),
+      base::TimeDelta::FromMilliseconds(300), 2000);
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_2000);
+  EXPECT_EQ(6, GetNetworkQualityChangedEntriesCount(&net_log));
+
+  // A new entry should not be created since bandwidth has not changed by more
+  // than 20%.
+  NetworkQuality network_quality_kbps_2200(
+      base::TimeDelta::FromMilliseconds(300),
+      base::TimeDelta::FromMilliseconds(300), 2200);
+  event_creator.MaybeAddNetworkQualityChangedEventToNetLog(
+      EFFECTIVE_CONNECTION_TYPE_3G, network_quality_kbps_2200);
+  EXPECT_EQ(6, GetNetworkQualityChangedEntriesCount(&net_log));
+}
+
+}  // namespace
+
+}  // namespace internal
+
+}  // namespace nqe
+
+}  // namespace net
diff --git a/net/nqe/network_quality_estimator.cc b/net/nqe/network_quality_estimator.cc
index 9ca1e18..0d5fbe3 100644
--- a/net/nqe/network_quality_estimator.cc
+++ b/net/nqe/network_quality_estimator.cc
@@ -795,7 +795,7 @@
     EffectiveConnectionType effective_connection_type) {
   DCHECK(thread_checker_.CalledOnValidThread());
 
-  event_creator_.MaybeAddEffectiveConnectionTypeChangedEventToNetLog(
+  event_creator_.MaybeAddNetworkQualityChangedEventToNetLog(
       effective_connection_type_,
       typical_network_quality_[effective_connection_type]);
 
@@ -1105,7 +1105,7 @@
   if (past_type != effective_connection_type_)
     NotifyObserversOfEffectiveConnectionTypeChanged();
 
-  event_creator_.MaybeAddEffectiveConnectionTypeChangedEventToNetLog(
+  event_creator_.MaybeAddNetworkQualityChangedEventToNetLog(
       effective_connection_type_, network_quality_);
 
   rtt_observations_size_at_last_ect_computation_ = rtt_observations_.Size();
diff --git a/net/nqe/network_quality_estimator_unittest.cc b/net/nqe/network_quality_estimator_unittest.cc
index 4c68ae0..d5cc4f6 100644
--- a/net/nqe/network_quality_estimator_unittest.cc
+++ b/net/nqe/network_quality_estimator_unittest.cc
@@ -226,7 +226,7 @@
       estimator.GetRecentTransportRTT(base::TimeTicks(), &transport_rtt));
 
   // Verify the contents of the net log.
-  EXPECT_EQ(
+  EXPECT_LE(
       2, estimator.GetEntriesCount(NetLogEventType::NETWORK_QUALITY_CHANGED));
   EXPECT_EQ(http_rtt.InMilliseconds(),
             estimator.GetNetLogLastIntegerValue(
@@ -411,8 +411,10 @@
   // |observer| should be notified as soon as it is added.
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(1U, observer.effective_connection_types().size());
-  EXPECT_EQ(
-      2, estimator.GetEntriesCount(NetLogEventType::NETWORK_QUALITY_CHANGED));
+
+  int num_net_log_entries =
+      estimator.GetEntriesCount(NetLogEventType::NETWORK_QUALITY_CHANGED);
+  EXPECT_LE(2, num_net_log_entries);
 
   estimator.SimulateNetworkChange(
       NetworkChangeNotifier::ConnectionType::CONNECTION_2G, "test");
@@ -425,7 +427,8 @@
 
   // Verify the contents of the net log.
   EXPECT_LE(
-      3, estimator.GetEntriesCount(NetLogEventType::NETWORK_QUALITY_CHANGED));
+      1, estimator.GetEntriesCount(NetLogEventType::NETWORK_QUALITY_CHANGED) -
+             num_net_log_entries);
   EXPECT_NE(-1, estimator.GetNetLogLastIntegerValue(
                     NetLogEventType::NETWORK_QUALITY_CHANGED, "http_rtt_ms"));
   EXPECT_EQ(-1,
@@ -1741,7 +1744,7 @@
   request->Start();
   base::RunLoop().Run();
   EXPECT_EQ(1U, observer.effective_connection_types().size());
-  EXPECT_EQ(
+  EXPECT_LE(
       1, estimator.GetEntriesCount(NetLogEventType::NETWORK_QUALITY_CHANGED));
 
   // Verify the contents of the net log.
diff --git a/net/quic/chromium/quic_network_transaction_unittest.cc b/net/quic/chromium/quic_network_transaction_unittest.cc
index 611247e..ee3bad8 100644
--- a/net/quic/chromium/quic_network_transaction_unittest.cc
+++ b/net/quic/chromium/quic_network_transaction_unittest.cc
@@ -991,9 +991,8 @@
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
   ASSERT_TRUE(cert.get());
   // This certificate is valid for the proxy, but not for the origin.
-  bool common_name_fallback_used;
-  EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, &common_name_fallback_used));
-  EXPECT_FALSE(cert->VerifyNameMatch(origin_host, &common_name_fallback_used));
+  EXPECT_TRUE(cert->VerifyNameMatch(proxy_host, false));
+  EXPECT_FALSE(cert->VerifyNameMatch(origin_host, false));
   ProofVerifyDetailsChromium verify_details;
   verify_details.cert_verify_result.verified_cert = cert;
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
@@ -1018,10 +1017,9 @@
   ASSERT_TRUE(cert.get());
   // TODO(rch): the connection should be "to" the origin, so if the cert is
   // valid for the origin but not the alternative, that should work too.
-  bool common_name_fallback_used;
-  EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), &common_name_fallback_used));
+  EXPECT_TRUE(cert->VerifyNameMatch(origin.host(), false));
   EXPECT_TRUE(
-      cert->VerifyNameMatch(alternative.host(), &common_name_fallback_used));
+      cert->VerifyNameMatch(alternative.host(), false));
   ProofVerifyDetailsChromium verify_details;
   verify_details.cert_verify_result.verified_cert = cert;
   crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details);
@@ -3326,9 +3324,8 @@
 
   scoped_refptr<X509Certificate> cert(
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
-  bool unused;
-  ASSERT_FALSE(cert->VerifyNameMatch(origin1_, &unused));
-  ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
+  ASSERT_FALSE(cert->VerifyNameMatch(origin1_, false));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin2_, false));
 
   ProofVerifyDetailsChromium verify_details;
   verify_details.cert_verify_result.verified_cert = cert;
@@ -3366,10 +3363,9 @@
 
   scoped_refptr<X509Certificate> cert(
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
-  bool unused;
-  ASSERT_TRUE(cert->VerifyNameMatch(origin1_, &unused));
-  ASSERT_TRUE(cert->VerifyNameMatch(origin2_, &unused));
-  ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin1_, false));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin2_, false));
+  ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, false));
 
   ProofVerifyDetailsChromium verify_details;
   verify_details.cert_verify_result.verified_cert = cert;
@@ -3436,15 +3432,14 @@
 
   scoped_refptr<X509Certificate> cert1(
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
-  bool unused;
-  ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, &unused));
-  ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, &unused));
-  ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
+  ASSERT_TRUE(cert1->VerifyNameMatch(origin1_, false));
+  ASSERT_FALSE(cert1->VerifyNameMatch(origin2_, false));
+  ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, false));
 
   scoped_refptr<X509Certificate> cert2(
       ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
-  ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, &unused));
-  ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
+  ASSERT_TRUE(cert2->VerifyNameMatch(origin2_, false));
+  ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, false));
 
   ProofVerifyDetailsChromium verify_details1;
   verify_details1.cert_verify_result.verified_cert = cert1;
diff --git a/net/quic/chromium/quic_stream_factory_test.cc b/net/quic/chromium/quic_stream_factory_test.cc
index 19d40b5e..d6fd5ae 100644
--- a/net/quic/chromium/quic_stream_factory_test.cc
+++ b/net/quic/chromium/quic_stream_factory_test.cc
@@ -5391,9 +5391,8 @@
 
   scoped_refptr<X509Certificate> cert(
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
-  bool unused;
-  ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host(), &unused));
-  ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
+  ASSERT_FALSE(cert->VerifyNameMatch(origin1_.host(), false));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), false));
 
   ProofVerifyDetailsChromium verify_details;
   verify_details.cert_verify_result.verified_cert = cert;
@@ -5425,10 +5424,9 @@
 
   scoped_refptr<X509Certificate> cert(
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
-  bool unused;
-  ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), &unused));
-  ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
-  ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), false));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), false));
+  ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, false));
 
   ProofVerifyDetailsChromium verify_details;
   verify_details.cert_verify_result.verified_cert = cert;
@@ -5491,10 +5489,9 @@
 
   scoped_refptr<X509Certificate> cert(
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
-  bool unused;
-  ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), &unused));
-  ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), &unused));
-  ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, &unused));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin1_.host(), false));
+  ASSERT_TRUE(cert->VerifyNameMatch(origin2_.host(), false));
+  ASSERT_FALSE(cert->VerifyNameMatch(kDifferentHostname, false));
 
   ProofVerifyDetailsChromium verify_details1;
   verify_details1.cert_verify_result.verified_cert = cert;
@@ -5572,10 +5569,9 @@
 
   scoped_refptr<X509Certificate> cert1(
       ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem"));
-  bool unused;
-  ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host(), &unused));
-  ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host(), &unused));
-  ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, &unused));
+  ASSERT_TRUE(cert1->VerifyNameMatch(origin1_.host(), false));
+  ASSERT_FALSE(cert1->VerifyNameMatch(origin2_.host(), false));
+  ASSERT_FALSE(cert1->VerifyNameMatch(kDifferentHostname, false));
 
   ProofVerifyDetailsChromium verify_details1;
   verify_details1.cert_verify_result.verified_cert = cert1;
@@ -5584,8 +5580,8 @@
 
   scoped_refptr<X509Certificate> cert2(
       ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
-  ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host(), &unused));
-  ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, &unused));
+  ASSERT_TRUE(cert2->VerifyNameMatch(origin2_.host(), false));
+  ASSERT_FALSE(cert2->VerifyNameMatch(kDifferentHostname, false));
 
   ProofVerifyDetailsChromium verify_details2;
   verify_details2.cert_verify_result.verified_cert = cert2;
diff --git a/net/quic/test_tools/mock_crypto_client_stream.cc b/net/quic/test_tools/mock_crypto_client_stream.cc
index 25ba8684..0197307 100644
--- a/net/quic/test_tools/mock_crypto_client_stream.cc
+++ b/net/quic/test_tools/mock_crypto_client_stream.cc
@@ -44,9 +44,8 @@
 
 void MockCryptoClientStream::CryptoConnect() {
   if (proof_verify_details_) {
-    bool unused = false;
     if (!proof_verify_details_->cert_verify_result.verified_cert
-             ->VerifyNameMatch(server_id_.host(), &unused)) {
+             ->VerifyNameMatch(server_id_.host(), false)) {
       handshake_confirmed_ = false;
       encryption_established_ = false;
       session()->connection()->CloseConnection(
diff --git a/net/spdy/spdy_session.cc b/net/spdy/spdy_session.cc
index 0173abd..220a5001 100644
--- a/net/spdy/spdy_session.cc
+++ b/net/spdy/spdy_session.cc
@@ -695,8 +695,7 @@
     return false;
   }
 
-  bool unused = false;
-  if (!ssl_info.cert->VerifyNameMatch(new_hostname, &unused))
+  if (!ssl_info.cert->VerifyNameMatch(new_hostname, false))
     return false;
 
   std::string pinning_failure_log;
diff --git a/net/ssl/ssl_config.cc b/net/ssl/ssl_config.cc
index 62e192e1..726ce48 100644
--- a/net/ssl/ssl_config.cc
+++ b/net/ssl/ssl_config.cc
@@ -24,6 +24,7 @@
     : rev_checking_enabled(false),
       rev_checking_required_local_anchors(false),
       sha1_local_anchors_enabled(true),
+      common_name_fallback_local_anchors_enabled(true),
       version_min(kDefaultSSLVersionMin),
       version_max(kDefaultSSLVersionMax),
       deprecated_cipher_suites_enabled(false),
@@ -64,6 +65,8 @@
     flags |= CertVerifier::VERIFY_REV_CHECKING_REQUIRED_LOCAL_ANCHORS;
   if (sha1_local_anchors_enabled)
     flags |= CertVerifier::VERIFY_ENABLE_SHA1_LOCAL_ANCHORS;
+  if (common_name_fallback_local_anchors_enabled)
+    flags |= CertVerifier::VERIFY_ENABLE_COMMON_NAME_FALLBACK_LOCAL_ANCHORS;
   return flags;
 }
 
diff --git a/net/ssl/ssl_config.h b/net/ssl/ssl_config.h
index 1188a0d..7e6283d 100644
--- a/net/ssl/ssl_config.h
+++ b/net/ssl/ssl_config.h
@@ -78,6 +78,12 @@
   // local (non-public) trust anchor should be allowed.
   bool sha1_local_anchors_enabled;
 
+  // common_name_fallback_local_anchors_enabled is true if certificates which
+  // only have a commonName in the Subject (i.e. lacking a subjectAltName)
+  // should be checked if the name matches. Only those issued by a local
+  // (non-public) trust anchor will be allowed to match.
+  bool common_name_fallback_local_anchors_enabled;
+
   // The minimum and maximum protocol versions that are enabled.
   // (Use the SSL_PROTOCOL_VERSION_xxx enumerators defined above.)
   // SSL 2.0 and SSL 3.0 are not supported. If version_max < version_min, it
diff --git a/net/ssl/ssl_config_service.cc b/net/ssl/ssl_config_service.cc
index 2b4388ef..6afef76e 100644
--- a/net/ssl/ssl_config_service.cc
+++ b/net/ssl/ssl_config_service.cc
@@ -83,21 +83,23 @@
 SSLConfigService::~SSLConfigService() {
 }
 
-void SSLConfigService::ProcessConfigUpdate(const SSLConfig& orig_config,
+void SSLConfigService::ProcessConfigUpdate(const SSLConfig& old_config,
                                            const SSLConfig& new_config) {
   bool config_changed =
-      std::tie(orig_config.rev_checking_enabled,
-               orig_config.rev_checking_required_local_anchors,
-               orig_config.sha1_local_anchors_enabled, orig_config.version_min,
-               orig_config.version_max, orig_config.disabled_cipher_suites,
-               orig_config.channel_id_enabled, orig_config.false_start_enabled,
-               orig_config.require_ecdhe) !=
+      std::tie(old_config.rev_checking_enabled,
+               old_config.rev_checking_required_local_anchors,
+               old_config.sha1_local_anchors_enabled,
+               old_config.common_name_fallback_local_anchors_enabled,
+               old_config.version_min, old_config.version_max,
+               old_config.disabled_cipher_suites, old_config.channel_id_enabled,
+               old_config.false_start_enabled, old_config.require_ecdhe) !=
       std::tie(new_config.rev_checking_enabled,
                new_config.rev_checking_required_local_anchors,
-               new_config.sha1_local_anchors_enabled, new_config.version_min,
-               new_config.version_max, new_config.disabled_cipher_suites,
-               new_config.channel_id_enabled, new_config.false_start_enabled,
-               new_config.require_ecdhe);
+               new_config.sha1_local_anchors_enabled,
+               new_config.common_name_fallback_local_anchors_enabled,
+               new_config.version_min, new_config.version_max,
+               new_config.disabled_cipher_suites, new_config.channel_id_enabled,
+               new_config.false_start_enabled, new_config.require_ecdhe);
 
   if (config_changed)
     NotifySSLConfigChange();
diff --git a/net/ssl/ssl_config_service_unittest.cc b/net/ssl/ssl_config_service_unittest.cc
index 72041ff..a4d4f9f6a 100644
--- a/net/ssl/ssl_config_service_unittest.cc
+++ b/net/ssl/ssl_config_service_unittest.cc
@@ -67,6 +67,7 @@
   initial_config.rev_checking_enabled = true;
   initial_config.rev_checking_required_local_anchors = false;
   initial_config.sha1_local_anchors_enabled = true;
+  initial_config.common_name_fallback_local_anchors_enabled = true;
   initial_config.false_start_enabled = false;
   initial_config.require_ecdhe = false;
   initial_config.version_min = SSL_PROTOCOL_VERSION_TLS1;
@@ -90,6 +91,10 @@
   EXPECT_CALL(observer, OnSSLConfigChanged()).Times(1);
   mock_service->SetSSLConfig(initial_config);
 
+  initial_config.common_name_fallback_local_anchors_enabled = false;
+  EXPECT_CALL(observer, OnSSLConfigChanged()).Times(1);
+  mock_service->SetSSLConfig(initial_config);
+
   initial_config.false_start_enabled = true;
   EXPECT_CALL(observer, OnSSLConfigChanged()).Times(1);
   mock_service->SetSSLConfig(initial_config);
diff --git a/net/tools/testserver/minica.py b/net/tools/testserver/minica.py
index 3395daf9..62991ffb 100644
--- a/net/tools/testserver/minica.py
+++ b/net/tools/testserver/minica.py
@@ -216,11 +216,12 @@
 ORGANIZATION = asn1.OID([2, 5, 4, 10])
 PUBLIC_KEY_RSA = asn1.OID([1, 2, 840, 113549, 1, 1, 1])
 SHA256_WITH_RSA_ENCRYPTION = asn1.OID([1, 2, 840, 113549, 1, 1, 11])
-
+SUBJECT_ALTERNATIVE_NAME = asn1.OID([2, 5, 29, 17])
 
 def MakeCertificate(
     issuer_cn, subject_cn, serial, pubkey, privkey, ocsp_url = None,
-    ca_issuers_url = None, is_ca=False, path_len=None):
+    ca_issuers_url = None, is_ca=False, path_len=None, ip_sans=None,
+    dns_sans=None):
   '''MakeCertificate returns a DER encoded certificate, signed by privkey.'''
   extensions = asn1.SEQUENCE([])
 
@@ -242,6 +243,24 @@
         ))),
       ]))
 
+  if ip_sans is not None or dns_sans is not None:
+    sans = []
+    if dns_sans is not None:
+      for dns_name in dns_sans:
+        sans.append(
+          asn1.Raw(asn1.TagAndLength(0x82, len(dns_name)) + dns_name))
+    if ip_sans is not None:
+      for ip_addr in ip_sans:
+        sans.append(
+          asn1.Raw(asn1.TagAndLength(0x87, len(ip_addr)) + ip_addr))
+    extensions.children.append(
+      asn1.SEQUENCE([
+        SUBJECT_ALTERNATIVE_NAME,
+        # There is implicitly a critical=False here. Since false is the
+        # default, encoding the value would be invalid DER.
+        asn1.OCTETSTRING(asn1.ToDER(asn1.SEQUENCE(sans)))
+      ]))
+
   if ocsp_url is not None or ca_issuers_url is not None:
     aia_entries = []
     if ocsp_url is not None:
@@ -426,6 +445,8 @@
                            ocsp_states = None,
                            ocsp_dates = None,
                            ocsp_produced = OCSP_PRODUCED_VALID,
+                           ip_sans = ["\x7F\x00\x00\x01"],
+                           dns_sans = None,
                            serial = 0):
   '''GenerateCertKeyAndOCSP returns a (cert_and_key_pem, ocsp_der) where:
        * cert_and_key_pem contains a certificate and private key in PEM format
@@ -441,7 +462,8 @@
   if serial == 0:
     serial = RandomNumber(16)
   cert_der = MakeCertificate(ROOT_CN, bytes(subject), serial, LEAF_KEY,
-                             ROOT_KEY, bytes(ocsp_url))
+                             ROOT_KEY, bytes(ocsp_url), ip_sans=ip_sans,
+                             dns_sans=dns_sans)
   cert_pem = DERToPEM(cert_der)
 
   ocsp_der = None
diff --git a/remoting/protocol/connection_unittest.cc b/remoting/protocol/connection_unittest.cc
index 1794f2fd..c3527831 100644
--- a/remoting/protocol/connection_unittest.cc
+++ b/remoting/protocol/connection_unittest.cc
@@ -635,6 +635,8 @@
   client_audio_player_.Verify();
 }
 
+#if !defined(MEMORY_SANITIZER)
+// Test fails under msan, https://crbug.com/697178
 TEST_P(ConnectionTest, FirstCaptureFailed) {
   Connect();
 
@@ -667,6 +669,7 @@
     EXPECT_EQ(event_timestamp, stats.host_stats.latest_event_timestamp);
   }
 }
+#endif
 
 TEST_P(ConnectionTest, SecondCaptureFailed) {
   Connect();
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/flexitem-expected.txt b/third_party/WebKit/LayoutTests/css3/flexbox/flexitem-expected.txt
deleted file mode 100644
index 3d3db47..0000000
--- a/third_party/WebKit/LayoutTests/css3/flexbox/flexitem-expected.txt
+++ /dev/null
@@ -1,26 +0,0 @@
-This is a testharness.js-based test.
-PASS .flexbox 1 
-PASS .flexbox 2 
-PASS .flexbox 3 
-PASS .flexbox 4 
-PASS .flexbox 5 
-PASS .flexbox 6 
-PASS .flexbox 7 
-PASS .flexbox 8 
-PASS .flexbox 9 
-PASS .flexbox 10 
-PASS .flexbox 11 
-FAIL .flexbox 12 assert_equals: 
-<div class="flexbox">
-  <!-- FIXME: This table should flex. -->
-  <div data-expected-display="table" data-expected-width="600" style="display: inline-table"></div>
-</div>
-width expected 600 but got 0
-PASS .flexbox 13 
-PASS .flexbox 14 
-PASS .flexbox 15 
-PASS .flexbox 16 
-PASS .flexbox 17 
-PASS .flexbox 18 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/dom/self-origin.sub-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/html/dom/self-origin.sub-expected.txt
deleted file mode 100644
index 27256cf..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/html/dom/self-origin.sub-expected.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-This is a testharness.js-based test.
-PASS Assigning blob url 
-PASS Should have the right origin for cross-origin subframe 
-PASS Should have the right origin for cross-origin subframe after setting document.domain 
-PASS Should have the right origin for IDN subframe 
-PASS Should have the right origin for IDN subframe after setting document.domain 
-PASS Should have the right origin for sandboxed iframe 
-FAIL We should have the right origin for our page assert_equals: expected (string) "http://web-platform.test:8001" but got (undefined) undefined
-FAIL about:blank subframe origins assert_equals: Should have the right origin for about:blank iframe expected (string) "http://web-platform.test:8001" but got (undefined) undefined
-FAIL blob: subframe origins assert_equals: Should have the right origin for blob: iframe expected (string) "http://web-platform.test:8001" but got (undefined) undefined
-FAIL javascript: subframe origins assert_equals: Should have the right origin for javascript: iframe expected (string) "http://web-platform.test:8001" but got (undefined) undefined
-FAIL srcdoc subframe origins assert_equals: Should have the right origin for srcdoc iframe expected (string) "http://web-platform.test:8001" but got (undefined) undefined
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html
new file mode 100644
index 0000000..22b28b3e3
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/Worker_Self_Origin.html
@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<meta charset=utf-8>
+<title>Test workers self.origin</title>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<div id="log"></div>
+<script>
+function assertOriginWorker(workerSource, expectedOrigin, testName) {
+  async_test(function(t) {
+    w = new Worker(workerSource);
+    w.onmessage = t.step_func(function(e) {
+      assert_equals(e.data, expectedOrigin);
+      t.done();
+    });
+  }, testName + ' Worker');
+}
+
+function assertOriginSharedWorker(workerSource, expectedOrigin, testName) {
+  async_test(function(t) {
+    w = new SharedWorker(workerSource);
+    w.port.start();
+    w.port.onmessage = t.step_func(function(e) {
+      assert_equals(e.data, expectedOrigin);
+      t.done();
+    });
+  }, testName + ' SharedWorker');
+}
+
+// Test same-origin workers
+assertOriginWorker("./support/WorkerSelfOriginWorker.js", self.origin, "Same Origin");
+assertOriginSharedWorker("./support/WorkerSelfOriginSharedWorker.js", self.origin, "Same Origin");
+
+// Test data url workers have opaque origin
+assertOriginWorker("data:application/javascript,postMessage(self.origin);", "null", "Data Url");
+assertOriginSharedWorker("data:application/javascript,onconnect = function(e) { e.ports[0].postMessage(self.origin); }", "null", "Data Url");
+
+// Test blob url workers
+blob = new Blob(["postMessage(self.origin);"]);
+blobUrl = URL.createObjectURL(blob);
+assertOriginWorker(blobUrl, self.origin, "Blob Url");
+
+blob = new Blob(["onconnect = function(e) { e.ports[0].postMessage(self.origin); }"]);
+blobUrl = URL.createObjectURL(blob);
+assertOriginSharedWorker(blobUrl, self.origin, "Blob Url");
+</script>
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/support/WorkerSelfOriginSharedWorker.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/support/WorkerSelfOriginSharedWorker.js
new file mode 100644
index 0000000..3acc5710
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/support/WorkerSelfOriginSharedWorker.js
@@ -0,0 +1,5 @@
+// Post back the location of the worker
+
+onconnect = function(e) {
+  e.ports[0].postMessage(self.origin);
+}
diff --git a/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/support/WorkerSelfOriginWorker.js b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/support/WorkerSelfOriginWorker.js
new file mode 100644
index 0000000..1a69b55
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/external/wpt/html/webappapis/the-windoworworkerglobalscope-mixin/support/WorkerSelfOriginWorker.js
@@ -0,0 +1,4 @@
+// Post back the location of the worker
+
+postMessage(self.origin);
+
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index 0daa4a8..dba5987e 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is navigated. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index 03fb6d55..01269ba 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index d7a8ab8..cf6c1de 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index da7a2c8..a72f27b 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests property access on a cached DOMWindow after the associated frame is navigated. Test should not crash and properties read from the cached DOMWindow should be identical to properties through the 'current' DOMWindow.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -166,6 +166,7 @@
 PASS oldChildWindow.onwebkittransitionend is newChildWindow.onwebkittransitionend
 PASS oldChildWindow.onwheel is newChildWindow.onwheel
 PASS oldChildWindow.opener is newChildWindow.opener
+PASS oldChildWindow.origin is newChildWindow.origin
 PASS oldChildWindow.outerHeight is newChildWindow.outerHeight
 PASS oldChildWindow.outerWidth is newChildWindow.outerWidth
 PASS oldChildWindow.pageXOffset is newChildWindow.pageXOffset
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
index cdb184ea..02dd68e4 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-and-gced-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests property access on a cached DOMWindow after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -138,6 +138,7 @@
 PASS childWindow.onwebkittransitionend is null
 PASS childWindow.onwheel is null
 PASS childWindow.opener is null
+PASS childWindow.origin is 'file://'
 PASS childWindow.outerHeight is 0
 PASS childWindow.outerWidth is 0
 PASS childWindow.pageXOffset is 0
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
index 18f6536..95b48e5a 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/property-access-on-cached-window-after-frame-removed-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests property access on a cached DOMWindow after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -138,6 +138,7 @@
 PASS childWindow.onwebkittransitionend is null
 PASS childWindow.onwheel is null
 PASS childWindow.opener is null
+PASS childWindow.origin is 'file://'
 PASS childWindow.outerHeight is 0
 PASS childWindow.outerWidth is 0
 PASS childWindow.pageXOffset is 0
diff --git a/third_party/WebKit/LayoutTests/fast/dom/Window/resources/window-property-collector.js b/third_party/WebKit/LayoutTests/fast/dom/Window/resources/window-property-collector.js
index bf28968..fd228a0 100644
--- a/third_party/WebKit/LayoutTests/fast/dom/Window/resources/window-property-collector.js
+++ b/third_party/WebKit/LayoutTests/fast/dom/Window/resources/window-property-collector.js
@@ -54,6 +54,9 @@
     case "location.origin":
         expected = "'null'";
         break;
+    case "origin":
+        expected = "'file://'";
+        break;
     case "location.pathname":
         expected = "'blank'";
         break;
diff --git a/third_party/WebKit/LayoutTests/fast/table/table-size-must-consider-stretch-alignment.html b/third_party/WebKit/LayoutTests/fast/table/table-size-must-consider-stretch-alignment.html
new file mode 100644
index 0000000..58b3e3a
--- /dev/null
+++ b/third_party/WebKit/LayoutTests/fast/table/table-size-must-consider-stretch-alignment.html
@@ -0,0 +1,142 @@
+<!DOCTYPE HTML>
+<script src="../../resources/testharness.js"></script>
+<script src="../../resources/testharnessreport.js"></script>
+<script src="../../resources/check-layout-th.js"></script>
+<style>
+.block {
+  width: 200px;
+  height: 200px;
+  background: lightgrey;
+}
+
+.flex { display: flex; }
+.grid {
+   display: grid;
+   grid: 100px / 150px;
+}
+
+.itemsStart {
+   align-items: start;
+   justify-items: start;
+}
+.itemsFlexStart {
+   align-items: flex-start;
+   justify-items: flex-start;
+}
+
+.item {
+  display: table;
+  background: lime;
+  border-spacing: 0px;
+  font: 10px/1 Ahem;
+}
+
+td { padding: 0px; }
+caption { background: grey; }
+
+</style>
+
+<p>This test verifies that table sizing logic considers stretch alignment when computing its width and height.</p>
+
+<p>Regular block container of a table element and 1 implicit row and column.<br>The align-self property doesn't apply to block-level boxes.</br>The justify-self property has its initial/default value 'normal', which behaves like 'start'.</p>
+<div class="block">
+    <div class="item" data-expected-width="100" data-expected-height="10">table cell</div>
+</div>
+
+<br><br>
+
+<p>Regular block container of an empty table.<br>The align-self property doesn't apply to block-level boxes.</br>The justify-self property has its initial/default value 'normal', which behaves like 'start'.</p>
+<div class="block">
+    <table class="item" data-expected-width="70" data-expected-height="10">
+        <caption>caption</caption>
+    </table>
+</div>
+
+<br><br>
+
+<p>Regular block container of a table element and 1 explicit row and column.<br>The align-self property doesn't apply to block-level boxes.</br>The justify-self property has its initial/default value 'normal', which behaves like 'start'.</p>
+<div class="block">
+    <table class="item" data-expected-width="100" data-expected-height="20">
+        <tr data-expected-width="100" data-expected-height="10">
+            <td>table cell</td>
+        </tr>
+        <caption>caption</caption>
+    </table>
+</div>
+
+<br><br>
+
+<p>Grid container of table element and 1 implicit row and column.<br>Both the align-self and justify-self properties have their initial/default value 'normal', which behaves like 'stretch'.</p>
+<div class="block grid">
+    <div class="item" data-expected-width="150" data-expected-height="100">table cell</div>
+</div>
+
+<br><br>
+
+<p>Grid container of an empty table element.<br>Both the align-self and justify-self properties have their initial/default value 'normal', which behaves like 'stretch'.</p>
+<div class="block grid">
+    <table class="item" data-expected-width="150" data-expected-height="110">
+        <caption>caption</caption>
+    </table>
+</div>
+
+<br><br>
+
+<p>Grid container of an empty table element.<br>Both the align-self and justify-self properties have a value 'start', which should prevent the item to be stretched.</p>
+<div class="block grid itemsStart">
+    <table class="item" data-expected-width="70" data-expected-height="10">
+        <caption>caption</caption>
+    </table>
+</div>
+
+<br><br>
+
+<p>Grid container of table element and 1 explicit row and column.<br>Both the align-self and justify-self properties have their initial/default value 'normal', which behaves like 'stretch'.</p>
+<div class="block grid">
+    <table class="item" data-expected-width="150" data-expected-height="110">
+        <tr data-expected-width="150" data-expected-height="100">
+            <td>table cell</td>
+        </tr>
+        <caption>caption</caption>
+    </table>
+</div>
+
+<br><br>
+
+<p>Flex container of table element and 1 implicit row and column.<br>Both the align-self and justify-self properties have their initial/default value 'normal', which behaves like 'stretch'.</p>
+<div class="block flex">
+    <div class="item" class="item" data-expected-width="200" data-expected-height="200">table cell</div>
+</div>
+
+<br><br>
+
+<p>Flex container of an empty table element.<br>Both the align-self and justify-self properties have their initial/default value 'normal', which behaves like 'stretch'.</p>
+<div class="block flex">
+    <table class="item" data-expected-width="200" data-expected-height="210">
+        <caption>caption</caption>
+    </table>
+</div>
+
+<br><br>
+
+<p>Flex container of an empty table element.<br>Both the align-self and justify-self properties have a value 'start', which should prevent the item to be stretched.</p>
+<div class="block flex itemsFlexStart">
+    <table class="item" data-expected-width="70" data-expected-height="10">
+        <caption>caption</caption>
+    </table>
+</div>
+
+<br><br>
+
+<p>Flex container of table element and 1 explicit row and column.<br>Both the align-self and justify-self properties have their initial/default value 'normal', which behaves like 'stretch'.</p>
+<div class="block flex">
+    <table class="item" class="item" data-expected-width="200" data-expected-height="210">
+        <tr data-expected-width="200" data-expected-height="200">
+            <td>table cell</td>
+        </tr>
+        <caption>caption</caption>
+    </table>
+</div>
+<script>
+    checkLayout('.block');
+</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 4553b0d..a8a5d7b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -2179,6 +2179,7 @@
     getter onerror
     getter onrejectionhandled
     getter onunhandledrejection
+    getter origin
     getter performance
     getter self
     method atob
@@ -2194,6 +2195,7 @@
     setter onerror
     setter onrejectionhandled
     setter onunhandledrejection
+    setter origin
 interface WorkerLocation
     getter hash
     getter host
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength-expected.txt b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength-expected.txt
index 8718944..2bc1d3c 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength-expected.txt
@@ -6,7 +6,7 @@
 PASS onerror() was called
 PASS timedOut is false
 PASS connected is false
-PASS origin is undefined.
+PASS wsOrigin is undefined.
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength.html b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength.html
index 42bd8cf..34406e9 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength.html
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-maxlength.html
@@ -13,12 +13,12 @@
 
 var timedOut = false;
 var connected = false;
-var origin;
+var wsOrigin;
 
 function endTest() {
     shouldBeFalse('timedOut');
     shouldBeFalse('connected');
-    shouldBeUndefined('origin');
+    shouldBeUndefined('wsOrigin');
     clearTimeout(timeoutID);
     finishJSTest();
 }
@@ -34,8 +34,8 @@
 
 ws.onmessage = function(messageEvent)
 {
-    origin = messageEvent.data;
-    debug('origin = ' + origin);
+    wsOrigin = messageEvent.data;
+    debug('origin = ' + wsOrigin);
     ws.close();
 }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null-expected.txt b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null-expected.txt
index 0035b19..9a45109 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null-expected.txt
@@ -6,7 +6,7 @@
 PASS onerror() was called
 PASS timedOut is false
 PASS connected is false
-PASS origin is undefined.
+PASS wsOrigin is undefined.
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null.html b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null.html
index 11423ffb..04cf68a8 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null.html
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/handshake-fail-by-prepended-null.html
@@ -13,12 +13,12 @@
 
 var timedOut = false;
 var connected = false;
-var origin;
+var wsOrigin;
 
 function endTest() {
     shouldBeFalse('timedOut');
     shouldBeFalse('connected');
-    shouldBeUndefined('origin');
+    shouldBeUndefined('wsOrigin');
     clearTimeout(timeoutID);
     finishJSTest();
 }
@@ -34,8 +34,8 @@
 
 ws.onmessage = function(messageEvent)
 {
-    origin = messageEvent.data;
-    debug('origin = ' + origin);
+    wsOrigin = messageEvent.data;
+    debug('origin = ' + wsOrigin);
     ws.close();
 }
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox-expected.txt b/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox-expected.txt
index 721bad5..6a5e047 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox-expected.txt
@@ -3,7 +3,7 @@
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS origin is "null"
+PASS wsOrigin is "null"
 PASS successfullyParsed is true
 
 TEST COMPLETE
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox.html b/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox.html
index 76657dd..003768b 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox.html
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/iframe-sandbox.html
@@ -7,12 +7,12 @@
 
 window.addEventListener("message", receiveMessage, false);
 
-var origin;
+var wsOrigin;
 
 function receiveMessage(event)
 {
-    origin = event.data;
-    shouldBeEqualToString("origin", "null");
+    wsOrigin = event.data;
+    shouldBeEqualToString("wsOrigin", "null");
     finishJSTest();
 }
 </script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin-expected.txt b/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin-expected.txt
index 2201655..a337073 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin-expected.txt
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin-expected.txt
@@ -5,9 +5,9 @@
 
 Connected.
 PASS data is firstMessageToSend
-PASS origin is "ws://localhost:8880"
+PASS wsOrigin is "ws://localhost:8880"
 PASS data is secondMessageToSend
-PASS origin is "ws://localhost:8880"
+PASS wsOrigin is "ws://localhost:8880"
 Closed.
 PASS successfullyParsed is true
 
diff --git a/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin.html b/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin.html
index 7633d2f..96bdfd7 100644
--- a/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin.html
+++ b/third_party/WebKit/LayoutTests/http/tests/websocket/send-onmessage-origin.html
@@ -21,7 +21,7 @@
 var secondMessageToSend = "This is the second.";
 // needs to be global to be accessbile from shouldBe().
 var data = "";
-var origin = "";
+var wsOrigin = "";
 
 ws.onopen = function()
 {
@@ -34,14 +34,14 @@
     // The server should echo back the first message.
     data = messageEvent.data;
     shouldBe("data", "firstMessageToSend");
-    origin = messageEvent.origin;
-    shouldBeEqualToString("origin", "ws://localhost:8880");
+    wsOrigin = messageEvent.origin;
+    shouldBeEqualToString("wsOrigin", "ws://localhost:8880");
     ws.onmessage = function(messageEvent) {
         // The server should echo back the second message.
         data = messageEvent.data;
         shouldBe("data", "secondMessageToSend");
-        origin = messageEvent.origin;
-        shouldBeEqualToString("origin", "ws://localhost:8880");
+        wsOrigin = messageEvent.origin;
+        shouldBeEqualToString("wsOrigin", "ws://localhost:8880");
     };
     ws.send(secondMessageToSend);
 };
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
index 0daa4a8..dba5987e 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-navigated-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is navigated. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
index 03fb6d55..01269ba 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-and-gced-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is removed from a web page and garbage collected. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
index d7a8ab8..cf6c1de 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-properties-after-frame-removed-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests access of cached DOMWindow properties after the associated frame is no longer in a web page. Test should not crash and properties should be set to sane defaults.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
index da7a2c8..a72f27b 100644
--- a/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/linux/fast/dom/Window/property-access-on-cached-window-after-frame-navigated-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: line 101: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
+CONSOLE WARNING: line 104: 'window.webkitStorageInfo' is deprecated. Please use 'navigator.webkitTemporaryStorage' or 'navigator.webkitPersistentStorage' instead.
 Tests property access on a cached DOMWindow after the associated frame is navigated. Test should not crash and properties read from the cached DOMWindow should be identical to properties through the 'current' DOMWindow.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
@@ -166,6 +166,7 @@
 PASS oldChildWindow.onwebkittransitionend is newChildWindow.onwebkittransitionend
 PASS oldChildWindow.onwheel is newChildWindow.onwheel
 PASS oldChildWindow.opener is newChildWindow.opener
+PASS oldChildWindow.origin is newChildWindow.origin
 PASS oldChildWindow.outerHeight is newChildWindow.outerHeight
 PASS oldChildWindow.outerWidth is newChildWindow.outerWidth
 PASS oldChildWindow.pageXOffset is newChildWindow.pageXOffset
diff --git a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
index 4b46d00c..a75dd6e 100644
--- a/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/mac/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -7599,6 +7599,7 @@
     getter onwebkitanimationstart
     getter onwebkittransitionend
     getter onwheel
+    getter origin
     getter outerHeight
     getter outerWidth
     getter pageXOffset
@@ -7774,6 +7775,7 @@
     setter onwebkitanimationstart
     setter onwebkittransitionend
     setter onwheel
+    setter origin
     setter outerHeight
     setter outerWidth
     setter pageXOffset
diff --git a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
index e431e54..0053cec5 100644
--- a/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/platform/win/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -7527,6 +7527,7 @@
     getter onwebkitanimationstart
     getter onwebkittransitionend
     getter onwheel
+    getter origin
     getter outerHeight
     getter outerWidth
     getter pageXOffset
@@ -7702,6 +7703,7 @@
     setter onwebkitanimationstart
     setter onwebkittransitionend
     setter onwheel
+    setter origin
     setter outerHeight
     setter outerWidth
     setter pageXOffset
diff --git a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 1db384c..ef85d30 100644
--- a/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/service-worker-navigation-preload/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -2187,6 +2187,7 @@
     getter onerror
     getter onrejectionhandled
     getter onunhandledrejection
+    getter origin
     getter performance
     getter self
     method atob
@@ -2202,6 +2203,7 @@
     setter onerror
     setter onrejectionhandled
     setter onunhandledrejection
+    setter origin
 interface WorkerLocation
     getter hash
     getter host
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
index 04d3d68..041a2cfe 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -644,6 +644,7 @@
     getter onerror
     getter onrejectionhandled
     getter onunhandledrejection
+    getter origin
     getter performance
     getter self
     method atob
@@ -659,6 +660,7 @@
     setter onerror
     setter onrejectionhandled
     setter onunhandledrejection
+    setter origin
 interface WorkerLocation
     getter hash
     getter host
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
index e65ab97..dbbc460 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -646,6 +646,7 @@
 [Worker]     getter onerror
 [Worker]     getter onrejectionhandled
 [Worker]     getter onunhandledrejection
+[Worker]     getter origin
 [Worker]     getter performance
 [Worker]     getter self
 [Worker]     method atob
@@ -661,6 +662,7 @@
 [Worker]     setter onerror
 [Worker]     setter onrejectionhandled
 [Worker]     setter onunhandledrejection
+[Worker]     setter origin
 [Worker] interface WorkerLocation
 [Worker]     attribute @@toStringTag
 [Worker]     getter hash
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
index 0928ce5..73ba7bf 100644
--- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -646,6 +646,7 @@
 [Worker]     getter onerror
 [Worker]     getter onrejectionhandled
 [Worker]     getter onunhandledrejection
+[Worker]     getter origin
 [Worker]     getter performance
 [Worker]     getter self
 [Worker]     method atob
@@ -661,6 +662,7 @@
 [Worker]     setter onerror
 [Worker]     setter onrejectionhandled
 [Worker]     setter onunhandledrejection
+[Worker]     setter origin
 [Worker] interface WorkerLocation
 [Worker]     attribute @@toStringTag
 [Worker]     getter hash
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
index 76c8ece..9660576c 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -2192,6 +2192,7 @@
 [Worker]     getter onerror
 [Worker]     getter onrejectionhandled
 [Worker]     getter onunhandledrejection
+[Worker]     getter origin
 [Worker]     getter performance
 [Worker]     getter self
 [Worker]     method atob
@@ -2207,6 +2208,7 @@
 [Worker]     setter onerror
 [Worker]     setter onrejectionhandled
 [Worker]     setter onunhandledrejection
+[Worker]     setter origin
 [Worker] interface WorkerLocation
 [Worker]     attribute @@toStringTag
 [Worker]     getter hash
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
index 2653d2b..31fb26a 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-expected.txt
@@ -8871,6 +8871,7 @@
     getter onwebkitanimationstart
     getter onwebkittransitionend
     getter onwheel
+    getter origin
     getter outerHeight
     getter outerWidth
     getter pageXOffset
@@ -9050,6 +9051,7 @@
     setter onwebkitanimationstart
     setter onwebkittransitionend
     setter onwheel
+    setter origin
     setter outerHeight
     setter outerWidth
     setter pageXOffset
diff --git a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
index 2b59c05..9d8c96f3 100644
--- a/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
+++ b/third_party/WebKit/LayoutTests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -2192,6 +2192,7 @@
 [Worker]     getter onerror
 [Worker]     getter onrejectionhandled
 [Worker]     getter onunhandledrejection
+[Worker]     getter origin
 [Worker]     getter performance
 [Worker]     getter self
 [Worker]     method atob
@@ -2207,6 +2208,7 @@
 [Worker]     setter onerror
 [Worker]     setter onrejectionhandled
 [Worker]     setter onunhandledrejection
+[Worker]     setter origin
 [Worker] interface WorkerLocation
 [Worker]     attribute @@toStringTag
 [Worker]     getter hash
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
index 78e95e3..5cf10db2 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.cpp
@@ -1119,6 +1119,10 @@
   page->chromeClient().setStatusbarText(m_defaultStatus);
 }
 
+String LocalDOMWindow::origin() const {
+  return getExecutionContext()->getSecurityOrigin()->toString();
+}
+
 Document* LocalDOMWindow::document() const {
   return m_document.get();
 }
diff --git a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
index 49e7718..d8bd0b0 100644
--- a/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
+++ b/third_party/WebKit/Source/core/frame/LocalDOMWindow.h
@@ -152,6 +152,7 @@
   void setStatus(const String&);
   String defaultStatus() const;
   void setDefaultStatus(const String&);
+  String origin() const;
 
   // DOM Level 2 AbstractView Interface
   Document* document() const;
diff --git a/third_party/WebKit/Source/core/frame/Window.idl b/third_party/WebKit/Source/core/frame/Window.idl
index 95949b9..c86c8b2 100644
--- a/third_party/WebKit/Source/core/frame/Window.idl
+++ b/third_party/WebKit/Source/core/frame/Window.idl
@@ -37,6 +37,7 @@
     [Unforgeable, CrossOrigin] readonly attribute Window window;
     [Replaceable, CrossOrigin] readonly attribute Window self;
     [Unforgeable, CachedAccessor] readonly attribute Document document;
+    [Replaceable] readonly attribute DOMString origin;
     attribute DOMString name;
     [PutForwards=href, Unforgeable, CrossOrigin=(Getter,Setter), Custom=Getter] readonly attribute Location location;
     readonly attribute History history;
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.h b/third_party/WebKit/Source/core/layout/LayoutBox.h
index 37084cfc..d80be21e 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.h
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.h
@@ -1387,8 +1387,7 @@
 
   virtual ItemPosition selfAlignmentNormalBehavior(
       const LayoutBox* child = nullptr) const {
-    DCHECK(!child);
-    return ItemPositionStretch;
+    return ItemPositionStart;
   }
 
   // Returns false if it could not cheaply compute the extent (e.g. fixed
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
index 38f2c5f0..76092ca4 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
+++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
@@ -91,6 +91,10 @@
 
   void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override;
   void removeChild(LayoutObject*) override;
+  ItemPosition selfAlignmentNormalBehavior(
+      const LayoutBox* child = nullptr) const override {
+    return ItemPositionStretch;
+  }
 
  private:
   enum FlexSign {
diff --git a/third_party/WebKit/Source/core/layout/LayoutFullScreen.h b/third_party/WebKit/Source/core/layout/LayoutFullScreen.h
index db7d3e6..00de48c5 100644
--- a/third_party/WebKit/Source/core/layout/LayoutFullScreen.h
+++ b/third_party/WebKit/Source/core/layout/LayoutFullScreen.h
@@ -69,7 +69,6 @@
   LayoutBlockFlow* m_placeholder;
   ItemPosition selfAlignmentNormalBehavior(
       const LayoutBox* child = nullptr) const override {
-    DCHECK(!child);
     return ItemPositionCenter;
   }
 };
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.cpp b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
index ea658b4..c2ce30f 100644
--- a/third_party/WebKit/Source/core/layout/LayoutTable.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
@@ -297,17 +297,21 @@
       availableContentLogicalWidth = shrinkLogicalWidthToAvoidFloats(
           marginStart, marginEnd, toLayoutBlockFlow(cb));
 
-    // Ensure we aren't bigger than our available width.
-    LayoutUnit maxWidth = maxPreferredLogicalWidth();
-    // scaledWidthFromPercentColumns depends on m_layoutStruct in
-    // TableLayoutAlgorithmAuto, which maxPreferredLogicalWidth fills in. So
-    // scaledWidthFromPercentColumns has to be called after
-    // maxPreferredLogicalWidth.
-    LayoutUnit scaledWidth = m_tableLayout->scaledWidthFromPercentColumns() +
-                             bordersPaddingAndSpacingInRowDirection();
-    maxWidth = std::max(scaledWidth, maxWidth);
-    setLogicalWidth(
-        LayoutUnit(std::min(availableContentLogicalWidth, maxWidth).floor()));
+    if (hasStretchedLogicalWidth()) {
+      setLogicalWidth(availableContentLogicalWidth);
+    } else {
+      // Ensure we aren't bigger than our available width.
+      LayoutUnit maxWidth = maxPreferredLogicalWidth();
+      // scaledWidthFromPercentColumns depends on m_layoutStruct in
+      // TableLayoutAlgorithmAuto, which maxPreferredLogicalWidth fills in. So
+      // scaledWidthFromPercentColumns has to be called after
+      // maxPreferredLogicalWidth.
+      LayoutUnit scaledWidth = m_tableLayout->scaledWidthFromPercentColumns() +
+                               bordersPaddingAndSpacingInRowDirection();
+      maxWidth = std::max(scaledWidth, maxWidth);
+      setLogicalWidth(
+          LayoutUnit(std::min(availableContentLogicalWidth, maxWidth).floor()));
+    }
   }
 
   // Ensure we aren't bigger than our max-width style.
@@ -465,11 +469,16 @@
 
 LayoutUnit LayoutTable::logicalHeightFromStyle() const {
   LayoutUnit computedLogicalHeight;
-  Length logicalHeightLength = style()->logicalHeight();
-  if (logicalHeightLength.isIntrinsic() ||
-      (logicalHeightLength.isSpecified() && logicalHeightLength.isPositive())) {
-    computedLogicalHeight =
-        convertStyleLogicalHeightToComputedHeight(logicalHeightLength);
+  if (hasOverrideLogicalContentHeight()) {
+    computedLogicalHeight = overrideLogicalContentHeight();
+  } else {
+    Length logicalHeightLength = style()->logicalHeight();
+    if (logicalHeightLength.isIntrinsic() ||
+        (logicalHeightLength.isSpecified() &&
+         logicalHeightLength.isPositive())) {
+      computedLogicalHeight =
+          convertStyleLogicalHeightToComputedHeight(logicalHeightLength);
+    }
   }
 
   Length logicalMaxHeightLength = style()->logicalMaxHeight();
diff --git a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
index 47a0ec80..de130946 100644
--- a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
+++ b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.cpp
@@ -163,6 +163,10 @@
   m_closing = true;
 }
 
+String WorkerGlobalScope::origin() const {
+  return getSecurityOrigin()->toString();
+}
+
 void WorkerGlobalScope::importScripts(const Vector<String>& urls,
                                       ExceptionState& exceptionState) {
   DCHECK(contentSecurityPolicy());
diff --git a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h
index d2dad858..7f869a2 100644
--- a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h
+++ b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.h
@@ -101,6 +101,8 @@
     return ExecutionContext::isSecureContext(StandardSecureContextCheck);
   }
 
+  String origin() const;
+
   DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
   DEFINE_ATTRIBUTE_EVENT_LISTENER(rejectionhandled);
   DEFINE_ATTRIBUTE_EVENT_LISTENER(unhandledrejection);
diff --git a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl
index 2c6f355..e6c5fc5 100644
--- a/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl
+++ b/third_party/WebKit/Source/core/workers/WorkerGlobalScope.idl
@@ -63,6 +63,9 @@
     // Secure Contexts
     // https://w3c.github.io/webappsec-secure-contexts/#dom-windoworworkerglobalscope-issecurecontext
     [ImplementedAs=isSecureContextForBindings] readonly attribute boolean isSecureContext;
+
+    // https://html.spec.whatwg.org/#windoworworkerglobalscope-mixin
+    [Replaceable] readonly attribute DOMString origin;
 };
 
 WorkerGlobalScope implements WindowBase64;
diff --git a/third_party/WebKit/Source/devtools/front_end/object_ui/JavaScriptAutocomplete.js b/third_party/WebKit/Source/devtools/front_end/object_ui/JavaScriptAutocomplete.js
index 9fa7447..78d6dcc 100644
--- a/third_party/WebKit/Source/devtools/front_end/object_ui/JavaScriptAutocomplete.js
+++ b/third_party/WebKit/Source/devtools/front_end/object_ui/JavaScriptAutocomplete.js
@@ -70,7 +70,7 @@
   var clippedExpression = ObjectUI.JavaScriptAutocomplete._clipExpression(text.substring(0, mapMatch.index));
   var fulfill;
   var promise = new Promise(x => fulfill = x);
-  executionContext.evaluate(clippedExpression || 'this', 'completion', true, true, false, false, false, evaluated);
+  executionContext.evaluate(clippedExpression, 'completion', true, true, false, false, false, evaluated);
   return promise;
 
   /**
@@ -190,7 +190,7 @@
   if (!expressionString && selectedFrame)
     variableNamesInScopes(selectedFrame, receivedPropertyNames);
   else
-    executionContext.evaluate(expressionString || 'this', 'completion', true, true, false, false, false, evaluated);
+    executionContext.evaluate(expressionString, 'completion', true, true, false, false, false, evaluated);
 
   return promise;
   /**
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js
index 85a4834..4edc2a2 100644
--- a/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js
+++ b/third_party/WebKit/Source/devtools/front_end/sdk/RuntimeModel.js
@@ -544,6 +544,11 @@
       generatePreview,
       userGesture,
       callback) {
+    if (!expression) {
+      // There is no expression, so the completion should happen against global properties.
+      expression = 'this';
+    }
+
     /**
      * @this {SDK.ExecutionContext}
      * @param {?Protocol.Error} error
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer.py
index d67aef8d..09302cb8 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer.py
@@ -48,9 +48,145 @@
         self._webkit_base = port.webkit_base()
         self._layout_tests_dir = port.layout_tests_dir()
 
-        # Only used by unittests.
+        # Only used by unit tests.
         self.new_results_by_directory = []
 
+    def optimize(self, baseline_name):
+        # The virtual fallback path is the same as the non-virtual one
+        # tacked on to the bottom of the non-virtual path. See
+        # https://docs.google.com/a/chromium.org/drawings/d/1eGdsIKzJ2dxDDBbUaIABrN4aMLD1bqJTfyxNGZsTdmg/edit
+        # for a visual representation of this.
+        # So, we can optimize the virtual path, then the virtual root, and then
+        # the regular path.
+
+        _log.debug("Optimizing regular fallback path.")
+        result = self._optimize_subtree(baseline_name)
+        non_virtual_baseline_name = self._virtual_base(baseline_name)
+        if not non_virtual_baseline_name:
+            return result
+
+        self._optimize_virtual_root(baseline_name, non_virtual_baseline_name)
+
+        _log.debug("Optimizing non-virtual fallback path.")
+        result |= self._optimize_subtree(non_virtual_baseline_name)
+        return result
+
+    def write_by_directory(self, results_by_directory, writer, indent):
+        for path in sorted(results_by_directory):
+            writer("%s%s: %s" % (indent, self._platform(path), results_by_directory[path][0:6]))
+
+    def read_results_by_directory(self, baseline_name):
+        results_by_directory = {}
+        directories = functools.reduce(set.union, map(set, [self._relative_baseline_search_paths(
+            port, baseline_name) for port in self._ports.values()]))
+
+        for directory in directories:
+            path = self._join_directory(directory, baseline_name)
+            if self._filesystem.exists(path):
+                results_by_directory[directory] = self._filesystem.sha1(path)
+        return results_by_directory
+
+    def _optimize_subtree(self, baseline_name):
+        basename = self._filesystem.basename(baseline_name)
+        results_by_directory, new_results_by_directory = self._find_optimal_result_placement(baseline_name)
+
+        if new_results_by_directory == results_by_directory:
+            if new_results_by_directory:
+                _log.debug("  %s: (already optimal)", basename)
+                self.write_by_directory(results_by_directory, _log.debug, "    ")
+            else:
+                _log.debug("  %s: (no baselines found)", basename)
+            # This is just used for unit tests.
+            # Intentionally set it to the old data if we don't modify anything.
+            self.new_results_by_directory.append(results_by_directory)
+            return True
+
+        if (self._results_by_port_name(results_by_directory, baseline_name) !=
+                self._results_by_port_name(new_results_by_directory, baseline_name)):
+            # This really should never happen. Just a sanity check to make
+            # sure the script fails in the case of bugs instead of committing
+            # incorrect baselines.
+            _log.error("  %s: optimization failed", basename)
+            self.write_by_directory(results_by_directory, _log.warning, "      ")
+            return False
+
+        _log.debug("  %s:", basename)
+        _log.debug("    Before: ")
+        self.write_by_directory(results_by_directory, _log.debug, "      ")
+        _log.debug("    After: ")
+        self.write_by_directory(new_results_by_directory, _log.debug, "      ")
+
+        self._move_baselines(baseline_name, results_by_directory, new_results_by_directory)
+        return True
+
+    def _move_baselines(self, baseline_name, results_by_directory, new_results_by_directory):
+        data_for_result = {}
+        for directory, result in results_by_directory.items():
+            if result not in data_for_result:
+                source = self._join_directory(directory, baseline_name)
+                data_for_result[result] = self._filesystem.read_binary_file(source)
+
+        fs_files = []
+        for directory, result in results_by_directory.items():
+            if new_results_by_directory.get(directory) != result:
+                file_name = self._join_directory(directory, baseline_name)
+                if self._filesystem.exists(file_name):
+                    fs_files.append(file_name)
+
+        if fs_files:
+            _log.debug("    Deleting (file system):")
+            for platform_dir in sorted(self._platform(filename) for filename in fs_files):
+                _log.debug("      " + platform_dir)
+            for filename in fs_files:
+                self._filesystem.remove(filename)
+        else:
+            _log.debug("    (Nothing to delete)")
+
+        file_names = []
+        for directory, result in new_results_by_directory.items():
+            if results_by_directory.get(directory) != result:
+                destination = self._join_directory(directory, baseline_name)
+                self._filesystem.maybe_make_directory(self._filesystem.split(destination)[0])
+                self._filesystem.write_binary_file(destination, data_for_result[result])
+                file_names.append(destination)
+
+        if file_names:
+            _log.debug("    Adding:")
+            for platform_dir in sorted(self._platform(filename) for filename in file_names):
+                _log.debug("      " + platform_dir)
+        else:
+            _log.debug("    (Nothing to add)")
+
+    def _platform(self, filename):
+        platform_dir = self.ROOT_LAYOUT_TESTS_DIRECTORY + self._filesystem.sep + 'platform' + self._filesystem.sep
+        if filename.startswith(platform_dir):
+            return filename.replace(platform_dir, '').split(self._filesystem.sep)[0]
+        platform_dir = self._filesystem.join(self._webkit_base, platform_dir)
+        if filename.startswith(platform_dir):
+            return filename.replace(platform_dir, '').split(self._filesystem.sep)[0]
+        return '(generic)'
+
+    def _optimize_virtual_root(self, baseline_name, non_virtual_baseline_name):
+        virtual_root_baseline_path = self._filesystem.join(self._layout_tests_dir, baseline_name)
+        if not self._filesystem.exists(virtual_root_baseline_path):
+            return
+        root_sha1 = self._filesystem.sha1(virtual_root_baseline_path)
+
+        results_by_directory = self.read_results_by_directory(non_virtual_baseline_name)
+        # See if all the immediate predecessors of the virtual root have the same expected result.
+        for port in self._ports.values():
+            directories = self._relative_baseline_search_paths(port, non_virtual_baseline_name)
+            for directory in directories:
+                if directory not in results_by_directory:
+                    continue
+                if results_by_directory[directory] != root_sha1:
+                    return
+                break
+
+        _log.debug("Deleting redundant virtual root expected result.")
+        _log.debug("    Deleting (file system): " + virtual_root_baseline_path)
+        self._filesystem.remove(virtual_root_baseline_path)
+
     def _baseline_root(self, baseline_name):
         virtual_suite = self._virtual_suite(baseline_name)
         if virtual_suite:
@@ -70,17 +206,21 @@
         return self._default_port.lookup_virtual_test_base(baseline_name)
 
     def _relative_baseline_search_paths(self, port, baseline_name):
+        """Returns a list of paths to check for baselines in order."""
         baseline_search_path = self._baseline_search_path(port, baseline_name)
         baseline_root = self._baseline_root(baseline_name)
         relative_paths = [self._filesystem.relpath(path, self._webkit_base) for path in baseline_search_path]
         return relative_paths + [baseline_root]
 
     def _join_directory(self, directory, baseline_name):
-        # This code is complicated because both the directory name and the baseline_name have the virtual
-        # test suite in the name and the virtual baseline name is not a strict superset of the non-virtual name.
-        # For example, virtual/gpu/fast/canvas/foo-expected.png corresponds to fast/canvas/foo-expected.png and
-        # the baseline directories are like platform/mac/virtual/gpu/fast/canvas. So, to get the path
-        # to the baseline in the platform directory, we need to append just foo-expected.png to the directory.
+        # This code is complicated because both the directory name and the
+        # baseline_name have the virtual test suite in the name and the virtual
+        # baseline name is not a strict superset of the non-virtual name.
+        # For example, virtual/gpu/fast/canvas/foo-expected.png corresponds to
+        # fast/canvas/foo-expected.png and the baseline directories are like
+        # platform/mac/virtual/gpu/fast/canvas. So, to get the path to the
+        # baseline in the platform directory, we need to append just
+        # foo-expected.png to the directory.
         virtual_suite = self._virtual_suite(baseline_name)
         if virtual_suite:
             baseline_name_without_virtual = baseline_name[len(virtual_suite.name) + 1:]
@@ -88,16 +228,6 @@
             baseline_name_without_virtual = baseline_name
         return self._filesystem.join(self._webkit_base, directory, baseline_name_without_virtual)
 
-    def read_results_by_directory(self, baseline_name):
-        results_by_directory = {}
-        directories = functools.reduce(set.union, map(set, [self._relative_baseline_search_paths(
-            port, baseline_name) for port in self._ports.values()]))
-
-        for directory in directories:
-            path = self._join_directory(directory, baseline_name)
-            if self._filesystem.exists(path):
-                results_by_directory[directory] = self._filesystem.sha1(path)
-        return results_by_directory
 
     def _results_by_port_name(self, results_by_directory, baseline_name):
         results_by_port_name = {}
@@ -194,124 +324,3 @@
                 return index, directory
         assert False, "result %s not found in fallback_path %s, %s" % (current_result, fallback_path, results_by_directory)
 
-    def _platform(self, filename):
-        platform_dir = self.ROOT_LAYOUT_TESTS_DIRECTORY + self._filesystem.sep + 'platform' + self._filesystem.sep
-        if filename.startswith(platform_dir):
-            return filename.replace(platform_dir, '').split(self._filesystem.sep)[0]
-        platform_dir = self._filesystem.join(self._webkit_base, platform_dir)
-        if filename.startswith(platform_dir):
-            return filename.replace(platform_dir, '').split(self._filesystem.sep)[0]
-        return '(generic)'
-
-    def _move_baselines(self, baseline_name, results_by_directory, new_results_by_directory):
-        data_for_result = {}
-        for directory, result in results_by_directory.items():
-            if result not in data_for_result:
-                source = self._join_directory(directory, baseline_name)
-                data_for_result[result] = self._filesystem.read_binary_file(source)
-
-        fs_files = []
-        for directory, result in results_by_directory.items():
-            if new_results_by_directory.get(directory) != result:
-                file_name = self._join_directory(directory, baseline_name)
-                if self._filesystem.exists(file_name):
-                    fs_files.append(file_name)
-
-        if fs_files:
-            _log.debug("    Deleting (file system):")
-            for platform_dir in sorted(self._platform(filename) for filename in fs_files):
-                _log.debug("      " + platform_dir)
-            for filename in fs_files:
-                self._filesystem.remove(filename)
-        else:
-            _log.debug("    (Nothing to delete)")
-
-        file_names = []
-        for directory, result in new_results_by_directory.items():
-            if results_by_directory.get(directory) != result:
-                destination = self._join_directory(directory, baseline_name)
-                self._filesystem.maybe_make_directory(self._filesystem.split(destination)[0])
-                self._filesystem.write_binary_file(destination, data_for_result[result])
-                file_names.append(destination)
-
-        if file_names:
-            _log.debug("    Adding:")
-            for platform_dir in sorted(self._platform(filename) for filename in file_names):
-                _log.debug("      " + platform_dir)
-        else:
-            _log.debug("    (Nothing to add)")
-
-    def write_by_directory(self, results_by_directory, writer, indent):
-        for path in sorted(results_by_directory):
-            writer("%s%s: %s" % (indent, self._platform(path), results_by_directory[path][0:6]))
-
-    def _optimize_subtree(self, baseline_name):
-        basename = self._filesystem.basename(baseline_name)
-        results_by_directory, new_results_by_directory = self._find_optimal_result_placement(baseline_name)
-
-        if new_results_by_directory == results_by_directory:
-            if new_results_by_directory:
-                _log.debug("  %s: (already optimal)", basename)
-                self.write_by_directory(results_by_directory, _log.debug, "    ")
-            else:
-                _log.debug("  %s: (no baselines found)", basename)
-            # This is just used for unittests. Intentionally set it to the old data if we don't modify anything.
-            self.new_results_by_directory.append(results_by_directory)
-            return True
-
-        if self._results_by_port_name(results_by_directory, baseline_name) != self._results_by_port_name(
-                new_results_by_directory, baseline_name):
-            # This really should never happen. Just a sanity check to make sure the script fails in the case of bugs
-            # instead of committing incorrect baselines.
-            _log.error("  %s: optimization failed", basename)
-            self.write_by_directory(results_by_directory, _log.warning, "      ")
-            return False
-
-        _log.debug("  %s:", basename)
-        _log.debug("    Before: ")
-        self.write_by_directory(results_by_directory, _log.debug, "      ")
-        _log.debug("    After: ")
-        self.write_by_directory(new_results_by_directory, _log.debug, "      ")
-
-        self._move_baselines(baseline_name, results_by_directory, new_results_by_directory)
-        return True
-
-    def _optimize_virtual_root(self, baseline_name, non_virtual_baseline_name):
-        virtual_root_baseline_path = self._filesystem.join(self._layout_tests_dir, baseline_name)
-        if not self._filesystem.exists(virtual_root_baseline_path):
-            return
-        root_sha1 = self._filesystem.sha1(virtual_root_baseline_path)
-
-        results_by_directory = self.read_results_by_directory(non_virtual_baseline_name)
-        # See if all the immediate predecessors of the virtual root have the same expected result.
-        for port in self._ports.values():
-            directories = self._relative_baseline_search_paths(port, non_virtual_baseline_name)
-            for directory in directories:
-                if directory not in results_by_directory:
-                    continue
-                if results_by_directory[directory] != root_sha1:
-                    return
-                break
-
-        _log.debug("Deleting redundant virtual root expected result.")
-        _log.debug("    Deleting (file system): " + virtual_root_baseline_path)
-        self._filesystem.remove(virtual_root_baseline_path)
-
-    def optimize(self, baseline_name):
-        # The virtual fallback path is the same as the non-virtual one tacked on to the bottom of the non-virtual path.
-        # See https://docs.google.com/a/chromium.org/drawings/d/1eGdsIKzJ2dxDDBbUaIABrN4aMLD1bqJTfyxNGZsTdmg/edit for
-        # a visual representation of this.
-        #
-        # So, we can optimize the virtual path, then the virtual root and then the regular path.
-
-        _log.debug("Optimizing regular fallback path.")
-        result = self._optimize_subtree(baseline_name)
-        non_virtual_baseline_name = self._virtual_base(baseline_name)
-        if not non_virtual_baseline_name:
-            return result
-
-        self._optimize_virtual_root(baseline_name, non_virtual_baseline_name)
-
-        _log.debug("Optimizing non-virtual fallback path.")
-        result |= self._optimize_subtree(non_virtual_baseline_name)
-        return result
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer_unittest.py
index 88711dc..7514e04 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/checkout/baseline_optimizer_unittest.py
@@ -35,75 +35,19 @@
 
 class BaselineOptimizerTest(unittest.TestCase):
 
-    # Protected method _move_baselines is tested below - pylint: disable=protected-access
-    def test_move_baselines(self):
-        host = MockHost()
-        host.filesystem.write_text_file('/mock-checkout/third_party/WebKit/LayoutTests/VirtualTestSuites', '[]')
-        host.filesystem.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/test-expected.txt', 'result A')
-        host.filesystem.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/test-expected.txt', 'result A')
-        host.filesystem.write_binary_file('/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt', 'result B')
-        baseline_optimizer = BaselineOptimizer(
-            host, host.port_factory.get(), host.port_factory.all_port_names())
-        baseline_optimizer._move_baselines(
-            'another/test-expected.txt',
-            {
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb',
-            },
-            {
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa',
-            })
-        self.assertEqual(host.filesystem.read_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt'), 'result A')
-
-    def test_move_baselines_skip_git_commands(self):
-        host = MockHost()
-        host.filesystem.write_text_file('/mock-checkout/third_party/WebKit/LayoutTests/VirtualTestSuites', '[]')
-        host.filesystem.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/test-expected.txt', 'result A')
-        host.filesystem.write_binary_file(
-            '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/test-expected.txt', 'result A')
-        host.filesystem.write_binary_file('/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt', 'result B')
-        baseline_optimizer = BaselineOptimizer(host, host.port_factory.get(
-        ), host.port_factory.all_port_names())
-        baseline_optimizer._move_baselines(
-            'another/test-expected.txt',
-            {
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'aaa',
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb',
-            },
-            {
-                '/mock-checkout/third_party/WebKit/LayoutTests/platform/linux': 'bbb',
-                '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa',
-            })
-        self.assertEqual(
-            host.filesystem.read_binary_file(
-                '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt'),
-            'result A')
-
-    def _assert_optimization(
-            self,
-            results_by_directory,
-            directory_to_new_results,
-            baseline_dirname='', host=None):
-        if not host:
-            host = MockHost()
+    def _assert_optimization(self, results_by_directory, directory_to_new_results, baseline_dirname='', host=None):
+        host = host or MockHost()
         fs = host.filesystem
         webkit_base = WebKitFinder(fs).webkit_base()
         baseline_name = 'mock-baseline-expected.txt'
-        fs.write_text_file(fs.join(webkit_base, 'LayoutTests', 'VirtualTestSuites'),
-                           '[{"prefix": "gpu", "base": "fast/canvas", "args": ["--foo"]}]')
+        fs.write_text_file(
+            fs.join(webkit_base, 'LayoutTests', 'VirtualTestSuites'),
+            '[{"prefix": "gpu", "base": "fast/canvas", "args": ["--foo"]}]')
 
         for dirname, contents in results_by_directory.items():
-            path = fs.join(webkit_base, 'LayoutTests', dirname, baseline_name)
-            fs.write_binary_file(path, contents)
+            fs.write_binary_file(fs.join(webkit_base, 'LayoutTests', dirname, baseline_name), contents)
 
-        baseline_optimizer = BaselineOptimizer(host, host.port_factory.get(
-        ), host.port_factory.all_port_names())
+        baseline_optimizer = BaselineOptimizer(host, host.port_factory.get(), host.port_factory.all_port_names())
         self.assertTrue(baseline_optimizer.optimize(fs.join(baseline_dirname, baseline_name)))
 
         for dirname, contents in directory_to_new_results.items():
@@ -254,3 +198,54 @@
                 'platform/mac/fast/canvas': '1',
             },
             baseline_dirname='virtual/gpu/fast/canvas')
+
+    # Tests for protected methods - pylint: disable=protected-access
+
+    def test_move_baselines(self):
+        host = MockHost()
+        host.filesystem.write_text_file('/mock-checkout/third_party/WebKit/LayoutTests/VirtualTestSuites', '[]')
+        host.filesystem.write_binary_file(
+            '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/test-expected.txt', 'result A')
+        host.filesystem.write_binary_file(
+            '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/test-expected.txt', 'result A')
+        host.filesystem.write_binary_file('/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt', 'result B')
+        baseline_optimizer = BaselineOptimizer(
+            host, host.port_factory.get(), host.port_factory.all_port_names())
+        baseline_optimizer._move_baselines(
+            'another/test-expected.txt',
+            {
+                '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'aaa',
+                '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'aaa',
+                '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb',
+            },
+            {
+                '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa',
+            })
+        self.assertEqual(host.filesystem.read_binary_file(
+            '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt'), 'result A')
+
+    def test_move_baselines_skip_git_commands(self):
+        host = MockHost()
+        host.filesystem.write_text_file('/mock-checkout/third_party/WebKit/LayoutTests/VirtualTestSuites', '[]')
+        host.filesystem.write_binary_file(
+            '/mock-checkout/third_party/WebKit/LayoutTests/platform/win/another/test-expected.txt', 'result A')
+        host.filesystem.write_binary_file(
+            '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac/another/test-expected.txt', 'result A')
+        host.filesystem.write_binary_file('/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt', 'result B')
+        baseline_optimizer = BaselineOptimizer(host, host.port_factory.get(
+        ), host.port_factory.all_port_names())
+        baseline_optimizer._move_baselines(
+            'another/test-expected.txt',
+            {
+                '/mock-checkout/third_party/WebKit/LayoutTests/platform/win': 'aaa',
+                '/mock-checkout/third_party/WebKit/LayoutTests/platform/mac': 'aaa',
+                '/mock-checkout/third_party/WebKit/LayoutTests': 'bbb',
+            },
+            {
+                '/mock-checkout/third_party/WebKit/LayoutTests/platform/linux': 'bbb',
+                '/mock-checkout/third_party/WebKit/LayoutTests': 'aaa',
+            })
+        self.assertEqual(
+            host.filesystem.read_binary_file(
+                '/mock-checkout/third_party/WebKit/LayoutTests/another/test-expected.txt'),
+            'result A')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
index 03246f1c..98c179c 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/base.py
@@ -191,9 +191,6 @@
         return "Port{name=%s, version=%s, architecture=%s, test_configuration=%s}" % (
             self._name, self._version, self._architecture, self._test_configuration)
 
-    def buildbot_archives_baselines(self):
-        return True
-
     def additional_driver_flag(self):
         if self.driver_name() == self.CONTENT_SHELL_NAME:
             return ['--run-layout-test']
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/test.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/test.py
index f54ce253..67baf10 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/test.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/test.py
@@ -427,9 +427,6 @@
             'linux': ['precise', 'trusty']
         }
 
-    def buildbot_archives_baselines(self):
-        return self._name != 'test-win-win7'
-
     def default_pixel_tests(self):
         return True
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
index e988bd8cd..0e0f965 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/commands/rebaseline.py
@@ -165,8 +165,6 @@
         immediate_predecessors = []
         for port_name in port_names:
             port = self._tool.port_factory.get(port_name)
-            if not port.buildbot_archives_baselines():
-                continue
             baseline_search_path = port.baseline_search_path()
             try:
                 index = baseline_search_path.index(path_to_rebaseline)
diff --git a/tools/gn/build_settings.cc b/tools/gn/build_settings.cc
index 3fac976..c60002d 100644
--- a/tools/gn/build_settings.cc
+++ b/tools/gn/build_settings.cc
@@ -18,9 +18,9 @@
       secondary_source_path_(other.secondary_source_path_),
       python_path_(other.python_path_),
       build_config_file_(other.build_config_file_),
+      arg_file_template_path_(other.arg_file_template_path_),
       build_dir_(other.build_dir_),
-      build_args_(other.build_args_) {
-}
+      build_args_(other.build_args_) {}
 
 BuildSettings::~BuildSettings() {
 }
diff --git a/tools/gn/build_settings.h b/tools/gn/build_settings.h
index 0b986cd..3f9f45b 100644
--- a/tools/gn/build_settings.h
+++ b/tools/gn/build_settings.h
@@ -52,6 +52,14 @@
   const SourceFile& build_config_file() const { return build_config_file_; }
   void set_build_config_file(const SourceFile& f) { build_config_file_ = f; }
 
+  // Path to a file containing the default text to use when running `gn args`.
+  const SourceFile& arg_file_template_path() const {
+    return arg_file_template_path_;
+  }
+  void set_arg_file_template_path(const SourceFile& f) {
+    arg_file_template_path_ = f;
+  }
+
   // The build directory is the root of all output files. The default toolchain
   // files go into here, and non-default toolchains will have separate
   // toolchain-specific root directories inside this.
@@ -102,6 +110,7 @@
   base::FilePath python_path_;
 
   SourceFile build_config_file_;
+  SourceFile arg_file_template_path_;
   SourceDir build_dir_;
   Args build_args_;
 
diff --git a/tools/gn/command_args.cc b/tools/gn/command_args.cc
index 98283f29..2772fc2 100644
--- a/tools/gn/command_args.cc
+++ b/tools/gn/command_args.cc
@@ -268,16 +268,32 @@
     // Ensure the file exists. Need to normalize path separators since on
     // Windows they can come out as forward slashes here, and that confuses some
     // of the commands.
+    BuildSettings build_settings = setup.build_settings();
     base::FilePath arg_file =
-        setup.build_settings().GetFullPath(setup.GetBuildArgFile())
-        .NormalizePathSeparators();
+        build_settings.GetFullPath(setup.GetBuildArgFile())
+            .NormalizePathSeparators();
     if (!base::PathExists(arg_file)) {
       std::string argfile_default_contents =
-          "# Build arguments go here. Examples:\n"
-          "#   is_component_build = true\n"
-          "#   is_debug = false\n"
+          "# Build arguments go here.\n"
           "# See \"gn args <out_dir> --list\" for available build "
           "arguments.\n";
+
+      SourceFile template_path = build_settings.arg_file_template_path();
+      if (!template_path.is_null()) {
+        base::FilePath full_path =
+            build_settings.GetFullPath(template_path).NormalizePathSeparators();
+        if (!base::PathExists(full_path)) {
+          Err err =
+              Err(Location(), std::string("Can't load arg_file_template:\n  ") +
+                                  template_path.value());
+          err.PrintToStdout();
+          return 1;
+        }
+
+        // Ignore the return code; if the read fails (unlikely), we'll just
+        // use the default contents.
+        base::ReadFileToString(full_path, &argfile_default_contents);
+      }
 #if defined(OS_WIN)
       // Use Windows lineendings for this file since it will often open in
       // Notepad which can't handle Unix ones.
diff --git a/tools/gn/docs/reference.md b/tools/gn/docs/reference.md
index 97a2c86..db5c341 100644
--- a/tools/gn/docs/reference.md
+++ b/tools/gn/docs/reference.md
@@ -3893,7 +3893,7 @@
 
   This should be set to the most specific value possible. So, "android" or
   "chromeos" should be used instead of "linux" where applicable, even though
-  Android and Chrome OS are both Linux variants. This can mean that one needs to
+  Android and ChromeOS are both Linux variants. This can mean that one needs to
   write
 
       if (target_os == "android" || target_os == "linux") {
@@ -5307,12 +5307,28 @@
   config applying to this target specifies this value. In addition, the tool
   corresponding to the source files must also specify precompiled headers (see
   "gn help tool"). The tool will also specify what type of precompiled headers
-  to use.
+  to use, by setting precompiled_header_type to either "gcc" or "msvc".
 
   The precompiled header/source variables can be specified on a target or a
   config, but must be the same for all configs applying to a given target since
   a target can only have one precompiled header.
 
+  If you use both C and C++ sources, the precompiled header and source file
+  will be compiled once per language. You will want to make sure to wrap C++
+  includes in __cplusplus #ifdefs so the file will compile in C mode.
+
+```
+
+### **GCC precompiled headers**
+
+```
+  When using GCC-style precompiled headers, "precompiled_source" contains the
+  path of a .h file that is precompiled and then included by all source files
+  in targets that set "precompiled_source".
+
+  The value of "precompiled_header" is not used with GCC-style precompiled
+  headers.
+
 ```
 
 ### **MSVC precompiled headers**
@@ -5320,8 +5336,8 @@
 ```
   When using MSVC-style precompiled headers, the "precompiled_header" value is
   a string corresponding to the header. This is NOT a path to a file that GN
-  recognises, but rather the exact string that appears in quotes after an
-  #include line in source code. The compiler will match this string against
+  recognises, but rather the exact string that appears in quotes after
+  an #include line in source code. The compiler will match this string against
   includes or forced includes (/FI).
 
   MSVC also requires a source file to compile the header with. This must be
@@ -5329,10 +5345,6 @@
   this IS a GN-style file name, and tells GN which source file to compile to
   make the .pch file used for subsequent compiles.
 
-  If you use both C and C++ sources, the precompiled header and source file
-  will be compiled using both tools. You will want to make sure to wrap C++
-  includes in __cplusplus #ifdefs so the file will compile in C mode.
-
   For example, if the toolchain specifies MSVC headers:
 
     toolchain("vc_x64") {
@@ -5360,6 +5372,13 @@
 
 
 ```
+## **precompiled_header_type**: [string] "gcc" or "msvc".
+
+```
+  See "gn help precompiled_header".
+
+
+```
 ## **precompiled_source**: [file name] Source file to precompile.
 
 ```
@@ -5796,8 +5815,12 @@
 ### **Variables**
 
 ```
+  arg_file_template [optional]
+      Path to a file containing the text that should be used as the default
+      args.gn content when you run `gn args`.
+
   buildconfig [required]
-      Label of the build config file. This file will be used to set up the
+      Path to the build config file. This file will be used to set up the
       build file execution environment for each toolchain.
 
   check_targets [optional]
diff --git a/tools/gn/setup.cc b/tools/gn/setup.cc
index 5c4e9842..2c2ba38 100644
--- a/tools/gn/setup.cc
+++ b/tools/gn/setup.cc
@@ -58,8 +58,12 @@
 
 Variables
 
+  arg_file_template [optional]
+      Path to a file containing the text that should be used as the default
+      args.gn content when you run `gn args`.
+
   buildconfig [required]
-      Label of the build config file. This file will be used to set up the
+      Path to the build config file. This file will be used to set up the
       build file execution environment for each toolchain.
 
   check_targets [optional]
@@ -790,5 +794,16 @@
     default_args_ = default_args_value->scope_value();
   }
 
+  const Value* arg_file_template_value =
+      dotfile_scope_.GetValue("arg_file_template", true);
+  if (arg_file_template_value) {
+    if (!arg_file_template_value->VerifyTypeIs(Value::STRING, &err)) {
+      err.PrintToStdout();
+      return false;
+    }
+    SourceFile path(arg_file_template_value->string_value());
+    build_settings_.set_arg_file_template_path(path);
+  }
+
   return true;
 }
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 4fd60561d..ab8c54ad 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -29057,6 +29057,33 @@
   </summary>
 </histogram>
 
+<histogram name="Mobile.SystemNotification.Blocked"
+    enum="SystemNotificationType">
+  <owner>dtrainor@chromium.org</owner>
+  <summary>
+    Android: Represents the number of system notifications that were blocked and
+    could not be shown by type.
+  </summary>
+</histogram>
+
+<histogram name="Mobile.SystemNotification.BlockedAfterShown"
+    enum="SystemNotificationType">
+  <owner>dtrainor@chromium.org</owner>
+  <summary>
+    Android: Represents the type of notification that was last shown before the
+    user disabled notification permissions on Chrome.  This is only logged the
+    first time we attempt to show a notification and fail.
+  </summary>
+</histogram>
+
+<histogram name="Mobile.SystemNotification.Shown" enum="SystemNotificationType">
+  <owner>dtrainor@chromium.org</owner>
+  <summary>
+    Android: Represents the number of system notifications that will be
+    successfully shown to the user by type.
+  </summary>
+</histogram>
+
 <histogram name="MobileDownload.BytesDownloaded" units="KB">
   <owner>qinmin@chromium.org</owner>
   <summary>
@@ -88430,7 +88457,7 @@
   <int value="333" label="EnableMediaRouter"/>
   <int value="334" label="DHEEnabled"/>
   <int value="335" label="CertificateTransparencyEnforcementDisabledForUrls"/>
-  <int value="336" label="LoginApps"/>
+  <int value="336" label="DeviceLoginScreenAppInstallList"/>
   <int value="337" label="ArcBackupRestoreEnabled"/>
   <int value="338" label="NTPContentSuggestionsEnabled"/>
   <int value="339" label="WebRtcUdpPortRange"/>
@@ -88460,6 +88487,7 @@
   <int value="363" label="ArcLocationServiceEnabled"/>
   <int value="364" label="DeviceLoginScreenLocales"/>
   <int value="365" label="DeviceLoginScreenInputMethods"/>
+  <int value="366" label="EnableCommonNameFallbackForLocalAnchors"/>
 </enum>
 
 <enum name="EnterprisePolicyInvalidations" type="int">
@@ -110975,6 +111003,12 @@
   <int value="25" label="VPN"/>
 </enum>
 
+<enum name="SystemNotificationType" type="int">
+  <int value="0" label="Downloads - Files"/>
+  <int value="1" label="Downloads - Pages"/>
+  <int value="2" label="Close Incognito Tabs"/>
+</enum>
+
 <enum name="TabBackgroundLoadStatus" type="int">
   <int value="0" label="Loaded on creation and shown"/>
   <int value="1" label="Loaded on creation and lost"/>
diff --git a/tools/perf/benchmarks/media.py b/tools/perf/benchmarks/media.py
index 4ba2e0a1e..c5c6ba6 100644
--- a/tools/perf/benchmarks/media.py
+++ b/tools/perf/benchmarks/media.py
@@ -38,9 +38,8 @@
 
 
 # android: See media.android.tough_video_cases below
-# win8: crbug.com/531618
 # crbug.com/565180: Only include cases that report time_to_play
-@benchmark.Disabled('android', 'win8')
+@benchmark.Disabled('android')
 class Media(perf_benchmark.PerfBenchmark):
   """Obtains media metrics for key user scenarios."""
   test = media.Media
@@ -52,7 +51,7 @@
 
 
 # crbug.com/565180: Only include cases that don't report time_to_play
-@benchmark.Disabled('android', 'win8')
+@benchmark.Disabled('android')
 class MediaExtra(perf_benchmark.PerfBenchmark):
   """Obtains extra media metrics for key user scenarios."""
   test = media.Media
diff --git a/tools/perf/page_sets/data/system_health_desktop.json b/tools/perf/page_sets/data/system_health_desktop.json
index 35f5945..a542d44 100644
--- a/tools/perf/page_sets/data/system_health_desktop.json
+++ b/tools/perf/page_sets/data/system_health_desktop.json
@@ -171,6 +171,9 @@
         "long_running:tools:gmail-foreground": {
             "DEFAULT": "system_health_desktop_028.wpr"
         },
+        "multitab:misc:typical24": {
+            "DEFAULT": "system_health_desktop_048.wpr"
+        },
         "play:media:google_play_music": {
             "DEFAULT": "system_health_desktop_030.wpr"
         },
@@ -186,4 +189,4 @@
     },
     "description": "Describes the Web Page Replay archives for a story set. Don't edit by hand! Use record_wpr for updating.",
     "platform_specific": true
-}
\ No newline at end of file
+}
diff --git a/tools/perf/page_sets/data/system_health_desktop_048.wpr.sha1 b/tools/perf/page_sets/data/system_health_desktop_048.wpr.sha1
new file mode 100644
index 0000000..4ff3d4e1
--- /dev/null
+++ b/tools/perf/page_sets/data/system_health_desktop_048.wpr.sha1
@@ -0,0 +1 @@
+420bd07a02c3966d5945cebf32417a5832764626
diff --git a/tools/perf/page_sets/system_health/multi_tab_stories.py b/tools/perf/page_sets/system_health/multi_tab_stories.py
new file mode 100644
index 0000000..f472a6be
--- /dev/null
+++ b/tools/perf/page_sets/system_health/multi_tab_stories.py
@@ -0,0 +1,81 @@
+# 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.
+
+import py_utils
+import logging
+
+from page_sets.system_health import system_health_story
+from page_sets.system_health import story_tags
+from page_sets.system_health import platforms
+
+
+class _MultiTabStory(system_health_story.SystemHealthStory):
+  ABSTRACT_STORY = True
+
+  def RunNavigateSteps(self, action_runner):
+    tabs = action_runner.tab.browser.tabs
+
+    # No need to create the first tab as there is already one
+    # when the browser is ready,
+    if self.URL_LIST:
+      action_runner.Navigate(self.URL_LIST[0])
+    for url in self.URL_LIST[1:]:
+      new_tab = tabs.New()
+      new_tab.action_runner.Navigate(url)
+
+    for i, url in enumerate(self.URL_LIST):
+      try:
+        tabs[i].action_runner.WaitForNetworkQuiescence()
+      except py_utils.TimeoutException:
+        logging.warning('WaitForNetworkQuiescence() timeout, url[%d]: %s'
+                        % (i, url))
+
+  def RunPageInteractions(self, action_runner):
+    for tab in action_runner.tab.browser.tabs:
+      tab.Activate()
+      tab.WaitForFrameToBeDisplayed()
+
+
+class MultiTabTypical24Story(_MultiTabStory):
+  NAME = 'multitab:misc:typical24'
+  TAGS = [story_tags.TABS_SWITCHING]
+  URL_LIST = [
+    # Why: Alexa games #48
+    'http://www.nick.com/games',
+    # Why: Alexa sports #45
+    'http://www.rei.com/',
+    # Why: Alexa sports #50
+    'http://www.fifa.com/',
+    # Why: Alexa shopping #41
+    'http://www.gamestop.com/ps3',
+    # Why: Alexa news #55
+    ('http://www.economist.com/news/science-and-technology/21573529-small-'
+     'models-cosmic-phenomena-are-shedding-light-real-thing-how-build'),
+    # Why: Alexa news #67
+    'http://www.theonion.com',
+    'http://arstechnica.com/',
+    # Why: Alexa home #10
+    'http://allrecipes.com/Recipe/Pull-Apart-Hot-Cross-Buns/Detail.aspx',
+    'http://www.html5rocks.com/en/',
+    'http://www.mlb.com/',
+    'http://gawker.com/5939683/based-on-a-true-story-is-a-rotten-lie-i-hope-you-never-believe',
+    'http://www.imdb.com/title/tt0910970/',
+    'http://www.flickr.com/search/?q=monkeys&f=hp',
+    'http://money.cnn.com/',
+    'http://www.nationalgeographic.com/',
+    'http://premierleague.com',
+    'http://www.osubeavers.com/',
+    'http://walgreens.com',
+    'http://colorado.edu',
+    ('http://www.ticketmaster.com/JAY-Z-and-Justin-Timberlake-tickets/artist/'
+     '1837448?brand=none&tm_link=tm_homeA_rc_name2'),
+    # pylint: disable=line-too-long
+    'http://www.theverge.com/2013/3/5/4061684/inside-ted-the-smartest-bubble-in-the-world',
+    'http://www.airbnb.com/',
+    'http://www.ign.com/',
+    # Why: Alexa health #25
+    'http://www.fda.gov',
+  ]
+  URL = URL_LIST[0]
+  SUPPORTED_PLATFORMS = platforms.DESKTOP_ONLY
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js b/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
index 6ebec5e..2ad6059 100644
--- a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
+++ b/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
@@ -12,6 +12,7 @@
  * Strings required for policy indicators. These must be set at runtime.
  * Chrome OS only strings may be undefined.
  * @type {{
+ *   controlledSettingExtension: string,
  *   controlledSettingPolicy: string,
  *   controlledSettingRecommendedMatches: string,
  *   controlledSettingRecommendedDiffers: string,
@@ -79,8 +80,7 @@
    * @private
    */
   getIndicatorVisible_: function(type) {
-    return type != CrPolicyIndicatorType.NONE &&
-        type != CrPolicyIndicatorType.EXTENSION;
+    return type != CrPolicyIndicatorType.NONE;
   },
 
   /**
@@ -89,26 +89,22 @@
    * @private
    */
   getIndicatorIcon_: function(type) {
-    var icon = '';
     switch (type) {
       case CrPolicyIndicatorType.EXTENSION:
+        return 'cr:extension';
       case CrPolicyIndicatorType.NONE:
-        return icon;
+        return '';
       case CrPolicyIndicatorType.PRIMARY_USER:
-        icon = 'cr:group';
-        break;
+        return 'cr:group';
       case CrPolicyIndicatorType.OWNER:
-        icon = 'cr:person';
-        break;
+        return 'cr:person';
       case CrPolicyIndicatorType.USER_POLICY:
       case CrPolicyIndicatorType.DEVICE_POLICY:
       case CrPolicyIndicatorType.RECOMMENDED:
-        icon = 'cr20:domain';
-        break;
+        return 'cr20:domain';
       default:
         assertNotReached();
     }
-    return icon;
   },
 
   /**
@@ -123,6 +119,8 @@
     if (!CrPolicyStrings)
       return '';  // Tooltips may not be defined, e.g. in OOBE.
     switch (type) {
+      case CrPolicyIndicatorType.EXTENSION:
+        return CrPolicyStrings.controlledSettingExtension;
       case CrPolicyIndicatorType.PRIMARY_USER:
         return CrPolicyStrings.controlledSettingShared.replace('$1', name);
       case CrPolicyIndicatorType.OWNER:
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_pref_behavior.js b/ui/webui/resources/cr_elements/policy/cr_policy_pref_behavior.js
index ad393b9..d153e0a 100644
--- a/ui/webui/resources/cr_elements/policy/cr_policy_pref_behavior.js
+++ b/ui/webui/resources/cr_elements/policy/cr_policy_pref_behavior.js
@@ -8,21 +8,35 @@
 
 /** @polymerBehavior */
 var CrPolicyPrefBehavior = {
+  properties: {
+    /**
+     * Showing that an extension is controlling a pref is sometimes done with a
+     * different UI (e.g. extension-controlled-indicator). In  those cases,
+     * avoid showing an (extra) indicator here.
+     * @public
+     */
+    ignoreExtensions: Boolean,
+  },
+
   /**
+   * Is the |pref| controlled by something that prevents user control of the
+   * preference.
    * @return {boolean} True if |this.pref| is controlled by an enforced policy.
    */
-  isPrefPolicyControlled: function() {
-    return (
-        this.pref.enforcement == chrome.settingsPrivate.Enforcement.ENFORCED &&
-        this.pref.controlledBy !=
-            chrome.settingsPrivate.ControlledBy.EXTENSION);
+  isPrefEnforced: function() {
+    if (this.ignoreExtensions &&
+        this.pref.controlledBy ==
+            chrome.settingsPrivate.ControlledBy.EXTENSION) {
+      return false;
+    }
+    return this.pref.enforcement == chrome.settingsPrivate.Enforcement.ENFORCED;
   },
 
   /**
    * @return {boolean} True if |this.pref| has a recommended or enforced policy.
    */
   hasPrefPolicyIndicator: function() {
-    return this.isPrefPolicyControlled() ||
+    return this.isPrefEnforced() ||
         this.pref.enforcement == chrome.settingsPrivate.Enforcement.RECOMMENDED;
   },
 };
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js b/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js
index 532b0763..99d5b08 100644
--- a/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js
+++ b/ui/webui/resources/cr_elements/policy/cr_policy_pref_indicator.js
@@ -48,6 +48,8 @@
       return CrPolicyIndicatorType.RECOMMENDED;
     if (enforcement == chrome.settingsPrivate.Enforcement.ENFORCED) {
       switch (controlledBy) {
+        case chrome.settingsPrivate.ControlledBy.EXTENSION:
+          return CrPolicyIndicatorType.EXTENSION;
         case chrome.settingsPrivate.ControlledBy.PRIMARY_USER:
           return CrPolicyIndicatorType.PRIMARY_USER;
         case chrome.settingsPrivate.ControlledBy.OWNER: