diff --git a/libweave/include/weave/network.h b/libweave/include/weave/network.h
new file mode 100644
index 0000000..cd27e2c
--- /dev/null
+++ b/libweave/include/weave/network.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_NETWORK_H_
+#define LIBWEAVE_INCLUDE_WEAVE_NETWORK_H_
+
+#include <map>
+#include <string>
+
+#include <base/callback.h>
+
+namespace weave {
+
+enum class NetworkState {
+  kOffline = 0,
+  kFailure,
+  kConnecting,
+  kConnected,
+};
+
+class Network {
+ public:
+  // A callback that interested parties can register to be notified of
+  // transitions from online to offline and vice versa.  The boolean
+  // parameter will be true if we're online, and false if we're offline.
+  using OnConnectionChangedCallback = base::Callback<void(bool)>;
+
+  virtual void AddOnConnectionChangedCallback(
+      const OnConnectionChangedCallback& listener) = 0;
+
+  // Implementation should attempt to connect to the given network with the
+  // given passphrase. This is accomplished by:
+  // Returns false on immediate failures with some descriptive codes in |error|.
+  virtual bool ConnectToService(const std::string& ssid,
+                                const std::string& passphrase,
+                                const base::Closure& on_success,
+                                chromeos::ErrorPtr* error) = 0;
+
+  virtual NetworkState GetConnectionState() const = 0;
+
+ protected:
+  virtual ~Network() = default;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_NETWORK_H_
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc
index e6d90bb..85d77ef 100644
--- a/libweave/src/device_registration_info.cc
+++ b/libweave/src/device_registration_info.cc
@@ -28,6 +28,7 @@
 #include "libweave/src/commands/command_manager.h"
 #include "libweave/src/commands/schema_constants.h"
 #include "libweave/src/notification/xmpp_channel.h"
+#include "libweave/src/privet/shill_client.h"
 #include "libweave/src/states/state_manager.h"
 #include "libweave/src/utils.h"
 
diff --git a/libweave/src/notification/xmpp_channel.cc b/libweave/src/notification/xmpp_channel.cc
index 2c6ac61..77debd8 100644
--- a/libweave/src/notification/xmpp_channel.cc
+++ b/libweave/src/notification/xmpp_channel.cc
@@ -17,6 +17,7 @@
 #include "libweave/src/notification/xml_node.h"
 #include "libweave/src/privet/shill_client.h"
 #include "libweave/src/utils.h"
+#include "weave/network.h"
 
 namespace weave {
 
@@ -93,15 +94,15 @@
     const std::string& account,
     const std::string& access_token,
     const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-    privet::ShillClient* shill)
+    Network* network)
     : account_{account},
       access_token_{access_token},
       backoff_entry_{&kDefaultBackoffPolicy},
       task_runner_{task_runner},
       iq_stanza_handler_{new IqStanzaHandler{this, task_runner}} {
   read_socket_data_.resize(4096);
-  if (shill) {
-    shill->RegisterConnectivityListener(base::Bind(
+  if (network) {
+    network->AddOnConnectionChangedCallback(base::Bind(
         &XmppChannel::OnConnectivityChanged, weak_ptr_factory_.GetWeakPtr()));
   }
 }
diff --git a/libweave/src/notification/xmpp_channel.h b/libweave/src/notification/xmpp_channel.h
index d25669f..57f86ab 100644
--- a/libweave/src/notification/xmpp_channel.h
+++ b/libweave/src/notification/xmpp_channel.h
@@ -23,6 +23,8 @@
 
 namespace weave {
 
+class Network;
+
 namespace privet {
 class ShillClient;
 }
@@ -46,7 +48,7 @@
   XmppChannel(const std::string& account,
               const std::string& access_token,
               const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
-              privet::ShillClient* shill);
+              Network* network);
   ~XmppChannel() override = default;
 
   // Overrides from NotificationChannel.
diff --git a/libweave/src/privet/privet_manager.cc b/libweave/src/privet/privet_manager.cc
index 917bcea..4523337 100644
--- a/libweave/src/privet/privet_manager.cc
+++ b/libweave/src/privet/privet_manager.cc
@@ -35,7 +35,7 @@
 #include "libweave/src/privet/device_delegate.h"
 #include "libweave/src/privet/privet_handler.h"
 #include "libweave/src/privet/publisher.h"
-#include "libweave/src/privet/shill_client.h"
+#include "weave/network.h"
 
 namespace weave {
 namespace privet {
@@ -62,7 +62,7 @@
 
 void Manager::Start(const Device::Options& options,
                     const scoped_refptr<dbus::Bus>& bus,
-                    ShillClient* shill_client,
+                    Network* network,
                     DeviceRegistrationInfo* device,
                     CommandManager* command_manager,
                     StateManager* state_manager,
@@ -76,7 +76,7 @@
   security_.reset(new SecurityManager(device->GetConfig().pairing_modes(),
                                       device->GetConfig().embedded_code_path(),
                                       disable_security_));
-  shill_client->RegisterConnectivityListener(
+  network->AddOnConnectionChangedCallback(
       base::Bind(&Manager::OnConnectivityChanged, base::Unretained(this)));
   ap_manager_client_.reset(new ApManagerClient(bus));
 
@@ -85,7 +85,7 @@
     wifi_bootstrap_manager_.reset(new WifiBootstrapManager(
         device->GetConfig().last_configured_ssid(), options.test_privet_ssid,
         device->GetConfig().ble_setup_enabled(),
-        shill_client, ap_manager_client_.get(), cloud_.get()));
+        network, ap_manager_client_.get(), cloud_.get()));
     wifi_bootstrap_manager_->Init();
   }
 
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h
index 98ded7d..06d3bae 100644
--- a/libweave/src/privet/privet_manager.h
+++ b/libweave/src/privet/privet_manager.h
@@ -36,6 +36,7 @@
 class CommandManager;
 class DeviceRegistrationInfo;
 class Mdns;
+class Network;
 class StateManager;
 
 namespace privet {
@@ -47,7 +48,6 @@
 class PrivetHandler;
 class Publisher;
 class SecurityManager;
-class ShillClient;
 
 class Manager : public Privet, public CloudDelegate::Observer {
  public:
@@ -56,7 +56,7 @@
 
   void Start(const weave::Device::Options& options,
              const scoped_refptr<dbus::Bus>& bus,
-             ShillClient* shill_client,
+             Network* network,
              DeviceRegistrationInfo* device,
              CommandManager* command_manager,
              StateManager* state_manager,
diff --git a/libweave/src/privet/privet_types.cc b/libweave/src/privet/privet_types.cc
index dcf3209..cbe33da 100644
--- a/libweave/src/privet/privet_types.cc
+++ b/libweave/src/privet/privet_types.cc
@@ -8,6 +8,7 @@
 
 #include "weave/enum_to_string.h"
 #include "weave/privet.h"
+#include "weave/network.h"
 
 namespace weave {
 
@@ -65,6 +66,13 @@
     {WifiSetupState::kConnecting, "connecting"},
 };
 
+const EnumToStringMap<NetworkState>::Map kNetworkStateMap[] = {
+    {NetworkState::kOffline, "offline"},
+    {NetworkState::kFailure, "failure"},
+    {NetworkState::kConnecting, "connecting"},
+    {NetworkState::kConnected, "connected"},
+};
+
 }  // namespace
 
 template <>
@@ -95,4 +103,8 @@
 EnumToStringMap<WifiSetupState>::EnumToStringMap()
     : EnumToStringMap(kWifiSetupStateMap) {}
 
+template <>
+EnumToStringMap<NetworkState>::EnumToStringMap()
+    : EnumToStringMap(kNetworkStateMap) {}
+
 }  // namespace weave
diff --git a/libweave/src/privet/shill_client.cc b/libweave/src/privet/shill_client.cc
index defed3f..9c81064 100644
--- a/libweave/src/privet/shill_client.cc
+++ b/libweave/src/privet/shill_client.cc
@@ -13,6 +13,8 @@
 #include <chromeos/errors/error.h>
 #include <chromeos/errors/error_codes.h>
 
+#include "weave/enum_to_string.h"
+
 using chromeos::Any;
 using chromeos::VariantDictionary;
 using dbus::ObjectPath;
@@ -52,50 +54,35 @@
   return true;
 }
 
-ServiceState ShillServiceStateToServiceState(const string& state) {
+NetworkState ShillNetworkStateToNetworkState(const string& state) {
   // TODO(wiley) What does "unconfigured" mean in a world with multiple sets
   //             of WiFi credentials?
   // TODO(wiley) Detect disabled devices, update state appropriately.
   if ((state.compare(shill::kStateReady) == 0) ||
       (state.compare(shill::kStatePortal) == 0) ||
       (state.compare(shill::kStateOnline) == 0)) {
-    return ServiceState::kConnected;
+    return NetworkState::kConnected;
   }
   if ((state.compare(shill::kStateAssociation) == 0) ||
       (state.compare(shill::kStateConfiguration) == 0)) {
-    return ServiceState::kConnecting;
+    return NetworkState::kConnecting;
   }
   if ((state.compare(shill::kStateFailure) == 0) ||
       (state.compare(shill::kStateActivationFailure) == 0)) {
     // TODO(wiley) Get error information off the service object.
-    return ServiceState::kFailure;
+    return NetworkState::kFailure;
   }
   if ((state.compare(shill::kStateIdle) == 0) ||
       (state.compare(shill::kStateOffline) == 0) ||
       (state.compare(shill::kStateDisconnect) == 0)) {
-    return ServiceState::kOffline;
+    return NetworkState::kOffline;
   }
   LOG(WARNING) << "Unknown state found: '" << state << "'";
-  return ServiceState::kOffline;
+  return NetworkState::kOffline;
 }
 
 }  // namespace
 
-std::string ServiceStateToString(ServiceState state) {
-  switch (state) {
-    case ServiceState::kOffline:
-      return "offline";
-    case ServiceState::kFailure:
-      return "failure";
-    case ServiceState::kConnecting:
-      return "connecting";
-    case ServiceState::kConnected:
-      return "connected";
-  }
-  LOG(ERROR) << "Unknown ServiceState value!";
-  return "unknown";
-}
-
 ShillClient::ShillClient(const scoped_refptr<dbus::Bus>& bus,
                          const set<string>& device_whitelist)
     : bus_{bus},
@@ -116,7 +103,7 @@
   VLOG(2) << "ShillClient::Init();";
   CleanupConnectingService(false);
   devices_.clear();
-  connectivity_state_ = ServiceState::kOffline;
+  connectivity_state_ = NetworkState::kOffline;
   VariantDictionary properties;
   if (!manager_proxy_.GetProperties(&properties, nullptr)) {
     LOG(ERROR) << "Unable to get properties from Manager, waiting for "
@@ -159,16 +146,12 @@
   return true;
 }
 
-ServiceState ShillClient::GetConnectionState() const {
+NetworkState ShillClient::GetConnectionState() const {
   return connectivity_state_;
 }
 
-bool ShillClient::AmOnline() const {
-  return connectivity_state_ == ServiceState::kConnected;
-}
-
-void ShillClient::RegisterConnectivityListener(
-    const ConnectivityListener& listener) {
+void ShillClient::AddOnConnectionChangedCallback(
+    const OnConnectionChangedCallback& listener) {
   connectivity_listeners_.push_back(listener);
 }
 
@@ -195,7 +178,7 @@
   if (new_owner.empty()) {
     CleanupConnectingService(false);
     devices_.clear();
-    connectivity_state_ = ServiceState::kOffline;
+    connectivity_state_ = NetworkState::kOffline;
   } else {
     Init();  // New service owner means shill reset!
   }
@@ -314,7 +297,7 @@
       return;  // Spurious update?
     }
     device_state.selected_service.reset();
-    device_state.service_state = ServiceState::kOffline;
+    device_state.service_state = NetworkState::kOffline;
     removed_old_service = true;
   }
   std::shared_ptr<ServiceProxy> new_service;
@@ -329,7 +312,7 @@
     // happened long in the past for the connecting service.
     string state;
     if (GetStateForService(new_service.get(), &state)) {
-      device_state.service_state = ShillServiceStateToServiceState(state);
+      device_state.service_state = ShillNetworkStateToNetworkState(state);
     } else {
       LOG(WARNING) << "Failed to read properties from existing service "
                       "on selection.";
@@ -414,7 +397,7 @@
     const string& state) {
   if (!connecting_service_ ||
       connecting_service_->GetObjectPath() != service_path ||
-      ShillServiceStateToServiceState(state) != ServiceState::kConnected) {
+      ShillNetworkStateToNetworkState(state) != NetworkState::kConnected) {
     return;
   }
   connecting_service_reset_pending_ = true;
@@ -449,7 +432,7 @@
     if (kv.second.selected_service &&
         kv.second.selected_service->GetObjectPath() == service_path) {
       VLOG(3) << "Updated cached connection state for selected service.";
-      kv.second.service_state = ShillServiceStateToServiceState(state);
+      kv.second.service_state = ShillNetworkStateToNetworkState(state);
       UpdateConnectivityState();
       return;
     }
@@ -459,15 +442,14 @@
 void ShillClient::UpdateConnectivityState() {
   // Update the connectivity state of the device by picking the
   // state of the currently most connected selected service.
-  ServiceState new_connectivity_state{ServiceState::kOffline};
+  NetworkState new_connectivity_state{NetworkState::kOffline};
   for (const auto& kv : devices_) {
     if (kv.second.service_state > new_connectivity_state) {
       new_connectivity_state = kv.second.service_state;
     }
   }
-  VLOG(1) << "Connectivity changed: "
-          << ServiceStateToString(connectivity_state_) << " -> "
-          << ServiceStateToString(new_connectivity_state);
+  VLOG(1) << "Connectivity changed: " << EnumToString(connectivity_state_)
+          << " -> " << EnumToString(new_connectivity_state);
   // Notify listeners even if state changed to the same value. Listeners may
   // want to handle this event.
   connectivity_state_ = new_connectivity_state;
@@ -478,7 +460,8 @@
   // state.
   base::MessageLoop::current()->PostTask(
       FROM_HERE, base::Bind(&ShillClient::NotifyConnectivityListeners,
-                            weak_factory_.GetWeakPtr(), AmOnline()));
+                            weak_factory_.GetWeakPtr(),
+                            GetConnectionState() == NetworkState::kConnected));
 }
 
 void ShillClient::NotifyConnectivityListeners(bool am_online) {
diff --git a/libweave/src/privet/shill_client.h b/libweave/src/privet/shill_client.h
index ba36154..7d9069f 100644
--- a/libweave/src/privet/shill_client.h
+++ b/libweave/src/privet/shill_client.h
@@ -18,45 +18,27 @@
 #include <dbus/bus.h>
 
 #include "shill/dbus-proxies.h"
+#include "weave/network.h"
 
 namespace weave {
 namespace privet {
 
-enum class ServiceState {
-  kOffline = 0,
-  kFailure,
-  kConnecting,
-  kConnected,
-};
-
-std::string ServiceStateToString(ServiceState state);
-
-class ShillClient final {
+class ShillClient final : public Network {
  public:
-  // A callback that interested parties can register to be notified of
-  // transitions from online to offline and vice versa.  The boolean
-  // parameter will be true if we're online, and false if we're offline.
-  using ConnectivityListener = base::Callback<void(bool)>;
-
   ShillClient(const scoped_refptr<dbus::Bus>& bus,
               const std::set<std::string>& device_whitelist);
   ~ShillClient() = default;
 
   void Init();
-  void RegisterConnectivityListener(const ConnectivityListener& listener);
-  // Causes shill to attempt to connect to the given network with the given
-  // passphrase.  This is accomplished by:
-  //  1) Configuring a service through the Manager with the SSID and passphrase.
-  //  2) Calling Connect() on the service.
-  //  2) Monitoring the returned Service object until we reach an online state,
-  //     an error state, or another call to ConnectToService() occurs.
-  // Returns false on immediate failures with some descriptive codes in |error|.
+
+  // Network implementation.
+  void AddOnConnectionChangedCallback(
+      const OnConnectionChangedCallback& listener) override;
   bool ConnectToService(const std::string& ssid,
                         const std::string& passphrase,
                         const base::Closure& on_success,
-                        chromeos::ErrorPtr* error);
-  ServiceState GetConnectionState() const;
-  bool AmOnline() const;
+                        chromeos::ErrorPtr* error) override;
+  NetworkState GetConnectionState() const override;
 
  private:
   struct DeviceState {
@@ -66,7 +48,7 @@
     // service (for instance, in the period between configuring a WiFi service
     // with credentials, and when Connect() is called.)
     std::shared_ptr<org::chromium::flimflam::ServiceProxy> selected_service;
-    ServiceState service_state{ServiceState::kOffline};
+    NetworkState service_state{NetworkState::kOffline};
   };
 
   bool IsMonitoredDevice(org::chromium::flimflam::DeviceProxy* device);
@@ -112,7 +94,7 @@
   // There is logic that assumes we will never change this device list
   // in OnManagerPropertyChange.  Do not be tempted to remove this const.
   const std::set<std::string> device_whitelist_;
-  std::vector<ConnectivityListener> connectivity_listeners_;
+  std::vector<OnConnectionChangedCallback> connectivity_listeners_;
 
   // State for tracking where we are in our attempts to connect to a service.
   bool connecting_service_reset_pending_{false};
@@ -122,7 +104,7 @@
 
   // State for tracking our online connectivity.
   std::map<dbus::ObjectPath, DeviceState> devices_;
-  ServiceState connectivity_state_{ServiceState::kOffline};
+  NetworkState connectivity_state_{NetworkState::kOffline};
 
   base::WeakPtrFactory<ShillClient> weak_factory_{this};
 
diff --git a/libweave/src/privet/wifi_bootstrap_manager.cc b/libweave/src/privet/wifi_bootstrap_manager.cc
index d1bf380..4eeaa94 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.cc
+++ b/libweave/src/privet/wifi_bootstrap_manager.cc
@@ -12,7 +12,8 @@
 
 #include "libweave/src/privet/ap_manager_client.h"
 #include "libweave/src/privet/constants.h"
-#include "libweave/src/privet/shill_client.h"
+#include "weave/enum_to_string.h"
+#include "weave/network.h"
 
 namespace weave {
 namespace privet {
@@ -27,10 +28,10 @@
     const std::string& last_configured_ssid,
     const std::string& test_privet_ssid,
     bool ble_setup_enabled,
-    ShillClient* shill_client,
+    Network* network,
     ApManagerClient* ap_manager_client,
     CloudDelegate* gcd)
-    : shill_client_{shill_client},
+    : network_{network},
       ap_manager_client_{ap_manager_client},
       ssid_generator_{gcd, this},
       last_configured_ssid_{last_configured_ssid},
@@ -45,7 +46,7 @@
   if (ssid.empty())
     return;  // Delay initialization until ssid_generator_ is ready.
   UpdateConnectionState();
-  shill_client_->RegisterConnectivityListener(
+  network_->AddOnConnectionChangedCallback(
       base::Bind(&WifiBootstrapManager::OnConnectivityChange,
                  lifetime_weak_factory_.GetWeakPtr()));
   if (last_configured_ssid_.empty()) {
@@ -64,7 +65,7 @@
 }
 
 void WifiBootstrapManager::StartBootstrapping() {
-  if (shill_client_->AmOnline()) {
+  if (network_->GetConnectionState() == NetworkState::kConnected) {
     // If one of the devices we monitor for connectivity is online, we need not
     // start an AP.  For most devices, this is a situation which happens in
     // testing when we have an ethernet connection.  If you need to always
@@ -105,10 +106,10 @@
       FROM_HERE, base::Bind(&WifiBootstrapManager::OnConnectTimeout,
                             tasks_weak_factory_.GetWeakPtr()),
       base::TimeDelta::FromSeconds(kConnectTimeoutSeconds));
-  shill_client_->ConnectToService(
-      ssid, passphrase, base::Bind(&WifiBootstrapManager::OnConnectSuccess,
-                                   tasks_weak_factory_.GetWeakPtr(), ssid),
-      nullptr);
+  network_->ConnectToService(ssid, passphrase,
+                             base::Bind(&WifiBootstrapManager::OnConnectSuccess,
+                                        tasks_weak_factory_.GetWeakPtr(), ssid),
+                             nullptr);
 }
 
 void WifiBootstrapManager::EndConnecting() {
@@ -116,7 +117,7 @@
 
 void WifiBootstrapManager::StartMonitoring() {
   VLOG(1) << "Monitoring connectivity.";
-  // We already have a callback in place with |shill_client_| to update our
+  // We already have a callback in place with |network_| to update our
   // connectivity state.  See OnConnectivityChange().
   UpdateState(State::kMonitoring);
 }
@@ -262,12 +263,12 @@
   connection_state_ = ConnectionState{ConnectionState::kUnconfigured};
   if (last_configured_ssid_.empty())
     return;
-  ServiceState service_state{shill_client_->GetConnectionState()};
+  NetworkState service_state{network_->GetConnectionState()};
   switch (service_state) {
-    case ServiceState::kOffline:
+    case NetworkState::kOffline:
       connection_state_ = ConnectionState{ConnectionState::kOffline};
       return;
-    case ServiceState::kFailure: {
+    case NetworkState::kFailure: {
       // TODO(wiley) Pull error information from somewhere.
       chromeos::ErrorPtr error;
       chromeos::Error::AddTo(&error, FROM_HERE, errors::kDomain,
@@ -275,10 +276,10 @@
       connection_state_ = ConnectionState{std::move(error)};
       return;
     }
-    case ServiceState::kConnecting:
+    case NetworkState::kConnecting:
       connection_state_ = ConnectionState{ConnectionState::kConnecting};
       return;
-    case ServiceState::kConnected:
+    case NetworkState::kConnected:
       connection_state_ = ConnectionState{ConnectionState::kOnline};
       return;
   }
@@ -286,7 +287,7 @@
   chromeos::Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
                                errors::kInvalidState,
                                "Unknown state returned from ShillClient: %s",
-                               ServiceStateToString(service_state).c_str());
+                               EnumToString(service_state).c_str());
   connection_state_ = ConnectionState{std::move(error)};
 }
 
diff --git a/libweave/src/privet/wifi_bootstrap_manager.h b/libweave/src/privet/wifi_bootstrap_manager.h
index fbe89d0..ad87df1 100644
--- a/libweave/src/privet/wifi_bootstrap_manager.h
+++ b/libweave/src/privet/wifi_bootstrap_manager.h
@@ -21,12 +21,14 @@
 #include "libweave/src/privet/wifi_ssid_generator.h"
 
 namespace weave {
+
+class Network;
+
 namespace privet {
 
 class ApManagerClient;
 class CloudDelegate;
 class DeviceDelegate;
-class ShillClient;
 
 class WifiBootstrapManager : public WifiDelegate,
                              public CloudDelegate::Observer {
@@ -38,7 +40,7 @@
   WifiBootstrapManager(const std::string& last_configured_ssid,
                        const std::string& test_privet_ssid,
                        bool wifi_setup_enabled,
-                       ShillClient* shill_client,
+                       Network* shill_client,
                        ApManagerClient* ap_manager_client,
                        CloudDelegate* gcd);
   ~WifiBootstrapManager() override = default;
@@ -98,7 +100,7 @@
   // It is not persisted to disk.
   SetupState setup_state_{SetupState::kNone};
   ConnectionState connection_state_{ConnectionState::kDisabled};
-  ShillClient* shill_client_;
+  Network* network_;
   ApManagerClient* ap_manager_client_;
   WifiSsidGenerator ssid_generator_;
 
