shill: cellular: Remove old code paths to update operator information.

Old code paths that updated the |Cellular::home_operator| property and the
|CellularService::serving_operator| property are obsolete, now that these
properties are updated using the MobileOperatorInfo objects. This CL deletes old
code paths. Additionally, it
- deletes/updates related tests from capabilities.
- Adds a test to |Cellular| that tests the logic for choosing the home provider
  / serving operator.

BUG=chromium:352243
TEST=- Run shill_unittest.
     - Test that home provider and serving operator are set correctly on devices
       that use the different capabilities.
CQ-DEPEND=CL:198330

Change-Id: I7cd095286f1d41fd23b3a0cc3a2d46ccf3f1e639
Reviewed-on: https://chromium-review.googlesource.com/198322
Reviewed-by: Thieu Le <thieule@chromium.org>
Commit-Queue: Prathmesh Prabhu <pprabhu@chromium.org>
Tested-by: Prathmesh Prabhu <pprabhu@chromium.org>
diff --git a/cellular.h b/cellular.h
index 690118a..0599d65 100644
--- a/cellular.h
+++ b/cellular.h
@@ -337,19 +337,13 @@
   FRIEND_TEST(CellularCapabilityTest, GetModemInfo);
   FRIEND_TEST(CellularCapabilityTest, GetModemStatus);
   FRIEND_TEST(CellularCapabilityUniversalCDMATest, OnCDMARegistrationChanged);
-  FRIEND_TEST(CellularCapabilityUniversalCDMATest, UpdateOLP);
-  FRIEND_TEST(CellularCapabilityUniversalCDMATest, UpdateOperatorInfo);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, AllowRoaming);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, Connect);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, IsServiceActivationRequired);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest, SetHomeProvider);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, StartModemAlreadyEnabled);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, StopModemConnected);
   FRIEND_TEST(CellularCapabilityUniversalMainTest,
               UpdatePendingActivationState);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOLP);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest,
-              UpdateOperatorInfoViaOperatorId);
   FRIEND_TEST(CellularCapabilityUniversalMainTest,
               UpdateRegistrationState);
   FRIEND_TEST(CellularCapabilityUniversalMainTest,
@@ -357,7 +351,6 @@
   FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateScanningProperty);
   FRIEND_TEST(CellularCapabilityUniversalMainTest,
               UpdateServiceActivationState);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateServiceName);
   FRIEND_TEST(CellularTest, ChangeServiceState);
   FRIEND_TEST(CellularTest, ChangeServiceStatePPP);
   FRIEND_TEST(CellularTest, CreateService);
@@ -376,8 +369,10 @@
   FRIEND_TEST(CellularTest, EstablishLinkDHCP);
   FRIEND_TEST(CellularTest, EstablishLinkPPP);
   FRIEND_TEST(CellularTest, EstablishLinkStatic);
+  FRIEND_TEST(CellularTest, FriendlyServiceName);
   FRIEND_TEST(CellularTest,
               HandleNewRegistrationStateForServiceRequiringActivation);
+  FRIEND_TEST(CellularTest, HomeProviderServingOperator);
   FRIEND_TEST(CellularTest, LinkEventUpWithPPP);
   FRIEND_TEST(CellularTest, LinkEventUpWithoutPPP);
   FRIEND_TEST(CellularTest, LinkEventWontDestroyService);
@@ -399,7 +394,6 @@
   FRIEND_TEST(CellularTest, ScanAsynchronousFailure);
   FRIEND_TEST(CellularTest, ScanImmediateFailure);
   FRIEND_TEST(CellularTest, ScanSuccess);
-  FRIEND_TEST(CellularTest, ServiceFriendlyName);
   FRIEND_TEST(CellularTest, SetAllowRoaming);
   FRIEND_TEST(CellularTest, StartModemCallback);
   FRIEND_TEST(CellularTest, StartModemCallbackFail);
diff --git a/cellular_capability_cdma.cc b/cellular_capability_cdma.cc
index 74e273b..8805bda 100644
--- a/cellular_capability_cdma.cc
+++ b/cellular_capability_cdma.cc
@@ -96,7 +96,6 @@
 void CellularCapabilityCDMA::OnServiceCreated() {
   SLOG(Cellular, 2) << __func__;
   cellular()->service()->SetUsageURL(usage_url_);
-  UpdateServingOperator();
   HandleNewActivationState(MM_MODEM_CDMA_ACTIVATION_ERROR_NO_ERROR);
 }
 
@@ -320,13 +319,6 @@
   proxy_->GetRegistrationState(NULL, callback, kTimeoutDefault);
 }
 
-void CellularCapabilityCDMA::UpdateServingOperator() {
-  SLOG(Cellular, 2) << __func__;
-  if (cellular()->service().get()) {
-    cellular()->service()->SetServingOperator(cellular()->home_provider());
-  }
-}
-
 void CellularCapabilityCDMA::OnActivateReply(
     const ResultCallback &callback, uint32 status, const Error &error) {
   activation_starting_ = false;
diff --git a/cellular_capability_cdma.h b/cellular_capability_cdma.h
index 916248d..051cefa 100644
--- a/cellular_capability_cdma.h
+++ b/cellular_capability_cdma.h
@@ -77,9 +77,6 @@
 
   void HandleNewActivationState(uint32 error);
 
-  // Updates the serving operator on the active service.
-  void UpdateServingOperator();
-
   static std::string GetActivationStateString(uint32 state);
   static std::string GetActivationErrorString(uint32 error);
 
diff --git a/cellular_capability_classic.cc b/cellular_capability_classic.cc
index aece7d3..39265c3 100644
--- a/cellular_capability_classic.cc
+++ b/cellular_capability_classic.cc
@@ -310,6 +310,11 @@
   callback.Run(error);
 }
 
+void CellularCapabilityClassic::UpdateStatus(
+    const DBusPropertiesMap &properties) {
+  SLOG(Cellular, 3) << __func__;
+}
+
 void CellularCapabilityClassic::OnGetModemInfoReply(
     const ResultCallback &callback,
     const ModemHardwareInfo &info,
diff --git a/cellular_capability_classic.h b/cellular_capability_classic.h
index f9b6e2c..b2838b7 100644
--- a/cellular_capability_classic.h
+++ b/cellular_capability_classic.h
@@ -93,7 +93,9 @@
   void FinishDisable(const ResultCallback &callback);
   virtual void InitProxies();
   virtual void ReleaseProxies();
-  virtual void UpdateStatus(const DBusPropertiesMap &properties) = 0;
+
+  // Default implementation is no-op.
+  virtual void UpdateStatus(const DBusPropertiesMap &properties);
 
   // Runs the next task in a list.
   // Precondition: |tasks| is not empty.
diff --git a/cellular_capability_classic_unittest.cc b/cellular_capability_classic_unittest.cc
index eec7525..84a62a8 100644
--- a/cellular_capability_classic_unittest.cc
+++ b/cellular_capability_classic_unittest.cc
@@ -82,12 +82,28 @@
     capability_->proxy_factory_ = NULL;
   }
 
