diff --git a/libweave/include/weave/command.h b/libweave/include/weave/command.h
index 3274664..58a63fe 100644
--- a/libweave/include/weave/command.h
+++ b/libweave/include/weave/command.h
@@ -12,6 +12,19 @@
 
 namespace weave {
 
+enum class CommandStatus {
+  kQueued,
+  kInProgress,
+  kPaused,
+  kError,
+  kDone,
+  kCancelled,
+  kAborted,
+  kExpired,
+};
+
+enum class CommandOrigin { kLocal, kCloud };
+
 class Command {
  public:
   // This interface lets the command to notify clients about changes.
@@ -39,11 +52,10 @@
   virtual const std::string& GetCategory() const = 0;
 
   // Returns the command status.
-  // TODO(vitalybuka): Status should be enum.
-  virtual const std::string& GetStatus() const = 0;
+  virtual CommandStatus GetStatus() const = 0;
 
   // Returns the origin of the command.
-  virtual const std::string& GetOrigin() const = 0;
+  virtual CommandOrigin GetOrigin() const = 0;
 
   // Returns the command parameters.
   virtual std::unique_ptr<base::DictionaryValue> GetParameters() const = 0;
diff --git a/libweave/src/base_api_handler.cc b/libweave/src/base_api_handler.cc
index feb1ab6..28be501 100644
--- a/libweave/src/base_api_handler.cc
+++ b/libweave/src/base_api_handler.cc
@@ -21,7 +21,7 @@
 }
 
 void BaseApiHandler::OnCommandAdded(Command* command) {
-  if (command->GetStatus() != CommandInstance::kStatusQueued)
+  if (command->GetStatus() != CommandStatus::kQueued)
     return;
 
   if (command->GetName() == "base.updateBaseConfiguration")
diff --git a/libweave/src/base_api_handler_unittest.cc b/libweave/src/base_api_handler_unittest.cc
index 8bc174a..3e35bd9 100644
--- a/libweave/src/base_api_handler_unittest.cc
+++ b/libweave/src/base_api_handler_unittest.cc
@@ -67,14 +67,14 @@
   void AddCommand(const std::string& command) {
     auto command_instance = CommandInstance::FromJson(
         unittests::CreateDictionaryValue(command.c_str()).get(),
-        commands::attributes::kCommand_Visibility_Local,
-        command_manager_->GetCommandDictionary(), nullptr, nullptr);
+        CommandOrigin::kLocal, command_manager_->GetCommandDictionary(),
+        nullptr, nullptr);
     EXPECT_TRUE(!!command_instance);
 
     std::string id{base::IntToString(++command_id_)};
     command_instance->SetID(id);
     command_manager_->AddCommand(std::move(command_instance));
-    EXPECT_EQ(CommandInstance::kStatusDone,
+    EXPECT_EQ(CommandStatus::kDone,
               command_manager_->FindCommand(id)->GetStatus());
   }
 
diff --git a/libweave/src/commands/cloud_command_proxy.cc b/libweave/src/commands/cloud_command_proxy.cc
index 70430c7..a6685fc 100644
--- a/libweave/src/commands/cloud_command_proxy.cc
+++ b/libweave/src/commands/cloud_command_proxy.cc
@@ -10,6 +10,7 @@
 #include "libweave/src/commands/prop_constraints.h"
 #include "libweave/src/commands/prop_types.h"
 #include "libweave/src/commands/schema_constants.h"
+#include "weave/enum_to_string.h"
 
 namespace weave {
 
@@ -39,7 +40,7 @@
 void CloudCommandProxy::OnStatusChanged() {
   std::unique_ptr<base::DictionaryValue> patch{new base::DictionaryValue};
   patch->SetString(commands::attributes::kCommand_State,
-                   command_instance_->GetStatus());
+                   EnumToString(command_instance_->GetStatus()));
   QueueCommandUpdate(std::move(patch));
 }
 
diff --git a/libweave/src/commands/cloud_command_proxy_unittest.cc b/libweave/src/commands/cloud_command_proxy_unittest.cc
index bd45e25..7cc054e 100644
--- a/libweave/src/commands/cloud_command_proxy_unittest.cc
+++ b/libweave/src/commands/cloud_command_proxy_unittest.cc
@@ -139,8 +139,9 @@
     })");
     CHECK(command_json.get());
 
