Index: /pjproject/trunk/pjsip/include/pjsip/sip_transaction.h
===================================================================
--- /pjproject/trunk/pjsip/include/pjsip/sip_transaction.h	(revision 1189)
+++ /pjproject/trunk/pjsip/include/pjsip/sip_transaction.h	(revision 1190)
@@ -75,19 +75,4 @@
 
 /**
- * Transaction timeout timer policy, to control the UAC transaction timeout
- * scheduling (see #pjsip_tsx_set_uac_timeout()).
- */
-typedef enum pjsip_tsx_timeout_policy
-{
-    PJSIP_TSX_IGNORE_100 = 1,	/**< To make the UAC transaction NOT to cancel
-				     the timeout timer when 100 response is 
-				     received.*/
-    PJSIP_TSX_IGNORE_1xx = 3	/**< To make the UAC transaction NOT to cancel
-				     the timeout timer when any 1xx responses 
-				     are received. */
-} pjsip_tsx_timeout_policy;
-
-
-/**
  * This structure describes SIP transaction object. The transaction object
  * is used to handle both UAS and UAC transaction.
@@ -146,7 +131,4 @@
     pj_timer_entry		timeout_timer;  /**< Timeout timer.         */
 
-    unsigned			msec_timeout;	/**< User set timeout.	    */
-    pjsip_tsx_timeout_policy	timeout_policy;	/**< Timeout policy.	    */
-
     /** Module specific data. */
     void		       *mod_data[PJSIP_MAX_MODULE];
@@ -249,45 +231,4 @@
 					     const pjsip_tpselector *sel);
 
-
-/**
- * Set the UAC absolute transaction timeout. Normally UAC transaction will
- * stop its timeout timer (timer B for INVITE and timer F for non-INVITE
- * transactions) after a provisional response is received.
- *
- * When this timer is set, the transaction's timer B and F will use this
- * value, and if the \a flag flag is set, the transaction will continue
- * the scheduling of the timeout timer even when provisional response has
- * been received.
- *
- * Note that this function MUST be called AFTER the transaction has been
- * created AND BEFORE any request is transmitted.
- *
- * @param tsx	    The client/UAC transaction.
- * @param msec_time The timeout value, in miliseconds. Currently this
- *		    value must be non-zero (value zero is reserved for
- *		    future use).
- * @param flag	    Option flags to control whether the transaction should
- *		    cancel the timeout timer on arrival of provisional
- *		    responses (which is yes according to RFC 3261).
- *		    The valid values are:
- *		    - PJSIP_TSX_IGNORE_100, to make the UAC transaction
- *		      NOT to cancel the timeout timer when 100 response
- *		      is received.
- *		    - PJSIP_TSX_IGNORE_1xx, to make the UAC transaction
- *		      NOT to cancel the timeout timer when any 1xx 
- *		      responses are received.
- *
- *		    Note that regardless of the values in the \a flag 
- *		    argument, the provisional response would still be
- *		    delivered to transaction user and it will still
- *		    affect the transaction state. The \a flag flag only
- *		    changes the behavior of the timeout timer of the
- *		    transaction.
- */
-PJ_DECL(pj_status_t) pjsip_tsx_set_uac_timeout(pjsip_transaction *tsx,
-					       unsigned msec_time,
-					       pjsip_tsx_timeout_policy flag);
-
-
 /**
  * Call this function to manually feed a message to the transaction.
Index: /pjproject/trunk/pjsip/src/pjsip/sip_transaction.c
===================================================================
--- /pjproject/trunk/pjsip/src/pjsip/sip_transaction.c	(revision 1189)
+++ /pjproject/trunk/pjsip/src/pjsip/sip_transaction.c	(revision 1190)
@@ -133,4 +133,6 @@
 static const pj_time_val t1_timer_val = { PJSIP_T1_TIMEOUT/1000, 
                                           PJSIP_T1_TIMEOUT%1000 };
+static const pj_time_val t2_timer_val = { PJSIP_T2_TIMEOUT/1000, 
+                                          PJSIP_T2_TIMEOUT%1000 };
 static const pj_time_val t4_timer_val = { PJSIP_T4_TIMEOUT/1000, 
                                           PJSIP_T4_TIMEOUT%1000 };
@@ -1397,21 +1399,4 @@
 
 /*
- * Set the UAC absolute transaction timeout.
- */
-PJ_DEF(pj_status_t) pjsip_tsx_set_uac_timeout(pjsip_transaction *tsx,
-					      unsigned msec_time,
-					      pjsip_tsx_timeout_policy policy)
-{
-    PJ_ASSERT_RETURN(tsx && tsx->role==PJSIP_ROLE_UAC &&
-		     tsx->state==PJSIP_TSX_STATE_NULL, PJ_EINVALIDOP);
-
-    tsx->msec_timeout = msec_time;
-    tsx->timeout_policy = policy;
-
-    return PJ_SUCCESS;
-}
-
-
-/*
  * Set transaction status code and reason.
  */
@@ -1810,5 +1795,10 @@
     pj_assert((tsx->transport_flag & TSX_HAS_PENDING_TRANSPORT) == 0);
 
