anchor.diff:                      -> dht_node_state:state()),
       State::dht_node_state:state(), MoveFullId::slide_op:id(),
       WorkPhases::[slide_op:phase(),...] | all,
  -    MoveMsgTag::atom()) -> dht_node_state:state().
  -safe_operation(WorkerFun, State, MoveFullId, WorkPhases, MoveMsgTag) ->
  +    MoveMsgTag::atom(), IgnoreWrongNeighbor::boolean()) -> dht_node_state:state().
  +safe_operation(WorkerFun, State, MoveFullId, WorkPhases, MoveMsgTag, IgnoreWrongNeighbor) ->
       case get_slide(State, MoveFullId) of
           {_, _PredOrSucc, SlideOp} when MoveMsgTag =:= crashed_node ->
               WorkerFun(SlideOp, State);
  -        {ok, _PredOrSucc, SlideOp} ->
  +        {Status, _PredOrSucc, SlideOp} when Status =:= ok
  +          orelse (IgnoreWrongNeighbor andalso Status =:= wrong_neighbor)->
               case WorkPhases =:= all orelse lists:member(slide_op:get_phase(SlideOp), WorkPhases) of
                   true -> WorkerFun(SlideOp, State);
                   _    ->
  
positive.code:                 SlideOp1 = slide_op:reset_send_errors(SlideOp),
                  finish_delta1(State, SlideOp1, ChangedData)
          end,
      safe_operation(WorkerFun, MyState, MoveFullId, [wait_for_delta], delta);
  
  % acknowledgement from neighbor that its node received delta for the slide op
  % with the given id and information about how to continue
  
negative.code:                 SlideOp1 = slide_op:reset_send_errors(SlideOp),
                  update_rcv_data1(State, SlideOp1, MovingData, TargetId, NextOp)
          end,
      safe_operation(WorkerFun, MyState, MoveFullId, [wait_for_data, wait_for_other], data, false);
  
  % acknowledgement from neighbor that its node received data for the slide op with the given id
  process_move_msg({move, data_ack, MoveFullId} = _Msg, MyState) ->
  