anchor.diff:  rm_send_changes(Pid, cyclon, _OldNeighbors, NewNeighbors, _Reason) ->
       comm:send_local(Pid, {cb_reply, {gossip_cyclon, default}, {rm_changed, nodelist:node(NewNeighbors)}}).
   
  -
  +%% @doc Checks the current state. If the cache is empty or the current node is
  +%%      unknown, the local dht_node will be asked for these values and the check
  +%%      will be re-scheduled after 1s.
  +-spec check_state(state()) -> ok | fail.
  +check_state({Cache, _Node} = _State) ->
  +    % if the own node is unknown or the cache is empty (it should at least
  +    % contain the nodes predecessor and successor), request this information
  +    % from the local dht_node
  +    NeedsInfo = case cyclon_cache:size(Cache) of
  +                    0 -> [pred, succ];
  +                    _ -> []
  +                end,
  +    case NeedsInfo of
  +        [_|_] -> request_node_details(NeedsInfo),
  +                 fail;
  +        []    -> ok
  +    end.
  +
  +
  +%% @doc Sends the local node's dht_node a request to tell us some information
  +%%      about itself.
  +%%      The node will respond with a {get_node_details_response, NodeDetails}
  +%%      message, which will be envoloped and passed to this module through the
  +%%      gossip module.
  +-spec request_node_details([node_details:node_details_name()]) -> ok.
  +request_node_details(Details) ->
  +    DHT_Node = pid_groups:get_my(dht_node),
  +    This = comm:this(),
  +    EnvPid = comm:reply_as(This, 3, {cb_reply, {gossip_cyclon, default}, '_'}),
  +    case comm:is_valid(This) of
  +        true ->
  +            comm:send_local(DHT_Node, {get_node_details, EnvPid, Details});
  +        false -> ok
  +    end.
  +
  
positive.code: -spec select_reply_data(PData::data(), Ref::pos_integer(), Round::round(),
      State::state()) -> {discard_msg | ok | retry | send_back, state()}.
  select_reply_data(_PData, _Ref, _Round, State) ->
      %% cy_subset msg <=> p2p_exch msg -> seleft_reply_data()
      {ok, State}.
  
  
negative.code: %%      Called by the gossip module at the beginning of every cycle. <br/>
  %%      The selected exchange data is sent back to the gossip module as a message
  %%      of the form {selected_data, Instance, ExchangeData}.
  %%      gossip_trigger -> select_data() is equivalent to cy_shuffle in the old
  %%      cyclon module.
  -spec select_data(State::state()) -> {ok, state()}.
  select_data({Cache, Node}=State) ->
      ?TRACE_DEBUG("select__data", []),
      NewCache =
          case check_state(State) of
              fail ->
                  Cache;
              _    ->
                  monitor:proc_set_value(?MODULE, 'shuffle',
                                             fun(Old) -> rrd:add_now(1, Old) end),
                  Cache1 = cyclon_cache:inc_age(Cache),
                  {Cache2, NodeQ} = cyclon_cache:pop_oldest_node(Cache1),
                  Subset = cyclon_cache:get_random_subset(shuffle_length() - 1, Cache2),
                  ForSend = cyclon_cache:add_node(Node, 0, Subset),
                  %io:format("~p",[length(ForSend)]),
                  Pid = pid_groups:get_my(gossip),
                  comm:send_local(Pid, {selected_peer, instance(), {cy_cache, [NodeQ]}}),
                  comm:send_local(Pid, {selected_data, instance(), ForSend}),
                  Cache2
          end,
      {ok, {NewCache, Node}}.
  
  
  %% @doc Process the data from the requestor and select reply data. <br/>
  