return;
                }
                spin_lock_bh(&n_ptr->lock);
+
+               /* Don't talk to neighbor during cleanup after last session */
+
+               if (n_ptr->cleanup_required) {
+                       spin_unlock_bh(&n_ptr->lock);
+                       return;
+               }
+
                link = n_ptr->links[b_ptr->identity];
                if (!link) {
                        dbg("creating link\n");
 
                                goto cont;
                }
 
-               /* Locate unicast link endpoint that should handle message */
+               /* Locate neighboring node that sent message */
 
                n_ptr = tipc_node_find(msg_prevnode(msg));
                if (unlikely(!n_ptr))
                        goto cont;
                tipc_node_lock(n_ptr);
 
+               /* Don't talk to neighbor during cleanup after last session */
+
+               if (n_ptr->cleanup_required) {
+                       tipc_node_unlock(n_ptr);
+                       goto cont;
+               }
+
+               /* Locate unicast link endpoint that should handle message */
+
                l_ptr = n_ptr->links[b_ptr->identity];
                if (unlikely(!l_ptr)) {
                        tipc_node_unlock(n_ptr);
 
                                  tipc_highest_allowed_slave);
 }
 
+static void node_cleanup_finished(unsigned long node_addr)
+{
+       struct tipc_node *n_ptr;
+
+       read_lock_bh(&tipc_net_lock);
+       n_ptr = tipc_node_find(node_addr);
+       if (n_ptr) {
+               tipc_node_lock(n_ptr);
+               n_ptr->cleanup_required = 0;
+               tipc_node_unlock(n_ptr);
+       }
+       read_unlock_bh(&tipc_net_lock);
+}
+
 static void node_lost_contact(struct tipc_node *n_ptr)
 {
        struct cluster *c_ptr;
                tipc_k_signal((Handler)ns->handle_node_down,
                              (unsigned long)ns->usr_handle);
        }
+
+       /* Prevent re-contact with node until all cleanup is done */
+
+       n_ptr->cleanup_required = 1;
+       tipc_k_signal((Handler)node_cleanup_finished, n_ptr->addr);
 }
 
 /**
 
  * @active_links: pointers to active links to node
  * @links: pointers to all links to node
  * @working_links: number of working links to node (both active and standby)
+ * @cleanup_required: non-zero if cleaning up after a prior loss of contact
  * @link_cnt: number of links to node
  * @permit_changeover: non-zero if node has redundant links to this system
  * @routers: bitmap (used for multicluster communication)
        struct link *links[MAX_BEARERS];
        int link_cnt;
        int working_links;
+       int cleanup_required;
        int permit_changeover;
        u32 routers[512/32];
        int last_router;