diff --git a/buffet/commands/command_dictionary.cc b/buffet/commands/command_dictionary.cc
index 69f9e2b..38c8bce 100644
--- a/buffet/commands/command_dictionary.cc
+++ b/buffet/commands/command_dictionary.cc
@@ -35,8 +35,8 @@
     std::string package = package_iter.key();
     const base::DictionaryValue* package_value = nullptr;
     if (!package_iter.value().GetAsDictionary(&package_value)) {
-      Error::AddToPrintf(error, commands::errors::kDomain,
-                         commands::errors::kTypeMismatch,
+      Error::AddToPrintf(error, errors::commands::kDomain,
+                         errors::commands::kTypeMismatch,
                          "Expecting an object for package '%s'",
                          package.c_str());
       return false;
@@ -47,8 +47,8 @@
       std::string command = command_iter.key();
       const base::DictionaryValue* command_value = nullptr;
       if (!command_iter.value().GetAsDictionary(&command_value)) {
-        Error::AddToPrintf(error, commands::errors::kDomain,
-                           commands::errors::kTypeMismatch,
+        Error::AddToPrintf(error, errors::commands::kDomain,
+                           errors::commands::kTypeMismatch,
                            "Expecting an object for command '%s'",
                            command.c_str());
         return false;
@@ -60,8 +60,8 @@
       const base::DictionaryValue* command_schema_def = nullptr;
       if (!command_value->GetDictionaryWithoutPathExpansion(
           commands::attributes::kCommand_Parameters, &command_schema_def)) {
-        Error::AddToPrintf(error, commands::errors::kDomain,
-                           commands::errors::kPropertyMissing,
+        Error::AddToPrintf(error, errors::commands::kDomain,
+                           errors::commands::kPropertyMissing,
                            "Command definition '%s' is missing property '%s'",
                            command_name.c_str(),
                            commands::attributes::kCommand_Parameters);
@@ -69,8 +69,8 @@
       }
       auto command_schema = std::make_shared<ObjectSchema>();
       if (!command_schema->FromJson(command_schema_def, nullptr, error)) {
-        Error::AddToPrintf(error, commands::errors::kDomain,
-                           commands::errors::kInvalidObjectSchema,
+        Error::AddToPrintf(error, errors::commands::kDomain,
+                           errors::commands::kInvalidObjectSchema,
                            "Invalid definition for command '%s'",
                            command_name.c_str());
         return false;
@@ -91,8 +91,8 @@
   for (const auto& pair : new_defs) {
     auto iter = definitions_.find(pair.first);
     if (iter != definitions_.end()) {
-        Error::AddToPrintf(error, commands::errors::kDomain,
-                           commands::errors::kDuplicateCommandDef,
+        Error::AddToPrintf(error, errors::commands::kDomain,
+                           errors::commands::kDuplicateCommandDef,
                            "Definition for command '%s' overrides an earlier "
                            "definition in category '%s'",
                            pair.first.c_str(),
diff --git a/buffet/commands/object_schema.cc b/buffet/commands/object_schema.cc
index bf75a3c..a9cae20 100644
--- a/buffet/commands/object_schema.cc
+++ b/buffet/commands/object_schema.cc
@@ -64,8 +64,8 @@
   if (PropType::GetTypeFromTypeString(type_name, &type))
     prop = PropType::Create(type);
   if (!prop) {
-    Error::AddToPrintf(error, commands::errors::kDomain,
-                       commands::errors::kUnknownType,
+    Error::AddToPrintf(error, errors::commands::kDomain,
+                       errors::commands::kUnknownType,
                        "Unknown type %s for parameter %s",
                        type_name.c_str(), prop_name.c_str());
   }
@@ -74,8 +74,8 @@
 
 static bool ErrorInvalidTypeInfo(const std::string& prop_name,
                                  ErrorPtr* error) {
-  Error::AddToPrintf(error, commands::errors::kDomain,
-                     commands::errors::kNoTypeInfo,
+  Error::AddToPrintf(error, errors::commands::kDomain,
+                     errors::commands::kNoTypeInfo,
                      "Unable to determine parameter type for %s",
                      prop_name.c_str());
   return false;
@@ -100,8 +100,8 @@
     return PropFromJsonObject(prop_name, value, base_schema, properties,
                               error);
   }
-  Error::AddToPrintf(error, commands::errors::kDomain,
-                     commands::errors::kInvalidPropDef,
+  Error::AddToPrintf(error, errors::commands::kDomain,
+                     errors::commands::kInvalidPropDef,
                      "Invalid parameter definition for %s", prop_name.c_str());
   return false;
 }
diff --git a/buffet/commands/prop_constraints.cc b/buffet/commands/prop_constraints.cc
index 5ea9314..97b524d 100644
--- a/buffet/commands/prop_constraints.cc
+++ b/buffet/commands/prop_constraints.cc
@@ -14,8 +14,8 @@
 
 bool Constraint::ReportErrorLessThan(
     ErrorPtr* error, const std::string& val, const std::string& limit) {
-  Error::AddToPrintf(error, commands::errors::kDomain,
-                     commands::errors::kOutOfRange,
+  Error::AddToPrintf(error, errors::commands::kDomain,
+                     errors::commands::kOutOfRange,
                      "Value %s is out of range. It must not be less than %s",
                      val.c_str(), limit.c_str());
   return false;
@@ -23,8 +23,8 @@
 
 bool Constraint::ReportErrorGreaterThan(
     ErrorPtr* error, const std::string& val, const std::string& limit) {
-  Error::AddToPrintf(error, commands::errors::kDomain,
-                     commands::errors::kOutOfRange,
+  Error::AddToPrintf(error, errors::commands::kDomain,
+                     errors::commands::kOutOfRange,
                      "Value %s is out of range. It must not be greater than %s",
                      val.c_str(), limit.c_str());
   return false;
@@ -33,8 +33,8 @@
 bool Constraint::ReportErrorNotOneOf(
     ErrorPtr* error, const std::string& val,
     const std::vector<std::string>& values) {
-  Error::AddToPrintf(error, commands::errors::kDomain,
-                     commands::errors::kOutOfRange,
+  Error::AddToPrintf(error, errors::commands::kDomain,
+                     errors::commands::kOutOfRange,
                      "Value %s is invalid. Expected one of [%s]",
                      val.c_str(), string_utils::Join(',', values).c_str());
   return false;
@@ -79,11 +79,11 @@
   int length = static_cast<int>(str.size());
   if (length < limit_.value) {
     if (limit_.value == 1) {
-      Error::AddTo(error, commands::errors::kDomain,
-                   commands::errors::kOutOfRange, "String must not be empty");
+      Error::AddTo(error, errors::commands::kDomain,
+                   errors::commands::kOutOfRange, "String must not be empty");
     } else {
-      Error::AddToPrintf(error, commands::errors::kDomain,
-                         commands::errors::kOutOfRange,
+      Error::AddToPrintf(error, errors::commands::kDomain,
+                         errors::commands::kOutOfRange,
                          "String must be at least %d characters long, "
                          "actual length of string '%s' is %d", limit_.value,
                          str.c_str(), length);
@@ -110,8 +110,8 @@
   const std::string& str = value.GetString()->GetValue();
   int length = static_cast<int>(str.size());
   if (length > limit_.value) {
-    Error::AddToPrintf(error, commands::errors::kDomain,
-                       commands::errors::kOutOfRange,
+    Error::AddToPrintf(error, errors::commands::kDomain,
+                       errors::commands::kOutOfRange,
                        "String must be no more than %d character(s) long, "
                        "actual length of string '%s' is %d", limit_.value,
                        str.c_str(), length);
diff --git a/buffet/commands/prop_types.cc b/buffet/commands/prop_types.cc
index 9644eac..71d1874 100644
--- a/buffet/commands/prop_types.cc
+++ b/buffet/commands/prop_types.cc
@@ -84,8 +84,8 @@
 bool PropType::FromJson(const base::DictionaryValue* value,
                         const PropType* base_schema, ErrorPtr* error) {
   if (base_schema && base_schema->GetType() != GetType()) {
-    Error::AddToPrintf(error, commands::errors::kDomain,
-                       commands::errors::kPropTypeChanged,
+    Error::AddToPrintf(error, errors::commands::kDomain,
+                       errors::commands::kPropTypeChanged,
                        "Redefining a command of type %s as %s",
                        base_schema->GetTypeAsString().c_str(),
                        GetTypeAsString().c_str());
@@ -111,8 +111,8 @@
   while (!iter.IsAtEnd()) {
     std::string key = iter.key();
     if (processed_keys.find(key) == processed_keys.end()) {
-      Error::AddToPrintf(error, commands::errors::kDomain,
-                         commands::errors::kUnknownProperty,
+      Error::AddToPrintf(error, errors::commands::kDomain,
+                         errors::commands::kUnknownProperty,
                          "Unexpected property '%s'", key.c_str());
       return false;
     }
@@ -215,8 +215,8 @@
   const base::ListValue* list = nullptr;
   if (!value->GetListWithoutPathExpansion(commands::attributes::kOneOf_Enum,
                                           &list)) {
-    Error::AddTo(error, commands::errors::kDomain,
-                 commands::errors::kTypeMismatch, "Expecting an array");
+    Error::AddTo(error, errors::commands::kDomain,
+                 errors::commands::kTypeMismatch, "Expecting an array");
     return std::shared_ptr<Constraint>();
   }
   std::vector<T> set;
@@ -408,8 +408,8 @@
     processed_keys->insert(kObject_Properties);
     auto object_schema = std::make_shared<ObjectSchema>();
     if (!object_schema->FromJson(props, base_object_schema.get(), error)) {
-      Error::AddTo(error, commands::errors::kDomain,
-                   commands::errors::kInvalidObjectSchema,
+      Error::AddTo(error, errors::commands::kDomain,
+                   errors::commands::kInvalidObjectSchema,
                    "Error parsing object property schema");
       return false;
     }
@@ -419,8 +419,8 @@
     object_schema_.value = base_object_schema;
     object_schema_.is_inherited = true;
   } else {
-    Error::AddToPrintf(error, commands::errors::kDomain,
-                       commands::errors::kInvalidObjectSchema,
+    Error::AddToPrintf(error, errors::commands::kDomain,
+                       errors::commands::kInvalidObjectSchema,
                        "Object type definition must include the object schema "
                        "('%s' field not found)", kObject_Properties);
     return false;
diff --git a/buffet/commands/schema_constants.cc b/buffet/commands/schema_constants.cc
index 6504c5d..d1677c0 100644
--- a/buffet/commands/schema_constants.cc
+++ b/buffet/commands/schema_constants.cc
@@ -5,9 +5,9 @@
 #include "buffet/commands/schema_constants.h"
 
 namespace buffet {
-namespace commands {
 
 namespace errors {
+namespace commands {
 const char kDomain[] = "command_schema";
 
 const char kOutOfRange[] = "out_of_range";
@@ -21,8 +21,10 @@
 const char kUnknownProperty[] = "unexpected_parameter";
 const char kInvalidObjectSchema[] = "invalid_object_schema";
 const char kDuplicateCommandDef[] = "duplicate_command_definition";
+}  // namespace commands
 }  // namespace errors
 
+namespace commands {
 namespace attributes {
 const char kType[] = "type";
 const char kDisplayName[] = "displayName";
@@ -41,6 +43,6 @@
 
 const char kCommand_Parameters[] = "parameters";
 }  // namespace attributes
-
 }  // namespace commands
+
 }  // namespace buffet
diff --git a/buffet/commands/schema_constants.h b/buffet/commands/schema_constants.h
index d709e59..6a508e0 100644
--- a/buffet/commands/schema_constants.h
+++ b/buffet/commands/schema_constants.h
@@ -6,9 +6,9 @@
 #define BUFFET_COMMANDS_SCHEMA_CONSTANTS_H_
 
 namespace buffet {
-namespace commands {
 
 namespace errors {
+namespace commands {
 // Error domain for command schema description.
 extern const char kDomain[];
 
@@ -24,8 +24,10 @@
 extern const char kUnknownProperty[];
 extern const char kInvalidObjectSchema[];
 extern const char kDuplicateCommandDef[];
+}  // namespace commands
 }  // namespace errors
 
+namespace commands {
 namespace attributes {
 // Command description JSON schema attributes.
 extern const char kType[];
@@ -45,8 +47,8 @@
 
 extern const char kCommand_Parameters[];
 }  // namespace attributes
-
 }  // namespace commands
+
 }  // namespace buffet
 
 #endif  // BUFFET_COMMANDS_SCHEMA_CONSTANTS_H_
diff --git a/buffet/commands/schema_utils.cc b/buffet/commands/schema_utils.cc
index 3c6ae57..cef5030 100644
--- a/buffet/commands/schema_utils.cc
+++ b/buffet/commands/schema_utils.cc
@@ -22,8 +22,8 @@
                             ErrorPtr* error) {
   std::string value_as_string;
   base::JSONWriter::Write(value_in, &value_as_string);
-  Error::AddToPrintf(error, commands::errors::kDomain,
-                     commands::errors::kTypeMismatch,
+  Error::AddToPrintf(error, errors::commands::kDomain,
+                     errors::commands::kTypeMismatch,
                      "Unable to convert value %s into %s",
                      value_as_string.c_str(), expected_type.c_str());
 }
@@ -40,8 +40,8 @@
 }
 
 bool ErrorMissingProperty(ErrorPtr* error, const char* param_name) {
-  Error::AddToPrintf(error, commands::errors::kDomain,
-                     commands::errors::kPropertyMissing,
+  Error::AddToPrintf(error, errors::commands::kDomain,
+                     errors::commands::kPropertyMissing,
                      "Required parameter missing: %s", param_name);
   return false;
 }
@@ -142,8 +142,8 @@
     std::string key = iter.key();
     if (keys_processed.find(key) == keys_processed.end() &&
         !object_schema->GetExtraPropertiesAllowed()) {
-      Error::AddToPrintf(error, commands::errors::kDomain,
-                         commands::errors::kUnknownProperty,
+      Error::AddToPrintf(error, errors::commands::kDomain,
+                         errors::commands::kUnknownProperty,
                          "Unrecognized parameter '%s'", key.c_str());
       return false;
     }
@@ -155,8 +155,8 @@
     const PropType* prop_type = pair.second->GetPropType();
     CHECK(prop_type) << "Value property type must be available";
     if (!prop_type->ValidateConstraints(*pair.second, error)) {
-      Error::AddToPrintf(error, commands::errors::kDomain,
-                         commands::errors::kInvalidPropValue,
+      Error::AddToPrintf(error, errors::commands::kDomain,
+                         errors::commands::kInvalidPropValue,
                          "Invalid parameter value for property '%s'",
                          pair.first.c_str());
       return false;
