diff --git a/bts/BTS_Tests.ttcn b/bts/BTS_Tests.ttcn
index 888abf5..3fe6120 100644
--- a/bts/BTS_Tests.ttcn
+++ b/bts/BTS_Tests.ttcn
@@ -8572,6 +8572,210 @@
 	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
 }
 
+/* CSD channel tests */
+private function f_TC_data_rtp_loopback(charstring id) runs on ConnHdlr {
+	var octetstring udata := ''O;
+	var integer payload_len;
+	var L1ctlMessage l1_dl;
+	timer Td;
+
+	log("Testing channel mode ", g_pars.chan_mode);
+
+	select (g_pars.chan_mode) {
+	case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, (RSL_CMOD_CSD_T_14k4, RSL_CMOD_CSD_NT_14k5)))
+		{ payload_len := 290; }
+	case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, (RSL_CMOD_CSD_T_9k6, RSL_CMOD_CSD_NT_12k0)))
+		{ payload_len := 4 * 60; }
+	case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, (RSL_CMOD_CSD_T_4k8, RSL_CMOD_CSD_NT_6k0)))
+		{ payload_len := 2 * 60; }
+	case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_H, (RSL_CMOD_CSD_T_4k8, RSL_CMOD_CSD_NT_6k0)))
+		{ payload_len := 4 * 60; }
+	case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, (RSL_CMOD_CSD_T_2k4, RSL_CMOD_CSD_T_1k2,
+						    RSL_CMOD_CSD_T_600, RSL_CMOD_CSD_T_1200_75)))
+		{ payload_len := 2 * 36; }
+	case (tr_RSL_ChanMode_DATA(RSL_CHRT_TCH_H, (RSL_CMOD_CSD_T_2k4, RSL_CMOD_CSD_T_1k2,
+						    RSL_CMOD_CSD_T_600, RSL_CMOD_CSD_T_1200_75)))
+		{ payload_len := 4 * 36; }
+	case else {
+		setverdict(fail, "Unhandled RSL channel mode := ", g_pars.chan_mode);
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+		}
+	}
+
+	/* Generate a pseudo-random payload */
+	for (var integer i := 0; i < payload_len; i := i + 1) {
+		udata := udata & int2oct(i mod 2, 1);
+	}
+
+	/* Activate the RTP emulation */
+	f_rtpem_activate(mode := RTPEM_MODE_LOOPBACK, rtp_pt := 120);
+
+	/* Tune to the dedicated channel */
+	f_l1_tune(L1CTL);
+	f_est_dchan();
+
+	/* Send a pseudo-random data frame on the Uplink */
+	log("Sending Uplink TCH (len=", lengthof(udata), "): ", udata);
+	L1CTL.send(ts_L1CTL_TRAFFIC_REQ(g_chan_nr, ts_RslLinkID_DCCH(0), udata));
+
+	/* Expect this frame to show up on the Downlink */
+	Td.start(4.0);
+	alt {
+	[] L1CTL.receive(tr_L1CTL_TRAFFIC_IND(g_chan_nr, frame := udata)) {
+		log("TCH received (len=", lengthof(udata), "): ", udata);
+		setverdict(pass);
+		Td.stop;
+		}
+	[] L1CTL.receive(tr_L1CTL_TRAFFIC_IND(g_chan_nr)) -> value l1_dl {
+		var octetstring ddata := l1_dl.payload.traffic_ind.data;
+		log("TCH received (len=", lengthof(ddata), "): ", ddata);
+		repeat;
+		}
+	[] L1CTL.receive(tr_L1CTL_DATA_IND(g_chan_nr)) -> value l1_dl {
+		var octetstring ddata := l1_dl.payload.data_ind.payload;
+		log("FACCH received: ", ddata);
+		repeat;
+		}
+	[] as_l1_sacch();
+	[] L1CTL.receive { repeat; }
+	[] Td.timeout {
+		setverdict(fail, "Timeout waiting for matching Downlink data frame");
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+		}
+	}
+
+	/* TODO: send and expect FACCH */
+
+	f_rtpem_mode(RTPEM_CTRL, RTPEM_MODE_NONE);
+	f_L1CTL_DM_REL_REQ(L1CTL, g_chan_nr);
+	f_rsl_chan_deact();
+	f_rslem_unregister(0, g_chan_nr);
+}
+testcase TC_data_rtp_tchf144() runs on test_CT {
+	var ConnHdlr vc_conn;
+	var ConnHdlrPars pars;
+
+	f_init();
+
+	/* TS1, TCH/F14.4 (14k5 radio interface rate), transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_T_14k4)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	/* TS1, TCH/F14.4 (14k5 radio interface rate), non-transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_NT_14k5)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_data_rtp_tchf96() runs on test_CT {
+	var ConnHdlr vc_conn;
+	var ConnHdlrPars pars;
+
+	f_init();
+
+	/* TS1, TCH/F9.6 (12k radio interface rate), transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_T_9k6)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	/* TS1, TCH/F9.6 (12k radio interface rate), non-transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_NT_12k0)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_data_rtp_tchf48() runs on test_CT {
+	var ConnHdlr vc_conn;
+	var ConnHdlrPars pars;
+
+	f_init();
+
+	/* TS1, TCH/F4.8 (6k radio interface rate), transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_T_4k8)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	/* TS1, TCH/F4.8 (6k radio interface rate), non-transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_NT_6k0)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_data_rtp_tchh48() runs on test_CT {
+	var ConnHdlr vc_conn;
+	var ConnHdlrPars pars;
+
+	f_init();
+
+	/* TS1, TCH/H4.8 (6k radio interface rate), transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Lm(5, 0),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_H, RSL_CMOD_CSD_T_4k8)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	/* TS1, TCH/H4.8 (6k radio interface rate), non-transparent service */
+	pars := valueof(t_Pars(ts_RslChanNr_Lm(5, 0),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_H, RSL_CMOD_CSD_NT_6k0)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_data_rtp_tchf24() runs on test_CT {
+	var ConnHdlr vc_conn;
+	var ConnHdlrPars pars;
+
+	f_init();
+
+	/* TS1, TCH/F2.4 (3k6 radio interface rate), transparent services only */
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_T_2k4)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	pars := valueof(t_Pars(ts_RslChanNr_Bm(1),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_F, RSL_CMOD_CSD_T_1k2)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+testcase TC_data_rtp_tchh24() runs on test_CT {
+	var ConnHdlr vc_conn;
+	var ConnHdlrPars pars;
+
+	f_init();
+
+	/* TS1, TCH/H2.4 (3k6 radio interface rate), transparent services only */
+	pars := valueof(t_Pars(ts_RslChanNr_Lm(5, 0),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_H, RSL_CMOD_CSD_T_2k4)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	pars := valueof(t_Pars(ts_RslChanNr_Lm(5, 0),
+			ts_RSL_ChanMode_DATA(RSL_CHRT_TCH_H, RSL_CMOD_CSD_T_1k2)));
+	vc_conn := f_start_handler(refers(f_TC_data_rtp_loopback), pars);
+	vc_conn.done;
+
+	Misc_Helpers.f_shutdown(__BFILE__, __LINE__);
+}
+
+
 private function f_TC_early_immediate_assignment(charstring id) runs on ConnHdlr {
 	var GsmFrameNumber fn;
 	var ChannelDescription ch_desc;
@@ -9178,6 +9382,13 @@
 	execute( TC_speech_osmux_tchf() );
 	execute( TC_speech_osmux_tchh() );
 
+	execute( TC_data_rtp_tchf144() );
+	execute( TC_data_rtp_tchf96() );
+	execute( TC_data_rtp_tchf48() );
+	execute( TC_data_rtp_tchh48() );
+	execute( TC_data_rtp_tchf24() );
+	execute( TC_data_rtp_tchh24() );
+
 	execute( TC_early_immediate_assignment() );
 
 	execute( TC_acch_overpower_rxqual_thresh() );
