Remove category from Commands definitions

BUG:24267885

Change-Id: If60064eaf7620a32156edf572d8ce887f9abad04
Reviewed-on: https://weave-review.googlesource.com/1234
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/libweave/examples/ubuntu/file_config_store.cc b/libweave/examples/ubuntu/file_config_store.cc
index d28f817..d3b3b43 100644
--- a/libweave/examples/ubuntu/file_config_store.cc
+++ b/libweave/examples/ubuntu/file_config_store.cc
@@ -60,8 +60,8 @@
   str << settings;
 }
 
-std::map<std::string, std::string> FileConfigStore::LoadCommandDefs() {
-  return {{kCategory, R"({
+std::vector<std::string> FileConfigStore::LoadCommandDefs() {
+  return {R"({
     "base": {
       "updateBaseConfiguration": {},
       "identify": {},
@@ -74,7 +74,7 @@
         "results": { "_greeting": "string" }
       }
     }
-  })"}};
+  })"};
 }
 
 std::vector<std::string> FileConfigStore::LoadStateDefs() {
diff --git a/libweave/examples/ubuntu/file_config_store.h b/libweave/examples/ubuntu/file_config_store.h
index 53e56f1..926576f 100644
--- a/libweave/examples/ubuntu/file_config_store.h
+++ b/libweave/examples/ubuntu/file_config_store.h
@@ -21,7 +21,7 @@
   bool LoadDefaults(Settings* settings) override;
   std::string LoadSettings() override;
   void SaveSettings(const std::string& settings) override;
-  std::map<std::string, std::string> LoadCommandDefs() override;
+  std::vector<std::string> LoadCommandDefs() override;
   std::vector<std::string> LoadStateDefs() override;
   std::vector<std::string> LoadStateDefaults() override;
 
diff --git a/libweave/include/weave/command.h b/libweave/include/weave/command.h
index e3d35a7..911da1e 100644
--- a/libweave/include/weave/command.h
+++ b/libweave/include/weave/command.h
@@ -52,9 +52,6 @@
   // Returns the full name of the command.
   virtual const std::string& GetName() const = 0;
 
-  // Returns the command category.
-  virtual const std::string& GetCategory() const = 0;
-
   // Returns the command status.
   virtual CommandStatus GetStatus() const = 0;
 
diff --git a/libweave/include/weave/provider/config_store.h b/libweave/include/weave/provider/config_store.h
index 64975a7..aa7c5e5 100644
--- a/libweave/include/weave/provider/config_store.h
+++ b/libweave/include/weave/provider/config_store.h
@@ -35,11 +35,8 @@
   // recommended to protect data, e.g. using encryption.
   virtual void SaveSettings(const std::string& settings) = 0;
 
-  // Returns command definitions as JSON.
-  // Key is unique string which will be used to assign single command handler
-  // later.
-  // Value is JSON with command definition.
-  virtual std::map<std::string, std::string> LoadCommandDefs() = 0;
+  // Returns command definitions as array of JSONs.
+  virtual std::vector<std::string> LoadCommandDefs() = 0;
 
   // Returns device state definitions as array of JSONs.
   virtual std::vector<std::string> LoadStateDefs() = 0;
diff --git a/libweave/include/weave/provider/test/mock_config_store.h b/libweave/include/weave/provider/test/mock_config_store.h
index 30027f3..6eab802 100644
--- a/libweave/include/weave/provider/test/mock_config_store.h
+++ b/libweave/include/weave/provider/test/mock_config_store.h
@@ -42,7 +42,7 @@
   MOCK_METHOD0(LoadSettings, std::string());
   MOCK_METHOD1(SaveSettings, void(const std::string&));
 
-  MOCK_METHOD0(LoadCommandDefs, std::map<std::string, std::string>());
+  MOCK_METHOD0(LoadCommandDefs, std::vector<std::string>());
   MOCK_METHOD0(LoadStateDefs, std::vector<std::string>());
   MOCK_METHOD0(LoadStateDefaults, std::vector<std::string>());
 };
