diff --git a/chrome/app/theme/statusbar_network_1x.png b/chrome/app/theme/statusbar_network_1x.png
deleted file mode 100644
index 26b36bb94bc977f49aeebb368b11ca4b7f290d66..0000000000000000000000000000000000000000
Binary files a/chrome/app/theme/statusbar_network_1x.png and /dev/null differ
diff --git a/chrome/app/theme/statusbar_network_1x_error.png b/chrome/app/theme/statusbar_network_1x_error.png
deleted file mode 100644
index 06d95856e9afce64cdca53db9c3697e28c8784a2..0000000000000000000000000000000000000000
Binary files a/chrome/app/theme/statusbar_network_1x_error.png and /dev/null differ
diff --git a/chrome/app/theme/statusbar_network_1x_warn.png b/chrome/app/theme/statusbar_network_1x_warn.png
deleted file mode 100644
index 9c8ea7bc7eb3afaa704f61fd9a2a210aebcaab54..0000000000000000000000000000000000000000
Binary files a/chrome/app/theme/statusbar_network_1x_warn.png and /dev/null differ
diff --git a/chrome/app/theme/theme_resources.grd b/chrome/app/theme/theme_resources.grd
index 79e63b9b7bf01f676e6c554d0cab565519a9c789..6a8c38e49993354161dc7cc24debd34deac721d6 100644
--- a/chrome/app/theme/theme_resources.grd
+++ b/chrome/app/theme/theme_resources.grd
@@ -537,9 +537,6 @@
         <include name="IDR_STATUSBAR_NETWORK_3G" file="statusbar_network_3g.png" type="BINDATA" />
         <include name="IDR_STATUSBAR_NETWORK_3G_WARN" file="statusbar_network_3g_warn.png" type="BINDATA" />
         <include name="IDR_STATUSBAR_NETWORK_3G_ERROR" file="statusbar_network_3g_error.png" type="BINDATA" />
-        <include name="IDR_STATUSBAR_NETWORK_1X" file="statusbar_network_1x.png" type="BINDATA" />
-        <include name="IDR_STATUSBAR_NETWORK_1X_WARN" file="statusbar_network_1x_warn.png" type="BINDATA" />
-        <include name="IDR_STATUSBAR_NETWORK_1X_ERROR" file="statusbar_network_1x_error.png" type="BINDATA" />
         <include name="IDR_STATUSBAR_NETWORK_BARS0" file="statusbar_network_bars0.png" type="BINDATA" />
         <include name="IDR_STATUSBAR_NETWORK_BARS0_BLACK" file="statusbar_network_bars0b.png" type="BINDATA" />
         <include name="IDR_STATUSBAR_NETWORK_BARS1" file="statusbar_network_bars1.png" type="BINDATA" />
diff --git a/chrome/browser/browser_init.cc b/chrome/browser/browser_init.cc
index f28029f8612e384f4e547667b407437bea3e867c..15bfb0b1f6bc723aff17712db2374b74c4b91478 100644
--- a/chrome/browser/browser_init.cc
+++ b/chrome/browser/browser_init.cc
@@ -441,13 +441,11 @@ bool BrowserInit::LaunchBrowser(const CommandLine& command_line,
 
     static chromeos::NetworkMessageObserver* network_message_observer =
         new chromeos::NetworkMessageObserver(profile);
-    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
-        ->AddNetworkManagerObserver(network_message_observer);
-    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
-        ->AddCellularDataPlanObserver(network_message_observer);
+    chromeos::CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(
+        network_message_observer);
 
-    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
-        ->AddNetworkManagerObserver(chromeos::NetworkStateNotifier::Get());
+    chromeos::CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(
+        chromeos::NetworkStateNotifier::Get());
   }
 #endif
   return true;
