diff --git a/chrome/browser/resources/settings/about_page/about_page.html b/chrome/browser/resources/settings/about_page/about_page.html
index 06d1ec1..6d9ee18 100644
--- a/chrome/browser/resources/settings/about_page/about_page.html
+++ b/chrome/browser/resources/settings/about_page/about_page.html
@@ -19,6 +19,7 @@
 
 <if expr="chromeos">
 <link rel="import" href="detailed_build_info.html">
+<link rel="import" href="update_warning_dialog.html">
 <link rel="import" href="../settings_page/settings_subpage.html">
 </if>
 
@@ -222,6 +223,13 @@
         </settings-animated-pages>
       </settings-section>
     </div>
+<if expr="chromeos">
+    <template is="dom-if" if="[[showUpdateWarningDialog_]]" restamp>
+      <settings-update-warning-dialog update-info="[[updateInfo_]]"
+          on-close="onUpdateWarningDialogClose_">
+      </settings-update-warning-dialog>
+    </template>
+</if>
   </template>
   <script src="about_page.js"></script>
 </dom-module>
diff --git a/chrome/browser/resources/settings/about_page/about_page.js b/chrome/browser/resources/settings/about_page/about_page.js
index 2e5464e..54ca31e 100644
--- a/chrome/browser/resources/settings/about_page/about_page.js
+++ b/chrome/browser/resources/settings/about_page/about_page.js
@@ -6,6 +6,7 @@
  * @fileoverview 'settings-about-page' contains version and OS related
  * information.
  */
+
 Polymer({
   is: 'settings-about-page',
 
@@ -84,7 +85,16 @@
             '#detailed-build-info-trigger');
         return map;
       },
-    }
+    },
+
+    /** @private */
+    showUpdateWarningDialog_: {
+      type: Boolean,
+      value: false,
+    },
+
+    /** @private {!AboutPageUpdateInfo|undefined} */
+    updateInfo_: Object,
 // </if>
   },
 
@@ -163,6 +173,10 @@
 // <if expr="chromeos">
     if (event.status == UpdateStatus.CHECKING)
       this.hasCheckedForUpdates_ = true;
+    else if (event.status == UpdateStatus.NEED_PERMISSION_TO_UPDATE) {
+      this.showUpdateWarningDialog_ = true;
+      this.updateInfo_ = {version: event.version, size: event.size};
+    }
 // </if>
     this.currentUpdateStatusEvent_ = event;
   },
@@ -258,6 +272,13 @@
     switch (this.currentUpdateStatusEvent_.status) {
       case UpdateStatus.CHECKING:
         return this.i18n('aboutUpgradeCheckStarted');
+      case UpdateStatus.NEED_PERMISSION_TO_UPDATE:
+        // This status is immediately followed by an reporting error status.
+        // When update engine reports error, UI just shows that your device is
+        // up to date. This is a bug that needs to be fixed in the future.
+        // TODO(weidongg/581071): Show proper message when update engine aborts
+        // due to cellular connection.
+        return '';
       case UpdateStatus.NEARLY_UPDATED:
 // <if expr="chromeos">
         if (this.currentChannel_ != this.targetChannel_)
@@ -399,7 +420,8 @@
     var staleUpdatedStatus = !this.hasCheckedForUpdates_ &&
         this.checkStatus_(UpdateStatus.UPDATED);
 
-    return staleUpdatedStatus || this.checkStatus_(UpdateStatus.FAILED);
+    return staleUpdatedStatus || this.checkStatus_(UpdateStatus.FAILED) ||
+        this.checkStatus_(UpdateStatus.NEED_PERMISSION_TO_UPDATE);
   },
 
   /**
@@ -409,6 +431,11 @@
   shouldShowRegulatoryInfo_: function() {
     return this.regulatoryInfo_ !== null;
   },
+
+  /** @private */
+  onUpdateWarningDialogClose_: function() {
+    this.showUpdateWarningDialog_ = false;
+  },
 // </if>
 
   /** @private */
diff --git a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
index 2b592ac..892ceca5 100644
--- a/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
+++ b/chrome/browser/resources/settings/about_page/about_page_browser_proxy.js
@@ -35,6 +35,14 @@
 var VersionInfo;
 
 /**
+ * @typedef {{
+ *   version: (string|undefined),
+ *   size: (string|undefined),
+ * }}
+ */
+var AboutPageUpdateInfo;
+
+/**
  * Enumeration of all possible browser channels.
  * @enum {string}
  */
@@ -58,6 +66,7 @@
   FAILED: 'failed',
   DISABLED: 'disabled',
   DISABLED_BY_ADMIN: 'disabled_by_admin',
+  NEED_PERMISSION_TO_UPDATE: 'need_permission_to_update',
 };
 
 // <if expr="_google_chrome and is_macosx">
@@ -78,6 +87,8 @@
  *   progress: (number|undefined),
  *   message: (string|undefined),
  *   connectionTypes: (string|undefined),
+ *   version: (string|undefined),
+ *   size: (string|undefined),
  * }}
  */
 var UpdateStatusChangedEvent;
@@ -147,6 +158,18 @@
     requestUpdate: function() {},
 
     /**
+     * Checks for the update with specified version and size and applies over
+     * cellular. The target version and size are the same as were received from
+     * 'update-status-changed' WebUI event. We send this back all the way to
+     * update engine for it to double check with update server in case there's a
+     * new update available. This prevents downloading the new update that user
+     * didn't agree to.
+     * @param {string} target_version
+     * @param {string} target_size
+     */
+    requestUpdateOverCellular: function(target_version, target_size) {},
+
+    /**
      * @param {!BrowserChannel} channel
      * @param {boolean} isPowerwashAllowed
      */
@@ -214,6 +237,11 @@
     },
 
     /** @override */
+    requestUpdateOverCellular: function(target_version, target_size) {
+      chrome.send('requestUpdateOverCellular', [target_version, target_size]);
+    },
+
+    /** @override */
     setChannel: function(channel, isPowerwashAllowed) {
       chrome.send('setChannel', [channel, isPowerwashAllowed]);
     },
diff --git a/chrome/browser/resources/settings/about_page/update_warning_dialog.js b/chrome/browser/resources/settings/about_page/update_warning_dialog.js
index 1060fa4f..d938891 100644
--- a/chrome/browser/resources/settings/about_page/update_warning_dialog.js
+++ b/chrome/browser/resources/settings/about_page/update_warning_dialog.js
@@ -12,6 +12,17 @@
 
   behaviors: [I18nBehavior],
 
+  properties: {
+    /** @type {!AboutPageUpdateInfo|undefined} */
+    updateInfo: {
+      type: Object,
+      observer: 'updateInfoChanged_',
+    },
+  },
+
+  /** @private {?settings.AboutPageBrowserProxy} */
+  browserProxy_: null,
+
   /** @override */
   ready: function() {
     this.browserProxy_ = settings.AboutPageBrowserProxyImpl.getInstance();
@@ -24,22 +35,21 @@
 
   /** @private */
   onCancelTap_: function() {
-    // TODO(weidongg): implement the real behaviors here.
     this.$.dialog.close();
   },
 
   /** @private */
   onContinueTap_: function() {
-    // TODO(weidongg): implement the real behaviors here.
+    this.browserProxy_.requestUpdateOverCellular(this.updateInfo.version,
+                                                 this.updateInfo.size);
     this.$.dialog.close();
   },
 
-  /**
-   * @param {string} updateSizeMb Size of the update in megabytes.
-   * @private
-   */
-  setUpdateWarningMessage: function(updateSizeMb) {
-     this.$$("#update-warning-message").innerHTML =
-         this.i18n("aboutUpdateWarningMessage", updateSizeMb);
+  /** @private */
+  updateInfoChanged_: function() {
+    this.$$("#update-warning-message").innerHTML =
+        this.i18n("aboutUpdateWarningMessage",
+                  // Convert bytes to megabytes
+                  Math.floor(Number(this.updateInfo.size) / (1024 * 1024)));
   },
 });
