diff --git a/chromeos-dbus-bindings/proxy_generator.cc b/chromeos-dbus-bindings/proxy_generator.cc
index 9ce0117..3a9cce1 100644
--- a/chromeos-dbus-bindings/proxy_generator.cc
+++ b/chromeos-dbus-bindings/proxy_generator.cc
@@ -211,6 +211,10 @@
     AddSignalHandlerRegistration(signal, interface.name, true, text);
   }
   AddProperties(config, interface, true, text);
+  text->AddBlankLine();
+  text->AddLine("virtual const dbus::ObjectPath& GetObjectPath() const = 0;");
+  if (!config.object_manager.name.empty() && !interface.properties.empty())
+    AddPropertyPublicMethods(proxy_name, true, text);
 
   text->PopOffset();
   text->AddLine("};");
@@ -248,7 +252,7 @@
   AddGetObjectPath(text);
   AddGetObjectProxy(text);
   if (!config.object_manager.name.empty() && !interface.properties.empty())
-    AddPropertyPublicMethods(proxy_name, text);
+    AddPropertyPublicMethods(proxy_name, false, text);
   for (const auto& method : interface.methods) {
     AddMethodProxy(method, interface.name, false, text);
     AddAsyncMethodProxy(method, interface.name, false, text);
@@ -277,9 +281,10 @@
   }
   if (!config.object_manager.name.empty() && !interface.properties.empty()) {
     text->AddLine("PropertySet* property_set_;");
-    text->AddLine(StringPrintf("base::Callback<void(%s*, const std::string&)> "
-                               "on_property_changed_;",
-                               proxy_name.c_str()));
+    text->AddLine(
+        StringPrintf("base::Callback<void(%sInterface*, const std::string&)> "
+                     "on_property_changed_;",
+                     proxy_name.c_str()));
   }
   text->AddLine("dbus::ObjectProxy* dbus_object_proxy_;");
   text->AddBlankLine();
@@ -338,6 +343,21 @@
     string name = NameParser{prop.name}.MakeVariableName();
     text->AddLine(StringPrintf("MOCK_CONST_METHOD0(%s, %s());",
                                name.c_str(), type.c_str()));
+    if (prop.access == "readwrite") {
+      text->AddLine(StringPrintf("MOCK_METHOD2(set_%s, void(%s, "
+                                 "const base::Callback<bool>&));",
+                                 name.c_str(), type.c_str()));
+    }
+  }
+  text->AddLine(
+      "MOCK_CONST_METHOD0(GetObjectPath, const dbus::ObjectPath&());");
+  if (!config.object_manager.name.empty() && !interface.properties.empty()) {
+    text->AddLineAndPushOffsetTo(
+        "MOCK_CONST_METHOD1(SetPropertyChangedCallback,", 1, '(');
+    text->AddLine(StringPrintf(
+        "void(const base::Callback<void(%sInterface*, const std::string&)>&));",
+        proxy_name.c_str()));
+    text->PopOffset();
   }
 
   text->PopOffset();
@@ -416,7 +436,7 @@
 // static
 void ProxyGenerator::AddGetObjectPath(IndentedText* text) {
   text->AddBlankLine();
-  text->AddLine("const dbus::ObjectPath& GetObjectPath() const {");
+  text->AddLine("const dbus::ObjectPath& GetObjectPath() const override {");
   text->AddLineWithOffset("return object_path_;", kBlockOffset);
   text->AddLine("}");
 }
