diff --git a/NEWS b/NEWS
index 092a055efe59156d97093c96e7a7cdd72b8f5ccf..4f597a61517006e10b1c8474fb60694e9c76effc 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,28 @@
+Overview of changes from Rhosydd 0.3.0 to Rhosydd 0.4.0
+=======================================================
+
+Major changes:
+ • Add the current time to each RsdVehicle getter; tidy up clock domain handling
+ • Remove AppArmor rules allowing backends to talk to polkit
+ • Use unicast rather than broadcast signalling from the daemon to clients
+ • Various memory leak fixes
+
+API changes:
+ • Add CsrBackendManager
+ • Convert CsrPeerManager into an interface, CsrPeerManagerInterface
+ • Drop csr_peer_manager_new_[async|finish]()
+ • Add timestamp parameters to:
+  - most functions in librhosydd/utilities.h
+  - most of the D-Bus Vehicle1 API
+  - RsdVehicle::attributes-[metadata-]changed
+  - most RsdVehicle methods
+ • Add rsd_zone_is_descendant()
+ • Add CsrClockFunc, csr_static_vehicle_set_clock_func()
+ • Add csr_subscription_manager_get_peers_for_subscriptions()
+ • Drop parameters from rsd_subscription_new_wildcard()
+ • Add rsd_attribute_clear()
+
+
 Overview of changes from Rhosydd 0.2.0 to Rhosydd 0.3.0
 =======================================================
 
diff --git a/configure.ac b/configure.ac
index 3258c4ff7d189745a5ebf463a1be868520f461ec..015f5becac40fad96f73f1f186b0477b4724f834 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ AC_PREREQ(2.65)
 
 # Release version
 m4_define([rsd_version_major],[0])
-m4_define([rsd_version_minor],[3])
+m4_define([rsd_version_minor],[4])
 m4_define([rsd_version_micro],[0])
 
 # API version
@@ -41,7 +41,7 @@ AC_PROG_LN_S
 #     increment age.
 #  4. If any interfaces have been removed or changed since the last public
 #     release, then set age to 0.
-AC_SUBST([RSD_LT_VERSION],[3:0:0])
+AC_SUBST([RSD_LT_VERSION],[4:0:0])
 
 AC_SUBST([RSD_VERSION_MAJOR],rsd_version_major)
 AC_SUBST([RSD_VERSION_MINOR],rsd_version_minor)
@@ -52,7 +52,7 @@ AC_SUBST([RSD_API_VERSION],rsd_api_version)
 # long as they’re both in the same tarball. libcroesor’s LT and API versions
 # remain independent, however. Crucially, CSR_LT_VERSION must be modified
 # independently of RSD_LT_VERSION.
-AC_SUBST([CSR_LT_VERSION],[3:0:0])
+AC_SUBST([CSR_LT_VERSION],[4:0:0])
 
 AC_SUBST([CSR_VERSION_MAJOR],rsd_version_major)
 AC_SUBST([CSR_VERSION_MINOR],rsd_version_minor)
