anchor.diff:      WorkerFun::fun((SlideOp::slide_op:slide_op(), State::dht_node_state:state())
                       -> dht_node_state:state()),
       State::dht_node_state:state(), MoveFullId::slide_op:id(),
  -    WorkPhases::[slide_op:phase(),...] | all, PredOrSuccExp::pred | succ | both,
  +    WorkPhases::[slide_op:phase(),...] | all,
       MoveMsgTag::atom()) -> dht_node_state:state().
  -safe_operation(WorkerFun, State, MoveFullId, WorkPhases, PredOrSuccExp, MoveMsgTag) ->
  +safe_operation(WorkerFun, State, MoveFullId, WorkPhases, MoveMsgTag) ->
       case get_slide(State, MoveFullId) of
           {_, _PredOrSucc, SlideOp} when MoveMsgTag =:= crashed_node ->
               WorkerFun(SlideOp, State);
  -        {ok, PredOrSucc, SlideOp} ->
  -            case PredOrSuccExp =:= both orelse PredOrSucc =:= PredOrSuccExp of
  -                true ->
  -                    case WorkPhases =:= all orelse lists:member(slide_op:get_phase(SlideOp), WorkPhases) of
  -                        true -> WorkerFun(SlideOp, State);
  -                        _    ->
  -                            log:log(info, "[ dht_node_move ~.0p ] unexpected message ~.0p received in phase ~.0p",
  -                                    [comm:this(), MoveMsgTag, slide_op:get_phase(SlideOp)]),
  -                            State
  -                    end;
  -                _ ->
  -                    % abort slide but do not notify the other node
  -                    % (this message should not have been received anyway!)
  -                    ErrorMsg = io_lib:format("~.0p received for a slide with ~s, but only expected for slides with~s~n",
  -                                             [MoveMsgTag, PredOrSucc, PredOrSuccExp]),
  -                    log:log(warn, "[ dht_node_move ~.0p ] ~.0p received for a slide with my ~s, but only expected for slides with ~s~n"
  -                                      "(operation: ~.0p)~n", [comm:this(), MoveMsgTag, PredOrSucc, PredOrSuccExp, SlideOp]),
  -                    abort_slide(State, SlideOp, {protocol_error, ErrorMsg}, false)
  +        {ok, _PredOrSucc, SlideOp} ->
  +            case WorkPhases =:= all orelse lists:member(slide_op:get_phase(SlideOp), WorkPhases) of
  +                true -> WorkerFun(SlideOp, State);
  +                _    ->
  +                    log:log(info, "[ dht_node_move ~.0p ] unexpected message ~.0p received in phase ~.0p",
  +                            [comm:this(), MoveMsgTag, slide_op:get_phase(SlideOp)]),
  +                    State
               end;
           not_found when MoveMsgTag =:= send_error_retry ->
               State;
  
positive.code:                                           MaxTransportEntries, MsgTag, NextOp)
                                  end
                          end,
                      safe_operation(WorkerFun, State, MoveFullId, [wait_for_other], both, slide);
                  _ ->
                      State
              end;
  
negative.code:                 SlideOp1 = slide_op:cancel_timer(SlideOp), % cancel previous timer
                  update_rcv_data1(State, SlideOp1, MovingData, TargetId, NextOp)
          end,
      safe_operation(WorkerFun, MyState, MoveFullId, [wait_for_data, wait_for_other], data);
  
  % 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) ->
  