diff --git a/stp/STP_Tests_M3UA.ttcn b/stp/STP_Tests_M3UA.ttcn
index df861e0..96cd268 100644
--- a/stp/STP_Tests_M3UA.ttcn
+++ b/stp/STP_Tests_M3UA.ttcn
@@ -2,6 +2,7 @@
 
 /* Osmocom STP test suite in in TTCN-3
  * (C) 2019 Harald Welte <laforge@gnumonks.org>
+ * (C) 2024 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
  * All rights reserved.
  *
  * Released under the terms of GNU General Public License, Version 2 or
@@ -35,8 +36,8 @@
 
 import from STP_Tests_Common all;
 
-private const integer NR_M3UA := 3;	/* number of M3UA clients in ATS */
-private const integer NR_M3UA_SRV := 3;	/* number of M3UA servres in ATS */
+private const integer NR_M3UA := 4;	/* number of M3UA clients in ATS */
+private const integer NR_M3UA_SRV := 4;	/* number of M3UA servres in ATS */
 
 modulepar {
 	/* STP-side IP addresses */
@@ -46,43 +47,65 @@
 	M3uaConfigs mp_m3ua_configs := {
 		/* as-sender: One ASP within AS */
 		{
-			remote_sctp_port := 2905,
-			local_sctp_port := 9999,
+			use_tcp := false,
+			remote_port := 2905,
+			local_port := 9999,
 			point_code := 23,
 			routing_ctx := 1023
 		},
 		/* as-receiver: Two ASP within AS */
 		{
-			remote_sctp_port := 2905,
-			local_sctp_port := 10000,
+			use_tcp := false,
+			remote_port := 2905,
+			local_port := 10000,
 			point_code := 42,
 			routing_ctx := 1042
 		}, {
-			remote_sctp_port := 2905,
-			local_sctp_port := 10001,
+			use_tcp := false,
+			remote_port := 2905,
+			local_port := 10001,
 			point_code := 42,
 			routing_ctx := 1042
 		},
+		/* as-sender-tcp: One ASP within AS */
+		{
+			use_tcp := true,
+			remote_port := 2905,
+			local_port := 9999,
+			point_code := 123,
+			routing_ctx := 1123
+		},
 		/* as-client: One ASP within AS */
 		{
-			remote_sctp_port := 2906,
-			local_sctp_port := 10002,
+			use_tcp := false,
+			remote_port := 2906,
+			local_port := 10002,
 			point_code := 55,
 			routing_ctx := 1055
 		},
 		/* as-client60-norctx */
 		{
-			remote_sctp_port := 2907,
-			local_sctp_port := 11060,
+			use_tcp := false,
+			remote_port := 2907,
+			local_port := 11060,
 			point_code := 60,
 			routing_ctx := -
 		},
 		/* as-client61-norctx */
 		{
-			remote_sctp_port := 2907,
-			local_sctp_port := 11061,
+			use_tcp := false,
+			remote_port := 2907,
+			local_port := 11061,
 			point_code := 61,
 			routing_ctx := -
+		},
+		/* as-client-tcp: One ASP within AS */
+		{
+			use_tcp := true,
+			remote_port := 2906,
+			local_port := 10002,
+			point_code := 155,
+			routing_ctx := 1155
 		}
 	};
 	integer mp_recovery_timeout_msec := 2000;
@@ -90,10 +113,12 @@
 }
 
 type record M3uaConfig {
-	/* STP-side SCTP port for M3UA */
-	integer remote_sctp_port,
+	/* use TCP (true) or SCTP (false) */
+	boolean use_tcp,
+	/* STP-side SCTP (or TCP) port for M3UA */
+	integer remote_port,
 	/* local M3UA base port on TTCN3 side */
-	integer local_sctp_port,
+	integer local_port,
 	/* point code routed via this M3U */
 	integer point_code,
 	/* associated routing context */
@@ -136,7 +161,7 @@
 		sctpPeerAddrChange := ?
 	}
 }
-private template PortEvent tr_SctpConnOpened := {
+private template PortEvent tr_ConnOpened := {
 	connOpened := ?
 }
 
@@ -154,9 +179,13 @@
 		}
 }
 
-friend function f_M3UA_send(integer idx, template (present) PDU_M3UA msg, template integer stream := 0)
+friend function f_M3UA_send(integer idx, template (present) PDU_M3UA msg, integer stream := 0)
 runs on RAW_M3UA_CT {
-	M3UA[idx].send(t_M3UA_Send(g_m3ua_conn_id[idx], msg, stream));
+	if (mp_m3ua_configs[idx].use_tcp) {
+		M3UA[idx].send(t_M3UA_Send(g_m3ua_conn_id[idx], msg, omit));
+	} else {
+		M3UA[idx].send(t_M3UA_Send(g_m3ua_conn_id[idx], msg, stream));
+	}
 }
 
 friend function f_M3UA_exp(integer idx, template (present) PDU_M3UA msg) runs on RAW_M3UA_CT {
@@ -209,7 +238,7 @@
 	assocId := omit
 };
 
