case SELF_LOST_CONTACT_EVT:
                case PEER_LOST_CONTACT_EVT:
                        break;
+               case NODE_SYNCH_END_EVT:
+               case NODE_SYNCH_BEGIN_EVT:
+               case NODE_FAILOVER_BEGIN_EVT:
+               case NODE_FAILOVER_END_EVT:
                default:
-                       pr_err("Unknown node fsm evt %x/%x\n", state, evt);
+                       goto illegal_evt;
                }
                break;
        case SELF_UP_PEER_UP:
                case PEER_LOST_CONTACT_EVT:
                        state = SELF_LEAVING_PEER_DOWN;
                        break;
+               case NODE_SYNCH_BEGIN_EVT:
+                       state = NODE_SYNCHING;
+                       break;
+               case NODE_FAILOVER_BEGIN_EVT:
+                       state = NODE_FAILINGOVER;
+                       break;
                case SELF_ESTABL_CONTACT_EVT:
                case PEER_ESTABL_CONTACT_EVT:
+               case NODE_SYNCH_END_EVT:
+               case NODE_FAILOVER_END_EVT:
                        break;
                default:
-                       pr_err("Unknown node fsm evt %x/%x\n", state, evt);
+                       goto illegal_evt;
                }
                break;
        case SELF_DOWN_PEER_LEAVING:
                case PEER_ESTABL_CONTACT_EVT:
                case SELF_LOST_CONTACT_EVT:
                        break;
+               case NODE_SYNCH_END_EVT:
+               case NODE_SYNCH_BEGIN_EVT:
+               case NODE_FAILOVER_BEGIN_EVT:
+               case NODE_FAILOVER_END_EVT:
                default:
-                       pr_err("Unknown node fsm evt %x/%x\n", state, evt);
+                       goto illegal_evt;
                }
                break;
        case SELF_UP_PEER_COMING:
                case SELF_ESTABL_CONTACT_EVT:
                case PEER_LOST_CONTACT_EVT:
                        break;
+               case NODE_SYNCH_END_EVT:
+               case NODE_SYNCH_BEGIN_EVT:
+               case NODE_FAILOVER_BEGIN_EVT:
+               case NODE_FAILOVER_END_EVT:
                default:
-                       pr_err("Unknown node fsm evt %x/%x\n", state, evt);
+                       goto illegal_evt;
                }
                break;
        case SELF_COMING_PEER_UP:
                case SELF_LOST_CONTACT_EVT:
                case PEER_ESTABL_CONTACT_EVT:
                        break;
+               case NODE_SYNCH_END_EVT:
+               case NODE_SYNCH_BEGIN_EVT:
+               case NODE_FAILOVER_BEGIN_EVT:
+               case NODE_FAILOVER_END_EVT:
                default:
-                       pr_err("Unknown node fsm evt %x/%x\n", state, evt);
+                       goto illegal_evt;
                }
                break;
        case SELF_LEAVING_PEER_DOWN:
                case PEER_ESTABL_CONTACT_EVT:
                case PEER_LOST_CONTACT_EVT:
                        break;
+               case NODE_SYNCH_END_EVT:
+               case NODE_SYNCH_BEGIN_EVT:
+               case NODE_FAILOVER_BEGIN_EVT:
+               case NODE_FAILOVER_END_EVT:
+               default:
+                       goto illegal_evt;
+               }
+               break;
+       case NODE_FAILINGOVER:
+               switch (evt) {
+               case SELF_LOST_CONTACT_EVT:
+                       state = SELF_DOWN_PEER_LEAVING;
+                       break;
+               case PEER_LOST_CONTACT_EVT:
+                       state = SELF_LEAVING_PEER_DOWN;
+                       break;
+               case NODE_FAILOVER_END_EVT:
+                       state = SELF_UP_PEER_UP;
+                       break;
+               case NODE_FAILOVER_BEGIN_EVT:
+               case SELF_ESTABL_CONTACT_EVT:
+               case PEER_ESTABL_CONTACT_EVT:
+                       break;
+               case NODE_SYNCH_BEGIN_EVT:
+               case NODE_SYNCH_END_EVT:
                default:
-                       pr_err("Unknown node fsm evt %x/%x\n", state, evt);
+                       goto illegal_evt;
+               }
+               break;
+       case NODE_SYNCHING:
+               switch (evt) {
+               case SELF_LOST_CONTACT_EVT:
+                       state = SELF_DOWN_PEER_LEAVING;
+                       break;
+               case PEER_LOST_CONTACT_EVT:
+                       state = SELF_LEAVING_PEER_DOWN;
+                       break;
+               case NODE_SYNCH_END_EVT:
+                       state = SELF_UP_PEER_UP;
+                       break;
+               case NODE_FAILOVER_BEGIN_EVT:
+                       state = NODE_FAILINGOVER;
+                       break;
+               case NODE_SYNCH_BEGIN_EVT:
+               case SELF_ESTABL_CONTACT_EVT:
+               case PEER_ESTABL_CONTACT_EVT:
+                       break;
+               case NODE_FAILOVER_END_EVT:
+               default:
+                       goto illegal_evt;
                }
                break;
        default:
                pr_err("Unknown node fsm state %x\n", state);
                break;
        }
-
        n->state = state;
+       return;
+
+illegal_evt:
+       pr_err("Illegal node fsm evt %x in state %x\n", evt, state);
 }
 
 bool tipc_node_filter_skb(struct tipc_node *n, struct tipc_link *l,
 
        SELF_UP_PEER_COMING    = 0xac,
        SELF_COMING_PEER_UP    = 0xca,
        SELF_LEAVING_PEER_DOWN = 0x1d,
+       NODE_FAILINGOVER       = 0xf0,
+       NODE_SYNCHING          = 0xcc
 };
 
 enum {
-       SELF_ESTABL_CONTACT_EVT = 0xec,
-       SELF_LOST_CONTACT_EVT   = 0x1c,
-       PEER_ESTABL_CONTACT_EVT = 0xfec,
-       PEER_LOST_CONTACT_EVT   = 0xf1c
+       SELF_ESTABL_CONTACT_EVT = 0xece,
+       SELF_LOST_CONTACT_EVT   = 0x1ce,
+       PEER_ESTABL_CONTACT_EVT = 0xfece,
+       PEER_LOST_CONTACT_EVT   = 0xf1ce,
+       NODE_FAILOVER_BEGIN_EVT = 0xfbe,
+       NODE_FAILOVER_END_EVT   = 0xfee,
+       NODE_SYNCH_BEGIN_EVT    = 0xcbe,
+       NODE_SYNCH_END_EVT      = 0xcee
 };
 
 /* Flags used to take different actions according to flag type