diff --git a/sys/net/if_gif.c b/sys/net/if_gif.c
index 94e88615d3bb..4b238a2e10da 100644
--- a/sys/net/if_gif.c
+++ b/sys/net/if_gif.c
@@ -104,6 +104,9 @@ void	(*ng_gif_input_orphan_p)(struct ifnet *ifp, struct mbuf *m, int af);
 void	(*ng_gif_attach_p)(struct ifnet *ifp);
 void	(*ng_gif_detach_p)(struct ifnet *ifp);
 
+#ifdef VIMAGE
+static void	gif_reassign(struct ifnet *, struct vnet *, char *);
+#endif
 static void	gif_delete_tunnel(struct gif_softc *);
 static int	gif_ioctl(struct ifnet *, u_long, caddr_t);
 static int	gif_transmit(struct ifnet *, struct mbuf *);
@@ -150,6 +153,9 @@ gif_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 	GIF2IFP(sc)->if_transmit = gif_transmit;
 	GIF2IFP(sc)->if_qflush = gif_qflush;
 	GIF2IFP(sc)->if_output = gif_output;
+#ifdef VIMAGE
+	GIF2IFP(sc)->if_reassign = gif_reassign;
+#endif
 	GIF2IFP(sc)->if_capabilities |= IFCAP_LINKSTATE;
 	GIF2IFP(sc)->if_capenable |= IFCAP_LINKSTATE;
 	if_attach(GIF2IFP(sc));
@@ -160,6 +166,21 @@ gif_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 	return (0);
 }
 
+#ifdef VIMAGE
+static void
+gif_reassign(struct ifnet *ifp, struct vnet *new_vnet __unused,
+    char *unused __unused)
+{
+	struct gif_softc *sc;
+
+	sx_xlock(&gif_ioctl_sx);
+	sc = ifp->if_softc;
+	if (sc != NULL)
+		gif_delete_tunnel(sc);
+	sx_xunlock(&gif_ioctl_sx);
+}
+#endif /* VIMAGE */
+
 static void
 gif_clone_destroy(struct ifnet *ifp)
 {
diff --git a/sys/net/if_gre.c b/sys/net/if_gre.c
index bd940b579393..aa3e4062b060 100644
--- a/sys/net/if_gre.c
+++ b/sys/net/if_gre.c
@@ -107,6 +107,9 @@ static void	gre_clone_destroy(struct ifnet *);
 VNET_DEFINE_STATIC(struct if_clone *, gre_cloner);
 #define	V_gre_cloner	VNET(gre_cloner)
 
+#ifdef VIMAGE
+static void	gre_reassign(struct ifnet *, struct vnet *, char *);
+#endif
 static void	gre_qflush(struct ifnet *);
 static int	gre_transmit(struct ifnet *, struct mbuf *);
 static int	gre_ioctl(struct ifnet *, u_long, caddr_t);
@@ -183,6 +186,9 @@ gre_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 	GRE2IFP(sc)->if_ioctl = gre_ioctl;
 	GRE2IFP(sc)->if_transmit = gre_transmit;
 	GRE2IFP(sc)->if_qflush = gre_qflush;
+#ifdef VIMAGE
+	GRE2IFP(sc)->if_reassign = gre_reassign;
+#endif
 	GRE2IFP(sc)->if_capabilities |= IFCAP_LINKSTATE;
 	GRE2IFP(sc)->if_capenable |= IFCAP_LINKSTATE;
 	if_attach(GRE2IFP(sc));
@@ -190,6 +196,21 @@ gre_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 	return (0);
 }
 