-  void SetService() {
-    cellular_->service_ = new CellularService(&modem_info_, cellular_);
-  }
+  void CreateService() {
+    // The following constants are never directly accessed by the tests.
+    const char kStorageIdentifier[] = "default_test_storage_id";
+    const char kFriendlyServiceName[] = "default_test_service_name";
+    const char kOperatorCode[] = "10010";
+    const char kOperatorName[] = "default_test_operator_name";
+    const char kOperatorCountry[] = "us";
 
-  void InitProviderDB() {
-    modem_info_.SetProviderDB(kTestMobileProviderDBPath);
+    // Simulate all the side-effects of Cellular::CreateService
+    auto service = new CellularService(&modem_info_, cellular_);
+    service->SetStorageIdentifier(kStorageIdentifier);
+    service->SetFriendlyName(kFriendlyServiceName);
+
+    Cellular::Operator oper;
+    oper.SetCode(kOperatorCode);
+    oper.SetName(kOperatorName);
+    oper.SetCountry(kOperatorCountry);
+
+    service->SetServingOperator(oper);
+
+    cellular_->set_home_provider(oper);
+    cellular_->service_ = service;
   }
 
   CellularCapabilityGSM *GetGsmCapability() {
@@ -364,12 +380,75 @@
 
 TEST_F(CellularCapabilityTest, TryApns) {
   static const string kLastGoodApn("remembered.apn");
+  static const string kLastGoodUsername("remembered.user");
   static const string kSuppliedApn("my.apn");
   static const string kTmobileApn1("epc.tmobile.com");
   static const string kTmobileApn2("wap.voicestream.com");
   static const string kTmobileApn3("internet2.voicestream.com");
   static const string kTmobileApn4("internet3.voicestream.com");
+  const Stringmaps kDatabaseApnList {{{ kApnProperty, kTmobileApn1 }},
+                                     {{ kApnProperty, kTmobileApn2 }},
+                                     {{ kApnProperty, kTmobileApn3 }},
+                                     {{ kApnProperty, kTmobileApn4 }}};
 
+
+  CreateService();
+  // Supply the database APNs to |cellular_| object.
+  cellular_->set_apn_list(kDatabaseApnList);
+  ProfileRefPtr profile(new NiceMock<MockProfile>(
+      modem_info_.control_interface(), modem_info_.metrics(),
+      modem_info_.manager()));
+  cellular_->service()->set_profile(profile);
+
+  Error error;
+  Stringmap apn_info;
+  DBusPropertiesMap props;
+  CellularCapabilityGSM *gsm_capability = GetGsmCapability();
+
+  apn_info[kApnProperty] = kLastGoodApn;
+  apn_info[kApnUsernameProperty] = kLastGoodUsername;
+  cellular_->service()->SetLastGoodApn(apn_info);
+  props.clear();
+  EXPECT_TRUE(props.find(kApnProperty) == props.end());
+  gsm_capability->SetupConnectProperties(&props);
+  // We expect the list to contain the last good APN, plus
+  // the 4 APNs from the mobile provider info database.
+  EXPECT_EQ(5, gsm_capability->apn_try_list_.size());
+  EXPECT_FALSE(props.find(kApnProperty) == props.end());
+  EXPECT_EQ(kLastGoodApn, props[kApnProperty].reader().get_string());
+  EXPECT_FALSE(props.find(kApnUsernameProperty) == props.end());
+  EXPECT_EQ(kLastGoodUsername,
+            props[kApnUsernameProperty].reader().get_string());
+
+  apn_info.clear();
+  props.clear();
+  apn_info[kApnProperty] = kSuppliedApn;
+  // Setting the APN has the side effect of clearing the LastGoodApn,
+  // so the try list will have 5 elements, with the first one being
+  // the supplied APN.
+  cellular_->service()->SetApn(apn_info, &error);
+  EXPECT_TRUE(props.find(kApnProperty) == props.end());
+  gsm_capability->SetupConnectProperties(&props);
+  EXPECT_EQ(5, gsm_capability->apn_try_list_.size());
+  EXPECT_FALSE(props.find(kApnProperty) == props.end());
+  EXPECT_EQ(kSuppliedApn, props[kApnProperty].reader().get_string());
+
+  apn_info.clear();
+  props.clear();
+  apn_info[kApnProperty] = kLastGoodApn;
+  apn_info[kApnUsernameProperty] = kLastGoodUsername;
+  // Now when LastGoodAPN is set, it will be the one selected.
+  cellular_->service()->SetLastGoodApn(apn_info);
+  EXPECT_TRUE(props.find(kApnProperty) == props.end());
+  gsm_capability->SetupConnectProperties(&props);
+  // We expect the list to contain the last good APN, plus
+  // the user-supplied APN, plus the 4 APNs from the mobile
+  // provider info database.
+  EXPECT_EQ(6, gsm_capability->apn_try_list_.size());
+  EXPECT_FALSE(props.find(kApnProperty) == props.end());
+  EXPECT_EQ(kLastGoodApn, props[kApnProperty].reader().get_string());
+
+  // Now try all the given APNs.
   using testing::InSequence;
   {
     InSequence dummy;
@@ -381,36 +460,8 @@
     EXPECT_CALL(*simple_proxy_, Connect(HasApn(kTmobileApn4), _, _, _));
     EXPECT_CALL(*simple_proxy_, Connect(HasNoApn(), _, _, _));
   }
-  CellularCapabilityGSM *gsm_capability = GetGsmCapability();
-  SetService();
-  cellular_->set_imsi("310240123456789");
-  InitProviderDB();
-  gsm_capability->SetHomeProvider();
-  ProfileRefPtr profile(new NiceMock<MockProfile>(
-      modem_info_.control_interface(), modem_info_.metrics(),
-      modem_info_.manager()));
-  cellular_->service()->set_profile(profile);
-
-  Error error;
-  Stringmap apn_info;
-  DBusPropertiesMap props;
-  apn_info[kApnProperty] = kSuppliedApn;
-  cellular_->service()->SetApn(apn_info, &error);
-
-  apn_info.clear();
-  apn_info[kApnProperty] = kLastGoodApn;
-  cellular_->service()->SetLastGoodApn(apn_info);
-
-  capability_->SetupConnectProperties(&props);
-  // We expect the list to contain the last good APN, plus
-  // the user-supplied APN, plus the 4 APNs from the mobile
-  // provider info database.
-  EXPECT_EQ(6, gsm_capability->apn_try_list_.size());
-  EXPECT_FALSE(props.find(kApnProperty) == props.end());
-  EXPECT_EQ(kLastGoodApn, props[kApnProperty].reader().get_string());
-
   SetSimpleProxy();
-  capability_->Connect(props, &error, ResultCallback());
+  gsm_capability->Connect(props, &error, ResultCallback());
   Error cerror(Error::kInvalidApn);
   gsm_capability->OnConnectReply(ResultCallback(), cerror);
   EXPECT_EQ(5, gsm_capability->apn_try_list_.size());
diff --git a/cellular_capability_gsm.cc b/cellular_capability_gsm.cc
index e1ae2a1..2e0cac2 100644
--- a/cellular_capability_gsm.cc
+++ b/cellular_capability_gsm.cc
@@ -210,13 +210,6 @@
 
 void CellularCapabilityGSM::OnServiceCreated() {
   cellular()->service()->SetActivationState(kActivationStateActivated);
-  UpdateServingOperator();
-}
-
-void CellularCapabilityGSM::UpdateStatus(const DBusPropertiesMap &properties) {
-  if (ContainsKey(properties, kModemPropertyIMSI)) {
-    SetHomeProvider();
-  }
 }
 
 // Create the list of APNs to try, in the following order:
@@ -424,123 +417,6 @@
   callback.Run(Error());
 }
 
-void CellularCapabilityGSM::SetHomeProvider() {
-  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()) {
-    return;
-  }
-  mobile_provider *provider_info =
-      mobile_provider_lookup_best_match(
-          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;
-  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]);
-  }
-  if (*provider_info->country) {
-    oper.SetCountry(provider_info->country);
-  }
-  if (spn_.empty()) {
-    const char *name = mobile_provider_get_name(provider_info);
-    if (name) {
-      oper.SetName(name);
-    }
-  } else {
-    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()
-                    << (roaming_required ? ", roaming required" : "");
-  InitAPNList();
-}
-
-void CellularCapabilityGSM::UpdateOperatorInfo() {
-  SLOG(Cellular, 2) << __func__;
-  const string &network_id = serving_operator_.GetCode();
-  if (!network_id.empty()) {
-    SLOG(Cellular, 2) << "Looking up network id: " << network_id;
-    mobile_provider *provider =
-        mobile_provider_lookup_by_network(modem_info()->provider_db(),
-                                          network_id.c_str());
-    if (provider) {
-      if (serving_operator_.GetName().empty()) {
-        const char *provider_name = mobile_provider_get_name(provider);
-        if (provider_name && *provider_name) {
-          serving_operator_.SetName(provider_name);
-        }
-      }
-      if (*provider->country) {
-        serving_operator_.SetCountry(provider->country);
-      }
-      SLOG(Cellular, 2) << "Operator name: " << serving_operator_.GetName()
-                        << ", country: " << serving_operator_.GetCountry();
-    } else {
-      SLOG(Cellular, 2) << "GSM provider not found.";
-    }
-  }
-  UpdateServingOperator();
-}
-
-void CellularCapabilityGSM::UpdateServingOperator() {
-  SLOG(Cellular, 2) << __func__;
-  if (cellular()->service().get()) {
-    cellular()->service()->SetServingOperator(serving_operator_);
-  }
-}
-
-void CellularCapabilityGSM::InitAPNList() {
-  SLOG(Cellular, 2) << __func__;
-  Stringmaps apn_list;
-  if (!home_provider_info_) {
-    return;
-  }
-  for (int i = 0; i < home_provider_info_->num_apns; ++i) {
-    Stringmap props;
-    mobile_apn *apn = home_provider_info_->apns[i];
-    if (apn->value) {
-      props[kApnProperty] = apn->value;
-    }
-    if (apn->username) {
-      props[kApnUsernameProperty] = apn->username;
-    }
-    if (apn->password) {
-      props[kApnPasswordProperty] = apn->password;
-    }
-    // Find the first localized and non-localized name, if any.
-    const localized_name *lname = NULL;
-    const localized_name *name = NULL;
-    for (int j = 0; j < apn->num_names; ++j) {
-      if (apn->names[j]->lang) {
-        if (!lname) {
-          lname = apn->names[j];
-        }
-      } else if (!name) {
-        name = apn->names[j];
-      }
-    }
-    if (name) {
-      props[kApnNameProperty] = name->name;
-    }
-    if (lname) {
-      props[kApnLocalizedNameProperty] = lname->name;
-      props[kApnLanguageProperty] = lname->lang;
-    }
-    apn_list.push_back(props);
-  }
-  cellular()->set_apn_list(apn_list);
-}
-
 // always called from an async context
 void CellularCapabilityGSM::Register(const ResultCallback &callback) {
   SLOG(Cellular, 2) << __func__ << " \"" << cellular()->selected_network()
@@ -820,7 +696,6 @@
   serving_operator_.SetName(operator_name);
   cellular()->serving_operator_info()->UpdateMCCMNC(operator_code);
   cellular()->serving_operator_info()->UpdateOperatorName(operator_name);
-  UpdateOperatorInfo();
   cellular()->HandleNewRegistrationState();
 }
 
@@ -861,7 +736,6 @@
     cellular()->set_imsi(imsi);
     cellular()->set_sim_present(true);
     cellular()->home_provider_info()->UpdateIMSI(imsi);
-    SetHomeProvider();
     callback.Run(error);
   } else if (!sim_lock_status_.lock_type.empty()) {
     SLOG(Cellular, 2) << "GetIMSI failed - SIM lock in place.";
@@ -892,7 +766,6 @@
     SLOG(Cellular, 2) << "SPN: " << spn;
     spn_ = spn;
     cellular()->home_provider_info()->UpdateOperatorName(spn);
-    SetHomeProvider();
   } else {
     SLOG(Cellular, 2) << "GetSPN failed - " << error;
   }
diff --git a/cellular_capability_gsm.h b/cellular_capability_gsm.h
index 6e7fc84..96447c3 100644
--- a/cellular_capability_gsm.h
+++ b/cellular_capability_gsm.h
@@ -90,7 +90,6 @@
   // Inherited from CellularCapabilityClassic.
   virtual void InitProxies() override;
   virtual void ReleaseProxies() override;
-  virtual void UpdateStatus(const DBusPropertiesMap &properties) override;
 
   // Initializes properties, such as IMSI, which are required before the device
   // is enabled.
@@ -111,17 +110,12 @@
   FRIEND_TEST(CellularCapabilityGSMTest, EnterPIN);
   FRIEND_TEST(CellularCapabilityGSMTest, UnblockPIN);
   FRIEND_TEST(CellularCapabilityGSMTest, ChangePIN);
-  FRIEND_TEST(CellularCapabilityGSMTest, InitAPNList);
   FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResult);
   FRIEND_TEST(CellularCapabilityGSMTest, ParseScanResultProviderLookup);
   FRIEND_TEST(CellularCapabilityGSMTest, RegisterOnNetwork);
   FRIEND_TEST(CellularCapabilityGSMTest, SetAccessTechnology);
-  FRIEND_TEST(CellularCapabilityGSMTest, UpdateStatus);
-  FRIEND_TEST(CellularCapabilityGSMTest, SetHomeProvider);
-  FRIEND_TEST(CellularCapabilityGSMTest, UpdateOperatorInfo);
   FRIEND_TEST(CellularCapabilityGSMTest, GetRegistrationState);
   FRIEND_TEST(CellularCapabilityGSMTest, OnDBusPropertiesChanged);
-  FRIEND_TEST(CellularCapabilityGSMTest, SetupApnTryList);
   FRIEND_TEST(CellularCapabilityTest, AllowRoaming);
   FRIEND_TEST(CellularCapabilityTest, TryApns);
   FRIEND_TEST(CellularTest, ScanAsynchronousFailure);
@@ -160,21 +154,6 @@
 
   void SetAccessTechnology(uint32 access_technology);
 
-  // Sets the upper level information about the home cellular provider from the
-  // modem's IMSI and SPN.
-  void SetHomeProvider();
-
-  // Updates the GSM operator name and country based on a newly obtained network
-  // id.
-  void UpdateOperatorInfo();
-
-  // Updates the serving operator on the active service.
-  void UpdateServingOperator();
-
-  // Initializes the |apn_list| property based on the current
-  // |home_provider_info_|.
-  void InitAPNList();
-
   Stringmap ParseScanResult(const GSMScanResult &result);
 
   KeyValueStore SimLockStatusToProperty(Error *error);
diff --git a/cellular_capability_gsm_unittest.cc b/cellular_capability_gsm_unittest.cc
index 3658b7c..341e4d9 100644
--- a/cellular_capability_gsm_unittest.cc
+++ b/cellular_capability_gsm_unittest.cc
@@ -19,6 +19,7 @@
 #include "shill/event_dispatcher.h"
 #include "shill/mock_adaptors.h"
 #include "shill/mock_log.h"
+#include "shill/mock_mobile_operator_info.h"
 #include "shill/mock_modem_gsm_card_proxy.h"
 #include "shill/mock_modem_gsm_network_proxy.h"
 #include "shill/mock_modem_info.h"