-friend function f_M3UA_connect(integer i) runs on RAW_M3UA_CT {
+friend function f_M3UA_connect_sctp(integer i) runs on RAW_M3UA_CT {
 	var Result res;
 	var Option opt_add_local_addrs;
 	var OptionList opt_list := {};
@@ -230,15 +259,15 @@
 
 	if (lengthof(mp_stp_m3ua_ip) > 1) {
 		for (var integer j := 1; j < lengthof(mp_stp_m3ua_ip); j := j + 1) {
-			var Socket sk := valueof(ts_Socket(mp_stp_m3ua_ip[j], m3cfg.remote_sctp_port));
+			var Socket sk := valueof(ts_Socket(mp_stp_m3ua_ip[j], m3cfg.remote_port));
 			opt_add_remote_addrs[j - 1] := sk;
 		}
 	} else {
 		opt_add_remote_addrs := omit;
 	}
 
-	res := M3UA_CodecPort_CtrlFunct.f_IPL4_connect(M3UA[i], mp_stp_m3ua_ip[0], m3cfg.remote_sctp_port,
-						       mp_local_m3ua_ip[0], m3cfg.local_sctp_port, 0,
+	res := M3UA_CodecPort_CtrlFunct.f_IPL4_connect(M3UA[i], mp_stp_m3ua_ip[0], m3cfg.remote_port,
+						       mp_local_m3ua_ip[0], m3cfg.local_port, 0,
 						       {sctp:=valueof(ts_SCTP(3, 0, opt_add_remote_addrs))},
 						       opt_list);
 	if (not ispresent(res.connId)) {
@@ -248,10 +277,47 @@
 	g_m3ua_conn_id[i] := res.connId;
 }
 
+friend function f_M3UA_connect_tcp(integer i) runs on RAW_M3UA_CT {
+	var M3uaConfig m3cfg := mp_m3ua_configs[i];
+	var Result res;
+
+	/* XXX: M3UA-over-TCP is not supported by osmo-stp <= 1.8.1 */
+	if (not Misc_Helpers.f_osmo_repo_is("nightly")) {
+		log("Not connect()ing m3cfg := ", m3cfg, " (not supported by IUT)");
+		g_m3ua_conn_id[i] := -1;
+		return;
+	}
+
+	if (lengthof(mp_local_m3ua_ip) == 0 or lengthof(mp_stp_m3ua_ip) == 0) {
+		setverdict(fail, "Empty local or remote address trying to connect TCP socket: ",
+			   mp_local_m3ua_ip, " / ", mp_stp_m3ua_ip);
+		mtc.stop;
+	}
+
+	res := M3UA_CodecPort_CtrlFunct.f_IPL4_connect(M3UA[i], mp_stp_m3ua_ip[0], m3cfg.remote_port,
+						       mp_local_m3ua_ip[0], m3cfg.local_port, 0,
+						       {tcp:={}});
+	if (not ispresent(res.connId)) {
+		setverdict(fail, "Could not connect M3UA socket, check your configuration");
+		mtc.stop;
+	}
+	g_m3ua_conn_id[i] := res.connId;
+	M3UA_CodecPort.f_set_tcp_segmentation(M3UA[i], res.connId);
+}
+
 friend function f_M3UA_close(integer i) runs on RAW_M3UA_CT {
 	var Result res;
-	res := M3UA_CodecPort_CtrlFunct.f_IPL4_close(M3UA[i], g_m3ua_conn_id[i], {sctp:=valueof(ts_SCTP)});
-	g_m3ua_conn_id[i] := 0;
+	if (g_m3ua_conn_id[i] < 0) {
+		log("Not close()ing m3cfg := ", mp_m3ua_configs[i], " (not connected)");
+		/* not connected */
+		return;
+	}
+	if (mp_m3ua_configs[i].use_tcp) {
+		res := M3UA_CodecPort_CtrlFunct.f_IPL4_close(M3UA[i], g_m3ua_conn_id[i], {tcp:={}});
+	} else {
+		res := M3UA_CodecPort_CtrlFunct.f_IPL4_close(M3UA[i], g_m3ua_conn_id[i], {sctp:=valueof(ts_SCTP)});
+	}
+	g_m3ua_conn_id[i] := -1;
 }
 
 friend function f_M3UA_listen(integer i) runs on RAW_M3UA_CT {
@@ -272,12 +338,20 @@
 		opt_list := {opt_add_local_addrs};
 	}
 
-	res := M3UA_CodecPort_CtrlFunct.f_IPL4_listen(M3UA[i], mp_local_m3ua_ip[0], m3cfg.local_sctp_port,
-						      {sctp:=valueof(ts_SCTP)}, opt_list);
+	if (mp_m3ua_configs[i].use_tcp) {
+		res := M3UA_CodecPort_CtrlFunct.f_IPL4_listen(M3UA[i], mp_local_m3ua_ip[0], m3cfg.local_port,
+							      {tcp:={}});
+	} else {
+		res := M3UA_CodecPort_CtrlFunct.f_IPL4_listen(M3UA[i], mp_local_m3ua_ip[0], m3cfg.local_port,
+							      {sctp:=valueof(ts_SCTP)}, opt_list);
+	}
 	if (not ispresent(res.connId)) {
 		setverdict(fail, "Could not bind M3UA socket, check your configuration");
 		mtc.stop;
 	}
+	if (mp_m3ua_configs[i].use_tcp) {
+		M3UA_CodecPort.f_set_tcp_segmentation(M3UA[i], res.connId);
+	}
 }
 
 friend function f_init_m3ua(boolean ignore_ssnm := true) runs on RAW_M3UA_CT {
@@ -292,7 +366,11 @@
 
 	for (i := 0; i < NR_M3UA; i:=i+1) {
 		map(self:M3UA[i], system:M3UA_CODEC_PT);
-		f_M3UA_connect(i);
+		if (mp_m3ua_configs[i].use_tcp) {
+			f_M3UA_connect_tcp(i);
+		} else {
+			f_M3UA_connect_sctp(i);
+		}
 	}
 }
 
@@ -311,15 +389,15 @@
 
 friend function f_init_m3ua_srv() runs on RAW_M3UA_CT {
 	var integer i;
-	var PortEvent sctp_evt;
+	var PortEvent port_evt;
 
 	for (i := NR_M3UA; i < NR_M3UA+NR_M3UA_SRV; i:=i+1) {
 		map(self:M3UA[i], system:M3UA_CODEC_PT);
 		/* bind+ listen */
 		f_M3UA_listen(i);
 		/* wait for accept() */
-		M3UA[i].receive(tr_SctpConnOpened) -> value sctp_evt {
-			g_m3ua_conn_id[i] := sctp_evt.connOpened.connId;
+		M3UA[i].receive(tr_ConnOpened) -> value port_evt {
+			g_m3ua_conn_id[i] := port_evt.connOpened.connId;
 		}
 	}
 }
@@ -527,7 +605,7 @@
 
 	/* verify traffic is routed from sender to new receiver */
 	const integer iter_per_asp := 5;
-	var integer num_rx[NR_M3UA] := { 0, 0, 0 };
+	var integer num_rx[NR_M3UA] := { 0, 0, 0, 0 };
 	for (i := 0; i < 2*iter_per_asp; i := i+1) {
 		var octetstring data := f_rnd_octstring_rnd_len(100);
 		var template (value) M3UA_Protocol_Data tx_pd;
@@ -1003,12 +1081,30 @@
 	f_M3UA_exp(0, tr_M3UA_SCON({adv_pc}, rctx0));
 }
 
+private function f_asp_cfg_str(charstring asp_name, in M3uaConfig cfg)
+return charstring {
+	var charstring str;
+
+	str := "asp " & asp_name;
+	str := str & " " & int2str(cfg.local_port);
+	str := str & " " & int2str(cfg.remote_port);
+	str := str & " m3ua";
+
+	if (cfg.use_tcp) {
+		str := str & " tcp";
+	}
+
+	return str;
+}
+
 private function f_quirk(charstring quirk) runs on RAW_M3UA_CT {
-	f_vty_config2(VTY, {"cs7 instance 0", "asp asp-client0 10002 2906 m3ua"}, "quirk " & quirk);
+	var charstring asp_cfg_str := f_asp_cfg_str("asp-client0", f_m3ua_srv_config(0));
+	f_vty_config2(VTY, {"cs7 instance 0", asp_cfg_str}, "quirk " & quirk);
 }
 
 private function f_no_quirk(charstring quirk) runs on RAW_M3UA_CT {
-	f_vty_config2(VTY, {"cs7 instance 0", "asp asp-client0 10002 2906 m3ua"}, "no quirk " & quirk);
+	var charstring asp_cfg_str := f_asp_cfg_str("asp-client0", f_m3ua_srv_config(0));
+	f_vty_config2(VTY, {"cs7 instance 0", asp_cfg_str}, "no quirk " & quirk);
 }
 
 /* quirk 'no_notify': Expect inbound connection from ASP/SCTP-client, followed by ASP-UP + ASP-ACT */
