diff --git a/build/android/liblinphone_tester.mk b/build/android/liblinphone_tester.mk
index cada1aba4f9bd12625f8dcdb80669719bcf90715..a6a2ab5f54ff7c0b1d903fa55488308123dad58d 100644
--- a/build/android/liblinphone_tester.mk
+++ b/build/android/liblinphone_tester.mk
@@ -13,7 +13,8 @@ common_SRC_FILES := \
 	flexisip_tester.c \
 	tester.c \
 	remote_provisioning_tester.c \
-	quality_reporting_tester.c
+	quality_reporting_tester.c \
+	transport_tester.c
 
 common_C_INCLUDES += \
         $(LOCAL_PATH) \
diff --git a/build/wp8/LibLinphoneTester-native/LibLinphoneTester-native.vcxproj b/build/wp8/LibLinphoneTester-native/LibLinphoneTester-native.vcxproj
index 424044515295cb90fdf103e49675e04f15ee8732..0512be5177d8340af7f0172796f6b30d9f938ef8 100644
--- a/build/wp8/LibLinphoneTester-native/LibLinphoneTester-native.vcxproj
+++ b/build/wp8/LibLinphoneTester-native/LibLinphoneTester-native.vcxproj
@@ -105,6 +105,7 @@
     <ClCompile Include="..\..\..\tester\setup_tester.c" />
     <ClCompile Include="..\..\..\tester\stun_tester.c" />
     <ClCompile Include="..\..\..\tester\tester.c" />
+    <ClCompile Include="..\..\..\tester\transport_tester.c" />
     <ClCompile Include="linphone-tester-native.cpp">
       <CompileAsWinRT>true</CompileAsWinRT>
     </ClCompile>
