diff --git a/base/power_monitor/power_monitor.cc b/base/power_monitor/power_monitor.cc
deleted file mode 100644
index 30e06a2..0000000
--- a/base/power_monitor/power_monitor.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/power_monitor/power_monitor.h"
-
-#include <utility>
-
-#include "base/power_monitor/power_monitor_source.h"
-
-namespace base {
-
-static PowerMonitor* g_power_monitor = nullptr;
-
-PowerMonitor::PowerMonitor(std::unique_ptr<PowerMonitorSource> source)
-    : observers_(new ObserverListThreadSafe<PowerObserver>()),
-      source_(std::move(source)) {
-  DCHECK(!g_power_monitor);
-  g_power_monitor = this;
-}
-
-PowerMonitor::~PowerMonitor() {
-  DCHECK_EQ(this, g_power_monitor);
-  g_power_monitor = nullptr;
-}
-
-// static
-PowerMonitor* PowerMonitor::Get() {
-  return g_power_monitor;
-}
-
-void PowerMonitor::AddObserver(PowerObserver* obs) {
-  observers_->AddObserver(obs);
-}
-
-void PowerMonitor::RemoveObserver(PowerObserver* obs) {
-  observers_->RemoveObserver(obs);
-}
-
-PowerMonitorSource* PowerMonitor::Source() {
-  return source_.get();
-}
-
-bool PowerMonitor::IsOnBatteryPower() {
-  return source_->IsOnBatteryPower();
-}
-
-void PowerMonitor::NotifyPowerStateChange(bool battery_in_use) {
-  DVLOG(1) << "PowerStateChange: " << (battery_in_use ? "On" : "Off")
-           << " battery";
-  observers_->Notify(FROM_HERE, &PowerObserver::OnPowerStateChange,
-                     battery_in_use);
-}
-
-void PowerMonitor::NotifySuspend() {
-  DVLOG(1) << "Power Suspending";
-  observers_->Notify(FROM_HERE, &PowerObserver::OnSuspend);
-}
-
-void PowerMonitor::NotifyResume() {
-  DVLOG(1) << "Power Resuming";
-  observers_->Notify(FROM_HERE, &PowerObserver::OnResume);
-}
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor.h b/base/power_monitor/power_monitor.h
deleted file mode 100644
index e025b32..0000000
--- a/base/power_monitor/power_monitor.h
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_POWER_MONITOR_POWER_MONITOR_H_
-#define BASE_POWER_MONITOR_POWER_MONITOR_H_
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/observer_list_threadsafe.h"
-#include "base/power_monitor/power_observer.h"
-
-namespace base {
-
-class PowerMonitorSource;
-
-// A class used to monitor the power state change and notify the observers about
-// the change event.
-class BASE_EXPORT PowerMonitor {
- public:
-  // Takes ownership of |source|.
-  explicit PowerMonitor(std::unique_ptr<PowerMonitorSource> source);
-  ~PowerMonitor();
-
-  // Get the process-wide PowerMonitor (if not present, returns NULL).
-  static PowerMonitor* Get();
-
-  // Add and remove an observer.
-  // Can be called from any thread.
-  // Must not be called from within a notification callback.
-  void AddObserver(PowerObserver* observer);
-  void RemoveObserver(PowerObserver* observer);
-
-  // Is the computer currently on battery power.
-  bool IsOnBatteryPower();
-
- private:
-  friend class PowerMonitorSource;
-
-  PowerMonitorSource* Source();
-
-  void NotifyPowerStateChange(bool battery_in_use);
-  void NotifySuspend();
-  void NotifyResume();
-
-  scoped_refptr<ObserverListThreadSafe<PowerObserver> > observers_;
-  std::unique_ptr<PowerMonitorSource> source_;
-
-  DISALLOW_COPY_AND_ASSIGN(PowerMonitor);
-};
-
-}  // namespace base
-
-#endif  // BASE_POWER_MONITOR_POWER_MONITOR_H_
diff --git a/base/power_monitor/power_monitor_device_source.cc b/base/power_monitor/power_monitor_device_source.cc
deleted file mode 100644
index 5df5800..0000000
--- a/base/power_monitor/power_monitor_device_source.cc
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/power_monitor/power_monitor_device_source.h"
-
-namespace base {
-
-PowerMonitorDeviceSource::PowerMonitorDeviceSource() {
-#if defined(OS_MACOSX)
-  PlatformInit();
-#endif
-
-#if defined(OS_WIN) || defined(OS_MACOSX)
-  // Provide the correct battery status if possible. Others platforms, such as
-  // Android and ChromeOS, will update their status once their backends are
-  // actually initialized.
-  SetInitialOnBatteryPowerState(IsOnBatteryPowerImpl());
-#endif
-}
-
-PowerMonitorDeviceSource::~PowerMonitorDeviceSource() {
-#if defined(OS_MACOSX)
-  PlatformDestroy();
-#endif
-}
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor_device_source.h b/base/power_monitor/power_monitor_device_source.h
deleted file mode 100644
index 2996609..0000000
--- a/base/power_monitor/power_monitor_device_source.h
+++ /dev/null
@@ -1,98 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_H_
-#define BASE_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_H_
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/power_monitor/power_monitor_source.h"
-#include "base/power_monitor/power_observer.h"
-#include "build_config.h"
-
-#if defined(OS_WIN)
-#include <windows.h>
-#endif  // !OS_WIN
-
-#if defined(OS_IOS)
-#include <objc/runtime.h>
-#endif  // OS_IOS
-
-namespace base {
-
-// A class used to monitor the power state change and notify the observers about
-// the change event.
-class BASE_EXPORT PowerMonitorDeviceSource : public PowerMonitorSource {
- public:
-  PowerMonitorDeviceSource();
-  ~PowerMonitorDeviceSource() override;
-
-#if defined(OS_MACOSX)
-  // Allocate system resources needed by the PowerMonitor class.
-  //
-  // This function must be called before instantiating an instance of the class
-  // and before the Sandbox is initialized.
-#if !defined(OS_IOS)
-  static void AllocateSystemIOPorts();
-#else
-  static void AllocateSystemIOPorts() {}
-#endif  // OS_IOS
-#endif  // OS_MACOSX
-
-#if defined(OS_CHROMEOS)
-  // On Chrome OS, Chrome receives power-related events from powerd, the system
-  // power daemon, via D-Bus signals received on the UI thread. base can't
-  // directly depend on that code, so this class instead exposes static methods
-  // so that events can be passed in.
-  static void SetPowerSource(bool on_battery);
-  static void HandleSystemSuspending();
-  static void HandleSystemResumed();
-#endif
-
- private:
-#if defined(OS_WIN)
-  // Represents a message-only window for power message handling on Windows.
-  // Only allow PowerMonitor to create it.
-  class PowerMessageWindow {
-   public:
-    PowerMessageWindow();
-    ~PowerMessageWindow();
-
-   private:
-    static LRESULT CALLBACK WndProcThunk(HWND hwnd,
-                                         UINT message,
-                                         WPARAM wparam,
-                                         LPARAM lparam);
-    // Instance of the module containing the window procedure.
-    HMODULE instance_;
-    // A hidden message-only window.
-    HWND message_hwnd_;
-  };
-#endif  // OS_WIN
-
-#if defined(OS_MACOSX)
-  void PlatformInit();
-  void PlatformDestroy();
-#endif
-
-  // Platform-specific method to check whether the system is currently
-  // running on battery power.  Returns true if running on batteries,
-  // false otherwise.
-  bool IsOnBatteryPowerImpl() override;
-
-#if defined(OS_IOS)
-  // Holds pointers to system event notification observers.
-  std::vector<id> notification_observers_;
-#endif
-
-#if defined(OS_WIN)
-  PowerMessageWindow power_message_window_;
-#endif
-
-  DISALLOW_COPY_AND_ASSIGN(PowerMonitorDeviceSource);
-};
-
-}  // namespace base
-
-#endif  // BASE_POWER_MONITOR_POWER_MONITOR_DEVICE_SOURCE_H_
diff --git a/base/power_monitor/power_monitor_device_source_chromeos.cc b/base/power_monitor/power_monitor_device_source_chromeos.cc
deleted file mode 100644
index c3466ee..0000000
--- a/base/power_monitor/power_monitor_device_source_chromeos.cc
+++ /dev/null
@@ -1,40 +0,0 @@
-// Copyright 2014 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_device_source.h"
-#include "base/power_monitor/power_monitor_source.h"
-
-namespace base {
-
-namespace {
-
-// The most-recently-seen power source.
-bool g_on_battery = false;
-
-}  // namespace
-
-// static
-void PowerMonitorDeviceSource::SetPowerSource(bool on_battery) {
-  if (on_battery != g_on_battery) {
-    g_on_battery = on_battery;
-    ProcessPowerEvent(POWER_STATE_EVENT);
-  }
-}
-
-// static
-void PowerMonitorDeviceSource::HandleSystemSuspending() {
-  ProcessPowerEvent(SUSPEND_EVENT);
-}
-
-// static
-void PowerMonitorDeviceSource::HandleSystemResumed() {
-  ProcessPowerEvent(RESUME_EVENT);
-}
-
-bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() {
-  return g_on_battery;
-}
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor_device_source_mac.mm b/base/power_monitor/power_monitor_device_source_mac.mm
deleted file mode 100644
index be2b8b9..0000000
--- a/base/power_monitor/power_monitor_device_source_mac.mm
+++ /dev/null
@@ -1,155 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Implementation based on sample code from
-// http://developer.apple.com/library/mac/#qa/qa1340/_index.html.
-
-#include "base/power_monitor/power_monitor_device_source.h"
-
-#include "base/mac/foundation_util.h"
-#include "base/mac/scoped_cftyperef.h"
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_source.h"
-
-#include <IOKit/IOMessage.h>
-#include <IOKit/ps/IOPSKeys.h>
-#include <IOKit/ps/IOPowerSources.h>
-#include <IOKit/pwr_mgt/IOPMLib.h>
-
-namespace base {
-
-void ProcessPowerEventHelper(PowerMonitorSource::PowerEvent event) {
-  PowerMonitorSource::ProcessPowerEvent(event);
-}
-
-bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() {
-  base::ScopedCFTypeRef<CFTypeRef> info(IOPSCopyPowerSourcesInfo());
-  base::ScopedCFTypeRef<CFArrayRef> power_sources_list(
-      IOPSCopyPowerSourcesList(info));
-
-  const CFIndex count = CFArrayGetCount(power_sources_list);
-  for (CFIndex i = 0; i < count; ++i) {
-    const CFDictionaryRef description = IOPSGetPowerSourceDescription(
-        info, CFArrayGetValueAtIndex(power_sources_list, i));
-    if (!description)
-      continue;
-
-    CFStringRef current_state = base::mac::GetValueFromDictionary<CFStringRef>(
-        description, CFSTR(kIOPSPowerSourceStateKey));
-
-    if (!current_state)
-      continue;
-
-    // We only report "on battery power" if no source is on AC power.
-    if (CFStringCompare(current_state, CFSTR(kIOPSBatteryPowerValue), 0) !=
-        kCFCompareEqualTo) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-namespace {
-
-io_connect_t g_system_power_io_port = 0;
-IONotificationPortRef g_notification_port_ref = 0;
-io_object_t g_notifier_object = 0;
-CFRunLoopSourceRef g_battery_status_ref = 0;
-
-void BatteryEventCallback(void*) {
-  ProcessPowerEventHelper(PowerMonitorSource::POWER_STATE_EVENT);
-}
-
-void SystemPowerEventCallback(void*,
-                              io_service_t service,
-                              natural_t message_type,
-                              void* message_argument) {
-  switch (message_type) {
-    // If this message is not handled the system may delay sleep for 30 seconds.
-    case kIOMessageCanSystemSleep:
-      IOAllowPowerChange(g_system_power_io_port,
-          reinterpret_cast<intptr_t>(message_argument));
-      break;
-    case kIOMessageSystemWillSleep:
-      ProcessPowerEventHelper(base::PowerMonitorSource::SUSPEND_EVENT);
-      IOAllowPowerChange(g_system_power_io_port,
-          reinterpret_cast<intptr_t>(message_argument));
-      break;
-
-    case kIOMessageSystemWillPowerOn:
-      ProcessPowerEventHelper(PowerMonitorSource::RESUME_EVENT);
-      break;
-  }
-}
-
-}  // namespace
-
-// The reason we can't include this code in the constructor is because
-// PlatformInit() requires an active runloop and the IO port needs to be
-// allocated at sandbox initialization time, before there's a runloop.
-// See crbug.com/83783 .
-
-// static
-void PowerMonitorDeviceSource::AllocateSystemIOPorts() {
-  DCHECK_EQ(g_system_power_io_port, 0u);
-
-  // Notification port allocated by IORegisterForSystemPower.
-  g_system_power_io_port = IORegisterForSystemPower(
-      NULL, &g_notification_port_ref, SystemPowerEventCallback,
-      &g_notifier_object);
-
-  DCHECK_NE(g_system_power_io_port, 0u);
-}
-
-void PowerMonitorDeviceSource::PlatformInit() {
-  // Need to call AllocateSystemIOPorts() before creating a PowerMonitor
-  // object.
-  DCHECK_NE(g_system_power_io_port, 0u);
-  if (g_system_power_io_port == 0)
-    return;
-
-  // Add the notification port and battery monitor to the application runloop
-  CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(
-                                                g_notification_port_ref),
-                     kCFRunLoopCommonModes);
-
-  base::ScopedCFTypeRef<CFRunLoopSourceRef> battery_status_ref(
-      IOPSNotificationCreateRunLoopSource(BatteryEventCallback, nullptr));
-  CFRunLoopAddSource(CFRunLoopGetCurrent(), battery_status_ref,
-                     kCFRunLoopDefaultMode);
-  g_battery_status_ref = battery_status_ref.release();
-}
-
-void PowerMonitorDeviceSource::PlatformDestroy() {
-  DCHECK_NE(g_system_power_io_port, 0u);
-  if (g_system_power_io_port == 0)
-    return;
-
-  // Remove the sleep notification port from the application runloop
-  CFRunLoopRemoveSource(
-      CFRunLoopGetCurrent(),
-      IONotificationPortGetRunLoopSource(g_notification_port_ref),
-      kCFRunLoopCommonModes);
-
-  base::ScopedCFTypeRef<CFRunLoopSourceRef> battery_status_ref(
-      g_battery_status_ref);
-  CFRunLoopRemoveSource(CFRunLoopGetCurrent(), g_battery_status_ref,
-                        kCFRunLoopDefaultMode);
-  g_battery_status_ref = 0;
-
-  // Deregister for system sleep notifications
-  IODeregisterForSystemPower(&g_notifier_object);
-
-  // IORegisterForSystemPower implicitly opens the Root Power Domain IOService,
-  // so we close it here.
-  IOServiceClose(g_system_power_io_port);
-
-  g_system_power_io_port = 0;
-
-  // Destroy the notification port allocated by IORegisterForSystemPower.
-  IONotificationPortDestroy(g_notification_port_ref);
-}
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor_device_source_stub.cc b/base/power_monitor/power_monitor_device_source_stub.cc
deleted file mode 100644
index f24e5b2..0000000
--- a/base/power_monitor/power_monitor_device_source_stub.cc
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/power_monitor/power_monitor_device_source.h"
-
-namespace base {
-
-bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() {
-  NOTIMPLEMENTED();
-  return false;
-}
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor_device_source_win.cc b/base/power_monitor/power_monitor_device_source_win.cc
deleted file mode 100644
index e74be50..0000000
--- a/base/power_monitor/power_monitor_device_source_win.cc
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/power_monitor/power_monitor_device_source.h"
-
-#include "base/message_loop/message_loop.h"
-#include "base/power_monitor/power_monitor.h"
-#include "base/power_monitor/power_monitor_source.h"
-#include "base/win/wrapped_window_proc.h"
-
-namespace base {
-
-void ProcessPowerEventHelper(PowerMonitorSource::PowerEvent event) {
-  PowerMonitorSource::ProcessPowerEvent(event);
-}
-
-namespace {
-
-const wchar_t kWindowClassName[] = L"Base_PowerMessageWindow";
-
-void ProcessWmPowerBroadcastMessage(WPARAM event_id) {
-  PowerMonitorSource::PowerEvent power_event;
-  switch (event_id) {
-    case PBT_APMPOWERSTATUSCHANGE:  // The power status changed.
-      power_event = PowerMonitorSource::POWER_STATE_EVENT;
-      break;
-    case PBT_APMRESUMEAUTOMATIC:  // Resume from suspend.
-      //case PBT_APMRESUMESUSPEND:  // User-initiated resume from suspend.
-      // We don't notify for this latter event
-      // because if it occurs it is always sent as a
-      // second event after PBT_APMRESUMEAUTOMATIC.
-      power_event = PowerMonitorSource::RESUME_EVENT;
-      break;
-    case PBT_APMSUSPEND:  // System has been suspended.
-      power_event = PowerMonitorSource::SUSPEND_EVENT;
-      break;
-    default:
-      return;
-
-      // Other Power Events:
-      // PBT_APMBATTERYLOW - removed in Vista.
-      // PBT_APMOEMEVENT - removed in Vista.
-      // PBT_APMQUERYSUSPEND - removed in Vista.
-      // PBT_APMQUERYSUSPENDFAILED - removed in Vista.
-      // PBT_APMRESUMECRITICAL - removed in Vista.
-      // PBT_POWERSETTINGCHANGE - user changed the power settings.
-  }
-
-  ProcessPowerEventHelper(power_event);
-}
-
-}  // namespace
-
-// Function to query the system to see if it is currently running on
-// battery power.  Returns true if running on battery.
-bool PowerMonitorDeviceSource::IsOnBatteryPowerImpl() {
-  SYSTEM_POWER_STATUS status;
-  if (!GetSystemPowerStatus(&status)) {
-    DPLOG(ERROR) << "GetSystemPowerStatus failed";
-    return false;
-  }
-  return (status.ACLineStatus == 0);
-}
-
-PowerMonitorDeviceSource::PowerMessageWindow::PowerMessageWindow()
-    : instance_(NULL), message_hwnd_(NULL) {
-  if (!MessageLoopForUI::IsCurrent()) {
-    // Creating this window in (e.g.) a renderer inhibits shutdown on Windows.
-    // See http://crbug.com/230122. TODO(vandebo): http://crbug.com/236031
-    DLOG(ERROR)
-        << "Cannot create windows on non-UI thread, power monitor disabled!";
-    return;
-  }
-  WNDCLASSEX window_class;
-  base::win::InitializeWindowClass(
-      kWindowClassName,
-      &base::win::WrappedWindowProc<
-          PowerMonitorDeviceSource::PowerMessageWindow::WndProcThunk>,
-      0, 0, 0, NULL, NULL, NULL, NULL, NULL,
-      &window_class);
-  instance_ = window_class.hInstance;
-  ATOM clazz = RegisterClassEx(&window_class);
-  DCHECK(clazz);
-
-  message_hwnd_ = CreateWindowEx(WS_EX_NOACTIVATE, kWindowClassName,
-      NULL, WS_POPUP, 0, 0, 0, 0, NULL, NULL, instance_, NULL);
-}
-
-PowerMonitorDeviceSource::PowerMessageWindow::~PowerMessageWindow() {
-  if (message_hwnd_) {
-    DestroyWindow(message_hwnd_);
-    UnregisterClass(kWindowClassName, instance_);
-  }
-}
-
-// static
-LRESULT CALLBACK PowerMonitorDeviceSource::PowerMessageWindow::WndProcThunk(
-    HWND hwnd,
-    UINT message,
-    WPARAM wparam,
-    LPARAM lparam) {
-  switch (message) {
-    case WM_POWERBROADCAST:
-      ProcessWmPowerBroadcastMessage(wparam);
-      return TRUE;
-    default:
-      return ::DefWindowProc(hwnd, message, wparam, lparam);
-  }
-}
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor_source.cc b/base/power_monitor/power_monitor_source.cc
deleted file mode 100644
index 8ec6e68..0000000
--- a/base/power_monitor/power_monitor_source.cc
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/power_monitor/power_monitor_source.h"
-
-#include "base/power_monitor/power_monitor.h"
-#include "build_config.h"
-
-namespace base {
-
-PowerMonitorSource::PowerMonitorSource() = default;
-PowerMonitorSource::~PowerMonitorSource() = default;
-
-bool PowerMonitorSource::IsOnBatteryPower() {
-  AutoLock auto_lock(battery_lock_);
-  return on_battery_power_;
-}
-
-void PowerMonitorSource::ProcessPowerEvent(PowerEvent event_id) {
-  PowerMonitor* monitor = PowerMonitor::Get();
-  if (!monitor)
-    return;
-
-  PowerMonitorSource* source = monitor->Source();
-
-  // Suppress duplicate notifications.  Some platforms may
-  // send multiple notifications of the same event.
-  switch (event_id) {
-    case POWER_STATE_EVENT:
-      {
-        bool new_on_battery_power = source->IsOnBatteryPowerImpl();
-        bool changed = false;
-
-        {
-          AutoLock auto_lock(source->battery_lock_);
-          if (source->on_battery_power_ != new_on_battery_power) {
-              changed = true;
-              source->on_battery_power_ = new_on_battery_power;
-          }
-        }
-
-        if (changed)
-          monitor->NotifyPowerStateChange(new_on_battery_power);
-      }
-      break;
-    case RESUME_EVENT:
-      if (source->suspended_) {
-        source->suspended_ = false;
-        monitor->NotifyResume();
-      }
-      break;
-    case SUSPEND_EVENT:
-      if (!source->suspended_) {
-        source->suspended_ = true;
-        monitor->NotifySuspend();
-      }
-      break;
-  }
-}
-
-void PowerMonitorSource::SetInitialOnBatteryPowerState(bool on_battery_power) {
-  // Must only be called before a monitor exists, otherwise the caller should
-  // have just used a normal ProcessPowerEvent(POWER_STATE_EVENT) call.
-  DCHECK(!PowerMonitor::Get());
-  on_battery_power_ = on_battery_power;
-}
-
-}  // namespace base
diff --git a/base/power_monitor/power_monitor_source.h b/base/power_monitor/power_monitor_source.h
deleted file mode 100644
index b69cbf8..0000000
--- a/base/power_monitor/power_monitor_source.h
+++ /dev/null
@@ -1,70 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_POWER_MONITOR_POWER_MONITOR_SOURCE_H_
-#define BASE_POWER_MONITOR_POWER_MONITOR_SOURCE_H_
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/observer_list_threadsafe.h"
-#include "base/synchronization/lock.h"
-
-namespace base {
-
-class PowerMonitor;
-
-// Communicates power state changes to the power monitor.
-class BASE_EXPORT PowerMonitorSource {
- public:
-  PowerMonitorSource();
-  virtual ~PowerMonitorSource();
-
-  // Normalized list of power events.
-  enum PowerEvent {
-    POWER_STATE_EVENT,  // The Power status of the system has changed.
-    SUSPEND_EVENT,      // The system is being suspended.
-    RESUME_EVENT        // The system is being resumed.
-  };
-
-  // Is the computer currently on battery power. Can be called on any thread.
-  bool IsOnBatteryPower();
-
- protected:
-  friend class PowerMonitorTest;
-
-  // Friend function that is allowed to access the protected ProcessPowerEvent.
-  friend void ProcessPowerEventHelper(PowerEvent);
-
-  // Get the process-wide PowerMonitorSource (if not present, returns NULL).
-  static PowerMonitorSource* Get();
-
-  // ProcessPowerEvent should only be called from a single thread, most likely
-  // the UI thread or, in child processes, the IO thread.
-  static void ProcessPowerEvent(PowerEvent event_id);
-
-  // Platform-specific method to check whether the system is currently
-  // running on battery power.  Returns true if running on batteries,
-  // false otherwise.
-  virtual bool IsOnBatteryPowerImpl() = 0;
-
-  // Sets the initial state for |on_battery_power_|, which defaults to false
-  // since not all implementations can provide the value at construction. May
-  // only be called before a base::PowerMonitor has been created.
-  void SetInitialOnBatteryPowerState(bool on_battery_power);
-
- private:
-  bool on_battery_power_ = false;
-  bool suspended_ = false;
-
-  // This lock guards access to on_battery_power_, to ensure that
-  // IsOnBatteryPower can be called from any thread.
-  Lock battery_lock_;
-
-  DISALLOW_COPY_AND_ASSIGN(PowerMonitorSource);
-};
-
-}  // namespace base
-
-#endif  // BASE_POWER_MONITOR_POWER_MONITOR_SOURCE_H_
diff --git a/base/power_monitor/power_observer.h b/base/power_monitor/power_observer.h
deleted file mode 100644
index 0142b2a..0000000
--- a/base/power_monitor/power_observer.h
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_POWER_MONITOR_POWER_OBSERVER_H_
-#define BASE_POWER_MONITOR_POWER_OBSERVER_H_
-
-#include "base/base_export.h"
-#include "base/compiler_specific.h"
-
-namespace base {
-
-class BASE_EXPORT PowerObserver {
- public:
-  // Notification of a change in power status of the computer, such
-  // as from switching between battery and A/C power.
-  virtual void OnPowerStateChange(bool on_battery_power) {};
-
-  // Notification that the system is suspending.
-  virtual void OnSuspend() {}
-
-  // Notification that the system is resuming.
-  virtual void OnResume() {}
-
- protected:
-  virtual ~PowerObserver() = default;
-};
-
-}  // namespace base
-
-#endif  // BASE_POWER_MONITOR_POWER_OBSERVER_H_
diff --git a/base/system_monitor/system_monitor.cc b/base/system_monitor/system_monitor.cc
deleted file mode 100644
index 71e4f07..0000000
--- a/base/system_monitor/system_monitor.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/system_monitor/system_monitor.h"
-
-#include <utility>
-
-#include "base/logging.h"
-#include "base/time/time.h"
-
-namespace base {
-
-static SystemMonitor* g_system_monitor = nullptr;
-
-SystemMonitor::SystemMonitor()
-    :  devices_changed_observer_list_(
-          new ObserverListThreadSafe<DevicesChangedObserver>()) {
-  DCHECK(!g_system_monitor);
-  g_system_monitor = this;
-}
-
-SystemMonitor::~SystemMonitor() {
-  DCHECK_EQ(this, g_system_monitor);
-  g_system_monitor = nullptr;
-}
-
-// static
-SystemMonitor* SystemMonitor::Get() {
-  return g_system_monitor;
-}
-
-void SystemMonitor::ProcessDevicesChanged(DeviceType device_type) {
-  NotifyDevicesChanged(device_type);
-}
-
-void SystemMonitor::AddDevicesChangedObserver(DevicesChangedObserver* obs) {
-  devices_changed_observer_list_->AddObserver(obs);
-}
-
-void SystemMonitor::RemoveDevicesChangedObserver(DevicesChangedObserver* obs) {
-  devices_changed_observer_list_->RemoveObserver(obs);
-}
-
-void SystemMonitor::NotifyDevicesChanged(DeviceType device_type) {
-  DVLOG(1) << "DevicesChanged with device type " << device_type;
-  devices_changed_observer_list_->Notify(
-      FROM_HERE, &DevicesChangedObserver::OnDevicesChanged, device_type);
-}
-
-}  // namespace base
diff --git a/base/system_monitor/system_monitor.h b/base/system_monitor/system_monitor.h
deleted file mode 100644
index f0828d1..0000000
--- a/base/system_monitor/system_monitor.h
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_
-#define BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_
-
-#include "base/base_export.h"
-#include "base/macros.h"
-#include "base/memory/ref_counted.h"
-#include "base/observer_list_threadsafe.h"
-#include "build_config.h"
-
-namespace base {
-
-// Class for monitoring various system-related subsystems
-// such as power management, network status, etc.
-// TODO(mbelshe):  Add support beyond just power management.
-class BASE_EXPORT SystemMonitor {
- public:
-  // Type of devices whose change need to be monitored, such as add/remove.
-  enum DeviceType {
-    DEVTYPE_AUDIO,          // Audio device, e.g., microphone.
-    DEVTYPE_VIDEO_CAPTURE,  // Video capture device, e.g., webcam.
-    DEVTYPE_UNKNOWN,        // Other devices.
-  };
-
-  // Create SystemMonitor. Only one SystemMonitor instance per application
-  // is allowed.
-  SystemMonitor();
-  ~SystemMonitor();
-
-  // Get the application-wide SystemMonitor (if not present, returns NULL).
-  static SystemMonitor* Get();
-
-  class BASE_EXPORT DevicesChangedObserver {
-   public:
-    // Notification that the devices connected to the system have changed.
-    // This is only implemented on Windows currently.
-    virtual void OnDevicesChanged(DeviceType device_type) {}
-
-   protected:
-    virtual ~DevicesChangedObserver() = default;
-  };
-
-  // Add a new observer.
-  // Can be called from any thread.
-  // Must not be called from within a notification callback.
-  void AddDevicesChangedObserver(DevicesChangedObserver* obs);
-
-  // Remove an existing observer.
-  // Can be called from any thread.
-  // Must not be called from within a notification callback.
-  void RemoveDevicesChangedObserver(DevicesChangedObserver* obs);
-
-  // The ProcessFoo() style methods are a broken pattern and should not
-  // be copied. Any significant addition to this class is blocked on
-  // refactoring to improve the state of affairs. See http://crbug.com/149059
-
-  // Cross-platform handling of a device change event.
-  void ProcessDevicesChanged(DeviceType device_type);
-
- private:
-  // Functions to trigger notifications.
-  void NotifyDevicesChanged(DeviceType device_type);
-
-  scoped_refptr<ObserverListThreadSafe<DevicesChangedObserver> >
-      devices_changed_observer_list_;
-
-  DISALLOW_COPY_AND_ASSIGN(SystemMonitor);
-};
-
-}  // namespace base
-
-#endif  // BASE_SYSTEM_MONITOR_SYSTEM_MONITOR_H_
diff --git a/build/gen.py b/build/gen.py
index 2755480..8cc7bbd 100755
--- a/build/gen.py
+++ b/build/gen.py
@@ -665,7 +665,6 @@
         'base/logging_win.cc',
         'base/message_loop/message_pump_win.cc',
         'base/native_library_win.cc',
-        'base/power_monitor/power_monitor_device_source_win.cc',
         'base/process/kill_win.cc',
         'base/process/launch_win.cc',
         'base/process/memory_win.cc',
