Move all providers into include/weave/provider

BUG: 24267885
Change-Id: I615611609dd26c73bc662e808c27820fe099218c
Reviewed-on: https://weave-review.googlesource.com/1171
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/examples/ubuntu/avahi_client.h b/libweave/examples/ubuntu/avahi_client.h
index d3121a9..ed955ec 100644
--- a/libweave/examples/ubuntu/avahi_client.h
+++ b/libweave/examples/ubuntu/avahi_client.h
@@ -12,13 +12,13 @@
 #include <avahi-client/publish.h>
 #include <avahi-common/thread-watch.h>
 
-#include <weave/dns_service_discovery_provider.h>
+#include <weave/provider/dns_service_discovery.h>
 
 namespace weave {
 namespace examples {
 
-// Example of weave::DnsServiceDiscoveryProvider implemented with avahi.
-class AvahiClient : public DnsServiceDiscoveryProvider {
+// Example of provider::DnsServiceDiscovery implemented with avahi.
+class AvahiClient : public provider::DnsServiceDiscovery {
  public:
   AvahiClient();
 
diff --git a/libweave/examples/ubuntu/bluez_client.h b/libweave/examples/ubuntu/bluez_client.h
index 0915403..23e21ad 100644
--- a/libweave/examples/ubuntu/bluez_client.h
+++ b/libweave/examples/ubuntu/bluez_client.h
@@ -5,13 +5,13 @@
 #ifndef LIBWEAVE_EXAMPLES_UBUNTU_BLUEZ_CLIENT_H_
 #define LIBWEAVE_EXAMPLES_UBUNTU_BLUEZ_CLIENT_H_
 
-#include <weave/bluetooth.h>
+#include <weave/provider/bluetooth.h>
 
 namespace weave {
 namespace examples {
 
 // Example of weave::Bluetooth implemented with bluez.
-class BluetoothImpl : public Bluetooth {
+class BluetoothImpl : public provider::Bluetooth {
  public:
   BluetoothImpl();
 
diff --git a/libweave/examples/ubuntu/curl_http_client.cc b/libweave/examples/ubuntu/curl_http_client.cc
index 3ab3497..2be12d7 100644
--- a/libweave/examples/ubuntu/curl_http_client.cc
+++ b/libweave/examples/ubuntu/curl_http_client.cc
@@ -6,14 +6,14 @@
 
 #include <base/bind.h>
 #include <curl/curl.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 namespace weave {
 namespace examples {
 
 namespace {
 
-struct ResponseImpl : public HttpClient::Response {
+struct ResponseImpl : public provider::HttpClient::Response {
   int GetStatusCode() const { return status; }
   std::string GetContentType() const { return content_type; }
   const std::string& GetData() const { return data; }
@@ -31,15 +31,15 @@
 
 }  // namespace
 
-CurlHttpClient::CurlHttpClient(TaskRunner* task_runner)
+CurlHttpClient::CurlHttpClient(provider::TaskRunner* task_runner)
     : task_runner_{task_runner} {}
 
-std::unique_ptr<HttpClient::Response> CurlHttpClient::SendRequestAndBlock(
-    const std::string& method,
-    const std::string& url,
-    const Headers& headers,
-    const std::string& data,
-    ErrorPtr* error) {
+std::unique_ptr<provider::HttpClient::Response>
+CurlHttpClient::SendRequestAndBlock(const std::string& method,
+                                    const std::string& url,
+                                    const Headers& headers,
+                                    const std::string& data,
+                                    ErrorPtr* error) {
   std::unique_ptr<CURL, decltype(&curl_easy_cleanup)> curl{curl_easy_init(),
                                                            &curl_easy_cleanup};
   CHECK(curl);
diff --git a/libweave/examples/ubuntu/curl_http_client.h b/libweave/examples/ubuntu/curl_http_client.h
index 45e13dc..853b797 100644
--- a/libweave/examples/ubuntu/curl_http_client.h
+++ b/libweave/examples/ubuntu/curl_http_client.h
@@ -8,19 +8,21 @@
 #include <string>
 
 #include <base/memory/weak_ptr.h>
-#include <weave/http_client.h>
+#include <weave/provider/http_client.h>
 
 namespace weave {
 
+namespace provider {
 class TaskRunner;
+}
 
 namespace examples {
 
 // Basic implementation of weave::HttpClient using libcurl. Should be used in
 // production code as it's blocking and does not validate server certificates.
-class CurlHttpClient : public HttpClient {
+class CurlHttpClient : public provider::HttpClient {
  public:
-  explicit CurlHttpClient(TaskRunner* task_runner);
+  explicit CurlHttpClient(provider::TaskRunner* task_runner);
 
   std::unique_ptr<Response> SendRequestAndBlock(const std::string& method,
                                                 const std::string& url,
@@ -42,7 +44,7 @@
                         int id,
                         ErrorPtr error);
 
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   int request_id_ = 0;
 
   base::WeakPtrFactory<CurlHttpClient> weak_ptr_factory_{this};
diff --git a/libweave/examples/ubuntu/event_http_server.cc b/libweave/examples/ubuntu/event_http_server.cc
index 8e45648..fff49cd 100644
--- a/libweave/examples/ubuntu/event_http_server.cc
+++ b/libweave/examples/ubuntu/event_http_server.cc
@@ -32,7 +32,8 @@
 
 class MemoryReadStream : public Stream {
  public:
-  MemoryReadStream(const std::vector<uint8_t>& data, TaskRunner* task_runner)
+  MemoryReadStream(const std::vector<uint8_t>& data,
+                   provider::TaskRunner* task_runner)
       : data_{data}, task_runner_{task_runner} {}
 
   void Read(void* buffer,
@@ -58,7 +59,7 @@
 
  private:
   const std::vector<uint8_t>& data_;
-  TaskRunner* task_runner_;
+  provider::TaskRunner* task_runner_;
   size_t read_position_{0};
 };
 
@@ -66,7 +67,7 @@
 
 class HttpServerImpl::RequestImpl : public Request {
  public:
-  explicit RequestImpl(evhttp_request* req, TaskRunner* task_runner)
+  explicit RequestImpl(evhttp_request* req, provider::TaskRunner* task_runner)
       : path_{evhttp_request_uri(req)}, task_runner_{task_runner} {
     path_ = path_.substr(0, path_.find("?"));
     path_ = path_.substr(0, path_.find("#"));
@@ -97,7 +98,7 @@
   std::unique_ptr<evhttp_request, decltype(&evhttp_cancel_request)> req_{
       nullptr, &evhttp_cancel_request};
   std::string path_;
-  TaskRunner* task_runner_;
+  provider::TaskRunner* task_runner_;
 };
 
 HttpServerImpl::HttpServerImpl(EventTaskRunner* task_runner)
diff --git a/libweave/examples/ubuntu/event_http_server.h b/libweave/examples/ubuntu/event_http_server.h
index 52dd292..1005edc 100644
--- a/libweave/examples/ubuntu/event_http_server.h
+++ b/libweave/examples/ubuntu/event_http_server.h
@@ -14,7 +14,7 @@
 #include <vector>
 
 #include <base/memory/weak_ptr.h>
-#include <weave/http_server.h>
+#include <weave/provider/http_server.h>
 
 namespace weave {
 namespace examples {
@@ -22,7 +22,7 @@
 class EventTaskRunner;
 
 // HTTP/HTTPS server implemented with libevent.
-class HttpServerImpl : public HttpServer {
+class HttpServerImpl : public provider::HttpServer {
  public:
   class RequestImpl;
 
diff --git a/libweave/examples/ubuntu/event_task_runner.h b/libweave/examples/ubuntu/event_task_runner.h
index 726a621..3f04995 100644
--- a/libweave/examples/ubuntu/event_task_runner.h
+++ b/libweave/examples/ubuntu/event_task_runner.h
@@ -11,13 +11,13 @@
 
 #include <event2/event.h>
 
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 namespace weave {
 namespace examples {
 
 // Simple task runner implemented with libevent message loop.
-class EventTaskRunner : public TaskRunner {
+class EventTaskRunner : public provider::TaskRunner {
  public:
   void PostDelayedTask(const tracked_objects::Location& from_here,
                        const base::Closure& task,
diff --git a/libweave/examples/ubuntu/file_config_store.h b/libweave/examples/ubuntu/file_config_store.h
index f6e9b5f..e2bd1c1 100644
--- a/libweave/examples/ubuntu/file_config_store.h
+++ b/libweave/examples/ubuntu/file_config_store.h
@@ -9,12 +9,12 @@
 #include <string>
 #include <vector>
 
-#include <weave/config_store.h>
+#include <weave/provider/config_store.h>
 
 namespace weave {
 namespace examples {
 
-class FileConfigStore : public ConfigStore {
+class FileConfigStore : public provider::ConfigStore {
  public:
   bool LoadDefaults(Settings* settings) override;
   std::string LoadSettings() override;
diff --git a/libweave/examples/ubuntu/network_manager.cc b/libweave/examples/ubuntu/network_manager.cc
index fc033b5..4f94ef2 100644
--- a/libweave/examples/ubuntu/network_manager.cc
+++ b/libweave/examples/ubuntu/network_manager.cc
@@ -12,7 +12,7 @@
 #include <fstream>
 
 #include <base/bind.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/examples/ubuntu/ssl_stream.h"
 
@@ -21,6 +21,8 @@
 
 namespace {
 
+using provider::NetworkState;
+
 int ForkCmd(const std::string& path, const std::vector<std::string>& args) {
   int pid = fork();
   if (pid != 0)
@@ -38,7 +40,8 @@
 
 }  // namespace
 
-NetworkImpl::NetworkImpl(TaskRunner* task_runner, bool force_bootstrapping)
+NetworkImpl::NetworkImpl(provider::TaskRunner* task_runner,
+                         bool force_bootstrapping)
     : task_runner_{task_runner}, force_bootstrapping_{force_bootstrapping} {
   SSL_load_error_strings();
   SSL_library_init();
diff --git a/libweave/examples/ubuntu/network_manager.h b/libweave/examples/ubuntu/network_manager.h
index e59bc96..4df2a07 100644
--- a/libweave/examples/ubuntu/network_manager.h
+++ b/libweave/examples/ubuntu/network_manager.h
@@ -10,32 +10,35 @@
 
 #include <base/memory/weak_ptr.h>
 #include <base/time/time.h>
-#include <weave/network_provider.h>
-#include <weave/wifi_provider.h>
+#include <weave/provider/network.h>
+#include <weave/provider/wifi.h>
 
 namespace weave {
 
+namespace provider {
 class TaskRunner;
+}
 
 namespace examples {
 
 // Basic weave::Network implementation.
 // Production version of SSL socket needs secure server certificate check.
-class NetworkImpl : public NetworkProvider, public WifiProvider {
+class NetworkImpl : public provider::Network, public provider::Wifi {
  public:
-  explicit NetworkImpl(TaskRunner* task_runner, bool force_bootstrapping);
+  explicit NetworkImpl(provider::TaskRunner* task_runner,
+                       bool force_bootstrapping);
   ~NetworkImpl();
 
-  // NetworkProvider implementation.
+  // Network implementation.
   void AddConnectionChangedCallback(
       const ConnectionChangedCallback& callback) override;
-  NetworkState GetConnectionState() const override;
+  provider::NetworkState GetConnectionState() const override;
   void OpenSslSocket(const std::string& host,
                      uint16_t port,
                      const OpenSslSocketSuccessCallback& success_callback,
                      const ErrorCallback& error_callback) override;
 
-  // WifiProvider implementation.
+  // Wifi implementation.
   void Connect(const std::string& ssid,
                const std::string& passphrase,
                const SuccessCallback& success_callback,
@@ -56,9 +59,9 @@
 
   bool force_bootstrapping_{false};
   bool hostapd_started_{false};
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   std::vector<ConnectionChangedCallback> callbacks_;
-  NetworkState network_state_{NetworkState::kOffline};
+  provider::NetworkState network_state_{provider::NetworkState::kOffline};
 
   base::WeakPtrFactory<NetworkImpl> weak_ptr_factory_{this};
 };
diff --git a/libweave/examples/ubuntu/ssl_stream.cc b/libweave/examples/ubuntu/ssl_stream.cc
index a54578d..920648f 100644
--- a/libweave/examples/ubuntu/ssl_stream.cc
+++ b/libweave/examples/ubuntu/ssl_stream.cc
@@ -5,12 +5,13 @@
 #include "libweave/examples/ubuntu/ssl_stream.h"
 
 #include <base/bind.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 namespace weave {
 namespace examples {
 
-SSLStream::SSLStream(TaskRunner* task_runner) : task_runner_{task_runner} {}
+SSLStream::SSLStream(provider::TaskRunner* task_runner)
+    : task_runner_{task_runner} {}
 
 SSLStream::~SSLStream() {
   CancelPendingOperations();
diff --git a/libweave/examples/ubuntu/ssl_stream.h b/libweave/examples/ubuntu/ssl_stream.h
index 7343df9..ac0d76a 100644
--- a/libweave/examples/ubuntu/ssl_stream.h
+++ b/libweave/examples/ubuntu/ssl_stream.h
@@ -12,13 +12,15 @@
 
 namespace weave {
 
+namespace provider {
 class TaskRunner;
+}
 
 namespace examples {
 
 class SSLStream : public Stream {
  public:
-  explicit SSLStream(TaskRunner* task_runner);
+  explicit SSLStream(provider::TaskRunner* task_runner);
 
   ~SSLStream() override;
 
@@ -39,7 +41,7 @@
  private:
   void RunDelayedTask(const base::Closure& task);
 
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   std::unique_ptr<SSL_CTX, decltype(&SSL_CTX_free)> ctx_{nullptr, SSL_CTX_free};
   std::unique_ptr<SSL, decltype(&SSL_free)> ssl_{nullptr, SSL_free};
 
diff --git a/libweave/include/weave/bluetooth.h b/libweave/include/weave/bluetooth.h
deleted file mode 100644
index 69fdc5e..0000000
--- a/libweave/include/weave/bluetooth.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_BLUETOOTH_H_
-#define LIBWEAVE_INCLUDE_WEAVE_BLUETOOTH_H_
-
-namespace weave {
-
-class Bluetooth {
- public:
-  // TODO(rginda): Add bluetooth interface methods here.
-
- protected:
-  virtual ~Bluetooth() = default;
-};
-
-}  // namespace weave
-
-#endif  // LIBWEAVE_INCLUDE_WEAVE_BLUETOOTH_H_
diff --git a/libweave/include/weave/config_store.h b/libweave/include/weave/config_store.h
deleted file mode 100644
index 8a5af58..0000000
--- a/libweave/include/weave/config_store.h
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_CONFIG_STORE_H_
-#define LIBWEAVE_INCLUDE_WEAVE_CONFIG_STORE_H_
-
-#include <map>
-#include <set>
-#include <string>
-#include <vector>
-
-#include <base/callback.h>
-#include <base/time/time.h>
-#include <weave/enum_to_string.h>
-#include <weave/privet.h>
-
-namespace weave {
-
-struct Settings {
-  std::string client_id;
-  std::string client_secret;
-  std::string api_key;
-  std::string oauth_url;
-  std::string service_url;
-  std::string name;
-  std::string description;
-  std::string location;
-  std::string local_anonymous_access_role;
-  bool local_discovery_enabled{true};
-  bool local_pairing_enabled{true};
-  std::string firmware_version;
-  std::string oem_name;
-  std::string model_name;
-  std::string model_id;
-  base::TimeDelta polling_period;
-  base::TimeDelta backup_polling_period;
-
-  bool wifi_auto_setup_enabled{true};
-  bool ble_setup_enabled{false};
-  std::set<PairingType> pairing_modes;
-  std::string embedded_code;
-
-  std::string device_id;
-  std::string refresh_token;
-  std::string robot_account;
-  std::string last_configured_ssid;
-};
-
-class ConfigStore {
- public:
-  virtual bool LoadDefaults(Settings* settings) = 0;
-  virtual std::string LoadSettings() = 0;
-  virtual void SaveSettings(const std::string& settings) = 0;
-  virtual void OnSettingsChanged(const Settings& settings) = 0;
-
-  virtual std::string LoadBaseCommandDefs() = 0;
-  virtual std::map<std::string, std::string> LoadCommandDefs() = 0;
-
-  virtual std::string LoadBaseStateDefs() = 0;
-  virtual std::string LoadBaseStateDefaults() = 0;
-
-  virtual std::map<std::string, std::string> LoadStateDefs() = 0;
-  virtual std::vector<std::string> LoadStateDefaults() = 0;
-
- protected:
-  virtual ~ConfigStore() = default;
-};
-
-}  // namespace weave
-
-#endif  // LIBWEAVE_INCLUDE_WEAVE_CONFIG_STORE_H_
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h
index c6b70ea..6d1cd92 100644
--- a/libweave/include/weave/device.h
+++ b/libweave/include/weave/device.h
@@ -9,19 +9,19 @@
 #include <set>
 #include <string>
 
-#include <weave/bluetooth.h>
 #include <weave/cloud.h>
 #include <weave/commands.h>
-#include <weave/config_store.h>
-#include <weave/dns_service_discovery_provider.h>
 #include <weave/export.h>
-#include <weave/http_client.h>
-#include <weave/http_server.h>
-#include <weave/network_provider.h>
 #include <weave/privet.h>
+#include <weave/provider/bluetooth.h>
+#include <weave/provider/config_store.h>
+#include <weave/provider/dns_service_discovery.h>
+#include <weave/provider/http_client.h>
+#include <weave/provider/http_server.h>
+#include <weave/provider/network.h>
+#include <weave/provider/task_runner.h>
+#include <weave/provider/wifi.h>
 #include <weave/state.h>
-#include <weave/task_runner.h>
-#include <weave/wifi_provider.h>
 
 namespace weave {
 
@@ -38,14 +38,14 @@
   virtual ~Device() = default;
 
   virtual void Start(const Options& options,
-                     ConfigStore* config_store,
-                     TaskRunner* task_runner,
-                     HttpClient* http_client,
-                     NetworkProvider* network,
-                     DnsServiceDiscoveryProvider* dns_sd,
-                     HttpServer* http_server,
-                     WifiProvider* wifi,
-                     Bluetooth* bluetooth) = 0;
+                     provider::ConfigStore* config_store,
+                     provider::TaskRunner* task_runner,
+                     provider::HttpClient* http_client,
+                     provider::Network* network,
+                     provider::DnsServiceDiscovery* dns_sd,
+                     provider::HttpServer* http_server,
+                     provider::Wifi* wifi,
+                     provider::Bluetooth* bluetooth_provider) = 0;
 
   virtual Commands* GetCommands() = 0;
   virtual State* GetState() = 0;
diff --git a/libweave/include/weave/provider/bluetooth.h b/libweave/include/weave/provider/bluetooth.h
new file mode 100644
index 0000000..d87dcc0
--- /dev/null
+++ b/libweave/include/weave/provider/bluetooth.h
@@ -0,0 +1,23 @@
+// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_PROVIDER_BLUETOOTH_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_BLUETOOTH_H_
+
+namespace weave {
+namespace provider {
+
+// Interface with methods to control bluetooth capability of the device.
+class Bluetooth {
+ public:
+  // TODO(rginda): Add bluetooth interface methods here.
+
+ protected:
+  virtual ~Bluetooth() = default;
+};
+
+}  // namespace provider
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_BLUETOOTH_H_
diff --git a/libweave/include/weave/provider/config_store.h b/libweave/include/weave/provider/config_store.h
new file mode 100644
index 0000000..85cae42
--- /dev/null
+++ b/libweave/include/weave/provider/config_store.h
@@ -0,0 +1,44 @@
+// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_PROVIDER_CONFIG_STORE_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_CONFIG_STORE_H_
+
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+
+#include <base/callback.h>
+#include <base/time/time.h>
+#include <weave/enum_to_string.h>
+#include <weave/settings.h>
+
+namespace weave {
+namespace provider {
+
+class ConfigStore {
+ public:
+  virtual bool LoadDefaults(Settings* settings) = 0;
+  virtual std::string LoadSettings() = 0;
+  virtual void SaveSettings(const std::string& settings) = 0;
+  virtual void OnSettingsChanged(const Settings& settings) = 0;
+
+  virtual std::string LoadBaseCommandDefs() = 0;
+  virtual std::map<std::string, std::string> LoadCommandDefs() = 0;
+
+  virtual std::string LoadBaseStateDefs() = 0;
+  virtual std::string LoadBaseStateDefaults() = 0;
+
+  virtual std::map<std::string, std::string> LoadStateDefs() = 0;
+  virtual std::vector<std::string> LoadStateDefaults() = 0;
+
+ protected:
+  virtual ~ConfigStore() = default;
+};
+
+}  // namespace provider
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_CONFIG_STORE_H_
diff --git a/libweave/include/weave/dns_service_discovery_provider.h b/libweave/include/weave/provider/dns_service_discovery.h
similarity index 71%
rename from libweave/include/weave/dns_service_discovery_provider.h
rename to libweave/include/weave/provider/dns_service_discovery.h
index bdba69d..dfd94eb 100644
--- a/libweave/include/weave/dns_service_discovery_provider.h
+++ b/libweave/include/weave/provider/dns_service_discovery.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_DNS_SERVICE_DISCOVERY_PROVIDER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_DNS_SERVICE_DISCOVERY_PROVIDER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_DNS_SERVICE_DISCOVERY_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_DNS_SERVICE_DISCOVERY_H_
 
 #include <string>
 #include <vector>
@@ -11,8 +11,9 @@
 #include <base/callback.h>
 
 namespace weave {
+namespace provider {
 
-class DnsServiceDiscoveryProvider {
+class DnsServiceDiscovery {
  public:
   // Publishes new service using DNS-SD or updates existing one.
   virtual void PublishService(const std::string& service_type,
@@ -27,9 +28,10 @@
   virtual std::string GetId() const = 0;
 
  protected:
-  virtual ~DnsServiceDiscoveryProvider() = default;
+  virtual ~DnsServiceDiscovery() = default;
 };
 
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_DNS_SERVICE_DISCOVERY_PROVIDER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_DNS_SERVICE_DISCOVERY_H_
diff --git a/libweave/include/weave/http_client.h b/libweave/include/weave/provider/http_client.h
similarity index 87%
rename from libweave/include/weave/http_client.h
rename to libweave/include/weave/provider/http_client.h
index 6112271..9671f0d 100644
--- a/libweave/include/weave/http_client.h
+++ b/libweave/include/weave/provider/http_client.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_HTTP_CLIENT_H_
-#define LIBWEAVE_INCLUDE_WEAVE_HTTP_CLIENT_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_CLIENT_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_CLIENT_H_
 
 #include <string>
 #include <utility>
@@ -13,6 +13,7 @@
 #include <weave/error.h>
 
 namespace weave {
+namespace provider {
 
 class HttpClient {
  public:
@@ -49,6 +50,7 @@
   virtual ~HttpClient() = default;
 };
 
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_HTTP_CLIENT_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_CLIENT_H_
diff --git a/libweave/include/weave/http_server.h b/libweave/include/weave/provider/http_server.h
similarity index 88%
rename from libweave/include/weave/http_server.h
rename to libweave/include/weave/provider/http_server.h
index 2716600..1d4ab1e 100644
--- a/libweave/include/weave/http_server.h
+++ b/libweave/include/weave/provider/http_server.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_HTTP_SERVER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_HTTP_SERVER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_SERVER_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_SERVER_H_
 
 #include <string>
 #include <vector>
@@ -12,6 +12,7 @@
 #include <weave/stream.h>
 
 namespace weave {
+namespace provider {
 
 class HttpServer {
  public:
@@ -53,6 +54,7 @@
   virtual ~HttpServer() = default;
 };
 
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_HTTP_SERVER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_HTTP_SERVER_H_
diff --git a/libweave/include/weave/network_provider.h b/libweave/include/weave/provider/network.h
similarity index 84%
rename from libweave/include/weave/network_provider.h
rename to libweave/include/weave/provider/network.h
index ac1dcc8..bba60f0 100644
--- a/libweave/include/weave/network_provider.h
+++ b/libweave/include/weave/provider/network.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_NETWORK_PROVIDER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_NETWORK_PROVIDER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_NETWORK_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_NETWORK_H_
 
 #include <string>
 
@@ -12,6 +12,7 @@
 #include <weave/stream.h>
 
 namespace weave {
+namespace provider {
 
 enum class NetworkState {
   kOffline = 0,
@@ -22,7 +23,7 @@
 
 // Interface with methods to detect network connectivity and opening network
 // connections.
-class NetworkProvider {
+class Network {
  public:
   // Callback type for AddConnectionChangedCallback.
   using ConnectionChangedCallback = base::Closure;
@@ -48,9 +49,10 @@
       const ErrorCallback& error_callback) = 0;
 
  protected:
-  virtual ~NetworkProvider() = default;
+  virtual ~Network() = default;
 };
 
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_NETWORK_PROVIDER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_NETWORK_H_
diff --git a/libweave/include/weave/task_runner.h b/libweave/include/weave/provider/task_runner.h
similarity index 80%
rename from libweave/include/weave/task_runner.h
rename to libweave/include/weave/provider/task_runner.h
index 43b81b7..daabc7e 100644
--- a/libweave/include/weave/task_runner.h
+++ b/libweave/include/weave/provider/task_runner.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TASK_RUNNER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TASK_RUNNER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TASK_RUNNER_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TASK_RUNNER_H_
 
 #include <string>
 #include <utility>
@@ -14,6 +14,7 @@
 #include <base/time/time.h>
 
 namespace weave {
+namespace provider {
 
 // Interface with methods to post tasks into platform-specific message loop of
 // the current thread.
@@ -30,6 +31,7 @@
   virtual ~TaskRunner() = default;
 };
 
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TASK_RUNNER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TASK_RUNNER_H_
diff --git a/libweave/include/weave/test/mock_bluetooth.h b/libweave/include/weave/provider/test/mock_bluetooth.h
similarity index 73%
rename from libweave/include/weave/test/mock_bluetooth.h
rename to libweave/include/weave/provider/test/mock_bluetooth.h
index d02e314..d572fa4 100644
--- a/libweave/include/weave/test/mock_bluetooth.h
+++ b/libweave/include/weave/provider/test/mock_bluetooth.h
@@ -14,12 +14,13 @@
  * limitations under the License.
  */
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_BLUETOOTH_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_BLUETOOTH_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_BLUETOOTH_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_BLUETOOTH_H_
 
-#include <weave/bluetooth.h>
+#include <weave/provider/bluetooth.h>
 
 namespace weave {
+namespace provider {
 namespace test {
 
 class MockBluetooth : public Bluetooth {
@@ -27,6 +28,7 @@
 };
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_BLUETOOTH_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_BLUETOOTH_H_
diff --git a/libweave/include/weave/test/mock_config_store.h b/libweave/include/weave/provider/test/mock_config_store.h
similarity index 81%
rename from libweave/include/weave/test/mock_config_store.h
rename to libweave/include/weave/provider/test/mock_config_store.h
index 357db6e..7bc0db7 100644
--- a/libweave/include/weave/test/mock_config_store.h
+++ b/libweave/include/weave/provider/test/mock_config_store.h
@@ -2,17 +2,18 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_CONFIG_STORE_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_CONFIG_STORE_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_CONFIG_STORE_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_CONFIG_STORE_H_
 
 #include <map>
 #include <string>
 #include <vector>
 
 #include <gmock/gmock.h>
-#include <weave/config_store.h>
+#include <weave/provider/config_store.h>
 
 namespace weave {
+namespace provider {
 namespace test {
 
 class MockConfigStore : public ConfigStore {
@@ -42,6 +43,7 @@
 };
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_CONFIG_STORE_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_CONFIG_STORE_H_
diff --git a/libweave/include/weave/provider/test/mock_dns_service_discovery.h b/libweave/include/weave/provider/test/mock_dns_service_discovery.h
new file mode 100644
index 0000000..cfb070e
--- /dev/null
+++ b/libweave/include/weave/provider/test/mock_dns_service_discovery.h
@@ -0,0 +1,33 @@
+// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_DNS_SERVICE_DISCOVERY_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_DNS_SERVICE_DISCOVERY_H_
+
+#include <weave/provider/dns_service_discovery.h>
+
+#include <string>
+#include <vector>
+
+#include <gmock/gmock.h>
+
+namespace weave {
+namespace provider {
+namespace test {
+
+class MockDnsServiceDiscovery : public DnsServiceDiscovery {
+ public:
+  MOCK_METHOD3(PublishService,
+               void(const std::string&,
+                    uint16_t,
+                    const std::vector<std::string>&));
+  MOCK_METHOD1(StopPublishing, void(const std::string&));
+  MOCK_CONST_METHOD0(GetId, std::string());
+};
+
+}  // namespace test
+}  // namespace provider
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_DNS_SERVICE_DISCOVERY_H_
diff --git a/libweave/include/weave/test/mock_http_client.h b/libweave/include/weave/provider/test/mock_http_client.h
similarity index 84%
rename from libweave/include/weave/test/mock_http_client.h
rename to libweave/include/weave/provider/test/mock_http_client.h
index f5c04ea..21af699 100644
--- a/libweave/include/weave/test/mock_http_client.h
+++ b/libweave/include/weave/provider/test/mock_http_client.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_HTTP_CLIENT_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_HTTP_CLIENT_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_HTTP_CLIENT_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_HTTP_CLIENT_H_
 
-#include <weave/http_client.h>
+#include <weave/provider/http_client.h>
 
 #include <memory>
 #include <string>
@@ -13,6 +13,7 @@
 #include <gmock/gmock.h>
 
 namespace weave {
+namespace provider {
 namespace test {
 
 class MockHttpClientResponse : public HttpClient::Response {
@@ -48,6 +49,7 @@
 };
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_HTTP_CLIENT_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_HTTP_CLIENT_H_
diff --git a/libweave/include/weave/test/mock_http_server.h b/libweave/include/weave/provider/test/mock_http_server.h
similarity index 71%
rename from libweave/include/weave/test/mock_http_server.h
rename to libweave/include/weave/provider/test/mock_http_server.h
index 9f8bbcc..3beb4ae 100644
--- a/libweave/include/weave/test/mock_http_server.h
+++ b/libweave/include/weave/provider/test/mock_http_server.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_HTTP_SERVER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_HTTP_SERVER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_HTTP_SERVER_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_HTTP_SERVER_H_
 
-#include <weave/http_server.h>
+#include <weave/provider/http_server.h>
 
 #include <string>
 #include <vector>
@@ -13,6 +13,7 @@
 #include <base/callback.h>
 
 namespace weave {
+namespace provider {
 namespace test {
 
 class MockHttpServer : public HttpServer {
@@ -27,6 +28,7 @@
 };
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_HTTP_SERVER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_HTTP_SERVER_H_
diff --git a/libweave/include/weave/test/mock_network_provider.h b/libweave/include/weave/provider/test/mock_network.h
similarity index 68%
rename from libweave/include/weave/test/mock_network_provider.h
rename to libweave/include/weave/provider/test/mock_network.h
index c519f74..3da43be 100644
--- a/libweave/include/weave/test/mock_network_provider.h
+++ b/libweave/include/weave/provider/test/mock_network.h
@@ -2,19 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_NETWORK_PROVIDER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_NETWORK_PROVIDER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_NETWORK_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_NETWORK_H_
 
-#include <weave/network_provider.h>
+#include <weave/provider/network.h>
 
 #include <string>
 
 #include <gmock/gmock.h>
 
 namespace weave {
+namespace provider {
 namespace test {
 
-class MockNetworkProvider : public NetworkProvider {
+class MockNetwork : public Network {
  public:
   MOCK_METHOD1(AddConnectionChangedCallback,
                void(const ConnectionChangedCallback&));
@@ -27,6 +28,7 @@
 };
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_NETWORK_PROVIDER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_NETWORK_H_
diff --git a/libweave/include/weave/test/mock_task_runner.h b/libweave/include/weave/provider/test/mock_task_runner.h
similarity index 82%
rename from libweave/include/weave/test/mock_task_runner.h
rename to libweave/include/weave/provider/test/mock_task_runner.h
index 0aa3186..3c58614 100644
--- a/libweave/include/weave/test/mock_task_runner.h
+++ b/libweave/include/weave/provider/test/mock_task_runner.h
@@ -2,10 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_TASK_RUNNER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_TASK_RUNNER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_TASK_RUNNER_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_TASK_RUNNER_H_
 
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 #include <algorithm>
 #include <queue>
@@ -16,6 +16,7 @@
 #include <gmock/gmock.h>
 
 namespace weave {
+namespace provider {
 namespace test {
 
 class MockTaskRunner : public TaskRunner {
@@ -58,6 +59,7 @@
 };
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_TASK_RUNNER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_TASK_RUNNER_H_
diff --git a/libweave/include/weave/test/mock_wifi_provider.h b/libweave/include/weave/provider/test/mock_wifi.h
similarity index 66%
rename from libweave/include/weave/test/mock_wifi_provider.h
rename to libweave/include/weave/provider/test/mock_wifi.h
index 408e0ad..6c53d9a 100644
--- a/libweave/include/weave/test/mock_wifi_provider.h
+++ b/libweave/include/weave/provider/test/mock_wifi.h
@@ -2,19 +2,20 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_WIFI_PROVIDER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_WIFI_PROVIDER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_WIFI_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_WIFI_H_
 
-#include <weave/network_provider.h>
+#include <weave/provider/network.h>
 
 #include <string>
 
 #include <gmock/gmock.h>
 
 namespace weave {
+namespace provider {
 namespace test {
 
-class MockWifiProvider : public WifiProvider {
+class MockWifi : public Wifi {
  public:
   MOCK_METHOD4(Connect,
                void(const std::string&,
@@ -26,6 +27,7 @@
 };
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_WIFI_PROVIDER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_TEST_MOCK_WIFI_H_
diff --git a/libweave/include/weave/wifi_provider.h b/libweave/include/weave/provider/wifi.h
similarity index 78%
rename from libweave/include/weave/wifi_provider.h
rename to libweave/include/weave/provider/wifi.h
index 4173796..51f370c 100644
--- a/libweave/include/weave/wifi_provider.h
+++ b/libweave/include/weave/provider/wifi.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef LIBWEAVE_INCLUDE_WEAVE_WIFI_PROVIDER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_WIFI_PROVIDER_H_
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PROVIDER_WIFI_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PROVIDER_WIFI_H_
 
 #include <string>
 
@@ -11,9 +11,10 @@
 #include <weave/error.h>
 
 namespace weave {
+namespace provider {
 
 // Interface with methods to control WiFi capability of the device.
-class WifiProvider {
+class Wifi {
  public:
   // Connects to the given network with the given pass-phrase. Implementation
   // should post either of callbacks.
@@ -29,9 +30,10 @@
   virtual void StopAccessPoint() = 0;
 
  protected:
-  virtual ~WifiProvider() = default;
+  virtual ~Wifi() = default;
 };
 
+}  // namespace provider
 }  // namespace weave
 
-#endif  // LIBWEAVE_INCLUDE_WEAVE_WIFI_PROVIDER_H_
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PROVIDER_WIFI_H_
diff --git a/libweave/include/weave/settings.h b/libweave/include/weave/settings.h
new file mode 100644
index 0000000..fa32b86
--- /dev/null
+++ b/libweave/include/weave/settings.h
@@ -0,0 +1,48 @@
+// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_SETTINGS_H_
+#define LIBWEAVE_INCLUDE_WEAVE_SETTINGS_H_
+
+#include <set>
+#include <string>
+
+#include <base/time/time.h>
+#include <weave/privet.h>
+
+namespace weave {
+
+struct Settings {
+  std::string client_id;
+  std::string client_secret;
+  std::string api_key;
+  std::string oauth_url;
+  std::string service_url;
+  std::string name;
+  std::string description;
+  std::string location;
+  std::string local_anonymous_access_role;
+  bool local_discovery_enabled{true};
+  bool local_pairing_enabled{true};
+  std::string firmware_version;
+  std::string oem_name;
+  std::string model_name;
+  std::string model_id;
+  base::TimeDelta polling_period;
+  base::TimeDelta backup_polling_period;
+
+  bool wifi_auto_setup_enabled{true};
+  bool ble_setup_enabled{false};
+  std::set<PairingType> pairing_modes;
+  std::string embedded_code;
+
+  std::string device_id;
+  std::string refresh_token;
+  std::string robot_account;
+  std::string last_configured_ssid;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_SETTINGS_H_
diff --git a/libweave/include/weave/test/fake_stream.h b/libweave/include/weave/test/fake_stream.h
index 3c21571..8abb491 100644
--- a/libweave/include/weave/test/fake_stream.h
+++ b/libweave/include/weave/test/fake_stream.h
@@ -14,14 +14,16 @@
 
 namespace weave {
 
+namespace provider {
 class TaskRunner;
+}
 
 namespace test {
 
 class FakeStream : public Stream {
  public:
-  explicit FakeStream(TaskRunner* task_runner);
-  FakeStream(TaskRunner* task_runner, const std::string& read_data);
+  explicit FakeStream(provider::TaskRunner* task_runner);
+  FakeStream(provider::TaskRunner* task_runner, const std::string& read_data);
 
   void ExpectWritePacketString(base::TimeDelta, const std::string& data);
   void AddReadPacketString(base::TimeDelta, const std::string& data);
@@ -37,7 +39,7 @@
              const ErrorCallback& error_callback) override;
 
  private:
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   std::string write_data_;
   std::string read_data_;
 };
diff --git a/libweave/include/weave/test/mock_dns_service_discovery_provider.h b/libweave/include/weave/test/mock_dns_service_discovery_provider.h
deleted file mode 100644
index 6d187f8..0000000
--- a/libweave/include/weave/test/mock_dns_service_discovery_provider.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2015 The Chromium OS 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 LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_DNS_SERVICE_DISCOVERY_PROVIDER_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_DNS_SERVICE_DISCOVERY_PROVIDER_H_
-
-#include <weave/dns_service_discovery_provider.h>
-
-#include <string>
-#include <vector>
-
-#include <gmock/gmock.h>
-
-namespace weave {
-namespace test {
-
-class MockDnsServiceDiscovery : public DnsServiceDiscoveryProvider {
- public:
-  MOCK_METHOD3(PublishService,
-               void(const std::string&,
-                    uint16_t,
-                    const std::vector<std::string>&));
-  MOCK_METHOD1(StopPublishing, void(const std::string&));
-  MOCK_CONST_METHOD0(GetId, std::string());
-};
-
-}  // namespace test
-}  // namespace weave
-
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TEST_MOCK_DNS_SERVICE_DISCOVERY_PROVIDER_H_
diff --git a/libweave/src/base_api_handler_unittest.cc b/libweave/src/base_api_handler_unittest.cc
index 2e67822..52f9574 100644
--- a/libweave/src/base_api_handler_unittest.cc
+++ b/libweave/src/base_api_handler_unittest.cc
@@ -7,8 +7,8 @@
 #include <base/strings/string_number_conversions.h>
 #include <base/values.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_config_store.h>
-#include <weave/test/mock_http_client.h>
+#include <weave/provider/test/mock_config_store.h>
+#include <weave/provider/test/mock_http_client.h>
 
 #include "libweave/src/commands/command_manager.h"
 #include "libweave/src/commands/unittest_utils.h"
@@ -65,8 +65,8 @@
     std::unique_ptr<Config> config{new Config{&config_store_}};
     config->Load();
     dev_reg_.reset(new DeviceRegistrationInfo(command_manager_, state_manager_,
-                                              std::move(config), nullptr,
-                                              &http_client_, true, nullptr));
+                                              true, std::move(config), nullptr,
+                                              &http_client_, nullptr));
     handler_.reset(
         new BaseApiHandler{dev_reg_.get(), state_manager_, command_manager_});
   }
@@ -91,8 +91,8 @@
               command_manager_->FindCommand(id)->GetStatus());
   }
 
-  test::MockConfigStore config_store_;
-  StrictMock<test::MockHttpClient> http_client_;
+  provider::test::MockConfigStore config_store_;
+  StrictMock<provider::test::MockHttpClient> http_client_;
   std::unique_ptr<DeviceRegistrationInfo> dev_reg_;
   std::shared_ptr<CommandManager> command_manager_;
   testing::StrictMock<MockStateChangeQueueInterface> mock_state_change_queue_;
diff --git a/libweave/src/commands/cloud_command_proxy.cc b/libweave/src/commands/cloud_command_proxy.cc
index d38fa04..23517b5 100644
--- a/libweave/src/commands/cloud_command_proxy.cc
+++ b/libweave/src/commands/cloud_command_proxy.cc
@@ -6,7 +6,7 @@
 
 #include <base/bind.h>
 #include <weave/enum_to_string.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/src/commands/command_instance.h"
 #include "libweave/src/commands/prop_constraints.h"
@@ -20,7 +20,7 @@
     CloudCommandUpdateInterface* cloud_command_updater,
     StateChangeQueueInterface* state_change_queue,
     std::unique_ptr<BackoffEntry> backoff_entry,
-    TaskRunner* task_runner)
+    provider::TaskRunner* task_runner)
     : command_instance_{command_instance},
       cloud_command_updater_{cloud_command_updater},
       state_change_queue_{state_change_queue},
diff --git a/libweave/src/commands/cloud_command_proxy.h b/libweave/src/commands/cloud_command_proxy.h
index 2dcb697..5195294 100644
--- a/libweave/src/commands/cloud_command_proxy.h
+++ b/libweave/src/commands/cloud_command_proxy.h
@@ -22,7 +22,10 @@
 namespace weave {
 
 class CommandInstance;
+
+namespace provider {
 class TaskRunner;
+}
 
 // Command proxy which publishes command updates to the cloud.
 class CloudCommandProxy final : public Command::Observer {
@@ -31,7 +34,7 @@
                     CloudCommandUpdateInterface* cloud_command_updater,
                     StateChangeQueueInterface* state_change_queue,
                     std::unique_ptr<BackoffEntry> backoff_entry,
-                    TaskRunner* task_runner);
+                    provider::TaskRunner* task_runner);
   ~CloudCommandProxy() override = default;
 
   // CommandProxyInterface implementation/overloads.
@@ -70,7 +73,7 @@
   CommandInstance* command_instance_;
   CloudCommandUpdateInterface* cloud_command_updater_;
   StateChangeQueueInterface* state_change_queue_;
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
 
   // Backoff for SendCommandUpdate() method.
   std::unique_ptr<BackoffEntry> cloud_backoff_entry_;
diff --git a/libweave/src/commands/cloud_command_proxy_unittest.cc b/libweave/src/commands/cloud_command_proxy_unittest.cc
index fb881d1..3a3ce38 100644
--- a/libweave/src/commands/cloud_command_proxy_unittest.cc
+++ b/libweave/src/commands/cloud_command_proxy_unittest.cc
@@ -9,7 +9,7 @@
 
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_task_runner.h>
+#include <weave/provider/test/mock_task_runner.h>
 
 #include "libweave/src/commands/command_dictionary.h"
 #include "libweave/src/commands/command_instance.h"
@@ -136,7 +136,7 @@
   base::CallbackList<void(StateChangeQueueInterface::UpdateID)> callbacks_;
   testing::StrictMock<MockCloudCommandUpdateInterface> cloud_updater_;
   testing::StrictMock<MockStateChangeQueueInterface> state_change_queue_;
-  testing::StrictMock<test::MockTaskRunner> task_runner_;
+  testing::StrictMock<provider::test::MockTaskRunner> task_runner_;
   std::queue<base::Closure> task_queue_;
   CommandDictionary command_dictionary_;
   std::unique_ptr<CommandInstance> command_instance_;
diff --git a/libweave/src/commands/command_manager.cc b/libweave/src/commands/command_manager.cc
index efad250..8a3237e 100644
--- a/libweave/src/commands/command_manager.cc
+++ b/libweave/src/commands/command_manager.cc
@@ -5,9 +5,9 @@
 #include "libweave/src/commands/command_manager.h"
 
 #include <base/values.h>
-#include <weave/config_store.h>
 #include <weave/enum_to_string.h>
 #include <weave/error.h>
+#include <weave/provider/config_store.h>
 
 #include "libweave/src/commands/schema_constants.h"
 #include "libweave/src/utils.h"
@@ -59,7 +59,7 @@
   return LoadCommands(*dict, category, error);
 }
 
-void CommandManager::Startup(ConfigStore* config_store) {
+void CommandManager::Startup(provider::ConfigStore* config_store) {
   LOG(INFO) << "Initializing CommandManager.";
 
   // Load global standard GCD command dictionary.
diff --git a/libweave/src/commands/command_manager.h b/libweave/src/commands/command_manager.h
index e014fca..6db1ef4 100644
--- a/libweave/src/commands/command_manager.h
+++ b/libweave/src/commands/command_manager.h
@@ -20,7 +20,10 @@
 namespace weave {
 
 class CommandInstance;
+
+namespace provider {
 class ConfigStore;
+}
 
 // CommandManager class that will have a list of all the device command
 // schemas as well as the live command queue of pending command instances
@@ -78,7 +81,7 @@
   // Initializes the object and loads:
   //   1) the standard GCD command dictionary
   //   2) static vendor-provided command definitions
-  void Startup(weave::ConfigStore* config_store);
+  void Startup(weave::provider::ConfigStore* config_store);
 
   // Adds a new command to the command queue.
   void AddCommand(std::unique_ptr<CommandInstance> command_instance);
diff --git a/libweave/src/commands/command_manager_unittest.cc b/libweave/src/commands/command_manager_unittest.cc
index 2e7ce27..b97799d 100644
--- a/libweave/src/commands/command_manager_unittest.cc
+++ b/libweave/src/commands/command_manager_unittest.cc
@@ -8,7 +8,7 @@
 
 #include <base/json/json_writer.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_config_store.h>
+#include <weave/provider/test/mock_config_store.h>
 
 #include "libweave/src/bind_lambda.h"
 #include "libweave/src/commands/unittest_utils.h"
@@ -115,7 +115,7 @@
 
 TEST(CommandManager, ShouldLoadStandardAndTestDefinitions) {
   CommandManager manager;
-  test::MockConfigStore config_store;
+  provider::test::MockConfigStore config_store;
   EXPECT_CALL(config_store, LoadBaseCommandDefs())
       .WillOnce(Return(kTestBaseCommands));
   EXPECT_CALL(config_store, LoadCommandDefs())
diff --git a/libweave/src/config.cc b/libweave/src/config.cc
index 5783486..55b0c7b 100644
--- a/libweave/src/config.cc
+++ b/libweave/src/config.cc
@@ -70,10 +70,10 @@
 
 }  // namespace
 
-Config::Config(ConfigStore* config_store)
+Config::Config(provider::ConfigStore* config_store)
     : settings_{CreateDefaultSettings()}, config_store_{config_store} {
   if (config_store_) {
-    AddOnChangedCallback(base::Bind(&ConfigStore::OnSettingsChanged,
+    AddOnChangedCallback(base::Bind(&provider::ConfigStore::OnSettingsChanged,
                                     base::Unretained(config_store_)));
   }
 }
diff --git a/libweave/src/config.h b/libweave/src/config.h
index 2da5d0b..c25ff6e 100644
--- a/libweave/src/config.h
+++ b/libweave/src/config.h
@@ -10,8 +10,8 @@
 #include <vector>
 
 #include <base/callback.h>
-#include <weave/config_store.h>
 #include <weave/error.h>
+#include <weave/provider/config_store.h>
 
 #include "libweave/src/privet/security_delegate.h"
 
@@ -25,7 +25,7 @@
   using OnChangedCallback = base::Callback<void(const Settings&)>;
   ~Config() = default;
 
-  explicit Config(ConfigStore* config_store);
+  explicit Config(provider::ConfigStore* config_store);
 
   void AddOnChangedCallback(const OnChangedCallback& callback);
   const Settings& GetSettings() const;
@@ -93,7 +93,7 @@
   void Save();
 
   Settings settings_;
-  ConfigStore* config_store_{nullptr};
+  provider::ConfigStore* config_store_{nullptr};
   std::vector<OnChangedCallback> on_changed_;
 
   DISALLOW_COPY_AND_ASSIGN(Config);
diff --git a/libweave/src/config_unittest.cc b/libweave/src/config_unittest.cc
index ec9b5a0..8968b50 100644
--- a/libweave/src/config_unittest.cc
+++ b/libweave/src/config_unittest.cc
@@ -9,7 +9,7 @@
 #include <base/bind.h>
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_config_store.h>
+#include <weave/provider/test/mock_config_store.h>
 
 #include "libweave/src/commands/unittest_utils.h"
 
@@ -35,7 +35,7 @@
 
   MOCK_METHOD1(OnConfigChanged, void(const Settings&));
 
-  test::MockConfigStore config_store_;
+  provider::test::MockConfigStore config_store_;
   std::unique_ptr<Config> config_;
   const Config default_{nullptr};
 };
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
index 4e8479e..f8c4ef6 100644
--- a/libweave/src/device_manager.cc
+++ b/libweave/src/device_manager.cc
@@ -30,14 +30,14 @@
 DeviceManager::~DeviceManager() {}
 
 void DeviceManager::Start(const Options& options,
-                          ConfigStore* config_store,
-                          TaskRunner* task_runner,
-                          HttpClient* http_client,
-                          NetworkProvider* network,
-                          DnsServiceDiscoveryProvider* dns_sd,
-                          HttpServer* http_server,
-                          WifiProvider* wifi,
-                          Bluetooth* bluetooth) {
+                          provider::ConfigStore* config_store,
+                          provider::TaskRunner* task_runner,
+                          provider::HttpClient* http_client,
+                          provider::Network* network,
+                          provider::DnsServiceDiscovery* dns_sd,
+                          provider::HttpServer* http_server,
+                          provider::Wifi* wifi,
+                          provider::Bluetooth* bluetooth) {
   command_manager_ = std::make_shared<CommandManager>();
   command_manager_->Startup(config_store);
   state_change_queue_.reset(new StateChangeQueue(kMaxStateChangeQueueSize));
@@ -50,8 +50,8 @@
   // TODO(avakulenko): Figure out security implications of storing
   // device info state data unencrypted.
   device_info_.reset(new DeviceRegistrationInfo(
-      command_manager_, state_manager_, std::move(config), task_runner,
-      http_client, options.xmpp_enabled, network));
+      command_manager_, state_manager_, options.xmpp_enabled, std::move(config),
+      task_runner, http_client, network));
   base_api_handler_.reset(
       new BaseApiHandler{device_info_.get(), state_manager_, command_manager_});
 
@@ -87,12 +87,12 @@
 }
 
 void DeviceManager::StartPrivet(const Options& options,
-                                TaskRunner* task_runner,
-                                NetworkProvider* network,
-                                DnsServiceDiscoveryProvider* dns_sd,
-                                HttpServer* http_server,
-                                WifiProvider* wifi,
-                                Bluetooth* bluetooth) {
+                                provider::TaskRunner* task_runner,
+                                provider::Network* network,
+                                provider::DnsServiceDiscovery* dns_sd,
+                                provider::HttpServer* http_server,
+                                provider::Wifi* wifi,
+                                provider::Bluetooth* bluetooth) {
   privet_.reset(new privet::Manager{});
   privet_->Start(options, task_runner, network, dns_sd, http_server, wifi,
                  device_info_.get(), command_manager_.get(),
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h
index 3441dde..9a603fd 100644
--- a/libweave/src/device_manager.h
+++ b/libweave/src/device_manager.h
@@ -27,14 +27,14 @@
   ~DeviceManager() override;
 
   void Start(const Options& options,
-             ConfigStore* config_store,
-             TaskRunner* task_runner,
-             HttpClient* http_client,
-             NetworkProvider* network,
-             DnsServiceDiscoveryProvider* dns_sd,
-             HttpServer* http_server,
-             WifiProvider* wifi,
-             Bluetooth* bluetooth) override;
+             provider::ConfigStore* config_store,
+             provider::TaskRunner* task_runner,
+             provider::HttpClient* http_client,
+             provider::Network* network,
+             provider::DnsServiceDiscovery* dns_sd,
+             provider::HttpServer* http_server,
+             provider::Wifi* wifi,
+             provider::Bluetooth* bluetooth) override;
 
   Commands* GetCommands() override;
   State* GetState() override;
@@ -45,12 +45,12 @@
 
  private:
   void StartPrivet(const Options& options,
-                   TaskRunner* task_runner,
-                   NetworkProvider* network,
-                   DnsServiceDiscoveryProvider* dns_sd,
-                   HttpServer* http_server,
-                   WifiProvider* wifi,
-                   Bluetooth* bluetooth);
+                   provider::TaskRunner* task_runner,
+                   provider::Network* network,
+                   provider::DnsServiceDiscovery* dns_sd,
+                   provider::HttpServer* http_server,
+                   provider::Wifi* wifi,
+                   provider::Bluetooth* bluetooth);
 
   void OnWiFiBootstrapStateChanged(weave::WifiSetupState state);
 
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc
index 91f522a..66fe25f 100644
--- a/libweave/src/device_registration_info.cc
+++ b/libweave/src/device_registration_info.cc
@@ -15,9 +15,9 @@
 #include <base/json/json_writer.h>
 #include <base/strings/string_number_conversions.h>
 #include <base/values.h>
-#include <weave/http_client.h>
-#include <weave/network_provider.h>
-#include <weave/task_runner.h>
+#include <weave/provider/http_client.h>
+#include <weave/provider/network.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/src/bind_lambda.h"
 #include "libweave/src/commands/cloud_command_proxy.h"
@@ -40,6 +40,8 @@
 
 namespace {
 
+using provider::HttpClient;
+
 inline void SetUnexpectedError(ErrorPtr* error) {
   Error::AddTo(error, FROM_HERE, kErrorDomainGCD, "unexpected_response",
                "Unexpected GCD error");
@@ -113,7 +115,8 @@
                 HttpClient* transport)
       : method_{method}, url_{url}, transport_{transport} {}
 
-  std::unique_ptr<HttpClient::Response> SendAndBlock(ErrorPtr* error) {
+  std::unique_ptr<provider::HttpClient::Response> SendAndBlock(
+      ErrorPtr* error) {
     return transport_->SendRequestAndBlock(method_, url_, GetFullHeaders(),
                                            data_, error);
   }
@@ -213,11 +216,11 @@
 DeviceRegistrationInfo::DeviceRegistrationInfo(
     const std::shared_ptr<CommandManager>& command_manager,
     const std::shared_ptr<StateManager>& state_manager,
-    std::unique_ptr<Config> config,
-    TaskRunner* task_runner,
-    HttpClient* http_client,
     bool notifications_enabled,
-    NetworkProvider* network)
+    std::unique_ptr<Config> config,
+    provider::TaskRunner* task_runner,
+    provider::HttpClient* http_client,
+    provider::Network* network)
     : http_client_{http_client},
       task_runner_{task_runner},
       command_manager_{command_manager},
diff --git a/libweave/src/device_registration_info.h b/libweave/src/device_registration_info.h
index 8db6a88..9cc1a51 100644
--- a/libweave/src/device_registration_info.h
+++ b/libweave/src/device_registration_info.h
@@ -17,7 +17,7 @@
 #include <base/time/time.h>
 #include <weave/error.h>
 #include <weave/cloud.h>
-#include <weave/http_client.h>
+#include <weave/provider/http_client.h>
 
 #include "libweave/src/backoff_entry.h"
 #include "libweave/src/commands/cloud_command_update_interface.h"
@@ -33,15 +33,14 @@
 class DictionaryValue;
 }  // namespace base
 
-namespace chromeos {
-class KeyValueStore;
-}  // namespace chromeos
-
 namespace weave {
 
-class NetworkProvider;
 class StateManager;
+
+namespace provider {
+class Network;
 class TaskRunner;
+}
 
 extern const char kErrorDomainOAuth2[];
 extern const char kErrorDomainGCD[];
@@ -58,11 +57,11 @@
 
   DeviceRegistrationInfo(const std::shared_ptr<CommandManager>& command_manager,
                          const std::shared_ptr<StateManager>& state_manager,
-                         std::unique_ptr<Config> config,
-                         TaskRunner* task_runner,
-                         HttpClient* http_client,
                          bool notifications_enabled,
-                         NetworkProvider* network);
+                         std::unique_ptr<Config> config,
+                         provider::TaskRunner* task_runner,
+                         provider::HttpClient* http_client,
+                         provider::Network* network);
 
   ~DeviceRegistrationInfo() override;
 
@@ -162,7 +161,7 @@
       const std::shared_ptr<base::Closure>& success_callback,
       const std::shared_ptr<CloudRequestErrorCallback>& error_callback,
       int id,
-      const HttpClient::Response& response);
+      const provider::HttpClient::Response& response);
   void OnRefreshAccessTokenError(
       const std::shared_ptr<base::Closure>& success_callback,
       const std::shared_ptr<CloudRequestErrorCallback>& error_callback,
@@ -172,7 +171,7 @@
   // Parse the OAuth response, and sets registration status to
   // kInvalidCredentials if our registration is no longer valid.
   std::unique_ptr<base::DictionaryValue> ParseOAuthResponse(
-      const HttpClient::Response& response,
+      const provider::HttpClient::Response& response,
       ErrorPtr* error);
 
   // This attempts to open a notification channel. The channel needs to be
@@ -202,7 +201,7 @@
   void OnCloudRequestSuccess(
       const std::shared_ptr<const CloudRequestData>& data,
       int request_id,
-      const HttpClient::Response& response);
+      const provider::HttpClient::Response& response);
   void OnCloudRequestError(const std::shared_ptr<const CloudRequestData>& data,
                            int request_id,
                            const Error* error);
@@ -297,9 +296,9 @@
   bool connected_to_cloud_{false};
 
   // HTTP transport used for communications.
-  HttpClient* http_client_{nullptr};
+  provider::HttpClient* http_client_{nullptr};
 
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   // Global command manager.
   std::shared_ptr<CommandManager> command_manager_;
   // Device state manager.
@@ -337,7 +336,7 @@
   NotificationChannel* current_notification_channel_{nullptr};
   bool notification_channel_starting_{false};
 
-  NetworkProvider* network_{nullptr};
+  provider::Network* network_{nullptr};
 
   // Tracks our current registration status.
   RegistrationStatus registration_status_{RegistrationStatus::kUnconfigured};
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc
index 8bbf987..f2fec8d 100644
--- a/libweave/src/device_registration_info_unittest.cc
+++ b/libweave/src/device_registration_info_unittest.cc
@@ -8,8 +8,8 @@
 #include <base/json/json_writer.h>
 #include <base/values.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_config_store.h>
-#include <weave/test/mock_http_client.h>
+#include <weave/provider/test/mock_config_store.h>
+#include <weave/provider/test/mock_http_client.h>
 
 #include "libweave/src/bind_lambda.h"
 #include "libweave/src/commands/command_manager.h"
@@ -34,8 +34,9 @@
 
 using test::CreateDictionaryValue;
 using test::CreateValue;
-using test::MockHttpClient;
-using test::MockHttpClientResponse;
+using provider::test::MockHttpClient;
+using provider::test::MockHttpClientResponse;
+using provider::HttpClient;
 
 namespace {
 
@@ -122,8 +123,8 @@
     std::unique_ptr<Config> config{new Config{&config_store_}};
     config_ = config.get();
     dev_reg_.reset(new DeviceRegistrationInfo{command_manager_, state_manager_,
-                                              std::move(config), nullptr,
-                                              &http_client_, true, nullptr});
+                                              true, std::move(config), nullptr,
+                                              &http_client_, nullptr});
 
     ReloadDefaults();
   }
@@ -181,7 +182,7 @@
     return dev_reg_->registration_status_;
   }
 
-  test::MockConfigStore config_store_;
+  provider::test::MockConfigStore config_store_;
   StrictMock<MockHttpClient> http_client_;
   base::DictionaryValue data_;
   Config* config_{nullptr};
diff --git a/libweave/src/notification/pull_channel.cc b/libweave/src/notification/pull_channel.cc
index 2342e7d..78bfdcf 100644
--- a/libweave/src/notification/pull_channel.cc
+++ b/libweave/src/notification/pull_channel.cc
@@ -6,13 +6,14 @@
 
 #include <base/bind.h>
 #include <base/location.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/src/notification/notification_delegate.h"
 
 namespace weave {
 
-PullChannel::PullChannel(base::TimeDelta pull_interval, TaskRunner* task_runner)
+PullChannel::PullChannel(base::TimeDelta pull_interval,
+                         provider::TaskRunner* task_runner)
     : pull_interval_{pull_interval}, task_runner_{task_runner} {}
 
 std::string PullChannel::GetName() const {
diff --git a/libweave/src/notification/pull_channel.h b/libweave/src/notification/pull_channel.h
index 7f1b789..ef40403 100644
--- a/libweave/src/notification/pull_channel.h
+++ b/libweave/src/notification/pull_channel.h
@@ -16,11 +16,13 @@
 
 namespace weave {
 
+namespace provider {
 class TaskRunner;
+}  // namespace
 
 class PullChannel : public NotificationChannel {
  public:
-  PullChannel(base::TimeDelta pull_interval, TaskRunner* task_runner);
+  PullChannel(base::TimeDelta pull_interval, provider::TaskRunner* task_runner);
   ~PullChannel() override = default;
 
   // Overrides from NotificationChannel.
@@ -37,7 +39,7 @@
   void RePost();
 
   base::TimeDelta pull_interval_;
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   NotificationDelegate* delegate_{nullptr};
 
   base::WeakPtrFactory<PullChannel> weak_ptr_factory_{this};
diff --git a/libweave/src/notification/xmpp_channel.cc b/libweave/src/notification/xmpp_channel.cc
index 4734549..ca717c2 100644
--- a/libweave/src/notification/xmpp_channel.cc
+++ b/libweave/src/notification/xmpp_channel.cc
@@ -7,8 +7,8 @@
 #include <string>
 
 #include <base/bind.h>
-#include <weave/network_provider.h>
-#include <weave/task_runner.h>
+#include <weave/provider/network.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/src/backoff_entry.h"
 #include "libweave/src/data_encoding.h"
@@ -91,8 +91,8 @@
 
 XmppChannel::XmppChannel(const std::string& account,
                          const std::string& access_token,
-                         TaskRunner* task_runner,
-                         NetworkProvider* network)
+                         provider::TaskRunner* task_runner,
+                         provider::Network* network)
     : account_{account},
       access_token_{access_token},
       network_{network},
diff --git a/libweave/src/notification/xmpp_channel.h b/libweave/src/notification/xmpp_channel.h
index 48ffd64..c6ab337 100644
--- a/libweave/src/notification/xmpp_channel.h
+++ b/libweave/src/notification/xmpp_channel.h
@@ -22,8 +22,10 @@
 
 namespace weave {
 
-class NetworkProvider;
+namespace provider {
+class Network;
 class TaskRunner;
+}
 
 // Simple interface to abstract XmppChannel's SendMessage() method.
 class XmppChannelInterface {
@@ -43,8 +45,8 @@
   // so you will need to reset the XmppClient every time this happens.
   XmppChannel(const std::string& account,
               const std::string& access_token,
-              TaskRunner* task_runner,
-              NetworkProvider* network);
+              provider::TaskRunner* task_runner,
+              provider::Network* network);
   ~XmppChannel() override = default;
 
   // Overrides from NotificationChannel.
@@ -131,7 +133,7 @@
   // OAuth access token for the account. Expires fairly frequently.
   std::string access_token_;
 
-  NetworkProvider* network_{nullptr};
+  provider::Network* network_{nullptr};
   std::unique_ptr<Stream> stream_;
 
   // Read buffer for incoming message packets.
@@ -146,7 +148,7 @@
 
   BackoffEntry backoff_entry_;
   NotificationDelegate* delegate_{nullptr};
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   XmppStreamParser stream_parser_{this};
   bool read_pending_{false};
   bool write_pending_{false};
diff --git a/libweave/src/notification/xmpp_channel_unittest.cc b/libweave/src/notification/xmpp_channel_unittest.cc
index a6992e9..beecd1d 100644
--- a/libweave/src/notification/xmpp_channel_unittest.cc
+++ b/libweave/src/notification/xmpp_channel_unittest.cc
@@ -8,9 +8,9 @@
 #include <queue>
 
 #include <gtest/gtest.h>
+#include <weave/provider/test/mock_network.h>
+#include <weave/provider/test/mock_task_runner.h>
 #include <weave/test/fake_stream.h>
-#include <weave/test/mock_network_provider.h>
-#include <weave/test/mock_task_runner.h>
 
 #include "libweave/src/bind_lambda.h"
 
@@ -82,14 +82,13 @@
 
 class FakeXmppChannel : public XmppChannel {
  public:
-  explicit FakeXmppChannel(TaskRunner* task_runner,
-                           weave::NetworkProvider* network)
+  explicit FakeXmppChannel(provider::TaskRunner* task_runner,
+                           provider::Network* network)
       : XmppChannel{kAccountName, kAccessToken, task_runner, network},
         stream_{new test::FakeStream{task_runner_}},
         fake_stream_{stream_.get()} {}
 
-  void Connect(
-      const base::Callback<void(std::unique_ptr<weave::Stream>)>& callback) {
+  void Connect(const base::Callback<void(std::unique_ptr<Stream>)>& callback) {
     callback.Run(std::move(stream_));
   }
 
@@ -111,9 +110,9 @@
   test::FakeStream* fake_stream_{nullptr};
 };
 
-class MockNetworkProvider : public weave::test::MockNetworkProvider {
+class MockNetwork : public provider::test::MockNetwork {
  public:
-  MockNetworkProvider() {
+  MockNetwork() {
     EXPECT_CALL(*this, AddConnectionChangedCallback(_))
         .WillRepeatedly(Return());
   }
@@ -145,8 +144,8 @@
     EXPECT_EQ(st, xmpp_client_.state());
   }
 
-  StrictMock<test::MockTaskRunner> task_runner_;
-  StrictMock<MockNetworkProvider> network_;
+  StrictMock<provider::test::MockTaskRunner> task_runner_;
+  StrictMock<MockNetwork> network_;
   FakeXmppChannel xmpp_client_{&task_runner_, &network_};
 };
 
diff --git a/libweave/src/notification/xmpp_iq_stanza_handler.cc b/libweave/src/notification/xmpp_iq_stanza_handler.cc
index 8803aae..0a0d87b 100644
--- a/libweave/src/notification/xmpp_iq_stanza_handler.cc
+++ b/libweave/src/notification/xmpp_iq_stanza_handler.cc
@@ -7,7 +7,7 @@
 #include <base/bind.h>
 #include <base/strings/string_number_conversions.h>
 #include <base/strings/stringprintf.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/src/notification/xml_node.h"
 #include "libweave/src/notification/xmpp_channel.h"
@@ -48,7 +48,7 @@
 }  // anonymous namespace
 
 IqStanzaHandler::IqStanzaHandler(XmppChannelInterface* xmpp_channel,
-                                 TaskRunner* task_runner)
+                                 provider::TaskRunner* task_runner)
     : xmpp_channel_{xmpp_channel}, task_runner_{task_runner} {}
 
 void IqStanzaHandler::SendRequest(const std::string& type,
diff --git a/libweave/src/notification/xmpp_iq_stanza_handler.h b/libweave/src/notification/xmpp_iq_stanza_handler.h
index b4edcac..1de633f 100644
--- a/libweave/src/notification/xmpp_iq_stanza_handler.h
+++ b/libweave/src/notification/xmpp_iq_stanza_handler.h
@@ -18,15 +18,19 @@
 
 namespace weave {
 
-class TaskRunner;
 class XmppChannelInterface;
 
+namespace provider {
+class TaskRunner;
+}
+
 class IqStanzaHandler {
  public:
   using ResponseCallback = base::Callback<void(std::unique_ptr<XmlNode>)>;
   using TimeoutCallback = base::Closure;
 
-  IqStanzaHandler(XmppChannelInterface* xmpp_channel, TaskRunner* task_runner);
+  IqStanzaHandler(XmppChannelInterface* xmpp_channel,
+                  provider::TaskRunner* task_runner);
 
   // Sends <iq> request to the server.
   // |type| is the IQ stanza type, one of "get", "set", "query".
@@ -66,7 +70,7 @@
   void OnTimeOut(RequestId id, const TimeoutCallback& timeout_callback);
 
   XmppChannelInterface* xmpp_channel_;
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   std::map<RequestId, ResponseCallback> requests_;
   RequestId last_request_id_{0};
 
diff --git a/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc b/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc
index 3880f34..27392b3 100644
--- a/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc
+++ b/libweave/src/notification/xmpp_iq_stanza_handler_unittest.cc
@@ -9,7 +9,7 @@
 
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_task_runner.h>
+#include <weave/provider/test/mock_task_runner.h>
 
 #include "libweave/src/bind_lambda.h"
 #include "libweave/src/notification/xml_node.h"
@@ -76,7 +76,7 @@
 class IqStanzaHandlerTest : public testing::Test {
  public:
   testing::StrictMock<MockXmppChannelInterface> mock_xmpp_channel_;
-  test::MockTaskRunner task_runner_;
+  provider::test::MockTaskRunner task_runner_;
   IqStanzaHandler iq_stanza_handler_{&mock_xmpp_channel_, &task_runner_};
   MockResponseReceiver receiver_;
 };
diff --git a/libweave/src/privet/cloud_delegate.cc b/libweave/src/privet/cloud_delegate.cc
index 03e74c7..7d4a5f0 100644
--- a/libweave/src/privet/cloud_delegate.cc
+++ b/libweave/src/privet/cloud_delegate.cc
@@ -12,7 +12,7 @@
 #include <base/memory/weak_ptr.h>
 #include <base/values.h>
 #include <weave/error.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/src/backoff_entry.h"
 #include "libweave/src/commands/command_manager.h"
@@ -39,7 +39,7 @@
 
 class CloudDelegateImpl : public CloudDelegate {
  public:
-  CloudDelegateImpl(TaskRunner* task_runner,
+  CloudDelegateImpl(provider::TaskRunner* task_runner,
                     DeviceRegistrationInfo* device,
                     CommandManager* command_manager,
                     StateManager* state_manager)
@@ -340,7 +340,7 @@
     return false;
   }
 
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   DeviceRegistrationInfo* device_{nullptr};
   CommandManager* command_manager_{nullptr};
   StateManager* state_manager_{nullptr};
@@ -378,7 +378,7 @@
 
 // static
 std::unique_ptr<CloudDelegate> CloudDelegate::CreateDefault(
-    TaskRunner* task_runner,
+    provider::TaskRunner* task_runner,
     DeviceRegistrationInfo* device,
     CommandManager* command_manager,
     StateManager* state_manager) {
diff --git a/libweave/src/privet/cloud_delegate.h b/libweave/src/privet/cloud_delegate.h
index 0b72a44..8152f78 100644
--- a/libweave/src/privet/cloud_delegate.h
+++ b/libweave/src/privet/cloud_delegate.h
@@ -25,7 +25,10 @@
 class CommandManager;
 class DeviceRegistrationInfo;
 class StateManager;
+
+namespace provider {
 class TaskRunner;
+}
 
 namespace privet {
 
@@ -134,7 +137,7 @@
 
   // Create default instance.
   static std::unique_ptr<CloudDelegate> CreateDefault(
-      TaskRunner* task_runner,
+      provider::TaskRunner* task_runner,
       DeviceRegistrationInfo* device,
       CommandManager* command_manager,
       StateManager* state_manager);
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc
index cf25773..52a2657 100644
--- a/libweave/src/privet/privet_manager.cc
+++ b/libweave/src/privet/privet_manager.cc
@@ -15,7 +15,7 @@
 #include <base/scoped_observer.h>
 #include <base/strings/string_number_conversions.h>
 #include <base/values.h>
-#include <weave/network_provider.h>
+#include <weave/provider/network.h>
 
 #include "libweave/src/device_registration_info.h"
 #include "libweave/src/http_constants.h"
@@ -29,16 +29,22 @@
 namespace weave {
 namespace privet {
 
+using provider::TaskRunner;
+using provider::Network;
+using provider::DnsServiceDiscovery;
+using provider::HttpServer;
+using provider::Wifi;
+
 Manager::Manager() {}
 
 Manager::~Manager() {}
 
 void Manager::Start(const Device::Options& options,
                     TaskRunner* task_runner,
-                    NetworkProvider* network,
-                    DnsServiceDiscoveryProvider* dns_sd,
+                    Network* network,
+                    DnsServiceDiscovery* dns_sd,
                     HttpServer* http_server,
-                    WifiProvider* wifi,
+                    Wifi* wifi,
                     DeviceRegistrationInfo* device,
                     CommandManager* command_manager,
                     StateManager* state_manager) {
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h
index 7fc90a2..1c635da 100644
--- a/libweave/src/privet/privet_manager.h
+++ b/libweave/src/privet/privet_manager.h
@@ -29,8 +29,8 @@
 
 class CommandManager;
 class DeviceRegistrationInfo;
-class DnsServiceDiscoveryProvider;
-class NetworkProvider;
+class DnsServiceDiscovery;
+class Network;
 class StateManager;
 
 namespace privet {
@@ -48,11 +48,11 @@
   ~Manager() override;
 
   void Start(const weave::Device::Options& options,
-             TaskRunner* task_runner,
-             NetworkProvider* network,
-             DnsServiceDiscoveryProvider* dns_sd,
-             HttpServer* http_server,
-             WifiProvider* wifi,
+             provider::TaskRunner* task_runner,
+             provider::Network* network,
+             provider::DnsServiceDiscovery* dns_sd,
+             provider::HttpServer* http_server,
+             provider::Wifi* wifi,
              DeviceRegistrationInfo* device,
              CommandManager* command_manager,
              StateManager* state_manager);
@@ -70,20 +70,22 @@
   // CloudDelegate::Observer
   void OnDeviceInfoChanged() override;
 
-  void PrivetRequestHandler(const HttpServer::Request& request,
-                            const HttpServer::OnReplyCallback& callback);
+  void PrivetRequestHandler(
+      const provider::HttpServer::Request& request,
+      const provider::HttpServer::OnReplyCallback& callback);
 
-  void PrivetResponseHandler(const HttpServer::OnReplyCallback& callback,
-                             int status,
-                             const base::DictionaryValue& output);
+  void PrivetResponseHandler(
+      const provider::HttpServer::OnReplyCallback& callback,
+      int status,
+      const base::DictionaryValue& output);
 
-  void HelloWorldHandler(const HttpServer::Request& request,
-                         const HttpServer::OnReplyCallback& callback);
+  void HelloWorldHandler(const provider::HttpServer::Request& request,
+                         const provider::HttpServer::OnReplyCallback& callback);
 
   void OnChanged();
   void OnConnectivityChanged();
 
-  void OnHttpServerStatusChanged(const HttpServer& server);
+  void OnHttpServerStatusChanged(const provider::HttpServer& server);
 
   bool disable_security_{false};
   std::unique_ptr<CloudDelegate> cloud_;
diff --git a/libweave/src/privet/privet_types.cc b/libweave/src/privet/privet_types.cc
index 9c32bad..aebf63b 100644
--- a/libweave/src/privet/privet_types.cc
+++ b/libweave/src/privet/privet_types.cc
@@ -8,8 +8,8 @@
 
 #include <weave/enum_to_string.h>
 #include <weave/export.h>
-#include <weave/network_provider.h>
 #include <weave/privet.h>
+#include <weave/provider/network.h>
 
 namespace weave {
 
@@ -20,6 +20,7 @@
 using privet::CryptoType;
 using privet::SetupState;
 using privet::WifiType;
+using provider::NetworkState;
 
 const EnumToStringMap<PairingType>::Map kPairingTypeMap[] = {
     {PairingType::kPinCode, "pinCode"},
@@ -67,7 +68,7 @@
     {WifiSetupState::kConnecting, "connecting"},
 };
 
-const EnumToStringMap<NetworkState>::Map kNetworkStateMap[] = {
+const EnumToStringMap<provider::NetworkState>::Map kNetworkStateMap[] = {
     {NetworkState::kOffline, "offline"},
     {NetworkState::kFailure, "failure"},
     {NetworkState::kConnecting, "connecting"},
diff --git a/libweave/src/privet/publisher.cc b/libweave/src/privet/publisher.cc
index 6a5b8bb..5d6567b 100644
--- a/libweave/src/privet/publisher.cc
+++ b/libweave/src/privet/publisher.cc
@@ -6,8 +6,8 @@
 
 #include <map>
 
-#include <weave/dns_service_discovery_provider.h>
 #include <weave/error.h>
+#include <weave/provider/dns_service_discovery.h>
 
 #include "libweave/src/privet/cloud_delegate.h"
 #include "libweave/src/privet/device_delegate.h"
@@ -28,7 +28,7 @@
 Publisher::Publisher(const DeviceDelegate* device,
                      const CloudDelegate* cloud,
                      const WifiDelegate* wifi,
-                     DnsServiceDiscoveryProvider* dns_sd)
+                     provider::DnsServiceDiscovery* dns_sd)
     : dns_sd_{dns_sd}, device_{device}, cloud_{cloud}, wifi_{wifi} {
   CHECK(device_);
   CHECK(cloud_);
diff --git a/libweave/src/privet/publisher.h b/libweave/src/privet/publisher.h
index b73ea2e..d330992 100644
--- a/libweave/src/privet/publisher.h
+++ b/libweave/src/privet/publisher.h
@@ -14,7 +14,9 @@
 
 namespace weave {
 
-class DnsServiceDiscoveryProvider;
+namespace provider {
+class DnsServiceDiscovery;
+}
 
 namespace privet {
 
@@ -28,7 +30,7 @@
   Publisher(const DeviceDelegate* device,
             const CloudDelegate* cloud,
             const WifiDelegate* wifi,
-            DnsServiceDiscoveryProvider* dns_sd);
+            provider::DnsServiceDiscovery* dns_sd);
   ~Publisher() override;
 
   // IdentityDelegate implementation.
@@ -42,7 +44,7 @@
   void RemoveService();
 
   bool is_publishing_{false};
-  DnsServiceDiscoveryProvider* dns_sd_{nullptr};
+  provider::DnsServiceDiscovery* dns_sd_{nullptr};
 
   const DeviceDelegate* device_{nullptr};
   const CloudDelegate* cloud_{nullptr};
diff --git a/libweave/src/privet/security_manager.cc b/libweave/src/privet/security_manager.cc
index 588cbd3..1dfbab5 100644
--- a/libweave/src/privet/security_manager.cc
+++ b/libweave/src/privet/security_manager.cc
@@ -16,7 +16,7 @@
 #include <base/strings/string_number_conversions.h>
 #include <base/strings/stringprintf.h>
 #include <base/time/time.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 #include "libweave/external/crypto/p224_spake.h"
 #include "libweave/src/data_encoding.h"
@@ -121,7 +121,7 @@
 SecurityManager::SecurityManager(const std::set<PairingType>& pairing_modes,
                                  const std::string& embedded_code,
                                  bool disable_security,
-                                 TaskRunner* task_runner)
+                                 provider::TaskRunner* task_runner)
     : is_security_disabled_(disable_security),
       pairing_modes_(pairing_modes),
       embedded_code_(embedded_code),
diff --git a/libweave/src/privet/security_manager.h b/libweave/src/privet/security_manager.h
index 07f8c0c..8acbd1d 100644
--- a/libweave/src/privet/security_manager.h
+++ b/libweave/src/privet/security_manager.h
@@ -24,7 +24,9 @@
 
 namespace weave {
 
+namespace provider {
 class TaskRunner;
+}
 
 namespace privet {
 
@@ -50,7 +52,7 @@
   SecurityManager(const std::set<PairingType>& pairing_modes,
                   const std::string& embedded_code,
                   bool disable_security,
-                  TaskRunner* task_runner);
+                  provider::TaskRunner* task_runner);
   ~SecurityManager() override;
 
   // SecurityDelegate methods
@@ -94,7 +96,7 @@
   std::set<PairingType> pairing_modes_;
   std::string embedded_code_;
   // TODO(vitalybuka): Session cleanup can be done without posting tasks.
-  TaskRunner* task_runner_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
   std::map<std::string, std::unique_ptr<KeyExchanger>> pending_sessions_;
   std::map<std::string, std::unique_ptr<KeyExchanger>> confirmed_sessions_;
   mutable int pairing_attemts_{0};
diff --git a/libweave/src/privet/security_manager_unittest.cc b/libweave/src/privet/security_manager_unittest.cc
index b19b0ee..5c9fc2d 100644
--- a/libweave/src/privet/security_manager_unittest.cc
+++ b/libweave/src/privet/security_manager_unittest.cc
@@ -19,7 +19,7 @@
 #include <base/strings/string_util.h>
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_task_runner.h>
+#include <weave/provider/test/mock_task_runner.h>
 
 #include "libweave/external/crypto/p224_spake.h"
 #include "libweave/src/data_encoding.h"
@@ -100,7 +100,7 @@
   }
 
   const base::Time time_ = base::Time::FromTimeT(1410000000);
-  test::MockTaskRunner task_runner_;
+  provider::test::MockTaskRunner task_runner_;
   SecurityManager security_{{PairingType::kEmbeddedCode},
                             "1234",
                             false,
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc
index dff6c9f..4756a66 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.cc
+++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -7,9 +7,9 @@
 #include <base/logging.h>
 #include <base/memory/weak_ptr.h>
 #include <weave/enum_to_string.h>
-#include <weave/network_provider.h>
-#include <weave/task_runner.h>
-#include <weave/wifi_provider.h>
+#include <weave/provider/network.h>
+#include <weave/provider/task_runner.h>
+#include <weave/provider/wifi.h>
 
 #include "libweave/src/bind_lambda.h"
 #include "libweave/src/privet/constants.h"
@@ -17,13 +17,15 @@
 namespace weave {
 namespace privet {
 
+using provider::NetworkState;
+
 WifiBootstrapManager::WifiBootstrapManager(
     const std::string& last_configured_ssid,
     const std::string& test_privet_ssid,
     bool ble_setup_enabled,
-    TaskRunner* task_runner,
-    NetworkProvider* network,
-    WifiProvider* wifi,
+    provider::TaskRunner* task_runner,
+    provider::Network* network,
+    provider::Wifi* wifi,
     CloudDelegate* gcd)
     : task_runner_{task_runner},
       network_{network},
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h
index fbf6360..8174cac 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.h
+++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -22,9 +22,11 @@
 
 namespace weave {
 
-class NetworkProvider;
+namespace provider {
+class Network;
 class TaskRunner;
-class WifiProvider;
+class Wifi;
+}
 
 namespace privet {
 
@@ -40,9 +42,9 @@
   WifiBootstrapManager(const std::string& last_configured_ssid,
                        const std::string& test_privet_ssid,
                        bool wifi_setup_enabled,
-                       TaskRunner* task_runner,
-                       NetworkProvider* shill_client,
-                       WifiProvider* wifi,
+                       provider::TaskRunner* task_runner,
+                       provider::Network* shill_client,
+                       provider::Wifi* wifi,
                        CloudDelegate* gcd);
   ~WifiBootstrapManager() override = default;
   virtual void Init();
@@ -96,9 +98,9 @@
   // It is not persisted to disk.
   SetupState setup_state_{SetupState::kNone};
   ConnectionState connection_state_{ConnectionState::kDisabled};
-  TaskRunner* task_runner_{nullptr};
-  NetworkProvider* network_{nullptr};
-  WifiProvider* wifi_{nullptr};
+  provider::TaskRunner* task_runner_{nullptr};
+  provider::Network* network_{nullptr};
+  provider::Wifi* wifi_{nullptr};
   WifiSsidGenerator ssid_generator_;
   base::Time monitor_until_;
 
diff --git a/libweave/src/states/state_manager.cc b/libweave/src/states/state_manager.cc
index c277ab4..64a7db9 100644
--- a/libweave/src/states/state_manager.cc
+++ b/libweave/src/states/state_manager.cc
@@ -6,7 +6,7 @@
 
 #include <base/logging.h>
 #include <base/values.h>
-#include <weave/config_store.h>
+#include <weave/provider/config_store.h>
 
 #include "libweave/src/json_error_codes.h"
 #include "libweave/src/states/error_codes.h"
@@ -28,7 +28,7 @@
   callback.Run();  // Force to read current state.
 }
 
-void StateManager::Startup(ConfigStore* config_store) {
+void StateManager::Startup(provider::ConfigStore* config_store) {
   LOG(INFO) << "Initializing StateManager.";
 
   // Load standard device state definition.
diff --git a/libweave/src/states/state_manager.h b/libweave/src/states/state_manager.h
index 59c7716..8f6b237 100644
--- a/libweave/src/states/state_manager.h
+++ b/libweave/src/states/state_manager.h
@@ -27,7 +27,9 @@
 
 namespace weave {
 
+namespace provider {
 class ConfigStore;
+}
 
 // StateManager is the class that aggregates the device state fragments
 // provided by device daemons and makes the aggregate device state available
@@ -45,7 +47,7 @@
 
   // Initializes the state manager and load device state fragments.
   // Called by Buffet daemon at startup.
-  void Startup(ConfigStore* config_store);
+  void Startup(provider::ConfigStore* config_store);
 
   // Returns all the categories the state properties are registered from.
   // As with GCD command handling, the category normally represent a device
diff --git a/libweave/src/states/state_manager_unittest.cc b/libweave/src/states/state_manager_unittest.cc
index a7511cc..1ae60d7 100644
--- a/libweave/src/states/state_manager_unittest.cc
+++ b/libweave/src/states/state_manager_unittest.cc
@@ -11,7 +11,7 @@
 #include <base/values.h>
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_config_store.h>
+#include <weave/provider/test/mock_config_store.h>
 
 #include "libweave/src/commands/schema_constants.h"
 #include "libweave/src/commands/unittest_utils.h"
@@ -138,7 +138,7 @@
 }
 
 TEST_F(StateManagerTest, Startup) {
-  test::MockConfigStore config_store;
+  provider::test::MockConfigStore config_store;
   StateManager manager(&mock_state_change_queue_);
 
   EXPECT_CALL(config_store, LoadBaseStateDefs())
diff --git a/libweave/src/test/fake_stream.cc b/libweave/src/test/fake_stream.cc
index 5adf462..786aa01 100644
--- a/libweave/src/test/fake_stream.cc
+++ b/libweave/src/test/fake_stream.cc
@@ -6,13 +6,15 @@
 
 #include <base/bind.h>
 #include <gtest/gtest.h>
-#include <weave/task_runner.h>
+#include <weave/provider/task_runner.h>
 
 namespace weave {
 namespace test {
 
-FakeStream::FakeStream(TaskRunner* task_runner) : task_runner_{task_runner} {}
-FakeStream::FakeStream(TaskRunner* task_runner, const std::string& read_data)
+FakeStream::FakeStream(provider::TaskRunner* task_runner)
+    : task_runner_{task_runner} {}
+FakeStream::FakeStream(provider::TaskRunner* task_runner,
+                       const std::string& read_data)
     : task_runner_{task_runner}, read_data_{read_data} {}
 
 void FakeStream::CancelPendingOperations() {}
diff --git a/libweave/src/test/mock_http_client.cc b/libweave/src/test/mock_http_client.cc
index 879f213..b17645c 100644
--- a/libweave/src/test/mock_http_client.cc
+++ b/libweave/src/test/mock_http_client.cc
@@ -2,12 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <weave/test/mock_http_client.h>
+#include <weave/provider/test/mock_http_client.h>
 
 #include <memory>
 #include <string>
 
 namespace weave {
+namespace provider {
 namespace test {
 
 std::unique_ptr<HttpClient::Response> MockHttpClient::SendRequestAndBlock(
@@ -38,4 +39,5 @@
 }
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
diff --git a/libweave/src/test/mock_task_runner.cc b/libweave/src/test/mock_task_runner.cc
index a78b4e1..78af5ad 100644
--- a/libweave/src/test/mock_task_runner.cc
+++ b/libweave/src/test/mock_task_runner.cc
@@ -2,13 +2,14 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include <weave/test/mock_task_runner.h>
+#include <weave/provider/test/mock_task_runner.h>
 
 using testing::_;
 using testing::Invoke;
 using testing::AnyNumber;
 
 namespace weave {
+namespace provider {
 namespace test {
 
 class MockTaskRunner::TestClock : public base::Clock {
@@ -60,4 +61,5 @@
 }
 
 }  // namespace test
+}  // namespace provider
 }  // namespace weave
diff --git a/libweave/src/weave_unittest.cc b/libweave/src/weave_unittest.cc
index f5d7818..e92c266 100644
--- a/libweave/src/weave_unittest.cc
+++ b/libweave/src/weave_unittest.cc
@@ -6,14 +6,14 @@
 
 #include <gmock/gmock.h>
 #include <gtest/gtest.h>
-#include <weave/test/mock_bluetooth.h>
-#include <weave/test/mock_config_store.h>
-#include <weave/test/mock_dns_service_discovery_provider.h>
-#include <weave/test/mock_http_client.h>
-#include <weave/test/mock_http_server.h>
-#include <weave/test/mock_network_provider.h>
-#include <weave/test/mock_task_runner.h>
-#include <weave/test/mock_wifi_provider.h>
+#include <weave/provider/test/mock_bluetooth.h>
+#include <weave/provider/test/mock_config_store.h>
+#include <weave/provider/test/mock_dns_service_discovery.h>
+#include <weave/provider/test/mock_http_client.h>
+#include <weave/provider/test/mock_http_server.h>
+#include <weave/provider/test/mock_network.h>
+#include <weave/provider/test/mock_task_runner.h>
+#include <weave/provider/test/mock_wifi.h>
 #include <weave/test/unittest_utils.h>
 
 #include "libweave/src/bind_lambda.h"
@@ -36,6 +36,8 @@
 
 using test::CreateDictionaryValue;
 using test::ValueToString;
+using provider::test::MockHttpClientResponse;
+using provider::NetworkState;
 
 const char kCategory[] = "powerd";
 
@@ -172,8 +174,8 @@
                      const std::string& json_response) {
     EXPECT_CALL(http_client_, MockSendRequest(method, url, _, _, _))
         .WillOnce(InvokeWithoutArgs([json_response]() {
-          test::MockHttpClientResponse* response =
-              new StrictMock<test::MockHttpClientResponse>;
+          provider::test::MockHttpClientResponse* response =
+              new StrictMock<provider::test::MockHttpClientResponse>;
           EXPECT_CALL(*response, GetStatusCode())
               .Times(AtLeast(1))
               .WillRepeatedly(Return(200));
@@ -224,7 +226,7 @@
   void InitNetwork() {
     EXPECT_CALL(network_, AddConnectionChangedCallback(_))
         .WillRepeatedly(Invoke(
-            [this](const NetworkProvider::ConnectionChangedCallback& cb) {
+            [this](const provider::Network::ConnectionChangedCallback& cb) {
               network_callbacks_.push_back(cb);
             }));
     EXPECT_CALL(network_, GetConnectionState())
@@ -264,13 +266,14 @@
     EXPECT_CALL(http_server_, GetHttpsCertificateFingerprint())
         .WillRepeatedly(ReturnRefOfCopy(std::vector<uint8_t>{1, 2, 3}));
     EXPECT_CALL(http_server_, AddRequestHandler(_, _))
-        .WillRepeatedly(Invoke([this](const std::string& path_prefix,
-                                      const HttpServer::OnRequestCallback& cb) {
-          http_server_request_cb_.push_back(cb);
-        }));
-    EXPECT_CALL(http_server_, AddOnStateChangedCallback(_))
         .WillRepeatedly(
-            Invoke([this](const HttpServer::OnStateChangedCallback& cb) {
+            Invoke([this](const std::string& path_prefix,
+                          const provider::HttpServer::OnRequestCallback& cb) {
+              http_server_request_cb_.push_back(cb);
+            }));
+    EXPECT_CALL(http_server_, AddOnStateChangedCallback(_))
+        .WillRepeatedly(Invoke(
+            [this](const provider::HttpServer::OnStateChangedCallback& cb) {
               http_server_changed_cb_.push_back(cb);
             }));
   }
@@ -307,26 +310,28 @@
     task_runner_.Run();
   }
 
-  void NotifyNetworkChanged(NetworkState state, base::TimeDelta delay) {
+  void NotifyNetworkChanged(provider::NetworkState state,
+                            base::TimeDelta delay) {
     EXPECT_CALL(network_, GetConnectionState()).WillRepeatedly(Return(state));
     for (const auto& cb : network_callbacks_) {
       task_runner_.PostDelayedTask(FROM_HERE, cb, delay);
     }
   }
 
-  std::vector<HttpServer::OnStateChangedCallback> http_server_changed_cb_;
-  std::vector<HttpServer::OnRequestCallback> http_server_request_cb_;
+  std::vector<provider::HttpServer::OnStateChangedCallback>
+      http_server_changed_cb_;
+  std::vector<provider::HttpServer::OnRequestCallback> http_server_request_cb_;
 
-  StrictMock<test::MockConfigStore> config_store_;
-  StrictMock<test::MockTaskRunner> task_runner_;
-  StrictMock<test::MockHttpClient> http_client_;
-  StrictMock<test::MockNetworkProvider> network_;
-  StrictMock<test::MockDnsServiceDiscovery> dns_sd_;
-  StrictMock<test::MockHttpServer> http_server_;
-  StrictMock<test::MockWifiProvider> wifi_;
-  StrictMock<test::MockBluetooth> bluetooth_;
+  StrictMock<provider::test::MockConfigStore> config_store_;
+  StrictMock<provider::test::MockTaskRunner> task_runner_;
+  StrictMock<provider::test::MockHttpClient> http_client_;
+  StrictMock<provider::test::MockNetwork> network_;
+  StrictMock<provider::test::MockDnsServiceDiscovery> dns_sd_;
+  StrictMock<provider::test::MockHttpServer> http_server_;
+  StrictMock<provider::test::MockWifi> wifi_;
+  StrictMock<provider::test::MockBluetooth> bluetooth_;
 
-  std::vector<NetworkProvider::ConnectionChangedCallback> network_callbacks_;
+  std::vector<provider::Network::ConnectionChangedCallback> network_callbacks_;
 
   weave::Cloud* cloud_{nullptr};
 
@@ -418,7 +423,7 @@
     InitDnsSd();
 
     EXPECT_CALL(network_, GetConnectionState())
-        .WillRepeatedly(Return(NetworkState::kConnected));
+        .WillRepeatedly(Return(provider::NetworkState::kConnected));
   }
 };
 
@@ -426,8 +431,8 @@
   StartDevice();
 
   // Short disconnect.
-  NotifyNetworkChanged(NetworkState::kOffline, {});
-  NotifyNetworkChanged(NetworkState::kConnected,
+  NotifyNetworkChanged(provider::NetworkState::kOffline, {});
+  NotifyNetworkChanged(provider::NetworkState::kConnected,
                        base::TimeDelta::FromSeconds(10));
   task_runner_.Run();