anchor.diff:      Branch = sip_idgen:generate_branch(),
       Request2 = sip_message:with_branch(Branch, Request),
   
  -    % FIXME: We should start monitoring transaction in case of its failure...
  +    tx_demonitor(ReqInfo),
       {ok, TxPid} = sip_transaction:start_client_tx(Top, Request2, []),
  +    MonitorRef = erlang:monitor(process, TxPid),
   
       % Update request information
       ReqInfo2 = ReqInfo#request_info{destinations = Fallback,
                                       last_destination = Top,
                                       current_branch = Branch,
  -                                    current_tx = TxPid},
  +                                    tx_pid = TxPid,
  +                                    tx_monitor = MonitorRef},
       ok = store(ReqInfo2),
   
       % stop processing
       error_m:fail(processed).
   
  -%% FIXME: Rewrite...
   collect_redirects(ReqInfo, Response) ->
       % FIXME: handle expires
       CollectFun =
  
positive.code:     Cancel2 = sip_message:with_branch(Branch, Cancel),
  
      Destination = ReqInfo#request_info.last_destination,
      {ok, CancelTxPid} = sip_transaction:start_client_tx(Destination, Cancel2, [{tu, none}]),
  
      ok = store(ReqInfo#request_info{cancel = true, cancel_tx = CancelTxPid}).
  
  
  %%-----------------------------------------------------------------
  %% State management (functions that use process dictionary)
  
negative.code: 
  lookup_by_tx(TxPid) ->
      Requests = erlang:get(?REQUESTS),
      lists:keyfind(TxPid, #request_info.tx_pid, Requests).
  
  
  store(ReqInfo) ->
  