diff --git a/libweave/src/base_api_handler_unittest.cc b/libweave/src/base_api_handler_unittest.cc
index 25a07f6..a583dc3 100644
--- a/libweave/src/base_api_handler_unittest.cc
+++ b/libweave/src/base_api_handler_unittest.cc
@@ -68,7 +68,7 @@
   void LoadCommands(const std::string& command_definitions) {
     auto json = test::CreateDictionaryValue(command_definitions.c_str());
     EXPECT_TRUE(command_manager_->LoadBaseCommands(*json, nullptr));
-    EXPECT_TRUE(command_manager_->LoadCommands(*json, "", nullptr));
+    EXPECT_TRUE(command_manager_->LoadCommands(*json, nullptr));
   }
 
   void AddCommand(const std::string& command) {
diff --git a/libweave/src/commands/cloud_command_proxy_unittest.cc b/libweave/src/commands/cloud_command_proxy_unittest.cc
index b462439..e1d96b0 100644
--- a/libweave/src/commands/cloud_command_proxy_unittest.cc
+++ b/libweave/src/commands/cloud_command_proxy_unittest.cc
@@ -94,7 +94,7 @@
       }
     })");
     CHECK(json.get());
-    CHECK(command_dictionary_.LoadCommands(*json, "calcd", nullptr, nullptr))
+    CHECK(command_dictionary_.LoadCommands(*json, nullptr, nullptr))
         << "Failed to parse test command dictionary";
 
     CreateCommandInstance();
diff --git a/libweave/src/commands/command_definition.cc b/libweave/src/commands/command_definition.cc
index 1deb594..21e186a 100644
--- a/libweave/src/commands/command_definition.cc
+++ b/libweave/src/commands/command_definition.cc
@@ -71,12 +71,10 @@
 }
 
 CommandDefinition::CommandDefinition(
-    const std::string& category,
     std::unique_ptr<const ObjectSchema> parameters,
     std::unique_ptr<const ObjectSchema> progress,
     std::unique_ptr<const ObjectSchema> results)
-    : category_{category},
-      parameters_{std::move(parameters)},
+    : parameters_{std::move(parameters)},
       progress_{std::move(progress)},
       results_{std::move(results)} {
   // Set to be available to all clients by default.
diff --git a/libweave/src/commands/command_definition.h b/libweave/src/commands/command_definition.h
index a6a17f8..305e8f5 100644
--- a/libweave/src/commands/command_definition.h
+++ b/libweave/src/commands/command_definition.h
@@ -22,11 +22,8 @@
   kOwner,
 };
 
