libweave: Interfaces for subcomponents of libweave

External components should include only weave/include files

BUG=brillo:1242
TEST='FEATURES=test emerge-gizmo buffet'

Change-Id: I278ab55f6ffe9298d3d2b8d5c7b47c050886cdfe
Reviewed-on: https://chromium-review.googlesource.com/285832
Tested-by: Vitaly Buka <vitalybuka@chromium.org>
Trybot-Ready: Vitaly Buka <vitalybuka@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Vitaly Buka <vitalybuka@chromium.org>
diff --git a/buffet/buffet.gyp b/buffet/buffet.gyp
index 33e22e8..ca9a11d 100644
--- a/buffet/buffet.gyp
+++ b/buffet/buffet.gyp
@@ -65,6 +65,7 @@
         '../libweave/src/privet/privet_types.cc',
         '../libweave/src/privet/security_manager.cc',
         '../libweave/src/privet/shill_client.cc',
+        '../libweave/src/privet/privet_types.cc',
         '../libweave/src/privet/wifi_bootstrap_manager.cc',
         '../libweave/src/privet/wifi_ssid_generator.cc',
         '../libweave/src/registration_status.cc',
diff --git a/buffet/manager.cc b/buffet/manager.cc
index 572963e..06de9f1 100644
--- a/buffet/manager.cc
+++ b/buffet/manager.cc
@@ -185,8 +185,7 @@
 
 void Manager::GetCommand(DBusMethodResponsePtr<std::string> response,
                          const std::string& id) {
-  const weave::CommandInstance* command =
-      device_->GetCommands()->FindCommand(id);
+  const weave::Command* command = device_->GetCommands()->FindCommand(id);
   if (!command) {
     response->ReplyWithError(FROM_HERE, kErrorDomain, "unknown_command",
                              "Can't find command with id: " + id);
diff --git a/libweave/include/weave/cloud.h b/libweave/include/weave/cloud.h
new file mode 100644
index 0000000..daa39f1
--- /dev/null
+++ b/libweave/include/weave/cloud.h
@@ -0,0 +1,75 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_INCLUDE_WEAVE_CLOUD_H_
+#define LIBWEAVE_INCLUDE_WEAVE_CLOUD_H_
+
+#include <string>
+
+#include <base/callback.h>
+#include <base/values.h>
+#include <chromeos/errors/error.h>
+
+namespace weave {
+
+// See the DBus interface XML file for complete descriptions of these states.
+enum class RegistrationStatus {
+  kUnconfigured,        // We have no credentials.
+  kConnecting,          // We have credentials but not yet connected.
+  kConnected,           // We're registered and connected to the cloud.
+  kInvalidCredentials,  // Our registration has been revoked.
+};
+
+class Cloud {
+ public:
+  using OnRegistrationChangedCallback =
+      base::Callback<void(RegistrationStatus satus)>;
+  using OnCloudRequestCallback =
+      base::Callback<void(const base::DictionaryValue& response)>;
+  using OnCloudRequestErrorCallback =
+      base::Callback<void(const chromeos::Error* error)>;
+
+  // Sets callback which is called when registration state is changed.
+  virtual void AddOnRegistrationChangedCallback(
+      const OnRegistrationChangedCallback& callback) = 0;
+
+  // Gets the full device description JSON object asynchronously.
+  // Passes the device info as the first argument to |callback|, or nullptr if
+  // the device is not registered or in case of communication failure.
+  virtual void GetDeviceInfo(
+      const OnCloudRequestCallback& success_callback,
+      const OnCloudRequestErrorCallback& error_callback) = 0;
+
+  // Registers the device.
+  // Returns a device ID on success.
+  virtual std::string RegisterDevice(const std::string& ticket_id,
+                                     chromeos::ErrorPtr* error) = 0;
+
+  // Updates basic device information.
+  virtual bool UpdateDeviceInfo(const std::string& name,
+                                const std::string& description,
+                                const std::string& location,
+                                chromeos::ErrorPtr* error) = 0;
+
+  // Updates base device config.
+  virtual bool UpdateBaseConfig(const std::string& anonymous_access_role,
+                                bool local_discovery_enabled,
+                                bool local_pairing_enabled,
+                                chromeos::ErrorPtr* error) = 0;
+
+  // Updates GCD service configuration. Usually for testing.
+  virtual bool UpdateServiceConfig(const std::string& client_id,
+                                   const std::string& client_secret,
+                                   const std::string& api_key,
+                                   const std::string& oauth_url,
+                                   const std::string& service_url,
+                                   chromeos::ErrorPtr* error) = 0;
+
+ protected:
+  virtual ~Cloud() = default;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_CLOUD_H_
diff --git a/libweave/include/weave/command.h b/libweave/include/weave/command.h
new file mode 100644
index 0000000..0df4878
--- /dev/null
+++ b/libweave/include/weave/command.h
@@ -0,0 +1,24 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_INCLUDE_WEAVE_COMMAND_H_
+#define LIBWEAVE_INCLUDE_WEAVE_COMMAND_H_
+
+#include <base/values.h>
+#include <chromeos/errors/error.h>
+
+namespace weave {
+
+class Command {
+ public:
+  // Returns JSON representation of the command.
+  virtual std::unique_ptr<base::DictionaryValue> ToJson() const = 0;
+
+ protected:
+  virtual ~Command() = default;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_COMMAND_H_
diff --git a/libweave/include/weave/commands.h b/libweave/include/weave/commands.h
new file mode 100644
index 0000000..2937cbe
--- /dev/null
+++ b/libweave/include/weave/commands.h
@@ -0,0 +1,44 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_INCLUDE_WEAVE_COMMANDS_H_
+#define LIBWEAVE_INCLUDE_WEAVE_COMMANDS_H_
+
+#include <string>
+
+#include <base/callback.h>
+#include <base/values.h>
+#include <chromeos/errors/error.h>
+
+#include "weave/command.h"
+
+namespace weave {
+
+enum class UserRole {
+  kViewer,
+  kUser,
+  kManager,
+  kOwner,
+};
+
+class Commands {
+ public:
+  // Adds a new command to the command queue.
+  virtual bool AddCommand(const base::DictionaryValue& command,
+                          UserRole role,
+                          std::string* id,
+                          chromeos::ErrorPtr* error) = 0;
+
+  // Finds a command by the command |id|. Returns nullptr if the command with
+  // the given |id| is not found. The returned pointer should not be persisted
+  // for a long period of time.
+  virtual Command* FindCommand(const std::string& id) = 0;
+
+ protected:
+  virtual ~Commands() = default;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_COMMANDS_H_
diff --git a/libweave/include/weave/config.h b/libweave/include/weave/config.h
new file mode 100644
index 0000000..6b87385
--- /dev/null
+++ b/libweave/include/weave/config.h
@@ -0,0 +1,62 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_INCLUDE_WEAVE_CONFIG_H_
+#define LIBWEAVE_INCLUDE_WEAVE_CONFIG_H_
+
+#include <set>
+#include <string>
+
+#include <base/callback.h>
+
+#include "weave/enum_to_string.h"
+#include "weave/privet.h"
+
+namespace weave {
+
+struct Settings {
+  std::string client_id;
+  std::string client_secret;
+  std::string api_key;
+  std::string oauth_url;
+  std::string service_url;
+  std::string name;
+  std::string description;
+  std::string location;
+  std::string local_anonymous_access_role;
+  bool local_discovery_enabled{true};
+  bool local_pairing_enabled{true};
+  std::string oem_name;
+  std::string model_name;
+  std::string model_id;
+  std::string device_kind;
+  base::TimeDelta polling_period;
+  base::TimeDelta backup_polling_period;
+
+  bool wifi_auto_setup_enabled{true};
+  std::set<PairingType> pairing_modes;
+  base::FilePath embedded_code_path;
+
+  std::string device_id;
+  std::string refresh_token;
+  std::string robot_account;
+  std::string last_configured_ssid;
+};
+
+class Config {
+ public:
+  using OnChangedCallback = base::Callback<void(const Settings& settings)>;
+
+  // Sets callback which is called when config is changed.
+  virtual void AddOnChangedCallback(const OnChangedCallback& callback) = 0;
+
+  virtual const Settings& GetSettings() const = 0;
+
+ protected:
+  virtual ~Config() = default;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_CONFIG_H_
diff --git a/libweave/include/weave/device.h b/libweave/include/weave/device.h
index 4adaa53..81289e9 100644
--- a/libweave/include/weave/device.h
+++ b/libweave/include/weave/device.h
@@ -13,7 +13,11 @@
 #include <chromeos/errors/error.h>
 #include <chromeos/variant_dictionary.h>
 
-#include "weave/types.h"
+#include "weave/cloud.h"
+#include "weave/commands.h"
+#include "weave/config.h"
+#include "weave/privet.h"
+#include "weave/state.h"
 
 namespace chromeos {
 namespace dbus_utils {
@@ -24,21 +28,6 @@
 
 namespace weave {
 
-class CommandManager;
-class StateManager;
-class BuffetConfig;
-class DeviceRegistrationInfo;
-namespace privet {
-class Manager;
-}
-
-// TODO(vitalybuka): Replace with interfaces.
-using Commands = CommandManager;
-using State = StateManager;
-using Config = BuffetConfig;
-using Cloud = DeviceRegistrationInfo;
-using Privet = privet::Manager;
-
 class Device {
  public:
   struct Options {
@@ -71,11 +60,4 @@
 
 }  // namespace weave
 
-// TODO(vitalybuka): Replace with interfaces
-#include "libweave/src/buffet_config.h"
-#include "libweave/src/commands/command_manager.h"
-#include "libweave/src/device_registration_info.h"
-#include "libweave/src/privet/privet_manager.h"
-#include "libweave/src/states/state_manager.h"
-
 #endif  // LIBWEAVE_INCLUDE_WEAVE_DEVICE_H_
diff --git a/libweave/include/weave/privet.h b/libweave/include/weave/privet.h
new file mode 100644
index 0000000..60acbeb
--- /dev/null
+++ b/libweave/include/weave/privet.h
@@ -0,0 +1,53 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_INCLUDE_WEAVE_PRIVET_H_
+#define LIBWEAVE_INCLUDE_WEAVE_PRIVET_H_
+
+#include <string>
+#include <vector>
+
+#include <base/callback.h>
+
+namespace weave {
+
+enum class PairingType {
+  kPinCode,
+  kEmbeddedCode,
+  kUltrasound32,
+  kAudible32,
+};
+
+enum class WifiSetupState {
+  kDisabled,
+  kBootstrapping,
+  kMonitoring,
+  kConnecting,
+};
+
+class Privet {
+ public:
+  using OnWifiSetupChangedCallback = base::Callback<void(WifiSetupState state)>;
+  using OnPairingStartedCallback =
+      base::Callback<void(const std::string& session_id,
+                          PairingType pairing_type,
+                          const std::vector<uint8_t>& code)>;
+  using OnPairingEndedCallback =
+      base::Callback<void(const std::string& session_id)>;
+
+  // Sets callback which is called when WiFi state is changed.
+  virtual void AddOnWifiSetupChangedCallback(
+      const OnWifiSetupChangedCallback& callback) = 0;
+
+  virtual void AddOnPairingChangedCallbacks(
+      const OnPairingStartedCallback& on_start,
+      const OnPairingEndedCallback& on_end) = 0;
+
+ protected:
+  virtual ~Privet() = default;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_PRIVET_H_
diff --git a/libweave/include/weave/state.h b/libweave/include/weave/state.h
new file mode 100644
index 0000000..bf87a64
--- /dev/null
+++ b/libweave/include/weave/state.h
@@ -0,0 +1,34 @@
+// Copyright 2015 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef LIBWEAVE_INCLUDE_WEAVE_STATE_H_
+#define LIBWEAVE_INCLUDE_WEAVE_STATE_H_
+
+#include <base/callback.h>
+#include <base/values.h>
+#include <chromeos/variant_dictionary.h>
+
+namespace weave {
+
+class State {
+ public:
+  // Sets callback which is called when stat is changed.
+  virtual void AddOnChangedCallback(const base::Closure& callback) = 0;
+
+  // Updates a multiple property values.
+  virtual bool SetProperties(const chromeos::VariantDictionary& property_set,
+                             chromeos::ErrorPtr* error) = 0;
+
+  // Returns aggregated state properties across all registered packages as
+  // a JSON object that can be used to send the device state to the GCD server.
+  virtual std::unique_ptr<base::DictionaryValue> GetStateValuesAsJson(
+      chromeos::ErrorPtr* error) const = 0;
+
+ protected:
+  virtual ~State() = default;
+};
+
+}  // namespace weave
+
+#endif  // LIBWEAVE_INCLUDE_WEAVE_STATE_H_
diff --git a/libweave/include/weave/types.h b/libweave/include/weave/types.h
deleted file mode 100644
index 55a1fb0..0000000
--- a/libweave/include/weave/types.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIBWEAVE_INCLUDE_WEAVE_TYPES_H_
-#define LIBWEAVE_INCLUDE_WEAVE_TYPES_H_
-
-#include <string>
-
-namespace weave {
-
-// See the DBus interface XML file for complete descriptions of these states.
-enum class RegistrationStatus {
-  kUnconfigured,        // We have no credentials.
-  kConnecting,          // We have credentials but not yet connected.
-  kConnected,           // We're registered and connected to the cloud.
-  kInvalidCredentials,  // Our registration has been revoked.
-};
-
-enum class PairingType {
-  kPinCode,
-  kEmbeddedCode,
-  kUltrasound32,
-  kAudible32,
-};
-
-enum class WifiSetupState {
-  kDisabled,
-  kBootstrapping,
-  kMonitoring,
-  kConnecting,
-};
-
-}  // namespace weave
-
-#endif  // LIBWEAVE_INCLUDE_WEAVE_TYPES_H_
diff --git a/libweave/src/buffet_config.h b/libweave/src/buffet_config.h
index d0296da..8924365 100644
--- a/libweave/src/buffet_config.h
+++ b/libweave/src/buffet_config.h
@@ -15,51 +15,25 @@
 #include <chromeos/key_value_store.h>
 
 #include "libweave/src/privet/security_delegate.h"
+#include "weave/config.h"
 
 namespace weave {
 
 class StorageInterface;
 
-struct Settings {
-  std::string client_id;
-  std::string client_secret;
-  std::string api_key;
-  std::string oauth_url;
-  std::string service_url;
-  std::string name;
-  std::string description;
-  std::string location;
-  std::string local_anonymous_access_role;
-  bool local_discovery_enabled{true};
-  bool local_pairing_enabled{true};
-  std::string oem_name;
-  std::string model_name;
-  std::string model_id;
-  std::string device_kind;
-  base::TimeDelta polling_period;
-  base::TimeDelta backup_polling_period;
-
-  bool wifi_auto_setup_enabled{true};
-  std::set<PairingType> pairing_modes;
-  base::FilePath embedded_code_path;
-
-  std::string device_id;
-  std::string refresh_token;
-  std::string robot_account;
-  std::string last_configured_ssid;
-};
-
 // Handles reading buffet config and state files.
-class BuffetConfig final {
+class BuffetConfig final : public Config {
  public:
   using OnChangedCallback = base::Callback<void(const Settings&)>;
+  ~BuffetConfig() override = default;
 
   explicit BuffetConfig(std::unique_ptr<StorageInterface> storage);
 
   explicit BuffetConfig(const base::FilePath& state_path);
 
-  void AddOnChangedCallback(const OnChangedCallback& callback);
-  const Settings& GetSettings() const;
+  // Config overrides.
+  void AddOnChangedCallback(const OnChangedCallback& callback) override;
+  const Settings& GetSettings() const override;
 
   void Load(const base::FilePath& config_path);
   void Load(const chromeos::KeyValueStore& store);
diff --git a/libweave/src/commands/command_definition.h b/libweave/src/commands/command_definition.h
index 9c0d370..769427a 100644
--- a/libweave/src/commands/command_definition.h
+++ b/libweave/src/commands/command_definition.h
@@ -11,7 +11,7 @@
 #include <base/macros.h>
 
 #include "libweave/src/commands/object_schema.h"
-#include "libweave/src/commands/user_role.h"
+#include "weave/commands.h"
 
 namespace weave {
 
diff --git a/libweave/src/commands/command_instance.h b/libweave/src/commands/command_instance.h
index 73d4646..5142d98 100644
--- a/libweave/src/commands/command_instance.h
+++ b/libweave/src/commands/command_instance.h
@@ -15,6 +15,7 @@
 
 #include "libweave/src/commands/prop_values.h"
 #include "libweave/src/commands/schema_utils.h"
+#include "weave/command.h"
 
 namespace base {
 class Value;
@@ -27,7 +28,7 @@
 class CommandProxyInterface;
 class CommandQueue;
 
-class CommandInstance final {
+class CommandInstance final : public Command {
  public:
   // Construct a command instance given the full command |name| which must
   // be in format "<package_name>.<command_name>", a command |category| and
@@ -36,7 +37,10 @@
                   const std::string& origin,
                   const CommandDefinition* command_definition,
                   const native_types::Object& parameters);
-  ~CommandInstance();
+  ~CommandInstance() override;
+
+  // Command overrides.
+  std::unique_ptr<base::DictionaryValue> ToJson() const override;
 
   // Returns the full command ID.
   const std::string& GetID() const { return id_; }
@@ -74,9 +78,6 @@
       std::string* command_id,
       chromeos::ErrorPtr* error);
 
-  // Returns JSON representation of the command.
-  std::unique_ptr<base::DictionaryValue> ToJson() const;
-
   // Sets the command ID (normally done by CommandQueue when the command
   // instance is added to it).
   void SetID(const std::string& id) { id_ = id; }
diff --git a/libweave/src/commands/command_manager.cc b/libweave/src/commands/command_manager.cc
index 1b59da6..a312051 100644
--- a/libweave/src/commands/command_manager.cc
+++ b/libweave/src/commands/command_manager.cc
@@ -29,6 +29,13 @@
                  base::Unretained(&command_dispatcher_)));
 }
 
+CommandManager::~CommandManager() {}
+
+void CommandManager::AddOnCommandDefChanged(const base::Closure& callback) {
+  on_command_changed_.push_back(callback);
+  callback.Run();
+}
+
 const CommandDictionary& CommandManager::GetCommandDictionary() const {
   return dictionary_;
 }
@@ -125,7 +132,7 @@
   return true;
 }
 
-CommandInstance* CommandManager::FindCommand(const std::string& id) const {
+CommandInstance* CommandManager::FindCommand(const std::string& id) {
   return command_queue_.Find(id);
 }
 
diff --git a/libweave/src/commands/command_manager.h b/libweave/src/commands/command_manager.h
index 0aa703d..c894f71 100644
--- a/libweave/src/commands/command_manager.h
+++ b/libweave/src/commands/command_manager.h
@@ -17,6 +17,7 @@
 #include "libweave/src/commands/command_dictionary.h"
 #include "libweave/src/commands/command_queue.h"
 #include "libweave/src/commands/dbus_command_dispatcher.h"
+#include "weave/commands.h"
 
 namespace chromeos {
 namespace dbus_utils {
@@ -31,18 +32,24 @@
 // CommandManager class that will have a list of all the device command
 // schemas as well as the live command queue of pending command instances
 // dispatched to the device.
-class CommandManager final {
+class CommandManager final : public Commands {
  public:
   CommandManager();
   explicit CommandManager(
       const base::WeakPtr<chromeos::dbus_utils::ExportedObjectManager>&
           object_manager);
 
+  ~CommandManager() override;
+
+  // Commands overrides.
+  bool AddCommand(const base::DictionaryValue& command,
+                  UserRole role,
+                  std::string* id,
+                  chromeos::ErrorPtr* error) override;
+  CommandInstance* FindCommand(const std::string& id) override;
+
   // Sets callback which is called when command definitions is changed.
-  void AddOnCommandDefChanged(const base::Closure& callback) {
-    on_command_changed_.push_back(callback);
-    callback.Run();
-  }
+  void AddOnCommandDefChanged(const base::Closure& callback);
 
   // Returns the command definitions for the device.
   const CommandDictionary& GetCommandDictionary() const;
@@ -87,15 +94,6 @@
 
   // Adds a new command to the command queue.
   void AddCommand(std::unique_ptr<CommandInstance> command_instance);
-  bool AddCommand(const base::DictionaryValue& command,
-                  UserRole role,
-                  std::string* id,
-                  chromeos::ErrorPtr* error);
-
-  // Finds a command by the command |id|. Returns nullptr if the command with
-  // the given |id| is not found. The returned pointer should not be persisted
-  // for a long period of time.
-  CommandInstance* FindCommand(const std::string& id) const;
 
   // Changes the visibility of commands.
   bool SetCommandVisibility(const std::vector<std::string>& command_names,
diff --git a/libweave/src/commands/user_role.cc b/libweave/src/commands/user_role.cc
index 87edad1..0cad7ad 100644
--- a/libweave/src/commands/user_role.cc
+++ b/libweave/src/commands/user_role.cc
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "libweave/src/commands/user_role.h"
-
 #include <chromeos/errors/error.h>
 
 #include "libweave/src/commands/schema_constants.h"
+#include "weave/commands.h"
 #include "weave/enum_to_string.h"
 
 namespace weave {
diff --git a/libweave/src/commands/user_role.h b/libweave/src/commands/user_role.h
deleted file mode 100644
index 5f5b3d7..0000000
--- a/libweave/src/commands/user_role.h
+++ /dev/null
@@ -1,22 +0,0 @@
-// Copyright 2015 The Chromium OS Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef LIBWEAVE_SRC_COMMANDS_USER_ROLE_H_
-#define LIBWEAVE_SRC_COMMANDS_USER_ROLE_H_
-
-#include <string>
-#include <chromeos/errors/error.h>
-
-namespace weave {
-
-enum class UserRole {
-  kViewer,
-  kUser,
-  kManager,
-  kOwner,
-};
-
-}  // namespace weave
-
-#endif  // LIBWEAVE_SRC_COMMANDS_USER_ROLE_H_
diff --git a/libweave/src/device_manager.cc b/libweave/src/device_manager.cc
index 7d2943b..709f4bb 100644
--- a/libweave/src/device_manager.cc
+++ b/libweave/src/device_manager.cc
@@ -6,12 +6,14 @@
 
 #include <string>
 
-#include <chromeos/dbus/dbus_object.h>
-
 #include <base/message_loop/message_loop.h>
+#include <chromeos/dbus/dbus_object.h>
+#include <chromeos/http/http_transport.h>
 
 #include "libweave/src/base_api_handler.h"
+#include "libweave/src/buffet_config.h"
 #include "libweave/src/commands/command_manager.h"
+#include "libweave/src/device_registration_info.h"
 #include "libweave/src/privet/privet_manager.h"
 #include "libweave/src/privet/shill_client.h"
 #include "libweave/src/states/state_change_queue.h"
@@ -69,23 +71,23 @@
     StartPrivet(options, dbus_object, sequencer);
 }
 
-CommandManager* DeviceManager::GetCommands() {
+Commands* DeviceManager::GetCommands() {
   return command_manager_.get();
 }
 
-StateManager* DeviceManager::GetState() {
+State* DeviceManager::GetState() {
   return state_manager_.get();
 }
 
-BuffetConfig* DeviceManager::GetConfig() {
+Config* DeviceManager::GetConfig() {
   return device_info_->GetMutableConfig();
 }
 
-DeviceRegistrationInfo* DeviceManager::GetCloud() {
+Cloud* DeviceManager::GetCloud() {
   return device_info_.get();
 }
 
-privet::Manager* DeviceManager::GetPrivet() {
+Privet* DeviceManager::GetPrivet() {
   return privet_.get();
 }
 
diff --git a/libweave/src/device_manager.h b/libweave/src/device_manager.h
index 0eba82a..7faf586 100644
--- a/libweave/src/device_manager.h
+++ b/libweave/src/device_manager.h
@@ -5,6 +5,8 @@
 #ifndef LIBWEAVE_SRC_DEVICE_MANAGER_H_
 #define LIBWEAVE_SRC_DEVICE_MANAGER_H_
 
+#include <base/memory/weak_ptr.h>
+
 #include "weave/device.h"
 
 namespace chromeos {
@@ -36,11 +38,11 @@
              chromeos::dbus_utils::DBusObject* dbus_object,
              chromeos::dbus_utils::AsyncEventSequencer* sequencer) override;
 
-  CommandManager* GetCommands() override;
-  StateManager* GetState() override;
-  BuffetConfig* GetConfig() override;
-  DeviceRegistrationInfo* GetCloud() override;
-  privet::Manager* GetPrivet() override;
+  Commands* GetCommands() override;
+  State* GetState() override;
+  Config* GetConfig() override;
+  Cloud* GetCloud() override;
+  Privet* GetPrivet() override;
 
  private:
   void StartPrivet(const Options& options,
diff --git a/libweave/src/device_registration_info.h b/libweave/src/device_registration_info.h
index 4dff0a5..88039dc 100644
--- a/libweave/src/device_registration_info.h
+++ b/libweave/src/device_registration_info.h
@@ -31,6 +31,8 @@
 #include "libweave/src/notification/pull_channel.h"
 #include "libweave/src/states/state_change_queue_interface.h"
 #include "libweave/src/storage_interface.h"
+#include "weave/cloud.h"
+#include "weave/config.h"
 
 namespace base {
 class DictionaryValue;
@@ -53,13 +55,12 @@
 extern const char kErrorDomainGCDServer[];
 
 // The DeviceRegistrationInfo class represents device registration information.
-class DeviceRegistrationInfo : public NotificationDelegate,
+class DeviceRegistrationInfo : public Cloud,
+                               public NotificationDelegate,
                                public CloudCommandUpdateInterface {
  public:
-  using OnRegistrationChangedCallback =
-      base::Callback<void(RegistrationStatus)>;
   using CloudRequestCallback =
-      base::Callback<void(const base::DictionaryValue&)>;
+      base::Callback<void(const base::DictionaryValue& response)>;
   using CloudRequestErrorCallback =
       base::Callback<void(const chromeos::Error* error)>;
 
@@ -74,13 +75,31 @@
 
   ~DeviceRegistrationInfo() override;
 
-  // Add callback to listen for changes in registration status.
+  // Cloud overrides.
   void AddOnRegistrationChangedCallback(
-      const OnRegistrationChangedCallback& callback);
+      const OnRegistrationChangedCallback& callback) override;
+  void GetDeviceInfo(
+      const OnCloudRequestCallback& success_callback,
+      const OnCloudRequestErrorCallback& error_callback) override;
+  std::string RegisterDevice(const std::string& ticket_id,
+                             chromeos::ErrorPtr* error) override;
+  bool UpdateDeviceInfo(const std::string& name,
+                        const std::string& description,
+                        const std::string& location,
+                        chromeos::ErrorPtr* error) override;
+  bool UpdateBaseConfig(const std::string& anonymous_access_role,
+                        bool local_discovery_enabled,
+                        bool local_pairing_enabled,
+                        chromeos::ErrorPtr* error) override;
+  bool UpdateServiceConfig(const std::string& client_id,
+                           const std::string& client_secret,
+                           const std::string& api_key,
+                           const std::string& oauth_url,
+                           const std::string& service_url,
+                           chromeos::ErrorPtr* error) override;
 
   // Add callback to listen for changes in config.
-  void AddOnConfigChangedCallback(
-      const BuffetConfig::OnChangedCallback& callback);
+  void AddOnConfigChangedCallback(const Config::OnChangedCallback& callback);
 
   // Returns the authorization HTTP header that can be used to talk
   // to GCD server for authenticated device communication.
@@ -123,43 +142,12 @@
   // are available.
   bool VerifyRegistrationCredentials(chromeos::ErrorPtr* error) const;
 
-  // Gets the full device description JSON object asynchronously.
-  // Passes the device info as the first argument to |callback|, or nullptr if
-  // the device is not registered or in case of communication failure.
-  void GetDeviceInfo(const CloudRequestCallback& success_callback,
-                     const CloudRequestErrorCallback& error_callback);
-
-  // Registers the device.
-  // Returns a device ID on success.
-  std::string RegisterDevice(const std::string& ticket_id,
-                             chromeos::ErrorPtr* error);
-
   // Updates a command (override from CloudCommandUpdateInterface).
   void UpdateCommand(const std::string& command_id,
                      const base::DictionaryValue& command_patch,
                      const base::Closure& on_success,
                      const base::Closure& on_error) override;
 
-  // Updates basic device information.
-  bool UpdateDeviceInfo(const std::string& name,
-                        const std::string& description,
-                        const std::string& location,
-                        chromeos::ErrorPtr* error);
-
-  // Updates base device config.
-  bool UpdateBaseConfig(const std::string& anonymous_access_role,
-                        bool local_discovery_enabled,
-                        bool local_pairing_enabled,
-                        chromeos::ErrorPtr* error);
-
-  // Updates GCD service configuration. Usually for testing.
-  bool UpdateServiceConfig(const std::string& client_id,
-                           const std::string& client_secret,
-                           const std::string& api_key,
-                           const std::string& oauth_url,
-                           const std::string& service_url,
-                           chromeos::ErrorPtr* error);
-
   // TODO(vitalybuka): remove getters and pass config to dependent code.
   const BuffetConfig& GetConfig() const { return *config_; }
   BuffetConfig* GetMutableConfig() { return config_.get(); }
diff --git a/libweave/src/privet/cloud_delegate.cc b/libweave/src/privet/cloud_delegate.cc
index 9ef680d..80f8086 100644
--- a/libweave/src/privet/cloud_delegate.cc
+++ b/libweave/src/privet/cloud_delegate.cc
@@ -22,7 +22,6 @@
 #include "libweave/src/device_registration_info.h"
 #include "libweave/src/privet/constants.h"
 #include "libweave/src/states/state_manager.h"
-#include "weave/enum_to_string.h"
 
 using chromeos::ErrorPtr;
 using chromeos::VariantDictionary;
diff --git a/libweave/src/privet/privet_manager.h b/libweave/src/privet/privet_manager.h
index 3a01f13..9ec3984 100644
--- a/libweave/src/privet/privet_manager.h
+++ b/libweave/src/privet/privet_manager.h
@@ -48,10 +48,10 @@
 class SecurityManager;
 class ShillClient;
 
-class Manager : public CloudDelegate::Observer {
+class Manager : public Privet, public CloudDelegate::Observer {
  public:
   Manager();
-  ~Manager();
+  ~Manager() override;
 
   void Start(const weave::Device::Options& options,
              const scoped_refptr<dbus::Bus>& bus,
@@ -64,11 +64,11 @@
   std::string GetCurrentlyConnectedSsid() const;
 
   void AddOnWifiSetupChangedCallback(
-      const WifiBootstrapManager::StateListener& callback);
+      const OnWifiSetupChangedCallback& callback) override;
 
   void AddOnPairingChangedCallbacks(
-      const SecurityManager::PairingStartListener& on_start,
-      const SecurityManager::PairingEndListener& on_end);
+      const OnPairingStartedCallback& on_start,
+      const OnPairingEndedCallback& on_end) override;
 
   void Shutdown();
 
diff --git a/libweave/src/privet/privet_types.cc b/libweave/src/privet/privet_types.cc
index 7c68929..dcf3209 100644
--- a/libweave/src/privet/privet_types.cc
+++ b/libweave/src/privet/privet_types.cc
@@ -7,7 +7,7 @@
 #include <string>
 
 #include "weave/enum_to_string.h"
-#include "weave/types.h"
+#include "weave/privet.h"
 
 namespace weave {
 
diff --git a/libweave/src/privet/security_delegate.h b/libweave/src/privet/security_delegate.h
index 616cc3d..e7444e9 100644
--- a/libweave/src/privet/security_delegate.h
+++ b/libweave/src/privet/security_delegate.h
@@ -13,7 +13,7 @@
 #include <chromeos/secure_blob.h>
 
 #include "libweave/src/privet/privet_types.h"
-#include "weave/types.h"
+#include "weave/privet.h"
 
 namespace weave {
 namespace privet {
diff --git a/libweave/src/registration_status.cc b/libweave/src/registration_status.cc
index 8392d57..550360e 100644
--- a/libweave/src/registration_status.cc
+++ b/libweave/src/registration_status.cc
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "weave/cloud.h"
 #include "weave/enum_to_string.h"
-#include "weave/types.h"
 
 namespace weave {
 
diff --git a/libweave/src/states/state_manager.cc b/libweave/src/states/state_manager.cc
index 7b867ca..d694464 100644
--- a/libweave/src/states/state_manager.cc
+++ b/libweave/src/states/state_manager.cc
@@ -29,6 +29,8 @@
   CHECK(state_change_queue_) << "State change queue not specified";
 }
 
+StateManager::~StateManager() {}
+
 void StateManager::AddOnChangedCallback(const base::Closure& callback) {
   on_changed_.push_back(callback);
   callback.Run();  // Force to read current state.
diff --git a/libweave/src/states/state_manager.h b/libweave/src/states/state_manager.h
index a60c0dc..99f561d 100644
--- a/libweave/src/states/state_manager.h
+++ b/libweave/src/states/state_manager.h
@@ -19,6 +19,7 @@
 
 #include "libweave/src/states/state_change_queue_interface.h"
 #include "libweave/src/states/state_package.h"
+#include "weave/state.h"
 
 namespace base {
 class DictionaryValue;
@@ -31,25 +32,22 @@
 // StateManager is the class that aggregates the device state fragments
 // provided by device daemons and makes the aggregate device state available
 // to the GCD cloud server and local clients.
-class StateManager final {
+class StateManager final : public State {
  public:
   explicit StateManager(StateChangeQueueInterface* state_change_queue);
+  ~StateManager() override;
 
-  void AddOnChangedCallback(const base::Closure& callback);
+  // State overrides.
+  void AddOnChangedCallback(const base::Closure& callback) override;
+  bool SetProperties(const chromeos::VariantDictionary& property_set,
+                     chromeos::ErrorPtr* error) override;
+  std::unique_ptr<base::DictionaryValue> GetStateValuesAsJson(
+      chromeos::ErrorPtr* error) const override;
 
   // Initializes the state manager and load device state fragments.
   // Called by Buffet daemon at startup.
   void Startup();
 
-  // Returns aggregated state properties across all registered packages as
-  // a JSON object that can be used to send the device state to the GCD server.
-  std::unique_ptr<base::DictionaryValue> GetStateValuesAsJson(
-      chromeos::ErrorPtr* error) const;
-
-  // Updates a multiple property values.
-  bool SetProperties(const chromeos::VariantDictionary& property_set,
-                     chromeos::ErrorPtr* error);
-
   // Returns all the categories the state properties are registered from.
   // As with GCD command handling, the category normally represent a device
   // service (daemon) that is responsible for a set of properties.