diff --git a/cellular/cellular.h b/cellular/cellular.h
index e99f8f7..41140cd 100644
--- a/cellular/cellular.h
+++ b/cellular/cellular.h
@@ -343,7 +343,6 @@
   friend class CellularCapabilityUniversalCdmaTest;
   friend class CellularServiceTest;
   friend class ModemTest;
-  friend class SubscriptionStateOutOfCreditsDetectorTest;
   FRIEND_TEST(CellularCapabilityCdmaTest, GetRegistrationState);
   FRIEND_TEST(CellularCapabilityClassicTest, AllowRoaming);
   FRIEND_TEST(CellularCapabilityClassicTest, EnableModemFail);
diff --git a/cellular/cellular_capability.cc b/cellular/cellular_capability.cc
index ee07611..fa8b789 100644
--- a/cellular/cellular_capability.cc
+++ b/cellular/cellular_capability.cc
@@ -165,10 +165,6 @@
   return false;
 }
 
-bool CellularCapability::ShouldDetectOutOfCredit() const {
-  return false;
-}
-
 void CellularCapability::SetupLocation(uint32_t sources,
                                        bool signal_location,
                                        const ResultCallback& callback) {
diff --git a/cellular/cellular_capability.h b/cellular/cellular_capability.h
index a0cd52a..52ff6c6 100644
--- a/cellular/cellular_capability.h
+++ b/cellular/cellular_capability.h
@@ -208,11 +208,6 @@
 
   virtual std::string GetRoamingStateString() const = 0;
 
-  // Returns true if the cellular device should initiate passive traffic
-  // monitoring to trigger active out-of-credit detection checks. The default
-  // implementation returns false by default.
-  virtual bool ShouldDetectOutOfCredit() const;
-
   // TODO(armansito): Remove this method once cromo is deprecated.
   virtual void GetSignalQuality() = 0;
 
diff --git a/cellular/cellular_capability_universal.cc b/cellular/cellular_capability_universal.cc
index 0521c28..48f27e6 100644
--- a/cellular/cellular_capability_universal.cc
+++ b/cellular/cellular_capability_universal.cc
@@ -640,9 +640,12 @@
 }
 
 void CellularCapabilityUniversal::UpdateServiceActivationState() {
-  if (!cellular()->service().get())
+  CellularServiceRefPtr service = cellular()->service();
+  if (!service)
     return;
 
+  service->NotifySubscriptionStateChanged(subscription_state_);
+
   const string& sim_identifier = cellular()->sim_identifier();
   string activation_state;
   PendingActivationStore::State state =
@@ -663,10 +666,10 @@
     // property will be corrected based on the user data at that time.
     // NOTE: This function can be called outside the service initialization
     // path so make sure we don't overwrite the auto-connect setting.
-    if (cellular()->service()->activation_state() != activation_state)
-      cellular()->service()->SetAutoConnect(true);
+    if (service->activation_state() != activation_state)
+      service->SetAutoConnect(true);
   }
-  cellular()->service()->SetActivationState(activation_state);
+  service->SetActivationState(activation_state);
 }
 
 void CellularCapabilityUniversal::OnServiceCreated() {
@@ -678,15 +681,6 @@
   cellular()->service()->SetActivationType(CellularService::kActivationTypeOTA);
   UpdateServiceActivationState();
 
-  // WORKAROUND:
-  // E362 modems on Verizon network does not properly redirect when a SIM
-  // runs out of credits, we need to enforce out-of-credits detection.
-  //
-  // The out-of-credits detection is also needed on ALT3100 modems until the PCO
-  // support is ready (crosbug.com/p/20461).
-  cellular()->service()->InitOutOfCreditsDetection(
-      GetOutOfCreditsDetectionType());
-
   // Make sure that the network technology is set when the service gets
   // created, just in case.
   cellular()->service()->SetNetworkTechnology(GetNetworkTechnologyString());
@@ -1598,12 +1592,6 @@
         static_cast<MMModem3gppSubscriptionState>(
             properties.GetUint(MM_MODEM_MODEM3GPP_PROPERTY_SUBSCRIPTIONSTATE)));
     OnSubscriptionStateChanged(subscription_state);
-
-    CellularServiceRefPtr service = cellular()->service();
-    if (service) {
-      service->out_of_credits_detector()->NotifySubscriptionStateChanged(
-          subscription_state);
-    }
   }
 
   if (properties.ContainsUint(MM_MODEM_MODEM3GPP_PROPERTY_ENABLEDFACILITYLOCKS))
@@ -1765,13 +1753,4 @@
   cellular()->home_provider_info()->UpdateMCCMNC(operator_id);
 }
 