-// A simple GCD command definition. This class contains the command category
-// and a full object schema describing the command parameter types and
-// constraints. See comments for CommandDefinitions::LoadCommands for the
-// detailed description of what command categories are and what they are used
-// for.
+// A simple GCD command definition. This class contains the full object schema
+// describing the command parameter types and constraints.
 class CommandDefinition final {
  public:
   struct Visibility {
@@ -52,13 +49,10 @@
     bool cloud{false};  // Command is available to cloud clients.
   };
 
-  CommandDefinition(const std::string& category,
-                    std::unique_ptr<const ObjectSchema> parameters,
+  CommandDefinition(std::unique_ptr<const ObjectSchema> parameters,
                     std::unique_ptr<const ObjectSchema> progress,
                     std::unique_ptr<const ObjectSchema> results);
 
-  // Gets the category this command belongs to.
-  const std::string& GetCategory() const { return category_; }
   // Gets the object schema for command parameters.
   const ObjectSchema* GetParameters() const { return parameters_.get(); }
   // Gets the object schema for command progress.
@@ -75,7 +69,6 @@
   void SetMinimalRole(UserRole minimal_role) { minimal_role_ = minimal_role; }
 
  private:
-  std::string category_;  // Cmd category. Could be "powerd" for "base.reboot".
   std::unique_ptr<const ObjectSchema> parameters_;  // Command parameters def.
   std::unique_ptr<const ObjectSchema> progress_;    // Command progress def.
   std::unique_ptr<const ObjectSchema> results_;     // Command results def.
diff --git a/libweave/src/commands/command_definition_unittest.cc b/libweave/src/commands/command_definition_unittest.cc
index f3e5de8..dda2385 100644
--- a/libweave/src/commands/command_definition_unittest.cc
+++ b/libweave/src/commands/command_definition_unittest.cc
@@ -78,9 +78,8 @@
   const ObjectSchema* param_ptr = params.get();
   const ObjectSchema* progress_ptr = progress.get();
   const ObjectSchema* results_ptr = results.get();
-  CommandDefinition def{"powerd", std::move(params), std::move(progress),
+  CommandDefinition def{std::move(params), std::move(progress),
                         std::move(results)};
-  EXPECT_EQ("powerd", def.GetCategory());
   EXPECT_EQ(param_ptr, def.GetParameters());
   EXPECT_EQ(progress_ptr, def.GetProgress());
   EXPECT_EQ(results_ptr, def.GetResults());
diff --git a/libweave/src/commands/command_dictionary.cc b/libweave/src/commands/command_dictionary.cc
index 0dcb441..f03e92d 100644
--- a/libweave/src/commands/command_dictionary.cc
+++ b/libweave/src/commands/command_dictionary.cc
@@ -13,18 +13,7 @@
 
 namespace weave {
 
-std::vector<std::string> CommandDictionary::GetCommandNamesByCategory(
-    const std::string& category) const {
-  std::vector<std::string> names;
-  for (const auto& pair : definitions_) {
-    if (pair.second->GetCategory() == category)
-      names.push_back(pair.first);
-  }
-  return names;
-}
-
 bool CommandDictionary::LoadCommands(const base::DictionaryValue& json,
-                                     const std::string& category,
                                      const CommandDictionary* base_commands,
                                      ErrorPtr* error) {
   CommandMap new_defs;
@@ -142,7 +131,7 @@
       }
 
       std::unique_ptr<CommandDefinition> command_def{new CommandDefinition{
-          category, std::move(parameters_schema), std::move(progress_schema),
+          std::move(parameters_schema), std::move(progress_schema),
           std::move(results_schema)}};
       command_def->SetVisibility(visibility);
       command_def->SetMinimalRole(minimal_role);
@@ -159,18 +148,11 @@
   // daemon on the same device.
   for (const auto& pair : new_defs) {
     auto iter = definitions_.find(pair.first);
-    CHECK(iter == definitions_.end())
-        << "Definition for command '" << pair.first
-        << "' overrides an earlier definition in category '"
-        << iter->second->GetCategory().c_str() << "'";
+    CHECK(iter == definitions_.end()) << "Definition for command '"
+                                      << pair.first
+                                      << "' overrides an earlier definition";
   }
 
-  // Now that we successfully loaded all the command definitions,
-  // remove previous definitions of commands from the same category.
-  std::vector<std::string> names = GetCommandNamesByCategory(category);
-  for (const std::string& name : names)
-    definitions_.erase(name);
-
   // Insert new definitions into the global map.
   for (auto& pair : new_defs)
     definitions_.emplace(pair.first, std::move(pair.second));
diff --git a/libweave/src/commands/command_dictionary.h b/libweave/src/commands/command_dictionary.h
index f0f3bbd..389d419 100644
--- a/libweave/src/commands/command_dictionary.h
+++ b/libweave/src/commands/command_dictionary.h
@@ -34,27 +34,14 @@
  public:
   CommandDictionary() = default;
 
-  // Gets the list of names of commands that belong to the given category.
-  std::vector<std::string> GetCommandNamesByCategory(
-      const std::string& category) const;
-
   // Loads command definitions from a JSON object. This is done at the daemon
   // startup and whenever a device daemon decides to update its command list.
-  // |json| is a JSON dictionary that describes the complete commands contained
-  // in a particular |category|. Usually, |categories| are 1:1 with daemons on
-  // a device. For instance, the power manager daemon might provide a category
-  // "power_man" that provides the "base.reboot" and "base.shutdown" commands.
-  // However, nothing prohibits a daemon providing commands in two categories.
-  // When LoadCommands is called, all previous definitions of commands from the
-  // same category are removed, effectively replacing all the commands in the
-  // given category.
-  // Optional |base_commands| parameter specifies the definition of standard
-  // GCD commands for parameter schema validation. Can be set to nullptr if
-  // no validation is needed.
-  // Returns false on failure and |error| provides additional error information
-  // when provided.
+  // |json| is a JSON dictionary that describes the complete commands. Optional
+  // |base_commands| parameter specifies the definition of standard GCD commands
+  // for parameter schema validation. Can be set to nullptr if no validation is
+  // needed. Returns false on failure and |error| provides additional error
+  // information when provided.
   bool LoadCommands(const base::DictionaryValue& json,
-                    const std::string& category,
                     const CommandDictionary* base_commands,
                     ErrorPtr* error);
   // Converts all the command definitions to a JSON object for CDD/Device
diff --git a/libweave/src/commands/command_dictionary_unittest.cc b/libweave/src/commands/command_dictionary_unittest.cc
index ac9e261..531a561 100644
--- a/libweave/src/commands/command_dictionary_unittest.cc
+++ b/libweave/src/commands/command_dictionary_unittest.cc
@@ -17,7 +17,6 @@
   CommandDictionary dict;
   EXPECT_TRUE(dict.IsEmpty());
   EXPECT_EQ(nullptr, dict.FindCommand("robot.jump"));
-  EXPECT_TRUE(dict.GetCommandNamesByCategory("robotd").empty());
 }
 
 TEST(CommandDictionary, LoadCommands) {
@@ -36,7 +35,7 @@
     }
   })");
   CommandDictionary dict;
-  EXPECT_TRUE(dict.LoadCommands(*json, "robotd", nullptr, nullptr));
+  EXPECT_TRUE(dict.LoadCommands(*json, nullptr, nullptr));
   EXPECT_EQ(1, dict.GetSize());
   EXPECT_NE(nullptr, dict.FindCommand("robot.jump"));
   json = CreateDictionaryValue(R"({
@@ -48,14 +47,12 @@
       }
     }
   })");