diff --git a/chrome/browser/ui/webui/help/help_handler.cc b/chrome/browser/ui/webui/help/help_handler.cc
index cb2cc35..d0a18970 100644
--- a/chrome/browser/ui/webui/help/help_handler.cc
+++ b/chrome/browser/ui/webui/help/help_handler.cc
@@ -602,7 +602,10 @@
 }
 
 void HelpHandler::SetUpdateStatus(VersionUpdater::Status status,
-                                  int progress, const base::string16& message) {
+                                  int progress,
+                                  const std::string& /* version */,
+                                  int64_t /* size */,
+                                  const base::string16& message) {
   // Only UPDATING state should have progress set.
   DCHECK(status == VersionUpdater::UPDATING || progress == 0);
 
@@ -623,6 +626,9 @@
   case VersionUpdater::FAILED:
   case VersionUpdater::FAILED_OFFLINE:
   case VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED:
+  // Old help page does not support update over cellular connection. Treat this
+  // signal as FAILED.
+  case VersionUpdater::NEED_PERMISSION_TO_UPDATE:
     status_str = "failed";
     break;
   case VersionUpdater::DISABLED:
diff --git a/chrome/browser/ui/webui/help/help_handler.h b/chrome/browser/ui/webui/help/help_handler.h
index e0ba5fa0..82b088b 100644
--- a/chrome/browser/ui/webui/help/help_handler.h
+++ b/chrome/browser/ui/webui/help/help_handler.h
@@ -90,6 +90,8 @@
   // Callback method which forwards status updates to the page.
   void SetUpdateStatus(VersionUpdater::Status status,
                        int progress,
+                       const std::string& version,
+                       int64_t size,
                        const base::string16& fail_message);
 
 #if defined(OS_MACOSX)
diff --git a/chrome/browser/ui/webui/help/version_updater.h b/chrome/browser/ui/webui/help/version_updater.h
index f12e367..d36b26f 100644
--- a/chrome/browser/ui/webui/help/version_updater.h
+++ b/chrome/browser/ui/webui/help/version_updater.h
@@ -25,6 +25,7 @@
   // Update process state machine.
   enum Status {
     CHECKING,
+    NEED_PERMISSION_TO_UPDATE,
     UPDATING,
     NEARLY_UPDATED,
     UPDATED,
@@ -53,8 +54,13 @@
 
   // Used to update the client of status changes. int parameter is the progress
   // and should only be non-zero for the UPDATING state.
+  // std::string parameter is the version of the available update and should be
+  // empty string when update is not available.
+  // int64_t parameter is the size in bytes of the available update and should
+  // be 0 when update is not available.
   // base::string16 parameter is a message explaining a failure.
-  typedef base::Callback<void(Status, int, const base::string16&)>
+  typedef base::Callback<
+      void(Status, int, const std::string&, int64_t, const base::string16&)>
       StatusCallback;
 
   // Used to show or hide the promote UI elements. Mac-only.
@@ -86,6 +92,14 @@
   virtual void GetChannel(bool get_current_channel,
                           const ChannelCallback& callback) = 0;
   virtual void GetEolStatus(const EolStatusCallback& callback) = 0;
+
+  // Set the update over cellular target in |target_version| and |target_size|
+  // arguments maintained by update engine. The arguments are later used by
+  // update engine to match the given target with the server head and to allow
+  // update over cellular to this given target.
+  virtual void SetUpdateOverCellularTarget(const StatusCallback& callback,
+                                           const std::string& target_version,
+                                           int64_t target_size) = 0;
 #endif
 };
 
diff --git a/chrome/browser/ui/webui/help/version_updater_basic.cc b/chrome/browser/ui/webui/help/version_updater_basic.cc
index 2cd9126..8cb85a3 100644
--- a/chrome/browser/ui/webui/help/version_updater_basic.cc
+++ b/chrome/browser/ui/webui/help/version_updater_basic.cc
@@ -11,9 +11,9 @@
     const StatusCallback& status_callback,
     const PromoteCallback&) {
   if (UpgradeDetector::GetInstance()->notify_upgrade())
-    status_callback.Run(NEARLY_UPDATED, 0, base::string16());
+    status_callback.Run(NEARLY_UPDATED, 0, std::string(), 0, base::string16());
   else
-    status_callback.Run(DISABLED, 0, base::string16());
+    status_callback.Run(DISABLED, 0, std::string(), 0, base::string16());
 }
 
 VersionUpdater* VersionUpdater::Create(content::WebContents* web_contents) {
diff --git a/chrome/browser/ui/webui/help/version_updater_chromeos.cc b/chrome/browser/ui/webui/help/version_updater_chromeos.cc
index e74b938..00d657b 100644
--- a/chrome/browser/ui/webui/help/version_updater_chromeos.cc
+++ b/chrome/browser/ui/webui/help/version_updater_chromeos.cc
@@ -8,6 +8,7 @@
 
 #include "base/bind.h"
 #include "base/bind_helpers.h"
+#include "base/strings/string_number_conversions.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/chromeos/login/startup_utils.h"
 #include "chrome/browser/chromeos/login/wizard_controller.h"
@@ -49,15 +50,13 @@
 NetworkStatus GetNetworkStatus(const chromeos::NetworkState* network) {
   if (!network || !network->IsConnectedState())  // Offline state.
     return NETWORK_STATUS_OFFLINE;
-
   // The connection type checking strategy must be the same as the one
   // used in update engine.
   if (network->type() == shill::kTypeBluetooth)
     return NETWORK_STATUS_DISALLOWED;
-  if (network->type() == shill::kTypeCellular &&
-      !help_utils_chromeos::IsUpdateOverCellularAllowed()) {
-    return NETWORK_STATUS_DISALLOWED;
-  }
+  // Allow updates over cellular by default in chrome, as update engine still
+  // needs to check device policy and user preferences when checking for
+  // updates to decide whether to proceed to downloading.
   return NETWORK_STATUS_ALLOWED;
 }
 
@@ -78,7 +77,7 @@
 // the appropriate status.
 bool EnsureCanUpdate(const VersionUpdater::StatusCallback& callback) {
   if (IsAutoUpdateDisabled()) {
-    callback.Run(VersionUpdater::DISABLED_BY_ADMIN, 0,
+    callback.Run(VersionUpdater::DISABLED_BY_ADMIN, 0, std::string(), 0,
                  l10n_util::GetStringUTF16(IDS_UPGRADE_DISABLED_BY_POLICY));
     return false;
   }
@@ -92,15 +91,16 @@
   // to a network for which updates are disallowed.
   NetworkStatus status = GetNetworkStatus(network);
   if (status == NETWORK_STATUS_OFFLINE) {
-    callback.Run(VersionUpdater::FAILED_OFFLINE, 0,
-                  l10n_util::GetStringUTF16(IDS_UPGRADE_OFFLINE));
+    callback.Run(VersionUpdater::FAILED_OFFLINE, 0, std::string(), 0,
+                 l10n_util::GetStringUTF16(IDS_UPGRADE_OFFLINE));
     return false;
   } else if (status == NETWORK_STATUS_DISALLOWED) {
     base::string16 message =
         l10n_util::GetStringFUTF16(
             IDS_UPGRADE_DISALLOWED,
             help_utils_chromeos::GetConnectionTypeAsUTF16(network->type()));
-    callback.Run(VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED, 0, message);
+    callback.Run(VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED, 0,
+                 std::string(), 0, message);
     return false;
   }
 
@@ -169,6 +169,32 @@
       SetChannel(channel, is_powerwash_allowed);
 }
 
+void VersionUpdaterCros::SetUpdateOverCellularTarget(
+    const StatusCallback& callback,
+    const std::string& target_version,
+    int64_t target_size) {
+  callback_ = callback;
+  DBusThreadManager::Get()
+      ->GetUpdateEngineClient()
+      ->SetUpdateOverCellularTarget(
+          target_version, target_size,
+          base::Bind(&VersionUpdaterCros::OnSetUpdateOverCellularTarget,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void VersionUpdaterCros::OnSetUpdateOverCellularTarget(bool success) {
+  if (success) {
+    // Target is set successfully, so we can proceed to update.
+    CheckForUpdate(callback_, VersionUpdater::PromoteCallback());
+  } else {
+    // TODO(weidongg/691108): invoke callback to signal about page to show
+    // appropriate error message.
+    LOG(ERROR) << "Error setting update over cellular target.";
+    callback_.Run(VersionUpdater::FAILED, 0, std::string(), 0,
+                  base::string16());
+  }
+}
+
 void VersionUpdaterCros::GetChannel(bool get_current_channel,
                                     const ChannelCallback& cb) {
   UpdateEngineClient* update_engine_client =
@@ -218,6 +244,8 @@
     const UpdateEngineClient::Status& status) {
   Status my_status = UPDATED;
   int progress = 0;
+  std::string version = status.new_version;
+  int64_t size = status.new_size;
   base::string16 message;
 
   // If the updater is currently idle, just show the last operation (unless it
@@ -248,6 +276,9 @@
     case UpdateEngineClient::UPDATE_STATUS_UPDATE_AVAILABLE:
       my_status = UPDATING;
       break;
+    case UpdateEngineClient::UPDATE_STATUS_NEED_PERMISSION_TO_UPDATE:
+      my_status = NEED_PERMISSION_TO_UPDATE;
+      break;
     case UpdateEngineClient::UPDATE_STATUS_VERIFYING:
     case UpdateEngineClient::UPDATE_STATUS_FINALIZING:
       // Once the download is finished, keep the progress at 100; it shouldn't
@@ -262,7 +293,7 @@
       break;
   }
 
-  callback_.Run(my_status, progress, message);
+  callback_.Run(my_status, progress, version, size, message);
   last_operation_ = status.status;
 
   if (check_for_update_when_idle_ &&
@@ -276,5 +307,5 @@
   // If version updating is not implemented, this binary is the most up-to-date
   // possible with respect to automatic updating.
   if (result == UpdateEngineClient::UPDATE_RESULT_NOTIMPLEMENTED)
-    callback_.Run(UPDATED, 0, base::string16());
+    callback_.Run(UPDATED, 0, std::string(), 0, base::string16());
 }
diff --git a/chrome/browser/ui/webui/help/version_updater_chromeos.h b/chrome/browser/ui/webui/help/version_updater_chromeos.h
index b9f50dd..b6de0cb 100644
--- a/chrome/browser/ui/webui/help/version_updater_chromeos.h
+++ b/chrome/browser/ui/webui/help/version_updater_chromeos.h
@@ -26,6 +26,9 @@
                   bool is_powerwash_allowed) override;
   void GetChannel(bool get_current_channel,
                   const ChannelCallback& callback) override;
+  void SetUpdateOverCellularTarget(const StatusCallback& callback,
+                                   const std::string& target_version,
+                                   int64_t target_size) override;
 
   // Gets the last update status, without triggering a new check or download.
   void GetUpdateStatus(const StatusCallback& callback);
@@ -47,6 +50,9 @@
   // Callback from UpdateEngineClient::RequestUpdateCheck().
   void OnUpdateCheck(chromeos::UpdateEngineClient::UpdateCheckResult result);
 
+  // Callback from UpdateEngineClient::SetUpdateOverCellularTarget().
+  void OnSetUpdateOverCellularTarget(bool success);
+
   // Callback from UpdateEngineClient::GetChannel().
   void OnGetChannel(const ChannelCallback& cb,
                     const std::string& current_channel);
diff --git a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
index d4aeb58..3db6e62 100644
--- a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
+++ b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
@@ -32,8 +32,9 @@
 
 void CheckNotification(VersionUpdater::Status /* status */,
                        int /* progress */,
-                       const base::string16& /* message */) {
-}
+                       const std::string& /* version */,
+                       int64_t /* size */,
+                       const base::string16& /* message */) {}
 
 }  // namespace
 
diff --git a/chrome/browser/ui/webui/help/version_updater_mac.mm b/chrome/browser/ui/webui/help/version_updater_mac.mm
index 2347f3fa..c7f0393 100644
--- a/chrome/browser/ui/webui/help/version_updater_mac.mm
+++ b/chrome/browser/ui/webui/help/version_updater_mac.mm
@@ -108,7 +108,7 @@
   } else {
     // There is no glue, or the application is on a read-only filesystem.
     // Updates and promotions are impossible.
-    status_callback_.Run(DISABLED, 0, base::string16());
+    status_callback_.Run(DISABLED, 0, std::string(), 0, base::string16());
   }
 }
 
@@ -235,7 +235,7 @@
   }
 
   if (!status_callback_.is_null())
-    status_callback_.Run(status, 0, message);
+    status_callback_.Run(status, 0, std::string(), 0, message);
 
   PromotionState promotion_state;
   if (!promote_callback_.is_null()) {
diff --git a/chrome/browser/ui/webui/help/version_updater_win.cc b/chrome/browser/ui/webui/help/version_updater_win.cc
index e3d948a50..43bcd59 100644
--- a/chrome/browser/ui/webui/help/version_updater_win.cc
+++ b/chrome/browser/ui/webui/help/version_updater_win.cc
@@ -39,7 +39,7 @@
   if (!(base::win::GetVersion() == base::win::VERSION_VISTA &&
         (base::win::OSInfo::GetInstance()->service_pack().major == 0) &&
         !base::win::UserAccountControlIsEnabled())) {
-    callback_.Run(CHECKING, 0, base::string16());
+    callback_.Run(CHECKING, 0, std::string(), 0, base::string16());
     BeginUpdateCheckOnFileThread(false /* !install_update_if_possible */);
   }
 }
@@ -69,18 +69,18 @@
     status = UPDATING;
     BeginUpdateCheckOnFileThread(true /* install_update_if_possible */);
   }
-  callback_.Run(status, 0, base::string16());
+  callback_.Run(status, 0, std::string(), 0, base::string16());
 }
 
 void VersionUpdaterWin::OnUpgradeProgress(int progress,
                                           const base::string16& new_version) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  callback_.Run(UPDATING, progress, base::string16());
+  callback_.Run(UPDATING, progress, std::string(), 0, base::string16());
 }
 
 void VersionUpdaterWin::OnUpgradeComplete(const base::string16& new_version) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-  callback_.Run(NEARLY_UPDATED, 0, base::string16());
+  callback_.Run(NEARLY_UPDATED, 0, std::string(), 0, base::string16());
 }
 
 void VersionUpdaterWin::OnError(GoogleUpdateErrorCode error_code,
@@ -111,7 +111,7 @@
       }
       break;
   }
-  callback_.Run(status, 0, message);
+  callback_.Run(status, 0, std::string(), 0, message);
 }
 
 void VersionUpdaterWin::BeginUpdateCheckOnFileThread(
@@ -127,7 +127,7 @@
 
 void VersionUpdaterWin::OnPendingRestartCheck(bool is_update_pending_restart) {
   callback_.Run(is_update_pending_restart ? NEARLY_UPDATED : UPDATED, 0,
-                base::string16());
+                std::string(), 0, base::string16());
 }
 
 VersionUpdater* VersionUpdater::Create(content::WebContents* web_contents) {
diff --git a/chrome/browser/ui/webui/settings/about_handler.cc b/chrome/browser/ui/webui/settings/about_handler.cc
index 660d07d..2ee8ce7b 100644
--- a/chrome/browser/ui/webui/settings/about_handler.cc
+++ b/chrome/browser/ui/webui/settings/about_handler.cc
@@ -19,6 +19,7 @@
 #include "base/macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string16.h"
+#include "base/strings/string_number_conversions.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task_scheduler/post_task.h"
@@ -239,6 +240,9 @@
     case VersionUpdater::DISABLED_BY_ADMIN:
       status_str = "disabled_by_admin";
       break;
+    case VersionUpdater::NEED_PERMISSION_TO_UPDATE:
+      status_str = "need_permission_to_update";
+      break;
   }
 
   return status_str;
@@ -340,7 +344,10 @@
   web_ui()->RegisterMessageCallback(
       "requestUpdate",
       base::Bind(&AboutHandler::HandleRequestUpdate, base::Unretained(this)));
-
+  web_ui()->RegisterMessageCallback(
+      "requestUpdateOverCellular",
+      base::Bind(&AboutHandler::HandleRequestUpdateOverCellular,
+                 base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       "getVersionInfo",
       base::Bind(&AboutHandler::HandleGetVersionInfo, base::Unretained(this)));
@@ -544,6 +551,28 @@
   RequestUpdate();
 }
 
