shill: cellular: Consolidate singletons passed through constructors

The following are singletons that were stored individually by many
classes, passed down constructors as the objects were created. Move
singletons to ModemInfo, and pass only a ModemInfo object down.
Singletons: ControlInterface, EventDispatcher, Metrics, Manager, GLib,
ActivatingIccidStore, CellularOperatorInfo, and mobile_provider_db.
Classes who stored all these singletons: ModemInfo, Cellular,
ModemManager (and flavours), Modem (and flavours), CellularCpability
(and flavours).

BUG=chromium:222543
TEST=(1) Build and run unit tests. (2) Test on device that LTE
activation and cellular functionality related to refactored singletons
still works. (3) Run autotest: network_3GSmokeTest.

Change-Id: I0c2866e0cd0bab63e3c3078ff73361322a8f509b
Reviewed-on: https://gerrit.chromium.org/gerrit/46485
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Prathmesh Prabhu <pprabhu@chromium.org>
Tested-by: Prathmesh Prabhu <pprabhu@chromium.org>
diff --git a/cellular.cc b/cellular.cc
index ab4d408..ab38484 100644
--- a/cellular.cc
+++ b/cellular.cc
@@ -86,10 +86,7 @@
   return dict_;
 }
 
-Cellular::Cellular(ControlInterface *control_interface,
-                   EventDispatcher *dispatcher,
-                   Metrics *metrics,
-                   Manager *manager,
+Cellular::Cellular(ModemInfo *modem_info,
                    const string &link_name,
                    const string &address,
                    int interface_index,
@@ -97,14 +94,11 @@
                    const string &owner,
                    const string &service,
                    const string &path,
-                   ActivatingIccidStore *activating_iccid_store,
-                   CellularOperatorInfo *cellular_operator_info,
-                   mobile_provider_db *provider_db,
                    ProxyFactory *proxy_factory)
-    : Device(control_interface,
-             dispatcher,
-             metrics,
-             manager,
+    : Device(modem_info->control_interface(),
+             modem_info->dispatcher(),
+             modem_info->metrics(),
+             modem_info->manager(),
              link_name,
              address,
              interface_index,
@@ -115,9 +109,7 @@
       dbus_owner_(owner),
       dbus_service_(service),
       dbus_path_(path),
-      activating_iccid_store_(activating_iccid_store),
-      cellular_operator_info_(cellular_operator_info),
-      provider_db_(provider_db),
+      modem_info_(modem_info),
       proxy_factory_(proxy_factory),
       allow_roaming_(false),
       explicit_disconnect_(false) {
@@ -290,19 +282,18 @@
     case kTypeGSM:
       capability_.reset(new CellularCapabilityGSM(this,
                                                   proxy_factory_,
-                                                  metrics()));
+                                                  modem_info_));
       break;
     case kTypeCDMA:
       capability_.reset(new CellularCapabilityCDMA(this,
                                                    proxy_factory_,
-                                                   metrics()));
+                                                   modem_info_));
       break;
     case kTypeUniversal:
       capability_.reset(new CellularCapabilityUniversal(
           this,
           proxy_factory_,
-          metrics(),
-          activating_iccid_store_));
+          modem_info_));
       break;
     default: NOTREACHED();
   }
diff --git a/cellular.h b/cellular.h
index fc21c37..69f27fc 100644
--- a/cellular.h
+++ b/cellular.h
@@ -17,6 +17,7 @@
 #include "shill/device.h"
 #include "shill/event_dispatcher.h"
 #include "shill/metrics.h"
+#include "shill/modem_info.h"
 #include "shill/modem_proxy_interface.h"
 #include "shill/refptr_types.h"
 
@@ -24,9 +25,7 @@
 
 namespace shill {
 
-class ActivatingIccidStore;
 class CellularCapability;
-class CellularOperatorInfo;
 class Error;
 class ProxyFactory;
 
@@ -102,10 +101,7 @@
   // |service| is the modem mananager service name (e.g.,
   // /org/freeDesktop/ModemManager, /org/freedesktop/ModemManager1
   // or /org/chromium/ModemManager).
-  Cellular(ControlInterface *control_interface,
-           EventDispatcher *dispatcher,
-           Metrics *metrics,
-           Manager *manager,
+  Cellular(ModemInfo *modem_info,
            const std::string &link_name,
            const std::string &address,
            int interface_index,
@@ -113,9 +109,6 @@
            const std::string &owner,
            const std::string &service,
            const std::string &path,
-           ActivatingIccidStore *activating_iccid_store,
-           CellularOperatorInfo *cellular_operator_info,
-           mobile_provider_db *provider_db,
            ProxyFactory *proxy_factory);
   virtual ~Cellular();
 
@@ -160,11 +153,6 @@
   bool IsModemRegistered() const;
   static bool IsEnabledModemState(ModemState state);
 
-  CellularOperatorInfo *cellular_operator_info() const {
-    return cellular_operator_info_;
-  }
-  mobile_provider_db *provider_db() const { return provider_db_; }
-
   const std::string &dbus_owner() const { return dbus_owner_; }
   const std::string &dbus_path() const { return dbus_path_; }
 
@@ -338,9 +326,7 @@
   const std::string dbus_service_;  // org.*.ModemManager*
   const std::string dbus_path_;  // ModemManager.Modem
 
-  ActivatingIccidStore *activating_iccid_store_;
-  CellularOperatorInfo *cellular_operator_info_;
-  mobile_provider_db *provider_db_;
+  ModemInfo *modem_info_;
   ProxyFactory *proxy_factory_;
 
   CellularServiceRefPtr service_;
diff --git a/cellular_capability.cc b/cellular_capability.cc
index adb3aa9..ceb477c 100644
--- a/cellular_capability.cc
+++ b/cellular_capability.cc
@@ -31,10 +31,10 @@
 
 CellularCapability::CellularCapability(Cellular *cellular,
                                        ProxyFactory *proxy_factory,
-                                       Metrics *metrics)
+                                       ModemInfo *modem_info)
     : cellular_(cellular),
       proxy_factory_(proxy_factory),
-      metrics_(metrics){
+      modem_info_(modem_info){
 }
 
 CellularCapability::~CellularCapability() {}
diff --git a/cellular_capability.h b/cellular_capability.h
index 22c3c3e..d9ce029 100644
--- a/cellular_capability.h
+++ b/cellular_capability.h
@@ -22,6 +22,7 @@
 
 class Cellular;
 class Error;
+class ModemInfo;
 class ProxyFactory;
 
 // Cellular devices instantiate subclasses of CellularCapability that
@@ -75,12 +76,12 @@
   // |cellular| is the parent Cellular device.
   CellularCapability(Cellular *cellular,
                      ProxyFactory *proxy_factory,
-                     Metrics *metrics);
+                     ModemInfo *modem_info);
   virtual ~CellularCapability();
 
   Cellular *cellular() const { return cellular_; }
   ProxyFactory *proxy_factory() const { return proxy_factory_; }
-  Metrics *metrics() const { return metrics_; }
+  ModemInfo *modem_info() const { return modem_info_; }
 
   // Invoked by the parent Cellular device when a new service is created.
   virtual void OnServiceCreated() = 0;
@@ -220,9 +221,8 @@
 
   Cellular *cellular_;
 
-  // Store cached copies of singletons for speed/ease of testing.
   ProxyFactory *proxy_factory_;
-  Metrics *metrics_;
+  ModemInfo *modem_info_;
 
   DISALLOW_COPY_AND_ASSIGN(CellularCapability);
 };
diff --git a/cellular_capability_cdma.cc b/cellular_capability_cdma.cc
index 106d627..752272d 100644
--- a/cellular_capability_cdma.cc
+++ b/cellular_capability_cdma.cc
@@ -30,8 +30,8 @@
 
 CellularCapabilityCDMA::CellularCapabilityCDMA(Cellular *cellular,
                                                ProxyFactory *proxy_factory,
-                                               Metrics *metrics)
-    : CellularCapabilityClassic(cellular, proxy_factory, metrics),
+                                               ModemInfo *modem_info)
+    : CellularCapabilityClassic(cellular, proxy_factory, modem_info),
       weak_ptr_factory_(this),
       activation_starting_(false),
       activation_state_(MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED),
