diff --git a/mgw/MGCP_Test.ttcn b/mgw/MGCP_Test.ttcn
index 0cedb0e..ad564c1 100644
--- a/mgw/MGCP_Test.ttcn
+++ b/mgw/MGCP_Test.ttcn
@@ -2804,42 +2804,21 @@
 		setverdict(pass);
 	}
 
-	/* create two local RTP+IuUP emulations and pass data in both directions */
-	function f_tc_two_crcx_mdcx_and_iuup(charstring local_ip_a, charstring remote_ip_a,
-					    IuUP_RabFlowCombinationList rfcl_a,
-					    charstring local_ip_b, charstring remote_ip_b) runs on dummy_CT {
-		var RtpFlowData flow[2];
+	/* create two local emulations and pass data in both directions */
+	function f_two_crcx_mdcx_data_transfer(MgcpEndpoint ep, MgcpCallId call_id, inout RtpFlowData flow_a,
+					       inout RtpFlowData flow_b, boolean tear_down_rtp := true) runs on dummy_CT {
 		var RtpemStats stats[2];
 		var MgcpResponse resp;
-		var MgcpEndpoint ep := c_mgw_ep_rtpbridge & "2@" & c_mgw_domain;
-		var MgcpCallId call_id := '1227'H;
 		var integer num_pkts_tx[2];
 		var integer temp;
 
-		f_init(ep);
-
 		/* Create the first connection in receive only mode (RNC side, IuUP-Init active) */
-		flow[0] := valueof(t_RtpFlow(local_ip_a, remote_ip_a, 96, "VND.3GPP.IUFP/16000"));
-		flow[0].em.portnr := 10000;
-		flow[0].rtp_cfg := c_RtpemDefaultCfg;
-		flow[0].rtp_cfg.rx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
-		flow[0].rtp_cfg.tx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
-		flow[0].rtp_cfg.iuup_mode := true;
-		flow[0].rtp_cfg.iuup_cfg.active_init := true;
-		flow[0].rtp_cfg.iuup_cfg.rab_flow_combs := rfcl_a;
-		f_flow_create(RTPEM[0], ep, call_id, "recvonly", flow[0], true);
+		f_flow_create(RTPEM[0], ep, call_id, "recvonly", flow_a, true);
 		f_rtpem_mode(RTPEM[0], RTPEM_MODE_RXONLY);
 
 		/* Create the second connection. This connection will be also
-		 * in receive only mode (CN side, IuUP-Init passive) */
-		flow[1] := valueof(t_RtpFlow(local_ip_b, remote_ip_b, 96, "VND.3GPP.IUFP/16000"));
-		flow[1].em.portnr := 20000;
-		flow[1].rtp_cfg := c_RtpemDefaultCfg;
-		flow[1].rtp_cfg.rx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
-		flow[1].rtp_cfg.tx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
-		flow[1].rtp_cfg.iuup_mode := true;
-		flow[1].rtp_cfg.iuup_cfg.active_init := false;
-		f_flow_create(RTPEM[1], ep, call_id, "recvonly", flow[1], true);
+		 * in receive only mode (CN side, regular RTP) */
+		f_flow_create(RTPEM[1], ep, call_id, "recvonly", flow_b, true);
 		f_rtpem_mode(RTPEM[1], RTPEM_MODE_RXONLY);
 
 		/* The first leg starts transmitting */
@@ -2875,7 +2854,7 @@
 		f_rtpem_mode(RTPEM[0], RTPEM_MODE_BIDIR);
 		stats[1] := f_rtpem_stats_get(RTPEM[1]);
 		num_pkts_tx[1] := stats[1].num_pkts_tx;
-		f_flow_modify(RTPEM[0], ep, call_id, "sendrecv", flow[0]);
+		f_flow_modify(RTPEM[0], ep, call_id, "sendrecv", flow_a);
 		f_sleep(0.5);
 		stats[0] := f_rtpem_stats_get(RTPEM[0]);
 		if (stats[0].num_pkts_rx_err_disabled != 0) {
@@ -2894,7 +2873,7 @@
 		f_rtpem_mode(RTPEM[1], RTPEM_MODE_BIDIR);
 		stats[0] := f_rtpem_stats_get(RTPEM[0]);
 		num_pkts_tx[0] := stats[0].num_pkts_tx;
-		f_flow_modify(RTPEM[1], ep, call_id, "sendrecv", flow[1]);
+		f_flow_modify(RTPEM[1], ep, call_id, "sendrecv", flow_b);
 		f_sleep(2.0);
 
 		stats[0] := f_rtpem_stats_get(RTPEM[0]);
@@ -2916,8 +2895,44 @@
 		f_rtpem_stats_err_check(stats[1]);
 
 		/* Tear down */
-		f_flow_delete(RTPEM[0]);
-		f_flow_delete(RTPEM[1], ep, call_id);
+		if (tear_down_rtp) {
+			f_flow_delete(RTPEM[0]);
+			f_flow_delete(RTPEM[1], ep, call_id);
+		}
+		setverdict(pass);
+	}
+
+	/* create two local RTP+IuUP emulations and pass data in both directions */
+	function f_tc_two_crcx_mdcx_and_iuup(charstring local_ip_a, charstring remote_ip_a,
+					    IuUP_RabFlowCombinationList rfcl_a,
+					    charstring local_ip_b, charstring remote_ip_b) runs on dummy_CT {
+		var RtpFlowData flow[2];
+		var MgcpEndpoint ep := c_mgw_ep_rtpbridge & "2@" & c_mgw_domain;
+		var MgcpCallId call_id := '1227'H;
+
+		f_init(ep);
+
+		/* Create the first connection in receive only mode (RNC side, IuUP-Init active) */
+		flow[0] := valueof(t_RtpFlow(local_ip_a, remote_ip_a, 96, "VND.3GPP.IUFP/16000"));
+		flow[0].em.portnr := 10000;
+		flow[0].rtp_cfg := c_RtpemDefaultCfg;
+		flow[0].rtp_cfg.rx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
+		flow[0].rtp_cfg.tx_payloads[0].payload_type := flow[0].codec_descr[0].pt;
+		flow[0].rtp_cfg.iuup_mode := true;
+		flow[0].rtp_cfg.iuup_cfg.active_init := true;
+		flow[0].rtp_cfg.iuup_cfg.rab_flow_combs := rfcl_a;
+
+		/* Create the second connection. This connection will be also
+		 * in receive only mode (CN side, IuUP-Init passive) */
+		flow[1] := valueof(t_RtpFlow(local_ip_b, remote_ip_b, 96, "VND.3GPP.IUFP/16000"));
+		flow[1].em.portnr := 20000;
+		flow[1].rtp_cfg := c_RtpemDefaultCfg;
+		flow[1].rtp_cfg.rx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
+		flow[1].rtp_cfg.tx_payloads[0].payload_type := flow[1].codec_descr[0].pt;
+		flow[1].rtp_cfg.iuup_mode := true;
+		flow[1].rtp_cfg.iuup_cfg.active_init := false;
+
+		f_two_crcx_mdcx_data_transfer(ep, call_id, flow[0], flow[1], true);
 		setverdict(pass);
 	}
 	testcase TC_two_crcx_mdcx_and_iuup() runs on dummy_CT {
@@ -2945,12 +2960,8 @@
 					    IuUP_RabFlowCombinationList rfcl_a,
 					    charstring local_ip_b, charstring remote_ip_b) runs on dummy_CT {
 		var RtpFlowData flow[2];
-		var RtpemStats stats[2];
-		var MgcpResponse resp;
 		var MgcpEndpoint ep := c_mgw_ep_rtpbridge & "2@" & c_mgw_domain;
 		var MgcpCallId call_id := '1227'H;
-		var integer num_pkts_tx[2];
-		var integer temp;
 
 		f_init(ep);
 
@@ -2966,8 +2977,6 @@
 		flow[0].rtp_cfg.iuup_mode := true;
 		flow[0].rtp_cfg.iuup_cfg.active_init := true;
 		flow[0].rtp_cfg.iuup_cfg.rab_flow_combs := rfcl_a;
-		f_flow_create(RTPEM[0], ep, call_id, "recvonly", flow[0], true);
-		f_rtpem_mode(RTPEM[0], RTPEM_MODE_RXONLY);
 
 		/* Create the second connection. This connection will be also
 		 * in receive only mode (CN side, regular RTP) */
@@ -2980,85 +2989,8 @@
 		/* flow[0].rtp_cfg.rx_payloads[0].fixed_payload converted AMR-IuUP->AMR-BE-RTP*/
 		flow[1].rtp_cfg.rx_payloads[0].fixed_payload := 'f3d3ca2567ffae00607d713a0f45db225ed2938ccca60ccd066924f298f7b5b8'O;
 		flow[1].rtp_cfg.iuup_mode := false;
-		f_flow_create(RTPEM[1], ep, call_id, "recvonly", flow[1], true);
-		f_rtpem_mode(RTPEM[1], RTPEM_MODE_RXONLY);
 
-		/* The first leg starts transmitting */
-		f_rtpem_mode(RTPEM[0], RTPEM_MODE_TXONLY);
-		f_sleep(0.5);
-		stats[0] := f_rtpem_stats_get(RTPEM[0]);
-		if (stats[0].num_pkts_rx_err_disabled != 0) {
-			setverdict(fail, "received packets from MGW on recvonly connection 0");
-			mtc.stop;
-		}
-		stats[1] := f_rtpem_stats_get(RTPEM[1]);
-		if (stats[1].num_pkts_rx_err_disabled != 0) {
-			setverdict(fail, "received packets from MGW on recvonly connection 1");
-			mtc.stop;
-		}
-
-		/* The second leg starts transmitting a little later */
-		f_rtpem_mode(RTPEM[1], RTPEM_MODE_TXONLY);
-		f_sleep(1.0);
-		stats[0] := f_rtpem_stats_get(RTPEM[0]);
-		if (stats[0].num_pkts_rx_err_disabled != 0) {
-			setverdict(fail, "received packets from MGW on recvonly connection 0");
-			mtc.stop;
-		}
-		stats[1] := f_rtpem_stats_get(RTPEM[1]);
-		if (stats[1].num_pkts_rx_err_disabled != 0) {
-			setverdict(fail, "received packets from MGW on recvonly connection 1");
-			mtc.stop;
-		}
-
-		/* The first leg will now be switched into bidirectional
-		 * mode, but we do not expect any data coming back yet. */
-		f_rtpem_mode(RTPEM[0], RTPEM_MODE_BIDIR);
-		stats[1] := f_rtpem_stats_get(RTPEM[1]);
-		num_pkts_tx[1] := stats[1].num_pkts_tx;
-		f_flow_modify(RTPEM[0], ep, call_id, "sendrecv", flow[0]);
-		f_sleep(0.5);
-		stats[0] := f_rtpem_stats_get(RTPEM[0]);
-		if (stats[0].num_pkts_rx_err_disabled != 0) {
-			setverdict(fail, "received packets from MGW on recvonly connection 0");
-			mtc.stop;
-		}
-		stats[1] := f_rtpem_stats_get(RTPEM[1]);
-		if (stats[1].num_pkts_rx_err_disabled != 0) {
-			setverdict(fail, "received packets from MGW on recvonly connection 1");
-			mtc.stop;
-		}
-
-		/* When the second leg is switched into bidirectional mode
-		 * as well, then the MGW will connect the two together and
-		 * we should see RTP streams passing through from both ends. */
-		f_rtpem_mode(RTPEM[1], RTPEM_MODE_BIDIR);
-		stats[0] := f_rtpem_stats_get(RTPEM[0]);
-		num_pkts_tx[0] := stats[0].num_pkts_tx;
-		f_flow_modify(RTPEM[1], ep, call_id, "sendrecv", flow[1]);
-		f_sleep(2.0);
-
-		stats[0] := f_rtpem_stats_get(RTPEM[0]);
-		stats[1] := f_rtpem_stats_get(RTPEM[1]);
-
-		temp := stats[0].num_pkts_tx - num_pkts_tx[0] - stats[1].num_pkts_rx;
-		if (temp > 3 or temp < -3) {
-			setverdict(fail, "number of packets not within normal parameters:", temp);
-			mtc.stop;
-		}
-
-		temp := stats[1].num_pkts_tx - num_pkts_tx[1] - stats[0].num_pkts_rx;
-		if (temp > 3 or temp < -3) {
-			setverdict(fail, "number of packets not within normal parameters:", temp);
-			mtc.stop;
-		}
-
-		f_rtpem_stats_err_check(stats[0]);
-		f_rtpem_stats_err_check(stats[1]);
-
-		/* Tear down */
-		f_flow_delete(RTPEM[0]);
-		f_flow_delete(RTPEM[1], ep, call_id);
+		f_two_crcx_mdcx_data_transfer(ep, call_id, flow[0], flow[1], true);
 		setverdict(pass);
 	}
 	testcase TC_two_crcx_mdcx_and_iuup_rtp() runs on dummy_CT {
