--- /dev/null
+Index: quagga-0.99.21/bgpd/bgp_route.c
+===================================================================
+--- quagga-0.99.21.orig/bgpd/bgp_route.c
++++ quagga-0.99.21/bgpd/bgp_route.c
+@@ -2616,7 +2616,7 @@ bgp_announce_route_all (struct peer *pee
+ \f
+ static void
+ bgp_soft_reconfig_table_rsclient (struct peer *rsclient, afi_t afi,
+- safi_t safi, struct bgp_table *table)
++ safi_t safi, struct bgp_table *table, struct prefix_rd *prd)
+ {
+ struct bgp_node *rn;
+ struct bgp_adj_in *ain;
+@@ -2627,8 +2627,11 @@ bgp_soft_reconfig_table_rsclient (struct
+ for (rn = bgp_table_top (table); rn; rn = bgp_route_next (rn))
+ for (ain = rn->adj_in; ain; ain = ain->next)
+ {
++ struct bgp_info *ri = rn->info;
++
+ bgp_update_rsclient (rsclient, afi, safi, ain->attr, ain->peer,
+- &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, NULL, NULL);
++ &rn->p, ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL, prd,
++ (bgp_info_extra_get (ri))->tag);
+ }
+ }
+
+@@ -2639,18 +2642,25 @@ bgp_soft_reconfig_rsclient (struct peer
+ struct bgp_node *rn;
+
+ if (safi != SAFI_MPLS_VPN)
+- bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL);
++ bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, NULL, NULL);
+
+ else
+ for (rn = bgp_table_top (rsclient->bgp->rib[afi][safi]); rn;
+ rn = bgp_route_next (rn))
+ if ((table = rn->info) != NULL)
+- bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table);
++ {
++ struct prefix_rd prd;
++ prd.family = AF_UNSPEC;
++ prd.prefixlen = 64;
++ memcpy(&prd.val, rn->p.u.val, 8);
++
++ bgp_soft_reconfig_table_rsclient (rsclient, afi, safi, table, &prd);
++ }
+ }
+ \f
+ static void
+ bgp_soft_reconfig_table (struct peer *peer, afi_t afi, safi_t safi,
+- struct bgp_table *table)
++ struct bgp_table *table, struct prefix_rd *prd)
+ {
+ int ret;
+ struct bgp_node *rn;
+@@ -2664,9 +2674,12 @@ bgp_soft_reconfig_table (struct peer *pe
+ {
+ if (ain->peer == peer)
+ {
++ struct bgp_info *ri = rn->info;
++
+ ret = bgp_update (peer, &rn->p, ain->attr, afi, safi,
+ ZEBRA_ROUTE_BGP, BGP_ROUTE_NORMAL,
+- NULL, NULL, 1);
++ prd, (bgp_info_extra_get (ri))->tag, 1);
++
+ if (ret < 0)
+ {
+ bgp_unlock_node (rn);
+@@ -2687,12 +2700,19 @@ bgp_soft_reconfig_in (struct peer *peer,
+ return;
+
+ if (safi != SAFI_MPLS_VPN)
+- bgp_soft_reconfig_table (peer, afi, safi, NULL);
++ bgp_soft_reconfig_table (peer, afi, safi, NULL, NULL);
+ else
+ for (rn = bgp_table_top (peer->bgp->rib[afi][safi]); rn;
+ rn = bgp_route_next (rn))
+ if ((table = rn->info) != NULL)
+- bgp_soft_reconfig_table (peer, afi, safi, table);
++ {
++ struct prefix_rd prd;
++ prd.family = AF_UNSPEC;
++ prd.prefixlen = 64;
++ memcpy(&prd.val, rn->p.u.val, 8);
++
++ bgp_soft_reconfig_table (peer, afi, safi, table, &prd);
++ }
+ }
+ \f
+