@@ -430,20 +450,26 @@
 
 // static
 void ProxyGenerator::AddPropertyPublicMethods(const string& class_name,
+                                              bool declaration_only,
                                               IndentedText* text) {
   text->AddBlankLine();
-  text->AddLine("void SetPropertyChangedCallback(");
+  text->AddLine(StringPrintf("%svoid SetPropertyChangedCallback(",
+                             declaration_only ? "virtual " : ""));
   text->AddLineWithOffset(
-      StringPrintf("const base::Callback<void(%s*, "
-                   "const std::string&)>& callback) {", class_name.c_str()),
+      StringPrintf("const base::Callback<void(%sInterface*, "
+                   "const std::string&)>& callback) %s",
+                   class_name.c_str(),
+                   declaration_only ? "= 0;" : "override {"),
       kLineContinuationOffset);
-  text->AddLineWithOffset("on_property_changed_ = callback;", kBlockOffset);
-  text->AddLine("}");
-  text->AddBlankLine();
+  if (!declaration_only) {
+    text->AddLineWithOffset("on_property_changed_ = callback;", kBlockOffset);
+    text->AddLine("}");
+    text->AddBlankLine();
 
-  text->AddLine("const PropertySet* GetProperties() const "
-                "{ return property_set_; }");
-  text->AddLine("PropertySet* GetProperties() { return property_set_; }");
+    text->AddLine(
+        "const PropertySet* GetProperties() const { return property_set_; }");
+    text->AddLine("PropertySet* GetProperties() { return property_set_; }");
+  }
 }
 
 // static
@@ -583,6 +609,26 @@
           kBlockOffset);
       text->AddLine("}");
     }
+    if (prop.access == "readwrite") {
+      if (!declaration_only)
+        text->AddBlankLine();
+      text->AddLineAndPushOffsetTo(
+          StringPrintf("%svoid set_%s(%s value,",
+                       declaration_only ? "virtual " : "",
+                       name.c_str(),
+                       type.c_str()),
+          1, '(');
+      text->AddLine(
+          StringPrintf("const base::Callback<void(bool)>& callback)%s",
+                       declaration_only ? " = 0;" : " override {"));
+      text->PopOffset();
+      if (!declaration_only) {
+        text->AddLineWithOffset(
+            StringPrintf("property_set_->%s.Set(value, callback);", name.c_str()),
+            kBlockOffset);
+        text->AddLine("}");
+      }
+    }
   }
 }
 
@@ -1012,7 +1058,7 @@
   // GetProxy().
   if (interface.path.empty()) {
     // We have no fixed path, so there could be multiple instances of this itf.
-    text->AddLine(StringPrintf("%s* Get%s(",
+    text->AddLine(StringPrintf("%sInterface* Get%s(",
                                 itf_name.MakeProxyName(true).c_str(),
                                 itf_name.MakeProxyName(false).c_str()));
     text->PushOffset(kLineContinuationOffset);
@@ -1031,7 +1077,7 @@
   } else {
     // We have a fixed path, so the object could be considered a "singleton".
     // Skip the object_path parameter and return the first available instance.
-    text->AddLine(StringPrintf("%s* Get%s() {",
+    text->AddLine(StringPrintf("%sInterface* Get%s() {",
                                 itf_name.MakeProxyName(true).c_str(),
                                 itf_name.MakeProxyName(false).c_str()));
     text->PushOffset(kBlockOffset);
@@ -1044,11 +1090,12 @@
   }
 
   // GetInstances().
-  text->AddLine(StringPrintf("std::vector<%s*> Get%sInstances() const {",
-                              itf_name.MakeProxyName(true).c_str(),
-                              itf_name.type_name.c_str()));
+  text->AddLine(
+      StringPrintf("std::vector<%sInterface*> Get%sInstances() const {",
+                   itf_name.MakeProxyName(true).c_str(),
+                   itf_name.type_name.c_str()));
   text->PushOffset(kBlockOffset);
-  text->AddLine(StringPrintf("std::vector<%s*> values;",
+  text->AddLine(StringPrintf("std::vector<%sInterface*> values;",
                              itf_name.MakeProxyName(true).c_str()));
   text->AddLine(StringPrintf("values.reserve(%s.size());", map_name.c_str()));
   text->AddLine(StringPrintf("for (const auto& pair : %s)", map_name.c_str()));
@@ -1062,18 +1109,18 @@
                               itf_name.type_name.c_str()));
   text->PushOffset(kLineContinuationOffset);
   text->AddLine(
-      StringPrintf("const base::Callback<void(%s*)>& callback) {",
-                    itf_name.MakeProxyName(true).c_str()));
+      StringPrintf("const base::Callback<void(%sInterface*)>& callback) {",
+                   itf_name.MakeProxyName(true).c_str()));
   text->PopOffset();
   text->PushOffset(kBlockOffset);
   text->AddLine(StringPrintf("on_%s_added_ = callback;",
-                              itf_name.MakeVariableName().c_str()));
+                             itf_name.MakeVariableName().c_str()));
   text->PopOffset();
   text->AddLine("}");
 
   // SetRemovedCallback().
   text->AddLine(StringPrintf("void Set%sRemovedCallback(",
-                              itf_name.type_name.c_str()));
+                             itf_name.type_name.c_str()));
   text->PushOffset(kLineContinuationOffset);
   text->AddLine("const base::Callback<void(const dbus::ObjectPath&)>& "
                 "callback) {");
