anchor.diff:      {noreply, NewState};
   handle_info({gun_data, _ConnPid, StreamRef, fin, Data}, State) ->
       lager:info("[~p] Got final data for ~p: ~p", [State#state.target, StreamRef, Data]),
  -    NewState = manage_data(Data, StreamRef, true, State),
  -    {noreply, remove_stream(StreamRef, NewState)};
  +    NewState1 = manage_data(Data, StreamRef, true, State),
  +    {OldSub, NewState2} = remove_stream(StreamRef, NewState1),
  +    NewState = case OldSub of
  +        not_a_sub_stream ->
  +            NewState2;
  +        _ ->
  +            lager:info("Reconnect sub ~p", [OldSub]),
  +            add_subscriptions([OldSub], NewState2)
  +    end,
  +    {noreply, NewState};
   handle_info({'DOWN', _MRef, process, _ConnPid, Reason}, State) ->
       lager:error("[~p] Gun connection is dead because of a gun bug: ~p", [State#state.target, Reason]),
       {stop, Reason, ok, State};
  
positive.code: -record(stream, {
       gun_stream,
       event
  }).
  -type state() :: #state{}.
  
  
negative.code:     NewStreams = lists:keydelete(StreamRef, 2, Streams),
  
      SubStreams = State#state.subs_streams,
      {OldSubStream, NewSubStreams} = case lists:keytake(StreamRef, 2, SubStreams) of
          {value, Tuple, NewTuples} ->
              {Tuple, NewTuples};
          false ->
              {not_a_sub_stream, SubStreams}
      end,
  
      {OldSubStream, State#state{streams = NewStreams, subs_streams = NewSubStreams}}.
  
  -spec manage_data(binary(), any(), boolean(), state()) -> state().
  manage_data(Data, StreamRef, IsFin, State) ->
  