diff --git a/gprs_gb/Test.ttcn b/gprs_gb/Test.ttcn
index 1c3fb50..19cfd26 100644
--- a/gprs_gb/Test.ttcn
+++ b/gprs_gb/Test.ttcn
@@ -4,7 +4,7 @@
 	import from Osmocom_Types all;
 	import from GSM_Types all;
 	import from GSM_RR_Types all;
-	import from BSSGP_Helper_Functions all;
+	import from Osmocom_Gb_Types all;
 	import from BSSGP_Types all;
 	import from BSSGP_Emulation all;
 	import from NS_Types all;
@@ -16,7 +16,7 @@
 
 	type record MmContext {
 		octetstring	imsi optional,
-		BssgpTlli	tlli,
+		GprsTlli	tlli,
 		uint9_t		n_u
 	};
 
@@ -59,24 +59,9 @@
 		lapdm_component.start(LAPDmStart());
 	}
 
-	function f_bssgp_assert_prepr(in octetstring a, in octetstring b) {
-		log("BSSGP Input: ", a);
-		log("BSSGP Expected: ", b);
-		var octetstring a_preprocessed := f_BSSGP_expand_len(a);
-		log("BSSGP Preprocessed: ", a_preprocessed);
-
-		if (a_preprocessed != b) {
-			setverdict(fail);
-		} else {
-			setverdict(pass);
-		}
-	}
-
 	function f_bssgp_dec_and_log(in octetstring inp) {
 		log("BSSGP Input: ", inp);
-		var octetstring inp_p := f_BSSGP_expand_len(inp);
-		log("BSSGP Preprocessed: ", inp_p);
-		var BssgpPdu dec := dec_BssgpPdu(inp_p);
+		var PDU_BSSGP dec := dec_PDU_BSSGP(inp);
 		log("BSSGP Decoded: ", dec);
 	}
 
@@ -97,18 +82,6 @@
 		const octetstring c_gmm_mt_det_req := '00bb146ddd0050001682ffff0a8204030e8941c00908050215f0b6'O;
 		const octetstring c_gmm_mo_att_cpl := '01fb146ddd000004088832f44000c80051e000800e000801c009080339d7bc'O;
 
-		/* single byte length to two byte length */
-		f_bssgp_assert_prepr('04058101'O, '0405000101'O);
-		f_bssgp_assert_prepr('040589000102030405060708'O, '04050009000102030405060708'O);
-		/* two byte length to two byte length */
-		f_bssgp_assert_prepr('0405000101'O, '0405000101'O);
-		/* special case: DL-UD + UL-UD */
-		f_bssgp_assert_prepr('00aabbccddeeffaa29822342'O, '00aabbccddeeffaa2900022342'O);
-		f_bssgp_assert_prepr('01aabbccddeeffaa29822342'O, '01aabbccddeeffaa2900022342'O);
-		/* multiple TLVs */
-		f_bssgp_assert_prepr('234281aa4382bbbb'O, '23420001aa430002bbbb'O);
-		f_bssgp_assert_prepr('230080'O, '23000000'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);
@@ -125,16 +98,14 @@
 		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));
+		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);
-		var octetstring a_preprocessed := f_NS_expand_len(a);
-		log("NS Preprocessed: ", a_preprocessed);
 
-		if (a_preprocessed != b) {
+		if (a != b) {
 			setverdict(fail);
 		} else {
 			setverdict(pass);
@@ -143,9 +114,7 @@
 
 	function f_ns_dec_and_log(in octetstring inp) {
 		log("NS Input: ", inp);
-		var octetstring inp_p := f_NS_expand_len(inp);
-		log("NS Preprocessed: ", inp_p);
-		var NsPdu dec := dec_NsPdu(inp_p);
+		var PDU_NS dec := dec_PDU_NS(inp);
 		log("NS Decoded: ", dec);
 	}
 
@@ -167,57 +136,6 @@
 		f_ns_dec_and_log(c_ns_reset_pcu);
 	}
 
-	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 {
@@ -231,9 +149,9 @@
 		log(llc);
 		g_mmctx.n_u := g_mmctx.n_u + 1;
 
-		log(t_BSSGP_DL_UD(g_mmctx.tlli, llc));
+		log(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_LlcPdu(llc)));
 
-		BSSGP.send(t_BSSGP_DL_UD(g_mmctx.tlli, llc));
+		BSSGP.send(ts_BSSGP_DL_UD(g_mmctx.tlli, enc_LlcPdu(llc)));
 	}
 
 	function f_bssgp_establish() runs on dummy_CT {
@@ -257,13 +175,13 @@
 
 		f_bssgp_establish();
 
-		BSSGP.send(t_BSSGP_PS_PAGING_IMSI(bvci, imsi));
-		BSSGP.send(t_BSSGP_PS_PAGING_PTMSI(bvci, imsi, tmsi));
+		BSSGP.send(ts_BSSGP_PS_PAGING_IMSI(bvci, imsi));
+		BSSGP.send(ts_BSSGP_PS_PAGING_PTMSI(bvci, imsi, tmsi));
 
 		while (true) {
-			var BssgpPdu pdu;
+			var PDU_BSSGP pdu;
 			alt {
-				[] BSSGP.receive(BssgpPdu:?) -> value pdu {
+				[] BSSGP.receive(PDU_BSSGP:?) -> value pdu {
 					log("BSSGP Rx: ", pdu);
 				}
 				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
@@ -404,7 +322,7 @@
 		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));
+		BSSGP.receive(tr_BSSGP_UL_UD(tlli, ?, payload));
 
 		/* ensure the MS eceives an UL_ACK_NACK */
 		alt {
@@ -428,11 +346,11 @@
 		f_single_ul_block(CS1);
 
 		while (true) {
-			var BssgpPdu pdu;
+			var PDU_BSSGP pdu;
 			var RLCMAC_ph_data_ind dl_msg;
 			alt {
 
-				[] BSSGP.receive(BssgpPdu:?) -> value pdu {
+				[] BSSGP.receive(PDU_BSSGP:?) -> value pdu {
 					log("BSSGP Rx: ", pdu);
 				}
 				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
@@ -451,12 +369,12 @@
 		f_bssgp_establish();
 
 		while (true) {
-			var BssgpPdu pdu;
+			var PDU_BSSGP pdu;
 			alt {
-				[] BSSGP.receive(BssgpPdu:?) -> value pdu {
+				[] BSSGP.receive(PDU_BSSGP:?) -> value pdu {
 					log("BSSGP Rx: ", pdu);
 					//log("GMM Rx: ", dec_PDU_L3_MS_SGSN(pdu.payload));
-					g_mmctx.tlli := pdu.u.ul_unitdata.tlli;
+					g_mmctx.tlli := oct2int(pdu.pDU_BSSGP_UL_UNITDATA.tLLI);
 					tx_gmm(LLC_CR_DL_CMD, gmm_auth_req);
 				}
 				[] BSSGP.receive(t_BssgpStsInd(?, ?, BVC_S_UNBLOCKED)) { repeat; }
@@ -494,7 +412,7 @@
 
 		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);
+		//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));