diff --git a/chrome/browser/chromeos/cros/cros_mock.cc b/chrome/browser/chromeos/cros/cros_mock.cc
index 13416c52b7a523f7bd061aca58b65e0a184475a5..25bf9aa9217b9229e5f8a6260c9c30d6bec12511 100644
--- a/chrome/browser/chromeos/cros/cros_mock.cc
+++ b/chrome/browser/chromeos/cros/cros_mock.cc
@@ -273,7 +273,7 @@ void CrosMock::SetNetworkLibraryStatusAreaExpectations() {
       .Times(1)
       .RetiresOnSaturation();
 
-  // NetworkDropdownButton::OnNetworkManagerChanged() calls:
+  // NetworkDropdownButton::NetworkChanged() calls:
   EXPECT_CALL(*mock_network_library_, ethernet_connected())
       .Times(1)
       .WillRepeatedly((Return(false)))
diff --git a/chrome/browser/chromeos/cros/mock_network_library.h b/chrome/browser/chromeos/cros/mock_network_library.h
index 513eca343ffe4722bafb92f6da39c70d159bb2c2..21465c77d9b02266cbe700799a9603f5ce0507e8 100644
--- a/chrome/browser/chromeos/cros/mock_network_library.h
+++ b/chrome/browser/chromeos/cros/mock_network_library.h
@@ -17,12 +17,10 @@ class MockNetworkLibrary : public NetworkLibrary {
  public:
   MockNetworkLibrary() {}
   virtual ~MockNetworkLibrary() {}
-  MOCK_METHOD1(AddNetworkManagerObserver, void(NetworkManagerObserver*));
-  MOCK_METHOD1(RemoveNetworkManagerObserver, void(NetworkManagerObserver*));
-  MOCK_METHOD2(AddNetworkObserver, void(const char*, NetworkObserver*));
-  MOCK_METHOD1(RemoveNetworkObserver, void(NetworkObserver*));
-  MOCK_METHOD1(AddCellularDataPlanObserver, void(NetworkManagerObserver*));
-  MOCK_METHOD1(RemoveCellularDataPlanObserver, void(NetworkManagerObserver*));
+  MOCK_METHOD1(AddObserver, void(Observer*));
+  MOCK_METHOD1(RemoveObserver, void(Observer*));
+  MOCK_METHOD2(AddProperyObserver, void(const char*, PropertyObserver*));
+  MOCK_METHOD1(RemoveProperyObserver, void(PropertyObserver*));
   MOCK_METHOD0(ethernet_network, EthernetNetwork*(void));
   MOCK_CONST_METHOD0(ethernet_connecting, bool(void));
   MOCK_CONST_METHOD0(ethernet_connected, bool(void));
diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc
index dac756caa618c6dd410080a4963ab00aea21f867..feb4d49398c9cafac421e24056420ba56b5a7ca6 100644
--- a/chrome/browser/chromeos/cros/network_library.cc
+++ b/chrome/browser/chromeos/cros/network_library.cc
@@ -12,130 +12,12 @@
 #include "base/string_number_conversions.h"
 #include "base/string_util.h"
 #include "base/utf_string_conversions.h"
-#include "base/values.h"
 #include "chrome/browser/browser_thread.h"
 #include "chrome/browser/chromeos/cros/cros_library.h"
 #include "grit/generated_resources.h"
 
 namespace chromeos {
 
-namespace {
-// TODO(ers) These string constants and Parse functions are copied
-// straight out of libcros:chromeos_network.cc. Fix this by moving
-// all handling of properties into libcros.
-// Network service properties we are interested in monitoring
-static const char* kIsActiveProperty = "IsActive";
-static const char* kStateProperty = "State";
-static const char* kSignalStrengthProperty = "Strength";
-static const char* kActivationStateProperty = "Cellular.ActivationState";
-static const char* kNetworkTechnologyProperty = "Cellular.NetworkTechnology";
-static const char* kPaymentURLProperty = "Cellular.OlpUrl";
-static const char* kRestrictedPoolProperty = "Cellular.RestrictedPool";
-static const char* kRoamingStateProperty = "Cellular.RoamingState";
-
-// Connman state options.
-static const char* kStateIdle = "idle";
-static const char* kStateCarrier = "carrier";
-static const char* kStateAssociation = "association";
-static const char* kStateConfiguration = "configuration";
-static const char* kStateReady = "ready";
-static const char* kStateDisconnect = "disconnect";
-static const char* kStateFailure = "failure";
-static const char* kStateActivationFailure = "activation-failure";
-
-// Connman activation state options
-static const char* kActivationStateActivated = "activated";
-static const char* kActivationStateActivating = "activating";
-static const char* kActivationStateNotActivated = "not-activated";
-static const char* kActivationStatePartiallyActivated = "partially-activated";
-static const char* kActivationStateUnknown = "unknown";
-
-// Connman network technology options.
-static const char* kNetworkTechnology1Xrtt = "1xRTT";
-static const char* kNetworkTechnologyEvdo = "EVDO";
-static const char* kNetworkTechnologyGprs = "GPRS";
-static const char* kNetworkTechnologyEdge = "EDGE";
-static const char* kNetworkTechnologyUmts = "UMTS";
-static const char* kNetworkTechnologyHspa = "HSPA";
-static const char* kNetworkTechnologyHspaPlus = "HSPA+";
-static const char* kNetworkTechnologyLte = "LTE";
-static const char* kNetworkTechnologyLteAdvanced = "LTE Advanced";
-
-// Connman roaming state options
-static const char* kRoamingStateHome = "home";
-static const char* kRoamingStateRoaming = "roaming";
-static const char* kRoamingStateUnknown = "unknown";
-
-static ConnectionState ParseState(const std::string& state) {
-  if (state == kStateIdle)
-    return STATE_IDLE;
-  if (state == kStateCarrier)
-    return STATE_CARRIER;
-  if (state == kStateAssociation)
-    return STATE_ASSOCIATION;
-  if (state == kStateConfiguration)
-    return STATE_CONFIGURATION;
-  if (state == kStateReady)
-    return STATE_READY;
-  if (state == kStateDisconnect)
-    return STATE_DISCONNECT;
-  if (state == kStateFailure)
-    return STATE_FAILURE;
-  if (state == kStateActivationFailure)
-    return STATE_ACTIVATION_FAILURE;
-  return STATE_UNKNOWN;
-}
-
-static ActivationState ParseActivationState(
-    const std::string& activation_state) {
-  if (activation_state == kActivationStateActivated)
-    return ACTIVATION_STATE_ACTIVATED;
-  if (activation_state == kActivationStateActivating)
-    return ACTIVATION_STATE_ACTIVATING;
-  if (activation_state == kActivationStateNotActivated)
-    return ACTIVATION_STATE_NOT_ACTIVATED;
-  if (activation_state == kActivationStateUnknown)
-    return ACTIVATION_STATE_UNKNOWN;
-  if (activation_state == kActivationStatePartiallyActivated)
-    return ACTIVATION_STATE_PARTIALLY_ACTIVATED;
-  return ACTIVATION_STATE_UNKNOWN;
-}
-
-static NetworkTechnology ParseNetworkTechnology(
-    const std::string& technology) {
-    if (technology == kNetworkTechnology1Xrtt)
-    return NETWORK_TECHNOLOGY_1XRTT;
-  if (technology == kNetworkTechnologyEvdo)
-    return NETWORK_TECHNOLOGY_EVDO;
-  if (technology == kNetworkTechnologyGprs)
-    return NETWORK_TECHNOLOGY_GPRS;
-  if (technology == kNetworkTechnologyEdge)
-    return NETWORK_TECHNOLOGY_EDGE;
-  if (technology == kNetworkTechnologyUmts)
-    return NETWORK_TECHNOLOGY_UMTS;
-  if (technology == kNetworkTechnologyHspa)
-    return NETWORK_TECHNOLOGY_HSPA;
-  if (technology == kNetworkTechnologyHspaPlus)
-    return NETWORK_TECHNOLOGY_HSPA_PLUS;
-  if (technology == kNetworkTechnologyLte)
-    return NETWORK_TECHNOLOGY_LTE;
-  if (technology == kNetworkTechnologyLteAdvanced)
-    return NETWORK_TECHNOLOGY_LTE_ADVANCED;
-  return NETWORK_TECHNOLOGY_UNKNOWN;
-}
-static NetworkRoamingState ParseRoamingState(
-    const std::string& roaming_state) {
-    if (roaming_state == kRoamingStateHome)
-    return ROAMING_STATE_HOME;
-  if (roaming_state == kRoamingStateRoaming)
-    return ROAMING_STATE_ROAMING;
-  if (roaming_state == kRoamingStateUnknown)
-    return ROAMING_STATE_UNKNOWN;
-  return ROAMING_STATE_UNKNOWN;
-}
-
-}
-
 // Helper function to wrap Html with <th> tag.
 static std::string WrapWithTH(std::string text) {
   return "<th>" + text + "</th>";
@@ -217,7 +99,6 @@ void Network::Clear() {
   service_path_.clear();
   device_path_.clear();
   ip_address_.clear();
-  is_active_ = false;
 }
 
 Network::Network(const ServiceInfo* service) {
@@ -226,7 +107,6 @@ Network::Network(const ServiceInfo* service) {
   error_ = service->error;
   service_path_ = SafeString(service->service_path);
   device_path_ = SafeString(service->device_path);
-  is_active_ = service->is_active;
   ip_address_.clear();
   // If connected, get ip config.
   if (EnsureCrosLoaded() && connected() && service->device_path) {
@@ -630,7 +510,7 @@ bool WifiNetwork::IsCertificateLoaded() const {
 class NetworkLibraryImpl : public NetworkLibrary  {
  public:
   NetworkLibraryImpl()
-      : network_manager_monitor_(NULL),
+      : network_status_connection_(NULL),
         data_plan_monitor_(NULL),
         ethernet_(NULL),
         wifi_(NULL),
@@ -641,98 +521,68 @@ class NetworkLibraryImpl : public NetworkLibrary  {
         offline_mode_(false) {
     if (EnsureCrosLoaded()) {
       Init();
-      network_manager_monitor_ =
-          MonitorNetworkManager(&NetworkManagerStatusChangedHandler,
-                                this);
-      data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler,
-                                                   this);
     } else {
       InitTestData();
     }
   }
 
   ~NetworkLibraryImpl() {
-    DCHECK(!network_manager_observers_.size());
-    DCHECK(network_manager_monitor_);
-    DisconnectPropertyChangeMonitor(network_manager_monitor_);
-    DCHECK(!data_plan_observers_.size());
-    DCHECK(data_plan_monitor_);
-    DisconnectDataPlanUpdateMonitor(data_plan_monitor_);
-    DCHECK(!network_observers_.size());
-    STLDeleteValues(&network_observers_);
+    if (network_status_connection_) {
+      DisconnectMonitorNetwork(network_status_connection_);
+    }
+    if (data_plan_monitor_) {
+      DisconnectDataPlanUpdateMonitor(data_plan_monitor_);
+    }
+    // DCHECK(!observers_.size());
+    DCHECK(!property_observers_.size());
+    STLDeleteValues(&property_observers_);
     ClearNetworks();
   }
 
-  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {
-    network_manager_observers_.AddObserver(observer);
+  void AddObserver(Observer* observer) {
+    observers_.AddObserver(observer);
   }
 
-  virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {
-    if (!network_manager_observers_.HasObserver(observer))
-      network_manager_observers_.RemoveObserver(observer);
+  void RemoveObserver(Observer* observer) {
+    observers_.RemoveObserver(observer);
   }
 
-  virtual void AddNetworkObserver(const std::string& service_path,
-                                  NetworkObserver* observer) {
+  virtual void AddProperyObserver(const char* service_path,
+                                  PropertyObserver* observer) {
+    DCHECK(service_path);
     DCHECK(observer);
     if (!EnsureCrosLoaded())
       return;
     // First, add the observer to the callback map.
-    NetworkObserverMap::iterator iter = network_observers_.find(service_path);
-    NetworkObserverList* oblist;
-    if (iter != network_observers_.end()) {
-      oblist = iter->second;
+    PropertyChangeObserverMap::iterator iter = property_observers_.find(
+        std::string(service_path));
+    if (iter != property_observers_.end()) {
+      iter->second->AddObserver(observer);
     } else {
-      std::pair<NetworkObserverMap::iterator, bool> inserted =
-        network_observers_.insert(
-            std::make_pair<std::string, NetworkObserverList*>(
-                service_path,
-                new NetworkObserverList(this, service_path)));
-      oblist = inserted.first->second;
-    }
-    if (!oblist->HasObserver(observer))
-      oblist->AddObserver(observer);
-  }
-
-  virtual void RemoveNetworkObserver(const std::string& service_path,
-                                     NetworkObserver* observer) {
-    DCHECK(observer);
-    DCHECK(service_path.size());
-    NetworkObserverMap::iterator map_iter = network_observers_.find(
-        service_path);
-    if (map_iter != network_observers_.end()) {
-      map_iter->second->RemoveObserver(observer);
-      if (!map_iter->second->size()) {
-        delete map_iter->second;
-        network_observers_.erase(map_iter++);
-      }
+      std::pair<PropertyChangeObserverMap::iterator, bool> inserted =
+        property_observers_.insert(
+            std::pair<std::string, PropertyObserverList*>(
+                std::string(service_path),
+                new PropertyObserverList(this, service_path)));
+      inserted.first->second->AddObserver(observer);
     }
   }
 
-  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {
+  virtual void RemoveProperyObserver(PropertyObserver* observer) {
     DCHECK(observer);
-    NetworkObserverMap::iterator map_iter = network_observers_.begin();
-    while (map_iter != network_observers_.end()) {
+    PropertyChangeObserverMap::iterator map_iter =
+          property_observers_.begin();
+    while (map_iter != property_observers_.end()) {
       map_iter->second->RemoveObserver(observer);
       if (!map_iter->second->size()) {
         delete map_iter->second;
-        network_observers_.erase(map_iter++);
+        property_observers_.erase(map_iter++);
       } else {
         ++map_iter;
       }
     }
   }
 
-  virtual void AddCellularDataPlanObserver(CellularDataPlanObserver* observer) {
-    if (!data_plan_observers_.HasObserver(observer))
-      data_plan_observers_.AddObserver(observer);
-  }
-
-  virtual void RemoveCellularDataPlanObserver(
-      CellularDataPlanObserver* observer) {
-    data_plan_observers_.RemoveObserver(observer);
-  }
-
   virtual EthernetNetwork* ethernet_network() { return ethernet_; }
   virtual bool ethernet_connecting() const {
     return ethernet_ ? ethernet_->connecting() : false;
@@ -766,14 +616,14 @@ class NetworkLibraryImpl : public NetworkLibrary  {
   }
 
   const std::string& IPAddress() const {
-    // Returns IP address for the active network.
-    const Network* active = active_network();
-    if (active != NULL)
-      return active->ip_address();
-    if (ethernet_)
+    // Returns highest priority IP address.
+    if (ethernet_connected())
       return ethernet_->ip_address();
-    static std::string null_address("0.0.0.0");
-    return null_address;
+    if (wifi_connected())
+      return wifi_->ip_address();
+    if (cellular_connected())
+      return cellular_->ip_address();
+    return ethernet_->ip_address();
   }
 
   virtual const WifiNetworkVector& wifi_networks() const {
@@ -838,7 +688,6 @@ class NetworkLibraryImpl : public NetworkLibrary  {
     DCHECK(network);
     if (!EnsureCrosLoaded())
       return;
-    // TODO(ers) make wifi the highest priority service type
     if (ConnectToNetworkWithCertInfo(network->service_path().c_str(),
         password.empty() ? NULL : password.c_str(),
         identity.empty() ? NULL : identity.c_str(),
@@ -853,7 +702,7 @@ class NetworkLibraryImpl : public NetworkLibrary  {
         wifi->set_connecting(true);
         wifi_ = wifi;
       }
-      NotifyNetworkManagerChanged();
+      NotifyNetworkChanged();
     }
   }
 
@@ -872,7 +721,6 @@ class NetworkLibraryImpl : public NetworkLibrary  {
       // Set auto-connect.
       SetAutoConnect(service->service_path, auto_connect);
       // Now connect to that service.
-      // TODO(ers) make wifi the highest priority service type
       ConnectToNetworkWithCertInfo(service->service_path,
           password.empty() ? NULL : password.c_str(),
           identity.empty() ? NULL : identity.c_str(),
@@ -890,7 +738,6 @@ class NetworkLibraryImpl : public NetworkLibrary  {
     DCHECK(network);
     if (!EnsureCrosLoaded())
       return;
-    // TODO(ers) make cellular the highest priority service type
     if (network && ConnectToNetwork(network->service_path().c_str(), NULL)) {
       // Update local cache and notify listeners.
       CellularNetwork* cellular = GetWirelessNetworkByPath(
@@ -899,7 +746,7 @@ class NetworkLibraryImpl : public NetworkLibrary  {
         cellular->set_connecting(true);
         cellular_ = cellular;
       }
-      NotifyNetworkManagerChanged();
+      NotifyNetworkChanged();
     }
   }
 
@@ -914,7 +761,6 @@ class NetworkLibraryImpl : public NetworkLibrary  {
     DCHECK(network);
     if (!EnsureCrosLoaded() || !network)
       return;
-    // TODO(ers) restore default service type priority ordering?
     if (DisconnectFromNetwork(network->service_path().c_str())) {
       // Update local cache and notify listeners.
       if (network->type() == TYPE_WIFI) {
@@ -932,7 +778,7 @@ class NetworkLibraryImpl : public NetworkLibrary  {
           cellular_ = NULL;
         }
       }
-      NotifyNetworkManagerChanged();
+      NotifyNetworkChanged();
     }
   }
 
@@ -974,7 +820,7 @@ class NetworkLibraryImpl : public NetworkLibrary  {
           break;
         }
       }
-      NotifyNetworkManagerChanged();
+      NotifyNetworkChanged();
     }
   }
 
@@ -1000,16 +846,6 @@ class NetworkLibraryImpl : public NetworkLibrary  {
 
   virtual bool offline_mode() const { return offline_mode_; }
 
-  virtual const Network* active_network() const {
-    if (ethernet_ && ethernet_->is_active())
-      return ethernet_;
-    if (wifi_ && wifi_->is_active())
-      return wifi_;
-    if (cellular_ && cellular_->is_active())
-      return cellular_;
-    return NULL;
-  }
-
   virtual void EnableEthernetNetworkDevice(bool enable) {
     EnableNetworkDeviceType(TYPE_ETHERNET, enable);
   }
@@ -1115,53 +951,52 @@ class NetworkLibraryImpl : public NetworkLibrary  {
 
  private:
 
-  class NetworkObserverList : public ObserverList<NetworkObserver> {
+  class PropertyObserverList : public ObserverList<PropertyObserver> {
    public:
-    NetworkObserverList(NetworkLibraryImpl* library,
-                        const std::string& service_path) {
-      network_monitor_ = MonitorNetworkService(&NetworkStatusChangedHandler,
-                                               service_path.c_str(),
-                                               library);
+    PropertyObserverList(NetworkLibraryImpl* library,
+                         const char* service_path) {
+      DCHECK(service_path);
+      property_change_monitor_ = MonitorNetworkService(&PropertyChangeHandler,
+                                                       service_path,
+                                                       library);
     }
 
-    virtual ~NetworkObserverList() {
-      if (network_monitor_)
-        DisconnectPropertyChangeMonitor(network_monitor_);
+    virtual ~PropertyObserverList() {
+      if (property_change_monitor_)
+        DisconnectPropertyChangeMonitor(property_change_monitor_);
     }
 
    private:
-    static void NetworkStatusChangedHandler(void* object,
-                                            const char* path,
-                                            const char* key,
-                                            const Value* value) {
-      NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
-      DCHECK(networklib);
-      networklib->UpdateNetworkStatus(path, key, value);
+    static void PropertyChangeHandler(void* object,
+                                      const char* path,
+                                      const char* key,
+                                      const Value* value) {
+      NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object);
+      DCHECK(network);
+      network->NotifyPropertyChange(path, key, value);
     }
-    PropertyChangeMonitor network_monitor_;
+    PropertyChangeMonitor property_change_monitor_;
   };
 
-  typedef std::map<std::string, NetworkObserverList*> NetworkObserverMap;
+  typedef std::map<std::string, PropertyObserverList*>
+      PropertyChangeObserverMap;
 
-  static void NetworkManagerStatusChangedHandler(void* object,
-                                                 const char* path,
-                                                 const char* key,
-                                                 const Value* value) {
-    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
-    DCHECK(networklib);
-    networklib->UpdateNetworkManagerStatus();
+  static void NetworkStatusChangedHandler(void* object) {
+    NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object);
+    DCHECK(network);
+    network->UpdateNetworkStatus();
   }
 
   static void DataPlanUpdateHandler(void* object,
                                     const char* modem_service_path,
                                     const CellularDataPlanList* dataplan) {
-    NetworkLibraryImpl* networklib = static_cast<NetworkLibraryImpl*>(object);
-    DCHECK(networklib && networklib->cellular_network());
+    NetworkLibraryImpl* network = static_cast<NetworkLibraryImpl*>(object);
+    DCHECK(network && network->cellular_network());
     // Store data plan for currently connected cellular network.
-    if (networklib->cellular_network()->service_path()
+    if (network->cellular_network()->service_path()
         .compare(modem_service_path) == 0) {
       if (dataplan != NULL) {
-        networklib->UpdateCellularDataPlan(*dataplan);
+        network->UpdateCellularDataPlan(*dataplan);
       }
     }
   }
@@ -1186,7 +1021,6 @@ class NetworkLibraryImpl : public NetworkLibrary  {
                << " str=" << service->strength
                << " fav=" << service->favorite
                << " auto=" << service->auto_connect
-               << " is_active=" << service->is_active
                << " error=" << service->error;
       // Once a connected ethernet service is found, disregard other ethernet
       // services that are also found
@@ -1226,10 +1060,17 @@ class NetworkLibraryImpl : public NetworkLibrary  {
   }
 
   void Init() {
-    // First, get the currently available networks. This data is cached
+    // First, get the currently available networks.  This data is cached
     // on the connman side, so the call should be quick.
     VLOG(1) << "Getting initial CrOS network info.";
     UpdateSystemInfo();
+
+    VLOG(1) << "Registering for network status updates.";
+    // Now, register to receive updates on network status.
+    network_status_connection_ = MonitorNetwork(&NetworkStatusChangedHandler,
+                                                this);
+    VLOG(1) << "Registering for cellular data plan updates.";
+    data_plan_monitor_ = MonitorCellularDataPlan(&DataPlanUpdateHandler, this);
   }
 
   void InitTestData() {
@@ -1308,7 +1149,7 @@ class NetworkLibraryImpl : public NetworkLibrary  {
 
   void UpdateSystemInfo() {
     if (EnsureCrosLoaded()) {
-      UpdateNetworkManagerStatus();
+      UpdateNetworkStatus();
     }
   }
 
@@ -1357,40 +1198,53 @@ class NetworkLibraryImpl : public NetworkLibrary  {
     EnableNetworkDevice(device, enable);
   }
 
-  void NotifyNetworkManagerChanged() {
-    FOR_EACH_OBSERVER(NetworkManagerObserver,
-                      network_manager_observers_,
-                      OnNetworkManagerChanged(this));
+  void NotifyNetworkChanged() {
+    FOR_EACH_OBSERVER(Observer, observers_, NetworkChanged(this));
   }
 
-  void NotifyNetworkChanged(Network* network) {
-    DCHECK(network);
-    NetworkObserverMap::const_iterator iter = network_observers_.find(
-        network->service_path());
-    if (iter != network_observers_.end()) {
-      FOR_EACH_OBSERVER(NetworkObserver,
-                        *(iter->second),
-                        OnNetworkChanged(this, network));
+  void NotifyCellularDataPlanChanged() {
+    FOR_EACH_OBSERVER(Observer, observers_, CellularDataPlanChanged(this));
+  }
+
+  void NotifyPropertyChange(const char* service_path,
+                            const char* key,
+                            const Value* value) {
+    DCHECK(service_path);
+    DCHECK(key);
+    DCHECK(value);
+    PropertyChangeObserverMap::const_iterator iter = property_observers_.find(
+        std::string(service_path));
+    if (iter != property_observers_.end()) {
+      FOR_EACH_OBSERVER(PropertyObserver, *(iter->second),
+          PropertyChanged(service_path, key, value));
     } else {
       NOTREACHED() <<
           "There weren't supposed to be any property change observers of " <<
-           network->service_path();
+          service_path;
     }
   }
 
-  void NotifyCellularDataPlanChanged() {
-    FOR_EACH_OBSERVER(CellularDataPlanObserver,
-                      data_plan_observers_,
-                      OnCellularDataPlanChanged(this));
+  void ClearNetworks() {
+    if (ethernet_)
+      delete ethernet_;
+    ethernet_ = NULL;
+    wifi_ = NULL;
+    cellular_ = NULL;
+    STLDeleteElements(&wifi_networks_);
+    wifi_networks_.clear();
+    STLDeleteElements(&cellular_networks_);
+    cellular_networks_.clear();
+    STLDeleteElements(&remembered_wifi_networks_);
+    remembered_wifi_networks_.clear();
   }
 
-  void UpdateNetworkManagerStatus() {
+  void UpdateNetworkStatus() {
     // Make sure we run on UI thread.
     if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
       BrowserThread::PostTask(
           BrowserThread::UI, FROM_HERE,
           NewRunnableMethod(this,
-                            &NetworkLibraryImpl::UpdateNetworkManagerStatus));
+                            &NetworkLibraryImpl::UpdateNetworkStatus));
       return;
     }
 
@@ -1434,114 +1288,30 @@ class NetworkLibraryImpl : public NetworkLibrary  {
     connected_devices_ = system->connected_technologies;
     offline_mode_ = system->offline_mode;
 
-    NotifyNetworkManagerChanged();
+    NotifyNetworkChanged();
     FreeSystemInfo(system);
   }
 
-  void UpdateNetworkStatus(const char* path,
-                           const char* key,
-                           const Value* value) {
-    if (key == NULL || value == NULL)
-      return;
-    // Make sure we run on UI thread.
-    if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
-      BrowserThread::PostTask(
-          BrowserThread::UI, FROM_HERE,
-          NewRunnableMethod(this,
-                            &NetworkLibraryImpl::UpdateNetworkStatus,
-                            path, key, value));
-      return;
-    }
-
-    bool boolval = false;
-    int intval = 0;
-    std::string stringval;
-    Network* network;
-    if (ethernet_->service_path() == path) {
-      network = ethernet_;
-    } else {
-      CellularNetwork* cellular =
-          GetWirelessNetworkByPath(cellular_networks_, path);
-      WifiNetwork* wifi =
-          GetWirelessNetworkByPath(wifi_networks_, path);
-      if (cellular == NULL && wifi == NULL)
-        return;
-
-      WirelessNetwork* wireless;
-      if (wifi != NULL)
-        wireless = static_cast<WirelessNetwork*>(wifi);
-      else
-        wireless = static_cast<WirelessNetwork*>(cellular);
-
-      if (strcmp(key, kSignalStrengthProperty) == 0) {
-        if (value->GetAsInteger(&intval))
-          wireless->set_strength(intval);
-      } else if (cellular != NULL) {
-        if (strcmp(key, kRestrictedPoolProperty) == 0) {
-          if (value->GetAsBoolean(&boolval))
-            cellular->set_restricted_pool(boolval);
-        } else if (strcmp(key, kActivationStateProperty) == 0) {
-          if (value->GetAsString(&stringval))
-            cellular->set_activation_state(ParseActivationState(stringval));
-        } else if (strcmp(key, kPaymentURLProperty) == 0) {
-          if (value->GetAsString(&stringval))
-            cellular->set_payment_url(stringval);
-        } else if (strcmp(key, kNetworkTechnologyProperty) == 0) {
-          if (value->GetAsString(&stringval))
-            cellular->set_network_technology(
-                ParseNetworkTechnology(stringval));
-        } else if (strcmp(key, kRoamingStateProperty) == 0) {
-          if (value->GetAsString(&stringval))
-            cellular->set_roaming_state(ParseRoamingState(stringval));
-        }
-      }
-      network = wireless;
-    }
-    if (strcmp(key, kIsActiveProperty) == 0) {
-      if (value->GetAsBoolean(&boolval))
-        network->set_active(boolval);
-    } else if (strcmp(key, kStateProperty) == 0) {
-      if (value->GetAsString(&stringval))
-        network->set_state(ParseState(stringval));
-    }
-    NotifyNetworkChanged(network);
-  }
-
   void UpdateCellularDataPlan(const CellularDataPlanList& data_plans) {
     DCHECK(cellular_);
     cellular_->SetDataPlans(data_plans);
     NotifyCellularDataPlanChanged();
   }
 
-  void ClearNetworks() {
-    if (ethernet_)
-      delete ethernet_;
-    ethernet_ = NULL;
-    wifi_ = NULL;
-    cellular_ = NULL;
-    STLDeleteElements(&wifi_networks_);
-    wifi_networks_.clear();
-    STLDeleteElements(&cellular_networks_);
-    cellular_networks_.clear();
-    STLDeleteElements(&remembered_wifi_networks_);
-    remembered_wifi_networks_.clear();
-  }
-
-  // Network manager observer list
-  ObserverList<NetworkManagerObserver> network_manager_observers_;
+  ObserverList<Observer> observers_;
 
-  // Cellular data plan observer list
-  ObserverList<CellularDataPlanObserver> data_plan_observers_;
+  // Property change observer map
+  PropertyChangeObserverMap  property_observers_;
 
-  // Network observer map
-  NetworkObserverMap network_observers_;
-
-  // For monitoring network manager status changes.
-  PropertyChangeMonitor network_manager_monitor_;
+  // The network status connection for monitoring network status changes.
+  MonitorNetworkConnection network_status_connection_;
 
   // For monitoring data plan changes to the connected cellular network.
   DataPlanUpdateMonitor data_plan_monitor_;
 
+  // The property change connection for monitoring service property changes.
+  std::map<std::string, PropertyChangeMonitor> property_change_monitors_;
+
   // The ethernet network.
   EthernetNetwork* ethernet_;
 
@@ -1583,17 +1353,11 @@ class NetworkLibraryStubImpl : public NetworkLibrary {
         cellular_(NULL) {
   }
   ~NetworkLibraryStubImpl() { if (ethernet_) delete ethernet_; }
-  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) {}
-  virtual void RemoveNetworkManagerObserver(NetworkManagerObserver* observer) {}
-  virtual void AddNetworkObserver(const std::string& service_path,
-                                  NetworkObserver* observer) {}
-  virtual void RemoveNetworkObserver(const std::string& service_path,
-                                     NetworkObserver* observer) {}
-  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) {}
-  virtual void AddCellularDataPlanObserver(
-      CellularDataPlanObserver* observer) {}
-  virtual void RemoveCellularDataPlanObserver(
-      CellularDataPlanObserver* observer) {}
+  virtual void AddObserver(Observer* observer) {}
+  virtual void RemoveObserver(Observer* observer) {}
+  virtual void AddProperyObserver(const char* service_path,
+                                  PropertyObserver* observer) {}
+  virtual void RemoveProperyObserver(PropertyObserver* observer) {}
   virtual EthernetNetwork* ethernet_network() {
     return ethernet_;
   }
@@ -1658,7 +1422,6 @@ class NetworkLibraryStubImpl : public NetworkLibrary {
   virtual bool ethernet_enabled() const { return true; }
   virtual bool wifi_enabled() const { return false; }
   virtual bool cellular_enabled() const { return false; }
-  virtual const Network* active_network() const { return NULL; }
   virtual bool offline_mode() const { return false; }
   virtual void EnableEthernetNetworkDevice(bool enable) {}
   virtual void EnableWifiNetworkDevice(bool enable) {}
diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h
index 1e48fc7a3a4dd1d27c0f2cd1a3a6deca7dcaa17b..65574ed9a3a443f9eac41fa67c2d6c6e9db7a9b9 100644
--- a/chrome/browser/chromeos/cros/network_library.h
+++ b/chrome/browser/chromeos/cros/network_library.h
@@ -48,10 +48,13 @@ class Network {
       state_ == STATE_IDLE; }
   ConnectionError error() const { return error_; }
   ConnectionState state() const { return state_; }
-  // Is this the active network, i.e, the one through which
-  // network traffic is being routed? A network can be connected,
-  // but not be carrying traffic.
-  bool is_active() const { return is_active_; }
+
+  void set_service_path(const std::string& service_path) {
+      service_path_ = service_path; }
+  void set_connecting(bool connecting) { state_ = (connecting ?
+      STATE_ASSOCIATION : STATE_IDLE); }
+  void set_connected(bool connected) { state_ = (connected ?
+      STATE_READY : STATE_IDLE); }
 
   // Clear the fields.
   virtual void Clear();
@@ -66,8 +69,7 @@ class Network {
   Network()
       : type_(TYPE_UNKNOWN),
         state_(STATE_UNKNOWN),
-        error_(ERROR_UNKNOWN),
-        is_active_(false) {}
+        error_(ERROR_UNKNOWN) {}
   explicit Network(const Network& network);
   explicit Network(const ServiceInfo* service);
   virtual ~Network() {}
@@ -78,19 +80,6 @@ class Network {
   ConnectionType type_;
   ConnectionState state_;
   ConnectionError error_;
-  bool is_active_;
-
- private:
-  void set_service_path(const std::string& service_path) {
-      service_path_ = service_path; }
-  void set_connecting(bool connecting) { state_ = (connecting ?
-      STATE_ASSOCIATION : STATE_IDLE); }
-  void set_connected(bool connected) { state_ = (connected ?
-      STATE_READY : STATE_IDLE); }
-  void set_state(ConnectionState state) { state_ = state; }
-  void set_active(bool is_active) { is_active_ = is_active; }
-
-  friend class NetworkLibraryImpl;
 };
 
 class EthernetNetwork : public Network {
@@ -130,6 +119,8 @@ class WirelessNetwork : public Network {
   bool auto_connect() const { return auto_connect_; }
   bool favorite() const { return favorite_; }
 
+  void set_name(const std::string& name) { name_ = name; }
+  void set_strength(int strength) { strength_ = strength; }
   void set_auto_connect(bool auto_connect) { auto_connect_ = auto_connect; }
   void set_favorite(bool favorite) { favorite_ = favorite; }
 
@@ -149,12 +140,6 @@ class WirelessNetwork : public Network {
   int strength_;
   bool auto_connect_;
   bool favorite_;
-
- private:
-  void set_name(const std::string& name) { name_ = name; }
-  void set_strength(int strength) { strength_ = strength; }
-
-  friend class NetworkLibraryImpl;
 };
 
 class CellularNetwork : public WirelessNetwork {
@@ -173,6 +158,9 @@ class CellularNetwork : public WirelessNetwork {
   // Starts device activation process. Returns false if the device state does
   // not permit activation.
   bool StartActivation() const;
+  void set_activation_state(ActivationState state) {
+    activation_state_ = state;
+  }
   const ActivationState activation_state() const { return activation_state_; }
   const NetworkTechnology network_technology() const {
     return network_technology_;
@@ -183,6 +171,9 @@ class CellularNetwork : public WirelessNetwork {
   const std::string& operator_name() const { return operator_name_; }
   const std::string& operator_code() const { return operator_code_; }
   const std::string& payment_url() const { return payment_url_; }
+  void set_payment_url(const std::string& url) {
+    payment_url_ = url;
+  }
   const std::string& meid() const { return meid_; }
   const std::string& imei() const { return imei_; }
   const std::string& imsi() const { return imsi_; }
@@ -243,25 +234,6 @@ class CellularNetwork : public WirelessNetwork {
   std::string last_update_;
   unsigned int prl_version_;
   CellularDataPlanList data_plans_;
-
- private:
-  void set_activation_state(ActivationState state) {
-    activation_state_ = state;
-  }
-  void set_payment_url(const std::string& url) {
-    payment_url_ = url;
-  }
-  void set_network_technology(NetworkTechnology technology) {
-    network_technology_ = technology;
-  }
-  void set_roaming_state(NetworkRoamingState state) {
-    roaming_state_ = state;
-  }
-  void set_restricted_pool(bool restricted_pool) {
-    restricted_pool_ = restricted_pool;
-  }
-
-  friend class NetworkLibraryImpl;
 };
 
 class WifiNetwork : public WirelessNetwork {
@@ -367,47 +339,27 @@ typedef std::vector<NetworkIPConfig> NetworkIPConfigVector;
 // library like this: chromeos::CrosLibrary::Get()->GetNetworkLibrary()
 class NetworkLibrary {
  public:
-  class NetworkManagerObserver {
+  class Observer {
    public:
-    // Called when the state of the network manager has changed,
-    // for example, networks have appeared or disappeared.
-    virtual void OnNetworkManagerChanged(NetworkLibrary* obj) = 0;
-  };
-
-  class NetworkObserver {
-   public:
-    // Called when the state of a single network has changed,
-    // for example signal strength or connection state.
-    virtual void OnNetworkChanged(NetworkLibrary* cros,
-                                  const Network* network) = 0;
+    // Called when the network has changed. (wifi networks, and ethernet)
+    virtual void NetworkChanged(NetworkLibrary* obj) = 0;
+    // Called when the cellular data plan has changed.
+    virtual void CellularDataPlanChanged(NetworkLibrary* obj) {}
   };
 
-  class CellularDataPlanObserver {
+  class PropertyObserver {
    public:
-    // Called when the cellular data plan has changed.
-    virtual void OnCellularDataPlanChanged(NetworkLibrary* obj) = 0;
+    virtual void PropertyChanged(const char* service_path,
+                                 const char* key,
+                                 const Value* value) = 0;
   };
 
   virtual ~NetworkLibrary() {}
-
-  virtual void AddNetworkManagerObserver(NetworkManagerObserver* observer) = 0;
-  virtual void RemoveNetworkManagerObserver(
-      NetworkManagerObserver* observer) = 0;
-
-  // An attempt to add an observer that has already been added for a
-  // give service path will be ignored.
-  virtual void AddNetworkObserver(const std::string& service_path,
-                                  NetworkObserver* observer) = 0;
-  // Remove an observer of a single network
-  virtual void RemoveNetworkObserver(const std::string& service_path,
-                                     NetworkObserver* observer) = 0;
-  // Stop |observer| from observing any networks
-  virtual void RemoveObserverForAllNetworks(NetworkObserver* observer) = 0;
-
-  virtual void AddCellularDataPlanObserver(
-      CellularDataPlanObserver* observer) = 0;
-  virtual void RemoveCellularDataPlanObserver(
-      CellularDataPlanObserver* observer) = 0;
+  virtual void AddObserver(Observer* observer) = 0;
+  virtual void RemoveObserver(Observer* observer) = 0;
+  virtual void AddProperyObserver(const char* service_path,
+                                  PropertyObserver* observer) = 0;
+  virtual void RemoveProperyObserver(PropertyObserver* observer) = 0;
 
   // Return the active Ethernet network (or a default structure if inactive).
   virtual EthernetNetwork* ethernet_network() = 0;
@@ -505,8 +457,6 @@ class NetworkLibrary {
   virtual bool wifi_enabled() const = 0;
   virtual bool cellular_enabled() const = 0;
 
-  virtual const Network* active_network() const = 0;
-
   virtual bool offline_mode() const = 0;
 
   // Enables/disables the ethernet network device.
diff --git a/chrome/browser/chromeos/dom_ui/internet_options_handler.cc b/chrome/browser/chromeos/dom_ui/internet_options_handler.cc
index a4ab56fc28dfd35f9fa53bd5dc35d414915106d5..47541a3810289f2830b9499c24e04bf65f5287b3 100644
--- a/chrome/browser/chromeos/dom_ui/internet_options_handler.cc
+++ b/chrome/browser/chromeos/dom_ui/internet_options_handler.cc
@@ -56,19 +56,11 @@ std::string FormatHardwareAddress(const std::string& address) {
 }  // namespace
 
 InternetOptionsHandler::InternetOptionsHandler() {
-  chromeos::NetworkLibrary* netlib =
-      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
-  netlib->AddNetworkManagerObserver(this);
-  netlib->AddCellularDataPlanObserver(this);
-  MonitorActiveNetwork(netlib);
+  chromeos::CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(this);
 }
 
 InternetOptionsHandler::~InternetOptionsHandler() {
-  chromeos::NetworkLibrary *netlib =
-      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
-  netlib->RemoveNetworkManagerObserver(this);
-  netlib->RemoveCellularDataPlanObserver(this);
-  netlib->RemoveObserverForAllNetworks(this);
+  chromeos::CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this);
 }
 
 void InternetOptionsHandler::GetLocalizedValues(
@@ -365,8 +357,10 @@ void InternetOptionsHandler::BuyDataPlanCallback(const ListValue* args) {
     browser->OpenMobilePlanTabAndActivate();
 }
 
-void InternetOptionsHandler::RefreshNetworkData(
-    chromeos::NetworkLibrary* cros) {
+void InternetOptionsHandler::NetworkChanged(chromeos::NetworkLibrary* cros) {
+  if (!dom_ui_)
+    return;
+
   DictionaryValue dictionary;
   dictionary.Set("wiredList", GetWiredList());
   dictionary.Set("wirelessList", GetWirelessList());
@@ -379,45 +373,7 @@ void InternetOptionsHandler::RefreshNetworkData(
       L"options.InternetOptions.refreshNetworkData", dictionary);
 }
 
-void InternetOptionsHandler::OnNetworkManagerChanged(
-    chromeos::NetworkLibrary* cros) {
-  if (!dom_ui_)
-    return;
-  MonitorActiveNetwork(cros);
-  RefreshNetworkData(cros);
-}
-
-void InternetOptionsHandler::OnNetworkChanged(
-    chromeos::NetworkLibrary* cros,
-    const chromeos::Network* network) {
-  if (dom_ui_)
-    RefreshNetworkData(cros);
-}
-
-// Add an observer for the active network, if any, so
-// that we can dynamically display the correct icon for
-// that network's signal strength.
-// TODO(ers) Ideally, on this page we'd monitor all networks for
-// signal strength changes, not just the active network.
-void InternetOptionsHandler::MonitorActiveNetwork(
-    chromeos::NetworkLibrary* cros) {
-  const chromeos::Network* network = cros->active_network();
-  if (active_network_.empty() || network == NULL ||
-      active_network_ != network->service_path()) {
-    if (!active_network_.empty()) {
-      cros->RemoveNetworkObserver(active_network_, this);
-    }
-    if (network != NULL) {
-      cros->AddNetworkObserver(network->service_path(), this);
-    }
-  }
-  if (network != NULL)
-    active_network_ = network->service_path();
-  else
-    active_network_ = "";
-}
-
-void InternetOptionsHandler::OnCellularDataPlanChanged(
+void InternetOptionsHandler::CellularDataPlanChanged(
     chromeos::NetworkLibrary* obj) {
   if (!dom_ui_)
     return;
@@ -994,7 +950,7 @@ ListValue* InternetOptionsHandler::GetWirelessList() {
       cellular_networks.begin(); it != cellular_networks.end(); ++it) {
     SkBitmap icon = chromeos::NetworkMenu::IconForNetworkStrength(
         (*it)->strength(), true);
-    SkBitmap badge = chromeos::NetworkMenu::BadgeForNetworkTechnology(*it);
+    SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_3G);
     icon = chromeos::NetworkMenu::IconForDisplay(icon, badge);
     list->Append(GetNetwork(
         (*it)->service_path(),
diff --git a/chrome/browser/chromeos/dom_ui/internet_options_handler.h b/chrome/browser/chromeos/dom_ui/internet_options_handler.h
index fcecd82989cd0cd8c3a705deef680b66b833fd00..99dd522481587de2ce770fbd42bbe3a53d2e04f5 100644
--- a/chrome/browser/chromeos/dom_ui/internet_options_handler.h
+++ b/chrome/browser/chromeos/dom_ui/internet_options_handler.h
@@ -16,12 +16,8 @@ class WindowDelegate;
 }
 
 // ChromeOS internet options page UI handler.
-class InternetOptionsHandler
-  : public OptionsPageUIHandler,
-    public chromeos::NetworkLibrary::NetworkManagerObserver,
-    public chromeos::NetworkLibrary::NetworkObserver,
-    public chromeos::NetworkLibrary::CellularDataPlanObserver {
-
+class InternetOptionsHandler : public OptionsPageUIHandler,
+                               public chromeos::NetworkLibrary::Observer {
  public:
   InternetOptionsHandler();
   virtual ~InternetOptionsHandler();
@@ -32,13 +28,9 @@ class InternetOptionsHandler
   // DOMMessageHandler implementation.
   virtual void RegisterMessages();
 
-  // NetworkLibrary::NetworkManagerObserver implementation.
-  virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* network_lib);
-  // NetworkLibrary::NetworkObserver implementation.
-  virtual void OnNetworkChanged(chromeos::NetworkLibrary* network_lib,
-                                const chromeos::Network* network);
-  // NetworkLibrary::CellularDataPlanObserver implementation.
-  virtual void OnCellularDataPlanChanged(chromeos::NetworkLibrary* network_lib);
+  // NetworkLibrary::Observer implementation.
+  virtual void NetworkChanged(chromeos::NetworkLibrary* obj);
+  virtual void CellularDataPlanChanged(chromeos::NetworkLibrary* obj);
 
  private:
   // Passes data needed to show details overlay for network.
@@ -89,13 +81,6 @@ class InternetOptionsHandler
   ListValue* GetWirelessList();
   // Creates the map of remembered networks
   ListValue* GetRememberedList();
-  // Refresh the display of network information
-  void RefreshNetworkData(chromeos::NetworkLibrary* cros);
-  // Monitor the active network, if any
-  void MonitorActiveNetwork(chromeos::NetworkLibrary* cros);
-
-  // If any network is currently active, this is its service path
-  std::string active_network_;
 
   DISALLOW_COPY_AND_ASSIGN(InternetOptionsHandler);
 };
diff --git a/chrome/browser/chromeos/dom_ui/mobile_setup_ui.cc b/chrome/browser/chromeos/dom_ui/mobile_setup_ui.cc
index 048f053c00156ceda0183b0dd700a54577232ef2..0e2d7347b4adf9ad0d5d1d17bab62380fc4eae62 100644
--- a/chrome/browser/chromeos/dom_ui/mobile_setup_ui.cc
+++ b/chrome/browser/chromeos/dom_ui/mobile_setup_ui.cc
@@ -124,12 +124,10 @@ class MobileSetupUIHTMLSource : public ChromeURLDataManager::DataSource {
 };
 
 // The handler for Javascript messages related to the "register" view.
-class MobileSetupHandler
-    : public DOMMessageHandler,
-      public chromeos::NetworkLibrary::NetworkManagerObserver,
-      public chromeos::NetworkLibrary::NetworkObserver,
-      public base::SupportsWeakPtr<MobileSetupHandler> {
-
+class MobileSetupHandler : public DOMMessageHandler,
+                           public chromeos::NetworkLibrary::Observer,
+                           public chromeos::NetworkLibrary::PropertyObserver,
+                           public base::SupportsWeakPtr<MobileSetupHandler> {
  public:
   explicit MobileSetupHandler(const std::string& service_path);
   virtual ~MobileSetupHandler();
@@ -141,11 +139,12 @@ class MobileSetupHandler
   virtual DOMMessageHandler* Attach(DOMUI* dom_ui);
   virtual void RegisterMessages();
 
-  // NetworkLibrary::NetworkManagerObserver implementation.
-  virtual void OnNetworkManagerChanged(chromeos::NetworkLibrary* obj);
-  // NetworkLibrary::NetworkObserver implementation.
-  virtual void OnNetworkChanged(chromeos::NetworkLibrary* obj,
-                                const chromeos::Network* network);
+  // NetworkLibrary::Observer implementation.
+  virtual void NetworkChanged(chromeos::NetworkLibrary* obj);
+  // NetworkLibrary::PropertyObserver implementation.
+  virtual void PropertyChanged(const char* service_path,
+                               const char* key,
+                               const Value* value);
 
  private:
   typedef enum PlanActivationState {
@@ -329,8 +328,8 @@ MobileSetupHandler::MobileSetupHandler(const std::string& service_path)
 MobileSetupHandler::~MobileSetupHandler() {
   chromeos::NetworkLibrary* lib =
       chromeos::CrosLibrary::Get()->GetNetworkLibrary();
-  lib->RemoveNetworkManagerObserver(this);
-  lib->RemoveObserverForAllNetworks(this);
+  lib->RemoveObserver(this);
+  lib->RemoveProperyObserver(this);
   ReEnableOtherConnections();
 }
 
@@ -353,25 +352,34 @@ void MobileSetupHandler::RegisterMessages() {
       NewCallback(this, &MobileSetupHandler::HandleSetTransactionStatus));
 }
 
-void MobileSetupHandler::OnNetworkManagerChanged(
-    chromeos::NetworkLibrary* cros) {
+void MobileSetupHandler::NetworkChanged(chromeos::NetworkLibrary* lib) {
   if (state_ == PLAN_ACTIVATION_PAGE_LOADING)
     return;
-  // Note that even though we get here when the service has
-  // reappeared after disappearing earlier in the activation
-  // process, there's no need to re-establish the NetworkObserver,
-  // because the service path remains the same.
   EvaluateCellularNetwork(GetCellularNetwork(service_path_));
 }
 
-void MobileSetupHandler::OnNetworkChanged(chromeos::NetworkLibrary* cros,
-                                          const chromeos::Network* network) {
+void MobileSetupHandler::PropertyChanged(const char* service_path,
+                                         const char* key,
+                                         const Value* value) {
+
   if (state_ == PLAN_ACTIVATION_PAGE_LOADING)
     return;
-  DCHECK(network && network->type() == chromeos::TYPE_CELLULAR);
-  EvaluateCellularNetwork(
-      static_cast<chromeos::CellularNetwork*>(
-          const_cast<chromeos::Network*>(network)));
+  chromeos::CellularNetwork* network = GetCellularNetwork(service_path_);
+  if (!network) {
+    EvaluateCellularNetwork(NULL);
+    return;
+  }
+  if (network->service_path() != service_path) {
+    NOTREACHED();
+    return;
+  }
+  std::string value_string;
+  LOG(INFO) << "Cellular property change: " << key << " = " <<
+      value_string.c_str();
+
+  // TODO(zelidrag, ers): Remove this once we flip the notification machanism.
+  chromeos::CrosLibrary::Get()->GetNetworkLibrary()->UpdateSystemInfo();
+  EvaluateCellularNetwork(network);
 }
 
 void MobileSetupHandler::HandleCloseTab(const ListValue* args) {
@@ -389,12 +397,14 @@ void MobileSetupHandler::HandleStartActivation(const ListValue* args) {
     ChangeState(NULL, PLAN_ACTIVATION_ERROR, std::string());
     return;
   }
-  // Start monitoring network property changes.
-  chromeos::NetworkLibrary* lib =
-      chromeos::CrosLibrary::Get()->GetNetworkLibrary();
-  lib->AddNetworkManagerObserver(this);
-  lib->RemoveObserverForAllNetworks(this);
-  lib->AddNetworkObserver(network->service_path(), this);
+  chromeos::NetworkLibrary* lib = chromeos::CrosLibrary::Get()->
+      GetNetworkLibrary();
+  lib->RemoveObserver(this);
+  lib->RemoveProperyObserver(this);
+  // Start monitoring network and service property changes.
+  lib->AddObserver(this);
+  lib->AddProperyObserver(network->service_path().c_str(),
+                          this);
   ChangeState(network, PLAN_ACTIVATION_START, std::string());
   EvaluateCellularNetwork(network);
 }
@@ -571,8 +581,8 @@ void MobileSetupHandler::CompleteActivation(
     network->set_auto_connect(true);
     lib->SaveCellularNetwork(network);
   }
-  lib->RemoveNetworkManagerObserver(this);
-  lib->RemoveObserverForAllNetworks(this);
+  lib->RemoveObserver(this);
+  lib->RemoveProperyObserver(this);
   // Reactivate other types of connections if we have
   // shut them down previously.
   ReEnableOtherConnections();
diff --git a/chrome/browser/chromeos/login/login_utils.cc b/chrome/browser/chromeos/login/login_utils.cc
index 724ef85e1cf1f3900f4f090cb07ee7e6e588c464..81366459a7e80c43cbb754fb54923f3e8c62414c 100644
--- a/chrome/browser/chromeos/login/login_utils.cc
+++ b/chrome/browser/chromeos/login/login_utils.cc
@@ -296,20 +296,20 @@ bool LoginUtilsImpl::IsBrowserLaunchEnabled() const {
 // We use a special class for this so that it can be safely leaked if we
 // never connect. At shutdown the order is not well defined, and it's possible
 // for the infrastructure needed to unregister might be unstable and crash.
-class WarmingObserver : public NetworkLibrary::NetworkManagerObserver {
+class WarmingObserver : public NetworkLibrary::Observer {
  public:
   WarmingObserver() {
-    NetworkLibrary *netlib = CrosLibrary::Get()->GetNetworkLibrary();
-    netlib->AddNetworkManagerObserver(this);
+    NetworkLibrary *network = CrosLibrary::Get()->GetNetworkLibrary();
+    network->AddObserver(this);
   }
 
   // If we're now connected, prewarm the auth url.
-  void OnNetworkManagerChanged(NetworkLibrary* netlib) {
-    if (netlib->Connected()) {
+  void NetworkChanged(NetworkLibrary* network) {
+    if (network->Connected()) {
       chrome_browser_net::Preconnect::PreconnectOnUIThread(
           GURL(GaiaAuthenticator2::kClientLoginUrl),
           chrome_browser_net::UrlInfo::EARLY_LOAD_MOTIVATED);
-      netlib->RemoveNetworkManagerObserver(this);
+      network->RemoveObserver(this);
       delete this;
     }
   }
diff --git a/chrome/browser/chromeos/login/network_screen.cc b/chrome/browser/chromeos/login/network_screen.cc
index d760447536b4a1f3aec6fa6018723fd029dee90b..76ed69d98b3e52715fa4bfe20d9ec5ff4435f446 100644
--- a/chrome/browser/chromeos/login/network_screen.cc
+++ b/chrome/browser/chromeos/login/network_screen.cc
@@ -77,9 +77,9 @@ void NetworkScreen::ButtonPressed(views::Button* sender,
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// NetworkLibrary::NetworkManagerObserver implementation:
+// NetworkLibrary::Observer implementation:
 
-void NetworkScreen::OnNetworkManagerChanged(NetworkLibrary* network_lib) {
+void NetworkScreen::NetworkChanged(NetworkLibrary* network_lib) {
   UpdateStatus(network_lib);
 }
 
@@ -110,7 +110,7 @@ void NetworkScreen::OnHelpLinkActivated() {
 void NetworkScreen::Refresh() {
   if (CrosLibrary::Get()->EnsureLoaded()) {
     SubscribeNetworkNotification();
-    OnNetworkManagerChanged(chromeos::CrosLibrary::Get()->GetNetworkLibrary());
+    NetworkChanged(chromeos::CrosLibrary::Get()->GetNetworkLibrary());
   }
 }
 
@@ -120,16 +120,14 @@ void NetworkScreen::Refresh() {
 void NetworkScreen::SubscribeNetworkNotification() {
   if (!is_network_subscribed_) {
     is_network_subscribed_ = true;
-    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
-        ->AddNetworkManagerObserver(this);
+    chromeos::CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(this);
   }
 }
 
 void NetworkScreen::UnsubscribeNetworkNotification() {
   if (is_network_subscribed_) {
     is_network_subscribed_ = false;
-    chromeos::CrosLibrary::Get()->GetNetworkLibrary()
-        ->RemoveNetworkManagerObserver(this);
+    chromeos::CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this);
   }
 }
 
diff --git a/chrome/browser/chromeos/login/network_screen.h b/chrome/browser/chromeos/login/network_screen.h
index b3aa53107571fac27790a34338c566213841befc..284ebb063e0d24faf4a3f35de9835f796ae703b0 100644
--- a/chrome/browser/chromeos/login/network_screen.h
+++ b/chrome/browser/chromeos/login/network_screen.h
@@ -47,8 +47,8 @@ class NetworkScreen : public ViewScreen<NetworkSelectionView>,
   // views::ButtonListener implementation:
   virtual void ButtonPressed(views::Button* sender, const views::Event& event);
 
-  // NetworkLibrary::NetworkManagerObserver implementation:
-  virtual void OnNetworkManagerChanged(NetworkLibrary* network_lib);
+  // NetworkLibrary::Observer implementation:
+  virtual void NetworkChanged(NetworkLibrary* network_lib);
 
  protected:
   // Subscribes NetworkScreen to the network change notification,
diff --git a/chrome/browser/chromeos/login/network_screen_browsertest.cc b/chrome/browser/chromeos/login/network_screen_browsertest.cc
index 39f3f81b4a60dfdb10b20e9e904818705ecfa711..ee9ce2120effb325969f3ba196c8161de3099403 100644
--- a/chrome/browser/chromeos/login/network_screen_browsertest.cc
+++ b/chrome/browser/chromeos/login/network_screen_browsertest.cc
@@ -88,13 +88,10 @@ class NetworkScreenTest : public WizardInProcessBrowserTest {
     EXPECT_CALL(*mock_network_library_, Connecting())
         .Times(2)
         .WillRepeatedly(Return(false));
+    // Add an AddObserver for prewarming auth url check.
     EXPECT_CALL(*mock_network_library_, AddObserver(_))
         .Times(3);
     EXPECT_CALL(*mock_network_library_, RemoveObserver(_))
-    // Add an Observer for prewarming auth url check.
-    EXPECT_CALL(*mock_network_library_, AddNetworkManagerObserver(_))
-        .Times(3);
-    EXPECT_CALL(*mock_network_library_, RemoveNetworkManagerObserver(_))
         .Times(2);
 
     cros_mock_->SetStatusAreaMocksExpectations();
@@ -150,7 +147,7 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Ethernet) {
   EXPECT_CALL(*mock_network_library_, ethernet_connecting())
       .WillOnce((Return(true)));
 
-  network_screen->OnNetworkManagerChanged(mock_network_library_);
+  network_screen->NetworkChanged(mock_network_library_);
   EXPECT_FALSE(network_view->IsContinueEnabled());
   EXPECT_FALSE(network_view->IsConnecting());
 
@@ -159,7 +156,7 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Ethernet) {
   EXPECT_CALL(*mock_network_library_, Connected())
       .WillOnce(Return(true));
 
-  network_screen->OnNetworkManagerChanged(mock_network_library_);
+  network_screen->NetworkChanged(mock_network_library_);
   EXPECT_TRUE(network_view->IsContinueEnabled());
 
   EmulateContinueButtonExit(network_screen);
@@ -189,7 +186,7 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Wifi) {
   EXPECT_CALL(*mock_network_library_, wifi_network())
       .WillOnce(Return(wifi.get()));
 
-  network_screen->OnNetworkManagerChanged(mock_network_library_);
+  network_screen->NetworkChanged(mock_network_library_);
   EXPECT_FALSE(network_view->IsContinueEnabled());
   EXPECT_FALSE(network_view->IsConnecting());
 
@@ -198,7 +195,7 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Wifi) {
   EXPECT_CALL(*mock_network_library_, Connected())
       .WillOnce(Return(true));
 
-  network_screen->OnNetworkManagerChanged(mock_network_library_);
+  network_screen->NetworkChanged(mock_network_library_);
   EXPECT_TRUE(network_view->IsContinueEnabled());
 
   EmulateContinueButtonExit(network_screen);
@@ -230,7 +227,7 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Cellular) {
   EXPECT_CALL(*mock_network_library_, cellular_network())
       .WillOnce(Return(cellular.get()));
 
-  network_screen->OnNetworkManagerChanged(mock_network_library_);
+  network_screen->NetworkChanged(mock_network_library_);
   EXPECT_FALSE(network_view->IsContinueEnabled());
   EXPECT_FALSE(network_view->IsConnecting());
 
@@ -239,7 +236,7 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Cellular) {
   EXPECT_CALL(*mock_network_library_, Connected())
       .WillOnce(Return(true));
 
-  network_screen->OnNetworkManagerChanged(mock_network_library_);
+  network_screen->NetworkChanged(mock_network_library_);
   EXPECT_TRUE(network_view->IsContinueEnabled());
 
   EmulateContinueButtonExit(network_screen);
@@ -271,7 +268,7 @@ IN_PROC_BROWSER_TEST_F(NetworkScreenTest, Timeout) {
   EXPECT_CALL(*mock_network_library_, Connected())
       .WillOnce(Return(false));
 
-  network_screen->OnNetworkManagerChanged(mock_network_library_);
+  network_screen->NetworkChanged(mock_network_library_);
   EXPECT_FALSE(network_view->IsContinueEnabled());
   EXPECT_FALSE(network_view->IsConnecting());
 
diff --git a/chrome/browser/chromeos/login/network_screen_delegate.h b/chrome/browser/chromeos/login/network_screen_delegate.h
index e64e380c6285086c4807979d6d93ce4c99d35af3..3a5978a7ce69271395758d9333a3f76e07fdc089 100644
--- a/chrome/browser/chromeos/login/network_screen_delegate.h
+++ b/chrome/browser/chromeos/login/network_screen_delegate.h
@@ -22,7 +22,7 @@ class LanguageSwitchMenu;
 
 // Interface that NetworkScreen exposes to the NetworkSelectionView.
 class NetworkScreenDelegate : public views::ButtonListener,
-                              public NetworkLibrary::NetworkManagerObserver {
+                              public NetworkLibrary::Observer {
  public:
   // Cleares all error notifications.
   virtual void ClearErrors() = 0;
diff --git a/chrome/browser/chromeos/network_list.cc b/chrome/browser/chromeos/network_list.cc
index c22795b6eeb3a06ef37abc51bb95425718705156..26df2decbcca914a94986668f20551f28ca44819 100644
--- a/chrome/browser/chromeos/network_list.cc
+++ b/chrome/browser/chromeos/network_list.cc
@@ -49,8 +49,7 @@ bool NetworkList::IsNetworkConnecting(NetworkType type,
   return IsInNetworkList(connecting_networks_, type, id);
 }
 
-void NetworkList::OnNetworkManagerChanged(
-    chromeos::NetworkLibrary* network_lib) {
+void NetworkList::NetworkChanged(chromeos::NetworkLibrary* network_lib) {
   networks_.clear();
   connected_networks_.clear();
   connecting_networks_.clear();
diff --git a/chrome/browser/chromeos/network_list.h b/chrome/browser/chromeos/network_list.h
index 47c74261a2d07c651311e21d461eb2e25aca2c31..21f0e63f982740413127a020bcfd19d8e41332b1 100644
--- a/chrome/browser/chromeos/network_list.h
+++ b/chrome/browser/chromeos/network_list.h
@@ -83,7 +83,7 @@ class NetworkList  {
   NetworkList::NetworkItem* GetNetworkAt(int index);
 
   // Callback from NetworkLibrary.
-  void OnNetworkManagerChanged(chromeos::NetworkLibrary* network_lib);
+  void NetworkChanged(chromeos::NetworkLibrary* network_lib);
 
  private:
   typedef std::vector<NetworkItem> NetworkItemVector;
diff --git a/chrome/browser/chromeos/network_message_observer.cc b/chrome/browser/chromeos/network_message_observer.cc
index 32545bdf2b5f2d32bf31c34fab798ab1daf11ae7..92bc85ad4ff6b1438b6d0186c24b54ef8a82212a 100644
--- a/chrome/browser/chromeos/network_message_observer.cc
+++ b/chrome/browser/chromeos/network_message_observer.cc
@@ -35,19 +35,11 @@ NetworkMessageObserver::NetworkMessageObserver(Profile* profile)
       notification_no_data_(profile, "network_no_data.chromeos",
           IDR_NOTIFICATION_BARS_EMPTY,
           l10n_util::GetStringUTF16(IDS_NETWORK_OUT_OF_DATA_TITLE)) {
-  NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary();
-  OnNetworkManagerChanged(netlib);
-  // Note that this gets added as a NetworkManagerObserver and a
-  // CellularDataPlanObserver in browser_init.cc
-  netlib->AddNetworkManagerObserver(this);
-  netlib->AddCellularDataPlanObserver(this);
+  NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary());
   initialized_ = true;
 }
 
 NetworkMessageObserver::~NetworkMessageObserver() {
-  NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary();
-  netlib->RemoveNetworkManagerObserver(this);
-  netlib->RemoveCellularDataPlanObserver(this);
   notification_connection_error_.Hide();
   notification_low_data_.Hide();
   notification_no_data_.Hide();
@@ -73,7 +65,7 @@ void NetworkMessageObserver::MobileSetup(const ListValue* args) {
   BrowserList::GetLastActive()->OpenMobilePlanTabAndActivate();
 }
 
-void NetworkMessageObserver::OnNetworkManagerChanged(NetworkLibrary* obj) {
+void NetworkMessageObserver::NetworkChanged(NetworkLibrary* obj) {
   const WifiNetworkVector& wifi_networks = obj->wifi_networks();
   const CellularNetworkVector& cellular_networks = obj->cellular_networks();
 
@@ -158,7 +150,7 @@ void NetworkMessageObserver::OnNetworkManagerChanged(NetworkLibrary* obj) {
     CreateModalPopup(view);
 }
 
-void NetworkMessageObserver::OnCellularDataPlanChanged(NetworkLibrary* obj) {
+void NetworkMessageObserver::CellularDataPlanChanged(NetworkLibrary* obj) {
   const CellularNetwork* cellular = obj->cellular_network();
   if (!cellular)
     return;
diff --git a/chrome/browser/chromeos/network_message_observer.h b/chrome/browser/chromeos/network_message_observer.h
index db1ba1bce7d99430fe6675d19a025865eae2cd4a..cdb0a81f521e91ff102459a89302f5dcd8231ceb 100644
--- a/chrome/browser/chromeos/network_message_observer.h
+++ b/chrome/browser/chromeos/network_message_observer.h
@@ -23,8 +23,7 @@ namespace chromeos {
 // The network message observer displays a system notification for network
 // messages.
 
-class NetworkMessageObserver : public NetworkLibrary::NetworkManagerObserver,
-                               public NetworkLibrary::CellularDataPlanObserver {
+class NetworkMessageObserver : public NetworkLibrary::Observer {
  public:
   explicit NetworkMessageObserver(Profile* profile);
   virtual ~NetworkMessageObserver();
@@ -35,10 +34,9 @@ class NetworkMessageObserver : public NetworkLibrary::NetworkManagerObserver,
   virtual void CreateModalPopup(views::WindowDelegate* view);
   virtual void MobileSetup(const ListValue* args);
 
-  // NetworkLibrary::NetworkManagerObserver implementation.
-  virtual void OnNetworkManagerChanged(NetworkLibrary* obj);
-  // NetworkLibrary::CellularDataPlanObserver implementation.
-  virtual void OnCellularDataPlanChanged(NetworkLibrary* obj);
+  // NetworkLibrary::Observer implementation.
+  virtual void NetworkChanged(NetworkLibrary* obj);
+  virtual void CellularDataPlanChanged(NetworkLibrary* obj);
 
   bool initialized_;
   // Wifi networks by service path.
@@ -64,3 +62,4 @@ class NetworkMessageObserver : public NetworkLibrary::NetworkManagerObserver,
 }  // namespace chromeos
 
 #endif  // CHROME_BROWSER_CHROMEOS_NETWORK_MESSAGE_OBSERVER_H_
+
diff --git a/chrome/browser/chromeos/network_state_notifier.cc b/chrome/browser/chromeos/network_state_notifier.cc
index d0552f958c0c00b4e9810eff671a051744f645f0..aaaf7636c6dfafe44e83bf331dde3715d7d81362 100644
--- a/chrome/browser/chromeos/network_state_notifier.cc
+++ b/chrome/browser/chromeos/network_state_notifier.cc
@@ -34,17 +34,9 @@ NetworkStateNotifier::NetworkStateNotifier()
     : ALLOW_THIS_IN_INITIALIZER_LIST(task_factory_(this)),
       state_(RetrieveState()),
       offline_start_time_(Time::Now()) {
-  DCHECK(CrosLibrary::Get()->EnsureLoaded());
-  // Note that this gets added as a NetworkManagerObserver
-  // in browser_init.cc
-}
-
-NetworkStateNotifier::~NetworkStateNotifier() {
-  DCHECK(CrosLibrary::Get()->EnsureLoaded());
-  CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this);
 }
 
-void NetworkStateNotifier::OnNetworkManagerChanged(NetworkLibrary* cros) {
+void NetworkStateNotifier::NetworkChanged(NetworkLibrary* cros) {
   DCHECK(CrosLibrary::Get()->EnsureLoaded());
   BrowserThread::PostTask(
       BrowserThread::UI, FROM_HERE,
diff --git a/chrome/browser/chromeos/network_state_notifier.h b/chrome/browser/chromeos/network_state_notifier.h
index 94e57f41432a9385a5c9d8ed361977b99325d66a..9d49d9468a02d7cbaa5db0f55a84c4ce444d2433 100644
--- a/chrome/browser/chromeos/network_state_notifier.h
+++ b/chrome/browser/chromeos/network_state_notifier.h
@@ -42,10 +42,10 @@ class NetworkStateDetails {
 };
 
 // NetworkStateNotifier sends notification when network state has
-// chagned. Notification is sent in UI thread.
+// chagned. Notificatio is sent in UI thread.
 // TODO(oshima): port this to other platform. merge with
 // NetworkChangeNotifier if possible.
-class NetworkStateNotifier : public NetworkLibrary::NetworkManagerObserver {
+class NetworkStateNotifier : public NetworkLibrary::Observer {
  public:
   // Returns the singleton instance of the network state notifier;
   static NetworkStateNotifier* Get();
@@ -59,8 +59,8 @@ class NetworkStateNotifier : public NetworkLibrary::NetworkManagerObserver {
     return Get()->state_ == NetworkStateDetails::CONNECTED;
   }
 
-  // NetworkLibrary::NetworkManagerObserver implementation.
-  virtual void OnNetworkManagerChanged(NetworkLibrary* cros);
+  // NetworkLibrary::Observer implementation.
+  virtual void NetworkChanged(NetworkLibrary* cros);
 
  private:
   friend struct DefaultSingletonTraits<NetworkStateNotifier>;
@@ -69,7 +69,7 @@ class NetworkStateNotifier : public NetworkLibrary::NetworkManagerObserver {
   static NetworkStateDetails::State RetrieveState();
 
   NetworkStateNotifier();
-  virtual ~NetworkStateNotifier();
+  virtual ~NetworkStateNotifier() {}
 
   // Update the current state and sends notification to observers.
   // This should be invoked in UI thread.
diff --git a/chrome/browser/chromeos/network_state_notifier_browsertest.cc b/chrome/browser/chromeos/network_state_notifier_browsertest.cc
index 47ea0de661710f4d8f0ff5ce099d2fc172b022c4..126ff13bd388d88cccc5e0b025c2cec5adab423d 100644
--- a/chrome/browser/chromeos/network_state_notifier_browsertest.cc
+++ b/chrome/browser/chromeos/network_state_notifier_browsertest.cc
@@ -70,7 +70,7 @@ IN_PROC_BROWSER_TEST_F(NetworkStateNotifierTest, TestConnected) {
       .WillRepeatedly((Return(true)))
       .RetiresOnSaturation();
   NetworkStateNotifier* notifier = NetworkStateNotifier::Get();
-  notifier->OnNetworkManagerChanged(mock_network_library_);
+  notifier->NetworkChanged(mock_network_library_);
   WaitForNotification();
   EXPECT_EQ(chromeos::NetworkStateDetails::CONNECTED, state_);
 }
@@ -88,7 +88,7 @@ IN_PROC_BROWSER_TEST_F(NetworkStateNotifierTest, TestConnecting) {
       .WillOnce((Return(true)))
       .RetiresOnSaturation();
   NetworkStateNotifier* notifier = NetworkStateNotifier::Get();
-  notifier->OnNetworkManagerChanged(mock_network_library_);
+  notifier->NetworkChanged(mock_network_library_);
   WaitForNotification();
   EXPECT_EQ(chromeos::NetworkStateDetails::CONNECTING, state_);
 }
@@ -106,7 +106,7 @@ IN_PROC_BROWSER_TEST_F(NetworkStateNotifierTest, TestDisconnected) {
       .WillOnce((Return(false)))
       .RetiresOnSaturation();
   NetworkStateNotifier* notifier = NetworkStateNotifier::Get();
-  notifier->OnNetworkManagerChanged(mock_network_library_);
+  notifier->NetworkChanged(mock_network_library_);
   WaitForNotification();
   EXPECT_EQ(chromeos::NetworkStateDetails::DISCONNECTED, state_);
 }
diff --git a/chrome/browser/chromeos/options/internet_page_view.cc b/chrome/browser/chromeos/options/internet_page_view.cc
index 794814acc5537626039f4d9aef976cd905538ee1..a9f099fe43086debf9663d01f4a35c0ac245d0c6 100644
--- a/chrome/browser/chromeos/options/internet_page_view.cc
+++ b/chrome/browser/chromeos/options/internet_page_view.cc
@@ -301,7 +301,7 @@ class WirelessSection : public NetworkSection {
                           bool connected, int connection_type);
 
   WifiNetworkVector wifi_networks_;
-  CellularNetworkVector cellular_networks_;
+  CellularNetworkVector celluar_networks_;
 
   DISALLOW_COPY_AND_ASSIGN(WirelessSection);
 };
@@ -334,34 +334,36 @@ void WirelessSection::InitSection() {
   }
 
   // Cellular
-  cellular_networks_ = cros->cellular_networks();
-  for (size_t i = 0; i < cellular_networks_.size(); ++i) {
-    std::wstring name = ASCIIToWide(cellular_networks_[i]->name());
+  celluar_networks_ = cros->cellular_networks();
+  // Cellular networks ssids.
+  for (size_t i = 0; i < celluar_networks_.size(); ++i) {
+    std::wstring name = ASCIIToWide(celluar_networks_[i]->name());
 
     SkBitmap icon = NetworkMenu::IconForNetworkStrength(
-        cellular_networks_[i]->strength(), true);
-    SkBitmap badge =
-        NetworkMenu::BadgeForNetworkTechnology(cellular_networks_[i]);
+        celluar_networks_[i]->strength(), true);
+    // TODO(chocobo): Check cellular network 3g/edge.
+    SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_3G);
+//    SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_EDGE);
     icon = NetworkMenu::IconForDisplay(icon, badge);
 
-    bool connecting = cellular_networks_[i]->connecting();
-    bool connected = cellular_networks_[i]->connected();
+    bool connecting = celluar_networks_[i]->connecting();
+    bool connected = celluar_networks_[i]->connected();
     AddWirelessNetwork(i, icon, name, connecting, connected, TYPE_CELLULAR);
   }
 }
 
 void WirelessSection::ButtonClicked(int button, int connection_type, int id) {
   if (connection_type == TYPE_CELLULAR) {
-    if (static_cast<int>(cellular_networks_.size()) > id) {
+    if (static_cast<int>(celluar_networks_.size()) > id) {
       if (button == CONNECT_BUTTON) {
         // Connect to cellular network.
         CrosLibrary::Get()->GetNetworkLibrary()->ConnectToCellularNetwork(
-            cellular_networks_[id]);
+            celluar_networks_[id]);
       } else if (button == DISCONNECT_BUTTON) {
         CrosLibrary::Get()->GetNetworkLibrary()->DisconnectFromWirelessNetwork(
-            cellular_networks_[id]);
+            celluar_networks_[id]);
       } else {
-        CreateModalPopup(new NetworkConfigView(cellular_networks_[id]));
+        CreateModalPopup(new NetworkConfigView(celluar_networks_[id]));
       }
     }
   } else if (connection_type == TYPE_WIFI) {
@@ -426,6 +428,7 @@ class RememberedSection : public NetworkSection {
 
  private:
   WifiNetworkVector wifi_networks_;
+  CellularNetworkVector celluar_networks_;
 
   DISALLOW_COPY_AND_ASSIGN(RememberedSection);
 };
@@ -567,14 +570,14 @@ InternetPageView::InternetPageView(Profile* profile)
       scroll_view_(new views::ScrollView) {
   NetworkLibrary* cros = CrosLibrary::Get()->GetNetworkLibrary();
   cros->UpdateSystemInfo();
-  cros->AddNetworkManagerObserver(this);
+  cros->AddObserver(this);
 }
 
 InternetPageView::~InternetPageView() {
-  CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this);
+  CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this);
 }
 
-void InternetPageView::OnNetworkManagerChanged(NetworkLibrary* obj) {
+void InternetPageView::NetworkChanged(NetworkLibrary* obj) {
   // Refresh wired, wireless, and remembered networks.
   // Remember the current scroll region, and try to scroll back afterwards.
   gfx::Rect rect = scroll_view_->GetVisibleRect();
diff --git a/chrome/browser/chromeos/options/internet_page_view.h b/chrome/browser/chromeos/options/internet_page_view.h
index c5048dfb9485e602bf6365876478c7a8b49ea10f..71b7399cbd9f730cbc30c5f7f1111d2fd5ab2c18 100644
--- a/chrome/browser/chromeos/options/internet_page_view.h
+++ b/chrome/browser/chromeos/options/internet_page_view.h
@@ -19,13 +19,13 @@ class InternetPageContentView;
 
 // Internet settings page for Chrome OS
 class InternetPageView : public SettingsPageView,
-                         public NetworkLibrary::NetworkManagerObserver {
+                         public NetworkLibrary::Observer {
  public:
   explicit InternetPageView(Profile* profile);
   virtual ~InternetPageView();
 
-  // NetworkLibrary::NetworkManagerObserver implementation.
-  virtual void OnNetworkManagerChanged(NetworkLibrary* obj);
+  // NetworkLibrary::Observer implementation.
+  virtual void NetworkChanged(NetworkLibrary* obj);
 
   // views::View overrides:
   virtual void Layout();
diff --git a/chrome/browser/chromeos/status/network_dropdown_button.cc b/chrome/browser/chromeos/status/network_dropdown_button.cc
index 8deb1934c035961d1951aa32dab3073feca32074..cade4027ccc2903c0e4d15338fb4485cead6d5d4 100644
--- a/chrome/browser/chromeos/status/network_dropdown_button.cc
+++ b/chrome/browser/chromeos/status/network_dropdown_button.cc
@@ -34,12 +34,12 @@ NetworkDropdownButton::NetworkDropdownButton(bool browser_mode,
       parent_window_(parent_window) {
   animation_connecting_.SetThrobDuration(kThrobDuration);
   animation_connecting_.SetTweenType(Tween::LINEAR);
-  OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary());
-  CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this);
+  NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary());
+  CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(this);
 }
 
 NetworkDropdownButton::~NetworkDropdownButton() {
-  CrosLibrary::Get()->GetNetworkLibrary()->RemoveNetworkManagerObserver(this);
+  CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -62,13 +62,13 @@ void NetworkDropdownButton::AnimationProgressed(const Animation* animation) {
 }
 
 void NetworkDropdownButton::Refresh() {
-  OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary());
+  NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary());
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// NetworkDropdownButton, NetworkLibrary::NetworkManagerObserver implementation:
+// NetworkDropdownButton, NetworkLibrary::Observer implementation:
 
-void NetworkDropdownButton::OnNetworkManagerChanged(NetworkLibrary* cros) {
+void NetworkDropdownButton::NetworkChanged(NetworkLibrary* cros) {
   // Show network that we will actually use. It could be another network than
   // user selected. For example user selected WiFi network but we have Ethernet
   // connection and Chrome OS device will actually use Ethernet.
@@ -78,27 +78,28 @@ void NetworkDropdownButton::OnNetworkManagerChanged(NetworkLibrary* cros) {
 
   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
   if (CrosLibrary::Get()->EnsureLoaded()) {
-    // Always show the active network, if any
-    const Network* active_network = cros->active_network();
-    const WirelessNetwork* wireless;
-    if (active_network != NULL) {
+    // Always show the higher priority connection first. Ethernet then wifi.
+    if (cros->ethernet_connected()) {
       animation_connecting_.Stop();
-      if (active_network->type() == TYPE_ETHERNET) {
-        SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED));
-        SetText(l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET));
-      } else {
-        DCHECK(active_network->type() == TYPE_WIFI ||
-               active_network->type() == TYPE_CELLULAR);
-        wireless = static_cast<const WirelessNetwork*>(active_network);
-        SetIcon(IconForNetworkStrength(wireless->strength(), false));
-        SetText(ASCIIToWide(wireless->name()));
-      }
+      SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED));
+      SetText(l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET));
+    } else if (cros->wifi_connected()) {
+      animation_connecting_.Stop();
+      SetIcon(IconForNetworkStrength(
+          cros->wifi_network()->strength(), true));
+      SetText(ASCIIToWide(cros->wifi_network()->name()));
+    } else if (cros->cellular_connected()) {
+      animation_connecting_.Stop();
+      SetIcon(IconForNetworkStrength(
+          cros->cellular_network()->strength(), false));
+      SetText(ASCIIToWide(cros->cellular_network()->name()));
     } else if (cros->wifi_connecting() || cros->cellular_connecting()) {
       if (!animation_connecting_.is_animating()) {
         animation_connecting_.Reset();
         animation_connecting_.StartThrobbing(-1);
         SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS1_BLACK));
       }
+
       if (cros->wifi_connecting())
         SetText(ASCIIToWide(cros->wifi_network()->name()));
       else if (cros->cellular_connecting())
diff --git a/chrome/browser/chromeos/status/network_dropdown_button.h b/chrome/browser/chromeos/status/network_dropdown_button.h
index 2968e423323ee0eb4a122388ca96e68263e52388..47500f616d90e0cf83464246679fe1514140f7bf 100644
--- a/chrome/browser/chromeos/status/network_dropdown_button.h
+++ b/chrome/browser/chromeos/status/network_dropdown_button.h
@@ -19,7 +19,7 @@ namespace chromeos {
 // See NetworkMenu for more details.
 class NetworkDropdownButton : public views::MenuButton,
                               public NetworkMenu,
-                              public NetworkLibrary::NetworkManagerObserver {
+                              public NetworkLibrary::Observer {
  public:
   NetworkDropdownButton(bool browser_mode, gfx::NativeWindow parent_window);
   virtual ~NetworkDropdownButton();
@@ -27,8 +27,8 @@ class NetworkDropdownButton : public views::MenuButton,
   // AnimationDelegate implementation.
   virtual void AnimationProgressed(const Animation* animation);
 
-  // NetworkLibrary::NetworkManagerObserver implementation.
-  virtual void OnNetworkManagerChanged(NetworkLibrary* obj);
+  // NetworkLibrary::Observer implementation.
+  virtual void NetworkChanged(NetworkLibrary* obj);
 
   // Refreshes button state. Used when language has been changed.
   void Refresh();
diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc
index 159b09c0dfab8bd10227f92c7d0c5762e2c7ef6c..428865b018c401de5137b2353d5d8158c3452876 100644
--- a/chrome/browser/chromeos/status/network_menu.cc
+++ b/chrome/browser/chromeos/status/network_menu.cc
@@ -388,47 +388,6 @@ SkBitmap NetworkMenu::IconForNetworkStrength(const CellularNetwork* cellular) {
   return *ResourceBundle::GetSharedInstance().GetBitmapNamed(images[index]);
 }
 
-// static
-// TODO(ers) update for GSM when we have the necessary images
-SkBitmap NetworkMenu::BadgeForNetworkTechnology(
-    const CellularNetwork* cellular) {
-
-    int id;
-    if (cellular->network_technology() == NETWORK_TECHNOLOGY_EVDO) {
-      switch (cellular->data_left()) {
-        case CellularNetwork::DATA_NONE:
-        case CellularNetwork::DATA_VERY_LOW:
-          id = IDR_STATUSBAR_NETWORK_3G_ERROR;
-          break;
-        case CellularNetwork::DATA_LOW:
-          id = IDR_STATUSBAR_NETWORK_3G_WARN;
-          break;
-        case CellularNetwork::DATA_NORMAL:
-          id = IDR_STATUSBAR_NETWORK_3G;
-          break;
-      }
-    } else if (cellular->network_technology() == NETWORK_TECHNOLOGY_1XRTT) {
-      switch (cellular->data_left()) {
-        case CellularNetwork::DATA_NONE:
-        case CellularNetwork::DATA_VERY_LOW:
-          id = IDR_STATUSBAR_NETWORK_1X_ERROR;
-          break;
-        case CellularNetwork::DATA_LOW:
-          id = IDR_STATUSBAR_NETWORK_1X_WARN;
-          break;
-        case CellularNetwork::DATA_NORMAL:
-          id = IDR_STATUSBAR_NETWORK_1X;
-          break;
-      }
-    } else {
-      id = -1;
-    }
-    if (id == -1)
-      return SkBitmap();
-    else
-      return *ResourceBundle::GetSharedInstance().GetBitmapNamed(id);
-}
-
 // static
 SkBitmap NetworkMenu::IconForDisplay(SkBitmap icon, SkBitmap badge) {
   // Draw badge at (14,14).
@@ -570,7 +529,9 @@ void NetworkMenu::InitMenuItems() {
       }
       SkBitmap icon = IconForNetworkStrength(cell_networks[i]->strength(),
                                              true);
-      SkBitmap badge = BadgeForNetworkTechnology(cell_networks[i]);
+      // TODO(chocobo): Check cellular network 3g/edge.
+      SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_3G);
+      // SkBitmap badge = *rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_EDGE);
       int flag = FLAG_CELLULAR;
       if (active_cellular &&
           cell_networks[i]->service_path() ==
diff --git a/chrome/browser/chromeos/status/network_menu.h b/chrome/browser/chromeos/status/network_menu.h
index a68e9284151a18386fc519cb98310a1ef67a3330..8f57c619381d53917bb67fa7be204a514d9791ca 100644
--- a/chrome/browser/chromeos/status/network_menu.h
+++ b/chrome/browser/chromeos/status/network_menu.h
@@ -115,12 +115,11 @@ class NetworkMenu : public views::ViewMenuDelegate,
   // |black| is used to specify whether to return a black icon for display
   // on a light background or a white icon for display on a dark background.
   static SkBitmap IconForNetworkStrength(int strength, bool black);
+
   // Returns the Icon for a network strength for CellularNetwork |cellular|.
   // This returns different colored bars depending on cellular data left.
   static SkBitmap IconForNetworkStrength(const CellularNetwork* cellular);
-  // Returns the Badge for a given network technology.
-  // This returns different colored symbols depending on cellular data left.
-  static SkBitmap BadgeForNetworkTechnology(const CellularNetwork* cellular);
+
   // This method will convert the |icon| bitmap to the correct size for display.
   // If the |badge| icon is not empty, it will draw that on top of the icon.
   static SkBitmap IconForDisplay(SkBitmap icon, SkBitmap badge);
diff --git a/chrome/browser/chromeos/status/network_menu_button.cc b/chrome/browser/chromeos/status/network_menu_button.cc
index b8cbe00d49deda63317cbfeb4871438b6ea8175c..48b51874cb2b9ce8c738bc67ea7ee231edeeb5ab 100644
--- a/chrome/browser/chromeos/status/network_menu_button.cc
+++ b/chrome/browser/chromeos/status/network_menu_button.cc
@@ -35,16 +35,12 @@ NetworkMenuButton::NetworkMenuButton(StatusAreaHost* host)
       ALLOW_THIS_IN_INITIALIZER_LIST(animation_connecting_(this)) {
   animation_connecting_.SetThrobDuration(kThrobDuration);
   animation_connecting_.SetTweenType(Tween::EASE_IN_OUT);
-  OnNetworkManagerChanged(CrosLibrary::Get()->GetNetworkLibrary());
-  CrosLibrary::Get()->GetNetworkLibrary()->AddNetworkManagerObserver(this);
-  CrosLibrary::Get()->GetNetworkLibrary()->AddCellularDataPlanObserver(this);
+  NetworkChanged(CrosLibrary::Get()->GetNetworkLibrary());
+  CrosLibrary::Get()->GetNetworkLibrary()->AddObserver(this);
 }
 
 NetworkMenuButton::~NetworkMenuButton() {
-  NetworkLibrary* netlib = CrosLibrary::Get()->GetNetworkLibrary();
-  netlib->RemoveNetworkManagerObserver(this);
-  netlib->RemoveObserverForAllNetworks(this);
-  netlib->RemoveCellularDataPlanObserver(this);
+  CrosLibrary::Get()->GetNetworkLibrary()->RemoveObserver(this);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -77,27 +73,11 @@ void NetworkMenuButton::DrawIcon(gfx::Canvas* canvas) {
 }
 
 ////////////////////////////////////////////////////////////////////////////////
-// NetworkMenuButton, NetworkLibrary::NetworkManagerObserver implementation:
+// NetworkMenuButton, NetworkLibrary::Observer implementation:
 
-void NetworkMenuButton::OnNetworkManagerChanged(NetworkLibrary* cros) {
+void NetworkMenuButton::NetworkChanged(NetworkLibrary* cros) {
   ResourceBundle& rb = ResourceBundle::GetSharedInstance();
   if (CrosLibrary::Get()->EnsureLoaded()) {
-    // Add an observer for the active network, if any
-    const Network* network = cros->active_network();
-    if (active_network_.empty() || network == NULL ||
-        active_network_ != network->service_path()) {
-      if (!active_network_.empty()) {
-        cros->RemoveNetworkObserver(active_network_, this);
-      }
-      if (network != NULL) {
-        cros->AddNetworkObserver(network->service_path(), this);
-      }
-    }
-    if (network)
-      active_network_ = network->service_path();
-    else
-      active_network_ = "";
-
     if (cros->wifi_connecting() || cros->cellular_connecting()) {
       // Start the connecting animation if not running.
       if (!animation_connecting_.is_animating()) {
@@ -118,35 +98,68 @@ void NetworkMenuButton::OnNetworkManagerChanged(NetworkLibrary* cros) {
     } else {
       // Stop connecting animation since we are not connecting.
       animation_connecting_.Stop();
-      if (!cros->Connected()) {
+
+      // Always show the higher priority connection first. Ethernet then wifi.
+      if (cros->ethernet_connected()) {
+        SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED));
+        SetTooltipText(
+            l10n_util::GetStringF(
+                IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP,
+                l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)));
+      } else if (cros->wifi_connected()) {
+        SetIcon(IconForNetworkStrength(
+            cros->wifi_network()->strength(), false));
+        SetTooltipText(l10n_util::GetStringF(
+            IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP,
+            UTF8ToWide(cros->wifi_network()->name())));
+      } else if (cros->cellular_connected()) {
+        const CellularNetwork* cellular = cros->cellular_network();
+        if (cellular->data_left() == CellularNetwork::DATA_NONE) {
+          // If no data, then we show 0 bars.
+          SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0));
+        } else {
+          SetIcon(IconForNetworkStrength(cellular));
+        }
+        SetTooltipText(l10n_util::GetStringF(
+            IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP,
+            UTF8ToWide(cellular->name())));
+      } else {
         SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0));
         SetTooltipText(l10n_util::GetString(
             IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP));
-      } else {
-        SetNetworkIcon(network);
       }
     }
-    SetNetworkBadge(cros, network);
-  } else {
-    SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0));
-    SetBadge(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_WARNING));
-    SetTooltipText(l10n_util::GetString(
-        IDS_STATUSBAR_NETWORK_NO_NETWORK_TOOLTIP));
-  }
-
-  SchedulePaint();
-  UpdateMenu();
-}
 
-////////////////////////////////////////////////////////////////////////////////
-// NetworkMenuButton, NetworkLibrary::NetworkObserver implementation:
-void NetworkMenuButton::OnNetworkChanged(NetworkLibrary* cros,
-                                         const Network* network) {
-  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
-  if (CrosLibrary::Get()->EnsureLoaded()) {
-    // Always show the active network connection, if any.
-    SetNetworkIcon(network);
-    SetNetworkBadge(cros, network);
+    // Figure out whether or not to show a badge.
+    int id = -1;
+    if (cros->Connecting()) {
+      if (cros->cellular_connecting()) {
+        id = IDR_STATUSBAR_NETWORK_3G;
+      }
+    } else if (cros->Connected()) {
+      if (!cros->ethernet_connected() && !cros->wifi_connected() &&
+          cros->cellular_connected()) {
+        switch (cros->cellular_network()->data_left()) {
+          case CellularNetwork::DATA_NONE:
+          case CellularNetwork::DATA_VERY_LOW:
+            id = IDR_STATUSBAR_NETWORK_3G_ERROR;
+            break;
+          case CellularNetwork::DATA_LOW:
+            id = IDR_STATUSBAR_NETWORK_3G_WARN;
+            break;
+          case CellularNetwork::DATA_NORMAL:
+            id = IDR_STATUSBAR_NETWORK_3G;
+            break;
+        }
+      }
+    } else {
+      id = IDR_STATUSBAR_NETWORK_DISCONNECTED;
+    }
+    if (id != -1) {
+      SetBadge(*rb.GetBitmapNamed(id));
+    } else {
+      SetBadge(SkBitmap());
+    }
   } else {
     SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0));
     SetBadge(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_WARNING));
@@ -158,9 +171,9 @@ void NetworkMenuButton::OnNetworkChanged(NetworkLibrary* cros,
   UpdateMenu();
 }
 
-void NetworkMenuButton::OnCellularDataPlanChanged(NetworkLibrary* cros) {
-  // Call OnNetworkManagerChanged which will update the icon.
-  OnNetworkManagerChanged(cros);
+void NetworkMenuButton::CellularDataPlanChanged(NetworkLibrary* cros) {
+  // Call NetworkChanged which will update the icon.
+  NetworkChanged(cros);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -182,54 +195,4 @@ bool NetworkMenuButton::ShouldOpenButtonOptions() const {
   return host_->ShouldOpenButtonOptions(this);
 }
 
-////////////////////////////////////////////////////////////////////////////////
-// NetworkMenuButton, private methods
-
-void NetworkMenuButton::SetNetworkIcon(const Network* network) {
-  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
-  if (network && network->is_active()) {
-    if (network->type() == TYPE_ETHERNET) {
-      SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_WIRED));
-      SetTooltipText(
-          l10n_util::GetStringF(
-              IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP,
-              l10n_util::GetString(IDS_STATUSBAR_NETWORK_DEVICE_ETHERNET)));
-    } else if (network->type() == TYPE_WIFI) {
-      const WifiNetwork* wifi = static_cast<const WifiNetwork*>(network);
-      SetIcon(IconForNetworkStrength(wifi->strength(), false));
-      SetTooltipText(l10n_util::GetStringF(
-          IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP,
-          UTF8ToWide(wifi->name())));
-    } else if (network->type() == TYPE_CELLULAR) {
-      const CellularNetwork* cellular =
-          static_cast<const CellularNetwork*>(network);
-      if (cellular->data_left() == CellularNetwork::DATA_NONE) {
-        // If no data, then we show 0 bars.
-        SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0));
-      } else {
-        SetIcon(IconForNetworkStrength(cellular));
-      }
-      SetTooltipText(l10n_util::GetStringF(
-          IDS_STATUSBAR_NETWORK_CONNECTED_TOOLTIP,
-          UTF8ToWide(cellular->name())));
-    }
-  }
-}
-
-void NetworkMenuButton::SetNetworkBadge(NetworkLibrary* cros,
-                                        const Network* network) {
-  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
-  // Figure out whether or not to show a badge.
-  if (network && network->type() == TYPE_CELLULAR &&
-      (network->is_active() || network->connecting())) {
-    const CellularNetwork* cellular
-        = static_cast<const CellularNetwork*>(network);
-    SetBadge(BadgeForNetworkTechnology(cellular));
-  } else if (!cros->Connected() && !cros->Connecting()) {
-    SetBadge(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_DISCONNECTED));
-  } else {
-    SetBadge(SkBitmap());
-  }
-}
-
 }  // namespace chromeos
diff --git a/chrome/browser/chromeos/status/network_menu_button.h b/chrome/browser/chromeos/status/network_menu_button.h
index c2b2e71e3034393fd2931023b287ff31437f1bf1..f8b27dbe7e20233ef98b1205b65e23c282201a58 100644
--- a/chrome/browser/chromeos/status/network_menu_button.h
+++ b/chrome/browser/chromeos/status/network_menu_button.h
@@ -46,9 +46,7 @@ class StatusAreaHost;
 // The label will be BOLD if the network is currently connected.
 class NetworkMenuButton : public StatusAreaButton,
                           public NetworkMenu,
-                          public NetworkLibrary::NetworkManagerObserver,
-                          public NetworkLibrary::NetworkObserver,
-                          public NetworkLibrary::CellularDataPlanObserver {
+                          public NetworkLibrary::Observer {
  public:
   explicit NetworkMenuButton(StatusAreaHost* host);
   virtual ~NetworkMenuButton();
@@ -56,12 +54,9 @@ class NetworkMenuButton : public StatusAreaButton,
   // AnimationDelegate implementation.
   virtual void AnimationProgressed(const Animation* animation);
 
-  // NetworkLibrary::NetworkManagerObserver implementation.
-  virtual void OnNetworkManagerChanged(NetworkLibrary* cros);
-  // NetworkLibrary::NetworkObserver implementation.
-  virtual void OnNetworkChanged(NetworkLibrary* cros, const Network* network);
-  // NetworkLibrary::CellularDataPlanObserver implementation.
-  virtual void OnCellularDataPlanChanged(NetworkLibrary* cros);
+  // NetworkLibrary::Observer implementation.
+  virtual void NetworkChanged(NetworkLibrary* obj);
+  virtual void CellularDataPlanChanged(NetworkLibrary* obj);
 
   // Sets the badge icon.
   void SetBadge(const SkBitmap& badge) { badge_ = badge; }
@@ -78,9 +73,6 @@ class NetworkMenuButton : public StatusAreaButton,
   virtual bool ShouldOpenButtonOptions() const;
 
  private:
-  void SetNetworkIcon(const Network* network);
-  void SetNetworkBadge(NetworkLibrary* cros, const Network* network);
-
   // The status area host,
   StatusAreaHost* host_;
 
@@ -93,10 +85,6 @@ class NetworkMenuButton : public StatusAreaButton,
   // The duration of the icon throbbing in milliseconds.
   static const int kThrobDuration;
 
-  // If any network is currently active, this is the service path of the one
-  // whose status is displayed in the network menu button.
-  std::string active_network_;
-
   DISALLOW_COPY_AND_ASSIGN(NetworkMenuButton);
 };