diff --git a/contrib/src/pjproject/rfc6544.patch b/contrib/src/pjproject/rfc6544.patch
index 72e0e00ed7356a2cfaae3bafd41deae5d1ffcc9f..cc8df7d1445406ea6ff408c3f3965002f15d8e88 100644
--- a/contrib/src/pjproject/rfc6544.patch
+++ b/contrib/src/pjproject/rfc6544.patch
@@ -25,7 +25,7 @@ on behalf of Savoir-faire Linux.
  pjnath/src/pjnath-test/concur_test.c    |    8 +-
  pjnath/src/pjnath-test/sess_auth.c      |   12 +-
  pjnath/src/pjnath-test/stun_sock_test.c |    7 +-
- pjnath/src/pjnath/ice_session.c         |  582 +++++++---
+ pjnath/src/pjnath/ice_session.c         |  586 +++++++---
  pjnath/src/pjnath/ice_strans.c          |  986 ++++++++++++-----
  pjnath/src/pjnath/nat_detect.c          |   12 +-
  pjnath/src/pjnath/stun_session.c        |   12 +-
@@ -38,7 +38,7 @@ on behalf of Savoir-faire Linux.
  pjnath/src/pjturn-srv/server.c          |    2 +-
  pjsip-apps/src/samples/icedemo.c        |  671 +++++++-----
  pjsip/src/pjsua-lib/pjsua_core.c        |    8 +-
- 22 files changed, 2989 insertions(+), 1104 deletions(-)
+ 22 files changed, 2993 insertions(+), 1104 deletions(-)
 
 diff --git a/pjnath/include/pjnath/config.h b/pjnath/include/pjnath/config.h
 index fc1e27550..6f17a663b 100644
@@ -858,7 +858,7 @@ index fff4fad26..a54df74dc 100644
  	app_perror("    error: server sending data", status);
  	ret = -390;
 diff --git a/pjnath/src/pjnath/ice_session.c b/pjnath/src/pjnath/ice_session.c
-index c51dba771..0301c5c7b 100644
+index c51dba771..04cee7700 100644
 --- a/pjnath/src/pjnath/ice_session.c
 +++ b/pjnath/src/pjnath/ice_session.c
 @@ -1,5 +1,5 @@
@@ -1157,7 +1157,7 @@ index c51dba771..0301c5c7b 100644
      /* Attach data to be retrieved later when STUN request transaction
       * completes and on_stun_request_complete() callback is called.
       */