+void AboutHandler::HandleRequestUpdateOverCellular(
+    const base::ListValue* args) {
+  CHECK_EQ(2U, args->GetSize());
+
+  std::string target_version;
+  std::string target_size_string;
+  int64_t target_size;
+
+  CHECK(args->GetString(0, &target_version));
+  CHECK(args->GetString(1, &target_size_string));
+  CHECK(base::StringToInt64(target_size_string, &target_size));
+
+  RequestUpdateOverCellular(target_version, target_size);
+}
+
+void AboutHandler::RequestUpdateOverCellular(const std::string& target_version,
+                                             int64_t target_size) {
+  version_updater_->SetUpdateOverCellularTarget(
+      base::Bind(&AboutHandler::SetUpdateStatus, base::Unretained(this)),
+      target_version, target_size);
+}
+
 #endif  // defined(OS_CHROMEOS)
 
 void AboutHandler::RequestUpdate() {
@@ -558,6 +587,8 @@
 
 void AboutHandler::SetUpdateStatus(VersionUpdater::Status status,
                                    int progress,
+                                   const std::string& version,
+                                   int64_t size,
                                    const base::string16& message) {
   // Only UPDATING state should have progress set.
   DCHECK(status == VersionUpdater::UPDATING || progress == 0);
@@ -566,7 +597,9 @@
   event->SetString("status", UpdateStatusToString(status));
   event->SetString("message", message);
   event->SetInteger("progress", progress);
-
+  event->SetString("version", version);
+  // DictionaryValue does not support int64_t, so convert to string.
+  event->SetString("size", base::Int64ToString(size));
 #if defined(OS_CHROMEOS)
   if (status == VersionUpdater::FAILED_OFFLINE ||
       status == VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED) {
diff --git a/chrome/browser/ui/webui/settings/about_handler.h b/chrome/browser/ui/webui/settings/about_handler.h
index 3de70b6..5dc9d23 100644
--- a/chrome/browser/ui/webui/settings/about_handler.h
+++ b/chrome/browser/ui/webui/settings/about_handler.h
@@ -109,6 +109,14 @@
   // Checks for and applies update, triggered by JS.
   void HandleRequestUpdate(const base::ListValue* args);
 
+  // Checks for and applies update over cellular connection, triggered by JS.
+  // Target version and size should be included in the list of arguments.
+  void HandleRequestUpdateOverCellular(const base::ListValue* args);
+
+  // Checks for and applies update over cellular connection to the given target.
+  void RequestUpdateOverCellular(const std::string& target_version,
+                                 int64_t target_size);
+
 #endif
 
   // Checks for and applies update.
@@ -117,6 +125,8 @@
   // Callback method which forwards status updates to the page.
   void SetUpdateStatus(VersionUpdater::Status status,
                        int progress,
+                       const std::string& version,
+                       int64_t size,
                        const base::string16& fail_message);
 
 #if defined(OS_MACOSX)
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Document-getElementsByTagName-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Document-getElementsByTagName-expected.txt
index 91ac357..59d64579 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Document-getElementsByTagName-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Document-getElementsByTagName-expected.txt
@@ -12,12 +12,12 @@
 PASS HTML element with uppercase tagName never matches in HTML Documents 
 PASS Element in non-HTML namespace, no prefix, lowercase name 
 PASS Element in non-HTML namespace, no prefix, uppercase name 
-FAIL Element in non-HTML namespace, prefix, lowercase name assert_array_equals: lengths differ, expected 0 got 1
-FAIL Element in non-HTML namespace, prefix, uppercase name assert_array_equals: lengths differ, expected 0 got 1
+PASS Element in non-HTML namespace, prefix, lowercase name 
+PASS Element in non-HTML namespace, prefix, uppercase name 
 PASS Element in HTML namespace, no prefix, non-ascii characters in name 
 PASS Element in non-HTML namespace, non-ascii characters in name 
-FAIL Element in HTML namespace, prefix, non-ascii characters in name assert_array_equals: All uppercase input lengths differ, expected 1 got 0
-FAIL Element in non-HTML namespace, prefix, non-ascii characters in name assert_array_equals: All uppercase input lengths differ, expected 1 got 0
+PASS Element in HTML namespace, prefix, non-ascii characters in name 
+PASS Element in non-HTML namespace, prefix, non-ascii characters in name 
 PASS getElementsByTagName('*') 
 Harness: the test ran to completion.
 
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Document-getElementsByTagName-xhtml-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Document-getElementsByTagName-xhtml-expected.txt
deleted file mode 100644
index 9d62c817..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Document-getElementsByTagName-xhtml-expected.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-This is a testharness.js-based test.
-PASS HTML element with uppercase tag name matches in XHTML documents 
-PASS Element in non-HTML namespace, no prefix, lowercase name 
-PASS Element in non-HTML namespace, no prefix, uppercase name 
-FAIL Element in non-HTML namespace, prefix, lowercase name assert_array_equals: lengths differ, expected 0 got 1
-FAIL Element in non-HTML namespace, prefix, uppercase name assert_array_equals: lengths differ, expected 0 got 1
-PASS Element in HTML namespace, no prefix, non-ascii characters in name 
-PASS Element in non-HTML namespace, non-ascii characters in name 
-FAIL Element in HTML namespace, prefix, non-ascii characters in name assert_array_equals: Ascii lowercase input lengths differ, expected 1 got 0
-FAIL Element in non-HTML namespace, prefix, non-ascii characters in name assert_array_equals: All uppercase input lengths differ, expected 1 got 0
-PASS getElementsByTagName('*') 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Element-getElementsByTagName-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Element-getElementsByTagName-expected.txt
index 868ebed9..efd83ed 100644
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Element-getElementsByTagName-expected.txt
+++ b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/Element-getElementsByTagName-expected.txt
@@ -12,12 +12,12 @@
 PASS HTML element with uppercase tagName never matches in HTML Documents 
 PASS Element in non-HTML namespace, no prefix, lowercase name 
 PASS Element in non-HTML namespace, no prefix, uppercase name 
-FAIL Element in non-HTML namespace, prefix, lowercase name assert_array_equals: lengths differ, expected 0 got 1
-FAIL Element in non-HTML namespace, prefix, uppercase name assert_array_equals: lengths differ, expected 0 got 1
+PASS Element in non-HTML namespace, prefix, lowercase name 
+PASS Element in non-HTML namespace, prefix, uppercase name 
 PASS Element in HTML namespace, no prefix, non-ascii characters in name 
 PASS Element in non-HTML namespace, non-ascii characters in name 
-FAIL Element in HTML namespace, prefix, non-ascii characters in name assert_array_equals: All uppercase input lengths differ, expected 1 got 0
-FAIL Element in non-HTML namespace, prefix, non-ascii characters in name assert_array_equals: All uppercase input lengths differ, expected 1 got 0
+PASS Element in HTML namespace, prefix, non-ascii characters in name 
+PASS Element in non-HTML namespace, prefix, non-ascii characters in name 
 PASS getElementsByTagName('*') 
 PASS Matching the context object 
 Harness: the test ran to completion.
diff --git a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/case-expected.txt b/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/case-expected.txt
deleted file mode 100644
index c4535c31..0000000
--- a/third_party/WebKit/LayoutTests/external/wpt/dom/nodes/case-expected.txt
+++ /dev/null
@@ -1,289 +0,0 @@
-This is a testharness.js-based test.
-Found 285 tests; 280 PASS, 5 FAIL, 0 TIMEOUT, 0 NOTRUN.
-PASS createElement abc 
-PASS setAttribute abc 
-PASS getAttribute abc 
-FAIL getElementsByTagName a:abc assert_array_equals: lengths differ, expected 0 got 3
-PASS getElementsByTagName abc 
-PASS createElement Abc 
-PASS setAttribute Abc 
-PASS getAttribute Abc 
-FAIL getElementsByTagName a:Abc assert_array_equals: lengths differ, expected 0 got 3
-PASS getElementsByTagName Abc 
-PASS createElement ABC 
-PASS setAttribute ABC 
-PASS getAttribute ABC 
-FAIL getElementsByTagName a:ABC assert_array_equals: lengths differ, expected 0 got 3
-PASS getElementsByTagName ABC 
-PASS createElement ä 
-PASS setAttribute ä 
-PASS getAttribute ä 
-FAIL getElementsByTagName a:ä assert_array_equals: lengths differ, expected 0 got 3
-PASS getElementsByTagName ä 
-PASS createElement Ä 
-PASS setAttribute Ä 
-PASS getAttribute Ä 
-FAIL getElementsByTagName a:Ä assert_array_equals: lengths differ, expected 0 got 3
-PASS getElementsByTagName Ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,abc,abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,abc,abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,abc,abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,abc,Abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,abc,Abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,abc,Abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,abc,ABC 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,abc,ABC 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,abc,ABC 
-PASS createElementNS http://www.w3.org/1999/xhtml,abc,ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,abc,ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,abc,ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,abc,Ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,abc,Ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,abc,Ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,Abc,abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Abc,abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Abc,abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,Abc,Abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Abc,Abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Abc,Abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,Abc,ABC 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Abc,ABC 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Abc,ABC 
-PASS createElementNS http://www.w3.org/1999/xhtml,Abc,ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Abc,ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Abc,ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,Abc,Ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Abc,Ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Abc,Ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,ABC,abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ABC,abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ABC,abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,ABC,Abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ABC,Abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ABC,Abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,ABC,ABC 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ABC,ABC 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ABC,ABC 
-PASS createElementNS http://www.w3.org/1999/xhtml,ABC,ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ABC,ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ABC,ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,ABC,Ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ABC,Ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ABC,Ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,ä,abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ä,abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ä,abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,ä,Abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ä,Abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ä,Abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,ä,ABC 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ä,ABC 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ä,ABC 
-PASS createElementNS http://www.w3.org/1999/xhtml,ä,ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ä,ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ä,ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,ä,Ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,ä,Ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,ä,Ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,Ä,abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Ä,abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Ä,abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,Ä,Abc 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Ä,Abc 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Ä,Abc 
-PASS createElementNS http://www.w3.org/1999/xhtml,Ä,ABC 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Ä,ABC 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Ä,ABC 
-PASS createElementNS http://www.w3.org/1999/xhtml,Ä,ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Ä,ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Ä,ä 
-PASS createElementNS http://www.w3.org/1999/xhtml,Ä,Ä 
-PASS setAttributeNS http://www.w3.org/1999/xhtml,Ä,Ä 
-PASS getAttributeNS http://www.w3.org/1999/xhtml,Ä,Ä 
-PASS createElementNS http://www.w3.org/2000/svg,abc,abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,abc,abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,abc,abc 
-PASS createElementNS http://www.w3.org/2000/svg,abc,Abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,abc,Abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,abc,Abc 
-PASS createElementNS http://www.w3.org/2000/svg,abc,ABC 
-PASS setAttributeNS http://www.w3.org/2000/svg,abc,ABC 
-PASS getAttributeNS http://www.w3.org/2000/svg,abc,ABC 
-PASS createElementNS http://www.w3.org/2000/svg,abc,ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,abc,ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,abc,ä 
-PASS createElementNS http://www.w3.org/2000/svg,abc,Ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,abc,Ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,abc,Ä 
-PASS createElementNS http://www.w3.org/2000/svg,Abc,abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,Abc,abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,Abc,abc 
-PASS createElementNS http://www.w3.org/2000/svg,Abc,Abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,Abc,Abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,Abc,Abc 
-PASS createElementNS http://www.w3.org/2000/svg,Abc,ABC 
-PASS setAttributeNS http://www.w3.org/2000/svg,Abc,ABC 
-PASS getAttributeNS http://www.w3.org/2000/svg,Abc,ABC 
-PASS createElementNS http://www.w3.org/2000/svg,Abc,ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,Abc,ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,Abc,ä 
-PASS createElementNS http://www.w3.org/2000/svg,Abc,Ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,Abc,Ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,Abc,Ä 
-PASS createElementNS http://www.w3.org/2000/svg,ABC,abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,ABC,abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,ABC,abc 
-PASS createElementNS http://www.w3.org/2000/svg,ABC,Abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,ABC,Abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,ABC,Abc 
-PASS createElementNS http://www.w3.org/2000/svg,ABC,ABC 
-PASS setAttributeNS http://www.w3.org/2000/svg,ABC,ABC 
-PASS getAttributeNS http://www.w3.org/2000/svg,ABC,ABC 
-PASS createElementNS http://www.w3.org/2000/svg,ABC,ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,ABC,ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,ABC,ä 
-PASS createElementNS http://www.w3.org/2000/svg,ABC,Ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,ABC,Ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,ABC,Ä 
-PASS createElementNS http://www.w3.org/2000/svg,ä,abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,ä,abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,ä,abc 
-PASS createElementNS http://www.w3.org/2000/svg,ä,Abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,ä,Abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,ä,Abc 
-PASS createElementNS http://www.w3.org/2000/svg,ä,ABC 
-PASS setAttributeNS http://www.w3.org/2000/svg,ä,ABC 
-PASS getAttributeNS http://www.w3.org/2000/svg,ä,ABC 
-PASS createElementNS http://www.w3.org/2000/svg,ä,ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,ä,ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,ä,ä 
-PASS createElementNS http://www.w3.org/2000/svg,ä,Ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,ä,Ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,ä,Ä 
-PASS createElementNS http://www.w3.org/2000/svg,Ä,abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,Ä,abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,Ä,abc 
-PASS createElementNS http://www.w3.org/2000/svg,Ä,Abc 
-PASS setAttributeNS http://www.w3.org/2000/svg,Ä,Abc 
-PASS getAttributeNS http://www.w3.org/2000/svg,Ä,Abc 
-PASS createElementNS http://www.w3.org/2000/svg,Ä,ABC 
-PASS setAttributeNS http://www.w3.org/2000/svg,Ä,ABC 
-PASS getAttributeNS http://www.w3.org/2000/svg,Ä,ABC 
-PASS createElementNS http://www.w3.org/2000/svg,Ä,ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,Ä,ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,Ä,ä 
-PASS createElementNS http://www.w3.org/2000/svg,Ä,Ä 
-PASS setAttributeNS http://www.w3.org/2000/svg,Ä,Ä 
-PASS getAttributeNS http://www.w3.org/2000/svg,Ä,Ä 
-PASS createElementNS http://FOO,abc,abc 
-PASS setAttributeNS http://FOO,abc,abc 
-PASS getAttributeNS http://FOO,abc,abc 
-PASS createElementNS http://FOO,abc,Abc 
-PASS setAttributeNS http://FOO,abc,Abc 
-PASS getAttributeNS http://FOO,abc,Abc 
-PASS createElementNS http://FOO,abc,ABC 
-PASS setAttributeNS http://FOO,abc,ABC 
-PASS getAttributeNS http://FOO,abc,ABC 
-PASS createElementNS http://FOO,abc,ä 
-PASS setAttributeNS http://FOO,abc,ä 
-PASS getAttributeNS http://FOO,abc,ä 
-PASS createElementNS http://FOO,abc,Ä 
-PASS setAttributeNS http://FOO,abc,Ä 
-PASS getAttributeNS http://FOO,abc,Ä 
-PASS createElementNS http://FOO,Abc,abc 
-PASS setAttributeNS http://FOO,Abc,abc 
-PASS getAttributeNS http://FOO,Abc,abc 
-PASS createElementNS http://FOO,Abc,Abc 
-PASS setAttributeNS http://FOO,Abc,Abc 
-PASS getAttributeNS http://FOO,Abc,Abc 
-PASS createElementNS http://FOO,Abc,ABC 
-PASS setAttributeNS http://FOO,Abc,ABC 
-PASS getAttributeNS http://FOO,Abc,ABC 
-PASS createElementNS http://FOO,Abc,ä 
-PASS setAttributeNS http://FOO,Abc,ä 
-PASS getAttributeNS http://FOO,Abc,ä 
-PASS createElementNS http://FOO,Abc,Ä 
-PASS setAttributeNS http://FOO,Abc,Ä 
-PASS getAttributeNS http://FOO,Abc,Ä 
-PASS createElementNS http://FOO,ABC,abc 
-PASS setAttributeNS http://FOO,ABC,abc 
-PASS getAttributeNS http://FOO,ABC,abc 
-PASS createElementNS http://FOO,ABC,Abc 
-PASS setAttributeNS http://FOO,ABC,Abc 
-PASS getAttributeNS http://FOO,ABC,Abc 
-PASS createElementNS http://FOO,ABC,ABC 
-PASS setAttributeNS http://FOO,ABC,ABC 
-PASS getAttributeNS http://FOO,ABC,ABC 
-PASS createElementNS http://FOO,ABC,ä 
-PASS setAttributeNS http://FOO,ABC,ä 
-PASS getAttributeNS http://FOO,ABC,ä 
-PASS createElementNS http://FOO,ABC,Ä 
-PASS setAttributeNS http://FOO,ABC,Ä 
-PASS getAttributeNS http://FOO,ABC,Ä 
-PASS createElementNS http://FOO,ä,abc 
-PASS setAttributeNS http://FOO,ä,abc 
-PASS getAttributeNS http://FOO,ä,abc 
-PASS createElementNS http://FOO,ä,Abc 
-PASS setAttributeNS http://FOO,ä,Abc 
-PASS getAttributeNS http://FOO,ä,Abc 
-PASS createElementNS http://FOO,ä,ABC 
-PASS setAttributeNS http://FOO,ä,ABC 
-PASS getAttributeNS http://FOO,ä,ABC 
-PASS createElementNS http://FOO,ä,ä 
-PASS setAttributeNS http://FOO,ä,ä 
-PASS getAttributeNS http://FOO,ä,ä 
-PASS createElementNS http://FOO,ä,Ä 
-PASS setAttributeNS http://FOO,ä,Ä 
-PASS getAttributeNS http://FOO,ä,Ä 
-PASS createElementNS http://FOO,Ä,abc 
-PASS setAttributeNS http://FOO,Ä,abc 
-PASS getAttributeNS http://FOO,Ä,abc 
-PASS createElementNS http://FOO,Ä,Abc 
-PASS setAttributeNS http://FOO,Ä,Abc 
-PASS getAttributeNS http://FOO,Ä,Abc 
-PASS createElementNS http://FOO,Ä,ABC 
-PASS setAttributeNS http://FOO,Ä,ABC 
-PASS getAttributeNS http://FOO,Ä,ABC 
-PASS createElementNS http://FOO,Ä,ä 
-PASS setAttributeNS http://FOO,Ä,ä 
-PASS getAttributeNS http://FOO,Ä,ä 
-PASS createElementNS http://FOO,Ä,Ä 
-PASS setAttributeNS http://FOO,Ä,Ä 
-PASS getAttributeNS http://FOO,Ä,Ä 
-PASS getElementsByTagNameNS ,abc 
-PASS getElementsByTagNameNS ,Abc 
-PASS getElementsByTagNameNS ,ABC 
-PASS getElementsByTagNameNS ,ä 
-PASS getElementsByTagNameNS ,Ä 
-PASS getElementsByTagNameNS http://www.w3.org/1999/xhtml,abc 
-PASS getElementsByTagNameNS http://www.w3.org/1999/xhtml,Abc 
-PASS getElementsByTagNameNS http://www.w3.org/1999/xhtml,ABC 
-PASS getElementsByTagNameNS http://www.w3.org/1999/xhtml,ä 
-PASS getElementsByTagNameNS http://www.w3.org/1999/xhtml,Ä 
-PASS getElementsByTagNameNS http://www.w3.org/2000/svg,abc 
-PASS getElementsByTagNameNS http://www.w3.org/2000/svg,Abc 
-PASS getElementsByTagNameNS http://www.w3.org/2000/svg,ABC 
-PASS getElementsByTagNameNS http://www.w3.org/2000/svg,ä 
-PASS getElementsByTagNameNS http://www.w3.org/2000/svg,Ä 
-PASS getElementsByTagNameNS http://FOO,abc 
-PASS getElementsByTagNameNS http://FOO,Abc 
-PASS getElementsByTagNameNS http://FOO,ABC 
-PASS getElementsByTagNameNS http://FOO,ä 
-PASS getElementsByTagNameNS http://FOO,Ä 
-PASS createElementNS abc 
-PASS setAttributeNS abc 
-PASS getAttributeNS abc 
-PASS createElementNS Abc 
-PASS setAttributeNS Abc 
-PASS getAttributeNS Abc 
-PASS createElementNS ABC 
-PASS setAttributeNS ABC 
-PASS getAttributeNS ABC 
-PASS createElementNS ä 
-PASS setAttributeNS ä 
-PASS getAttributeNS ä 
-PASS createElementNS Ä 
-PASS setAttributeNS Ä 
-PASS getAttributeNS Ä 
-Harness: the test ran to completion.
-
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.cpp b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
index 6553bbdf..3831b25 100644
--- a/third_party/WebKit/Source/core/dom/ContainerNode.cpp
+++ b/third_party/WebKit/Source/core/dom/ContainerNode.cpp
@@ -1457,23 +1457,24 @@
   }
 }
 
-TagCollection* ContainerNode::getElementsByTagName(
-    const AtomicString& local_name) {
-  if (GetDocument().IsHTMLDocument())
+HTMLCollection* ContainerNode::getElementsByTagName(
+    const AtomicString& qualified_name) {
+  DCHECK(!qualified_name.IsNull());
+
+  if (GetDocument().IsHTMLDocument()) {
     return EnsureCachedCollection<HTMLTagCollection>(kHTMLTagCollectionType,
-                                                     local_name);
-  return EnsureCachedCollection<TagCollection>(kTagCollectionType, local_name);
+                                                     qualified_name);
+  }
+  return EnsureCachedCollection<TagCollection>(kTagCollectionType,
+                                               qualified_name);
 }
 
-TagCollection* ContainerNode::getElementsByTagNameNS(
+HTMLCollection* ContainerNode::getElementsByTagNameNS(
     const AtomicString& namespace_uri,
     const AtomicString& local_name) {
-  if (namespace_uri == g_star_atom)
-    return getElementsByTagName(local_name);
-
-  return EnsureCachedCollection<TagCollection>(
-      kTagCollectionType, namespace_uri.IsEmpty() ? g_null_atom : namespace_uri,
-      local_name);
+  return EnsureCachedCollection<TagCollectionNS>(
+      kTagCollectionNSType,
+      namespace_uri.IsEmpty() ? g_null_atom : namespace_uri, local_name);
 }
 
 // Takes an AtomicString in argument because it is common for elements to share
diff --git a/third_party/WebKit/Source/core/dom/ContainerNode.h b/third_party/WebKit/Source/core/dom/ContainerNode.h
index 2372f2ce..7fb310b 100644
--- a/third_party/WebKit/Source/core/dom/ContainerNode.h
+++ b/third_party/WebKit/Source/core/dom/ContainerNode.h
@@ -42,7 +42,6 @@
 class NameNodeList;
 using StaticElementList = StaticNodeTypeList<Element>;
 class RadioNodeList;
-class TagCollection;
 
 enum DynamicRestyleFlags {
   kChildrenOrSiblingsAffectedByFocus = 1 << 0,
@@ -120,9 +119,9 @@
   Node* AppendChild(Node* new_child, ExceptionState& = ASSERT_NO_EXCEPTION);
 
   Element* getElementById(const AtomicString& id) const;
-  TagCollection* getElementsByTagName(const AtomicString&);
-  TagCollection* getElementsByTagNameNS(const AtomicString& namespace_uri,
-                                        const AtomicString& local_name);
+  HTMLCollection* getElementsByTagName(const AtomicString&);
+  HTMLCollection* getElementsByTagNameNS(const AtomicString& namespace_uri,
+                                         const AtomicString& local_name);
   NameNodeList* getElementsByName(const AtomicString& element_name);
   ClassCollection* getElementsByClassName(const AtomicString& class_names);
   RadioNodeList* GetRadioNodeList(const AtomicString&,
diff --git a/third_party/WebKit/Source/core/dom/NodeListsNodeData.cpp b/third_party/WebKit/Source/core/dom/NodeListsNodeData.cpp
index 1e7cc5b..9a484a1 100644
--- a/third_party/WebKit/Source/core/dom/NodeListsNodeData.cpp
+++ b/third_party/WebKit/Source/core/dom/NodeListsNodeData.cpp
@@ -41,14 +41,14 @@
   if (attr_name)
     return;
 
-  for (auto& cache : tag_collection_cache_ns_)
+  for (auto& cache : tag_collection_ns_caches_)
     cache.value->InvalidateCache();
 }
 
 DEFINE_TRACE(NodeListsNodeData) {
   visitor->Trace(child_node_list_);
   visitor->Trace(atomic_name_caches_);
-  visitor->Trace(tag_collection_cache_ns_);
+  visitor->Trace(tag_collection_ns_caches_);
 }
 
 DEFINE_TRACE_WRAPPERS(NodeListsNodeData) {
@@ -62,7 +62,7 @@
           static_cast<const LiveNodeList*>(list.Get()));
     }
   }
-  for (const auto list : tag_collection_cache_ns_.Values()) {
+  for (const auto list : tag_collection_ns_caches_.Values()) {
     visitor->TraceWrappersWithManualWriteBarrier(list.Get());
   }
 }
diff --git a/third_party/WebKit/Source/core/dom/NodeListsNodeData.h b/third_party/WebKit/Source/core/dom/NodeListsNodeData.h
index eb942cd6..758d5add 100644
--- a/third_party/WebKit/Source/core/dom/NodeListsNodeData.h
+++ b/third_party/WebKit/Source/core/dom/NodeListsNodeData.h
@@ -83,8 +83,8 @@
                       WeakMember<LiveNodeListBase>,
                       NodeListAtomicCacheMapEntryHash>
       NodeListAtomicNameCacheMap;
-  typedef HeapHashMap<QualifiedName, WeakMember<TagCollection>>
-      TagCollectionCacheNS;
+  typedef HeapHashMap<QualifiedName, WeakMember<TagCollectionNS>>
+      TagCollectionNSCache;
 
   template <typename T>
   T* AddCache(ContainerNode& node,
@@ -124,18 +124,18 @@
         atomic_name_caches_.at(NamedNodeListKey(collection_type, g_star_atom)));
   }
 