@@ -153,4 +154,4 @@
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\WindowsPhone\v$(TargetPlatformVersion)\Microsoft.Cpp.WindowsPhone.$(TargetPlatformVersion).targets" />
-</Project>
\ No newline at end of file
+</Project>
diff --git a/coreapi/help/buddy_status.c b/coreapi/help/buddy_status.c
index 40db6458e12cb8feb76e06ea95a6a35c4c3efce7..34c6fcda3a536b7bf83ec77248b2d1e2e75dc9cb 100644
--- a/coreapi/help/buddy_status.c
+++ b/coreapi/help/buddy_status.c
@@ -1,7 +1,7 @@
 
 /*
 buddy_status
-Copyright (C) 2010  Belledonne Communications SARL 
+Copyright (C) 2010  Belledonne Communications SARL
 
 This program is free software; you can redistribute it and/or
 modify it under the terms of the GNU General Public License
@@ -73,7 +73,7 @@ static void new_subscription_requested (LinphoneCore *lc,  LinphoneFriend *frien
  * Registration state notification callback
  */
 static void registration_state_changed(struct _LinphoneCore *lc, LinphoneProxyConfig *cfg, LinphoneRegistrationState cstate, const char *message){
-		printf("New registration state %s for user id [%s] at proxy [%s]\n"
+		printf("New registration state %s for user id [%s] at proxy [%s]"
 				,linphone_registration_state_to_string(cstate)
 				,linphone_proxy_config_get_identity(cfg)
 				,linphone_proxy_config_get_addr(cfg));
@@ -104,7 +104,7 @@ int main(int argc, char *argv[]){
 #ifdef DEBUG
 	linphone_core_enable_logs(NULL); /*enable liblinphone logs.*/
 #endif
-	/* 
+	/*
 	 Fill the LinphoneCoreVTable with application callbacks.
 	 All are optional. Here we only use the both notify_presence_received and new_subscription_requested callbacks
 	 in order to get notifications about friend status.
diff --git a/coreapi/linphone_tunnel.cc b/coreapi/linphone_tunnel.cc
index 2e77bbd952cff6f64a2c93b8978a0f8eff7bf014..e7968d8d778c09b5706b88c1a2777af996646c26 100644
--- a/coreapi/linphone_tunnel.cc
+++ b/coreapi/linphone_tunnel.cc
@@ -55,6 +55,9 @@ static inline _LpConfig *config(LinphoneTunnel *tunnel){
 
 void linphone_tunnel_destroy(LinphoneTunnel *tunnel){
 	delete tunnel->manager;
+
+	ms_list_free_with_data(tunnel->config_list, (void (*)(void *))linphone_tunnel_config_destroy);
+
 	ms_free(tunnel);
 }
 
@@ -100,12 +103,12 @@ static LinphoneTunnelConfig *linphone_tunnel_config_from_string(const char *str)
 			break;
 		case 3:
 			delay = atoi(pch);
-			break;	
+			break;
 		default:
 			// Abort
 			pos = 0;
 			break;
-			
+
 		}
 		++pos;
 		pch = strtok(NULL, ":");
@@ -121,7 +124,7 @@ static LinphoneTunnelConfig *linphone_tunnel_config_from_string(const char *str)
 	if(pos == 4) {
 		linphone_tunnel_config_set_delay(tunnel_config, delay);
 	}
-	ms_free(dstr);	
+	ms_free(dstr);
 	return tunnel_config;
 }
 
@@ -152,12 +155,12 @@ static void linphone_tunnel_save_config(LinphoneTunnel *tunnel) {
 
 static void linphone_tunnel_add_server_intern(LinphoneTunnel *tunnel, LinphoneTunnelConfig *tunnel_config) {
 	if(linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config) == -1) {
-		bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config), 
+		bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config),
 			linphone_tunnel_config_get_port(tunnel_config));
 	} else {
-		bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config), 
-			linphone_tunnel_config_get_port(tunnel_config), 
-			linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config), 
+		bcTunnel(tunnel)->addServer(linphone_tunnel_config_get_host(tunnel_config),
+			linphone_tunnel_config_get_port(tunnel_config),
+			linphone_tunnel_config_get_remote_udp_mirror_port(tunnel_config),
 			linphone_tunnel_config_get_delay(tunnel_config));
 	}
 	tunnel->config_list = ms_list_append(tunnel->config_list, tunnel_config);
@@ -209,10 +212,10 @@ void linphone_tunnel_remove_server(LinphoneTunnel *tunnel, LinphoneTunnelConfig
 	MSList *elem = ms_list_find(tunnel->config_list, tunnel_config);
 	if(elem != NULL) {
 		tunnel->config_list = ms_list_remove(tunnel->config_list, tunnel_config);
-		linphone_tunnel_config_destroy(tunnel_config);		
+		linphone_tunnel_config_destroy(tunnel_config);
 		linphone_tunnel_refresh_config(tunnel);
 		linphone_tunnel_save_config(tunnel);
-	}	
+	}
 }
 
 const MSList *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){
@@ -221,11 +224,11 @@ const MSList *linphone_tunnel_get_servers(LinphoneTunnel *tunnel){
 
 void linphone_tunnel_clean_servers(LinphoneTunnel *tunnel){
 	bcTunnel(tunnel)->cleanServers();
-	
+
 	/* Free the list */
-	ms_list_for_each(tunnel->config_list, (void (*)(void *))linphone_tunnel_config_destroy); 
-	tunnel->config_list = ms_list_free(tunnel->config_list);
-	
+	ms_list_free_with_data(tunnel->config_list, (void (*)(void *))linphone_tunnel_config_destroy);
+	tunnel->config_list = NULL;
+
 	linphone_tunnel_save_config(tunnel);
 }
 
diff --git a/coreapi/linphonecall.c b/coreapi/linphonecall.c
index d39f0ba74b09bc25b494a22772771384167cae1e..04373a681e42acf7f42c78eb4b993a2849c92f5c 100644
--- a/coreapi/linphonecall.c
+++ b/coreapi/linphonecall.c
@@ -1563,7 +1563,11 @@ void linphone_call_init_audio_stream(LinphoneCall *call){
 	if (lc->rtptf){
 		RtpTransport *artp=lc->rtptf->audio_rtp_func(lc->rtptf->audio_rtp_func_data, call->media_ports[0].rtp_port);
 		RtpTransport *artcp=lc->rtptf->audio_rtcp_func(lc->rtptf->audio_rtcp_func_data, call->media_ports[0].rtcp_port);
-		rtp_session_set_transports(audiostream->ms.sessions.rtp_session,artp,artcp);
+		RtpTransport *meta_rtp;
+		RtpTransport *meta_rtcp;
+		meta_rtp_transport_new(&meta_rtp,TRUE,artp, 0);
+		meta_rtp_transport_new(&meta_rtcp,FALSE,artcp, 0);
+		rtp_session_set_transports(audiostream->ms.sessions.rtp_session,meta_rtp,meta_rtcp);
 	}
 
 	call->audiostream_app_evq = ortp_ev_queue_new();
diff --git a/mediastreamer2 b/mediastreamer2
index a8c09957733d1504744ac5388ecedddd9f5575ac..4d43eeedbcf715182325c27438106735593f4e8e 160000
--- a/mediastreamer2
+++ b/mediastreamer2
@@ -1 +1 @@
-Subproject commit a8c09957733d1504744ac5388ecedddd9f5575ac
+Subproject commit 4d43eeedbcf715182325c27438106735593f4e8e
diff --git a/oRTP b/oRTP
index 7ad100e9f3b28e6a37f5472f70c49500ec15f49e..509e86632b4a9544ff5d7ce57b66c89e3e384933 160000
--- a/oRTP
+++ b/oRTP
@@ -1 +1 @@
-Subproject commit 7ad100e9f3b28e6a37f5472f70c49500ec15f49e
+Subproject commit 509e86632b4a9544ff5d7ce57b66c89e3e384933
diff --git a/tester/Makefile.am b/tester/Makefile.am
index 348306bca51f2ae74f2c96fdb0be62ea591760ab..0306ea7a45a3fb94414bfab58976f812af7ea6ff 100644
--- a/tester/Makefile.am
+++ b/tester/Makefile.am
@@ -21,7 +21,8 @@ liblinphonetester_la_SOURCES = tester.c \
 				flexisip_tester.c \
 				stun_tester.c \
 				remote_provisioning_tester.c \
-				quality_reporting_tester.c
+				quality_reporting_tester.c \
+				transport_tester.c
 
 liblinphonetester_la_LDFLAGS= -no-undefined
 liblinphonetester_la_LIBADD= ../coreapi/liblinphone.la $(CUNIT_LIBS)
diff --git a/tester/call_tester.c b/tester/call_tester.c
index 55286937b9ce3c96ec02a7832ebe21028f82de73..9313c6f746a4f17dd5e41b7f914a9a82c1bb534b 100644
--- a/tester/call_tester.c
+++ b/tester/call_tester.c
@@ -266,7 +266,7 @@ bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr){
 	return call_with_params(caller_mgr,callee_mgr,NULL,NULL);
 }
 
-static void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2){
+void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2){
 	linphone_core_terminate_all_calls(m1->lc);
 	CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m1->stat.number_of_LinphoneCallEnd,1));
 	CU_ASSERT_TRUE(wait_for(m1->lc,m2->lc,&m2->stat.number_of_LinphoneCallEnd,1));