@@ -1284,9 +1331,10 @@
                                itf_name.MakeProxyName(true).c_str(),
                                var_name.c_str()));
     text->PopOffset();
-    text->AddLine(StringPrintf("base::Callback<void(%s*)> on_%s_added_;",
-                               itf_name.MakeProxyName(true).c_str(),
-                               var_name.c_str()));
+    text->AddLine(
+        StringPrintf("base::Callback<void(%sInterface*)> on_%s_added_;",
+                     itf_name.MakeProxyName(true).c_str(),
+                     var_name.c_str()));
     text->AddLine(StringPrintf("base::Callback<void(const dbus::ObjectPath&)> "
                                "on_%s_removed_;",
                                var_name.c_str()));
diff --git a/chromeos-dbus-bindings/proxy_generator.h b/chromeos-dbus-bindings/proxy_generator.h
index d6cfbaf..57af0e0 100644
--- a/chromeos-dbus-bindings/proxy_generator.h
+++ b/chromeos-dbus-bindings/proxy_generator.h
@@ -75,6 +75,7 @@
 
   // Generates SetPropertyChangedCallback/GetProperties() methods.
   static void AddPropertyPublicMethods(const std::string& class_name,
+                                       bool declaration_only,
                                        IndentedText* text);
 
   // Generates OnPropertyChanged() method.
diff --git a/chromeos-dbus-bindings/proxy_generator_mock_unittest.cc b/chromeos-dbus-bindings/proxy_generator_mock_unittest.cc
index 76f0ee5..6ba24ca 100644
--- a/chromeos-dbus-bindings/proxy_generator_mock_unittest.cc
+++ b/chromeos-dbus-bindings/proxy_generator_mock_unittest.cc
@@ -123,6 +123,7 @@
                void(const base::Callback<void(const std::vector<std::string>&,
                                               uint8_t)>& /*signal_callback*/,
                     dbus::ObjectProxy::OnConnectedCallback /*on_connected_callback*/));
+  MOCK_CONST_METHOD0(GetObjectPath, const dbus::ObjectPath&());
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestInterfaceProxyMock);
@@ -147,6 +148,12 @@
                void(const base::Callback<void(const std::string& /*name*/, int32_t /*age*/)>& /*success_callback*/,
                     const base::Callback<void(brillo::Error*)>& /*error_callback*/,
                     int /*timeout_ms*/));
+  MOCK_CONST_METHOD0(data, const std::string&());
+  MOCK_CONST_METHOD0(name, const std::string&());
+  MOCK_METHOD2(set_name, void(const std::string&, const base::Callback<bool>&));
+  MOCK_CONST_METHOD0(GetObjectPath, const dbus::ObjectPath&());
+  MOCK_CONST_METHOD1(SetPropertyChangedCallback,
+                     void(const base::Callback<void(TestInterface2ProxyInterface*, const std::string&)>&));
 
  private:
   DISALLOW_COPY_AND_ASSIGN(TestInterface2ProxyMock);
@@ -224,10 +231,13 @@
       vector<Interface::Argument>{
           {"name", kDBusTypeString},
           {"age", kDBusTypeInt32}});
+  interface2.properties.emplace_back("Data", "s", "read");
+  interface2.properties.emplace_back("Name", "s", "readwrite");
   vector<Interface> interfaces{interface, interface2};
   base::FilePath output_path = temp_dir_.path().Append("output.h");
   base::FilePath proxy_path = temp_dir_.path().Append("proxies.h");
   ServiceConfig config;