diff --git a/cellular_capability_cdma.h b/cellular_capability_cdma.h
index d21e8a0..8495a76 100644
--- a/cellular_capability_cdma.h
+++ b/cellular_capability_cdma.h
@@ -20,11 +20,13 @@
 
 namespace shill {
 
+class ModemInfo;
+
 class CellularCapabilityCDMA : public CellularCapabilityClassic {
  public:
   CellularCapabilityCDMA(Cellular *cellular,
                          ProxyFactory *proxy_factory,
-                         Metrics *metrics);
+                         ModemInfo *modem_info);
 
   // Inherited from CellularCapability.
   virtual void StartModem(Error *error, const ResultCallback &callback);
diff --git a/cellular_capability_cdma_unittest.cc b/cellular_capability_cdma_unittest.cc
index bd6e43c..93c3bd7 100644
--- a/cellular_capability_cdma_unittest.cc
+++ b/cellular_capability_cdma_unittest.cc
@@ -15,12 +15,9 @@
 #include "shill/event_dispatcher.h"
 #include "shill/mock_adaptors.h"
 #include "shill/mock_cellular.h"
-#include "shill/mock_glib.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_metrics.h"
 #include "shill/mock_modem_cdma_proxy.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_modem_proxy.h"
-#include "shill/nice_mock_control.h"
 #include "shill/proxy_factory.h"
 
 using base::Bind;
@@ -36,12 +33,8 @@
 class CellularCapabilityCDMATest : public testing::Test {
  public:
   CellularCapabilityCDMATest()
-      : manager_(&control_, &dispatcher_, &metrics_, &glib_),
-        metrics_(&dispatcher_),
-        cellular_(new MockCellular(&control_,
-                                   &dispatcher_,
-                                   &metrics_,
-                                   &manager_,
+      : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
+        cellular_(new MockCellular(&modem_info_,
                                    "",
                                    "",
                                    0,
@@ -49,15 +42,12 @@
                                    "",
                                    "",
                                    "",
-                                   NULL,
-                                   NULL,
-                                   NULL,
                                    ProxyFactory::GetInstance())),
         classic_proxy_(new MockModemProxy()),
         proxy_(new MockModemCDMAProxy()),
         capability_(NULL) {
-    metrics_.RegisterDevice(cellular_->interface_index(),
-                            Technology::kCellular);
+    modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
+                                          Technology::kCellular);
   }
 
   virtual ~CellularCapabilityCDMATest() {
@@ -131,18 +121,16 @@
 
   void SetService() {
     cellular_->service_ = new CellularService(
-        &control_, &dispatcher_, &metrics_, &manager_, cellular_);
+        modem_info_.control_interface(), modem_info_.dispatcher(),
+        modem_info_.metrics(), modem_info_.manager(), cellular_);
   }
 
   void SetDeviceState(Cellular::State state) {
     cellular_->state_ = state;
   }
 
-  NiceMockControl control_;
   EventDispatcher dispatcher_;
-  MockGLib glib_;
-  MockManager manager_;
-  MockMetrics metrics_;
+  MockModemInfo modem_info_;
   scoped_refptr<MockCellular> cellular_;
   scoped_ptr<MockModemProxy> classic_proxy_;
   scoped_ptr<MockModemCDMAProxy> proxy_;
@@ -387,7 +375,7 @@
           &CellularCapabilityCDMATest::InvokeGetRegistrationState));
   SetProxy();
   cellular_->state_ = Cellular::kStateEnabled;
-  EXPECT_CALL(manager_, RegisterService(_));
+  EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
   capability_->GetRegistrationState();
   dispatcher_.DispatchPendingEvents();
   EXPECT_EQ(MM_MODEM_CDMA_REGISTRATION_STATE_REGISTERED,
diff --git a/cellular_capability_classic.cc b/cellular_capability_classic.cc
index 0a23dde..a7fd487 100644
--- a/cellular_capability_classic.cc
+++ b/cellular_capability_classic.cc
@@ -63,8 +63,8 @@
 CellularCapabilityClassic::CellularCapabilityClassic(
     Cellular *cellular,
     ProxyFactory *proxy_factory,
-    Metrics *metrics)
-    : CellularCapability(cellular, proxy_factory, metrics),
+    ModemInfo *modem_info)
+    : CellularCapability(cellular, proxy_factory, modem_info),
       scanning_supported_(false),
       weak_ptr_factory_(this) {
   PropertyStore *store = cellular->mutable_store();
@@ -123,12 +123,15 @@
   GetSignalQuality();
   // We expect the modem to start scanning after it has been enabled.
   // Change this if this behavior is no longer the case in the future.
-  metrics()->NotifyDeviceEnableFinished(cellular()->interface_index());
-  metrics()->NotifyDeviceScanStarted(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceEnableFinished(
+      cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceScanStarted(
+      cellular()->interface_index());
 }
 
 void CellularCapabilityClassic::FinishDisable(const ResultCallback &callback) {
-  metrics()->NotifyDeviceDisableFinished(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceDisableFinished(
+      cellular()->interface_index());
   ReleaseProxies();
   callback.Run(Error());
 }
@@ -168,7 +171,8 @@
   SLOG(Cellular, 2) << __func__;
   CHECK(!callback.is_null());
   Error error;
-  metrics()->NotifyDeviceEnableStarted(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceEnableStarted(
+      cellular()->interface_index());
   proxy_->Enable(true, &error, callback, kTimeoutEnable);
   if (error.IsFailure())
     callback.Run(error);
@@ -179,7 +183,8 @@
   SLOG(Cellular, 2) << __func__;
   CHECK(!callback.is_null());
   Error error;
-  metrics()->NotifyDeviceDisableStarted(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceDisableStarted(
+      cellular()->interface_index());
   proxy_->Enable(false, &error, callback, kTimeoutEnable);
   if (error.IsFailure())
       callback.Run(error);
diff --git a/cellular_capability_classic.h b/cellular_capability_classic.h
index 53c9892..7784036 100644
--- a/cellular_capability_classic.h
+++ b/cellular_capability_classic.h
@@ -27,6 +27,7 @@
 class Error;
 class EventDispatcher;
 class ModemGobiProxyInterface;
+class ModemInfo;
 class ProxyFactory;
 
 enum ModemClassicState {
@@ -57,7 +58,7 @@
   // |cellular| is the parent Cellular device.
   CellularCapabilityClassic(Cellular *cellular,
                             ProxyFactory *proxy_factory,
-                            Metrics *metrics);
+                            ModemInfo *modem_info);
   virtual ~CellularCapabilityClassic();
 
   virtual void StopModem(Error *error, const ResultCallback &callback);
diff --git a/cellular_capability_classic_unittest.cc b/cellular_capability_classic_unittest.cc
index 91820a5..99d6ef2 100644
--- a/cellular_capability_classic_unittest.cc
+++ b/cellular_capability_classic_unittest.cc
@@ -15,18 +15,15 @@
 #include "shill/error.h"
 #include "shill/event_dispatcher.h"
 #include "shill/mock_adaptors.h"
-#include "shill/mock_glib.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_metrics.h"
 #include "shill/mock_modem_cdma_proxy.h"
 #include "shill/mock_modem_gobi_proxy.h"
 #include "shill/mock_modem_gsm_card_proxy.h"
 #include "shill/mock_modem_gsm_network_proxy.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_modem_proxy.h"
 #include "shill/mock_modem_simple_proxy.h"
 #include "shill/mock_profile.h"
 #include "shill/mock_rtnl_handler.h"
-#include "shill/nice_mock_control.h"
 #include "shill/proxy_factory.h"
 
 using base::Bind;
@@ -48,8 +45,7 @@
 class CellularCapabilityTest : public testing::Test {
  public:
   CellularCapabilityTest()
-      : metrics_(&dispatcher_),
-        manager_(&control_, &dispatcher_, &metrics_, &glib_),
+      : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
         create_gsm_card_proxy_from_factory_(false),
         proxy_(new MockModemProxy()),
         simple_proxy_(new MockModemSimpleProxy()),
@@ -60,11 +56,7 @@
         proxy_factory_(this),
         capability_(NULL),
         device_adaptor_(NULL),
-        provider_db_(NULL),
-        cellular_(new Cellular(&control_,
-                               &dispatcher_,
-                               &metrics_,
-                               &manager_,
+        cellular_(new Cellular(&modem_info_,
                                "",
                                "",
                                0,
@@ -72,11 +64,8 @@
                                "",
                                "",
                                "",
-                               NULL,
-                               NULL,
-                               NULL,
                                &proxy_factory_)) {
-    metrics_.RegisterDevice(cellular_->interface_index(),
+    modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
                             Technology::kCellular);
   }
 
@@ -84,8 +73,6 @@
     cellular_->service_ = NULL;
     capability_ = NULL;
     device_adaptor_ = NULL;
-    mobile_provider_close_db(provider_db_);
-    provider_db_ = NULL;
   }
 
   virtual void SetUp() {
@@ -94,22 +81,22 @@
     capability_ = dynamic_cast<CellularCapabilityClassic *>(
         cellular_->capability_.get());
     device_adaptor_ =
-        dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
+        dynamic_cast<DeviceMockAdaptor*>(cellular_->adaptor());
+    ASSERT_TRUE(device_adaptor_ != NULL);
   }
 
   virtual void TearDown() {
     capability_->proxy_factory_ = NULL;
   }
 
-  void InitProviderDB() {
-    provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
-    ASSERT_TRUE(provider_db_);
-    cellular_->provider_db_ = provider_db_;
-  }
-
   void SetService() {
     cellular_->service_ = new CellularService(
-        &control_, &dispatcher_, &metrics_, NULL, cellular_);
+        modem_info_.control_interface(), modem_info_.dispatcher(),
+        modem_info_.metrics(), modem_info_.manager(), cellular_);
+  }
+
+  void InitProviderDB() {
+    modem_info_.SetProviderDB(kTestMobileProviderDBPath);
   }
 
   CellularCapabilityGSM *GetGsmCapability() {
@@ -239,11 +226,8 @@
     create_gsm_card_proxy_from_factory_ = true;
   }
 
-  NiceMockControl control_;
   EventDispatcher dispatcher_;
-  MockMetrics metrics_;
-  MockGLib glib_;
-  MockManager manager_;
+  MockModemInfo modem_info_;
   MockRTNLHandler rtnl_handler_;
   bool create_gsm_card_proxy_from_factory_;
   scoped_ptr<MockModemProxy> proxy_;
@@ -254,8 +238,7 @@
   scoped_ptr<MockModemGobiProxy> gobi_proxy_;
   TestProxyFactory proxy_factory_;
   CellularCapabilityClassic *capability_;  // Owned by |cellular_|.
-  NiceMock<DeviceMockAdaptor> *device_adaptor_;  // Owned by |cellular_|.
-  mobile_provider_db *provider_db_;
+  DeviceMockAdaptor *device_adaptor_;  // Owned by |cellular_|.
   CellularRefPtr cellular_;
 };
 
@@ -412,7 +395,8 @@
   InitProviderDB();
   gsm_capability->SetHomeProvider();
   ProfileRefPtr profile(new NiceMock<MockProfile>(
-      &control_, &metrics_, reinterpret_cast<Manager *>(NULL)));
+      modem_info_.control_interface(), modem_info_.metrics(),
+      modem_info_.manager()));
   cellular_->service()->set_profile(profile);
 
   Error error;
diff --git a/cellular_capability_gsm.cc b/cellular_capability_gsm.cc
index a9ca732..c684135 100644
--- a/cellular_capability_gsm.cc
+++ b/cellular_capability_gsm.cc
@@ -52,8 +52,8 @@
 
 CellularCapabilityGSM::CellularCapabilityGSM(Cellular *cellular,
                                              ProxyFactory *proxy_factory,
-                                             Metrics *metrics)
-    : CellularCapabilityClassic(cellular, proxy_factory, metrics),
+                                             ModemInfo *modem_info)
+    : CellularCapabilityClassic(cellular, proxy_factory, modem_info),
       weak_ptr_factory_(this),
       registration_state_(MM_MODEM_GSM_NETWORK_REG_STATUS_UNKNOWN),
       access_technology_(MM_MODEM_GSM_ACCESS_TECH_UNKNOWN),
@@ -474,12 +474,12 @@
                     << " SPN: " << spn_ << ")";
   // TODO(petkov): The test for NULL provider_db should be done by
   // mobile_provider_lookup_best_match.
-  if (imsi_.empty() || !cellular()->provider_db()) {
+  if (imsi_.empty() || !modem_info()->provider_db()) {
     return;
   }
   mobile_provider *provider =
       mobile_provider_lookup_best_match(
-          cellular()->provider_db(), spn_.c_str(), imsi_.c_str());
+          modem_info()->provider_db(), spn_.c_str(), imsi_.c_str());
   if (!provider) {
     SLOG(Cellular, 2) << "GSM provider not found.";
     return;
@@ -514,7 +514,7 @@
   if (!network_id.empty()) {
     SLOG(Cellular, 2) << "Looking up network id: " << network_id;
     mobile_provider *provider =
-        mobile_provider_lookup_by_network(cellular()->provider_db(),
+        mobile_provider_lookup_by_network(modem_info()->provider_db(),
                                           network_id.c_str());
     if (provider) {
       if (serving_operator_.GetName().empty()) {
@@ -780,7 +780,7 @@
       ContainsKey(parsed, flimflam::kNetworkIdProperty)) {
     mobile_provider *provider =
         mobile_provider_lookup_by_network(
-            cellular()->provider_db(),
+            modem_info()->provider_db(),
             parsed[flimflam::kNetworkIdProperty].c_str());
     if (provider) {
       const char *long_name = mobile_provider_get_name(provider);
diff --git a/cellular_capability_gsm.h b/cellular_capability_gsm.h
index e3799ee..1bb956a 100644
--- a/cellular_capability_gsm.h
+++ b/cellular_capability_gsm.h
@@ -25,11 +25,13 @@
 
 namespace shill {
 
+class ModemInfo;
+
 class CellularCapabilityGSM : public CellularCapabilityClassic {
  public:
   CellularCapabilityGSM(Cellular *cellular,
                         ProxyFactory *proxy_factory,
-                        Metrics *metrics);
+                        ModemInfo *modem_info);
 
   // Inherited from CellularCapability.
   virtual void StartModem(Error *error, const ResultCallback &callback);
diff --git a/cellular_capability_gsm_unittest.cc b/cellular_capability_gsm_unittest.cc
index d372685..5d5508b 100644
--- a/cellular_capability_gsm_unittest.cc
+++ b/cellular_capability_gsm_unittest.cc
@@ -20,13 +20,12 @@
 #include "shill/event_dispatcher.h"
 #include "shill/mock_adaptors.h"
 #include "shill/mock_log.h"
-#include "shill/mock_metrics.h"
 #include "shill/mock_modem_gsm_card_proxy.h"
 #include "shill/mock_modem_gsm_network_proxy.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_modem_proxy.h"
 #include "shill/mock_modem_simple_proxy.h"
 #include "shill/mock_profile.h"
-#include "shill/nice_mock_control.h"
 #include "shill/proxy_factory.h"
 
 using base::Bind;
@@ -54,7 +53,7 @@
 class CellularCapabilityGSMTest : public testing::Test {
  public:
   CellularCapabilityGSMTest()
-      : metrics_(&dispatcher_),
+      : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
         create_card_proxy_from_factory_(false),
         proxy_(new MockModemProxy()),
         simple_proxy_(new MockModemSimpleProxy()),
@@ -63,11 +62,7 @@
         proxy_factory_(this),
         capability_(NULL),
         device_adaptor_(NULL),
-        provider_db_(NULL),
-        cellular_(new Cellular(&control_,
-                               &dispatcher_,
-                               &metrics_,
-                               NULL,
+        cellular_(new Cellular(&modem_info_,
                                "",
                                kAddress,
                                0,
@@ -75,20 +70,13 @@
                                "",
                                "",
                                "",
-                               NULL,
-                               NULL,
-                               NULL,
                                &proxy_factory_)) {
-    metrics_.RegisterDevice(cellular_->interface_index(),
-                            Technology::kCellular);
+    modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
+                                          Technology::kCellular);
   }
 
   virtual ~CellularCapabilityGSMTest() {
     cellular_->service_ = NULL;
-    if (provider_db_) {
-      mobile_provider_close_db(provider_db_);
-      provider_db_ = NULL;
-    }
     capability_ = NULL;
     device_adaptor_ = NULL;
   }
@@ -97,7 +85,11 @@
     capability_ =
         dynamic_cast<CellularCapabilityGSM *>(cellular_->capability_.get());
     device_adaptor_ =
-        dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
+        dynamic_cast<DeviceMockAdaptor *>(cellular_->adaptor());
+  }
+
+  void InitProviderDB() {
+    modem_info_.SetProviderDB(kTestMobileProviderDBPath);
   }
 
   void InvokeEnable(bool enable, Error *error,
@@ -270,13 +262,8 @@
 
   void SetService() {
     cellular_->service_ = new CellularService(
-        &control_, &dispatcher_, &metrics_, NULL, cellular_);
-  }
-
-  void InitProviderDB() {
-    provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
-    ASSERT_TRUE(provider_db_);
-    cellular_->provider_db_ = provider_db_;
+        modem_info_.control_interface(), modem_info_.dispatcher(),
+        modem_info_.metrics(), modem_info_.manager(), cellular_);
   }
 
   void SetupCommonProxiesExpectations() {
@@ -318,9 +305,8 @@
     create_card_proxy_from_factory_ = true;
   }
 
-  NiceMockControl control_;
   EventDispatcher dispatcher_;
-  MockMetrics metrics_;
+  MockModemInfo modem_info_;
   bool create_card_proxy_from_factory_;
   scoped_ptr<MockModemProxy> proxy_;
   scoped_ptr<MockModemSimpleProxy> simple_proxy_;
@@ -328,8 +314,7 @@
   scoped_ptr<MockModemGSMNetworkProxy> network_proxy_;
   TestProxyFactory proxy_factory_;
   CellularCapabilityGSM *capability_;  // Owned by |cellular_|.
-  NiceMock<DeviceMockAdaptor> *device_adaptor_;  // Owned by |cellular_|.
-  mobile_provider_db *provider_db_;
+  DeviceMockAdaptor *device_adaptor_;  // Owned by |cellular_|.
   CellularRefPtr cellular_;
   ScanResultsCallback scan_callback_;  // saved for testing scan operations
 };
@@ -733,7 +718,7 @@
 TEST_F(CellularCapabilityGSMTest, InitAPNList) {
   InitProviderDB();
   capability_->home_provider_ =
-      mobile_provider_lookup_by_name(cellular_->provider_db(), "T-Mobile");
+      mobile_provider_lookup_by_name(modem_info_.provider_db(), "T-Mobile");
   ASSERT_TRUE(capability_->home_provider_);
   EXPECT_EQ(0, capability_->apn_list_.size());
   EXPECT_CALL(*device_adaptor_,
@@ -948,7 +933,8 @@
   EXPECT_EQ(kTmobileApn, props[flimflam::kApnProperty].reader().get_string());
 
   ProfileRefPtr profile(new NiceMock<MockProfile>(
-      &control_, &metrics_, reinterpret_cast<Manager *>(NULL)));
+      modem_info_.control_interface(), modem_info_.metrics(),
+      modem_info_.manager()));
   cellular_->service()->set_profile(profile);
   Stringmap apn_info;
   apn_info[flimflam::kApnProperty] = kLastGoodApn;
diff --git a/cellular_capability_universal.cc b/cellular_capability_universal.cc
index 76f4ed9..79afa30 100644
--- a/cellular_capability_universal.cc
+++ b/cellular_capability_universal.cc
@@ -125,9 +125,8 @@
 CellularCapabilityUniversal::CellularCapabilityUniversal(
     Cellular *cellular,
     ProxyFactory *proxy_factory,
-    Metrics *metrics,
-    ActivatingIccidStore *activating_iccid_store)
-    : CellularCapability(cellular, proxy_factory, metrics),
+    ModemInfo *modem_info)
+    : CellularCapability(cellular, proxy_factory, modem_info),
       weak_ptr_factory_(this),
       registration_state_(MM_MODEM_3GPP_REGISTRATION_STATE_UNKNOWN),
       cdma_registration_state_(MM_MODEM_CDMA_REGISTRATION_STATE_UNKNOWN),
@@ -145,7 +144,6 @@
       scanning_or_searching_(false),
       scan_interval_(0),
       sim_present_(false),
-      activating_iccid_store_(activating_iccid_store),
       reset_done_(false),
       scanning_or_searching_timeout_milliseconds_(
           kDefaultScanningOrSearchingTimeoutMilliseconds) {
@@ -262,7 +260,8 @@
   SLOG(Cellular, 2) << __func__;
   CHECK(!callback.is_null());
   Error local_error(Error::kOperationInitiated);
-  metrics()->NotifyDeviceEnableStarted(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceEnableStarted(
+      cellular()->interface_index());
   modem_proxy_->Enable(
       true,
       &local_error,
@@ -297,8 +296,10 @@
   GetProperties();
   // We expect the modem to start scanning after it has been enabled.
   // Change this if this behavior is no longer the case in the future.
-  metrics()->NotifyDeviceEnableFinished(cellular()->interface_index());
-  metrics()->NotifyDeviceScanStarted(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceEnableFinished(
+      cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceScanStarted(
+      cellular()->interface_index());
   callback.Run(error);
 }
 
@@ -338,7 +339,8 @@
 
 void CellularCapabilityUniversal::Stop_Disable(const ResultCallback &callback) {
   Error error;
-  metrics()->NotifyDeviceDisableStarted(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceDisableStarted(
+      cellular()->interface_index());
   modem_proxy_->Enable(
       false, &error,
       Bind(&CellularCapabilityUniversal::Stop_DisableCompleted,
@@ -392,7 +394,8 @@
   // Since the disable succeeded, if power down fails, we currently fail
   // silently, i.e. we need to report the disable operation as having
   // succeeded.
-  metrics()->NotifyDeviceDisableFinished(cellular()->interface_index());
+  modem_info()->metrics()->NotifyDeviceDisableFinished(
+      cellular()->interface_index());
   ReleaseProxies();
   callback.Run(Error());
 }
@@ -452,7 +455,7 @@
   if (cellular()->service().get())
     cellular()->service()->SetActivationState(
         flimflam::kActivationStateActivating);
-  activating_iccid_store_->SetActivationState(
+  modem_info()->activating_iccid_store()->SetActivationState(
       sim_identifier_,
       ActivatingIccidStore::kStatePending);
 }
@@ -492,7 +495,7 @@
   // the ICCID from persistence.
   bool got_mdn = IsMdnValid();
   if (got_mdn && !sim_identifier_.empty())
-      activating_iccid_store_->RemoveEntry(sim_identifier_);
+      modem_info()->activating_iccid_store()->RemoveEntry(sim_identifier_);
 
   CellularServiceRefPtr service = cellular()->service();
 
@@ -518,7 +521,8 @@
     return;
 
   ActivatingIccidStore::State state =
-      activating_iccid_store_->GetActivationState(sim_identifier_);
+      modem_info()->activating_iccid_store()->GetActivationState(
+          sim_identifier_);
   switch (state) {
     case ActivatingIccidStore::kStatePending:
       // Always mark the service as activating here, as the ICCID could have
@@ -526,7 +530,7 @@
       service->SetActivationState(flimflam::kActivationStateActivating);
       if (reset_done_) {
         SLOG(Cellular, 2) << "Post-payment activation reset complete.";
-        activating_iccid_store_->SetActivationState(
+        modem_info()->activating_iccid_store()->SetActivationState(
             sim_identifier_,
             ActivatingIccidStore::kStateActivated);
       } else if (registered) {
@@ -569,8 +573,8 @@
   string storage_id;
   if (!operator_id_.empty()) {
     const CellularOperatorInfo::CellularOperator *provider =
-      cellular()->cellular_operator_info()->
-          GetCellularOperatorByMCCMNC(operator_id_);
+        modem_info()->cellular_operator_info()->GetCellularOperatorByMCCMNC(
+            operator_id_);
     if (provider && !provider->identifier().empty()) {
       storage_id = prefix + provider->identifier();
     }
@@ -590,8 +594,8 @@
   bool activation_required = IsServiceActivationRequired();
   string activation_state = flimflam::kActivationStateActivated;
   if (!sim_identifier_.empty() &&
-       activating_iccid_store_->GetActivationState(sim_identifier_) ==
-          ActivatingIccidStore::kStatePending)
+       modem_info()->activating_iccid_store()->GetActivationState(
+           sim_identifier_) == ActivatingIccidStore::kStatePending)
     activation_state = flimflam::kActivationStateActivating;
   else if (activation_required)
     activation_state = flimflam::kActivationStateNotActivated;
@@ -777,14 +781,14 @@
   SLOG(Cellular, 2) << __func__ << "(IMSI: " << imsi_
           << " SPN: " << spn_ << ")";
 
-  if (!cellular()->provider_db())
+  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 = mobile_provider_lookup_best_match(
-      cellular()->provider_db(),
+      modem_info()->provider_db(),
       spn_.c_str(),
       network_id.c_str());
   if (!provider) {
@@ -870,11 +874,11 @@
 }
 
 void CellularCapabilityUniversal::UpdateOLP() {
-  if (!cellular()->cellular_operator_info())
+  if (!modem_info()->cellular_operator_info())
     return;
 
   const CellularService::OLP *result =
-      cellular()->cellular_operator_info()->GetOLPByMCCMNC(operator_id_);
+      modem_info()->cellular_operator_info()->GetOLPByMCCMNC(operator_id_);
   if (!result)
     return;
 
@@ -917,7 +921,7 @@
   if (!network_id.empty()) {
     SLOG(Cellular, 2) << "Looking up network id: " << network_id;
     mobile_provider *provider =
-        mobile_provider_lookup_by_network(cellular()->provider_db(),
+        mobile_provider_lookup_by_network(modem_info()->provider_db(),
                                           network_id.c_str());
     if (provider) {
       if (serving_operator_.GetName().empty()) {
@@ -1034,17 +1038,17 @@
 
 bool CellularCapabilityUniversal::IsServiceActivationRequired() const {
   if (!sim_identifier_.empty() &&
-      activating_iccid_store_->GetActivationState(sim_identifier_) ==
-          ActivatingIccidStore::kStateActivated)
+      modem_info()->activating_iccid_store()->GetActivationState(
+          sim_identifier_) == ActivatingIccidStore::kStateActivated)
     return false;
 
   // If there is no online payment portal information, it's safer to assume
   // the service does not require activation.
-  if (!cellular()->cellular_operator_info())
+  if (!modem_info()->cellular_operator_info())
     return false;
 
   const CellularService::OLP *olp =
-      cellular()->cellular_operator_info()->GetOLPByMCCMNC(operator_id_);
+      modem_info()->cellular_operator_info()->GetOLPByMCCMNC(operator_id_);
   if (!olp)
     return false;
 
@@ -1295,7 +1299,7 @@
       ContainsKey(parsed, flimflam::kNetworkIdProperty)) {
     mobile_provider *provider =
         mobile_provider_lookup_by_network(
-            cellular()->provider_db(),
+            modem_info()->provider_db(),
             parsed[flimflam::kNetworkIdProperty].c_str());
     if (provider) {
       const char *long_name = mobile_provider_get_name(provider);
diff --git a/cellular_capability_universal.h b/cellular_capability_universal.h
index a7a4e35..2eccaab 100644
--- a/cellular_capability_universal.h
+++ b/cellular_capability_universal.h
@@ -30,7 +30,7 @@
 
 namespace shill {
 
-class ActivatingIccidStore;
+class ModemInfo;
 
 // CellularCapabilityUniversal handles modems using the
 // org.chromium.ModemManager1 DBUS interface.  This class is used for
@@ -60,8 +60,7 @@
 
   CellularCapabilityUniversal(Cellular *cellular,
                               ProxyFactory *proxy_factory,
-                              Metrics *metrics,
-                              ActivatingIccidStore *activating_iccid_store);
+                              ModemInfo *modem_info);
 
   // Inherited from CellularCapability.
   // Checks the modem state.  If the state is kModemStateDisabled, then the
@@ -394,9 +393,6 @@
   std::string sim_path_;
   bool sim_present_;
   DBus::Path bearer_path_;
-
-  // Post-payment activation state.
-  ActivatingIccidStore *activating_iccid_store_;
   bool reset_done_;
 
   // If the modem is not in a state to be enabled when StartModem is called,
diff --git a/cellular_capability_universal_unittest.cc b/cellular_capability_universal_unittest.cc
index 2e79224..ae76532 100644
--- a/cellular_capability_universal_unittest.cc
+++ b/cellular_capability_universal_unittest.cc
@@ -27,18 +27,15 @@
 #include "shill/mock_cellular_service.h"
 #include "shill/mock_dbus_properties_proxy.h"
 #include "shill/mock_event_dispatcher.h"
-#include "shill/mock_glib.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_metrics.h"
 #include "shill/mock_mm1_bearer_proxy.h"
 #include "shill/mock_mm1_modem_modem3gpp_proxy.h"
 #include "shill/mock_mm1_modem_modemcdma_proxy.h"
 #include "shill/mock_mm1_modem_proxy.h"
 #include "shill/mock_mm1_modem_simple_proxy.h"
 #include "shill/mock_mm1_sim_proxy.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_profile.h"
 #include "shill/mock_rtnl_handler.h"
-#include "shill/nice_mock_control.h"
 #include "shill/proxy_factory.h"
 
 using base::Bind;
@@ -74,9 +71,7 @@
 class CellularCapabilityUniversalTest : public testing::TestWithParam<string> {
  public:
   CellularCapabilityUniversalTest(EventDispatcher *dispatcher)
-      : event_dispatcher_(dispatcher),
-        metrics_(dispatcher),
-        manager_(&control_, dispatcher, &metrics_, &glib_),
+      : modem_info_(NULL, dispatcher, NULL, NULL, NULL),
         bearer_proxy_(new mm1::MockBearerProxy()),
         modem_3gpp_proxy_(new mm1::MockModemModem3gppProxy()),
         modem_cdma_proxy_(new mm1::MockModemModemCdmaProxy()),
@@ -87,11 +82,7 @@
         proxy_factory_(this),
         capability_(NULL),
         device_adaptor_(NULL),
-        provider_db_(NULL),
-        cellular_(new Cellular(&control_,
-                               dispatcher,
-                               &metrics_,
-                               &manager_,
+        cellular_(new Cellular(&modem_info_,
                                "",
                                kMachineAddress,
                                0,
@@ -99,62 +90,47 @@
                                "",
                                "",
                                "",
-                               NULL,
-                               NULL,
-                               NULL,
                                &proxy_factory_)),
-        service_(new MockCellularService(&control_,
-                                         dispatcher,
-                                         &metrics_,
-                                         &manager_,
+        service_(new MockCellularService(modem_info_.control_interface(),
+                                         modem_info_.dispatcher(),
+                                         modem_info_.metrics(),
+                                         modem_info_.manager(),
                                          cellular_)) {
-    metrics_.RegisterDevice(cellular_->interface_index(),
-                            Technology::kCellular);
+    modem_info_.metrics()->RegisterDevice(cellular_->interface_index(),
+                                          Technology::kCellular);
   }
 
   virtual ~CellularCapabilityUniversalTest() {
     cellular_->service_ = NULL;
     capability_ = NULL;
     device_adaptor_ = NULL;
-    if (provider_db_) {
-      mobile_provider_close_db(provider_db_);
-      provider_db_ = NULL;
-    }
   }
 
   virtual void SetUp() {
     capability_ = dynamic_cast<CellularCapabilityUniversal *>(
         cellular_->capability_.get());
     device_adaptor_ =
-        dynamic_cast<NiceMock<DeviceMockAdaptor> *>(cellular_->adaptor());
+        dynamic_cast<DeviceMockAdaptor *>(cellular_->adaptor());
     cellular_->service_ = service_;
-    SetMockIccidStore();
+
+    // kStateUnknown leads to minimal extra work in maintaining
+    // activation state.
+    ON_CALL(*modem_info_.mock_activating_iccid_store(), GetActivationState(_)).
+      WillByDefault(Return(ActivatingIccidStore::kStateUnknown));
   }
 
   virtual void TearDown() {
     capability_->proxy_factory_ = NULL;
   }
 
+  void InitProviderDB() {
+    modem_info_.SetProviderDB(kTestMobileProviderDBPath);
+  }
+
   void SetService() {
     cellular_->service_ = new CellularService(
-        &control_, event_dispatcher_, &metrics_, NULL, cellular_);
-  }
-
-  void SetMockIccidStore() {
-    // Assumption: capability_ points to cellular_->capability_.
-    capability_->activating_iccid_store_ = &mock_iccid_store_;
-    // kStateUnknown leads to minimal extra work in maintaining
-    // activation state.
-    ON_CALL(mock_iccid_store_, GetActivationState(_)).
-      WillByDefault(Return(ActivatingIccidStore::kStateUnknown));
-  }
-
-  void InitProviderDB() {
-    const char kTestMobileProviderDBPath[] = "provider_db_unittest.bfd";
-
-    provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
-    ASSERT_TRUE(provider_db_);
-    cellular_->provider_db_ = provider_db_;
+        modem_info_.control_interface(), modem_info_.dispatcher(),
+        modem_info_.metrics(), modem_info_.manager(), cellular_);
   }
 
   void InvokeEnable(bool enable, Error *error,
@@ -205,6 +181,7 @@
   static const char kMachineAddress[];
   static const char kSimPath[];
   static const uint32 kAccessTechnologies;
+  static const char kTestMobileProviderDBPath[];
 
   class TestProxyFactory : public ProxyFactory {
    public:
@@ -267,11 +244,7 @@
     CellularCapabilityUniversalTest *test_;
   };
 
-  NiceMockControl control_;
-  EventDispatcher *event_dispatcher_;
-  MockMetrics metrics_;
-  MockGLib glib_;
-  MockManager manager_;
+  MockModemInfo modem_info_;
   scoped_ptr<mm1::MockBearerProxy> bearer_proxy_;
   scoped_ptr<mm1::MockModemModem3gppProxy> modem_3gpp_proxy_;
   scoped_ptr<mm1::MockModemModemCdmaProxy> modem_cdma_proxy_;
@@ -279,12 +252,9 @@
   scoped_ptr<mm1::MockModemSimpleProxy> modem_simple_proxy_;
   scoped_ptr<mm1::MockSimProxy> sim_proxy_;
   scoped_ptr<MockDBusPropertiesProxy> properties_proxy_;
-  MockActivatingIccidStore mock_iccid_store_;
   TestProxyFactory proxy_factory_;
   CellularCapabilityUniversal *capability_;  // Owned by |cellular_|.
-  NiceMock<DeviceMockAdaptor> *device_adaptor_;  // Owned by |cellular_|.
-  MockCellularOperatorInfo cellular_operator_info_;
-  mobile_provider_db *provider_db_;
+  DeviceMockAdaptor *device_adaptor_;  // Owned by |cellular_|.
   CellularRefPtr cellular_;
   MockCellularService *service_;  // owned by cellular_
   DBusPropertyMapsCallback scan_callback_;  // saved for testing scan operations
@@ -325,6 +295,8 @@
 const uint32 CellularCapabilityUniversalTest::kAccessTechnologies =
     MM_MODEM_ACCESS_TECHNOLOGY_LTE |
     MM_MODEM_ACCESS_TECHNOLOGY_HSPA_PLUS;
+const char CellularCapabilityUniversalTest::kTestMobileProviderDBPath[] =
+    "provider_db_unittest.bfd";
 
 TEST_F(CellularCapabilityUniversalMainTest, StartModem) {
   // Set up mock modem properties
@@ -543,7 +515,7 @@
 
   EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
       .WillOnce(Return(sim_properties));
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(_))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(), GetActivationState(_))
       .Times(1);
 
   SetUp();
@@ -565,7 +537,7 @@
   // SIM is locked.
   capability_->sim_lock_status_.lock_type = "sim-pin";
   capability_->OnSimLockStatusChanged();
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
 
   EXPECT_EQ("", capability_->imsi_);
   EXPECT_EQ("", capability_->sim_identifier_);
@@ -576,12 +548,12 @@
   properties_proxy_.reset(new MockDBusPropertiesProxy());
   EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
       .WillOnce(Return(sim_properties));
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(_))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(), GetActivationState(_))
       .Times(1);
 
   capability_->sim_lock_status_.lock_type = "";
   capability_->OnSimLockStatusChanged();
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
 
   EXPECT_EQ(kImsi, capability_->imsi_);
   EXPECT_EQ(kSimIdentifier, capability_->sim_identifier_);
@@ -685,7 +657,6 @@
   SetUp();
   InitProviderDB();
   capability_->InitProxies();
-  cellular_->cellular_operator_info_ = &cellular_operator_info_;
 
   SetService();
 
@@ -766,7 +737,7 @@
 
   EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
       .Times(1).WillOnce(Return(sim_properties));
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(_))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(), GetActivationState(_))
       .Times(1);
 
   EXPECT_FALSE(capability_->sim_present_);
@@ -797,7 +768,7 @@
   EXPECT_EQ(kOperatorName, capability_->spn_);
 
   capability_->OnSimPathChanged("");
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
   Mock::VerifyAndClearExpectations(properties_proxy_.get());
   EXPECT_FALSE(capability_->sim_present_);
   EXPECT_TRUE(capability_->sim_proxy_ == NULL);
@@ -809,7 +780,7 @@
 
   EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
       .Times(1).WillOnce(Return(sim_properties));
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(_))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(), GetActivationState(_))
       .Times(1);
 
   capability_->OnSimPathChanged(kSimPath);
@@ -843,7 +814,7 @@
 
   EXPECT_CALL(*properties_proxy_, GetAll(MM_DBUS_INTERFACE_SIM))
       .WillOnce(Return(sim_properties));
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(_))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(), GetActivationState(_))
       .Times(0);
   // After setup we lose pointers to the proxies, so it is hard to set
   // expectations.
@@ -859,10 +830,10 @@
   EXPECT_EQ(kSimPath, capability_->sim_path_);
   EXPECT_TRUE(capability_->sim_proxy_.get());
   EXPECT_EQ(kImsi, capability_->imsi_);
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
 
   // Updating the SIM
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(_))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(), GetActivationState(_))
       .Times(2);
   DBusPropertiesMap new_properties;
   const char kCountry[] = "us";
@@ -1326,9 +1297,8 @@
   // Modem with an unactivated service in the 'enabled' or 'searching' state
   capability_->cellular()->modem_state_ = Cellular::kModemStateEnabled;
   capability_->mdn_ = "0000000000";
-  cellular_->cellular_operator_info_ = &cellular_operator_info_;
   CellularService::OLP olp;
-  EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
       .WillRepeatedly(Return(&olp));
   capability_->UpdateScanningProperty();
   EXPECT_FALSE(capability_->scanning_or_searching_);
@@ -1397,7 +1367,6 @@
 
 TEST_F(CellularCapabilityUniversalMainTest, UpdateStorageIdentifier) {
   CellularOperatorInfo::CellularOperator provider;
-  cellular_->cellular_operator_info_ = &cellular_operator_info_;
 
   SetService();
 
@@ -1416,7 +1385,7 @@
 
   // GetCellularOperatorByMCCMNC returns NULL.
   capability_->operator_id_ = "1";
-  EXPECT_CALL(cellular_operator_info_,
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
       GetCellularOperatorByMCCMNC(capability_->operator_id_))
       .WillOnce(
           Return((const CellularOperatorInfo::CellularOperator *)NULL));
@@ -1424,20 +1393,20 @@
   capability_->UpdateStorageIdentifier();
   EXPECT_TRUE(::MatchPattern(cellular_->service()->storage_identifier_,
                              default_identifier_pattern));
-  Mock::VerifyAndClearExpectations(&cellular_operator_info_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_cellular_operator_info());
 
   // |capability_->imsi_| is not ""
   capability_->imsi_ = "TESTIMSI";
-  EXPECT_CALL(cellular_operator_info_,
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
       GetCellularOperatorByMCCMNC(capability_->operator_id_))
       .WillOnce(
           Return((const CellularOperatorInfo::CellularOperator *)NULL));
 
   capability_->UpdateStorageIdentifier();
   EXPECT_EQ(prefix + "TESTIMSI", cellular_->service()->storage_identifier_);
-  Mock::VerifyAndClearExpectations(&cellular_operator_info_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_cellular_operator_info());
 
-  EXPECT_CALL(cellular_operator_info_,
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
       GetCellularOperatorByMCCMNC(capability_->operator_id_))
       .Times(2)
       .WillRepeatedly(Return(&provider));
@@ -1468,9 +1437,8 @@
   capability_->min_ = "5";
   capability_->sim_identifier_ = "6";
   capability_->operator_id_ = "123456";
-  cellular_->cellular_operator_info_ = &cellular_operator_info_;
 
-  EXPECT_CALL(cellular_operator_info_,
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(),
       GetOLPByMCCMNC(capability_->operator_id_))
       .WillRepeatedly(Return(&test_olp));
 
@@ -1503,24 +1471,26 @@
   EXPECT_CALL(*service_,
               SetActivationState(flimflam::kActivationStateActivating))
       .Times(0);
-  EXPECT_CALL(mock_iccid_store_, SetActivationState(_, _)).Times(0);
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              SetActivationState(_, _))
+      .Times(0);
   Error error;
   capability_->CompleteActivation(&error);
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
   Mock::VerifyAndClearExpectations(service_);
 
   capability_->sim_identifier_ = kIccid;
-  EXPECT_CALL(mock_iccid_store_,
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
               SetActivationState(kIccid, ActivatingIccidStore::kStatePending))
       .Times(1);
   EXPECT_CALL(*service_,
               SetActivationState(flimflam::kActivationStateActivating))
       .Times(1);
   capability_->CompleteActivation(&error);
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
   Mock::VerifyAndClearExpectations(service_);
 
-  EXPECT_CALL(mock_iccid_store_,
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
               SetActivationState(kIccid, ActivatingIccidStore::kStatePending))
       .Times(0);
   EXPECT_CALL(*service_,
@@ -1534,9 +1504,8 @@
   const char kIccid[] = "1234567";
   capability_->sim_identifier_.clear();
   capability_->mdn_ = "0000000000";
-  cellular_->cellular_operator_info_ = &cellular_operator_info_;
   CellularService::OLP olp;
-  EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
       .WillRepeatedly(Return(&olp));
 
   EXPECT_CALL(*service_,
@@ -1554,7 +1523,8 @@
 
   capability_->mdn_ = "0000000000";
   capability_->sim_identifier_ = kIccid;
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              GetActivationState(kIccid))
       .Times(2)
       .WillRepeatedly(Return(ActivatingIccidStore::kStatePending));
   EXPECT_CALL(*service_,
@@ -1562,9 +1532,10 @@
       .Times(1);
   capability_->UpdateServiceActivationState();
   Mock::VerifyAndClearExpectations(service_);
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
 
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              GetActivationState(kIccid))
       .Times(2)
       .WillRepeatedly(Return(ActivatingIccidStore::kStateActivated));
   EXPECT_CALL(*service_,
@@ -1584,28 +1555,34 @@
   // No MDN, no ICCID.
   capability_->mdn_ = "0000000";
   capability_->sim_identifier_.clear();
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(_)).Times(0);
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              GetActivationState(_))
+      .Times(0);
   capability_->UpdateIccidActivationState();
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
 
   // ICCID known.
   capability_->sim_identifier_ = kIccid;
 
   // After the modem has reset.
   capability_->reset_done_ = true;
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
-      .Times(1).WillOnce(Return(ActivatingIccidStore::kStatePending));
-  EXPECT_CALL(mock_iccid_store_,
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              GetActivationState(kIccid))
+      .Times(1)
+      .WillOnce(Return(ActivatingIccidStore::kStatePending));
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
               SetActivationState(kIccid,
                                  ActivatingIccidStore::kStateActivated))
       .Times(1);
   capability_->UpdateIccidActivationState();
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
 
   // Before reset, not registered.
   capability_->reset_done_ = false;
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
-      .Times(2).WillRepeatedly(Return(ActivatingIccidStore::kStatePending));
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              GetActivationState(kIccid))
+      .Times(2)
+      .WillRepeatedly(Return(ActivatingIccidStore::kStatePending));
   EXPECT_CALL(*service_,
               SetActivationState(flimflam::kActivationStateActivating))
      .Times(2);
@@ -1618,13 +1595,15 @@
       MM_MODEM_3GPP_REGISTRATION_STATE_HOME;
   EXPECT_CALL(*modem_proxy, Reset(_, _, _)).Times(1);
   capability_->UpdateIccidActivationState();
-  Mock::VerifyAndClearExpectations(&mock_iccid_store_);
+  Mock::VerifyAndClearExpectations(modem_info_.mock_activating_iccid_store());
 
   // Not registered.
   capability_->registration_state_ =
       MM_MODEM_3GPP_REGISTRATION_STATE_SEARCHING;
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
-      .Times(2).WillRepeatedly(Return(ActivatingIccidStore::kStateActivated));
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              GetActivationState(kIccid))
+      .Times(2)
+      .WillRepeatedly(Return(ActivatingIccidStore::kStateActivated));
   EXPECT_CALL(*service_, AutoConnect()).Times(0);
   capability_->UpdateIccidActivationState();
   Mock::VerifyAndClearExpectations(service_);
@@ -1652,7 +1631,9 @@
   // Got valid MDN.
   cellular_->state_ = Cellular::kStateRegistered;
   capability_->mdn_ = "1231223";
-  EXPECT_CALL(mock_iccid_store_, RemoveEntry(kIccid)).Times(1);
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              RemoveEntry(kIccid))
+      .Times(1);
   capability_->UpdateIccidActivationState();
 }
 
@@ -1724,12 +1705,10 @@
 
 TEST_F(CellularCapabilityUniversalMainTest, IsServiceActivationRequired) {
   capability_->mdn_ = "0000000000";
-  cellular_->cellular_operator_info_ = NULL;
   EXPECT_FALSE(capability_->IsServiceActivationRequired());
 
-  cellular_->cellular_operator_info_ = &cellular_operator_info_;
   CellularService::OLP olp;
-  EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
       .WillOnce(Return((const CellularService::OLP *)NULL))
       .WillRepeatedly(Return(&olp));
   EXPECT_FALSE(capability_->IsServiceActivationRequired());
@@ -1743,7 +1722,8 @@
 
   const char kIccid[] = "1234567890";
   capability_->sim_identifier_ = kIccid;
-  EXPECT_CALL(mock_iccid_store_, GetActivationState(kIccid))
+  EXPECT_CALL(*modem_info_.mock_activating_iccid_store(),
+              GetActivationState(kIccid))
       .Times(1)
       .WillOnce(Return(ActivatingIccidStore::kStateActivated));
   EXPECT_FALSE(capability_->IsServiceActivationRequired());
diff --git a/cellular_service_unittest.cc b/cellular_service_unittest.cc
index 9b94be0..ffae4b2 100644
--- a/cellular_service_unittest.cc
+++ b/cellular_service_unittest.cc
@@ -14,6 +14,7 @@
 #include "shill/mock_cellular.h"
 #include "shill/mock_manager.h"
 #include "shill/mock_metrics.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_profile.h"
 #include "shill/mock_store.h"
 #include "shill/nice_mock_control.h"
@@ -32,10 +33,8 @@
   CellularServiceTest()
       : metrics_(&dispatcher_),
         manager_(&control_, &dispatcher_, &metrics_, NULL),
-        device_(new MockCellular(&control_,
-                                 NULL,
-                                 &metrics_,
-                                 &manager_,
+        modem_info_(&control_, &dispatcher_, &metrics_, &manager_, NULL),
+        device_(new MockCellular(&modem_info_,
                                  "usb0",
                                  kAddress,
                                  3,
@@ -43,9 +42,6 @@
                                  "",
                                  "",
                                  "",
-                                 NULL,
-                                 NULL,
-                                 NULL,
                                  ProxyFactory::GetInstance())),
         service_(new CellularService(&control_, &dispatcher_,
                                      &metrics_, &manager_, device_)),
@@ -73,6 +69,7 @@
   EventDispatcher dispatcher_;
   NiceMock<MockMetrics> metrics_;
   MockManager manager_;
+  MockModemInfo modem_info_;
   scoped_refptr<MockCellular> device_;
   CellularServiceRefPtr service_;
   NiceMock<ServiceMockAdaptor> *adaptor_;  // Owned by |service_|.
diff --git a/cellular_unittest.cc b/cellular_unittest.cc
index 0ff1554..0515baf 100644
--- a/cellular_unittest.cc
+++ b/cellular_unittest.cc
@@ -10,7 +10,6 @@
 
 #include <base/bind.h>
 #include <chromeos/dbus/service_constants.h>
-#include <mobile_provider.h>
 
 #include "shill/cellular_capability_cdma.h"
 #include "shill/cellular_capability_classic.h"
@@ -19,20 +18,17 @@
 #include "shill/cellular_service.h"
 #include "shill/error.h"
 #include "shill/event_dispatcher.h"
-#include "shill/mock_cellular_operator_info.h"
 #include "shill/mock_cellular_service.h"
 #include "shill/mock_device_info.h"
 #include "shill/mock_dhcp_config.h"
 #include "shill/mock_dhcp_provider.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_metrics.h"
 #include "shill/mock_modem_cdma_proxy.h"
 #include "shill/mock_modem_gsm_card_proxy.h"
 #include "shill/mock_modem_gsm_network_proxy.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_modem_proxy.h"
 #include "shill/mock_modem_simple_proxy.h"
 #include "shill/mock_rtnl_handler.h"
-#include "shill/nice_mock_control.h"
 #include "shill/property_store_unittest.h"
 #include "shill/proxy_factory.h"
 
@@ -66,10 +62,12 @@
 class CellularPropertyTest : public PropertyStoreTest {
  public:
   CellularPropertyTest()
-      : device_(new Cellular(control_interface(),
-                             NULL,
-                             NULL,
-                             NULL,
+      : modem_info_(control_interface(),
+                    dispatcher(),
+                    metrics(),
+                    manager(),
+                    glib()),
+        device_(new Cellular(&modem_info_,
                              "usb0",
                              "00:01:02:03:04:05",
                              3,
@@ -77,13 +75,11 @@
                              "",
                              "",
                              "",
-                             NULL,
-                             NULL,
-                             NULL,
                              ProxyFactory::GetInstance())) {}
   virtual ~CellularPropertyTest() {}
 
  protected:
+  MockModemInfo modem_info_;
   DeviceRefPtr device_;
 };
 
@@ -123,10 +119,10 @@
 class CellularTest : public testing::Test {
  public:
   CellularTest()
-      : metrics_(&dispatcher_),
-        manager_(&control_interface_, &dispatcher_, &metrics_, &glib_),
-        device_info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
-        dhcp_config_(new MockDHCPConfig(&control_interface_,
+      : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
+        device_info_(modem_info_.control_interface(), &dispatcher_,
+                     modem_info_.metrics(), modem_info_.manager()),
+        dhcp_config_(new MockDHCPConfig(modem_info_.control_interface(),
                                         kTestDeviceName)),
         create_gsm_card_proxy_from_factory_(false),
         proxy_(new MockModemProxy()),
@@ -135,11 +131,7 @@
         gsm_card_proxy_(new MockModemGSMCardProxy()),
         gsm_network_proxy_(new MockModemGSMNetworkProxy()),
         proxy_factory_(this),
-        provider_db_(NULL),
-        device_(new Cellular(&control_interface_,
-                             &dispatcher_,
-                             &metrics_,
-                             &manager_,
+        device_(new Cellular(&modem_info_,
                              kTestDeviceName,
                              kTestDeviceAddress,
                              3,
@@ -147,23 +139,18 @@
                              kDBusOwner,
                              kDBusService,
                              kDBusPath,
-                             NULL,
-                             NULL,
-                             NULL,
                              &proxy_factory_)) {
-    metrics_.RegisterDevice(device_->interface_index(), Technology::kCellular);
-  }
-
-  virtual ~CellularTest() {
-    mobile_provider_close_db(provider_db_);
-    provider_db_ = NULL;
+    modem_info_.metrics()->RegisterDevice(device_->interface_index(),
+                                          Technology::kCellular);
   }
 
   virtual void SetUp() {
     static_cast<Device *>(device_)->rtnl_handler_ = &rtnl_handler_;
     device_->set_dhcp_provider(&dhcp_provider_);
-    EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&device_info_));
-    EXPECT_CALL(manager_, DeregisterService(_)).Times(AnyNumber());
+    EXPECT_CALL(*modem_info_.mock_manager(), device_info())
+        .WillRepeatedly(Return(&device_info_));
+    EXPECT_CALL(*modem_info_.mock_manager(), DeregisterService(_))
+        .Times(AnyNumber());
   }
 
   virtual void TearDown() {
@@ -173,6 +160,10 @@
     device_->set_dhcp_provider(NULL);
   }
 
+  void InitProviderDB() {
+    modem_info_.SetProviderDB(kTestMobileProviderDBPath);
+  }
+
   void InvokeEnable(bool enable, Error *error,
                     const ResultCallback &callback, int timeout) {
     callback.Run(Error());
@@ -300,7 +291,7 @@
         .Times(2)
         .WillRepeatedly(Invoke(this, &CellularTest::InvokeGetSignalQuality));
     EXPECT_CALL(*this, TestCallback(IsSuccess()));
-    EXPECT_CALL(manager_, RegisterService(_));
+    EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
   }
 
   MOCK_METHOD1(TestCallback, void(const Error &error));
@@ -391,12 +382,29 @@
         device_->capability_.get());
   }
 
-  NiceMockControl control_interface_;
+  // Different tests simulate a cellular service being set using a real /m mock
+  // service.
+  CellularService* SetService() {
+    device_->service_ = new CellularService(
+        modem_info_.control_interface(),
+        modem_info_.dispatcher(),
+        modem_info_.metrics(),
+        modem_info_.manager(),
+        device_);
+    return device_->service_;
+  }
+  CellularService* SetMockService() {
+    device_->service_ = new MockCellularService(
+        modem_info_.control_interface(),
+        modem_info_.dispatcher(),
+        modem_info_.metrics(),
+        modem_info_.manager(),
+        device_);
+    return device_->service_;
+  }
+
   EventDispatcher dispatcher_;
-  MockCellularOperatorInfo cellular_operator_info_;
-  MockMetrics metrics_;
-  MockGLib glib_;
-  MockManager manager_;
+  MockModemInfo modem_info_;
   MockDeviceInfo device_info_;
   NiceMock<MockRTNLHandler> rtnl_handler_;
 
@@ -410,7 +418,6 @@
   scoped_ptr<MockModemGSMCardProxy> gsm_card_proxy_;
   scoped_ptr<MockModemGSMNetworkProxy> gsm_network_proxy_;
   TestProxyFactory proxy_factory_;
-  mobile_provider_db *provider_db_;
   CellularRefPtr device_;
 };
 
@@ -460,9 +467,7 @@
 }
 
 TEST_F(CellularTest, StartGSMRegister) {
-  provider_db_ = mobile_provider_open_db(kTestMobileProviderDBPath);
-  ASSERT_TRUE(provider_db_);
-  device_->provider_db_ = provider_db_;
+  InitProviderDB();
   EXPECT_CALL(*proxy_, Enable(true, _, _, CellularCapability::kTimeoutEnable))
       .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
   EXPECT_CALL(*gsm_card_proxy_,
@@ -492,7 +497,7 @@
       .WillRepeatedly(Invoke(this,
                              &CellularTest::InvokeGetSignalQuality));
   EXPECT_CALL(*this, TestCallback(IsSuccess()));
-  EXPECT_CALL(manager_, RegisterService(_));
+  EXPECT_CALL(*modem_info_.mock_manager(), RegisterService(_));
   AllowCreateGSMCardProxyFromFactory();
 
   Error error;
@@ -539,7 +544,7 @@
   EXPECT_CALL(dhcp_provider_, CreateConfig(kTestDeviceName, _, _, _))
       .WillOnce(Return(dhcp_config_));
   EXPECT_CALL(*dhcp_config_, RequestIP()).WillOnce(Return(true));
-  EXPECT_CALL(manager_, UpdateService(_)).Times(3);
+  EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_)).Times(3);
   Error error;
   device_->Start(&error, Bind(&CellularTest::TestCallback, Unretained(this)));
   EXPECT_TRUE(error.IsSuccess());
@@ -597,8 +602,7 @@
   EXPECT_EQ(Error::kNotRegistered, error.type());
 
   device_->state_ = Cellular::kStateRegistered;
-  device_->service_ = new CellularService(
-      &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
+  SetService();
 
   device_->allow_roaming_ = false;
   device_->service_->roaming_state_ = flimflam::kRoamingStateRoaming;
@@ -669,8 +673,7 @@
 TEST_F(CellularTest, ConnectFailure) {
   SetCellularType(Cellular::kTypeCDMA);
   device_->state_ = Cellular::kStateRegistered;
-  device_->service_ = new CellularService(
-      &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
+  SetService();
   ASSERT_EQ(Service::kStateIdle, device_->service_->state());
   EXPECT_CALL(*simple_proxy_,
               Connect(_, _, _, CellularCapability::kTimeoutConnect))
@@ -687,13 +690,12 @@
   // then quick disabled.
   SetCellularType(Cellular::kTypeCDMA);
   device_->state_ = Cellular::kStateRegistered;
-  device_->service_ = new CellularService(
-      &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
+  SetService();
   EXPECT_CALL(
       *simple_proxy_,
       Connect(_, _, _, CellularCapability::kTimeoutConnect))
       .WillOnce(Invoke(this, &CellularTest::InvokeConnectFailNoService));
-  EXPECT_CALL(manager_, UpdateService(_));
+  EXPECT_CALL(*modem_info_.mock_manager(), UpdateService(_));
   GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
   Error error;
   device_->Connect(&error);
@@ -703,9 +705,7 @@
   // If the network interface goes down, Cellular::LinkEvent should
   // drop the connection but the service object should persist.
   device_->state_ = Cellular::kStateLinked;
-  CellularService *service = new CellularService(
-      &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
-  device_->service_ = service;
+  CellularService *service = SetService();
   device_->LinkEvent(0, 0);  // flags doesn't contain IFF_UP
   EXPECT_EQ(device_->state_, Cellular::kStateConnected);
   EXPECT_EQ(device_->service_, service);
@@ -722,9 +722,8 @@
 
   // Service activation is needed
   GetCapabilityUniversal()->mdn_ = "0000000000";
-  device_->cellular_operator_info_ = &cellular_operator_info_;
   CellularService::OLP olp;
-  EXPECT_CALL(cellular_operator_info_, GetOLPByMCCMNC(_))
+  EXPECT_CALL(*modem_info_.mock_cellular_operator_info(), GetOLPByMCCMNC(_))
       .WillRepeatedly(Return(&olp));
 
   device_->state_ = Cellular::kStateDisabled;
@@ -750,7 +749,7 @@
                        &CellularTest::InvokeGetRegistrationStateUnregistered));
   EXPECT_CALL(*cdma_proxy_, GetSignalQuality(NULL, _, _))
       .WillOnce(Invoke(this, &CellularTest::InvokeGetSignalQuality));
-  EXPECT_CALL(manager_, UpdateEnabledTechnologies());
+  EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
   device_->state_ = Cellular::kStateDisabled;
   device_->set_modem_state(Cellular::kModemStateDisabled);
   SetCellularType(Cellular::kTypeCDMA);
@@ -773,7 +772,7 @@
   EXPECT_CALL(*proxy_,
               Enable(false, _, _, CellularCapability::kTimeoutEnable))
       .WillOnce(Invoke(this, &CellularTest::InvokeEnable));
-  EXPECT_CALL(manager_, UpdateEnabledTechnologies());
+  EXPECT_CALL(*modem_info_.mock_manager(), UpdateEnabledTechnologies());
   device_->enabled_ = true;
   device_->enabled_pending_ = true;
   device_->state_ = Cellular::kStateEnabled;
@@ -805,8 +804,7 @@
 
 TEST_F(CellularTest, ModemStateChangeValidConnected) {
   device_->state_ = Cellular::kStateEnabled;
-  device_->service_ = new CellularService(
-      &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
+  SetService();
   device_->OnModemStateChanged(Cellular::kModemStateConnecting,
                                Cellular::kModemStateConnected,
                                0);
@@ -844,11 +842,7 @@
 
 TEST_F(CellularTest, StopModemCallback) {
   EXPECT_CALL(*this, TestCallback(IsSuccess()));
-  device_->service_ = new MockCellularService(&control_interface_,
-                                              &dispatcher_,
-                                              &metrics_,
-                                              &manager_,
-                                              device_);
+  SetMockService();
   device_->StopModemCallback(Bind(&CellularTest::TestCallback,
                                   Unretained(this)),
                              Error(Error::kSuccess));
@@ -858,11 +852,7 @@
 
 TEST_F(CellularTest, StopModemCallbackFail) {
   EXPECT_CALL(*this, TestCallback(IsFailure()));
-  device_->service_ = new MockCellularService(&control_interface_,
-                                              &dispatcher_,
-                                              &metrics_,
-                                              &manager_,
-                                              device_);
+  SetMockService();
   device_->StopModemCallback(Bind(&CellularTest::TestCallback,
                                   Unretained(this)),
                              Error(Error::kOperationFailed));
@@ -895,8 +885,7 @@
   // status.
   EXPECT_CALL(*this, TestCallback(IsSuccess())).Times(2);
 
-  device_->service_ = new CellularService(
-      &control_interface_, &dispatcher_, &metrics_, &manager_, device_);
+  SetService();
   GetCapabilityClassic()->proxy_.reset(proxy_.release());
   GetCapabilityClassic()->simple_proxy_.reset(simple_proxy_.release());
   device_->state_ = Cellular::kStateRegistered;
@@ -908,7 +897,7 @@
   // If the action of establishing a connection registered a termination action
   // with the manager, then running the termination action will result in a
   // disconnect.
-  manager_.RunTerminationActions(
+  modem_info_.manager()->RunTerminationActions(
       Bind(&CellularTest::TestCallback, Unretained(this)));
   EXPECT_EQ(Cellular::kStateRegistered, device_->state_);
   dispatcher_.DispatchPendingEvents();
@@ -918,14 +907,14 @@
   // TestCallback being called with success because there are no registered
   // termination actions..  If the termination action is not removed, then
   // TestCallback will be called with kOperationTimeout.
-  manager_.RunTerminationActions(
+  modem_info_.manager()->RunTerminationActions(
       Bind(&CellularTest::TestCallback, Unretained(this)));
   dispatcher_.DispatchPendingEvents();
 }
 
 TEST_F(CellularTest, SetAllowRoaming) {
   EXPECT_FALSE(device_->allow_roaming_);
-  EXPECT_CALL(manager_, UpdateDevice(_));
+  EXPECT_CALL(*modem_info_.mock_manager(), UpdateDevice(_));
   Error error;
   device_->SetAllowRoaming(true, &error);
   EXPECT_TRUE(error.IsSuccess());
diff --git a/mock_cellular.cc b/mock_cellular.cc
index 7bad965..c5a4394 100644
--- a/mock_cellular.cc
+++ b/mock_cellular.cc
@@ -13,10 +13,7 @@
 // TODO(rochberg): The cellular constructor does work.  Ought to fix
 // this so that we don't depend on passing real values in for Type.
 
-MockCellular::MockCellular(ControlInterface *control_interface,
-                           EventDispatcher *dispatcher,
-                           Metrics *metrics,
-                           Manager *manager,
+MockCellular::MockCellular(ModemInfo *modem_info,
                            const std::string &link_name,
                            const std::string &address,
                            int interface_index,
@@ -24,14 +21,9 @@
                            const std::string &owner,
                            const std::string &service,
                            const std::string &path,
-                           ActivatingIccidStore *activating_iccid_store,
-                           CellularOperatorInfo *cellular_operator_info,
-                           mobile_provider_db *provider_db,
                            ProxyFactory *proxy_factory)
-    : Cellular(control_interface, dispatcher, metrics, manager, link_name,
-               address, interface_index, type, owner, service, path,
-               activating_iccid_store, cellular_operator_info, provider_db,
-               proxy_factory) {}
+    : Cellular(modem_info, link_name, address, interface_index, type, owner,
+               service, path, proxy_factory) {}
 
 MockCellular::~MockCellular() {}
 
diff --git a/mock_cellular.h b/mock_cellular.h
index a7d9a6f..8d0e4e8 100644
--- a/mock_cellular.h
+++ b/mock_cellular.h
@@ -16,10 +16,7 @@
 
 class MockCellular : public Cellular {
  public:
-  MockCellular(ControlInterface *control_interface,
-               EventDispatcher *dispatcher,
-               Metrics *metrics,
-               Manager *manager,
+  MockCellular(ModemInfo *modem_info,
                const std::string &link_name,
                const std::string &address,
                int interface_index,
@@ -27,9 +24,6 @@
                const std::string &owner,
                const std::string &service,
                const std::string &path,
-               ActivatingIccidStore *activating_iccid_store,
-               CellularOperatorInfo *cellular_operator_info,
-               mobile_provider_db *provider_db,
                ProxyFactory *proxy_factory);
   virtual ~MockCellular();
 
diff --git a/mock_modem.cc b/mock_modem.cc
index 21fa2c3..23c64a1 100644
--- a/mock_modem.cc
+++ b/mock_modem.cc
@@ -9,16 +9,8 @@
 MockModem::MockModem(const std::string &owner,
                      const std::string &service,
                      const std::string &path,
-                     ControlInterface *control_interface,
-                     EventDispatcher *dispatcher,
-                     Metrics *metrics,
-                     Manager *manager,
-                     ActivatingIccidStore *activating_iccid_store,
-                     CellularOperatorInfo *cellular_operator_info,
-                     mobile_provider_db *provider_db)
-    : Modem(owner, service, path, control_interface, dispatcher, metrics,
-            manager, activating_iccid_store, cellular_operator_info,
-            provider_db) {}
+                     ModemInfo *modem_info)
+    : Modem(owner, service, path, modem_info) {}
 
 MockModem::~MockModem() {}
 
diff --git a/mock_modem.h b/mock_modem.h
index 02a11fa..d5899ea 100644
--- a/mock_modem.h
+++ b/mock_modem.h
@@ -18,13 +18,7 @@
   MockModem(const std::string &owner,
             const std::string &service,
             const std::string &path,
-            ControlInterface *control_interface,
-            EventDispatcher *dispatcher,
-            Metrics *metrics,
-            Manager *manager,
-            ActivatingIccidStore *activating_iccid_store,
-            CellularOperatorInfo *cellular_operator_info,
-            mobile_provider_db *provider_db);
+            ModemInfo *modem_info);
   virtual ~MockModem();
 
   // This class only mocks the pure virtual methods; if you need a
diff --git a/mock_modem_info.cc b/mock_modem_info.cc
index ba90c25..13372a5 100644
--- a/mock_modem_info.cc
+++ b/mock_modem_info.cc
@@ -4,10 +4,69 @@
 
 #include "shill/mock_modem_info.h"
 
+#include <mobile_provider.h>
+
 namespace shill {
 
-MockModemInfo::MockModemInfo() : ModemInfo(NULL, NULL, NULL, NULL, NULL) {}
+MockModemInfo::MockModemInfo() :
+    ModemInfo(NULL, NULL, NULL, NULL, NULL),
+    mock_activating_iccid_store_(NULL),
+    mock_cellular_operator_info_(NULL) {}
+
+MockModemInfo::MockModemInfo(ControlInterface *control,
+                             EventDispatcher *dispatcher,
+                             Metrics *metrics,
+                             Manager *manager,
+                             GLib *glib) :
+    ModemInfo(control, dispatcher, metrics, manager, glib),
+    mock_activating_iccid_store_(NULL),
+    mock_cellular_operator_info_(NULL) {
+  SetMockMembers();
+}
 
 MockModemInfo::~MockModemInfo() {}
 
+void MockModemInfo::SetMockMembers() {
+  // These are always replaced by mocks.
+  // Assumes ownership.
+  set_activating_iccid_store(new MockActivatingIccidStore());
+  mock_activating_iccid_store_ =
+      static_cast<MockActivatingIccidStore*>(activating_iccid_store());
+  // Assumes ownership.
+  set_cellular_operator_info(new MockCellularOperatorInfo());
+  mock_cellular_operator_info_ =
+      static_cast<MockCellularOperatorInfo*>(cellular_operator_info());
+
+  // These are replaced by mocks only if current unset in ModemInfo.
+  if(control_interface() == NULL) {
+    mock_control_.reset(new MockControl());
+    set_control_interface(mock_control_.get());
+  }
+  if(dispatcher() == NULL) {
+    mock_dispatcher_.reset(new MockEventDispatcher());
+    set_event_dispatcher(mock_dispatcher_.get());
+  }
+  if(metrics() == NULL) {
+    mock_metrics_.reset(new MockMetrics(dispatcher()));
+    set_metrics(mock_metrics_.get());
+  }
+  if(glib() == NULL) {
+    mock_glib_.reset(new MockGLib());
+    set_glib(mock_glib_.get());
+  }
+  if(manager() == NULL) {
+    mock_manager_.reset(new MockManager(control_interface(), dispatcher(),
+                                        metrics(), glib()));
+    set_manager(mock_manager_.get());
+  }
+}
+
+void MockModemInfo::SetProviderDB(const char *provider_db_path) {
+  mobile_provider_db *provider_db =
+      mobile_provider_open_db(provider_db_path);
+  ASSERT_TRUE(provider_db);
+  // Assumes ownership.
+  set_mobile_provider_db(provider_db);
+}
+
 }  // namespace shill
diff --git a/mock_modem_info.h b/mock_modem_info.h
index 0d4f42a..2afbb58 100644
--- a/mock_modem_info.h
+++ b/mock_modem_info.h
@@ -8,6 +8,13 @@
 #include <base/basictypes.h>
 #include <gmock/gmock.h>
 
+#include "shill/mock_activating_iccid_store.h"
+#include "shill/mock_cellular_operator_info.h"
+#include "shill/mock_control.h"
+#include "shill/mock_event_dispatcher.h"
+#include "shill/mock_glib.h"
+#include "shill/mock_manager.h"
+#include "shill/mock_metrics.h"
 #include "shill/modem_info.h"
 
 namespace shill {
@@ -15,12 +22,65 @@
 class MockModemInfo : public ModemInfo {
  public:
   MockModemInfo();
+
+  // All NULL parameters are replaced by mock objects.
+  MockModemInfo(ControlInterface *control,
+                EventDispatcher *dispatcher,
+                Metrics *metrics,
+                Manager *manager,
+                GLib *glib);
+
   virtual ~MockModemInfo();
 
+  // Replaces data members in ModemInfo by mock objects.
+  // The following are relaced by mocks if they are NULL: control_interface,
+  // dispatcher, metrics, manager, glib.
+  // The following are always replaced by mocks: activating_iccid_store,
+  // cellular_operator_info.
+  void SetMockMembers();
+
+  // Create a new provider_db and set it in ModemInfo.
+  // ModemInfo takes ownership.
+  void SetProviderDB(const char *provider_db_path);
+
+  // Accessors for mock objects
+  MockActivatingIccidStore* mock_activating_iccid_store() const {
+    return mock_activating_iccid_store_;
+  }
+  MockCellularOperatorInfo* mock_cellular_operator_info() const {
+    return mock_cellular_operator_info_;
+  }
+  MockControl* mock_control_interface() const {
+    return mock_control_.get();
+  }
+  MockEventDispatcher* mock_dispatcher() const {
+    return mock_dispatcher_.get();
+  }
+  MockMetrics* mock_metrics() const {
+    return mock_metrics_.get();
+  }
+  MockManager* mock_manager() const {
+    return mock_manager_.get();
+  }
+  MockGLib* mock_glib() const {
+    return mock_glib_.get();
+  }
+
   MOCK_METHOD0(Start, void());
   MOCK_METHOD0(Stop, void());
   MOCK_METHOD1(OnDeviceInfoAvailable, void(const std::string &link_name));
 
+ private:
+  scoped_ptr<MockControl> mock_control_;
+  scoped_ptr<MockEventDispatcher> mock_dispatcher_;
+  scoped_ptr<MockMetrics> mock_metrics_;
+  scoped_ptr<MockManager> mock_manager_;
+  scoped_ptr<MockGLib> mock_glib_;
+
+  // owned by ModemInfo
+  MockActivatingIccidStore *mock_activating_iccid_store_;
+  MockCellularOperatorInfo *mock_cellular_operator_info_;
+
   DISALLOW_COPY_AND_ASSIGN(MockModemInfo);
 };
 
diff --git a/modem.cc b/modem.cc
index 9b1289a..2fa5110 100644
--- a/modem.cc
+++ b/modem.cc
@@ -27,23 +27,11 @@
 Modem::Modem(const string &owner,
              const string &service,
              const string &path,
-             ControlInterface *control_interface,
-             EventDispatcher *dispatcher,
-             Metrics *metrics,
-             Manager *manager,
-             ActivatingIccidStore *activating_iccid_store,
-             CellularOperatorInfo *cellular_operator_info,
-             mobile_provider_db *provider_db)
+             ModemInfo * modem_info)
     : owner_(owner),
       service_(service),
       path_(path),
-      control_interface_(control_interface),
-      dispatcher_(dispatcher),
-      metrics_(metrics),
-      manager_(manager),
-      activating_iccid_store_(activating_iccid_store),
-      cellular_operator_info_(cellular_operator_info),
-      provider_db_(provider_db),
+      modem_info_(modem_info),
       type_(Cellular::kTypeInvalid),
       pending_device_info_(false),
       rtnl_handler_(RTNLHandler::GetInstance()),
@@ -55,7 +43,7 @@
   LOG(INFO) << "Modem destructed: " << owner_ << " at " << path_;
   if (device_) {
     device_->DestroyService();
-    manager_->device_info()->DeregisterDevice(device_);
+    modem_info_->manager()->device_info()->DeregisterDevice(device_);
   }
 }
 
@@ -84,10 +72,7 @@
                                    int interface_index) {
   LOG(INFO) << "Creating a cellular device on link " << link_name_
             << " interface index " << interface_index << ".";
-  return new Cellular(control_interface_,
-                      dispatcher_,
-                      metrics_,
-                      manager_,
+  return new Cellular(modem_info_,
                       link_name,
                       address,
                       interface_index,
@@ -95,9 +80,6 @@
                       owner_,
                       service_,
                       path_,
-                      activating_iccid_store_,
-                      cellular_operator_info_,
-                      provider_db_,
                       ProxyFactory::GetInstance());
 }
 
@@ -119,7 +101,7 @@
     LOG(ERROR) << "Unable to create cellular device without a link name.";
     return;
   }
-  if (manager_->device_info()->IsDeviceBlackListed(link_name_)) {
+  if (modem_info_->manager()->device_info()->IsDeviceBlackListed(link_name_)) {
     LOG(INFO) << "Do not create cellular device for blacklisted interface "
               << link_name_;
     return;
@@ -134,8 +116,8 @@
   }
 
   ByteString address_bytes;
-  if (!manager_->device_info()->GetMACAddress(interface_index,
-                                              &address_bytes)) {
+  if (!modem_info_->manager()->device_info()->GetMACAddress(interface_index,
+                                                            &address_bytes)) {
     // Save our properties, wait for OnDeviceInfoAvailable to be called.
     LOG(WARNING) << "No hardware address, device creation pending device info.";
     initial_properties_ = properties;
@@ -153,7 +135,7 @@
         properties_it->first, properties_it->second, vector<string>());
   }
 
-  manager_->device_info()->RegisterDevice(device_);
+  modem_info_->manager()->device_info()->RegisterDevice(device_);
 }
 
 void Modem::OnDBusPropertiesChanged(
diff --git a/modem.h b/modem.h
index 385a471..4aba51a 100644
--- a/modem.h
+++ b/modem.h
@@ -16,6 +16,7 @@
 #include "shill/cellular.h"
 #include "shill/dbus_objectmanager_proxy_interface.h"
 #include "shill/dbus_properties_proxy_interface.h"
+#include "shill/modem_info.h"
 #include "shill/refptr_types.h"
 
 struct mobile_provider_db;
@@ -40,13 +41,7 @@
   Modem(const std::string &owner,
         const std::string &service,
         const std::string &path,
-        ControlInterface *control_interface,
-        EventDispatcher *dispatcher,
-        Metrics *metrics,
-        Manager *manager,
-        ActivatingIccidStore *activating_iccid_store,
-        CellularOperatorInfo *cellular_operator_info,
-        mobile_provider_db *provider_db);
+        ModemInfo *modem_info);
   virtual ~Modem();
 
   // Asynchronously initializes support for the modem.
@@ -71,15 +66,7 @@
 
   virtual void Init();
 
-  ControlInterface *control_interface() const { return control_interface_; }
   CellularRefPtr device() const { return device_; }
-  EventDispatcher *dispatcher() const { return dispatcher_; }
-  Manager *manager() const { return manager_; }
-  Metrics *metrics() const { return metrics_; }
-  CellularOperatorInfo *cellular_operator_info() const {
-    return cellular_operator_info_;
-  }
-  mobile_provider_db *provider_db() const { return provider_db_; }
 
   virtual Cellular *ConstructCellular(const std::string &link_name,
                                       const std::string &device_name,
@@ -123,13 +110,7 @@
 
   CellularRefPtr device_;
 
-  ControlInterface *control_interface_;
-  EventDispatcher *dispatcher_;
-  Metrics *metrics_;
-  Manager *manager_;
-  ActivatingIccidStore *activating_iccid_store_;
-  CellularOperatorInfo *cellular_operator_info_;
-  mobile_provider_db *provider_db_;
+  ModemInfo *modem_info_;
   std::string link_name_;
   Cellular::Type type_;
   bool pending_device_info_;
@@ -146,13 +127,7 @@
   ModemClassic(const std::string &owner,
                const std::string &service,
                const std::string &path,
-               ControlInterface *control_interface,
-               EventDispatcher *dispatcher,
-               Metrics *metrics,
-               Manager *manager,
-               ActivatingIccidStore *activating_iccid_store,
-               CellularOperatorInfo *cellular_operator_info,
-               mobile_provider_db *provider_db);
+               ModemInfo *modem_info);
   virtual ~ModemClassic();
 
   // Gathers information and passes it to CreateDeviceFromModemProperties.
@@ -172,13 +147,7 @@
   Modem1(const std::string &owner,
          const std::string &service,
          const std::string &path,
-         ControlInterface *control_interface,
-         EventDispatcher *dispatcher,
-         Metrics *metrics,
-         Manager *manager,
-         ActivatingIccidStore *activating_iccid_store,
-         CellularOperatorInfo *cellular_operator_info,
-         mobile_provider_db *provider_db);
+         ModemInfo *modem_info);
   virtual ~Modem1();
 
   // Gathers information and passes it to CreateDeviceFromModemProperties.
diff --git a/modem_1.cc b/modem_1.cc
index c033c41..67934e6 100644
--- a/modem_1.cc
+++ b/modem_1.cc
@@ -26,18 +26,9 @@
 Modem1::Modem1(const string &owner,
                const string &service,
                const string &path,
-               ControlInterface *control_interface,
-               EventDispatcher *dispatcher,
-               Metrics *metrics,
-               Manager *manager,
-               ActivatingIccidStore *activating_iccid_store,
-               CellularOperatorInfo *cellular_operator_info,
-               mobile_provider_db *provider_db)
-    : Modem(owner, service, path, control_interface, dispatcher, metrics,
-            manager, activating_iccid_store, cellular_operator_info,
-            provider_db),
-      netfiles_path_(kDefaultNetfilesPath) {
-}
+               ModemInfo *modem_info)
+    : Modem(owner, service, path, modem_info),
+      netfiles_path_(kDefaultNetfilesPath) {}
 
 Modem1::~Modem1() {}
 
diff --git a/modem_1_unittest.cc b/modem_1_unittest.cc
index fdaf661..487c958 100644
--- a/modem_1_unittest.cc
+++ b/modem_1_unittest.cc
@@ -14,12 +14,9 @@
 #include "shill/event_dispatcher.h"
 #include "shill/manager.h"
 #include "shill/mock_cellular.h"
-#include "shill/mock_control.h"
 #include "shill/mock_dbus_properties_proxy.h"
 #include "shill/mock_device_info.h"
-#include "shill/mock_glib.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_metrics.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_rtnl_handler.h"
 #include "shill/proxy_factory.h"
 #include "shill/rtnl_handler.h"
@@ -49,9 +46,9 @@
 class Modem1Test : public Test {
  public:
   Modem1Test()
-      : metrics_(&dispatcher_),
-        manager_(&control_interface_, &dispatcher_, &metrics_, &glib_),
-        info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
+      : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
+        device_info_(modem_info_.control_interface(), modem_info_.dispatcher(),
+                     modem_info_.metrics(), modem_info_.manager()),
         proxy_(new MockDBusPropertiesProxy()),
         proxy_factory_(this),
         modem_(
@@ -59,13 +56,7 @@
                 kOwner,
                 kService,
                 kPath,
-                &control_interface_,
-                &dispatcher_,
-                &metrics_,
-                &manager_,
-                static_cast<ActivatingIccidStore *>(NULL),
-                static_cast<CellularOperatorInfo *>(NULL),
-                static_cast<mobile_provider_db *>(NULL))) {}
+                &modem_info_)) {}
   virtual void SetUp();
   virtual void TearDown();
 
@@ -89,12 +80,9 @@
     Modem1Test *test_;
   };
 
-  MockGLib glib_;
-  MockControl control_interface_;
   EventDispatcher dispatcher_;
-  MockMetrics metrics_;
-  MockManager manager_;
-  MockDeviceInfo info_;
+  MockModemInfo modem_info_;
+  MockDeviceInfo device_info_;
   scoped_ptr<MockDBusPropertiesProxy> proxy_;
   TestProxyFactory proxy_factory_;
   scoped_ptr<Modem1> modem_;
@@ -122,8 +110,9 @@
   EXPECT_CALL(rtnl_handler_, GetInterfaceIndex(kLinkName)).
       WillRepeatedly(Return(kTestInterfaceIndex));
 
-  EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&info_));
-  EXPECT_CALL(info_, GetMACAddress(kTestInterfaceIndex, _)).
+  EXPECT_CALL(*modem_info_.mock_manager(), device_info())
+      .WillRepeatedly(Return(&device_info_));
+  EXPECT_CALL(device_info_, GetMACAddress(kTestInterfaceIndex, _)).
       WillOnce(DoAll(SetArgumentPointee<1>(expected_address_),
                      Return(true)));
 }
diff --git a/modem_classic.cc b/modem_classic.cc
index 497f010..52e3929 100644
--- a/modem_classic.cc
+++ b/modem_classic.cc
@@ -16,17 +16,8 @@
 ModemClassic::ModemClassic(const string &owner,
                            const string &service,
                            const string &path,
-                           ControlInterface *control_interface,
-                           EventDispatcher *dispatcher,
-                           Metrics *metrics,
-                           Manager *manager,
-                           ActivatingIccidStore *activating_iccid_store,
-                           CellularOperatorInfo *cellular_operator_info,
-                           mobile_provider_db *provider_db)
-    : Modem(owner, service, path, control_interface, dispatcher, metrics,
-            manager, activating_iccid_store, cellular_operator_info,
-            provider_db) {
-}
+                           ModemInfo *modem_info)
+    : Modem(owner, service, path, modem_info) {}
 
 ModemClassic::~ModemClassic() {}
 
diff --git a/modem_info.cc b/modem_info.cc
index e14df0b..7de1ee6 100644
--- a/modem_info.cc
+++ b/modem_info.cc
@@ -91,7 +91,8 @@
 void ModemInfo::Stop() {
   activating_iccid_store_.reset();
   cellular_operator_info_.reset();
-  mobile_provider_close_db(provider_db_);
+  if(provider_db_)
+    mobile_provider_close_db(provider_db_);
   provider_db_ = NULL;
   modem_managers_.clear();
 }
@@ -103,19 +104,20 @@
   }
 }
 
+void ModemInfo::set_activating_iccid_store(
+    ActivatingIccidStore *activating_iccid_store) {
+  activating_iccid_store_.reset(activating_iccid_store);
+}
+
+void ModemInfo::set_cellular_operator_info(
+    CellularOperatorInfo *cellular_operator_info) {
+  cellular_operator_info_.reset(cellular_operator_info);
+}
+
 template <class mm>
 void ModemInfo::RegisterModemManager(const string &service,
                                      const string &path) {
-  ModemManager *manager = new mm(service,
-                                 path,
-                                 control_interface_,
-                                 dispatcher_,
-                                 metrics_,
-                                 manager_,
-                                 glib_,
-                                 activating_iccid_store_.get(),
-                                 cellular_operator_info_.get(),
-                                 provider_db_);
+  ModemManager *manager = new mm(service, path, this);
   modem_managers_.push_back(manager);  // Passes ownership.
   manager->Start();
 }
diff --git a/modem_info.h b/modem_info.h
index 681df41..ae0191f 100644
--- a/modem_info.h
+++ b/modem_info.h
@@ -27,7 +27,7 @@
 // Manages modem managers.
 class ModemInfo {
  public:
-  ModemInfo(ControlInterface *control_interface,
+  ModemInfo(ControlInterface *control,
             EventDispatcher *dispatcher,
             Metrics *metrics,
             Manager *manager,
@@ -39,6 +39,44 @@
 
   virtual void OnDeviceInfoAvailable(const std::string &link_name);
 
+  ControlInterface *control_interface() const { return control_interface_; }
+  EventDispatcher *dispatcher() const { return dispatcher_; }
+  Metrics *metrics() const { return metrics_; }
+  Manager *manager() const { return manager_; }
+  GLib *glib() const { return glib_; }
+  ActivatingIccidStore *activating_iccid_store() const {
+    return activating_iccid_store_.get();
+  }
+  CellularOperatorInfo *cellular_operator_info() const {
+    return cellular_operator_info_.get();
+  }
+  mobile_provider_db *provider_db() const { return provider_db_; }
+
+ protected:
+  // Write accessors for unit-tests.
+  void set_control_interface(ControlInterface *control) {
+    control_interface_ = control;
+  }
+  void set_event_dispatcher(EventDispatcher *dispatcher) {
+    dispatcher_ = dispatcher;
+  }
+  void set_metrics(Metrics *metrics) {
+    metrics_ = metrics;
+  }
+  void set_manager(Manager *manager) {
+    manager_ = manager;
+  }
+  void set_glib(GLib *glib) {
+    glib_ = glib;
+  }
+  void set_activating_iccid_store(
+      ActivatingIccidStore *activating_iccid_store);
+  void set_cellular_operator_info(
+      CellularOperatorInfo *cellular_operator_info);
+  void set_mobile_provider_db(mobile_provider_db *provider_db) {
+    provider_db_ = provider_db;
+  }
+
  private:
   friend class ModemInfoTest;
   FRIEND_TEST(ModemInfoTest, RegisterModemManager);
diff --git a/modem_info_unittest.cc b/modem_info_unittest.cc
index df72896..0944228 100644
--- a/modem_info_unittest.cc
+++ b/modem_info_unittest.cc
@@ -96,7 +96,7 @@
   ModemManager *manager = modem_info_.modem_managers_[0];
   EXPECT_EQ(kService, manager->service_);
   EXPECT_EQ(kWatcher, manager->watcher_id_);
-  EXPECT_EQ(modem_info_.provider_db_, manager->provider_db_);
+  EXPECT_EQ(&modem_info_, manager->modem_info_);
   manager->watcher_id_ = 0;
 }
 
diff --git a/modem_manager.cc b/modem_manager.cc
index 95859fe..338d62d 100644
--- a/modem_manager.cc
+++ b/modem_manager.cc
@@ -22,26 +22,12 @@
 
 ModemManager::ModemManager(const string &service,
                            const string &path,
-                           ControlInterface *control_interface,
-                           EventDispatcher *dispatcher,
-                           Metrics *metrics,
-                           Manager *manager,
-                           GLib *glib,
-                           ActivatingIccidStore *activating_iccid_store,
-                           CellularOperatorInfo *cellular_operator_info,
-                           mobile_provider_db *provider_db)
+                           ModemInfo *modem_info)
     : proxy_factory_(ProxyFactory::GetInstance()),
       service_(service),
       path_(path),
       watcher_id_(0),
-      control_interface_(control_interface),
-      dispatcher_(dispatcher),
-      metrics_(metrics),
-      manager_(manager),
-      glib_(glib),
-      activating_iccid_store_(activating_iccid_store),
-      cellular_operator_info_(cellular_operator_info),
-      provider_db_(provider_db) {}
+      modem_info_(modem_info) {}
 
 ModemManager::~ModemManager() {
   Stop();
@@ -51,19 +37,19 @@
   LOG(INFO) << "Start watching modem manager service: " << service_;
   CHECK_EQ(0U, watcher_id_);
   // TODO(petkov): Implement DBus name watching through dbus-c++.
-  watcher_id_ = glib_->BusWatchName(G_BUS_TYPE_SYSTEM,
-                                    service_.c_str(),
-                                    G_BUS_NAME_WATCHER_FLAGS_NONE,
-                                    OnAppear,
-                                    OnVanish,
-                                    this,
-                                    NULL);
+  watcher_id_ = modem_info_->glib()->BusWatchName(G_BUS_TYPE_SYSTEM,
+                                                  service_.c_str(),
+                                                  G_BUS_NAME_WATCHER_FLAGS_NONE,
+                                                  OnAppear,
+                                                  OnVanish,
+                                                  this,
+                                                  NULL);
 }
 
 void ModemManager::Stop() {
   LOG(INFO) << "Stop watching modem manager service: " << service_;
   if (watcher_id_) {
-    glib_->BusUnwatchName(watcher_id_);
+    modem_info_->glib()->BusUnwatchName(watcher_id_);
     watcher_id_ = 0;
   }
   Disconnect();
@@ -127,24 +113,10 @@
 ModemManagerClassic::ModemManagerClassic(
     const string &service,
     const string &path,
-    ControlInterface *control_interface,
-    EventDispatcher *dispatcher,
-    Metrics *metrics,
-    Manager *manager,
-    GLib *glib,
-    ActivatingIccidStore *activating_iccid_store,
-    CellularOperatorInfo *cellular_operator_info,
-    mobile_provider_db *provider_db)
+    ModemInfo *modem_info)
     : ModemManager(service,
                    path,
-                   control_interface,
-                   dispatcher,
-                   metrics,
-                   manager,
-                   glib,
-                   activating_iccid_store,
-                   cellular_operator_info,
-                   provider_db) {}
+                   modem_info) {}
 
 ModemManagerClassic::~ModemManagerClassic() {}
 
@@ -167,13 +139,7 @@
   shared_ptr<ModemClassic> modem(new ModemClassic(owner(),
                                                   service(),
                                                   path,
-                                                  control_interface(),
-                                                  dispatcher(),
-                                                  metrics(),
-                                                  manager(),
-                                                  activating_iccid_store(),
-                                                  cellular_operator_info(),
-                                                  provider_db()));
+                                                  modem_info()));
   RecordAddedModem(modem);
   InitModemClassic(modem);
 }
diff --git a/modem_manager.h b/modem_manager.h
index 15931c9..0f76a6d 100644
--- a/modem_manager.h
+++ b/modem_manager.h
@@ -18,6 +18,7 @@
 #include "shill/dbus_objectmanager_proxy_interface.h"
 #include "shill/dbus_properties_proxy_interface.h"
 #include "shill/glib.h"
+#include "shill/modem_info.h"
 
 struct mobile_provider_db;
 
@@ -42,14 +43,7 @@
  public:
   ModemManager(const std::string &service,
                const std::string &path,
-               ControlInterface *control_interface,
-               EventDispatcher *dispatcher,
-               Metrics *metrics,
-               Manager *manager,
-               GLib *glib,
-               ActivatingIccidStore *activating_iccid_store,
-               CellularOperatorInfo *cellular_operator_info,
-               mobile_provider_db *provider_db);
+               ModemInfo *modem_info);
   virtual ~ModemManager();
 
   // Starts watching for and handling the DBus modem manager service.
@@ -64,21 +58,11 @@
  protected:
   typedef std::map<std::string, std::tr1::shared_ptr<Modem> > Modems;
 
-  ControlInterface *control_interface() const { return control_interface_; }
-  EventDispatcher *dispatcher() const { return dispatcher_; }
-  Manager *manager() const { return manager_; }
-  Metrics *metrics() const { return metrics_; }
   const std::string &owner() const { return owner_; }
   const std::string &service() const { return service_; }
   const std::string &path() const { return path_; }
   ProxyFactory *proxy_factory() const { return proxy_factory_; }
-  ActivatingIccidStore *activating_iccid_store() const {
-    return activating_iccid_store_;
-  }
-  CellularOperatorInfo *cellular_operator_info() const {
-    return cellular_operator_info_;
-  }
-  mobile_provider_db *provider_db() const { return provider_db_; }
+  ModemInfo *modem_info() const { return modem_info_; }
 
   // Connect/Disconnect to a modem manager service.
   // Inheriting classes must call this superclass method.
@@ -130,14 +114,7 @@
 
   Modems modems_;  // Maps a modem |path| to a modem instance.
 
-  ControlInterface *control_interface_;
-  EventDispatcher *dispatcher_;
-  Metrics *metrics_;
-  Manager *manager_;
-  GLib *glib_;
-  ActivatingIccidStore *activating_iccid_store_;
-  CellularOperatorInfo *cellular_operator_info_;
-  mobile_provider_db *provider_db_;
+  ModemInfo *modem_info_;
 
   DISALLOW_COPY_AND_ASSIGN(ModemManager);
 };
@@ -146,14 +123,7 @@
  public:
   ModemManagerClassic(const std::string &service,
                       const std::string &path,
-                      ControlInterface *control_interface,
-                      EventDispatcher *dispatcher,
-                      Metrics *metrics,
-                      Manager *manager,
-                      GLib *glib,
-                      ActivatingIccidStore *activating_iccid_store,
-                      CellularOperatorInfo *cellular_operator_info,
-                      mobile_provider_db *provider_db);
+                      ModemInfo *modem_info);
 
   virtual ~ModemManagerClassic();
 
@@ -181,14 +151,7 @@
  public:
   ModemManager1(const std::string &service,
                 const std::string &path,
-                ControlInterface *control_interface,
-                EventDispatcher *dispatcher,
-                Metrics *metrics,
-                Manager *manager,
-                GLib *glib,
-                ActivatingIccidStore *activating_iccid_store,
-                CellularOperatorInfo *cellular_operator_info,
-                mobile_provider_db *provider_db);
+                ModemInfo *modem_info);
 
   virtual ~ModemManager1();
 
diff --git a/modem_manager_1.cc b/modem_manager_1.cc
index 37e8271..b19ad20 100644
--- a/modem_manager_1.cc
+++ b/modem_manager_1.cc
@@ -22,24 +22,10 @@
 
 ModemManager1::ModemManager1(const string &service,
                              const string &path,
-                             ControlInterface *control_interface,
-                             EventDispatcher *dispatcher,
-                             Metrics *metrics,
-                             Manager *manager,
-                             GLib *glib,
-                             ActivatingIccidStore *activating_iccid_store,
-                             CellularOperatorInfo *cellular_operator_info,
-                             mobile_provider_db *provider_db)
+                             ModemInfo *modem_info)
     : ModemManager(service,
                    path,
-                   control_interface,
-                   dispatcher,
-                   metrics,
-                   manager,
-                   glib,
-                   activating_iccid_store,
-                   cellular_operator_info,
-                   provider_db),
+                   modem_info),
       weak_ptr_factory_(this) {}
 
 ModemManager1::~ModemManager1() {}
@@ -76,13 +62,7 @@
   shared_ptr<Modem1> modem1(new Modem1(owner(),
                                        service(),
                                        path,
-                                       control_interface(),
-                                       dispatcher(),
-                                       metrics(),
-                                       manager(),
-                                       activating_iccid_store(),
-                                       cellular_operator_info(),
-                                       provider_db()));
+                                       modem_info()));
   RecordAddedModem(modem1);
   InitModem1(modem1, properties);
 }
diff --git a/modem_manager_unittest.cc b/modem_manager_unittest.cc
index ce96182..197e0ea 100644
--- a/modem_manager_unittest.cc
+++ b/modem_manager_unittest.cc
@@ -7,12 +7,9 @@
 #include <ModemManager/ModemManager.h>
 
 #include "shill/manager.h"
-#include "shill/mock_control.h"
 #include "shill/mock_dbus_objectmanager_proxy.h"
-#include "shill/mock_glib.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_metrics.h"
 #include "shill/mock_modem.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_modem_manager_proxy.h"
 #include "shill/modem.h"
 #include "shill/modem_manager.h"
@@ -35,24 +32,10 @@
  public:
   ModemManagerCore(const string &service,
                    const string &path,
-                   ControlInterface *control_interface,
-                   EventDispatcher *dispatcher,
-                   Metrics *metrics,
-                   Manager *manager,
-                   GLib *glib,
-                   ActivatingIccidStore *activating_iccid_store,
-                   CellularOperatorInfo *cellular_operator_info,
-                   mobile_provider_db *provider_db)
+                   ModemInfo * modem_info)
       : ModemManager(service,
                      path,
-                     control_interface,
-                     dispatcher,
-                     metrics,
-                     manager,
-                     glib,
-                     activating_iccid_store,
-                     cellular_operator_info,
-                     provider_db) {}
+                     modem_info) {}
 
   virtual ~ModemManagerCore() {}
 
@@ -63,16 +46,10 @@
 class ModemManagerTest : public Test {
  public:
   ModemManagerTest()
-      : metrics_(&dispatcher_),
-        manager_(&control_interface_, &dispatcher_, &metrics_, &glib_) {
-  }
+      : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL) {}
 
   virtual void SetUp() {
-    modem_.reset(new StrictModem(
-        kOwner, kService, kModemPath, &control_interface_, &dispatcher_,
-        &metrics_, &manager_, static_cast<ActivatingIccidStore *>(NULL),
-        static_cast<CellularOperatorInfo *>(NULL),
-        static_cast<mobile_provider_db *>(NULL)));
+    modem_.reset(new StrictModem(kOwner, kService, kModemPath, &modem_info_));
   }
 
  protected:
@@ -83,11 +60,8 @@
 
   shared_ptr<StrictModem> modem_;
 
-  MockGLib glib_;
-  MockControl control_interface_;
   EventDispatcher dispatcher_;
-  MockMetrics metrics_;
-  MockManager manager_;
+  MockModemInfo modem_info_;
 };
 
 const char ModemManagerTest::kService[] = "org.chromium.ModemManager";
