diff --git a/gprs_gb/Test.ttcn b/gprs_gb/Test.ttcn
index 6e772dc..759f23c 100644
--- a/gprs_gb/Test.ttcn
+++ b/gprs_gb/Test.ttcn
@@ -1,18 +1,47 @@
 module Test {
 
+	import from General_Types all;
+	import from Osmocom_Types all;
+	import from GSM_Types all;
+	import from GSM_RR_Types all;
 	import from BSSGP_Helper_Functions 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 MobileL3_Types all;
+	import from RLCMAC_Types all;
+	import from RLCMAC_CSN1_Types all;
+	import from LAPDm_RAW_PT all;
+
+	type record MmContext {
+		octetstring	imsi optional,
+		BssgpTlli	tlli,
+		uint9_t		n_u
+	};
 
 	type component dummy_CT {
+		var lapdm_CT lapdm_component;
+		port LAPDm_PT L1;
+
 		port BSSGP_PT BSSGP;
 		var NS_CT ns_component;
 		var BSSGP_CT bssgp_component;
+
+		var MmContext g_mmctx := {
+			tlli := 0,
+			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;
@@ -24,6 +53,11 @@
 		map(ns_component:NSCP, system:NS_CODEC_PORT);
 		ns_component.start(NSStart());
 		bssgp_component.start(BssgpStart());
+
+		lapdm_component := lapdm_CT.create;
+		connect(self:L1, lapdm_component:LAPDM_SP);
+		map(lapdm_component:L1CTL, system:L1CTL);
+		lapdm_component.start(LAPDmStart());
 	}
 
 	function f_bssgp_assert_prepr(in octetstring a, in octetstring b) {
@@ -91,6 +125,8 @@
 		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(t_BSSGP_PS_PAGING_IMSI(196, '262420123456789'H));
 	}
 
 	function f_ns_assert_prepr(in octetstring a, in octetstring b) {
@@ -132,7 +168,76 @@
 		f_ns_dec_and_log(c_ns_reset_pcu);
 	}
 
-	testcase TC_nsem() runs on dummy_CT {
+	const BssgpQosProfile c_DefaultQos := { r := 80, spare := '00'B, c_r := false, t := false, a := false, precedence := 0 };
+	template BssgpTLV c_DefaultLifetimeTLV := t_BSSGP_IE_Lifetime(65535);
+
+	template BssgpTLV t_BSSGP_IE_LLC_PDU(LlcPdu llc) := t_BssgpIE(LLC_PDU, { other := f_LLC_append_fcs(enc_LlcPdu(llc)) });
+
+	template BssgpPdu t_BSSGP_DL_UD(BssgpTlli tlli, LlcPdu llc, BssgpTLVs opt_tlvs := {}) := {
+		pdu_type := DL_UNITDATA,
+		u := {
+			dl_unitdata := {
+				tlli := tlli,
+				qos_profile := c_DefaultQos,
+				pdu_lifetime := c_DefaultLifetimeTLV,
+				//tlvs := opt_tlvs & { t_BSSGP_IE_LLC_PDU(llc) }
+				tlvs := { t_BSSGP_IE_LLC_PDU(llc) }
+			}
+		}
+	};
+
+	template BssgpPdu t_BSSGP_UL_UD(template BssgpTlli tlli, template BssgpCellId cell_id, template octetstring payload) := {
+		pdu_type := UL_UNITDATA,
+		u := {
+			ul_unitdata := {
+				tlli := tlli,
+				qos_profile := ?,
+				cell_id := { iei := CELL_ID, len := 8, u := { cell_id := cell_id } },
+				tlvs := {
+						{ iei := ALIGNMENT_OCTETS, len := ?, u := { other := ? } },
+						{ iei := LLC_PDU, len := ?, u := { other := payload } }
+				}
+			}
+		}
+	}
+
+	template BssgpPdu t_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
+		pdu_type := PAGING_PS,
+		u := {
+			other := {
+				tlvs := { t_BSSGP_IE_Imsi(imsi), t_BSSGP_IE_Bvci(bvci), t_BSSGP_IE_Qos(c_DefaultQos) }
+			}
+		}
+	};
+
+	template BssgpPdu t_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi ptmsi) := {
+		pdu_type := PAGING_PS,
+		u := {
+			other := {
+				tlvs := { t_BSSGP_IE_Imsi(imsi), t_BSSGP_IE_Bvci(bvci), t_BSSGP_IE_Qos(c_DefaultQos), t_BSSGP_IE_Tmsi(ptmsi) }
+			}
+		}
+	};
+
+	const octetstring gmm_auth_req := '081200102198c72477ea104895e8b959acc58b108182'O;
+
+	function tx_gmm(boolean c_r, in octetstring gmm_pdu, LlcSapi sapi := LLC_SAPI_GMM) runs on dummy_CT {
+		var LlcPdu llc;
+
+		log("GMM Tx: ", dec_PDU_L3_SGSN_MS(gmm_pdu));
+
+		log(c_r, g_mmctx.n_u, gmm_pdu, sapi);
+		log(t_LLC_UI(c_r, g_mmctx.n_u, gmm_pdu, sapi));
+		llc := valueof(t_LLC_UI(c_r, g_mmctx.n_u, gmm_pdu, sapi));
+		log(llc);
+		g_mmctx.n_u := g_mmctx.n_u + 1;
+
+		log(t_BSSGP_DL_UD(g_mmctx.tlli, llc));
+
+		BSSGP.send(t_BSSGP_DL_UD(g_mmctx.tlli, llc));
+	}
+
+	function f_bssgp_establish() runs on dummy_CT {
 		timer T:= 60.0;
 
 		f_init();
@@ -144,6 +249,17 @@
 		}
 		T.stop
 		log("BSSGP successfully initialized");
+	}
+
+	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(t_BSSGP_PS_PAGING_IMSI(bvci, imsi));
+		BSSGP.send(t_BSSGP_PS_PAGING_PTMSI(bvci, imsi, tmsi));
 
 		while (true) {
 			var BssgpPdu pdu;
@@ -157,9 +273,329 @@
 		}
 	}
 