-OutOfCreditsDetector::OOCType
-CellularCapabilityUniversal::GetOutOfCreditsDetectionType() const {
-  if (cellular()->mm_plugin() == kAltairLTEMMPlugin) {
-    return OutOfCreditsDetector::OOCTypeSubscriptionState;
-  } else {
-    return OutOfCreditsDetector::OOCTypeNone;
-  }
-}
-
 }  // namespace shill
diff --git a/cellular/cellular_capability_universal.h b/cellular/cellular_capability_universal.h
index a116e48..20a59f3 100644
--- a/cellular/cellular_capability_universal.h
+++ b/cellular/cellular_capability_universal.h
@@ -38,7 +38,6 @@
 #include "shill/cellular/mm1_modem_proxy_interface.h"
 #include "shill/cellular/mm1_modem_simple_proxy_interface.h"
 #include "shill/cellular/mm1_sim_proxy_interface.h"
-#include "shill/cellular/out_of_credits_detector.h"
 #include "shill/cellular/subscription_state.h"
 
 namespace shill {
@@ -200,8 +199,6 @@
   FRIEND_TEST(CellularCapabilityUniversalMainTest, GetMdnForOLP);
   FRIEND_TEST(CellularCapabilityUniversalMainTest,
               GetNetworkTechnologyStringOnE362);
-  FRIEND_TEST(CellularCapabilityUniversalMainTest,
-              GetOutOfCreditsDetectionType);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, GetTypeString);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, IsMdnValid);
   FRIEND_TEST(CellularCapabilityUniversalMainTest, IsRegistered);
@@ -382,9 +379,6 @@
 
   static bool IsRegisteredState(MMModem3gppRegistrationState state);
 
-  // Returns the out-of-credits detection algorithm to be used on this modem.
-  OutOfCreditsDetector::OOCType GetOutOfCreditsDetectionType() const;
-
   void set_active_bearer_for_test(std::unique_ptr<CellularBearer> bearer) {
     active_bearer_ = std::move(bearer);
   }
diff --git a/cellular/cellular_capability_universal_unittest.cc b/cellular/cellular_capability_universal_unittest.cc
index e6ccc7c..149716c 100644
--- a/cellular/cellular_capability_universal_unittest.cc
+++ b/cellular/cellular_capability_universal_unittest.cc
@@ -1939,15 +1939,6 @@
   EXPECT_EQ(kNetworkTechnologyGprs, capability_->GetNetworkTechnologyString());
 }
 
-TEST_F(CellularCapabilityUniversalMainTest, GetOutOfCreditsDetectionType) {
-  cellular_->set_model_id("");;
-  EXPECT_EQ(OutOfCreditsDetector::OOCTypeNone,
-            capability_->GetOutOfCreditsDetectionType());
-  cellular_->set_mm_plugin(CellularCapabilityUniversal::kAltairLTEMMPlugin);
-  EXPECT_EQ(OutOfCreditsDetector::OOCTypeSubscriptionState,
-            capability_->GetOutOfCreditsDetectionType());
-}
-
 TEST_F(CellularCapabilityUniversalMainTest, SimLockStatusToProperty) {
   Error error;
   KeyValueStore store = capability_->SimLockStatusToProperty(&error);
diff --git a/cellular/cellular_service.cc b/cellular/cellular_service.cc
index d19191d..6ff2458 100644
--- a/cellular/cellular_service.cc
+++ b/cellular/cellular_service.cc
@@ -42,9 +42,7 @@
 const char CellularService::kAutoConnBadPPPCredentials[] =
     "bad PPP credentials";
 const char CellularService::kAutoConnDeviceDisabled[] = "device disabled";
-const char CellularService::kAutoConnOutOfCredits[] = "device out of credits";
-const char CellularService::kAutoConnOutOfCreditsDetectionInProgress[] =
-    "device detecting out-of-credits";
+const char CellularService::kAutoConnOutOfCredits[] = "service out of credits";
 const char CellularService::kStorageIccid[] = "Cellular.Iccid";
 const char CellularService::kStorageImei[] = "Cellular.Imei";
 const char CellularService::kStorageImsi[] = "Cellular.Imsi";
@@ -83,7 +81,8 @@
               Technology::kCellular),
       activation_type_(kActivationTypeUnknown),
       cellular_(device),
-      is_auto_connecting_(false) {
+      is_auto_connecting_(false),
+      out_of_credits_(false) {
   SetConnectable(true);
   PropertyStore* store = this->mutable_store();
   HelpRegisterDerivedString(kActivationTypeProperty,
@@ -125,10 +124,6 @@
                          kTypeCellular,
                          device->GetEquipmentIdentifier().c_str(),
                          service_id.c_str()));
-
-  // Assume we are not performing any out-of-credits detection.
-  // The capability can reinitialize with the appropriate type later.
-  InitOutOfCreditsDetection(OutOfCreditsDetector::OOCTypeNone);
 }
 
 CellularService::~CellularService() { }
