shill: Consolidate Cellular DBus properties in the Cellular class.

BUG=chromium:321854
TEST=(1) Run platform2 unittests.
     (2) Run network_3g, network_ui, network3g_pseudomodem suite on 3G, LTE, and
         CDMA modems.

Change-Id: I5717c5de8597f8bfac15b3947f455c6e44344929
Reviewed-on: https://chromium-review.googlesource.com/177700
Reviewed-by: Ben Chan <benchan@chromium.org>
Tested-by: Prathmesh Prabhu <pprabhu@chromium.org>
Commit-Queue: Ben Chan <benchan@chromium.org>
diff --git a/adaptor_interfaces.h b/adaptor_interfaces.h
index 55cb701..2f2df0a 100644
--- a/adaptor_interfaces.h
+++ b/adaptor_interfaces.h
@@ -34,6 +34,8 @@
   virtual void EmitIntChanged(const std::string &name, int value) = 0;
   virtual void EmitStringChanged(const std::string &name,
                                  const std::string &value) = 0;
+  virtual void EmitStringmapChanged(const std::string &name,
+                                    const Stringmap &value) = 0;
   virtual void EmitStringmapsChanged(const std::string &name,
                                      const Stringmaps &value) = 0;
   virtual void EmitKeyValueStoreChanged(const std::string &name,
diff --git a/cellular.cc b/cellular.cc
index 403369b..24d4805 100644
--- a/cellular.cc
+++ b/cellular.cc
@@ -116,25 +116,17 @@
       dbus_owner_(owner),
       dbus_service_(service),
       dbus_path_(path),
+      scanning_supported_(false),
+      provider_requires_roaming_(false),
+      scan_interval_(0),
+      sim_present_(false),
       modem_info_(modem_info),
       proxy_factory_(proxy_factory),
       ppp_device_factory_(PPPDeviceFactory::GetInstance()),
       allow_roaming_(false),
       explicit_disconnect_(false),
       is_ppp_authenticating_(false) {
-  PropertyStore *store = this->mutable_store();
-  // TODO(jglasgow): kDBusConnectionProperty is deprecated.
-  store->RegisterConstString(kDBusConnectionProperty, &dbus_owner_);
-  store->RegisterConstString(kDBusServiceProperty, &dbus_service_);
-  store->RegisterConstString(kDBusObjectProperty, &dbus_path_);
-  HelpRegisterConstDerivedString(kTechnologyFamilyProperty,
-                                 &Cellular::GetTechnologyFamily);
-  HelpRegisterDerivedBool(kCellularAllowRoamingProperty,
-                          &Cellular::GetAllowRoaming,
-                          &Cellular::SetAllowRoaming);
-  store->RegisterConstStringmap(kHomeProviderProperty,
-                                &home_provider_.ToDict());
-
+  RegisterProperties();
   // For now, only a single capability is supported.
   InitCapability(type);
 
@@ -777,10 +769,6 @@
                                        invalidated_properties);
 }
 
-void Cellular::set_home_provider(const Operator &oper) {
-  home_provider_.CopyFrom(oper);
-}
-
 string Cellular::CreateFriendlyServiceName() {
   SLOG(Cellular, 2) << __func__;
   return capability_.get() ? capability_->CreateFriendlyServiceName() : "";
@@ -1044,4 +1032,207 @@
   OnPPPDisconnected();
 }
 
+void Cellular::RegisterProperties() {
+  PropertyStore *store = this->mutable_store();
+
+  // These properties do not have setters, and events are not generated when
+  // they are changed.
+  // TODO(jglasgow): kDBusConnectionProperty is deprecated. crbug.com/323754
+  store->RegisterConstString(kDBusConnectionProperty, &dbus_owner_);
+  store->RegisterConstString(kDBusServiceProperty, &dbus_service_);
+  store->RegisterConstString(kDBusObjectProperty, &dbus_path_);
+
+  store->RegisterUint16(kScanIntervalProperty, &scan_interval_);
+
+  // These properties have setters that should be used to change their values.
+  // Events are generated whenever the values change.
+  store->RegisterConstStringmap(kHomeProviderProperty,
+                                &home_provider_.ToDict());
+  store->RegisterConstString(kCarrierProperty, &carrier_);
+  store->RegisterConstBool(kSupportNetworkScanProperty, &scanning_supported_);
+  store->RegisterConstString(kEsnProperty, &esn_);
+  store->RegisterConstString(kFirmwareRevisionProperty, &firmware_revision_);
+  store->RegisterConstString(kHardwareRevisionProperty, &hardware_revision_);
+  store->RegisterConstString(kImeiProperty, &imei_);
+  store->RegisterConstString(kImsiProperty, &imsi_);
+  store->RegisterConstString(kMdnProperty, &mdn_);
+  store->RegisterConstString(kMeidProperty, &meid_);
+  store->RegisterConstString(kMinProperty, &min_);
+  store->RegisterConstString(kManufacturerProperty, &manufacturer_);
+  store->RegisterConstString(kModelIDProperty, &model_id_);
+
+  store->RegisterConstString(kSelectedNetworkProperty, &selected_network_);
+  store->RegisterConstStringmaps(kFoundNetworksProperty, &found_networks_);
+  store->RegisterConstBool(kProviderRequiresRoamingProperty,
+                           &provider_requires_roaming_);
+  store->RegisterConstBool(kSIMPresentProperty, &sim_present_);
+  store->RegisterConstStringmaps(kCellularApnListProperty, &apn_list_);
+
+  // TODO(pprabhu): Decide whether these need their own custom setters.
+  HelpRegisterConstDerivedString(kTechnologyFamilyProperty,
+                                 &Cellular::GetTechnologyFamily);
+  HelpRegisterDerivedBool(kCellularAllowRoamingProperty,
+                          &Cellular::GetAllowRoaming,
+                          &Cellular::SetAllowRoaming);
+}
+
+void Cellular::set_home_provider(const Operator &oper) {
+  if (home_provider_.Equals(oper))
+    return;
+
+  home_provider_.CopyFrom(oper);
+  adaptor()->EmitStringmapChanged(kHomeProviderProperty,
+                                  home_provider_.ToDict());
+}
+
+void Cellular::set_carrier(const string &carrier) {
+  if (carrier_ == carrier)
+    return;
+
+  carrier_ = carrier;
+  adaptor()->EmitStringChanged(kCarrierProperty, carrier_);
+}
+
+void Cellular::set_scanning_supported(bool scanning_supported) {
+  if (scanning_supported_ == scanning_supported)
+    return;
+
+  scanning_supported_ = scanning_supported;
+  if (adaptor())
+    adaptor()->EmitBoolChanged(kSupportNetworkScanProperty,
+                               scanning_supported_);
+  else
+    SLOG(Cellular, 2) << "Could not emit signal for property |"
+                      << kSupportNetworkScanProperty
+                      << "| change. DBus adaptor is NULL!";
+}
+
+void Cellular::set_esn(const string &esn) {
+  if (esn_ == esn)
+    return;
+
+  esn_ = esn;
+  adaptor()->EmitStringChanged(kEsnProperty, esn_);
+}
+
+void Cellular::set_firmware_revision(const std::string &firmware_revision) {
+  if (firmware_revision_ == firmware_revision)
+    return;
+
+  firmware_revision_ = firmware_revision;
+  adaptor()->EmitStringChanged(kFirmwareRevisionProperty, firmware_revision_);
+}
+
+void Cellular::set_hardware_revision(const std::string &hardware_revision) {
+  if (hardware_revision_ == hardware_revision)
+    return;
+
+  hardware_revision_ = hardware_revision;
+  adaptor()->EmitStringChanged(kHardwareRevisionProperty, hardware_revision_);
+}
+
+// TODO(armansito): The following methods should probably log their argument
+// values. Need to learn if any of them need to be scrubbed.
+void Cellular::set_imei(const std::string &imei) {
+  if (imei_ == imei)
+    return;
+
+  imei_ = imei;
+  adaptor()->EmitStringChanged(kImeiProperty, imei_);
+}
+
+void Cellular::set_imsi(const std::string &imsi) {
+  if (imsi_ == imsi)
+    return;
+
+  imsi_ = imsi;
+  adaptor()->EmitStringChanged(kImsiProperty, imsi_);
+}
+
+void Cellular::set_mdn(const std::string &mdn) {
+  if (mdn_ == mdn)
+    return;
+
+  mdn_ = mdn;
+  adaptor()->EmitStringChanged(kMdnProperty, mdn_);
+}
+
+void Cellular::set_meid(const std::string &meid) {
+  if (meid_ == meid)
+    return;
+
+  meid_ = meid;
+  adaptor()->EmitStringChanged(kMeidProperty, meid_);
+}
+
+void Cellular::set_min(const std::string &min) {
+  if (min_ == min)
+    return;
+
+  min_ = min;
+  adaptor()->EmitStringChanged(kMinProperty, min_);
+}
+
+void Cellular::set_manufacturer(const std::string &manufacturer) {
+  if (manufacturer_ == manufacturer)
+    return;
+
+  manufacturer_ = manufacturer;
+  adaptor()->EmitStringChanged(kManufacturerProperty, manufacturer_);
+}
+
+void Cellular::set_model_id(const std::string &model_id) {
+  if (model_id_ == model_id)
+    return;
+
+  model_id_ = model_id;
+  adaptor()->EmitStringChanged(kModelIDProperty, model_id_);
+}
+
+void Cellular::set_selected_network(const std::string &selected_network) {
+  if (selected_network_ == selected_network)
+    return;
+
+  selected_network_ = selected_network;
+  adaptor()->EmitStringChanged(kSelectedNetworkProperty, selected_network_);
+}
+
+void Cellular::set_found_networks(const Stringmaps &found_networks) {
+  // There is no canonical form of a Stringmaps value.
+  // So don't check for redundant updates.
+  found_networks_ = found_networks;
+  adaptor()->EmitStringmapsChanged(kFoundNetworksProperty, found_networks_);
+}
+
+void Cellular::set_provider_requires_roaming(bool provider_requires_roaming) {
+  if (provider_requires_roaming_ == provider_requires_roaming)
+    return;
+
+  provider_requires_roaming_ = provider_requires_roaming;
+  adaptor()->EmitBoolChanged(kProviderRequiresRoamingProperty,
+                             provider_requires_roaming_);
+}
+
+void Cellular::set_sim_present(bool sim_present) {
+  if (sim_present_ == sim_present)
+    return;
+
+  sim_present_ = sim_present;
+  adaptor()->EmitBoolChanged(kSIMPresentProperty, sim_present_);
+}
+
+void Cellular::set_apn_list(const Stringmaps &apn_list) {
+  // There is no canonical form of a Stringmaps value.
+  // So don't check for redundant updates.
+  apn_list_ = apn_list;
+  // See crbug.com/215581: Sometimes adaptor may be NULL when |set_apn_list| is
+  // called.
+  if (adaptor())
+    adaptor()->EmitStringmapsChanged(kCellularApnListProperty, apn_list_);
+  else
+    SLOG(Cellular, 2) << "Could not emit signal for property |"
+                      << kCellularApnListProperty
+                      << "| change. DBus adaptor is NULL!";
+}
+
 }  // namespace shill
diff --git a/cellular.h b/cellular.h
index ffcbd97..dc98afd 100644
--- a/cellular.h
+++ b/cellular.h
@@ -158,12 +158,6 @@
   bool IsModemRegistered() const;
   static bool IsEnabledModemState(ModemState state);
 
-  const std::string &dbus_owner() const { return dbus_owner_; }
-  const std::string &dbus_path() const { return dbus_path_; }
-
-  const Operator &home_provider() const { return home_provider_; }
-  void set_home_provider(const Operator &oper);
-
   void HandleNewSignalQuality(uint32 strength);
 
   // Processes a change in the modem registration state, possibly creating,
@@ -239,6 +233,55 @@
   virtual void Notify(const std::string &reason,
                       const std::map<std::string, std::string> &dict) override;
 
+  // ///////////////////////////////////////////////////////////////////////////
+  // DBus Properties exposed by the Device interface of shill.
+  void RegisterProperties();
+
+  // getters
+  const std::string &dbus_owner() const { return dbus_owner_; }
+  const std::string &dbus_path() const { return dbus_path_; }
+  const Operator &home_provider() const { return home_provider_; }
+  const std::string &carrier() const { return carrier_; }
+  bool scanning_supported() const { return scanning_supported_; }
+  const std::string &esn() const { return esn_; }
+  const std::string &firmware_revision() const { return firmware_revision_; }
+  const std::string &hardware_revision() const { return hardware_revision_; }
+  const std::string &imei() const { return imei_; }
+  const std::string &imsi() const { return imsi_; }
+  const std::string &mdn() const { return mdn_; }
+  const std::string &meid() const { return meid_; }
+  const std::string &min() const { return min_; }
+  const std::string &manufacturer() const { return manufacturer_; }
+  const std::string &model_id() const { return model_id_; }
+
+  const std::string &selected_network() const { return selected_network_; }
+  const Stringmaps &found_networks() const { return found_networks_; }
+  bool provider_requires_roaming() const { return provider_requires_roaming_; }
+  bool sim_present() const { return sim_present_; }
+  const Stringmaps &apn_list() const { return apn_list_; }
+
+  // setters
+  void set_home_provider(const Operator &oper);
+  void set_carrier(const std::string &carrier);
+  void set_scanning_supported(bool scanning_supported);
+  void set_esn(const std::string &esn);
+  void set_firmware_revision(const std::string &firmware_revision);
+  void set_hardware_revision(const std::string &hardware_revision);
+  void set_imei(const std::string &imei);
+  void set_imsi(const std::string &imsi);
+  void set_mdn(const std::string &mdn);
+  void set_meid(const std::string &meid);
+  void set_min(const std::string &min);
+  void set_manufacturer(const std::string &manufacturer);
+  void set_model_id(const std::string &model_id);
+
+  void set_selected_network(const std::string &selected_network);
+  void set_found_networks(const Stringmaps &found_networks);
+  void set_provider_requires_roaming(bool provider_requires_roaming);
+  void set_sim_present(bool sim_present);
+  void set_apn_list(const Stringmaps &apn_list);
+
+
  private:
   friend class ActivePassiveOutOfCreditsDetectorTest;
   friend class CellularTest;