diff --git a/tester/liblinphone_tester.h b/tester/liblinphone_tester.h
index 9b2eeeb60a90aa734c4238ce5d59058843d72482..38aeafa4d7e5d738de7c031120ee1a4a6e84ec9d 100644
--- a/tester/liblinphone_tester.h
+++ b/tester/liblinphone_tester.h
@@ -58,6 +58,7 @@ extern test_suite_t flexisip_test_suite;
 extern test_suite_t stun_test_suite;
 extern test_suite_t remote_provisioning_test_suite;
 extern test_suite_t quality_reporting_test_suite;
+extern test_suite_t transport_test_suite;
 
 
 extern int liblinphone_tester_nb_test_suites(void);
@@ -239,6 +240,7 @@ bool_t call_with_params(LinphoneCoreManager* caller_mgr
 						, const LinphoneCallParams *caller_params
 						, const LinphoneCallParams *callee_params);
 bool_t call(LinphoneCoreManager* caller_mgr,LinphoneCoreManager* callee_mgr);
+void end_call(LinphoneCoreManager *m1, LinphoneCoreManager *m2);
 stats * get_stats(LinphoneCore *lc);
 LinphoneCoreManager *get_manager(LinphoneCore *lc);
 const char *liblinphone_tester_get_subscribe_content(void);
