anchor.diff:               comm:send_local(SourcePid, Message)
       end.
   
  +%% @doc Re-creates a slide operation with the given (updated) parameters.
  +%%      Note: assumes that such a slide does not already exist.
  +-spec update_existing_slide(
  +        OldSlideOp::slide_op:slide_op(), State::dht_node_state:state(),
  +        TargetId::?RT:key(), OtherMaxTransportEntries::unknown | pos_integer(),
  +        MsgTag::nomsg | slide | delta_ack | change_id | change_op,
  +        NextOp::slide_op:next_op()) -> dht_node_state:state().
  +update_existing_slide(OldSlideOp, State, TargetId, OtherMTE, MsgTag, NextOp) ->
  +    PredOrSucc = slide_op:get_predORsucc(OldSlideOp),
  +    MoveFullId = slide_op:get_id(OldSlideOp),
  +    SlideOp1 = slide_op:cancel_timer(OldSlideOp), % cancel previous timer
  +    % simply re-create the slide (TargetId or NextOp have changed)
  +    % note: fd:subscribe/2 will be called by exec_setup_slide_not_found
  +    fd:unsubscribe([node:pidX(slide_op:get_node(SlideOp1))], {move, MoveFullId}),
  +    State1 = dht_node_state:set_slide(State, PredOrSucc, null), % just in case
  +    % note: msg_fwd are stored in the slide and do not require additional removal
  +    State2 = dht_node_state:rm_db_range(State1, MoveFullId),
  +    Command = {ok, slide_op:get_type(SlideOp1)},
  +    exec_setup_slide_not_found(
  +      Command, State2, MoveFullId, slide_op:get_node(SlideOp1), TargetId,
  +      slide_op:get_tag(SlideOp1), OtherMTE, slide_op:get_source_pid(SlideOp1),
  +      MsgTag, NextOp).
  +
   %% @doc Aborts the given slide operation. Assume the SlideOp has already been
   %%      set in the dht_node and resets the according slide in its state to
   %%      null.
  
positive.code:         end,
      safe_operation(WorkerFun, MyState, MoveFullId, [wait_for_change_id], succ, change_id);
  
  process_move_msg({move, change_id, MoveFullId, TargetId, NextOp} = _Msg, MyState) ->
      ?TRACE1(_Msg, MyState),
      WorkerFun =
          fun(SlideOp, succ, State) ->
                  SlideOp1 = slide_op:cancel_timer(SlideOp), % cancel previous timer
                  % simply re-create the slide (TargetId or NextOp might have changed)
                  % note: fd:subscribe/2 will be called by exec_setup_slide_not_found
                  fd:unsubscribe([node:pidX(slide_op:get_node(SlideOp1))], {move, MoveFullId}),
                  State1 = dht_node_state:set_slide(State, succ, null), % just in case
                  Command = {ok, slide_op:get_type(SlideOp1)},
                  exec_setup_slide_not_found(
                    Command, State1, slide_op:get_id(SlideOp1), slide_op:get_node(SlideOp1),
                    TargetId, slide_op:get_tag(SlideOp1),
                    slide_op:get_other_max_entries(SlideOp1),
                    slide_op:get_source_pid(SlideOp1), change_id, NextOp)
          end,
      safe_operation(WorkerFun, MyState, MoveFullId, [wait_for_change_id], succ, change_id);
  
  
negative.code:         end,
      safe_operation(WorkerFun, MyState, MoveFullId, [wait_for_other], both, done);
  
  process_move_msg({move, change_op = MsgTag, MoveFullId, TargetId, NextOp} = _Msg, MyState) ->
      ?TRACE1(_Msg, MyState),
      WorkerFun =
          fun(SlideOp, pred, State) ->
                  update_existing_slide(
                    SlideOp, State, TargetId,
                    slide_op:get_other_max_entries(SlideOp), MsgTag, NextOp)
          end,
      safe_operation(WorkerFun, MyState, MoveFullId, [wait_for_change_op], pred, change_op);
  
  