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() {
