diff --git a/Android.mk b/Android.mk
index 95f99bb..c7b7db0 100644
--- a/Android.mk
+++ b/Android.mk
@@ -20,33 +20,23 @@
 # by setting BRILLO_USE_* values. Note that we define local variables like
 # local_use_* to prevent leaking our default setting for other packages.
 local_use_binder := $(if $(BRILLO_USE_BINDER),$(BRILLO_USE_BINDER),1)
-local_use_dbus := $(if $(BRILLO_USE_DBUS),$(BRILLO_USE_DBUS),0)
 local_use_hwid_override := \
     $(if $(BRILLO_USE_HWID_OVERRIDE),$(BRILLO_USE_HWID_OVERRIDE),0)
 # "libcros" gates the LibCrosService exposed by the Chrome OS' chrome browser to
 # the system layer.
 local_use_libcros := $(if $(BRILLO_USE_LIBCROS),$(BRILLO_USE_LIBCROS),0)
 local_use_mtd := $(if $(BRILLO_USE_MTD),$(BRILLO_USE_MTD),0)
-local_use_shill := $(if $(BRILLO_USE_SHILL),$(BRILLO_USE_SHILL),0)
 local_use_weave := $(if $(BRILLO_USE_WEAVE),$(BRILLO_USE_WEAVE),0)
 
 # IoT devices use Omaha for updates.
 local_use_omaha := $(if $(filter true,$(PRODUCT_IOT)),1,0)
 
-ifeq ($(local_use_shill),1)
-ifneq ($(local_use_dbus),1)
-$(error USE_SHILL depends on USE_DBUS.)
-endif  # local_use_dbus != 1
-endif  # local_use_shill == 1
-
 ue_common_cflags := \
     -DUSE_BINDER=$(local_use_binder) \
-    -DUSE_DBUS=$(local_use_dbus) \
     -DUSE_HWID_OVERRIDE=$(local_use_hwid_override) \
     -DUSE_LIBCROS=$(local_use_libcros) \
     -DUSE_MTD=$(local_use_mtd) \
     -DUSE_OMAHA=$(local_use_omaha) \
-    -DUSE_SHILL=$(local_use_shill) \
     -DUSE_WEAVE=$(local_use_weave) \
     -D_FILE_OFFSET_BITS=64 \
     -D_POSIX_C_SOURCE=199309L \
@@ -75,21 +65,6 @@
 ue_common_static_libraries := \
     libgtest_prod \
 
-ifeq ($(local_use_dbus),1)
-
-# update_engine_client-dbus-proxies (from generate-dbus-proxies.gypi)
-# ========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := update_engine_client-dbus-proxies
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_SRC_FILES := \
-    dbus_bindings/dbus-service-config.json \
-    dbus_bindings/org.chromium.UpdateEngineInterface.dbus-xml
-LOCAL_DBUS_PROXY_PREFIX := update_engine
-include $(BUILD_STATIC_LIBRARY)
-
-endif  # local_use_dbus == 1
-
 # update_metadata-protos (type: static_library)
 # ========================================================
 # Protobufs.
@@ -120,30 +95,6 @@
 LOCAL_SRC_FILES := $(ue_update_metadata_protos_src_files)
 include $(BUILD_STATIC_LIBRARY)
 
-ifeq ($(local_use_dbus),1)
-
-# update_engine-dbus-adaptor (from generate-dbus-adaptors.gypi)
-# ========================================================
-# Chrome D-Bus bindings.
-include $(CLEAR_VARS)
-LOCAL_MODULE := update_engine-dbus-adaptor
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_SRC_FILES := \
-    dbus_bindings/org.chromium.UpdateEngineInterface.dbus-xml
-include $(BUILD_STATIC_LIBRARY)
-
-# update_engine-dbus-libcros-client (from generate-dbus-proxies.gypi)
-# ========================================================
-include $(CLEAR_VARS)
-LOCAL_MODULE := update_engine-dbus-libcros-client
-LOCAL_MODULE_CLASS := STATIC_LIBRARIES
-LOCAL_SRC_FILES := \
-    dbus_bindings/org.chromium.LibCrosService.dbus-xml
-LOCAL_DBUS_PROXY_PREFIX := libcros
-include $(BUILD_STATIC_LIBRARY)
-
-endif  # local_use_dbus == 1
-
 # libpayload_consumer (type: static_library)
 # ========================================================
 # The payload application component and common dependencies.
@@ -280,7 +231,6 @@
 # The main daemon static_library with all the code used to check for updates
 # with Omaha and expose a DBus daemon.
 ue_libupdate_engine_exported_c_includes := \
-    $(LOCAL_PATH)/include \
     external/cros/system_api/dbus
 ue_libupdate_engine_exported_static_libraries := \
     libpayload_consumer \
@@ -303,20 +253,6 @@
     $(ue_libpayload_consumer_exported_shared_libraries) \
     $(ue_update_metadata_protos_exported_shared_libraries) \
     $(ue_libupdate_engine_boot_control_exported_shared_libraries)
-ifeq ($(local_use_dbus),1)
-ue_libupdate_engine_exported_static_libraries += \
-    update_engine-dbus-adaptor \
-    update_engine-dbus-libcros-client \
-    update_engine_client-dbus-proxies
-ue_libupdate_engine_exported_shared_libraries += \
-    libdbus \
-    libbrillo-dbus \
-    libchrome-dbus
-endif  # local_use_dbus == 1
-ifeq ($(local_use_shill),1)
-ue_libupdate_engine_exported_shared_libraries += \
-    libshill-client
-endif  # local_use_shill == 1
 ifeq ($(local_use_binder),1)
 ue_libupdate_engine_exported_shared_libraries += \
     libbinder \
@@ -359,6 +295,7 @@
 LOCAL_SRC_FILES := \
     certificate_checker.cc \
     common_service.cc \
+    connection_manager_android.cc \
     connection_utils.cc \
     daemon.cc \
     hardware_android.cc \
@@ -392,21 +329,6 @@
     update_status_utils.cc \
     utils_android.cc \
     weave_service_factory.cc
-ifeq ($(local_use_dbus),1)
-LOCAL_SRC_FILES += \
-    dbus_connection.cc \
-    dbus_service.cc \
-    libcros_proxy.cc
-endif  # local_use_dbus == 1
-ifeq ($(local_use_shill),1)
-LOCAL_SRC_FILES += \
-    connection_manager.cc \
-    shill_proxy.cc \
-    update_manager/real_shill_provider.cc
-else   # local_use_shill != 1
-LOCAL_SRC_FILES += \
-    connection_manager_android.cc
-endif  # local_use_shill == 1
 ifeq ($(local_use_binder),1)
 LOCAL_AIDL_INCLUDES += $(LOCAL_PATH)/binder_bindings
 LOCAL_SRC_FILES += \
@@ -625,7 +547,6 @@
     -Wall \
     -Werror \
     -Wno-unused-parameter \
-    -DUSE_DBUS=$(local_use_dbus) \
     -DUSE_BINDER=$(local_use_binder)
 LOCAL_CLANG := true
 LOCAL_CPP_EXTENSION := .cc
@@ -642,8 +563,7 @@
     client_library/client.cc \
     update_status_utils.cc
 
-# We can only compile support for one IPC mechanism. If both "binder" and "dbus"
-# are defined, we prefer binder.
+# We only support binder IPC mechanism in Android.
 ifeq ($(local_use_binder),1)
 LOCAL_AIDL_INCLUDES := $(LOCAL_PATH)/binder_bindings
 LOCAL_SHARED_LIBRARIES += \
@@ -655,14 +575,6 @@
     binder_bindings/android/brillo/IUpdateEngineStatusCallback.aidl \
     client_library/client_binder.cc \
     parcelable_update_engine_status.cc
-else  # local_use_binder != 1
-LOCAL_STATIC_LIBRARIES := \
-    update_engine_client-dbus-proxies
-LOCAL_SHARED_LIBRARIES += \
-    libchrome-dbus \
-    libbrillo-dbus
-LOCAL_SRC_FILES += \
-    client_library/client_dbus.cc
 endif  # local_use_binder == 1
 
 include $(BUILD_SHARED_LIBRARY)
@@ -1119,12 +1031,6 @@
 LOCAL_SHARED_LIBRARIES += \
     $(ue_libupdate_engine_android_exported_shared_libraries:-host=)
 endif  # local_use_omaha == 1
-ifeq ($(local_use_shill),1)
-LOCAL_SRC_FILES += \
-    connection_manager_unittest.cc \
-    fake_shill_proxy.cc \
-    update_manager/real_shill_provider_unittest.cc
-endif  # local_use_shill == 1
 ifeq ($(local_use_libcros),1)
 LOCAL_SRC_FILES += \
     chrome_browser_proxy_resolver_unittest.cc