-  TagCollection* AddCache(ContainerNode& node,
-                          const AtomicString& namespace_uri,
-                          const AtomicString& local_name) {
+  TagCollectionNS* AddCache(ContainerNode& node,
+                            const AtomicString& namespace_uri,
+                            const AtomicString& local_name) {
     DCHECK(ThreadState::Current()->IsGCForbidden());
     QualifiedName name(g_null_atom, local_name, namespace_uri);
-    TagCollectionCacheNS::AddResult result =
-        tag_collection_cache_ns_.insert(name, nullptr);
+    TagCollectionNSCache::AddResult result =
+        tag_collection_ns_caches_.insert(name, nullptr);
     if (!result.is_new_entry)
       return result.stored_value->value;
 
-    TagCollection* list =
-        TagCollection::Create(node, namespace_uri, local_name);
+    TagCollectionNS* list =
+        TagCollectionNS::Create(node, namespace_uri, local_name);
     result.stored_value->value = list;
     ScriptWrappableVisitor::WriteBarrier(this, list);
     return list;
@@ -147,7 +147,7 @@
 
   bool IsEmpty() const {
     return !child_node_list_ && atomic_name_caches_.IsEmpty() &&
-           tag_collection_cache_ns_.IsEmpty();
+           tag_collection_ns_caches_.IsEmpty();
   }
 
   void AdoptTreeScope() { InvalidateCaches(); }
@@ -164,10 +164,10 @@
       list->DidMoveToDocument(old_document, new_document);
     }
 
-    TagCollectionCacheNS::const_iterator tag_end =
-        tag_collection_cache_ns_.end();
-    for (TagCollectionCacheNS::const_iterator it =
-             tag_collection_cache_ns_.begin();
+    TagCollectionNSCache::const_iterator tag_end =
+        tag_collection_ns_caches_.end();
+    for (TagCollectionNSCache::const_iterator it =
+             tag_collection_ns_caches_.begin();
          it != tag_end; ++it) {
       LiveNodeListBase* list = it->value;
       DCHECK(!list->IsRootedAtTreeScope());
@@ -193,7 +193,7 @@
   // Can be a ChildNodeList or an EmptyNodeList.
   WeakMember<NodeList> child_node_list_;
   NodeListAtomicNameCacheMap atomic_name_caches_;
-  TagCollectionCacheNS tag_collection_cache_ns_;
+  TagCollectionNSCache tag_collection_ns_caches_;
 };
 
 DEFINE_TRAIT_FOR_TRACE_WRAPPERS(NodeListsNodeData);
@@ -217,7 +217,7 @@
     CollectionType type,
     const AtomicString& namespace_uri,
     const AtomicString& local_name) {
-  DCHECK_EQ(type, kTagCollectionType);
+  DCHECK_EQ(type, kTagCollectionNSType);
   ThreadState::MainThreadGCForbiddenScope gc_forbidden;
   return EnsureNodeLists().AddCache(*this, namespace_uri, local_name);
 }
diff --git a/third_party/WebKit/Source/core/dom/TagCollection.cpp b/third_party/WebKit/Source/core/dom/TagCollection.cpp
index fb1ef54..e50e6fe 100644
--- a/third_party/WebKit/Source/core/dom/TagCollection.cpp
+++ b/third_party/WebKit/Source/core/dom/TagCollection.cpp
@@ -30,17 +30,32 @@
 
 TagCollection::TagCollection(ContainerNode& root_node,
                              CollectionType type,
-                             const AtomicString& namespace_uri,
-                             const AtomicString& local_name)
+                             const AtomicString& qualified_name)
+    : HTMLCollection(root_node, type, kDoesNotOverrideItemAfter),
+      qualified_name_(qualified_name) {}
+
+TagCollection::~TagCollection() {}
+
+bool TagCollection::ElementMatches(const Element& test_node) const {
+  if (qualified_name_ == g_star_atom)
+    return true;
+
+  return qualified_name_ == test_node.TagQName().ToString();
+}
+
+TagCollectionNS::TagCollectionNS(ContainerNode& root_node,
+                                 CollectionType type,
+                                 const AtomicString& namespace_uri,
+                                 const AtomicString& local_name)
     : HTMLCollection(root_node, type, kDoesNotOverrideItemAfter),
       namespace_uri_(namespace_uri),
       local_name_(local_name) {
   DCHECK(namespace_uri_.IsNull() || !namespace_uri_.IsEmpty());
 }
 
-TagCollection::~TagCollection() {}
+TagCollectionNS::~TagCollectionNS() {}
 
