Index: sys/netinet6/in6.c
===================================================================
--- sys/netinet6/in6.c	(revision 272566)
+++ sys/netinet6/in6.c	(working copy)
@@ -678,6 +678,8 @@ in6_control(struct socket *so, u_long cmd, caddr_t
 				goto out;
 			}
 		}
+		else
+			nd6_prefix_update_ltimes(pr, &pr0);
 
 		/* relate the address to the prefix */
 		if (ia->ia6_ndpr == NULL) {
Index: sys/netinet6/nd6.h
===================================================================
--- sys/netinet6/nd6.h	(revision 272566)
+++ sys/netinet6/nd6.h	(working copy)
@@ -445,6 +445,7 @@ int nd6_prelist_add(struct nd_prefixctl *, struct
 void pfxlist_onlink_check(void);
 struct nd_defrouter *defrouter_lookup(struct in6_addr *, struct ifnet *);
 struct nd_prefix *nd6_prefix_lookup(struct nd_prefixctl *);
+int nd6_prefix_update_ltimes(struct nd_prefix *, struct nd_prefixctl *);
 void rt6_flush(struct in6_addr *, struct ifnet *);
 int nd6_setdefaultiface(int);
 int in6_tmpifadd(const struct in6_ifaddr *, int, int);
Index: sys/netinet6/nd6_rtr.c
===================================================================
--- sys/netinet6/nd6_rtr.c	(revision 272566)
+++ sys/netinet6/nd6_rtr.c	(working copy)
@@ -853,6 +853,21 @@ nd6_prefix_lookup(struct nd_prefixctl *key)
 }
 
 int
+nd6_prefix_update_ltimes(struct nd_prefix *pr, struct nd_prefixctl *prctl)
+{
+	int error;
+
+	pr->ndpr_vltime = prctl->ndpr_vltime;
+	pr->ndpr_pltime = prctl->ndpr_pltime;
+	if ((error = in6_init_prefix_ltimes(pr)) != 0) {
+		return (error);
+	}
+	pr->ndpr_lastupdate = time_uptime;
+
+	return 0;
+}
+
+int
 nd6_prelist_add(struct nd_prefixctl *pr, struct nd_defrouter *dr,
     struct nd_prefix **newp)
 {