@@ -61,7 +62,9 @@
                                "",
                                "",
                                "",
-                               &proxy_factory_)) {
+                               &proxy_factory_)),
+        mock_home_provider_info_(NULL),
+        mock_serving_operator_info_(NULL) {
     modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
                                           Technology::kCellular);
   }
@@ -95,10 +98,6 @@
                      int timeout) {
     callback.Run(kIMSI, Error());
   }
-  void InvokeGetIMSI2(Error *error, const GSMIdentifierCallback &callback,
-                      int timeout) {
-    callback.Run("310240123456789", Error());
-  }
   void InvokeGetIMSIFails(Error *error, const GSMIdentifierCallback &callback,
                           int timeout) {
     callback.Run("", Error(Error::kOperationFailed));
@@ -241,8 +240,37 @@
     capability_->registration_state_ = state;
   }
 
-  void SetService() {
-    cellular_->service_ = new CellularService(&modem_info_, cellular_);
+  void CreateService() {
+    // The following constants are never directly accessed by the tests.
+    const char kStorageIdentifier[] = "default_test_storage_id";
+    const char kFriendlyServiceName[] = "default_test_service_name";
+    const char kOperatorCode[] = "10010";
+    const char kOperatorName[] = "default_test_operator_name";
+    const char kOperatorCountry[] = "us";
+
+    // Simulate all the side-effects of Cellular::CreateService
+    auto service = new CellularService(&modem_info_, cellular_);
+    service->SetStorageIdentifier(kStorageIdentifier);
+    service->SetFriendlyName(kFriendlyServiceName);
+
+    Cellular::Operator oper;
+    oper.SetCode(kOperatorCode);
+    oper.SetName(kOperatorName);
+    oper.SetCountry(kOperatorCountry);
+
+    service->SetServingOperator(oper);
+
+    cellular_->set_home_provider(oper);
+    cellular_->service_ = service;
+  }
+
+  void SetMockMobileOperatorInfoObjects() {
+    CHECK(!mock_home_provider_info_);
+    CHECK(!mock_serving_operator_info_);
+    mock_home_provider_info_ = new MockMobileOperatorInfo(&dispatcher_);
+    mock_serving_operator_info_ = new MockMobileOperatorInfo(&dispatcher_);
+    cellular_->set_home_provider_info(mock_home_provider_info_);
+    cellular_->set_serving_operator_info(mock_serving_operator_info_);
   }
 
   void SetupCommonProxiesExpectations() {
@@ -295,6 +323,10 @@
   CellularCapabilityGSM *capability_;  // Owned by |cellular_|.
   DeviceMockAdaptor *device_adaptor_;  // Owned by |cellular_|.
   CellularRefPtr cellular_;
+
+  // Set when required and passed to |cellular_|. Owned by |cellular_|.
+  MockMobileOperatorInfo *mock_home_provider_info_;
+  MockMobileOperatorInfo *mock_serving_operator_info_;
 };
 
 const char CellularCapabilityGSMTest::kAddress[] = "1122334455";
@@ -326,24 +358,20 @@
 }
 
 TEST_F(CellularCapabilityGSMTest, GetIMSI) {
+  SetMockMobileOperatorInfoObjects();
   EXPECT_CALL(*card_proxy_, GetIMSI(_, _, CellularCapability::kTimeoutDefault))
       .WillOnce(Invoke(this,
-                       &CellularCapabilityGSMTest::InvokeGetIMSI))
-      .WillOnce(Invoke(this,
-                       &CellularCapabilityGSMTest::InvokeGetIMSI2));
-  EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
+                       &CellularCapabilityGSMTest::InvokeGetIMSI));
+  EXPECT_CALL(*this, TestCallback(IsSuccess()));
   SetCardProxy();
   ResultCallback callback = Bind(&CellularCapabilityGSMTest::TestCallback,
                                  Unretained(this));
   EXPECT_TRUE(cellular_->imsi().empty());
   EXPECT_FALSE(cellular_->sim_present());
+  EXPECT_CALL(*mock_home_provider_info_, UpdateIMSI(kIMSI));
   capability_->GetIMSI(callback);
   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());
 }
 
 // In this test, the call to the proxy's GetIMSI() will always indicate failure,
@@ -419,7 +447,7 @@
       .WillOnce(Invoke(this,
                        &CellularCapabilityGSMTest::InvokeGetSignalQuality));
   SetNetworkProxy();
-  SetService();
+  CreateService();
   EXPECT_EQ(0, cellular_->service()->strength());
   capability_->GetSignalQuality();
   EXPECT_EQ(kStrength, cellular_->service()->strength());
@@ -555,41 +583,13 @@
 TEST_F(CellularCapabilityGSMTest, SetAccessTechnology) {
   capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
   EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GSM, capability_->access_technology_);
-  SetService();
+  CreateService();
   SetRegistrationState(MM_MODEM_GSM_NETWORK_REG_STATUS_HOME);
   capability_->SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GPRS);
   EXPECT_EQ(MM_MODEM_GSM_ACCESS_TECH_GPRS, capability_->access_technology_);
   EXPECT_EQ(kNetworkTechnologyGprs, cellular_->service()->network_technology());
 }
 
-TEST_F(CellularCapabilityGSMTest, UpdateOperatorInfo) {
-  static const char kOperatorName[] = "Swisscom";
-  InitProviderDB();
-  capability_->serving_operator_.SetCode("22801");
-  SetService();
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
-  EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
-  EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
-
-  static const char kTestOperator[] = "Testcom";
-  capability_->serving_operator_.SetName(kTestOperator);
-  capability_->serving_operator_.SetCountry("");
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
-  EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
-  EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
-}
-
-TEST_F(CellularCapabilityGSMTest, UpdateStatus) {
-  InitProviderDB();
-  DBusPropertiesMap props;
-  cellular_->set_imsi("310240123456789");
-  props[CellularCapability::kModemPropertyIMSI].writer().append_string("");
-  capability_->UpdateStatus(props);
-  EXPECT_EQ("T-Mobile", cellular_->home_provider().GetName());
-}
-
 TEST_F(CellularCapabilityGSMTest, AllowRoaming) {
   EXPECT_FALSE(cellular_->allow_roaming_);
   EXPECT_FALSE(cellular_->provider_requires_roaming());
@@ -601,56 +601,6 @@
   EXPECT_TRUE(capability_->AllowRoaming());
 }
 
-TEST_F(CellularCapabilityGSMTest, SetHomeProvider) {
-  static const char kCountry[] = "us";
-  static const char kCode[] = "310160";
-  cellular_->set_imsi("310240123456789");
-
-  EXPECT_FALSE(capability_->home_provider_info_);
-  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(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, cellular_->apn_list().size());
-  ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_FALSE(cellular_->provider_requires_roaming());
-
-  Cellular::Operator oper;
-  cellular_->set_home_provider(oper);
-  capability_->spn_ = kTestCarrier;
-  capability_->SetHomeProvider();
-  EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
-  EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
-  EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
-  EXPECT_FALSE(cellular_->provider_requires_roaming());
-
-  static const char kCubic[] = "Cubic";
-  capability_->spn_ = kCubic;
-  capability_->SetHomeProvider();
-  EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
-  EXPECT_EQ("", cellular_->home_provider().GetCode());
-  ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(cellular_->provider_requires_roaming());
-
-  static const char kCUBIC[] = "CUBIC";
-  capability_->spn_ = kCUBIC;
-  capability_->home_provider_info_ = NULL;
-  capability_->SetHomeProvider();
-  EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
-  EXPECT_EQ("", cellular_->home_provider().GetCode());
-  ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(cellular_->provider_requires_roaming());
-}
-
 namespace {
 
 MATCHER(SizeIs4, "") {
@@ -659,22 +609,6 @@
 
 }  // 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, cellular_->apn_list().size());
-  EXPECT_CALL(*device_adaptor_,
-              EmitStringmapsChanged(kCellularApnListProperty, SizeIs4()));
-  capability_->InitAPNList();
-  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) {
   EXPECT_EQ("", capability_->GetNetworkTechnologyString());
   SetAccessTechnology(MM_MODEM_GSM_ACCESS_TECH_GSM);
@@ -802,74 +736,6 @@
   EXPECT_EQ(kRetries, capability_->sim_lock_status_.retries_left);
 }
 