-bool TagCollection::ElementMatches(const Element& test_node) const {
+bool TagCollectionNS::ElementMatches(const Element& test_node) const {
   // Implements
   // https://dom.spec.whatwg.org/#concept-getelementsbytagnamens
   if (local_name_ != g_star_atom && local_name_ != test_node.localName())
diff --git a/third_party/WebKit/Source/core/dom/TagCollection.h b/third_party/WebKit/Source/core/dom/TagCollection.h
index d46f51b..b6ba81ffb 100644
--- a/third_party/WebKit/Source/core/dom/TagCollection.h
+++ b/third_party/WebKit/Source/core/dom/TagCollection.h
@@ -33,19 +33,10 @@
 class TagCollection : public HTMLCollection {
  public:
   static TagCollection* Create(ContainerNode& root_node,
-                               const AtomicString& namespace_uri,
-                               const AtomicString& local_name) {
-    DCHECK(namespace_uri != g_star_atom);
-    return new TagCollection(root_node, kTagCollectionType, namespace_uri,
-                             local_name);
-  }
-
-  static TagCollection* Create(ContainerNode& root_node,
                                CollectionType type,
-                               const AtomicString& local_name) {
+                               const AtomicString& qualified_name) {
     DCHECK_EQ(type, kTagCollectionType);
-    return new TagCollection(root_node, kTagCollectionType, g_star_atom,
-                             local_name);
+    return new TagCollection(root_node, kTagCollectionType, qualified_name);
   }
 
   ~TagCollection() override;
@@ -55,8 +46,29 @@
  protected:
   TagCollection(ContainerNode& root_node,
                 CollectionType,
-                const AtomicString& namespace_uri,
-                const AtomicString& local_name);
+                const AtomicString& qualified_name);
+
+  AtomicString qualified_name_;
+};
+
+class TagCollectionNS : public HTMLCollection {
+ public:
+  static TagCollectionNS* Create(ContainerNode& root_node,
+                                 const AtomicString& namespace_uri,
+                                 const AtomicString& local_name) {
+    return new TagCollectionNS(root_node, kTagCollectionNSType, namespace_uri,
+                               local_name);
+  }
+
+  ~TagCollectionNS() override;
+
+  bool ElementMatches(const Element&) const;
+
+ private:
+  TagCollectionNS(ContainerNode& root_node,
+                  CollectionType,
+                  const AtomicString& namespace_uri,
+                  const AtomicString& local_name);
 
   AtomicString namespace_uri_;
   AtomicString local_name_;
@@ -68,6 +80,12 @@
                   collection->GetType() == kTagCollectionType,
                   collection.GetType() == kTagCollectionType);
 
+DEFINE_TYPE_CASTS(TagCollectionNS,
+                  LiveNodeListBase,
+                  collection,
+                  collection->GetType() == kTagCollectionNSType,
+                  collection.GetType() == kTagCollectionNSType);
+
 }  // namespace blink
 
 #endif  // TagCollection_h
diff --git a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
index 4ad2ef1..ee655ceb 100644
--- a/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
+++ b/third_party/WebKit/Source/core/editing/InputMethodControllerTest.cpp
@@ -1408,16 +1408,12 @@
   ASSERT_EQ(1u, GetDocument().Markers().Markers().size());
 
   // Verify composition underline shows up on the second line, not the first
-  ASSERT_EQ(0u, GetDocument()
-                    .Markers()
-                    .MarkersInRange(PlainTextRange(0, 5).CreateRange(*div),
-                                    DocumentMarker::AllMarkers())
-                    .size());
-  ASSERT_EQ(1u, GetDocument()
-                    .Markers()
-                    .MarkersInRange(PlainTextRange(6, 11).CreateRange(*div),
-                                    DocumentMarker::AllMarkers())
-                    .size());
+  ASSERT_FALSE(GetDocument().Markers().MarkerAtPosition(
+      PlainTextRange(2).CreateRange(*div).StartPosition(),
+      DocumentMarker::AllMarkers()));
+  ASSERT_TRUE(GetDocument().Markers().MarkerAtPosition(
+      PlainTextRange(8).CreateRange(*div).StartPosition(),
+      DocumentMarker::AllMarkers()));
 
   // Verify marker has correct start/end offsets (measured from the beginning
   // of the node, which is the beginning of the line)
diff --git a/third_party/WebKit/Source/core/editing/SelectionController.cpp b/third_party/WebKit/Source/core/editing/SelectionController.cpp
index 6d9cacb4..444584d 100644
--- a/third_party/WebKit/Source/core/editing/SelectionController.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp
@@ -519,14 +519,14 @@
   if (pos.IsNotNull()) {
     const PositionInFlatTree& marker_position =
         pos.DeepEquivalent().ParentAnchoredEquivalent();
-    DocumentMarkerVector markers =
-        inner_node->GetDocument().Markers().MarkersInRange(
-            EphemeralRange(ToPositionInDOMTree(marker_position)),
+    const DocumentMarker* const marker =
+        inner_node->GetDocument().Markers().MarkerAtPosition(
+            ToPositionInDOMTree(marker_position),
             DocumentMarker::MisspellingMarkers());
-    if (markers.size() == 1) {
+    if (marker) {
       Node* container_node = marker_position.ComputeContainerNode();
-      const PositionInFlatTree start(container_node, markers[0]->StartOffset());
-      const PositionInFlatTree end(container_node, markers[0]->EndOffset());
+      const PositionInFlatTree start(container_node, marker->StartOffset());
+      const PositionInFlatTree end(container_node, marker->EndOffset());
       new_selection = CreateVisibleSelection(
           SelectionInFlatTree::Builder().Collapse(start).Extend(end).Build());
     }
@@ -1018,13 +1018,10 @@
       inner_node->GetLayoutObject()->PositionForPoint(result.LocalPoint()));
   if (pos.IsNull())
     return false;
-  return inner_node->GetDocument()
-             .Markers()
-             .MarkersInRange(
-                 EphemeralRange(
-                     pos.DeepEquivalent().ParentAnchoredEquivalent()),
-                 DocumentMarker::MisspellingMarkers())
-             .size() > 0;
+  const Position& marker_position =
+      pos.DeepEquivalent().ParentAnchoredEquivalent();
+  return inner_node->GetDocument().Markers().MarkerAtPosition(
+      marker_position, DocumentMarker::MisspellingMarkers());
 }
 
 void SelectionController::SendContextMenuEvent(
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
index 8caa09c..54dee492 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.cpp
@@ -327,6 +327,23 @@
   }
 }
 
+DocumentMarker* DocumentMarkerController::MarkerAtPosition(
+    const Position& position,
+    DocumentMarker::MarkerTypes marker_types) {
+  if (!PossiblyHasMarkers(marker_types))
+    return nullptr;
+  Node* const node = position.ComputeContainerNode();
+  const unsigned offset =
+      static_cast<unsigned>(position.ComputeOffsetInContainerNode());
+
+  const auto& markers = MarkersFor(node, marker_types);
+  const auto& it =
+      std::find_if(markers.begin(), markers.end(), [=](DocumentMarker* marker) {
+        return marker->StartOffset() < offset && offset < marker->EndOffset();
+      });
+  return it == markers.end() ? nullptr : *it;
+}
+
 DocumentMarkerVector DocumentMarkerController::MarkersFor(
     Node* node,
     DocumentMarker::MarkerTypes marker_types) {
@@ -371,37 +388,6 @@
   return result;
 }
 
-DocumentMarkerVector DocumentMarkerController::MarkersInRange(
-    const EphemeralRange& range,
-    DocumentMarker::MarkerTypes marker_types) {
-  if (!PossiblyHasMarkers(marker_types))
-    return DocumentMarkerVector();
-
-  DocumentMarkerVector found_markers;
-
-  Node* start_container = range.StartPosition().ComputeContainerNode();
-  DCHECK(start_container);
-  unsigned start_offset = static_cast<unsigned>(
-      range.StartPosition().ComputeOffsetInContainerNode());
-  Node* end_container = range.EndPosition().ComputeContainerNode();
-  DCHECK(end_container);
-  unsigned end_offset =
-      static_cast<unsigned>(range.EndPosition().ComputeOffsetInContainerNode());
-
-  for (Node& node : range.Nodes()) {
-    for (DocumentMarker* marker : MarkersFor(&node)) {
-      if (!marker_types.Contains(marker->GetType()))
-        continue;
-      if (node == start_container && marker->EndOffset() <= start_offset)
-        continue;
-      if (node == end_container && marker->StartOffset() >= end_offset)
-        continue;
-      found_markers.push_back(marker);
-    }
-  }
-  return found_markers;
-}
-
 Vector<IntRect> DocumentMarkerController::RenderedRectsForMarkers(
     DocumentMarker::MarkerType marker_type) {
   Vector<IntRect> result;
diff --git a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h
index e367111..4bcc38db 100644
--- a/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h
+++ b/third_party/WebKit/Source/core/editing/markers/DocumentMarkerController.h
@@ -86,11 +86,13 @@
                         bool);
   bool HasMarkers(Node* node) const { return markers_.Contains(node); }
 
+  // Returns a marker of one of the specified types that includes the specified
+  // Position in its interior (not at an endpoint), if one exists.
+  DocumentMarker* MarkerAtPosition(const Position&,
+                                   DocumentMarker::MarkerTypes);
   DocumentMarkerVector MarkersFor(
       Node*,
       DocumentMarker::MarkerTypes = DocumentMarker::AllMarkers());
-  DocumentMarkerVector MarkersInRange(const EphemeralRange&,
-                                      DocumentMarker::MarkerTypes);
   DocumentMarkerVector Markers();
   Vector<IntRect> RenderedRectsForMarkers(DocumentMarker::MarkerType);
   void UpdateMarkerRenderedRectIfNeeded(const Node&, RenderedDocumentMarker&);
diff --git a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
index 71a48a56..bd6fad96 100644
--- a/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
+++ b/third_party/WebKit/Source/core/editing/spellcheck/SpellChecker.cpp
@@ -802,17 +802,39 @@
                                    .ToNormalizedEphemeralRange();
   if (caret_range.IsNull())
     return;
-  DocumentMarkerVector markers =
-      GetFrame().GetDocument()->Markers().MarkersInRange(
-          caret_range, DocumentMarker::MisspellingMarkers());
-  if (markers.size() < 1 ||
-      markers[0]->StartOffset() >= markers[0]->EndOffset())
+
+  Node* const caret_start_container =
+      caret_range.StartPosition().ComputeContainerNode();
+  Node* const caret_end_container =
+      caret_range.EndPosition().ComputeContainerNode();
+
+  // We don't currently support the case where a misspelling spans multiple
+  // nodes
+  if (caret_start_container != caret_end_container)
     return;
+
+  const unsigned caret_start_offset =
+      caret_range.StartPosition().ComputeOffsetInContainerNode();
+  const unsigned caret_end_offset =
+      caret_range.EndPosition().ComputeOffsetInContainerNode();
+
+  const DocumentMarkerVector& markers_in_node =
+      GetFrame().GetDocument()->Markers().MarkersFor(
+          caret_start_container, DocumentMarker::MisspellingMarkers());
+
+  const auto marker_it =
+      std::find_if(markers_in_node.begin(), markers_in_node.end(),
+                   [=](const DocumentMarker* marker) {
+                     return marker->StartOffset() < caret_end_offset &&
+                            marker->EndOffset() > caret_start_offset;
+                   });
+  if (marker_it == markers_in_node.end())
+    return;
+
+  const DocumentMarker* found_marker = *marker_it;
   EphemeralRange marker_range = EphemeralRange(
-      Position(caret_range.StartPosition().ComputeContainerNode(),
-               markers[0]->StartOffset()),
-      Position(caret_range.EndPosition().ComputeContainerNode(),
-               markers[0]->EndOffset()));
+      Position(caret_start_container, found_marker->StartOffset()),
+      Position(caret_start_container, found_marker->EndOffset()));
   if (marker_range.IsNull())
     return;
 
diff --git a/third_party/WebKit/Source/core/html/CollectionType.h b/third_party/WebKit/Source/core/html/CollectionType.h
index 62f8af7..6e679e1 100644
--- a/third_party/WebKit/Source/core/html/CollectionType.h
+++ b/third_party/WebKit/Source/core/html/CollectionType.h
@@ -57,6 +57,7 @@
   kClassCollectionType,
   kTagCollectionType,
   kHTMLTagCollectionType,
+  kTagCollectionNSType,
 
   // Live NodeList.
   kNameNodeListType,
