diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn
new file mode 100644
index 0000000..d4ce7ee
--- /dev/null
+++ b/pcu/PCU_Tests.ttcn
@@ -0,0 +1,539 @@
+module PCU_Tests {
+
+	import from General_Types all;
+	import from Osmocom_Types all;
+	import from GSM_Types all;
+	import from GSM_RR_Types all;
+	import from Osmocom_Gb_Types all;
+	import from BSSGP_Types all;
+	import from BSSGP_Emulation all;
+	import from NS_Types all;
+	import from NS_Emulation all;
+	import from LLC_Types all;
+	import from LLC_Templates all;
+	import from RLCMAC_Types all;
+	import from RLCMAC_CSN1_Types all;
+	import from LAPDm_RAW_PT all;
+	import from GPRS_Context all;
+	import from GPRS_TBF all;
+
+	modulepar {
+		BssgpConfig mp_gb_cfg := {
+			nsei := 1234,
+			bvci := 1234,
+			cell_id := {
+				ra_id := {
+					lai := {
+						mcc_mnc := '26242F'H, lac := 13135
+					},
+					rac := 0
+				},
+				cell_id := 20960
+			},
+			sgsn_role := true
+		};
+	}
+
+	type component dummy_CT extends BSSGP_Client_CT {
+		var lapdm_CT lapdm_component;
+		port LAPDm_PT L1;
+
+		var NS_CT ns_component;
+		var BSSGP_CT bssgp_component;
+
+		var MmContext g_mmctx := {
+			tlli := 'FFFFFFFF'O,
+			n_u := 0
+		};
+
+		var boolean g_initialized := false;
+	}
+
+	function f_init() runs on dummy_CT {
+		if (g_initialized == true) {
+			return;
+		}
+		g_initialized := true;
+		/* create a new NS component */
+		ns_component := NS_CT.create;
+		bssgp_component := BSSGP_CT.create;
+		/* connect our BSSGP port to the BSSGP Emulation */
+		connect(self:BSSGP, bssgp_component:BSSGP_SP);
+		connect(self:BSSGP_PROC, bssgp_component:BSSGP_PROC);
+		/* connect lower-end of BSSGP with BSSGP_CODEC_PORT (maps to NS_PT*/
+		connect(bssgp_component:BSCP, ns_component:NS_SP);
+		/* connect lower-end of NS emulation to NS_CODEC_PORT (on top of IPl4) */
+		map(ns_component:NSCP, system:NS_CODEC_PORT);
+		ns_component.start(NSStart());
+		bssgp_component.start(BssgpStart(mp_gb_cfg));
+
+		lapdm_component := lapdm_CT.create;
+		connect(self:L1, lapdm_component:LAPDM_SP);
+		map(lapdm_component:L1CTL, system:L1CTL);
+		lapdm_component.start(LAPDmStart());
+
+		f_bssgp_client_register(g_mmctx.imsi, g_mmctx.tlli, mp_gb_cfg.cell_id);
+		f_bssgp_establish();
+	}
+
+	function f_exit() runs on dummy_CT {
+		lapdm_component.stop;
+		ns_component.stop;
+		bssgp_component.stop;
+	}
+
+	function f_bssgp_dec_and_log(in octetstring inp) {
+		log("BSSGP Input: ", inp);
+		var PDU_BSSGP dec := dec_PDU_BSSGP(inp);
+		log("BSSGP Decoded: ", dec);
+	}
+
+	testcase TC_selftest_bssgp() runs on dummy_CT {
+		const octetstring c_bvc_reset_pcu := '2204820000078108088832f44000c80051e0'O;
+		const octetstring c_bvc_reset_q := '2204820000078100'O;
+		const octetstring c_status_pcu := '4107810515882204820000078103'O;
+		const octetstring c_reset_ack_q := '2304820000'O;
+		const octetstring c_reset_ack_pcu := '23048200c4'O;
+		const octetstring c_unblock_pcu := '24048200c4'O;
+		const octetstring c_unblock_ack_q := '25048200c4'O;
+		const octetstring c_fc_bvc_pcu := '261e8101058200fa038200c8018200fa1c8200c806820000'O;
+		const octetstring c_fc_bvc_ack_q := '271e8101'O;
+		const octetstring c_gmm_mo_att_req := '01bb146ddd000004088832f44000c80051e000800e003b01c001080103e5e000110a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c0002017057bf0ec'O;
+		const octetstring c_gmm_mt_ac_req := '00bb146ddd0050001682ffff0a8204030e9c41c001081200102198c72477ea104895e8b959acc58b108182f4d045'O;
+		const octetstring c_gmm_mo_ac_resp := '01bb146ddd000004088832f44000c80051e000800e000e01c00508130122fa361f5fdd623d'O;
+		const octetstring c_gmm_mt_att_acc := '00bb146ddd0050001682ffff0a8204030e9841c005080201340432f44000c8001805f4fb146ddd0967d0'O;
+		const octetstring c_gmm_mt_det_req := '00bb146ddd0050001682ffff0a8204030e8941c00908050215f0b6'O;
+		const octetstring c_gmm_mo_att_cpl := '01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;
+
+		f_bssgp_dec_and_log(c_bvc_reset_pcu);
+		f_bssgp_dec_and_log(c_bvc_reset_q);
+		f_bssgp_dec_and_log(c_status_pcu);
+		f_bssgp_dec_and_log(c_reset_ack_q);
+		f_bssgp_dec_and_log(c_reset_ack_pcu);
+		f_bssgp_dec_and_log(c_unblock_pcu);
+		f_bssgp_dec_and_log(c_unblock_ack_q);
+		f_bssgp_dec_and_log(c_fc_bvc_pcu);
+		f_bssgp_dec_and_log(c_fc_bvc_ack_q);
+		f_bssgp_dec_and_log(c_gmm_mo_att_req);
+		f_bssgp_dec_and_log(c_gmm_mt_ac_req);
+		f_bssgp_dec_and_log(c_gmm_mo_ac_resp);
+		f_bssgp_dec_and_log(c_gmm_mt_att_acc);
+		f_bssgp_dec_and_log(c_gmm_mt_det_req);
+		f_bssgp_dec_and_log(c_gmm_mo_att_cpl);
+
+		log(ts_BSSGP_PS_PAGING_IMSI(196, '262420123456789'H));
+	}
+
+	function f_ns_assert_prepr(in octetstring a, in octetstring b) {
+		log("NS Input: ", a);
+		log("NS Expected: ", b);
+
+		if (a != b) {
+			setverdict(fail);
+		} else {
+			setverdict(pass);
+		}
+	}
+
+	function f_ns_dec_and_log(in octetstring inp) {
+		log("NS Input: ", inp);
+		var PDU_NS dec := dec_PDU_NS(inp);
+		log("NS Decoded: ", dec);
+	}
+
+	testcase TC_selftest_ns() runs on dummy_CT {
+		const octetstring c_ns_reset_pcu := '000000c4271e813d'O;
+
+		/* single byte length to two byte length */
+		f_ns_assert_prepr('04058101'O, '0405000101'O);
+		f_ns_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
+		/* two byte length to two byte length */
+		f_ns_assert_prepr('0405000101'O, '0405000101'O);
+		/* special case: NS-UNITDATA */
+		f_ns_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
+		/* multiple TLVs */
+		f_ns_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
+		/* zero-length */
+		f_ns_assert_prepr('230080'O, '23000000'O);
+
+		f_ns_dec_and_log(c_ns_reset_pcu);
+	}
+
+	const octetstring gmm_auth_req := '081200102198c72477ea104895e8b959acc58b108182'O;
+
+	/* Wrap downlink GMM into LLC, encode + send it via BSSGP to PCU */
+	function tx_gmm(BIT1 c_r, in octetstring gmm_pdu, BIT4 sapi := c_LLC_SAPI_LLGMM) runs on dummy_CT {
+		var PDU_LLC llc;
+
+		//log("GMM Tx: ", dec_PDU_L3_SGSN_MS(gmm_pdu));
+
+		log(c_r, g_mmctx.n_u, gmm_pdu, sapi);
+		llc := valueof(ts_LLC_UI(gmm_pdu, sapi, c_r, g_mmctx.n_u));
+		log(llc);
+		g_mmctx.n_u := g_mmctx.n_u + 1;
+
+		log(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
+
+		BSSGP.send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_PDU_LLC(llc)));
+	}
+
+	/* Establish BSSGP connection to PCU */
+	function f_bssgp_establish() runs on dummy_CT {
+		timer T:= 10.0;
+
+		f_init();
+		T.start
+		alt {
+			[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { }
+			[] BSSGP.receive { repeat; }
+			[] T.timeout { setverdict(fail); }
+		}
+		T.stop
+		log("BSSGP successfully initialized");
+	}
+
+	/* Send PS-PAGING via BSSGP to PCU, expect it to show up on L1/Um */
+	testcase TC_paging() runs on dummy_CT {
+		var hexstring imsi := '262420123456789'H;
+		var BssgpBvci bvci := 196;
+		var GsmTmsi tmsi := hex2int('01234567'H);
+
+		f_bssgp_establish();
+
+		BSSGP.send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
+		BSSGP.send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, tmsi));
+
+		while (true) {
+			var BssgpDecoded bd;
+			alt {
+				[] BSSGP.receive(tr_BD_L3_MT(?)) -> value bd {
+					log("BSSGP Rx: ", bd);
+				}
+				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
+				[] BSSGP.receive { repeat; }
+			}
+		}
+	}
+
+	/* Establish an UL TBF: Tune to ARFCN, send RACH, receive AGCH, enable TBF Rx */
+	function f_establish_ul_tbf() runs on dummy_CT {
+		timer T := 5.0;
+		var BCCH_tune_req tune_req := { { false, 871 }, true };
+		L1.send(tune_req);
+		/* FIXME: wait for confirm */
+
+		var TBF_establish_req est_req := { ra := hex2int('7B'H) };
+		L1.send(est_req);
+		T.start;
+		/* FIXME: wait for confirm */
+		alt {
+			[] L1.receive(TBF_establish_res:?) {}
+			[] L1.receive { repeat; }
+			[] T.timeout {
+				setverdict(fail, "Timeout establishing UL TBF");
+				self.stop;
+			}
+		}
+		T.stop;
+	}
+
+	/* compute a random TLLI; FIXME: what about TLLI prefix / local/foreign/...? */
+	function f_random_tlli() return GprsTlli {
+		var GprsTlli tlli := f_rnd_octstring(4);
+		return tlli;
+	}
+
+	/* Compute the frame number of the uplink block based on current fn + rrbp */
+	function f_rrbp_fn(GsmFrameNumber fn, MacRrbp rrbp) return GsmFrameNumber {
+		var integer add;
+		select (rrbp) {
+		case (RRBP_Nplus13_mod_2715648) {
+			add := 13;
+			}
+		case (RRBP_Nplus17_or_18_mod_2715648) {
+			add := 17; /* FIXME: What about 'or 18'? */
+			}
+		case (RRBP_Nplus21_or_22_mod_2715648) {
+			add := 21; /* FIXME: What about 'or 22'? */
+			}
+		case (RRBP_Nplus26_mod_2715648) {
+			add := 26;
+			}
+		}
+		return (fn + add) mod 2715648;
+	}
+
+
+function f_bssgp_wait_ul_ud(template BssgpDecoded bd_exp) runs on dummy_CT {
+	timer T := 5.0;
+	T.start;
+	alt {
+	[] BSSGP.receive(bd_exp) {
+		log("found matching BSSGP UL-UNITDATA PDU");
+		}
+	[] T.timeout {
+		setverdict(fail, "Timeout waiting for ", bd_exp);
+		}
+	}
+}
+
+
+function f_ul_tbf(inout UlTbfState us) runs on dummy_CT {
+	var RLCMAC_ph_data_ind dl;
+
+	/* Establish an UL-TBF */
+	f_establish_ul_tbf();
+
+	while (true) {
+		var RlcmacUlBlock blk;
+		if (f_ul_tbf_get_next_block(blk, us, g_mmctx, true) == false) {
+			break;
+		}
+
+		/* Send the block to L1 for transmission */
+		log("L1=", blk);
+		L1.send(RLCMAC_ph_data_req:{dyn:={tbf_id := 0, cs := us.tbf.initial_cs, block := blk}});
+	}
+
+	alt {
+	[] L1.receive(RLCMAC_ph_data_ind:{cs:=?, ts_nr:=?, fn:=?, block:=tr_RLCMAC_ACK_NACK(0, g_mmctx.tlli)}) -> value dl {
+		log("found matching ACK/NACK");
+		/* send CTRL ACK in uplink */
+		var GsmFrameNumber ul_fn := f_rrbp_fn(dl.fn, dl.block.ctrl.mac_hdr.rrbp);
+		var RlcmacUlCtrlMsg ctrl_ack := valueof(ts_RlcMacUlCtrl_PKT_CTRL_ACK(g_mmctx.tlli));
+		var RlcmacUlBlock ul_block := valueof(ts_RLC_UL_CTRL_ACK(ctrl_ack));
+		L1.send(ts_PH_DATA_ABS(0, CS1, dl.ts_nr, ul_fn, {false, 871}, ul_block));
+		/* wait for the final ACK */
+		if (dl.block.ctrl.payload.u.ul_ack_nack.gprs.ack_nack_desc.final_ack == '0'B) {
+			repeat;
+		}
+		}
+	[] L1.receive { repeat; }
+	}
+
+	for (var integer i := 0; i < sizeof(us.tbf.llc_pdus_enc); i := i+1) {
+		f_bssgp_wait_ul_ud(tr_BD_BSSGP(tr_BSSGP_UL_UD(g_mmctx.tlli, ?, us.tbf.llc_pdus_enc[i])));
+	}
+	setverdict(pass);
+
+	L1.send(DCCH_release_req:{});
+}
+
+	testcase TC_rach() runs on dummy_CT {
+		var BssgpBvci bvci := 196;
+		g_mmctx.imsi := '262420123456789'H;
+		g_mmctx.tlli := f_random_tlli();
+
+		f_init();
+
+		f_bssgp_client_register(g_mmctx.imsi, g_mmctx.tlli, mp_gb_cfg.cell_id);
+
+		f_bssgp_establish();
+	}
+
+
+	testcase TC_nsem() runs on dummy_CT {
+
+		f_bssgp_establish();
+
+		while (true) {
+			var BssgpDecoded bd;
+			alt {
+				[] BSSGP.receive(tr_BD_BSSGP(?)) -> value bd {
+					log("BSSGP Rx: ", bd);
+					//log("GMM Rx: ", dec_PDU_L3_MS_SGSN(pdu.payload));
+					g_mmctx.tlli := bd.bssgp.pDU_BSSGP_UL_UNITDATA.tLLI;
+					tx_gmm(LLC_CR_DL_CMD, gmm_auth_req);
+				}
+				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
+				[] BSSGP.receive { repeat; }
+			}
+		}
+	}
+
+
+	function f_llc_dec_and_log(in octetstring inp) {
+		log("LLC Input: ", inp);
+		var PDU_LLC dec := dec_PDU_LLC(inp);
+		log("LLC Decoded: ", dec);
+	}
+
+	function f_llc_assert(in octetstring a, in octetstring b) {
+		log("LLC Input: ", a);
+		log("LLC Expected: ", b);
+
+		if (a != b) {
+			setverdict(fail);
+		} else {
+			setverdict(pass);
+		}
+	}
+
+
+	testcase TC_selftest_llc() runs on dummy_CT {
+		const octetstring c_gmm_att_pcu := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c00020170580460b'O;
+		const octetstring c_gmm_att_pcu_nofcs := '01c001080103e5e000210a0005f4fb146ddd32f44000c8001d1b53432b37159ef9090070000dd9c6321200e00019b32c642401c000201705'O;
+
+		f_llc_dec_and_log(c_gmm_att_pcu);
+
+		//f_llc_assert(f_LLC_append_fcs(c_gmm_att_pcu_nofcs), c_gmm_att_pcu);
+
+		log(valueof(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u)));
+		log(ts_LLC_UI(gmm_auth_req, c_LLC_SAPI_LLGMM, LLC_CR_DL_CMD, g_mmctx.n_u));
+	}
+
+	testcase TC_selftest_rlcmac() runs on dummy_CT {
+		var RlcmacDlCtrlBlock dcb;
+		var RlcmacUlCtrlBlock ucb;
+		const octetstring c_dl_ul_ack_nack := '40240080400000000000000077628dbba14b2b2b2b2b2b'O;
+		const octetstring c_dl_data := '0f00007341c001081200102198c72477ea104895e8b959acc58b108182f4d0454300'O;
+		const octetstring c_dl_data2 := '070002165dc0012b2b2b43c0012b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;
+		const octetstring c_ul_ctrl_ack := '4006ec51b7772b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b'O;
+		const octetstring c_ul_dl_ack_nack := '4008004000000000000000701000edc0000b2b2b2b2b2b'O;
+		const octetstring c_dl_ul_assign := '482857628dbbaf0126e68800082b2b2b2b2b2b2b2b2b2b'O;
+
+		log(c_dl_ul_ack_nack);
+		dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_ack_nack);
+		log(dcb);
+		//log(dec_RlcmacDlCtrlMsg(dcb.payload));
+
+		f_rlcmac_dld_decenc(c_dl_data);
+
+		f_rlcmac_dld_decenc(c_dl_data2);
+
+		log(c_ul_ctrl_ack);
+		ucb := dec_RlcmacUlCtrlBlock(c_ul_ctrl_ack);
+		log(ucb);
+		//log(dec_RlcmacUlCtrlMsg(ucb.payload));
+
+		log(c_ul_dl_ack_nack);
+		ucb := dec_RlcmacUlCtrlBlock(c_ul_dl_ack_nack);
+		log(ucb);
+		//log(dec_RlcmacUlCtrlMsg(ucb.payload));
+
+		log(c_dl_ul_assign);
+		dcb := dec_RlcmacDlCtrlBlock(c_dl_ul_assign);
+		log(dcb);
+		//log(dec_RlcmacDlCtrlMsg(dcb.payload));
+
+		const octetstring c_uld_tlli_noext := '080101a61cab5201c001080103e5e000310a0005f4e61cab5232f44000c8001d1b00'O;
+		f_rlcmac_uld_decenc(c_uld_tlli_noext);
+
+		const octetstring c_uld_tlli_ext7pad := '0001041da61cab5200201705a96e102b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b00'O;
+		log("ULD_decenc");
+		f_rlcmac_uld_decenc(c_uld_tlli_ext7pad);
+		log("UL_decenc");
+		f_rlcmac_ul_decenc(c_uld_tlli_ext7pad);
+
+		f_rlcmac_ul_decenc(c_ul_dl_ack_nack);
+	}
+
+	function f_rlcmac_ul_decenc(in octetstring buf) {
+		log("==================================");
+		log("In: ", buf);
+		var RlcmacUlBlock udb := dec_RlcmacUlBlock(buf);
+		log("Dec: ", udb);
+		var octetstring enc := enc_RlcmacUlBlock(udb);
+		log("Enc: ", enc);
+		if (enc != buf) { setverdict(fail, "Re-encoded data doesn't equal input data"); }
+	}
+
+	function f_rlcmac_uld_decenc(in octetstring buf) {
+		log("==================================");
+		log("In: ", buf);
+		var RlcmacUlDataBlock udb := dec_RlcmacUlDataBlock(buf);
+		log("Dec: ", udb);
+		var octetstring enc := enc_RlcmacUlDataBlock(udb);
+		log("Enc: ", enc);
+		if (enc != buf) { setverdict(fail, "Re-encoded data doesn't equal input data"); }
+	}
+
+	function f_rlcmac_dld_decenc(in octetstring buf) {
+		log("==================================");
+		log("In: ", buf);
+		var RlcmacDlDataBlock udb := dec_RlcmacDlDataBlock(buf);
+		log("Dec: ", udb);
+		var octetstring enc := enc_RlcmacDlDataBlock(udb);
+		log("Enc: ", enc);
+		if (enc != buf) { setverdict(fail, "Re-encoded data doesn't equal input data"); }
+	}
+
+
+	testcase TC_selftest_rr() runs on dummy_CT {
+		//const octetstring c_paging_none := '06210001F02B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B2B'O
+		const octetstring c_paging_none := '1506210001F0'O;
+		const octetstring c_ia_tbf := '2d063f100fe3677bd8440000c800100b2b2b2b2b2b2b2b'O
+		log(c_paging_none);
+		log(dec_GsmRrMessage(c_paging_none));
+
+		log(c_ia_tbf);
+		log(dec_GsmRrMessage(c_ia_tbf));
+	}
+
+	function f_seq_octstr(integer len) return octetstring {
+		var octetstring payload := ''O;
+		for (var integer i := 0; i < len; i := i+1 ) {
+			payload := payload & int2oct(i mod 256, 1);
+		}
+		return payload;
+	}
+
+	testcase TC_ul_tbf_single_llc_sizes() runs on dummy_CT {
+		g_mmctx.imsi := '262420123456789'H;
+		g_mmctx.tlli := f_random_tlli();
+		f_init();
+
+		for (var integer len := 1; len <= 1560; len := len+1) {
+			log("Testing Uplink TBF with single LLC-PDU of ", len, " bytes");
+			var octetstring payload := f_seq_octstr(len);
+			var UlTbfPars ul_tbf_pars := {
+				ack_mode := true,
+				initial_cs := CS1,
+				llc_pdus := {
+					valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u))
+				}
+			}
+			var UlTbfState ul_tbf_state;
+			f_UlTbfState_init(ul_tbf_state, ul_tbf_pars);
+			f_ul_tbf(ul_tbf_state);
+			f_sleep(1.0);
+		}
+
+		f_exit();
+	}
+
+	testcase TC_ul_tbf() runs on dummy_CT {
+		g_mmctx.imsi := '262420123456789'H;
+		g_mmctx.tlli := f_random_tlli();
+		f_init();
+
+		var octetstring payload := f_seq_octstr(1023);
+		var UlTbfPars ul_tbf_pars := {
+			ack_mode := true,
+			initial_cs := CS1,
+			llc_pdus := { 
+				valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u)),
+				valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+1)),
+				valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+2)),
+				valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+3)),
+				valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+4)),
+				valueof(ts_LLC_UI(payload, c_LLC_SAPI_LLGMM, '0'B, g_mmctx.n_u+5))
+			}
+		};
+		var UlTbfState ul_tbf_state;
+		f_UlTbfState_init(ul_tbf_state, ul_tbf_pars);
+		f_ul_tbf(ul_tbf_state);
+
+		f_exit();
+	}
+
+	control {
+		execute(TC_selftest_bssgp());
+		execute(TC_selftest_ns());
+		execute(TC_selftest_llc());
+		execute(TC_selftest_rr());
+		execute(TC_selftest_rlcmac());
+		execute(TC_nsem());
+		execute(TC_paging());
+	}
+};