diff --git a/include/debugd/dbus-proxies.h b/include/debugd/dbus-proxies.h
deleted file mode 100644
index a528480..0000000
--- a/include/debugd/dbus-proxies.h
+++ /dev/null
@@ -1,2334 +0,0 @@
-// Automatic generation of D-Bus interfaces:
-//  - org.chromium.debugd
-#ifndef ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_DEBUGD_CLIENT_OUT_DEFAULT_GEN_INCLUDE_DEBUGD_DBUS_PROXIES_H
-#define ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_DEBUGD_CLIENT_OUT_DEFAULT_GEN_INCLUDE_DEBUGD_DBUS_PROXIES_H
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <base/bind.h>
-#include <base/callback.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <base/memory/ref_counted.h>
-#include <brillo/any.h>
-#include <brillo/dbus/dbus_method_invoker.h>
-#include <brillo/dbus/dbus_property.h>
-#include <brillo/dbus/dbus_signal_handler.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <dbus/bus.h>
-#include <dbus/message.h>
-#include <dbus/object_manager.h>
-#include <dbus/object_path.h>
-#include <dbus/object_proxy.h>
-
-namespace org {
-namespace chromium {
-
-// Abstract interface proxy for org::chromium::debugd.
-class debugdProxyInterface {
- public:
-  virtual ~debugdProxyInterface() = default;
-
-  // Starts pinging the specified hostname with the specified options, with
-  // output directed to the given output file descriptor. The returned opaque
-  // string functions as a handle for this particular ping. Multiple pings
-  // can be running at once.
-  virtual bool PingStart(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      std::string* out_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Starts pinging the specified hostname with the specified options, with
-  // output directed to the given output file descriptor. The returned opaque
-  // string functions as a handle for this particular ping. Multiple pings
-  // can be running at once.
-  virtual void PingStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::string& /*handle*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops a running ping.
-  virtual bool PingStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops a running ping.
-  virtual void PingStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Start system/kernel tracing.  If tracing is already enabled it is
-  // stopped first and any collected events are discarded.  The kernel
-  // must have been configured to support tracing.
-  virtual bool SystraceStart(
-      const std::string& in_categories,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Start system/kernel tracing.  If tracing is already enabled it is
-  // stopped first and any collected events are discarded.  The kernel
-  // must have been configured to support tracing.
-  virtual void SystraceStartAsync(
-      const std::string& in_categories,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stop system/kernel tracing and write the collected event data.
-  virtual bool SystraceStop(
-      const dbus::FileDescriptor& in_outfd,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stop system/kernel tracing and write the collected event data.
-  virtual void SystraceStopAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Return current status for system/kernel tracing including whether it
-  // is enabled, the tracing clock, and the set of events enabled.
-  virtual bool SystraceStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Return current status for system/kernel tracing including whether it
-  // is enabled, the tracing clock, and the set of events enabled.
-  virtual void SystraceStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool TracePathStart(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      std::string* out_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void TracePathStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::string& /*handle*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops a running tracepath.
-  virtual bool TracePathStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops a running tracepath.
-  virtual void TracePathStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns the routing table.
-  virtual bool GetRoutes(
-      const brillo::VariantDictionary& in_options,
-      std::vector<std::string>* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns the routing table.
-  virtual void GetRoutesAsync(
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::vector<std::string>& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns modem information as a JSON string. See the design document for
-  // a rationale.
-  virtual bool GetModemStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns modem information as a JSON string. See the design document for
-  // a rationale.
-  virtual void GetModemStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs the specified command through the modem serial interface and
-  // returns the output.
-  virtual bool RunModemCommand(
-      const std::string& in_command,
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs the specified command through the modem serial interface and
-  // returns the output.
-  virtual void RunModemCommandAsync(
-      const std::string& in_command,
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns network information as a JSON string. See the design document
-  // for a rationale.
-  virtual bool GetNetworkStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns network information as a JSON string. See the design document
-  // for a rationale.
-  virtual void GetNetworkStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns WiMAX information as a JSON string. See the design document for
-  // a rationale.
-  virtual bool GetWiMaxStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns WiMAX information as a JSON string. See the design document for
-  // a rationale.
-  virtual void GetWiMaxStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs system-wide perf profiling. The profile parameters are selected by
-  // perf_args.
-  virtual bool GetPerfOutput(
-      uint32_t in_duration_sec,
-      const std::vector<std::string>& in_perf_args,
-      int32_t* out_status,
-      std::vector<uint8_t>* out_perf_data,
-      std::vector<uint8_t>* out_perf_stat,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs system-wide perf profiling. The profile parameters are selected by
-  // perf_args.
-  virtual void GetPerfOutputAsync(
-      uint32_t in_duration_sec,
-      const std::vector<std::string>& in_perf_args,
-      const base::Callback<void(int32_t /*status*/, const std::vector<uint8_t>& /*perf_data*/, const std::vector<uint8_t>& /*perf_stat*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs system-wide perf profiling. It can can profile events other than
-  // cycles (example: iTLB-misses), and can collect branch profiles. It can
-  // also return raw counter values. The exact profile or counters to be
-  // collected is chosen at random and depends on what CPU is used by the
-  // system (certain CPUs do not support certain profiling modes).
-  virtual bool GetRandomPerfOutput(
-      uint32_t in_duration_sec,
-      int32_t* out_status,
-      std::vector<uint8_t>* out_perf_data,
-      std::vector<uint8_t>* out_perf_stat,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs system-wide perf profiling. It can can profile events other than
-  // cycles (example: iTLB-misses), and can collect branch profiles. It can
-  // also return raw counter values. The exact profile or counters to be
-  // collected is chosen at random and depends on what CPU is used by the
-  // system (certain CPUs do not support certain profiling modes).
-  virtual void GetRandomPerfOutputAsync(
-      uint32_t in_duration_sec,
-      const base::Callback<void(int32_t /*status*/, const std::vector<uint8_t>& /*perf_data*/, const std::vector<uint8_t>& /*perf_stat*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns perf event data. Does systemwide profiling. It can profile
-  // events other than cycles (example: iTLB-misses), and can collect branch
-  // profiles. The exact profile to be collected is chosen at random
-  // and depends on what CPU is used by the system (certain CPUs do not
-  // support certain profiling modes).
-  virtual bool GetRichPerfData(
-      uint32_t in_duration_sec,
-      std::vector<uint8_t>* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns perf event data. Does systemwide profiling. It can profile
-  // events other than cycles (example: iTLB-misses), and can collect branch
-  // profiles. The exact profile to be collected is chosen at random
-  // and depends on what CPU is used by the system (certain CPUs do not
-  // support certain profiling modes).
-  virtual void GetRichPerfDataAsync(
-      uint32_t in_duration_sec,
-      const base::Callback<void(const std::vector<uint8_t>& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // DEPRECATED: Use DumpDebugLogs instead.
-  // Packages up system logs into a .tar.gz and returns it over the supplied
-  // file descriptor.
-  virtual bool GetDebugLogs(
-      const dbus::FileDescriptor& in_outfd,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // DEPRECATED: Use DumpDebugLogs instead.
-  // Packages up system logs into a .tar.gz and returns it over the supplied
-  // file descriptor.
-  virtual void GetDebugLogsAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Packages up system logs into a .tar(.gz) and returns it over the
-  // supplied file descriptor.
-  virtual bool DumpDebugLogs(
-      bool in_is_compressed,
-      const dbus::FileDescriptor& in_outfd,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Packages up system logs into a .tar(.gz) and returns it over the
-  // supplied file descriptor.
-  virtual void DumpDebugLogsAsync(
-      bool in_is_compressed,
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Enables or disables debug mode for a specified subsystem.
-  virtual bool SetDebugMode(
-      const std::string& in_subsystem,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Enables or disables debug mode for a specified subsystem.
-  virtual void SetDebugModeAsync(
-      const std::string& in_subsystem,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Fetches the contents of a single system log, identified by name. See
-  // /src/log_tool.cc for a list of valid names.
-  virtual bool GetLog(
-      const std::string& in_log,
-      std::string* out_contents,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Fetches the contents of a single system log, identified by name. See
-  // /src/log_tool.cc for a list of valid names.
-  virtual void GetLogAsync(
-      const std::string& in_log,
-      const base::Callback<void(const std::string& /*contents*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns all the system logs.
-  virtual bool GetAllLogs(
-      std::map<std::string, std::string>* out_logs,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns all the system logs.
-  virtual void GetAllLogsAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*logs*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns system logs for feedback reports.
-  virtual bool GetFeedbackLogs(
-      std::map<std::string, std::string>* out_logs,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns system logs for feedback reports.
-  virtual void GetFeedbackLogsAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*logs*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns list of User log file names that Chrome itself must collect.
-  // These logfiles are relative to the user's profile path and must be
-  // collected separately for each user.
-  virtual bool GetUserLogFiles(
-      std::map<std::string, std::string>* out_user_log_files,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns list of User log file names that Chrome itself must collect.
-  // These logfiles are relative to the user's profile path and must be
-  // collected separately for each user.
-  virtual void GetUserLogFilesAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*user_log_files*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Example method. See /doc/hacking.md.
-  virtual bool GetExample(
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Example method. See /doc/hacking.md.
-  virtual void GetExampleAsync(
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns information about network interfaces as a JSON string.
-  virtual bool GetInterfaces(
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Returns information about network interfaces as a JSON string.
-  virtual void GetInterfacesAsync(
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Tests ICMP connectivity to a specified host.
-  virtual bool TestICMP(
-      const std::string& in_host,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Tests ICMP connectivity to a specified host.
-  virtual void TestICMPAsync(
-      const std::string& in_host,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Tests ICMP connectivity to a specified host (with options).
-  virtual bool TestICMPWithOptions(
-      const std::string& in_host,
-      const std::map<std::string, std::string>& in_options,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Tests ICMP connectivity to a specified host (with options).
-  virtual void TestICMPWithOptionsAsync(
-      const std::string& in_host,
-      const std::map<std::string, std::string>& in_options,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs BatteryFirmware utility.
-  virtual bool BatteryFirmware(
-      const std::string& in_option,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs BatteryFirmware utility.
-  virtual void BatteryFirmwareAsync(
-      const std::string& in_option,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs Smartctl utility.
-  virtual bool Smartctl(
-      const std::string& in_option,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Runs Smartctl utility.
-  virtual void SmartctlAsync(
-      const std::string& in_option,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Starts running memtester.
-  virtual bool MemtesterStart(
-      const dbus::FileDescriptor& in_outfd,
-      uint32_t in_memory,
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Starts running memtester.
-  virtual void MemtesterStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      uint32_t in_memory,
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops running memtester.
-  virtual bool MemtesterStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops running memtester.
-  virtual void MemtesterStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Starts running badblocks test.
-  virtual bool BadblocksStart(
-      const dbus::FileDescriptor& in_outfd,
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Starts running badblocks test.
-  virtual void BadblocksStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops running badblocks.
-  virtual bool BadblocksStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops running badblocks.
-  virtual void BadblocksStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Starts a packet capture with the specified options, with diagnostic
-  // status directed to the "statfd" file descriptor and packet capture
-  // data sent to the "outfd" file descriptor.  The returned opaque string
-  // functions as a handle for this particular packet capture.  Multiple
-  // captures can be running at once.  Captures can be initiated on
-  // Ethernet-like devices or WiFi devices in "client mode" (showing only
-  // Ethernet frames) by specifying the "device" parameter (see below).
-  // By specifying a channel, the script will find or create a "monitor
-  // mode" interface if one is available and produce an "over the air"
-  // packet capture.  The name of the output packet capture file is sent
-  // to the output file descriptor.
-  virtual bool PacketCaptureStart(
-      const dbus::FileDescriptor& in_statfd,
-      const dbus::FileDescriptor& in_outfd,
-      const brillo::VariantDictionary& in_options,
-      std::string* out_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Starts a packet capture with the specified options, with diagnostic
-  // status directed to the "statfd" file descriptor and packet capture
-  // data sent to the "outfd" file descriptor.  The returned opaque string
-  // functions as a handle for this particular packet capture.  Multiple
-  // captures can be running at once.  Captures can be initiated on
-  // Ethernet-like devices or WiFi devices in "client mode" (showing only
-  // Ethernet frames) by specifying the "device" parameter (see below).
-  // By specifying a channel, the script will find or create a "monitor
-  // mode" interface if one is available and produce an "over the air"
-  // packet capture.  The name of the output packet capture file is sent
-  // to the output file descriptor.
-  virtual void PacketCaptureStartAsync(
-      const dbus::FileDescriptor& in_statfd,
-      const dbus::FileDescriptor& in_outfd,
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::string& /*handle*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops a running packet capture.
-  virtual bool PacketCaptureStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Stops a running packet capture.
-  virtual void PacketCaptureStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Triggers show-task-states(T) SysRq.
-  // See https://www.kernel.org/doc/Documentation/sysrq.txt.
-  virtual bool LogKernelTaskStates(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Triggers show-task-states(T) SysRq.
-  // See https://www.kernel.org/doc/Documentation/sysrq.txt.
-  virtual void LogKernelTaskStatesAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Triggers uploading of system crashes (the crash_sender program).
-  virtual bool UploadCrashes(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Triggers uploading of system crashes (the crash_sender program).
-  virtual void UploadCrashesAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Removes rootfs verification. Requires a system reboot before it will
-  // take effect. Restricted to pre-owner dev mode.
-  virtual bool RemoveRootfsVerification(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Removes rootfs verification. Requires a system reboot before it will
-  // take effect. Restricted to pre-owner dev mode.
-  virtual void RemoveRootfsVerificationAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Enables OS booting from a USB image. Restricted to pre-owner dev mode.
-  virtual bool EnableBootFromUsb(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Enables OS booting from a USB image. Restricted to pre-owner dev mode.
-  virtual void EnableBootFromUsbAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Sets up sshd to provide an SSH server immediately and on future reboots.
-  // Also installs the test SSH keys to allow access by cros tools. Requires
-  // that rootfs verification has been removed. Restricted to pre-owner dev
-  // mode.
-  virtual bool ConfigureSshServer(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Sets up sshd to provide an SSH server immediately and on future reboots.
-  // Also installs the test SSH keys to allow access by cros tools. Requires
-  // that rootfs verification has been removed. Restricted to pre-owner dev
-  // mode.
-  virtual void ConfigureSshServerAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Sets both the system and dev mode password for the indicated account.
-  // Restricted to pre-owner dev mode.
-  virtual bool SetUserPassword(
-      const std::string& in_username,
-      const std::string& in_password,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Sets both the system and dev mode password for the indicated account.
-  // Restricted to pre-owner dev mode.
-  virtual void SetUserPasswordAsync(
-      const std::string& in_username,
-      const std::string& in_password,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Sets up Chrome for remote debugging. It will take effect after a reboot
-  // and using port 9222.
-  // Requires that rootfs verification has been removed. Restricted to
-  // pre-owner dev mode.
-  virtual bool EnableChromeRemoteDebugging(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Sets up Chrome for remote debugging. It will take effect after a reboot
-  // and using port 9222.
-  // Requires that rootfs verification has been removed. Restricted to
-  // pre-owner dev mode.
-  virtual void EnableChromeRemoteDebuggingAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Convenience function to enable a predefined set of tools from the Chrome
-  // UI. Equivalent to calling these functions in order:
-  //   1. EnableBootFromUsb()
-  //   2. ConfigureSshServer()
-  //   3. SetUserPassword("root", root_password)
-  // Requires that rootfs verification has been removed. If any sub-function
-  // fails, this function will exit with an error without attempting any
-  // further configuration or rollback. Restricted to pre-owner dev mode.
-  virtual bool EnableChromeDevFeatures(
-      const std::string& in_root_password,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Convenience function to enable a predefined set of tools from the Chrome
-  // UI. Equivalent to calling these functions in order:
-  //   1. EnableBootFromUsb()
-  //   2. ConfigureSshServer()
-  //   3. SetUserPassword("root", root_password)
-  // Requires that rootfs verification has been removed. If any sub-function
-  // fails, this function will exit with an error without attempting any
-  // further configuration or rollback. Restricted to pre-owner dev mode.
-  virtual void EnableChromeDevFeaturesAsync(
-      const std::string& in_root_password,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Queries which dev features have been enabled. Each dev feature will be
-  // indicated by a bit flag in the return value. Flags are defined in the
-  // DevFeatureFlag enumeration. If the dev tools are unavailable (system is
-  // not in dev mode/pre-login state), the DEV_FEATURES_DISABLED flag will be
-  // set and the rest of the bits will always be set to 0.
-  virtual bool QueryDevFeatures(
-      int32_t* out_features,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Queries which dev features have been enabled. Each dev feature will be
-  // indicated by a bit flag in the return value. Flags are defined in the
-  // DevFeatureFlag enumeration. If the dev tools are unavailable (system is
-  // not in dev mode/pre-login state), the DEV_FEATURES_DISABLED flag will be
-  // set and the rest of the bits will always be set to 0.
-  virtual void QueryDevFeaturesAsync(
-      const base::Callback<void(int32_t /*features*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Allow uploading of device coredump files.
-  virtual bool EnableDevCoredumpUpload(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Allow uploading of device coredump files.
-  virtual void EnableDevCoredumpUploadAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Disallow uploading of device coredump files.
-  virtual bool DisableDevCoredumpUpload(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // Disallow uploading of device coredump files.
-  virtual void DisableDevCoredumpUploadAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-};
-
-}  // namespace chromium
-}  // namespace org
-
-namespace org {
-namespace chromium {
-
-// Interface proxy for org::chromium::debugd.
-class debugdProxy final : public debugdProxyInterface {
- public:
-  debugdProxy(const scoped_refptr<dbus::Bus>& bus) :
-      bus_{bus},
-      dbus_object_proxy_{
-          bus_->GetObjectProxy(service_name_, object_path_)} {
-  }
-
-  ~debugdProxy() override {
-    bus_->RemoveObjectProxy(
-        service_name_, object_path_, base::Bind(&base::DoNothing));
-  }
-
-  void ReleaseObjectProxy(const base::Closure& callback) {
-    bus_->RemoveObjectProxy(service_name_, object_path_, callback);
-  }
-
-  const dbus::ObjectPath& GetObjectPath() const {
-    return object_path_;
-  }
-
-  dbus::ObjectProxy* GetObjectProxy() const { return dbus_object_proxy_; }
-
-  // Starts pinging the specified hostname with the specified options, with
-  // output directed to the given output file descriptor. The returned opaque
-  // string functions as a handle for this particular ping. Multiple pings
-  // can be running at once.
-  bool PingStart(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      std::string* out_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PingStart",
-        error,
-        in_outfd,
-        in_destination,
-        in_options);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_handle);
-  }
-
-  // Starts pinging the specified hostname with the specified options, with
-  // output directed to the given output file descriptor. The returned opaque
-  // string functions as a handle for this particular ping. Multiple pings
-  // can be running at once.
-  void PingStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::string& /*handle*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PingStart",
-        success_callback,
-        error_callback,
-        in_outfd,
-        in_destination,
-        in_options);
-  }
-
-  // Stops a running ping.
-  bool PingStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PingStop",
-        error,
-        in_handle);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Stops a running ping.
-  void PingStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PingStop",
-        success_callback,
-        error_callback,
-        in_handle);
-  }
-
-  // Start system/kernel tracing.  If tracing is already enabled it is
-  // stopped first and any collected events are discarded.  The kernel
-  // must have been configured to support tracing.
-  bool SystraceStart(
-      const std::string& in_categories,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SystraceStart",
-        error,
-        in_categories);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Start system/kernel tracing.  If tracing is already enabled it is
-  // stopped first and any collected events are discarded.  The kernel
-  // must have been configured to support tracing.
-  void SystraceStartAsync(
-      const std::string& in_categories,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SystraceStart",
-        success_callback,
-        error_callback,
-        in_categories);
-  }
-
-  // Stop system/kernel tracing and write the collected event data.
-  bool SystraceStop(
-      const dbus::FileDescriptor& in_outfd,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SystraceStop",
-        error,
-        in_outfd);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Stop system/kernel tracing and write the collected event data.
-  void SystraceStopAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SystraceStop",
-        success_callback,
-        error_callback,
-        in_outfd);
-  }
-
-  // Return current status for system/kernel tracing including whether it
-  // is enabled, the tracing clock, and the set of events enabled.
-  bool SystraceStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SystraceStatus",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Return current status for system/kernel tracing including whether it
-  // is enabled, the tracing clock, and the set of events enabled.
-  void SystraceStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SystraceStatus",
-        success_callback,
-        error_callback);
-  }
-
-  bool TracePathStart(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      std::string* out_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TracePathStart",
-        error,
-        in_outfd,
-        in_destination,
-        in_options);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_handle);
-  }
-
-  void TracePathStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const std::string& in_destination,
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::string& /*handle*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TracePathStart",
-        success_callback,
-        error_callback,
-        in_outfd,
-        in_destination,
-        in_options);
-  }
-
-  // Stops a running tracepath.
-  bool TracePathStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TracePathStop",
-        error,
-        in_handle);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Stops a running tracepath.
-  void TracePathStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TracePathStop",
-        success_callback,
-        error_callback,
-        in_handle);
-  }
-
-  // Returns the routing table.
-  bool GetRoutes(
-      const brillo::VariantDictionary& in_options,
-      std::vector<std::string>* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetRoutes",
-        error,
-        in_options);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_result);
-  }
-
-  // Returns the routing table.
-  void GetRoutesAsync(
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::vector<std::string>& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetRoutes",
-        success_callback,
-        error_callback,
-        in_options);
-  }
-
-  // Returns modem information as a JSON string. See the design document for
-  // a rationale.
-  bool GetModemStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetModemStatus",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Returns modem information as a JSON string. See the design document for
-  // a rationale.
-  void GetModemStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetModemStatus",
-        success_callback,
-        error_callback);
-  }
-
-  // Runs the specified command through the modem serial interface and
-  // returns the output.
-  bool RunModemCommand(
-      const std::string& in_command,
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "RunModemCommand",
-        error,
-        in_command);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Runs the specified command through the modem serial interface and
-  // returns the output.
-  void RunModemCommandAsync(
-      const std::string& in_command,
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "RunModemCommand",
-        success_callback,
-        error_callback,
-        in_command);
-  }
-
-  // Returns network information as a JSON string. See the design document
-  // for a rationale.
-  bool GetNetworkStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetNetworkStatus",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Returns network information as a JSON string. See the design document
-  // for a rationale.
-  void GetNetworkStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetNetworkStatus",
-        success_callback,
-        error_callback);
-  }
-
-  // Returns WiMAX information as a JSON string. See the design document for
-  // a rationale.
-  bool GetWiMaxStatus(
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetWiMaxStatus",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Returns WiMAX information as a JSON string. See the design document for
-  // a rationale.
-  void GetWiMaxStatusAsync(
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetWiMaxStatus",
-        success_callback,
-        error_callback);
-  }
-
-  // Runs system-wide perf profiling. The profile parameters are selected by
-  // perf_args.
-  bool GetPerfOutput(
-      uint32_t in_duration_sec,
-      const std::vector<std::string>& in_perf_args,
-      int32_t* out_status,
-      std::vector<uint8_t>* out_perf_data,
-      std::vector<uint8_t>* out_perf_stat,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetPerfOutput",
-        error,
-        in_duration_sec,
-        in_perf_args);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status, out_perf_data, out_perf_stat);
-  }
-
-  // Runs system-wide perf profiling. The profile parameters are selected by
-  // perf_args.
-  void GetPerfOutputAsync(
-      uint32_t in_duration_sec,
-      const std::vector<std::string>& in_perf_args,
-      const base::Callback<void(int32_t /*status*/, const std::vector<uint8_t>& /*perf_data*/, const std::vector<uint8_t>& /*perf_stat*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetPerfOutput",
-        success_callback,
-        error_callback,
-        in_duration_sec,
-        in_perf_args);
-  }
-
-  // Runs system-wide perf profiling. It can can profile events other than
-  // cycles (example: iTLB-misses), and can collect branch profiles. It can
-  // also return raw counter values. The exact profile or counters to be
-  // collected is chosen at random and depends on what CPU is used by the
-  // system (certain CPUs do not support certain profiling modes).
-  bool GetRandomPerfOutput(
-      uint32_t in_duration_sec,
-      int32_t* out_status,
-      std::vector<uint8_t>* out_perf_data,
-      std::vector<uint8_t>* out_perf_stat,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetRandomPerfOutput",
-        error,
-        in_duration_sec);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status, out_perf_data, out_perf_stat);
-  }
-
-  // Runs system-wide perf profiling. It can can profile events other than
-  // cycles (example: iTLB-misses), and can collect branch profiles. It can
-  // also return raw counter values. The exact profile or counters to be
-  // collected is chosen at random and depends on what CPU is used by the
-  // system (certain CPUs do not support certain profiling modes).
-  void GetRandomPerfOutputAsync(
-      uint32_t in_duration_sec,
-      const base::Callback<void(int32_t /*status*/, const std::vector<uint8_t>& /*perf_data*/, const std::vector<uint8_t>& /*perf_stat*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetRandomPerfOutput",
-        success_callback,
-        error_callback,
-        in_duration_sec);
-  }
-
-  // Returns perf event data. Does systemwide profiling. It can profile
-  // events other than cycles (example: iTLB-misses), and can collect branch
-  // profiles. The exact profile to be collected is chosen at random
-  // and depends on what CPU is used by the system (certain CPUs do not
-  // support certain profiling modes).
-  bool GetRichPerfData(
-      uint32_t in_duration_sec,
-      std::vector<uint8_t>* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetRichPerfData",
-        error,
-        in_duration_sec);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Returns perf event data. Does systemwide profiling. It can profile
-  // events other than cycles (example: iTLB-misses), and can collect branch
-  // profiles. The exact profile to be collected is chosen at random
-  // and depends on what CPU is used by the system (certain CPUs do not
-  // support certain profiling modes).
-  void GetRichPerfDataAsync(
-      uint32_t in_duration_sec,
-      const base::Callback<void(const std::vector<uint8_t>& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetRichPerfData",
-        success_callback,
-        error_callback,
-        in_duration_sec);
-  }
-
-  // DEPRECATED: Use DumpDebugLogs instead.
-  // Packages up system logs into a .tar.gz and returns it over the supplied
-  // file descriptor.
-  bool GetDebugLogs(
-      const dbus::FileDescriptor& in_outfd,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetDebugLogs",
-        error,
-        in_outfd);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // DEPRECATED: Use DumpDebugLogs instead.
-  // Packages up system logs into a .tar.gz and returns it over the supplied
-  // file descriptor.
-  void GetDebugLogsAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetDebugLogs",
-        success_callback,
-        error_callback,
-        in_outfd);
-  }
-
-  // Packages up system logs into a .tar(.gz) and returns it over the
-  // supplied file descriptor.
-  bool DumpDebugLogs(
-      bool in_is_compressed,
-      const dbus::FileDescriptor& in_outfd,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "DumpDebugLogs",
-        error,
-        in_is_compressed,
-        in_outfd);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Packages up system logs into a .tar(.gz) and returns it over the
-  // supplied file descriptor.
-  void DumpDebugLogsAsync(
-      bool in_is_compressed,
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "DumpDebugLogs",
-        success_callback,
-        error_callback,
-        in_is_compressed,
-        in_outfd);
-  }
-
-  // Enables or disables debug mode for a specified subsystem.
-  bool SetDebugMode(
-      const std::string& in_subsystem,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SetDebugMode",
-        error,
-        in_subsystem);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Enables or disables debug mode for a specified subsystem.
-  void SetDebugModeAsync(
-      const std::string& in_subsystem,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SetDebugMode",
-        success_callback,
-        error_callback,
-        in_subsystem);
-  }
-
-  // Fetches the contents of a single system log, identified by name. See
-  // /src/log_tool.cc for a list of valid names.
-  bool GetLog(
-      const std::string& in_log,
-      std::string* out_contents,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetLog",
-        error,
-        in_log);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_contents);
-  }
-
-  // Fetches the contents of a single system log, identified by name. See
-  // /src/log_tool.cc for a list of valid names.
-  void GetLogAsync(
-      const std::string& in_log,
-      const base::Callback<void(const std::string& /*contents*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetLog",
-        success_callback,
-        error_callback,
-        in_log);
-  }
-
-  // Returns all the system logs.
-  bool GetAllLogs(
-      std::map<std::string, std::string>* out_logs,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetAllLogs",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_logs);
-  }
-
-  // Returns all the system logs.
-  void GetAllLogsAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*logs*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetAllLogs",
-        success_callback,
-        error_callback);
-  }
-
-  // Returns system logs for feedback reports.
-  bool GetFeedbackLogs(
-      std::map<std::string, std::string>* out_logs,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetFeedbackLogs",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_logs);
-  }
-
-  // Returns system logs for feedback reports.
-  void GetFeedbackLogsAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*logs*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetFeedbackLogs",
-        success_callback,
-        error_callback);
-  }
-
-  // Returns list of User log file names that Chrome itself must collect.
-  // These logfiles are relative to the user's profile path and must be
-  // collected separately for each user.
-  bool GetUserLogFiles(
-      std::map<std::string, std::string>* out_user_log_files,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetUserLogFiles",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_user_log_files);
-  }
-
-  // Returns list of User log file names that Chrome itself must collect.
-  // These logfiles are relative to the user's profile path and must be
-  // collected separately for each user.
-  void GetUserLogFilesAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*user_log_files*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetUserLogFiles",
-        success_callback,
-        error_callback);
-  }
-
-  // Example method. See /doc/hacking.md.
-  bool GetExample(
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetExample",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_result);
-  }
-
-  // Example method. See /doc/hacking.md.
-  void GetExampleAsync(
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetExample",
-        success_callback,
-        error_callback);
-  }
-
-  // Returns information about network interfaces as a JSON string.
-  bool GetInterfaces(
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetInterfaces",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_result);
-  }
-
-  // Returns information about network interfaces as a JSON string.
-  void GetInterfacesAsync(
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "GetInterfaces",
-        success_callback,
-        error_callback);
-  }
-
-  // Tests ICMP connectivity to a specified host.
-  bool TestICMP(
-      const std::string& in_host,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TestICMP",
-        error,
-        in_host);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_result);
-  }
-
-  // Tests ICMP connectivity to a specified host.
-  void TestICMPAsync(
-      const std::string& in_host,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TestICMP",
-        success_callback,
-        error_callback,
-        in_host);
-  }
-
-  // Tests ICMP connectivity to a specified host (with options).
-  bool TestICMPWithOptions(
-      const std::string& in_host,
-      const std::map<std::string, std::string>& in_options,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TestICMPWithOptions",
-        error,
-        in_host,
-        in_options);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_result);
-  }
-
-  // Tests ICMP connectivity to a specified host (with options).
-  void TestICMPWithOptionsAsync(
-      const std::string& in_host,
-      const std::map<std::string, std::string>& in_options,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "TestICMPWithOptions",
-        success_callback,
-        error_callback,
-        in_host,
-        in_options);
-  }
-
-  // Runs BatteryFirmware utility.
-  bool BatteryFirmware(
-      const std::string& in_option,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "BatteryFirmware",
-        error,
-        in_option);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_result);
-  }
-
-  // Runs BatteryFirmware utility.
-  void BatteryFirmwareAsync(
-      const std::string& in_option,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "BatteryFirmware",
-        success_callback,
-        error_callback,
-        in_option);
-  }
-
-  // Runs Smartctl utility.
-  bool Smartctl(
-      const std::string& in_option,
-      std::string* out_result,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "Smartctl",
-        error,
-        in_option);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_result);
-  }
-
-  // Runs Smartctl utility.
-  void SmartctlAsync(
-      const std::string& in_option,
-      const base::Callback<void(const std::string& /*result*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "Smartctl",
-        success_callback,
-        error_callback,
-        in_option);
-  }
-
-  // Starts running memtester.
-  bool MemtesterStart(
-      const dbus::FileDescriptor& in_outfd,
-      uint32_t in_memory,
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "MemtesterStart",
-        error,
-        in_outfd,
-        in_memory);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Starts running memtester.
-  void MemtesterStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      uint32_t in_memory,
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "MemtesterStart",
-        success_callback,
-        error_callback,
-        in_outfd,
-        in_memory);
-  }
-
-  // Stops running memtester.
-  bool MemtesterStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "MemtesterStop",
-        error,
-        in_handle);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Stops running memtester.
-  void MemtesterStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "MemtesterStop",
-        success_callback,
-        error_callback,
-        in_handle);
-  }
-
-  // Starts running badblocks test.
-  bool BadblocksStart(
-      const dbus::FileDescriptor& in_outfd,
-      std::string* out_status,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "BadblocksStart",
-        error,
-        in_outfd);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_status);
-  }
-
-  // Starts running badblocks test.
-  void BadblocksStartAsync(
-      const dbus::FileDescriptor& in_outfd,
-      const base::Callback<void(const std::string& /*status*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "BadblocksStart",
-        success_callback,
-        error_callback,
-        in_outfd);
-  }
-
-  // Stops running badblocks.
-  bool BadblocksStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "BadblocksStop",
-        error,
-        in_handle);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Stops running badblocks.
-  void BadblocksStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "BadblocksStop",
-        success_callback,
-        error_callback,
-        in_handle);
-  }
-
-  // Starts a packet capture with the specified options, with diagnostic
-  // status directed to the "statfd" file descriptor and packet capture
-  // data sent to the "outfd" file descriptor.  The returned opaque string
-  // functions as a handle for this particular packet capture.  Multiple
-  // captures can be running at once.  Captures can be initiated on
-  // Ethernet-like devices or WiFi devices in "client mode" (showing only
-  // Ethernet frames) by specifying the "device" parameter (see below).
-  // By specifying a channel, the script will find or create a "monitor
-  // mode" interface if one is available and produce an "over the air"
-  // packet capture.  The name of the output packet capture file is sent
-  // to the output file descriptor.
-  bool PacketCaptureStart(
-      const dbus::FileDescriptor& in_statfd,
-      const dbus::FileDescriptor& in_outfd,
-      const brillo::VariantDictionary& in_options,
-      std::string* out_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PacketCaptureStart",
-        error,
-        in_statfd,
-        in_outfd,
-        in_options);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_handle);
-  }
-
-  // Starts a packet capture with the specified options, with diagnostic
-  // status directed to the "statfd" file descriptor and packet capture
-  // data sent to the "outfd" file descriptor.  The returned opaque string
-  // functions as a handle for this particular packet capture.  Multiple
-  // captures can be running at once.  Captures can be initiated on
-  // Ethernet-like devices or WiFi devices in "client mode" (showing only
-  // Ethernet frames) by specifying the "device" parameter (see below).
-  // By specifying a channel, the script will find or create a "monitor
-  // mode" interface if one is available and produce an "over the air"
-  // packet capture.  The name of the output packet capture file is sent
-  // to the output file descriptor.
-  void PacketCaptureStartAsync(
-      const dbus::FileDescriptor& in_statfd,
-      const dbus::FileDescriptor& in_outfd,
-      const brillo::VariantDictionary& in_options,
-      const base::Callback<void(const std::string& /*handle*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PacketCaptureStart",
-        success_callback,
-        error_callback,
-        in_statfd,
-        in_outfd,
-        in_options);
-  }
-
-  // Stops a running packet capture.
-  bool PacketCaptureStop(
-      const std::string& in_handle,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PacketCaptureStop",
-        error,
-        in_handle);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Stops a running packet capture.
-  void PacketCaptureStopAsync(
-      const std::string& in_handle,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "PacketCaptureStop",
-        success_callback,
-        error_callback,
-        in_handle);
-  }
-
-  // Triggers show-task-states(T) SysRq.
-  // See https://www.kernel.org/doc/Documentation/sysrq.txt.
-  bool LogKernelTaskStates(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "LogKernelTaskStates",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Triggers show-task-states(T) SysRq.
-  // See https://www.kernel.org/doc/Documentation/sysrq.txt.
-  void LogKernelTaskStatesAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "LogKernelTaskStates",
-        success_callback,
-        error_callback);
-  }
-
-  // Triggers uploading of system crashes (the crash_sender program).
-  bool UploadCrashes(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "UploadCrashes",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Triggers uploading of system crashes (the crash_sender program).
-  void UploadCrashesAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "UploadCrashes",
-        success_callback,
-        error_callback);
-  }
-
-  // Removes rootfs verification. Requires a system reboot before it will
-  // take effect. Restricted to pre-owner dev mode.
-  bool RemoveRootfsVerification(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "RemoveRootfsVerification",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Removes rootfs verification. Requires a system reboot before it will
-  // take effect. Restricted to pre-owner dev mode.
-  void RemoveRootfsVerificationAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "RemoveRootfsVerification",
-        success_callback,
-        error_callback);
-  }
-
-  // Enables OS booting from a USB image. Restricted to pre-owner dev mode.
-  bool EnableBootFromUsb(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableBootFromUsb",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Enables OS booting from a USB image. Restricted to pre-owner dev mode.
-  void EnableBootFromUsbAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableBootFromUsb",
-        success_callback,
-        error_callback);
-  }
-
-  // Sets up sshd to provide an SSH server immediately and on future reboots.
-  // Also installs the test SSH keys to allow access by cros tools. Requires
-  // that rootfs verification has been removed. Restricted to pre-owner dev
-  // mode.
-  bool ConfigureSshServer(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "ConfigureSshServer",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Sets up sshd to provide an SSH server immediately and on future reboots.
-  // Also installs the test SSH keys to allow access by cros tools. Requires
-  // that rootfs verification has been removed. Restricted to pre-owner dev
-  // mode.
-  void ConfigureSshServerAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "ConfigureSshServer",
-        success_callback,
-        error_callback);
-  }
-
-  // Sets both the system and dev mode password for the indicated account.
-  // Restricted to pre-owner dev mode.
-  bool SetUserPassword(
-      const std::string& in_username,
-      const std::string& in_password,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SetUserPassword",
-        error,
-        in_username,
-        in_password);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Sets both the system and dev mode password for the indicated account.
-  // Restricted to pre-owner dev mode.
-  void SetUserPasswordAsync(
-      const std::string& in_username,
-      const std::string& in_password,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "SetUserPassword",
-        success_callback,
-        error_callback,
-        in_username,
-        in_password);
-  }
-
-  // Sets up Chrome for remote debugging. It will take effect after a reboot
-  // and using port 9222.
-  // Requires that rootfs verification has been removed. Restricted to
-  // pre-owner dev mode.
-  bool EnableChromeRemoteDebugging(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableChromeRemoteDebugging",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Sets up Chrome for remote debugging. It will take effect after a reboot
-  // and using port 9222.
-  // Requires that rootfs verification has been removed. Restricted to
-  // pre-owner dev mode.
-  void EnableChromeRemoteDebuggingAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableChromeRemoteDebugging",
-        success_callback,
-        error_callback);
-  }
-
-  // Convenience function to enable a predefined set of tools from the Chrome
-  // UI. Equivalent to calling these functions in order:
-  //   1. EnableBootFromUsb()
-  //   2. ConfigureSshServer()
-  //   3. SetUserPassword("root", root_password)
-  // Requires that rootfs verification has been removed. If any sub-function
-  // fails, this function will exit with an error without attempting any
-  // further configuration or rollback. Restricted to pre-owner dev mode.
-  bool EnableChromeDevFeatures(
-      const std::string& in_root_password,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableChromeDevFeatures",
-        error,
-        in_root_password);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Convenience function to enable a predefined set of tools from the Chrome
-  // UI. Equivalent to calling these functions in order:
-  //   1. EnableBootFromUsb()
-  //   2. ConfigureSshServer()
-  //   3. SetUserPassword("root", root_password)
-  // Requires that rootfs verification has been removed. If any sub-function
-  // fails, this function will exit with an error without attempting any
-  // further configuration or rollback. Restricted to pre-owner dev mode.
-  void EnableChromeDevFeaturesAsync(
-      const std::string& in_root_password,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableChromeDevFeatures",
-        success_callback,
-        error_callback,
-        in_root_password);
-  }
-
-  // Queries which dev features have been enabled. Each dev feature will be
-  // indicated by a bit flag in the return value. Flags are defined in the
-  // DevFeatureFlag enumeration. If the dev tools are unavailable (system is
-  // not in dev mode/pre-login state), the DEV_FEATURES_DISABLED flag will be
-  // set and the rest of the bits will always be set to 0.
-  bool QueryDevFeatures(
-      int32_t* out_features,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "QueryDevFeatures",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_features);
-  }
-
-  // Queries which dev features have been enabled. Each dev feature will be
-  // indicated by a bit flag in the return value. Flags are defined in the
-  // DevFeatureFlag enumeration. If the dev tools are unavailable (system is
-  // not in dev mode/pre-login state), the DEV_FEATURES_DISABLED flag will be
-  // set and the rest of the bits will always be set to 0.
-  void QueryDevFeaturesAsync(
-      const base::Callback<void(int32_t /*features*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "QueryDevFeatures",
-        success_callback,
-        error_callback);
-  }
-
-  // Allow uploading of device coredump files.
-  bool EnableDevCoredumpUpload(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableDevCoredumpUpload",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Allow uploading of device coredump files.
-  void EnableDevCoredumpUploadAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "EnableDevCoredumpUpload",
-        success_callback,
-        error_callback);
-  }
-
-  // Disallow uploading of device coredump files.
-  bool DisableDevCoredumpUpload(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "DisableDevCoredumpUpload",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // Disallow uploading of device coredump files.
-  void DisableDevCoredumpUploadAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.debugd",
-        "DisableDevCoredumpUpload",
-        success_callback,
-        error_callback);
-  }
-
- private:
-  scoped_refptr<dbus::Bus> bus_;
-  const std::string service_name_{"org.chromium.debugd"};
-  const dbus::ObjectPath object_path_{"/org/chromium/debugd"};
-  dbus::ObjectProxy* dbus_object_proxy_;
-
-  DISALLOW_COPY_AND_ASSIGN(debugdProxy);
-};
-
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_DEBUGD_CLIENT_OUT_DEFAULT_GEN_INCLUDE_DEBUGD_DBUS_PROXIES_H
diff --git a/include/debugd/dbus-proxy-mocks.h b/include/debugd/dbus-proxy-mocks.h
deleted file mode 100644
index 042a9fd..0000000
--- a/include/debugd/dbus-proxy-mocks.h
+++ /dev/null
@@ -1,453 +0,0 @@
-// Automatic generation of D-Bus interface mock proxies for:
-//  - org.chromium.debugd
-#ifndef ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_DEBUGD_CLIENT_OUT_DEFAULT_GEN_INCLUDE_DEBUGD_DBUS_PROXY_MOCKS_H
-#define ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_DEBUGD_CLIENT_OUT_DEFAULT_GEN_INCLUDE_DEBUGD_DBUS_PROXY_MOCKS_H
-#include <string>
-#include <vector>
-
-#include <base/callback_forward.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <brillo/any.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <gmock/gmock.h>
-
-#include "debugd/dbus-proxies.h"
-
-namespace org {
-namespace chromium {
-
-// Mock object for debugdProxyInterface.
-class debugdProxyMock : public debugdProxyInterface {
- public:
-  debugdProxyMock() = default;
-
-  MOCK_METHOD6(PingStart,
-               bool(const dbus::FileDescriptor& /*in_outfd*/,
-                    const std::string& /*in_destination*/,
-                    const brillo::VariantDictionary& /*in_options*/,
-                    std::string* /*out_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD6(PingStartAsync,
-               void(const dbus::FileDescriptor& /*in_outfd*/,
-                    const std::string& /*in_destination*/,
-                    const brillo::VariantDictionary& /*in_options*/,
-                    const base::Callback<void(const std::string& /*handle*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(PingStop,
-               bool(const std::string& /*in_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(PingStopAsync,
-               void(const std::string& /*in_handle*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SystraceStart,
-               bool(const std::string& /*in_categories*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SystraceStartAsync,
-               void(const std::string& /*in_categories*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SystraceStop,
-               bool(const dbus::FileDescriptor& /*in_outfd*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SystraceStopAsync,
-               void(const dbus::FileDescriptor& /*in_outfd*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SystraceStatus,
-               bool(std::string* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SystraceStatusAsync,
-               void(const base::Callback<void(const std::string& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD6(TracePathStart,
-               bool(const dbus::FileDescriptor& /*in_outfd*/,
-                    const std::string& /*in_destination*/,
-                    const brillo::VariantDictionary& /*in_options*/,
-                    std::string* /*out_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD6(TracePathStartAsync,
-               void(const dbus::FileDescriptor& /*in_outfd*/,
-                    const std::string& /*in_destination*/,
-                    const brillo::VariantDictionary& /*in_options*/,
-                    const base::Callback<void(const std::string& /*handle*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(TracePathStop,
-               bool(const std::string& /*in_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(TracePathStopAsync,
-               void(const std::string& /*in_handle*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetRoutes,
-               bool(const brillo::VariantDictionary& /*in_options*/,
-                    std::vector<std::string>* /*out_result*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetRoutesAsync,
-               void(const brillo::VariantDictionary& /*in_options*/,
-                    const base::Callback<void(const std::vector<std::string>& /*result*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetModemStatus,
-               bool(std::string* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetModemStatusAsync,
-               void(const base::Callback<void(const std::string& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RunModemCommand,
-               bool(const std::string& /*in_command*/,
-                    std::string* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RunModemCommandAsync,
-               void(const std::string& /*in_command*/,
-                    const base::Callback<void(const std::string& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetNetworkStatus,
-               bool(std::string* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetNetworkStatusAsync,
-               void(const base::Callback<void(const std::string& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetWiMaxStatus,
-               bool(std::string* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetWiMaxStatusAsync,
-               void(const base::Callback<void(const std::string& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD7(GetPerfOutput,
-               bool(uint32_t /*in_duration_sec*/,
-                    const std::vector<std::string>& /*in_perf_args*/,
-                    int32_t* /*out_status*/,
-                    std::vector<uint8_t>* /*out_perf_data*/,
-                    std::vector<uint8_t>* /*out_perf_stat*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(GetPerfOutputAsync,
-               void(uint32_t /*in_duration_sec*/,
-                    const std::vector<std::string>& /*in_perf_args*/,
-                    const base::Callback<void(int32_t /*status*/, const std::vector<uint8_t>& /*perf_data*/, const std::vector<uint8_t>& /*perf_stat*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD6(GetRandomPerfOutput,
-               bool(uint32_t /*in_duration_sec*/,
-                    int32_t* /*out_status*/,
-                    std::vector<uint8_t>* /*out_perf_data*/,
-                    std::vector<uint8_t>* /*out_perf_stat*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetRandomPerfOutputAsync,
-               void(uint32_t /*in_duration_sec*/,
-                    const base::Callback<void(int32_t /*status*/, const std::vector<uint8_t>& /*perf_data*/, const std::vector<uint8_t>& /*perf_stat*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetRichPerfData,
-               bool(uint32_t /*in_duration_sec*/,
-                    std::vector<uint8_t>* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetRichPerfDataAsync,
-               void(uint32_t /*in_duration_sec*/,
-                    const base::Callback<void(const std::vector<uint8_t>& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetDebugLogs,
-               bool(const dbus::FileDescriptor& /*in_outfd*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetDebugLogsAsync,
-               void(const dbus::FileDescriptor& /*in_outfd*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(DumpDebugLogs,
-               bool(bool /*in_is_compressed*/,
-                    const dbus::FileDescriptor& /*in_outfd*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(DumpDebugLogsAsync,
-               void(bool /*in_is_compressed*/,
-                    const dbus::FileDescriptor& /*in_outfd*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetDebugMode,
-               bool(const std::string& /*in_subsystem*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetDebugModeAsync,
-               void(const std::string& /*in_subsystem*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetLog,
-               bool(const std::string& /*in_log*/,
-                    std::string* /*out_contents*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetLogAsync,
-               void(const std::string& /*in_log*/,
-                    const base::Callback<void(const std::string& /*contents*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetAllLogs,
-               bool(std::map<std::string, std::string>* /*out_logs*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetAllLogsAsync,
-               void(const base::Callback<void(const std::map<std::string, std::string>& /*logs*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetFeedbackLogs,
-               bool(std::map<std::string, std::string>* /*out_logs*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetFeedbackLogsAsync,
-               void(const base::Callback<void(const std::map<std::string, std::string>& /*logs*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetUserLogFiles,
-               bool(std::map<std::string, std::string>* /*out_user_log_files*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetUserLogFilesAsync,
-               void(const base::Callback<void(const std::map<std::string, std::string>& /*user_log_files*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetExample,
-               bool(std::string* /*out_result*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetExampleAsync,
-               void(const base::Callback<void(const std::string& /*result*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetInterfaces,
-               bool(std::string* /*out_result*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetInterfacesAsync,
-               void(const base::Callback<void(const std::string& /*result*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(TestICMP,
-               bool(const std::string& /*in_host*/,
-                    std::string* /*out_result*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(TestICMPAsync,
-               void(const std::string& /*in_host*/,
-                    const base::Callback<void(const std::string& /*result*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(TestICMPWithOptions,
-               bool(const std::string& /*in_host*/,
-                    const std::map<std::string, std::string>& /*in_options*/,
-                    std::string* /*out_result*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(TestICMPWithOptionsAsync,
-               void(const std::string& /*in_host*/,
-                    const std::map<std::string, std::string>& /*in_options*/,
-                    const base::Callback<void(const std::string& /*result*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(BatteryFirmware,
-               bool(const std::string& /*in_option*/,
-                    std::string* /*out_result*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(BatteryFirmwareAsync,
-               void(const std::string& /*in_option*/,
-                    const base::Callback<void(const std::string& /*result*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(Smartctl,
-               bool(const std::string& /*in_option*/,
-                    std::string* /*out_result*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SmartctlAsync,
-               void(const std::string& /*in_option*/,
-                    const base::Callback<void(const std::string& /*result*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(MemtesterStart,
-               bool(const dbus::FileDescriptor& /*in_outfd*/,
-                    uint32_t /*in_memory*/,
-                    std::string* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(MemtesterStartAsync,
-               void(const dbus::FileDescriptor& /*in_outfd*/,
-                    uint32_t /*in_memory*/,
-                    const base::Callback<void(const std::string& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(MemtesterStop,
-               bool(const std::string& /*in_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(MemtesterStopAsync,
-               void(const std::string& /*in_handle*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(BadblocksStart,
-               bool(const dbus::FileDescriptor& /*in_outfd*/,
-                    std::string* /*out_status*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(BadblocksStartAsync,
-               void(const dbus::FileDescriptor& /*in_outfd*/,
-                    const base::Callback<void(const std::string& /*status*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(BadblocksStop,
-               bool(const std::string& /*in_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(BadblocksStopAsync,
-               void(const std::string& /*in_handle*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD6(PacketCaptureStart,
-               bool(const dbus::FileDescriptor& /*in_statfd*/,
-                    const dbus::FileDescriptor& /*in_outfd*/,
-                    const brillo::VariantDictionary& /*in_options*/,
-                    std::string* /*out_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD6(PacketCaptureStartAsync,
-               void(const dbus::FileDescriptor& /*in_statfd*/,
-                    const dbus::FileDescriptor& /*in_outfd*/,
-                    const brillo::VariantDictionary& /*in_options*/,
-                    const base::Callback<void(const std::string& /*handle*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(PacketCaptureStop,
-               bool(const std::string& /*in_handle*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(PacketCaptureStopAsync,
-               void(const std::string& /*in_handle*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(LogKernelTaskStates,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(LogKernelTaskStatesAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(UploadCrashes,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(UploadCrashesAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(RemoveRootfsVerification,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RemoveRootfsVerificationAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(EnableBootFromUsb,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(EnableBootFromUsbAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(ConfigureSshServer,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(ConfigureSshServerAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetUserPassword,
-               bool(const std::string& /*in_username*/,
-                    const std::string& /*in_password*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(SetUserPasswordAsync,
-               void(const std::string& /*in_username*/,
-                    const std::string& /*in_password*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(EnableChromeRemoteDebugging,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(EnableChromeRemoteDebuggingAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(EnableChromeDevFeatures,
-               bool(const std::string& /*in_root_password*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(EnableChromeDevFeaturesAsync,
-               void(const std::string& /*in_root_password*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(QueryDevFeatures,
-               bool(int32_t* /*out_features*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(QueryDevFeaturesAsync,
-               void(const base::Callback<void(int32_t /*features*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(EnableDevCoredumpUpload,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(EnableDevCoredumpUploadAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(DisableDevCoredumpUpload,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(DisableDevCoredumpUploadAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(debugdProxyMock);
-};
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_DEBUGD_CLIENT_OUT_DEFAULT_GEN_INCLUDE_DEBUGD_DBUS_PROXY_MOCKS_H
diff --git a/include/libcros/dbus-proxy-mocks.h b/include/libcros/dbus-proxy-mocks.h
deleted file mode 100644
index 16790bd..0000000
--- a/include/libcros/dbus-proxy-mocks.h
+++ /dev/null
@@ -1,77 +0,0 @@
-// Automatic generation of D-Bus interface mock proxies for:
-//  - org.chromium.LibCrosServiceInterface
-//  - org.chromium.UpdateEngineLibcrosProxyResolvedInterface
-#ifndef ____CHROMEOS_DBUS_BINDING___UPDATE_ENGINE_INCLUDE_LIBCROS_DBUS_PROXY_MOCKS_H
-#define ____CHROMEOS_DBUS_BINDING___UPDATE_ENGINE_INCLUDE_LIBCROS_DBUS_PROXY_MOCKS_H
-#include <string>
-#include <vector>
-
-#include <base/callback_forward.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <brillo/any.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <gmock/gmock.h>
-
-#include "libcros/dbus-proxies.h"
-
-namespace org {
-namespace chromium {
-
-// Mock object for LibCrosServiceInterfaceProxyInterface.
-class LibCrosServiceInterfaceProxyMock : public LibCrosServiceInterfaceProxyInterface {
- public:
-  LibCrosServiceInterfaceProxyMock() = default;
-
-  MOCK_METHOD5(ResolveNetworkProxy,
-               bool(const std::string& /*in_source_url*/,
-                    const std::string& /*in_signal_interface*/,
-                    const std::string& /*in_signal_name*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD6(ResolveNetworkProxyAsync,
-               void(const std::string& /*in_source_url*/,
-                    const std::string& /*in_signal_interface*/,
-                    const std::string& /*in_signal_name*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetKioskAppRequiredPlatformVersion,
-               bool(std::string* /*out_required_platform_version*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetKioskAppRequiredPlatformVersionAsync,
-               void(const base::Callback<void(const std::string& /*required_platform_version*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_CONST_METHOD0(GetObjectPath, const dbus::ObjectPath&());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(LibCrosServiceInterfaceProxyMock);
-};
-}  // namespace chromium
-}  // namespace org
-
-namespace org {
-namespace chromium {
-
-// Mock object for UpdateEngineLibcrosProxyResolvedInterfaceProxyInterface.
-class UpdateEngineLibcrosProxyResolvedInterfaceProxyMock : public UpdateEngineLibcrosProxyResolvedInterfaceProxyInterface {
- public:
-  UpdateEngineLibcrosProxyResolvedInterfaceProxyMock() = default;
-
-  MOCK_METHOD2(RegisterProxyResolvedSignalHandler,
-               void(const base::Callback<void(const std::string&,
-                                              const std::string&,
-                                              const std::string&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_CONST_METHOD0(GetObjectPath, const dbus::ObjectPath&());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(UpdateEngineLibcrosProxyResolvedInterfaceProxyMock);
-};
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING___UPDATE_ENGINE_INCLUDE_LIBCROS_DBUS_PROXY_MOCKS_H
diff --git a/include/power_manager/dbus-proxies.h b/include/power_manager/dbus-proxies.h
deleted file mode 100644
index e66848d..0000000
--- a/include/power_manager/dbus-proxies.h
+++ /dev/null
@@ -1,1280 +0,0 @@
-// Automatic generation of D-Bus interfaces:
-//  - org.chromium.PowerManager
-#ifndef ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_TMP_PORTAGE_CHROMEOS_BASE_POWER_MANAGER_9999_WORK_BUILD_OUT_DEFAULT_GEN_INCLUDE_POWER_MANAGER_DBUS_PROXIES_H
-#define ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_TMP_PORTAGE_CHROMEOS_BASE_POWER_MANAGER_9999_WORK_BUILD_OUT_DEFAULT_GEN_INCLUDE_POWER_MANAGER_DBUS_PROXIES_H
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <base/bind.h>
-#include <base/callback.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <base/memory/ref_counted.h>
-#include <brillo/any.h>
-#include <brillo/dbus/dbus_method_invoker.h>
-#include <brillo/dbus/dbus_property.h>
-#include <brillo/dbus/dbus_signal_handler.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <dbus/bus.h>
-#include <dbus/message.h>
-#include <dbus/object_manager.h>
-#include <dbus/object_path.h>
-#include <dbus/object_proxy.h>
-
-namespace org {
-namespace chromium {
-
-// Abstract interface proxy for org::chromium::PowerManager.
-class PowerManagerProxyInterface {
- public:
-  virtual ~PowerManagerProxyInterface() = default;
-
-  virtual bool RequestShutdown(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RequestShutdownAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |reason| arg is a power_manager::RequestRestartReason value.
-  virtual bool RequestRestart(
-      int32_t in_reason,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |reason| arg is a power_manager::RequestRestartReason value.
-  virtual void RequestRestartAsync(
-      int32_t in_reason,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |external_wakeup_count| arg is optional, and it will call two
-  // different methods in the backend. This can't be expressed in the DBus
-  // Introspection XML file.
-  virtual bool RequestSuspend(
-      uint64_t in_external_wakeup_count,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |external_wakeup_count| arg is optional, and it will call two
-  // different methods in the backend. This can't be expressed in the DBus
-  // Introspection XML file.
-  virtual void RequestSuspendAsync(
-      uint64_t in_external_wakeup_count,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool DecreaseScreenBrightness(
-      bool in_allow_off,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void DecreaseScreenBrightnessAsync(
-      bool in_allow_off,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool IncreaseScreenBrightness(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void IncreaseScreenBrightnessAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool GetScreenBrightnessPercent(
-      double* out_percent,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void GetScreenBrightnessPercentAsync(
-      const base::Callback<void(double /*percent*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |style| arg must be one of the values:
-  //   power_manager::kBrightnessTransitionGradual or
-  //   power_manager::kBrightnessTransitionInstant.
-  virtual bool SetScreenBrightnessPercent(
-      double in_percent,
-      int32_t in_style,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |style| arg must be one of the values:
-  //   power_manager::kBrightnessTransitionGradual or
-  //   power_manager::kBrightnessTransitionInstant.
-  virtual void SetScreenBrightnessPercentAsync(
-      double in_percent,
-      int32_t in_style,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool DecreaseKeyboardBrightness(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void DecreaseKeyboardBrightnessAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool IncreaseKeyboardBrightness(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void IncreaseKeyboardBrightnessAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerSupplyProperties protobuf.
-  virtual bool GetPowerSupplyProperties(
-      std::vector<uint8_t>* out_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerSupplyProperties protobuf.
-  virtual void GetPowerSupplyPropertiesAsync(
-      const base::Callback<void(const std::vector<uint8_t>& /*serialized_proto*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool HandleVideoActivity(
-      bool in_fullscreen,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void HandleVideoActivityAsync(
-      bool in_fullscreen,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |type| arg is a power_manager::UserActivityType.
-  virtual bool HandleUserActivity(
-      int32_t in_type,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |type| arg is a power_manager::UserActivityType.
-  virtual void HandleUserActivityAsync(
-      int32_t in_type,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool SetIsProjecting(
-      bool in_is_projecting,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void SetIsProjectingAsync(
-      bool in_is_projecting,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerManagementPolicy protobuf.
-  virtual bool SetPolicy(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerManagementPolicy protobuf.
-  virtual void SetPolicyAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool SetPowerSource(
-      const std::string& in_id,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void SetPowerSourceAsync(
-      const std::string& in_id,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |timestamp_internal| arg is represented as the return value of
-  // base::TimeTicks::ToInternalValue().
-  virtual bool HandlePowerButtonAcknowledgment(
-      int64_t in_timestamp_internal,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |timestamp_internal| arg is represented as the return value of
-  // base::TimeTicks::ToInternalValue().
-  virtual void HandlePowerButtonAcknowledgmentAsync(
-      int64_t in_timestamp_internal,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  virtual bool RegisterSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      std::vector<uint8_t>* out_serialized_reply_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  virtual void RegisterSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      const base::Callback<void(const std::vector<uint8_t>& /*serialized_reply_proto*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  virtual bool UnregisterSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  virtual void UnregisterSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  virtual bool HandleSuspendReadiness(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  virtual void HandleSuspendReadinessAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  virtual bool RegisterDarkSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      std::vector<uint8_t>* out_serialized_reply_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  virtual void RegisterDarkSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      const base::Callback<void(const std::vector<uint8_t>& /*serialized_reply_proto*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  virtual bool UnregisterDarkSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  virtual void UnregisterDarkSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  virtual bool HandleDarkSuspendReadiness(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  virtual void HandleDarkSuspendReadinessAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::DarkResumeWakeReason protobuf.
-  virtual bool RecordDarkResumeWakeReason(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::DarkResumeWakeReason protobuf.
-  virtual void RecordDarkResumeWakeReasonAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RegisterBrightnessChangedSignalHandler(
-      const base::Callback<void(int32_t,
-                                bool)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterKeyboardBrightnessChangedSignalHandler(
-      const base::Callback<void(int32_t,
-                                bool)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterPeripheralBatteryStatusSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterPowerSupplyPollSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterSuspendImminentSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterSuspendDoneSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterDarkSuspendImminentSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterInputEventSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterIdleActionImminentSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterIdleActionDeferredSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-};
-
-}  // namespace chromium
-}  // namespace org
-
-namespace org {
-namespace chromium {
-
-// Interface proxy for org::chromium::PowerManager.
-class PowerManagerProxy final : public PowerManagerProxyInterface {
- public:
-  PowerManagerProxy(const scoped_refptr<dbus::Bus>& bus) :
-      bus_{bus},
-      dbus_object_proxy_{
-          bus_->GetObjectProxy(service_name_, object_path_)} {
-  }
-
-  ~PowerManagerProxy() override {
-    bus_->RemoveObjectProxy(
-        service_name_, object_path_, base::Bind(&base::DoNothing));
-  }
-
-  void RegisterBrightnessChangedSignalHandler(
-      const base::Callback<void(int32_t,
-                                bool)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "BrightnessChanged",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterKeyboardBrightnessChangedSignalHandler(
-      const base::Callback<void(int32_t,
-                                bool)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "KeyboardBrightnessChanged",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterPeripheralBatteryStatusSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "PeripheralBatteryStatus",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterPowerSupplyPollSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "PowerSupplyPoll",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterSuspendImminentSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SuspendImminent",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterSuspendDoneSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SuspendDone",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterDarkSuspendImminentSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "DarkSuspendImminent",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterInputEventSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "InputEvent",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterIdleActionImminentSignalHandler(
-      const base::Callback<void(const std::vector<uint8_t>&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "IdleActionImminent",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterIdleActionDeferredSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "IdleActionDeferred",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void ReleaseObjectProxy(const base::Closure& callback) {
-    bus_->RemoveObjectProxy(service_name_, object_path_, callback);
-  }
-
-  const dbus::ObjectPath& GetObjectPath() const {
-    return object_path_;
-  }
-
-  dbus::ObjectProxy* GetObjectProxy() const { return dbus_object_proxy_; }
-
-  bool RequestShutdown(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RequestShutdown",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void RequestShutdownAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RequestShutdown",
-        success_callback,
-        error_callback);
-  }
-
-  // The |reason| arg is a power_manager::RequestRestartReason value.
-  bool RequestRestart(
-      int32_t in_reason,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RequestRestart",
-        error,
-        in_reason);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |reason| arg is a power_manager::RequestRestartReason value.
-  void RequestRestartAsync(
-      int32_t in_reason,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RequestRestart",
-        success_callback,
-        error_callback,
-        in_reason);
-  }
-
-  // The |external_wakeup_count| arg is optional, and it will call two
-  // different methods in the backend. This can't be expressed in the DBus
-  // Introspection XML file.
-  bool RequestSuspend(
-      uint64_t in_external_wakeup_count,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RequestSuspend",
-        error,
-        in_external_wakeup_count);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |external_wakeup_count| arg is optional, and it will call two
-  // different methods in the backend. This can't be expressed in the DBus
-  // Introspection XML file.
-  void RequestSuspendAsync(
-      uint64_t in_external_wakeup_count,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RequestSuspend",
-        success_callback,
-        error_callback,
-        in_external_wakeup_count);
-  }
-
-  bool DecreaseScreenBrightness(
-      bool in_allow_off,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "DecreaseScreenBrightness",
-        error,
-        in_allow_off);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void DecreaseScreenBrightnessAsync(
-      bool in_allow_off,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "DecreaseScreenBrightness",
-        success_callback,
-        error_callback,
-        in_allow_off);
-  }
-
-  bool IncreaseScreenBrightness(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "IncreaseScreenBrightness",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void IncreaseScreenBrightnessAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "IncreaseScreenBrightness",
-        success_callback,
-        error_callback);
-  }
-
-  bool GetScreenBrightnessPercent(
-      double* out_percent,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "GetScreenBrightnessPercent",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_percent);
-  }
-
-  void GetScreenBrightnessPercentAsync(
-      const base::Callback<void(double /*percent*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "GetScreenBrightnessPercent",
-        success_callback,
-        error_callback);
-  }
-
-  // The |style| arg must be one of the values:
-  //   power_manager::kBrightnessTransitionGradual or
-  //   power_manager::kBrightnessTransitionInstant.
-  bool SetScreenBrightnessPercent(
-      double in_percent,
-      int32_t in_style,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetScreenBrightnessPercent",
-        error,
-        in_percent,
-        in_style);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |style| arg must be one of the values:
-  //   power_manager::kBrightnessTransitionGradual or
-  //   power_manager::kBrightnessTransitionInstant.
-  void SetScreenBrightnessPercentAsync(
-      double in_percent,
-      int32_t in_style,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetScreenBrightnessPercent",
-        success_callback,
-        error_callback,
-        in_percent,
-        in_style);
-  }
-
-  bool DecreaseKeyboardBrightness(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "DecreaseKeyboardBrightness",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void DecreaseKeyboardBrightnessAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "DecreaseKeyboardBrightness",
-        success_callback,
-        error_callback);
-  }
-
-  bool IncreaseKeyboardBrightness(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "IncreaseKeyboardBrightness",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void IncreaseKeyboardBrightnessAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "IncreaseKeyboardBrightness",
-        success_callback,
-        error_callback);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerSupplyProperties protobuf.
-  bool GetPowerSupplyProperties(
-      std::vector<uint8_t>* out_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "GetPowerSupplyProperties",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_serialized_proto);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerSupplyProperties protobuf.
-  void GetPowerSupplyPropertiesAsync(
-      const base::Callback<void(const std::vector<uint8_t>& /*serialized_proto*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "GetPowerSupplyProperties",
-        success_callback,
-        error_callback);
-  }
-
-  bool HandleVideoActivity(
-      bool in_fullscreen,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleVideoActivity",
-        error,
-        in_fullscreen);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void HandleVideoActivityAsync(
-      bool in_fullscreen,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleVideoActivity",
-        success_callback,
-        error_callback,
-        in_fullscreen);
-  }
-
-  // The |type| arg is a power_manager::UserActivityType.
-  bool HandleUserActivity(
-      int32_t in_type,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleUserActivity",
-        error,
-        in_type);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |type| arg is a power_manager::UserActivityType.
-  void HandleUserActivityAsync(
-      int32_t in_type,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleUserActivity",
-        success_callback,
-        error_callback,
-        in_type);
-  }
-
-  bool SetIsProjecting(
-      bool in_is_projecting,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetIsProjecting",
-        error,
-        in_is_projecting);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void SetIsProjectingAsync(
-      bool in_is_projecting,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetIsProjecting",
-        success_callback,
-        error_callback,
-        in_is_projecting);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerManagementPolicy protobuf.
-  bool SetPolicy(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetPolicy",
-        error,
-        in_serialized_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::PowerManagementPolicy protobuf.
-  void SetPolicyAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetPolicy",
-        success_callback,
-        error_callback,
-        in_serialized_proto);
-  }
-
-  bool SetPowerSource(
-      const std::string& in_id,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetPowerSource",
-        error,
-        in_id);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void SetPowerSourceAsync(
-      const std::string& in_id,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "SetPowerSource",
-        success_callback,
-        error_callback,
-        in_id);
-  }
-
-  // The |timestamp_internal| arg is represented as the return value of
-  // base::TimeTicks::ToInternalValue().
-  bool HandlePowerButtonAcknowledgment(
-      int64_t in_timestamp_internal,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandlePowerButtonAcknowledgment",
-        error,
-        in_timestamp_internal);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |timestamp_internal| arg is represented as the return value of
-  // base::TimeTicks::ToInternalValue().
-  void HandlePowerButtonAcknowledgmentAsync(
-      int64_t in_timestamp_internal,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandlePowerButtonAcknowledgment",
-        success_callback,
-        error_callback,
-        in_timestamp_internal);
-  }
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  bool RegisterSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      std::vector<uint8_t>* out_serialized_reply_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RegisterSuspendDelay",
-        error,
-        in_serialized_request_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_serialized_reply_proto);
-  }
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  void RegisterSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      const base::Callback<void(const std::vector<uint8_t>& /*serialized_reply_proto*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RegisterSuspendDelay",
-        success_callback,
-        error_callback,
-        in_serialized_request_proto);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  bool UnregisterSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "UnregisterSuspendDelay",
-        error,
-        in_serialized_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  void UnregisterSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "UnregisterSuspendDelay",
-        success_callback,
-        error_callback,
-        in_serialized_proto);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  bool HandleSuspendReadiness(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleSuspendReadiness",
-        error,
-        in_serialized_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  void HandleSuspendReadinessAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleSuspendReadiness",
-        success_callback,
-        error_callback,
-        in_serialized_proto);
-  }
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  bool RegisterDarkSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      std::vector<uint8_t>* out_serialized_reply_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RegisterDarkSuspendDelay",
-        error,
-        in_serialized_request_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_serialized_reply_proto);
-  }
-
-  // The |serialized_request_proto| arg is a serialized
-  // power_manager::RegisterSuspendDelayRequest protobuf.
-  // The |serialized_reply_proto| arg is a serialized
-  // RegisterSuspendDelayReply protobuf.
-  void RegisterDarkSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_request_proto,
-      const base::Callback<void(const std::vector<uint8_t>& /*serialized_reply_proto*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RegisterDarkSuspendDelay",
-        success_callback,
-        error_callback,
-        in_serialized_request_proto);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  bool UnregisterDarkSuspendDelay(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "UnregisterDarkSuspendDelay",
-        error,
-        in_serialized_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::UnregisterSuspendDelayRequest protobuf.
-  void UnregisterDarkSuspendDelayAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "UnregisterDarkSuspendDelay",
-        success_callback,
-        error_callback,
-        in_serialized_proto);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  bool HandleDarkSuspendReadiness(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleDarkSuspendReadiness",
-        error,
-        in_serialized_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::SuspendReadinessInfo protobuf.
-  void HandleDarkSuspendReadinessAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "HandleDarkSuspendReadiness",
-        success_callback,
-        error_callback,
-        in_serialized_proto);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::DarkResumeWakeReason protobuf.
-  bool RecordDarkResumeWakeReason(
-      const std::vector<uint8_t>& in_serialized_proto,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RecordDarkResumeWakeReason",
-        error,
-        in_serialized_proto);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  // The |serialized_proto| arg is a serialized
-  // power_manager::DarkResumeWakeReason protobuf.
-  void RecordDarkResumeWakeReasonAsync(
-      const std::vector<uint8_t>& in_serialized_proto,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.PowerManager",
-        "RecordDarkResumeWakeReason",
-        success_callback,
-        error_callback,
-        in_serialized_proto);
-  }
-
- private:
-  scoped_refptr<dbus::Bus> bus_;
-  const std::string service_name_{"org.chromium.PowerManager"};
-  const dbus::ObjectPath object_path_{"/org/chromium/PowerManager"};
-  dbus::ObjectProxy* dbus_object_proxy_;
-
-  DISALLOW_COPY_AND_ASSIGN(PowerManagerProxy);
-};
-
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_TMP_PORTAGE_CHROMEOS_BASE_POWER_MANAGER_9999_WORK_BUILD_OUT_DEFAULT_GEN_INCLUDE_POWER_MANAGER_DBUS_PROXIES_H
diff --git a/include/power_manager/dbus-proxy-mocks.h b/include/power_manager/dbus-proxy-mocks.h
deleted file mode 100644
index d4e3dd0..0000000
--- a/include/power_manager/dbus-proxy-mocks.h
+++ /dev/null
@@ -1,266 +0,0 @@
-// Automatic generation of D-Bus interface mock proxies for:
-//  - org.chromium.PowerManager
-#ifndef ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_TMP_PORTAGE_CHROMEOS_BASE_POWER_MANAGER_9999_WORK_BUILD_OUT_DEFAULT_GEN_INCLUDE_POWER_MANAGER_DBUS_PROXY_MOCKS_H
-#define ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_TMP_PORTAGE_CHROMEOS_BASE_POWER_MANAGER_9999_WORK_BUILD_OUT_DEFAULT_GEN_INCLUDE_POWER_MANAGER_DBUS_PROXY_MOCKS_H
-#include <string>
-#include <vector>
-
-#include <base/callback_forward.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <brillo/any.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <gmock/gmock.h>
-
-#include "power_manager/dbus-proxies.h"
-
-namespace org {
-namespace chromium {
-
-// Mock object for PowerManagerProxyInterface.
-class PowerManagerProxyMock : public PowerManagerProxyInterface {
- public:
-  PowerManagerProxyMock() = default;
-
-  MOCK_METHOD2(RequestShutdown,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RequestShutdownAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RequestRestart,
-               bool(int32_t /*in_reason*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RequestRestartAsync,
-               void(int32_t /*in_reason*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RequestSuspend,
-               bool(uint64_t /*in_external_wakeup_count*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RequestSuspendAsync,
-               void(uint64_t /*in_external_wakeup_count*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(DecreaseScreenBrightness,
-               bool(bool /*in_allow_off*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(DecreaseScreenBrightnessAsync,
-               void(bool /*in_allow_off*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(IncreaseScreenBrightness,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(IncreaseScreenBrightnessAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetScreenBrightnessPercent,
-               bool(double* /*out_percent*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetScreenBrightnessPercentAsync,
-               void(const base::Callback<void(double /*percent*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetScreenBrightnessPercent,
-               bool(double /*in_percent*/,
-                    int32_t /*in_style*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(SetScreenBrightnessPercentAsync,
-               void(double /*in_percent*/,
-                    int32_t /*in_style*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(DecreaseKeyboardBrightness,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(DecreaseKeyboardBrightnessAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(IncreaseKeyboardBrightness,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(IncreaseKeyboardBrightnessAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetPowerSupplyProperties,
-               bool(std::vector<uint8_t>* /*out_serialized_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetPowerSupplyPropertiesAsync,
-               void(const base::Callback<void(const std::vector<uint8_t>& /*serialized_proto*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleVideoActivity,
-               bool(bool /*in_fullscreen*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(HandleVideoActivityAsync,
-               void(bool /*in_fullscreen*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleUserActivity,
-               bool(int32_t /*in_type*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(HandleUserActivityAsync,
-               void(int32_t /*in_type*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetIsProjecting,
-               bool(bool /*in_is_projecting*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetIsProjectingAsync,
-               void(bool /*in_is_projecting*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetPolicy,
-               bool(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetPolicyAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetPowerSource,
-               bool(const std::string& /*in_id*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetPowerSourceAsync,
-               void(const std::string& /*in_id*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandlePowerButtonAcknowledgment,
-               bool(int64_t /*in_timestamp_internal*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(HandlePowerButtonAcknowledgmentAsync,
-               void(int64_t /*in_timestamp_internal*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RegisterSuspendDelay,
-               bool(const std::vector<uint8_t>& /*in_serialized_request_proto*/,
-                    std::vector<uint8_t>* /*out_serialized_reply_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RegisterSuspendDelayAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_request_proto*/,
-                    const base::Callback<void(const std::vector<uint8_t>& /*serialized_reply_proto*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(UnregisterSuspendDelay,
-               bool(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(UnregisterSuspendDelayAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleSuspendReadiness,
-               bool(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(HandleSuspendReadinessAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RegisterDarkSuspendDelay,
-               bool(const std::vector<uint8_t>& /*in_serialized_request_proto*/,
-                    std::vector<uint8_t>* /*out_serialized_reply_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RegisterDarkSuspendDelayAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_request_proto*/,
-                    const base::Callback<void(const std::vector<uint8_t>& /*serialized_reply_proto*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(UnregisterDarkSuspendDelay,
-               bool(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(UnregisterDarkSuspendDelayAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleDarkSuspendReadiness,
-               bool(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(HandleDarkSuspendReadinessAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RecordDarkResumeWakeReason,
-               bool(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RecordDarkResumeWakeReasonAsync,
-               void(const std::vector<uint8_t>& /*in_serialized_proto*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(RegisterBrightnessChangedSignalHandler,
-               void(const base::Callback<void(int32_t,
-                                              bool)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterKeyboardBrightnessChangedSignalHandler,
-               void(const base::Callback<void(int32_t,
-                                              bool)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterPeripheralBatteryStatusSignalHandler,
-               void(const base::Callback<void(const std::vector<uint8_t>&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterPowerSupplyPollSignalHandler,
-               void(const base::Callback<void(const std::vector<uint8_t>&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterSuspendImminentSignalHandler,
-               void(const base::Callback<void(const std::vector<uint8_t>&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterSuspendDoneSignalHandler,
-               void(const base::Callback<void(const std::vector<uint8_t>&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterDarkSuspendImminentSignalHandler,
-               void(const base::Callback<void(const std::vector<uint8_t>&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterInputEventSignalHandler,
-               void(const base::Callback<void(const std::vector<uint8_t>&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterIdleActionImminentSignalHandler,
-               void(const base::Callback<void(const std::vector<uint8_t>&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterIdleActionDeferredSignalHandler,
-               void(const base::Closure& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(PowerManagerProxyMock);
-};
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_TMP_PORTAGE_CHROMEOS_BASE_POWER_MANAGER_9999_WORK_BUILD_OUT_DEFAULT_GEN_INCLUDE_POWER_MANAGER_DBUS_PROXY_MOCKS_H
diff --git a/include/session_manager/dbus-proxies.h b/include/session_manager/dbus-proxies.h
deleted file mode 100644
index 2ca0128..0000000
--- a/include/session_manager/dbus-proxies.h
+++ /dev/null
@@ -1,1065 +0,0 @@
-// Automatic generation of D-Bus interfaces:
-//  - org.chromium.SessionManagerInterface
-#ifndef ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_CHROMEOS_LOGIN_OUT_DEFAULT_GEN_INCLUDE_SESSION_MANAGER_DBUS_PROXIES_H
-#define ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_CHROMEOS_LOGIN_OUT_DEFAULT_GEN_INCLUDE_SESSION_MANAGER_DBUS_PROXIES_H
-#include <memory>
-#include <string>
-#include <vector>
-
-#include <base/bind.h>
-#include <base/callback.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <base/memory/ref_counted.h>
-#include <brillo/any.h>
-#include <brillo/dbus/dbus_method_invoker.h>
-#include <brillo/dbus/dbus_property.h>
-#include <brillo/dbus/dbus_signal_handler.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <dbus/bus.h>
-#include <dbus/message.h>
-#include <dbus/object_manager.h>
-#include <dbus/object_path.h>
-#include <dbus/object_proxy.h>
-
-namespace org {
-namespace chromium {
-
-// Abstract interface proxy for org::chromium::SessionManagerInterface.
-class SessionManagerInterfaceProxyInterface {
- public:
-  virtual ~SessionManagerInterfaceProxyInterface() = default;
-
-  virtual bool EmitLoginPromptVisible(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void EmitLoginPromptVisibleAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool EnableChromeTesting(
-      bool in_force_relaunch,
-      const std::vector<std::string>& in_extra_arguments,
-      std::string* out_filepath,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void EnableChromeTestingAsync(
-      bool in_force_relaunch,
-      const std::vector<std::string>& in_extra_arguments,
-      const base::Callback<void(const std::string& /*filepath*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool StartSession(
-      const std::string& in_email_address,
-      const std::string& in_unique_identifier,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void StartSessionAsync(
-      const std::string& in_email_address,
-      const std::string& in_unique_identifier,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool StopSession(
-      const std::string& in_unique_identifier,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void StopSessionAsync(
-      const std::string& in_unique_identifier,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool StorePolicy(
-      const std::vector<uint8_t>& in_policy_blob,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void StorePolicyAsync(
-      const std::vector<uint8_t>& in_policy_blob,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool RetrievePolicy(
-      std::vector<uint8_t>* out_policy_blob,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RetrievePolicyAsync(
-      const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool StorePolicyForUser(
-      const std::string& in_user_email,
-      const std::vector<uint8_t>& in_policy_blob,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void StorePolicyForUserAsync(
-      const std::string& in_user_email,
-      const std::vector<uint8_t>& in_policy_blob,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool RetrievePolicyForUser(
-      const std::string& in_user_email,
-      std::vector<uint8_t>* out_policy_blob,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RetrievePolicyForUserAsync(
-      const std::string& in_user_email,
-      const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool StoreDeviceLocalAccountPolicy(
-      const std::string& in_account_id,
-      const std::vector<uint8_t>& in_policy_blob,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void StoreDeviceLocalAccountPolicyAsync(
-      const std::string& in_account_id,
-      const std::vector<uint8_t>& in_policy_blob,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool RetrieveDeviceLocalAccountPolicy(
-      const std::string& in_account_id,
-      std::vector<uint8_t>* out_policy_blob,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RetrieveDeviceLocalAccountPolicyAsync(
-      const std::string& in_account_id,
-      const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool RetrieveSessionState(
-      std::string* out_state,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RetrieveSessionStateAsync(
-      const base::Callback<void(const std::string& /*state*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool RetrieveActiveSessions(
-      std::map<std::string, std::string>* out_sessions,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RetrieveActiveSessionsAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*sessions*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool HandleSupervisedUserCreationStarting(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void HandleSupervisedUserCreationStartingAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool HandleSupervisedUserCreationFinished(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void HandleSupervisedUserCreationFinishedAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool LockScreen(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void LockScreenAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool HandleLockScreenShown(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void HandleLockScreenShownAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool HandleLockScreenDismissed(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void HandleLockScreenDismissedAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool RestartJob(
-      const dbus::FileDescriptor& in_cred_fd,
-      const std::vector<std::string>& in_argv,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RestartJobAsync(
-      const dbus::FileDescriptor& in_cred_fd,
-      const std::vector<std::string>& in_argv,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool StartDeviceWipe(
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void StartDeviceWipeAsync(
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool SetFlagsForUser(
-      const std::string& in_user_email,
-      const std::vector<std::string>& in_flags,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void SetFlagsForUserAsync(
-      const std::string& in_user_email,
-      const std::vector<std::string>& in_flags,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool GetServerBackedStateKeys(
-      std::vector<std::vector<uint8_t>>* out_state_keys,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void GetServerBackedStateKeysAsync(
-      const base::Callback<void(const std::vector<std::vector<uint8_t>>& /*state_keys*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual bool InitMachineInfo(
-      const std::string& in_data,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void InitMachineInfoAsync(
-      const std::string& in_data,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
-
-  virtual void RegisterLoginPromptVisibleSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterSessionStateChangedSignalHandler(
-      const base::Callback<void(const std::string&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterSetOwnerKeyCompleteSignalHandler(
-      const base::Callback<void(const std::string&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterPropertyChangeCompleteSignalHandler(
-      const base::Callback<void(const std::string&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterScreenIsLockedSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-
-  virtual void RegisterScreenIsUnlockedSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
-};
-
-}  // namespace chromium
-}  // namespace org
-
-namespace org {
-namespace chromium {
-
-// Interface proxy for org::chromium::SessionManagerInterface.
-class SessionManagerInterfaceProxy final : public SessionManagerInterfaceProxyInterface {
- public:
-  SessionManagerInterfaceProxy(const scoped_refptr<dbus::Bus>& bus) :
-      bus_{bus},
-      dbus_object_proxy_{
-          bus_->GetObjectProxy(service_name_, object_path_)} {
-  }
-
-  ~SessionManagerInterfaceProxy() override {
-    bus_->RemoveObjectProxy(
-        service_name_, object_path_, base::Bind(&base::DoNothing));
-  }
-
-  void RegisterLoginPromptVisibleSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "LoginPromptVisible",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterSessionStateChangedSignalHandler(
-      const base::Callback<void(const std::string&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "SessionStateChanged",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterSetOwnerKeyCompleteSignalHandler(
-      const base::Callback<void(const std::string&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "SetOwnerKeyComplete",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterPropertyChangeCompleteSignalHandler(
-      const base::Callback<void(const std::string&)>& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "PropertyChangeComplete",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterScreenIsLockedSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "ScreenIsLocked",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void RegisterScreenIsUnlockedSignalHandler(
-      const base::Closure& signal_callback,
-      dbus::ObjectProxy::OnConnectedCallback on_connected_callback) override {
-    brillo::dbus_utils::ConnectToSignal(
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "ScreenIsUnlocked",
-        signal_callback,
-        on_connected_callback);
-  }
-
-  void ReleaseObjectProxy(const base::Closure& callback) {
-    bus_->RemoveObjectProxy(service_name_, object_path_, callback);
-  }
-
-  const dbus::ObjectPath& GetObjectPath() const {
-    return object_path_;
-  }
-
-  dbus::ObjectProxy* GetObjectProxy() const { return dbus_object_proxy_; }
-
-  bool EmitLoginPromptVisible(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "EmitLoginPromptVisible",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void EmitLoginPromptVisibleAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "EmitLoginPromptVisible",
-        success_callback,
-        error_callback);
-  }
-
-  bool EnableChromeTesting(
-      bool in_force_relaunch,
-      const std::vector<std::string>& in_extra_arguments,
-      std::string* out_filepath,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "EnableChromeTesting",
-        error,
-        in_force_relaunch,
-        in_extra_arguments);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_filepath);
-  }
-
-  void EnableChromeTestingAsync(
-      bool in_force_relaunch,
-      const std::vector<std::string>& in_extra_arguments,
-      const base::Callback<void(const std::string& /*filepath*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "EnableChromeTesting",
-        success_callback,
-        error_callback,
-        in_force_relaunch,
-        in_extra_arguments);
-  }
-
-  bool StartSession(
-      const std::string& in_email_address,
-      const std::string& in_unique_identifier,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StartSession",
-        error,
-        in_email_address,
-        in_unique_identifier);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_done);
-  }
-
-  void StartSessionAsync(
-      const std::string& in_email_address,
-      const std::string& in_unique_identifier,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StartSession",
-        success_callback,
-        error_callback,
-        in_email_address,
-        in_unique_identifier);
-  }
-
-  bool StopSession(
-      const std::string& in_unique_identifier,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StopSession",
-        error,
-        in_unique_identifier);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_done);
-  }
-
-  void StopSessionAsync(
-      const std::string& in_unique_identifier,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StopSession",
-        success_callback,
-        error_callback,
-        in_unique_identifier);
-  }
-
-  bool StorePolicy(
-      const std::vector<uint8_t>& in_policy_blob,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StorePolicy",
-        error,
-        in_policy_blob);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_done);
-  }
-
-  void StorePolicyAsync(
-      const std::vector<uint8_t>& in_policy_blob,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StorePolicy",
-        success_callback,
-        error_callback,
-        in_policy_blob);
-  }
-
-  bool RetrievePolicy(
-      std::vector<uint8_t>* out_policy_blob,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrievePolicy",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_policy_blob);
-  }
-
-  void RetrievePolicyAsync(
-      const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrievePolicy",
-        success_callback,
-        error_callback);
-  }
-
-  bool StorePolicyForUser(
-      const std::string& in_user_email,
-      const std::vector<uint8_t>& in_policy_blob,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StorePolicyForUser",
-        error,
-        in_user_email,
-        in_policy_blob);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_done);
-  }
-
-  void StorePolicyForUserAsync(
-      const std::string& in_user_email,
-      const std::vector<uint8_t>& in_policy_blob,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StorePolicyForUser",
-        success_callback,
-        error_callback,
-        in_user_email,
-        in_policy_blob);
-  }
-
-  bool RetrievePolicyForUser(
-      const std::string& in_user_email,
-      std::vector<uint8_t>* out_policy_blob,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrievePolicyForUser",
-        error,
-        in_user_email);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_policy_blob);
-  }
-
-  void RetrievePolicyForUserAsync(
-      const std::string& in_user_email,
-      const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrievePolicyForUser",
-        success_callback,
-        error_callback,
-        in_user_email);
-  }
-
-  bool StoreDeviceLocalAccountPolicy(
-      const std::string& in_account_id,
-      const std::vector<uint8_t>& in_policy_blob,
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StoreDeviceLocalAccountPolicy",
-        error,
-        in_account_id,
-        in_policy_blob);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_done);
-  }
-
-  void StoreDeviceLocalAccountPolicyAsync(
-      const std::string& in_account_id,
-      const std::vector<uint8_t>& in_policy_blob,
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StoreDeviceLocalAccountPolicy",
-        success_callback,
-        error_callback,
-        in_account_id,
-        in_policy_blob);
-  }
-
-  bool RetrieveDeviceLocalAccountPolicy(
-      const std::string& in_account_id,
-      std::vector<uint8_t>* out_policy_blob,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrieveDeviceLocalAccountPolicy",
-        error,
-        in_account_id);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_policy_blob);
-  }
-
-  void RetrieveDeviceLocalAccountPolicyAsync(
-      const std::string& in_account_id,
-      const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrieveDeviceLocalAccountPolicy",
-        success_callback,
-        error_callback,
-        in_account_id);
-  }
-
-  bool RetrieveSessionState(
-      std::string* out_state,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrieveSessionState",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_state);
-  }
-
-  void RetrieveSessionStateAsync(
-      const base::Callback<void(const std::string& /*state*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrieveSessionState",
-        success_callback,
-        error_callback);
-  }
-
-  bool RetrieveActiveSessions(
-      std::map<std::string, std::string>* out_sessions,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrieveActiveSessions",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_sessions);
-  }
-
-  void RetrieveActiveSessionsAsync(
-      const base::Callback<void(const std::map<std::string, std::string>& /*sessions*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RetrieveActiveSessions",
-        success_callback,
-        error_callback);
-  }
-
-  bool HandleSupervisedUserCreationStarting(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleSupervisedUserCreationStarting",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void HandleSupervisedUserCreationStartingAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleSupervisedUserCreationStarting",
-        success_callback,
-        error_callback);
-  }
-
-  bool HandleSupervisedUserCreationFinished(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleSupervisedUserCreationFinished",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void HandleSupervisedUserCreationFinishedAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleSupervisedUserCreationFinished",
-        success_callback,
-        error_callback);
-  }
-
-  bool LockScreen(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "LockScreen",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void LockScreenAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "LockScreen",
-        success_callback,
-        error_callback);
-  }
-
-  bool HandleLockScreenShown(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleLockScreenShown",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void HandleLockScreenShownAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleLockScreenShown",
-        success_callback,
-        error_callback);
-  }
-
-  bool HandleLockScreenDismissed(
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleLockScreenDismissed",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void HandleLockScreenDismissedAsync(
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "HandleLockScreenDismissed",
-        success_callback,
-        error_callback);
-  }
-
-  bool RestartJob(
-      const dbus::FileDescriptor& in_cred_fd,
-      const std::vector<std::string>& in_argv,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RestartJob",
-        error,
-        in_cred_fd,
-        in_argv);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void RestartJobAsync(
-      const dbus::FileDescriptor& in_cred_fd,
-      const std::vector<std::string>& in_argv,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "RestartJob",
-        success_callback,
-        error_callback,
-        in_cred_fd,
-        in_argv);
-  }
-
-  bool StartDeviceWipe(
-      bool* out_done,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StartDeviceWipe",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_done);
-  }
-
-  void StartDeviceWipeAsync(
-      const base::Callback<void(bool /*done*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "StartDeviceWipe",
-        success_callback,
-        error_callback);
-  }
-
-  bool SetFlagsForUser(
-      const std::string& in_user_email,
-      const std::vector<std::string>& in_flags,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "SetFlagsForUser",
-        error,
-        in_user_email,
-        in_flags);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void SetFlagsForUserAsync(
-      const std::string& in_user_email,
-      const std::vector<std::string>& in_flags,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "SetFlagsForUser",
-        success_callback,
-        error_callback,
-        in_user_email,
-        in_flags);
-  }
-
-  bool GetServerBackedStateKeys(
-      std::vector<std::vector<uint8_t>>* out_state_keys,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "GetServerBackedStateKeys",
-        error);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error, out_state_keys);
-  }
-
-  void GetServerBackedStateKeysAsync(
-      const base::Callback<void(const std::vector<std::vector<uint8_t>>& /*state_keys*/)>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "GetServerBackedStateKeys",
-        success_callback,
-        error_callback);
-  }
-
-  bool InitMachineInfo(
-      const std::string& in_data,
-      brillo::ErrorPtr* error,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    auto response = brillo::dbus_utils::CallMethodAndBlockWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "InitMachineInfo",
-        error,
-        in_data);
-    return response && brillo::dbus_utils::ExtractMethodCallResults(
-        response.get(), error);
-  }
-
-  void InitMachineInfoAsync(
-      const std::string& in_data,
-      const base::Callback<void()>& success_callback,
-      const base::Callback<void(brillo::Error*)>& error_callback,
-      int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) override {
-    brillo::dbus_utils::CallMethodWithTimeout(
-        timeout_ms,
-        dbus_object_proxy_,
-        "org.chromium.SessionManagerInterface",
-        "InitMachineInfo",
-        success_callback,
-        error_callback,
-        in_data);
-  }
-
- private:
-  scoped_refptr<dbus::Bus> bus_;
-  const std::string service_name_{"org.chromium.SessionManager"};
-  const dbus::ObjectPath object_path_{"/org/chromium/SessionManager"};
-  dbus::ObjectProxy* dbus_object_proxy_;
-
-  DISALLOW_COPY_AND_ASSIGN(SessionManagerInterfaceProxy);
-};
-
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_CHROMEOS_LOGIN_OUT_DEFAULT_GEN_INCLUDE_SESSION_MANAGER_DBUS_PROXIES_H
diff --git a/include/session_manager/dbus-proxy-mocks.h b/include/session_manager/dbus-proxy-mocks.h
deleted file mode 100644
index 2b6ce4d..0000000
--- a/include/session_manager/dbus-proxy-mocks.h
+++ /dev/null
@@ -1,252 +0,0 @@
-// Automatic generation of D-Bus interface mock proxies for:
-//  - org.chromium.SessionManagerInterface
-#ifndef ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_CHROMEOS_LOGIN_OUT_DEFAULT_GEN_INCLUDE_SESSION_MANAGER_DBUS_PROXY_MOCKS_H
-#define ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_CHROMEOS_LOGIN_OUT_DEFAULT_GEN_INCLUDE_SESSION_MANAGER_DBUS_PROXY_MOCKS_H
-#include <string>
-#include <vector>
-
-#include <base/callback_forward.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <brillo/any.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <gmock/gmock.h>
-
-#include "session_manager/dbus-proxies.h"
-
-namespace org {
-namespace chromium {
-
-// Mock object for SessionManagerInterfaceProxyInterface.
-class SessionManagerInterfaceProxyMock : public SessionManagerInterfaceProxyInterface {
- public:
-  SessionManagerInterfaceProxyMock() = default;
-
-  MOCK_METHOD2(EmitLoginPromptVisible,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(EmitLoginPromptVisibleAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(EnableChromeTesting,
-               bool(bool /*in_force_relaunch*/,
-                    const std::vector<std::string>& /*in_extra_arguments*/,
-                    std::string* /*out_filepath*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(EnableChromeTestingAsync,
-               void(bool /*in_force_relaunch*/,
-                    const std::vector<std::string>& /*in_extra_arguments*/,
-                    const base::Callback<void(const std::string& /*filepath*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(StartSession,
-               bool(const std::string& /*in_email_address*/,
-                    const std::string& /*in_unique_identifier*/,
-                    bool* /*out_done*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(StartSessionAsync,
-               void(const std::string& /*in_email_address*/,
-                    const std::string& /*in_unique_identifier*/,
-                    const base::Callback<void(bool /*done*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(StopSession,
-               bool(const std::string& /*in_unique_identifier*/,
-                    bool* /*out_done*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(StopSessionAsync,
-               void(const std::string& /*in_unique_identifier*/,
-                    const base::Callback<void(bool /*done*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(StorePolicy,
-               bool(const std::vector<uint8_t>& /*in_policy_blob*/,
-                    bool* /*out_done*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(StorePolicyAsync,
-               void(const std::vector<uint8_t>& /*in_policy_blob*/,
-                    const base::Callback<void(bool /*done*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RetrievePolicy,
-               bool(std::vector<uint8_t>* /*out_policy_blob*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RetrievePolicyAsync,
-               void(const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(StorePolicyForUser,
-               bool(const std::string& /*in_user_email*/,
-                    const std::vector<uint8_t>& /*in_policy_blob*/,
-                    bool* /*out_done*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(StorePolicyForUserAsync,
-               void(const std::string& /*in_user_email*/,
-                    const std::vector<uint8_t>& /*in_policy_blob*/,
-                    const base::Callback<void(bool /*done*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RetrievePolicyForUser,
-               bool(const std::string& /*in_user_email*/,
-                    std::vector<uint8_t>* /*out_policy_blob*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RetrievePolicyForUserAsync,
-               void(const std::string& /*in_user_email*/,
-                    const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(StoreDeviceLocalAccountPolicy,
-               bool(const std::string& /*in_account_id*/,
-                    const std::vector<uint8_t>& /*in_policy_blob*/,
-                    bool* /*out_done*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(StoreDeviceLocalAccountPolicyAsync,
-               void(const std::string& /*in_account_id*/,
-                    const std::vector<uint8_t>& /*in_policy_blob*/,
-                    const base::Callback<void(bool /*done*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RetrieveDeviceLocalAccountPolicy,
-               bool(const std::string& /*in_account_id*/,
-                    std::vector<uint8_t>* /*out_policy_blob*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RetrieveDeviceLocalAccountPolicyAsync,
-               void(const std::string& /*in_account_id*/,
-                    const base::Callback<void(const std::vector<uint8_t>& /*policy_blob*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RetrieveSessionState,
-               bool(std::string* /*out_state*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RetrieveSessionStateAsync,
-               void(const base::Callback<void(const std::string& /*state*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RetrieveActiveSessions,
-               bool(std::map<std::string, std::string>* /*out_sessions*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RetrieveActiveSessionsAsync,
-               void(const base::Callback<void(const std::map<std::string, std::string>& /*sessions*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(HandleSupervisedUserCreationStarting,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleSupervisedUserCreationStartingAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(HandleSupervisedUserCreationFinished,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleSupervisedUserCreationFinishedAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(LockScreen,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(LockScreenAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(HandleLockScreenShown,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleLockScreenShownAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(HandleLockScreenDismissed,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(HandleLockScreenDismissedAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RestartJob,
-               bool(const dbus::FileDescriptor& /*in_cred_fd*/,
-                    const std::vector<std::string>& /*in_argv*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(RestartJobAsync,
-               void(const dbus::FileDescriptor& /*in_cred_fd*/,
-                    const std::vector<std::string>& /*in_argv*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(StartDeviceWipe,
-               bool(bool* /*out_done*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(StartDeviceWipeAsync,
-               void(const base::Callback<void(bool /*done*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetFlagsForUser,
-               bool(const std::string& /*in_user_email*/,
-                    const std::vector<std::string>& /*in_flags*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(SetFlagsForUserAsync,
-               void(const std::string& /*in_user_email*/,
-                    const std::vector<std::string>& /*in_flags*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetServerBackedStateKeys,
-               bool(std::vector<std::vector<uint8_t>>* /*out_state_keys*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetServerBackedStateKeysAsync,
-               void(const base::Callback<void(const std::vector<std::vector<uint8_t>>& /*state_keys*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(InitMachineInfo,
-               bool(const std::string& /*in_data*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(InitMachineInfoAsync,
-               void(const std::string& /*in_data*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(RegisterLoginPromptVisibleSignalHandler,
-               void(const base::Closure& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterSessionStateChangedSignalHandler,
-               void(const base::Callback<void(const std::string&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterSetOwnerKeyCompleteSignalHandler,
-               void(const base::Callback<void(const std::string&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterPropertyChangeCompleteSignalHandler,
-               void(const base::Callback<void(const std::string&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterScreenIsLockedSignalHandler,
-               void(const base::Closure& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterScreenIsUnlockedSignalHandler,
-               void(const base::Closure& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SessionManagerInterfaceProxyMock);
-};
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING____________________BUILD_LINK_VAR_CACHE_PORTAGE_CHROMEOS_BASE_CHROMEOS_LOGIN_OUT_DEFAULT_GEN_INCLUDE_SESSION_MANAGER_DBUS_PROXY_MOCKS_H
diff --git a/include/shill/dbus-proxy-mocks.h b/include/shill/dbus-proxy-mocks.h
deleted file mode 100644
index e5d52f7..0000000
--- a/include/shill/dbus-proxy-mocks.h
+++ /dev/null
@@ -1,549 +0,0 @@
-// Automatic generation of D-Bus interface mock proxies for:
-//  - org.chromium.flimflam.Manager
-//  - org.chromium.flimflam.Service
-#ifndef ____CHROMEOS_DBUS_BINDING___UPDATE_ENGINE_INCLUDE_SHILL_DBUS_PROXY_MOCKS_H
-#define ____CHROMEOS_DBUS_BINDING___UPDATE_ENGINE_INCLUDE_SHILL_DBUS_PROXY_MOCKS_H
-#include <string>
-#include <vector>
-
-#include <base/callback_forward.h>
-#include <base/logging.h>
-#include <base/macros.h>
-#include <brillo/any.h>
-#include <brillo/errors/error.h>
-#include <brillo/variant_dictionary.h>
-#include <gmock/gmock.h>
-
-#include "shill/dbus-proxies.h"
-
-namespace org {
-namespace chromium {
-namespace flimflam {
-
-// Mock object for ManagerProxyInterface.
-class ManagerProxyMock : public ManagerProxyInterface {
- public:
-  ManagerProxyMock() = default;
-
-  MOCK_METHOD3(GetProperties,
-               bool(brillo::VariantDictionary*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetPropertiesAsync,
-               void(const base::Callback<void(const brillo::VariantDictionary&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetProperty,
-               bool(const std::string&,
-                    const brillo::Any&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(SetPropertyAsync,
-               void(const std::string&,
-                    const brillo::Any&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetState,
-               bool(std::string*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetStateAsync,
-               void(const base::Callback<void(const std::string&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(CreateProfile,
-               bool(const std::string&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(CreateProfileAsync,
-               void(const std::string&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RemoveProfile,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RemoveProfileAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(PushProfile,
-               bool(const std::string&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(PushProfileAsync,
-               void(const std::string&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(InsertUserProfile,
-               bool(const std::string&,
-                    const std::string&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(InsertUserProfileAsync,
-               void(const std::string&,
-                    const std::string&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(PopProfile,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(PopProfileAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(PopAnyProfile,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(PopAnyProfileAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(PopAllUserProfiles,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(PopAllUserProfilesAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(RecheckPortal,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RecheckPortalAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RequestScan,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(RequestScanAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(EnableTechnology,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(EnableTechnologyAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(DisableTechnology,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(DisableTechnologyAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetService,
-               bool(const brillo::VariantDictionary&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetServiceAsync,
-               void(const brillo::VariantDictionary&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetWifiService,
-               bool(const brillo::VariantDictionary&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetWifiServiceAsync,
-               void(const brillo::VariantDictionary&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ConfigureService,
-               bool(const brillo::VariantDictionary&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ConfigureServiceAsync,
-               void(const brillo::VariantDictionary&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(ConfigureServiceForProfile,
-               bool(const dbus::ObjectPath&,
-                    const brillo::VariantDictionary&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(ConfigureServiceForProfileAsync,
-               void(const dbus::ObjectPath&,
-                    const brillo::VariantDictionary&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(FindMatchingService,
-               bool(const brillo::VariantDictionary&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(FindMatchingServiceAsync,
-               void(const brillo::VariantDictionary&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetVPNService,
-               bool(const brillo::VariantDictionary&,
-                    dbus::ObjectPath*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(GetVPNServiceAsync,
-               void(const brillo::VariantDictionary&,
-                    const base::Callback<void(const dbus::ObjectPath&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetDebugLevel,
-               bool(int32_t*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetDebugLevelAsync,
-               void(const base::Callback<void(int32_t)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetDebugLevel,
-               bool(int32_t,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetDebugLevelAsync,
-               void(int32_t,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetServiceOrder,
-               bool(std::string*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetServiceOrderAsync,
-               void(const base::Callback<void(const std::string&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetServiceOrder,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetServiceOrderAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetDebugTags,
-               bool(std::string*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetDebugTagsAsync,
-               void(const base::Callback<void(const std::string&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetDebugTags,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetDebugTagsAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(ListDebugTags,
-               bool(std::string*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(ListDebugTagsAsync,
-               void(const base::Callback<void(const std::string&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetNetworksForGeolocation,
-               bool(brillo::VariantDictionary*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetNetworksForGeolocationAsync,
-               void(const base::Callback<void(const brillo::VariantDictionary&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD10(VerifyDestination,
-                bool(const std::string& /*in_certificate*/,
-                     const std::string& /*in_public_key*/,
-                     const std::string& /*in_nonce*/,
-                     const std::string& /*in_signed_data*/,
-                     const std::string& /*in_destination_udn*/,
-                     const std::string& /*in_hotspot_ssid*/,
-                     const std::string& /*in_hotspot_bssid*/,
-                     bool*,
-                     brillo::ErrorPtr* /*error*/,
-                     int /*timeout_ms*/));
-  MOCK_METHOD10(VerifyDestinationAsync,
-                void(const std::string& /*in_certificate*/,
-                     const std::string& /*in_public_key*/,
-                     const std::string& /*in_nonce*/,
-                     const std::string& /*in_signed_data*/,
-                     const std::string& /*in_destination_udn*/,
-                     const std::string& /*in_hotspot_ssid*/,
-                     const std::string& /*in_hotspot_bssid*/,
-                     const base::Callback<void(bool)>& /*success_callback*/,
-                     const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                     int /*timeout_ms*/));
-  bool VerifyAndEncryptCredentials(const std::string& /*in_certificate*/,
-                                   const std::string& /*in_public_key*/,
-                                   const std::string& /*in_nonce*/,
-                                   const std::string& /*in_signed_data*/,
-                                   const std::string& /*in_destination_udn*/,
-                                   const std::string& /*in_hotspot_ssid*/,
-                                   const std::string& /*in_hotspot_bssid*/,
-                                   const dbus::ObjectPath& /*in_network*/,
-                                   std::string*,
-                                   brillo::ErrorPtr* /*error*/,
-                                   int /*timeout_ms*/) override {
-    LOG(WARNING) << "VerifyAndEncryptCredentials(): gmock can't handle methods with 11 arguments. You can override this method in a subclass if you need to.";
-    return false;
-  }
-  void VerifyAndEncryptCredentialsAsync(const std::string& /*in_certificate*/,
-                                        const std::string& /*in_public_key*/,
-                                        const std::string& /*in_nonce*/,
-                                        const std::string& /*in_signed_data*/,
-                                        const std::string& /*in_destination_udn*/,
-                                        const std::string& /*in_hotspot_ssid*/,
-                                        const std::string& /*in_hotspot_bssid*/,
-                                        const dbus::ObjectPath& /*in_network*/,
-                                        const base::Callback<void(const std::string&)>& /*success_callback*/,
-                                        const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                                        int /*timeout_ms*/) override {
-    LOG(WARNING) << "VerifyAndEncryptCredentialsAsync(): gmock can't handle methods with 11 arguments. You can override this method in a subclass if you need to.";
-  }
-  bool VerifyAndEncryptData(const std::string& /*in_certificate*/,
-                            const std::string& /*in_public_key*/,
-                            const std::string& /*in_nonce*/,
-                            const std::string& /*in_signed_data*/,
-                            const std::string& /*in_destination_udn*/,
-                            const std::string& /*in_hotspot_ssid*/,
-                            const std::string& /*in_hotspot_bssid*/,
-                            const std::string& /*in_data*/,
-                            std::string*,
-                            brillo::ErrorPtr* /*error*/,
-                            int /*timeout_ms*/) override {
-    LOG(WARNING) << "VerifyAndEncryptData(): gmock can't handle methods with 11 arguments. You can override this method in a subclass if you need to.";
-    return false;
-  }
-  void VerifyAndEncryptDataAsync(const std::string& /*in_certificate*/,
-                                 const std::string& /*in_public_key*/,
-                                 const std::string& /*in_nonce*/,
-                                 const std::string& /*in_signed_data*/,
-                                 const std::string& /*in_destination_udn*/,
-                                 const std::string& /*in_hotspot_ssid*/,
-                                 const std::string& /*in_hotspot_bssid*/,
-                                 const std::string& /*in_data*/,
-                                 const base::Callback<void(const std::string&)>& /*success_callback*/,
-                                 const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                                 int /*timeout_ms*/) override {
-    LOG(WARNING) << "VerifyAndEncryptDataAsync(): gmock can't handle methods with 11 arguments. You can override this method in a subclass if you need to.";
-  }
-  MOCK_METHOD2(ConnectToBestServices,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(ConnectToBestServicesAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(CreateConnectivityReport,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(CreateConnectivityReportAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ClaimInterface,
-               bool(const std::string& /*in_claimer_name*/,
-                    const std::string& /*in_interface_name*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(ClaimInterfaceAsync,
-               void(const std::string& /*in_claimer_name*/,
-                    const std::string& /*in_interface_name*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ReleaseInterface,
-               bool(const std::string& /*in_claimer_name*/,
-                    const std::string& /*in_interface_name*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(ReleaseInterfaceAsync,
-               void(const std::string& /*in_claimer_name*/,
-                    const std::string& /*in_interface_name*/,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetSchedScan,
-               bool(bool,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetSchedScanAsync,
-               void(bool,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetupApModeInterface,
-               bool(std::string* /*out_interface_name*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetupApModeInterfaceAsync,
-               void(const base::Callback<void(const std::string& /*interface_name*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetupStationModeInterface,
-               bool(std::string* /*out_interface_name*/,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetupStationModeInterfaceAsync,
-               void(const base::Callback<void(const std::string& /*interface_name*/)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(RegisterPropertyChangedSignalHandler,
-               void(const base::Callback<void(const std::string&,
-                                              const brillo::Any&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_METHOD2(RegisterStateChangedSignalHandler,
-               void(const base::Callback<void(const std::string&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_CONST_METHOD0(GetObjectPath, const dbus::ObjectPath&());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ManagerProxyMock);
-};
-}  // namespace flimflam
-}  // namespace chromium
-}  // namespace org
-
-namespace org {
-namespace chromium {
-namespace flimflam {
-
-// Mock object for ServiceProxyInterface.
-class ServiceProxyMock : public ServiceProxyInterface {
- public:
-  ServiceProxyMock() = default;
-
-  MOCK_METHOD3(GetProperties,
-               bool(brillo::VariantDictionary*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetPropertiesAsync,
-               void(const base::Callback<void(const brillo::VariantDictionary&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetProperty,
-               bool(const std::string&,
-                    const brillo::Any&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD5(SetPropertyAsync,
-               void(const std::string&,
-                    const brillo::Any&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(SetProperties,
-               bool(const brillo::VariantDictionary&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(SetPropertiesAsync,
-               void(const brillo::VariantDictionary&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(ClearProperty,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ClearPropertyAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ClearProperties,
-               bool(const std::vector<std::string>&,
-                    std::vector<bool>*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ClearPropertiesAsync,
-               void(const std::vector<std::string>&,
-                    const base::Callback<void(const std::vector<bool>&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(Connect,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(ConnectAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(Disconnect,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(DisconnectAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(Remove,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(RemoveAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(ActivateCellularModem,
-               bool(const std::string&,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD4(ActivateCellularModemAsync,
-               void(const std::string&,
-                    const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(CompleteCellularActivation,
-               bool(brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(CompleteCellularActivationAsync,
-               void(const base::Callback<void()>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetLoadableProfileEntries,
-               bool(std::map<dbus::ObjectPath, std::string>*,
-                    brillo::ErrorPtr* /*error*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD3(GetLoadableProfileEntriesAsync,
-               void(const base::Callback<void(const std::map<dbus::ObjectPath, std::string>&)>& /*success_callback*/,
-                    const base::Callback<void(brillo::Error*)>& /*error_callback*/,
-                    int /*timeout_ms*/));
-  MOCK_METHOD2(RegisterPropertyChangedSignalHandler,
-               void(const base::Callback<void(const std::string&,
-                                              const brillo::Any&)>& /*signal_callback*/,
-                    dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
-  MOCK_CONST_METHOD0(GetObjectPath, const dbus::ObjectPath&());
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(ServiceProxyMock);
-};
-}  // namespace flimflam
-}  // namespace chromium
-}  // namespace org
-
-#endif  // ____CHROMEOS_DBUS_BINDING___UPDATE_ENGINE_INCLUDE_SHILL_DBUS_PROXY_MOCKS_H
diff --git a/include/update_includes.sh b/include/update_includes.sh
deleted file mode 100755
index 6008d59..0000000
--- a/include/update_includes.sh
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/bash
-
-#
-# Copyright (C) 2016 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.
-#
-
-DBUS_GENERATOR=$(which dbus-binding-generator)
-MY_DIR=$(dirname "$0")
-
-if [[ -z "${ANDROID_HOST_OUT}" ]]; then
-  echo "You must run envsetup.sh and lunch first." >&2
-  exit 1
-fi
-
-if [[ -z "${DBUS_GENERATOR}" ]]; then
-  echo "DBus bindings generator not found." >&2
-  exit 1
-fi
-
-set -e
-
-# generate <kind> <dir> <xml> [xml ...]
-# Generate a DBus proxy and/or proxy mock in the passed |dir| for the provided
-# |xml| service files.
-# The parameter |kind| determines whether it should generate the mock only
-# (mock), the proxy only (proxy) or both (both).
-generate() {
-  local kind="$1"
-  local dir="$2"
-  local xmls=("${@:3}")
-
-  mkdir -p "${MY_DIR}/${dir}"
-  local outdir=$(realpath "${MY_DIR}/${dir}")
-  local proxyh="${outdir}/dbus-proxies.h"
-  local mockh="${outdir}/dbus-proxy-mocks.h"
-
-  ${DBUS_GENERATOR} "${xmls[@]}" --mock="${mockh}" --proxy="${proxyh}"
-
-  # Fix the include path to the dbus-proxies.h to include ${dir}.
-  sed "s,include \"dbus-proxies.h\",include \"${dir}/dbus-proxies.h\"," \
-    -i "${mockh}"
-
-  # Fix the header guards to be independent from the checkout location.
-  local guard=$(realpath "${MY_DIR}/../.." | tr '[:lower:]/ ' '[:upper:]__')
-  for header in "${mockh}" "${proxyh}"; do
-    sed "s,___CHROMEOS_DBUS_BINDING__${guard},___CHROMEOS_DBUS_BINDING__," \
-      -i "${header}"
-  done
-
-  # Remove the files not requested.
-  if [[ "${kind}" ==  "mock" ]]; then
-    rm -f "${proxyh}"
-  elif [[ "${kind}" == "proxy" ]]; then
-    rm -f "${mockh}"
-  fi
-}
-
-UE_DIR=$(realpath "${MY_DIR}/..")
-SHILL_DIR=$(realpath "${UE_DIR}/../connectivity/shill")
-
-generate mock "libcros" \
-  "${UE_DIR}/dbus_bindings/org.chromium.LibCrosService.dbus-xml"
-
-generate mock "shill" \
-  "${SHILL_DIR}"/dbus_bindings/org.chromium.flimflam.{Manager,Service}.dbus-xml
-
-echo "Done."
