anchor.diff:      lists:reverse(Result).
   
   distribute_points(_Now, _Ps, [], _, Acc) -> Acc;
  -distribute_points(_Now, [], [Archive | _], APs, Acc) ->
  -    [{Archive, APs} | Acc];
  +distribute_points(_Now, [], Archives, APs, Acc) ->
  +    [{Archives, APs} | Acc];
   distribute_points(Now, [{TS, _}=P | Ps]=Pss, [Archive | As]=Ass, APs, Acc) ->
       Age = Now - TS,
       if Age >= Archive#whisper_archive.retention ->
              % point exceeds current archive's retention
              % -> pack up current archive with its points and
              % continue with next archive
  -           distribute_points(Now, Pss, As, [], [{Archive, APs} | Acc]);
  +           distribute_points(Now, Pss, As, [], [{Ass, APs} | Acc]);
          true ->
              distribute_points(Now, Ps, Ass, [P | APs], Acc)
       end.
  
positive.code:        true ->
             lager:debug("writing point-seq of len ~w: ~p", [Length, Bytes]),
             ok = write_at(IO, Bytes, Position)
      end,
  
      % TODO: propagate to lower archives (if necessary)
  
      ok.
  
  
  build_consecutive_points(Step, Points) ->
  
negative.code:     Archives = Metadata#whisper_metadata.archives,
      Distributed = distribute_points(Now, Points, Archives),
  
      lists:foreach(fun ({As, Ps}) ->
                            do_update_retention_points(IO, Metadata, As, Ps)
                    end, Distributed).
  
  
  do_update_retention_points(_IO, _Metadata, _Archives, []) -> ok;
  do_update_retention_points(IO, Metadata, [Archive | Lower], Points) ->
      Step = Archive#whisper_archive.seconds,
  
      % we combine all consecutive points (current-interval == last-interval + step)
  