-TEST_F(CellularCapabilityGSMTest, SetupApnTryList) {
-  static const string kTmobileApn("epc.tmobile.com");
-  static const string kLastGoodApn("remembered.apn");
-  static const string kLastGoodUsername("remembered.user");
-  static const string kSuppliedApn("my.apn");
-
-  SetService();
-  cellular_->set_imsi("310240123456789");
-  InitProviderDB();
-  capability_->SetHomeProvider();
-  DBusPropertiesMap props;
-  capability_->SetupConnectProperties(&props);
-  EXPECT_FALSE(props.find(kApnProperty) == props.end());
-  EXPECT_EQ(kTmobileApn, props[kApnProperty].reader().get_string());
-
-  ProfileRefPtr profile(new NiceMock<MockProfile>(
-      modem_info_.control_interface(), modem_info_.metrics(),
-      modem_info_.manager()));
-  cellular_->service()->set_profile(profile);
-  Stringmap apn_info;
-  apn_info[kApnProperty] = kLastGoodApn;
-  apn_info[kApnUsernameProperty] = kLastGoodUsername;
-  cellular_->service()->SetLastGoodApn(apn_info);
-  props.clear();
-  EXPECT_TRUE(props.find(kApnProperty) == props.end());
-  capability_->SetupConnectProperties(&props);
-  // We expect the list to contain the last good APN, plus
-  // the 4 APNs from the mobile provider info database.
-  EXPECT_EQ(5, capability_->apn_try_list_.size());
-  EXPECT_FALSE(props.find(kApnProperty) == props.end());
-  EXPECT_EQ(kLastGoodApn, props[kApnProperty].reader().get_string());
-  EXPECT_FALSE(props.find(kApnUsernameProperty) == props.end());
-  EXPECT_EQ(kLastGoodUsername,
-            props[kApnUsernameProperty].reader().get_string());
-
-  Error error;
-  apn_info.clear();
-  props.clear();
-  apn_info[kApnProperty] = kSuppliedApn;
-  // Setting the APN has the side effect of clearing the LastGoodApn,
-  // so the try list will have 5 elements, with the first one being
-  // the supplied APN.
-  cellular_->service()->SetApn(apn_info, &error);
-  EXPECT_TRUE(props.find(kApnProperty) == props.end());
-  capability_->SetupConnectProperties(&props);
-  EXPECT_EQ(5, capability_->apn_try_list_.size());
-  EXPECT_FALSE(props.find(kApnProperty) == props.end());
-  EXPECT_EQ(kSuppliedApn, props[kApnProperty].reader().get_string());
-
-  apn_info.clear();
-  props.clear();
-  apn_info[kApnProperty] = kLastGoodApn;
-  apn_info[kApnUsernameProperty] = kLastGoodUsername;
-  // Now when LastGoodAPN is set, it will be the one selected.
-  cellular_->service()->SetLastGoodApn(apn_info);
-  EXPECT_TRUE(props.find(kApnProperty) == props.end());
-  capability_->SetupConnectProperties(&props);
-  // We expect the list to contain the last good APN, plus
-  // the user-supplied APN, plus the 4 APNs from the mobile
-  // provider info database.
-  EXPECT_EQ(6, capability_->apn_try_list_.size());
-  EXPECT_FALSE(props.find(kApnProperty) == props.end());
-  EXPECT_EQ(kLastGoodApn, props[kApnProperty].reader().get_string());
-  EXPECT_FALSE(props.find(kApnUsernameProperty) == props.end());
-  EXPECT_EQ(kLastGoodUsername,
-            props[kApnUsernameProperty].reader().get_string());
-}
-
 TEST_F(CellularCapabilityGSMTest, StartModemSuccess) {
   SetupCommonStartModemExpectations();
   EXPECT_CALL(*card_proxy_,
diff --git a/cellular_capability_universal.cc b/cellular_capability_universal.cc
index e45d1f0..a1d2737 100644
--- a/cellular_capability_universal.cc
+++ b/cellular_capability_universal.cc
@@ -693,7 +693,6 @@
 
 void CellularCapabilityUniversal::OnServiceCreated() {
   UpdateServiceActivationState();
-  UpdateServingOperator();
 
   // WORKAROUND:
   // E362 modems on Verizon network does not properly redirect when a SIM
@@ -823,58 +822,6 @@
   OnModem3GPPPropertiesChanged(properties, vector<string>());
 }
 
-void CellularCapabilityUniversal::SetHomeProvider() {
-  const string &imsi = cellular()->imsi();
-  SLOG(Cellular, 3) << __func__ << "(IMSI: " << imsi
-          << " SPN: " << spn_ << ")";
-
-  if (!modem_info()->provider_db())
-    return;
-
-  // 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;
-  mobile_provider *provider_info = mobile_provider_lookup_best_match(
-      modem_info()->provider_db(),
-      spn_.c_str(),
-      network_id.c_str());
-  if (!provider_info) {
-    SLOG(Cellular, 2) << "3GPP provider not found.";
-    return;
-  }
-
-  // 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;
-  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.
-  if (!operator_id_.empty()) {
-    oper.SetCode(operator_id_);
-  } else if (provider_info->networks && provider_info->networks[0]) {
-    oper.SetCode(provider_info->networks[0]);
-  }
-  if (*provider_info->country) {
-    oper.SetCountry(provider_info->country);
-  }
-  if (spn_.empty()) {
-    const char *name = mobile_provider_get_name(provider_info);
-    if (name) {
-      oper.SetName(name);
-    }
-  } else {
-    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()
-                    << (roaming_required ? ", roaming required" : "");
-  InitAPNList();
-}
-
 void CellularCapabilityUniversal::UpdateServiceOLP() {
   SLOG(Cellular, 3) << __func__;
 
@@ -908,67 +855,6 @@
   cellular()->service()->SetOLP(olp_list[0].url, olp_list[0].method, post_data);
 }
 
-void CellularCapabilityUniversal::UpdateOperatorInfo() {
-  SLOG(Cellular, 3) << __func__;
-  // TODO(armansito): Use CellularOperatorInfo here instead of
-  // mobile_provider_db.
-
-  // Sometimes the modem fails to acquire the operator code OTA, in which case
-  // |serving_operator_| may not have an operator ID (sometimes due to service
-  // activation being required or broken modem firmware). Use |operator_id_| as
-  // a fallback when available. |operator_id_| is retrieved from the SIM card.
-  if (serving_operator_.GetCode().empty() && !operator_id_.empty()) {
-    SLOG(Cellular, 2) << "Assuming operator '" << operator_id_
-                      << "' as serving operator.";
-    serving_operator_.SetCode(operator_id_);
-  } else if (!serving_operator_.GetCode().empty() && operator_id_.empty()) {
-    // Sometimes the SIM may fail to report an operator code. Since we build
-    // the APN list based on home provider, report that the serving operator
-    // is the home provider.
-    // TODO(armansito): This is clearly not the best behavior for the roaming
-    // case: we are now reporting that the roaming carrier is the same as the
-    // home carrier. While this is not preferable, we don't have any home
-    // provider to report either way, so this won't hurt the user experience.
-    // This is a quick fix needed for the M31 release (crbug.com/306310).
-    // Remove it with a better approach for M32 (crbug.com/298408).
-    SLOG(Cellular, 2) << "Home provider is unknown but serving operator is. "
-                      << "Reporting serving operator as home provider.";
-    operator_id_ = serving_operator_.GetCode();
-    SetHomeProvider();
-  }
-
-  const string &network_id = serving_operator_.GetCode();
-  if (!network_id.empty()) {
-    SLOG(Cellular, 2) << "Looking up network id: " << network_id;
-    mobile_provider *provider =
-        mobile_provider_lookup_by_network(modem_info()->provider_db(),
-                                          network_id.c_str());
-    if (provider) {
-      if (serving_operator_.GetName().empty()) {
-        const char *provider_name = mobile_provider_get_name(provider);
-        if (provider_name && *provider_name) {
-          serving_operator_.SetName(provider_name);
-        }
-      }
-      if (*provider->country) {
-        serving_operator_.SetCountry(provider->country);
-      }
-      SLOG(Cellular, 2) << "Operator name: " << serving_operator_.GetName()
-                        << ", country: " << serving_operator_.GetCountry();
-    } else {
-      SLOG(Cellular, 2) << "GSM provider not found.";
-    }
-  }
-  UpdateServingOperator();
-}
-
-void CellularCapabilityUniversal::UpdateServingOperator() {
-  SLOG(Cellular, 3) << __func__;
-  if (cellular()->service().get()) {
-    cellular()->service()->SetServingOperator(serving_operator_);
-  }
-}
-
 void CellularCapabilityUniversal::UpdateActiveBearer() {
   SLOG(Cellular, 3) << __func__;
 
@@ -995,48 +881,6 @@
     SLOG(Cellular, 2) << "No active bearer found.";
 }
 
-void CellularCapabilityUniversal::InitAPNList() {
-  SLOG(Cellular, 3) << __func__;
-  Stringmaps apn_list;
-  if (!home_provider_info_) {
-    return;
-  }
-  for (int i = 0; i < home_provider_info_->num_apns; ++i) {
-    Stringmap props;
-    mobile_apn *apn = home_provider_info_->apns[i];
-    if (apn->value) {
-      props[kApnProperty] = apn->value;
-    }
-    if (apn->username) {
-      props[kApnUsernameProperty] = apn->username;
-    }
-    if (apn->password) {
-      props[kApnPasswordProperty] = apn->password;
-    }
-    // Find the first localized and non-localized name, if any.
-    const localized_name *lname = NULL;
-    const localized_name *name = NULL;
-    for (int j = 0; j < apn->num_names; ++j) {
-      if (apn->names[j]->lang) {
-        if (!lname) {
-          lname = apn->names[j];
-        }
-      } else if (!name) {
-        name = apn->names[j];
-      }
-    }
-    if (name) {
-      props[kApnNameProperty] = name->name;
-    }
-    if (lname) {
-      props[kApnLocalizedNameProperty] = lname->name;
-      props[kApnLanguageProperty] = lname->lang;
-    }
-    apn_list.push_back(props);
-  }
-  cellular()->set_apn_list(apn_list);
-}
-
 bool CellularCapabilityUniversal::IsServiceActivationRequired() const {
   const string &sim_identifier = cellular()->sim_identifier();
   // subscription_state_ is the definitive answer. If that does not work,
@@ -1811,9 +1655,6 @@
   cellular()->serving_operator_info()->UpdateOperatorName(
       updated_operator_name);
 
-  // Update the carrier name for |serving_operator_|.
-  UpdateOperatorInfo();
-
   cellular()->HandleNewRegistrationState();
 
   // If the modem registered with the network and the current ICCID is pending
@@ -1896,7 +1737,6 @@
     cellular()->set_imsi(value);
     cellular()->home_provider_info()->UpdateIMSI(value);
   }
-  SetHomeProvider();
 }
 
 void CellularCapabilityUniversal::OnSpnChanged(const std::string &spn) {
diff --git a/cellular_capability_universal.h b/cellular_capability_universal.h
index 85da29b..af2c874 100644
--- a/cellular_capability_universal.h
+++ b/cellular_capability_universal.h
@@ -205,7 +205,6 @@
   FRIEND_TEST(CellularCapabilityUniversalMainTest, Reset);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, Scan);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, ScanFailure);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest, SetHomeProvider);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusChanged);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, SimLockStatusToProperty);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, SimPathChanged);
@@ -235,9 +234,6 @@
   FRIEND_TEST(CellularCapabilityUniversalMainTest,
               UpdateServiceActivationState);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateServiceOLP);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest, UpdateOperatorInfo);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest,
-              UpdateOperatorInfoViaOperatorId);
   FRIEND_TEST(CellularCapabilityUniversalTimerTest, CompleteActivation);
   FRIEND_TEST(CellularTest, EnableTrafficMonitor);
   FRIEND_TEST(CellularTest,
@@ -287,23 +283,6 @@
   void Stop_PowerDownCompleted(const ResultCallback &callback,
                                const Error &error);
 
-  // Methods used in acquiring information related to the carrier;
-
-  // Updates the Universal operator name and country based on a newly
-  // obtained network id.
-  void UpdateOperatorInfo();
-
-  // Sets the upper level information about the home cellular provider from the
-  // modem's IMSI and SPN.
-  void SetHomeProvider();
-
-  // Updates the serving operator on the active service.
-  void UpdateServingOperator();
-
-  // Initializes the |apn_list| property based on the current
-  // |home_provider_info_|.
-  void InitAPNList();
-
   // Updates |active_bearer_| to match the currently active bearer.
   void UpdateActiveBearer();
 
diff --git a/cellular_capability_universal_cdma.cc b/cellular_capability_universal_cdma.cc
index 43af14a..040249e 100644
--- a/cellular_capability_universal_cdma.cc
+++ b/cellular_capability_universal_cdma.cc
@@ -33,10 +33,6 @@
 const char kPhoneNumber[] = "#777";
 const char kPropertyConnectNumber[] = "number";
 
-string FormattedSID(const string &sid) {
-  return "[SID=" + sid + "]";
-}
-
 }  // namespace
 
 CellularCapabilityUniversalCDMA::CellularCapabilityUniversalCDMA(
@@ -187,7 +183,6 @@
 void CellularCapabilityUniversalCDMA::OnServiceCreated() {
   SLOG(Cellular, 2) << __func__;
   UpdateServiceActivationStateProperty();
-  UpdateServingOperator();
   HandleNewActivationStatus(MM_CDMA_ACTIVATION_ERROR_NONE);
   UpdatePendingActivationState();
 }
@@ -245,54 +240,6 @@
   OnModemCDMAPropertiesChanged(properties, vector<string>());
 }
 
