diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 8d02c40..b1af138 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -5315,6 +5315,17 @@
  * PCU Socket related tests
  ***********************************************************************/
 
+/* Catch a PCUIF message (without having to use t_SD_PCUIF) */
+private altstep as_pcuif_msg(out PCUIF_Message msg,
+			     template (present) PCUIF_Message tr_msg := ?)
+runs on test_CT {
+	var PCUIF_send_data sd;
+
+	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_msg)) -> value sd {
+		msg := sd.data;
+	}
+}
+
 /* Tune the L1 to PDCH on the given timeslot number */
 private function f_TC_pcu_l1ctl_est_pdch(uint3_t tn) runs on test_CT {
 	var ConnHdlrPars pars := valueof(t_Pars(ts_RslChanNr_PDCH(tn), ts_RSL_ChanMode_SIGN));
@@ -5326,12 +5337,13 @@
 /* Verify no RTS before ACT_REQ; verify RTS after ACT_REQ */
 friend function f_TC_pcu_act_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr, boolean exp_success)
 runs on test_CT {
+	var PCUIF_Message msg;
 	timer T := 3.0;
 
 	/* we don't expect any RTS.req before PDCH are active */
 	T.start;
 	alt {
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(bts_nr))) {
+	[] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ(bts_nr)) {
 		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "PCU RTS.req before PDCH active?");
 		}
 	[] PCU.receive { repeat; }
@@ -5344,14 +5356,13 @@
 	/* we now expect RTS.req for this timeslot (only) */
 	T.start;
 	alt {
-	[exp_success] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr))) {
+	[exp_success] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr)) {
 		setverdict(pass);
 		}
-	[not exp_success] PCU.receive(t_SD_PCUIF(g_pcu_conn_id,
-						 tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr))) {
+	[not exp_success] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr)) {
 		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unexpected RTS.req for supposedly failing activation");
 		}
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ)) {
+	[] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ) {
 		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "RTS.req for wrong TRX/TS");
 		}
 	[] PCU.receive { repeat; }
@@ -5367,6 +5378,7 @@
 /* verify no more RTS after DEACT_REQ */
 friend function f_TC_pcu_deact_req(uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr)
 runs on test_CT {
+	var PCUIF_Message msg;
 	timer T := 3.0;
 
 	/* Send PDCH activate request for known PDCH timeslot */
@@ -5378,7 +5390,7 @@
 	/* we now expect no RTS.req for this timeslot */
 	T.start;
 	alt {
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr))) {
+	[] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr)) {
 		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Received unexpected PCU RTS.req");
 		}
 	[] PCU.receive { repeat; }