@@ -99,16 +73,7 @@
  public:
   ModemManagerCoreTest()
       : ModemManagerTest(),
-        modem_manager_(kService,
-                       kPath,
-                       &control_interface_,
-                       &dispatcher_,
-                       &metrics_,
-                       &manager_,
-                       &glib_,
-                       NULL,
-                       NULL,
-                       NULL) {}
+        modem_manager_(kService, kPath, &modem_info_) {}
 
   virtual void TearDown() {
     modem_manager_.watcher_id_ = 0;
@@ -120,13 +85,14 @@
 
 TEST_F(ModemManagerCoreTest, Start) {
   const int kWatcher = 123;
-  EXPECT_CALL(glib_, BusWatchName(G_BUS_TYPE_SYSTEM,
-                                  StrEq(kService),
-                                  G_BUS_NAME_WATCHER_FLAGS_NONE,
-                                  ModemManager::OnAppear,
-                                  ModemManager::OnVanish,
-                                  &modem_manager_,
-                                  NULL))
+  EXPECT_CALL(*modem_info_.mock_glib(),
+              BusWatchName(G_BUS_TYPE_SYSTEM,
+                           StrEq(kService),
+                           G_BUS_NAME_WATCHER_FLAGS_NONE,
+                           ModemManager::OnAppear,
+                           ModemManager::OnVanish,
+                           &modem_manager_,
+                           NULL))
       .WillOnce(Return(kWatcher));
   EXPECT_EQ(0, modem_manager_.watcher_id_);
   modem_manager_.Start();
@@ -137,7 +103,7 @@
   const int kWatcher = 345;
   modem_manager_.watcher_id_ = kWatcher;
   modem_manager_.owner_ = kOwner;
-  EXPECT_CALL(glib_, BusUnwatchName(kWatcher)).Times(1);
+  EXPECT_CALL(*modem_info_.mock_glib(), BusUnwatchName(kWatcher)).Times(1);
   EXPECT_CALL(modem_manager_, Disconnect());
   modem_manager_.Stop();
 }
@@ -178,24 +144,9 @@
  public:
   ModemManagerClassicMockInit(const string &service,
                               const string &path,
-                              ControlInterface *control_interface,
-                              EventDispatcher *dispatcher,
-                              Metrics *metrics,
-                              Manager *manager,
-                              GLib *glib,
-                              ActivatingIccidStore *activating_iccid_store,
-                              CellularOperatorInfo *cellular_operator_info,
-                              mobile_provider_db *provider_db) :
-      ModemManagerClassic(service,
-                          path,
-                          control_interface,
-                          dispatcher,
-                          metrics,
-                          manager,
-                          glib,
-                          activating_iccid_store,
-                          cellular_operator_info,
-                          provider_db) {}
+                              ModemInfo *modem_info_) :
+      ModemManagerClassic(service, path, modem_info_) {}
+
   MOCK_METHOD1(InitModemClassic, void(shared_ptr<ModemClassic>));
 };
 
