anchor.diff:          fun(SlideOp, State) ->
                   abort_slide(State, SlideOp, target_down, false)
           end,
  -    safe_operation(WorkerFun, MyState, MoveFullId, all, both, crashed_node).
  +    safe_operation(WorkerFun, MyState, MoveFullId, all, crashed_node).
   
   %% @doc Creates a slide with the node's successor or predecessor. TargetId will
   %%      become the ID between the two nodes, i.e. either the current node or
  
positive.code:                              {move, timeout, slide_op:get_id(SlideOp)}),
                  dht_node_state:set_slide(State, PredOrSucc, SlideOp1)
          end,
      safe_operation(WorkerFun, MyState, MoveFullId, all, both, timeout);
  
  % no reply from the target node within get_wait_for_reply_timeout() ms
  process_move_msg({move, continue, MoveFullId, Operation, EmbeddedMsg} = _Msg, MyState) ->
  
negative.code:     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,
      MoveMsgTag::atom()) -> dht_node_state:state().
  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 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;
  