@@ -5443,8 +5455,9 @@
 
 /* Test the PCU->BTS Version and BTS->PCU SI13 handshake */
 function f_TC_pcu_ver_siXX(octetstring si, RSL_IE_SysinfoType rsl_si_type) runs on test_CT {
-	var PCUIF_send_data sd;
-	timer T:= 3.0;
+	var PCUIF_Message msg;
+	timer T := 3.0;
+
 	f_init_with_pcuif();
 
 	/* Set SI13 via RSL */
@@ -5452,8 +5465,8 @@
 
 	T.start;
 	alt {
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_DATA_IND(0, 0, 0, ?, PCU_IF_SAPI_BCCH))) -> value sd {
-		if (substr(sd.data.u.data_ind.data, 0, lengthof(si)) == si) {
+	[] as_pcuif_msg(msg, tr_PCUIF_DATA_IND(0, 0, 0, sapi := PCU_IF_SAPI_BCCH)) {
+		if (substr(msg.u.data_ind.data, 0, lengthof(si)) == si) {
 			setverdict(pass);
 		} else {
 			repeat;
@@ -5500,15 +5513,14 @@
 					    PCUIF_Sapi sapi, octetstring data)
 runs on test_CT
 {
-	var PCUIF_send_data sd;
-
+	var PCUIF_Message msg;
 	timer T := 3.0;
+
 	T.start;
 	alt {
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id,
-				tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr, sapi))) -> value sd {
-		f_pcu_data_req(bts_nr, trx_nr, ts_nr, sd.data.u.rts_req.block_nr,
-				  sd.data.u.rts_req.fn, sapi, data);
+	[] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ(bts_nr, trx_nr, ts_nr, sapi)) {
+		f_pcu_data_req(bts_nr, trx_nr, ts_nr, msg.u.rts_req.block_nr,
+			       msg.u.rts_req.fn, sapi, data);
 		}
 	[] PCU.receive { repeat; }
 	[] T.timeout {
@@ -5638,7 +5650,7 @@
 private function f_TC_pcu_ptcch_ul(uint16_t ra)
 runs on test_CT {
 	var template PCUIF_Message pcu_rach_ind;
-	var PCUIF_send_data sd;
+	var PCUIF_Message msg;
 	var GsmFrameNumber fn;
 	timer T;
 
@@ -5653,8 +5665,8 @@
 	/* Expect a RACH.ind on the PCU interface (timeout is one multi-frame) */
 	T.start(52.0 * 4.615 / 1000.0);
 	alt {
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, pcu_rach_ind)) -> value sd {
-		log("Rx an Access Burst on the PCU interface: ", sd.data);
+	[] as_pcuif_msg(msg, pcu_rach_ind) {
+		log("Rx an Access Burst on the PCU interface: ", msg);
 		setverdict(pass);
 		T.stop;
 		}
@@ -5787,6 +5799,7 @@
 
 	var GsmFrameNumber fn_last := 0;
 	for (var integer i := 0; i < 1000; i := i+1) {
+		var PCUIF_Message msg;
 		var OCT1 ra := f_rnd_ra_ps();
 		var GsmFrameNumber fn := f_L1CTL_RACH(L1CTL, oct2int(ra));
 		if (fn == fn_last) {
@@ -5797,10 +5810,10 @@
 		timer T := 2.0;
 		T.start;
 		alt {
-		[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RACH_IND(0, 0, 0, oct2int(ra), 0, ?, fn))) {
+		[] as_pcuif_msg(msg, tr_PCUIF_RACH_IND(0, 0, 0, oct2int(ra), 0, ?, fn)) {
 			T.stop;
 			}
-		[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RACH_IND)) {
+		[] as_pcuif_msg(msg, tr_PCUIF_RACH_IND) {
 			Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unexpected RACH IND");
 			}
 		[] PCU.receive { repeat; }
@@ -5819,7 +5832,7 @@
 	var GsmFrameNumber fn_last := 0;
 	var L1ctlRachSynchSeq synch_seq;
 	var PCUIF_BurstType pcu_bt;
-	var GsmFrameNumber fn;
+	var GsmFrameNumber fn
 	var BIT11 ra11;
 
 	f_init_with_pcuif();
@@ -5852,13 +5865,14 @@
 			burst_type := pcu_bt,
 			fn := fn);
 
+		var PCUIF_Message msg;
 		timer T := 2.0;
 		T.start;
 		alt {
-		[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, pcu_rach_ind)) {
+		[] as_pcuif_msg(msg, pcu_rach_ind) {
 			T.stop;
 			}
-		[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RACH_IND)) {
+		[] as_pcuif_msg(msg, tr_PCUIF_RACH_IND) {
 			Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unexpected RACH IND");
 			}
 		[] PCU.receive { repeat; }
@@ -5872,14 +5886,10 @@
 
 private function f_TC_pcu_data_ind_lqual_cb(int16_t lqual_cb_exp, int16_t thresh)
 runs on test_CT {
-	var template PCUIF_send_data sdt;
-	var PCUIF_send_data sd;
+	var PCUIF_Message msg;
 	var int16_t lqual_cb;
 	timer T := 1.0;
 
-	/* PCUIF_DATA.ind is encapsulated into a supplementary record */
-	sdt := t_SD_PCUIF_MSGT(g_pcu_conn_id, PCU_IF_MSG_DATA_IND);
-
 	/* Send a random PDTCH frame over Um
 	 * FIXME: we need to wait for a DL block and user Fn from there. */
 	L1CTL.send(ts_L1CTL_GPRS_UL_BLOCK_REQ(0, 7, '0000'O & f_rnd_octstring(21)));
@@ -5887,8 +5897,8 @@
 	T.start;
 	alt {
 	/* If expected link quality is above the threshold */
-	[lqual_cb_exp >= thresh] PCU.receive(sdt) -> value sd {
-		lqual_cb := sd.data.u.data_ind.lqual_cb;
+	[lqual_cb_exp >= thresh] as_pcuif_msg(msg, tr_PCUIF_DATA_IND) {
+		lqual_cb := msg.u.data_ind.lqual_cb;
 		log("Rx PCUIF_DATA.ind (lqual_cb=", lqual_cb, ")");
 
 		/* Make sure the actual link quality matches the expected value */
@@ -5900,9 +5910,9 @@
 		}
 		}
 	/* If expected link quality is below the threshold */
-	[lqual_cb_exp < thresh] PCU.receive(sdt) -> value sd {
+	[lqual_cb_exp < thresh] as_pcuif_msg(msg, tr_PCUIF_DATA_IND) {
 		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
-					log2str("Rx unexpected PCUIF_DATA.ind: ", sd.data));
+					log2str("Rx unexpected PCUIF_DATA.ind: ", msg));
 		}
 	/* Ignore PCUIF_RTS.req and PCUIF_TIME.ind */
 	[] PCU.receive { repeat; }
@@ -5951,6 +5961,7 @@
 		var MobileIdentityLV mi_lv;
 		var octetstring mi_lv_enc;
 		var MobileIdentityV mi;
+		var PCUIF_Message msg;
 		timer T := 3.0;
 
 		if (i < 50) {
@@ -5968,9 +5979,9 @@
 		RSL_CCHAN.send(ts_ASP_RSL_UD(ts_RSL_PAGING_CMD(mi, i mod 4)));
 		T.start;
 		alt {
-		[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_PAG_REQ(0, mi_lv_enc))) {
+		[] as_pcuif_msg(msg, tr_PCUIF_PAG_REQ(0, mi_lv_enc)) {
 			}
-		[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_PAG_REQ)) {
+		[] as_pcuif_msg(msg, tr_PCUIF_PAG_REQ) {
 			Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Unexpected PAGING REQ");
 			}
 		[] PCU.receive { repeat; }
@@ -5984,10 +5995,10 @@
 
 /* test for periodic TIME_IND; check number of FN expired and number of TIME_IND within frames */
 testcase TC_pcu_time_ind() runs on test_CT {
-	var PCUIF_send_data pcu_sd;
 	var integer num_time_ind := 0;
 	var integer first_fn, last_fn;
 	var float test_duration := 5.0;
+	var PCUIF_Message msg;
 	timer T;
 
 	f_init_with_pcuif();
@@ -5996,16 +6007,16 @@
 	PCU.clear;
 	T.start(test_duration);
 	alt {
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_TIME_IND(0, ?))) -> value pcu_sd {
+	[] as_pcuif_msg(msg, tr_PCUIF_TIME_IND(0, ?)) {
 		num_time_ind := num_time_ind + 1;
 		if (not isbound(first_fn)) {
-			first_fn := pcu_sd.data.u.time_ind.fn;
+			first_fn := msg.u.time_ind.fn;
 		}
-		last_fn := pcu_sd.data.u.time_ind.fn;
+		last_fn := msg.u.time_ind.fn;
 		repeat;
 		}
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_TIME_IND(?, ?))) -> value pcu_sd {
-		setverdict(fail, "Received unexpected PCUIF_TIME_IND: ", pcu_sd.data);
+	[] as_pcuif_msg(msg, tr_PCUIF_TIME_IND(?, ?)) {
+		setverdict(fail, "Received unexpected PCUIF_TIME_IND: ", msg);
 		repeat;
 		}
 	[] PCU.receive {
@@ -6037,11 +6048,11 @@
 
 /* test for periodic RTS_REQ; check number of FN expired and number of RTS_IND per SAPI */
 testcase TC_pcu_rts_req() runs on test_CT {
-	var PCUIF_send_data pcu_sd;
 	var integer first_fn, last_fn;
 	var integer num_rts_pdtch := 0;
 	var integer num_rts_ptcch := 0;
 	var float test_duration := 5.0;
+	var PCUIF_Message msg;
 	timer T;
 
 	f_init_with_pcuif();
@@ -6050,26 +6061,24 @@
 	PCU.clear;
 	T.start(test_duration);
 	alt {
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(0, 0, 7, PCU_IF_SAPI_PDTCH, ?, ?)))
-			-> value pcu_sd {
+	[] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ(0, 0, 7, PCU_IF_SAPI_PDTCH, ?, ?)) {
 		num_rts_pdtch := num_rts_pdtch + 1;
 		if (not isbound(first_fn)) {
-			first_fn := pcu_sd.data.u.rts_req.fn;
+			first_fn := msg.u.rts_req.fn;
 		}
-		last_fn := pcu_sd.data.u.rts_req.fn;
+		last_fn := msg.u.rts_req.fn;
 		repeat;
 		}
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ(0, 0, 7, PCU_IF_SAPI_PTCCH, ?, ?)))
-			-> value pcu_sd {
+	[] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ(0, 0, 7, PCU_IF_SAPI_PTCCH, ?, ?)) {
 		num_rts_ptcch := num_rts_ptcch + 1;
 		if (not isbound(first_fn)) {
-			first_fn := pcu_sd.data.u.rts_req.fn;
+			first_fn := msg.u.rts_req.fn;
 		}
-		last_fn := pcu_sd.data.u.rts_req.fn;
+		last_fn := msg.u.rts_req.fn;
 		repeat;
 		}
-	[] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_RTS_REQ)) -> value pcu_sd {
-		setverdict(fail, "Received unexpected PCUIF_RTS_REQ: ", pcu_sd.data);
+	[] as_pcuif_msg(msg, tr_PCUIF_RTS_REQ) {
+		setverdict(fail, "Received unexpected PCUIF_RTS_REQ: ", msg);
 		repeat;
 		}
 	[] PCU.receive {
@@ -6540,7 +6549,7 @@
 	var template PCUIF_Message tr_interf_ind;
 	var integer interf_ind_num := 0;
 	var boolean first := true;
-	var PCUIF_send_data sd;
+	var PCUIF_Message msg;
 	timer T;
 
 	/* Set the averaging/reporting period to 480ms */
@@ -6566,25 +6575,25 @@
 	T.start(0.480 * 1.5);
 	alt {
 	/* The first interference report may contain unreliable values, so we ignore it */
-	[first] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_INTERF_IND(0, 0))) {
+	[first] as_pcuif_msg(msg, tr_PCUIF_INTERF_IND(0, 0)) {
 		/* 4 SACCH periods => 4 reports (plus some guard time) */
 		T.start(0.480 * 4.0 + 0.480 / 2.0);
 		first := false;
 		repeat;
 		}
 	/* Subsequent interference reports shall match our expectations */
-	[not first] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_interf_ind)) -> value sd {
+	[not first] as_pcuif_msg(msg, tr_interf_ind) {
 		/* Check TDMA frame number period */
-		if (sd.data.u.interf_ind.fn mod 104 != 0) {
+		if (msg.u.interf_ind.fn mod 104 != 0) {
 			setverdict(fail, "Odd TDMA frame number := ",
-				   sd.data.u.interf_ind.fn);
+				   msg.u.interf_ind.fn);
 		}
 		interf_ind_num := interf_ind_num + 1;
 		if (interf_ind_num < 4)
 			{ repeat; }
 		}
-	[not first] PCU.receive(t_SD_PCUIF(g_pcu_conn_id, tr_PCUIF_INTERF_IND(0, 0))) -> value sd {
-		setverdict(fail, "Received unexpected interference report: ", sd.data);
+	[not first] as_pcuif_msg(msg, tr_PCUIF_INTERF_IND(0, 0)) {
+		setverdict(fail, "Received unexpected interference report: ", msg);
 		}
 	[] PCU.receive { repeat; }
 	[] T.timeout {
