[vala/tintou/gdbus-properties: 228/228] Update expected C sources




commit c26527ae0598770534311b2ac185958e1de52169
Author: Rico Tzschichholz <ricotz ubuntu com>
Date:   Sat Aug 7 16:43:00 2021 +0200

    Update expected C sources

 tests/dbus/arrays_client.c-expected                |  131 +-
 tests/dbus/arrays_server.c-expected                |   26 +
 tests/dbus/async-bus_client.c-expected             |   85 +-
 tests/dbus/async-connection_client.c-expected      |   85 +-
 tests/dbus/async-errors_client.c-expected          |   85 +-
 tests/dbus/async-no-reply_client.c-expected        |   85 +-
 tests/dbus/async_client.c-expected                 |   85 +-
 tests/dbus/basic-types_client.c-expected           |  162 ++-
 tests/dbus/basic-types_server.c-expected           |   52 +
 tests/dbus/bug602003_client.c-expected             |   85 +-
 tests/dbus/bug735437_client.c-expected             |   85 +-
 tests/dbus/bug782719_client.c-expected             |   85 +-
 tests/dbus/bug783002_client.c-expected             |   85 +-
 tests/dbus/bug792277.c-expected                    |   85 +-
 tests/dbus/connection_client.c-expected            |   85 +-
 tests/dbus/dicts_client.c-expected                 |   85 +-
 tests/dbus/dicts_server.c-expected                 |   85 +-
 tests/dbus/enum-string-marshalling.c-expected      |   85 +-
 tests/dbus/errors_client.c-expected                |   85 +-
 tests/dbus/filedescriptor-async_client.c-expected  |   85 +-
 tests/dbus/filedescriptor-errors_client.c-expected |   85 +-
 tests/dbus/filedescriptor_client.c-expected        |   85 +-
 tests/dbus/generics_client.c-expected              |   85 +-
 tests/dbus/interface-info_client.c-expected        |   85 +-
 tests/dbus/no-reply_client.c-expected              |   85 +-
 tests/dbus/properties_client.c-expected            | 1259 ++++++++++++++++++++
 tests/dbus/properties_server.c-expected            |  741 ++++++++++++
 tests/dbus/rawvariants_client.c-expected           |  248 +++-
 tests/dbus/rawvariants_server.c-expected           |   52 +
 tests/dbus/signals_client.c-expected               |   85 +-
 tests/dbus/structs_client.c-expected               |  129 +-
 tests/dbus/structs_server.c-expected               |   26 +
 32 files changed, 4669 insertions(+), 27 deletions(-)
---
diff --git a/tests/dbus/arrays_client.c-expected b/tests/dbus/arrays_client.c-expected
index 8c17358f0..414fdcd58 100644
--- a/tests/dbus/arrays_client.c-expected
+++ b/tests/dbus/arrays_client.c-expected
@@ -28,6 +28,12 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_TEST_PROPERTY_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
 #define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
