Index: pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c
===================================================================
--- pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c	(revision 799)
+++ pjproject/trunk/pjsip/src/pjsua-lib/pjsua_acc.c	(revision 881)
@@ -226,5 +226,4 @@
 	return status;
 
-
     /* Mark account as valid */
     pjsua_var.acc[acc_id].valid = PJ_TRUE;
@@ -259,5 +258,4 @@
 
     /* Must have a transport */
-    PJ_TODO(associate_acc_with_transport);
     PJ_ASSERT_RETURN(pjsua_var.tpdata[0].data.ptr != NULL, PJ_EINVALIDOP);
 
@@ -321,5 +319,5 @@
 {
     pjsua_acc_config cfg;
-    struct transport_data *t = &pjsua_var.tpdata[tid];
+    pjsua_transport_data *t = &pjsua_var.tpdata[tid];
     char uri[PJSIP_MAX_URL_SIZE];
 
@@ -383,5 +381,8 @@
     }
 
-    PJ_TODO(may_need_to_scan_calls);
+    /* Leave the calls intact, as I don't think calls need to
+     * access account once it's created
+     */
+
 
     PJSUA_UNLOCK();
@@ -492,4 +493,5 @@
     pj_status_t status;
 
+    PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
     acc = &pjsua_var.acc[acc_id];
 
@@ -539,4 +541,15 @@
     }
 
+    /* If account is locked to specific transport, then set transport to
+     * the client registration.
+     */
+    if (pjsua_var.acc[acc_id].cfg.transport_id != PJSUA_INVALID_ID) {
+	pjsip_tpselector tp_sel;
+
+	pjsua_init_tpselector(pjsua_var.acc[acc_id].cfg.transport_id, &tp_sel);
+	pjsip_regc_set_transport(acc->regc, &tp_sel);
+    }
+
+
     /* Set credentials
      */
@@ -641,4 +654,5 @@
 
     PJ_ASSERT_RETURN(info != NULL, PJ_EINVAL);
+    PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
     
     pj_bzero(info, sizeof(pjsua_acc_info));
@@ -855,5 +869,5 @@
 	pjsua_acc *acc = &pjsua_var.acc[acc_id];
 
-	if (pj_stricmp(&acc->user_part, &sip_uri->user)==0 &&
+	if (acc->valid && pj_stricmp(&acc->user_part, &sip_uri->user)==0 &&
 	    pj_stricmp(&acc->srv_domain, &sip_uri->host)==0) 
 	{
@@ -869,5 +883,5 @@
 	pjsua_acc *acc = &pjsua_var.acc[acc_id];
 
-	if (pj_stricmp(&acc->srv_domain, &sip_uri->host)==0) {
+	if (acc->valid && pj_stricmp(&acc->srv_domain, &sip_uri->host)==0) {
 	    /* Match ! */
 	    PJSUA_UNLOCK();
@@ -876,10 +890,21 @@
     }
 
-    /* No matching account, try match user part only. */
+    /* No matching account, try match user part (and transport type) only. */
     for (i=0; i < pjsua_var.acc_cnt; ++i) {
 	unsigned acc_id = pjsua_var.acc_ids[i];
 	pjsua_acc *acc = &pjsua_var.acc[acc_id];
 
-	if (pj_stricmp(&acc->user_part, &sip_uri->user)==0) {
+	if (acc->valid && pj_stricmp(&acc->user_part, &sip_uri->user)==0) {
+
+	    if (acc->cfg.transport_id != PJSUA_INVALID_ID) {
+		pjsip_transport_type_e type;
+		type = pjsip_transport_get_type_from_name(&sip_uri->transport_param);
+		if (type == PJSIP_TRANSPORT_UNSPECIFIED)
+		    type = PJSIP_TRANSPORT_UDP;
+
+		if (pjsua_var.tpdata[acc->cfg.transport_id].type != type)
+		    continue;
+	    }
+
 	    /* Match ! */
 	    PJSUA_UNLOCK();
@@ -904,8 +929,10 @@
     pjsip_transport_type_e tp_type = PJSIP_TRANSPORT_UNSPECIFIED;
     pj_str_t local_addr;
+    pjsip_tpselector tp_sel;
     unsigned flag;
     int secure;
     int local_port;
     
+    PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
     acc = &pjsua_var.acc[acc_id];
 
@@ -946,7 +973,11 @@
     secure = (flag & PJSIP_TRANSPORT_SECURE) != 0;
 
+    /* Init transport selector. */
+    pjsua_init_tpselector(pjsua_var.acc[acc_id].cfg.transport_id, &tp_sel);
+
     /* Get local address suitable to send request from */
     status = pjsip_tpmgr_find_local_addr(pjsip_endpt_get_tpmgr(pjsua_var.endpt),
-					 pool, tp_type, &local_addr, &local_port);
+					 pool, tp_type, &tp_sel, 
+					 &local_addr, &local_port);
     if (status != PJ_SUCCESS)
 	return status;
@@ -991,8 +1022,10 @@
     pjsip_transport_type_e tp_type = PJSIP_TRANSPORT_UNSPECIFIED;
     pj_str_t local_addr;
+    pjsip_tpselector tp_sel;
     unsigned flag;
     int secure;
     int local_port;
     
+    PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
     acc = &pjsua_var.acc[acc_id];
 
@@ -1039,7 +1072,11 @@
     secure = (flag & PJSIP_TRANSPORT_SECURE) != 0;
 
+    /* Init transport selector. */
+    pjsua_init_tpselector(pjsua_var.acc[acc_id].cfg.transport_id, &tp_sel);
+
     /* Get local address suitable to send request from */
     status = pjsip_tpmgr_find_local_addr(pjsip_endpt_get_tpmgr(pjsua_var.endpt),
-					 pool, tp_type, &local_addr, &local_port);
+					 pool, tp_type, &tp_sel,
+					 &local_addr, &local_port);
     if (status != PJ_SUCCESS)
 	return status;
@@ -1065,3 +1102,18 @@
 
 
-
+PJ_DEF(pj_status_t) pjsua_acc_set_transport( pjsua_acc_id acc_id,
+					     pjsua_transport_id tp_id)
+{
+    pjsua_acc *acc;
+
+    PJ_ASSERT_RETURN(pjsua_acc_is_valid(acc_id), PJ_EINVAL);
+    acc = &pjsua_var.acc[acc_id];
+
+    PJ_ASSERT_RETURN(tp_id >= 0 && tp_id < PJ_ARRAY_SIZE(pjsua_var.tpdata),
+		     PJ_EINVAL);
+    
+    acc->cfg.transport_id = tp_id;
+
+    return PJ_SUCCESS;
+}
+
