diff --git a/nest/rt-table.c b/nest/rt-table.c
index dee61676b..4df35d925 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -4496,9 +4496,22 @@ rt_next_hop_update_rte(const rte *old, rte *new)
   if (current_version == last_version)
     return 0;
 
-  *new = *old;
-  new->attrs = ea_strip_to(new->attrs, BIT32_ALL(EALS_PREIMPORT, EALS_FILTERED));
-  rta_apply_hostentry(&new->attrs, head);
+  rte tmp = *old;
+  tmp.attrs = ea_strip_to(tmp.attrs, BIT32_ALL(EALS_PREIMPORT, EALS_FILTERED));
+  rta_apply_hostentry(&tmp.attrs, head);
+
+  /* The hostentry version moved but the resolved result may still be the
+   * same. Re-announcing an unchanged route would trigger another round of
+   * table updates, possibly looping back to this very hostentry, e.g. when
+   * a pipe feeds the IGP table from the table with recursive routes. */
+  eattr *old_nh = ea_find(old->attrs, &ea_gen_nexthop);
+  eattr *new_nh = ea_find(tmp.attrs, &ea_gen_nexthop);
+  if (old_nh && new_nh && adata_same(old_nh->u.ptr, new_nh->u.ptr) &&
+      (ea_get_int(old->attrs, &ea_gen_igp_metric, IGP_METRIC_UNKNOWN) ==
+       ea_get_int(tmp.attrs, &ea_gen_igp_metric, IGP_METRIC_UNKNOWN)))
+    return 0;
+
+  *new = tmp;
   return 1;
 }
 