-  EXPECT_TRUE(dict.LoadCommands(*json, "powerd", nullptr, nullptr));
+  EXPECT_TRUE(dict.LoadCommands(*json, nullptr, nullptr));
   EXPECT_EQ(3, dict.GetSize());
   EXPECT_NE(nullptr, dict.FindCommand("robot.jump"));
   EXPECT_NE(nullptr, dict.FindCommand("base.reboot"));
   EXPECT_NE(nullptr, dict.FindCommand("base.shutdown"));
   EXPECT_EQ(nullptr, dict.FindCommand("foo.bar"));
-  std::vector<std::string> expected_commands{"base.reboot", "base.shutdown"};
-  EXPECT_EQ(expected_commands, dict.GetCommandNamesByCategory("powerd"));
 }
 
 TEST(CommandDictionary, LoadWithInheritance) {
@@ -77,12 +74,12 @@
     }
   })");
   CommandDictionary base_dict;
-  EXPECT_TRUE(base_dict.LoadCommands(*json, "test1", nullptr, nullptr));
+  EXPECT_TRUE(base_dict.LoadCommands(*json, nullptr, nullptr));
   EXPECT_EQ(1, base_dict.GetSize());
   json = CreateDictionaryValue(R"({'robot': {'jump': {}}})");
 
   CommandDictionary dict;
-  EXPECT_TRUE(dict.LoadCommands(*json, "test2", &base_dict, nullptr));
+  EXPECT_TRUE(dict.LoadCommands(*json, &base_dict, nullptr));
   EXPECT_EQ(1, dict.GetSize());
 
   auto cmd = dict.FindCommand("robot.jump");
@@ -105,27 +102,27 @@
 
   // Command definition is not an object.
   auto json = CreateDictionaryValue("{'robot':{'jump':0}}");
-  EXPECT_FALSE(dict.LoadCommands(*json, "robotd", nullptr, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json, nullptr, &error));
   EXPECT_EQ("type_mismatch", error->GetCode());
   error.reset();
 
   // Package definition is not an object.
   json = CreateDictionaryValue("{'robot':'blah'}");
-  EXPECT_FALSE(dict.LoadCommands(*json, "robotd", nullptr, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json, nullptr, &error));
   EXPECT_EQ("type_mismatch", error->GetCode());
   error.reset();
 
   // Invalid command definition is not an object.
   json = CreateDictionaryValue(
       "{'robot':{'jump':{'parameters':{'flip':0},'results':{}}}}");