@@ -205,14 +156,7 @@
       : ModemManagerTest(),
         modem_manager_(kService,
                        kPath,
-                       &control_interface_,
-                       &dispatcher_,
-                       &metrics_,
-                       &manager_,
-                       &glib_,
-                       NULL,
-                       NULL,
-                       NULL),
+                       &modem_info_),
         proxy_(new MockModemManagerProxy()),
         proxy_factory_(this) {
   }
@@ -267,24 +211,8 @@
  public:
   ModemManager1MockInit(const string &service,
                         const string &path,
-                        ControlInterface *control_interface,
-                        EventDispatcher *dispatcher,
-                        Metrics *metrics,
-                        Manager *manager,
-                        GLib *glib,
-                        ActivatingIccidStore *activating_iccid_store,
-                        CellularOperatorInfo *cellular_operator_info,
-                        mobile_provider_db *provider_db) :
-      ModemManager1(service,
-                    path,
-                    control_interface,
-                    dispatcher,
-                    metrics,
-                    manager,
-                    glib,
-                    activating_iccid_store,
-                    cellular_operator_info,
-                    provider_db) {}
+                        ModemInfo *modem_info_) :
+      ModemManager1(service, path, modem_info_) {}
   MOCK_METHOD2(InitModem1, void(shared_ptr<Modem1>,
                                 const DBusInterfaceToProperties &));
 };