-    command_instance_ = CommandInstance::FromJson(
-        command_json.get(), "cloud", command_dictionary_, nullptr, nullptr);
+    command_instance_ =
+        CommandInstance::FromJson(command_json.get(), CommandOrigin::kCloud,
+                                  command_dictionary_, nullptr, nullptr);
     CHECK(command_instance_.get());
 
     // Backoff - start at 1s and double with each backoff attempt and no jitter.
diff --git a/libweave/src/commands/command_instance.cc b/libweave/src/commands/command_instance.cc
index 34ed8dc..d2efcb4 100644
--- a/libweave/src/commands/command_instance.cc
+++ b/libweave/src/commands/command_instance.cc
@@ -14,20 +14,40 @@
 #include "libweave/src/commands/prop_types.h"
 #include "libweave/src/commands/schema_constants.h"
 #include "libweave/src/commands/schema_utils.h"
+#include "weave/enum_to_string.h"
 
 namespace weave {
 
-const char CommandInstance::kStatusQueued[] = "queued";
-const char CommandInstance::kStatusInProgress[] = "inProgress";
-const char CommandInstance::kStatusPaused[] = "paused";
-const char CommandInstance::kStatusError[] = "error";
-const char CommandInstance::kStatusDone[] = "done";
-const char CommandInstance::kStatusCancelled[] = "cancelled";
-const char CommandInstance::kStatusAborted[] = "aborted";
-const char CommandInstance::kStatusExpired[] = "expired";
+namespace {
+
+const EnumToStringMap<CommandStatus>::Map kMapStatus[] = {
+    {CommandStatus::kQueued, "queued"},
+    {CommandStatus::kInProgress, "inProgress"},
+    {CommandStatus::kPaused, "paused"},
+    {CommandStatus::kError, "error"},
+    {CommandStatus::kDone, "done"},
+    {CommandStatus::kCancelled, "cancelled"},
+    {CommandStatus::kAborted, "aborted"},
+    {CommandStatus::kExpired, "expired"},
+};
+
+const EnumToStringMap<CommandOrigin>::Map kMapOrigin[] = {
+    {CommandOrigin::kLocal, "local"},
+    {CommandOrigin::kCloud, "cloud"},
+};
+
+}  // namespace
+
+template <>
+EnumToStringMap<CommandStatus>::EnumToStringMap()
+    : EnumToStringMap(kMapStatus) {}
+
+template <>
+EnumToStringMap<CommandOrigin>::EnumToStringMap()
+    : EnumToStringMap(kMapOrigin) {}
 
 CommandInstance::CommandInstance(const std::string& name,
-                                 const std::string& origin,
+                                 CommandOrigin origin,
                                  const CommandDefinition* command_definition,
                                  const ValueMap& parameters)
     : name_{name},
@@ -54,11 +74,11 @@
   return command_definition_->GetCategory();
 }
 