@@ -403,9 +446,35 @@
 
   scoped_ptr<CellularCapability> capability_;
 
+  // All DBus Properties exposed by the Cellular device.
+  // Properties common to GSM and CDMA modems.
   const std::string dbus_owner_;  // :x.y
   const std::string dbus_service_;  // org.*.ModemManager*
   const std::string dbus_path_;  // ModemManager.Modem
+  Operator home_provider_;
+
+  bool scanning_supported_;
+  std::string carrier_;
+  std::string esn_;
+  std::string firmware_revision_;
+  std::string hardware_revision_;
+  std::string imei_;
+  std::string imsi_;
+  std::string manufacturer_;
+  std::string mdn_;
+  std::string meid_;
+  std::string min_;
+  std::string model_id_;
+
+  // GSM only properties.
+  // They are always exposed but are non empty only for GSM technology modems.
+  std::string selected_network_;
+  Stringmaps found_networks_;
+  bool provider_requires_roaming_;
+  uint16 scan_interval_;
+  bool sim_present_;
+  Stringmaps apn_list_;
+
 
   ModemInfo *modem_info_;
   ProxyFactory *proxy_factory_;
@@ -413,9 +482,6 @@
 
   CellularServiceRefPtr service_;
 
-  // Properties
-  Operator home_provider_;
-
   // User preference to allow or disallow roaming
   bool allow_roaming_;
 
diff --git a/cellular_capability_cdma.cc b/cellular_capability_cdma.cc
index 7f4adc5..113a4eb 100644
--- a/cellular_capability_cdma.cc
+++ b/cellular_capability_cdma.cc
@@ -232,10 +232,10 @@
 
 void CellularCapabilityCDMA::GetMEID(const ResultCallback &callback) {
   SLOG(Cellular, 2) << __func__;
-  if (meid_.empty()) {
+  if (cellular()->meid().empty()) {
     // TODO(petkov): Switch to asynchronous calls (crbug.com/200687).
-    meid_ = proxy_->MEID();
-    SLOG(Cellular, 2) << "MEID: " << meid_;
+    cellular()->set_meid(proxy_->MEID());
+    SLOG(Cellular, 2) << "MEID: " << cellular()->meid();
   }
   callback.Run(Error());
 }
@@ -308,8 +308,8 @@
 
 string CellularCapabilityCDMA::CreateFriendlyServiceName() {
   SLOG(Cellular, 2) << __func__;
-  if (!carrier_.empty()) {
-    return carrier_;
+  if (!cellular()->carrier().empty()) {
+    return cellular()->carrier();
   }
   return base::StringPrintf("CDMANetwork%u", friendly_service_name_id_++);
 }
@@ -356,8 +356,13 @@
     uint32 activation_error,
     const DBusPropertiesMap &status_changes) {
   SLOG(Cellular, 2) << __func__;
-  DBusProperties::GetString(status_changes, "mdn", &mdn_);
-  DBusProperties::GetString(status_changes, "min", &min_);
+  string prop_value;
+
+  if (DBusProperties::GetString(status_changes, "mdn", &prop_value))
+    cellular()->set_mdn(prop_value);
+  if (DBusProperties::GetString(status_changes, "min", &prop_value))
+    cellular()->set_min(prop_value);
+
   string payment;
   if (DBusProperties::GetString(status_changes, "payment_url", &payment)) {
     olp_.SetURL(payment);
diff --git a/cellular_capability_cdma_unittest.cc b/cellular_capability_cdma_unittest.cc
index d32dda5..e2ec268 100644
--- a/cellular_capability_cdma_unittest.cc
+++ b/cellular_capability_cdma_unittest.cc
@@ -387,7 +387,7 @@
   EXPECT_EQ("CDMANetwork0", capability_->CreateFriendlyServiceName());
   EXPECT_EQ("CDMANetwork1", capability_->CreateFriendlyServiceName());
   static const char kTestCarrier[] = "A Carrier";
-  capability_->carrier_ = kTestCarrier;
+  cellular_->set_carrier(kTestCarrier);
   EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
 }
 
diff --git a/cellular_capability_classic.cc b/cellular_capability_classic.cc
index 7232228..3801a4e 100644
--- a/cellular_capability_classic.cc
+++ b/cellular_capability_classic.cc
@@ -65,22 +65,8 @@
     ProxyFactory *proxy_factory,
     ModemInfo *modem_info)
     : CellularCapability(cellular, proxy_factory, modem_info),
-      scanning_supported_(false),
       weak_ptr_factory_(this) {
   PropertyStore *store = cellular->mutable_store();
-  store->RegisterConstString(kCarrierProperty, &carrier_);
-  store->RegisterConstBool(kSupportNetworkScanProperty, &scanning_supported_);
-  store->RegisterConstString(kEsnProperty, &esn_);
-  store->RegisterConstString(kFirmwareRevisionProperty, &firmware_revision_);
-  store->RegisterConstString(kHardwareRevisionProperty, &hardware_revision_);
-  store->RegisterConstString(kImeiProperty, &imei_);
-  store->RegisterConstString(kImsiProperty, &imsi_);
-  store->RegisterConstString(kManufacturerProperty, &manufacturer_);
-  store->RegisterConstString(kMdnProperty, &mdn_);
-  store->RegisterConstString(kMeidProperty, &meid_);
-  store->RegisterConstString(kMinProperty, &min_);
-  store->RegisterConstString(kModelIDProperty, &model_id_);
-
   // This class is currently instantiated only for Gobi modems so setup the
   // supported carriers list appropriately and expose it over RPC.
   supported_carriers_.push_back(kCarrierGenericUMTS);
@@ -348,17 +334,26 @@
     const ResultCallback &callback,
     const DBusPropertiesMap &props,
     const Error &error) {
+  string prop_value;
   SLOG(Cellular, 2) << __func__ << " " << props.size() << " props. error "
                     << error;
   if (error.IsSuccess()) {
-    DBusProperties::GetString(props, "carrier", &carrier_);
-    DBusProperties::GetString(props, "meid", &meid_);
-    DBusProperties::GetString(props, "imei", &imei_);
-    DBusProperties::GetString(props, kModemPropertyIMSI, &imsi_);
-    DBusProperties::GetString(props, "esn", &esn_);
-    DBusProperties::GetString(props, "mdn", &mdn_);
-    DBusProperties::GetString(props, "min", &min_);
-    DBusProperties::GetString(props, "firmware_revision", &firmware_revision_);
+    if (DBusProperties::GetString(props, "carrier", &prop_value))
+      cellular()->set_carrier(prop_value);
+    if (DBusProperties::GetString(props, "meid", &prop_value))
+      cellular()->set_meid(prop_value);
+    if (DBusProperties::GetString(props, "imei", &prop_value))
+     cellular()->set_imei(prop_value);
+    if (DBusProperties::GetString(props, kModemPropertyIMSI, &prop_value))
+      cellular()->set_imsi(prop_value);
+    if (DBusProperties::GetString(props, "esn", &prop_value))
+      cellular()->set_esn(prop_value);
+    if (DBusProperties::GetString(props, "mdn", &prop_value))
+      cellular()->set_mdn(prop_value);
+    if (DBusProperties::GetString(props, "min", &prop_value))
+      cellular()->set_min(prop_value);
+    if (DBusProperties::GetString(props, "firmware_revision", &prop_value))
+      cellular()->set_firmware_revision(prop_value);
     UpdateStatus(props);
   }
   callback.Run(error);
@@ -370,9 +365,9 @@
     const Error &error) {
   SLOG(Cellular, 2) << __func__ << "(" << error << ")";
   if (error.IsSuccess()) {
-    manufacturer_ = info._1;
-    model_id_ = info._2;
-    hardware_revision_ = info._3;
+    cellular()->set_manufacturer(info._1);
+    cellular()->set_model_id(info._2);
+    cellular()->set_hardware_revision(info._3);
     SLOG(Cellular, 2) << __func__ << ": " << info._1 << ", " << info._2 << ", "
                       << info._3;
   }
diff --git a/cellular_capability_classic.h b/cellular_capability_classic.h
index 58b3152..a40d8d6 100644
--- a/cellular_capability_classic.h
+++ b/cellular_capability_classic.h
@@ -130,20 +130,6 @@
   void StepCompletedCallback(const ResultCallback &callback, bool ignore_error,
                              CellularTaskList *tasks, const Error &error);
 
-  // Properties
-  bool scanning_supported_;
-  std::string meid_;
-  std::string imsi_;
-  std::string imei_;
-  std::string esn_;
-  std::string mdn_;
-  std::string min_;
-  std::string model_id_;
-  std::string manufacturer_;
-  std::string firmware_revision_;
-  std::string hardware_revision_;
-  std::string carrier_;
-
   scoped_ptr<ModemSimpleProxyInterface> simple_proxy_;
 
  private:
diff --git a/cellular_capability_classic_unittest.cc b/cellular_capability_classic_unittest.cc
index 1692726..35f76a1 100644
--- a/cellular_capability_classic_unittest.cc
+++ b/cellular_capability_classic_unittest.cc
@@ -257,7 +257,7 @@
   ResultCallback callback =
       Bind(&CellularCapabilityTest::TestCallback, Unretained(this));
   capability_->GetModemStatus(callback);
-  EXPECT_EQ(kTestCarrier, capability_->carrier_);
+  EXPECT_EQ(kTestCarrier, cellular_->carrier());
   EXPECT_EQ(kTestCarrier, cellular_->home_provider_.GetName());
 }
 
@@ -269,9 +269,9 @@
   ResultCallback callback =
       Bind(&CellularCapabilityTest::TestCallback, Unretained(this));
   capability_->GetModemInfo(callback);
-  EXPECT_EQ(kManufacturer, capability_->manufacturer_);
-  EXPECT_EQ(kModelID, capability_->model_id_);
-  EXPECT_EQ(kHWRev, capability_->hardware_revision_);
+  EXPECT_EQ(kManufacturer, cellular_->manufacturer());
+  EXPECT_EQ(kModelID, cellular_->model_id());
+  EXPECT_EQ(kHWRev, cellular_->hardware_revision());
 }
 
 TEST_F(CellularCapabilityTest, EnableModemSucceed) {
@@ -389,7 +389,7 @@
   }
   CellularCapabilityGSM *gsm_capability = GetGsmCapability();
   SetService();