diff --git a/tester/tester.c b/tester/tester.c
index 5387983ade090c606f0cfd52fc6731c0b1e6770d..07ace695607365460f3e81b58cec797c9acdd9fc 100644
--- a/tester/tester.c
+++ b/tester/tester.c
@@ -370,6 +370,7 @@ void liblinphone_tester_init(void) {
 	add_test_suite(&flexisip_test_suite);
 	add_test_suite(&remote_provisioning_test_suite);
 	add_test_suite(&quality_reporting_test_suite);
+	add_test_suite(&transport_test_suite);
 }
 
 void liblinphone_tester_uninit(void) {
diff --git a/tester/transport_tester.c b/tester/transport_tester.c
new file mode 100644
index 0000000000000000000000000000000000000000..5d4b9ffaacd01897f8422094b33a356f12fe6136
--- /dev/null
+++ b/tester/transport_tester.c
@@ -0,0 +1,105 @@
+/*
+	liblinphone_tester - liblinphone test suite
+	Copyright (C) 2013  Belledonne Communications SARL
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 2 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include "CUnit/Basic.h"
+#include "linphonecore.h"
+#include "lpconfig.h"
+#include "private.h"
+#include "liblinphone_tester.h"
+
+static void call_with_transport_base(bool_t use_tunnel, LinphoneMediaEncryption encryption) {
+	if (linphone_core_tunnel_available()){
+		/*enabling the tunnel cause another REGISTER to be made*/
+		int pauline_register_count_expected = use_tunnel ? 2 : 1;
+		char *tmp_char;
+		LinphoneCoreManager *pauline = linphone_core_manager_new( "pauline_rc");
+		LinphoneCoreManager *marie = linphone_core_manager_new( "marie_rc");
+		LinphoneCall *pauline_call;
+
+		/*tunnel works only in UDP mode*/
+		LinphoneProxyConfig *proxy = linphone_core_get_default_proxy_config(pauline->lc);
+		LinphoneAddress *server_addr = linphone_address_new(linphone_proxy_config_get_server_addr(proxy));
+		LinphoneAddress *route = linphone_address_new(linphone_proxy_config_get_route(proxy));
+		linphone_proxy_config_edit(proxy);
+		linphone_address_set_transport(server_addr, LinphoneTransportUdp);
+		linphone_address_set_transport(route, LinphoneTransportUdp);
+		tmp_char = linphone_address_as_string(server_addr);
+		linphone_proxy_config_set_server_addr(proxy, tmp_char);
+		ms_free(tmp_char);
+		tmp_char = linphone_address_as_string(route);
+		linphone_proxy_config_set_route(proxy, tmp_char);
+		ms_free(tmp_char);
+
+		linphone_core_set_media_encryption(pauline->lc, encryption);
+
+		if (use_tunnel){
+			LinphoneTunnel *tunnel = linphone_core_get_tunnel(pauline->lc);
+			LinphoneTunnelConfig *config = linphone_tunnel_config_new();
+
+			linphone_tunnel_enable(tunnel, TRUE);
+			linphone_tunnel_config_set_host(config, "tunnel.linphone.org");
+			linphone_tunnel_config_set_port(config, 443);
+			linphone_tunnel_add_server(tunnel, config);
+		}
+		linphone_proxy_config_done(proxy);
+
+		CU_ASSERT_TRUE(wait_for(pauline->lc,NULL,&pauline->stat.number_of_LinphoneRegistrationOk,pauline_register_count_expected));
+		CU_ASSERT_TRUE(wait_for(marie->lc, NULL, &marie->stat.number_of_LinphoneRegistrationOk, 1));
+
+		CU_ASSERT_TRUE(call(pauline,marie));
+		pauline_call=linphone_core_get_current_call(pauline->lc);
+		CU_ASSERT_PTR_NOT_NULL(pauline_call);
+		if (pauline_call!=NULL){
+			CU_ASSERT_EQUAL(linphone_call_params_get_media_encryption(linphone_call_get_current_params(pauline_call)),
+				encryption);
+		}
+		end_call(pauline,marie);
+
+		linphone_address_destroy(server_addr);
+		linphone_address_destroy(route);
+		linphone_core_manager_destroy(pauline);
+		linphone_core_manager_destroy(marie);
+	}else{
+		ms_warning("Could not test %s because tunnel functionality is not available",__FUNCTION__);
+	}
+}
+
+static void call_with_tunnel(void) {
+	call_with_transport_base(TRUE,LinphoneMediaEncryptionNone);
+}
+
+static void call_with_tunnel_srtp(void) {
+	call_with_transport_base(TRUE,LinphoneMediaEncryptionSRTP);
+}
+
+test_t transport_tests[] = {
+	{ "Tunnel only", call_with_tunnel },
+	{ "Tunnel with SRTP", call_with_tunnel_srtp },
+};
+
+test_suite_t transport_test_suite = {
+	"Transport",
+	NULL,
+	NULL,
+	sizeof(transport_tests) / sizeof(transport_tests[0]),
+	transport_tests
+};