-  EXPECT_FALSE(dict.LoadCommands(*json, "robotd", nullptr, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json, nullptr, &error));
   EXPECT_EQ("invalid_object_schema", error->GetCode());
   EXPECT_NE(nullptr, error->GetInnerError());  // Must have additional info.
   error.reset();
 
   // Empty command name.
   json = CreateDictionaryValue("{'robot':{'':{'parameters':{},'results':{}}}}");
-  EXPECT_FALSE(dict.LoadCommands(*json, "robotd", nullptr, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json, nullptr, &error));
   EXPECT_EQ("invalid_command_name", error->GetCode());
   error.reset();
 }
@@ -135,10 +132,10 @@
   CommandDictionary dict;
   ErrorPtr error;
   auto json = CreateDictionaryValue("{'robot':{'jump':{}}}");
-  dict.LoadCommands(*json, "category1", nullptr, &error);
-  ASSERT_DEATH(dict.LoadCommands(*json, "category2", nullptr, &error),
+  dict.LoadCommands(*json, nullptr, &error);
+  ASSERT_DEATH(dict.LoadCommands(*json, nullptr, &error),
                ".*Definition for command 'robot.jump' overrides an "
-               "earlier definition in category 'category1'");
+               "earlier definition");
 }
 
 TEST(CommandDictionary, LoadCommands_CustomCommandNaming) {
@@ -154,18 +151,18 @@
       }
     }
   })");
-  base_dict.LoadCommands(*json, "", nullptr, &error);
-  EXPECT_TRUE(dict.LoadCommands(*json, "robotd", &base_dict, &error));
+  base_dict.LoadCommands(*json, nullptr, &error);
+  EXPECT_TRUE(dict.LoadCommands(*json, &base_dict, &error));
   auto json2 =
       CreateDictionaryValue("{'base':{'jump':{'parameters':{},'results':{}}}}");
-  EXPECT_FALSE(dict.LoadCommands(*json2, "robotd", &base_dict, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json2, &base_dict, &error));
   EXPECT_EQ("invalid_command_name", error->GetCode());
   error.reset();
 
   // If the command starts with "_", then it's Ok.
   json2 = CreateDictionaryValue(
       "{'base':{'_jump':{'parameters':{},'results':{}}}}");
-  EXPECT_TRUE(dict.LoadCommands(*json2, "robotd", &base_dict, nullptr));
+  EXPECT_TRUE(dict.LoadCommands(*json2, &base_dict, nullptr));
 }
 
 TEST(CommandDictionary, LoadCommands_RedefineStdCommand) {
@@ -181,7 +178,7 @@
       }
     }
   })");
-  base_dict.LoadCommands(*json, "", nullptr, &error);
+  base_dict.LoadCommands(*json, nullptr, &error);
 
   auto json2 = CreateDictionaryValue(R"({
     'base': {
@@ -191,7 +188,7 @@
       }
     }
   })");
-  EXPECT_FALSE(dict.LoadCommands(*json2, "robotd", &base_dict, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json2, &base_dict, &error));
   EXPECT_EQ("invalid_object_schema", error->GetCode());
   EXPECT_EQ("invalid_parameter_definition", error->GetInnerError()->GetCode());
   EXPECT_EQ("param_type_changed", error->GetFirstError()->GetCode());
@@ -205,7 +202,7 @@
       }
     }
   })");
-  EXPECT_FALSE(dict.LoadCommands(*json3, "robotd", &base_dict, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json3, &base_dict, &error));
   EXPECT_EQ("invalid_object_schema", error->GetCode());
   // TODO(antonm): remove parameter from error below and use some generic.
   EXPECT_EQ("invalid_parameter_definition", error->GetInnerError()->GetCode());
@@ -227,7 +224,7 @@
     }
   })");
   CommandDictionary base_dict;
-  base_dict.LoadCommands(*json_base, "base", nullptr, nullptr);
+  base_dict.LoadCommands(*json_base, nullptr, nullptr);
 
   auto json = CreateDictionaryValue(R"({
     'base': {
@@ -244,7 +241,7 @@
     }
   })");
   CommandDictionary dict;
-  dict.LoadCommands(*json, "device", &base_dict, nullptr);
+  dict.LoadCommands(*json, &base_dict, nullptr);
 
   json = dict.GetCommandsAsJson(
       [](const CommandDefinition* def) { return true; }, false, nullptr);