@@ -294,19 +222,9 @@
  public:
   ModemManager1Test()
       : ModemManagerTest(),
-        modem_manager_(kService,
-                       kPath,
-                       &control_interface_,
-                       &dispatcher_,
-                       &metrics_,
-                       &manager_,
-                       &glib_,
-                       NULL,
-                       NULL,
-                       NULL),
+        modem_manager_(kService, kPath, &modem_info_),
         proxy_(new MockDBusObjectManagerProxy()),
-        proxy_factory_(this) {
-  }
+        proxy_factory_(this) {}
 
  protected:
   class TestProxyFactory : public ProxyFactory {
diff --git a/modem_unittest.cc b/modem_unittest.cc
index 60253e1..99e7ca6 100644
--- a/modem_unittest.cc
+++ b/modem_unittest.cc
@@ -18,13 +18,10 @@
 #include "shill/event_dispatcher.h"
 #include "shill/manager.h"
 #include "shill/mock_cellular.h"
-#include "shill/mock_control.h"
 #include "shill/mock_dbus_properties_proxy.h"
 #include "shill/mock_device_info.h"
-#include "shill/mock_glib.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_metrics.h"
 #include "shill/mock_modem.h"
+#include "shill/mock_modem_info.h"
 #include "shill/mock_rtnl_handler.h"
 #include "shill/proxy_factory.h"
 #include "shill/rtnl_handler.h"
@@ -56,9 +53,9 @@
 class ModemTest : public Test {
  public:
   ModemTest()
-      : metrics_(&dispatcher_),
-        manager_(&control_interface_, &dispatcher_, &metrics_, &glib_),
-        info_(&control_interface_, &dispatcher_, &metrics_, &manager_),
+      : modem_info_(NULL, &dispatcher_, NULL, NULL, NULL),
+        device_info_(modem_info_.control_interface(), modem_info_.dispatcher(),
+                     modem_info_.metrics(), modem_info_.manager()),
         proxy_(new MockDBusPropertiesProxy()),
         proxy_factory_(this),
         modem_(
@@ -66,13 +63,7 @@
                 kOwner,
                 kService,
                 kPath,
-                &control_interface_,
-                &dispatcher_,
-                &metrics_,
-                &manager_,
-                static_cast<ActivatingIccidStore *>(NULL),
-                static_cast<CellularOperatorInfo *>(NULL),
-                static_cast<mobile_provider_db *>(NULL))) {}
+                &modem_info_)) {}
   virtual void SetUp();
   virtual void TearDown();
 