@@ -146,11 +141,7 @@
     *reason = kAutoConnBadPPPCredentials;
     return false;
   }
-  if (out_of_credits_detector_->IsDetecting()) {
-    *reason = kAutoConnOutOfCreditsDetectionInProgress;
-    return false;
-  }
-  if (out_of_credits_detector_->out_of_credits()) {
+  if (out_of_credits_) {
     *reason = kAutoConnOutOfCredits;
     return false;
   }
@@ -247,12 +238,6 @@
                                   last_good_apn_info_);
 }
 
-void CellularService::InitOutOfCreditsDetection(
-    OutOfCreditsDetector::OOCType ooc_type) {
-  out_of_credits_detector_ =
-      OutOfCreditsDetector::CreateDetector(ooc_type, this);
-}
-
 bool CellularService::Load(StoreInterface* storage) {
   // The initial storage identifier contains the MAC address of the cellular
   // device. However, the MAC address of a cellular device may not be constant
@@ -366,11 +351,20 @@
 }
 
 bool CellularService::IsOutOfCredits(Error* /*error*/) {
-  return out_of_credits_detector_->out_of_credits();
+  return out_of_credits_;
 }
 
-void CellularService::SignalOutOfCreditsChanged(bool state) const {
-  adaptor()->EmitBoolChanged(kOutOfCreditsProperty, state);
+void CellularService::NotifySubscriptionStateChanged(
+    SubscriptionState subscription_state) {
+  bool new_out_of_credits =
+      (subscription_state == SubscriptionState::kOutOfCredits);
+  if (out_of_credits_ == new_out_of_credits)
+    return;
+
+  out_of_credits_ = new_out_of_credits;
+  SLOG(this, 2) << (out_of_credits_ ? "Marking service out-of-credits"
+                                    : "Marking service as not out-of-credits");
+  adaptor()->EmitBoolChanged(kOutOfCreditsProperty, out_of_credits_);
 }
 
 void CellularService::AutoConnect() {
@@ -382,8 +376,6 @@
 void CellularService::Connect(Error* error, const char* reason) {
   Service::Connect(error, reason);
   cellular_->Connect(error);
-  if (error->IsFailure())
-    out_of_credits_detector_->ResetDetector();
 }
 
 void CellularService::Disconnect(Error* error, const char* reason) {
@@ -401,11 +393,6 @@
   cellular_->CompleteActivation(error);
 }
 
-void CellularService::SetState(ConnectState new_state) {
-  out_of_credits_detector_->NotifyServiceStateChanged(state(), new_state);
-  Service::SetState(new_state);
-}
-
 string CellularService::GetStorageIdentifier() const {
   return storage_identifier_;
 }
diff --git a/cellular/cellular_service.h b/cellular/cellular_service.h
index 0dbdcab..77b9870 100644
--- a/cellular/cellular_service.h
+++ b/cellular/cellular_service.h
@@ -27,7 +27,7 @@
 #include <gtest/gtest_prod.h>  // for FRIEND_TEST
 
 #include "shill/cellular/cellular.h"
-#include "shill/cellular/out_of_credits_detector.h"
+#include "shill/cellular/subscription_state.h"
 #include "shill/refptr_types.h"
 #include "shill/service.h"
 
@@ -57,7 +57,6 @@
                              Error* error,
                              const ResultCallback& callback) override;
   void CompleteCellularActivation(Error* error) override;
-  void SetState(ConnectState new_state) override;
 
   std::string GetStorageIdentifier() const override;
 
@@ -97,11 +96,6 @@
   const std::string& ppp_username() const { return ppp_username_; }
   const std::string& ppp_password() const { return ppp_password_; }
 
-  OutOfCreditsDetector* out_of_credits_detector() {
-    return out_of_credits_detector_.get();
-  }
-  void SignalOutOfCreditsChanged(bool state) const;
-
   // Overrides Load and Save from parent Service class.  We will call
   // the parent method.
   bool Load(StoreInterface* storage) override;
@@ -112,8 +106,7 @@
   virtual void SetLastGoodApn(const Stringmap& apn_info);
   virtual void ClearLastGoodApn();
 
-  // Initialize out-of-credits detection.
-  void InitOutOfCreditsDetection(OutOfCreditsDetector::OOCType ooc_type);
+  void NotifySubscriptionStateChanged(SubscriptionState subscription_state);
 
  protected:
   // Overrides IsAutoConnectable from parent Service class.
@@ -152,7 +145,6 @@
   static const char kAutoConnBadPPPCredentials[];
   static const char kAutoConnDeviceDisabled[];
   static const char kAutoConnOutOfCredits[];
-  static const char kAutoConnOutOfCreditsDetectionInProgress[];
   static const char kStorageIccid[];
   static const char kStorageImei[];
   static const char kStorageImsi[];
@@ -213,11 +205,6 @@
                            Stringmap* apn_info);
   bool IsOutOfCredits(Error* /*error*/);
 