+  config.object_manager.name = "ObjectManager";
   EXPECT_TRUE(ProxyGenerator::GenerateMocks(config, interfaces, output_path,
                                             proxy_path, false));
   string contents;
diff --git a/chromeos-dbus-bindings/proxy_generator_unittest.cc b/chromeos-dbus-bindings/proxy_generator_unittest.cc
index ccbd1fe..4eda77c 100644
--- a/chromeos-dbus-bindings/proxy_generator_unittest.cc
+++ b/chromeos-dbus-bindings/proxy_generator_unittest.cc
@@ -117,6 +117,8 @@
       const base::Callback<void(const std::vector<std::string>&,
                                 uint8_t)>& signal_callback,
       dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
 };
 
 }  // namespace chromium
@@ -167,7 +169,7 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
@@ -325,6 +327,8 @@
       const base::Callback<void(const std::string& /*name*/, int32_t /*age*/)>& success_callback,
       const base::Callback<void(brillo::Error*)>& error_callback,
       int timeout_ms = dbus::ObjectProxy::TIMEOUT_USE_DEFAULT) = 0;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
 };
 
 }  // namespace chromium
@@ -354,7 +358,7 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
@@ -434,6 +438,8 @@
   virtual void RegisterCloserSignalHandler(
       const base::Closure& signal_callback,
       dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
 };
 
 }  // namespace chromium
@@ -469,7 +475,7 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
@@ -494,6 +500,8 @@
 class TestInterface2ProxyInterface {
  public:
   virtual ~TestInterface2ProxyInterface() = default;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
 };
 
 }  // namespace chromium
@@ -521,7 +529,7 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
@@ -582,6 +590,15 @@
 
   static const char* DataName() { return "Data"; }
   virtual const std::string& data() const = 0;
+  static const char* NameName() { return "Name"; }
+  virtual const std::string& name() const = 0;
+  virtual void set_name(const std::string& value,
+                        const base::Callback<void(bool)>& callback) = 0;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
+
+  virtual void SetPropertyChangedCallback(
+      const base::Callback<void(Itf1ProxyInterface*, const std::string&)>& callback) = 0;
 };
 
 }  // namespace chromium
@@ -601,9 +618,11 @@
                             "org.chromium.Itf1",
                             callback} {
       RegisterProperty(DataName(), &data);
+      RegisterProperty(NameName(), &name);
     }
 
     brillo::dbus_utils::Property<std::string> data;
+    brillo::dbus_utils::Property<std::string> name;
 
    private:
     DISALLOW_COPY_AND_ASSIGN(PropertySet);
@@ -638,14 +657,14 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
   dbus::ObjectProxy* GetObjectProxy() const { return dbus_object_proxy_; }
 
   void SetPropertyChangedCallback(
-      const base::Callback<void(Itf1Proxy*, const std::string&)>& callback) {
+      const base::Callback<void(Itf1ProxyInterface*, const std::string&)>& callback) override {
     on_property_changed_ = callback;
   }
 
@@ -656,6 +675,15 @@
     return property_set_->data.value();
   }
 
+  const std::string& name() const override {
+    return property_set_->name.value();
+  }
+
+  void set_name(const std::string& value,
+                const base::Callback<void(bool)>& callback) override {
+    property_set_->name.Set(value, callback);
+  }
+
  private:
   void OnPropertyChanged(const std::string& property_name) {
     if (!on_property_changed_.is_null())
@@ -666,7 +694,7 @@
   std::string service_name_;
   const dbus::ObjectPath object_path_{"/org/chromium/Test/Object"};
   PropertySet* property_set_;
-  base::Callback<void(Itf1Proxy*, const std::string&)> on_property_changed_;
+  base::Callback<void(Itf1ProxyInterface*, const std::string&)> on_property_changed_;
   dbus::ObjectProxy* dbus_object_proxy_;
 
   friend class org::chromium::ObjectManagerProxy;
@@ -683,6 +711,8 @@
 class Itf2ProxyInterface {
  public:
   virtual ~Itf2ProxyInterface() = default;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
 };
 
 }  // namespace chromium
