diff --git a/zebra/interface.c b/zebra/interface.c
index f7fd112cd4ce..1c86a6a5c707 100644
--- a/zebra/interface.c
+++ b/zebra/interface.c
@@ -972,6 +972,8 @@ void if_up(struct interface *ifp, bool install_connected)
 	event_ignore_late_timer(zif->speed_update);
 
 	if_addr_wakeup(ifp);
+
+	rib_update_handle_vrf_all(RIB_UPDATE_KERNEL, ZEBRA_ROUTE_KERNEL);
 }
 
 /* Interface goes down.  We have to manage different behavior of based
diff --git a/zebra/zebra_nhg.c b/zebra/zebra_nhg.c
index 1519246c179e..e61c158ca9f2 100644
--- a/zebra/zebra_nhg.c
+++ b/zebra/zebra_nhg.c
@@ -2648,7 +2648,7 @@ static unsigned nexthop_active_check(struct route_node *rn,
 
 		ifp = if_lookup_by_index(nexthop->ifindex, nexthop->vrf_id);
 
-		if (ifp && ifp->vrf->vrf_id == vrf_id && if_is_up(ifp)) {
+		if (ifp && ifp->vrf->vrf_id == vrf_id && if_is_up(ifp) && if_is_operative(ifp)) {
 			SET_FLAG(nexthop->flags, NEXTHOP_FLAG_ACTIVE);
 			goto skip_check;
 		}
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index b2543ca0e8b1..3ea5f70f8bb2 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -1480,7 +1480,7 @@ static void rib_process(struct route_node *rn)
 		rib_process_update_fib(zvrf, rn, old_fib, new_fib);
 	else if (new_fib)
 		rib_process_add_fib(zvrf, rn, new_fib);
-	else if (old_fib)
+	else if (old_fib && !RIB_SYSTEM_ROUTE(old_fib))
 		rib_process_del_fib(zvrf, rn, old_fib);
 
 	/* Remove all RE entries queued for removal */