-void CellularCapabilityUniversalCDMA::UpdateOperatorInfo() {
-  SLOG(Cellular, 2) << __func__;
-
-  if (sid_ == 0 || !modem_info()->cellular_operator_info()) {
-    SLOG(Cellular, 2) << "No provider is currently available.";
-    provider_.SetCode("");
-    return;
-  }
-
-  string sid = UintToString(sid_);
-  const CellularOperatorInfo::CellularOperator *provider =
-      modem_info()->cellular_operator_info()->GetCellularOperatorBySID(sid);
-  if (!provider) {
-    SLOG(Cellular, 2) << "CDMA provider with "
-                      << FormattedSID(sid)
-                      << " not found.";
-    // If a matching provider is not found, shill should update the
-    // Cellular.ServingOperator property to to display the Sid.
-    provider_.SetCode(sid);
-    provider_.SetCountry("");
-    provider_.SetName("");
-    activation_code_.clear();
-  } else {
-    if (!provider->name_list().empty()) {
-      provider_.SetName(provider->name_list()[0].name);
-    }
-    provider_.SetCode(sid);
-    provider_.SetCountry(provider->country());
-
-    activation_code_ = provider->activation_code();
-  }
-
-  // TODO(armansito): The CDMA interface only returns information about the
-  // current serving carrier, so for now both the home provider and the
-  // serving operator will be the same in case of roaming. We should figure
-  // out if there is a way to (and whether or not it is necessary to)
-  // determine if we're roaming.
-  cellular()->set_home_provider(provider_);
-  UpdateServingOperator();
-}
-
-void CellularCapabilityUniversalCDMA::UpdateServingOperator() {
-  SLOG(Cellular, 2) << __func__;
-  if (cellular()->service().get()) {
-    cellular()->service()->SetServingOperator(cellular()->home_provider());
-  }
-}
-
 void CellularCapabilityUniversalCDMA::OnActivationStateChangedSignal(
     uint32 activation_state,
     uint32 activation_error,
@@ -572,7 +519,6 @@
   nid_ = nid;
   cellular()->serving_operator_info()->UpdateSID(UintToString(sid));
   cellular()->serving_operator_info()->UpdateNID(UintToString(nid));
-  UpdateOperatorInfo();
   cellular()->HandleNewRegistrationState();
 }
 
diff --git a/cellular_capability_universal_cdma.h b/cellular_capability_universal_cdma.h
index 848b9bb..651e6d9 100644
--- a/cellular_capability_universal_cdma.h
+++ b/cellular_capability_universal_cdma.h
@@ -86,7 +86,6 @@
               OnCDMARegistrationChanged);
   FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, PropertiesChanged);
   FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, UpdateServiceOLP);
-  FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest, UpdateOperatorInfo);
   FRIEND_TEST(CellularCapabilityUniversalCDMAMainTest,
               UpdateServiceActivationStateProperty);
 
@@ -112,9 +111,6 @@
   static std::string GetActivationStateString(uint32 state);
   static std::string GetActivationErrorString(uint32 error);
 
-  void UpdateOperatorInfo();
-  void UpdateServingOperator();
-
   scoped_ptr<mm1::ModemModemCdmaProxyInterface> modem_cdma_proxy_;
   // TODO(armansito): Should probably call this |weak_ptr_factory_| after
   // 3gpp refactor
diff --git a/cellular_capability_universal_cdma_unittest.cc b/cellular_capability_universal_cdma_unittest.cc
index e54ce4c..acd6b50 100644
--- a/cellular_capability_universal_cdma_unittest.cc
+++ b/cellular_capability_universal_cdma_unittest.cc
@@ -7,6 +7,7 @@
 #include <string>
 #include <vector>
 
+#include <base/strings/string_number_conversions.h>
 #include <base/strings/string_util.h>
 #include <base/strings/stringprintf.h>
 #include <gmock/gmock.h>
@@ -35,6 +36,7 @@
 #include "shill/proxy_factory.h"
 
 using base::StringPrintf;
+using base::UintToString;
 using std::string;
 using std::vector;
 using testing::Invoke;
@@ -49,7 +51,8 @@
 class CellularCapabilityUniversalCDMATest : public testing::Test {
  public:
   CellularCapabilityUniversalCDMATest(EventDispatcher *dispatcher)
-      : capability_(NULL),
+      : dispatcher_(dispatcher),
+        capability_(NULL),
         device_adaptor_(NULL),
         modem_info_(NULL, dispatcher, NULL, NULL, NULL),
         modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
@@ -59,8 +62,6 @@
         sim_proxy_(new mm1::MockSimProxy()),
         properties_proxy_(new MockDBusPropertiesProxy()),
         proxy_factory_(this),
-        mock_home_provider_info_(new MockMobileOperatorInfo(dispatcher)),
-        mock_serving_operator_info_(new MockMobileOperatorInfo(dispatcher)),
         cellular_(new Cellular(&modem_info_,
                                "",
                                kMachineAddress,
@@ -71,7 +72,9 @@
                                "",
                                &proxy_factory_)),
         service_(new MockCellularService(&modem_info_,
-                                         cellular_)) {}
+                                         cellular_)),
+        mock_home_provider_info_(NULL),
+        mock_serving_operator_info_(NULL) {}
 
   virtual ~CellularCapabilityUniversalCDMATest() {
     cellular_->service_ = NULL;
@@ -112,10 +115,12 @@
   }
 
   void SetMockMobileOperatorInfoObjects() {
-    CHECK(mock_home_provider_info_);
-    CHECK(mock_serving_operator_info_);
-    cellular_->set_home_provider_info(mock_home_provider_info_.release());
-    cellular_->set_serving_operator_info(mock_serving_operator_info_.release());
+    CHECK(!mock_home_provider_info_);
+    CHECK(!mock_serving_operator_info_);
+    mock_home_provider_info_ = new MockMobileOperatorInfo(dispatcher_);
+    mock_serving_operator_info_ = new MockMobileOperatorInfo(dispatcher_);
+    cellular_->set_home_provider_info(mock_home_provider_info_);
+    cellular_->set_serving_operator_info(mock_serving_operator_info_);
   }
 
  protected:
@@ -170,7 +175,7 @@
     CellularCapabilityUniversalCDMATest *test_;
   };
 
-
+  EventDispatcher *dispatcher_;
   CellularCapabilityUniversalCDMA *capability_;
   NiceMock<DeviceMockAdaptor> *device_adaptor_;
   MockModemInfo modem_info_;
@@ -183,10 +188,12 @@
   scoped_ptr<mm1::MockSimProxy> sim_proxy_;
   scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
   TestProxyFactory proxy_factory_;
-  scoped_ptr<MockMobileOperatorInfo> mock_home_provider_info_;
-  scoped_ptr<MockMobileOperatorInfo> mock_serving_operator_info_;
   CellularRefPtr cellular_;
   MockCellularService *service_;
+
+  // Set when required and passed to |cellular_|. Owned by |cellular_|.
+  MockMobileOperatorInfo *mock_home_provider_info_;
+  MockMobileOperatorInfo *mock_serving_operator_info_;
 };
 
 // static
@@ -251,107 +258,24 @@
   EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
             capability_->cdma_evdo_registration_state_);
 
-  EXPECT_EQ("", capability_->provider_.GetCode());
-  EXPECT_EQ("", capability_->provider_.GetName());
-  EXPECT_EQ("", capability_->provider_.GetCountry());
-
-  CellularOperatorInfo::CellularOperator *provider =
-      new CellularOperatorInfo::CellularOperator();
-
-  provider->country_ = "us";
-  provider->is_primary_ = true;
-  provider->name_list_.push_back(
-      CellularOperatorInfo::LocalizedName("Test", ""));
-
-  scoped_ptr<const CellularOperatorInfo::CellularOperator> ptr(provider);
-
-  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
-              GetCellularOperatorBySID("2"))
-      .WillOnce(Return(ptr.get()));
-
+  const unsigned kSid = 2;
+  const unsigned kNid = 1;
+  SetMockMobileOperatorInfoObjects();
+  EXPECT_CALL(*mock_serving_operator_info_, UpdateSID(UintToString(kSid)));
+  EXPECT_CALL(*mock_serving_operator_info_, UpdateNID(UintToString(kNid)));
   capability_->OnCDMARegistrationChanged(
       MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
       MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
-      2,
-      0);
-  EXPECT_EQ(2, capability_->sid_);
-  EXPECT_EQ(0, capability_->nid_);
+      kSid,
+      kNid);
+  EXPECT_EQ(kSid, capability_->sid_);
+  EXPECT_EQ(kNid, capability_->nid_);
   EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN,
             capability_->cdma_1x_registration_state_);
   EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_HOME,
             capability_->cdma_evdo_registration_state_);
 
   EXPECT_TRUE(capability_->IsRegistered());