-@@ -1796,57 +1898,98 @@ static pj_status_t perform_check(pj_ice_sess *ice,
+@@ -1796,57 +1898,102 @@ static pj_status_t perform_check(pj_ice_sess *ice,
      msg_data->data.req.ckid = check_id;
  
      /* Add PRIORITY */
@@ -1218,7 +1218,6 @@ index c51dba771..0301c5c7b 100644
 +    if (lcand->transport == PJ_CAND_UDP) {
 +        status = send_connectivity_check(ice, clist, check_id, nominate, msg_data);
 +    } else if (lcand->transport == PJ_CAND_TCP_ACTIVE) {
-+
 +        if (check->state == PJ_ICE_SESS_CHECK_STATE_NEEDS_RETRY) {
 +            status = (*ice->cb.reconnect_tcp_connection)(ice, clist, check_id);
 +        } else if (check->state == PJ_ICE_SESS_CHECK_STATE_NEEDS_FIRST_PACKET) {
@@ -1237,16 +1236,21 @@ index c51dba771..0301c5c7b 100644
 +                pj_assert(!"Not expected any timer active");
 +            }
 +        }
-+    } else if (lcand->transport == PJ_CAND_TCP_PASSIVE && lcand->type == PJ_ICE_CAND_TYPE_RELAYED) {
-+        pj_timer_heap_cancel_if_active(ice->stun_cfg.timer_heap, &ice->timer, TIMER_NONE);
-+        status = (*ice->cb.select_turn_dataconn)(ice, clist, check_id);
-+        if (ice->timer.id == TIMER_NONE) {
-+            pj_time_val delay = {0, 0};
-+            delay.msec = 1500;
-+            pj_time_val_normalize(&delay);
-+            pj_timer_heap_schedule_w_grp_lock(
-+                ice->stun_cfg.timer_heap, &ice->timer, &delay,
-+                TIMER_CONNECTION_TIMEOUT, ice->grp_lock);
++    } else {
++        // TCP PASSIVE
++        if (lcand->type == PJ_ICE_CAND_TYPE_RELAYED) {
++            pj_timer_heap_cancel_if_active(ice->stun_cfg.timer_heap, &ice->timer, TIMER_NONE);
++            status = (*ice->cb.select_turn_dataconn)(ice, clist, check_id);
++            if (ice->timer.id == TIMER_NONE) {
++                pj_time_val delay = {0, 0};
++                delay.msec = 1500;
++                pj_time_val_normalize(&delay);
++                pj_timer_heap_schedule_w_grp_lock(
++                    ice->stun_cfg.timer_heap, &ice->timer, &delay,
++                    TIMER_CONNECTION_TIMEOUT, ice->grp_lock);
++            }
++        } else {
++            status = send_connectivity_check(ice, clist, check_id, nominate, msg_data);
 +        }
      }
 +#else
@@ -1290,7 +1294,7 @@ index c51dba771..0301c5c7b 100644
  }
  
  
-@@ -1882,44 +2025,101 @@ static pj_status_t start_periodic_check(pj_timer_heap_t *th,
+@@ -1882,44 +2029,101 @@ static pj_status_t start_periodic_check(pj_timer_heap_t *th,
      LOG5((ice->obj_name, "Starting checklist periodic check"));
      pj_log_push_indent();
  
@@ -1415,7 +1419,7 @@ index c51dba771..0301c5c7b 100644
      }
  
      /* Cannot start check because there's no suitable candidate pair.
-@@ -1936,8 +2136,7 @@ static pj_status_t start_periodic_check(pj_timer_heap_t *th,
+@@ -1936,8 +2140,7 @@ static pj_status_t start_periodic_check(pj_timer_heap_t *th,
      pj_grp_lock_release(ice->grp_lock);
      pj_log_pop_indent();
      return PJ_SUCCESS;
@@ -1425,7 +1429,7 @@ index c51dba771..0301c5c7b 100644
  
  /* Start sending connectivity check with USE-CANDIDATE */
  static void start_nominated_check(pj_ice_sess *ice)
-@@ -2109,13 +2308,13 @@ PJ_DEF(pj_status_t) pj_ice_sess_start_check(pj_ice_sess *ice)
+@@ -2109,13 +2312,13 @@ PJ_DEF(pj_status_t) pj_ice_sess_start_check(pj_ice_sess *ice)
      /* First, perform all pending triggered checks, simultaneously. */
      rcheck = ice->early_check.next;
      while (rcheck != &ice->early_check) {
@@ -1446,7 +1450,7 @@ index c51dba771..0301c5c7b 100644
      }
      pj_list_init(&ice->early_check);
  
-@@ -2161,7 +2360,7 @@ static pj_status_t on_stun_send_msg(pj_stun_session *sess,
+@@ -2161,7 +2364,7 @@ static pj_status_t on_stun_send_msg(pj_stun_session *sess,
  	/* Stray retransmit timer that could happen while
  	 * we're being destroyed */
  	pj_grp_lock_release(ice->grp_lock);
@@ -1455,7 +1459,7 @@ index c51dba771..0301c5c7b 100644
      }
  
      status = (*ice->cb.on_tx_pkt)(ice, sd->comp_id, msg_data->transport_id,
-@@ -2171,6 +2370,145 @@ static pj_status_t on_stun_send_msg(pj_stun_session *sess,
+@@ -2171,6 +2374,145 @@ static pj_status_t on_stun_send_msg(pj_stun_session *sess,
      return status;
  }
  
@@ -1601,7 +1605,7 @@ index c51dba771..0301c5c7b 100644
  
  /* This callback is called when outgoing STUN request completed */
  static void on_stun_request_complete(pj_stun_session *stun_sess,
-@@ -2401,7 +2739,8 @@ static void on_stun_request_complete(pj_stun_session *stun_sess,
+@@ -2401,7 +2743,8 @@ static void on_stun_request_complete(pj_stun_session *stun_sess,
  				      &check->lcand->base_addr, 
  				      &check->lcand->base_addr,
  				      pj_sockaddr_get_len(&xaddr->sockaddr),
@@ -1611,7 +1615,7 @@ index c51dba771..0301c5c7b 100644
  	if (status != PJ_SUCCESS) {
  	    check_set_state(ice, check, PJ_ICE_SESS_CHECK_STATE_FAILED, 
  			    status);
-@@ -2516,8 +2855,8 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
+@@ -2516,8 +2859,8 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
      pj_grp_lock_acquire(ice->grp_lock);
  
      if (ice->is_destroying) {
@@ -1622,7 +1626,7 @@ index c51dba771..0301c5c7b 100644
      }
  
      /*
-@@ -2532,9 +2871,9 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
+@@ -2532,9 +2875,9 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
      prio_attr = (pj_stun_priority_attr*)
  	        pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_PRIORITY, 0);
      if (prio_attr == NULL) {
@@ -1635,7 +1639,7 @@ index c51dba771..0301c5c7b 100644
      }
  
      /* Get USE-CANDIDATE attribute */
-@@ -2579,7 +2918,7 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
+@@ -2579,7 +2922,7 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
  				    NULL, token, PJ_TRUE, 
  				    src_addr, src_addr_len);
  	    pj_grp_lock_release(ice->grp_lock);
@@ -1644,7 +1648,7 @@ index c51dba771..0301c5c7b 100644
  	}
  
      } else if (ice->role == PJ_ICE_SESS_ROLE_CONTROLLED &&
-@@ -2591,7 +2930,7 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
+@@ -2591,7 +2934,7 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
  				    NULL, token, PJ_TRUE, 
  				    src_addr, src_addr_len);
  	    pj_grp_lock_release(ice->grp_lock);
@@ -1653,7 +1657,7 @@ index c51dba771..0301c5c7b 100644
  	} else {
  	    /* Switch role to controlled */
  	    LOG4((ice->obj_name, 
-@@ -2606,7 +2945,7 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
+@@ -2606,7 +2949,7 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
      status = pj_stun_session_create_res(sess, rdata, 0, NULL, &tdata);
      if (status != PJ_SUCCESS) {
  	pj_grp_lock_release(ice->grp_lock);
@@ -1662,7 +1666,7 @@ index c51dba771..0301c5c7b 100644
      }
  
      if (((pj_sockaddr *)src_addr)->addr.sa_family == pj_AF_INET6()) {
-@@ -2663,9 +3002,9 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
+@@ -2663,9 +3006,9 @@ static pj_status_t on_stun_rx_request(pj_stun_session *sess,
      msg_data->has_req_data = PJ_FALSE;
  
      /* Send the response */
@@ -1675,7 +1679,7 @@ index c51dba771..0301c5c7b 100644
  
      /* 
       * Handling early check.
-@@ -2784,14 +3123,16 @@ static void handle_incoming_check(pj_ice_sess *ice,
+@@ -2784,14 +3127,16 @@ static void handle_incoming_check(pj_ice_sess *ice,
      /* Just get candidate with the highest priority and same transport ID
       * for the specified  component ID in the checklist.
       */
@@ -1700,7 +1704,7 @@ index c51dba771..0301c5c7b 100644
      }
      if (lcand == NULL) {
  	/* Should not happen, but just in case remote is sending a
-@@ -2814,9 +3155,9 @@ static void handle_incoming_check(pj_ice_sess *ice,
+@@ -2814,9 +3159,9 @@ static void handle_incoming_check(pj_ice_sess *ice,
       * have this pair in our checklist.
       */
      for (i=0; i<ice->clist.count; ++i) {
@@ -1713,7 +1717,7 @@ index c51dba771..0301c5c7b 100644
      }
  
      /* If the pair is already on the check list:
-@@ -2839,7 +3180,6 @@ static void handle_incoming_check(pj_ice_sess *ice,
+@@ -2839,7 +3184,6 @@ static void handle_incoming_check(pj_ice_sess *ice,
  	 * Note: DO NOT overwrite nominated flag if one is already set.
  	 */
  	c->nominated = ((rcheck->use_candidate) || c->nominated);
@@ -3004,7 +3008,7 @@ index 7b53aba74..2b006d918 100644
 +  return sess ? sess->conn_type : PJ_STUN_TP_UDP;
 +}
 diff --git a/pjnath/src/pjnath/stun_sock.c b/pjnath/src/pjnath/stun_sock.c
-index 7692e6c14..3b8d509ab 100644
+index 7692e6c14..daa24cc28 100644
 --- a/pjnath/src/pjnath/stun_sock.c
 +++ b/pjnath/src/pjnath/stun_sock.c
 @@ -1,5 +1,5 @@