-const std::string& CommandInstance::GetStatus() const {
+CommandStatus CommandInstance::GetStatus() const {
   return status_;
 }
 
-const std::string& CommandInstance::GetOrigin() const {
+CommandOrigin CommandInstance::GetOrigin() const {
   return origin_;
 }
 
@@ -84,7 +104,7 @@
     return false;
 
   // Change status even if progress unchanged, e.g. 0% -> 0%.
-  SetStatus(kStatusInProgress);
+  SetStatus(CommandStatus::kInProgress);
   if (obj != progress_) {
     progress_ = obj;
     for (auto observer : observers_)
@@ -155,7 +175,7 @@
 
 std::unique_ptr<CommandInstance> CommandInstance::FromJson(
     const base::Value* value,
-    const std::string& origin,
+    CommandOrigin origin,
     const CommandDictionary& dictionary,
     std::string* command_id,
     chromeos::ErrorPtr* error) {
@@ -225,7 +245,7 @@
             TypedValueToJson(progress_, nullptr).release());
   json->Set(commands::attributes::kCommand_Results,
             TypedValueToJson(results_, nullptr).release());
-  json->SetString(commands::attributes::kCommand_State, status_);
+  json->SetString(commands::attributes::kCommand_State, EnumToString(status_));
 
   return json;
 }
@@ -235,24 +255,24 @@
 }
 
 void CommandInstance::Abort() {
-  SetStatus(kStatusAborted);
+  SetStatus(CommandStatus::kAborted);
   RemoveFromQueue();
   // The command will be destroyed after that, so do not access any members.
 }
 
 void CommandInstance::Cancel() {
-  SetStatus(kStatusCancelled);
+  SetStatus(CommandStatus::kCancelled);
   RemoveFromQueue();
   // The command will be destroyed after that, so do not access any members.
 }
 
 void CommandInstance::Done() {
-  SetStatus(kStatusDone);
+  SetStatus(CommandStatus::kDone);
   RemoveFromQueue();
   // The command will be destroyed after that, so do not access any members.
 }
 
-void CommandInstance::SetStatus(const std::string& status) {
+void CommandInstance::SetStatus(CommandStatus status) {
   if (status != status_) {
     status_ = status;
     for (auto observer : observers_)
diff --git a/libweave/src/commands/command_instance.h b/libweave/src/commands/command_instance.h
index e911ede..ee70065 100644
--- a/libweave/src/commands/command_instance.h
+++ b/libweave/src/commands/command_instance.h
@@ -34,7 +34,7 @@
   // be in format "<package_name>.<command_name>", a command |category| and
   // a list of parameters and their values specified in |parameters|.
   CommandInstance(const std::string& name,
-                  const std::string& origin,
+                  CommandOrigin origin,
                   const CommandDefinition* command_definition,
                   const ValueMap& parameters);
   ~CommandInstance() override;
@@ -45,8 +45,8 @@
   const std::string& GetID() const override;
   const std::string& GetName() const override;
   const std::string& GetCategory() const override;
-  const std::string& GetStatus() const override;
-  const std::string& GetOrigin() const override;
+  CommandStatus GetStatus() const override;
+  CommandOrigin GetOrigin() const override;
   std::unique_ptr<base::DictionaryValue> GetParameters() const override;
   std::unique_ptr<base::DictionaryValue> GetProgress() const override;
   std::unique_ptr<base::DictionaryValue> GetResults() const override;
@@ -73,7 +73,7 @@
   // This is used to report parse failures back to the server.
   static std::unique_ptr<CommandInstance> FromJson(
       const base::Value* value,
-      const std::string& origin,
+      CommandOrigin origin,
       const CommandDictionary& dictionary,
       std::string* command_id,
       chromeos::ErrorPtr* error);
@@ -84,20 +84,10 @@
   // Sets the pointer to queue this command is part of.
   void SetCommandQueue(CommandQueue* queue) { queue_ = queue; }
 
-  // Values for command execution status.
-  static const char kStatusQueued[];
-  static const char kStatusInProgress[];
-  static const char kStatusPaused[];
-  static const char kStatusError[];
-  static const char kStatusDone[];
-  static const char kStatusCancelled[];
-  static const char kStatusAborted[];
-  static const char kStatusExpired[];
-
  private:
   // Helper function to update the command status.
   // Used by Abort(), Cancel(), Done() methods.
-  void SetStatus(const std::string& status);
+  void SetStatus(CommandStatus status);
   // Helper method that removes this command from the command queue.
   // Note that since the command queue owns the lifetime of the command instance
   // object, removing a command from the queue will also destroy it.
@@ -108,7 +98,7 @@
   // Full command name as "<package_name>.<command_name>".
   std::string name_;
   // The origin of the command, either "local" or "cloud".
-  std::string origin_;
+  CommandOrigin origin_ = CommandOrigin::kLocal;
   // Command definition.
   const CommandDefinition* command_definition_;
   // Command parameters and their values.
@@ -118,7 +108,7 @@
   // Command results.
   ValueMap results_;
   // Current command status.
-  std::string status_ = kStatusQueued;
+  CommandStatus status_ = CommandStatus::kQueued;
   // Command observer for the command.
   std::vector<Observer*> observers_;
   // Pointer to the command queue this command instance is added to.
diff --git a/libweave/src/commands/command_instance_unittest.cc b/libweave/src/commands/command_instance_unittest.cc
index 4a7972a..43465c3 100644
--- a/libweave/src/commands/command_instance_unittest.cc
+++ b/libweave/src/commands/command_instance_unittest.cc
@@ -75,8 +75,8 @@
   ValueMap params;
   params["phrase"] = str_prop.CreateValue(std::string("iPityDaFool"), nullptr);
   params["volume"] = int_prop.CreateValue(5, nullptr);
-  CommandInstance instance{
-      "robot.speak", "cloud", dict_.FindCommand("robot.speak"), params};
+  CommandInstance instance{"robot.speak", CommandOrigin::kCloud,
+                           dict_.FindCommand("robot.speak"), params};
 
   EXPECT_TRUE(
       instance.SetResults(*CreateDictionaryValue("{'foo': 239}"), nullptr));
@@ -84,19 +84,23 @@
   EXPECT_EQ("", instance.GetID());
   EXPECT_EQ("robot.speak", instance.GetName());
   EXPECT_EQ("robotd", instance.GetCategory());
-  EXPECT_EQ("cloud", instance.GetOrigin());
+  EXPECT_EQ(CommandOrigin::kCloud, instance.GetOrigin());
   EXPECT_JSON_EQ("{'phrase': 'iPityDaFool', 'volume': 5}",
                  *instance.GetParameters());
   EXPECT_JSON_EQ("{'foo': 239}", *instance.GetResults());
 
-  CommandInstance instance2{
-      "base.reboot", "local", dict_.FindCommand("base.reboot"), {}};
-  EXPECT_EQ("local", instance2.GetOrigin());
+  CommandInstance instance2{"base.reboot",
+                            CommandOrigin::kLocal,
+                            dict_.FindCommand("base.reboot"),
+                            {}};
+  EXPECT_EQ(CommandOrigin::kLocal, instance2.GetOrigin());
 }
 
 TEST_F(CommandInstanceTest, SetID) {
-  CommandInstance instance{
-      "base.reboot", "local", dict_.FindCommand("base.reboot"), {}};
+  CommandInstance instance{"base.reboot",
+                           CommandOrigin::kLocal,
+                           dict_.FindCommand("base.reboot"),
+                           {}};
   instance.SetID("command_id");
   EXPECT_EQ("command_id", instance.GetID());
 }
@@ -112,8 +116,8 @@
     'results': {}
   })");
   std::string id;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, &id, nullptr);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, &id, nullptr);
   EXPECT_EQ("abcd", id);
   EXPECT_EQ("abcd", instance->GetID());
   EXPECT_EQ("robot.jump", instance->GetName());