diff --git a/third_party/WebKit/Source/core/html/HTMLCollection.cpp b/third_party/WebKit/Source/core/html/HTMLCollection.cpp
index 07c45002..4f509ba 100644
--- a/third_party/WebKit/Source/core/html/HTMLCollection.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLCollection.cpp
@@ -46,6 +46,7 @@
   switch (type) {
     case kClassCollectionType:
     case kTagCollectionType:
+    case kTagCollectionNSType:
     case kHTMLTagCollectionType:
     case kDocAll:
     case kDocAnchors:
@@ -95,6 +96,7 @@
       return NodeListRootType::kTreeScope;
     case kClassCollectionType:
     case kTagCollectionType:
+    case kTagCollectionNSType:
     case kHTMLTagCollectionType:
     case kNodeChildren:
     case kTableTBodies:
@@ -125,6 +127,7 @@
     CollectionType type) {
   switch (type) {
     case kTagCollectionType:
+    case kTagCollectionNSType:
     case kHTMLTagCollectionType:
     case kDocImages:
     case kDocEmbeds:
@@ -244,6 +247,7 @@
       return isHTMLObjectElement(element) || IsHTMLFormControlElement(element);
     case kClassCollectionType:
     case kTagCollectionType:
+    case kTagCollectionNSType:
     case kHTMLTagCollectionType:
     case kDocAll:
     case kNodeChildren:
@@ -270,6 +274,8 @@
       return ToTagCollection(*this).ElementMatches(element);
     case kHTMLTagCollectionType:
       return ToHTMLTagCollection(*this).ElementMatches(element);
+    case kTagCollectionNSType:
+      return ToTagCollectionNS(*this).ElementMatches(element);
     case kWindowNamedItems:
       return ToWindowNameCollection(*this).ElementMatches(element);
     default:
diff --git a/third_party/WebKit/Source/core/html/HTMLTagCollection.cpp b/third_party/WebKit/Source/core/html/HTMLTagCollection.cpp
index c0011d0..5c814539f5 100644
--- a/third_party/WebKit/Source/core/html/HTMLTagCollection.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLTagCollection.cpp
@@ -27,9 +27,9 @@
 namespace blink {
 
 HTMLTagCollection::HTMLTagCollection(ContainerNode& root_node,
-                                     const AtomicString& local_name)
-    : TagCollection(root_node, kHTMLTagCollectionType, g_star_atom, local_name),
-      lowered_local_name_(local_name.LowerASCII()) {
+                                     const AtomicString& qualified_name)
+    : TagCollection(root_node, kHTMLTagCollectionType, qualified_name),
+      lowered_qualified_name_(qualified_name.LowerASCII()) {
   DCHECK(root_node.GetDocument().IsHTMLDocument());
 }
 
diff --git a/third_party/WebKit/Source/core/html/HTMLTagCollection.h b/third_party/WebKit/Source/core/html/HTMLTagCollection.h
index 3c493ad..045aaf48 100644
--- a/third_party/WebKit/Source/core/html/HTMLTagCollection.h
+++ b/third_party/WebKit/Source/core/html/HTMLTagCollection.h
@@ -36,17 +36,18 @@
  public:
   static HTMLTagCollection* Create(ContainerNode& root_node,
                                    CollectionType type,
-                                   const AtomicString& local_name) {
+                                   const AtomicString& qualified_name) {
     DCHECK_EQ(type, kHTMLTagCollectionType);
-    return new HTMLTagCollection(root_node, local_name);
+    return new HTMLTagCollection(root_node, qualified_name);
   }
 
   bool ElementMatches(const Element&) const;
 
  private:
-  HTMLTagCollection(ContainerNode& root_node, const AtomicString& local_name);
+  HTMLTagCollection(ContainerNode& root_node,
+                    const AtomicString& qualified_name);
 
-  AtomicString lowered_local_name_;
+  AtomicString lowered_qualified_name_;
 };
 
 DEFINE_TYPE_CASTS(HTMLTagCollection,
@@ -57,16 +58,11 @@
 
 inline bool HTMLTagCollection::ElementMatches(
     const Element& test_element) const {
-  // Implements
-  // https://dom.spec.whatwg.org/#concept-getelementsbytagname
-  if (local_name_ != g_star_atom) {
-    const AtomicString& local_name =
-        test_element.IsHTMLElement() ? lowered_local_name_ : local_name_;
-    if (local_name != test_element.localName())
-      return false;
-  }
-  DCHECK_EQ(namespace_uri_, g_star_atom);
-  return true;
+  if (qualified_name_ == g_star_atom)
+    return true;
+  if (test_element.IsHTMLElement())
+    return lowered_qualified_name_ == test_element.TagQName().ToString();
+  return qualified_name_ == test_element.TagQName().ToString();
 }
 
 }  // namespace blink
diff --git a/third_party/WebKit/Source/core/paint/BoxPainter.cpp b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
index 372f96c..4ec4a3c 100644
--- a/third_party/WebKit/Source/core/paint/BoxPainter.cpp
+++ b/third_party/WebKit/Source/core/paint/BoxPainter.cpp
@@ -277,18 +277,17 @@
 
 namespace {
 
-FloatRoundedRect GetBackgroundRoundedRect(const LayoutObject& obj,
+FloatRoundedRect GetBackgroundRoundedRect(const ComputedStyle& style,
                                           const LayoutRect& border_rect,
-                                          const InlineFlowBox* box,
-                                          LayoutUnit inline_box_width,
-                                          LayoutUnit inline_box_height,
+                                          bool has_line_box_sibling,
+                                          const LayoutSize& inline_box_size,
                                           bool include_logical_left_edge,
                                           bool include_logical_right_edge) {
-  FloatRoundedRect border = obj.Style()->GetRoundedBorderFor(
+  FloatRoundedRect border = style.GetRoundedBorderFor(
       border_rect, include_logical_left_edge, include_logical_right_edge);
-  if (box && (box->NextLineBox() || box->PrevLineBox())) {
-    FloatRoundedRect segment_border = obj.Style()->GetRoundedBorderFor(
-        LayoutRect(0, 0, inline_box_width.ToInt(), inline_box_height.ToInt()),
+  if (has_line_box_sibling) {
+    FloatRoundedRect segment_border = style.GetRoundedBorderFor(
+        LayoutRect(LayoutPoint(), LayoutSize(FlooredIntSize(inline_box_size))),
         include_logical_left_edge, include_logical_right_edge);
     border.SetRadii(segment_border.GetRadii());
   }
@@ -296,10 +295,10 @@
 }
 
 FloatRoundedRect BackgroundRoundedRectAdjustedForBleedAvoidance(
-    const LayoutObject& obj,
+    const ComputedStyle& style,
     const LayoutRect& border_rect,
     BackgroundBleedAvoidance bleed_avoidance,
-    const InlineFlowBox* box,
+    bool has_line_box_sibling,
     const LayoutSize& box_size,
     bool include_logical_left_edge,
     bool include_logical_right_edge) {
@@ -311,8 +310,8 @@
     // BoxBorderInfo or BoxDecorationData and avoid calling getBorderEdgeInfo
     // redundantly here.
     BorderEdge edges[4];
-    obj.Style()->GetBorderEdgeInfo(edges, include_logical_left_edge,
-                                   include_logical_right_edge);
+    style.GetBorderEdgeInfo(edges, include_logical_left_edge,
+                            include_logical_right_edge);
 
     // Use the most conservative inset to avoid mixed-style corner issues.
     float fractional_inset = 1.0f / 2;
@@ -329,7 +328,7 @@
                             -fractional_inset * edges[kBSLeft].Width());
 
     FloatRoundedRect background_rounded_rect = GetBackgroundRoundedRect(
-        obj, border_rect, box, box_size.Width(), box_size.Height(),
+        style, border_rect, has_line_box_sibling, box_size,
         include_logical_left_edge, include_logical_right_edge);
     FloatRect inset_rect(background_rounded_rect.Rect());
     inset_rect.Expand(insets);
@@ -339,8 +338,8 @@
     return FloatRoundedRect(inset_rect, inset_radii);
   }
 
-  return GetBackgroundRoundedRect(obj, border_rect, box, box_size.Width(),
-                                  box_size.Height(), include_logical_left_edge,
+  return GetBackgroundRoundedRect(style, border_rect, has_line_box_sibling,
+                                  box_size, include_logical_left_edge,
                                   include_logical_right_edge);
 }
 
@@ -467,7 +466,7 @@
                                  const FillLayer& layer,
                                  const LayoutRect& rect,
                                  BackgroundBleedAvoidance bleed_avoidance,
-                                 const InlineFlowBox* box,
+                                 bool has_line_box_sibling,
                                  const LayoutSize& box_size,
                                  SkBlendMode op,
                                  const LayoutObject* background_object,
@@ -522,8 +521,8 @@
   FloatRoundedRect border =
       info.is_rounded_fill
           ? BackgroundRoundedRectAdjustedForBleedAvoidance(
-                obj, rect, bleed_avoidance, box, box_size,
-                info.include_left_edge, info.include_right_edge)
+                obj.StyleRef(), rect, bleed_avoidance, has_line_box_sibling,
+                box_size, info.include_left_edge, info.include_right_edge)
           : FloatRoundedRect(PixelSnappedIntRect(rect));
 
   Optional<RoundedInnerRectClipper> clipper;
@@ -584,10 +583,11 @@
                            obj.HasOverflowClip(), color, bg_layer,
                            bleed_avoidance, box);
   Optional<BackgroundImageGeometry> geometry;
+  bool has_line_box_sibling = box && (box->NextLineBox() || box->PrevLineBox());
 
   // Fast path for drawing simple color backgrounds.
   if (PaintFastBottomLayer(obj, paint_info, info, bg_layer, rect,
-                           bleed_avoidance, box, box_size, op,
+                           bleed_avoidance, has_line_box_sibling, box_size, op,
                            background_object, geometry)) {
     return;
   }
@@ -597,10 +597,10 @@
     FloatRoundedRect border =
         info.is_border_fill
             ? BackgroundRoundedRectAdjustedForBleedAvoidance(
-                  obj, rect, bleed_avoidance, box, box_size,
-                  info.include_left_edge, info.include_right_edge)
+                  obj.StyleRef(), rect, bleed_avoidance, has_line_box_sibling,
+                  box_size, info.include_left_edge, info.include_right_edge)
             : GetBackgroundRoundedRect(
-                  obj, rect, box, box_size.Width(), box_size.Height(),
+                  obj.StyleRef(), rect, has_line_box_sibling, box_size,
                   info.include_left_edge, info.include_right_edge);
 
     // Clip to the padding or content boxes as necessary.
diff --git a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
index 44b0de5c..8654ed99 100644
--- a/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
+++ b/third_party/WebKit/Source/web/ContextMenuClientImpl.cpp
@@ -111,23 +111,49 @@
     return String();
 
   // Caret and range selections always return valid normalized ranges.
-  Range* selection_range = CreateRange(selection.ToNormalizedEphemeralRange());
-  DocumentMarkerVector markers =
-      selected_frame->GetDocument()->Markers().MarkersInRange(
-          EphemeralRange(selection_range),
-          DocumentMarker::MisspellingMarkers());
-  if (markers.size() != 1)
-    return String();
-  description = markers[0]->Description();
+  const EphemeralRange& selection_range =
+      selection.ToNormalizedEphemeralRange();
 
-  // Cloning a range fails only for invalid ranges.
-  Range* marker_range = selection_range->cloneRange();
-  marker_range->setStart(marker_range->startContainer(),
-                         markers[0]->StartOffset());
-  marker_range->setEnd(marker_range->endContainer(), markers[0]->EndOffset());
+  Node* const selection_start_container =
+      selection_range.StartPosition().ComputeContainerNode();
+  Node* const selection_end_container =
+      selection_range.EndPosition().ComputeContainerNode();
+
+  // We don't currently support the case where a misspelling spans multiple
+  // nodes
+  if (selection_start_container != selection_end_container)
+    return String();
+
+  const unsigned selection_start_offset =
+      selection_range.StartPosition().ComputeOffsetInContainerNode();
+  const unsigned selection_end_offset =
+      selection_range.EndPosition().ComputeOffsetInContainerNode();
+
+  const DocumentMarkerVector& markers_in_node =
+      selected_frame->GetDocument()->Markers().MarkersFor(
+          selection_start_container, DocumentMarker::MisspellingMarkers());
+
+  const auto marker_it =
+      std::find_if(markers_in_node.begin(), markers_in_node.end(),
+                   [=](const DocumentMarker* marker) {
+                     return marker->StartOffset() < selection_end_offset &&
+                            marker->EndOffset() > selection_start_offset;
+                   });
+  if (marker_it == markers_in_node.end())
+    return String();
+
+  const DocumentMarker* const found_marker = *marker_it;
+  description = found_marker->Description();
+
+  Range* const marker_range =
+      Range::Create(*selected_frame->GetDocument(), selection_start_container,
+                    found_marker->StartOffset(), selection_start_container,
+                    found_marker->EndOffset());
 
   if (marker_range->GetText().StripWhiteSpace(&IsWhiteSpaceOrPunctuation) !=
-      selection_range->GetText().StripWhiteSpace(&IsWhiteSpaceOrPunctuation))
+      CreateRange(selection_range)
+          ->GetText()
+          .StripWhiteSpace(&IsWhiteSpaceOrPunctuation))
     return String();
 
   return marker_range->GetText();
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
index 3c25672..0cc7944 100644
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -321,6 +321,36 @@
                                         WebFrame* parent,
                                         WebFrame* new_child);
 
+  int NumMarkersInRange(const Document* document,
+                        const EphemeralRange& range,
+                        DocumentMarker::MarkerTypes marker_types) {
+    Node* start_container = range.StartPosition().ComputeContainerNode();
+    unsigned start_offset = static_cast<unsigned>(
+        range.StartPosition().ComputeOffsetInContainerNode());
+
+    Node* end_container = range.EndPosition().ComputeContainerNode();
+    unsigned end_offset = static_cast<unsigned>(
+        range.EndPosition().ComputeOffsetInContainerNode());
+
+    int node_count = 0;
+    for (Node& node : range.Nodes()) {
+      const DocumentMarkerVector& markers_in_node =
+          document->Markers().MarkersFor(&node, marker_types);
+      node_count += std::count_if(
+          markers_in_node.begin(), markers_in_node.end(),
+          [start_offset, end_offset, &node, &start_container,
+           &end_container](const DocumentMarker* marker) {
+            if (node == start_container && marker->EndOffset() <= start_offset)
+              return false;
+            if (node == end_container && marker->StartOffset() >= end_offset)
+              return false;
+            return true;
+          });
+    }
+
+    return node_count;
+  }
+
   std::string base_url_;
   std::string not_base_url_;
   std::string chrome_url_;
@@ -6611,9 +6641,8 @@
           .ToNormalizedEphemeralRange();
 
   EXPECT_EQ(1, textcheck.NumberOfTimesChecked());
-  EXPECT_EQ(1U, document->Markers()
-                    .MarkersInRange(selection_range, DocumentMarker::kSpelling)
-                    .size());
+  EXPECT_EQ(1, NumMarkersInRange(document, selection_range,
+                                 DocumentMarker::kSpelling));
 
   frame->ReplaceMisspelledRange("welcome");
   EXPECT_EQ("_welcome_.",
@@ -6660,9 +6689,8 @@
           .ComputeVisibleSelectionInDOMTreeDeprecated()
           .ToNormalizedEphemeralRange();
 
-  EXPECT_EQ(0U, document->Markers()
-                    .MarkersInRange(selection_range, DocumentMarker::kSpelling)
-                    .size());
+  EXPECT_EQ(0, NumMarkersInRange(document, selection_range,
+                                 DocumentMarker::kSpelling));
 }
 
 static void GetSpellingMarkerOffsets(WebVector<unsigned>* offsets,
diff --git a/third_party/WebKit/Tools/Scripts/run-bindings-tests b/third_party/WebKit/Tools/Scripts/run-bindings-tests
index 249e5e41..2bcafb8 100755
--- a/third_party/WebKit/Tools/Scripts/run-bindings-tests
+++ b/third_party/WebKit/Tools/Scripts/run-bindings-tests
@@ -26,8 +26,8 @@
 import sys
 
 from webkitpy.bindings.bindings_tests import run_bindings_tests
-from webkitpy.common import webkit_finder
-webkit_finder.add_typ_dir_to_sys_path()
+from webkitpy.common import path_finder
+path_finder.add_typ_dir_to_sys_path()
 
 import typ
 
@@ -67,7 +67,7 @@
         return argument_parser.exit_status
 
     args = runner.args
-    args.top_level_dir = webkit_finder.get_bindings_scripts_dir()
+    args.top_level_dir = path_finder.get_bindings_scripts_dir()
     if not args.skip_unit_tests:
         return_code, _, _ = runner.run()
         if return_code != 0:
diff --git a/third_party/WebKit/Tools/Scripts/test-webkitpy b/third_party/WebKit/Tools/Scripts/test-webkitpy
index cb02d92a9..4edba76 100755
--- a/third_party/WebKit/Tools/Scripts/test-webkitpy
+++ b/third_party/WebKit/Tools/Scripts/test-webkitpy
@@ -31,8 +31,8 @@
 import os
 import sys
 
-from webkitpy.common import webkit_finder
-webkit_finder.add_typ_dir_to_sys_path()
+from webkitpy.common import path_finder
+path_finder.add_typ_dir_to_sys_path()
 
 import typ
 
@@ -49,7 +49,7 @@
         'webkitpy.layout_tests.layout_package.bot_test_expectations_unittest.*',
     ]
 
-sys.exit(typ.main(top_level_dir=webkit_finder.get_scripts_dir(),
+sys.exit(typ.main(top_level_dir=path_finder.get_scripts_dir(),
                   skip=skip,
-                  path=[webkit_finder.get_webkitpy_thirdparty_dir()],
+                  path=[path_finder.get_webkitpy_thirdparty_dir()],
                   win_multiprocessing='spawn'))
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/bindings/bindings_tests.py b/third_party/WebKit/Tools/Scripts/webkitpy/bindings/bindings_tests.py
index fd2acb94..5147f154 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/bindings/bindings_tests.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/bindings/bindings_tests.py
@@ -31,8 +31,8 @@
 
 from webkitpy.common.system.executive import Executive
 
-from webkitpy.common import webkit_finder
-webkit_finder.add_bindings_scripts_dir_to_sys_path()
+from webkitpy.common import path_finder
+path_finder.add_bindings_scripts_dir_to_sys_path()
 
 from code_generator_v8 import CodeGeneratorDictionaryImpl
 from code_generator_v8 import CodeGeneratorV8
@@ -77,7 +77,7 @@
 
 COMPONENT_DIRECTORY = frozenset(['core', 'modules'])
 
-SOURCE_PATH = webkit_finder.get_source_dir()
+SOURCE_PATH = path_finder.get_source_dir()
 TEST_INPUT_DIRECTORY = os.path.join(SOURCE_PATH, 'bindings', 'tests', 'idls')
 REFERENCE_DIRECTORY = os.path.join(SOURCE_PATH, 'bindings', 'tests', 'results')
 
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 f7f142ba..e227e05 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
@@ -30,7 +30,7 @@
 
 from webkitpy.common.checkout.baseline_optimizer import BaselineOptimizer
 from webkitpy.common.host_mock import MockHost
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 
 
 class BaselineOptimizerTest(unittest.TestCase):
@@ -38,7 +38,7 @@
     def _assert_optimization(self, results_by_directory, directory_to_new_results, baseline_dirname='', host=None):
         host = host or MockHost()
         fs = host.filesystem
-        layout_tests_dir = WebKitFinder(fs).layout_tests_dir()
+        layout_tests_dir = PathFinder(fs).layout_tests_dir()
         baseline_name = 'mock-baseline-expected.txt'
         fs.write_text_file(
             fs.join(layout_tests_dir, 'VirtualTestSuites'),
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/host_mock.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/host_mock.py
index 97dd87e25..7189529f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/host_mock.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/host_mock.py
@@ -30,8 +30,8 @@
 from webkitpy.common.checkout.git_mock import MockGit
 from webkitpy.common.net.buildbot_mock import MockBuildBot
 from webkitpy.common.net.web_mock import MockWeb
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.common.system.system_host_mock import MockSystemHost
-from webkitpy.common.webkit_finder import WebKitFinder
 
 # New-style ports need to move down into webkitpy.common.
 from webkitpy.layout_tests.builder_list import BuilderList
@@ -78,9 +78,9 @@
         return self._git
 
     def _add_base_manifest_to_mock_filesystem(self, filesystem):
-        webkit_finder = WebKitFinder(filesystem)
+        path_finder = PathFinder(filesystem)
 
-        external_dir = webkit_finder.path_from_layout_tests('external')
+        external_dir = path_finder.path_from_layout_tests('external')
         filesystem.maybe_make_directory(filesystem.join(external_dir, 'wpt'))
 
         manifest_base_path = filesystem.join(external_dir, 'WPT_BASE_MANIFEST.json')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/webkit_finder.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/path_finder.py
similarity index 99%
rename from third_party/WebKit/Tools/Scripts/webkitpy/common/webkit_finder.py
rename to third_party/WebKit/Tools/Scripts/webkitpy/common/path_finder.py
index aedec30..efdda32f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/webkit_finder.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/path_finder.py
@@ -73,7 +73,7 @@
     return os.path.join(get_scripts_dir(), 'webkitpy', 'thirdparty')
 
 
-class WebKitFinder(object):
+class PathFinder(object):
 
     def __init__(self, filesystem):
         self._filesystem = filesystem
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/common/webkit_finder_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/common/path_finder_unittest.py
similarity index 72%
rename from third_party/WebKit/Tools/Scripts/webkitpy/common/webkit_finder_unittest.py
rename to third_party/WebKit/Tools/Scripts/webkitpy/common/path_finder_unittest.py
index 8ccc9243..84e804f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/common/webkit_finder_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/common/path_finder_unittest.py
@@ -4,36 +4,36 @@
 
 import unittest
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.common.system.filesystem_mock import MockFileSystem
 
 
-class TestWebKitFinder(unittest.TestCase):
+class TestPathFinder(unittest.TestCase):
 
-    # TODO(qyearsley): Add tests for other methods in WebKitFinder.
+    # TODO(qyearsley): Add tests for other methods in PathFinder.
     # Including tests for cases when the separator character is backslash.
 
     def test_layout_test_name(self):
-        finder = WebKitFinder(MockFileSystem())
+        finder = PathFinder(MockFileSystem())
         self.assertEqual(
             finder.layout_test_name('third_party/WebKit/LayoutTests/test/name.html'),
             'test/name.html')
 
     def test_layout_test_name_not_in_layout_tests_dir(self):
-        finder = WebKitFinder(MockFileSystem())
+        finder = PathFinder(MockFileSystem())
         self.assertIsNone(finder.layout_test_name('some/other/path/file.html'))
 
     # pylint: disable=protected-access
     def test_webkit_base(self):
-        finder = WebKitFinder(MockFileSystem())
+        finder = PathFinder(MockFileSystem())
         self.assertEqual(finder._webkit_base(), '/mock-checkout/third_party/WebKit')
 
     def test_chromium_base(self):
-        finder = WebKitFinder(MockFileSystem())
+        finder = PathFinder(MockFileSystem())
         self.assertEqual(finder.chromium_base(), '/mock-checkout')
 
     def test_path_from_chromium_base(self):
-        finder = WebKitFinder(MockFileSystem())
+        finder = PathFinder(MockFileSystem())
         self.assertEqual(
             finder.path_from_chromium_base('foo', 'bar.baz'),
             '/mock-checkout/foo/bar.baz')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/bisect_test_ordering.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/bisect_test_ordering.py
index 7920da4..591deb084 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/bisect_test_ordering.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/bisect_test_ordering.py
@@ -31,9 +31,9 @@
 import subprocess
 import sys
 
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.common.system.executive import Executive
 from webkitpy.common.system.filesystem import FileSystem
-from webkitpy.common.webkit_finder import WebKitFinder
 
 _log = logging.getLogger(__name__)
 
@@ -54,7 +54,7 @@
         self.tests = tests
         self.expected_failure = tests[-1]
         self.is_debug = is_debug
-        self.webkit_finder = WebKitFinder(FileSystem())
+        self.path_finder = PathFinder(FileSystem())
 
     def bisect(self):
         if self.test_fails_in_isolation():
@@ -145,7 +145,7 @@
 
     def test_fails(self, tests):
         extra_args = ['--debug'] if self.is_debug else []
-        path_to_run_webkit_tests = self.webkit_finder.path_from_tools_scripts('run-webkit-tests')
+        path_to_run_webkit_tests = self.path_finder.path_from_tools_scripts('run-webkit-tests')
         output = self.executive.popen(
             [path_to_run_webkit_tests, '--child-processes', '1', '--order', 'none', '--no-retry',
              '--no-show-results', '--verbose'] + extra_args + tests, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/breakpad/dump_reader_multipart.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/breakpad/dump_reader_multipart.py
index c84f2e5..6b50247f 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/breakpad/dump_reader_multipart.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/breakpad/dump_reader_multipart.py
@@ -31,7 +31,7 @@
 import threading
 import Queue
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.breakpad.dump_reader import DumpReader
 
 
@@ -43,7 +43,7 @@
 
     def __init__(self, host, build_dir):
         super(DumpReaderMultipart, self).__init__(host, build_dir)
-        self._webkit_finder = WebKitFinder(host.filesystem)
+        self._path_finder = PathFinder(host.filesystem)
         self._breakpad_tools_available = None
         self._generated_symbols = False
 
@@ -119,7 +119,7 @@
         return self._host.filesystem.join(self._build_dir, 'minidump_stackwalk')
 
     def _path_to_generate_breakpad_symbols(self):
-        return self._webkit_finder.path_from_chromium_base(
+        return self._path_finder.path_from_chromium_base(
             'components', 'crash', 'content', 'tools', 'generate_breakpad_symbols.py')
 
     def _symbols_dir(self):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
index 74547b9..73b4185 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/controllers/manager.py
@@ -45,7 +45,7 @@
 
 from webkitpy.common import exit_codes
 from webkitpy.common.net.file_uploader import FileUploader
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.controllers.layout_test_finder import LayoutTestFinder
 from webkitpy.layout_tests.controllers.layout_test_runner import LayoutTestRunner
 from webkitpy.layout_tests.controllers.test_result_writer import TestResultWriter
@@ -91,7 +91,7 @@
 
         self._results_directory = self._port.results_directory()
         self._finder = LayoutTestFinder(self._port, self._options)
-        self._webkit_finder = WebKitFinder(port.host.filesystem)
+        self._path_finder = PathFinder(port.host.filesystem)
         self._runner = LayoutTestRunner(self._options, self._port, self._printer, self._results_directory, self._test_is_slow)
 
     def run(self, args):
@@ -541,7 +541,7 @@
             _log.error("Upload failed: %s", err)
 
     def _copy_results_html_file(self, destination_path):
-        base_dir = self._webkit_finder.path_from_layout_tests('fast', 'harness')
+        base_dir = self._path_finder.path_from_layout_tests('fast', 'harness')
         results_file = self._filesystem.join(base_dir, 'results.html')
         # Note that the results.html template file won't exist when we're using a MockFileSystem during unit tests,
         # so make sure it exists before we try to copy it.
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
index 8328a63..567c80e 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/models/test_expectations.py
@@ -33,7 +33,7 @@
 import logging
 import re
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.models.test_configuration import TestConfigurationConverter
 
 _log = logging.getLogger(__name__)
@@ -1096,7 +1096,7 @@
         return REBASELINE in self._model.get_expectations(test)
 
     def _shorten_filename(self, filename):
-        finder = WebKitFinder(self._port.host.filesystem)
+        finder = PathFinder(self._port.host.filesystem)
         if filename.startswith(finder.path_from_chromium_base()):
             return self._port.host.filesystem.relpath(filename, finder.path_from_chromium_base())
         return filename
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 bd16f41..7d09d3e 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
@@ -46,9 +46,9 @@
 from webkitpy.common import find_files
 from webkitpy.common import read_checksum_from_png
 from webkitpy.common.memoized import memoized
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.common.system.executive import ScriptError
 from webkitpy.common.system.path import abspath_to_uri
-from webkitpy.common.webkit_finder import WebKitFinder
 from webkitpy.layout_tests.layout_package.bot_test_expectations import BotTestExpectationsFactory
 from webkitpy.layout_tests.models import test_run_results
 from webkitpy.layout_tests.models.test_configuration import TestConfiguration
@@ -167,7 +167,7 @@
         self.host = host
         self._executive = host.executive
         self._filesystem = host.filesystem
-        self._webkit_finder = WebKitFinder(host.filesystem)
+        self._path_finder = PathFinder(host.filesystem)
 
         self._http_server = None
         self._websocket_server = None
@@ -178,7 +178,7 @@
         self._dump_reader = None
 
         # FIXME: prettypatch.py knows this path; it should not be copied here.
-        self._pretty_patch_path = self._webkit_finder.path_from_tools_scripts('webkitruby', 'PrettyPatch', 'prettify.rb')
+        self._pretty_patch_path = self._path_finder.path_from_tools_scripts('webkitruby', 'PrettyPatch', 'prettify.rb')
         self._pretty_patch_available = None
 
         if not hasattr(options, 'configuration') or not options.configuration:
@@ -873,16 +873,16 @@
     # TODO(qyearsley): Update callers to create a finder and call it instead
     # of these next two routines (which should be protected).
     def path_from_chromium_base(self, *comps):
-        return self._webkit_finder.path_from_chromium_base(*comps)
+        return self._path_finder.path_from_chromium_base(*comps)
 
     def perf_tests_dir(self):
-        return self._webkit_finder.perf_tests_dir()
+        return self._path_finder.perf_tests_dir()
 
     def layout_tests_dir(self):
         custom_layout_tests_dir = self.get_option('layout_tests_directory')
         if custom_layout_tests_dir:
             return custom_layout_tests_dir
-        return self._webkit_finder.layout_tests_dir()
+        return self._path_finder.layout_tests_dir()
 
     def skipped_layout_tests(self, _):
         # TODO(qyearsley): Remove this method.
@@ -988,7 +988,7 @@
 
         Ports may legitimately return absolute paths here if no relative path
         makes sense.
-        TODO(qyearsley): De-duplicate this and WebKitFinder.layout_test_name.
+        TODO(qyearsley): De-duplicate this and PathFinder.layout_test_name.
         """
         # Ports that run on windows need to override this method to deal with
         # filenames with backslashes in them.
@@ -1022,7 +1022,7 @@
         return self._build_path('resources', 'inspector')
 
     def apache_config_directory(self):
-        return self._webkit_finder.path_from_tools_scripts('apache_config')
+        return self._path_finder.path_from_tools_scripts('apache_config')
 
     def default_results_directory(self):
         """Returns the absolute path to the default place to store the test results."""
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory.py
index 56a2d63..cdbc1e10 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory.py
@@ -32,7 +32,7 @@
 import optparse
 import re
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 
 
 class PortFactory(object):
@@ -168,7 +168,7 @@
     build_directory = getattr(options, 'build_directory', None) or 'out'
 
     target = options.target
-    finder = WebKitFinder(fs)
+    finder = PathFinder(fs)
     path = fs.join(finder.chromium_base(), build_directory, target, 'args.gn')
     if not fs.exists(path):
         path = fs.join(finder.chromium_base(), build_directory, target, 'toolchain.ninja')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
index 51ffc07..f1eb93e6 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/port/factory_unittest.py
@@ -30,7 +30,7 @@
 import unittest
 
 from webkitpy.common.host_mock import MockHost
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.port import android
 from webkitpy.layout_tests.port import factory
 from webkitpy.layout_tests.port import linux
@@ -80,10 +80,10 @@
 
     def get_port(self, target=None, configuration=None, files=None):
         host = MockHost()
-        wkf = WebKitFinder(host.filesystem)
+        finder = PathFinder(host.filesystem)
         files = files or {}
         for path, contents in files.items():
-            host.filesystem.write_text_file(wkf.path_from_chromium_base(path), contents)
+            host.filesystem.write_text_file(finder.path_from_chromium_base(path), contents)
         options = optparse.Values({'target': target, 'configuration': configuration})
         return factory.PortFactory(host).get(options=options)
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/pywebsocket.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/pywebsocket.py
index 69e1fe0..380d1f68 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/pywebsocket.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/pywebsocket.py
@@ -32,7 +32,7 @@
 import sys
 import time
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.servers import server_base
 
 
@@ -56,7 +56,7 @@
         time_str = time.strftime('%d%b%Y-%H%M%S')
         log_file_name = _WS_LOG_PREFIX + time_str
         self._error_log = self._filesystem.join(self._output_dir, log_file_name + '-err.txt')
-        pywebsocket_base = WebKitFinder(self._filesystem).path_from_tools_scripts('webkitpy', 'thirdparty')
+        pywebsocket_base = PathFinder(self._filesystem).path_from_tools_scripts('webkitpy', 'thirdparty')
         pywebsocket_script = self._filesystem.join(pywebsocket_base, 'mod_pywebsocket', 'standalone.py')
 
         self._start_cmd = [
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/wptserve.py b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/wptserve.py
index e77cca1..776171c 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/wptserve.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/layout_tests/servers/wptserve.py
@@ -7,7 +7,7 @@
 import datetime
 import logging
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.servers import server_base
 
 
@@ -33,7 +33,7 @@
         fs = self._filesystem
         self._pid_file = fs.join(self._runtime_path, '%s.pid' % self._name)
 
-        finder = WebKitFinder(fs)
+        finder = PathFinder(fs)
         path_to_thirdparty = finder.path_from_tools_scripts('webkitpy', 'thirdparty')
         path_to_wpt_support = finder.path_from_tools_scripts('webkitpy', 'thirdparty', 'wpt')
         path_to_wpt_root = fs.join(path_to_wpt_support, 'wpt')
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/python.py b/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/python.py
index 5f78cca..092e8b2 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/python.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/style/checkers/python.py
@@ -27,9 +27,9 @@
 import sys
 
 
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.common.system.filesystem import FileSystem
 from webkitpy.common.system.executive import Executive
-from webkitpy.common.webkit_finder import WebKitFinder
 from webkitpy.thirdparty import pep8
 
 
@@ -72,23 +72,23 @@
             self._handle_style_error(line_number, category, 5, message)
 
     def run_pylint(self, path):
-        wkf = WebKitFinder(FileSystem())
+        finder = PathFinder(FileSystem())
         executive = Executive()
         env = os.environ.copy()
         env['PYTHONPATH'] = os.pathsep.join([
-            wkf.path_from_tools_scripts(),
-            wkf.path_from_blink_source('build', 'scripts'),
-            wkf.path_from_tools_scripts('webkitpy', 'thirdparty'),
-            wkf.path_from_blink_source('bindings', 'scripts'),
-            wkf.path_from_chromium_base('build', 'android'),
-            wkf.path_from_chromium_base('third_party', 'catapult', 'devil'),
-            wkf.path_from_chromium_base('third_party', 'pymock'),
+            finder.path_from_tools_scripts(),
+            finder.path_from_blink_source('build', 'scripts'),
+            finder.path_from_tools_scripts('webkitpy', 'thirdparty'),
+            finder.path_from_blink_source('bindings', 'scripts'),
+            finder.path_from_chromium_base('build', 'android'),
+            finder.path_from_chromium_base('third_party', 'catapult', 'devil'),
+            finder.path_from_chromium_base('third_party', 'pymock'),
         ])
         return executive.run_command([
             sys.executable,
-            wkf.path_from_depot_tools_base('pylint.py'),
+            finder.path_from_depot_tools_base('pylint.py'),
             '--output-format=parseable',
-            '--rcfile=' + wkf.path_from_tools_scripts('webkitpy', 'pylintrc'),
+            '--rcfile=' + finder.path_from_tools_scripts('webkitpy', 'pylintrc'),
             path,
         ], env=env, error_handler=executive.ignore_error)
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/tool/servers/layout_tests_server.py b/third_party/WebKit/Tools/Scripts/webkitpy/tool/servers/layout_tests_server.py
index 77007531..ac1d754 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/tool/servers/layout_tests_server.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/tool/servers/layout_tests_server.py
@@ -33,7 +33,7 @@
 import subprocess
 from subprocess import STDOUT
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.common.system.filesystem import FileSystem
 from webkitpy.tool.servers.reflection_handler import ReflectionHandler
 
@@ -54,8 +54,8 @@
         for each in json_data['tests']:
             test_list += each + ' '
         filesystem = FileSystem()
-        webkit_finder = WebKitFinder(filesystem)
-        script_dir = webkit_finder.path_from_tools_scripts()
+        path_finder = PathFinder(filesystem)
+        script_dir = path_finder.path_from_tools_scripts()
         executable_path = script_dir + '/run-webkit-tests'
         cmd = 'python ' + executable_path + ' --no-show-results '
         cmd += test_list
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/chromium_finder.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/chromium_finder.py
index 5320390..83ff00cd 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/chromium_finder.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/chromium_finder.py
@@ -3,16 +3,16 @@
 # found in the LICENSE file.
 
 from webkitpy.common.memoized import memoized
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 
 
 @memoized
 def absolute_chromium_wpt_dir(host):
-    finder = WebKitFinder(host.filesystem)
+    finder = PathFinder(host.filesystem)
     return finder.path_from_layout_tests('external', 'wpt')
 
 
 @memoized
 def absolute_chromium_dir(host):
-    finder = WebKitFinder(host.filesystem)
+    finder = PathFinder(host.filesystem)
     return finder.chromium_base()
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common.py
index 17751ff..d6cbf3a 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/common.py
@@ -18,7 +18,7 @@
 WPT_REVISION_FOOTER = 'WPT-Export-Revision:'
 
 # TODO(qyearsley): This directory should be able to be constructed with
-# WebKitFinder and WPT_DEST_NAME, plus the string "external".
+# PathFinder and WPT_DEST_NAME, plus the string "external".
 CHROMIUM_WPT_DIR = 'third_party/WebKit/LayoutTests/external/wpt/'
 
 # Our mirrors of the official wpt repo, which we pull from.
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py
index 3da67383..bd2db91 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/directory_owners_extractor.py
@@ -5,15 +5,15 @@
 import collections
 import re
 
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.common.system.filesystem import FileSystem
-from webkitpy.common.webkit_finder import WebKitFinder
 
 
 class DirectoryOwnersExtractor(object):
 
     def __init__(self, filesystem=None):
         self.filesystem = filesystem or FileSystem
-        self.finder = WebKitFinder(filesystem)
+        self.finder = PathFinder(filesystem)
         self.owner_map = None
 
     def read_owner_map(self):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_copier.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_copier.py
index 4cbfd76..a9d84ee 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_copier.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_copier.py
@@ -34,7 +34,7 @@
 import logging
 import mimetypes
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.models.test_expectations import TestExpectationParser
 
 _log = logging.getLogger(__name__)
@@ -59,8 +59,8 @@
         self.dest_dir_name = dest_dir_name
 
         self.filesystem = self.host.filesystem
-        self.webkit_finder = WebKitFinder(self.filesystem)
-        self.layout_tests_dir = self.webkit_finder.layout_tests_dir()
+        self.path_finder = PathFinder(self.filesystem)
+        self.layout_tests_dir = self.path_finder.layout_tests_dir()
         self.destination_directory = self.filesystem.normpath(
             self.filesystem.join(
                 self.layout_tests_dir,
@@ -141,7 +141,7 @@
     def find_paths_to_skip(self):
         paths_to_skip = set()
         port = self.host.port_factory.get()
-        w3c_import_expectations_path = self.webkit_finder.path_from_layout_tests('W3CImportExpectations')
+        w3c_import_expectations_path = self.path_finder.path_from_layout_tests('W3CImportExpectations')
         w3c_import_expectations = self.filesystem.read_text_file(w3c_import_expectations_path)
         parser = TestExpectationParser(port, all_tests=(), is_lint_mode=False)
         expectation_lines = parser.parse(w3c_import_expectations_path, w3c_import_expectations)
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
index 7d122ae..993de8f6 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/test_importer.py
@@ -19,8 +19,8 @@
 import logging
 
 from webkitpy.common.net.git_cl import GitCL
-from webkitpy.common.webkit_finder import WebKitFinder
 from webkitpy.common.net.buildbot import current_build_link
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.models.test_expectations import TestExpectations, TestExpectationParser
 from webkitpy.layout_tests.port.base import Port
 from webkitpy.w3c.common import WPT_REPO_URL, WPT_DEST_NAME, exportable_commits_since
@@ -43,7 +43,7 @@
         self.host = host
         self.executive = host.executive
         self.fs = host.filesystem
-        self.finder = WebKitFinder(self.fs)
+        self.finder = PathFinder(self.fs)
         self.verbose = False
         self.git_cl = None
 
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_expectations_updater.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_expectations_updater.py
index d5d9bbc..bac29bc 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_expectations_updater.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_expectations_updater.py
@@ -15,7 +15,7 @@
 
 from webkitpy.common.memoized import memoized
 from webkitpy.common.net.git_cl import GitCL
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 from webkitpy.layout_tests.models.test_expectations import TestExpectationLine, TestExpectations
 from webkitpy.w3c.wpt_manifest import WPTManifest
 
@@ -29,7 +29,7 @@
     def __init__(self, host):
         self.host = host
         self.port = self.host.port_factory.get()
-        self.finder = WebKitFinder(self.host.filesystem)
+        self.finder = PathFinder(self.host.filesystem)
         self.port = self.host.port_factory.get()
 
     def run(self, args=None):
diff --git a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_manifest.py b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_manifest.py
index e5863a0..05cee668 100644
--- a/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_manifest.py
+++ b/third_party/WebKit/Tools/Scripts/webkitpy/w3c/wpt_manifest.py
@@ -12,7 +12,7 @@
 import json
 import logging
 
-from webkitpy.common.webkit_finder import WebKitFinder
+from webkitpy.common.path_finder import PathFinder
 
 _log = logging.getLogger(__file__)
 
@@ -90,7 +90,7 @@
     @staticmethod
     def ensure_manifest(host):
         """Checks whether the manifest exists, and then generates it if necessary."""
-        finder = WebKitFinder(host.filesystem)
+        finder = PathFinder(host.filesystem)
         manifest_path = finder.path_from_layout_tests('external', 'wpt', 'MANIFEST.json')
         base_manifest_path = finder.path_from_layout_tests('external', 'WPT_BASE_MANIFEST.json')
 
@@ -112,7 +112,7 @@
     def generate_manifest(host, dest_path):
         """Generates MANIFEST.json on the specified directory."""
         executive = host.executive
-        finder = WebKitFinder(host.filesystem)
+        finder = PathFinder(host.filesystem)
         manifest_exec_path = finder.path_from_tools_scripts('webkitpy', 'thirdparty', 'wpt', 'wpt', 'manifest')
 
         cmd = ['python', manifest_exec_path, '--work', '--tests-root', dest_path]