-    msec_time = (1 << (tsx->retransmit_count)) * PJSIP_T1_TIMEOUT;
+    pj_assert(tsx->status_code < 200);
+
+    if (tsx->status_code >= 100)
+	msec_time = PJSIP_T2_TIMEOUT;
+    else
+	msec_time = (1 << (tsx->retransmit_count)) * PJSIP_T1_TIMEOUT;
 
     if (tsx->role == PJSIP_ROLE_UAC) {
@@ -1914,20 +1904,8 @@
 
 	/* Start Timer B (or called timer F for non-INVITE) for transaction 
-	 * timeout. If user has configured the timeout value with 
-	 * pjsip_tsx_set_uac_timeout(), use the timeout value there.
+	 * timeout.
 	 */
-	if (tsx->msec_timeout > 0) {
-	    pj_time_val timeout;
-
-	    timeout.sec = tsx->msec_timeout / 1000;
-	    timeout.msec = tsx->msec_timeout % 1000;
-
-	    pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer, 
-					&timeout);
-
-	} else {
-	    pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer, 
-					&timeout_timer_val);
-	}
+	pjsip_endpt_schedule_timer( tsx->endpt, &tsx->timeout_timer, 
+				    &timeout_timer_val);
 
 	/* Start Timer A (or timer E) for retransmission only if unreliable 
@@ -2006,24 +1984,51 @@
 	    return PJSIP_ENOTRESPONSEMSG;
 
-	/* Cancel retransmission timer A. */
-	if (tsx->retransmit_timer._timer_id != -1) {
-	    pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer);
-	    tsx->retransmit_timer._timer_id = -1;
-	}
+	code = msg->line.status.code;
+
+	/* If the response is final, cancel both retransmission and timeout
+	 * timer.
+	 */
+	if (code >= 200) {
+	    if (tsx->retransmit_timer._timer_id != -1) {
+		pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer);
+		tsx->retransmit_timer._timer_id = -1;
+	    }
+
+	    if (tsx->timeout_timer._timer_id != -1) {
+		pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer);
+		tsx->timeout_timer._timer_id = -1;
+	    }
+
+	} else {
+	    /* Cancel retransmit timer (for non-INVITE transaction, the
+	     * retransmit timer will be rescheduled at T2.
+	     */
+	    if (tsx->retransmit_timer._timer_id != -1) {
+		pjsip_endpt_cancel_timer(tsx->endpt, &tsx->retransmit_timer);
+		tsx->retransmit_timer._timer_id = -1;
+	    }
+
+	    /* For provisional response, only cancel retransmit when this
+	     * is an INVITE transaction. For non-INVITE, section 17.1.2.1
+	     * of RFC 3261 says that:
+	     *	- retransmit timer is set to T2
+	     *	- timeout timer F is not deleted.
+	     */
+	    if (tsx->method.id == PJSIP_INVITE_METHOD) {
+
+		/* Cancel timeout timer */
+		pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer);
+
+	    } else {
+		if (!tsx->is_reliable) {
+		    pjsip_endpt_schedule_timer(tsx->endpt, 
+					       &tsx->retransmit_timer,
+					       &t2_timer_val);
+		}
+	    }
+	}
+	 
 	tsx->transport_flag &= ~(TSX_HAS_PENDING_RESCHED);
 
-
-	/* Cancel timer B (transaction timeout) but look at the timeout policy
-	 * as set by pjsip_tsx_set_uac_timeout().
-	 */
-	code = msg->line.status.code;
-	if ((code==100 && tsx->timeout_policy==PJSIP_TSX_IGNORE_100) ||
-	    (code<200 && tsx->timeout_policy==PJSIP_TSX_IGNORE_1xx))
-	{
-	    /* Don't cancel the timeout timer */
-	}
-	else {
-	    pjsip_endpt_cancel_timer(tsx->endpt, &tsx->timeout_timer);
-	}
 
 	/* Discard retransmission message if it is not INVITE.
@@ -2368,5 +2373,15 @@
 
     } else {
-	tsx_set_status_code(tsx, PJSIP_SC_TSX_TIMEOUT, NULL);
+	if (event->body.timer.entry == &tsx->retransmit_timer) {
+	    /* Retransmit message. */
+            pj_status_t status;
+
+            status = tsx_retransmit( tsx, 1 );
+	    
+	    return status;
+
+	} else {
+	    tsx_set_status_code(tsx, PJSIP_SC_TSX_TIMEOUT, NULL);
+	}
     }
 
Index: /pjproject/trunk/pjsip/src/pjsip/sip_util_statefull.c
===================================================================
--- /pjproject/trunk/pjsip/src/pjsip/sip_util_statefull.c	(revision 1189)
+++ /pjproject/trunk/pjsip/src/pjsip/sip_util_statefull.c	(revision 1190)
@@ -95,4 +95,5 @@
     PJ_ASSERT_RETURN(mod_stateful_util.id != -1, PJ_EINVALIDOP);
 
+    PJ_UNUSED_ARG(timeout);
 
     status = pjsip_tsx_create_uac(&mod_stateful_util, tdata, &tsx);
@@ -105,9 +106,4 @@
     tsx_data->token = token;
     tsx_data->cb = cb;
-
-    if (timeout >= 0) {
-	status = pjsip_tsx_set_uac_timeout(tsx, timeout, PJSIP_TSX_IGNORE_1xx);
-	pj_assert(status == PJ_SUCCESS);
-    }
 
     tsx->mod_data[mod_stateful_util.id] = tsx_data;