@@ -124,8 +128,8 @@
 
 TEST_F(CommandInstanceTest, FromJson_ParamsOmitted) {
   auto json = CreateDictionaryValue("{'name': 'base.reboot'}");
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, nullptr);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, nullptr);
   EXPECT_EQ("base.reboot", instance->GetName());
   EXPECT_EQ("robotd", instance->GetCategory());
   EXPECT_JSON_EQ("{}", *instance->GetParameters());
@@ -134,8 +138,8 @@
 TEST_F(CommandInstanceTest, FromJson_NotObject) {
   auto json = CreateValue("'string'");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   EXPECT_EQ("json_object_expected", error->GetCode());
   EXPECT_EQ("Command instance is not a JSON object", error->GetMessage());
@@ -144,8 +148,8 @@
 TEST_F(CommandInstanceTest, FromJson_NameMissing) {
   auto json = CreateDictionaryValue("{'param': 'value'}");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   EXPECT_EQ("parameter_missing", error->GetCode());
   EXPECT_EQ("Command name is missing", error->GetMessage());
@@ -154,8 +158,8 @@
 TEST_F(CommandInstanceTest, FromJson_UnknownCommand) {
   auto json = CreateDictionaryValue("{'name': 'robot.scream'}");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   EXPECT_EQ("invalid_command_name", error->GetCode());
   EXPECT_EQ("Unknown command received: robot.scream", error->GetMessage());
@@ -167,8 +171,8 @@
     'parameters': 'hello'
   })");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   auto inner = error->GetInnerError();
   EXPECT_EQ("json_object_expected", inner->GetCode());
@@ -186,8 +190,8 @@
     }
   })");
   chromeos::ErrorPtr error;
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, &error);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, &error);
   EXPECT_EQ(nullptr, instance.get());
   auto first = error->GetFirstError();
   EXPECT_EQ("out_of_range", first->GetCode());
@@ -209,8 +213,8 @@
     },
     'results': {}
   })");
