u16 peers_snd_nxt =  msg_next_sent(hdr);
        u16 peers_tol = msg_link_tolerance(hdr);
        u16 peers_prio = msg_linkprio(hdr);
+       u16 rcv_nxt = l->rcv_nxt;
        char *if_name;
        int rc = 0;
 
                        break;
 
                /* Send NACK if peer has sent pkts we haven't received yet */
-               if (more(peers_snd_nxt, l->rcv_nxt))
+               if (more(peers_snd_nxt, rcv_nxt) && !tipc_link_is_synching(l))
                        rcvgap = peers_snd_nxt - l->rcv_nxt;
                if (rcvgap || (msg_probe(hdr)))
                        tipc_link_build_proto_msg(l, STATE_MSG, 0, rcvgap,
 
        u16 exp_pkts = msg_msgcnt(hdr);
        u16 rcv_nxt, syncpt, dlv_nxt;
        int state = n->state;
-       struct tipc_link *l, *pl = NULL;
+       struct tipc_link *l, *tnl, *pl = NULL;
        struct tipc_media_addr *maddr;
        int i, pb_id;
 
 
        /* Open tunnel link when parallel link reaches synch point */
        if ((n->state == NODE_SYNCHING) && tipc_link_is_synching(l)) {
+               if (tipc_link_is_synching(l)) {
+                       tnl = l;
+               } else {
+                       tnl = pl;
+                       pl = l;
+               }
                dlv_nxt = pl->rcv_nxt - mod(skb_queue_len(pl->inputq));
                if (more(dlv_nxt, n->sync_point)) {
-                       tipc_link_fsm_evt(l, LINK_SYNCH_END_EVT);
+                       tipc_link_fsm_evt(tnl, LINK_SYNCH_END_EVT);
                        tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT);
                        return true;
                }
+               if (l == pl)
+                       return true;
                if ((usr == TUNNEL_PROTOCOL) && (mtyp == SYNCH_MSG))
                        return true;
                if (usr == LINK_PROTOCOL)