@@ -341,7 +338,7 @@
     }
   })");
   CommandDictionary dict;
-  ASSERT_TRUE(dict.LoadCommands(*json, "test", nullptr, nullptr));
+  ASSERT_TRUE(dict.LoadCommands(*json, nullptr, nullptr));
 
   json = dict.GetCommandsAsJson(
       [](const CommandDefinition* def) { return true; }, false, nullptr);
@@ -438,7 +435,7 @@
       }
     }
   })");
-  EXPECT_TRUE(base_dict.LoadCommands(*json, "testd", nullptr, nullptr));
+  EXPECT_TRUE(base_dict.LoadCommands(*json, nullptr, nullptr));
 
   auto cmd = base_dict.FindCommand("base.command1");
   ASSERT_NE(nullptr, cmd);
@@ -494,7 +491,7 @@
       }
     }
   })");
-  EXPECT_TRUE(dict.LoadCommands(*json, "testd", &base_dict, nullptr));
+  EXPECT_TRUE(dict.LoadCommands(*json, &base_dict, nullptr));
 
   cmd = dict.FindCommand("base.command1");
   ASSERT_NE(nullptr, cmd);
@@ -540,7 +537,7 @@
       }
     }
   })");
-  EXPECT_FALSE(dict.LoadCommands(*json, "testd", nullptr, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json, nullptr, &error));
   EXPECT_EQ("invalid_command_visibility", error->GetCode());
   EXPECT_EQ("invalid_parameter_value", error->GetInnerError()->GetCode());
   error.reset();
@@ -560,7 +557,7 @@
       }
     }
   })");
-  EXPECT_FALSE(dict.LoadCommands(*json, "testd", nullptr, &error));
+  EXPECT_FALSE(dict.LoadCommands(*json, nullptr, &error));
   EXPECT_EQ("invalid_minimal_role", error->GetCode());
   EXPECT_EQ("invalid_parameter_value", error->GetInnerError()->GetCode());
   error.reset();
diff --git a/libweave/src/commands/command_instance.cc b/libweave/src/commands/command_instance.cc
index ea2c773..a8891f7 100644
--- a/libweave/src/commands/command_instance.cc
+++ b/libweave/src/commands/command_instance.cc
@@ -70,10 +70,6 @@
   return name_;
 }
 
-const std::string& CommandInstance::GetCategory() const {
-  return command_definition_->GetCategory();
-}
-
 CommandStatus CommandInstance::GetStatus() const {
   return status_;
 }
diff --git a/libweave/src/commands/command_instance.h b/libweave/src/commands/command_instance.h
index 0b82a81..8a54b05 100644
--- a/libweave/src/commands/command_instance.h
+++ b/libweave/src/commands/command_instance.h
@@ -46,7 +46,6 @@
   void RemoveObserver(Observer* observer) override;
   const std::string& GetID() const override;
   const std::string& GetName() const override;
-  const std::string& GetCategory() const override;
   CommandStatus GetStatus() const override;
   CommandOrigin GetOrigin() const override;
   std::unique_ptr<base::DictionaryValue> GetParameters() const override;
diff --git a/libweave/src/commands/command_instance_unittest.cc b/libweave/src/commands/command_instance_unittest.cc
index 811d9bb..865ba6e 100644
--- a/libweave/src/commands/command_instance_unittest.cc
+++ b/libweave/src/commands/command_instance_unittest.cc
@@ -61,7 +61,7 @@
         }
       }
     })");
-    CHECK(dict_.LoadCommands(*json, "robotd", nullptr, nullptr))
+    CHECK(dict_.LoadCommands(*json, nullptr, nullptr))
         << "Failed to parse test command dictionary";
   }
   CommandDictionary dict_;
@@ -84,7 +84,6 @@
 
   EXPECT_EQ("", instance.GetID());
   EXPECT_EQ("robot.speak", instance.GetName());
-  EXPECT_EQ("robotd", instance.GetCategory());
   EXPECT_EQ(CommandOrigin::kCloud, instance.GetOrigin());
   EXPECT_JSON_EQ("{'phrase': 'iPityDaFool', 'volume': 5}",
                  *instance.GetParameters());