-  auto instance =
-      CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, nullptr);
+  auto instance = CommandInstance::FromJson(json.get(), CommandOrigin::kCloud,
+                                            dict_, nullptr, nullptr);
   EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
                                     nullptr));
   EXPECT_TRUE(instance->SetProgress(*CreateDictionaryValue("{'progress': 15}"),
diff --git a/libweave/src/commands/command_manager.cc b/libweave/src/commands/command_manager.cc
index 8f85647..6baab68 100644
--- a/libweave/src/commands/command_manager.cc
+++ b/libweave/src/commands/command_manager.cc
@@ -107,8 +107,7 @@
                                 std::string* id,
                                 chromeos::ErrorPtr* error) {
   auto command_instance = CommandInstance::FromJson(
-      &command, commands::attributes::kCommand_Visibility_Local,
-      GetCommandDictionary(), nullptr, error);
+      &command, CommandOrigin::kLocal, GetCommandDictionary(), nullptr, error);
   if (!command_instance)
     return false;
 
diff --git a/libweave/src/commands/command_queue_unittest.cc b/libweave/src/commands/command_queue_unittest.cc
index dd644ac..cd91c3d 100644
--- a/libweave/src/commands/command_queue_unittest.cc
+++ b/libweave/src/commands/command_queue_unittest.cc
@@ -23,8 +23,8 @@
   std::unique_ptr<CommandInstance> CreateDummyCommandInstance(
       const std::string& name,
       const std::string& id) {
-    std::unique_ptr<CommandInstance> cmd{
-        new CommandInstance{name, "local", &command_definition_, {}}};
+    std::unique_ptr<CommandInstance> cmd{new CommandInstance{
+        name, CommandOrigin::kLocal, &command_definition_, {}}};
     cmd->SetID(id);
     return cmd;
   }
diff --git a/libweave/src/commands/dbus_command_proxy.cc b/libweave/src/commands/dbus_command_proxy.cc
index 86450e2..1ad5d59 100644
--- a/libweave/src/commands/dbus_command_proxy.cc
+++ b/libweave/src/commands/dbus_command_proxy.cc
@@ -8,6 +8,7 @@
 #include <chromeos/dbus/exported_object_manager.h>
 
 #include "libweave/src/commands/dbus_conversion.h"
+#include "weave/enum_to_string.h"
 
 using chromeos::dbus_utils::AsyncEventSequencer;
 using chromeos::dbus_utils::ExportedObjectManager;
@@ -29,10 +30,10 @@
   dbus_adaptor_.SetName(command_->GetName());
   dbus_adaptor_.SetCategory(command_->GetCategory());
   dbus_adaptor_.SetId(command_->GetID());
-  dbus_adaptor_.SetStatus(command_->GetStatus());
+  dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus()));
   dbus_adaptor_.SetProgress(
       DictionaryToDBusVariantDictionary(*command_->GetProgress()));
-  dbus_adaptor_.SetOrigin(command_->GetOrigin());
+  dbus_adaptor_.SetOrigin(EnumToString(command_->GetOrigin()));
   dbus_adaptor_.SetParameters(
       DictionaryToDBusVariantDictionary(*command_->GetParameters()));
   dbus_adaptor_.SetResults(
@@ -48,7 +49,7 @@
 }
 
 void DBusCommandProxy::OnStatusChanged() {
-  dbus_adaptor_.SetStatus(command_->GetStatus());
+  dbus_adaptor_.SetStatus(EnumToString(command_->GetStatus()));
 }
 
 void DBusCommandProxy::OnProgressChanged() {
diff --git a/libweave/src/commands/dbus_command_proxy_unittest.cc b/libweave/src/commands/dbus_command_proxy_unittest.cc
index a289cad..7ae2b32 100644
--- a/libweave/src/commands/dbus_command_proxy_unittest.cc
+++ b/libweave/src/commands/dbus_command_proxy_unittest.cc
@@ -20,6 +20,8 @@
 #include "libweave/src/commands/command_instance.h"
 #include "libweave/src/commands/unittest_utils.h"
 
+#include "weave/enum_to_string.h"
+
 namespace weave {
 
 using ::testing::AnyNumber;
@@ -99,8 +101,8 @@
         '_jumpType': '_withKick'
       }
     })");
