diff --git a/libweave/src/base_api_handler.cc b/libweave/src/base_api_handler.cc
index acb136e..e6f9f9c 100644
--- a/libweave/src/base_api_handler.cc
+++ b/libweave/src/base_api_handler.cc
@@ -13,11 +13,11 @@
 
 namespace {
 
-// Helps to get parameters from native_types::Object representing
+// Helps to get parameters from ValueMap representing
 // CommandInstance parameters.
 class ParametersReader final {
  public:
-  explicit ParametersReader(const native_types::Object* parameters)
+  explicit ParametersReader(const ValueMap* parameters)
       : parameters_{parameters} {}
 
   bool GetParameter(const std::string& name, std::string* value) const {
@@ -43,7 +43,7 @@
   }
 
  private:
-  const native_types::Object* parameters_;
+  const ValueMap* parameters_;
 };
 
 }  // namespace
diff --git a/libweave/src/commands/command_instance.cc b/libweave/src/commands/command_instance.cc
index 37a1ddc..2975937 100644
--- a/libweave/src/commands/command_instance.cc
+++ b/libweave/src/commands/command_instance.cc
@@ -29,7 +29,7 @@
 CommandInstance::CommandInstance(const std::string& name,
                                  const std::string& origin,
                                  const CommandDefinition* command_definition,
-                                 const native_types::Object& parameters)
+                                 const ValueMap& parameters)
     : name_{name},
       origin_{origin},
       command_definition_{command_definition},
@@ -61,7 +61,7 @@
 // |error|.
 bool GetCommandParameters(const base::DictionaryValue* json,
                           const CommandDefinition* command_def,
-                          native_types::Object* parameters,
+                          ValueMap* parameters,
                           chromeos::ErrorPtr* error) {
   // Get the command parameters from 'parameters' property.
   base::DictionaryValue no_params;  // Placeholder when no params are specified.
@@ -137,7 +137,7 @@
     return instance;
   }
 