@@ -95,12 +86,9 @@
     ModemTest *test_;
   };
 
-  MockGLib glib_;
-  MockControl control_interface_;
   EventDispatcher dispatcher_;
-  MockMetrics metrics_;
-  MockManager manager_;
-  MockDeviceInfo info_;
+  MockModemInfo modem_info_;
+  MockDeviceInfo device_info_;
   scoped_ptr<MockDBusPropertiesProxy> proxy_;
   TestProxyFactory proxy_factory_;
   scoped_ptr<StrictModem> modem_;
@@ -118,7 +106,8 @@
   EXPECT_CALL(rtnl_handler_, GetInterfaceIndex(kLinkName)).
       WillRepeatedly(Return(kTestInterfaceIndex));
 
-  EXPECT_CALL(manager_, device_info()).WillRepeatedly(Return(&info_));
+  EXPECT_CALL(*modem_info_.mock_manager(), device_info())
+      .WillRepeatedly(Return(&device_info_));
 }
 
 void ModemTest::TearDown() {
@@ -141,7 +130,7 @@
 
   // The first time we call CreateDeviceFromModemProperties,
   // GetMACAddress will fail.
-  EXPECT_CALL(info_, GetMACAddress(kTestInterfaceIndex, _)).
+  EXPECT_CALL(device_info_, GetMACAddress(kTestInterfaceIndex, _)).
       WillOnce(Return(false));
   EXPECT_CALL(*modem_, GetModemInterface()).
       WillRepeatedly(Return(MM_MODEM_INTERFACE));
@@ -150,16 +139,13 @@
 
   // On the second time, we allow GetMACAddress to succeed.  Now we
   // expect a device to be built
-  EXPECT_CALL(info_, GetMACAddress(kTestInterfaceIndex, _)).
+  EXPECT_CALL(device_info_, GetMACAddress(kTestInterfaceIndex, _)).
       WillOnce(DoAll(SetArgumentPointee<1>(expected_address_),
                      Return(true)));
 
   // modem will take ownership
   MockCellular *cellular = new MockCellular(
-      &control_interface_,
-      &dispatcher_,
-      &metrics_,
-      &manager_,
+      &modem_info_,
       kLinkName,
       kAddressAsString,
       kTestInterfaceIndex,
@@ -167,9 +153,6 @@
       kOwner,
       kService,
       kPath,
-      static_cast<ActivatingIccidStore *>(NULL),
-      static_cast<CellularOperatorInfo *>(NULL),
-      static_cast<mobile_provider_db *>(NULL),
       ProxyFactory::GetInstance());
 
   EXPECT_CALL(*modem_,
@@ -182,14 +165,14 @@
       _,
       HasDBusPropertyWithValueU32(kSentinel, kSentinelValue),
       _));
-  EXPECT_CALL(info_, RegisterDevice(_));
+  EXPECT_CALL(device_info_, RegisterDevice(_));
   modem_->OnDeviceInfoAvailable(kLinkName);
 
   EXPECT_TRUE(modem_->device_.get());
 
   // Add expectations for the evental |modem_| destruction.
   EXPECT_CALL(*cellular, DestroyService());
-  EXPECT_CALL(info_, DeregisterDevice(_));
+  EXPECT_CALL(device_info_, DeregisterDevice(_));
 }
 
 TEST_F(ModemTest, EarlyDeviceProperties) {