diff --git a/bts/BTS_Tests_SMSCB.ttcn b/bts/BTS_Tests_SMSCB.ttcn
index 08e1cef..1e17703 100644
--- a/bts/BTS_Tests_SMSCB.ttcn
+++ b/bts/BTS_Tests_SMSCB.ttcn
@@ -159,7 +159,7 @@
 {
 	var RSL_IE_CbCommandType cmd_type :=
 				valueof(ts_RSL_IE_CbCmdType(RSL_CB_CMD_DEFAULT, 1, true));
-	RSL_CCHAN.send(ts_RSL_UD(ts_RSL_SMSCB_CMD(cmd_type, ''O)));
+	RSL_CCHAN.send(ts_ASP_RSL_UD(ts_RSL_SMSCB_CMD(cmd_type, ''O)));
 }
 
 template RSL_IE t_RSL_IE_SMSCB_EXT := t_RSL_IE(RSL_IE_SMSCB_CHAN_INDICATOR, {smscb_chan_ind := 1});
@@ -181,7 +181,7 @@
 		if (extd) {
 			rsl.ies := rsl.ies & { valueof(t_RSL_IE_SMSCB_EXT) };
 		}
-		RSL_CCHAN.send(ts_RSL_UD(rsl));
+		RSL_CCHAN.send(ts_ASP_RSL_UD(rsl));
 	}
 	if (ispresent(pars_chan.default_msg)) {
 		msg := pars_chan.default_msg;
@@ -191,7 +191,7 @@
 		if (extd) {
 			rsl.ies := rsl.ies & { valueof(t_RSL_IE_SMSCB_EXT) };
 		}
-		RSL_CCHAN.send(ts_RSL_UD(rsl));
+		RSL_CCHAN.send(ts_ASP_RSL_UD(rsl));
 	}
 }
 
@@ -720,10 +720,10 @@
 
 	T.start;
 	alt {
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC)) -> value rx_ud {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC)) -> value rx_ud {
 		setverdict(fail, "Received unexpected CBCH LOAD IND: ", rx_ud);
 		}
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD)) -> value rx_ud {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD)) -> value rx_ud {
 		setverdict(fail, "Received unexpected CBCH LOAD IND: ", rx_ud);
 		}
 	[] RSL_CCHAN.receive { repeat; }
@@ -748,18 +748,18 @@
 	RSL_CCHAN.clear;
 	T.start;
 	alt {
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC(false, tr_slot_count))) {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC(false, tr_slot_count))) {
 		basic_count := basic_count + 1;
 		repeat;
 		}
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD(false, tr_slot_count))) -> value rx_ud {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD(false, tr_slot_count))) -> value rx_ud {
 		extd_count := extd_count + 1;
 		repeat;
 		}
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC)) -> value rx_ud {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC)) -> value rx_ud {
 		setverdict(fail, "Received unexpected CBCH LOAD IND: ", rx_ud);
 		}
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD)) -> value rx_ud {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD)) -> value rx_ud {
 		setverdict(fail, "Received unexpected CBCH LOAD IND: ", rx_ud);
 		}
 	[] RSL_CCHAN.receive { repeat; }
@@ -824,18 +824,18 @@
 	T_total.start;
 	T_retransmit.start;
 	alt {
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC(true, tr_slot_count_basic))) {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC(true, tr_slot_count_basic))) {
 		basic_count := basic_count + 1;
 		repeat;
 		}
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD(false, tr_slot_count_extd))) {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD(false, tr_slot_count_extd))) {
 		extd_count := extd_count + 1;
 		repeat;
 		}
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC)) -> value rx_ud {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_BASIC)) -> value rx_ud {
 		setverdict(fail, "Received unexpected CBCH LOAD IND: ", rx_ud);
 		}
-	[] RSL_CCHAN.receive(tr_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD)) -> value rx_ud {
+	[] RSL_CCHAN.receive(tr_ASP_RSL_UD(tr_RSL_CBCH_LOAD_IND_EXTD)) -> value rx_ud {
 		setverdict(fail, "Received unexpected CBCH LOAD IND: ", rx_ud);
 		}
 	[] RSL_CCHAN.receive { repeat; }
@@ -906,7 +906,7 @@
 	f_init_l1ctl();
 	f_l1_tune(L1CTL, ccch_mode := CCCH_MODE_COMBINED_CBCH);
 
-	RSL_CCHAN.send(ts_RSL_UD(ts_RSL_OSMO_ETWS_CMD(c_etws)));
+	RSL_CCHAN.send(ts_ASP_RSL_UD(ts_RSL_OSMO_ETWS_CMD(c_etws)));
 	/* wait for a bit until old non-ETWS Paging messages are gone */
 	f_sleep(1.0);
 	L1CTL.clear;
@@ -999,11 +999,11 @@
 	f_init_l1ctl();
 	f_l1_tune(L1CTL, ccch_mode := CCCH_MODE_COMBINED_CBCH);
 
-	RSL_CCHAN.send(ts_RSL_UD(ts_RSL_OSMO_ETWS_CMD(c_etws)));
+	RSL_CCHAN.send(ts_ASP_RSL_UD(ts_RSL_OSMO_ETWS_CMD(c_etws)));
 	/* wait for a bit until old non-ETWS Paging messages are gone */
 	f_sleep(3.0);
 	/* disable the ETWS PN again */
-	RSL_CCHAN.send(ts_RSL_UD(ts_RSL_OSMO_ETWS_CMD(''O)));
+	RSL_CCHAN.send(ts_ASP_RSL_UD(ts_RSL_OSMO_ETWS_CMD(''O)));
 	f_sleep(2.0);
 	T.start;
 	L1CTL.clear;
@@ -1033,7 +1033,7 @@
 	f_init_l1ctl();
 	f_l1_tune(L1CTL, ccch_mode := CCCH_MODE_COMBINED_CBCH);
 
-	RSL_CCHAN.send(ts_RSL_UD(ts_RSL_OSMO_ETWS_CMD(c_etws)));
+	RSL_CCHAN.send(ts_ASP_RSL_UD(ts_RSL_OSMO_ETWS_CMD(c_etws)));
 
 	T.start;
 	alt {