+#ifdef VIMAGE
+static void
+gre_reassign(struct ifnet *ifp, struct vnet *new_vnet __unused,
+    char *unused __unused)
+{
+	struct gre_softc *sc;
+
+	sx_xlock(&gre_ioctl_sx);
+	sc = ifp->if_softc;
+	if (sc != NULL)
+		gre_delete_tunnel(sc);
+	sx_xunlock(&gre_ioctl_sx);
+}
+#endif /* VIMAGE */
+
 static void
 gre_clone_destroy(struct ifnet *ifp)
 {
diff --git a/sys/net/if_ipsec.c b/sys/net/if_ipsec.c
index 737d840bbac7..d863b26eaff9 100644
--- a/sys/net/if_ipsec.c
+++ b/sys/net/if_ipsec.c
@@ -170,6 +170,9 @@ static int	ipsec_set_addresses(struct ifnet *, struct sockaddr *,
 static int	ipsec_set_reqid(struct ipsec_softc *, uint32_t);
 static void	ipsec_set_running(struct ipsec_softc *);
 
+#ifdef VIMAGE
+static void	ipsec_reassign(struct ifnet *, struct vnet *, char *);
+#endif
 static void	ipsec_srcaddr(void *, const struct sockaddr *, int);
 static int	ipsec_ioctl(struct ifnet *, u_long, caddr_t);
 static int	ipsec_transmit(struct ifnet *, struct mbuf *);
@@ -201,12 +204,30 @@ ipsec_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 	ifp->if_transmit  = ipsec_transmit;
 	ifp->if_qflush  = ipsec_qflush;
 	ifp->if_output = ipsec_output;
+#ifdef VIMAGE
+	ifp->if_reassign = ipsec_reassign;
+#endif
 	if_attach(ifp);
 	bpfattach(ifp, DLT_NULL, sizeof(uint32_t));
 
 	return (0);
 }
 
+#ifdef VIMAGE
+static void
+ipsec_reassign(struct ifnet *ifp, struct vnet *new_vnet __unused,
+    char *unused __unused)
+{
+	struct ipsec_softc *sc;
+
+	sx_xlock(&ipsec_ioctl_sx);
+	sc = ifp->if_softc;
+	if (sc != NULL)
+		ipsec_delete_tunnel(sc);
+	sx_xunlock(&ipsec_ioctl_sx);
+}
+#endif /* VIMAGE */
+
 static void
 ipsec_clone_destroy(struct ifnet *ifp)
 {
diff --git a/sys/net/if_me.c b/sys/net/if_me.c
index 7a9e88e034cf..aafc07c2b203 100644
--- a/sys/net/if_me.c
+++ b/sys/net/if_me.c
@@ -113,6 +113,9 @@ static void	me_clone_destroy(struct ifnet *);
 VNET_DEFINE_STATIC(struct if_clone *, me_cloner);
 #define	V_me_cloner	VNET(me_cloner)
 
+#ifdef VIMAGE
+static void	me_reassign(struct ifnet *, struct vnet *, char *);
+#endif
 static void	me_qflush(struct ifnet *);
 static int	me_transmit(struct ifnet *, struct mbuf *);
 static int	me_ioctl(struct ifnet *, u_long, caddr_t);
@@ -200,6 +203,9 @@ me_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 	ME2IFP(sc)->if_ioctl = me_ioctl;
 	ME2IFP(sc)->if_transmit = me_transmit;
 	ME2IFP(sc)->if_qflush = me_qflush;
+#ifdef VIMAGE
+	ME2IFP(sc)->if_reassign = me_reassign;
+#endif
 	ME2IFP(sc)->if_capabilities |= IFCAP_LINKSTATE;
 	ME2IFP(sc)->if_capenable |= IFCAP_LINKSTATE;
 	if_attach(ME2IFP(sc));
@@ -207,6 +213,21 @@ me_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 	return (0);
 }
 
+#ifdef VIMAGE
+static void
+me_reassign(struct ifnet *ifp, struct vnet *new_vnet __unused,
+    char *unused __unused)
+{
+	struct me_softc *sc;
+
+	sx_xlock(&me_ioctl_sx);
+	sc = ifp->if_softc;
+	if (sc != NULL)
+		me_delete_tunnel(sc);
+	sx_xunlock(&me_ioctl_sx);
+}
+#endif /* VIMAGE */
+
 static void
 me_clone_destroy(struct ifnet *ifp)
 {