-  gsm_capability->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
   InitProviderDB();
   gsm_capability->SetHomeProvider();
   ProfileRefPtr profile(new NiceMock<MockProfile>(
diff --git a/cellular_capability_gsm.cc b/cellular_capability_gsm.cc
index cbfccf0..a41d4b9 100644
--- a/cellular_capability_gsm.cc
+++ b/cellular_capability_gsm.cc
@@ -58,25 +58,15 @@
       registration_state_(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN),
       access_technology_(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN),
       home_provider_info_(NULL),
-      provider_requires_roaming_(false),
       get_imsi_retries_(0),
       get_imsi_retry_delay_milliseconds_(kGetIMSIRetryDelayMilliseconds),
-      scanning_(false),
-      scan_interval_(0),
-      sim_present_(false) {
+      scanning_(false) {
   SLOG(Cellular, 2) << "Cellular capability constructed: GSM";
   PropertyStore *store = cellular->mutable_store();
-  store->RegisterConstString(kSelectedNetworkProperty, &selected_network_);
-  store->RegisterConstStringmaps(kFoundNetworksProperty, &found_networks_);
-  store->RegisterConstBool(kProviderRequiresRoamingProperty,
-                           &provider_requires_roaming_);
   store->RegisterConstBool(kScanningProperty, &scanning_);
-  store->RegisterUint16(kScanIntervalProperty, &scan_interval_);
-  store->RegisterConstBool(kSIMPresentProperty, &sim_present_);
   HelpRegisterConstDerivedKeyValueStore(
       kSIMLockStatusProperty, &CellularCapabilityGSM::SimLockStatusToProperty);
-  store->RegisterConstStringmaps(kCellularApnListProperty, &apn_list_);
-  scanning_supported_ = true;
+  this->cellular()->set_scanning_supported(true);
 
   // TODO(benchan): This is a hack to initialize the GSM card proxy for GetIMSI
   // before InitProxies is called. There are side-effects of calling InitProxies
@@ -166,7 +156,8 @@
   // If we're within range of the home network, the modem will try to
   // register once it's enabled, or may be already registered if we
   // started out enabled.
-  if (!IsUnderlyingDeviceRegistered() && !selected_network_.empty())
+  if (!IsUnderlyingDeviceRegistered() &&
+      !cellular()->selected_network().empty())
     tasks->push_back(Bind(&CellularCapabilityGSM::Register,
                           weak_ptr_factory_.GetWeakPtr(), cb));
   tasks->push_back(Bind(&CellularCapabilityGSM::GetIMEI,
@@ -218,9 +209,10 @@
 
 void CellularCapabilityGSM::OnServiceCreated() {
   // If IMSI is available, base the service's storage identifier on it.
-  if (!imsi_.empty()) {
+  if (!cellular()->imsi().empty()) {
     cellular()->service()->SetStorageIdentifier(
-        string(kTypeCellular) + "_" + cellular()->address() + "_" + imsi_);
+        string(kTypeCellular) + "_" + cellular()->address() + "_" +
+               cellular()->imsi());
   }
   cellular()->service()->SetActivationState(kActivationStateActivated);
   UpdateServingOperator();
@@ -251,7 +243,9 @@
   if (apn_info)
     apn_try_list_.push_back(*apn_info);
 
-  apn_try_list_.insert(apn_try_list_.end(), apn_list_.begin(), apn_list_.end());
+  apn_try_list_.insert(apn_try_list_.end(),
+                       cellular()->apn_list().begin(),
+                       cellular()->apn_list().end());
 }
 
 void CellularCapabilityGSM::SetupConnectProperties(
@@ -326,7 +320,7 @@
 }
 
 bool CellularCapabilityGSM::AllowRoaming() {
-  return provider_requires_roaming_ || allow_roaming_property();
+  return cellular()->provider_requires_roaming() || allow_roaming_property();
 }
 
 // always called from an async context
@@ -334,14 +328,14 @@
   SLOG(Cellular, 2) << __func__;
   CHECK(!callback.is_null());
   Error error;
-  if (imei_.empty()) {
+  if (cellular()->imei().empty()) {
     GSMIdentifierCallback cb = Bind(&CellularCapabilityGSM::OnGetIMEIReply,
                                     weak_ptr_factory_.GetWeakPtr(), callback);
     card_proxy_->GetIMEI(&error, cb, kTimeoutDefault);
     if (error.IsFailure())
       callback.Run(error);
   } else {
-    SLOG(Cellular, 2) << "Already have IMEI " << imei_;
+    SLOG(Cellular, 2) << "Already have IMEI " << cellular()->imei();
     callback.Run(error);
   }
 }
@@ -351,7 +345,7 @@
   SLOG(Cellular, 2) << __func__;
   CHECK(!callback.is_null());
   Error error;
-  if (imsi_.empty()) {
+  if (cellular()->imsi().empty()) {
     GSMIdentifierCallback cb = Bind(&CellularCapabilityGSM::OnGetIMSIReply,
                                     weak_ptr_factory_.GetWeakPtr(),
                                     callback);
@@ -359,7 +353,7 @@
     if (error.IsFailure())
       callback.Run(error);
   } else {
-    SLOG(Cellular, 2) << "Already have IMSI " << imsi_;
+    SLOG(Cellular, 2) << "Already have IMSI " << cellular()->imsi();
     callback.Run(error);
   }
 }
@@ -387,7 +381,8 @@
   SLOG(Cellular, 2) << __func__;
   CHECK(!callback.is_null());
   Error error;
-  if (mdn_.empty()) {
+  string mdn = cellular()->mdn();
+  if (mdn.empty()) {
     GSMIdentifierCallback cb = Bind(&CellularCapabilityGSM::OnGetMSISDNReply,
                                     weak_ptr_factory_.GetWeakPtr(),
                                     callback);
@@ -395,7 +390,7 @@
     if (error.IsFailure())
       callback.Run(error);
   } else {
-    SLOG(Cellular, 2) << "Already have MSISDN " << mdn_;
+    SLOG(Cellular, 2) << "Already have MSISDN " << mdn;
     callback.Run(error);
   }
 }
@@ -449,8 +444,8 @@
       !home_provider_name.empty()) {
     return home_provider_name;
   }
-  if (!carrier_.empty()) {
-    return carrier_;
+  if (!cellular()->carrier().empty()) {
+    return cellular()->carrier();
   }
   string serving_operator_code = serving_operator_.GetCode();
   if (!serving_operator_code.empty()) {
@@ -460,22 +455,23 @@
 }
 
 void CellularCapabilityGSM::SetHomeProvider() {
-  SLOG(Cellular, 2) << __func__ << "(IMSI: " << imsi_
+  string imsi = cellular()->imsi();
+  SLOG(Cellular, 2) << __func__ << "(IMSI: " << imsi
                     << " SPN: " << spn_ << ")";
   // TODO(petkov): The test for NULL provider_db should be done by
   // mobile_provider_lookup_best_match.
-  if (imsi_.empty() || !modem_info()->provider_db()) {
+  if (imsi.empty() || !modem_info()->provider_db()) {
     return;
   }
   mobile_provider *provider_info =
       mobile_provider_lookup_best_match(
-          modem_info()->provider_db(), spn_.c_str(), imsi_.c_str());
+          modem_info()->provider_db(), spn_.c_str(), imsi.c_str());
   if (!provider_info) {
     SLOG(Cellular, 2) << "GSM provider not found.";
     return;
   }
   home_provider_info_ = provider_info;
-  provider_requires_roaming_ = provider_info->requires_roaming;
+  cellular()->set_provider_requires_roaming(provider_info->requires_roaming);
   Cellular::Operator oper;
   if (provider_info->networks && provider_info->networks[0]) {
     oper.SetCode(provider_info->networks[0]);
@@ -492,9 +488,10 @@
     oper.SetName(spn_);
   }
   cellular()->set_home_provider(oper);
+  bool roaming_required = cellular()->provider_requires_roaming();
   SLOG(Cellular, 2) << "Home provider: " << oper.GetCode() << ", "
                     << oper.GetName() << ", " << oper.GetCountry()
-                    << (provider_requires_roaming_ ? ", roaming required" : "");
+                    << (roaming_required ? ", roaming required" : "");
   InitAPNList();
 }
 
@@ -534,10 +531,10 @@
 
 void CellularCapabilityGSM::InitAPNList() {
   SLOG(Cellular, 2) << __func__;
+  Stringmaps apn_list;
   if (!home_provider_info_) {
     return;
   }
-  apn_list_.clear();
   for (int i = 0; i < home_provider_info_->num_apns; ++i) {
     Stringmap props;
     mobile_apn *apn = home_provider_info_->apns[i];
@@ -569,24 +566,21 @@
       props[kApnLocalizedNameProperty] = lname->name;
       props[kApnLanguageProperty] = lname->lang;
     }
-    apn_list_.push_back(props);
+    apn_list.push_back(props);
   }
-  if (cellular()->adaptor()) {
-    cellular()->adaptor()->EmitStringmapsChanged(
-        kCellularApnListProperty, apn_list_);
-  } else {
-    LOG(ERROR) << "Null RPC service adaptor.";
-  }
+  cellular()->set_apn_list(apn_list);
 }
 
 // always called from an async context
 void CellularCapabilityGSM::Register(const ResultCallback &callback) {
-  SLOG(Cellular, 2) << __func__ << " \"" << selected_network_ << "\"";
+  SLOG(Cellular, 2) << __func__ << " \"" << cellular()->selected_network()
+                    << "\"";
   CHECK(!callback.is_null());
   Error error;
   ResultCallback cb = Bind(&CellularCapabilityGSM::OnRegisterReply,
                                 weak_ptr_factory_.GetWeakPtr(), callback);
-  network_proxy_->Register(selected_network_, &error, cb, kTimeoutRegister);
+  network_proxy_->Register(cellular()->selected_network(), &error, cb,
+                           kTimeoutRegister);
   if (error.IsFailure())
     callback.Run(error);
 }
@@ -608,7 +602,7 @@
   SLOG(Cellular, 2) << __func__ << "(" << error << ")";
 
   if (error.IsSuccess()) {
-    selected_network_ = desired_network_;
+    cellular()->set_selected_network(desired_network_);
     desired_network_.clear();
     callback.Run(error);
     return;
@@ -617,7 +611,7 @@
   // try to register on the home network.
   if (!desired_network_.empty()) {
     desired_network_.clear();
-    selected_network_.clear();
+    cellular()->set_selected_network("");
     LOG(INFO) << "Couldn't register on selected network, trying home network";
     Register(callback);
     return;
@@ -691,21 +685,21 @@
   SLOG(Cellular, 2) << __func__;
 
   // Error handling is weak.  The current expectation is that on any
-  // error, found_networks_ should be cleared and a property change
+  // error, found_networks should be cleared and a property change
   // notification sent out.
   //
   // TODO(jglasgow): fix error handling
+  Stringmaps found_networks;
   scanning_ = false;
   cellular()->adaptor()->EmitBoolChanged(kScanningProperty, scanning_);
-  found_networks_.clear();
   if (!error.IsFailure()) {
     for (GSMScanResults::const_iterator it = results.begin();
          it != results.end(); ++it) {
-      found_networks_.push_back(ParseScanResult(*it));
+      found_networks.push_back(ParseScanResult(*it));
     }
   }
-  cellular()->adaptor()->EmitStringmapsChanged(kFoundNetworksProperty,
-                                               found_networks_);
+  cellular()->set_found_networks(found_networks);
+
   if (!callback.is_null())
     callback.Run(error);
 }
@@ -855,12 +849,10 @@
         emit = true;
       }
     }
+    // TODO(pprabhu) Rename |emit| to |sim_present| after |sim_lock_status|
+    // moves to cellular.
     if (emit) {
-      if (!sim_present_) {
-        sim_present_ = true;
-        cellular()->adaptor()->EmitBoolChanged(kSIMPresentProperty,
-                                               sim_present_);
-      }
+      cellular()->set_sim_present(true);
       cellular()->adaptor()->EmitKeyValueStoreChanged(
           kSIMLockStatusProperty, SimLockStatusToProperty(NULL));
     }
@@ -906,7 +898,7 @@
                                            const Error &error) {
   if (error.IsSuccess()) {
     SLOG(Cellular, 2) << "IMEI: " << imei;
-    imei_ = imei;
+    cellular()->set_imei(imei);
   } else {
     SLOG(Cellular, 2) << "GetIMEI failed - " << error;
   }
@@ -918,16 +910,16 @@
                                            const Error &error) {
   if (error.IsSuccess()) {
     SLOG(Cellular, 2) << "IMSI: " << imsi;
-    imsi_ = imsi;
-    sim_present_ = true;
+    cellular()->set_imsi(imsi);
+    cellular()->set_sim_present(true);
     SetHomeProvider();
     callback.Run(error);
   } else if (!sim_lock_status_.lock_type.empty()) {
     SLOG(Cellular, 2) << "GetIMSI failed - SIM lock in place.";
-    sim_present_ = true;
+    cellular()->set_sim_present(true);
     callback.Run(error);
   } else {
-    sim_present_ = false;
+    cellular()->set_sim_present(false);
     if (get_imsi_retries_++ < kGetIMSIRetryLimit) {
       SLOG(Cellular, 2) << "GetIMSI failed - " << error << ". Retrying";
       base::Callback<void(void)> retry_get_imsi_cb =
@@ -961,7 +953,7 @@
                                              const Error &error) {
   if (error.IsSuccess()) {
     SLOG(Cellular, 2) << "MSISDN: " << msisdn;
-    mdn_ = msisdn;
+    cellular()->set_mdn(msisdn);
   } else {
     SLOG(Cellular, 2) << "GetMSISDN failed - " << error;
   }
diff --git a/cellular_capability_gsm.h b/cellular_capability_gsm.h
index f7c8655..b0c0750 100644
--- a/cellular_capability_gsm.h
+++ b/cellular_capability_gsm.h
@@ -166,7 +166,7 @@
   // Updates the serving operator on the active service.
   void UpdateServingOperator();
 
-  // Initializes the |apn_list_| property based on the current
+  // Initializes the |apn_list| property based on the current
   // |home_provider_info_|.
   void InitAPNList();
 
@@ -224,7 +224,6 @@
   Cellular::Operator serving_operator_;
   std::string spn_;
   mobile_provider *home_provider_info_;
-  bool provider_requires_roaming_;
   std::string desired_network_;
 
   // The number of times GetIMSI() has been retried.
@@ -235,14 +234,9 @@
   int64 get_imsi_retry_delay_milliseconds_;
 
   // Properties.
-  std::string selected_network_;
-  Stringmaps found_networks_;
   std::deque<Stringmap> apn_try_list_;
   bool scanning_;
-  uint16 scan_interval_;
   SimLockStatus sim_lock_status_;
-  bool sim_present_;
-  Stringmaps apn_list_;
 
   static unsigned int friendly_service_name_id_;
 
diff --git a/cellular_capability_gsm_unittest.cc b/cellular_capability_gsm_unittest.cc
index 2b1e7d4..e3103e5 100644
--- a/cellular_capability_gsm_unittest.cc
+++ b/cellular_capability_gsm_unittest.cc
@@ -340,10 +340,10 @@
                        &CellularCapabilityGSMTest::InvokeGetIMEI));
   EXPECT_CALL(*this, TestCallback(IsSuccess()));
   SetCardProxy();
-  ASSERT_TRUE(capability_->imei_.empty());
+  ASSERT_TRUE(cellular_->imei().empty());
   capability_->GetIMEI(Bind(&CellularCapabilityGSMTest::TestCallback,
                             Unretained(this)));
-  EXPECT_EQ(kIMEI, capability_->imei_);
+  EXPECT_EQ(kIMEI, cellular_->imei());
 }
 
 TEST_F(CellularCapabilityGSMTest, GetIMSI) {
@@ -356,12 +356,12 @@
   SetCardProxy();
   ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
                                  Unretained(this));
-  EXPECT_TRUE(capability_->imsi_.empty());
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->imsi().empty());
+  EXPECT_FALSE(cellular_->sim_present());
   capability_->GetIMSI(callback);
-  EXPECT_EQ(kIMSI, capability_->imsi_);
-  EXPECT_TRUE(capability_->sim_present_);
-  capability_->imsi_.clear();
+  EXPECT_EQ(kIMSI, cellular_->imsi());
+  EXPECT_TRUE(cellular_->sim_present());
+  cellular_->set_imsi("");
   InitProviderDB();
   capability_->GetIMSI(callback);
   EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
@@ -383,16 +383,16 @@
   SetCardProxy();
   ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
                                  Unretained(this));
-  EXPECT_TRUE(capability_->imsi_.empty());
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->imsi().empty());
+  EXPECT_FALSE(cellular_->sim_present());
 
   capability_->sim_lock_status_.lock_type = "sim-pin";
   capability_->GetIMSI(callback);
-  EXPECT_TRUE(capability_->imsi_.empty());
-  EXPECT_TRUE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->imsi().empty());
+  EXPECT_TRUE(cellular_->sim_present());
 
   capability_->sim_lock_status_.lock_type.clear();