@@ -122,7 +121,6 @@
   EXPECT_EQ("abcd", id);
   EXPECT_EQ("abcd", instance->GetID());
   EXPECT_EQ("robot.jump", instance->GetName());
-  EXPECT_EQ("robotd", instance->GetCategory());
   EXPECT_JSON_EQ("{'height': 53, '_jumpType': '_withKick'}",
                  *instance->GetParameters());
 }
@@ -132,7 +130,6 @@
   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());
 }
 
diff --git a/libweave/src/commands/command_manager.cc b/libweave/src/commands/command_manager.cc
index bd7d02c..2add19e 100644
--- a/libweave/src/commands/command_manager.cc
+++ b/libweave/src/commands/command_manager.cc
@@ -66,7 +66,7 @@
 
 bool CommandManager::LoadBaseCommands(const base::DictionaryValue& dict,
                                       ErrorPtr* error) {
-  return base_dictionary_.LoadCommands(dict, "", nullptr, error);
+  return base_dictionary_.LoadCommands(dict, nullptr, error);
 }
 
 bool CommandManager::LoadBaseCommands(const std::string& json,
@@ -78,22 +78,19 @@
 }
 
 bool CommandManager::LoadCommands(const base::DictionaryValue& dict,
-                                  const std::string& category,
                                   ErrorPtr* error) {
-  bool result =
-      dictionary_.LoadCommands(dict, category, &base_dictionary_, error);
+  bool result = dictionary_.LoadCommands(dict, &base_dictionary_, error);
   for (const auto& cb : on_command_changed_)
     cb.Run();
   return result;
 }
 
 bool CommandManager::LoadCommands(const std::string& json,
-                                  const std::string& category,
                                   ErrorPtr* error) {
   std::unique_ptr<const base::DictionaryValue> dict = LoadJsonDict(json, error);
   if (!dict)
     return false;
-  return LoadCommands(*dict, category, error);
+  return LoadCommands(*dict, error);
 }
 
 void CommandManager::Startup(provider::ConfigStore* config_store) {
@@ -104,7 +101,7 @@
 
   // Loading the rest of commands.
   for (const auto& defs : config_store->LoadCommandDefs())
-    CHECK(this->LoadCommands(defs.second, defs.first, nullptr));
+    CHECK(this->LoadCommands(defs, nullptr));
 }
 
 void CommandManager::AddCommand(
diff --git a/libweave/src/commands/command_manager.h b/libweave/src/commands/command_manager.h
index ea1392c..2485233 100644
--- a/libweave/src/commands/command_manager.h
+++ b/libweave/src/commands/command_manager.h
@@ -61,19 +61,13 @@
   // the base command definitions from.
   bool LoadBaseCommands(const std::string& json, ErrorPtr* error);
 
-  // Loads device command schema for particular category.
-  // See CommandDictionary::LoadCommands for detailed description of the
-  // parameters.
+  // Loads device command schema.
   bool LoadCommands(const base::DictionaryValue& dict,
-                    const std::string& category,
                     ErrorPtr* error);
 
   // Same as the overload above, but takes a path to a json file to read
-  // the base command definitions from. Also, the command category is
-  // derived from file name (without extension). So, if the path points to
-  // "power_manager.json", the command category used will be "power_manager".
+  // the base command definitions from.
   bool LoadCommands(const std::string& json,
-                    const std::string& category,
                     ErrorPtr* error);
 
   // Startup method to be called by buffet daemon at startup.
diff --git a/libweave/src/commands/command_manager_unittest.cc b/libweave/src/commands/command_manager_unittest.cc
index 8d64650..ef77f4b 100644
--- a/libweave/src/commands/command_manager_unittest.cc
+++ b/libweave/src/commands/command_manager_unittest.cc
@@ -72,7 +72,7 @@
 TEST(CommandManager, LoadCommandsDict) {
   CommandManager manager;
   auto json = CreateDictionaryValue(kTestVendorCommands);
-  EXPECT_TRUE(manager.LoadCommands(*json, "category", nullptr));
+  EXPECT_TRUE(manager.LoadCommands(*json, nullptr));
 }
 
 TEST(CommandManager, LoadCommandsJson) {
@@ -107,7 +107,7 @@
       }
     }
   })";