-  EXPECT_EQ("2", capability_->provider_.GetCode());
-  EXPECT_EQ("Test", capability_->provider_.GetName());
-  EXPECT_EQ("us", capability_->provider_.GetCountry());
-}
-
-TEST_F(CellularCapabilityUniversalCDMAMainTest, UpdateOperatorInfo) {
-  EXPECT_EQ("", capability_->provider_.GetCode());
-  EXPECT_EQ("", capability_->provider_.GetName());
-  EXPECT_EQ("", capability_->provider_.GetCountry());
-  EXPECT_TRUE(capability_->activation_code_.empty());
-
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ("", capability_->provider_.GetCode());
-  EXPECT_EQ("", capability_->provider_.GetName());
-  EXPECT_EQ("", capability_->provider_.GetCountry());
-  EXPECT_TRUE(capability_->activation_code_.empty());
-
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ("", capability_->provider_.GetCode());
-  EXPECT_EQ("", capability_->provider_.GetName());
-  EXPECT_EQ("", capability_->provider_.GetCountry());
-  EXPECT_TRUE(capability_->activation_code_.empty());
-
-  capability_->sid_ = 1;
-  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
-              GetCellularOperatorBySID(_))
-      .WillOnce(Return((const CellularOperatorInfo::CellularOperator *)NULL));
-
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ("1", capability_->provider_.GetCode());
-  EXPECT_EQ("", capability_->provider_.GetName());
-  EXPECT_EQ("", capability_->provider_.GetCountry());
-  EXPECT_TRUE(capability_->activation_code_.empty());
-
-  CellularOperatorInfo::CellularOperator *provider =
-      new CellularOperatorInfo::CellularOperator();
-
-  provider->country_ = "us";
-  provider->is_primary_ = true;
-  provider->activation_code_ = "1234";
-  provider->name_list_.push_back(
-      CellularOperatorInfo::LocalizedName("Test", ""));
-
-  scoped_ptr<const CellularOperatorInfo::CellularOperator> ptr(provider);
-
-  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
-              GetCellularOperatorBySID(_))
-      .WillOnce(Return(ptr.get()));
-
-  capability_->UpdateOperatorInfo();
-
-  EXPECT_EQ("1", capability_->provider_.GetCode());
-  EXPECT_EQ("Test", capability_->provider_.GetName());
-  EXPECT_EQ("us", capability_->provider_.GetCountry());
-  EXPECT_EQ("1234", capability_->activation_code_);
-  EXPECT_EQ("1", cellular_->service()->serving_operator().GetCode());
-  EXPECT_EQ("Test", cellular_->service()->serving_operator().GetName());
-  EXPECT_EQ("us", cellular_->service()->serving_operator().GetCountry());
-
-  capability_->sid_ = 1;
-  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
-              GetCellularOperatorBySID(_))
-      .WillOnce(Return(nullptr));
-
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ("1", capability_->provider_.GetCode());
-  EXPECT_EQ("", capability_->provider_.GetName());
-  EXPECT_EQ("", capability_->provider_.GetCountry());
-  EXPECT_TRUE(capability_->activation_code_.empty());
-
 }
 
 TEST_F(CellularCapabilityUniversalCDMAMainTest, UpdateServiceOLP) {
@@ -363,20 +287,18 @@
   const string kUuidVzw = "vzw";
   const string kUuidFoo = "foo";
 
-  MockMobileOperatorInfo *serving_operator_info =
-      mock_serving_operator_info_.get();
   SetMockMobileOperatorInfoObjects();
   cellular_->set_esn("0");
   cellular_->set_mdn("10123456789");
   cellular_->set_meid("4");
 
 
-  serving_operator_info->SetEmptyDefaultsForProperties();
-  EXPECT_CALL(*serving_operator_info, IsMobileNetworkOperatorKnown())
+  mock_serving_operator_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
-  EXPECT_CALL(*serving_operator_info, olp_list())
+  EXPECT_CALL(*mock_serving_operator_info_, olp_list())
       .WillRepeatedly(ReturnRef(kOlpList));
-  EXPECT_CALL(*serving_operator_info, uuid())
+  EXPECT_CALL(*mock_serving_operator_info_, uuid())
       .WillOnce(ReturnRef(kUuidVzw));
   SetService();
   capability_->UpdateServiceOLP();
@@ -386,14 +308,14 @@
   EXPECT_EQ("POST", vzw_olp[kPaymentPortalMethod]);
   EXPECT_EQ("esn=0&mdn=0123456789&meid=4",
             vzw_olp[kPaymentPortalPostData]);
-  Mock::VerifyAndClearExpectations(serving_operator_info);
+  Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
 
-  serving_operator_info->SetEmptyDefaultsForProperties();
-  EXPECT_CALL(*serving_operator_info, IsMobileNetworkOperatorKnown())
+  mock_serving_operator_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
-  EXPECT_CALL(*serving_operator_info, olp_list())
+  EXPECT_CALL(*mock_serving_operator_info_, olp_list())
       .WillRepeatedly(ReturnRef(kOlpList));
-  EXPECT_CALL(*serving_operator_info, uuid())
+  EXPECT_CALL(*mock_serving_operator_info_, uuid())
       .WillOnce(ReturnRef(kUuidFoo));
   capability_->UpdateServiceOLP();
   // Copy to simplify assertions below.
diff --git a/cellular_capability_universal_unittest.cc b/cellular_capability_universal_unittest.cc
index 2add654..708c333 100644
--- a/cellular_capability_universal_unittest.cc
+++ b/cellular_capability_universal_unittest.cc
@@ -68,15 +68,14 @@
 class CellularCapabilityUniversalTest : public testing::TestWithParam<string> {
  public:
   CellularCapabilityUniversalTest(EventDispatcher *dispatcher)
-      : modem_info_(NULL, dispatcher, NULL, NULL, NULL),
+      : dispatcher_(dispatcher),
+        modem_info_(NULL, dispatcher, NULL, NULL, NULL),
         modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
         modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
         modem_proxy_(new mm1::MockModemProxy()),
         modem_simple_proxy_(new mm1::MockModemSimpleProxy()),
         sim_proxy_(new mm1::MockSimProxy()),
         properties_proxy_(new MockDBusPropertiesProxy()),
-        mock_home_provider_info_(new MockMobileOperatorInfo(dispatcher)),
-        mock_serving_operator_info_(new MockMobileOperatorInfo(dispatcher)),
         proxy_factory_(this),
         capability_(NULL),
         device_adaptor_(NULL),
@@ -89,7 +88,9 @@
                                "",
                                "",
                                &proxy_factory_)),
-        service_(new MockCellularService(&modem_info_, cellular_)) {
+        service_(new MockCellularService(&modem_info_, cellular_)),
+        mock_home_provider_info_(NULL),
+        mock_serving_operator_info_(NULL) {
     modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
                                           Technology::kCellular);
   }
@@ -112,18 +113,36 @@
     ON_CALL(*modem_info_.mock_pending_activation_store(),
             GetActivationState(PendingActivationStore::kIdentifierICCID, _))
         .WillByDefault(Return(PendingActivationStore::kStateUnknown));
+
+    SetMockMobileOperatorInfoObjects();
   }
 
   virtual void TearDown() {
     capability_->proxy_factory_ = NULL;
   }
 
-  void InitProviderDB() {
-    modem_info_.SetProviderDB(kTestMobileProviderDBPath);
-  }
+  void CreateService() {
+    // The following constants are never directly accessed by the tests.
+    const char kStorageIdentifier[] = "default_test_storage_id";
+    const char kFriendlyServiceName[] = "default_test_service_name";
+    const char kOperatorCode[] = "10010";
+    const char kOperatorName[] = "default_test_operator_name";
+    const char kOperatorCountry[] = "us";
 
-  void SetService() {
-    cellular_->service_ = new CellularService(&modem_info_, cellular_);
+    // Simulate all the side-effects of Cellular::CreateService
+    auto service = new CellularService(&modem_info_, cellular_);
+    service->SetStorageIdentifier(kStorageIdentifier);
+    service->SetFriendlyName(kFriendlyServiceName);
+
+    Cellular::Operator oper;
+    oper.SetCode(kOperatorCode);
+    oper.SetName(kOperatorName);
+    oper.SetCountry(kOperatorCountry);
+
+    service->SetServingOperator(oper);
+
+    cellular_->set_home_provider(oper);
+    cellular_->service_ = service;
   }
 
   void ClearService() {
@@ -193,10 +212,12 @@
   }
 
   void SetMockMobileOperatorInfoObjects() {
-    CHECK(mock_home_provider_info_);
-    CHECK(mock_serving_operator_info_);
-    cellular_->set_home_provider_info(mock_home_provider_info_.release());
-    cellular_->set_serving_operator_info(mock_serving_operator_info_.release());
+    CHECK(!mock_home_provider_info_);
+    CHECK(!mock_serving_operator_info_);
+    mock_home_provider_info_ = new MockMobileOperatorInfo(dispatcher_);
+    mock_serving_operator_info_ = new MockMobileOperatorInfo(dispatcher_);
+    cellular_->set_home_provider_info(mock_home_provider_info_);
+    cellular_->set_serving_operator_info(mock_serving_operator_info_);
   }
 
   void ReleaseCapabilityProxies() {
@@ -309,6 +330,7 @@
     DBusPropertiesMap inactive_bearer_properties_;
   };
 
+  EventDispatcher *dispatcher_;
   MockModemInfo modem_info_;
   scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
   scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
@@ -316,14 +338,16 @@
   scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
   scoped_ptr<mm1::MockSimProxy> sim_proxy_;
   scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
-  scoped_ptr<MockMobileOperatorInfo> mock_home_provider_info_;
-  scoped_ptr<MockMobileOperatorInfo> mock_serving_operator_info_;
   TestProxyFactory proxy_factory_;
   CellularCapabilityUniversal *capability_;  // Owned by |cellular_|.
   DeviceMockAdaptor *device_adaptor_;  // Owned by |cellular_|.
   CellularRefPtr cellular_;
   MockCellularService *service_;  // owned by cellular_
   DBusPathCallback connect_callback_;  // saved for testing connect operations
+
+  // Set when required and passed to |cellular_|. Owned by |cellular_|.
+  MockMobileOperatorInfo *mock_home_provider_info_;
+  MockMobileOperatorInfo *mock_serving_operator_info_;
 };
 
 // Most of our tests involve using a real EventDispatcher object.
@@ -787,8 +811,6 @@
               GetActivationState(PendingActivationStore::kIdentifierICCID, _))
       .Times(1);
 
-  InitProviderDB();
-
   EXPECT_FALSE(cellular_->sim_present());
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
 
@@ -947,12 +969,10 @@
 }
 
 TEST_F(CellularCapabilityUniversalMainTest, UpdateRegistrationState) {
-  InitProviderDB();
   capability_->InitProxies();
 
-  SetService();
+  CreateService();
   cellular_->set_imsi("310240123456789");
-  capability_->SetHomeProvider();
   cellular_->set_modem_state(Cellular::kModemStateConnected);
   SetRegistrationDroppedUpdateTimeout(0);
 
@@ -1102,12 +1122,10 @@
 
 TEST_F(CellularCapabilityUniversalMainTest,
        UpdateRegistrationStateModemNotConnected) {
-  InitProviderDB();
   capability_->InitProxies();
-  SetService();
+  CreateService();
 
   cellular_->set_imsi("310240123456789");
-  capability_->SetHomeProvider();
   cellular_->set_modem_state(Cellular::kModemStateRegistered);
   SetRegistrationDroppedUpdateTimeout(0);
 
@@ -1253,11 +1271,7 @@
   EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
               GetActivationState(PendingActivationStore::kIdentifierICCID, _))
       .Times(0);
-  InitProviderDB();
 
-  EXPECT_TRUE(cellular_->home_provider().GetName().empty());
-  EXPECT_TRUE(cellular_->home_provider().GetCountry().empty());
-  EXPECT_TRUE(cellular_->home_provider().GetCode().empty());
   EXPECT_FALSE(capability_->sim_proxy_.get());
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_MODEM,
                                        modem_properties, vector<string>());
@@ -1267,15 +1281,16 @@
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 
   // Updating the SIM
-  EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
-              GetActivationState(PendingActivationStore::kIdentifierICCID, _))
-      .Times(2);
   DBusPropertiesMap new_properties;
   const char kCountry[] = "us";
   const char kNewImsi[] = "310240123456789";
   const char kSimIdentifier[] = "9999888";
   const char kOperatorIdentifier[] = "310240";
   const char kOperatorName[] = "Custom SPN";
+  EXPECT_CALL(*modem_info_.mock_pending_activation_store(),
+              GetActivationState(PendingActivationStore::kIdentifierICCID, _))
+      .Times(2);
+  EXPECT_CALL(*mock_home_provider_info_, UpdateIMSI(kNewImsi)).Times(2);
   new_properties[MM_SIM_PROPERTY_IMSI].writer().append_string(kNewImsi);
   new_properties[MM_SIM_PROPERTY_SIMIDENTIFIER].writer().
       append_string(kSimIdentifier);
@@ -1288,17 +1303,12 @@
   EXPECT_EQ(kSimIdentifier, cellular_->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, cellular_->apn_list().size());
 
   new_properties[MM_SIM_PROPERTY_OPERATORNAME].writer().
       append_string(kOperatorName);
   capability_->OnDBusPropertiesChanged(MM_DBUS_INTERFACE_SIM,
                                        new_properties,
                                        vector<string>());
-  EXPECT_EQ(kOperatorName, cellular_->home_provider().GetName());
   EXPECT_EQ(kOperatorName, capability_->spn_);
 }
 
@@ -1497,82 +1507,6 @@
   EXPECT_TRUE(capability_->AllowRoaming());
 }
 
