diff --git a/src/platform/nm-linux-platform.c b/src/platform/nm-linux-platform.c
index 88c334e..d84e18b 100644
--- a/src/platform/nm-linux-platform.c
+++ b/src/platform/nm-linux-platform.c
@@ -1071,37 +1071,45 @@ hack_empty_master_iff_lower_up (NMPlatform *platform, struct nl_object *object)
 			return;
 	}
 
 	rtnl_link_unset_flags (rtnllink, IFF_LOWER_UP);
 }
 
 static void
-_rtnladdr_get_timestamp (struct rtnl_addr *rtnladdr, struct timestamp *ts, guint32 *out_timestamp, guint32 *out_lifetime, guint32 *out_preferred)
+_init_timestamp (struct timestamp *ts)
+{
+	g_assert (ts);
+	ts->monotonic_timestamp_ns = nm_utils_get_monotonic_timestamp_ns ();
+	ts->monotonic_ns = (_clock_gettime_ns () + ts->monotonic_ns) / 2;
+}
+
+static void
+_rtnladdr_get_timestamp (struct rtnl_addr *rtnladdr,
+                         const struct timestamp *ts,
+                         guint32 *out_timestamp,
+                         guint32 *out_lifetime,
+                         guint32 *out_preferred)
 {
 	guint32 a_preferred = rtnl_addr_get_preferred_lifetime (rtnladdr);
 	guint32 a_lifetime  = rtnl_addr_get_valid_lifetime (rtnladdr);
 	gint64 a_timestamp;
 	struct timestamp ts_local;
 
 	if (a_preferred == NM_PLATFORM_LIFETIME_PERMANENT &&
 	    a_lifetime == NM_PLATFORM_LIFETIME_PERMANENT) {
 		*out_timestamp = 0;
 		*out_lifetime = NM_PLATFORM_LIFETIME_PERMANENT;
 		*out_preferred = NM_PLATFORM_LIFETIME_PERMANENT;
 	}
 
-	if (!ts)
+	if (!ts) {
+		_init_timestamp (&ts_local);
 		ts = &ts_local;
-	else if (ts->monotonic_timestamp_ns != 0)
-		goto timestamp_is_ready;
-	ts->monotonic_ns = _clock_gettime_ns ();
-	ts->monotonic_timestamp_ns = nm_utils_get_monotonic_timestamp_ns ();
-	ts->monotonic_ns = (_clock_gettime_ns () + ts->monotonic_ns) / 2;
+	}
 
-timestamp_is_ready:
 	/* get the last_update_time() of the address in nsec of CLOCK_MONOTONIC. */
 	a_timestamp = _timestamp_nl_to_ns (rtnl_addr_get_last_update_time (rtnladdr), ts->monotonic_ns);
 
 	/* convert a_timestamp to nm_utils_get_monotonic_timestamp_s () */
 	a_timestamp = (a_timestamp + (ts->monotonic_timestamp_ns - ts->monotonic_ns)) / NM_UTILS_NS_PER_SECOND;
 
 	if (a_timestamp <= 0) {
@@ -1119,15 +1127,15 @@ timestamp_is_ready:
 	*out_timestamp = a_timestamp;
 	*out_lifetime = a_lifetime;
 	*out_preferred = a_preferred;
 }
 
 
 static gboolean
-init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr, struct timestamp *ts)
+init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr, const struct timestamp *ts)
 {
 	struct nl_addr *nladdr = rtnl_addr_get_local (rtnladdr);
 	struct nl_addr *nlpeer = rtnl_addr_get_peer (rtnladdr);
 	const char *label;
 
 	g_return_val_if_fail (nladdr, FALSE);
 
@@ -1158,15 +1166,15 @@ init_ip4_address (NMPlatformIP4Address *address, struct rtnl_addr *rtnladdr, str
 	if (label && strchr (label, ':'))
 		g_strlcpy (address->label, label, sizeof (address->label));
 
 	return TRUE;
 }
 
 static gboolean
-init_ip6_address (NMPlatformIP6Address *address, struct rtnl_addr *rtnladdr, struct timestamp *ts)
+init_ip6_address (NMPlatformIP6Address *address, struct rtnl_addr *rtnladdr, const struct timestamp *ts)
 {
 	struct nl_addr *nladdr = rtnl_addr_get_local (rtnladdr);
 	struct nl_addr *nlpeer = rtnl_addr_get_peer (rtnladdr);
 
 	memset (address, 0, sizeof (*address));
 
 	address->source = NM_PLATFORM_SOURCE_KERNEL;
@@ -3205,14 +3213,15 @@ ip4_address_get_all (NMPlatform *platform, int ifindex)
 	GArray *addresses;
 	NMPlatformIP4Address address;
 	struct nl_object *object;
 	struct timestamp ts = { 0 };
 
 	addresses = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP4Address));
 
+	_init_timestamp (&ts);
 	for (object = nl_cache_get_first (priv->address_cache); object; object = nl_cache_get_next (object)) {
 		if (_address_match ((struct rtnl_addr *) object, AF_INET, ifindex)) {
 			if (init_ip4_address (&address, (struct rtnl_addr *) object, &ts))
 				g_array_append_val (addresses, address);
 		}
 	}
 
@@ -3226,14 +3235,15 @@ ip6_address_get_all (NMPlatform *platform, int ifindex)
 	GArray *addresses;
 	NMPlatformIP6Address address;
 	struct nl_object *object;
 	struct timestamp ts = { 0 };
 
 	addresses = g_array_new (FALSE, FALSE, sizeof (NMPlatformIP6Address));
 
+	_init_timestamp (&ts);
 	for (object = nl_cache_get_first (priv->address_cache); object; object = nl_cache_get_next (object)) {
 		if (_address_match ((struct rtnl_addr *) object, AF_INET6, ifindex)) {
 			if (init_ip6_address (&address, (struct rtnl_addr *) object, &ts))
 				g_array_append_val (addresses, address);
 		}
 	}
 