diff --git a/daemon/aggregate-zone.c b/daemon/aggregate-zone.c
index 969b928d2d7e9b1e521bb8522c069fc26fb66fb3..652fd0f19aba722987f178691686bd484aad0206 100644
--- a/daemon/aggregate-zone.c
+++ b/daemon/aggregate-zone.c
@@ -631,7 +631,7 @@ vdd_aggregate_zone_clear_attributes (VddAggregateZone *self)
  *
  * Add a attribute to the #VddAggregateZone.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 void
 vdd_aggregate_zone_add_attribute (VddAggregateZone *self,
diff --git a/daemon/peer-manager.c b/daemon/peer-manager.c
index 0af2798fe8693df55bf98b1f1527888f366f4c33..4d68447cf73bf5f930bd967e7ecef35f8fa0a7a3 100644
--- a/daemon/peer-manager.c
+++ b/daemon/peer-manager.c
@@ -95,7 +95,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC (PeerInfo, peer_info_free)
  * information about them and allowing polkit authorisation checks against them
  * while avoiding time-of-check-to-time-of-use vulnerabilities.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 struct _VddPeerManager
 {
@@ -311,7 +311,7 @@ authority_changed_cb (PolkitAuthority *authority,
  * instantiation must be finished (or the error returned) by calling
  * vdd_peer_manager_new_finish().
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 void
 vdd_peer_manager_new_async (GCancellable        *cancellable,
@@ -332,7 +332,7 @@ vdd_peer_manager_new_async (GCancellable        *cancellable,
  * Finish initialising a #VddPeerManager. See vdd_peer_manager_new_async().
  *
  * Returns: (transfer full): initialised #VddPeerManager, or %NULL on error
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 VddPeerManager *
 vdd_peer_manager_new_finish (GAsyncResult    *result,
diff --git a/debian/changelog b/debian/changelog
index c99b293d576d5b8a4801ac739f51b827a4bc02d7..d7897e1a7f83dbe50fcc4cfee6b86f6d41c6ce57 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+rhosydd (0.4.0-0co1) 16.06; urgency=medium
+
+  [ Philip Withnall ]
+  * (many changes, please see version control system)
+
+ -- Philip Withnall <philip.withnall@collabora.co.uk>  Wed, 29 Jun 2016 12:44:00 +0100
+
 rhosydd (0.3.0-0co1) 16.06; urgency=medium
 
   [ Philip Withnall ]
diff --git a/debian/control b/debian/control
index 3f68b1d205663338ebba1f29bad19b073f049417..3463766f837bf550346f12e40b39bde98bd8c939 100644
--- a/debian/control
+++ b/debian/control
@@ -49,7 +49,7 @@ Description: Sensors and actuators API - GObject-Introspection bindings
  This package contains a machine-readable API description for the shared
  library for use by general client applications. It is part of the SDK-API.
 
-Package: libcroesor-0-3
+Package: libcroesor-0-4
 Architecture: any
 Multi-arch: same
 Depends:
@@ -62,7 +62,7 @@ Description: Sensors and actuators API - shared library for backends
  actuator backends. It is not part of the SDK-API and should not be
  used by applications.
 
-Package: librhosydd-0-3
+Package: librhosydd-0-4
 Architecture: any
 Multi-arch: same
 Depends:
@@ -80,7 +80,7 @@ Architecture: any
 Multi-arch: same
 Depends:
  gir1.2-croesor-0 (= ${binary:Version}),
- libcroesor-0-3 (= ${binary:Version}),
+ libcroesor-0-4 (= ${binary:Version}),
  ${misc:Depends},
  ${shlibs:Depends},
 Suggests:
@@ -108,7 +108,7 @@ Package: libcroesor-0-tests
 Section: misc
 Architecture: any
 Depends:
- libcroesor-0-3 (= ${binary:Version}),
+ libcroesor-0-4 (= ${binary:Version}),
  ${misc:Depends},
  ${shlibs:Depends},
 Description: Sensors and actuators API - tests
@@ -123,7 +123,7 @@ Architecture: any
 Multi-arch: same
 Depends:
  gir1.2-rhosydd-0 (= ${binary:Version}),
- librhosydd-0-3 (= ${binary:Version}),
+ librhosydd-0-4 (= ${binary:Version}),
  ${misc:Depends},
  ${shlibs:Depends},
 Suggests:
@@ -150,7 +150,7 @@ Package: librhosydd-0-tests
 Section: misc
 Architecture: any
 Depends:
- librhosydd-0-3 (= ${binary:Version}),
+ librhosydd-0-4 (= ${binary:Version}),
  ${misc:Depends},
  ${shlibs:Depends},
 Description: Sensors and actuators API - tests
@@ -179,8 +179,8 @@ Priority: extra
 Architecture: any
 Multi-Arch: same
 Depends:
- libcroesor-0-3 (= ${binary:Version}),
- librhosydd-0-3 (= ${binary:Version}),
+ libcroesor-0-4 (= ${binary:Version}),
+ librhosydd-0-4 (= ${binary:Version}),
  ${misc:Depends},
 Description: Debugging symbols for the Rhosydd service
  Rhosydd mediates access to vehicle sensors and actuators.
diff --git a/debian/libcroesor-0-3.install b/debian/libcroesor-0-3.install
deleted file mode 100644
index 7822ef0aa154155591c997d040a826588a840742..0000000000000000000000000000000000000000
--- a/debian/libcroesor-0-3.install
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/lib/*/libcroesor-0.so.3
-usr/lib/*/libcroesor-0.so.3.*
diff --git a/debian/libcroesor-0-4.install b/debian/libcroesor-0-4.install
new file mode 100644
index 0000000000000000000000000000000000000000..aef310f5a68454336c671e5c3978218427522f89
--- /dev/null
+++ b/debian/libcroesor-0-4.install
@@ -0,0 +1,2 @@
+usr/lib/*/libcroesor-0.so.4
+usr/lib/*/libcroesor-0.so.4.*
diff --git a/debian/libcroesor-0-3.symbols b/debian/libcroesor-0-4.symbols
similarity index 86%
rename from debian/libcroesor-0-3.symbols
rename to debian/libcroesor-0-4.symbols
index b70359a0dddb3188e2e61ffbac30e8cda2294df8..84332c0767ad6c14e6fb8edd5cec6eabf62c2751 100644
--- a/debian/libcroesor-0-3.symbols
+++ b/debian/libcroesor-0-4.symbols
@@ -1,8 +1,10 @@
-libcroesor-0.so.3 libcroesor-0-3 #MINVER#
+libcroesor-0.so.4 libcroesor-0-4 #MINVER#
 * Build-Depends-Package: libcroesor-0-dev
  csr_backend_error_quark@Base 0.2.0
  csr_backend_get_type@Base 0.2.0
  csr_backend_get_vehicle_manager@Base 0.2.0
+ csr_backend_manager_get_type@Base 0.4.0
+ csr_backend_manager_new@Base 0.4.0
  csr_backend_new@Base 0.2.0
  csr_peer_manager_check_authorization_async@Base 0.2.0
  csr_peer_manager_check_authorization_finish@Base 0.2.0
@@ -18,6 +20,8 @@ libcroesor-0.so.3 libcroesor-0-3 #MINVER#
  csr_service_run@Base 0.2.0
  csr_static_vehicle_get_type@Base 0.2.0
  csr_static_vehicle_new@Base 0.2.0
+ csr_static_vehicle_set_clock_func@Base 0.4.0
+ csr_subscription_manager_get_peers_for_subscriptions@Base 0.4.0
  csr_subscription_manager_get_subscriptions@Base 0.2.0
  csr_subscription_manager_get_type@Base 0.2.0
  csr_subscription_manager_new@Base 0.2.0
diff --git a/debian/librhosydd-0-3.install b/debian/librhosydd-0-3.install
deleted file mode 100644
index 19538d5a37bcc105a23633f427818e0d1a8470da..0000000000000000000000000000000000000000
--- a/debian/librhosydd-0-3.install
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/lib/*/librhosydd-0.so.3
-usr/lib/*/librhosydd-0.so.3.*
diff --git a/debian/librhosydd-0-4.install b/debian/librhosydd-0-4.install
new file mode 100644
index 0000000000000000000000000000000000000000..10069b9b0d88fd06088e10f795f2375edae93a76
--- /dev/null
+++ b/debian/librhosydd-0-4.install
@@ -0,0 +1,2 @@
+usr/lib/*/librhosydd-0.so.4
+usr/lib/*/librhosydd-0.so.4.*
diff --git a/debian/librhosydd-0-3.symbols b/debian/librhosydd-0-4.symbols
similarity index 86%
rename from debian/librhosydd-0-3.symbols
rename to debian/librhosydd-0-4.symbols
index ce7d4cd0035dd6fd411c656431b58b9f44852993..21cc0fec2e85716b3919181259562513ce24fdb0 100644
--- a/debian/librhosydd-0-3.symbols
+++ b/debian/librhosydd-0-4.symbols
@@ -1,15 +1,16 @@
-librhosydd-0.so.3 librhosydd-0-3 #MINVER#
+librhosydd-0.so.4 librhosydd-0-4 #MINVER#
 * Build-Depends-Package: librhosydd-0-dev
  rsd_attribute_availability_is_valid@Base 0.2.0
+ rsd_attribute_clear@Base 0.4.0
  rsd_attribute_copy@Base 0.2.0
  rsd_attribute_flags_is_valid@Base 0.2.0
  rsd_attribute_free@Base 0.2.0
  rsd_attribute_get_type@Base 0.2.0
- rsd_attribute_info_array_from_variant@Base 0.2.0
+ rsd_attribute_info_array_from_variant@Base 0.4.0
  rsd_attribute_info_array_to_variant@Base 0.2.0
  rsd_attribute_info_copy@Base 0.2.0
  rsd_attribute_info_free@Base 0.2.0
- rsd_attribute_info_from_variant@Base 0.2.0
+ rsd_attribute_info_from_variant@Base 0.4.0
  rsd_attribute_info_get_type@Base 0.2.0
  rsd_attribute_info_new@Base 0.2.0
  rsd_attribute_init@Base 0.2.0
@@ -17,7 +18,7 @@ librhosydd-0.so.3 librhosydd-0-3 #MINVER#
  rsd_attribute_metadata_array_to_variant@Base 0.2.0
  rsd_attribute_metadata_copy@Base 0.2.0
  rsd_attribute_metadata_free@Base 0.2.0
- rsd_attribute_metadata_from_variant@Base 0.2.0
+ rsd_attribute_metadata_from_variant@Base 0.4.0
  rsd_attribute_metadata_get_type@Base 0.2.0
  rsd_attribute_metadata_init@Base 0.2.0
  rsd_attribute_metadata_new@Base 0.2.0
@@ -44,18 +45,18 @@ librhosydd-0.so.3 librhosydd-0-3 #MINVER#
  rsd_subscription_matches_period@Base 0.2.0
  rsd_subscription_new@Base 0.2.0
  rsd_subscription_new_aggregate@Base 0.2.0
- rsd_subscription_new_wildcard@Base 0.2.0
+ rsd_subscription_new_wildcard@Base 0.4.0
  rsd_subscription_notify@Base 0.2.0
  rsd_vehicle_error_quark@Base 0.2.0
  rsd_vehicle_get_all_attributes_async@Base 0.2.0
- rsd_vehicle_get_all_attributes_finish@Base 0.2.0
+ rsd_vehicle_get_all_attributes_finish@Base 0.4.0
  rsd_vehicle_get_all_metadata_async@Base 0.2.0
- rsd_vehicle_get_all_metadata_finish@Base 0.2.0
+ rsd_vehicle_get_all_metadata_finish@Base 0.4.0
  rsd_vehicle_get_attribute_async@Base 0.2.0
- rsd_vehicle_get_attribute_finish@Base 0.2.0
+ rsd_vehicle_get_attribute_finish@Base 0.4.0
  rsd_vehicle_get_id@Base 0.2.0
  rsd_vehicle_get_metadata_async@Base 0.2.0
- rsd_vehicle_get_metadata_finish@Base 0.2.0
+ rsd_vehicle_get_metadata_finish@Base 0.4.0
  rsd_vehicle_get_type@Base 0.1.0
  rsd_vehicle_get_zones@Base 0.2.0
  rsd_vehicle_id_is_valid@Base 0.2.0
@@ -76,6 +77,7 @@ librhosydd-0.so.3 librhosydd-0-3 #MINVER#
  rsd_zone_get_path@Base 0.2.0
  rsd_zone_get_tags@Base 0.2.0
  rsd_zone_get_type@Base 0.2.0
+ rsd_zone_is_descendant@Base 0.4.0
  rsd_zone_is_root@Base 0.2.0
  rsd_zone_path_build@Base 0.2.0
  rsd_zone_path_is_valid@Base 0.2.0
diff --git a/libcroesor/backend-manager.c b/libcroesor/backend-manager.c
index 2dc60d6d929db3313581c815f0ae048ce38ab9e2..d1207b924c45cb12a7cd83a4579cce9f73e08a47 100644
--- a/libcroesor/backend-manager.c
+++ b/libcroesor/backend-manager.c
@@ -74,7 +74,7 @@ static void            clear_daemon                                   (CsrBacken
  * connect to the backend, for example. Support for this could be added in
  * future.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 struct _CsrBackendManager
 {
@@ -182,7 +182,7 @@ csr_backend_manager_set_property (GObject      *object,
  * Create a new #CsrBackendManager with no initial peer.
  *
  * Returns: (transfer full): a new #CsrBackendManager
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 CsrBackendManager *
 csr_backend_manager_new (void)
diff --git a/libcroesor/clock.h b/libcroesor/clock.h
index 2d50f4a3cc84ece01deaff17cdc651c0083e4786..c64b29a02f996f7f5a18c797af39d7e03406d8e1 100644
--- a/libcroesor/clock.h
+++ b/libcroesor/clock.h
@@ -24,7 +24,7 @@ G_BEGIN_DECLS
  * whenever it is called. The value is always in microseconds, but the clock
  * domain is not prescribed.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 typedef RsdTimestampMicroseconds (*CsrClockFunc) (gpointer user_data);
 
diff --git a/libcroesor/peer-manager.h b/libcroesor/peer-manager.h
index fdf2037beaee0dd93cf4b7b3b7543341f7e1b5b5..b98c2a6a6ef341e326b512f2e526f17664fb1b76 100644
--- a/libcroesor/peer-manager.h
+++ b/libcroesor/peer-manager.h
@@ -23,7 +23,7 @@ G_BEGIN_DECLS
  *
  * An object instance which implements #CsrPeerManagerInterface.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 #define CSR_TYPE_PEER_MANAGER csr_peer_manager_get_type ()
 G_DECLARE_INTERFACE (CsrPeerManager, csr_peer_manager, CSR,
@@ -43,7 +43,7 @@ G_DECLARE_INTERFACE (CsrPeerManager, csr_peer_manager, CSR,
  * allowing polkit authorisation checks against them while avoiding
  * time-of-check-to-time-of-use vulnerabilities.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 struct _CsrPeerManagerInterface
 {
diff --git a/libcroesor/static-vehicle.c b/libcroesor/static-vehicle.c
index 6ba3d66d08f5e202e0b0e331e6bc2cd8dc3de975..b69f0b2de7d7be62caf9e1a09cc067f1e6ba3526 100644
--- a/libcroesor/static-vehicle.c
+++ b/libcroesor/static-vehicle.c
@@ -567,7 +567,7 @@ default_clock_cb (gpointer user_data)
  * @clock_func is set to %NULL (the default), g_get_monotonic_time() will be
  * used.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 void
 csr_static_vehicle_set_clock_func (CsrStaticVehicle *self,
diff --git a/libcroesor/subscription-manager.c b/libcroesor/subscription-manager.c
index bc56897e1de9b6733456a823fff42d95f2ca5bf7..9e472c400771448caa3917ee25435ae56196dee7 100644
--- a/libcroesor/subscription-manager.c
+++ b/libcroesor/subscription-manager.c
@@ -401,7 +401,7 @@ csr_subscription_manager_get_subscriptions (CsrSubscriptionManager *self,
  * Returns: (transfer container) (element-type utf8): potentially empty array
  *    of D-Bus unique addresses for the peers who are subscribed to the listed
  *    attributes
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 GPtrArray *
 csr_subscription_manager_get_peers_for_subscriptions (CsrSubscriptionManager   *self,
diff --git a/libinternal/arrays.c b/libinternal/arrays.c
index 7ff2986fad30f54e1b2288f1054d933cc0633ea1..bcbe72c0d853fde6a40063f07f4a9ec365d7d6ae 100644
--- a/libinternal/arrays.c
+++ b/libinternal/arrays.c
@@ -24,7 +24,7 @@
  * place. The given @compare_func takes pointers to pointers in the array,
  * and has the same semantics as strcmp().
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 void
 ptr_array_uniqueify (GPtrArray    *array,
diff --git a/libinternal/timestamped-pointer.c b/libinternal/timestamped-pointer.c
index 55e18e57b99b7d418072550ec47657c98e3d2df1..818645b119183239f2b77c6b6e9e79d3ebd74118 100644
--- a/libinternal/timestamped-pointer.c
+++ b/libinternal/timestamped-pointer.c
@@ -27,7 +27,7 @@
  * Create a new #TimestampedPointer which associates @timestamp with @data.
  *
  * Returns: (transfer full): a new #TimestampedPointer
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 TimestampedPointer *
 timestamped_pointer_new (gpointer                 data,
@@ -52,7 +52,7 @@ timestamped_pointer_new (gpointer                 data,
  * function passed at construction time on the data pointer, if both of them are
  * non-%NULL.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 void
 timestamped_pointer_free (TimestampedPointer *data)
@@ -78,7 +78,7 @@ timestamped_pointer_free (TimestampedPointer *data)
  * Use in conjunction with timestamped_pointer_g_task_propagate() to return a
  * timestamp and pointer via a #GTask.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 void
 timestamped_pointer_g_task_return (GTask                    *task,
@@ -106,7 +106,7 @@ timestamped_pointer_g_task_return (GTask                    *task,
  * separately.
  *
  * Returns: (transfer full): propagated pointer
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 gpointer
 timestamped_pointer_g_task_propagate (GTask                     *task,
diff --git a/libinternal/timestamped-pointer.h b/libinternal/timestamped-pointer.h
index c69103a787ac33b721d49f3d61e1ad79de3a0a25..b50bdba72660ffdfeb2c9cdb0840ab8b28f0c0de 100644
--- a/libinternal/timestamped-pointer.h
+++ b/libinternal/timestamped-pointer.h
@@ -30,7 +30,7 @@ G_BEGIN_DECLS
  * timestamped_pointer_g_task_propagate() as a closure to bind vehicle
  * attributes and the timestamps they were retrieved.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 typedef struct
 {
diff --git a/librhosydd/attribute.c b/librhosydd/attribute.c
index 53683bd7ae06a08aa5b16ab9712c015dca202b5b..8d8d17cb066f3212a19154a5ea09197124f0e8a5 100644
--- a/librhosydd/attribute.c
+++ b/librhosydd/attribute.c
@@ -172,7 +172,7 @@ rsd_attribute_init (RsdAttribute       *attribute,
  * Clear the contents of an #RsdAttribute, but do not free the #RsdAttribute
  * itself.
  *
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 void
 rsd_attribute_clear (RsdAttribute *attribute)
diff --git a/librhosydd/subscription.c b/librhosydd/subscription.c
index d0dc37e00dddb0929d5ce9b91e66777e6b9ad25d..fde31fc3bd992fcea83e8e52cc0d087b531277a1 100644
--- a/librhosydd/subscription.c
+++ b/librhosydd/subscription.c
@@ -744,7 +744,7 @@ rsd_subscription_new_aggregate (GArray *subscriptions)
  * rsd_vehicle_update_subscriptions_async() for that.
  *
  * Returns: (transfer full): a new #RsdSubscription
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 RsdSubscription *
 rsd_subscription_new_wildcard (void)
diff --git a/librhosydd/utilities.c b/librhosydd/utilities.c
index 39501e9180fe65e9df297172411f158100474e42..384a8b9bc3d1143164a8d62ec090b809610ddf59 100644
--- a/librhosydd/utilities.c
+++ b/librhosydd/utilities.c
@@ -216,7 +216,7 @@ validate_attribute_timestamp (RsdTimestampMicroseconds   last_updated,
  *
  * Returns: (element-type RsdAttributeInfo) (transfer container): attribute info
  *    array
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 GPtrArray *
 rsd_attribute_info_array_from_variant (GVariant                  *variant,
@@ -471,7 +471,7 @@ rsd_attribute_metadata_array_to_variant (GPtrArray *array)
  * any of its entries are invalid. The @variant must be in normal form.
  *
  * Returns: (transfer full): attribute info
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 RsdAttributeInfo *
 rsd_attribute_info_from_variant (GVariant                  *variant,
@@ -549,7 +549,7 @@ rsd_attribute_info_from_variant (GVariant                  *variant,
  * any of its entries are invalid. The @variant must be in normal form.
  *
  * Returns: (transfer full): attribute metadata
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 RsdAttributeMetadata *
 rsd_attribute_metadata_from_variant (GVariant                  *variant,
diff --git a/librhosydd/vehicle.c b/librhosydd/vehicle.c
index dc77133814e1b8e737c591c9e213d75fa2aa77f9..06f11fb1449bd9dbd13574a95c0ffda2d6068432 100644
--- a/librhosydd/vehicle.c
+++ b/librhosydd/vehicle.c
@@ -118,7 +118,7 @@ rsd_vehicle_default_init (RsdVehicleInterface *iface)
    * should not rely on this behaviour; if a client uses an attribute, they must
    * subscribe to it.
    *
-   * Since: UNRELEASED
+   * Since: 0.4.0
    */
   g_signal_new ("attributes-changed", G_TYPE_FROM_INTERFACE (iface),
                 G_SIGNAL_RUN_LAST,
@@ -141,7 +141,7 @@ rsd_vehicle_default_init (RsdVehicleInterface *iface)
    * changed. For notifications of changes to the //values// of attributes, see
    * #RsdVehicle::attributes-changed.
    *
-   * Since: UNRELEASED
+   * Since: 0.4.0
    */
   g_signal_new ("attributes-metadata-changed", G_TYPE_FROM_INTERFACE (iface),
                 G_SIGNAL_RUN_LAST,
@@ -269,7 +269,7 @@ rsd_vehicle_get_attribute_async (RsdVehicle          *self,
  * See rsd_vehicle_get_attribute_async().
  *
  * Returns: (transfer full): attribute value and metadata
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 RsdAttributeInfo *
 rsd_vehicle_get_attribute_finish (RsdVehicle                *self,
@@ -370,7 +370,7 @@ rsd_vehicle_get_metadata_async (RsdVehicle          *self,
  * See rsd_vehicle_get_metadata_async().
  *
  * Returns: (transfer full): attribute metadata
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 RsdAttributeMetadata *
 rsd_vehicle_get_metadata_finish (RsdVehicle                *self,
@@ -546,7 +546,7 @@ rsd_vehicle_get_all_attributes_async (RsdVehicle          *self,
  *
  * Returns: (transfer container) (element-type RsdAttributeInfo): potentially
  *    empty array of attribute information
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 GPtrArray *
 rsd_vehicle_get_all_attributes_finish (RsdVehicle                *self,
@@ -628,7 +628,7 @@ rsd_vehicle_get_all_metadata_async (RsdVehicle          *self,
  * Returns: (transfer container) (element-type RsdAttributeMetadata):
  *    potentially empty array of attribute metadata information, where the
  *    #RsdAttributeMetadata is valid, but the #RsdAttribute is not
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 GPtrArray *
 rsd_vehicle_get_all_metadata_finish (RsdVehicle                *self,
diff --git a/librhosydd/zone.c b/librhosydd/zone.c
index 70587408d4d156648ea0044b6aed71df4f2263e2..a917032b89f8d2cdbbd932fbf94805b20747bf07 100644
--- a/librhosydd/zone.c
+++ b/librhosydd/zone.c
@@ -144,7 +144,7 @@ rsd_zone_is_root (RsdZone *self)
  * Check whether @self is equal to, or a descendant of, @ancestor.
  *
  * Returns: %TRUE if @self is a descedant of @ancestor, %FALSE otherwise
- * Since: UNRELEASED
+ * Since: 0.4.0
  */
 gboolean
 rsd_zone_is_descendant (RsdZone *self,