-  capability_->sim_present_ = false;
+  cellular_->set_sim_present(false);
   capability_->get_imsi_retries_ = 0;
   EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryDelayMilliseconds,
             capability_->get_imsi_retry_delay_milliseconds_);
@@ -405,8 +405,8 @@
   }
   EXPECT_EQ(CellularCapabilityGSM::kGetIMSIRetryLimit + 1,
             capability_->get_imsi_retries_);
-  EXPECT_TRUE(capability_->imsi_.empty());
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->imsi().empty());
+  EXPECT_FALSE(cellular_->sim_present());
 }
 
 TEST_F(CellularCapabilityGSMTest, GetMSISDN) {
@@ -416,10 +416,10 @@
                        &CellularCapabilityGSMTest::InvokeGetMSISDN));
   EXPECT_CALL(*this, TestCallback(IsSuccess()));
   SetCardProxy();
-  ASSERT_TRUE(capability_->mdn_.empty());
+  ASSERT_TRUE(cellular_->mdn().empty());
   capability_->GetMSISDN(Bind(&CellularCapabilityGSMTest::TestCallback,
                             Unretained(this)));
-  EXPECT_EQ(kMSISDN, capability_->mdn_);
+  EXPECT_EQ(kMSISDN, cellular_->mdn());
 }
 
 TEST_F(CellularCapabilityGSMTest, GetSPN) {
@@ -456,7 +456,7 @@
   capability_->RegisterOnNetwork(kTestNetwork, &error,
                                  Bind(&CellularCapabilityGSMTest::TestCallback,
                                       Unretained(this)));
-  EXPECT_EQ(kTestNetwork, capability_->selected_network_);
+  EXPECT_EQ(kTestNetwork, cellular_->selected_network());
 }
 
 TEST_F(CellularCapabilityGSMTest, IsRegistered) {
@@ -551,10 +551,14 @@
 
 TEST_F(CellularCapabilityGSMTest, Scan) {
   Error error;
+  Stringmaps found_networks;
+
   EXPECT_CALL(*network_proxy_, Scan(_, _, CellularCapability::kTimeoutScan))
       .WillOnce(SaveArg<1>(&scan_callback_));
   EXPECT_CALL(*this, TestCallback(IsSuccess()));
-  capability_->found_networks_.resize(3, Stringmap());
+  found_networks = cellular_->found_networks();
+  found_networks.resize(3);
+  cellular_->set_found_networks(found_networks);
   EXPECT_CALL(*device_adaptor_,
               EmitStringmapsChanged(kFoundNetworksProperty, SizeIs2()));
   EXPECT_CALL(*device_adaptor_, EmitBoolChanged(kScanningProperty, true));
@@ -570,9 +574,10 @@
   EXPECT_CALL(*device_adaptor_, EmitBoolChanged(kScanningProperty, false));
   InvokeScanReply();
   EXPECT_FALSE(capability_->scanning_);
-  EXPECT_EQ(2, capability_->found_networks_.size());
-  EXPECT_EQ(kScanID0, capability_->found_networks_[0][kNetworkIdProperty]);
-  EXPECT_EQ(kScanID1, capability_->found_networks_[1][kNetworkIdProperty]);
+  found_networks = cellular_->found_networks();
+  EXPECT_EQ(2, cellular_->found_networks().size());
+  EXPECT_EQ(kScanID0, found_networks[0][kNetworkIdProperty]);
+  EXPECT_EQ(kScanID1, found_networks[1][kNetworkIdProperty]);
 }
 
 TEST_F(CellularCapabilityGSMTest, ParseScanResult) {
@@ -638,7 +643,7 @@
 TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
   InitProviderDB();
   DBusPropertiesMap props;
-  capability_->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
   props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
   capability_->UpdateStatus(props);
   EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
@@ -646,11 +651,11 @@
 
 TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
   EXPECT_FALSE(cellular_->allow_roaming_);
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
   EXPECT_FALSE(capability_->AllowRoaming());
-  capability_->provider_requires_roaming_ = true;
+  cellular_->set_provider_requires_roaming(true);
   EXPECT_TRUE(capability_->AllowRoaming());
-  capability_->provider_requires_roaming_ = false;
+  cellular_->set_provider_requires_roaming(false);
   cellular_->allow_roaming_ = true;
   EXPECT_TRUE(capability_->AllowRoaming());
 }
@@ -658,25 +663,25 @@
 TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
   static const char kCountry[] = "us";
   static const char kCode[] = "310160";
-  capability_->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
 
   EXPECT_FALSE(capability_->home_provider_info_);
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   capability_->SetHomeProvider();  // No mobile provider DB available.
   EXPECT_TRUE(cellular_->home_provider().GetName().empty());
   EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
   EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   InitProviderDB();
   capability_->SetHomeProvider();
   EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
   EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
   EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
-  EXPECT_EQ(4, capability_->apn_list_.size());
+  EXPECT_EQ(4, cellular_->apn_list().size());
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   Cellular::Operator oper;
   cellular_->set_home_provider(oper);
@@ -685,7 +690,7 @@
   EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
   EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
   EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   static const char kCubic[] = "Cubic";
   capability_->spn_ = kCubic;
@@ -693,7 +698,7 @@
   EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
   EXPECT_EQ("", cellular_->home_provider().GetCode());
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(capability_->provider_requires_roaming_);
+  EXPECT_TRUE(cellular_->provider_requires_roaming());
 
   static const char kCUBIC[] = "CUBIC";
   capability_->spn_ = kCUBIC;
@@ -702,7 +707,7 @@
   EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
   EXPECT_EQ("", cellular_->home_provider().GetCode());
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(capability_->provider_requires_roaming_);
+  EXPECT_TRUE(cellular_->provider_requires_roaming());
 }
 
 namespace {
@@ -714,19 +719,19 @@
 }  // namespace
 
 TEST_F(CellularCapabilityGSMTest, InitAPNList) {
+  Stringmaps apn_list;
   InitProviderDB();
   capability_->home_provider_info_ =
       mobile_provider_lookup_by_name(modem_info_.provider_db(), "T-Mobile");
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_EQ(0, capability_->apn_list_.size());
+  EXPECT_EQ(0, cellular_->apn_list().size());
   EXPECT_CALL(*device_adaptor_,
               EmitStringmapsChanged(kCellularApnListProperty, SizeIs4()));
   capability_->InitAPNList();
-  EXPECT_EQ(4, capability_->apn_list_.size());
-  EXPECT_EQ("wap.voicestream.com",
-            capability_->apn_list_[1][kApnProperty]);
-  EXPECT_EQ("Web2Go/t-zones",
-            capability_->apn_list_[1][kApnNameProperty]);
+  apn_list = cellular_->apn_list();
+  EXPECT_EQ(4, apn_list.size());
+  EXPECT_EQ("wap.voicestream.com", apn_list[1][kApnProperty]);
+  EXPECT_EQ("Web2Go/t-zones", apn_list[1][kApnNameProperty]);
 }
 
 TEST_F(CellularCapabilityGSMTest, GetNetworkTechnologyString) {
@@ -775,7 +780,7 @@
   EXPECT_EQ("cellular_1234", capability_->CreateFriendlyServiceName());
 
   static const char kTestCarrier[] = "A GSM Carrier";
-  capability_->carrier_ = kTestCarrier;
+  cellular_->set_carrier(kTestCarrier);
   EXPECT_EQ(kTestCarrier, capability_->CreateFriendlyServiceName());
 
   static const char kHomeProvider[] = "The GSM Home Provider";
@@ -799,7 +804,7 @@
   EXPECT_EQ(string(kTypeCellular) + "_" + kAddress + "_" +
             cellular_->service()->friendly_name(),
             cellular_->service()->GetStorageIdentifier());
-  capability_->imsi_ = kIMSI;
+  cellular_->set_imsi(kIMSI);
   capability_->OnServiceCreated();
   EXPECT_EQ(string(kTypeCellular) + "_" + kAddress + "_" + kIMSI,
             cellular_->service()->GetStorageIdentifier());
@@ -902,7 +907,7 @@
   static const string kSuppliedApn("my.apn");
 
   SetService();
-  capability_->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
   InitProviderDB();
   capability_->SetHomeProvider();
   DBusPropertiesMap props;
diff --git a/cellular_capability_universal.cc b/cellular_capability_universal.cc
index c7049a3..05e8c00 100644
--- a/cellular_capability_universal.cc
+++ b/cellular_capability_universal.cc
@@ -142,14 +142,10 @@
       current_capabilities_(MM_MODEM_CAPABILITY_NONE),
       access_technologies_(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN),
       home_provider_info_(NULL),
-      provider_requires_roaming_(false),
       resetting_(false),
-      scanning_supported_(false),
       scanning_(false),
       scanning_or_searching_(false),
-      scan_interval_(0),
       subscription_state_(kSubscriptionStateUnknown),
-      sim_present_(false),
       reset_done_(false),
       scanning_or_searching_timeout_milliseconds_(
           kDefaultScanningOrSearchingTimeoutMilliseconds),
@@ -160,31 +156,12 @@
   SLOG(Cellular, 2) << "Cellular capability constructed: Universal";
   PropertyStore *store = cellular->mutable_store();
 
-  store->RegisterConstString(kCarrierProperty, &carrier_);
-  store->RegisterConstBool(kSupportNetworkScanProperty, &scanning_supported_);
-  store->RegisterConstString(kEsnProperty, &esn_);
-  store->RegisterConstString(kFirmwareRevisionProperty, &firmware_revision_);
-  store->RegisterConstString(kHardwareRevisionProperty, &hardware_revision_);
-  store->RegisterConstString(kImeiProperty, &imei_);
-  store->RegisterConstString(kImsiProperty, &imsi_);
   store->RegisterConstString(kIccidProperty, &sim_identifier_);
-  store->RegisterConstString(kManufacturerProperty, &manufacturer_);
-  store->RegisterConstString(kMdnProperty, &mdn_);
-  store->RegisterConstString(kMeidProperty, &meid_);
-  store->RegisterConstString(kMinProperty, &min_);
-  store->RegisterConstString(kModelIDProperty, &model_id_);
-  store->RegisterConstString(kSelectedNetworkProperty, &selected_network_);
-  store->RegisterConstStringmaps(kFoundNetworksProperty, &found_networks_);
-  store->RegisterConstBool(kProviderRequiresRoamingProperty,
-                           &provider_requires_roaming_);
   store->RegisterConstBool(kScanningProperty, &scanning_or_searching_);
-  store->RegisterUint16(kScanIntervalProperty, &scan_interval_);
   HelpRegisterConstDerivedKeyValueStore(
       kSIMLockStatusProperty,
       &CellularCapabilityUniversal::SimLockStatusToProperty);
   store->RegisterConstString(kSIMOperatorIdProperty, &operator_id_);
-  store->RegisterConstBool(kSIMPresentProperty, &sim_present_);
-  store->RegisterConstStringmaps(kCellularApnListProperty, &apn_list_);
 }
 
 KeyValueStore CellularCapabilityUniversal::SimLockStatusToProperty(
@@ -628,18 +605,18 @@
     const CellularOperatorInfo::CellularOperator &cellular_operator) const {
   // TODO(benchan): This is ugly. Remove carrier specific code once we move
   // mobile activation logic to carrier-specifc extensions (crbug.com/260073).
+  const string &mdn = cellular()->mdn();
   if (cellular_operator.identifier() == kVzwIdentifier) {
     // subscription_state_ is the definitive indicator of whether we need
     // activation. The OLP expects an all zero MDN in that case.
-    if (subscription_state_ == kSubscriptionStateUnprovisioned ||
-        mdn_.empty()) {
+    if (subscription_state_ == kSubscriptionStateUnprovisioned || mdn.empty()) {
       return string(kVzwMdnLength, '0');
     }
-    if (mdn_.length() > kVzwMdnLength) {
-      return mdn_.substr(mdn_.length() - kVzwMdnLength);
+    if (mdn.length() > kVzwMdnLength) {
+      return mdn.substr(mdn.length() - kVzwMdnLength);
     }
   }
-  return mdn_;
+  return mdn;
 }
 
 void CellularCapabilityUniversal::ReleaseProxies() {
@@ -668,8 +645,8 @@
     }
   }
   // If the above didn't work, append IMSI, if available.
-  if (storage_id.empty() && !imsi_.empty()) {
-    storage_id = kPrefix + imsi_;
+  if (storage_id.empty() && !cellular()->imsi().empty()) {
+    storage_id = kPrefix + cellular()->imsi();
   }
   if (!storage_id.empty()) {
     cellular()->service()->SetStorageIdentifier(storage_id);
@@ -750,7 +727,9 @@
   if (apn_info)
     apn_try_list_.push_back(*apn_info);
 
-  apn_try_list_.insert(apn_try_list_.end(), apn_list_.begin(), apn_list_.end());
+  apn_try_list_.insert(apn_try_list_.end(),
+                       cellular()->apn_list().begin(),
+                       cellular()->apn_list().end());
 }
 
 void CellularCapabilityUniversal::SetupConnectProperties(
@@ -826,7 +805,7 @@
 }
 
 bool CellularCapabilityUniversal::AllowRoaming() {
-  return provider_requires_roaming_ || allow_roaming_property();
+  return cellular()->provider_requires_roaming() || allow_roaming_property();
 }
 
 void CellularCapabilityUniversal::GetProperties() {
@@ -881,7 +860,8 @@
 }
 
 void CellularCapabilityUniversal::SetHomeProvider() {
-  SLOG(Cellular, 2) << __func__ << "(IMSI: " << imsi_
+  const string &imsi = cellular()->imsi();
+  SLOG(Cellular, 2) << __func__ << "(IMSI: " << imsi
           << " SPN: " << spn_ << ")";
 
   if (!modem_info()->provider_db())
@@ -889,7 +869,7 @@
 
   // MCCMNC can be determined either from IMSI or Operator Code. Use whichever
   // one is available. If both were reported by the SIM, use IMSI.
-  const string &network_id = imsi_.empty() ? operator_id_ : imsi_;
+  const string &network_id = imsi.empty() ? operator_id_ : imsi;
   mobile_provider *provider_info = mobile_provider_lookup_best_match(
       modem_info()->provider_db(),
       spn_.c_str(),
@@ -902,7 +882,8 @@
   // Even if |provider_info| is the same as |home_provider_info_|, it is
   // possible that the |spn_| has changed.  Run all the code below.
   home_provider_info_ = provider_info;
-  provider_requires_roaming_ = provider_info->requires_roaming;
+  cellular()->set_provider_requires_roaming(
+      home_provider_info_->requires_roaming);
   Cellular::Operator oper;
   // If Operator ID is available, use that as network code, otherwise
   // use what was returned from the database.
@@ -923,9 +904,10 @@
     oper.SetName(spn_);
   }
   cellular()->set_home_provider(oper);
+  bool roaming_required = cellular()->provider_requires_roaming();
   SLOG(Cellular, 2) << "Home provider: " << oper.GetCode() << ", "
                     << oper.GetName() << ", " << oper.GetCountry()
-                    << (provider_requires_roaming_ ? ", roaming required" : "");
+                    << (roaming_required ? ", roaming required" : "");
   InitAPNList();
   UpdateServiceName();
 }
@@ -999,15 +981,15 @@
   olp.CopyFrom(*result);
   string post_data = olp.GetPostData();
   ReplaceSubstringsAfterOffset(&post_data, 0, "${iccid}", sim_identifier_);
-  ReplaceSubstringsAfterOffset(&post_data, 0, "${imei}", imei_);
-  ReplaceSubstringsAfterOffset(&post_data, 0, "${imsi}", imsi_);
+  ReplaceSubstringsAfterOffset(&post_data, 0, "${imei}", cellular()->imei());
+  ReplaceSubstringsAfterOffset(&post_data, 0, "${imsi}", cellular()->imsi());
   ReplaceSubstringsAfterOffset(&post_data, 0, "${mdn}",
                                GetMdnForOLP(*cellular_operator));
-  ReplaceSubstringsAfterOffset(&post_data, 0, "${min}", min_);
+  ReplaceSubstringsAfterOffset(&post_data, 0, "${min}", cellular()->min());
 
   // TODO(armansito): Define constants for the OEM IDs in MobileOperator
   // (See crbug.com/298408).
-  string oem_id = (model_id_ == kE362ModelId) ? "GOG3" : "QUA";
+  string oem_id = (cellular()->model_id() == kE362ModelId) ? "GOG3" : "QUA";
   ReplaceSubstringsAfterOffset(&post_data, 0, "${oem}", oem_id);
   olp.SetPostData(post_data);
   cellular()->service()->SetOLP(olp);
@@ -1178,10 +1160,10 @@
 
 void CellularCapabilityUniversal::InitAPNList() {
   SLOG(Cellular, 2) << __func__;
+  Stringmaps apn_list;
   if (!home_provider_info_) {
     return;
   }
-  apn_list_.clear();
   for (int i = 0; i < home_provider_info_->num_apns; ++i) {
     Stringmap props;
     mobile_apn *apn = home_provider_info_->apns[i];
@@ -1213,14 +1195,9 @@
       props[kApnLocalizedNameProperty] = lname->name;
       props[kApnLanguageProperty] = lname->lang;
     }
-    apn_list_.push_back(props);
+    apn_list.push_back(props);
   }
-  if (cellular()->adaptor()) {
-    cellular()->adaptor()->EmitStringmapsChanged(
-        kCellularApnListProperty, apn_list_);
-  } else {
-    LOG(ERROR) << "Null RPC service adaptor.";
-  }
+  cellular()->set_apn_list(apn_list);
 }
 
 bool CellularCapabilityUniversal::IsServiceActivationRequired() const {
@@ -1258,9 +1235,10 @@
 }
 
 bool CellularCapabilityUniversal::IsMdnValid() const {
-  // Note that |mdn_| is normalized to contain only digits in OnMdnChanged().
-  for (size_t i = 0; i < mdn_.size(); ++i) {
-    if (mdn_[i] != '0')
+  const string &mdn = cellular()->mdn();
+  // Note that |mdn| is normalized to contain only digits in OnMdnChanged().
+  for (size_t i = 0; i < mdn.size(); ++i) {
+    if (mdn[i] != '0')
       return true;
   }
   return false;
@@ -1268,12 +1246,14 @@
 
 // always called from an async context
 void CellularCapabilityUniversal::Register(const ResultCallback &callback) {
-  SLOG(Cellular, 2) << __func__ << " \"" << selected_network_ << "\"";
+  SLOG(Cellular, 2) << __func__ << " \"" << cellular()->selected_network()
+                    << "\"";
   CHECK(!callback.is_null());
   Error error;
   ResultCallback cb = Bind(&CellularCapabilityUniversal::OnRegisterReply,
                                 weak_ptr_factory_.GetWeakPtr(), callback);
-  modem_3gpp_proxy_->Register(selected_network_, &error, cb, kTimeoutRegister);
+  modem_3gpp_proxy_->Register(cellular()->selected_network(), &error, cb,
+                              kTimeoutRegister);
   if (error.IsFailure())
     callback.Run(error);
 }
@@ -1296,7 +1276,7 @@
   SLOG(Cellular, 2) << __func__ << "(" << error << ")";
 
   if (error.IsSuccess()) {
-    selected_network_ = desired_network_;
+    cellular()->set_selected_network(desired_network_);
     desired_network_.clear();
     callback.Run(error);
     return;
@@ -1305,7 +1285,7 @@
   // try to register on the home network.
   if (!desired_network_.empty()) {
     desired_network_.clear();
-    selected_network_.clear();
+    cellular()->set_selected_network("");
     LOG(INFO) << "Couldn't register on selected network, trying home network";
     Register(callback);
     return;
@@ -1410,25 +1390,24 @@
   SLOG(Cellular, 2) << __func__;
 
   // Error handling is weak.  The current expectation is that on any
-  // error, found_networks_ should be cleared and a property change
+  // error, found_networks should be cleared and a property change
   // notification sent out.
   //
   // TODO(jglasgow): fix error handling
+  Stringmaps found_networks;
   scanning_ = false;
   UpdateScanningProperty();
-  found_networks_.clear();
   if (!error.IsFailure()) {
     for (ScanResults::const_iterator it = results.begin();
          it != results.end(); ++it) {
-      found_networks_.push_back(ParseScanResult(*it));
+      found_networks.push_back(ParseScanResult(*it));
     }
   }
-  cellular()->adaptor()->EmitStringmapsChanged(kFoundNetworksProperty,
-                                               found_networks_);
+  cellular()->set_found_networks(found_networks);
 
   // TODO(gmorain): This check for is_null() is a work-around because
   // Cellular::Scan() passes a null callback.  Instead: 1. Have Cellular::Scan()
-  // pass in a callback. 2. Have Cellular "own" the found_networks_ property
+  // pass in a callback. 2. Have Cellular "own" the found_networks property
   // 3. Have Cellular EmitStingMapsChanged() 4. Share the code between GSM and
   // Universal.
   if (!callback.is_null())
@@ -1521,7 +1500,7 @@
   // modem doesn't support it at a given time. This might be problematic if we
   // ever want to support switching between access technologies (e.g. falling
   // back to 3G when LTE is not available).
-  if (model_id_ == kE362ModelId)
+  if (cellular()->model_id() == kE362ModelId)
     return kNetworkTechnologyLte;
 
   // Order is important.  Return the highest speed technology
@@ -1594,11 +1573,11 @@
   if (DBusProperties::GetString(properties,
                                 MM_MODEM_PROPERTY_MANUFACTURER,
                                 &string_value))
-    OnModemManufacturerChanged(string_value);
+    cellular()->set_manufacturer(string_value);
   if (DBusProperties::GetString(properties,
                                 MM_MODEM_PROPERTY_MODEL,
                                 &string_value))
-    OnModemModelChanged(string_value);
+    cellular()->set_model_id(string_value);
   if (DBusProperties::GetString(properties,
                                MM_MODEM_PROPERTY_REVISION,
                                &string_value))
@@ -1695,7 +1674,8 @@
   // modemmanager does not ever return kInvalidApn for E362 modems
   // with 1.41 firmware.  It remains to be seem if this will change
   // with 3.x firmware.
-  if ((model_id_ == kE362ModelId) && (error.type() == Error::kOperationFailed))
+  if ((cellular()->model_id() == kE362ModelId) &&
+      (error.type() == Error::kOperationFailed))
     return true;
 
   return false;
@@ -1733,13 +1713,13 @@
 
   if (!IsValidSimPath(sim_path)) {
     // Clear all data about the sim
-    imsi_ = "";
+    cellular()->set_imsi("");
     spn_ = "";
-    sim_present_ = false;
+    cellular()->set_sim_present(false);
     OnSimIdentifierChanged("");
     OnOperatorIdChanged("");
   } else {
-    sim_present_ = true;
+    cellular()->set_sim_present(true);
     scoped_ptr<DBusPropertiesProxyInterface> properties_proxy(
         proxy_factory()->CreateDBusPropertiesProxy(sim_path,
                                                    cellular()->dbus_owner()));
@@ -1764,33 +1744,19 @@
   //
   // TODO(benchan): We should consider having the modem plugins in ModemManager
   // reporting whether network scan is supported.
-  scanning_supported_ =
-      (current_capabilities & MM_MODEM_CAPABILITY_GSM_UMTS) != 0;
-  if (cellular()->adaptor()) {
-    cellular()->adaptor()->EmitBoolChanged(
-        kSupportNetworkScanProperty, scanning_supported_);
-  }
+  cellular()->set_scanning_supported(
+      (current_capabilities & MM_MODEM_CAPABILITY_GSM_UMTS) != 0);
 }
 
 void CellularCapabilityUniversal::OnMdnChanged(
     const string &mdn) {
-  mdn_ = NormalizeMdn(mdn);
+  cellular()->set_mdn(NormalizeMdn(mdn));
   UpdatePendingActivationState();
 }
 
-void CellularCapabilityUniversal::OnModemManufacturerChanged(
-    const string &manufacturer) {
-  manufacturer_ = manufacturer;
-}
-
-void CellularCapabilityUniversal::OnModemModelChanged(
-    const string &model) {
-  model_id_ = model;
-}
-
 void CellularCapabilityUniversal::OnModemRevisionChanged(
     const string &revision) {
-  firmware_revision_ = revision;
+  cellular()->set_firmware_revision(revision);
 }
 
 void CellularCapabilityUniversal::OnModemStateChanged(
@@ -1902,7 +1868,7 @@
   if (DBusProperties::GetString(properties,
                                 MM_MODEM_MODEM3GPP_PROPERTY_IMEI,
                                 &imei))
-    OnImeiChanged(imei);
+    cellular()->set_imei(imei);
 
   // Handle registration state changes as a single change
   string operator_code = serving_operator_.GetCode();
@@ -1950,10 +1916,6 @@
     OnFacilityLocksChanged(locks);
 }
 
-void CellularCapabilityUniversal::OnImeiChanged(const string &imei) {
-  imei_ = imei;
-}
-
 void CellularCapabilityUniversal::On3GPPRegistrationChanged(
     MMModem3gppRegistrationState state,
     const string &operator_code,
@@ -2094,16 +2056,10 @@
   if (DBusProperties::GetString(props, MM_SIM_PROPERTY_OPERATORNAME, &value))
     OnSpnChanged(value);
   if (DBusProperties::GetString(props, MM_SIM_PROPERTY_IMSI, &value))
-    OnImsiChanged(value);
+    cellular()->set_imsi(value);
   SetHomeProvider();
 }
 
-// TODO(armansito): The following methods should probably log their argument
-// values. Need to learn if any of them need to be scrubbed.
-void CellularCapabilityUniversal::OnImsiChanged(const std::string &imsi) {
-  imsi_ = imsi;
-}
-
 void CellularCapabilityUniversal::OnSpnChanged(const std::string &spn) {
   spn_ = spn;
 }
@@ -2121,9 +2077,10 @@
 
 OutOfCreditsDetector::OOCType
 CellularCapabilityUniversal::GetOutOfCreditsDetectionType() const {
-  if (model_id_ == kALT3100ModelId) {
+  const string &model_id = cellular()->model_id();
+  if (model_id == kALT3100ModelId) {
     return OutOfCreditsDetector::OOCTypeSubscriptionState;
-  } else if (model_id_ == kE362ModelId) {
+  } else if (model_id == kE362ModelId) {
     return OutOfCreditsDetector::OOCTypeActivePassive;
   } else {
     return OutOfCreditsDetector::OOCTypeNone;
diff --git a/cellular_capability_universal.h b/cellular_capability_universal.h
index f08517d..2713fc6 100644
--- a/cellular_capability_universal.h
+++ b/cellular_capability_universal.h
@@ -128,23 +128,11 @@
   // Updates the storage identifier used for the current cellular service.
   virtual void UpdateStorageIdentifier();
 
-  // Returns the operator-specific form of |mdn_|, which is passed to the online
+  // Returns the operator-specific form of |mdn|, which is passed to the online
   // payment portal of a cellular operator.
   std::string GetMdnForOLP(
       const CellularOperatorInfo::CellularOperator &cellular_operator) const;
 
-  const std::string &mdn() const { return mdn_; }
-  void set_mdn(const std::string &mdn) { mdn_ = mdn; }
-
-  const std::string &min() const { return min_; }
-  void set_min(const std::string &min) { min_ = min; }
-
-  const std::string &meid() const { return meid_; }
-  void set_meid(const std::string &meid) { meid_ = meid; }
-
-  const std::string &esn() const { return esn_; }
-  void set_esn(const std::string &esn) { esn_ = esn; }
-
  private:
   struct ModemModes {
     ModemModes()
@@ -328,7 +316,7 @@
   // Updates the serving operator on the active service.
   void UpdateServingOperator();
 
-  // Initializes the |apn_list_| property based on the current
+  // Initializes the |apn_list| property based on the current
   // |home_provider_info_|.
   void InitAPNList();
 
@@ -368,8 +356,6 @@
       const std::vector<uint32> &supported_capabilities);
   void OnModemCurrentCapabilitiesChanged(uint32 current_capabilities);
   void OnMdnChanged(const std::string &mdn);
-  void OnModemManufacturerChanged(const std::string &manufacturer);
-  void OnModemModelChanged(const std::string &model);
   void OnModemRevisionChanged(const std::string &revision);
   void OnModemStateChanged(Cellular::ModemState state);
   void OnAccessTechnologiesChanged(uint32 access_technologies);
@@ -386,7 +372,6 @@
   virtual void OnModem3GPPPropertiesChanged(
       const DBusPropertiesMap &properties,
       const std::vector<std::string> &invalidated_properties);
-  void OnImeiChanged(const std::string &imei);
   void On3GPPRegistrationChanged(MMModem3gppRegistrationState state,
                                  const std::string &operator_code,
                                  const std::string &operator_name);
@@ -402,7 +387,6 @@
   void OnSimPropertiesChanged(
       const DBusPropertiesMap &props,
       const std::vector<std::string> &invalidated_properties);
-  void OnImsiChanged(const std::string &imsi);
   void OnSpnChanged(const std::string &spn);
   void OnSimIdentifierChanged(const std::string &id);
   void OnOperatorIdChanged(const std::string &operator_id);
@@ -471,34 +455,16 @@
   std::string sim_identifier_;
   std::string operator_id_;
   mobile_provider *home_provider_info_;
-  bool provider_requires_roaming_;
   std::string desired_network_;
 
   // Properties.
-  std::string carrier_;
-  std::string esn_;
-  std::string firmware_revision_;
-  std::string hardware_revision_;
-  std::string imei_;
-  std::string imsi_;
-  std::string manufacturer_;
-  std::string mdn_;
-  std::string meid_;
-  std::string min_;
-  std::string model_id_;
-  std::string selected_network_;
-  Stringmaps found_networks_;
   std::deque<Stringmap> apn_try_list_;
   bool resetting_;
-  bool scanning_supported_;
   bool scanning_;
   bool scanning_or_searching_;
-  uint16 scan_interval_;
   SimLockStatus sim_lock_status_;
   SubscriptionState subscription_state_;
-  Stringmaps apn_list_;
   std::string sim_path_;
-  bool sim_present_;
   DBus::Path bearer_path_;
   bool reset_done_;
 
diff --git a/cellular_capability_universal_cdma.cc b/cellular_capability_universal_cdma.cc
index f51892f..c6cae61 100644
--- a/cellular_capability_universal_cdma.cc
+++ b/cellular_capability_universal_cdma.cc
@@ -107,7 +107,7 @@
   }
   PendingActivationStore::State state =
       modem_info()->pending_activation_store()->GetActivationState(
-          PendingActivationStore::kIdentifierMEID, meid());
+          PendingActivationStore::kIdentifierMEID, cellular()->meid());
   if (state == PendingActivationStore::kStatePending) {
     SLOG(Cellular, 2) << "There's already a pending activation. Ignoring.";
     return;
@@ -122,7 +122,7 @@
   // during OTA activation.
   modem_info()->pending_activation_store()->SetActivationState(
       PendingActivationStore::kIdentifierMEID,
-      meid(),
+      cellular()->meid(),
       PendingActivationStore::kStatePending);
 
   // Initiate OTA activation.
@@ -141,12 +141,12 @@
   if (IsActivated()) {
     SLOG(Cellular, 3) << "CDMA service activated. Clear store.";
     modem_info()->pending_activation_store()->RemoveEntry(
-        PendingActivationStore::kIdentifierMEID, meid());
+        PendingActivationStore::kIdentifierMEID, cellular()->meid());
     return;
   }
   PendingActivationStore::State state =
       modem_info()->pending_activation_store()->GetActivationState(
-          PendingActivationStore::kIdentifierMEID, meid());
+          PendingActivationStore::kIdentifierMEID, cellular()->meid());
   if (IsActivating() && state != PendingActivationStore::kStateFailureRetry) {
     SLOG(Cellular, 3) << "OTA activation in progress. Nothing to do.";
     return;
@@ -252,10 +252,10 @@
   CellularService::OLP olp;
   olp.CopyFrom(*result);
   string post_data = olp.GetPostData();
-  ReplaceSubstringsAfterOffset(&post_data, 0, "${esn}", esn());
+  ReplaceSubstringsAfterOffset(&post_data, 0, "${esn}", cellular()->esn());
   ReplaceSubstringsAfterOffset(&post_data, 0, "${mdn}",
                                GetMdnForOLP(*cellular_operator));
-  ReplaceSubstringsAfterOffset(&post_data, 0, "${meid}", meid());
+  ReplaceSubstringsAfterOffset(&post_data, 0, "${meid}", cellular()->meid());
   ReplaceSubstringsAfterOffset(&post_data, 0, "${oem}", "GOG2");
   olp.SetPostData(post_data);
   if (cellular()->service().get())
@@ -356,9 +356,9 @@
 
   string value;
   if (DBusProperties::GetString(status_changes, "mdn", &value))
-    set_mdn(value);
+    cellular()->set_mdn(value);
   if (DBusProperties::GetString(status_changes, "min", &value))
-    set_min(value);
+    cellular()->set_min(value);
 
   SLOG(Cellular, 2) << "Activation state: "
                     << GetActivationStateString(activation_state_);
@@ -375,13 +375,13 @@
     LOG(INFO) << "Activation completed successfully.";
     modem_info()->pending_activation_store()->SetActivationState(
         PendingActivationStore::kIdentifierMEID,
-        meid(),
+        cellular()->meid(),
         PendingActivationStore::kStateActivated);
   } else {
     LOG(ERROR) << "Activation failed with error: " << error;
     modem_info()->pending_activation_store()->SetActivationState(
         PendingActivationStore::kIdentifierMEID,
-        meid(),
+        cellular()->meid(),
         PendingActivationStore::kStateFailureRetry);
   }
   UpdatePendingActivationState();
@@ -457,7 +457,7 @@
 bool CellularCapabilityUniversalCDMA::IsActivating() const {
   PendingActivationStore::State state =
       modem_info()->pending_activation_store()->GetActivationState(
-          PendingActivationStore::kIdentifierMEID, meid());
+          PendingActivationStore::kIdentifierMEID, cellular()->meid());
   return (state == PendingActivationStore::kStatePending) ||
       (state == PendingActivationStore::kStateFailureRetry) ||
       (activation_state_ == MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING);
@@ -558,11 +558,11 @@
   if (DBusProperties::GetString(properties,
                                 MM_MODEM_MODEMCDMA_PROPERTY_MEID,
                                 &str_value))
-    set_meid(str_value);
+    cellular()->set_meid(str_value);
   if (DBusProperties::GetString(properties,
                                 MM_MODEM_MODEMCDMA_PROPERTY_ESN,
                                 &str_value))
-    set_esn(str_value);
+    cellular()->set_esn(str_value);
 
   uint32_t sid = sid_;
   uint32_t nid = nid_;
diff --git a/cellular_capability_universal_cdma_unittest.cc b/cellular_capability_universal_cdma_unittest.cc
index c495671..681fd76 100644
--- a/cellular_capability_universal_cdma_unittest.cc
+++ b/cellular_capability_universal_cdma_unittest.cc
@@ -212,23 +212,23 @@
 
   SetUp();
 
-  EXPECT_TRUE(capability_->meid().empty());
-  EXPECT_TRUE(capability_->esn().empty());
+  EXPECT_TRUE(cellular_->meid().empty());
+  EXPECT_TRUE(cellular_->esn().empty());
 
   // Changing properties on wrong interface will not have an effect
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
                                        modem_cdma_properties,
                                        vector<string>());
-  EXPECT_TRUE(capability_->meid().empty());
-  EXPECT_TRUE(capability_->esn().empty());
+  EXPECT_TRUE(cellular_->meid().empty());
+  EXPECT_TRUE(cellular_->esn().empty());
 
   // Changing properties on the right interface gets reflected in the
   // capabilities object
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEMCDMA,
                                        modem_cdma_properties,
                                        vector<string>());
-  EXPECT_EQ(kMeid, capability_->meid());
-  EXPECT_EQ(kEsn, capability_->esn());
+  EXPECT_EQ(kMeid, cellular_->meid());
+  EXPECT_EQ(kEsn, cellular_->esn());
 }
 
 TEST_F(CellularCapabilityUniversalCDMAMainTest, OnCDMARegistrationChanged) {
@@ -375,9 +375,9 @@
   test_olp.SetMethod("POST");
   test_olp.SetPostData("esn=${esn}&mdn=${mdn}&meid=${meid}");
 
-  capability_->esn_ = "0";
-  capability_->mdn_ = "10123456789";
-  capability_->meid_= "4";
+  cellular_->set_esn("0");
+  cellular_->set_mdn("10123456789");
+  cellular_->set_meid("4");
   capability_->sid_ = 1;
 
   string sid_string = base::StringPrintf("%u", capability_->sid_);
diff --git a/cellular_capability_universal_unittest.cc b/cellular_capability_universal_unittest.cc
index 8524834..9c4040c 100644
--- a/cellular_capability_universal_unittest.cc
+++ b/cellular_capability_universal_unittest.cc
@@ -388,7 +388,7 @@
   capability_->StartModem(&error, callback);
 
   EXPECT_TRUE(error.IsOngoing());
-  EXPECT_EQ(kImei, capability_->imei_);
+  EXPECT_EQ(kImei, cellular_->imei());
   EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
 }
 
@@ -427,14 +427,14 @@
   EXPECT_TRUE(error.IsOngoing());
 
   // Verify that the modem has not been enabled.
-  EXPECT_TRUE(capability_->imei_.empty());
+  EXPECT_TRUE(cellular_->imei().empty());
   EXPECT_EQ(0, capability_->access_technologies_);
   Mock::VerifyAndClearExpectations(this);
 
   // Change the state to kModemStateEnabling and verify that it still has not
   // been enabled.
   capability_->OnModemStateChanged(Cellular::kModemStateEnabling);
-  EXPECT_TRUE(capability_->imei_.empty());
+  EXPECT_TRUE(cellular_->imei().empty());
   EXPECT_EQ(0, capability_->access_technologies_);
   Mock::VerifyAndClearExpectations(this);
 
@@ -442,14 +442,14 @@
   // been enabled.
   EXPECT_CALL(*this, TestCallback(_)).Times(0);
   capability_->OnModemStateChanged(Cellular::kModemStateDisabling);
-  EXPECT_TRUE(capability_->imei_.empty());
+  EXPECT_TRUE(cellular_->imei().empty());
   EXPECT_EQ(0, capability_->access_technologies_);
   Mock::VerifyAndClearExpectations(this);
 
   // Change the state of the modem to disabled and verify that it gets enabled.
   EXPECT_CALL(*this, TestCallback(IsSuccess()));
   capability_->OnModemStateChanged(Cellular::kModemStateDisabled);
-  EXPECT_EQ(kImei, capability_->imei_);
+  EXPECT_EQ(kImei, cellular_->imei());
   EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
 }
 
@@ -671,15 +671,15 @@
 
   InitProviderDB();
 
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_FALSE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
 
   capability_->OnSimPathChanged(kSimPath);
-  EXPECT_TRUE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ != NULL);
   EXPECT_EQ(kSimPath, capability_->sim_path_);
 