-TEST_F(CellularCapabilityUniversalMainTest, SetHomeProvider) {
-  static const char kTestCarrier[] = "The Cellular Carrier";
-  static const char kCountry[] = "us";
-  static const char kCode[] = "310160";
-
-  EXPECT_FALSE(capability_->home_provider_info_);
-  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(cellular_->provider_requires_roaming());
-
-  InitProviderDB();
-
-  // IMSI and Operator Code not 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(cellular_->provider_requires_roaming());
-
-  // Operator Code available.
-  capability_->operator_id_ = "310240";
-  capability_->SetHomeProvider();
-  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, cellular_->apn_list().size());
-  ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_FALSE(cellular_->provider_requires_roaming());
-
-  cellular_->home_provider_.SetName("");
-  cellular_->home_provider_.SetCountry("");
-  cellular_->home_provider_.SetCode("");
-
-  // IMSI available
-  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, cellular_->apn_list().size());
-  ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_FALSE(cellular_->provider_requires_roaming());
-
-  Cellular::Operator oper;
-  cellular_->set_home_provider(oper);
-  capability_->spn_ = kTestCarrier;
-  capability_->SetHomeProvider();
-  EXPECT_EQ(kTestCarrier, cellular_->home_provider().GetName());
-  EXPECT_EQ(kCountry, cellular_->home_provider().GetCountry());
-  EXPECT_EQ(kCode, cellular_->home_provider().GetCode());
-  EXPECT_FALSE(cellular_->provider_requires_roaming());
-
-  static const char kCubic[] = "Cubic";
-  capability_->spn_ = kCubic;
-  capability_->SetHomeProvider();
-  EXPECT_EQ(kCubic, cellular_->home_provider().GetName());
-  EXPECT_EQ("", cellular_->home_provider().GetCode());
-  ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(cellular_->provider_requires_roaming());
-
-  static const char kCUBIC[] = "CUBIC";
-  capability_->spn_ = kCUBIC;
-  capability_->home_provider_info_ = NULL;
-  capability_->SetHomeProvider();
-  EXPECT_EQ(kCUBIC, cellular_->home_provider().GetName());
-  EXPECT_EQ("", cellular_->home_provider().GetCode());
-  ASSERT_TRUE(capability_->home_provider_info_);
-  EXPECT_TRUE(cellular_->provider_requires_roaming());
-}
-
 TEST_F(CellularCapabilityUniversalMainTest, GetMdnForOLP) {
   const string kVzwUUID = "vzw";
   const string kFooUUID = "foo";
@@ -1620,22 +1554,20 @@
   const string kUuidVzw = "vzw";
   const string kUuidFoo = "foo";
 
-  MockMobileOperatorInfo *home_provider_info = mock_home_provider_info_.get();
-  SetMockMobileOperatorInfoObjects();
   cellular_->set_imei("1");
   cellular_->set_imsi("2");
   cellular_->set_mdn("10123456789");
   cellular_->set_min("5");
   cellular_->set_sim_identifier("6");
 
-  home_provider_info->SetEmptyDefaultsForProperties();
-  EXPECT_CALL(*home_provider_info, IsMobileNetworkOperatorKnown())
+  mock_home_provider_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
-  EXPECT_CALL(*home_provider_info, olp_list())
+  EXPECT_CALL(*mock_home_provider_info_, olp_list())
       .WillRepeatedly(ReturnRef(kOlpList));
-  EXPECT_CALL(*home_provider_info, uuid())
+  EXPECT_CALL(*mock_home_provider_info_, uuid())
       .WillOnce(ReturnRef(kUuidVzw));
-  SetService();
+  CreateService();
   capability_->UpdateServiceOLP();
   // Copy to simplify assertions below.
   Stringmap vzw_olp = cellular_->service()->olp();
@@ -1643,14 +1575,14 @@
   EXPECT_EQ("POST", vzw_olp[kPaymentPortalMethod]);
   EXPECT_EQ("imei=1&imsi=2&mdn=0123456789&min=5&iccid=6",
             vzw_olp[kPaymentPortalPostData]);
-  Mock::VerifyAndClearExpectations(home_provider_info);
+  Mock::VerifyAndClearExpectations(mock_home_provider_info_);
 
-  home_provider_info->SetEmptyDefaultsForProperties();
-  EXPECT_CALL(*home_provider_info, IsMobileNetworkOperatorKnown())
+  mock_home_provider_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
-  EXPECT_CALL(*home_provider_info, olp_list())
+  EXPECT_CALL(*mock_home_provider_info_, olp_list())
       .WillRepeatedly(ReturnRef(kOlpList));
-  EXPECT_CALL(*home_provider_info, uuid())
+  EXPECT_CALL(*mock_home_provider_info_, uuid())
       .WillOnce(ReturnRef(kUuidFoo));
   capability_->UpdateServiceOLP();
   // Copy to simplify assertions below.
@@ -2021,45 +1953,6 @@
   Mock::VerifyAndClearExpectations(modem_info_.mock_pending_activation_store());
 }
 
-TEST_F(CellularCapabilityUniversalMainTest, UpdateOperatorInfo) {
-  static const char kOperatorName[] = "Swisscom";
-  InitProviderDB();
-  capability_->serving_operator_.SetCode("22801");
-  SetService();
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
-  EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
-  EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
-
-  static const char kTestOperator[] = "Testcom";
-  capability_->serving_operator_.SetName(kTestOperator);
-  capability_->serving_operator_.SetCountry("");
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ(kTestOperator, capability_->serving_operator_.GetName());
-  EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
-  EXPECT_EQ(kTestOperator, cellular_->service()->serving_operator().GetName());
-}
-
-TEST_F(CellularCapabilityUniversalMainTest, UpdateOperatorInfoViaOperatorId) {
-  static const char kOperatorName[] = "Swisscom";
-  static const char kOperatorId[] = "22801";
-  InitProviderDB();
-  capability_->serving_operator_.SetCode("");
-  SetService();
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ("", capability_->serving_operator_.GetName());
-  EXPECT_EQ("", capability_->serving_operator_.GetCountry());
-  EXPECT_EQ("", cellular_->service()->serving_operator().GetName());
-
-  capability_->operator_id_ = kOperatorId;
-
-  capability_->UpdateOperatorInfo();
-  EXPECT_EQ(kOperatorId, capability_->serving_operator_.GetCode());
-  EXPECT_EQ(kOperatorName, capability_->serving_operator_.GetName());
-  EXPECT_EQ("ch", capability_->serving_operator_.GetCountry());
-  EXPECT_EQ(kOperatorName, cellular_->service()->serving_operator().GetName());
-}
-
 TEST_F(CellularCapabilityUniversalMainTest, IsServiceActivationRequired) {
   capability_->subscription_state_ =
       CellularCapabilityUniversal::kSubscriptionStateProvisioned;
diff --git a/cellular_unittest.cc b/cellular_unittest.cc
index ed2a228..0e43bc2 100644
--- a/cellular_unittest.cc
+++ b/cellular_unittest.cc
@@ -440,6 +440,13 @@
   static const Stringmaps kTestNetworksGSM;
   static const Stringmaps kTestNetworksCellular;
   static const int kStrength;
+  // Must be std::string so that we can safely ReturnRef.
+  static string kHomeProviderCode;
+  static string kHomeProviderCountry;
+  static string kHomeProviderName;
+  static string kServingOperatorCode;
+  static string kServingOperatorCountry;
+  static string kServingOperatorName;
 
   class TestProxyFactory : public ProxyFactory {
    public:
@@ -605,6 +612,12 @@
       {kLongNameProperty, "some_long_name"},
       {kShortNameProperty, "short"}}};
 const int CellularTest::kStrength = 90;
+string CellularTest::kHomeProviderCode = "10001";
+string CellularTest::kHomeProviderCountry = "us";
+string CellularTest::kHomeProviderName = "HomeProviderName";
+string CellularTest::kServingOperatorCode = "10002";
+string CellularTest::kServingOperatorCountry = "ca";
+string CellularTest::kServingOperatorName = "ServingOperatorName";
 
 TEST_F(CellularTest, GetStateString) {
   EXPECT_EQ("CellularStateDisabled",
@@ -666,6 +679,7 @@
 
 TEST_F(CellularTest, StartGSMRegister) {
   InitProviderDB();
+  SetMockMobileOperatorInfoObjects();
   EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
       .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
   EXPECT_CALL(*gsm_card_proxy_,
@@ -694,6 +708,8 @@
       .Times(2)
       .WillRepeatedly(Invoke(this,
                              &CellularTest::InvokeGetSignalQuality));
+  EXPECT_CALL(*mock_serving_operator_info_, UpdateMCCMNC(_));
+  EXPECT_CALL(*mock_serving_operator_info_, UpdateOperatorName(_));
   EXPECT_CALL(*this, TestCallback(IsSuccess()));
   EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
   AllowCreateGSMCardProxyFromFactory();
@@ -712,9 +728,6 @@
   EXPECT_TRUE(GetCapabilityGSM()->sim_lock_status_.enabled);
   EXPECT_EQ(kStrength, device_->service_->strength());
   EXPECT_EQ(kRoamingStateRoaming, device_->service_->roaming_state());
-  EXPECT_EQ(kNetworkID, device_->service_->serving_operator().GetCode());
-  EXPECT_EQ(kTestCarrier, device_->service_->serving_operator().GetName());
-  EXPECT_EQ("ch", device_->service_->serving_operator().GetCountry());
 }
 
 TEST_F(CellularTest, StartConnected) {
@@ -751,15 +764,13 @@
   device_->SelectService(NULL);
 }
 
-TEST_F(CellularTest, ServiceFriendlyName) {
+TEST_F(CellularTest, FriendlyServiceName) {
   // Test that the name created for the service is sensible under different
   // scenarios w.r.t. information about the mobile network operator.
   SetMockMobileOperatorInfoObjects();
   CHECK(mock_home_provider_info_);
   CHECK(mock_serving_operator_info_);
 
-  const string home_provider_name {"HomeProviderName"};
-  const string serving_operator_name {"ServingOperatorName"};
   SetCellularType(Cellular::kTypeCDMA);
   // We are not testing the behaviour of capabilities here.
   device_->mobile_operator_info_observer_->set_capability(NULL);
@@ -791,9 +802,9 @@
   EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_home_provider_info_, operator_name())
-      .WillRepeatedly(ReturnRef(home_provider_name));
+      .WillRepeatedly(ReturnRef(kHomeProviderName));
   device_->mobile_operator_info_observer_->OnOperatorChanged();
-  EXPECT_EQ(home_provider_name, device_->service_->friendly_name());
+  EXPECT_EQ(kHomeProviderName, device_->service_->friendly_name());
   Mock::VerifyAndClearExpectations(mock_home_provider_info_);
   Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
   device_->DestroyService();
@@ -811,9 +822,9 @@
   EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_serving_operator_info_, operator_name())
-      .WillRepeatedly(ReturnRef(serving_operator_name));
+      .WillRepeatedly(ReturnRef(kServingOperatorName));
   device_->mobile_operator_info_observer_->OnOperatorChanged();
-  EXPECT_EQ(serving_operator_name, device_->service_->friendly_name());
+  EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
   Mock::VerifyAndClearExpectations(mock_home_provider_info_);
   Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
   device_->DestroyService();
@@ -831,7 +842,7 @@
   EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_home_provider_info_, operator_name())
-      .WillRepeatedly(ReturnRef(home_provider_name));
+      .WillRepeatedly(ReturnRef(kHomeProviderName));
   device_->mobile_operator_info_observer_->OnOperatorChanged();
   // Now emulate an event for updated serving operator information.
   Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
@@ -839,9 +850,9 @@
   EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_serving_operator_info_, operator_name())
-      .WillRepeatedly(ReturnRef(serving_operator_name));
+      .WillRepeatedly(ReturnRef(kServingOperatorName));
   device_->mobile_operator_info_observer_->OnOperatorChanged();
-  EXPECT_EQ(serving_operator_name, device_->service_->friendly_name());
+  EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
   Mock::VerifyAndClearExpectations(mock_home_provider_info_);
   Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
   device_->DestroyService();
@@ -859,7 +870,7 @@
   EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_serving_operator_info_, operator_name())