-  EXPECT_TRUE(manager.LoadCommands(json_str, "test", nullptr));
+  EXPECT_TRUE(manager.LoadCommands(json_str, nullptr));
   EXPECT_EQ(2, manager.GetCommandDictionary().GetSize());
   EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("base.reboot"));
   EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("robot._jump"));
@@ -117,8 +117,8 @@
   CommandManager manager;
   provider::test::MockConfigStore config_store;
   EXPECT_CALL(config_store, LoadCommandDefs())
-      .WillOnce(Return(std::map<std::string, std::string>{
-          {"category", kTestVendorCommands}, {"test", kTestTestCommands}}));
+      .WillOnce(Return(
+          std::vector<std::string>{kTestVendorCommands, kTestTestCommands}));
   manager.Startup(&config_store);
   EXPECT_EQ(3, manager.GetCommandDictionary().GetSize());
   EXPECT_NE(nullptr, manager.GetCommandDictionary().FindCommand("robot._jump"));
@@ -152,7 +152,7 @@
       }
     }
   })");
-  ASSERT_TRUE(manager.LoadCommands(*json, "test", nullptr));
+  ASSERT_TRUE(manager.LoadCommands(*json, nullptr));
   EXPECT_EQ(2, update_count);
   const CommandDictionary& dict = manager.GetCommandDictionary();
   EXPECT_TRUE(manager.SetCommandVisibility(
diff --git a/libweave/src/commands/command_queue_unittest.cc b/libweave/src/commands/command_queue_unittest.cc
index f88a74e..dc02d9c 100644
--- a/libweave/src/commands/command_queue_unittest.cc
+++ b/libweave/src/commands/command_queue_unittest.cc
@@ -39,9 +39,8 @@
   CommandQueue queue_;
 
  private:
-  CommandDefinition command_definition_{"powerd", ObjectSchema::Create(),
-                                        ObjectSchema::Create(),
-                                        ObjectSchema::Create()};
+  CommandDefinition command_definition_{
+      ObjectSchema::Create(), ObjectSchema::Create(), ObjectSchema::Create()};
 };
 
 // Keeps track of commands being added to and removed from the queue_.
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc
index 34ea31a..f5c53fa 100644
--- a/libweave/src/device_registration_info_unittest.cc
+++ b/libweave/src/device_registration_info_unittest.cc
@@ -367,7 +367,7 @@
       }
     }
   })");
-  EXPECT_TRUE(command_manager_->LoadCommands(*json_cmds, "", nullptr));
+  EXPECT_TRUE(command_manager_->LoadCommands(*json_cmds, nullptr));
 
   std::string ticket_url = dev_reg_->GetServiceURL("registrationTickets/") +
                            test_data::kClaimTicketId;
@@ -516,7 +516,7 @@
       }
     }
   })");
-  EXPECT_TRUE(command_manager_->LoadCommands(*json_cmds, "", nullptr));
+  EXPECT_TRUE(command_manager_->LoadCommands(*json_cmds, nullptr));
 
   const std::string command_url = dev_reg_->GetServiceURL("commands/1234");
 
diff --git a/libweave/src/weave_unittest.cc b/libweave/src/weave_unittest.cc
index e731803..9ab0a2a 100644
--- a/libweave/src/weave_unittest.cc
+++ b/libweave/src/weave_unittest.cc
@@ -161,14 +161,13 @@
     EXPECT_CALL(config_store_, SaveSettings("")).WillRepeatedly(Return());
 
     EXPECT_CALL(config_store_, LoadCommandDefs())
-        .WillOnce(Return(
-            std::map<std::string, std::string>{{kCategory, kCommandDefs}}));
+        .WillOnce(Return(std::vector<std::string>{kCommandDefs}));
 
     EXPECT_CALL(config_store_, LoadStateDefs())
-        .WillOnce(Return(std::vector<std::string>{{kStateDefs}}));
+        .WillOnce(Return(std::vector<std::string>{kStateDefs}));
 
     EXPECT_CALL(config_store_, LoadStateDefaults())
-        .WillOnce(Return(std::vector<std::string>{{kStateDefaults}}));
+        .WillOnce(Return(std::vector<std::string>{kStateDefaults}));
   }
 
   void InitNetwork() {