-  capability_->imsi_ = "";
+  cellular_->set_imsi("");
   capability_->sim_identifier_ = "";
   capability_->operator_id_ = "";
   capability_->spn_ = "";
@@ -689,7 +689,7 @@
   capability_->OnSimLockStatusChanged();
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
-  EXPECT_EQ("", capability_->imsi_);
+  EXPECT_EQ("", cellular_->imsi());
   EXPECT_EQ("", capability_->sim_identifier_);
   EXPECT_EQ("", capability_->operator_id_);
   EXPECT_EQ("", capability_->spn_);
@@ -706,14 +706,14 @@
   capability_->OnSimLockStatusChanged();
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
-  EXPECT_EQ(kImsi, capability_->imsi_);
+  EXPECT_EQ(kImsi, cellular_->imsi());
   EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
   EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
   EXPECT_EQ(kOperatorName, capability_->spn_);
 
   // SIM is missing and SIM path is "/".
   capability_->OnSimPathChanged(CellularCapabilityUniversal::kRootPath);
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_FALSE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
   EXPECT_EQ(CellularCapabilityUniversal::kRootPath, capability_->sim_path_);
 
@@ -722,14 +722,14 @@
   capability_->OnSimLockStatusChanged();
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
-  EXPECT_EQ("", capability_->imsi_);
+  EXPECT_EQ("", cellular_->imsi());
   EXPECT_EQ("", capability_->sim_identifier_);
   EXPECT_EQ("", capability_->operator_id_);
   EXPECT_EQ("", capability_->spn_);
 
   // SIM is missing and SIM path is empty.
   capability_->OnSimPathChanged("");
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_FALSE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
   EXPECT_EQ("", capability_->sim_path_);
 
