diff --git a/android_webview/BUILD.gn b/android_webview/BUILD.gn
index 765eb5a3cabf6..e26b366cc3369 100644
--- a/android_webview/BUILD.gn
+++ b/android_webview/BUILD.gn
@@ -582,7 +582,6 @@ source_set("common") {
     "//components/cdm/renderer",
     "//components/crash/content/app",
     "//components/crash/content/browser",
-    "//components/devtools_discovery",
     "//components/metrics",
     "//components/metrics:gpu",
     "//components/metrics:net",
diff --git a/android_webview/DEPS b/android_webview/DEPS
index d65dcad0ac6ce..63f5faad22854 100644
--- a/android_webview/DEPS
+++ b/android_webview/DEPS
@@ -7,7 +7,6 @@ include_rules = [
   # lib is the top-level target, and must remain a leaf in the dependency tree.
   "-android_webview/lib",
 
-  "+components/devtools_discovery",
   "+components/metrics",
   "+components/prefs",
   "+components/version_info",
diff --git a/android_webview/android_webview.gyp b/android_webview/android_webview.gyp
index a829f51985a86..13d9047cbb795 100644
--- a/android_webview/android_webview.gyp
+++ b/android_webview/android_webview.gyp
@@ -232,7 +232,6 @@
         '../components/components.gyp:cdm_renderer',
         '../components/components.gyp:component_metrics_proto',
         '../components/components.gyp:crash_component',
-        '../components/components.gyp:devtools_discovery',
         '../components/components.gyp:metrics',
         '../components/components.gyp:metrics_gpu',
         '../components/components.gyp:metrics_net',
diff --git a/android_webview/browser/aw_dev_tools_discovery_provider.cc b/android_webview/browser/aw_dev_tools_discovery_provider.cc
index 6e2fb5bb87f7e..d29be3f856cbd 100644
--- a/android_webview/browser/aw_dev_tools_discovery_provider.cc
+++ b/android_webview/browser/aw_dev_tools_discovery_provider.cc
@@ -10,7 +10,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/web_contents.h"
 
@@ -39,26 +38,7 @@ std::string GetViewDescription(WebContents* web_contents) {
   return json;
 }
 
-}  // namespace
-
-namespace android_webview {
-
-// static
-void AwDevToolsDiscoveryProvider::Install() {
-  devtools_discovery::DevToolsDiscoveryManager* discovery_manager =
-      devtools_discovery::DevToolsDiscoveryManager::GetInstance();
-  discovery_manager->AddProvider(
-      base::WrapUnique(new AwDevToolsDiscoveryProvider()));
-}
-
-AwDevToolsDiscoveryProvider::AwDevToolsDiscoveryProvider() {
-}
-
-AwDevToolsDiscoveryProvider::~AwDevToolsDiscoveryProvider() {
-}
-
-content::DevToolsAgentHost::List
-AwDevToolsDiscoveryProvider::GetDescriptors() {
+content::DevToolsAgentHost::List GetDescriptors() {
   DevToolsAgentHost::List agent_hosts = DevToolsAgentHost::GetOrCreateAll();
   for (auto& agent_host : agent_hosts) {
     agent_host->SetDescriptionOverride(
@@ -67,4 +47,19 @@ AwDevToolsDiscoveryProvider::GetDescriptors() {
   return agent_hosts;
 }
 
+}  // namespace
+
+namespace android_webview {
+
+// static
+void AwDevToolsDiscoveryProvider::Install() {
+  content::DevToolsAgentHost::AddDiscoveryProvider(base::Bind(&GetDescriptors));
+}
+
+AwDevToolsDiscoveryProvider::AwDevToolsDiscoveryProvider() {
+}
+
+AwDevToolsDiscoveryProvider::~AwDevToolsDiscoveryProvider() {
+}
+
 }  // namespace android_webview
diff --git a/android_webview/browser/aw_dev_tools_discovery_provider.h b/android_webview/browser/aw_dev_tools_discovery_provider.h
index 7ad08df6b30a5..52aff5ae2221a 100644
--- a/android_webview/browser/aw_dev_tools_discovery_provider.h
+++ b/android_webview/browser/aw_dev_tools_discovery_provider.h
@@ -6,24 +6,17 @@
 #define ANDROID_WEBVIEW_BROWSER_AW_DEV_TOOLS_DISCOVERY_PROVIDER_H_
 
 #include "base/macros.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
 
 namespace android_webview {
 
-class AwDevToolsDiscoveryProvider :
-    public devtools_discovery::DevToolsDiscoveryManager::Provider {
+class AwDevToolsDiscoveryProvider {
  public:
   // Installs provider to devtools_discovery.
   static void Install();
 
-  ~AwDevToolsDiscoveryProvider() override;
-
-  // devtools_discovery::DevToolsDiscoveryManager::Provider implementation.
-  content::DevToolsAgentHost::List GetDescriptors() override;
-
  private:
   AwDevToolsDiscoveryProvider();
-
+  ~AwDevToolsDiscoveryProvider();
   DISALLOW_COPY_AND_ASSIGN(AwDevToolsDiscoveryProvider);
 };
 
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index bcba015becb19..47813be6fd5a6 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -124,7 +124,6 @@ split_static_library("browser") {
     "//components/data_use_measurement/content",
     "//components/data_use_measurement/core",
     "//components/device_event_log",
-    "//components/devtools_discovery",
     "//components/devtools_http_handler",
     "//components/dom_distiller/content/browser",
     "//components/domain_reliability",
diff --git a/chrome/browser/android/DEPS b/chrome/browser/android/DEPS
index c970c726ca777..52f533d815c08 100644
--- a/chrome/browser/android/DEPS
+++ b/chrome/browser/android/DEPS
@@ -2,7 +2,6 @@ include_rules = [
   "+blimp/client/public",
   "-components/devtools_bridge",
   "+cc/layers/layer.h",
-  "+components/devtools_discovery",
   "+components/devtools_http_handler",
   "+components/ntp_snippets",
   "+components/spellcheck/browser",
diff --git a/chrome/browser/android/dev_tools_discovery_provider_android.h b/chrome/browser/android/dev_tools_discovery_provider_android.h
deleted file mode 100644
index 1d3aae665f031..0000000000000
--- a/chrome/browser/android/dev_tools_discovery_provider_android.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_ANDROID_DEV_TOOLS_DISCOVERY_PROVIDER_ANDROID_H_
-#define CHROME_BROWSER_ANDROID_DEV_TOOLS_DISCOVERY_PROVIDER_ANDROID_H_
-
-#include "base/macros.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
-
-class DevToolsDiscoveryProviderAndroid :
-    public devtools_discovery::DevToolsDiscoveryManager::Provider {
- public:
-  // Installs provider to devtools_discovery.
-  static void Install();
-
-  ~DevToolsDiscoveryProviderAndroid() override;
-
-  // devtools_discovery::DevToolsDiscoveryManager::Provider implementation.
-  content::DevToolsAgentHost::List GetDescriptors() override;
-
- private:
-  DevToolsDiscoveryProviderAndroid();
-
-  DISALLOW_COPY_AND_ASSIGN(DevToolsDiscoveryProviderAndroid);
-};
-
-#endif  // CHROME_BROWSER_ANDROID_DEV_TOOLS_DISCOVERY_PROVIDER_ANDROID_H_
diff --git a/chrome/browser/android/dev_tools_discovery_provider_android.cc b/chrome/browser/android/devtools_manager_delegate_android.cc
similarity index 72%
rename from chrome/browser/android/dev_tools_discovery_provider_android.cc
rename to chrome/browser/android/devtools_manager_delegate_android.cc
index 906c52d46123e..051817fc56e30 100644
--- a/chrome/browser/android/dev_tools_discovery_provider_android.cc
+++ b/chrome/browser/android/devtools_manager_delegate_android.cc
@@ -2,25 +2,21 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/android/dev_tools_discovery_provider_android.h"
+#include "chrome/browser/android/devtools_manager_delegate_android.h"
 
 #include "base/bind.h"
-#include "base/compiler_specific.h"
-#include "base/macros.h"
-#include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
+#include "build/build_config.h"
 #include "chrome/browser/android/tab_android.h"
-#include "chrome/browser/browser_process.h"
+#include "chrome/browser/devtools/devtools_network_protocol_handler.h"
 #include "chrome/browser/ui/android/tab_model/tab_model.h"
 #include "chrome/browser/ui/android/tab_model/tab_model_list.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
+#include "chrome/common/features.h"
 #include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/devtools_agent_host_client.h"
 #include "content/public/browser/devtools_external_agent_proxy.h"
 #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
-#include "content/public/browser/favicon_status.h"
-#include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/web_contents.h"
 
 using content::DevToolsAgentHost;
@@ -157,41 +153,13 @@ class TabProxyDelegate : public content::DevToolsExternalAgentProxyDelegate,
   const int tab_id_;
   const std::string title_;
   const GURL url_;
-  scoped_refptr<content::DevToolsAgentHost> agent_host_;
+  scoped_refptr<DevToolsAgentHost> agent_host_;
   content::DevToolsExternalAgentProxy* proxy_;
   DISALLOW_COPY_AND_ASSIGN(TabProxyDelegate);
 };
 
-scoped_refptr<content::DevToolsAgentHost> CreateNewAndroidTab(const GURL& url) {
-  if (TabModelList::empty())
-    return nullptr;
-
-  TabModel* tab_model = TabModelList::get(0);
-  if (!tab_model)
-    return nullptr;
-
-  WebContents* web_contents = tab_model->CreateNewTabForDevTools(url);
-  if (!web_contents)
-    return nullptr;
-
-  TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
-  if (!tab)
-    return nullptr;
-
-  return content::DevToolsAgentHost::Create(new TabProxyDelegate(tab));
-}
-
-}  // namespace
-
-DevToolsDiscoveryProviderAndroid::DevToolsDiscoveryProviderAndroid() {
-}
-
-DevToolsDiscoveryProviderAndroid::~DevToolsDiscoveryProviderAndroid() {
-}
-
-content::DevToolsAgentHost::List
-DevToolsDiscoveryProviderAndroid::GetDescriptors() {
-  content::DevToolsAgentHost::List result;
+DevToolsAgentHost::List GetDescriptors() {
+  DevToolsAgentHost::List result;
 
   // Enumerate existing tabs, including the ones with no WebContents.
   std::set<WebContents*> tab_web_contents;
@@ -203,7 +171,7 @@ DevToolsDiscoveryProviderAndroid::GetDescriptors() {
       if (!tab)
         continue;
 
-      scoped_refptr<content::DevToolsAgentHost> host =
+      scoped_refptr<DevToolsAgentHost> host =
           DevToolsAgentHost::Create(new TabProxyDelegate(tab));
     }
   }
@@ -222,11 +190,67 @@ DevToolsDiscoveryProviderAndroid::GetDescriptors() {
   return result;
 }
 
-// static
-void DevToolsDiscoveryProviderAndroid::Install() {
-  devtools_discovery::DevToolsDiscoveryManager* discovery_manager =
-      devtools_discovery::DevToolsDiscoveryManager::GetInstance();
-  discovery_manager->AddProvider(
-      base::WrapUnique(new DevToolsDiscoveryProviderAndroid()));
-  discovery_manager->SetCreateCallback(base::Bind(&CreateNewAndroidTab));
+} //  namespace
+
+DevToolsManagerDelegateAndroid::DevToolsManagerDelegateAndroid()
+    : network_protocol_handler_(new DevToolsNetworkProtocolHandler()) {
+#if BUILDFLAG(ANDROID_JAVA_UI)
+  DevToolsAgentHost::AddDiscoveryProvider(base::Bind(&GetDescriptors));
+#endif  // BUILDFLAG(ANDROID_JAVA_UI)
+}
+
+DevToolsManagerDelegateAndroid::~DevToolsManagerDelegateAndroid() {
+}
+
+void DevToolsManagerDelegateAndroid::Inspect(
+    DevToolsAgentHost* agent_host) {
+}
+
+base::DictionaryValue* DevToolsManagerDelegateAndroid::HandleCommand(
+    DevToolsAgentHost* agent_host,
+    base::DictionaryValue* command_dict) {
+  return network_protocol_handler_->HandleCommand(agent_host, command_dict);
+}
+
+std::string DevToolsManagerDelegateAndroid::GetTargetType(
+    content::RenderFrameHost* host) {
+  content::WebContents* web_contents =
+      content::WebContents::FromRenderFrameHost(host);
+  TabAndroid* tab = web_contents ? TabAndroid::FromWebContents(web_contents)
+      : nullptr;
+  return tab ? DevToolsAgentHost::kTypePage :
+      DevToolsAgentHost::kTypeOther;
+}
+
+std::string DevToolsManagerDelegateAndroid::GetTargetTitle(
+    content::RenderFrameHost* host) {
+  content::WebContents* web_contents =
+      content::WebContents::FromRenderFrameHost(host);
+  TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
+  return tab ? base::UTF16ToUTF8(tab->GetTitle()) : "";
+}
+
+scoped_refptr<DevToolsAgentHost>
+DevToolsManagerDelegateAndroid::CreateNewTarget(const GURL& url) {
+  if (TabModelList::empty())
+    return nullptr;
+
+  TabModel* tab_model = TabModelList::get(0);
+  if (!tab_model)
+    return nullptr;
+
+  WebContents* web_contents = tab_model->CreateNewTabForDevTools(url);
+  if (!web_contents)
+    return nullptr;
+
+  TabAndroid* tab = TabAndroid::FromWebContents(web_contents);
+  if (!tab)
+    return nullptr;
+
+  return DevToolsAgentHost::Create(new TabProxyDelegate(tab));
+}
+
+void DevToolsManagerDelegateAndroid::DevToolsAgentStateChanged(
+    DevToolsAgentHost* agent_host, bool attached) {
+  network_protocol_handler_->DevToolsAgentStateChanged(agent_host, attached);
 }
diff --git a/chrome/browser/android/devtools_manager_delegate_android.h b/chrome/browser/android/devtools_manager_delegate_android.h
new file mode 100644
index 0000000000000..ee3f226b324e7
--- /dev/null
+++ b/chrome/browser/android/devtools_manager_delegate_android.h
@@ -0,0 +1,39 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ANDROID_DEVTOOLS_MANAGER_DELEGATE_ANDROID_H_
+#define CHROME_BROWSER_ANDROID_DEVTOOLS_MANAGER_DELEGATE_ANDROID_H_
+
+#include <memory>
+
+#include "base/compiler_specific.h"
+#include "base/macros.h"
+#include "content/public/browser/devtools_manager_delegate.h"
+
+class DevToolsNetworkProtocolHandler;
+
+class DevToolsManagerDelegateAndroid : public content::DevToolsManagerDelegate {
+ public:
+  DevToolsManagerDelegateAndroid();
+  ~DevToolsManagerDelegateAndroid() override;
+
+  // content::DevToolsManagerDelegate implementation.
+  void Inspect(content::DevToolsAgentHost* agent_host) override;
+  void DevToolsAgentStateChanged(content::DevToolsAgentHost* agent_host,
+                                 bool attached) override;
+  base::DictionaryValue* HandleCommand(
+      content::DevToolsAgentHost* agent_host,
+      base::DictionaryValue* command_dict) override;
+  std::string GetTargetType(content::RenderFrameHost* host) override;
+  std::string GetTargetTitle(content::RenderFrameHost* host) override;
+  scoped_refptr<content::DevToolsAgentHost> CreateNewTarget(
+      const GURL& url) override;
+
+ private:
+  std::unique_ptr<DevToolsNetworkProtocolHandler> network_protocol_handler_;
+
+  DISALLOW_COPY_AND_ASSIGN(DevToolsManagerDelegateAndroid);
+};
+
+#endif  // CHROME_BROWSER_ANDROID_DEVTOOLS_MANAGER_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/chrome_browser_main.cc b/chrome/browser/chrome_browser_main.cc
index 99aaf36c9200a..22325e778851c 100644
--- a/chrome/browser/chrome_browser_main.cc
+++ b/chrome/browser/chrome_browser_main.cc
@@ -175,12 +175,6 @@
 #include "ui/base/resource/resource_bundle.h"
 #include "ui/strings/grit/app_locale_settings.h"
 
-#if BUILDFLAG(ANDROID_JAVA_UI)
-#include "chrome/browser/android/dev_tools_discovery_provider_android.h"
-#else
-#include "chrome/browser/devtools/chrome_devtools_discovery_provider.h"
-#endif
-
 #if defined(OS_ANDROID)
 #include "chrome/browser/metrics/thread_watcher_android.h"
 #include "ui/base/resource/resource_bundle_android.h"
@@ -1429,13 +1423,6 @@ void ChromeBrowserMainParts::PreProfileInit() {
 
 void ChromeBrowserMainParts::PostProfileInit() {
   TRACE_EVENT0("startup", "ChromeBrowserMainParts::PostProfileInit");
-
-#if BUILDFLAG(ANDROID_JAVA_UI)
-  DevToolsDiscoveryProviderAndroid::Install();
-#else
-  ChromeDevToolsDiscoveryProvider::Install();
-#endif  // BUILDFLAG(ANDROID_JAVA_UI)
-
   LaunchDevToolsHandlerIfNeeded(parsed_command_line());
   if (parsed_command_line().HasSwitch(::switches::kAutoOpenDevToolsForTabs))
     g_browser_process->CreateDevToolsAutoOpener();
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index e8bec119b6c61..d5313df0c80f1 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -46,7 +46,6 @@
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
 #include "chrome/browser/defaults.h"
-#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
 #include "chrome/browser/download/download_prefs.h"
 #include "chrome/browser/engagement/site_engagement_eviction_policy.h"
 #include "chrome/browser/font_family_cache.h"
@@ -238,8 +237,11 @@
 #endif
 
 #if defined(OS_ANDROID)
+#include "chrome/browser/android/devtools_manager_delegate_android.h"
 #include "ui/base/ui_base_paths.h"
 #include "ui/gfx/android/device_display_info.h"
+#else
+#include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
 #endif
 
 #if defined(TOOLKIT_VIEWS)
@@ -3088,7 +3090,11 @@ ChromeContentBrowserClient::CreateThrottlesForNavigation(
 
 content::DevToolsManagerDelegate*
 ChromeContentBrowserClient::GetDevToolsManagerDelegate() {
+#if defined(OS_ANDROID)
+  return new DevToolsManagerDelegateAndroid();
+#else
   return new ChromeDevToolsManagerDelegate();
+#endif
 }
 
 content::TracingDelegate* ChromeContentBrowserClient::GetTracingDelegate() {
diff --git a/chrome/browser/devtools/BUILD.gn b/chrome/browser/devtools/BUILD.gn
index 3e7a05a5d0737..9a0c42a11cb87 100644
--- a/chrome/browser/devtools/BUILD.gn
+++ b/chrome/browser/devtools/BUILD.gn
@@ -30,8 +30,6 @@ action("devtools_protocol_constants") {
 static_library("devtools") {
   # Note: new sources and deps should be generally added in (!is_android) below.
   sources = [
-    "chrome_devtools_manager_delegate.cc",
-    "chrome_devtools_manager_delegate.h",
     "devtools_network_conditions.cc",
     "devtools_network_conditions.h",
     "devtools_network_controller.cc",
@@ -82,8 +80,8 @@ static_library("devtools") {
       "//third_party/leveldatabase",
     ]
     sources += [
-      "chrome_devtools_discovery_provider.cc",
-      "chrome_devtools_discovery_provider.h",
+      "chrome_devtools_manager_delegate.cc",
+      "chrome_devtools_manager_delegate.h",
       "device/adb/adb_client_socket.cc",
       "device/adb/adb_client_socket.h",
       "device/adb/adb_device_provider.cc",
diff --git a/chrome/browser/devtools/DEPS b/chrome/browser/devtools/DEPS
index b1244efb48c70..8b64aaac5db91 100644
--- a/chrome/browser/devtools/DEPS
+++ b/chrome/browser/devtools/DEPS
@@ -1,4 +1,3 @@
 include_rules = [
-  "+components/devtools_discovery",
   "+components/devtools_http_handler",
 ]
diff --git a/chrome/browser/devtools/chrome_devtools_discovery_provider.cc b/chrome/browser/devtools/chrome_devtools_discovery_provider.cc
deleted file mode 100644
index e6717ecb5f261..0000000000000
--- a/chrome/browser/devtools/chrome_devtools_discovery_provider.cc
+++ /dev/null
@@ -1,49 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/devtools/chrome_devtools_discovery_provider.h"
-
-#include "base/memory/ptr_util.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/browser/ui/browser_navigator.h"
-#include "chrome/browser/ui/browser_navigator_params.h"
-#include "content/public/browser/devtools_agent_host.h"
-
-namespace {
-
-scoped_refptr<content::DevToolsAgentHost>
-CreateNewChromeTab(const GURL& url) {
-  chrome::NavigateParams params(ProfileManager::GetLastUsedProfile(),
-      url, ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
-  params.disposition = NEW_FOREGROUND_TAB;
-  chrome::Navigate(&params);
-  if (!params.target_contents)
-    return nullptr;
-
-  if (!params.target_contents)
-    return nullptr;
-  return content::DevToolsAgentHost::GetOrCreateFor(params.target_contents);
-}
-
-}  // namespace
-
-ChromeDevToolsDiscoveryProvider::ChromeDevToolsDiscoveryProvider() {
-}
-
-ChromeDevToolsDiscoveryProvider::~ChromeDevToolsDiscoveryProvider() {
-}
-
-content::DevToolsAgentHost::List
-ChromeDevToolsDiscoveryProvider::GetDescriptors() {
-  return content::DevToolsAgentHost::GetOrCreateAll();
-}
-
-// static
-void ChromeDevToolsDiscoveryProvider::Install() {
-  devtools_discovery::DevToolsDiscoveryManager* discovery_manager =
-      devtools_discovery::DevToolsDiscoveryManager::GetInstance();
-  discovery_manager->AddProvider(
-      base::WrapUnique(new ChromeDevToolsDiscoveryProvider()));
-  discovery_manager->SetCreateCallback(base::Bind(&CreateNewChromeTab));
-}
diff --git a/chrome/browser/devtools/chrome_devtools_discovery_provider.h b/chrome/browser/devtools/chrome_devtools_discovery_provider.h
deleted file mode 100644
index f48890586dc14..0000000000000
--- a/chrome/browser/devtools/chrome_devtools_discovery_provider.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_DEVTOOLS_CHROME_DEVTOOLS_DISCOVERY_PROVIDER_H_
-#define CHROME_BROWSER_DEVTOOLS_CHROME_DEVTOOLS_DISCOVERY_PROVIDER_H_
-
-#include "base/macros.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
-
-class ChromeDevToolsDiscoveryProvider :
-    public devtools_discovery::DevToolsDiscoveryManager::Provider {
- public:
-  // Installs provider to devtools_discovery.
-  static void Install();
-
-  ~ChromeDevToolsDiscoveryProvider() override;
-
-  // devtools_discovery::DevToolsDiscoveryManager::Provider implementation.
-  content::DevToolsAgentHost::List GetDescriptors() override;
-
- private:
-  ChromeDevToolsDiscoveryProvider();
-
-  DISALLOW_COPY_AND_ASSIGN(ChromeDevToolsDiscoveryProvider);
-};
-
-#endif  // CHROME_BROWSER_DEVTOOLS_CHROME_DEVTOOLS_DISCOVERY_PROVIDER_H_
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
index ca25d95a7575e..085e940515be3 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.cc
@@ -7,32 +7,28 @@
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
 #include "chrome/browser/devtools/devtools_network_protocol_handler.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
-#include "content/public/browser/devtools_agent_host.h"
-#include "content/public/browser/web_contents.h"
-
-#if !defined(OS_ANDROID)
 #include "chrome/browser/devtools/devtools_window.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/browser/ui/browser_navigator.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
 #include "chrome/browser/ui/tab_contents/tab_contents_iterator.h"
+#include "content/public/browser/devtools_agent_host.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
 #include "extensions/browser/extension_host.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/process_manager.h"
-#else  // !defined(OS_ANDROID)
-#include "chrome/browser/android/tab_android.h"
-#include "chrome/browser/ui/android/tab_model/tab_model.h"
-#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
-#endif  // !defined(OS_ANDROID)
-
-using devtools_discovery::DevToolsDiscoveryManager;
 
 char ChromeDevToolsManagerDelegate::kTypeApp[] = "app";
 char ChromeDevToolsManagerDelegate::kTypeBackgroundPage[] = "background_page";
 
+
 ChromeDevToolsManagerDelegate::ChromeDevToolsManagerDelegate()
     : network_protocol_handler_(new DevToolsNetworkProtocolHandler()) {
+  content::DevToolsAgentHost::AddDiscoveryProvider(
+      base::Bind(&content::DevToolsAgentHost::GetOrCreateAll));
 }
 
 ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() {
@@ -40,7 +36,6 @@ ChromeDevToolsManagerDelegate::~ChromeDevToolsManagerDelegate() {
 
 void ChromeDevToolsManagerDelegate::Inspect(
     content::DevToolsAgentHost* agent_host) {
-#if !defined(OS_ANDROID)
   Profile* profile =
       Profile::FromBrowserContext(agent_host->GetBrowserContext());
   if (!profile)
@@ -54,17 +49,11 @@ void ChromeDevToolsManagerDelegate::Inspect(
   content::WebContents* web_contents = agent_host->GetWebContents();
   if (web_contents)
     DevToolsWindow::OpenDevToolsWindow(web_contents);
-#endif  // !defined(OS_ANDROID)
 }
 
 base::DictionaryValue* ChromeDevToolsManagerDelegate::HandleCommand(
     content::DevToolsAgentHost* agent_host,
     base::DictionaryValue* command_dict) {
-  std::unique_ptr<base::DictionaryValue> result =
-      DevToolsDiscoveryManager::GetInstance()->HandleCreateTargetCommand(
-          command_dict);
-  if (result)
-    return result.release();  // Caller takes ownership.
   return network_protocol_handler_->HandleCommand(agent_host, command_dict);
 }
 
@@ -72,7 +61,6 @@ std::string ChromeDevToolsManagerDelegate::GetTargetType(
     content::RenderFrameHost* host) {
   content::WebContents* web_contents =
       content::WebContents::FromRenderFrameHost(host);
-#if !defined(OS_ANDROID)
   for (TabContentsIterator it; !it.done(); it.Next()) {
     if (*it == web_contents)
       return content::DevToolsAgentHost::kTypePage;
@@ -103,23 +91,11 @@ std::string ChromeDevToolsManagerDelegate::GetTargetType(
              || extension->is_platform_app()) {
     return kTypeApp;
   }
-#else  // !defined(OS_ANDROID)
-  for (TabModelList::const_iterator iter = TabModelList::begin();
-      iter != TabModelList::end(); ++iter) {
-    TabModel* model = *iter;
-    for (int i = 0; i < model->GetTabCount(); ++i) {
-      TabAndroid* tab = model->GetTabAt(i);
-      if (tab && web_contents == tab->web_contents())
-        return content::DevToolsAgentHost::kTypePage;
-    }
-  }
-#endif  // !defined(OS_ANDROID)
   return content::DevToolsAgentHost::kTypeOther;
 }
 
 std::string ChromeDevToolsManagerDelegate::GetTargetTitle(
     content::RenderFrameHost* host) {
-#if !defined(OS_ANDROID)
   content::WebContents* web_contents =
       content::WebContents::FromRenderFrameHost(host);
   if (host->GetParent())
@@ -133,10 +109,20 @@ std::string ChromeDevToolsManagerDelegate::GetTargetTitle(
           host->GetLastCommittedURL().host());
   if (extension)
     return extension->name();
-#endif  // !defined(OS_ANDROID)
   return "";
 }
 
+scoped_refptr<content::DevToolsAgentHost>
+ChromeDevToolsManagerDelegate::CreateNewTarget(const GURL& url) {
+  chrome::NavigateParams params(ProfileManager::GetLastUsedProfile(),
+      url, ui::PAGE_TRANSITION_AUTO_TOPLEVEL);
+  params.disposition = NEW_FOREGROUND_TAB;
+  chrome::Navigate(&params);
+  if (!params.target_contents)
+    return nullptr;
+  return content::DevToolsAgentHost::GetOrCreateFor(params.target_contents);
+}
+
 void ChromeDevToolsManagerDelegate::DevToolsAgentStateChanged(
     content::DevToolsAgentHost* agent_host,
     bool attached) {
diff --git a/chrome/browser/devtools/chrome_devtools_manager_delegate.h b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
index 61cde163c3c84..3cbfb288d419e 100644
--- a/chrome/browser/devtools/chrome_devtools_manager_delegate.h
+++ b/chrome/browser/devtools/chrome_devtools_manager_delegate.h
@@ -30,6 +30,8 @@ class ChromeDevToolsManagerDelegate : public content::DevToolsManagerDelegate {
       base::DictionaryValue* command_dict) override;
   std::string GetTargetType(content::RenderFrameHost* host) override;
   std::string GetTargetTitle(content::RenderFrameHost* host) override;
+  scoped_refptr<content::DevToolsAgentHost> CreateNewTarget(
+      const GURL& url) override;
 
  private:
   std::unique_ptr<DevToolsNetworkProtocolHandler> network_protocol_handler_;
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 7b1383e0afb82..a1b2e2a220707 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -828,8 +828,8 @@
       'browser/android/data_usage/external_data_use_reporter.h',
       'browser/android/data_usage/tab_data_use_entry.cc',
       'browser/android/data_usage/tab_data_use_entry.h',
-      'browser/android/dev_tools_discovery_provider_android.cc',
-      'browser/android/dev_tools_discovery_provider_android.h',
+      'browser/android/devtools_manager_delegate_android.cc',
+      'browser/android/devtools_manager_delegate_android.h',
       'browser/android/dev_tools_server.cc',
       'browser/android/dev_tools_server.h',
       'browser/android/document/document_web_contents_delegate.cc',
@@ -3429,7 +3429,6 @@
             '../components/components.gyp:cookie_config',
             '../components/components.gyp:data_reduction_proxy_content_browser',
             '../components/components.gyp:data_use_measurement_content',
-            '../components/components.gyp:devtools_discovery',
             '../components/components.gyp:devtools_http_handler',
             '../components/components.gyp:dom_distiller_content_browser',
             '../components/components.gyp:domain_reliability',
diff --git a/chrome/chrome_debugger.gypi b/chrome/chrome_debugger.gypi
index 33248db4474e9..04abc4eb8ec09 100644
--- a/chrome/chrome_debugger.gypi
+++ b/chrome/chrome_debugger.gypi
@@ -61,8 +61,6 @@
             'common/extensions/api/api.gyp:chrome_api',
           ],
           'sources': [
-            'browser/devtools/chrome_devtools_discovery_provider.cc',
-            'browser/devtools/chrome_devtools_discovery_provider.h',
             'browser/devtools/device/adb/adb_client_socket.cc',
             'browser/devtools/device/adb/adb_client_socket.h',
             'browser/devtools/device/adb/adb_device_provider.cc',
diff --git a/components/OWNERS b/components/OWNERS
index 458c926063cb8..625a3c670a727 100644
--- a/components/OWNERS
+++ b/components/OWNERS
@@ -52,8 +52,6 @@ per-file data_use_measurement.gypi=file://components/data_use_measurement/OWNERS
 
 per-file device_event_log.gypi=file://components/device_event_log/OWNERS
 
-per-file devtools_discovery.gypi=file://components/devtools_discovery/OWNERS
-
 per-file devtools_http_handler.gypi=file://components/devtools_http_handler/OWNERS
 
 per-file display_compositor.gypi=file://components/display_compositor/OWNERS
diff --git a/components/devtools_discovery/BUILD.gn b/components/devtools_discovery/BUILD.gn
deleted file mode 100644
index 12f4a657c1a92..0000000000000
--- a/components/devtools_discovery/BUILD.gn
+++ /dev/null
@@ -1,17 +0,0 @@
-# Copyright 2015 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-static_library("devtools_discovery") {
-  sources = [
-    "devtools_discovery_manager.cc",
-    "devtools_discovery_manager.h",
-  ]
-
-  deps = [
-    "//base",
-    "//content/public/browser",
-    "//content/public/common",
-    "//url",
-  ]
-}
diff --git a/components/devtools_discovery/DEPS b/components/devtools_discovery/DEPS
deleted file mode 100644
index f75ba964ae0f9..0000000000000
--- a/components/devtools_discovery/DEPS
+++ /dev/null
@@ -1,5 +0,0 @@
-include_rules = [
-  "+content/public/browser",
-  "+content/public/common",
-  "+content/public/test",
-]
diff --git a/components/devtools_discovery/OWNERS b/components/devtools_discovery/OWNERS
deleted file mode 100644
index fe38b0fad4948..0000000000000
--- a/components/devtools_discovery/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-dgozman@chromium.org
-pfeldman@chromium.org
diff --git a/components/devtools_discovery/devtools_discovery_manager.cc b/components/devtools_discovery/devtools_discovery_manager.cc
deleted file mode 100644
index eb2c5960ea133..0000000000000
--- a/components/devtools_discovery/devtools_discovery_manager.cc
+++ /dev/null
@@ -1,84 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/devtools_discovery/devtools_discovery_manager.h"
-
-#include "base/stl_util.h"
-
-using content::DevToolsAgentHost;
-
-namespace devtools_discovery {
-
-// static
-DevToolsDiscoveryManager* DevToolsDiscoveryManager::GetInstance() {
-  return base::Singleton<DevToolsDiscoveryManager>::get();
-}
-
-DevToolsDiscoveryManager::DevToolsDiscoveryManager() {
-}
-
-DevToolsDiscoveryManager::~DevToolsDiscoveryManager() {
-  base::STLDeleteElements(&providers_);
-}
-
-void DevToolsDiscoveryManager::AddProvider(std::unique_ptr<Provider> provider) {
-  providers_.push_back(provider.release());
-}
-
-content::DevToolsAgentHost::List DevToolsDiscoveryManager::GetDescriptors() {
-  if (providers_.size())
-    return GetDescriptorsFromProviders();
-
-  return DevToolsAgentHost::GetOrCreateAll();
-}
-
-void DevToolsDiscoveryManager::SetCreateCallback(
-    const CreateCallback& callback) {
-  create_callback_ = callback;
-}
-
-scoped_refptr<content::DevToolsAgentHost> DevToolsDiscoveryManager::CreateNew(
-    const GURL& url) {
-  if (create_callback_.is_null())
-    return nullptr;
-  return create_callback_.Run(url);
-}
-
-content::DevToolsAgentHost::List
-DevToolsDiscoveryManager::GetDescriptorsFromProviders() {
-  content::DevToolsAgentHost::List result;
-  for (auto* provider : providers_) {
-    content::DevToolsAgentHost::List partial = provider->GetDescriptors();
-    result.insert(result.begin(), partial.begin(), partial.end());
-  }
-  return result;
-}
-
-std::unique_ptr<base::DictionaryValue>
-DevToolsDiscoveryManager::HandleCreateTargetCommand(
-    base::DictionaryValue* command_dict) {
-  int id;
-  std::string method;
-  std::string url;
-  const base::DictionaryValue* params_dict = nullptr;
-  if (command_dict->GetInteger("id", &id) &&
-      command_dict->GetString("method", &method) &&
-      method == "Browser.createTarget" &&
-      command_dict->GetDictionary("params", &params_dict) &&
-      params_dict->GetString("url", &url)) {
-    scoped_refptr<content::DevToolsAgentHost> host = CreateNew(GURL(url));
-    if (!host)
-      return nullptr;
-    std::unique_ptr<base::DictionaryValue> result(new base::DictionaryValue());
-    result->SetInteger("id", id);
-    std::unique_ptr<base::DictionaryValue> cmd_result(
-        new base::DictionaryValue());
-    cmd_result->SetString("targetId", host->GetId());
-    result->Set("result", std::move(cmd_result));
-    return result;
-  }
-  return nullptr;
-}
-
-}  // namespace devtools_discovery
diff --git a/components/devtools_discovery/devtools_discovery_manager.h b/components/devtools_discovery/devtools_discovery_manager.h
deleted file mode 100644
index 8887f7694479b..0000000000000
--- a/components/devtools_discovery/devtools_discovery_manager.h
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_DEVTOOLS_DISCOVERY_DEVTOOLS_DISCOVERY_MANAGER_H_
-#define COMPONENTS_DEVTOOLS_DISCOVERY_DEVTOOLS_DISCOVERY_MANAGER_H_
-
-#include <memory>
-#include <string>
-
-#include "base/macros.h"
-#include "base/memory/singleton.h"
-#include "base/values.h"
-#include "content/public/browser/devtools_agent_host.h"
-
-namespace devtools_discovery {
-
-class DevToolsDiscoveryManager {
- public:
-  class Provider {
-   public:
-    virtual ~Provider() {}
-
-    virtual content::DevToolsAgentHost::List GetDescriptors() = 0;
-  };
-
-  using CreateCallback = base::Callback<
-      scoped_refptr<content::DevToolsAgentHost>(const GURL& url)>;
-
-  // Returns single instance of this class. The instance is destroyed on the
-  // browser main loop exit so this method MUST NOT be called after that point.
-  static DevToolsDiscoveryManager* GetInstance();
-
-  void AddProvider(std::unique_ptr<Provider> provider);
-  void SetCreateCallback(const CreateCallback& callback);
-  // Caller takes ownership of created descriptors.
-  content::DevToolsAgentHost::List GetDescriptors();
-  scoped_refptr<content::DevToolsAgentHost> CreateNew(const GURL& url);
-
-  // Handles Browser.createTarget only.
-  std::unique_ptr<base::DictionaryValue> HandleCreateTargetCommand(
-      base::DictionaryValue* command_dict);
-
- private:
-  friend struct base::DefaultSingletonTraits<DevToolsDiscoveryManager>;
-
-  DevToolsDiscoveryManager();
-  ~DevToolsDiscoveryManager();
-  content::DevToolsAgentHost::List GetDescriptorsFromProviders();
-
-  std::vector<Provider*> providers_;
-  CreateCallback create_callback_;
-
-  DISALLOW_COPY_AND_ASSIGN(DevToolsDiscoveryManager);
-};
-
-}  // namespace devtools_discovery
-
-#endif  // COMPONENTS_DEVTOOLS_DISCOVERY_DEVTOOLS_DISCOVERY_MANAGER_H_
diff --git a/components/devtools_http_handler/BUILD.gn b/components/devtools_http_handler/BUILD.gn
index 78dca7f90d127..a7f85d7c8ed51 100644
--- a/components/devtools_http_handler/BUILD.gn
+++ b/components/devtools_http_handler/BUILD.gn
@@ -11,7 +11,6 @@ static_library("devtools_http_handler") {
 
   deps = [
     "//base",
-    "//components/devtools_discovery",
     "//content/public/browser",
     "//content/public/common",
     "//net",
diff --git a/components/devtools_http_handler/DEPS b/components/devtools_http_handler/DEPS
index c85bd3d463264..3bcaf2ef0c357 100644
--- a/components/devtools_http_handler/DEPS
+++ b/components/devtools_http_handler/DEPS
@@ -1,5 +1,4 @@
 include_rules = [
-  "+components/devtools_discovery",
   "+content/public/browser",
   "+content/public/common",
   "+content/public/test",
diff --git a/components/devtools_http_handler/devtools_http_handler.cc b/components/devtools_http_handler/devtools_http_handler.cc
index 86765589d896b..17a12e17e18e2 100644
--- a/components/devtools_http_handler/devtools_http_handler.cc
+++ b/components/devtools_http_handler/devtools_http_handler.cc
@@ -22,11 +22,11 @@
 #include "base/threading/thread.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
 #include "components/devtools_http_handler/devtools_http_handler.h"
 #include "components/devtools_http_handler/devtools_http_handler_delegate.h"
 #include "content/public/browser/browser_thread.h"
 #include "content/public/browser/devtools_external_agent_proxy_delegate.h"
+#include "content/public/browser/devtools_manager_delegate.h"
 #include "content/public/common/url_constants.h"
 #include "content/public/common/user_agent.h"
 #include "net/base/escape.h"
@@ -575,8 +575,7 @@ void DevToolsHttpHandler::OnJsonRequest(
   if (command == "list") {
     std::string host = info.headers["host"];
     DevToolsAgentHost::List agent_hosts =
-        devtools_discovery::DevToolsDiscoveryManager::GetInstance()->
-            GetDescriptors();
+        content::DevToolsAgentHost::DiscoverAllHosts();
     std::sort(agent_hosts.begin(), agent_hosts.end(), TimeComparator);
     agent_host_map_.clear();
     base::ListValue list_value;
@@ -594,9 +593,11 @@ void DevToolsHttpHandler::OnJsonRequest(
                    net::UnescapeRule::PATH_SEPARATORS));
     if (!url.is_valid())
       url = GURL(url::kAboutBlankURL);
-    scoped_refptr<DevToolsAgentHost> agent_host =
-        devtools_discovery::DevToolsDiscoveryManager::GetInstance()->CreateNew(
-            url);
+    scoped_refptr<DevToolsAgentHost> agent_host = nullptr;
+    content::DevToolsManagerDelegate* delegate =
+        DevToolsAgentHost::GetDevToolsManagerDelegate();
+    if (delegate)
+      agent_host = delegate->CreateNewTarget(url);
     if (!agent_host) {
       SendJson(connection_id,
                net::HTTP_INTERNAL_SERVER_ERROR,
diff --git a/content/browser/devtools/devtools_agent_host_impl.cc b/content/browser/devtools/devtools_agent_host_impl.cc
index fdd38d13c14ca..f9e06738b267f 100644
--- a/content/browser/devtools/devtools_agent_host_impl.cc
+++ b/content/browser/devtools/devtools_agent_host_impl.cc
@@ -25,10 +25,14 @@ namespace {
 typedef std::map<std::string, DevToolsAgentHostImpl*> Instances;
 base::LazyInstance<Instances>::Leaky g_instances = LAZY_INSTANCE_INITIALIZER;
 
-typedef std::vector<const DevToolsAgentHost::AgentStateCallback*>
-    AgentStateCallbacks;
+using AgentStateCallbacks =
+    std::vector<const DevToolsAgentHost::AgentStateCallback*>;
 base::LazyInstance<AgentStateCallbacks>::Leaky g_callbacks =
     LAZY_INSTANCE_INITIALIZER;
+using DiscoveryCallbacks =
+    std::vector<DevToolsAgentHost::DiscoveryCallback>;
+base::LazyInstance<DiscoveryCallbacks>::Leaky g_providers =
+    LAZY_INSTANCE_INITIALIZER;
 }  // namespace
 
 char DevToolsAgentHost::kTypePage[] = "page";
@@ -39,6 +43,12 @@ char DevToolsAgentHost::kTypeExternal[] = "external";
 char DevToolsAgentHost::kTypeBrowser[] = "browser";
 char DevToolsAgentHost::kTypeOther[] = "other";
 
+// static
+DevToolsManagerDelegate* DevToolsAgentHost::GetDevToolsManagerDelegate() {
+  DevToolsManager* manager = DevToolsManager::GetInstance();
+  return manager->delegate();
+}
+
 // static
 std::string DevToolsAgentHost::GetProtocolVersion() {
   return std::string(devtools::kProtocolVersion);
@@ -49,6 +59,12 @@ bool DevToolsAgentHost::IsSupportedProtocolVersion(const std::string& version) {
   return devtools::IsSupportedProtocolVersion(version);
 }
 
+// static
+void DevToolsAgentHost::AddDiscoveryProvider(
+    const DiscoveryCallback& callback) {
+  g_providers.Get().push_back(callback);
+}
+
 // static
 DevToolsAgentHost::List DevToolsAgentHost::GetOrCreateAll() {
   List result;
@@ -66,6 +82,20 @@ DevToolsAgentHost::List DevToolsAgentHost::GetOrCreateAll() {
   return result;
 }
 
+// static
+DevToolsAgentHost::List DevToolsAgentHost::DiscoverAllHosts() {
+  content::DevToolsAgentHost::List result;
+  // Force create all the delegates.
+  DevToolsManager::GetInstance();
+  if (!g_providers.Get().size())
+    return DevToolsAgentHost::GetOrCreateAll();
+  for (auto& provider : g_providers.Get()) {
+    content::DevToolsAgentHost::List partial = provider.Run();
+    result.insert(result.begin(), partial.begin(), partial.end());
+  }
+  return result;
+}
+
 // Called on the UI thread.
 // static
 scoped_refptr<DevToolsAgentHost> DevToolsAgentHost::GetForWorker(
diff --git a/content/browser/devtools/protocol/browser_handler.cc b/content/browser/devtools/protocol/browser_handler.cc
index d1494f06ca867..1b53abe690596 100644
--- a/content/browser/devtools/protocol/browser_handler.cc
+++ b/content/browser/devtools/protocol/browser_handler.cc
@@ -4,6 +4,9 @@
 
 #include "content/browser/devtools/protocol/browser_handler.h"
 
+#include "content/browser/devtools/devtools_manager.h"
+#include "content/public/browser/devtools_manager_delegate.h"
+
 namespace content {
 namespace devtools {
 namespace browser {
@@ -38,9 +41,16 @@ Response BrowserHandler::CreateTarget(const std::string& url,
                                       const int* height,
                                       const std::string* context_id,
                                       std::string* out_target_id) {
-  // For layering reasons this needs to be handled by
-  // DevToolsManagerDelegate::HandleCommand.
-  return Response::ServerError("Not supported");
+  DevToolsManagerDelegate* delegate =
+      DevToolsManager::GetInstance()->delegate();
+  if (!delegate)
+    return Response::ServerError("Not supported");
+  scoped_refptr<content::DevToolsAgentHost> agent_host =
+      delegate->CreateNewTarget(GURL(url));
+  if (!agent_host)
+    return Response::ServerError("Not supported");
+  *out_target_id = agent_host->GetId();
+  return Response::OK();
 }
 
 Response BrowserHandler::CloseTarget(const std::string& target_id,
diff --git a/content/content_shell.gypi b/content/content_shell.gypi
index 09d54a193c0c6..91dc554814e44 100644
--- a/content/content_shell.gypi
+++ b/content/content_shell.gypi
@@ -39,7 +39,6 @@
         '../cc/blink/cc_blink.gyp:cc_blink',
         '../cc/cc.gyp:cc',
         '../components/components.gyp:crash_component_breakpad_to_be_deleted',
-        '../components/components.gyp:devtools_discovery',
         '../components/components.gyp:devtools_http_handler',
         '../components/components.gyp:web_cache_renderer',
         '../components/components.gyp:plugins_renderer',
diff --git a/content/public/browser/devtools_agent_host.h b/content/public/browser/devtools_agent_host.h
index e98f5dc9845f7..6ec93f2c4e6c8 100644
--- a/content/public/browser/devtools_agent_host.h
+++ b/content/public/browser/devtools_agent_host.h
@@ -28,6 +28,7 @@ namespace content {
 
 class BrowserContext;
 class DevToolsExternalAgentProxyDelegate;
+class DevToolsManagerDelegate;
 class RenderFrameHost;
 class WebContents;
 
@@ -43,6 +44,10 @@ class CONTENT_EXPORT DevToolsAgentHost
   static char kTypeBrowser[];
   static char kTypeOther[];
 
+  // This is temporary while we are merging http handler and discovery
+  // into content/.
+  static DevToolsManagerDelegate* GetDevToolsManagerDelegate();
+
   // Latest DevTools protocol version supported.
   static std::string GetProtocolVersion();
 
@@ -92,11 +97,20 @@ class CONTENT_EXPORT DevToolsAgentHost
 
   static bool IsDebuggerAttached(WebContents* web_contents);
 
-  typedef std::vector<scoped_refptr<DevToolsAgentHost> > List;
+  using List = std::vector<scoped_refptr<DevToolsAgentHost>>;
 
-  // Returns all possible DevToolsAgentHosts.
+  using DiscoveryCallback = base::Callback<List()>;
+
+  // Registers embedder's custom host providers that are available via
+  // DiscoverAllHosts.
+  static void AddDiscoveryProvider(const DiscoveryCallback& callback);
+
+  // Returns all DevToolsAgentHosts content is aware of.
   static List GetOrCreateAll();
 
+  // Returns all possible DevToolsAgentHosts embedder is aware of.
+  static List DiscoverAllHosts();
+
   // Attaches |client| to this agent host to start debugging.
   // Returns true iff attach succeeded.
   virtual bool AttachClient(DevToolsAgentHostClient* client) = 0;
diff --git a/content/public/browser/devtools_manager_delegate.h b/content/public/browser/devtools_manager_delegate.h
index 4d929292ac5b4..67c00260569e9 100644
--- a/content/public/browser/devtools_manager_delegate.h
+++ b/content/public/browser/devtools_manager_delegate.h
@@ -6,6 +6,8 @@
 #define CONTENT_PUBLIC_BROWSER_DEVTOOLS_MANAGER_DELEGATE_H_
 
 #include <string>
+#include "base/memory/ref_counted.h"
+#include "url/gurl.h"
 
 namespace base {
 class DictionaryValue;
@@ -33,6 +35,9 @@ class DevToolsManagerDelegate {
   // Returns DevToolsAgentHost title to use for given |host| target.
   virtual std::string GetTargetTitle(RenderFrameHost* host) = 0;
 
+  // Creates new inspectable target given the |url|.
+  virtual scoped_refptr<DevToolsAgentHost> CreateNewTarget(const GURL& url) = 0;
+
   // Result ownership is passed to the caller.
   virtual base::DictionaryValue* HandleCommand(
       DevToolsAgentHost* agent_host,
diff --git a/content/shell/BUILD.gn b/content/shell/BUILD.gn
index abac639badb19..b1a9ac12ae0d8 100644
--- a/content/shell/BUILD.gn
+++ b/content/shell/BUILD.gn
@@ -221,7 +221,6 @@ static_library("content_shell_lib") {
     "//base/third_party/dynamic_annotations",
     "//cc",
     "//components/crash/content/app:app_breakpad_mac_win_to_be_deleted",
-    "//components/devtools_discovery",
     "//components/devtools_http_handler",
     "//components/plugins/renderer",
     "//components/test_runner:test_runner",
diff --git a/content/shell/DEPS b/content/shell/DEPS
index fd8839215d4f0..6dfaf4e5a2368 100644
--- a/content/shell/DEPS
+++ b/content/shell/DEPS
@@ -27,7 +27,6 @@ include_rules = [
   #   1) it's an example browser
   #   2) it's not linked into the content library
   "+components/crash",
-  "+components/devtools_discovery",
   "+components/devtools_http_handler",
   "+components/url_formatter",
 ]
diff --git a/content/shell/browser/shell_content_browser_client.cc b/content/shell/browser/shell_content_browser_client.cc
index 5fe4483d0466b..643f9c1653d38 100644
--- a/content/shell/browser/shell_content_browser_client.cc
+++ b/content/shell/browser/shell_content_browser_client.cc
@@ -272,7 +272,7 @@ bool ShellContentBrowserClient::ShouldSwapProcessesForRedirect(
 
 DevToolsManagerDelegate*
 ShellContentBrowserClient::GetDevToolsManagerDelegate() {
-  return new ShellDevToolsManagerDelegate();
+  return new ShellDevToolsManagerDelegate(browser_context());
 }
 
 void ShellContentBrowserClient::OpenURL(
diff --git a/content/shell/browser/shell_devtools_manager_delegate.cc b/content/shell/browser/shell_devtools_manager_delegate.cc
index 2d3837a31854f..f6826dc9981e7 100644
--- a/content/shell/browser/shell_devtools_manager_delegate.cc
+++ b/content/shell/browser/shell_devtools_manager_delegate.cc
@@ -17,7 +17,6 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
-#include "components/devtools_discovery/devtools_discovery_manager.h"
 #include "components/devtools_http_handler/devtools_http_handler.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/devtools_agent_host.h"
@@ -134,21 +133,12 @@ CreateSocketFactory() {
 #endif
 }
 
-scoped_refptr<content::DevToolsAgentHost>
-CreateNewShellTarget(BrowserContext* browser_context, const GURL& url) {
-  Shell* shell = Shell::CreateNewWindow(browser_context,
-                                        url,
-                                        nullptr,
-                                        gfx::Size());
-  return DevToolsAgentHost::GetOrCreateFor(shell->web_contents());
-}
-
 // ShellDevToolsDelegate ----------------------------------------------------
 
 class ShellDevToolsDelegate :
     public devtools_http_handler::DevToolsHttpHandlerDelegate {
  public:
-  explicit ShellDevToolsDelegate(BrowserContext* browser_context);
+  explicit ShellDevToolsDelegate();
   ~ShellDevToolsDelegate() override;
 
   // devtools_http_handler::DevToolsHttpHandlerDelegate implementation.
@@ -162,16 +152,10 @@ class ShellDevToolsDelegate :
   DISALLOW_COPY_AND_ASSIGN(ShellDevToolsDelegate);
 };
 
-ShellDevToolsDelegate::ShellDevToolsDelegate(BrowserContext* browser_context) {
-  devtools_discovery::DevToolsDiscoveryManager::GetInstance()->
-      SetCreateCallback(base::Bind(&CreateNewShellTarget,
-                                   base::Unretained(browser_context)));
+ShellDevToolsDelegate::ShellDevToolsDelegate() {
 }
 
 ShellDevToolsDelegate::~ShellDevToolsDelegate() {
-  devtools_discovery::DevToolsDiscoveryManager::GetInstance()->
-      SetCreateCallback(
-          devtools_discovery::DevToolsDiscoveryManager::CreateCallback());
 }
 
 std::string ShellDevToolsDelegate::GetDiscoveryPageHTML() {
@@ -212,14 +196,16 @@ ShellDevToolsManagerDelegate::CreateHttpHandler(
   return new DevToolsHttpHandler(
       CreateSocketFactory(),
       frontend_url,
-      new ShellDevToolsDelegate(browser_context),
+      new ShellDevToolsDelegate(),
       browser_context->GetPath(),
       base::FilePath(),
       std::string(),
       GetShellUserAgent());
 }
 
-ShellDevToolsManagerDelegate::ShellDevToolsManagerDelegate() {
+ShellDevToolsManagerDelegate::ShellDevToolsManagerDelegate(
+    BrowserContext* browser_context)
+    : browser_context_(browser_context) {
 }
 
 ShellDevToolsManagerDelegate::~ShellDevToolsManagerDelegate() {
@@ -228,10 +214,7 @@ ShellDevToolsManagerDelegate::~ShellDevToolsManagerDelegate() {
 base::DictionaryValue* ShellDevToolsManagerDelegate::HandleCommand(
     DevToolsAgentHost* agent_host,
     base::DictionaryValue* command_dict) {
-  std::unique_ptr<base::DictionaryValue> result =
-      devtools_discovery::DevToolsDiscoveryManager::GetInstance()
-          ->HandleCreateTargetCommand(command_dict);
-  return result.release();  // Caller takes ownership.
+  return nullptr;
 }
 
 std::string ShellDevToolsManagerDelegate::GetTargetType(RenderFrameHost* host) {
@@ -243,4 +226,14 @@ std::string ShellDevToolsManagerDelegate::GetTargetTitle(
   return "";
 }
 
+
+scoped_refptr<DevToolsAgentHost>
+ShellDevToolsManagerDelegate::CreateNewTarget(const GURL& url) {
+  Shell* shell = Shell::CreateNewWindow(browser_context_,
+                                        url,
+                                        nullptr,
+                                        gfx::Size());
+  return DevToolsAgentHost::GetOrCreateFor(shell->web_contents());
+}
+
 }  // namespace content
diff --git a/content/shell/browser/shell_devtools_manager_delegate.h b/content/shell/browser/shell_devtools_manager_delegate.h
index 7275f4d85e0dd..a4a9112981b70 100644
--- a/content/shell/browser/shell_devtools_manager_delegate.h
+++ b/content/shell/browser/shell_devtools_manager_delegate.h
@@ -23,7 +23,7 @@ class ShellDevToolsManagerDelegate : public DevToolsManagerDelegate {
   static devtools_http_handler::DevToolsHttpHandler* CreateHttpHandler(
       BrowserContext* browser_context);
 
-  ShellDevToolsManagerDelegate();
+  explicit ShellDevToolsManagerDelegate(BrowserContext* browser_context);
   ~ShellDevToolsManagerDelegate() override;
 
   // DevToolsManagerDelegate implementation.
@@ -34,8 +34,10 @@ class ShellDevToolsManagerDelegate : public DevToolsManagerDelegate {
                                        base::DictionaryValue* command) override;
   std::string GetTargetType(RenderFrameHost* host) override;
   std::string GetTargetTitle(RenderFrameHost* host) override;
+  scoped_refptr<DevToolsAgentHost> CreateNewTarget(const GURL& url) override;
 
  private:
+  BrowserContext* browser_context_;
   DISALLOW_COPY_AND_ASSIGN(ShellDevToolsManagerDelegate);
 };
 
diff --git a/extensions/shell/BUILD.gn b/extensions/shell/BUILD.gn
index 4732cbfdc47c9..c4516eaed02fc 100644
--- a/extensions/shell/BUILD.gn
+++ b/extensions/shell/BUILD.gn
@@ -31,7 +31,6 @@ source_set("app_shell_lib") {
     ":resources",
     ":version_header",
     "//base",
-    "//components/devtools_discovery",
     "//components/devtools_http_handler",
     "//components/guest_view/browser",
     "//components/guest_view/common",
diff --git a/extensions/shell/browser/shell_content_browser_client.cc b/extensions/shell/browser/shell_content_browser_client.cc
index 26298c70b915d..6eec8e733496c 100644
--- a/extensions/shell/browser/shell_content_browser_client.cc
+++ b/extensions/shell/browser/shell_content_browser_client.cc
@@ -225,7 +225,7 @@ void ShellContentBrowserClient::GetAdditionalAllowedSchemesForFileSystem(
 
 content::DevToolsManagerDelegate*
 ShellContentBrowserClient::GetDevToolsManagerDelegate() {
-  return new content::ShellDevToolsManagerDelegate();
+  return new content::ShellDevToolsManagerDelegate(GetBrowserContext());
 }
 
 ShellBrowserMainParts* ShellContentBrowserClient::CreateShellBrowserMainParts(
diff --git a/headless/lib/browser/headless_devtools_manager_delegate.cc b/headless/lib/browser/headless_devtools_manager_delegate.cc
index adc2c5ef92ee1..ce89824097031 100644
--- a/headless/lib/browser/headless_devtools_manager_delegate.cc
+++ b/headless/lib/browser/headless_devtools_manager_delegate.cc
@@ -72,6 +72,11 @@ std::string HeadlessDevToolsManagerDelegate::GetTargetTitle(
   return "";
 }
 
+scoped_refptr<content::DevToolsAgentHost>
+HeadlessDevToolsManagerDelegate::CreateNewTarget(const GURL& url) {
+  return nullptr;
+}
+
 std::unique_ptr<base::Value> HeadlessDevToolsManagerDelegate::CreateTarget(
     const base::DictionaryValue* params) {
   std::string url;
diff --git a/headless/lib/browser/headless_devtools_manager_delegate.h b/headless/lib/browser/headless_devtools_manager_delegate.h
index 92ddec8d450fb..52dd17393759c 100644
--- a/headless/lib/browser/headless_devtools_manager_delegate.h
+++ b/headless/lib/browser/headless_devtools_manager_delegate.h
@@ -34,6 +34,8 @@ class HeadlessDevToolsManagerDelegate
                                        base::DictionaryValue* command) override;
   std::string GetTargetType(content::RenderFrameHost* host) override;
   std::string GetTargetTitle(content::RenderFrameHost* host) override;
+  scoped_refptr<content::DevToolsAgentHost> CreateNewTarget(
+      const GURL& url) override;
 
  private:
   std::unique_ptr<base::Value> CreateTarget(