+	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); }
+		}
+		T.stop;
+	}
+
+	template RlcmacUlBlock t_RLCMAC_UL_DATA(template uint5_t tfi, template uint4_t cv, template uint7_t bsn,
+						template LlcBlocks blocks := {}, template boolean stall := false) := {
+		data := {
+			mac_hdr := {
+				payload_type := MAC_PT_RLC_DATA,
+				countdown := cv,
+				stall_ind := false,
+				retry := false,
+				spare := '0'B,
+				pfi_ind := false,
+				tfi := tfi,
+				tlli_ind := false,
+				bsn := bsn,
+				e := false
+			},
+			tlli := omit,
+			pfi := omit,
+			blocks := blocks
+		}
+	}
+	template RlcmacUlBlock t_RLCMAC_UL_DATA_TLLI(template uint5_t tfi, template uint4_t cv, template uint7_t bsn,
+						     template LlcBlocks blocks := {}, template boolean stall := false, template GprsTlli tlli) modifies t_RLCMAC_UL_DATA := {
+		data := {
+			tlli := tlli
+		}
+	}
+
+	template DlMacHeader t_RLCMAC_DlMacH(template MacPayloadType pt, template MacRrbp rrbp, template
+uint3_t usf) := {
+		payload_type := pt,
+		rrbp := rrbp,
+		rrbp_valid := fixme,
+		usf := usf
+	}
+
+	template RlcmacDlBlock tr_RLCMAC_ACK_NACK(template uint5_t ul_tfi, template GprsTlli tlli := ?) := {
+		ctrl := {
+			mac_hdr := {
+				payload_type := (MAC_PT_RLCMAC_NO_OPT, MAC_PT_RLCMAC_OPT),
+				rrbp:= ?,
+				rrbp_valid := true,
+				usf := ?
+			},
+			opt := *,
+			payload := {
+				msg_type := PACKET_UL_ACK_NACK,
+				u := {
+					ul_ack_nack := {
+						page_mode := ?,
+						msg_excape := ?,
+						uplink_tfi := ul_tfi,
+						is_egprs := '0'B,
+						gprs := {
+							ch_coding_cmd := ?,
+							ack_nack_desc := ?,
+							cont_res_tlli_present := ?,
+							cont_res_tlli := tlli,
+							pkt_ta_present := ?,
+							pkt_ta := *,
+							pwr_ctrl_present := ?,
+							pwr_ctrl := *
+						}
+					}
+				}
+			}
+		}
+	}
+
+	template UlMacCtrlHeader t_RLCMAC_UlMacCtrlH(template MacPayloadType pt, template boolean retry := false) := {
+		payload_type := pt,
+		spare := '00000'B,
+		retry := retry
+	}
+
+	template RlcmacUlBlock ts_RLCMAC_CTRL_ACK(GprsTlli tlli, CtrlAck ack := MS_RCVD_TWO_RLC_SAME_RTI_DIFF_RBSN) := {
+		ctrl := {
+			mac_hdr := t_RLCMAC_UlMacCtrlH(MAC_PT_RLCMAC_NO_OPT),
+			payload := {
+				msg_type := PACKET_CONTROL_ACK,
+				u := {
+					ctrl_ack := {
+						tlli := tlli,
+						ctrl_ack := ack
+					}
+				}
+			}
+		}
+	}
+
+	template LlcBlock t_RLCMAC_LLCBLOCK(octetstring data, BIT1 more := '0'B, boolean e := true) := {
+		hdr := {
+			length_ind := lengthof(data),
+			more := more,
+			e := e
+		},
+		payload := data
+	}
+
+	function f_random_tlli() return GprsTlli {
+		var GprsTlli tlli := float2int(rnd()* 4294967295.0);
+		return tlli;
+	}
+
+	function f_single_ul_block(GprsCodingScheme cs) runs on dummy_CT {
+		var GprsTlli tlli := f_random_tlli();
+		var octetstring payload := '01020304'O;
+
+		/* establish upling TBF */
+		f_establish_ul_tbf();
+
+		/* Generate LLC PDU consisting of single RLC block and send it via simulated MS */
+		var template RlcmacUlBlock blk := t_RLCMAC_UL_DATA_TLLI(0, 0, 0, {t_RLCMAC_LLCBLOCK(payload)}, false, tlli);
+		L1.send(RLCMAC_ph_data_req:{tbf_id := 0, cs := cs, block := blk});
+		/* ensure that this LLC-PDU arrives from the right TLLI at the (simulated) SGSN */
+		BSSGP.receive(t_BSSGP_UL_UD(tlli, ?, payload));
+
+		/* ensure the MS eceives an UL_ACK_NACK */
+		alt {
+			[] L1.receive(RLCMAC_ph_data_ind:{cs:=?, block:=tr_RLCMAC_ACK_NACK(0, tlli)}) { };
+			[] L1.receive { repeat; };
+		}
+		log("found matching ACK/NACK");
+		/* send CTRL ACK in uplink */
+		//L1.send(FIXME);
+	}
+
+	testcase TC_rach() runs on dummy_CT {
+		var hexstring imsi := '262420123456789'H;
+		var BssgpBvci bvci := 196;
+		var GsmTmsi tmsi := hex2int('01234567'H);
+
+		f_init();
+
+		f_bssgp_establish();
+
+		f_single_ul_block(CS1);
+
+		while (true) {
+			var BssgpPdu pdu;
+			var RLCMAC_ph_data_ind dl_msg;
+			alt {
+
+				[] BSSGP.receive(BssgpPdu:?) -> value pdu {
+					log("BSSGP Rx: ", pdu);
+				}
+				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
+				[] BSSGP.receive { repeat; }
+
+				[] L1.receive(RLCMAC_ph_data_ind:?) -> value dl_msg {
+					log("L1 DL: ", dl_msg);
+				}
+			}
+		}
+	}
+
+
+	testcase TC_nsem() runs on dummy_CT {
+
+		f_bssgp_establish();
+
+		while (true) {
+			var BssgpPdu pdu;
+			alt {
+				[] BSSGP.receive(BssgpPdu:?) -> value pdu {
+					log("BSSGP Rx: ", pdu);
+					//log("GMM Rx: ", dec_PDU_L3_MS_SGSN(pdu.payload));
+					g_mmctx.tlli := pdu.u.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 LlcPdu dec := dec_LlcPdu(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;
+		const octetstring c_ctrl_ui := 'c001'O;
+
+		log(dec_LlcCtrlUnion(c_ctrl_ui));
+		f_llc_assert(enc_LlcCtrlUnion({ ui := { presence := '110'B, spare := '00'B, n_u := 0, e := false, pm := true } }), c_ctrl_ui);
+
+		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(t_LLC_UI(LLC_CR_DL_CMD, g_mmctx.n_u, gmm_auth_req, LLC_SAPI_GMM)));
+		log(t_LLC_UI(LLC_CR_DL_CMD, g_mmctx.n_u, gmm_auth_req, LLC_SAPI_GMM));
+	}
+
+	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));
+	}
+
 	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());
 	}
 };