@@ -738,7 +738,7 @@
   capability_->OnSimLockStatusChanged();
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
-  EXPECT_EQ("", capability_->imsi_);
+  EXPECT_EQ("", cellular_->imsi());
   EXPECT_EQ("", capability_->sim_identifier_);
   EXPECT_EQ("", capability_->operator_id_);
   EXPECT_EQ("", capability_->spn_);
@@ -766,12 +766,13 @@
               GetAll(MM_DBUS_INTERFACE_SIM))
       .WillOnce(Return(sim_properties));
 
-  EXPECT_EQ("", capability_->imei_);
+  EXPECT_EQ("", cellular_->imei());
   EXPECT_EQ(MM_MODEM_ACCESS_TECHNOLOGY_UNKNOWN,
             capability_->access_technologies_);
   EXPECT_FALSE(capability_->sim_proxy_.get());
   EXPECT_CALL(*device_adaptor_, EmitStringChanged(
       kTechnologyFamilyProperty, kTechnologyFamilyGsm));
+  EXPECT_CALL(*device_adaptor_, EmitStringChanged(kImeiProperty, kImei));
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
                                        modem_properties, vector<string>());
   EXPECT_EQ(kAccessTechnologies, capability_->access_technologies_);
@@ -782,14 +783,14 @@
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
                                        modem3gpp_properties,
                                        vector<string>());
