anchor.diff:  
   %% userdevguide-begin rt_frtchord:types
   -type key_t() :: 0..16#FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF. % 128 bit numbers
  --type rt_t() :: Succ::node:node_type().
  --type external_rt_t() :: Succ::node:node_type().
  +-type external_rt_t() :: gb_tree().
   -type custom_message() :: {get_rt, SourcePID :: comm:mypid()}.
   
   % define the possible types of nodes in the routing table:
   %  - normal nodes are nodes which have been added by entry learning
   %  - source is the node at which this RT is
   %  - sticky is a node which is not to be deleted with entry filtering
  --type node_type() :: 'normal' | 'source' | 'sticky'.
  +-type entry_type() :: normal | source | sticky.
   -record(rt_entry, {
  -        node :: rt_t()
  -        , type :: node_type()
  +        node :: node:node_type()
  +        , id :: key()
  +        , type :: entry_type()
           , spacing = 0.0 :: float() % canonical space around a node
  -        , adjacent_fingers = {undefined, undefined} :: {rt_t() | 'undefined',
  -                                                        rt_t() | 'undefined'}
  +        , adjacent_fingers = {undefined, undefined} ::
  +            {#rt_entry{} | 'undefined', #rt_entry{} | 'undefined'}
   
       }).
   
   -opaque(rt_entry() :: #rt_entry{}).
  +
  +-record(rt_t, {
  +        source = undefined :: key() | undefined
  +        , nodes = gb_trees:empty() :: gb_tree()
  +    }).
  +
  +-opaque(rt_t() :: #rt_t{}).
  +
   %% userdevguide-end rt_frtchord:types
   
   % Note: must include rt_beh.hrl AFTER the type definitions for erlang < R13B04
   % to work.
   -include("rt_beh.hrl").
   
  +% @doc Maximum number of entries in a routing table
  +maximum_entries() -> 1000.
  +
  +
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   %% Key Handling
   %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
   %% userdevguide-begin rt_frtchord:empty
   %% @doc Creates an "empty" routing table containing the successor.
  --spec empty(nodelist:neighborhood()) -> rt().
  +add_sticky_nodes_to_rt([H|_] = List, RT) when is_tuple(H) ->
  +    lists:foldl(fun(Entry, Acc) ->
  +                add_sticky_entry(Entry, Acc)
  +        end, RT, List).
  +
   empty(Neighbors) -> 
       % enter all known nodes as sticky entries into the gb tree
  -    EmptyRT = gb_trees:empty(),
  +    EmptyRT = #rt_t{},
       Preds = nodelist:preds(Neighbors),
       Succs = nodelist:succs(Neighbors),
  -    PredsAdded = lists:foldl(fun add_sticky_entry/2, EmptyRT, Preds),
  -    SuccsAndPredsAdded = lists:foldl(fun add_sticky_entry/2, PredsAdded, Succs),
  +    PredsAdded = add_sticky_nodes_to_rt(Preds, EmptyRT),
  +    SuccsAndPredsAdded = add_sticky_nodes_to_rt(Succs, PredsAdded),
       add_source_entry(nodelist:node(Neighbors), SuccsAndPredsAdded)
       .
   %% userdevguide-end rt_frtchord:empty
   
   % @doc Initialize the routing table. This function is allowed to send messages.
  --spec init(nodelist:neighborhood()) -> rt().
   init(Neighbors) -> 
       % ask the successor node for its routing table
       % XXX i have to wrap the message as the Pid given as the succ is actually the dht
  
positive.code: %% userdevguide-begin rt_frtchord:handle_custom_message
  %% @doc Handle custom messages. The following messages can occur:
  %%      - TODO explain messages
  -spec handle_custom_message
      (custom_message() | any(), rt_loop:state_active()) -> unknown_event.
  
  % send the RT to a node asking for it
  handle_custom_message({get_rt, Pid}, State) ->
  
negative.code: %%      Begin==End, the whole key range is split in halves.
  %%      Beware: SplitFactor must be in [0, 1]; the final key will be rounded
  %%      down and may thus be Begin.
  get_split_key(Begin, _End, {Num, _Denom}) when Num == 0 -> Begin;
  get_split_key(_Begin, End, {Num, Denom}) when Num == Denom -> End;
  get_split_key(Begin, End, {Num, Denom}) ->
  