@@ -68,10 +74,22 @@ VALA_EXTERN void test_set_test_property (Test* self,
                              gchar** value,
                              gint value_length1);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gint* test_proxy_test_int (Test* self,
                            gint* i,
                            gint i_length1,
@@ -124,6 +142,9 @@ static gboolean test_dbus_interface_set_property (GDBusConnection* connection,
                                            gpointer user_data);
 static void _dbus_test_set_test_property (Test* self,
                                    GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 static void _vala_main (void);
 static void _vala_array_destroy (gpointer array,
@@ -218,6 +239,7 @@ static void
 test_default_init (TestIface * iface,
                    gpointer iface_data)
 {
+       g_object_interface_install_property (iface, g_param_spec_boxed ("test-property", "test-property", 
"test-property", G_TYPE_STRV, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
 static GType
@@ -250,7 +272,66 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+       g_object_class_override_property (object_class, TEST_PROXY_TEST_PROPERTY_PROPERTY, "test-property");
+       test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-property");
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       if (g_strcmp0 (dbus_property_name, "TestProperty") == 0) {
+               return test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY];
+       }
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               {
+                       int length;
+                       g_value_take_boxed (value, test_dbus_proxy_get_test_property (self, &length));
+               }
+               break;
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               {
+                       gpointer boxed;
+                       boxed = g_value_get_boxed (value);
+                       test_dbus_proxy_set_test_property (self, boxed, (boxed == NULL) ? 0 : g_strv_length 
(boxed));
+               }
+               break;
+               default:
+               return;
+       }
 }
 
 static void
@@ -261,6 +342,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
@@ -843,6 +949,27 @@ test_dbus_interface_set_property (GDBusConnection* connection,
        return FALSE;
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -859,6 +986,7 @@ test_register_object (gpointer object,
        if (!result) {
                return 0;
        }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
        return result;
 }
 
@@ -867,6 +995,7 @@ _test_unregister_object (gpointer user_data)
 {
        gpointer* data;
        data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
diff --git a/tests/dbus/arrays_server.c-expected b/tests/dbus/arrays_server.c-expected
index 7cae17ed0..fff6cd234 100644
--- a/tests/dbus/arrays_server.c-expected
+++ b/tests/dbus/arrays_server.c-expected
@@ -132,6 +132,9 @@ static gboolean test_dbus_interface_set_property (GDBusConnection* connection,
                                            gpointer user_data);
 static void _dbus_test_set_test_property (Test* self,
                                    GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 VALA_EXTERN void client_exit (GPid pid,
                   gint status);
@@ -731,6 +734,27 @@ test_dbus_interface_set_property (GDBusConnection* connection,
        return FALSE;
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -747,6 +771,7 @@ test_register_object (gpointer object,
        if (!result) {
                return 0;
        }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
        return result;
 }
 
@@ -755,6 +780,7 @@ _test_unregister_object (gpointer user_data)
 {
        gpointer* data;
        data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
diff --git a/tests/dbus/async-bus_client.c-expected b/tests/dbus/async-bus_client.c-expected
index 5bc147231..9dda0986c 100644
--- a/tests/dbus/async-bus_client.c-expected
+++ b/tests/dbus/async-bus_client.c-expected
@@ -27,6 +27,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
@@ -51,10 +56,22 @@ VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN gint test_get_test (Test* self,
                     GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gint test_proxy_get_test (Test* self,
                           GError** error);
 static void test_proxy_test_interface_init (TestIface* iface);
@@ -151,7 +168,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -162,6 +220,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/async-connection_client.c-expected b/tests/dbus/async-connection_client.c-expected
index 30ee60393..099661c4d 100644
--- a/tests/dbus/async-connection_client.c-expected
+++ b/tests/dbus/async-connection_client.c-expected
@@ -27,6 +27,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
@@ -51,10 +56,22 @@ VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN gint test_get_test (Test* self,
                     GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gint test_proxy_get_test (Test* self,
                           GError** error);
 static void test_proxy_test_interface_init (TestIface* iface);
@@ -151,7 +168,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -162,6 +220,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/async-errors_client.c-expected b/tests/dbus/async-errors_client.c-expected
index 4f9a12a28..991983b89 100644
--- a/tests/dbus/async-errors_client.c-expected
+++ b/tests/dbus/async-errors_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 typedef struct _TestTestVoidReadyData TestTestVoidReadyData;
 typedef struct _TestTestIntReadyData TestTestIntReadyData;
 typedef struct _TestTestStringReadyData TestTestStringReadyData;
@@ -132,10 +137,22 @@ VALA_EXTERN void test_test_cancellable_finish (Test* self,
                                    GAsyncResult* _res_,
                                    GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void _vala_g_async_ready_callback (GObject *source_object,
                                    GAsyncResult *res,
                                    void *user_data);
@@ -390,7 +407,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -401,6 +459,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/async-no-reply_client.c-expected b/tests/dbus/async-no-reply_client.c-expected
index abb397e7d..eebbc057d 100644
--- a/tests/dbus/async-no-reply_client.c-expected
+++ b/tests/dbus/async-no-reply_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 typedef struct _TestListMessagesReadyData TestListMessagesReadyData;
 typedef struct _TestPostMessageReadyData TestPostMessageReadyData;
 #define _g_free0(var) (var = (g_free (var), NULL))
@@ -144,10 +149,22 @@ VALA_EXTERN void test_post_message_finish (Test* self,
                                GAsyncResult* _res_,
                                GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void _vala_g_async_ready_callback (GObject *source_object,
                                    GAsyncResult *res,
                                    void *user_data);
@@ -330,7 +347,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -341,6 +399,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/async_client.c-expected b/tests/dbus/async_client.c-expected
index 659449fc2..b0fcce07e 100644
--- a/tests/dbus/async_client.c-expected
+++ b/tests/dbus/async_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 typedef struct _TestTestVoidReadyData TestTestVoidReadyData;
 typedef struct _TestTestIntReadyData TestTestIntReadyData;
 typedef struct _TestTestStringReadyData TestTestStringReadyData;
@@ -123,10 +128,22 @@ VALA_EXTERN gchar* test_test_string_finish (Test* self,
                                 gchar* * t,
                                 GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void _vala_g_async_ready_callback (GObject *source_object,
                                    GAsyncResult *res,
                                    void *user_data);
@@ -340,7 +357,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -351,6 +409,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/basic-types_client.c-expected b/tests/dbus/basic-types_client.c-expected
index 6d1d4b65c..3907d4ec2 100644
--- a/tests/dbus/basic-types_client.c-expected
+++ b/tests/dbus/basic-types_client.c-expected
@@ -28,6 +28,13 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_TEST_PROPERTY_PROPERTY,
+       TEST_PROXY_TEST_INT_PROPERTY_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_free0(var) (var = (g_free (var), NULL))
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
@@ -69,10 +76,22 @@ VALA_EXTERN gint test_get_test_int_property (Test* self);
 VALA_EXTERN void test_set_test_int_property (Test* self,
                                  gint value);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void test_proxy_test_void (Test* self,
                            GError** error);
 static gint test_proxy_test_int (Test* self,
@@ -128,6 +147,12 @@ static void _dbus_test_set_test_property (Test* self,
                                    GVariant* _value);
 static void _dbus_test_set_test_int_property (Test* self,
                                        GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
+static void _test_notify_test_int_property (GObject * gobject,
+                                     GParamSpec * pspec,
+                                     gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 static void _vala_main (void);
 
@@ -248,6 +273,8 @@ static void
 test_default_init (TestIface * iface,
                    gpointer iface_data)
 {
+       g_object_interface_install_property (iface, g_param_spec_string ("test-property", "test-property", 
"test-property", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
+       g_object_interface_install_property (iface, g_param_spec_int ("test-int-property", 
"test-int-property", "test-int-property", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | 
G_PARAM_WRITABLE));
 }
 
 static GType
@@ -280,7 +307,69 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+       g_object_class_override_property (object_class, TEST_PROXY_TEST_PROPERTY_PROPERTY, "test-property");
+       test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-property");
+       g_object_class_override_property (object_class, TEST_PROXY_TEST_INT_PROPERTY_PROPERTY, 
"test-int-property");
+       test_proxy_properties[TEST_PROXY_TEST_INT_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-int-property");
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       if (g_strcmp0 (dbus_property_name, "TestProperty") == 0) {
+               return test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY];
+       } else if (g_strcmp0 (dbus_property_name, "TestIntProperty") == 0) {
+               return test_proxy_properties[TEST_PROXY_TEST_INT_PROPERTY_PROPERTY];
+       }
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               g_value_take_string (value, test_dbus_proxy_get_test_property (self));
+               break;
+               case TEST_PROXY_TEST_INT_PROPERTY_PROPERTY:
+               g_value_set_int (value, test_dbus_proxy_get_test_int_property (self));
+               break;
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               test_dbus_proxy_set_test_property (self, g_value_get_string (value));
+               break;
+               case TEST_PROXY_TEST_INT_PROPERTY_PROPERTY:
+               test_dbus_proxy_set_test_int_property (self, g_value_get_int (value));
+               break;
+               default:
+               return;
+       }
 }
 
 static void
@@ -291,6 +380,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
@@ -730,6 +844,48 @@ test_dbus_interface_set_property (GDBusConnection* connection,
        return FALSE;
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
+static void
+_test_notify_test_int_property (GObject * gobject,
+                                GParamSpec * pspec,
+                                gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_int_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestIntProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -746,6 +902,8 @@ test_register_object (gpointer object,
        if (!result) {
                return 0;
        }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
+       g_signal_connect (object, "notify::test-int-property", (GCallback) _test_notify_test_int_property, 
data);
        return result;
 }
 
@@ -754,6 +912,8 @@ _test_unregister_object (gpointer user_data)
 {
        gpointer* data;
        data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_int_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
diff --git a/tests/dbus/basic-types_server.c-expected b/tests/dbus/basic-types_server.c-expected
index f0731f71b..41b330f90 100644
--- a/tests/dbus/basic-types_server.c-expected
+++ b/tests/dbus/basic-types_server.c-expected
@@ -131,6 +131,12 @@ static void _dbus_test_set_test_property (Test* self,
                                    GVariant* _value);
 static void _dbus_test_set_test_int_property (Test* self,
                                        GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
+static void _test_notify_test_int_property (GObject * gobject,
+                                     GParamSpec * pspec,
+                                     gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 VALA_EXTERN void client_exit (GPid pid,
                   gint status);
@@ -577,6 +583,48 @@ test_dbus_interface_set_property (GDBusConnection* connection,
        return FALSE;
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
+static void
+_test_notify_test_int_property (GObject * gobject,
+                                GParamSpec * pspec,
+                                gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_int_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestIntProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -593,6 +641,8 @@ test_register_object (gpointer object,
        if (!result) {
                return 0;
        }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
+       g_signal_connect (object, "notify::test-int-property", (GCallback) _test_notify_test_int_property, 
data);
        return result;
 }
 
@@ -601,6 +651,8 @@ _test_unregister_object (gpointer user_data)
 {
        gpointer* data;
        data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_int_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
diff --git a/tests/dbus/bug602003_client.c-expected b/tests/dbus/bug602003_client.c-expected
index 38836347a..abedfe8af 100644
--- a/tests/dbus/bug602003_client.c-expected
+++ b/tests/dbus/bug602003_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
@@ -49,10 +54,22 @@ VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN GVariant* test_test_string (Test* self,
                             GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static GVariant* test_proxy_test_string (Test* self,
                                   GError** error);
 static void test_proxy_test_interface_init (TestIface* iface);
@@ -152,7 +169,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -163,6 +221,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/bug735437_client.c-expected b/tests/dbus/bug735437_client.c-expected
index dae32bff8..ec3fe2f99 100644
--- a/tests/dbus/bug735437_client.c-expected
+++ b/tests/dbus/bug735437_client.c-expected
@@ -30,6 +30,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
 #define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
@@ -62,10 +67,22 @@ VALA_EXTERN gchar** test_multi_array2 (Test* self,
                            gint* result_length3,
                            GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gdouble* test_proxy_array (Test* self,
                            gint* result_length1,
                            GError** error);
@@ -219,7 +236,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -230,6 +288,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/bug782719_client.c-expected b/tests/dbus/bug782719_client.c-expected
index a5883c89f..ceade57e2 100644
--- a/tests/dbus/bug782719_client.c-expected
+++ b/tests/dbus/bug782719_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL)))
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
@@ -50,10 +55,22 @@ VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN GHashTable* test_test_nested_dict (Test* self,
                                    GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static GHashTable* test_proxy_test_nested_dict (Test* self,
                                          GError** error);
 static void test_proxy_test_interface_init (TestIface* iface);
@@ -153,7 +170,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -164,6 +222,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/bug783002_client.c-expected b/tests/dbus/bug783002_client.c-expected
index f87ad4c6a..2d581b820 100644
--- a/tests/dbus/bug783002_client.c-expected
+++ b/tests/dbus/bug783002_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 typedef struct _TestTestArrayLifetimeReadyData TestTestArrayLifetimeReadyData;
 #define _g_free0(var) (var = (g_free (var), NULL))
 #define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
@@ -90,10 +95,22 @@ VALA_EXTERN gchar* test_test_array_lifetime_finish (Test* self,
                                         GAsyncResult* _res_,
                                         GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void _vala_g_async_ready_callback (GObject *source_object,
                                    GAsyncResult *res,
                                    void *user_data);
@@ -226,7 +243,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -237,6 +295,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/bug792277.c-expected b/tests/dbus/bug792277.c-expected
index 63cea38d3..37733ac0d 100644
--- a/tests/dbus/bug792277.c-expected
+++ b/tests/dbus/bug792277.c-expected
@@ -27,6 +27,11 @@ typedef struct _IFooIface IFooIface;
 #define TYPE_IFOO_PROXY (ifoo_proxy_get_type ())
 typedef GDBusProxy IFooProxy;
 typedef GDBusProxyClass IFooProxyClass;
+enum  {
+       IFOO_PROXY_0_PROPERTY,
+       IFOO_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* ifoo_proxy_properties[IFOO_PROXY_NUM_PROPERTIES];
 
 #define TYPE_FOO (foo_get_type ())
 #define FOO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_FOO, Foo))
@@ -74,10 +79,22 @@ VALA_EXTERN void ifoo_method1 (IFoo* self,
                    GError** error);
 VALA_EXTERN void ifoo_method2 (IFoo* self);
 static GType ifoo_get_type_once (void);
+static GParamSpec * _vala_ifoo_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void ifoo_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void ifoo_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void ifoo_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void ifoo_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void ifoo_proxy_method0 (IFoo* self,
                          GError** error);
 static void ifoo_proxy_method1 (IFoo* self,
@@ -254,7 +271,48 @@ G_DEFINE_TYPE_EXTENDED (IFooProxy, ifoo_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 ifoo_proxy_class_init (IFooProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = ifoo_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = ifoo_proxy_g_signal;
+       proxy_class->g_properties_changed = ifoo_proxy_g_properties_changed;
+       object_class->get_property = ifoo_proxy_get_property;
+       object_class->set_property = ifoo_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_ifoo_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+ifoo_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       IFoo * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_IFOO, IFoo);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+ifoo_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       IFoo * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_IFOO, IFoo);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -265,6 +323,31 @@ ifoo_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+ifoo_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_ifoo_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_ifoo_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 ifoo_proxy_init (IFooProxy* self)
 {
diff --git a/tests/dbus/connection_client.c-expected b/tests/dbus/connection_client.c-expected
index d25dbb971..6a8981ae6 100644
--- a/tests/dbus/connection_client.c-expected
+++ b/tests/dbus/connection_client.c-expected
@@ -27,6 +27,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
 #define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
@@ -47,10 +52,22 @@ VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN gint test_get_test (Test* self,
                     GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gint test_proxy_get_test (Test* self,
                           GError** error);
 static void test_proxy_test_interface_init (TestIface* iface);
@@ -142,7 +159,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -153,6 +211,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/dicts_client.c-expected b/tests/dbus/dicts_client.c-expected
index d7de6e2fc..d532f957c 100644
--- a/tests/dbus/dicts_client.c-expected
+++ b/tests/dbus/dicts_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_hash_table_unref0(var) ((var == NULL) ? NULL : (var = (g_hash_table_unref (var), NULL)))
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
@@ -50,10 +55,22 @@ VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN GHashTable* test_test_dict (Test* self,
                             GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static GHashTable* test_proxy_test_dict (Test* self,
                                   GError** error);
 static void test_proxy_test_interface_init (TestIface* iface);
@@ -153,7 +170,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -164,6 +222,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/dicts_server.c-expected b/tests/dbus/dicts_server.c-expected
index 90cafa765..f7aca16f6 100644
--- a/tests/dbus/dicts_server.c-expected
+++ b/tests/dbus/dicts_server.c-expected
@@ -45,6 +45,11 @@ typedef struct _TestInterfaceBarIface TestInterfaceBarIface;
 #define TEST_INTERFACE_TYPE_BAR_PROXY (test_interface_bar_proxy_get_type ())
 typedef GDBusProxy TestInterfaceBarProxy;
 typedef GDBusProxyClass TestInterfaceBarProxyClass;
+enum  {
+       TEST_INTERFACE_BAR_PROXY_0_PROPERTY,
+       TEST_INTERFACE_BAR_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_interface_bar_proxy_properties[TEST_INTERFACE_BAR_PROXY_NUM_PROPERTIES];
 
 #define TEST_INTERFACE_TYPE_FOO (test_interface_foo_get_type ())
 #define TEST_INTERFACE_FOO(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TEST_INTERFACE_TYPE_FOO, 
TestInterfaceFoo))
@@ -148,10 +153,22 @@ VALA_EXTERN GType test_interface_bar_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN GHashTable* test_interface_bar_foo (TestInterfaceBar* self,
                                     GError** error);
 static GType test_interface_bar_get_type_once (void);
+static GParamSpec * _vala_test_interface_bar_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_interface_bar_proxy_get_property (GObject* object,
+                                            guint property_id,
+                                            GValue* value,
+                                            GParamSpec* pspec);
+static void test_interface_bar_proxy_set_property (GObject* object,
+                                            guint property_id,
+                                            const GValue* value,
+                                            GParamSpec* pspec);
 static void test_interface_bar_proxy_g_signal (GDBusProxy* proxy,
                                         const gchar* sender_name,
                                         const gchar* signal_name,
                                         GVariant* parameters);
+static void test_interface_bar_proxy_g_properties_changed (GDBusProxy* proxy,
+                                                    GVariant* changed_properties,
+                                                    const gchar* const* invalidated_properties);
 static GHashTable* test_interface_bar_proxy_foo (TestInterfaceBar* self,
                                           GError** error);
 static void test_interface_bar_proxy_test_interface_bar_interface_init (TestInterfaceBarIface* iface);
@@ -501,7 +518,48 @@ G_DEFINE_TYPE_EXTENDED (TestInterfaceBarProxy, test_interface_bar_proxy, G_TYPE_
 static void
 test_interface_bar_proxy_class_init (TestInterfaceBarProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_interface_bar_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_interface_bar_proxy_g_signal;
+       proxy_class->g_properties_changed = test_interface_bar_proxy_g_properties_changed;
+       object_class->get_property = test_interface_bar_proxy_get_property;
+       object_class->set_property = test_interface_bar_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_interface_bar_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_interface_bar_proxy_get_property (GObject* object,
+                                       guint property_id,
+                                       GValue* value,
+                                       GParamSpec* pspec)
+{
+       TestInterfaceBar * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TEST_INTERFACE_TYPE_BAR, TestInterfaceBar);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_interface_bar_proxy_set_property (GObject* object,
+                                       guint property_id,
+                                       const GValue* value,
+                                       GParamSpec* pspec)
+{
+       TestInterfaceBar * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TEST_INTERFACE_TYPE_BAR, TestInterfaceBar);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -512,6 +570,31 @@ test_interface_bar_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_interface_bar_proxy_g_properties_changed (GDBusProxy* proxy,
+                                               GVariant* changed_properties,
+                                               const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_interface_bar_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_interface_bar_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_interface_bar_proxy_init (TestInterfaceBarProxy* self)
 {
diff --git a/tests/dbus/enum-string-marshalling.c-expected b/tests/dbus/enum-string-marshalling.c-expected
index bf75b7b5a..f3971294f 100644
--- a/tests/dbus/enum-string-marshalling.c-expected
+++ b/tests/dbus/enum-string-marshalling.c-expected
@@ -33,6 +33,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 typedef struct _TestTest1ReadyData TestTest1ReadyData;
 typedef struct _TestTest5ReadyData TestTest5ReadyData;
 
@@ -91,10 +96,22 @@ VALA_EXTERN void test_test5 (Test* self,
 VALA_EXTERN void test_test5_finish (Test* self,
                         GAsyncResult* _res_);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void _vala_g_async_ready_callback (GObject *source_object,
                                    GAsyncResult *res,
                                    void *user_data);
@@ -368,7 +385,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -379,6 +437,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/errors_client.c-expected b/tests/dbus/errors_client.c-expected
index f8f2acc04..d53071494 100644
--- a/tests/dbus/errors_client.c-expected
+++ b/tests/dbus/errors_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_free0(var) (var = (g_free (var), NULL))
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _g_error_free0(var) ((var == NULL) ? NULL : (var = (g_error_free (var), NULL)))
@@ -74,10 +79,22 @@ VALA_EXTERN void test_test_cancellable (Test* self,
 VALA_EXTERN void test_test_custom_error (Test* self,
                              GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void test_proxy_test_void (Test* self,
                            GError** error);
 static gint test_proxy_test_int (Test* self,
@@ -274,7 +291,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -285,6 +343,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/filedescriptor-async_client.c-expected 
b/tests/dbus/filedescriptor-async_client.c-expected
index 0c6bcb8d0..16aef75e4 100644
--- a/tests/dbus/filedescriptor-async_client.c-expected
+++ b/tests/dbus/filedescriptor-async_client.c-expected
@@ -30,6 +30,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 typedef struct _TestTestInReadyData TestTestInReadyData;
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 typedef struct _RunData RunData;
@@ -126,10 +131,22 @@ VALA_EXTERN GUnixInputStream* test_test_in_finish (Test* self,
                                        GUnixInputStream* * j,
                                        GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void _vala_g_async_ready_callback (GObject *source_object,
                                    GAsyncResult *res,
                                    void *user_data);
@@ -257,7 +274,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -268,6 +326,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/filedescriptor-errors_client.c-expected 
b/tests/dbus/filedescriptor-errors_client.c-expected
index dde04e5dd..0d3795d8b 100644
--- a/tests/dbus/filedescriptor-errors_client.c-expected
+++ b/tests/dbus/filedescriptor-errors_client.c-expected
@@ -32,6 +32,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_free0(var) (var = (g_free (var), NULL))
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 
@@ -50,10 +55,22 @@ VALA_EXTERN gchar* test_test (Test* self,
                   GUnixOutputStream* output_stream,
                   GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gchar* test_proxy_test (Test* self,
                         GUnixOutputStream* output_stream,
                         GError** error);
@@ -151,7 +168,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -162,6 +220,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/filedescriptor_client.c-expected b/tests/dbus/filedescriptor_client.c-expected
index d22be7c38..e720e47f8 100644
--- a/tests/dbus/filedescriptor_client.c-expected
+++ b/tests/dbus/filedescriptor_client.c-expected
@@ -30,6 +30,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
 #define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
@@ -52,10 +57,22 @@ VALA_EXTERN GUnixInputStream* test_test_in (Test* self,
                                 GUnixInputStream* * j,
                                 GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static GUnixInputStream* test_proxy_test_in (Test* self,
                                       GUnixInputStream* i,
                                       GUnixInputStream* * j,
@@ -153,7 +170,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -164,6 +222,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/generics_client.c-expected b/tests/dbus/generics_client.c-expected
index eaada2f07..f454de812 100644
--- a/tests/dbus/generics_client.c-expected
+++ b/tests/dbus/generics_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
 #define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
@@ -48,10 +53,22 @@ VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN gint test_get_test (Test* self,
                     GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gint test_proxy_get_test (Test* self,
                           GError** error);
 static void test_proxy_test_interface_init (TestIface* iface);
@@ -149,7 +166,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -160,6 +218,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/interface-info_client.c-expected b/tests/dbus/interface-info_client.c-expected
index 9ae2ff2b7..bae0ab727 100644
--- a/tests/dbus/interface-info_client.c-expected
+++ b/tests/dbus/interface-info_client.c-expected
@@ -33,6 +33,11 @@ enum  {
 static guint test_signals[TEST_NUM_SIGNALS] = {0};
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_free0(var) (var = (g_free (var), NULL))
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
@@ -54,12 +59,24 @@ VALA_EXTERN guint test_register_object (void* object,
                             const gchar* path,
                             GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
 static void _dbus_handle_test_bar (Test* self,
                             GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void test_proxy_test_interface_init (TestIface* iface);
 static void test_dbus_interface_method_call (GDBusConnection* connection,
                                       const gchar* sender,
@@ -137,7 +154,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -166,6 +224,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
        }
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/no-reply_client.c-expected b/tests/dbus/no-reply_client.c-expected
index 106c9a2b2..35b005172 100644
--- a/tests/dbus/no-reply_client.c-expected
+++ b/tests/dbus/no-reply_client.c-expected
@@ -28,6 +28,11 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_free0(var) (var = (g_free (var), NULL))
 typedef struct _Block1Data Block1Data;
 #define _g_async_queue_unref0(var) ((var == NULL) ? NULL : (var = (g_async_queue_unref (var), NULL)))
@@ -127,10 +132,22 @@ VALA_EXTERN void test_post_message_no_reply (Test* self,
                                  const gchar* message,
                                  GError** error);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gchar** test_proxy_list_messages (Test* self,
                                   gint* result_length1,
                                   GError** error);
@@ -295,7 +312,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -306,6 +364,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/properties_client.c-expected b/tests/dbus/properties_client.c-expected
new file mode 100644
index 000000000..b003aab9f
--- /dev/null
+++ b/tests/dbus/properties_client.c-expected
@@ -0,0 +1,1259 @@
+/* dbus_properties_client.c generated by valac, the Vala compiler
+ * generated from dbus_properties_client.vala, do not modify */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <glib.h>
+#include <stdlib.h>
+#include <string.h>
+
+#if !defined(VALA_EXTERN)
+#if defined(_MSC_VER)
+#define VALA_EXTERN __declspec(dllexport) extern
+#elif __GNUC__ >= 4
+#define VALA_EXTERN __attribute__((visibility("default"))) extern
+#else
+#define VALA_EXTERN extern
+#endif
+#endif
+
+#define TYPE_TEST (test_get_type ())
+#define TEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TEST, Test))
+#define IS_TEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TEST))
+#define TEST_GET_INTERFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), TYPE_TEST, TestIface))
+
+typedef struct _Test Test;
+typedef struct _TestIface TestIface;
+
+#define TYPE_TEST_PROXY (test_proxy_get_type ())
+typedef GDBusProxy TestProxy;
+typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_TEST_PROPERTY_PROPERTY,
+       TEST_PROXY_TEST_INT_PROPERTY_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
+#define _g_free0(var) (var = (g_free (var), NULL))
+
+#define TYPE_TEST2 (test2_get_type ())
+#define TEST2(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TEST2, Test2))
+#define TEST2_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TEST2, Test2Class))
+#define IS_TEST2(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TEST2))
+#define IS_TEST2_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TEST2))
+#define TEST2_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_TEST2, Test2Class))
+
+typedef struct _Test2 Test2;
+typedef struct _Test2Class Test2Class;
+typedef struct _Test2Private Test2Private;
+enum  {
+       TEST2_0_PROPERTY,
+       TEST2_TEST_PROPERTY_PROPERTY,
+       TEST2_TEST_INT_PROPERTY_PROPERTY,
+       TEST2_NUM_PROPERTIES
+};
+static GParamSpec* test2_properties[TEST2_NUM_PROPERTIES];
+typedef struct _Block1Data Block1Data;
+#define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+typedef struct _Block2Data Block2Data;
+#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
+#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
+#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning 
(G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
+#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
+
+struct _TestIface {
+       GTypeInterface parent_iface;
+       void (*change_everything) (Test* self, GError** error);
+       void (*check_everything) (Test* self, GError** error);
+       gchar* (*get_test_property) (Test* self);
+       void (*set_test_property) (Test* self, const gchar* value);
+       gint (*get_test_int_property) (Test* self);
+       void (*set_test_int_property) (Test* self, gint value);
+};
+
+struct _Test2 {
+       GObject parent_instance;
+       Test2Private * priv;
+};
+
+struct _Test2Class {
+       GObjectClass parent_class;
+};
+
+struct _Test2Private {
+       gchar* _test_property;
+       gint _test_int_property;
+};
+
+struct _Block1Data {
+       int _ref_count_;
+       GMainLoop* main_loop;
+};
+
+struct _Block2Data {
+       int _ref_count_;
+       GMainLoop* main_loop2;
+};
+
+static gint Test2_private_offset;
+static gpointer test2_parent_class = NULL;
+
+VALA_EXTERN GType test_proxy_get_type (void) G_GNUC_CONST ;
+VALA_EXTERN guint test_register_object (void* object,
+                            GDBusConnection* connection,
+                            const gchar* path,
+                            GError** error);
+VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
+VALA_EXTERN void test_change_everything (Test* self,
+                             GError** error);
+VALA_EXTERN void test_check_everything (Test* self,
+                            GError** error);
+VALA_EXTERN gchar* test_get_test_property (Test* self);
+VALA_EXTERN void test_set_test_property (Test* self,
+                             const gchar* value);
+VALA_EXTERN gint test_get_test_int_property (Test* self);
+VALA_EXTERN void test_set_test_int_property (Test* self,
+                                 gint value);
+static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_g_signal (GDBusProxy* proxy,
+                          const gchar* sender_name,
+                          const gchar* signal_name,
+                          GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
+static void test_proxy_change_everything (Test* self,
+                                   GError** error);
+static void test_proxy_check_everything (Test* self,
+                                  GError** error);
+static gchar* test_dbus_proxy_get_test_property (Test* self);
+static void test_dbus_proxy_set_test_property (Test* self,
+                                        const gchar* value);
+static gint test_dbus_proxy_get_test_int_property (Test* self);
+static void test_dbus_proxy_set_test_int_property (Test* self,
+                                            gint value);
+static void test_proxy_test_interface_init (TestIface* iface);
+static void _dbus_test_change_everything (Test* self,
+                                   GVariant* _parameters_,
+                                   GDBusMethodInvocation* invocation);
+static void _dbus_test_check_everything (Test* self,
+                                  GVariant* _parameters_,
+                                  GDBusMethodInvocation* invocation);
+static void test_dbus_interface_method_call (GDBusConnection* connection,
+                                      const gchar* sender,
+                                      const gchar* object_path,
+                                      const gchar* interface_name,
+                                      const gchar* method_name,
+                                      GVariant* parameters,
+                                      GDBusMethodInvocation* invocation,
+                                      gpointer user_data);
+static GVariant* test_dbus_interface_get_property (GDBusConnection* connection,
+                                            const gchar* sender,
+                                            const gchar* object_path,
+                                            const gchar* interface_name,
+                                            const gchar* property_name,
+                                            GError** error,
+                                            gpointer user_data);
+static GVariant* _dbus_test_get_test_property (Test* self);
+static GVariant* _dbus_test_get_test_int_property (Test* self);
+static gboolean test_dbus_interface_set_property (GDBusConnection* connection,
+                                           const gchar* sender,
+                                           const gchar* object_path,
+                                           const gchar* interface_name,
+                                           const gchar* property_name,
+                                           GVariant* value,
+                                           GError** error,
+                                           gpointer user_data);
+static void _dbus_test_set_test_property (Test* self,
+                                   GVariant* _value);
+static void _dbus_test_set_test_int_property (Test* self,
+                                       GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
+static void _test_notify_test_int_property (GObject * gobject,
+                                     GParamSpec * pspec,
+                                     gpointer user_data);
+static void _test_unregister_object (gpointer user_data);
+VALA_EXTERN GType test2_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Test2, g_object_unref)
+VALA_EXTERN Test2* test2_new (void);
+VALA_EXTERN Test2* test2_construct (GType object_type);
+VALA_EXTERN const gchar* test2_get_test_property (Test2* self);
+VALA_EXTERN void test2_set_test_property (Test2* self,
+                              const gchar* value);
+VALA_EXTERN gint test2_get_test_int_property (Test2* self);
+VALA_EXTERN void test2_set_test_int_property (Test2* self,
+                                  gint value);
+static void test2_finalize (GObject * obj);
+static GType test2_get_type_once (void);
+static void _vala_test2_get_property (GObject * object,
+                               guint property_id,
+                               GValue * value,
+                               GParamSpec * pspec);
+static void _vala_test2_set_property (GObject * object,
+                               guint property_id,
+                               const GValue * value,
+                               GParamSpec * pspec);
+static void _vala_main (void);
+static Block1Data* block1_data_ref (Block1Data* _data1_);
+static void block1_data_unref (void * _userdata_);
+static void ___lambda4_ (Block1Data* _data1_,
+                  GParamSpec* p);
+static void ____lambda4__g_object_notify (GObject* _sender,
+                                   GParamSpec* pspec,
+                                   gpointer self);
+static Block2Data* block2_data_ref (Block2Data* _data2_);
+static void block2_data_unref (void * _userdata_);
+static void ___lambda5_ (Block2Data* _data2_,
+                  GParamSpec* p);
+static void ____lambda5__g_object_notify (GObject* _sender,
+                                   GParamSpec* pspec,
+                                   gpointer self);
+
+static const GDBusArgInfo * const _test_dbus_arg_info_change_everything_in[] = {NULL};
+static const GDBusArgInfo * const _test_dbus_arg_info_change_everything_out[] = {NULL};
+static const GDBusMethodInfo _test_dbus_method_info_change_everything = {-1, "ChangeEverything", 
(GDBusArgInfo **) (&_test_dbus_arg_info_change_everything_in), (GDBusArgInfo **) 
(&_test_dbus_arg_info_change_everything_out), NULL};
+static const GDBusArgInfo * const _test_dbus_arg_info_check_everything_in[] = {NULL};
+static const GDBusArgInfo * const _test_dbus_arg_info_check_everything_out[] = {NULL};
+static const GDBusMethodInfo _test_dbus_method_info_check_everything = {-1, "CheckEverything", (GDBusArgInfo 
**) (&_test_dbus_arg_info_check_everything_in), (GDBusArgInfo **) 
(&_test_dbus_arg_info_check_everything_out), NULL};
+static const GDBusMethodInfo * const _test_dbus_method_info[] = {&_test_dbus_method_info_change_everything, 
&_test_dbus_method_info_check_everything, NULL};
+static const GDBusSignalInfo * const _test_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo _test_dbus_property_info_test_property = {-1, "TestProperty", "s", 
G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, NULL};
+static const GDBusPropertyInfo _test_dbus_property_info_test_int_property = {-1, "TestIntProperty", "i", 
G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, NULL};
+static const GDBusPropertyInfo * const _test_dbus_property_info[] = 
{&_test_dbus_property_info_test_property, &_test_dbus_property_info_test_int_property, NULL};
+static const GDBusInterfaceInfo _test_dbus_interface_info = {-1, "org.example.Test", (GDBusMethodInfo **) 
(&_test_dbus_method_info), (GDBusSignalInfo **) (&_test_dbus_signal_info), (GDBusPropertyInfo **) 
(&_test_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _test_dbus_interface_vtable = {test_dbus_interface_method_call, 
test_dbus_interface_get_property, test_dbus_interface_set_property};
+
+void
+test_change_everything (Test* self,
+                        GError** error)
+{
+       TestIface* _iface_;
+       g_return_if_fail (IS_TEST (self));
+       _iface_ = TEST_GET_INTERFACE (self);
+       if (_iface_->change_everything) {
+               _iface_->change_everything (self, error);
+       }
+}
+
+void
+test_check_everything (Test* self,
+                       GError** error)
+{
+       TestIface* _iface_;
+       g_return_if_fail (IS_TEST (self));
+       _iface_ = TEST_GET_INTERFACE (self);
+       if (_iface_->check_everything) {
+               _iface_->check_everything (self, error);
+       }
+}
+
+gchar*
+test_get_test_property (Test* self)
+{
+       TestIface* _iface_;
+       g_return_val_if_fail (IS_TEST (self), NULL);
+       _iface_ = TEST_GET_INTERFACE (self);
+       if (_iface_->get_test_property) {
+               return _iface_->get_test_property (self);
+       }
+       return NULL;
+}
+
+void
+test_set_test_property (Test* self,
+                        const gchar* value)
+{
+       TestIface* _iface_;
+       g_return_if_fail (IS_TEST (self));
+       _iface_ = TEST_GET_INTERFACE (self);
+       if (_iface_->set_test_property) {
+               _iface_->set_test_property (self, value);
+       }
+}
+
+gint
+test_get_test_int_property (Test* self)
+{
+       TestIface* _iface_;
+       g_return_val_if_fail (IS_TEST (self), 0);
+       _iface_ = TEST_GET_INTERFACE (self);
+       if (_iface_->get_test_int_property) {
+               return _iface_->get_test_int_property (self);
+       }
+       return -1;
+}
+
+void
+test_set_test_int_property (Test* self,
+                            gint value)
+{
+       TestIface* _iface_;
+       g_return_if_fail (IS_TEST (self));
+       _iface_ = TEST_GET_INTERFACE (self);
+       if (_iface_->set_test_int_property) {
+               _iface_->set_test_int_property (self, value);
+       }
+}
+
+static void
+test_default_init (TestIface * iface,
+                   gpointer iface_data)
+{
+       g_object_interface_install_property (iface, g_param_spec_string ("test-property", "test-property", 
"test-property", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
+       g_object_interface_install_property (iface, g_param_spec_int ("test-int-property", 
"test-int-property", "test-int-property", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | 
G_PARAM_WRITABLE));
+}
+
+static GType
+test_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (TestIface), (GBaseInitFunc) NULL, 
(GBaseFinalizeFunc) NULL, (GClassInitFunc) test_default_init, (GClassFinalizeFunc) NULL, NULL, 0, 0, 
(GInstanceInitFunc) NULL, NULL };
+       GType test_type_id;
+       test_type_id = g_type_register_static (G_TYPE_INTERFACE, "Test", &g_define_type_info, 0);
+       g_type_interface_add_prerequisite (test_type_id, G_TYPE_OBJECT);
+       g_type_set_qdata (test_type_id, g_quark_from_static_string ("vala-dbus-proxy-type"), (void*) 
test_proxy_get_type);
+       g_type_set_qdata (test_type_id, g_quark_from_static_string ("vala-dbus-interface-name"), 
"org.example.Test");
+       g_type_set_qdata (test_type_id, g_quark_from_static_string ("vala-dbus-interface-info"), (void*) 
(&_test_dbus_interface_info));
+       g_type_set_qdata (test_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) 
test_register_object);
+       return test_type_id;
+}
+
+GType
+test_get_type (void)
+{
+       static volatile gsize test_type_id__volatile = 0;
+       if (g_once_init_enter (&test_type_id__volatile)) {
+               GType test_type_id;
+               test_type_id = test_get_type_once ();
+               g_once_init_leave (&test_type_id__volatile, test_type_id);
+       }
+       return test_type_id__volatile;
+}
+
+G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT_INTERFACE (TYPE_TEST, 
test_proxy_test_interface_init) )
+static void
+test_proxy_class_init (TestProxyClass* klass)
+{
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+       g_object_class_override_property (object_class, TEST_PROXY_TEST_PROPERTY_PROPERTY, "test-property");
+       test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-property");
+       g_object_class_override_property (object_class, TEST_PROXY_TEST_INT_PROPERTY_PROPERTY, 
"test-int-property");
+       test_proxy_properties[TEST_PROXY_TEST_INT_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-int-property");
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       if (g_strcmp0 (dbus_property_name, "TestProperty") == 0) {
+               return test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY];
+       } else if (g_strcmp0 (dbus_property_name, "TestIntProperty") == 0) {
+               return test_proxy_properties[TEST_PROXY_TEST_INT_PROPERTY_PROPERTY];
+       }
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               g_value_take_string (value, test_dbus_proxy_get_test_property (self));
+               break;
+               case TEST_PROXY_TEST_INT_PROPERTY_PROPERTY:
+               g_value_set_int (value, test_dbus_proxy_get_test_int_property (self));
+               break;
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               test_dbus_proxy_set_test_property (self, g_value_get_string (value));
+               break;
+               case TEST_PROXY_TEST_INT_PROPERTY_PROPERTY:
+               test_dbus_proxy_set_test_int_property (self, g_value_get_int (value));
+               break;
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_g_signal (GDBusProxy* proxy,
+                     const gchar* sender_name,
+                     const gchar* signal_name,
+                     GVariant* parameters)
+{
+}
+
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
+static void
+test_proxy_init (TestProxy* self)
+{
+       g_dbus_proxy_set_interface_info (G_DBUS_PROXY (self), (GDBusInterfaceInfo *) 
(&_test_dbus_interface_info));
+}
+
+static void
+test_proxy_change_everything (Test* self,
+                              GError** error)
+{
+       GDBusMessage *_message;
+       GVariant *_arguments;
+       GVariantBuilder _arguments_builder;
+       GDBusMessage *_reply_message;
+       _message = g_dbus_message_new_method_call (g_dbus_proxy_get_name ((GDBusProxy *) self), 
g_dbus_proxy_get_object_path ((GDBusProxy *) self), "org.example.Test", "ChangeEverything");
+       g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+       _arguments = g_variant_builder_end (&_arguments_builder);
+       g_dbus_message_set_body (_message, _arguments);
+       _reply_message = g_dbus_connection_send_message_with_reply_sync (g_dbus_proxy_get_connection 
((GDBusProxy *) self), _message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, g_dbus_proxy_get_default_timeout 
((GDBusProxy *) self), NULL, NULL, error);
+       g_object_unref (_message);
+       if (!_reply_message) {
+               return;
+       }
+       if (g_dbus_message_to_gerror (_reply_message, error)) {
+               g_object_unref (_reply_message);
+               return;
+       }
+       g_object_unref (_reply_message);
+}
+
+static void
+test_proxy_check_everything (Test* self,
+                             GError** error)
+{
+       GDBusMessage *_message;
+       GVariant *_arguments;
+       GVariantBuilder _arguments_builder;
+       GDBusMessage *_reply_message;
+       _message = g_dbus_message_new_method_call (g_dbus_proxy_get_name ((GDBusProxy *) self), 
g_dbus_proxy_get_object_path ((GDBusProxy *) self), "org.example.Test", "CheckEverything");
+       g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+       _arguments = g_variant_builder_end (&_arguments_builder);
+       g_dbus_message_set_body (_message, _arguments);
+       _reply_message = g_dbus_connection_send_message_with_reply_sync (g_dbus_proxy_get_connection 
((GDBusProxy *) self), _message, G_DBUS_SEND_MESSAGE_FLAGS_NONE, g_dbus_proxy_get_default_timeout 
((GDBusProxy *) self), NULL, NULL, error);
+       g_object_unref (_message);
+       if (!_reply_message) {
+               return;
+       }
+       if (g_dbus_message_to_gerror (_reply_message, error)) {
+               g_object_unref (_reply_message);
+               return;
+       }
+       g_object_unref (_reply_message);
+}
+
+static gchar*
+test_dbus_proxy_get_test_property (Test* self)
+{
+       GVariant *_inner_reply;
+       gchar* _result;
+       _inner_reply = g_dbus_proxy_get_cached_property ((GDBusProxy *) self, "TestProperty");
+       if (!_inner_reply) {
+               GVariant *_arguments;
+               GVariant *_reply;
+               GVariantBuilder _arguments_builder;
+               g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("org.example.Test"));
+               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("TestProperty"));
+               _arguments = g_variant_builder_end (&_arguments_builder);
+               _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "org.freedesktop.DBus.Properties.Get", 
_arguments, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
+               if (!_reply) {
+                       return NULL;
+               }
+               g_variant_get (_reply, "(v)", &_inner_reply);
+               g_variant_unref (_reply);
+       }
+       _result = g_variant_dup_string (_inner_reply, NULL);
+       g_variant_unref (_inner_reply);
+       return _result;
+}
+
+static void
+test_dbus_proxy_set_test_property (Test* self,
+                                   const gchar* value)
+{
+       GVariant *_arguments;
+       GVariant *_reply;
+       GVariantBuilder _arguments_builder;
+       g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("org.example.Test"));
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("TestProperty"));
+       g_variant_builder_open (&_arguments_builder, G_VARIANT_TYPE_VARIANT);
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_string (value));
+       g_variant_builder_close (&_arguments_builder);
+       _arguments = g_variant_builder_end (&_arguments_builder);
+       _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "org.freedesktop.DBus.Properties.Set", 
_arguments, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
+       if (!_reply) {
+               return;
+       }
+       g_variant_unref (_reply);
+}
+
+static gint
+test_dbus_proxy_get_test_int_property (Test* self)
+{
+       GVariant *_inner_reply;
+       gint _result;
+       _inner_reply = g_dbus_proxy_get_cached_property ((GDBusProxy *) self, "TestIntProperty");
+       if (!_inner_reply) {
+               GVariant *_arguments;
+               GVariant *_reply;
+               GVariantBuilder _arguments_builder;
+               g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("org.example.Test"));
+               g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("TestIntProperty"));
+               _arguments = g_variant_builder_end (&_arguments_builder);
+               _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "org.freedesktop.DBus.Properties.Get", 
_arguments, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
+               if (!_reply) {
+                       gint _tmp0_ = 0;
+                       return _tmp0_;
+               }
+               g_variant_get (_reply, "(v)", &_inner_reply);
+               g_variant_unref (_reply);
+       }
+       _result = g_variant_get_int32 (_inner_reply);
+       g_variant_unref (_inner_reply);
+       return _result;
+}
+
+static void
+test_dbus_proxy_set_test_int_property (Test* self,
+                                       gint value)
+{
+       GVariant *_arguments;
+       GVariant *_reply;
+       GVariantBuilder _arguments_builder;
+       g_variant_builder_init (&_arguments_builder, G_VARIANT_TYPE_TUPLE);
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("org.example.Test"));
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_string ("TestIntProperty"));
+       g_variant_builder_open (&_arguments_builder, G_VARIANT_TYPE_VARIANT);
+       g_variant_builder_add_value (&_arguments_builder, g_variant_new_int32 (value));
+       g_variant_builder_close (&_arguments_builder);
+       _arguments = g_variant_builder_end (&_arguments_builder);
+       _reply = g_dbus_proxy_call_sync ((GDBusProxy *) self, "org.freedesktop.DBus.Properties.Set", 
_arguments, G_DBUS_CALL_FLAGS_NONE, -1, NULL, NULL);
+       if (!_reply) {
+               return;
+       }
+       g_variant_unref (_reply);
+}
+
+static void
+test_proxy_test_interface_init (TestIface* iface)
+{
+       iface->change_everything = test_proxy_change_everything;
+       iface->check_everything = test_proxy_check_everything;
+       iface->get_test_property = test_dbus_proxy_get_test_property;
+       iface->set_test_property = test_dbus_proxy_set_test_property;
+       iface->get_test_int_property = test_dbus_proxy_get_test_int_property;
+       iface->set_test_int_property = test_dbus_proxy_set_test_int_property;
+}
+
+static void
+_dbus_test_change_everything (Test* self,
+                              GVariant* _parameters_,
+                              GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       test_change_everything (self, &error);
+       if (error) {
+               g_dbus_method_invocation_return_gerror (invocation, error);
+               g_error_free (error);
+               return;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, 
G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+}
+
+static void
+_dbus_test_check_everything (Test* self,
+                             GVariant* _parameters_,
+                             GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       test_check_everything (self, &error);
+       if (error) {
+               g_dbus_method_invocation_return_gerror (invocation, error);
+               g_error_free (error);
+               return;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, 
G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+}
+
+static void
+test_dbus_interface_method_call (GDBusConnection* connection,
+                                 const gchar* sender,
+                                 const gchar* object_path,
+                                 const gchar* interface_name,
+                                 const gchar* method_name,
+                                 GVariant* parameters,
+                                 GDBusMethodInvocation* invocation,
+                                 gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (method_name, "ChangeEverything") == 0) {
+               _dbus_test_change_everything (object, parameters, invocation);
+       } else if (strcmp (method_name, "CheckEverything") == 0) {
+               _dbus_test_check_everything (object, parameters, invocation);
+       } else {
+               g_object_unref (invocation);
+       }
+}
+
+static GVariant*
+_dbus_test_get_test_property (Test* self)
+{
+       gchar* result;
+       GVariant* _reply;
+       result = test_get_test_property (self);
+       _reply = g_variant_new_string (result);
+       _g_free0 (result);
+       return _reply;
+}
+
+static GVariant*
+_dbus_test_get_test_int_property (Test* self)
+{
+       gint result;
+       GVariant* _reply;
+       result = test_get_test_int_property (self);
+       _reply = g_variant_new_int32 (result);
+       return _reply;
+}
+
+static GVariant*
+test_dbus_interface_get_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (property_name, "TestProperty") == 0) {
+               return _dbus_test_get_test_property (object);
+       } else if (strcmp (property_name, "TestIntProperty") == 0) {
+               return _dbus_test_get_test_int_property (object);
+       }
+       return NULL;
+}
+
+static void
+_dbus_test_set_test_property (Test* self,
+                              GVariant* _value)
+{
+       gchar* value = NULL;
+       value = g_variant_dup_string (_value, NULL);
+       test_set_test_property (self, value);
+       _g_free0 (value);
+}
+
+static void
+_dbus_test_set_test_int_property (Test* self,
+                                  GVariant* _value)
+{
+       gint value = 0;
+       value = g_variant_get_int32 (_value);
+       test_set_test_int_property (self, value);
+}
+
+static gboolean
+test_dbus_interface_set_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GVariant* value,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (property_name, "TestProperty") == 0) {
+               _dbus_test_set_test_property (object, value);
+               return TRUE;
+       } else if (strcmp (property_name, "TestIntProperty") == 0) {
+               _dbus_test_set_test_int_property (object, value);
+               return TRUE;
+       }
+       return FALSE;
+}
+
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
+static void
+_test_notify_test_int_property (GObject * gobject,
+                                GParamSpec * pspec,
+                                gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_int_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestIntProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
+guint
+test_register_object (gpointer object,
+                      GDBusConnection* connection,
+                      const gchar* path,
+                      GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) 
(&_test_dbus_interface_info), &_test_dbus_interface_vtable, data, _test_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
+       g_signal_connect (object, "notify::test-int-property", (GCallback) _test_notify_test_int_property, 
data);
+       return result;
+}
+
+static void
+_test_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_int_property, data);
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+static inline gpointer
+test2_get_instance_private (Test2* self)
+{
+       return G_STRUCT_MEMBER_P (self, Test2_private_offset);
+}
+
+Test2*
+test2_construct (GType object_type)
+{
+       Test2 * self = NULL;
+       self = (Test2*) g_object_new (object_type, NULL);
+       return self;
+}
+
+Test2*
+test2_new (void)
+{
+       return test2_construct (TYPE_TEST2);
+}
+
+const gchar*
+test2_get_test_property (Test2* self)
+{
+       const gchar* result;
+       const gchar* _tmp0_;
+       g_return_val_if_fail (IS_TEST2 (self), NULL);
+       _tmp0_ = self->priv->_test_property;
+       result = _tmp0_;
+       return result;
+}
+
+void
+test2_set_test_property (Test2* self,
+                         const gchar* value)
+{
+       gchar* old_value;
+       g_return_if_fail (IS_TEST2 (self));
+       old_value = test2_get_test_property (self);
+       if (g_strcmp0 (value, old_value) != 0) {
+               gchar* _tmp0_;
+               _tmp0_ = g_strdup (value);
+               _g_free0 (self->priv->_test_property);
+               self->priv->_test_property = _tmp0_;
+               g_object_notify_by_pspec ((GObject *) self, test2_properties[TEST2_TEST_PROPERTY_PROPERTY]);
+       }
+}
+
+gint
+test2_get_test_int_property (Test2* self)
+{
+       gint result;
+       g_return_val_if_fail (IS_TEST2 (self), 0);
+       result = self->priv->_test_int_property;
+       return result;
+}
+
+void
+test2_set_test_int_property (Test2* self,
+                             gint value)
+{
+       gint old_value;
+       g_return_if_fail (IS_TEST2 (self));
+       old_value = test2_get_test_int_property (self);
+       if (old_value != value) {
+               self->priv->_test_int_property = value;
+               g_object_notify_by_pspec ((GObject *) self, 
test2_properties[TEST2_TEST_INT_PROPERTY_PROPERTY]);
+       }
+}
+
+static void
+test2_class_init (Test2Class * klass,
+                  gpointer klass_data)
+{
+       test2_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_adjust_private_offset (klass, &Test2_private_offset);
+       G_OBJECT_CLASS (klass)->get_property = _vala_test2_get_property;
+       G_OBJECT_CLASS (klass)->set_property = _vala_test2_set_property;
+       G_OBJECT_CLASS (klass)->finalize = test2_finalize;
+       g_object_class_install_property (G_OBJECT_CLASS (klass), TEST2_TEST_PROPERTY_PROPERTY, 
test2_properties[TEST2_TEST_PROPERTY_PROPERTY] = g_param_spec_string ("test-property", "test-property", 
"test-property", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
+       g_object_class_install_property (G_OBJECT_CLASS (klass), TEST2_TEST_INT_PROPERTY_PROPERTY, 
test2_properties[TEST2_TEST_INT_PROPERTY_PROPERTY] = g_param_spec_int ("test-int-property", 
"test-int-property", "test-int-property", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | 
G_PARAM_WRITABLE));
+}
+
+static void
+test2_instance_init (Test2 * self,
+                     gpointer klass)
+{
+       self->priv = test2_get_instance_private (self);
+}
+
+static void
+test2_finalize (GObject * obj)
+{
+       Test2 * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_TEST2, Test2);
+       _g_free0 (self->priv->_test_property);
+       G_OBJECT_CLASS (test2_parent_class)->finalize (obj);
+}
+
+static GType
+test2_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (Test2Class), (GBaseInitFunc) NULL, 
(GBaseFinalizeFunc) NULL, (GClassInitFunc) test2_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Test2), 
0, (GInstanceInitFunc) test2_instance_init, NULL };
+       GType test2_type_id;
+       test2_type_id = g_type_register_static (G_TYPE_OBJECT, "Test2", &g_define_type_info, 0);
+       Test2_private_offset = g_type_add_instance_private (test2_type_id, sizeof (Test2Private));
+       return test2_type_id;
+}
+
+GType
+test2_get_type (void)
+{
+       static volatile gsize test2_type_id__volatile = 0;
+       if (g_once_init_enter (&test2_type_id__volatile)) {
+               GType test2_type_id;
+               test2_type_id = test2_get_type_once ();
+               g_once_init_leave (&test2_type_id__volatile, test2_type_id);
+       }
+       return test2_type_id__volatile;
+}
+
+static void
+_vala_test2_get_property (GObject * object,
+                          guint property_id,
+                          GValue * value,
+                          GParamSpec * pspec)
+{
+       Test2 * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST2, Test2);
+       switch (property_id) {
+               case TEST2_TEST_PROPERTY_PROPERTY:
+               g_value_set_string (value, test2_get_test_property (self));
+               break;
+               case TEST2_TEST_INT_PROPERTY_PROPERTY:
+               g_value_set_int (value, test2_get_test_int_property (self));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+_vala_test2_set_property (GObject * object,
+                          guint property_id,
+                          const GValue * value,
+                          GParamSpec * pspec)
+{
+       Test2 * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST2, Test2);
+       switch (property_id) {
+               case TEST2_TEST_PROPERTY_PROPERTY:
+               test2_set_test_property (self, g_value_get_string (value));
+               break;
+               case TEST2_TEST_INT_PROPERTY_PROPERTY:
+               test2_set_test_int_property (self, g_value_get_int (value));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static Block1Data*
+block1_data_ref (Block1Data* _data1_)
+{
+       g_atomic_int_inc (&_data1_->_ref_count_);
+       return _data1_;
+}
+
+static void
+block1_data_unref (void * _userdata_)
+{
+       Block1Data* _data1_;
+       _data1_ = (Block1Data*) _userdata_;
+       if (g_atomic_int_dec_and_test (&_data1_->_ref_count_)) {
+               _g_main_loop_unref0 (_data1_->main_loop);
+               g_slice_free (Block1Data, _data1_);
+       }
+}
+
+static void
+___lambda4_ (Block1Data* _data1_,
+             GParamSpec* p)
+{
+       const gchar* _tmp0_;
+       GMainLoop* _tmp1_;
+       g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (p, G_TYPE_PARAM));
+       _tmp0_ = G_TYPE_CHECK_INSTANCE_CAST (G_TYPE_CHECK_INSTANCE_CAST (p, G_TYPE_PARAM_INT, GParamSpecInt), 
G_TYPE_PARAM, GParamSpec)->name;
+       _vala_assert (g_strcmp0 (_tmp0_, "test-int-property") == 0, "((ParamSpecInt) p).name == 
\"test-int-property\"");
+       _tmp1_ = _data1_->main_loop;
+       g_main_loop_quit (_tmp1_);
+}
+
+static void
+____lambda4__g_object_notify (GObject* _sender,
+                              GParamSpec* pspec,
+                              gpointer self)
+{
+       ___lambda4_ (self, pspec);
+}
+
+static Block2Data*
+block2_data_ref (Block2Data* _data2_)
+{
+       g_atomic_int_inc (&_data2_->_ref_count_);
+       return _data2_;
+}
+
+static void
+block2_data_unref (void * _userdata_)
+{
+       Block2Data* _data2_;
+       _data2_ = (Block2Data*) _userdata_;
+       if (g_atomic_int_dec_and_test (&_data2_->_ref_count_)) {
+               _g_main_loop_unref0 (_data2_->main_loop2);
+               g_slice_free (Block2Data, _data2_);
+       }
+}
+
+static void
+___lambda5_ (Block2Data* _data2_,
+             GParamSpec* p)
+{
+       const gchar* _tmp0_;
+       GMainLoop* _tmp1_;
+       g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (p, G_TYPE_PARAM));
+       _tmp0_ = G_TYPE_CHECK_INSTANCE_CAST (G_TYPE_CHECK_INSTANCE_CAST (p, G_TYPE_PARAM_STRING, 
GParamSpecString), G_TYPE_PARAM, GParamSpec)->name;
+       _vala_assert (g_strcmp0 (_tmp0_, "test-property") == 0, "((ParamSpecString) p).name == 
\"test-property\"");
+       _tmp1_ = _data2_->main_loop2;
+       g_main_loop_quit (_tmp1_);
+}
+
+static void
+____lambda5__g_object_notify (GObject* _sender,
+                              GParamSpec* pspec,
+                              gpointer self)
+{
+       ___lambda5_ (self, pspec);
+}
+
+static void
+_vala_main (void)
+{
+       Test* test = NULL;
+       Test* _tmp0_;
+       Test* _tmp1_;
+       gchar* _tmp2_;
+       gchar* _tmp3_;
+       gchar* _tmp4_;
+       Test* _tmp5_;
+       gint _tmp6_;
+       gint _tmp7_;
+       Test2* test2 = NULL;
+       Test2* _tmp8_;
+       Test* _tmp9_;
+       Test2* _tmp10_;
+       Test* _tmp11_;
+       Test2* _tmp12_;
+       GError* _inner_error0_ = NULL;
+       _tmp0_ = (Test*) g_initable_new (TYPE_TEST_PROXY, NULL, &_inner_error0_, "g-flags", 
G_DBUS_PROXY_FLAGS_NONE, "g-name", "org.example.Test", "g-bus-type", G_BUS_TYPE_SESSION, "g-object-path", 
"/org/example/test", "g-interface-name", "org.example.Test", NULL);
+       test = (Test*) _tmp0_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, 
_inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp1_ = test;
+       _tmp2_ = test_get_test_property (_tmp1_);
+       _tmp3_ = _tmp2_;
+       _tmp4_ = _tmp3_;
+       _vala_assert (g_strcmp0 (_tmp4_, "foo") == 0, "test.test_property == \"foo\"");
+       _g_free0 (_tmp4_);
+       _tmp5_ = test;
+       _tmp6_ = test_get_test_int_property (_tmp5_);
+       _tmp7_ = _tmp6_;
+       _vala_assert (_tmp7_ == 17, "test.test_int_property == 17");
+       _tmp8_ = test2_new ();
+       test2 = _tmp8_;
+       _tmp9_ = test;
+       _tmp10_ = test2;
+       g_object_bind_property_with_closures (G_TYPE_CHECK_INSTANCE_CAST (_tmp9_, G_TYPE_OBJECT, GObject), 
"test-property", G_TYPE_CHECK_INSTANCE_CAST (_tmp10_, G_TYPE_OBJECT, GObject), "test-property", 
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL, (GClosure*) ((NULL == NULL) ? NULL : g_cclosure_new 
((GCallback) NULL, NULL, (GClosureNotify) NULL)), (GClosure*) ((NULL == NULL) ? NULL : g_cclosure_new 
((GCallback) NULL, NULL, (GClosureNotify) NULL)));
+       _tmp11_ = test;
+       _tmp12_ = test2;
+       g_object_bind_property_with_closures (G_TYPE_CHECK_INSTANCE_CAST (_tmp11_, G_TYPE_OBJECT, GObject), 
"test-int-property", G_TYPE_CHECK_INSTANCE_CAST (_tmp12_, G_TYPE_OBJECT, GObject), "test-int-property", 
G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL, (GClosure*) ((NULL == NULL) ? NULL : g_cclosure_new 
((GCallback) NULL, NULL, (GClosureNotify) NULL)), (GClosure*) ((NULL == NULL) ? NULL : g_cclosure_new 
((GCallback) NULL, NULL, (GClosureNotify) NULL)));
+       {
+               Block1Data* _data1_;
+               GMainLoop* _tmp13_;
+               Test2* _tmp14_;
+               const gchar* _tmp15_;
+               const gchar* _tmp16_;
+               Test2* _tmp17_;
+               gint _tmp18_;
+               gint _tmp19_;
+               Test2* _tmp20_;
+               Test* _tmp21_;
+               GMainLoop* _tmp22_;
+               Test* _tmp23_;
+               gchar* _tmp24_;
+               gchar* _tmp25_;
+               gchar* _tmp26_;
+               Test* _tmp27_;
+               gint _tmp28_;
+               gint _tmp29_;
+               _data1_ = g_slice_new0 (Block1Data);
+               _data1_->_ref_count_ = 1;
+               _tmp13_ = g_main_loop_new (NULL, FALSE);
+               _data1_->main_loop = _tmp13_;
+               _tmp14_ = test2;
+               _tmp15_ = test2_get_test_property (_tmp14_);
+               _tmp16_ = _tmp15_;
+               _vala_assert (g_strcmp0 (_tmp16_, "foo") == 0, "test2.test_property == \"foo\"");
+               _tmp17_ = test2;
+               _tmp18_ = test2_get_test_int_property (_tmp17_);
+               _tmp19_ = _tmp18_;
+               _vala_assert (_tmp19_ == 17, "test2.test_int_property == 17");
+               _tmp20_ = test2;
+               g_signal_connect_data (G_TYPE_CHECK_INSTANCE_CAST (_tmp20_, G_TYPE_OBJECT, GObject), 
"notify::test-int-property", (GCallback) ____lambda4__g_object_notify, block1_data_ref (_data1_), 
(GClosureNotify) block1_data_unref, 0);
+               _tmp21_ = test;
+               test_change_everything (_tmp21_, &_inner_error0_);
+               if (G_UNLIKELY (_inner_error0_ != NULL)) {
+                       block1_data_unref (_data1_);
+                       _data1_ = NULL;
+                       _g_object_unref0 (test2);
+                       _g_object_unref0 (test);
+                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, 
_inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+                       g_clear_error (&_inner_error0_);
+                       return;
+               }
+               _tmp22_ = _data1_->main_loop;
+               g_main_loop_run (_tmp22_);
+               _tmp23_ = test;
+               _tmp24_ = test_get_test_property (_tmp23_);
+               _tmp25_ = _tmp24_;
+               _tmp26_ = _tmp25_;
+               _vala_assert (g_strcmp0 (_tmp26_, "bar") == 0, "test.test_property == \"bar\"");
+               _g_free0 (_tmp26_);
+               _tmp27_ = test;
+               _tmp28_ = test_get_test_int_property (_tmp27_);
+               _tmp29_ = _tmp28_;
+               _vala_assert (_tmp29_ == 53, "test.test_int_property == 53");
+               block1_data_unref (_data1_);
+               _data1_ = NULL;
+       }
+       {
+               Block2Data* _data2_;
+               GMainLoop* _tmp30_;
+               Test2* _tmp31_;
+               const gchar* _tmp32_;
+               const gchar* _tmp33_;
+               Test2* _tmp34_;
+               gint _tmp35_;
+               gint _tmp36_;
+               Test* _tmp37_;
+               Test2* _tmp38_;
+               Test2* _tmp39_;
+               GMainLoop* _tmp40_;
+               Test2* _tmp41_;
+               const gchar* _tmp42_;
+               const gchar* _tmp43_;
+               Test2* _tmp44_;
+               gint _tmp45_;
+               gint _tmp46_;
+               Test* _tmp47_;
+               _data2_ = g_slice_new0 (Block2Data);
+               _data2_->_ref_count_ = 1;
+               _tmp30_ = g_main_loop_new (NULL, FALSE);
+               _data2_->main_loop2 = _tmp30_;
+               _tmp31_ = test2;
+               _tmp32_ = test2_get_test_property (_tmp31_);
+               _tmp33_ = _tmp32_;
+               _vala_assert (g_strcmp0 (_tmp33_, "bar") == 0, "test2.test_property == \"bar\"");
+               _tmp34_ = test2;
+               _tmp35_ = test2_get_test_int_property (_tmp34_);
+               _tmp36_ = _tmp35_;
+               _vala_assert (_tmp36_ == 53, "test2.test_int_property == 53");
+               _tmp37_ = test;
+               g_signal_connect_data (G_TYPE_CHECK_INSTANCE_CAST (_tmp37_, G_TYPE_OBJECT, GObject), 
"notify::test-property", (GCallback) ____lambda5__g_object_notify, block2_data_ref (_data2_), 
(GClosureNotify) block2_data_unref, 0);
+               _tmp38_ = test2;
+               test2_set_test_property (_tmp38_, "baz");
+               _tmp39_ = test2;
+               test2_set_test_int_property (_tmp39_, 765);
+               _tmp40_ = _data2_->main_loop2;
+               g_main_loop_run (_tmp40_);
+               _tmp41_ = test2;
+               _tmp42_ = test2_get_test_property (_tmp41_);
+               _tmp43_ = _tmp42_;
+               _vala_assert (g_strcmp0 (_tmp43_, "baz") == 0, "test2.test_property == \"baz\"");
+               _tmp44_ = test2;
+               _tmp45_ = test2_get_test_int_property (_tmp44_);
+               _tmp46_ = _tmp45_;
+               _vala_assert (_tmp46_ == 765, "test2.test_int_property == 765");
+               _tmp47_ = test;
+               test_check_everything (_tmp47_, &_inner_error0_);
+               if (G_UNLIKELY (_inner_error0_ != NULL)) {
+                       block2_data_unref (_data2_);
+                       _data2_ = NULL;
+                       _g_object_unref0 (test2);
+                       _g_object_unref0 (test);
+                       g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, 
_inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+                       g_clear_error (&_inner_error0_);
+                       return;
+               }
+               block2_data_unref (_data2_);
+               _data2_ = NULL;
+       }
+       _g_object_unref0 (test2);
+       _g_object_unref0 (test);
+}
+
+int
+main (int argc,
+      char ** argv)
+{
+       _vala_main ();
+       return 0;
+}
+
diff --git a/tests/dbus/properties_server.c-expected b/tests/dbus/properties_server.c-expected
new file mode 100644
index 000000000..34ce036d4
--- /dev/null
+++ b/tests/dbus/properties_server.c-expected
@@ -0,0 +1,741 @@
+/* dbus_properties_server.c generated by valac, the Vala compiler
+ * generated from dbus_properties_server.vala, do not modify */
+
+#include <glib-object.h>
+#include <gio/gio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#if !defined(VALA_EXTERN)
+#if defined(_MSC_VER)
+#define VALA_EXTERN __declspec(dllexport) extern
+#elif __GNUC__ >= 4
+#define VALA_EXTERN __attribute__((visibility("default"))) extern
+#else
+#define VALA_EXTERN extern
+#endif
+#endif
+
+#define TYPE_TEST (test_get_type ())
+#define TEST(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_TEST, Test))
+#define TEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_TEST, TestClass))
+#define IS_TEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_TEST))
+#define IS_TEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_TEST))
+#define TEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_TEST, TestClass))
+
+typedef struct _Test Test;
+typedef struct _TestClass TestClass;
+typedef struct _TestPrivate TestPrivate;
+enum  {
+       TEST_0_PROPERTY,
+       TEST_TEST_PROPERTY_PROPERTY,
+       TEST_TEST_INT_PROPERTY_PROPERTY,
+       TEST_NUM_PROPERTIES
+};
+static GParamSpec* test_properties[TEST_NUM_PROPERTIES];
+#define _g_free0(var) (var = (g_free (var), NULL))
+#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
+#define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
+#define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
+#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
+#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
+#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning 
(G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
+#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
+
+struct _Test {
+       GObject parent_instance;
+       TestPrivate * priv;
+};
+
+struct _TestClass {
+       GObjectClass parent_class;
+};
+
+struct _TestPrivate {
+       gchar* _test_property;
+       gint _test_int_property;
+};
+
+static gint Test_private_offset;
+static gpointer test_parent_class = NULL;
+VALA_EXTERN GMainLoop* main_loop;
+GMainLoop* main_loop = NULL;
+
+VALA_EXTERN GType test_get_type (void) G_GNUC_CONST ;
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (Test, g_object_unref)
+VALA_EXTERN guint test_register_object (void* object,
+                            GDBusConnection* connection,
+                            const gchar* path,
+                            GError** error);
+VALA_EXTERN void test_change_everything (Test* self,
+                             GError** error);
+VALA_EXTERN void test_set_test_property (Test* self,
+                             const gchar* value);
+VALA_EXTERN void test_set_test_int_property (Test* self,
+                                 gint value);
+VALA_EXTERN void test_check_everything (Test* self,
+                            GError** error);
+VALA_EXTERN gchar* test_get_test_property (Test* self);
+VALA_EXTERN gint test_get_test_int_property (Test* self);
+VALA_EXTERN Test* test_new (void);
+VALA_EXTERN Test* test_construct (GType object_type);
+static void test_finalize (GObject * obj);
+static GType test_get_type_once (void);
+static void _vala_test_get_property (GObject * object,
+                              guint property_id,
+                              GValue * value,
+                              GParamSpec * pspec);
+static void _vala_test_set_property (GObject * object,
+                              guint property_id,
+                              const GValue * value,
+                              GParamSpec * pspec);
+static void _dbus_test_change_everything (Test* self,
+                                   GVariant* _parameters_,
+                                   GDBusMethodInvocation* invocation);
+static void _dbus_test_check_everything (Test* self,
+                                  GVariant* _parameters_,
+                                  GDBusMethodInvocation* invocation);
+static void test_dbus_interface_method_call (GDBusConnection* connection,
+                                      const gchar* sender,
+                                      const gchar* object_path,
+                                      const gchar* interface_name,
+                                      const gchar* method_name,
+                                      GVariant* parameters,
+                                      GDBusMethodInvocation* invocation,
+                                      gpointer user_data);
+static GVariant* test_dbus_interface_get_property (GDBusConnection* connection,
+                                            const gchar* sender,
+                                            const gchar* object_path,
+                                            const gchar* interface_name,
+                                            const gchar* property_name,
+                                            GError** error,
+                                            gpointer user_data);
+static GVariant* _dbus_test_get_test_property (Test* self);
+static GVariant* _dbus_test_get_test_int_property (Test* self);
+static gboolean test_dbus_interface_set_property (GDBusConnection* connection,
+                                           const gchar* sender,
+                                           const gchar* object_path,
+                                           const gchar* interface_name,
+                                           const gchar* property_name,
+                                           GVariant* value,
+                                           GError** error,
+                                           gpointer user_data);
+static void _dbus_test_set_test_property (Test* self,
+                                   GVariant* _value);
+static void _dbus_test_set_test_int_property (Test* self,
+                                       GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
+static void _test_notify_test_int_property (GObject * gobject,
+                                     GParamSpec * pspec,
+                                     gpointer user_data);
+static void _test_unregister_object (gpointer user_data);
+VALA_EXTERN void client_exit (GPid pid,
+                  gint status);
+static void _vala_main (void);
+static guint _variant_get1 (GVariant* value);
+static void _client_exit_gchild_watch_func (GPid pid,
+                                     gint wait_status,
+                                     gpointer self);
+static void _vala_array_destroy (gpointer array,
+                          gssize array_length,
+                          GDestroyNotify destroy_func);
+static void _vala_array_free (gpointer array,
+                       gssize array_length,
+                       GDestroyNotify destroy_func);
+
+static const GDBusArgInfo * const _test_dbus_arg_info_change_everything_in[] = {NULL};
+static const GDBusArgInfo * const _test_dbus_arg_info_change_everything_out[] = {NULL};
+static const GDBusMethodInfo _test_dbus_method_info_change_everything = {-1, "ChangeEverything", 
(GDBusArgInfo **) (&_test_dbus_arg_info_change_everything_in), (GDBusArgInfo **) 
(&_test_dbus_arg_info_change_everything_out), NULL};
+static const GDBusArgInfo * const _test_dbus_arg_info_check_everything_in[] = {NULL};
+static const GDBusArgInfo * const _test_dbus_arg_info_check_everything_out[] = {NULL};
+static const GDBusMethodInfo _test_dbus_method_info_check_everything = {-1, "CheckEverything", (GDBusArgInfo 
**) (&_test_dbus_arg_info_check_everything_in), (GDBusArgInfo **) 
(&_test_dbus_arg_info_check_everything_out), NULL};
+static const GDBusMethodInfo * const _test_dbus_method_info[] = {&_test_dbus_method_info_change_everything, 
&_test_dbus_method_info_check_everything, NULL};
+static const GDBusSignalInfo * const _test_dbus_signal_info[] = {NULL};
+static const GDBusPropertyInfo _test_dbus_property_info_test_property = {-1, "TestProperty", "s", 
G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, NULL};
+static const GDBusPropertyInfo _test_dbus_property_info_test_int_property = {-1, "TestIntProperty", "i", 
G_DBUS_PROPERTY_INFO_FLAGS_READABLE | G_DBUS_PROPERTY_INFO_FLAGS_WRITABLE, NULL};
+static const GDBusPropertyInfo * const _test_dbus_property_info[] = 
{&_test_dbus_property_info_test_property, &_test_dbus_property_info_test_int_property, NULL};
+static const GDBusInterfaceInfo _test_dbus_interface_info = {-1, "org.example.Test", (GDBusMethodInfo **) 
(&_test_dbus_method_info), (GDBusSignalInfo **) (&_test_dbus_signal_info), (GDBusPropertyInfo **) 
(&_test_dbus_property_info), NULL};
+static const GDBusInterfaceVTable _test_dbus_interface_vtable = {test_dbus_interface_method_call, 
test_dbus_interface_get_property, test_dbus_interface_set_property};
+
+static inline gpointer
+test_get_instance_private (Test* self)
+{
+       return G_STRUCT_MEMBER_P (self, Test_private_offset);
+}
+
+void
+test_change_everything (Test* self,
+                        GError** error)
+{
+       g_return_if_fail (IS_TEST (self));
+       test_set_test_property (self, "bar");
+       test_set_test_int_property (self, 53);
+}
+
+void
+test_check_everything (Test* self,
+                       GError** error)
+{
+       gchar* _tmp0_;
+       gchar* _tmp1_;
+       gchar* _tmp2_;
+       gint _tmp3_;
+       g_return_if_fail (IS_TEST (self));
+       _tmp0_ = test_get_test_property (self);
+       _tmp1_ = _tmp0_;
+       _tmp2_ = _tmp1_;
+       _vala_assert (g_strcmp0 (_tmp2_, "baz") == 0, "test_property == \"baz\"");
+       _g_free0 (_tmp2_);
+       _tmp3_ = self->priv->_test_int_property;
+       _vala_assert (_tmp3_ == 765, "test_int_property == 765");
+}
+
+Test*
+test_construct (GType object_type)
+{
+       Test * self = NULL;
+       self = (Test*) g_object_new (object_type, NULL);
+       return self;
+}
+
+Test*
+test_new (void)
+{
+       return test_construct (TYPE_TEST);
+}
+
+gchar*
+test_get_test_property (Test* self)
+{
+       gchar* result;
+       const gchar* _tmp0_;
+       gchar* _tmp1_;
+       g_return_val_if_fail (IS_TEST (self), NULL);
+       _tmp0_ = self->priv->_test_property;
+       _tmp1_ = g_strdup (_tmp0_);
+       result = _tmp1_;
+       return result;
+}
+
+void
+test_set_test_property (Test* self,
+                        const gchar* value)
+{
+       gchar* old_value;
+       g_return_if_fail (IS_TEST (self));
+       old_value = test_get_test_property (self);
+       if (g_strcmp0 (value, old_value) != 0) {
+               gchar* _tmp0_;
+               _tmp0_ = g_strdup (value);
+               _g_free0 (self->priv->_test_property);
+               self->priv->_test_property = _tmp0_;
+               g_object_notify_by_pspec ((GObject *) self, test_properties[TEST_TEST_PROPERTY_PROPERTY]);
+       }
+       _g_free0 (old_value);
+}
+
+gint
+test_get_test_int_property (Test* self)
+{
+       gint result;
+       g_return_val_if_fail (IS_TEST (self), 0);
+       result = self->priv->_test_int_property;
+       return result;
+}
+
+void
+test_set_test_int_property (Test* self,
+                            gint value)
+{
+       gint old_value;
+       g_return_if_fail (IS_TEST (self));
+       old_value = test_get_test_int_property (self);
+       if (old_value != value) {
+               self->priv->_test_int_property = value;
+               g_object_notify_by_pspec ((GObject *) self, test_properties[TEST_TEST_INT_PROPERTY_PROPERTY]);
+       }
+}
+
+static void
+test_class_init (TestClass * klass,
+                 gpointer klass_data)
+{
+       test_parent_class = g_type_class_peek_parent (klass);
+       g_type_class_adjust_private_offset (klass, &Test_private_offset);
+       G_OBJECT_CLASS (klass)->get_property = _vala_test_get_property;
+       G_OBJECT_CLASS (klass)->set_property = _vala_test_set_property;
+       G_OBJECT_CLASS (klass)->finalize = test_finalize;
+       g_object_class_install_property (G_OBJECT_CLASS (klass), TEST_TEST_PROPERTY_PROPERTY, 
test_properties[TEST_TEST_PROPERTY_PROPERTY] = g_param_spec_string ("test-property", "test-property", 
"test-property", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
+       g_object_class_install_property (G_OBJECT_CLASS (klass), TEST_TEST_INT_PROPERTY_PROPERTY, 
test_properties[TEST_TEST_INT_PROPERTY_PROPERTY] = g_param_spec_int ("test-int-property", 
"test-int-property", "test-int-property", G_MININT, G_MAXINT, 17, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | 
G_PARAM_WRITABLE));
+}
+
+static void
+test_instance_init (Test * self,
+                    gpointer klass)
+{
+       gchar* _tmp0_;
+       self->priv = test_get_instance_private (self);
+       _tmp0_ = g_strdup ("foo");
+       self->priv->_test_property = _tmp0_;
+       self->priv->_test_int_property = 17;
+}
+
+static void
+test_finalize (GObject * obj)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_TEST, Test);
+       _g_free0 (self->priv->_test_property);
+       G_OBJECT_CLASS (test_parent_class)->finalize (obj);
+}
+
+static GType
+test_get_type_once (void)
+{
+       static const GTypeInfo g_define_type_info = { sizeof (TestClass), (GBaseInitFunc) NULL, 
(GBaseFinalizeFunc) NULL, (GClassInitFunc) test_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Test), 
0, (GInstanceInitFunc) test_instance_init, NULL };
+       GType test_type_id;
+       test_type_id = g_type_register_static (G_TYPE_OBJECT, "Test", &g_define_type_info, 0);
+       g_type_set_qdata (test_type_id, g_quark_from_static_string ("vala-dbus-register-object"), (void*) 
test_register_object);
+       Test_private_offset = g_type_add_instance_private (test_type_id, sizeof (TestPrivate));
+       return test_type_id;
+}
+
+GType
+test_get_type (void)
+{
+       static volatile gsize test_type_id__volatile = 0;
+       if (g_once_init_enter (&test_type_id__volatile)) {
+               GType test_type_id;
+               test_type_id = test_get_type_once ();
+               g_once_init_leave (&test_type_id__volatile, test_type_id);
+       }
+       return test_type_id__volatile;
+}
+
+static void
+_vala_test_get_property (GObject * object,
+                         guint property_id,
+                         GValue * value,
+                         GParamSpec * pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_TEST_PROPERTY_PROPERTY:
+               g_value_take_string (value, test_get_test_property (self));
+               break;
+               case TEST_TEST_INT_PROPERTY_PROPERTY:
+               g_value_set_int (value, test_get_test_int_property (self));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+_vala_test_set_property (GObject * object,
+                         guint property_id,
+                         const GValue * value,
+                         GParamSpec * pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_TEST_PROPERTY_PROPERTY:
+               test_set_test_property (self, g_value_get_string (value));
+               break;
+               case TEST_TEST_INT_PROPERTY_PROPERTY:
+               test_set_test_int_property (self, g_value_get_int (value));
+               break;
+               default:
+               G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+               break;
+       }
+}
+
+static void
+_dbus_test_change_everything (Test* self,
+                              GVariant* _parameters_,
+                              GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       test_change_everything (self, &error);
+       if (error) {
+               g_dbus_method_invocation_return_gerror (invocation, error);
+               g_error_free (error);
+               return;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, 
G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+}
+
+static void
+_dbus_test_check_everything (Test* self,
+                             GVariant* _parameters_,
+                             GDBusMethodInvocation* invocation)
+{
+       GError* error = NULL;
+       GVariantIter _arguments_iter;
+       GDBusMessage* _reply_message = NULL;
+       GVariant* _reply;
+       GVariantBuilder _reply_builder;
+       g_variant_iter_init (&_arguments_iter, _parameters_);
+       test_check_everything (self, &error);
+       if (error) {
+               g_dbus_method_invocation_return_gerror (invocation, error);
+               g_error_free (error);
+               return;
+       }
+       _reply_message = g_dbus_message_new_method_reply (g_dbus_method_invocation_get_message (invocation));
+       g_variant_builder_init (&_reply_builder, G_VARIANT_TYPE_TUPLE);
+       _reply = g_variant_builder_end (&_reply_builder);
+       g_dbus_message_set_body (_reply_message, _reply);
+       g_dbus_connection_send_message (g_dbus_method_invocation_get_connection (invocation), _reply_message, 
G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, NULL);
+       g_object_unref (invocation);
+       g_object_unref (_reply_message);
+}
+
+static void
+test_dbus_interface_method_call (GDBusConnection* connection,
+                                 const gchar* sender,
+                                 const gchar* object_path,
+                                 const gchar* interface_name,
+                                 const gchar* method_name,
+                                 GVariant* parameters,
+                                 GDBusMethodInvocation* invocation,
+                                 gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (method_name, "ChangeEverything") == 0) {
+               _dbus_test_change_everything (object, parameters, invocation);
+       } else if (strcmp (method_name, "CheckEverything") == 0) {
+               _dbus_test_check_everything (object, parameters, invocation);
+       } else {
+               g_object_unref (invocation);
+       }
+}
+
+static GVariant*
+_dbus_test_get_test_property (Test* self)
+{
+       gchar* result;
+       GVariant* _reply;
+       result = test_get_test_property (self);
+       _reply = g_variant_new_string (result);
+       _g_free0 (result);
+       return _reply;
+}
+
+static GVariant*
+_dbus_test_get_test_int_property (Test* self)
+{
+       gint result;
+       GVariant* _reply;
+       result = test_get_test_int_property (self);
+       _reply = g_variant_new_int32 (result);
+       return _reply;
+}
+
+static GVariant*
+test_dbus_interface_get_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (property_name, "TestProperty") == 0) {
+               return _dbus_test_get_test_property (object);
+       } else if (strcmp (property_name, "TestIntProperty") == 0) {
+               return _dbus_test_get_test_int_property (object);
+       }
+       return NULL;
+}
+
+static void
+_dbus_test_set_test_property (Test* self,
+                              GVariant* _value)
+{
+       gchar* value = NULL;
+       value = g_variant_dup_string (_value, NULL);
+       test_set_test_property (self, value);
+       _g_free0 (value);
+}
+
+static void
+_dbus_test_set_test_int_property (Test* self,
+                                  GVariant* _value)
+{
+       gint value = 0;
+       value = g_variant_get_int32 (_value);
+       test_set_test_int_property (self, value);
+}
+
+static gboolean
+test_dbus_interface_set_property (GDBusConnection* connection,
+                                  const gchar* sender,
+                                  const gchar* object_path,
+                                  const gchar* interface_name,
+                                  const gchar* property_name,
+                                  GVariant* value,
+                                  GError** error,
+                                  gpointer user_data)
+{
+       gpointer* data;
+       gpointer object;
+       data = user_data;
+       object = data[0];
+       if (strcmp (property_name, "TestProperty") == 0) {
+               _dbus_test_set_test_property (object, value);
+               return TRUE;
+       } else if (strcmp (property_name, "TestIntProperty") == 0) {
+               _dbus_test_set_test_int_property (object, value);
+               return TRUE;
+       }
+       return FALSE;
+}
+
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
+static void
+_test_notify_test_int_property (GObject * gobject,
+                                GParamSpec * pspec,
+                                gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_int_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestIntProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
+guint
+test_register_object (gpointer object,
+                      GDBusConnection* connection,
+                      const gchar* path,
+                      GError** error)
+{
+       guint result;
+       gpointer *data;
+       data = g_new (gpointer, 3);
+       data[0] = g_object_ref (object);
+       data[1] = g_object_ref (connection);
+       data[2] = g_strdup (path);
+       result = g_dbus_connection_register_object (connection, path, (GDBusInterfaceInfo *) 
(&_test_dbus_interface_info), &_test_dbus_interface_vtable, data, _test_unregister_object, error);
+       if (!result) {
+               return 0;
+       }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
+       g_signal_connect (object, "notify::test-int-property", (GCallback) _test_notify_test_int_property, 
data);
+       return result;
+}
+
+static void
+_test_unregister_object (gpointer user_data)
+{
+       gpointer* data;
+       data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_int_property, data);
+       g_object_unref (data[0]);
+       g_object_unref (data[1]);
+       g_free (data[2]);
+       g_free (data);
+}
+
+void
+client_exit (GPid pid,
+             gint status)
+{
+       GMainLoop* _tmp0_;
+       _vala_assert (status == 0, "status == 0");
+       _tmp0_ = main_loop;
+       g_main_loop_quit (_tmp0_);
+}
+
+static guint
+_variant_get1 (GVariant* value)
+{
+       return g_variant_get_uint32 (value);
+}
+
+static void
+_client_exit_gchild_watch_func (GPid pid,
+                                gint wait_status,
+                                gpointer self)
+{
+       client_exit (pid, wait_status);
+}
+
+static void
+_vala_main (void)
+{
+       GDBusConnection* conn = NULL;
+       GDBusConnection* _tmp0_;
+       GDBusConnection* _tmp1_;
+       Test* _tmp2_;
+       Test* _tmp3_;
+       GVariant* request_result = NULL;
+       GDBusConnection* _tmp4_;
+       GVariant* _tmp5_;
+       GVariant* _tmp6_;
+       GVariant* _tmp7_;
+       GVariant* _tmp8_;
+       GVariant* _tmp9_;
+       GVariant* _tmp10_;
+       GVariant* _tmp11_;
+       guint _tmp12_;
+       GPid client_pid = 0;
+       gchar* _tmp13_;
+       gchar** _tmp14_;
+       gchar** _tmp15_;
+       gint _tmp15__length1;
+       GPid _tmp16_ = 0;
+       GMainLoop* _tmp17_;
+       GMainLoop* _tmp18_;
+       GError* _inner_error0_ = NULL;
+       _tmp0_ = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &_inner_error0_);
+       conn = _tmp0_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, 
_inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp1_ = conn;
+       _tmp2_ = test_new ();
+       _tmp3_ = _tmp2_;
+       test_register_object (_tmp3_, _tmp1_, "/org/example/test", &_inner_error0_);
+       _g_object_unref0 (_tmp3_);
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_object_unref0 (conn);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, 
_inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp4_ = conn;
+       _tmp5_ = g_variant_new ("(su)", "org.example.Test", 0x4, NULL);
+       g_variant_ref_sink (_tmp5_);
+       _tmp6_ = _tmp5_;
+       _tmp7_ = g_dbus_connection_call_sync (_tmp4_, "org.freedesktop.DBus", "/org/freedesktop/DBus", 
"org.freedesktop.DBus", "RequestName", _tmp6_, NULL, 0, -1, NULL, &_inner_error0_);
+       _tmp8_ = _tmp7_;
+       _g_variant_unref0 (_tmp6_);
+       request_result = _tmp8_;
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_object_unref0 (conn);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, 
_inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       _tmp9_ = request_result;
+       _tmp10_ = g_variant_get_child_value (_tmp9_, (gsize) 0);
+       _tmp11_ = _tmp10_;
+       _tmp12_ = _variant_get1 (_tmp11_);
+       _vala_assert (_tmp12_ == ((guint) 1), "(uint) request_result.get_child_value (0) == 1");
+       _g_variant_unref0 (_tmp11_);
+       _tmp13_ = g_strdup ("dbus_properties_client");
+       _tmp14_ = g_new0 (gchar*, 1 + 1);
+       _tmp14_[0] = _tmp13_;
+       _tmp15_ = _tmp14_;
+       _tmp15__length1 = 1;
+       g_spawn_async (NULL, _tmp15_, NULL, G_SPAWN_DO_NOT_REAP_CHILD, NULL, NULL, &_tmp16_, &_inner_error0_);
+       client_pid = _tmp16_;
+       _tmp15_ = (_vala_array_free (_tmp15_, _tmp15__length1, (GDestroyNotify) g_free), NULL);
+       if (G_UNLIKELY (_inner_error0_ != NULL)) {
+               _g_variant_unref0 (request_result);
+               _g_object_unref0 (conn);
+               g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, 
_inner_error0_->message, g_quark_to_string (_inner_error0_->domain), _inner_error0_->code);
+               g_clear_error (&_inner_error0_);
+               return;
+       }
+       g_child_watch_add_full (G_PRIORITY_DEFAULT_IDLE, client_pid, _client_exit_gchild_watch_func, NULL, 
NULL);
+       _tmp17_ = g_main_loop_new (NULL, FALSE);
+       _g_main_loop_unref0 (main_loop);
+       main_loop = _tmp17_;
+       _tmp18_ = main_loop;
+       g_main_loop_run (_tmp18_);
+       _g_variant_unref0 (request_result);
+       _g_object_unref0 (conn);
+}
+
+int
+main (int argc,
+      char ** argv)
+{
+       _vala_main ();
+       return 0;
+}
+
+static void
+_vala_array_destroy (gpointer array,
+                     gssize array_length,
+                     GDestroyNotify destroy_func)
+{
+       if ((array != NULL) && (destroy_func != NULL)) {
+               gssize i;
+               for (i = 0; i < array_length; i = i + 1) {
+                       if (((gpointer*) array)[i] != NULL) {
+                               destroy_func (((gpointer*) array)[i]);
+                       }
+               }
+       }
+}
+
+static void
+_vala_array_free (gpointer array,
+                  gssize array_length,
+                  GDestroyNotify destroy_func)
+{
+       _vala_array_destroy (array, array_length, destroy_func);
+       g_free (array);
+}
+
diff --git a/tests/dbus/rawvariants_client.c-expected b/tests/dbus/rawvariants_client.c-expected
index 287614547..da12bd5d1 100644
--- a/tests/dbus/rawvariants_client.c-expected
+++ b/tests/dbus/rawvariants_client.c-expected
@@ -33,6 +33,12 @@ enum  {
 static guint test_signals[TEST_NUM_SIGNALS] = {0};
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_TEST_PROPERTY_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_free0(var) (var = (g_free (var), NULL))
 
 #define TYPE_TEST_RAW (test_raw_get_type ())
@@ -51,6 +57,12 @@ enum  {
 static guint test_raw_signals[TEST_RAW_NUM_SIGNALS] = {0};
 typedef GDBusProxy TestRawProxy;
 typedef GDBusProxyClass TestRawProxyClass;
+enum  {
+       TEST_RAW_PROXY_0_PROPERTY,
+       TEST_RAW_PROXY_TEST_PROPERTY_PROPERTY,
+       TEST_RAW_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_raw_proxy_properties[TEST_RAW_PROXY_NUM_PROPERTIES];
 #define _g_variant_unref0(var) ((var == NULL) ? NULL : (var = (g_variant_unref (var), NULL)))
 typedef struct _Block1Data Block1Data;
 #define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
@@ -99,12 +111,24 @@ VALA_EXTERN gchar* test_get_test_property (Test* self);
 VALA_EXTERN void test_set_test_property (Test* self,
                              const gchar* value);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
 static void _dbus_handle_test_test_signal (Test* self,
                                     GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static gint test_proxy_test_method (Test* self,
                              gint j,
                              gint k,
@@ -145,6 +169,9 @@ static void _dbus_test_set_test_property (Test* self,
 static void _dbus_test_test_signal (GObject* _sender,
                              gint i,
                              gpointer* _data);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 VALA_EXTERN GType test_raw_proxy_get_type (void) G_GNUC_CONST ;
 VALA_EXTERN guint test_raw_register_object (void* object,
@@ -160,12 +187,24 @@ VALA_EXTERN GVariant* test_raw_get_test_property (TestRaw* self);
 VALA_EXTERN void test_raw_set_test_property (TestRaw* self,
                                  GVariant* value);
 static GType test_raw_get_type_once (void);
+static GParamSpec * _vala_test_raw_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_raw_proxy_get_property (GObject* object,
+                                  guint property_id,
+                                  GValue* value,
+                                  GParamSpec* pspec);
+static void test_raw_proxy_set_property (GObject* object,
+                                  guint property_id,
+                                  const GValue* value,
+                                  GParamSpec* pspec);
 static void test_raw_proxy_g_signal (GDBusProxy* proxy,
                               const gchar* sender_name,
                               const gchar* signal_name,
                               GVariant* parameters);
 static void _dbus_handle_test_raw_test_signal (TestRaw* self,
                                         GVariant* parameters);
+static void test_raw_proxy_g_properties_changed (GDBusProxy* proxy,
+                                          GVariant* changed_properties,
+                                          const gchar* const* invalidated_properties);
 static GVariant* test_raw_proxy_test_method (TestRaw* self,
                                       GVariant* j,
                                       GVariant* k,
@@ -206,6 +245,9 @@ static void _dbus_test_raw_set_test_property (TestRaw* self,
 static void _dbus_test_raw_test_signal (GObject* _sender,
                                  GVariant* i,
                                  gpointer* _data);
+static void _test_raw_notify_test_property (GObject * gobject,
+                                     GParamSpec * pspec,
+                                     gpointer user_data);
 static void _test_raw_unregister_object (gpointer user_data);
 VALA_EXTERN void test_raw (TestRaw* test);
 static Block1Data* block1_data_ref (Block1Data* _data1_);
@@ -305,6 +347,7 @@ static void
 test_default_init (TestIface * iface,
                    gpointer iface_data)
 {
+       g_object_interface_install_property (iface, g_param_spec_string ("test-property", "test-property", 
"test-property", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
        test_signals[TEST_TEST_SIGNAL_SIGNAL] = g_signal_new ("test-signal", TYPE_TEST, G_SIGNAL_RUN_LAST, 0, 
NULL, NULL, g_cclosure_marshal_VOID__INT, G_TYPE_NONE, 1, G_TYPE_INT);
 }
 
@@ -338,7 +381,59 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+       g_object_class_override_property (object_class, TEST_PROXY_TEST_PROPERTY_PROPERTY, "test-property");
+       test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-property");
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       if (g_strcmp0 (dbus_property_name, "TestProperty") == 0) {
+               return test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY];
+       }
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               g_value_take_string (value, test_dbus_proxy_get_test_property (self));
+               break;
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               test_dbus_proxy_set_test_property (self, g_value_get_string (value));
+               break;
+               default:
+               return;
+       }
 }
 
 static void
@@ -366,6 +461,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
        }
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
@@ -605,6 +725,27 @@ _dbus_test_test_signal (GObject* _sender,
        g_dbus_connection_emit_signal (_connection, NULL, _path, "org.example.Test", "TestSignal", 
_arguments, NULL);
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -622,6 +763,7 @@ test_register_object (gpointer object,
                return 0;
        }
        g_signal_connect (object, "test-signal", (GCallback) _dbus_test_test_signal, data);
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
        return result;
 }
 
@@ -631,6 +773,7 @@ _test_unregister_object (gpointer user_data)
        gpointer* data;
        data = user_data;
        g_signal_handlers_disconnect_by_func (data[0], _dbus_test_test_signal, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
@@ -680,6 +823,7 @@ static void
 test_raw_default_init (TestRawIface * iface,
                        gpointer iface_data)
 {
+       g_object_interface_install_property (iface, g_param_spec_variant ("test-property", "test-property", 
"test-property", G_VARIANT_TYPE_ANY, NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
        test_raw_signals[TEST_RAW_TEST_SIGNAL_SIGNAL] = g_signal_new ("test-signal", TYPE_TEST_RAW, 
G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VARIANT, G_TYPE_NONE, 1, G_TYPE_VARIANT);
 }
 
@@ -713,7 +857,59 @@ G_DEFINE_TYPE_EXTENDED (TestRawProxy, test_raw_proxy, G_TYPE_DBUS_PROXY, 0, G_IM
 static void
 test_raw_proxy_class_init (TestRawProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_raw_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_raw_proxy_g_signal;
+       proxy_class->g_properties_changed = test_raw_proxy_g_properties_changed;
+       object_class->get_property = test_raw_proxy_get_property;
+       object_class->set_property = test_raw_proxy_set_property;
+       g_object_class_override_property (object_class, TEST_RAW_PROXY_TEST_PROPERTY_PROPERTY, 
"test-property");
+       test_raw_proxy_properties[TEST_RAW_PROXY_TEST_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-property");
+}
+
+static GParamSpec *
+_vala_test_raw_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       if (g_strcmp0 (dbus_property_name, "TestProperty") == 0) {
+               return test_raw_proxy_properties[TEST_RAW_PROXY_TEST_PROPERTY_PROPERTY];
+       }
+       return NULL;
+}
+
+static void
+test_raw_proxy_get_property (GObject* object,
+                             guint property_id,
+                             GValue* value,
+                             GParamSpec* pspec)
+{
+       TestRaw * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST_RAW, TestRaw);
+       switch (property_id) {
+               case TEST_RAW_PROXY_TEST_PROPERTY_PROPERTY:
+               g_value_take_variant (value, test_raw_dbus_proxy_get_test_property (self));
+               break;
+               default:
+               return;
+       }
+}
+
+static void
+test_raw_proxy_set_property (GObject* object,
+                             guint property_id,
+                             const GValue* value,
+                             GParamSpec* pspec)
+{
+       TestRaw * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST_RAW, TestRaw);
+       switch (property_id) {
+               case TEST_RAW_PROXY_TEST_PROPERTY_PROPERTY:
+               test_raw_dbus_proxy_set_test_property (self, g_value_get_variant (value));
+               break;
+               default:
+               return;
+       }
 }
 
 static void
@@ -739,6 +935,31 @@ test_raw_proxy_g_signal (GDBusProxy* proxy,
        }
 }
 
+static void
+test_raw_proxy_g_properties_changed (GDBusProxy* proxy,
+                                     GVariant* changed_properties,
+                                     const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_raw_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_raw_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_raw_proxy_init (TestRawProxy* self)
 {
@@ -969,6 +1190,27 @@ _dbus_test_raw_test_signal (GObject* _sender,
        g_dbus_connection_emit_signal (_connection, NULL, _path, "org.example.Test", "TestSignal", 
_arguments, NULL);
 }
 
+static void
+_test_raw_notify_test_property (GObject * gobject,
+                                GParamSpec * pspec,
+                                gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       TestRaw * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST_RAW, TestRaw);
+       variant = _dbus_test_raw_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_raw_register_object (gpointer object,
                           GDBusConnection* connection,
@@ -986,6 +1228,7 @@ test_raw_register_object (gpointer object,
                return 0;
        }
        g_signal_connect (object, "test-signal", (GCallback) _dbus_test_raw_test_signal, data);
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_raw_notify_test_property, data);
        return result;
 }
 
@@ -995,6 +1238,7 @@ _test_raw_unregister_object (gpointer user_data)
        gpointer* data;
        data = user_data;
        g_signal_handlers_disconnect_by_func (data[0], _dbus_test_raw_test_signal, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_raw_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
diff --git a/tests/dbus/rawvariants_server.c-expected b/tests/dbus/rawvariants_server.c-expected
index f1e88b5cf..2d94de9d0 100644
--- a/tests/dbus/rawvariants_server.c-expected
+++ b/tests/dbus/rawvariants_server.c-expected
@@ -158,6 +158,9 @@ static void _dbus_test_set_test_property (Test* self,
 static void _dbus_test_test_signal (GObject* _sender,
                              gint i,
                              gpointer* _data);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 VALA_EXTERN GType test_raw_get_type (void) G_GNUC_CONST ;
 G_DEFINE_AUTOPTR_CLEANUP_FUNC (TestRaw, g_object_unref)
@@ -219,6 +222,9 @@ static void _dbus_test_raw_set_test_property (TestRaw* self,
 static void _dbus_test_raw_test_signal (GObject* _sender,
                                  GVariant* i,
                                  gpointer* _data);
+static void _test_raw_notify_test_property (GObject * gobject,
+                                     GParamSpec * pspec,
+                                     gpointer user_data);
 static void _test_raw_unregister_object (gpointer user_data);
 VALA_EXTERN void client_exit (GPid pid,
                   gint status);
@@ -549,6 +555,27 @@ _dbus_test_test_signal (GObject* _sender,
        g_dbus_connection_emit_signal (_connection, NULL, _path, "org.example.Test", "TestSignal", 
_arguments, NULL);
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -566,6 +593,7 @@ test_register_object (gpointer object,
                return 0;
        }
        g_signal_connect (object, "test-signal", (GCallback) _dbus_test_test_signal, data);
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
        return result;
 }
 
@@ -575,6 +603,7 @@ _test_unregister_object (gpointer user_data)
        gpointer* data;
        data = user_data;
        g_signal_handlers_disconnect_by_func (data[0], _dbus_test_test_signal, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
@@ -901,6 +930,27 @@ _dbus_test_raw_test_signal (GObject* _sender,
        g_dbus_connection_emit_signal (_connection, NULL, _path, "org.example.Test", "TestSignal", 
_arguments, NULL);
 }
 
+static void
+_test_raw_notify_test_property (GObject * gobject,
+                                GParamSpec * pspec,
+                                gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       TestRaw * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST_RAW, TestRaw);
+       variant = _dbus_test_raw_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_raw_register_object (gpointer object,
                           GDBusConnection* connection,
@@ -918,6 +968,7 @@ test_raw_register_object (gpointer object,
                return 0;
        }
        g_signal_connect (object, "test-signal", (GCallback) _dbus_test_raw_test_signal, data);
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_raw_notify_test_property, data);
        return result;
 }
 
@@ -927,6 +978,7 @@ _test_raw_unregister_object (gpointer user_data)
        gpointer* data;
        data = user_data;
        g_signal_handlers_disconnect_by_func (data[0], _dbus_test_raw_test_signal, data);
+       g_signal_handlers_disconnect_by_func (data[0], _test_raw_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
diff --git a/tests/dbus/signals_client.c-expected b/tests/dbus/signals_client.c-expected
index b172477d0..a84956a14 100644
--- a/tests/dbus/signals_client.c-expected
+++ b/tests/dbus/signals_client.c-expected
@@ -35,6 +35,11 @@ enum  {
 static guint test_signals[TEST_NUM_SIGNALS] = {0};
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _g_main_loop_unref0(var) ((var == NULL) ? NULL : (var = (g_main_loop_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
@@ -71,6 +76,15 @@ static void g_cclosure_user_marshal_VOID__BOXED_INT (GClosure * closure,
                                               gpointer invocation_hint,
                                               gpointer marshal_data);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
@@ -79,6 +93,9 @@ static void _dbus_handle_test_foo (Test* self,
                             GVariant* parameters);
 static void _dbus_handle_test_bar (Test* self,
                             GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void test_proxy_do_foo (Test* self,
                         gint i,
                         GError** error);
@@ -257,7 +274,48 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               default:
+               return;
+       }
 }
 
 static void
@@ -325,6 +383,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
        }
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
diff --git a/tests/dbus/structs_client.c-expected b/tests/dbus/structs_client.c-expected
index 91c61053a..b3e54704e 100644
--- a/tests/dbus/structs_client.c-expected
+++ b/tests/dbus/structs_client.c-expected
@@ -32,6 +32,12 @@ typedef struct _TestIface TestIface;
 #define TYPE_TEST_PROXY (test_proxy_get_type ())
 typedef GDBusProxy TestProxy;
 typedef GDBusProxyClass TestProxyClass;
+enum  {
+       TEST_PROXY_0_PROPERTY,
+       TEST_PROXY_TEST_PROPERTY_PROPERTY,
+       TEST_PROXY_NUM_PROPERTIES
+};
+static GParamSpec* test_proxy_properties[TEST_PROXY_NUM_PROPERTIES];
 #define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
 #define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, 
__LINE__, G_STRFUNC, msg);
 #define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, 
G_STRFUNC, msg); return; }
@@ -75,10 +81,22 @@ VALA_EXTERN void test_get_test_property (Test* self,
 VALA_EXTERN void test_set_test_property (Test* self,
                              FooStruct * value);
 static GType test_get_type_once (void);
+static GParamSpec * _vala_test_find_property_from_dbus_name (const gchar * dbus_property_name);
+static void test_proxy_get_property (GObject* object,
+                              guint property_id,
+                              GValue* value,
+                              GParamSpec* pspec);
+static void test_proxy_set_property (GObject* object,
+                              guint property_id,
+                              const GValue* value,
+                              GParamSpec* pspec);
 static void test_proxy_g_signal (GDBusProxy* proxy,
                           const gchar* sender_name,
                           const gchar* signal_name,
                           GVariant* parameters);
+static void test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                      GVariant* changed_properties,
+                                      const gchar* const* invalidated_properties);
 static void test_proxy_test_struct (Test* self,
                              FooStruct* f,
                              FooStruct* g,
@@ -118,6 +136,9 @@ static gboolean test_dbus_interface_set_property (GDBusConnection* connection,
                                            gpointer user_data);
 static void _dbus_test_set_test_property (Test* self,
                                    GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 static void _vala_main (void);
 
@@ -247,6 +268,7 @@ static void
 test_default_init (TestIface * iface,
                    gpointer iface_data)
 {
+       g_object_interface_install_property (iface, g_param_spec_boxed ("test-property", "test-property", 
"test-property", TYPE_FOO_STRUCT, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
 }
 
 static GType
@@ -279,7 +301,64 @@ G_DEFINE_TYPE_EXTENDED (TestProxy, test_proxy, G_TYPE_DBUS_PROXY, 0, G_IMPLEMENT
 static void
 test_proxy_class_init (TestProxyClass* klass)
 {
-       G_DBUS_PROXY_CLASS (klass)->g_signal = test_proxy_g_signal;
+       GDBusProxyClass * proxy_class = G_DBUS_PROXY_CLASS (klass);
+       GObjectClass * object_class = G_OBJECT_CLASS (klass);
+       proxy_class->g_signal = test_proxy_g_signal;
+       proxy_class->g_properties_changed = test_proxy_g_properties_changed;
+       object_class->get_property = test_proxy_get_property;
+       object_class->set_property = test_proxy_set_property;
+       g_object_class_override_property (object_class, TEST_PROXY_TEST_PROPERTY_PROPERTY, "test-property");
+       test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY] = g_object_class_find_property 
(object_class, "test-property");
+}
+
+static GParamSpec *
+_vala_test_find_property_from_dbus_name (const gchar * dbus_property_name)
+{
+       if (g_strcmp0 (dbus_property_name, "TestProperty") == 0) {
+               return test_proxy_properties[TEST_PROXY_TEST_PROPERTY_PROPERTY];
+       }
+       return NULL;
+}
+
+static void
+test_proxy_get_property (GObject* object,
+                         guint property_id,
+                         GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       GVariant * variant;
+       const gchar * dbus_property_name = NULL;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               {
+                       FooStruct boxed;
+                       test_dbus_proxy_get_test_property (self, &boxed);
+                       g_value_set_boxed (value, &boxed);
+                       foo_struct_destroy (&boxed);
+               }
+               break;
+               default:
+               return;
+       }
+}
+
+static void
+test_proxy_set_property (GObject* object,
+                         guint property_id,
+                         const GValue* value,
+                         GParamSpec* pspec)
+{
+       Test * self;
+       self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_TEST, Test);
+       switch (property_id) {
+               case TEST_PROXY_TEST_PROPERTY_PROPERTY:
+               test_dbus_proxy_set_test_property (self, g_value_get_boxed (value));
+               break;
+               default:
+               return;
+       }
 }
 
 static void
@@ -290,6 +369,31 @@ test_proxy_g_signal (GDBusProxy* proxy,
 {
 }
 
+static void
+test_proxy_g_properties_changed (GDBusProxy* proxy,
+                                 GVariant* changed_properties,
+                                 const gchar* const* invalidated_properties)
+{
+       GVariantIter * iter;
+       const gchar * key;
+       GParamSpec * pspec;
+       guint n;
+       g_variant_get (changed_properties, "a{sv}", &iter);
+       while (g_variant_iter_next (iter, "{&sv}", &key, NULL)) {
+               pspec = _vala_test_find_property_from_dbus_name (key);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+       g_variant_iter_free (iter);
+       for (n = 0; invalidated_properties[n] != NULL; n++) {
+               pspec = _vala_test_find_property_from_dbus_name (invalidated_properties[n]);
+               if (pspec != NULL) {
+                       g_object_notify_by_pspec ((GObject *) proxy, pspec);
+               }
+       }
+}
+
 static void
 test_proxy_init (TestProxy* self)
 {
@@ -591,6 +695,27 @@ test_dbus_interface_set_property (GDBusConnection* connection,
        return FALSE;
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -607,6 +732,7 @@ test_register_object (gpointer object,
        if (!result) {
                return 0;
        }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
        return result;
 }
 
@@ -615,6 +741,7 @@ _test_unregister_object (gpointer user_data)
 {
        gpointer* data;
        data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);
diff --git a/tests/dbus/structs_server.c-expected b/tests/dbus/structs_server.c-expected
index 0840275f1..ceaa1ac7b 100644
--- a/tests/dbus/structs_server.c-expected
+++ b/tests/dbus/structs_server.c-expected
@@ -134,6 +134,9 @@ static gboolean test_dbus_interface_set_property (GDBusConnection* connection,
                                            gpointer user_data);
 static void _dbus_test_set_test_property (Test* self,
                                    GVariant* _value);
+static void _test_notify_test_property (GObject * gobject,
+                                 GParamSpec * pspec,
+                                 gpointer user_data);
 static void _test_unregister_object (gpointer user_data);
 VALA_EXTERN void client_exit (GPid pid,
                   gint status);
@@ -580,6 +583,27 @@ test_dbus_interface_set_property (GDBusConnection* connection,
        return FALSE;
 }
 
+static void
+_test_notify_test_property (GObject * gobject,
+                            GParamSpec * pspec,
+                            gpointer user_data)
+{
+       gpointer* data = user_data;
+       GError* error = NULL;
+       GVariant* parameters = NULL;
+       GVariant* variant = NULL;
+       GVariantBuilder changed_builder;
+       GVariantBuilder invalidated_builder;
+       Test * self;
+       g_variant_builder_init (&changed_builder, G_VARIANT_TYPE_VARDICT);
+       g_variant_builder_init (&invalidated_builder, G_VARIANT_TYPE_STRING_ARRAY);
+       self = G_TYPE_CHECK_INSTANCE_CAST (gobject, TYPE_TEST, Test);
+       variant = _dbus_test_get_test_property (self);
+       g_variant_builder_add (&changed_builder, "{sv}", "TestProperty", variant);
+       parameters = g_variant_new ("(sa{sv}as)", "org.example.Test", &changed_builder, &invalidated_builder);
+       g_dbus_connection_emit_signal ((GDBusConnection *) data[1], NULL, (const gchar *) data[2], 
"org.freedesktop.DBus.Properties", "PropertiesChanged", parameters, &error);
+}
+
 guint
 test_register_object (gpointer object,
                       GDBusConnection* connection,
@@ -596,6 +620,7 @@ test_register_object (gpointer object,
        if (!result) {
                return 0;
        }
+       g_signal_connect (object, "notify::test-property", (GCallback) _test_notify_test_property, data);
        return result;
 }
 
@@ -604,6 +629,7 @@ _test_unregister_object (gpointer user_data)
 {
        gpointer* data;
        data = user_data;
+       g_signal_handlers_disconnect_by_func (data[0], _test_notify_test_property, data);
        g_object_unref (data[0]);
        g_object_unref (data[1]);
        g_free (data[2]);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]