-  EXPECT_EQ("", capability_->imei_);
+  EXPECT_EQ("", cellular_->imei());
 
   // Changing properties on the right interface gets reflected in the
   // capabilities object
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM_MODEM3GPP,
                                        modem3gpp_properties,
                                        vector<string>());
-  EXPECT_EQ(kImei, capability_->imei_);
+  EXPECT_EQ(kImei, cellular_->imei());
   Mock::VerifyAndClearExpectations(device_adaptor_);
 
   // Expect to see changes when the family changes
@@ -846,7 +847,7 @@
   EXPECT_EQ(CellularCapabilityUniversal::kGenericServiceNamePrefix,
             cellular_->service_->friendly_name().substr(0, len));
 
-  capability_->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
   capability_->SetHomeProvider();
   EXPECT_EQ("", capability_->spn_);
   EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
@@ -882,7 +883,7 @@
   capability_->InitProxies();
 
   SetService();
-  capability_->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
   capability_->SetHomeProvider();
   cellular_->set_modem_state(Cellular::kModemStateConnected);
   SetRegistrationDroppedUpdateTimeout(0);
@@ -1037,7 +1038,7 @@
   capability_->InitProxies();
   SetService();
 
-  capability_->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
   capability_->SetHomeProvider();
   cellular_->set_modem_state(Cellular::kModemStateRegistered);
   SetRegistrationDroppedUpdateTimeout(0);
@@ -1106,29 +1107,29 @@
               GetActivationState(PendingActivationStore::kIdentifierICCID, _))
       .Times(1);
 
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_FALSE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
   EXPECT_EQ("", capability_->sim_path_);
-  EXPECT_EQ("", capability_->imsi_);
+  EXPECT_EQ("", cellular_->imsi());
   EXPECT_EQ("", capability_->sim_identifier_);
   EXPECT_EQ("", capability_->operator_id_);
   EXPECT_EQ("", capability_->spn_);
 
   capability_->OnSimPathChanged(kSimPath);
-  EXPECT_TRUE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ != NULL);
   EXPECT_EQ(kSimPath, capability_->sim_path_);
-  EXPECT_EQ(kImsi, capability_->imsi_);
+  EXPECT_EQ(kImsi, cellular_->imsi());
   EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
   EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
   EXPECT_EQ(kOperatorName, capability_->spn_);
 
   // Changing to the same SIM path should be a no-op.
   capability_->OnSimPathChanged(kSimPath);
-  EXPECT_TRUE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ != NULL);
   EXPECT_EQ(kSimPath, capability_->sim_path_);
-  EXPECT_EQ(kImsi, capability_->imsi_);
+  EXPECT_EQ(kImsi, cellular_->imsi());
   EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
   EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
   EXPECT_EQ(kOperatorName, capability_->spn_);
@@ -1136,10 +1137,10 @@
   capability_->OnSimPathChanged("");
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
   Mock::VerifyAndClearExpectations(properties_proxy_.get());
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_FALSE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
   EXPECT_EQ("", capability_->sim_path_);
-  EXPECT_EQ("", capability_->imsi_);
+  EXPECT_EQ("", cellular_->imsi());
   EXPECT_EQ("", capability_->sim_identifier_);
   EXPECT_EQ("", capability_->operator_id_);
   EXPECT_EQ("", capability_->spn_);
@@ -1151,19 +1152,19 @@
       .Times(1);
 
   capability_->OnSimPathChanged(kSimPath);
-  EXPECT_TRUE(capability_->sim_present_);
+  EXPECT_TRUE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ != NULL);
   EXPECT_EQ(kSimPath, capability_->sim_path_);
-  EXPECT_EQ(kImsi, capability_->imsi_);
+  EXPECT_EQ(kImsi, cellular_->imsi());
   EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
   EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
   EXPECT_EQ(kOperatorName, capability_->spn_);
 
   capability_->OnSimPathChanged("/");
-  EXPECT_FALSE(capability_->sim_present_);
+  EXPECT_FALSE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
   EXPECT_EQ("/", capability_->sim_path_);
-  EXPECT_EQ("", capability_->imsi_);
+  EXPECT_EQ("", cellular_->imsi());
   EXPECT_EQ("", capability_->sim_identifier_);
   EXPECT_EQ("", capability_->operator_id_);
   EXPECT_EQ("", capability_->spn_);
@@ -1194,7 +1195,7 @@
                                        modem_properties, vector<string>());
   EXPECT_EQ(kSimPath, capability_->sim_path_);
   EXPECT_TRUE(capability_->sim_proxy_.get());
-  EXPECT_EQ(kImsi, capability_->imsi_);
+  EXPECT_EQ(kImsi, cellular_->imsi());
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
   // Updating the SIM
@@ -1215,14 +1216,14 @@
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
                                        new_properties,
                                        vector<string>());
-  EXPECT_EQ(kNewImsi, capability_->imsi_);
+  EXPECT_EQ(kNewImsi, cellular_->imsi());
   EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
   EXPECT_EQ(kOperatorIdentifier, capability_->operator_id_);
   EXPECT_EQ("", capability_->spn_);
   EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
   EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
   EXPECT_EQ(kOperatorIdentifier, cellular_->home_provider().GetCode());
-  EXPECT_EQ(4, capability_->apn_list_.size());
+  EXPECT_EQ(4, cellular_->apn_list().size());
 
   new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
       append_string(kOperatorName);
@@ -1342,8 +1343,8 @@
   Mock::VerifyAndClearExpectations(device_adaptor_);
 
   // Validate that signals are emitted even if an error is reported.
-  capability_->found_networks_.clear();
-  capability_->found_networks_.push_back(Stringmap());
+  Stringmaps found_networks = { Stringmap() };
+  cellular_->set_found_networks(found_networks);
   EXPECT_CALL(*device_adaptor_, EmitBoolChanged(kScanningProperty, false));
   EXPECT_CALL(*device_adaptor_,
               EmitStringmapsChanged(kFoundNetworksProperty, SizeIs(0)));
@@ -1539,11 +1540,11 @@
 
 TEST_F(CellularCapabilityUniversalMainTest, AllowRoaming) {
   EXPECT_FALSE(cellular_->allow_roaming_);
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
   EXPECT_FALSE(capability_->AllowRoaming());
-  capability_->provider_requires_roaming_ = true;
+  cellular_->set_provider_requires_roaming(true);
   EXPECT_TRUE(capability_->AllowRoaming());
-  capability_->provider_requires_roaming_ = false;
+  cellular_->set_provider_requires_roaming(false);
   cellular_->allow_roaming_ = true;
   EXPECT_TRUE(capability_->AllowRoaming());
 }
@@ -1554,14 +1555,14 @@
   static const char kCode[] = "310160";
 
   EXPECT_FALSE(capability_->home_provider_info_);
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   // No mobile provider DB available.
   capability_->SetHomeProvider();
   EXPECT_TRUE(cellular_->home_provider().GetName().empty());
   EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
   EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   InitProviderDB();
 
@@ -1570,7 +1571,7 @@
   EXPECT_TRUE(cellular_->home_provider().GetName().empty());
   EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
   EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   // Operator Code available.
   capability_->operator_id_ = "310240";
@@ -1578,24 +1579,24 @@
   EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
   EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
   EXPECT_EQ("310240", cellular_->home_provider().GetCode());
-  EXPECT_EQ(4, capability_->apn_list_.size());
+  EXPECT_EQ(4, cellular_->apn_list().size());
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   cellular_->home_provider_.SetName("");
   cellular_->home_provider_.SetCountry("");
   cellular_->home_provider_.SetCode("");
 
   // IMSI available
-  capability_->imsi_ = "310240123456789";
+  cellular_->set_imsi("310240123456789");
   capability_->operator_id_.clear();
   capability_->SetHomeProvider();
   EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
   EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
   EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
-  EXPECT_EQ(4, capability_->apn_list_.size());
+  EXPECT_EQ(4, cellular_->apn_list().size());
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   Cellular::Operator oper;
   cellular_->set_home_provider(oper);
@@ -1604,7 +1605,7 @@
   EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
   EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
   EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
-  EXPECT_FALSE(capability_->provider_requires_roaming_);
+  EXPECT_FALSE(cellular_->provider_requires_roaming());
 
   static const char kCubic[] = "Cubic";
   capability_->spn_ = kCubic;
@@ -1612,7 +1613,7 @@
   EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
   EXPECT_EQ("", cellular_->home_provider().GetCode());
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(capability_->provider_requires_roaming_);
+  EXPECT_TRUE(cellular_->provider_requires_roaming());
 
   static const char kCUBIC[] = "CUBIC";
   capability_->spn_ = kCUBIC;
@@ -1621,7 +1622,7 @@
   EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
   EXPECT_EQ("", cellular_->home_provider().GetCode());
   ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(capability_->provider_requires_roaming_);
+  EXPECT_TRUE(cellular_->provider_requires_roaming());
 }
 
 TEST_F(CellularCapabilityUniversalMainTest, UpdateScanningProperty) {
@@ -1672,7 +1673,7 @@
 
   // Modem with an unactivated service in the 'enabled' or 'searching' state
   capability_->cellular()->modem_state_ = Cellular::kModemStateEnabled;
-  capability_->mdn_ = "0000000000";
+  cellular_->set_mdn("0000000000");
   CellularService::OLP olp;
   EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
       .WillRepeatedly(Return(&olp));
@@ -1775,8 +1776,8 @@
                              default_identifier_pattern));
   Mock::VerifyAndClearExpectations(modem_info_.mock_cellular_operator_info());
 
-  // |capability_->imsi_| is not ""
-  capability_->imsi_ = "TESTIMSI";
+  // |cellular_->imsi_| is not ""
+  cellular_->set_imsi("TESTIMSI");
   EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
       GetCellularOperatorByMCCMNC(capability_->operator_id_))
       .WillOnce(Return(nullptr));
@@ -1808,23 +1809,23 @@
       CellularCapabilityUniversal::kSubscriptionStateUnknown;
 
   cellular_operator.identifier_ = "vzw";
-  capability_->mdn_ = "";
+  cellular_->set_mdn("");
   EXPECT_EQ("0000000000", capability_->GetMdnForOLP(cellular_operator));
-  capability_->mdn_ = "0123456789";
+  cellular_->set_mdn("0123456789");
   EXPECT_EQ("0123456789", capability_->GetMdnForOLP(cellular_operator));
-  capability_->mdn_ = "10123456789";
+  cellular_->set_mdn("10123456789");
   EXPECT_EQ("0123456789", capability_->GetMdnForOLP(cellular_operator));
-  capability_->mdn_ = "1021232333";
+  cellular_->set_mdn("1021232333");
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnprovisioned;
   EXPECT_EQ("0000000000", capability_->GetMdnForOLP(cellular_operator));
 
   cellular_operator.identifier_ = "foo";
-  capability_->mdn_ = "";
+  cellular_->set_mdn("");
   EXPECT_EQ("", capability_->GetMdnForOLP(cellular_operator));
-  capability_->mdn_ = "0123456789";
+  cellular_->set_mdn("0123456789");
   EXPECT_EQ("0123456789", capability_->GetMdnForOLP(cellular_operator));
-  capability_->mdn_ = "10123456789";
+  cellular_->set_mdn("10123456789");
   EXPECT_EQ("10123456789", capability_->GetMdnForOLP(cellular_operator));
 }
 
@@ -1837,10 +1838,10 @@
   test_olp.SetPostData("imei=${imei}&imsi=${imsi}&mdn=${mdn}&"
                        "min=${min}&iccid=${iccid}");
 
-  capability_->imei_ = "1";
-  capability_->imsi_ = "2";
-  capability_->mdn_ = "10123456789";
-  capability_->min_ = "5";
+  cellular_->set_imei("1");
+  cellular_->set_imsi("2");
+  cellular_->set_mdn("10123456789");
+  cellular_->set_min("5");
   capability_->sim_identifier_ = "6";
   capability_->operator_id_ = "123456";
 
@@ -1870,20 +1871,20 @@
 }
 
 TEST_F(CellularCapabilityUniversalMainTest, IsMdnValid) {
-  capability_->mdn_.clear();
+  cellular_->set_mdn("");
   EXPECT_FALSE(capability_->IsMdnValid());
-  capability_->mdn_ = "0000000";
+  cellular_->set_mdn("0000000");
   EXPECT_FALSE(capability_->IsMdnValid());
-  capability_->mdn_ = "0000001";
+  cellular_->set_mdn("0000001");
   EXPECT_TRUE(capability_->IsMdnValid());
-  capability_->mdn_ = "1231223";
+  cellular_->set_mdn("1231223");
   EXPECT_TRUE(capability_->IsMdnValid());
 }
 
 TEST_F(CellularCapabilityUniversalTimerTest, CompleteActivation) {
   const char kIccid[] = "1234567";
 
-  capability_->mdn_.clear();
+  cellular_->set_mdn("");
   capability_->sim_identifier_.clear();
 
   EXPECT_CALL(*service_, SetActivationState(kActivationStateActivating))
@@ -1925,7 +1926,7 @@
   EXPECT_CALL(*service_, SetActivationState(kActivationStateActivating))
       .Times(0);
   EXPECT_CALL(mock_dispatcher_, PostDelayedTask(_, _)).Times(0);
-  capability_->mdn_ = "1231231212";
+  cellular_->set_mdn("1231231212");
   capability_->CompleteActivation(&error);
 }
 