-    command_instance_ =
-        CommandInstance::FromJson(json.get(), "local", dict_, nullptr, nullptr);
+    command_instance_ = CommandInstance::FromJson(
+        json.get(), CommandOrigin::kLocal, dict_, nullptr, nullptr);
     command_instance_->SetID(kTestCommandId);
 
     // Set up a mock ExportedObject to be used with the DBus command proxy.
@@ -144,6 +146,12 @@
     return GetCommandProxy();
   }
 
+  CommandStatus GetCommandStatus() const {
+    CommandStatus status;
+    EXPECT_TRUE(StringToEnum(GetCommandAdaptor()->GetStatus(), &status));
+    return status;
+  }
+
   std::unique_ptr<CommandInstance> command_instance_;
   CommandDictionary dict_;
 
@@ -155,7 +163,7 @@
   VariantDictionary params = {
       {"height", int32_t{53}}, {"_jumpType", std::string{"_withKick"}},
   };
-  EXPECT_EQ(CommandInstance::kStatusQueued, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kQueued, GetCommandStatus());
   EXPECT_EQ(params, GetCommandAdaptor()->GetParameters());
   EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetProgress());
   EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetResults());
@@ -168,8 +176,7 @@
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(2);
   EXPECT_TRUE(
       GetCommandInterface()->SetProgress(nullptr, {{"progress", int32_t{10}}}));
-  EXPECT_EQ(CommandInstance::kStatusInProgress,
-            GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kInProgress, GetCommandStatus());
 
   VariantDictionary progress{{"progress", int32_t{10}}};
   EXPECT_EQ(progress, GetCommandAdaptor()->GetProgress());
@@ -178,7 +185,7 @@
 TEST_F(DBusCommandProxyTest, SetProgress_OutOfRange) {
   EXPECT_FALSE(GetCommandInterface()->SetProgress(
       nullptr, {{"progress", int32_t{110}}}));
-  EXPECT_EQ(CommandInstance::kStatusQueued, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kQueued, GetCommandStatus());
   EXPECT_EQ(VariantDictionary{}, GetCommandAdaptor()->GetProgress());
 }
 
@@ -216,14 +223,13 @@
 TEST_F(DBusCommandProxyTest, Abort) {
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
   GetCommandInterface()->Abort();
-  EXPECT_EQ(CommandInstance::kStatusAborted, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kAborted, GetCommandStatus());
 }
 
 TEST_F(DBusCommandProxyTest, Cancel) {
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
   GetCommandInterface()->Cancel();
-  EXPECT_EQ(CommandInstance::kStatusCancelled,
-            GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kCancelled, GetCommandStatus());
 }
 
 TEST_F(DBusCommandProxyTest, Done) {
@@ -231,7 +237,7 @@
   // status: queued -> done
   EXPECT_CALL(*mock_exported_object_command_, SendSignal(_)).Times(1);
   GetCommandInterface()->Done();
-  EXPECT_EQ(CommandInstance::kStatusDone, GetCommandAdaptor()->GetStatus());
+  EXPECT_EQ(CommandStatus::kDone, GetCommandStatus());
 }
 
 }  // namespace weave
diff --git a/libweave/src/device_registration_info.cc b/libweave/src/device_registration_info.cc
index 500761c..e733d1b 100644
--- a/libweave/src/device_registration_info.cc
+++ b/libweave/src/device_registration_info.cc
@@ -786,7 +786,7 @@
                                                   chromeos::ErrorPtr error) {
   base::DictionaryValue command_patch;
   command_patch.SetString(commands::attributes::kCommand_State,
-                          CommandInstance::kStatusAborted);
+                          EnumToString(CommandStatus::kAborted));
   if (error) {
     command_patch.SetString(commands::attributes::kCommand_ErrorCode,
                             chromeos::string_utils::Join(
@@ -997,8 +997,8 @@
   std::string command_id;
   chromeos::ErrorPtr error;
   auto command_instance = CommandInstance::FromJson(
-      &command, commands::attributes::kCommand_Visibility_Cloud,
-      command_manager_->GetCommandDictionary(), &command_id, &error);
+      &command, CommandOrigin::kCloud, command_manager_->GetCommandDictionary(),
+      &command_id, &error);
   if (!command_instance) {
     LOG(WARNING) << "Failed to parse a command instance: " << command;
     if (!command_id.empty())