@@ -726,7 +756,7 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
@@ -769,20 +799,20 @@
     return dbus_object_manager_;
   }
 
-  org::chromium::Itf1Proxy* GetItf1Proxy() {
+  org::chromium::Itf1ProxyInterface* GetItf1Proxy() {
     if (itf1_instances_.empty())
       return nullptr;
     return itf1_instances_.begin()->second.get();
   }
-  std::vector<org::chromium::Itf1Proxy*> GetItf1Instances() const {
-    std::vector<org::chromium::Itf1Proxy*> values;
+  std::vector<org::chromium::Itf1ProxyInterface*> GetItf1Instances() const {
+    std::vector<org::chromium::Itf1ProxyInterface*> values;
     values.reserve(itf1_instances_.size());
     for (const auto& pair : itf1_instances_)
       values.push_back(pair.second.get());
     return values;
   }
   void SetItf1AddedCallback(
-      const base::Callback<void(org::chromium::Itf1Proxy*)>& callback) {
+      const base::Callback<void(org::chromium::Itf1ProxyInterface*)>& callback) {
     on_itf1_added_ = callback;
   }
   void SetItf1RemovedCallback(
@@ -790,22 +820,22 @@
     on_itf1_removed_ = callback;
   }
 
-  org::chromium::Itf2Proxy* GetItf2Proxy(
+  org::chromium::Itf2ProxyInterface* GetItf2Proxy(
       const dbus::ObjectPath& object_path) {
     auto p = itf2_instances_.find(object_path);
     if (p != itf2_instances_.end())
       return p->second.get();
     return nullptr;
   }
-  std::vector<org::chromium::Itf2Proxy*> GetItf2Instances() const {
-    std::vector<org::chromium::Itf2Proxy*> values;
+  std::vector<org::chromium::Itf2ProxyInterface*> GetItf2Instances() const {
+    std::vector<org::chromium::Itf2ProxyInterface*> values;
     values.reserve(itf2_instances_.size());
     for (const auto& pair : itf2_instances_)
       values.push_back(pair.second.get());
     return values;
   }
   void SetItf2AddedCallback(
-      const base::Callback<void(org::chromium::Itf2Proxy*)>& callback) {
+      const base::Callback<void(org::chromium::Itf2ProxyInterface*)>& callback) {
     on_itf2_added_ = callback;
   }
   void SetItf2RemovedCallback(
@@ -907,11 +937,11 @@
   dbus::ObjectManager* dbus_object_manager_;
   std::map<dbus::ObjectPath,
            std::unique_ptr<org::chromium::Itf1Proxy>> itf1_instances_;
-  base::Callback<void(org::chromium::Itf1Proxy*)> on_itf1_added_;
+  base::Callback<void(org::chromium::Itf1ProxyInterface*)> on_itf1_added_;
   base::Callback<void(const dbus::ObjectPath&)> on_itf1_removed_;
   std::map<dbus::ObjectPath,
            std::unique_ptr<org::chromium::Itf2Proxy>> itf2_instances_;
-  base::Callback<void(org::chromium::Itf2Proxy*)> on_itf2_added_;
+  base::Callback<void(org::chromium::Itf2ProxyInterface*)> on_itf2_added_;
   base::Callback<void(const dbus::ObjectPath&)> on_itf2_removed_;
   base::WeakPtrFactory<ObjectManagerProxy> weak_ptr_factory_{this};
 
@@ -961,6 +991,8 @@
   virtual void RegisterCloserSignalHandler(
       const base::Closure& signal_callback,
       dbus::ObjectProxy::OnConnectedCallback on_connected_callback) = 0;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
 };
 
 }  // namespace chromium
@@ -1010,7 +1042,7 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
@@ -1035,6 +1067,8 @@
 class Itf2ProxyInterface {
  public:
   virtual ~Itf2ProxyInterface() = default;
+
+  virtual const dbus::ObjectPath& GetObjectPath() const = 0;
 };
 
 }  // namespace chromium
@@ -1076,7 +1110,7 @@
     bus_->RemoveObjectProxy(service_name_, object_path_, callback);
   }
 
-  const dbus::ObjectPath& GetObjectPath() const {
+  const dbus::ObjectPath& GetObjectPath() const override {
     return object_path_;
   }
 
@@ -1117,20 +1151,20 @@
     return dbus_object_manager_;
   }
 
-  org::chromium::Itf1Proxy* GetItf1Proxy() {
+  org::chromium::Itf1ProxyInterface* GetItf1Proxy() {
     if (itf1_instances_.empty())
       return nullptr;
     return itf1_instances_.begin()->second.get();
   }
-  std::vector<org::chromium::Itf1Proxy*> GetItf1Instances() const {
-    std::vector<org::chromium::Itf1Proxy*> values;
+  std::vector<org::chromium::Itf1ProxyInterface*> GetItf1Instances() const {
+    std::vector<org::chromium::Itf1ProxyInterface*> values;
     values.reserve(itf1_instances_.size());
     for (const auto& pair : itf1_instances_)
       values.push_back(pair.second.get());
     return values;
   }
   void SetItf1AddedCallback(
-      const base::Callback<void(org::chromium::Itf1Proxy*)>& callback) {
+      const base::Callback<void(org::chromium::Itf1ProxyInterface*)>& callback) {
     on_itf1_added_ = callback;
   }
   void SetItf1RemovedCallback(
@@ -1138,22 +1172,22 @@
     on_itf1_removed_ = callback;
   }
 
-  org::chromium::Itf2Proxy* GetItf2Proxy(
+  org::chromium::Itf2ProxyInterface* GetItf2Proxy(
       const dbus::ObjectPath& object_path) {
     auto p = itf2_instances_.find(object_path);
     if (p != itf2_instances_.end())
       return p->second.get();
     return nullptr;
   }
-  std::vector<org::chromium::Itf2Proxy*> GetItf2Instances() const {
-    std::vector<org::chromium::Itf2Proxy*> values;
+  std::vector<org::chromium::Itf2ProxyInterface*> GetItf2Instances() const {
+    std::vector<org::chromium::Itf2ProxyInterface*> values;
     values.reserve(itf2_instances_.size());
     for (const auto& pair : itf2_instances_)
       values.push_back(pair.second.get());
     return values;
   }
   void SetItf2AddedCallback(
-      const base::Callback<void(org::chromium::Itf2Proxy*)>& callback) {
+      const base::Callback<void(org::chromium::Itf2ProxyInterface*)>& callback) {
     on_itf2_added_ = callback;
   }
   void SetItf2RemovedCallback(
@@ -1244,11 +1278,11 @@
   dbus::ObjectManager* dbus_object_manager_;
   std::map<dbus::ObjectPath,
            std::unique_ptr<org::chromium::Itf1Proxy>> itf1_instances_;
-  base::Callback<void(org::chromium::Itf1Proxy*)> on_itf1_added_;
+  base::Callback<void(org::chromium::Itf1ProxyInterface*)> on_itf1_added_;
   base::Callback<void(const dbus::ObjectPath&)> on_itf1_removed_;
   std::map<dbus::ObjectPath,
            std::unique_ptr<org::chromium::Itf2Proxy>> itf2_instances_;
-  base::Callback<void(org::chromium::Itf2Proxy*)> on_itf2_added_;
+  base::Callback<void(org::chromium::Itf2ProxyInterface*)> on_itf2_added_;
   base::Callback<void(const dbus::ObjectPath&)> on_itf2_removed_;
   base::WeakPtrFactory<ObjectManagerProxy> weak_ptr_factory_{this};
 
@@ -1348,6 +1382,7 @@
   interface.path = "/org/chromium/Test/Object";
   interface.signals.emplace_back("Closer");
   interface.properties.emplace_back("Data", "s", "read");
+  interface.properties.emplace_back("Name", "s", "readwrite");
   Interface interface2;
   interface2.name = "org.chromium.Itf2";
   vector<Interface> interfaces{interface, interface2};