-  void set_out_of_credits_detector_for_test(
-      std::unique_ptr<OutOfCreditsDetector> detector) {
-    out_of_credits_detector_ = std::move(detector);
-  }
-
   // Properties
   ActivationType activation_type_;
   std::string activation_state_;
@@ -240,8 +227,8 @@
   // call to Connect().  It does not remain set while the async request is
   // in flight.
   bool is_auto_connecting_;
-  // Out-of-credits detector.
-  std::unique_ptr<OutOfCreditsDetector> out_of_credits_detector_;
+  // Flag indicating if the user has run out of data credits.
+  bool out_of_credits_;
 
   DISALLOW_COPY_AND_ASSIGN(CellularService);
 };
diff --git a/cellular/cellular_service_unittest.cc b/cellular/cellular_service_unittest.cc
index 11cde58..d70126f 100644
--- a/cellular/cellular_service_unittest.cc
+++ b/cellular/cellular_service_unittest.cc
@@ -25,7 +25,6 @@
 #include "shill/cellular/mock_cellular.h"
 #include "shill/cellular/mock_mobile_operator_info.h"
 #include "shill/cellular/mock_modem_info.h"
-#include "shill/cellular/mock_out_of_credits_detector.h"
 #include "shill/mock_adaptors.h"
 #include "shill/mock_manager.h"
 #include "shill/mock_metrics.h"
@@ -70,12 +69,7 @@
   }
 
   void SetUp() override {
-    adaptor_ =
-        static_cast<ServiceMockAdaptor*>(service_->adaptor());
-
-    auto detector = std::make_unique<MockOutOfCreditsDetector>(service_.get());
-    out_of_credits_detector_ = detector.get();
-    service_->set_out_of_credits_detector_for_test(std::move(detector));
+    adaptor_ = static_cast<ServiceMockAdaptor*>(service_->adaptor());
   }
 
   CellularCapabilityCdma* GetCapabilityCdma() {
@@ -92,7 +86,6 @@
   scoped_refptr<MockCellular> device_;
   CellularServiceRefPtr service_;
   ServiceMockAdaptor* adaptor_;  // Owned by |service_|.
-  MockOutOfCreditsDetector* out_of_credits_detector_;  // Owned by |service_|.
 };
 
 const char CellularServiceTest::kAddress[] = "000102030405";
