+ fixed bug #418 (changing address on an existing interface doesn't cause existing static routes to be revalidated)
diff --git a/zebra/connected.c b/zebra/connected.c
index 53aa254..8bf1d33 100644
--- a/zebra/connected.c
+++ b/zebra/connected.c
@@ -35,6 +35,7 @@
 #include "zebra/redistribute.h"
 #include "zebra/interface.h"
 #include "zebra/connected.h"
+extern struct zebra_t zebrad;
 
 /* withdraw a connected address */
 static void
@@ -187,8 +188,15 @@
   if (prefix_ipv4_any (&p))
     return;
 
+  /* Always push arriving/departing connected routes into the head of
+   * the working queue to make possible proper validation of the rest
+   * of the RIB queue (which will contain the whole RIB after the first
+   * call to rib_update()).
+   */
+  work_queue_aim_head (zebrad.ribq, 1);
   rib_add_ipv4 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, NULL, ifp->ifindex,
 	RT_TABLE_MAIN, ifp->metric, 0);
+  work_queue_aim_head (zebrad.ribq, 0);
 
   rib_update ();
 }
@@ -293,7 +301,10 @@
   if (prefix_ipv4_any (&p))
     return;
 
+  /* Same logic as for connected_up_ipv4(): push the changes into the head. */
+  work_queue_aim_head (zebrad.ribq, 1);
   rib_delete_ipv4 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0);
+  work_queue_aim_head (zebrad.ribq, 0);
 
   rib_update ();
 }
@@ -338,8 +349,10 @@
     return;
 #endif
 
+  work_queue_aim_head (zebrad.ribq, 1);
   rib_add_ipv6 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0,
                 ifp->metric, 0);
+  work_queue_aim_head (zebrad.ribq, 0);
 
   rib_update ();
 }
@@ -413,7 +426,9 @@
   if (IN6_IS_ADDR_UNSPECIFIED (&p.prefix))
     return;
 
+  work_queue_aim_head (zebrad.ribq, 1);
   rib_delete_ipv6 (ZEBRA_ROUTE_CONNECT, 0, &p, NULL, ifp->ifindex, 0);
+  work_queue_aim_head (zebrad.ribq, 0);
 
   rib_update ();
 }