@@ -1934,7 +1935,7 @@
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnprovisioned;
   capability_->sim_identifier_.clear();
-  capability_->mdn_ = "0000000000";
+  cellular_->set_mdn("0000000000");
   CellularService::OLP olp;
   EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
       .WillRepeatedly(Return(&olp));
@@ -1946,7 +1947,7 @@
   Mock::VerifyAndClearExpectations(service_);
   EXPECT_FALSE(service_->auto_connect());
 
-  capability_->mdn_ = "1231231122";
+  cellular_->set_mdn("1231231122");
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnknown;
   EXPECT_CALL(*service_, SetActivationState(kActivationStateActivated))
@@ -1956,7 +1957,7 @@
   EXPECT_TRUE(service_->auto_connect());
 
   service_->SetAutoConnect(false);
-  capability_->mdn_ = "0000000000";
+  cellular_->set_mdn("0000000000");
   capability_->sim_identifier_ = kIccid;
   EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
               GetActivationState(PendingActivationStore::kIdentifierICCID,
@@ -1986,7 +1987,7 @@
   // SubscriptionStateUnprovisioned overrides valid MDN.
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnprovisioned;
-  capability_->mdn_ = "1231231122";
+  cellular_->set_mdn("1231231122");
   capability_->sim_identifier_.clear();
   service_->SetAutoConnect(false);
   EXPECT_CALL(*service_, SetActivationState(kActivationStateNotActivated))
@@ -1998,7 +1999,7 @@
   // SubscriptionStateProvisioned overrides invalid MDN.
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateProvisioned;
-  capability_->mdn_ = "0000000000";
+  cellular_->set_mdn("0000000000");
   capability_->sim_identifier_.clear();
   service_->SetAutoConnect(false);
   EXPECT_CALL(*service_, SetActivationState(kActivationStateActivated))
@@ -2020,7 +2021,7 @@
 
   // No ICCID, no MDN
   capability_->sim_identifier_.clear();
-  capability_->mdn_.clear();
+  cellular_->set_mdn("");
   capability_->reset_done_ = false;
   capability_->OnActivationWaitForRegisterTimeout();
 
@@ -2033,11 +2034,11 @@
   capability_->OnActivationWaitForRegisterTimeout();
 
   // Valid MDN.
-  capability_->mdn_ = "0000000001";
+  cellular_->set_mdn("0000000001");
   capability_->OnActivationWaitForRegisterTimeout();
 
   // Invalid MDN, reset done.
-  capability_->mdn_ = "0000000000";
+  cellular_->set_mdn("0000000000");
   capability_->reset_done_ = true;
   capability_->OnActivationWaitForRegisterTimeout();
 
@@ -2067,7 +2068,7 @@
       MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
 
   // No MDN, no ICCID.
-  capability_->mdn_ = "0000000";
+  cellular_->set_mdn("0000000");
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnknown;
   capability_->sim_identifier_.clear();
@@ -2078,7 +2079,7 @@
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
   // Valid MDN, but subsciption_state_ Unprovisioned
-  capability_->mdn_ = "1234567";
+  cellular_->set_mdn("1234567");
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnprovisioned;
   capability_->sim_identifier_.clear();
@@ -2162,14 +2163,14 @@
 
   // Got valid MDN, subscription_state_ is kSubscriptionStateUnknown
   cellular_->state_ = Cellular::kStateRegistered;
-  capability_->mdn_ = "1020304";
+  cellular_->set_mdn("1020304");
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnknown;
   capability_->UpdatePendingActivationState();
 
   // Got invalid MDN, subscription_state_ is kSubscriptionStateProvisioned
   cellular_->state_ = Cellular::kStateRegistered;
-  capability_->mdn_ = "0000000";
+  cellular_->set_mdn("0000000");
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateProvisioned;
   capability_->UpdatePendingActivationState();
@@ -2178,7 +2179,7 @@
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
   // Timed out, not registered.
-  capability_->mdn_.clear();
+  cellular_->set_mdn("");
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnknown;
   EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
@@ -2293,7 +2294,7 @@
 
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateUnknown;
-  capability_->mdn_ = "0000000000";
+  cellular_->set_mdn("0000000000");
   EXPECT_FALSE(capability_->IsServiceActivationRequired());
 
   CellularService::OLP olp;
@@ -2302,11 +2303,11 @@
       .WillRepeatedly(Return(&olp));
   EXPECT_FALSE(capability_->IsServiceActivationRequired());
 
-  capability_->mdn_ = "";
+  cellular_->set_mdn("");
   EXPECT_TRUE(capability_->IsServiceActivationRequired());
-  capability_->mdn_ = "1234567890";
+  cellular_->set_mdn("1234567890");
   EXPECT_FALSE(capability_->IsServiceActivationRequired());
-  capability_->mdn_ = "0000000000";
+  cellular_->set_mdn("0000000000");
   EXPECT_TRUE(capability_->IsServiceActivationRequired());
 
   const char kIccid[] = "1234567890";
@@ -2326,41 +2327,41 @@
 }
 
 TEST_F(CellularCapabilityUniversalMainTest, OnModemCurrentCapabilitiesChanged) {
-  EXPECT_FALSE(capability_->scanning_supported_);
+  EXPECT_FALSE(cellular_->scanning_supported());
   capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_LTE);
-  EXPECT_FALSE(capability_->scanning_supported_);
+  EXPECT_FALSE(cellular_->scanning_supported());
   capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_CDMA_EVDO);
-  EXPECT_FALSE(capability_->scanning_supported_);
+  EXPECT_FALSE(cellular_->scanning_supported());
   capability_->OnModemCurrentCapabilitiesChanged(MM_MODEM_CAPABILITY_GSM_UMTS);
-  EXPECT_TRUE(capability_->scanning_supported_);
+  EXPECT_TRUE(cellular_->scanning_supported());
   capability_->OnModemCurrentCapabilitiesChanged(
       MM_MODEM_CAPABILITY_GSM_UMTS | MM_MODEM_CAPABILITY_CDMA_EVDO);
-  EXPECT_TRUE(capability_->scanning_supported_);
+  EXPECT_TRUE(cellular_->scanning_supported());
 }
 
 TEST_F(CellularCapabilityUniversalMainTest, GetNetworkTechnologyStringOnE362) {
-  capability_->model_id_.clear();
+  cellular_->set_model_id("");;
   capability_->access_technologies_ = 0;
   EXPECT_TRUE(capability_->GetNetworkTechnologyString().empty());
 
-  capability_->model_id_ = CellularCapabilityUniversal::kE362ModelId;
+  cellular_->set_model_id(CellularCapabilityUniversal::kE362ModelId);
   EXPECT_EQ(kNetworkTechnologyLte, capability_->GetNetworkTechnologyString());
 
   capability_->access_technologies_ = MM_MODEM_ACCESS_TECHNOLOGY_GPRS;
   EXPECT_EQ(kNetworkTechnologyLte, capability_->GetNetworkTechnologyString());
 
-  capability_->model_id_.clear();
+  cellular_->set_model_id("");;
   EXPECT_EQ(kNetworkTechnologyGprs, capability_->GetNetworkTechnologyString());
 }
 
 TEST_F(CellularCapabilityUniversalMainTest, GetOutOfCreditsDetectionType) {
-  capability_->model_id_.clear();
+  cellular_->set_model_id("");;
   EXPECT_EQ(OutOfCreditsDetector::OOCTypeNone,
             capability_->GetOutOfCreditsDetectionType());
-  capability_->model_id_ = CellularCapabilityUniversal::kALT3100ModelId;
+  cellular_->set_model_id(CellularCapabilityUniversal::kALT3100ModelId);
   EXPECT_EQ(OutOfCreditsDetector::OOCTypeSubscriptionState,
             capability_->GetOutOfCreditsDetectionType());
-  capability_->model_id_ = CellularCapabilityUniversal::kE362ModelId;
+  cellular_->set_model_id(CellularCapabilityUniversal::kE362ModelId);
   EXPECT_EQ(OutOfCreditsDetector::OOCTypeActivePassive,
             capability_->GetOutOfCreditsDetectionType());
 }
diff --git a/cellular_service_unittest.cc b/cellular_service_unittest.cc
index 70add10..c80ae1e 100644
--- a/cellular_service_unittest.cc
+++ b/cellular_service_unittest.cc
@@ -156,7 +156,7 @@
 
 TEST_F(CellularServiceTest, FriendlyName) {
   static const char kCarrier[] = "Cellular Carrier";
-  GetCapabilityCDMA()->carrier_ = kCarrier;
+  device_->set_carrier(kCarrier);
   service_ = new CellularService(&modem_info_, device_);
   EXPECT_EQ(kCarrier, GetFriendlyName());
 }
diff --git a/cellular_unittest.cc b/cellular_unittest.cc
index ebc767a..b288299 100644
--- a/cellular_unittest.cc
+++ b/cellular_unittest.cc
@@ -622,8 +622,8 @@
   Error error;
   device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
   dispatcher_.DispatchPendingEvents();
-  EXPECT_EQ(kMEID, GetCapabilityClassic()->meid_);
-  EXPECT_EQ(kTestCarrier, GetCapabilityClassic()->carrier_);
+  EXPECT_EQ(kMEID, device_->meid());
+  EXPECT_EQ(kTestCarrier, device_->carrier());
   EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
   ASSERT_TRUE(device_->service_.get());
   EXPECT_EQ(kNetworkTechnology1Xrtt, device_->service_->network_technology());
@@ -669,10 +669,10 @@
   device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
   EXPECT_TRUE(error.IsSuccess());
   dispatcher_.DispatchPendingEvents();
-  EXPECT_EQ(kIMEI, GetCapabilityGSM()->imei_);
-  EXPECT_EQ(kIMSI, GetCapabilityGSM()->imsi_);
+  EXPECT_EQ(kIMEI, device_->imei());
+  EXPECT_EQ(kIMSI, device_->imsi());
   EXPECT_EQ(kTestCarrierSPN, GetCapabilityGSM()->spn_);
-  EXPECT_EQ(kMSISDN, GetCapabilityGSM()->mdn_);
+  EXPECT_EQ(kMSISDN, device_->mdn());
   EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
   ASSERT_TRUE(device_->service_.get());
   EXPECT_EQ(kNetworkTechnologyEdge, device_->service_->network_technology());
@@ -689,7 +689,7 @@
       .WillOnce(Return(true));
   SetCellularType(Cellular::kTypeCDMA);
   device_->set_modem_state(Cellular::kModemStateConnected);
-  GetCapabilityClassic()->meid_ = kMEID;
+  device_->set_meid(kMEID);
   ExpectCdmaStartModem(kNetworkTechnologyEvdo);
   Error error;
   device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
@@ -703,7 +703,7 @@
       .WillOnce(DoAll(SetArgumentPointee<1>(IFF_UP), Return(true)));
   SetCellularType(Cellular::kTypeCDMA);
   device_->set_modem_state(Cellular::kModemStateConnected);
-  GetCapabilityClassic()->meid_ = kMEID;
+  device_->set_meid(kMEID);
   ExpectCdmaStartModem(kNetworkTechnologyEvdo);
   EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _, _))
       .WillOnce(Return(dhcp_config_));
@@ -901,7 +901,7 @@
   SetCellularType(Cellular::kTypeUniversal);
 
   // Service activation is needed
-  GetCapabilityUniversal()->mdn_ = "0000000000";
+  device_->set_mdn("0000000000");
   CellularService::OLP olp;
   EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
       .WillRepeatedly(Return(&olp));
diff --git a/device_dbus_adaptor.cc b/device_dbus_adaptor.cc
index 49f22e4..6f96827 100644
--- a/device_dbus_adaptor.cc
+++ b/device_dbus_adaptor.cc
@@ -60,6 +60,12 @@
   PropertyChanged(name, DBusAdaptor::StringToVariant(value));
 }
 
+void DeviceDBusAdaptor::EmitStringmapChanged(const std::string &name,
+                                             const Stringmap &value) {
+  SLOG(DBus, 2) << __func__ << ": " << name;
+  PropertyChanged(name, DBusAdaptor::StringmapToVariant(value));
+}
+
 void DeviceDBusAdaptor::EmitStringmapsChanged(const std::string &name,
                                               const Stringmaps &value) {
   SLOG(DBus, 2) << __func__ << ": " << name;
diff --git a/device_dbus_adaptor.h b/device_dbus_adaptor.h
index 0663d0b..a7e4282 100644
--- a/device_dbus_adaptor.h
+++ b/device_dbus_adaptor.h
@@ -39,6 +39,8 @@
   virtual void EmitIntChanged(const std::string& name, int value);
   virtual void EmitStringChanged(const std::string& name,
                                  const std::string& value);
+  virtual void EmitStringmapChanged(const std::string &name,
+                                    const Stringmap &value);
   virtual void EmitStringmapsChanged(const std::string &name,
                                      const Stringmaps &value);
   virtual void EmitKeyValueStoreChanged(const std::string &name,
diff --git a/mock_adaptors.h b/mock_adaptors.h
index 6ea3461..e106c93 100644
--- a/mock_adaptors.h
+++ b/mock_adaptors.h
@@ -30,6 +30,8 @@
   MOCK_METHOD2(EmitIntChanged, void(const std::string &name, int value));
   MOCK_METHOD2(EmitStringChanged, void(const std::string &name,
                                        const std::string &value));
+  MOCK_METHOD2(EmitStringmapChanged, void(const std::string &name,
+                                          const Stringmap &value));
   MOCK_METHOD2(EmitStringmapsChanged, void(const std::string &name,
                                            const Stringmaps &value));
   MOCK_METHOD2(EmitKeyValueStoreChanged, void(const std::string &name,