@@ -316,9 +309,6 @@
 TEST_F(CellularServiceTest, IsAutoConnectable) {
   const char* reason = nullptr;
 
-  ON_CALL(*out_of_credits_detector_, IsDetecting())
-      .WillByDefault(Return(false));
-
   // Auto-connect should be suppressed if the device is not running.
   device_->running_ = false;
   EXPECT_FALSE(service_->IsAutoConnectable(&reason));
@@ -329,40 +319,18 @@
   // If we're waiting on a disconnect before an activation, don't auto-connect.
   GetCapabilityCdma()->activation_starting_ = true;
   EXPECT_FALSE(service_->IsAutoConnectable(&reason));
+  EXPECT_STREQ(CellularService::kAutoConnActivating, reason);
 
   // If we're waiting on an activation, also don't auto-connect.
   GetCapabilityCdma()->activation_starting_ = false;
   GetCapabilityCdma()->activation_state_ =
       MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATING;
   EXPECT_FALSE(service_->IsAutoConnectable(&reason));
-
+  EXPECT_STREQ(CellularService::kAutoConnActivating, reason);
   GetCapabilityCdma()->activation_state_ =
       MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED;
 
-  // Auto-connect should be suppressed if the we're undergoing an
-  // out-of-credits detection.
-  EXPECT_CALL(*out_of_credits_detector_, IsDetecting())
-      .WillOnce(Return(true));
-  EXPECT_FALSE(service_->IsAutoConnectable(&reason));
-  EXPECT_STREQ(CellularService::kAutoConnOutOfCreditsDetectionInProgress,
-               reason);
-  Mock::VerifyAndClearExpectations(out_of_credits_detector_);
-
-  // Auto-connect should be suppressed if we're out of credits.
-  EXPECT_CALL(*out_of_credits_detector_, IsDetecting())
-      .WillOnce(Return(false));
-  EXPECT_CALL(*out_of_credits_detector_, out_of_credits())
-      .WillOnce(Return(true));
-  EXPECT_FALSE(service_->IsAutoConnectable(&reason));
-  EXPECT_STREQ(CellularService::kAutoConnOutOfCredits, reason);
-  Mock::VerifyAndClearExpectations(out_of_credits_detector_);
-
-  EXPECT_CALL(*out_of_credits_detector_, out_of_credits())
-      .WillRepeatedly(Return(false));
-
   // But other activation states are fine.
-  GetCapabilityCdma()->activation_state_ =
-      MM_MODEM_CDMA_ACTIVATION_STATE_ACTIVATED;
   EXPECT_TRUE(service_->IsAutoConnectable(&reason));
   GetCapabilityCdma()->activation_state_ =
       MM_MODEM_CDMA_ACTIVATION_STATE_NOT_ACTIVATED;
@@ -371,9 +339,16 @@
       MM_MODEM_CDMA_ACTIVATION_STATE_PARTIALLY_ACTIVATED;
   EXPECT_TRUE(service_->IsAutoConnectable(&reason));
 
+  // Auto-connect should be suppressed if we're out of credits.
+  service_->NotifySubscriptionStateChanged(SubscriptionState::kOutOfCredits);
+  EXPECT_FALSE(service_->IsAutoConnectable(&reason));
+  EXPECT_STREQ(CellularService::kAutoConnOutOfCredits, reason);
+  service_->NotifySubscriptionStateChanged(SubscriptionState::kProvisioned);
+
   // A PPP authentication failure means the Service is not auto-connectable.
   service_->SetFailure(Service::kFailurePPPAuth);
   EXPECT_FALSE(service_->IsAutoConnectable(&reason));
+  EXPECT_STREQ(CellularService::kAutoConnBadPPPCredentials, reason);
 
   // Reset failure state, to make the Service auto-connectable again.
   service_->SetState(Service::kStateIdle);
@@ -587,10 +562,11 @@
   service_->SetNetworkTechnology(network_technology + "and some new stuff");
   Mock::VerifyAndClearExpectations(adaptor_);
 
-  bool out_of_credits = true;
-  EXPECT_CALL(*adaptor_,
-              EmitBoolChanged(kOutOfCreditsProperty, out_of_credits));
-  service_->SignalOutOfCreditsChanged(out_of_credits);
+  EXPECT_CALL(*adaptor_, EmitBoolChanged(kOutOfCreditsProperty, true));
+  service_->NotifySubscriptionStateChanged(SubscriptionState::kOutOfCredits);
+  Mock::VerifyAndClearExpectations(adaptor_);
+  EXPECT_CALL(*adaptor_, EmitBoolChanged(kOutOfCreditsProperty, false));
+  service_->NotifySubscriptionStateChanged(SubscriptionState::kProvisioned);
   Mock::VerifyAndClearExpectations(adaptor_);
 
   string roaming_state = service_->roaming_state();
diff --git a/cellular/mock_out_of_credits_detector.cc b/cellular/mock_out_of_credits_detector.cc
deleted file mode 100644
index bbb6cc0..0000000
--- a/cellular/mock_out_of_credits_detector.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "shill/cellular/mock_out_of_credits_detector.h"
-
-#include <gmock/gmock.h>
-
-namespace shill {
-
-MockOutOfCreditsDetector::MockOutOfCreditsDetector(CellularService* service)
-    : OutOfCreditsDetector(service) {}
-
-MockOutOfCreditsDetector::~MockOutOfCreditsDetector() {}
-
-}  // namespace shill
diff --git a/cellular/mock_out_of_credits_detector.h b/cellular/mock_out_of_credits_detector.h
deleted file mode 100644
index 1e20828..0000000
--- a/cellular/mock_out_of_credits_detector.h
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#ifndef SHILL_CELLULAR_MOCK_OUT_OF_CREDITS_DETECTOR_H_
-#define SHILL_CELLULAR_MOCK_OUT_OF_CREDITS_DETECTOR_H_
-
-#include <gmock/gmock.h>
-
-#include "shill/cellular/out_of_credits_detector.h"
-
-namespace shill {
-
-class MockOutOfCreditsDetector : public OutOfCreditsDetector {
- public:
-  explicit MockOutOfCreditsDetector(CellularService* service);
-  ~MockOutOfCreditsDetector() override;
-
-  MOCK_METHOD0(ResetDetector, void());
-  MOCK_CONST_METHOD0(IsDetecting, bool());
-  MOCK_METHOD2(NotifyServiceStateChanged,
-               void(Service::ConnectState old_state,
-                    Service::ConnectState new_state));
-  MOCK_METHOD1(NotifySubscriptionStateChanged,
-               void(SubscriptionState subscription_state));
-  MOCK_CONST_METHOD0(out_of_credits, bool());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(MockOutOfCreditsDetector);
-};
-
-}  // namespace shill
-
-#endif  // SHILL_CELLULAR_MOCK_OUT_OF_CREDITS_DETECTOR_H_
diff --git a/cellular/no_out_of_credits_detector.h b/cellular/no_out_of_credits_detector.h
deleted file mode 100644
index cc1fee2..0000000
--- a/cellular/no_out_of_credits_detector.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#ifndef SHILL_CELLULAR_NO_OUT_OF_CREDITS_DETECTOR_H_
-#define SHILL_CELLULAR_NO_OUT_OF_CREDITS_DETECTOR_H_
-
-#include <base/macros.h>
-
-#include "shill/cellular/out_of_credits_detector.h"
-
-namespace shill {
-
-// This object performs no out-of-credits detection.
-class NoOutOfCreditsDetector : public OutOfCreditsDetector {
- public:
-  explicit NoOutOfCreditsDetector(CellularService* service)
-      : OutOfCreditsDetector(service) {}
-  ~NoOutOfCreditsDetector() override {}
-
-  // Resets the detector state.
-  void ResetDetector() override {}
-  // Returns |true| if this object is busy detecting out-of-credits.
-  bool IsDetecting() const override { return false; }
-  // Notifies this object of a service state change.
-  void NotifyServiceStateChanged(
-      Service::ConnectState old_state,
-      Service::ConnectState new_state) override {}
-  // Notifies this object when the subscription state has changed.
-  void NotifySubscriptionStateChanged(
-      SubscriptionState subscription_state) override {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(NoOutOfCreditsDetector);
-};
-
-}  // namespace shill
-
-#endif  // SHILL_CELLULAR_NO_OUT_OF_CREDITS_DETECTOR_H_
diff --git a/cellular/out_of_credits_detector.cc b/cellular/out_of_credits_detector.cc
deleted file mode 100644
index 4507e46..0000000
--- a/cellular/out_of_credits_detector.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "shill/cellular/out_of_credits_detector.h"
-
-#include <memory>
-#include <string>
-
-#include "shill/cellular/cellular_service.h"
-#include "shill/cellular/no_out_of_credits_detector.h"
-#include "shill/cellular/subscription_state_out_of_credits_detector.h"
-#include "shill/logging.h"
-
-namespace shill {
-
-using std::string;
-
-namespace Logging {
-static auto kModuleLogScope = ScopeLogger::kCellular;
-static string ObjectID(CellularService* c) { return c->GetRpcIdentifier(); }
-}
-
-OutOfCreditsDetector::OutOfCreditsDetector(CellularService* service)
-    : service_(service), out_of_credits_(false) {}
-
-OutOfCreditsDetector::~OutOfCreditsDetector() {
-}
-
-// static
-std::unique_ptr<OutOfCreditsDetector> OutOfCreditsDetector::CreateDetector(
-    OOCType detector_type, CellularService* service) {
-  switch (detector_type) {
-    case OOCTypeSubscriptionState:
-      LOG(INFO) << __func__
-                << ": Using subscription status out-of-credits detection";
-      return std::make_unique<SubscriptionStateOutOfCreditsDetector>(service);
-    default:
-      LOG(INFO) << __func__ << ": No out-of-credits detection";
-      return std::make_unique<NoOutOfCreditsDetector>(service);
-  }
-}
-
-void OutOfCreditsDetector::ReportOutOfCredits(bool state) {
-  SLOG(service_, 2) << __func__ << ": " << state;
-  if (state == out_of_credits_) {
-    return;
-  }
-  out_of_credits_ = state;
-  service_->SignalOutOfCreditsChanged(state);
-}
-
-}  // namespace shill
diff --git a/cellular/out_of_credits_detector.h b/cellular/out_of_credits_detector.h
deleted file mode 100644
index c33a13c..0000000
--- a/cellular/out_of_credits_detector.h
+++ /dev/null
@@ -1,83 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#ifndef SHILL_CELLULAR_OUT_OF_CREDITS_DETECTOR_H_
-#define SHILL_CELLULAR_OUT_OF_CREDITS_DETECTOR_H_
-
-#include <memory>
-
-#include <base/macros.h>
-
-#include "shill/cellular/subscription_state.h"
-#include "shill/service.h"
-
-namespace shill {
-
-class CellularService;
-
-// Base class for the various out-of-credits detection mechanism.
-class OutOfCreditsDetector {
- public:
-  explicit OutOfCreditsDetector(CellularService* service);
-  virtual ~OutOfCreditsDetector();
-
-  // Various types of out-of-credits detections.
-  enum OOCType {
-    // No out-of-credits detection is employed.
-    OOCTypeNone,
-    // Use ModemManager SubscriptionState property to determine OOC condition.
-    OOCTypeSubscriptionState,
-  };
-
-  // Creates a specific out-of-credits detector.
-  // For OOCTypeNone, this methods returns NoOutOfCreditsDetector.
-  // For OOCTypeSubscriptionState, this method returns
-  // SubscriptionStateOutOfCreditsDetector.
-  static std::unique_ptr<OutOfCreditsDetector> CreateDetector(
-      OOCType detector_type, CellularService* service);
-
-  // Resets the detector state.
-  virtual void ResetDetector() = 0;
-  // Returns |true| if this object is busy detecting out-of-credits.
-  virtual bool IsDetecting() const = 0;
-  // Notifies this object of a service state change.
-  virtual void NotifyServiceStateChanged(Service::ConnectState old_state,
-                                         Service::ConnectState new_state) = 0;
-  // Notifies this object when the subscription state has changed.
-  virtual void NotifySubscriptionStateChanged(
-      SubscriptionState subscription_state) = 0;
-
-  virtual bool out_of_credits() const { return out_of_credits_; }
-
- protected:
-  // Sets the out-of-credits state for this object and also tells the service
-  // object to signal the property change.
-  void ReportOutOfCredits(bool state);
-
-  // Property accessors reserved for subclasses.
-  CellularService* service() const { return service_; }
-
- private:
-  CellularService* service_;
-  // Flag indicating if the account is out-of-credits.
-  bool out_of_credits_;
-
-  DISALLOW_COPY_AND_ASSIGN(OutOfCreditsDetector);
-};
-
-}  // namespace shill
-
-#endif  // SHILL_CELLULAR_OUT_OF_CREDITS_DETECTOR_H_
diff --git a/cellular/subscription_state_out_of_credits_detector.cc b/cellular/subscription_state_out_of_credits_detector.cc
deleted file mode 100644
index 2d08f66..0000000
--- a/cellular/subscription_state_out_of_credits_detector.cc
+++ /dev/null
@@ -1,56 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "shill/cellular/subscription_state_out_of_credits_detector.h"
-
-#include <string>
-
-#include "ModemManager/ModemManager.h"
-
-#include "shill/cellular/cellular_service.h"
-#include "shill/logging.h"
-
-using std::string;
-
-namespace shill {
-
-namespace Logging {
-static auto kModuleLogScope = ScopeLogger::kCellular;
-static string ObjectID(CellularService* c) { return c->GetRpcIdentifier(); }
-}
-
-SubscriptionStateOutOfCreditsDetector::SubscriptionStateOutOfCreditsDetector(
-    CellularService* service)
-    : OutOfCreditsDetector(service) {
-}
-
-SubscriptionStateOutOfCreditsDetector::
-    ~SubscriptionStateOutOfCreditsDetector() {
-}
-
-void SubscriptionStateOutOfCreditsDetector::NotifySubscriptionStateChanged(
-    SubscriptionState subscription_state) {
-  bool ooc = (subscription_state == SubscriptionState::kOutOfCredits);
-  if (ooc != out_of_credits()) {
-    if (ooc)
-      SLOG(service(), 2) << "Marking service out-of-credits";
-    else
-      SLOG(service(), 2) << "Marking service as not out-of-credits";
-  }
-  ReportOutOfCredits(ooc);
-}
-
-}  // namespace shill
diff --git a/cellular/subscription_state_out_of_credits_detector.h b/cellular/subscription_state_out_of_credits_detector.h
deleted file mode 100644
index 365de71..0000000
--- a/cellular/subscription_state_out_of_credits_detector.h
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#ifndef SHILL_CELLULAR_SUBSCRIPTION_STATE_OUT_OF_CREDITS_DETECTOR_H_
-#define SHILL_CELLULAR_SUBSCRIPTION_STATE_OUT_OF_CREDITS_DETECTOR_H_
-
-#include "shill/cellular/out_of_credits_detector.h"
-
-namespace shill {
-
-// Detects out-of-credits condition by using the subscription state.
-class SubscriptionStateOutOfCreditsDetector : public OutOfCreditsDetector {
- public:
-  explicit SubscriptionStateOutOfCreditsDetector(CellularService* service);
-  ~SubscriptionStateOutOfCreditsDetector() override;
-
-  void ResetDetector() override {}
-  bool IsDetecting() const override { return false; }
-  void NotifyServiceStateChanged(
-      Service::ConnectState old_state,
-      Service::ConnectState new_state) override {}
-  void NotifySubscriptionStateChanged(
-      SubscriptionState subscription_state) override;
-
- private:
-  friend class SubscriptionStateOutOfCreditsDetectorTest;
-
-  DISALLOW_COPY_AND_ASSIGN(SubscriptionStateOutOfCreditsDetector);
-};
-
-}  // namespace shill
-
-#endif  // SHILL_CELLULAR_SUBSCRIPTION_STATE_OUT_OF_CREDITS_DETECTOR_H_
diff --git a/cellular/subscription_state_out_of_credits_detector_unittest.cc b/cellular/subscription_state_out_of_credits_detector_unittest.cc
deleted file mode 100644
index 31e558c..0000000
--- a/cellular/subscription_state_out_of_credits_detector_unittest.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-//
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "shill/cellular/subscription_state_out_of_credits_detector.h"
-
-#include <memory>
-
-#include <gtest/gtest.h>
-#include "ModemManager/ModemManager.h"
-
-#include "shill/cellular/mock_cellular.h"
-#include "shill/cellular/mock_cellular_service.h"
-#include "shill/cellular/mock_modem_info.h"
-#include "shill/mock_connection.h"
-#include "shill/mock_connection_health_checker.h"
-#include "shill/mock_device_info.h"
-#include "shill/mock_manager.h"
-#include "shill/mock_traffic_monitor.h"
-#include "shill/test_event_dispatcher.h"
-
-using testing::Mock;
-using testing::NiceMock;
-
-namespace shill {
-
-class SubscriptionStateOutOfCreditsDetectorTest : public testing::Test {
- public:
-  SubscriptionStateOutOfCreditsDetectorTest()
-      : modem_info_(nullptr, &dispatcher_, &metrics_, &manager_),
-        device_info_(modem_info_.control_interface(), modem_info_.dispatcher(),
-                     modem_info_.metrics(), modem_info_.manager()),
-        manager_(modem_info_.control_interface(), modem_info_.dispatcher(),
-                 modem_info_.metrics()),
-        metrics_(modem_info_.dispatcher()),
-        cellular_(new NiceMock<MockCellular>(&modem_info_,
-                                             "usb0",
-                                             kAddress,
-                                             3,
-                                             Cellular::kTypeCdma,
-                                             "",
-                                             "")),
-        service_(new NiceMock<MockCellularService>(&modem_info_, cellular_)),
-        connection_(new NiceMock<MockConnection>(&device_info_)),
-        out_of_credits_detector_(
-            new SubscriptionStateOutOfCreditsDetector(service_.get())) {}
-
-  void SetUp() override {
-    service_->connection_ = connection_;
-    cellular_->service_ = service_;
-    service_->SetRoamingState(kRoamingStateHome);
-  }
-
-  void TearDown() override {
-    cellular_->service_ = nullptr;  // Break circular reference.
-  }
-
- protected:
-  static const char kAddress[];
-
-  EventDispatcherForTest dispatcher_;
-  MockModemInfo modem_info_;
-  NiceMock<MockDeviceInfo> device_info_;
-  NiceMock<MockManager> manager_;
-  NiceMock<MockMetrics> metrics_;
-  scoped_refptr<NiceMock<MockCellular>> cellular_;
-  scoped_refptr<NiceMock<MockCellularService>> service_;
-  scoped_refptr<NiceMock<MockConnection>> connection_;
-  std::unique_ptr<SubscriptionStateOutOfCreditsDetector>
-      out_of_credits_detector_;
-};
-
-const char
-    SubscriptionStateOutOfCreditsDetectorTest::kAddress[] = "000102030405";
-
-TEST_F(SubscriptionStateOutOfCreditsDetectorTest, OutOfCreditsDetection) {
-  out_of_credits_detector_->NotifySubscriptionStateChanged(
-      SubscriptionState::kOutOfCredits);
-  EXPECT_TRUE(out_of_credits_detector_->out_of_credits());
-  out_of_credits_detector_->NotifySubscriptionStateChanged(
-      SubscriptionState::kProvisioned);
-  EXPECT_FALSE(out_of_credits_detector_->out_of_credits());
-}
-
-}  // namespace shill
diff --git a/shill.gyp b/shill.gyp
index 3c8e152..b96ad7a 100644
--- a/shill.gyp
+++ b/shill.gyp
@@ -276,9 +276,7 @@
             'cellular/modem_info.cc',
             'cellular/modem_manager.cc',
             'cellular/modem_manager_1.cc',
-            'cellular/out_of_credits_detector.cc',
             'cellular/subscription_state.cc',
-            'cellular/subscription_state_out_of_credits_detector.cc',
             'dbus/chromeos_dbus_objectmanager_proxy.cc',
             'dbus/chromeos_dbus_properties_proxy.cc',
             'dbus/chromeos_mm1_modem_location_proxy.cc',
@@ -895,12 +893,10 @@
                 'cellular/mock_modem_manager_proxy.cc',
                 'cellular/mock_modem_proxy.cc',
                 'cellular/mock_modem_simple_proxy.cc',
-                'cellular/mock_out_of_credits_detector.cc',
                 'cellular/modem_1_unittest.cc',
                 'cellular/modem_info_unittest.cc',
                 'cellular/modem_manager_unittest.cc',
                 'cellular/modem_unittest.cc',
-                'cellular/subscription_state_out_of_credits_detector_unittest.cc',
                 'mock_dbus_properties_proxy.cc',
               ],
             }],
