anchor.diff:  
   config_lookup(Id, Key, ReportCfg) ->
       case lists:keyfind(Id, 1, ReportCfg) of
  -        false     -> false;
  -        {Id, Cfg} -> lists:keyfind(Key, 1, Cfg)
  +        false     -> lists:keyfind(Key, 1, config_defaults());
  +        {Id, Cfg} ->
  +            case lists:keyfind(Key, 1, Cfg) of
  +                false    -> lists:keyfind(Key, 1, config_defaults());
  +                CfgTuple -> CfgTuple
  +            end
       end.
  +
  +%% Generate a link that will trigger appropriate config update actions
  +%% in config_update above.
  +config_link(Id, Key, Data) ->
  +    lists:concat([Id, ".", Key, ".", Data]).
  +
  +%% Default settings for ReportCfg keys to use in case they are missing.
  +config_defaults() ->
  +    [ {sort, 1, ascending}
  +    , {show_table, false}
  +    ].
   
   invert_dir(ascending) -> descending;
   invert_dir(descending) -> ascending.
  
positive.code: -ifdef(TEST).
  
  config_lookup_test() ->
      ?assertEqual(false, config_lookup(myframeid, sort, [])),
      ?assertEqual(false, config_lookup(myframeid, sort, [{myframeid, []}])),
      ?assertEqual({sort, 3, ascending},
                   config_lookup(myframeid, sort,
                                 [{myframeid, [{sort, 3, ascending}]}])).
  
negative.code:       || {HeaderCell, N} <- HeaderSpec]}.
  
  frame_header_cell(Id, {Caption, AttrList}, N, Sort, true) ->
      Link = config_link(Id, sort, N),
      SortCaption = frame_header_caption(Caption, N, Sort),
      {th, AttrList, [{a, [{href, Link}], [{str, SortCaption}]}]};
  frame_header_cell(_Id, {Caption, AttrList},_N,_Sort, false) ->
  