anchor.diff:              %% dirty index view, must refresh anyways    
               gui_replace_until(BufBot,BL,#gres{state=SN,loop=Loop},State0); 
           (GuiBot == BufBot) ->
  -            %% gui is already there, noting to do       
  +            %% gui is already there, noting .. do       
               gui_nop(#gres{state=SN,loop=Loop},State0); 
           (Nav == raw) andalso (GuiBot < BufBot-GL) ->
               %% uninitialized view, must refresh    
               gui_replace_until(BufBot,BL,#gres{state=SN,loop=Loop},State0); 
  -        (Loop == '>|...') andalso (SN == tailing) ->
  +        (Loop == ">|...") andalso (SN == tailing) ->
               %% tailing should append (don't call this far from bottom of big buffer)                 
               gui_append(#gres{state=SN,loop=Loop},State0); 
           true ->
  -            %% jump to end and discard other cases (avoid scrolling big buffer)                 
  +            %% jump .. end and discard other cases (avoid scrolling big buffer)                 
               gui_replace_until(BufBot,BL,#gres{state=SN,loop=Loop},State0)
       end.
   
   serve_stack( _, #state{stack=undefined}=State) -> 
  -    % no stack, nothing to do
  +    % no stack, nothing .. do
       State;
   serve_stack( _, #state{nav=ind,bufBot=B,guiBot=B}=State) -> 
  -    % gui is current at the end of the boffer, no new interesting data, nothing to do
  +    % gui is current at the end of the buffer, no new interesting data, nothing .. do
       State;
  -serve_stack(SN, #state{stack={button,'>',RT}}=State0) ->
  -    % deferred forward can be executed now
  -    State1 = serve_fwd(SN,State0#state{replyTo=RT}),
  -    State1#state{stack=undefined};
  -serve_stack(SN, #state{bufCnt=BufCnt,stack={button,Target,RT}}=State0) when is_integer(Target), (BufCnt>=Target) ->
  +serve_stack(completed, #state{stack={"button","<",RT}}=State0) ->
  +    % deferred "button" can be executed for backward "button" "<" 
  +    % ?Log("~p stack exec ~p~n", [completed,"<"]),
  +    serve_top(completed,State0#state{stack=undefined,replyTo=RT});
  +serve_stack(completed, #state{stack={"button","<<",RT}}=State0) ->
  +    % deferred "button" can be executed for backward "button" "<<" 
  +    % ?Log("~p stack exec ~p~n", [completed,"<<"]),
  +    serve_top(completed,State0#state{stack=undefined,replyTo=RT});
  +serve_stack(completed, #state{stack={"button",_Button,RT}}=State0) ->
  +    % deferred "button" can be executed for forward buttons ">" ">>" ">|" ">|..."
  +    % ?Log("~p stack exec ~p~n", [completed,_Button]),
  +    serve_bot(completed,undefined,State0#state{stack=undefined,replyTo=RT});
  +serve_stack(SN, #state{stack={"button",">",RT},bl=BL,bufBot=BufBot,guiBot=GuiBot}=State0) ->
  +    case lists:member(GuiBot,keys_before(BufBot,BL-1,State0)) of
  +        false ->    % deferred forward can be executed now
  +                    % ?Log("~p stack exec ~p~n", [SN,">"]),
  +                    gui_append(#gres{state=SN},State0#state{stack=undefined,replyTo=RT});
  +        true ->     State0      % buffer has not grown by 1 full block yet, keep the stack
  +    end;
  +serve_stack(SN, #state{stack={"button",">>",RT},gl=GL,bufBot=BufBot,guiBot=GuiBot}=State0) ->
  +    case lists:member(GuiBot,keys_before(BufBot,GL-1,State0)) of
  +        false ->    % deferred forward can be executed now
  +                    % ?Log("~p stack exec ~p~n", [SN,">>"]),
  +                    serve_bot(SN,undefined,State0#state{stack=undefined, replyTo=RT});
  +        true ->     State0      % buffer has not grown by 1 full gui length yet, keep the stack
  +    end;
  +serve_stack(SN, #state{bufCnt=BufCnt,stack={"button",Target,RT}}=State0) when is_integer(Target), (BufCnt>=Target) ->
       % deferred target can be executed now
  -    State1 = serve_target(SN,Target,State0#state{replyTo=RT}),
  -    State1#state{stack=undefined};
  -serve_stack(completed, #state{stack={button,_,RT}}=State0) ->
  -    % deferred button can be executed now (one of the forward buttons '>' '>>' '>|' '>|...')
  -    State1 = serve_bot(complete,undefined,State0#state{replyTo=RT}),
  -    State1#state{stack=undefined};
  -serve_stack(tailing, #state{stack={button,'>|',RT}}=State0) ->
  -    % deferred button can be executed now
  -    State1 = serve_bot(tailing,undefined,State0#state{replyTo=RT}),
  -    State1#state{stack=undefined};
  -serve_stack(tailing, #state{bufBot=BufBot,guiBot=GuiBot,stack={button,'>|...',RT}}=State0) ->
  +    ?Log("~p stack exec ~p~n", [SN,Target]),
  +    serve_target(SN,Target,State0#state{stack=undefined,replyTo=RT});
  +serve_stack(tailing, #state{bl=BL,bufCnt=BufCnt,bufBot=BufBot,guiCnt=GuiCnt,guiBot=GuiBot,guiCol=GuiCol,stack={"button",">|...",RT}}=State0) ->
       if
  -        (BufBot == GuiBot) -> 
  -            % no new data, nothing to do, keep stack
  -            State0; 
  +        (BufCnt == 0) -> State0;                                    % no data, nothing .. do, keep stack
  +        (BufBot == GuiBot) andalso (GuiCol == false) -> State0;     % no new data, nothing .. do, keep stack
  +        (GuiCnt == 0) ->                                            % (re)initialize .. buffer bottom
  +            % ?Log("~p stack exec ~p~n", [tailing,">|..."]),
  +            serve_bot(tailing,">|...",State0#state{stack=undefined,replyTo=RT});
  +        (GuiCol == false) ->
  +            % ?Log("~p stack exec ~p~n", [tailing,">|..."]),
  +            gui_replace_from(GuiBot,BL,#gres{state=tailing,loop=">|..."},State0#state{stack=undefined,replyTo=RT});
           true ->
  -            % serve new data at the bottom of the buffer, ask client to come back
  -            State1 = serve_bot(tailing,'>|...',State0#state{replyTo=RT}),
  -            State1#state{stack=undefined}
  +            % serve new data at the bottom of the buffer, ask client .. come back
  +            % ?Log("~p stack exec ~p~n", [tailing,">|..."]),
  +            gui_append(#gres{state=tailing,loop=">|..."},State0#state{stack=undefined,replyTo=RT})
       end;
   serve_stack(_ , State) -> State.
   
  
positive.code:     end.
  
  reply_stack(_SN,ReplyTo, #state{stack=undefined}=State0) ->
      % stack is empty, nothing to do    
      State0#state{replyTo=ReplyTo};
  reply_stack(SN,ReplyTo, #state{stack={button,_Button,RT}}=State0) ->
      % stack is obsolete, overriden by new command, reply delayed request with nop    
      State1 = gui_nop(#gres{state=SN},State0#state{stack=undefined,replyTo=RT}),
      State1#state{replyTo=ReplyTo}.
  
negative.code:     [gui_row_expand(hd(ets:lookup(TableId, Id)), TableId, RowFun) || Id <- Ids].
  
  keys_before(_, 0, _) -> [];
  keys_before(Id, Limit, #state{nav=raw}=State) ->
      ids_before(Id, Limit, State);
  keys_before(Key, Limit, #state{nav=ind,indexId=IndexId}) ->
      case ets:select_reverse(IndexId,[{'$1',[{'<',{element,1,'$1'},{const,Key}}],[{element,1,'$1'}]}],Limit) of
          {Keys, _Cont} ->    lists:reverse(Keys);  
  