anchor.diff:      {rm, init_check_ring, Token::non_neg_integer()} |
       {rm, notify_new_pred, NewPred::node:node_type()} |
       {rm, notify_new_succ, NewSucc::node:node_type()} |
  -    {rm, notify_slide_finished, IsSlide::slide()} |
  +    {rm, notify_slide_finished, SlideType::slide()} |
       {rm, leave} |
       {rm, pred_left, OldPred::node:node_type(), PredsPred::node:node_type()} |
       {rm, succ_left, OldSucc::node:node_type(), SuccsSucc::node:node_type()} |
  
positive.code: %% @doc Filter function for subscriptions that returns true if a
  %%      direct neighbor, i.e. pred, succ or base node, changed or a slide
  %%      operation finished.
  -spec subscribe_dneighbor_change_slide_filter(OldNeighbors::nodelist:neighborhood(), NewNeighbors::nodelist:neighborhood(), IsSlide::slide()) -> boolean().
  subscribe_dneighbor_change_slide_filter(OldNeighbors, NewNeighbors, IsSlide) ->
      IsSlide =/= none orelse
          nodelist:node(OldNeighbors) =/= nodelist:node(NewNeighbors) orelse
          nodelist:pred(OldNeighbors) =/= nodelist:pred(NewNeighbors) orelse
          nodelist:succ(OldNeighbors) =/= nodelist:succ(NewNeighbors).
  
negative.code: 
  %% @doc Inform the dht_node of a new neighborhood.
  -spec call_subscribers(OldNeighbors::nodelist:neighborhood(),
          NewNeighbors::nodelist:neighborhood(), SlideType::slide(),
          SubscrTable::tid()) -> ok.
  call_subscribers(OldNeighborhood, NewNeighborhood, SlideType, SubscrTable) ->
      call_subscribers_iter(OldNeighborhood, NewNeighborhood, SlideType, SubscrTable, ets:first(SubscrTable)).
  
  %% @doc Iterates over all susbcribers and calls their subscribed functions.
  -spec call_subscribers_iter(OldNeighbors::nodelist:neighborhood(),
          NewNeighbors::nodelist:neighborhood(), SlideType::slide(), SubscrTable::tid(),
          CurrentKey::{Pid::pid() | null, Tag::any()} | '$end_of_table') -> ok.
  call_subscribers_iter(_OldNeighborhood, _NewNeighborhood, _SlideType, _SubscrTable, '$end_of_table') ->
      ok;
  call_subscribers_iter(OldNeighborhood, NewNeighborhood, SlideType, SubscrTable, CurrentKey) ->
      % assume the key exists (it should since we are iterating over the table!)
      [SubscrTuple] = ets:lookup(SubscrTable, CurrentKey),
      call_subscribers_check(OldNeighborhood, NewNeighborhood, SlideType, SubscrTuple, SubscrTable),
      call_subscribers_iter(OldNeighborhood, NewNeighborhood, SlideType, SubscrTable,
                            ets:next(SubscrTable, CurrentKey)).
  
  %% @doc Checks whether FilterFun for the current subscription tuple is true
  %%      and executes ExecFun. Unsubscribes the tuple, if ExecFun has been
  %%      called MaxCalls times.
  -spec call_subscribers_check(OldNeighbors::nodelist:neighborhood(),
          NewNeighbors::nodelist:neighborhood(), SlideType::slide(),
          {{Pid::pid() | null, Tag::any()}, FilterFun::subscriber_filter_fun(),
           ExecFun::subscriber_exec_fun(), MaxCalls::pos_integer() | inf},
          SubscrTable::tid()) -> ok.
  call_subscribers_check(OldNeighborhood, NewNeighborhood, SlideType,
          {{Pid, Tag}, FilterFun, ExecFun, MaxCalls}, SubscrTable) ->
      case FilterFun(OldNeighborhood, NewNeighborhood, SlideType) of
          true -> ExecFun(Pid, Tag, OldNeighborhood, NewNeighborhood),
                  case MaxCalls of
                      inf -> ok;
  