-      .WillRepeatedly(ReturnRef(serving_operator_name));
+      .WillRepeatedly(ReturnRef(kServingOperatorName));
   device_->mobile_operator_info_observer_->OnOperatorChanged();
   // Now emulate an event for updated home provider information.
   Mock::VerifyAndClearExpectations(mock_home_provider_info_);
@@ -867,9 +878,9 @@
   EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_home_provider_info_, operator_name())
-      .WillRepeatedly(ReturnRef(home_provider_name));
+      .WillRepeatedly(ReturnRef(kHomeProviderName));
   device_->mobile_operator_info_observer_->OnOperatorChanged();
-  EXPECT_EQ(serving_operator_name, device_->service_->friendly_name());
+  EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
   Mock::VerifyAndClearExpectations(mock_home_provider_info_);
   Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
   device_->DestroyService();
@@ -883,11 +894,127 @@
   EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
       .WillRepeatedly(Return(true));
   EXPECT_CALL(*mock_home_provider_info_, operator_name())
-      .WillRepeatedly(ReturnRef(home_provider_name));
+      .WillRepeatedly(ReturnRef(kHomeProviderName));
   EXPECT_CALL(*mock_serving_operator_info_, operator_name())
-      .WillRepeatedly(ReturnRef(serving_operator_name));
+      .WillRepeatedly(ReturnRef(kServingOperatorName));
   device_->CreateService();
-  EXPECT_EQ(serving_operator_name, device_->service_->friendly_name());
+  EXPECT_EQ(kServingOperatorName, device_->service_->friendly_name());
+}
+
+TEST_F(CellularTest, HomeProviderServingOperator) {
+  // Test that the the home provider information is correctly updated under
+  // different scenarios w.r.t. information about the mobile network operators.
+  SetMockMobileOperatorInfoObjects();
+  CHECK(mock_home_provider_info_);
+  CHECK(mock_serving_operator_info_);
+
+  // (1) Neither home provider nor serving operator known.
+  EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(false));
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(false));
+
+  device_->CreateService();
+
+  EXPECT_EQ("", device_->home_provider().GetCode());
+  EXPECT_EQ("", device_->home_provider().GetName());
+  EXPECT_EQ("", device_->home_provider().GetCountry());
+  EXPECT_EQ("", device_->service_->serving_operator().GetCode());
+  EXPECT_EQ("", device_->service_->serving_operator().GetName());
+  EXPECT_EQ("", device_->service_->serving_operator().GetCountry());
+  Mock::VerifyAndClearExpectations(mock_home_provider_info_);
+  Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
+  device_->DestroyService();
+
+  // (2) serving operator known.
+  // When home provider is not known, serving operator proxies in.
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(false));
+  mock_serving_operator_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_serving_operator_info_, mccmnc())
+      .WillRepeatedly(ReturnRef(kServingOperatorCode));
+  EXPECT_CALL(*mock_serving_operator_info_, operator_name())
+      .WillRepeatedly(ReturnRef(kServingOperatorName));
+  EXPECT_CALL(*mock_serving_operator_info_, country())
+      .WillRepeatedly(ReturnRef(kServingOperatorCountry));
+
+  device_->CreateService();
+
+  EXPECT_EQ(kServingOperatorCode, device_->home_provider().GetCode());
+  EXPECT_EQ(kServingOperatorName, device_->home_provider().GetName());
+  EXPECT_EQ(kServingOperatorCountry, device_->home_provider().GetCountry());
+  EXPECT_EQ(kServingOperatorCode,
+            device_->service_->serving_operator().GetCode());
+  EXPECT_EQ(kServingOperatorName,
+            device_->service_->serving_operator().GetName());
+  EXPECT_EQ(kServingOperatorCountry,
+            device_->service_->serving_operator().GetCountry());
+  Mock::VerifyAndClearExpectations(mock_home_provider_info_);
+  Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
+  device_->DestroyService();
+
+  // (3) home provider known.
+  // When serving operator is not known, home provider proxies in.
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(false));
+  mock_home_provider_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_home_provider_info_, mccmnc())
+      .WillRepeatedly(ReturnRef(kHomeProviderCode));
+  EXPECT_CALL(*mock_home_provider_info_, operator_name())
+      .WillRepeatedly(ReturnRef(kHomeProviderName));
+  EXPECT_CALL(*mock_home_provider_info_, country())
+      .WillRepeatedly(ReturnRef(kHomeProviderCountry));
+
+  device_->CreateService();
+
+  EXPECT_EQ(kHomeProviderCode, device_->home_provider().GetCode());
+  EXPECT_EQ(kHomeProviderName, device_->home_provider().GetName());
+  EXPECT_EQ(kHomeProviderCountry, device_->home_provider().GetCountry());
+  EXPECT_EQ(kHomeProviderCode,
+            device_->service_->serving_operator().GetCode());
+  EXPECT_EQ(kHomeProviderName,
+            device_->service_->serving_operator().GetName());
+  EXPECT_EQ(kHomeProviderCountry,
+            device_->service_->serving_operator().GetCountry());
+  Mock::VerifyAndClearExpectations(mock_home_provider_info_);
+  Mock::VerifyAndClearExpectations(mock_serving_operator_info_);
+  device_->DestroyService();
+
+  // (4) Serving operator known, home provider known.
+  mock_home_provider_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_home_provider_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_home_provider_info_, mccmnc())
+      .WillRepeatedly(ReturnRef(kHomeProviderCode));
+  EXPECT_CALL(*mock_home_provider_info_, operator_name())
+      .WillRepeatedly(ReturnRef(kHomeProviderName));
+  EXPECT_CALL(*mock_home_provider_info_, country())
+      .WillRepeatedly(ReturnRef(kHomeProviderCountry));
+  mock_serving_operator_info_->SetEmptyDefaultsForProperties();
+  EXPECT_CALL(*mock_serving_operator_info_, IsMobileNetworkOperatorKnown())
+      .WillRepeatedly(Return(true));
+  EXPECT_CALL(*mock_serving_operator_info_, mccmnc())
+      .WillRepeatedly(ReturnRef(kServingOperatorCode));
+  EXPECT_CALL(*mock_serving_operator_info_, operator_name())
+      .WillRepeatedly(ReturnRef(kServingOperatorName));
+  EXPECT_CALL(*mock_serving_operator_info_, country())
+      .WillRepeatedly(ReturnRef(kServingOperatorCountry));
+
+  device_->CreateService();
+
+  EXPECT_EQ(kHomeProviderCode, device_->home_provider().GetCode());
+  EXPECT_EQ(kHomeProviderName, device_->home_provider().GetName());
+  EXPECT_EQ(kHomeProviderCountry, device_->home_provider().GetCountry());
+  EXPECT_EQ(kServingOperatorCode,
+            device_->service_->serving_operator().GetCode());
+  EXPECT_EQ(kServingOperatorName,
+            device_->service_->serving_operator().GetName());
+  EXPECT_EQ(kServingOperatorCountry,
+            device_->service_->serving_operator().GetCountry());
 }
 
 static bool IllegalChar(char a) {
diff --git a/mobile_operator_info.h b/mobile_operator_info.h
index ae053d2..9b49ea1 100644
--- a/mobile_operator_info.h
+++ b/mobile_operator_info.h
@@ -145,7 +145,7 @@
   virtual const std::string &uuid() const;
 
   virtual const std::string &operator_name() const;
-  const std::string &country() const;
+  virtual const std::string &country() const;
   virtual const std::string &mccmnc() const;
   const std::string &sid() const;
   const std::string &nid() const;
@@ -189,13 +189,13 @@
   // Both MCCMNC and SID correspond to operator code in the different
   // technologies. They are never to be used together. If you want to use SID
   // after MCCMNC (or vice-versa), ensure a call to |Reset| to clear state.
-  void UpdateMCCMNC(const std::string &mccmnc);
-  void UpdateSID(const std::string &sid);
+  virtual void UpdateMCCMNC(const std::string &mccmnc);
+  virtual void UpdateSID(const std::string &sid);
 
-  void UpdateIMSI(const std::string &imsi);
+  virtual void UpdateIMSI(const std::string &imsi);
   void UpdateICCID(const std::string &iccid);
-  void UpdateNID(const std::string &nid);
-  void UpdateOperatorName(const std::string &operator_name);
+  virtual void UpdateNID(const std::string &nid);
+  virtual void UpdateOperatorName(const std::string &operator_name);
   void UpdateOnlinePortal(const std::string &url,
                           const std::string &method,
                           const std::string &post_data);
diff --git a/mock_mobile_operator_info.cc b/mock_mobile_operator_info.cc
index 4f3d197..de6336b 100644
--- a/mock_mobile_operator_info.cc
+++ b/mock_mobile_operator_info.cc
@@ -18,6 +18,8 @@
   ON_CALL(*this, olp_list()).WillByDefault(ReturnRef(empty_olp_list_));
   ON_CALL(*this, operator_name())
       .WillByDefault(ReturnRef(empty_operator_name_));
+  ON_CALL(*this, country())
+      .WillByDefault(ReturnRef(empty_country_));
   ON_CALL(*this, uuid()).WillByDefault(ReturnRef(empty_uuid_));
 }
 
diff --git a/mock_mobile_operator_info.h b/mock_mobile_operator_info.h
index a0ad489..0d33bfc 100644
--- a/mock_mobile_operator_info.h
+++ b/mock_mobile_operator_info.h
@@ -27,8 +27,15 @@
   MOCK_CONST_METHOD0(olp_list,
                      const std::vector<MobileOperatorInfo::OnlinePortal> &());
   MOCK_CONST_METHOD0(operator_name, const std::string &());
+  MOCK_CONST_METHOD0(country, const std::string &());
   MOCK_CONST_METHOD0(uuid, const std::string &());
 
+  MOCK_METHOD1(UpdateMCCMNC, void(const std::string &));
+  MOCK_METHOD1(UpdateSID, void(const std::string &));
+  MOCK_METHOD1(UpdateIMSI, void(const std::string &));
+  MOCK_METHOD1(UpdateNID, void(const std::string &));
+  MOCK_METHOD1(UpdateOperatorName, void(const std::string &));
+
   // Sets up the mock object to return empty strings/vectors etc for all
   // propeties.
   void SetEmptyDefaultsForProperties();
@@ -37,6 +44,7 @@
   std::string empty_mccmnc_;
   std::vector<MobileOperatorInfo::OnlinePortal> empty_olp_list_;
   std::string empty_operator_name_;
+  std::string empty_country_;
   std::string empty_uuid_;
 };