-  native_types::Object parameters;
+  ValueMap parameters;
   if (!GetCommandParameters(json, command_def, &parameters, error)) {
     chromeos::Error::AddToPrintf(error, FROM_HERE, errors::commands::kDomain,
                                  errors::commands::kCommandFailed,
@@ -175,7 +175,7 @@
   observers_.push_back(observer);
 }
 
-bool CommandInstance::SetResults(const native_types::Object& results) {
+bool CommandInstance::SetResults(const ValueMap& results) {
   // TODO(antonm): Add validation.
   if (results != results_) {
     results_ = results;
@@ -185,7 +185,7 @@
   return true;
 }
 
-bool CommandInstance::SetProgress(const native_types::Object& progress) {
+bool CommandInstance::SetProgress(const ValueMap& progress) {
   // Change status even if progress unchanged, e.g. 0% -> 0%.
   SetStatus(kStatusInProgress);
   if (progress != progress_) {
diff --git a/libweave/src/commands/command_instance.h b/libweave/src/commands/command_instance.h
index a64fc7c..358cd52 100644
--- a/libweave/src/commands/command_instance.h
+++ b/libweave/src/commands/command_instance.h
@@ -36,7 +36,7 @@
   CommandInstance(const std::string& name,
                   const std::string& origin,
                   const CommandDefinition* command_definition,
-                  const native_types::Object& parameters);
+                  const ValueMap& parameters);
   ~CommandInstance() override;
 
   // Command overrides.
@@ -50,9 +50,9 @@
   // Returns the command category.
   const std::string& GetCategory() const;
   // Returns the command parameters and their values.
-  const native_types::Object& GetParameters() const { return parameters_; }
+  const ValueMap& GetParameters() const { return parameters_; }
   // Returns the command results and their values.
-  const native_types::Object& GetResults() const { return results_; }
+  const ValueMap& GetResults() const { return results_; }
   // Finds a command parameter value by parameter |name|. If the parameter
   // with given name does not exist, returns nullptr.
   const PropValue* FindParameter(const std::string& name) const;
@@ -87,11 +87,11 @@
 
   // Updates the command progress. The |progress| should match the schema.
   // Returns false if |results| value is incorrect.
-  bool SetProgress(const native_types::Object& progress);
+  bool SetProgress(const ValueMap& progress);
 
   // Updates the command results. The |results| should match the schema.
   // Returns false if |results| value is incorrect.
-  bool SetResults(const native_types::Object& results);
+  bool SetResults(const ValueMap& results);
 
   // Aborts command execution.
   void Abort();
@@ -101,7 +101,7 @@
   void Done();
 
   // Command state getters.
-  const native_types::Object& GetProgress() const { return progress_; }
+  const ValueMap& GetProgress() const { return progress_; }
   const std::string& GetStatus() const { return status_; }
 
   // Values for command execution status.
@@ -132,11 +132,11 @@
   // Command definition.
   const CommandDefinition* command_definition_;
   // Command parameters and their values.
-  native_types::Object parameters_;
+  ValueMap parameters_;
   // Current command execution progress.
-  native_types::Object progress_;
+  ValueMap progress_;
   // Command results.
-  native_types::Object results_;
+  ValueMap results_;
   // Current command status.
   std::string status_ = kStatusQueued;
   // Command observer for the command.
diff --git a/libweave/src/commands/command_instance_unittest.cc b/libweave/src/commands/command_instance_unittest.cc
index 0107042..9d2c019 100644
--- a/libweave/src/commands/command_instance_unittest.cc
+++ b/libweave/src/commands/command_instance_unittest.cc
@@ -71,13 +71,13 @@
 TEST_F(CommandInstanceTest, Test) {
   StringPropType str_prop;
   IntPropType int_prop;
-  native_types::Object params;
+  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};
 
-  native_types::Object results;
+  ValueMap results;
   results["foo"] = int_prop.CreateValue(239, nullptr);
   instance.SetResults(results);
 
@@ -216,13 +216,13 @@
   auto instance =
       CommandInstance::FromJson(json.get(), "cloud", dict_, nullptr, nullptr);
   instance->SetProgress(
-      native_types::Object{{"progress", unittests::make_int_prop_value(15)}});
+      ValueMap{{"progress", unittests::make_int_prop_value(15)}});
   instance->SetProgress(
-      native_types::Object{{"progress", unittests::make_int_prop_value(15)}});
+      ValueMap{{"progress", unittests::make_int_prop_value(15)}});
   instance->SetID("testId");
-  native_types::Object results;
+  ValueMap results;
   instance->SetResults(
-      native_types::Object{{"testResult", unittests::make_int_prop_value(17)}});
+      ValueMap{{"testResult", unittests::make_int_prop_value(17)}});
 
   json->MergeDictionary(CreateDictionaryValue(R"({
     'id': 'testId',
diff --git a/libweave/src/commands/dbus_command_dispatcher_unittest.cc b/libweave/src/commands/dbus_command_dispatcher_unittest.cc
index 7f1ac9a..c488d92 100644
--- a/libweave/src/commands/dbus_command_dispatcher_unittest.cc
+++ b/libweave/src/commands/dbus_command_dispatcher_unittest.cc
@@ -121,8 +121,7 @@
 
   void FinishCommand(DBusCommandProxy* proxy) { proxy->Done(); }
 
-  void SetProgress(DBusCommandProxy* proxy,
-                   const native_types::Object& progress) {
+  void SetProgress(DBusCommandProxy* proxy, const ValueMap& progress) {
     EXPECT_TRUE(proxy->SetProgress(nullptr, ObjectToDBusVariant(progress)));
   }
 
@@ -146,8 +145,7 @@
 
   // Two properties are set, Progress = 50%, Status = "inProgress"
   EXPECT_CALL(*mock_exported_command_proxy_, SendSignal(_)).Times(2);
-  native_types::Object progress{
-      {"progress", unittests::make_int_prop_value(50)}};
+  ValueMap progress{{"progress", unittests::make_int_prop_value(50)}};
   SetProgress(command_proxy, progress);
   EXPECT_EQ(CommandInstance::kStatusInProgress, command_instance->GetStatus());
   EXPECT_EQ(progress, command_instance->GetProgress());
@@ -182,7 +180,7 @@
 
   // One property is set, Status = "inProgress"
   EXPECT_CALL(*mock_exported_command_proxy_, SendSignal(_)).Times(1);
-  native_types::Object progress{};
+  ValueMap progress{};
   SetProgress(command_proxy, progress);
   EXPECT_EQ(CommandInstance::kStatusInProgress, command_instance->GetStatus());
   EXPECT_EQ(progress, command_instance->GetProgress());
diff --git a/libweave/src/commands/dbus_command_proxy.cc b/libweave/src/commands/dbus_command_proxy.cc
index 743bc73..5ffcd9d 100644
--- a/libweave/src/commands/dbus_command_proxy.cc
+++ b/libweave/src/commands/dbus_command_proxy.cc
@@ -74,7 +74,7 @@
 
   auto progress_schema =
       command_instance_->GetCommandDefinition()->GetProgress();
-  native_types::Object obj;
+  ValueMap obj;
   if (!ObjectFromDBusVariant(progress_schema, progress, &obj, error))
     return false;
 
@@ -88,7 +88,7 @@
             << ">::SetResults()";
 
   auto results_schema = command_instance_->GetCommandDefinition()->GetResults();
-  native_types::Object obj;
+  ValueMap obj;
   if (!ObjectFromDBusVariant(results_schema, results, &obj, error))
     return false;
 
diff --git a/libweave/src/commands/object_schema_unittest.cc b/libweave/src/commands/object_schema_unittest.cc
index 753ad46..d927c7b 100644
--- a/libweave/src/commands/object_schema_unittest.cc
+++ b/libweave/src/commands/object_schema_unittest.cc
@@ -27,7 +27,7 @@
 namespace {
 
 template <typename T>
-std::vector<T> GetArrayValues(const native_types::Array& arr) {
+std::vector<T> GetArrayValues(const ValueVector& arr) {
   std::vector<T> values;
   values.reserve(arr.size());
   for (const auto& prop_value : arr) {
@@ -665,7 +665,7 @@
   ASSERT_NE(nullptr, prop2.GetDefaultValue());
   const ObjectValue* defval = prop2.GetDefaultValue()->GetObject();
   ASSERT_NE(nullptr, defval);
-  native_types::Object objval = defval->GetValue();
+  ValueMap objval = defval->GetValue();
   EXPECT_EQ("Bob", objval["name"]->GetString()->GetValue());
   EXPECT_EQ(33, objval["age"]->GetInt()->GetValue());
 }
@@ -739,7 +739,7 @@
           "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}")
           .get(),
       nullptr, nullptr));
-  native_types::Object obj{
+  ValueMap obj{
       {"width", int_type.CreateValue(10, nullptr)},
       {"height", int_type.CreateValue(20, nullptr)},
   };
@@ -748,7 +748,7 @@
   auto val = prop.CreateValue(obj, &error);
   ASSERT_NE(nullptr, val.get());
   EXPECT_EQ(nullptr, error.get());
-  EXPECT_EQ(obj, val->GetValueAsAny().Get<native_types::Object>());
+  EXPECT_EQ(obj, val->GetValueAsAny().Get<ValueMap>());
 
   val = prop.CreateValue("blah", &error);
   EXPECT_EQ(nullptr, val.get());
@@ -873,12 +873,12 @@
       nullptr, nullptr));
 
   chromeos::ErrorPtr error;
-  native_types::Array arr;
+  ValueVector arr;
 
   auto val = prop.CreateValue(arr, &error);
   ASSERT_NE(nullptr, val.get());
   EXPECT_EQ(nullptr, error.get());
-  EXPECT_EQ(arr, val->GetValueAsAny().Get<native_types::Array>());
+  EXPECT_EQ(arr, val->GetValueAsAny().Get<ValueVector>());
   EXPECT_JSON_EQ("[]", *val->ToJson(nullptr));
 
   IntPropType int_type;
@@ -889,13 +889,13 @@
           .get(),
       nullptr, nullptr));
   arr.push_back(obj_type.CreateValue(
-      native_types::Object{
+      ValueMap{
           {"width", int_type.CreateValue(10, nullptr)},
           {"height", int_type.CreateValue(20, nullptr)},
       },
       nullptr));
   arr.push_back(obj_type.CreateValue(
-      native_types::Object{
+      ValueMap{
           {"width", int_type.CreateValue(17, nullptr)},
           {"height", int_type.CreateValue(18, nullptr)},
       },
@@ -904,7 +904,7 @@
   val = prop.CreateValue(arr, &error);
   ASSERT_NE(nullptr, val.get());
   EXPECT_EQ(nullptr, error.get());
-  EXPECT_EQ(arr, val->GetValueAsAny().Get<native_types::Array>());
+  EXPECT_EQ(arr, val->GetValueAsAny().Get<ValueVector>());
   EXPECT_JSON_EQ("[{'height':20,'width':10},{'height':18,'width':17}]",
                  *val->ToJson(nullptr));
 
@@ -1295,15 +1295,15 @@
   // Omit all.
   auto value = prop.CreateValue();
   ASSERT_TRUE(value->FromJson(CreateDictionaryValue("{}").get(), nullptr));
-  native_types::Object obj = value->GetObject()->GetValue();
+  ValueMap obj = value->GetObject()->GetValue();
   EXPECT_TRUE(obj["param1"]->GetBoolean()->GetValue());
   EXPECT_EQ(2, obj["param2"]->GetInt()->GetValue());
   EXPECT_DOUBLE_EQ(3.3, obj["param3"]->GetDouble()->GetValue());
   EXPECT_EQ("four", obj["param4"]->GetString()->GetValue());
-  native_types::Object param5 = obj["param5"]->GetObject()->GetValue();
+  ValueMap param5 = obj["param5"]->GetObject()->GetValue();
   EXPECT_EQ(5, param5["x"]->GetInt()->GetValue());
   EXPECT_EQ(6, param5["y"]->GetInt()->GetValue());
-  native_types::Array param6 = obj["param6"]->GetArray()->GetValue();
+  ValueVector param6 = obj["param6"]->GetArray()->GetValue();
   EXPECT_EQ((std::vector<int>{1, 2, 3}), GetArrayValues<int>(param6));
 
   // Specify some.
@@ -1674,7 +1674,7 @@
     'param4':40
   })";
   ASSERT_TRUE(value->FromJson(CreateDictionaryValue(val_json).get(), nullptr));
-  native_types::Object obj = value->GetObject()->GetValue();
+  ValueMap obj = value->GetObject()->GetValue();
   EXPECT_EQ(10, obj["param1"]->GetInt()->GetValue());
   EXPECT_EQ(20, obj["param2"]->GetInt()->GetValue());
   EXPECT_EQ(30, obj["param3"]->GetInt()->GetValue());
diff --git a/libweave/src/commands/prop_constraints.cc b/libweave/src/commands/prop_constraints.cc
index f223978..9d9f81e 100644
--- a/libweave/src/commands/prop_constraints.cc
+++ b/libweave/src/commands/prop_constraints.cc
@@ -168,12 +168,9 @@
 }
 
 // ConstraintOneOf --------------------------------------------------
-ConstraintOneOf::ConstraintOneOf(InheritableAttribute<native_types::Array> set)
-    : set_(std::move(set)) {
-}
-ConstraintOneOf::ConstraintOneOf(native_types::Array set)
-    : set_(std::move(set)) {
-}
+ConstraintOneOf::ConstraintOneOf(InheritableAttribute<ValueVector> set)
+    : set_(std::move(set)) {}
+ConstraintOneOf::ConstraintOneOf(ValueVector set) : set_(std::move(set)) {}
 
 bool ConstraintOneOf::Validate(const PropValue& value,
                                chromeos::ErrorPtr* error) const {
@@ -190,7 +187,7 @@
 }
 
 std::unique_ptr<Constraint> ConstraintOneOf::Clone() const {
-  InheritableAttribute<native_types::Array> attr;
+  InheritableAttribute<ValueVector> attr;
   attr.is_inherited = set_.is_inherited;
   attr.value.reserve(set_.value.size());
   for (const auto& prop_value : set_.value) {
@@ -200,7 +197,7 @@
 }
 
 std::unique_ptr<Constraint> ConstraintOneOf::CloneAsInherited() const {
-  native_types::Array cloned;
+  ValueVector cloned;
   cloned.reserve(set_.value.size());
   for (const auto& prop_value : set_.value) {
     cloned.push_back(prop_value->Clone());
diff --git a/libweave/src/commands/prop_constraints.h b/libweave/src/commands/prop_constraints.h
index 74f69da..d325a00 100644
--- a/libweave/src/commands/prop_constraints.h
+++ b/libweave/src/commands/prop_constraints.h
@@ -286,8 +286,8 @@
 // Implementation of OneOf constraint for different data types.
 class ConstraintOneOf : public Constraint {
  public:
-  explicit ConstraintOneOf(InheritableAttribute<native_types::Array> set);
-  explicit ConstraintOneOf(native_types::Array set);
+  explicit ConstraintOneOf(InheritableAttribute<ValueVector> set);
+  explicit ConstraintOneOf(ValueVector set);
 
   // Implementation of Constraint::GetType().
   ConstraintType GetType() const override { return ConstraintType::OneOf; }
@@ -314,7 +314,7 @@
   // Stores the list of acceptable values for the parameter.
   // |set_.is_inherited| indicates whether the constraint is inherited
   // from base schema or overridden.
-  InheritableAttribute<native_types::Array> set_;
+  InheritableAttribute<ValueVector> set_;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(ConstraintOneOf);
diff --git a/libweave/src/commands/prop_types.cc b/libweave/src/commands/prop_types.cc
index 54d8028..3105e6d 100644
--- a/libweave/src/commands/prop_types.cc
+++ b/libweave/src/commands/prop_types.cc
@@ -331,12 +331,12 @@
   const base::Value* list = nullptr;  // Owned by |value|
   CHECK(value->Get(commands::attributes::kOneOf_Enum, &list))
       << "'enum' property missing in JSON dictionary";
-  native_types::Array choice_list;
+  ValueVector choice_list;
   ArrayPropType array_type;
   array_type.SetItemType(prop_type->Clone());
   if (!TypedValueFromJson(list, &array_type, &choice_list, error))
     return constraint;
-  InheritableAttribute<native_types::Array> val(std::move(choice_list), false);
+  InheritableAttribute<ValueVector> val(std::move(choice_list), false);
   constraint.reset(new ConstraintOneOf{std::move(val)});
   return constraint;
 }
@@ -608,7 +608,7 @@
 }
 
 chromeos::Any ObjectPropType::ConvertArrayToDBusVariant(
-    const native_types::Array& source) const {
+    const ValueVector& source) const {
   std::vector<chromeos::VariantDictionary> result;
   result.reserve(source.size());
   for (const auto& prop_value : source) {
@@ -620,7 +620,7 @@
 
 bool ObjectPropType::ConvertDBusVariantToArray(
     const chromeos::Any& source,
-    native_types::Array* result,
+    ValueVector* result,
     chromeos::ErrorPtr* error) const {
   if (!source.IsTypeCompatible<std::vector<chromeos::VariantDictionary>>())
     return GenerateErrorValueTypeMismatch(error);
diff --git a/libweave/src/commands/prop_types.h b/libweave/src/commands/prop_types.h
index e98d2eb..7a2e695 100644
--- a/libweave/src/commands/prop_types.h
+++ b/libweave/src/commands/prop_types.h
@@ -97,7 +97,7 @@
   // by this instance of PropType into an Any containing std::vector<T>, where
   // T corresponds to the native representation of this PropType.
   virtual chromeos::Any ConvertArrayToDBusVariant(
-      const native_types::Array& source) const = 0;
+      const ValueVector& source) const = 0;
 
   // ConvertAnyToArray is the opposite of ConvertArrayToAny().
   // Given an Any containing std::vector<T>, converts each value into the
@@ -105,7 +105,7 @@
   // |result| array. If type conversion fails, this function returns false
   // and specifies the error details in |error|.
   virtual bool ConvertDBusVariantToArray(const chromeos::Any& source,
-                                         native_types::Array* result,
+                                         ValueVector* result,
                                          chromeos::ErrorPtr* error) const = 0;
 
   // Saves the parameter type definition as a JSON object.
@@ -238,7 +238,7 @@
   }
 
   chromeos::Any ConvertArrayToDBusVariant(
-      const native_types::Array& source) const override {
+      const ValueVector& source) const override {
     std::vector<T> result;
     result.reserve(source.size());
     for (const auto& prop_value : source) {
@@ -248,7 +248,7 @@
   }
 
   bool ConvertDBusVariantToArray(const chromeos::Any& source,
-                                 native_types::Array* result,
+                                 ValueVector* result,
                                  chromeos::ErrorPtr* error) const override {
     if (!source.IsTypeCompatible<std::vector<T>>())
       return GenerateErrorValueTypeMismatch(error);
@@ -348,9 +348,9 @@
 
 // Parameter definition of Object type.
 class ObjectPropType
-    : public PropTypeBase<ObjectPropType, ObjectValue, native_types::Object> {
+    : public PropTypeBase<ObjectPropType, ObjectValue, ValueMap> {
  public:
-  using Base = PropTypeBase<ObjectPropType, ObjectValue, native_types::Object>;
+  using Base = PropTypeBase<ObjectPropType, ObjectValue, ValueMap>;
   ObjectPropType();
 
   // Overrides from the ParamType base class.
@@ -370,10 +370,10 @@
                             chromeos::ErrorPtr* error) override;
 
   chromeos::Any ConvertArrayToDBusVariant(
-      const native_types::Array& source) const override;
+      const ValueVector& source) const override;
 
   bool ConvertDBusVariantToArray(const chromeos::Any& source,
-                                 native_types::Array* result,
+                                 ValueVector* result,
                                  chromeos::ErrorPtr* error) const override;
 
   // Returns a schema for Object-type parameter.
@@ -388,9 +388,9 @@
 
 // Parameter definition of Array type.
 class ArrayPropType
-    : public PropTypeBase<ArrayPropType, ArrayValue, native_types::Array> {
+    : public PropTypeBase<ArrayPropType, ArrayValue, ValueVector> {
  public:
-  using Base = PropTypeBase<ArrayPropType, ArrayValue, native_types::Array>;
+  using Base = PropTypeBase<ArrayPropType, ArrayValue, ValueVector>;
   ArrayPropType();
 
   // Overrides from the ParamType base class.
diff --git a/libweave/src/commands/prop_values.h b/libweave/src/commands/prop_values.h
index 90ce909..4740a3f 100644
--- a/libweave/src/commands/prop_values.h
+++ b/libweave/src/commands/prop_values.h
@@ -64,11 +64,11 @@
   return ValueType::Boolean;
 }
 template <>
-inline ValueType GetValueType<native_types::Object>() {
+inline ValueType GetValueType<ValueMap>() {
   return ValueType::Object;
 }
 template <>
-inline ValueType GetValueType<native_types::Array>() {
+inline ValueType GetValueType<ValueVector>() {
   return ValueType::Array;
 }
 
@@ -212,8 +212,7 @@
 };
 
 // Value of type Object.
-class ObjectValue final
-    : public TypedValueBase<ObjectValue, native_types::Object> {
+class ObjectValue final : public TypedValueBase<ObjectValue, ValueMap> {
  public:
   using Base::Base;  // Expose the custom constructor of the base class.
   ObjectValue* GetObject() override { return this; }
@@ -221,8 +220,7 @@
 };
 
 // Value of type Array.
-class ArrayValue final
-    : public TypedValueBase<ArrayValue, native_types::Array> {
+class ArrayValue final : public TypedValueBase<ArrayValue, ValueVector> {
  public:
   using Base::Base;  // Expose the custom constructor of the base class.
   ArrayValue* GetArray() override { return this; }
diff --git a/libweave/src/commands/schema_utils.cc b/libweave/src/commands/schema_utils.cc
index 8e34032..9030415 100644
--- a/libweave/src/commands/schema_utils.cc
+++ b/libweave/src/commands/schema_utils.cc
@@ -74,7 +74,7 @@
   return std::unique_ptr<base::Value>(new base::StringValue(value));
 }
 
-std::unique_ptr<base::Value> TypedValueToJson(const native_types::Object& value,
+std::unique_ptr<base::Value> TypedValueToJson(const ValueMap& value,
                                               chromeos::ErrorPtr* error) {
   std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
   for (const auto& pair : value) {
@@ -86,7 +86,7 @@
   return std::move(dict);
 }
 
-std::unique_ptr<base::Value> TypedValueToJson(const native_types::Array& value,
+std::unique_ptr<base::Value> TypedValueToJson(const ValueVector& value,
                                               chromeos::ErrorPtr* error) {
   std::unique_ptr<base::ListValue> list(new base::ListValue);
   for (const auto& item : value) {
@@ -132,7 +132,7 @@
 
 bool TypedValueFromJson(const base::Value* value_in,
                         const PropType* type,
-                        native_types::Object* value_out,
+                        ValueMap* value_out,
                         chromeos::ErrorPtr* error) {
   const base::DictionaryValue* dict = nullptr;
   if (!value_in->GetAsDictionary(&dict))
@@ -202,7 +202,7 @@
 
 bool TypedValueFromJson(const base::Value* value_in,
                         const PropType* type,
-                        native_types::Array* value_out,
+                        ValueVector* value_out,
                         chromeos::ErrorPtr* error) {
   const base::ListValue* list = nullptr;
   if (!value_in->GetAsList(&list))
@@ -229,13 +229,12 @@
 }
 
 // Compares two sets of key-value pairs from two Objects.
-static bool obj_cmp(const native_types::Object::value_type& v1,
-                    const native_types::Object::value_type& v2) {
+static bool obj_cmp(const ValueMap::value_type& v1,
+                    const ValueMap::value_type& v2) {
   return (v1.first == v2.first) && v1.second->IsEqual(v2.second.get());
 }
 
-bool operator==(const native_types::Object& obj1,
-                const native_types::Object& obj2) {
+bool operator==(const ValueMap& obj1, const ValueMap& obj2) {
   if (obj1.size() != obj2.size())
     return false;
 
@@ -243,12 +242,11 @@
   return pair == std::make_pair(obj1.end(), obj2.end());
 }
 
-bool operator==(const native_types::Array& arr1,
-                const native_types::Array& arr2) {
+bool operator==(const ValueVector& arr1, const ValueVector& arr2) {
   if (arr1.size() != arr2.size())
     return false;
 
-  using Type = const native_types::Array::value_type;
+  using Type = const ValueVector::value_type;
   // Compare two array items.
   auto arr_cmp = [](const Type& v1, const Type& v2) {
     return v1->IsEqual(v2.get());
@@ -257,14 +255,14 @@
   return pair == std::make_pair(arr1.end(), arr2.end());
 }
 
-std::string ToString(const native_types::Object& obj) {
+std::string ToString(const ValueMap& obj) {
   auto val = TypedValueToJson(obj, nullptr);
   std::string str;
   base::JSONWriter::Write(*val, &str);
   return str;
 }
 
-std::string ToString(const native_types::Array& arr) {
+std::string ToString(const ValueVector& arr) {
   auto val = TypedValueToJson(arr, nullptr);
   std::string str;
   base::JSONWriter::Write(*val, &str);
@@ -283,11 +281,10 @@
   return value->GetValueAsAny();
 }
 
-chromeos::VariantDictionary ObjectToDBusVariant(
-    const native_types::Object& object) {
+chromeos::VariantDictionary ObjectToDBusVariant(const ValueMap& object) {
   chromeos::VariantDictionary dict;
   for (const auto& pair : object) {
-    // Since we are inserting the elements from native_types::Object which is
+    // Since we are inserting the elements from ValueMap which is
     // a map, the keys are already sorted. So use the "end()" position as a hint
     // for dict.insert() so the destination map can optimize its insertion
     // time.
@@ -305,22 +302,22 @@
   if (type->GetType() == ValueType::Array) {
     // Special case for array types.
     // We expect the |value| to contain std::vector<T>, while PropValue must use
-    // native_types::Array instead. Do the conversion.
-    native_types::Array arr;
+    // ValueVector instead. Do the conversion.
+    ValueVector arr;
     const PropType* item_type = type->GetArray()->GetItemTypePtr();
     if (item_type->ConvertDBusVariantToArray(value, &arr, error))
       result = type->CreateValue(arr, error);
   } else if (type->GetType() == ValueType::Object) {
     // Special case for object types.
     // We expect the |value| to contain chromeos::VariantDictionary, while
-    // PropValue must use native_types::Object instead. Do the conversion.
+    // PropValue must use ValueMap instead. Do the conversion.
     if (!value.IsTypeCompatible<chromeos::VariantDictionary>()) {
       type->GenerateErrorValueTypeMismatch(error);
       return result;
     }
     CHECK(nullptr != type->GetObject()->GetObjectSchemaPtr())
         << "An object type must have a schema defined for it";
-    native_types::Object obj;
+    ValueMap obj;
     if (!ObjectFromDBusVariant(type->GetObject()->GetObjectSchemaPtr(),
                                value.Get<chromeos::VariantDictionary>(), &obj,
                                error)) {
@@ -337,7 +334,7 @@
 
 bool ObjectFromDBusVariant(const ObjectSchema* object_schema,
                            const chromeos::VariantDictionary& dict,
-                           native_types::Object* obj,
+                           ValueMap* obj,
                            chromeos::ErrorPtr* error) {
   std::set<std::string> keys_processed;
   obj->clear();
diff --git a/libweave/src/commands/schema_utils.h b/libweave/src/commands/schema_utils.h
index 6b756e7..2822a3d 100644
--- a/libweave/src/commands/schema_utils.h
+++ b/libweave/src/commands/schema_utils.h
@@ -24,18 +24,17 @@
 class ObjectSchema;
 class ObjectValue;
 
-namespace native_types {
 // C++ representation of object values.
-using Object = std::map<std::string, std::shared_ptr<const PropValue>>;
+using ValueMap = std::map<std::string, std::shared_ptr<const PropValue>>;
+
 // C++ representation of array of values.
-using Array = std::vector<std::shared_ptr<const PropValue>>;
-}  // namespace native_types
+using ValueVector = std::vector<std::shared_ptr<const PropValue>>;
 
 // Converts an object to string.
-std::string ToString(const native_types::Object& obj);
+std::string ToString(const ValueMap& obj);
 
 // Converts an array to string.
-std::string ToString(const native_types::Array& arr);
+std::string ToString(const ValueVector& arr);
 
 // InheritableAttribute class is used for specifying various command parameter
 // attributes that can be inherited from a base (parent) schema.
@@ -65,9 +64,9 @@
                                               chromeos::ErrorPtr* error);
 std::unique_ptr<base::Value> TypedValueToJson(const std::string& value,
                                               chromeos::ErrorPtr* error);
-std::unique_ptr<base::Value> TypedValueToJson(const native_types::Object& value,
+std::unique_ptr<base::Value> TypedValueToJson(const ValueMap& value,
                                               chromeos::ErrorPtr* error);
-std::unique_ptr<base::Value> TypedValueToJson(const native_types::Array& value,
+std::unique_ptr<base::Value> TypedValueToJson(const ValueVector& value,
                                               chromeos::ErrorPtr* error);
 template <typename T>
 std::unique_ptr<base::Value> TypedValueToJson(const std::vector<T>& values,
@@ -103,17 +102,15 @@
                         chromeos::ErrorPtr* error);
 bool TypedValueFromJson(const base::Value* value_in,
                         const PropType* type,
-                        native_types::Object* value_out,
+                        ValueMap* value_out,
                         chromeos::ErrorPtr* error);
 bool TypedValueFromJson(const base::Value* value_in,
                         const PropType* type,
-                        native_types::Array* value_out,
+                        ValueVector* value_out,
                         chromeos::ErrorPtr* error);
 
-bool operator==(const native_types::Object& obj1,
-                const native_types::Object& obj2);
-bool operator==(const native_types::Array& arr1,
-                const native_types::Array& arr2);
+bool operator==(const ValueMap& obj1, const ValueMap& obj2);
+bool operator==(const ValueVector& arr1, const ValueVector& arr2);
 
 // CompareValue is a helper function to help with implementing EqualsTo operator
 // for various data types. For most scalar types it is using operator==(),
@@ -139,16 +136,15 @@
 }
 
 // Converts PropValue to Any in a format understood by D-Bus data serialization.
-// Has special handling for Object types where native_types::Object are
+// Has special handling for Object types where ValueMap are
 // converted to chromeos::VariantDictionary.
 chromeos::Any PropValueToDBusVariant(const PropValue* value);
-// Converts native_types::Object to chromeos::VariantDictionary
+// Converts ValueMap to chromeos::VariantDictionary
 // with proper conversion of all nested properties.
-chromeos::VariantDictionary ObjectToDBusVariant(
-    const native_types::Object& object);
+chromeos::VariantDictionary ObjectToDBusVariant(const ValueMap& object);
 // Converts D-Bus variant to PropValue.
 // Has special handling for Object types where chromeos::VariantDictionary
-// is converted to native_types::Object.
+// is converted to ValueMap.
 std::unique_ptr<const PropValue> PropValueFromDBusVariant(
     const PropType* type,
     const chromeos::Any& value,
@@ -156,7 +152,7 @@
 // Converts D-Bus variant to ObjectValue.
 bool ObjectFromDBusVariant(const ObjectSchema* object_schema,
                            const chromeos::VariantDictionary& dict,
-                           native_types::Object* obj,
+                           ValueMap* obj,
                            chromeos::ErrorPtr* error);
 
 }  // namespace weave
diff --git a/libweave/src/commands/schema_utils_unittest.cc b/libweave/src/commands/schema_utils_unittest.cc
index 6fd5e0f..22e15c7 100644
--- a/libweave/src/commands/schema_utils_unittest.cc
+++ b/libweave/src/commands/schema_utils_unittest.cc
@@ -52,7 +52,7 @@
 
 TEST(CommandSchemaUtils, TypedValueToJson_Object) {
   IntPropType int_type;
-  native_types::Object object;
+  ValueMap object;
 
   object.insert(std::make_pair("width", int_type.CreateValue(640, nullptr)));
   object.insert(std::make_pair("height", int_type.CreateValue(480, nullptr)));
@@ -62,7 +62,7 @@
 
 TEST(CommandSchemaUtils, TypedValueToJson_Array) {
   IntPropType int_type;
-  native_types::Array arr;
+  ValueVector arr;
 
   arr.push_back(int_type.CreateValue(640, nullptr));
   arr.push_back(int_type.CreateValue(480, nullptr));
@@ -160,7 +160,7 @@
 }
 
 TEST(CommandSchemaUtils, TypedValueFromJson_Object) {
-  native_types::Object value;
+  ValueMap value;
   std::unique_ptr<ObjectSchema> schema{new ObjectSchema};
 
   IntPropType age_prop;
@@ -175,7 +175,7 @@
   type.SetObjectSchema(std::move(schema));
   EXPECT_TRUE(TypedValueFromJson(CreateValue("{'age':20,'name':'Bob'}").get(),
                                  &type, &value, nullptr));
-  native_types::Object value2;
+  ValueMap value2;
   value2.insert(std::make_pair("age", age_prop.CreateValue(20, nullptr)));
   value2.insert(std::make_pair(
       "name", name_prop.CreateValue(std::string("Bob"), nullptr)));
@@ -189,7 +189,7 @@
 }
 
 TEST(CommandSchemaUtils, TypedValueFromJson_Array) {
-  native_types::Array arr;
+  ValueVector arr;
   StringPropType str_type;
   str_type.AddLengthConstraint(3, 100);
   ArrayPropType type;
@@ -197,7 +197,7 @@
 
   EXPECT_TRUE(TypedValueFromJson(CreateValue("['foo', 'bar']").get(), &type,
                                  &arr, nullptr));
-  native_types::Array arr2;
+  ValueVector arr2;
   arr2.push_back(str_type.CreateValue(std::string{"foo"}, nullptr));
   arr2.push_back(str_type.CreateValue(std::string{"bar"}, nullptr));
   EXPECT_EQ(arr2, arr);
@@ -233,7 +233,7 @@
           "'enum':[{'width':10,'height':20},{'width':100,'height':200}]}")
           .get(),
       nullptr, nullptr));
-  native_types::Object obj{
+  ValueMap obj{
       {"width", int_type.CreateValue(10, nullptr)},
       {"height", int_type.CreateValue(20, nullptr)},
   };
@@ -245,7 +245,7 @@
 
   ArrayPropType arr_type;
   arr_type.SetItemType(str_type.Clone());
-  native_types::Array arr;
+  ValueVector arr;
   arr.push_back(str_type.CreateValue(std::string{"foo"}, nullptr));
   arr.push_back(str_type.CreateValue(std::string{"bar"}, nullptr));
   arr.push_back(str_type.CreateValue(std::string{"baz"}, nullptr));
@@ -335,7 +335,7 @@
   };
   auto prop_value = PropValueFromDBusVariant(&obj_type, obj, nullptr);
   ASSERT_NE(nullptr, prop_value.get());
-  auto value = prop_value->GetValueAsAny().Get<native_types::Object>();
+  auto value = prop_value->GetValueAsAny().Get<ValueMap>();
   EXPECT_EQ(100, value["width"].get()->GetValueAsAny().Get<int>());
   EXPECT_EQ(200, value["height"].get()->GetValueAsAny().Get<int>());
 
@@ -355,7 +355,7 @@
   std::vector<int> data{0, 1, 1, 100};
   auto prop_value = PropValueFromDBusVariant(&arr_type, data, nullptr);
   ASSERT_NE(nullptr, prop_value.get());
-  auto arr = prop_value->GetValueAsAny().Get<native_types::Array>();
+  auto arr = prop_value->GetValueAsAny().Get<ValueVector>();
   ASSERT_EQ(4u, arr.size());
   EXPECT_EQ(0, arr[0]->GetInt()->GetValue());
   EXPECT_EQ(1, arr[1]->GetInt()->GetValue());
diff --git a/libweave/src/device_registration_info_unittest.cc b/libweave/src/device_registration_info_unittest.cc
index b41e182..9ef7731 100644
--- a/libweave/src/device_registration_info_unittest.cc
+++ b/libweave/src/device_registration_info_unittest.cc
@@ -544,7 +544,7 @@
   auto command = command_manager_->FindCommand("1234");
   ASSERT_NE(nullptr, command);
   StringPropType string_type;
-  native_types::Object results{
+  ValueMap results{
       {"status", string_type.CreateValue(std::string{"Ok"}, nullptr)}};
 
   // UpdateCommand when setting command results.
@@ -579,8 +579,7 @@
   transport_->AddHandler(command_url, chromeos::http::request_type::kPatch,
                          base::Bind(update_command_progress));
 
-  native_types::Object progress{
-      {"progress", unittests::make_int_prop_value(18)}};
+  ValueMap progress{{"progress", unittests::make_int_prop_value(18)}};
   command->SetProgress(progress);
 
   // UpdateCommand when changing command status.
diff --git a/libweave/src/states/mock_state_change_queue_interface.h b/libweave/src/states/mock_state_change_queue_interface.h
index b4e6257..fb02347 100644
--- a/libweave/src/states/mock_state_change_queue_interface.h
+++ b/libweave/src/states/mock_state_change_queue_interface.h
@@ -17,8 +17,7 @@
  public:
   MOCK_CONST_METHOD0(IsEmpty, bool());
   MOCK_METHOD2(NotifyPropertiesUpdated,
-               bool(base::Time timestamp,
-                    native_types::Object changed_properties));
+               bool(base::Time timestamp, ValueMap changed_properties));
   MOCK_METHOD0(GetAndClearRecordedStateChanges, std::vector<StateChange>());
   MOCK_CONST_METHOD0(GetLastStateChangeId, UpdateID());
   MOCK_METHOD1(MockAddOnStateUpdatedCallback,
diff --git a/libweave/src/states/state_change_queue.cc b/libweave/src/states/state_change_queue.cc
index a9ae497..fbce5d8 100644
--- a/libweave/src/states/state_change_queue.cc
+++ b/libweave/src/states/state_change_queue.cc
@@ -13,9 +13,8 @@
   CHECK_GT(max_queue_size_, 0U) << "Max queue size must not be zero";
 }
 
-bool StateChangeQueue::NotifyPropertiesUpdated(
-    base::Time timestamp,
-    native_types::Object changed_properties) {
+bool StateChangeQueue::NotifyPropertiesUpdated(base::Time timestamp,
+                                               ValueMap changed_properties) {
   DCHECK(thread_checker_.CalledOnValidThread());
   auto it = state_changes_.lower_bound(timestamp);
   if (it == state_changes_.end() || it->first != timestamp) {
diff --git a/libweave/src/states/state_change_queue.h b/libweave/src/states/state_change_queue.h
index 877db73..436f454 100644
--- a/libweave/src/states/state_change_queue.h
+++ b/libweave/src/states/state_change_queue.h
@@ -22,9 +22,8 @@
 
   // Overrides from StateChangeQueueInterface.
   bool IsEmpty() const override { return state_changes_.empty(); }
-  bool NotifyPropertiesUpdated(
-      base::Time timestamp,
-      native_types::Object changed_properties) override;
+  bool NotifyPropertiesUpdated(base::Time timestamp,
+                               ValueMap changed_properties) override;
   std::vector<StateChange> GetAndClearRecordedStateChanges() override;
   UpdateID GetLastStateChangeId() const override { return last_change_id_; }
   Token AddOnStateUpdatedCallback(
@@ -42,7 +41,7 @@
   const size_t max_queue_size_;
 
   // Accumulated list of device state change notifications.
-  std::map<base::Time, native_types::Object> state_changes_;
+  std::map<base::Time, ValueMap> state_changes_;
 
   // An ID of last state change update. Each NotifyPropertiesUpdated()
   // invocation increments this value by 1.
diff --git a/libweave/src/states/state_change_queue_interface.h b/libweave/src/states/state_change_queue_interface.h
index 8e67baa..f92c690 100644
--- a/libweave/src/states/state_change_queue_interface.h
+++ b/libweave/src/states/state_change_queue_interface.h
@@ -20,10 +20,10 @@
 // |changed_properties| contains a property set with the new property values
 // which were updated at the time the event was recorded.
 struct StateChange {
-  StateChange(base::Time time, native_types::Object properties)
+  StateChange(base::Time time, ValueMap properties)
       : timestamp{time}, changed_properties{std::move(properties)} {}
   base::Time timestamp;
-  native_types::Object changed_properties;
+  ValueMap changed_properties;
 };
 
 // An abstract interface to StateChangeQueue to record and retrieve state
@@ -38,9 +38,8 @@
   virtual bool IsEmpty() const = 0;
 
   // Called by StateManager when device state properties are updated.
-  virtual bool NotifyPropertiesUpdated(
-      base::Time timestamp,
-      native_types::Object changed_properties) = 0;
+  virtual bool NotifyPropertiesUpdated(base::Time timestamp,
+                                       ValueMap changed_properties) = 0;
 
   // Returns the recorded state changes since last time this method was called.
   virtual std::vector<StateChange> GetAndClearRecordedStateChanges() = 0;
diff --git a/libweave/src/states/state_change_queue_unittest.cc b/libweave/src/states/state_change_queue_unittest.cc
index 5877eeb..7c8d19b 100644
--- a/libweave/src/states/state_change_queue_unittest.cc
+++ b/libweave/src/states/state_change_queue_unittest.cc
@@ -29,7 +29,7 @@
 TEST_F(StateChangeQueueTest, UpdateOne) {
   StateChange change{
       base::Time::Now(),
-      native_types::Object{{"prop.name", unittests::make_int_prop_value(23)}}};
+      ValueMap{{"prop.name", unittests::make_int_prop_value(23)}}};
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change.timestamp,
                                               change.changed_properties));
   EXPECT_FALSE(queue_->IsEmpty());
@@ -46,12 +46,12 @@
 TEST_F(StateChangeQueueTest, UpdateMany) {
   StateChange change1{
       base::Time::Now(),
-      native_types::Object{{"prop.name1", unittests::make_int_prop_value(23)}}};
+      ValueMap{{"prop.name1", unittests::make_int_prop_value(23)}}};
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(change1.timestamp,
                                               change1.changed_properties));
   StateChange change2{
       base::Time::Now(),
-      native_types::Object{
+      ValueMap{
           {"prop.name1", unittests::make_int_prop_value(17)},
           {"prop.name2", unittests::make_double_prop_value(1.0)},
           {"prop.name3", unittests::make_bool_prop_value(false)},
@@ -75,30 +75,27 @@
   base::TimeDelta time_delta = base::TimeDelta::FromMinutes(1);
 
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
-      timestamp,
-      native_types::Object{{"prop.name1", unittests::make_int_prop_value(1)}}));
+      timestamp, ValueMap{{"prop.name1", unittests::make_int_prop_value(1)}}));
 
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
-      timestamp,
-      native_types::Object{{"prop.name2", unittests::make_int_prop_value(2)}}));
+      timestamp, ValueMap{{"prop.name2", unittests::make_int_prop_value(2)}}));
 
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
-      timestamp,
-      native_types::Object{{"prop.name1", unittests::make_int_prop_value(3)}}));
+      timestamp, ValueMap{{"prop.name1", unittests::make_int_prop_value(3)}}));
 
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
       timestamp + time_delta,
-      native_types::Object{{"prop.name1", unittests::make_int_prop_value(4)}}));
+      ValueMap{{"prop.name1", unittests::make_int_prop_value(4)}}));
 
   auto changes = queue_->GetAndClearRecordedStateChanges();
   EXPECT_EQ(4, queue_->GetLastStateChangeId());
   ASSERT_EQ(2, changes.size());
 
-  native_types::Object expected1{
+  ValueMap expected1{
       {"prop.name1", unittests::make_int_prop_value(3)},
       {"prop.name2", unittests::make_int_prop_value(2)},
   };
-  native_types::Object expected2{
+  ValueMap expected2{
       {"prop.name1", unittests::make_int_prop_value(4)},
   };
   EXPECT_EQ(timestamp, changes[0].timestamp);
@@ -114,21 +111,21 @@
   base::TimeDelta time_delta2 = base::TimeDelta::FromMinutes(3);
 
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
-      start_time, native_types::Object{
+      start_time, ValueMap{
                       {"prop.name1", unittests::make_int_prop_value(1)},
                       {"prop.name2", unittests::make_int_prop_value(2)},
                   }));
 
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
       start_time + time_delta1,
-      native_types::Object{
+      ValueMap{
           {"prop.name1", unittests::make_int_prop_value(3)},
           {"prop.name3", unittests::make_int_prop_value(4)},
       }));
 
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
       start_time + time_delta2,
-      native_types::Object{
+      ValueMap{
           {"prop.name10", unittests::make_int_prop_value(10)},
           {"prop.name11", unittests::make_int_prop_value(11)},
       }));
@@ -137,7 +134,7 @@
   auto changes = queue_->GetAndClearRecordedStateChanges();
   ASSERT_EQ(2, changes.size());
 
-  native_types::Object expected1{
+  ValueMap expected1{
       {"prop.name1", unittests::make_int_prop_value(3)},
       {"prop.name2", unittests::make_int_prop_value(2)},
       {"prop.name3", unittests::make_int_prop_value(4)},
@@ -145,7 +142,7 @@
   EXPECT_EQ(start_time + time_delta1, changes[0].timestamp);
   EXPECT_EQ(expected1, changes[0].changed_properties);
 
-  native_types::Object expected2{
+  ValueMap expected2{
       {"prop.name10", unittests::make_int_prop_value(10)},
       {"prop.name11", unittests::make_int_prop_value(11)},
   };
@@ -166,7 +163,7 @@
 TEST_F(StateChangeQueueTest, DelayedStateChangeNotification) {
   // When queue is not empty, registering a new callback will not trigger it.
   ASSERT_TRUE(queue_->NotifyPropertiesUpdated(
-      base::Time::Now(), native_types::Object{
+      base::Time::Now(), ValueMap{
                              {"prop.name1", unittests::make_int_prop_value(1)},
                              {"prop.name2", unittests::make_int_prop_value(2)},
                          }));
diff --git a/libweave/src/states/state_manager.cc b/libweave/src/states/state_manager.cc
index d694464..158d79c 100644
--- a/libweave/src/states/state_manager.cc
+++ b/libweave/src/states/state_manager.cc
@@ -159,8 +159,7 @@
   if (!package->SetPropertyValue(property_name, value, error))
     return false;
 
-  native_types::Object prop_set{
-      {full_property_name, package->GetProperty(property_name)}};
+  ValueMap prop_set{{full_property_name, package->GetProperty(property_name)}};
   state_change_queue_->NotifyPropertiesUpdated(timestamp, prop_set);
   return true;
 }
diff --git a/libweave/src/states/state_manager_unittest.cc b/libweave/src/states/state_manager_unittest.cc
index 6f39dfe..60eafcd 100644
--- a/libweave/src/states/state_manager_unittest.cc
+++ b/libweave/src/states/state_manager_unittest.cc
@@ -132,7 +132,7 @@
 }
 
 TEST_F(StateManagerTest, SetPropertyValue) {
-  native_types::Object expected_prop_set{
+  ValueMap expected_prop_set{
       {"terminator.target", unittests::make_string_prop_value("John Connor")},
   };
   EXPECT_CALL(mock_state_change_queue_,
@@ -192,8 +192,7 @@
                                nullptr));
   std::vector<StateChange> expected_val;
   expected_val.emplace_back(
-      timestamp_,
-      native_types::Object{{"terminator.target",
+      timestamp_, ValueMap{{"terminator.target",
                             unittests::make_string_prop_value("John Connor")}});
   EXPECT_CALL(mock_state_change_queue_, GetAndClearRecordedStateChanges())
       .WillOnce(Return(expected_val));
@@ -205,7 +204,7 @@
 }
 
 TEST_F(StateManagerTest, SetProperties) {
-  native_types::Object expected_prop_set{
+  ValueMap expected_prop_set{
       {"base.manufacturer", unittests::make_string_prop_value("No Name")},
   };
   EXPECT_CALL(mock_state_change_queue_,
diff --git a/libweave/src/states/state_package.h b/libweave/src/states/state_package.h
index 19b0c0f..e4e9942 100644
--- a/libweave/src/states/state_package.h
+++ b/libweave/src/states/state_package.h
@@ -78,7 +78,7 @@
  private:
   std::string name_;
   ObjectSchema types_;
-  native_types::Object values_;
+  ValueMap values_;
 
   friend class StatePackageTestHelper;
   DISALLOW_COPY_AND_ASSIGN(StatePackage);
diff --git a/libweave/src/states/state_package_unittest.cc b/libweave/src/states/state_package_unittest.cc
index 1479f79..6d14731 100644
--- a/libweave/src/states/state_package_unittest.cc
+++ b/libweave/src/states/state_package_unittest.cc
@@ -26,7 +26,7 @@
     return package.types_;
   }
   // Returns the all state property values in this package.
-  static const native_types::Object& GetValues(const StatePackage& package) {
+  static const ValueMap& GetValues(const StatePackage& package) {
     return package.values_;
   }
 };
@@ -54,7 +54,7 @@
   return StatePackageTestHelper::GetTypes(package);
 }
 // Returns the all state property values in this package.
-inline const native_types::Object& GetValues(const StatePackage& package) {
+inline const ValueMap& GetValues(const StatePackage& package) {
   return StatePackageTestHelper::GetValues(package);
 }
 
