module Osmocom_Gb_Types {

	/* This module contains additional definitions and templates that we use on top of the
	 * TITAN NS + BSSGP modules */

	import from General_Types all;
	import from Osmocom_Types all;
	import from GSM_Types all;
	import from BSSGP_Types all
	import from NS_Types all
	import from Native_Functions all;

	type uint16_t Nsvci;
	type uint16_t Nsei;
	type uint16_t BssgpBvci;

	/* TS 48.016 10.3.7 */
	type enumerated NsPduType {
		NS_PDUT_NS_UNITDATA	('00000000'B),
		NS_PDUT_NS_RESET	('00000010'B),
		NS_PDUT_NS_RESET_ACK	('00000011'B),
		NS_PDUT_NS_BLOCK	('00000100'B),
		NS_PDUT_NS_BLOCK_ACK	('00000101'B),
		NS_PDUT_NS_UNBLOCK	('00000110'B),
		NS_PDUT_NS_UNBLOCK_ACK	('00000111'B),
		NS_PDUT_NS_STATUS	('00001000'B),
		NS_PDUT_NS_ALIVE	('00001010'B),
		NS_PDUT_NS_ALIVE_ACK	('00001011'B)
		/* FIXME: SNS */
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3 */
	type enumerated NsIEI {
		NS_IEI_CAUSE		('00000000'B),
		NS_IEI_NSVCI		('00000001'B),
		NS_IEI_NS_PDU		('00000010'B),
		NS_IEI_BVCI		('00000011'B),
		NS_IEI_NSEI		('00000100'B),
		NS_IEI_LIST_IPv4	('00000101'B),
		NS_IEI_LIST_IPv6	('00000110'B),
		NS_IEI_MAX_NUM_NSVC	('00000111'B),
		NS_IEI_NUM_IPv4_EP	('00001000'B),
		NS_IEI_NUM_IPv6_EP	('00001001'B),
		NS_IEI_RESET_FLAG	('00001010'B),
		NS_IEI_IP_ADDRESS	('00001011'B)
	} with { variant "FIELDLENGTH(8)" };

	/* TS 48.016 10.3.2 */
	type enumerated NsCause {
		NS_CAUSE_TRANSIT_NETWORK_FAILURE		('00000000'B),
		NS_CAUSE_OM_INTERVENTION			('00000001'B),
		NS_CAUSE_EQUIPMENT_FAILURE			('00000010'B),
		NS_CAUSE_NSVC_BLOCKED				('00000011'B),
		NS_CAUSE_NSVC_UNKNOWN				('00000100'B),
		NS_CAUSE_BVCI_UNKNOWN_AT_NSE			('00000101'B),
		NS_CAUSE_SEMANTICALLY_INCORRECT_PDU		('00001000'B),
		NS_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE	('00001010'B),
		NS_CAUSE_PROTOCOL_ERROR_UNSPEIFIED		('00001011'B),
		NS_CAUSE_INVALID_ESSENTIAL_IE			('00001100'B),
		NS_CAUSE_MISSING_ESSENTIAL_IE			('00001101'B),
		NS_CAUSE_INVALID_NR_OF_IPv4_ENDPOINTS		('00001110'B),
		NS_CAUSE_INVALID_NR_OF_IPv6_ENDPOINTS		('00001111'B),
		NS_CAUSE_INVALID_NR_OF_NSVCS			('00010000'B),
		NS_CAUSE_INVALID_WEIGHTS			('00010001'B),
		NS_CAUSE_UNKNOWN_IP_ENDPOINT			('00010010'B),
		NS_CAUSE_UNKNOWN_IP_ADDRESS			('00010011'B),
		NS_CAUSE_IP_TEST_FAILEDA			('00010100'B)
	} with { variant "FIELDLENGTH(8)" };

	template (value) NS_SDU_ControlBits t_SduCtrlB := {
		rBit := '0'B,
		cBit := '0'B,
		spare := '000000'B
	}

	template (value) CauseNS ts_NS_IE_CAUSE(NsCause cause) := {
		iEI := '00'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		cause := int2oct(enum2int(valueof(cause)), 1)
	}
	function ts_NS_IE_CAUSE_omit(template (omit) NsCause cause) return template (omit) CauseNS {
		var template (omit) CauseNS ret;
		if (istemplatekind(cause, "omit")) {
			return omit;
		} else {
			ret := {
				iEI := '00'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				cause := int2oct(enum2int(valueof(cause)), 1)
			}
			return ret;
		}
	}

	function tr_NS_IE_CAUSE(template NsCause cause) return template CauseNS {
		var template CauseNS ret;
		ret.iEI := '00'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (istemplatekind(cause, "omit")) {
			return omit;
		} else if (istemplatekind(cause, "*")) {
			return *;
		} else if (istemplatekind(cause, "?")) {
			ret.cause := ?
		} else {
			ret.cause := int2oct(enum2int(valueof(cause)), 1);
		}
		return ret;
	}

	function ts_SNS_IP_ADDR(template (omit) IPAddress ip) return template (omit) IP_Address_NS {
		var template (omit) IP_Address_NS ret;
		if (istemplatekind(ip, "omit")) {
			return omit;
		} else {
			ret.iEI := '0B'O;
			ret.ipAddress := ip;
			if (ischosen(ip.ip4Address)) {
				ret.addressType := '01'O;
			} else {
				ret.addressType := '02'O;
			}
		}
		return ret;
	}
	function tr_SNS_IP_ADDR(template IPAddress ip) return template IP_Address_NS {
		var template IP_Address_NS ret;
		ret.iEI := '0B'O;
		if (istemplatekind(ip, "omit")) {
			return omit;
		} else if (istemplatekind(ip, "*")) {
			return *;
		} else if (istemplatekind(ip, "?")) {
			return ?;
		} else {
			ret.ipAddress := ip;
			if (ischosen(ip.ip4Address)) {
				ret.addressType := '01'O;
			} else {
				ret.addressType := '02'O;
			}
		}
		return ret;
	}

	private function f_oct_or_wc(template integer inp, integer len) return template octetstring {
		if (istemplatekind(inp, "omit")) {
			return omit;
		} else if (istemplatekind(inp, "*")) {
			return *;
		} else if (istemplatekind(inp, "?")) {
			return ?;
		}
		return int2oct(valueof(inp), len);
	}

	private function f_hex_or_wc(template integer inp, integer len) return template hexstring {
		if (istemplatekind(inp, "omit")) {
			return omit;
		} else if (istemplatekind(inp, "*")) {
			return *;
		} else if (istemplatekind(inp, "?")) {
			return ?;
		}
		return int2hex(valueof(inp), len);
	}

	template (value) NS_VCI ts_NS_IE_NSVCI(Nsvci nsvci) := {
		iEI := '01'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nS_VCI := int2oct(nsvci, 2)
	}
	template NS_VCI tr_NS_IE_NSVCI(template Nsvci nsvci) := {
		iEI := '01'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nS_VCI := f_oct_or_wc(nsvci, 2)
	}

	template (value) NSEI_NS ts_NS_IE_NSEI(Nsei nsei) := {
		iEI:= '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nSEI := int2oct(nsei, 2)
	}
	template NSEI_NS tr_NS_IE_NSEI(template Nsei nsei) := {
		iEI:= '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nSEI := f_oct_or_wc(nsei, 2)
	}

	template (value) IP4_Element ts_SNS_IPv4(charstring ip, integer udp_port,
						 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
		ipAddress := f_inet_addr(ip),
		uDP_Port := int2oct(udp_port, 2),
		signallingWeight := int2oct(sig_weight, 1),
		dataWeight := int2oct(data_weight, 1)
	}
	function tr_SNS_IPv4(template charstring ip, template integer udp_port,
				template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
	return template IP4_Element {
		var template IP4_Element e;
		if (istemplatekind(ip, "?")) {
			e.ipAddress := ?;
		} else {
			e.ipAddress := f_inet_addr(valueof(ip));
		}
		if (istemplatekind(udp_port, "?")) {
			e.uDP_Port := ?;
		} else {
			e.uDP_Port := int2oct(valueof(udp_port), 2);
		}
		if (istemplatekind(sig_weight, "?")) {
			e.signallingWeight := ?;
		} else {
			e.signallingWeight := int2oct(valueof(sig_weight), 1);
		}
		if (istemplatekind(data_weight, "?")) {
			e.dataWeight := ?;
		} else {
			e.dataWeight := int2oct(valueof(data_weight), 1);
		}
		return e;
	}

	template (value) IP6_Element ts_SNS_IPv6(charstring ip, integer udp_port,
						 uint8_t sig_weight := 1, uint8_t data_weight := 1) := {
		ipAddress := f_inet6_addr(ip),
		uDP_Port := int2oct(udp_port, 2),
		signallingWeight := int2oct(sig_weight, 1),
		dataWeight := int2oct(data_weight, 1)
	}
	function tr_SNS_IPv6(template charstring ip, template integer udp_port,
				template uint8_t sig_weight := ?, template uint8_t data_weight := ?)
	return template IP6_Element {
		var template IP6_Element e;
		if (istemplatekind(ip, "?")) {
			e.ipAddress := ?;
		} else {
			e.ipAddress := f_inet6_addr(valueof(ip));
		}
		if (istemplatekind(udp_port, "?")) {
			e.uDP_Port := ?;
		} else {
			e.uDP_Port := int2oct(valueof(udp_port), 2);
		}
		if (istemplatekind(sig_weight, "?")) {
			e.signallingWeight := ?;
		} else {
			e.signallingWeight := int2oct(valueof(sig_weight), 1);
		}
		if (istemplatekind(data_weight, "?")) {
			e.dataWeight := ?;
		} else {
			e.dataWeight := int2oct(valueof(data_weight), 1);
		}
		return e;
	}


	template (value) PDU_NS ts_NS_RESET(NsCause cause, Nsvci nsvci, Nsei nsei) := {
		pDU_NS_Reset := {
			nsPduType := '02'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := ts_NS_IE_NSVCI(nsvci),
			nSEI_NS := ts_NS_IE_NSEI(nsei)
		}
	}
	template PDU_NS tr_NS_RESET(template NsCause cause, template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset := {
			nsPduType := '02'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := tr_NS_IE_NSVCI(nsvci),
			nSEI_NS := tr_NS_IE_NSEI(nsei)
		}
	}

	template (value) PDU_NS ts_NS_RESET_ACK(Nsvci nsvci, Nsei nsei) := {
		pDU_NS_Reset_Ack := {
			nsPduType := '03'O,
			nS_VCI := ts_NS_IE_NSVCI(nsvci),
			nSEI_NS := ts_NS_IE_NSEI(nsei)
		}
	}
	template PDU_NS tr_NS_RESET_ACK(template Nsvci nsvci, template Nsei nsei) := {
		pDU_NS_Reset_Ack := {
			nsPduType := '03'O,
			nS_VCI := tr_NS_IE_NSVCI(nsvci),
			nSEI_NS := tr_NS_IE_NSEI(nsei)
		}
	}

	template (value) PDU_NS ts_NS_BLOCK(NsCause cause, Nsvci nsvci) := {
		pDU_NS_Block := {
			nsPduType := '04'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := ts_NS_IE_NSVCI(nsvci)
		}
	}
	template PDU_NS tr_NS_BLOCK(template NsCause cause, template Nsvci nsvci) := {
		pDU_NS_Block := {
			nsPduType := '04'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := tr_NS_IE_NSVCI(nsvci)
		}
	}

	template (value) PDU_NS ts_NS_BLOCK_ACK(Nsvci nsvci) := {
		pDU_NS_Block_Ack := {
			nsPduType := '05'O,
			nS_VCI := ts_NS_IE_NSVCI(nsvci)
		}
	}
	template PDU_NS tr_NS_BLOCK_ACK(template Nsvci nsvci) := {
		pDU_NS_Block_Ack := {
			nsPduType := '05'O,
			nS_VCI := tr_NS_IE_NSVCI(nsvci)
		}
	}

	template PDU_NS t_NS_UNBLOCK := {
		pDU_NS_Unblock := {
			nsPduType := '06'O
		}
	}

	template PDU_NS t_NS_UNBLOCK_ACK := {
		pDU_NS_Unblock_Ack := {
			nsPduType := '07'O
		}
	}

	template PDU_NS t_NS_ALIVE := {
		pDU_NS_Alive := {
			nsPduType := '0A'O
		}
	}

	template PDU_NS t_NS_ALIVE_ACK := {
		pDU_NS_Alive_Ack := {
			nsPduType := '0B'O
		}
	}

	template (value) PDU_NS ts_NS_STATUS(NsCause cause, PDU_NS pdu) := {
		pDU_NS_Status := {
			nsPduType := '08'O,
			causeNS := ts_NS_IE_CAUSE(cause),
			nS_VCI := omit,
			nS_PDU := {
				iEI := '02'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				ns_PDU := enc_PDU_NS(pdu)
			},
			bVCI_NS := omit,
			listofIP4Elements := omit,
			listofIP6Elements := omit
		}
	}

	template PDU_NS tr_NS_STATUS(template NsCause cause) := {
		pDU_NS_Status := {
			nsPduType := '08'O,
			causeNS := tr_NS_IE_CAUSE(cause),
			nS_VCI := *,
			nS_PDU := *,
			bVCI_NS := *,
			listofIP4Elements := *,
			listofIP6Elements := *
		}
	}

	template (value) PDU_NS ts_NS_UNITDATA(template (value) NS_SDU_ControlBits bits, BssgpBvci bvci, octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := int2oct(bvci, 2),
			nS_SDU := sdu
		}
	}
	template PDU_NS tr_NS_UNITDATA(template NS_SDU_ControlBits bits, template BssgpBvci bvci, template
octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := f_oct_or_wc(bvci, 2),
			nS_SDU := sdu
		}
	}



	private function ts_num_of_ep(OCT1 iei, template (omit) uint16_t num_ep)
	return template (omit) NumberOfIP_Endpoints {
		var template (omit) NumberOfIP_Endpoints t;
		if (istemplatekind(num_ep, "omit")) {
			return omit;
		} else {
			t.iEI := iei;
			t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
			return t;
		}
	}
	private function tr_num_of_ep(OCT1 iei, template uint16_t num_ep)
	return template NumberOfIP_Endpoints {
		var template NumberOfIP_Endpoints t;
		if (istemplatekind(num_ep, "omit")) {
			return omit;
		} else if (istemplatekind(num_ep, "*")) {
			return *;
		} else if (istemplatekind(num_ep, "?")) {
			return ?;
		} else {
			t.iEI := iei;
			t.numberOfIP_Endpoints := int2oct(valueof(num_ep), 2);
			return t;
		}
	}


	template (value) ResetFlag ts_SNS_IE_ResetFlag(boolean rst) := {
		iEI := '0A'O,
		resetBIT := bool2bit(rst),
		spare := '0000000'B
	}
	template ResetFlag tr_SNS_IE_ResetFlag(template boolean rst) := {
		iEI := '0A'O,
		resetBIT := bool2bit_tmpl(rst),
		spare := '0000000'B
	}

	template (value) EndFlag ts_SNS_IE_EndFlag(boolean end) := {
		eBIT := bool2bit(end),
		spare := '0000000'B
	}
	template EndFlag tr_SNS_IE_EndFlag(template boolean end) := {
		eBIT := bool2bit_tmpl(end),
		spare := '0000000'B
	}

	template (value) MaxNumberOfNSVCs ts_SNS_IE_MaxNumOfNSVCs(uint16_t num) := {
		iEI := '07'O,
		maxNumberOfNSVCs := int2oct(num, 2)
	}
	template MaxNumberOfNSVCs tr_SNS_IE_MaxNumOfNSVCs(template uint16_t num) := {
		iEI := '07'O,
		maxNumberOfNSVCs := f_oct_or_wc(num, 2)
	}

	template (value) PDU_NS ts_SNS_SIZE(Nsei nsei, boolean rst_flag := true,
				uint16_t max_nsvcs := 2,
				template (omit) uint16_t num_v4 := 1,
				template (omit) uint16_t num_v6 := omit) := {
		pDU_SNS_Size := {
			nsPduType := '12'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			resetFlag := ts_SNS_IE_ResetFlag(rst_flag),
			maxNumberOfNSVCs := ts_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
			numberOfIP4_Endpoints := ts_num_of_ep('08'O, num_v4),
			numberOfIP6_Endpoints := ts_num_of_ep('09'O, num_v6)
		}
	}
	template PDU_NS tr_SNS_SIZE(template Nsei nsei, template boolean rst_flag := ?,
				template uint16_t max_nsvcs := ?,
				template uint16_t num_v4 := ?,
				template uint16_t num_v6 := *) := {
		pDU_SNS_Size := {
			nsPduType := '12'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			resetFlag := tr_SNS_IE_ResetFlag(rst_flag),
			maxNumberOfNSVCs := tr_SNS_IE_MaxNumOfNSVCs(max_nsvcs),
			numberOfIP4_Endpoints := tr_num_of_ep('08'O, num_v4),
			numberOfIP6_Endpoints := tr_num_of_ep('09'O, num_v6)
		}
	}

	template PDU_NS ts_SNS_SIZE_ACK(Nsei nsei, template (omit) NsCause cause) := {
		pDU_SNS_Size_Ack := {
			nsPduType := '13'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			causeNS := ts_NS_IE_CAUSE_omit(cause)
		}
	}
	template PDU_NS tr_SNS_SIZE_ACK(template Nsei nsei, template NsCause cause) := {
		pDU_SNS_Size_Ack := {
			nsPduType := '13'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			causeNS := tr_NS_IE_CAUSE(cause)
		}
	}

	private function ts_SNS_IE_ListIP4(template (omit) IP4_Elements elem)
	return template (omit) ListofIP4Elements {
		var template (omit) ListofIP4Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				iP4_Elements := elem
			}
			return r;
		}
	}
	private function tr_SNS_IE_ListIP4(template IP4_Elements elem)
	return template ListofIP4Elements {
		var template ListofIP4Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ? /* overwritten */
				},
				iP4_Elements := elem
			}
			return r;
		}
	}

	private function ts_SNS_IE_ListIP6(template (omit) IP6_Elements elem)
	return template (omit) ListofIP6Elements {
		var template (omit) ListofIP6Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else {
			r := {
				iEI := '06'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				iP6_Elements := elem
			}
			return r;
		}
	}
	private function tr_SNS_IE_ListIP6(template IP6_Elements elem)
	return template ListofIP6Elements {
		var template ListofIP6Elements r;
		if (istemplatekind(elem, "omit")) {
			return omit;
		} else if (istemplatekind(elem, "*")) {
			return *;
		} else {
			r := {
				iEI := '06'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ? /* overwritten */
				},
				iP6_Elements := elem
			}
			return r;
		}
	}

	template (value) PDU_NS ts_SNS_CONFIG(Nsei nsei, boolean end_flag,
					template (omit) IP4_Elements v4 := omit,
					template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Config := {
			nsPduType := '0F'O,
			endFlag := ts_SNS_IE_EndFlag(end_flag),
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_CONFIG(template Nsei nsei, template boolean end_flag,
					template IP4_Elements v4 := omit,
					template IP6_Elements v6 := omit) := {
		pDU_SNS_Config := {
			nsPduType := '0F'O,
			endFlag := tr_SNS_IE_EndFlag(end_flag),
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template (value) PDU_NS ts_SNS_CONFIG_ACK(Nsei nsei, template (omit) NsCause cause) := {
		pDU_SNS_Config_Ack := {
			nsPduType := '10'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			causeNS := ts_NS_IE_CAUSE_omit(cause)
		}
	}
	template PDU_NS tr_SNS_CONFIG_ACK(template Nsei nsei, template NsCause cause) := {
		pDU_SNS_Config_Ack := {
			nsPduType := '10'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			causeNS := tr_NS_IE_CAUSE(cause)
		}
	}

	template (value) PDU_NS ts_SNS_ADD(Nsei nsei, uint8_t trans_id,
					   template (omit) IP4_Elements v4,
					   template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Add := {
			nsPduType := '0D'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_ADD(template Nsei nsei, template uint8_t trans_id,
				   template IP4_Elements v4,
				   template IP6_Elements v6 := omit) := {
		pDU_SNS_Add := {
			nsPduType := '0D'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template (value) PDU_NS ts_SNS_DEL(Nsei nsei, uint8_t trans_id,
					   template (omit) IPAddress ip_sns,
					   template (omit) IP4_Elements v4,
					   template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Delete := {
			nsPduType := '11'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			iP_Address_NS := ts_SNS_IP_ADDR(ip_sns),
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_DEL(template Nsei nsei, template uint8_t trans_id,
				   template IPAddress ip_sns,
				   template IP4_Elements v4,
				   template IP6_Elements v6 := omit) := {
		pDU_SNS_Delete := {
			nsPduType := '11'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			iP_Address_NS := tr_SNS_IP_ADDR(ip_sns),
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}

	template (value) PDU_NS ts_SNS_CHG_WEIGHT(Nsei nsei, uint8_t trans_id,
						  template (omit) IP4_Elements v4,
						  template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_ChangeWeight := {
			nsPduType := '0E'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_CHG_WEIGHT(template Nsei nsei, template uint8_t trans_id,
					  template IP4_Elements v4,
					  template IP6_Elements v6 := omit) := {
		pDU_SNS_ChangeWeight := {
			nsPduType := '0E'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}


	template (value) PDU_NS ts_SNS_ACK(Nsei nsei, uint8_t trans_id,
					   template (omit) NsCause cause := omit,
					   template (omit) IP4_Elements v4 := omit,
					   template (omit) IP6_Elements v6 := omit) := {
		pDU_SNS_Ack := {
			nsPduType := '0C'O,
			nSEI_NS := ts_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			causeNS := ts_NS_IE_CAUSE_omit(cause),
			iP_Address_NS := omit,
			listofIP4Elements := ts_SNS_IE_ListIP4(v4),
			listofIP6Elements := ts_SNS_IE_ListIP6(v6)
		}
	}
	template PDU_NS tr_SNS_ACK(template Nsei nsei, template uint8_t trans_id := ?,
					   template NsCause cause := omit,
					   template IP4_Elements v4 := *,
					   template IP6_Elements v6 := *) := {
		pDU_SNS_Ack := {
			nsPduType := '0C'O,
			nSEI_NS := tr_NS_IE_NSEI(nsei),
			transactionID := trans_id,
			causeNS := tr_NS_IE_CAUSE(cause),
			iP_Address_NS := omit,
			listofIP4Elements := tr_SNS_IE_ListIP4(v4),
			listofIP6Elements := tr_SNS_IE_ListIP6(v6)
		}
	}







	type record BssgpCellId {
		RoutingAreaIdentification	ra_id,
		CellIdentity			cell_id
	} with { variant "" };

	template (value) BssgpCellId ts_BssgpCellId(template (value) RoutingAreaIdentification rai, CellIdentity cell_id) := {
		ra_id := rai,
		cell_id := cell_id
	};

	type enumerated BssgpCause {
		BSSGP_CAUSE_PROC_OVERLOAD			('00'H),
		BSSGP_CAUSE_EQUIMENT_FAILURE			('01'H),
		BSSGP_CAUSE_TRANSIT_NETWORK_FAILURE		('02'H),
		BSSGP_CAUSE_NET_SV_CAP_MOD_GT_ZERO_KBPS		('03'H),
		BSSGP_CAUSE_UNKNOWN_MS				('04'H),
		BSSGP_CAUSE_BVCI_UNKNOWN			('05'H),
		BSSGP_CAUSE_CELL_TRAFFIC_CONGESTION		('06'H),
		BSSGP_CAUSE_SGSN_CONGESTION			('07'H),
		BSSGP_CAUSE_OM_INTERVENTION			('08'H),
		BSSGP_CAUSE_BVCI_BLOCKED			('09'H),
		BSSGP_CAUSE_PFC_CREATE_FAILURE			('0a'H),
		BSSGP_CAUSE_PFC_PREEMPTED			('0b'H),
		BSSGP_CAUSE_ABQP_NO_MORE_SUPPORTED		('0c'H),
		BSSGP_CAUSE_SEMANTICALLY_INCORRECT_PDU		('20'H),
		BSSGP_CAUSE_INVALID_MANDATORY_IE		('21'H),
		BSSGP_CAUSE_MISSING_MANDATORY_IE		('22'H),
		BSSGP_CAUSE_MISSING_CONDITIONAL_IE		('23'H),
		BSSGP_CAUSE_UNEXPECTED_CONDITIONAL_IE		('24'H),
		BSSGP_CAUSE_CONDITIONAL_IE_ERROR		('25'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_PROTOCOL_STATE ('26'H),
		BSSGP_CAUSE_PROTOCOL_ERROR_UNSPECIFIED		('27'H),
		BSSGP_CAUSE_PDU_NOT_COMPATIBLE_WITH_FEATURE_SET	('28'H),
		BSSGP_CAUSE_REQUESTED_INFO_NOT_AVAILABLE	('29'H),
		BSSGP_CAUSE_UNKNOWN_DESTINATION_ADDRESS		('2a'H),
		BSSGP_CAUSE_UNKNOWN_RIM_APP_IDENTITY		('2b'H),
		BSSGP_CAUSE_INVALID_CONTAINER_UNIT_INFO		('2c'H),
		BSSGP_CAUSE_PFC_QUEUING				('2d'H),
		BSSGP_CAUSE_PFC_CREATED_SUCCESSFULLY		('2e'H),
		BSSGP_CAUSE_T12_EXPIRY				('2f'H),
		BSSGP_CAUSE_MS_UNDER_PS_HANDOVER_TREATMENT	('30'H),
		BSSGP_CAUSE_UPLINK_QUALITY			('31'H),
		BSSGP_CAUSE_UPLINK_STRENGTH			('32'H),
		BSSGP_CAUSE_DOWNLINK_QUALITY			('33'H),
		BSSGP_CAUSE_DOWNLINK_STRENGTH			('34'H),
		BSSGP_CAUSE_DISTANCE				('35'H),
		BSSGP_CAUSE_BETTER_CELL				('36'H),
		BSSGP_CAUSE_TRAFFIC				('37'H),
		BSSGP_CAUSE_OM_INTERVENTION2			('38'H),
		BSSGP_CAUSE_MS_BACK_ON_OLD_CHANNEL		('39'H),
		BSSGP_CAUSE_T13_EXPIRY				('3a'H),
		BSSGP_CAUSE_T14_EXPIRY				('3b'H),
		BSSGP_CAUSE_NOT_ALL_REQUESTED_PFC_CREATED	('3c'H)
	} with { variant "FIELDLENGTH(8)" };

	private function t_FLUSH_ACTION(template OCT1 act)
	return template Flush_Action {
		var template Flush_Action r;
		if (istemplatekind(act, "omit")) {
			return omit;
		} else if (istemplatekind(act, "*")) {
			return *;
		} else {
			r := {
				iEI := '0C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				actionValue := act
			}
			return r;
		}
	}
	private function t_NO_OCT_AFF(template integer oct_aff)
	return template Number_of_octets_affected {
		var template Number_of_octets_affected r;
		if (istemplatekind(oct_aff, "omit")) {
			return omit;
		} else if (istemplatekind(oct_aff, "*")) {
			return *;
		} else {
			r := {
				iEI := '25'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 3
				},
				number_of_octets_transfered_or_deleted := f_oct_or_wc(oct_aff, 3)
			}
			return r;
		}
	}

	private function t_LLC_FRAMES_DISCARDED(template integer frames_discarded)
	return template LLC_Frames_Discarded {
		var template LLC_Frames_Discarded r;
		if (istemplatekind(frames_discarded, "omit")) {
			return omit;
		} else if (istemplatekind(frames_discarded, "*")) {
			return *;
		} else {
			r := {
				iEI := '0F'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				number_of_frames_discarded := f_hex_or_wc(frames_discarded, 2)
			}
			return r;
		}
	}

	private function t_BSSGP_BVCI(template BssgpBvci bvci)
	return template BVCI {
		var template BVCI r;
		if (istemplatekind(bvci, "omit")) {
			return omit;
		} else if (istemplatekind(bvci, "*")) {
			return *;
		} else {
			r := {
				iEI := '04'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				unstructured_value := f_oct_or_wc(bvci, 2)
			}
			return r;
		}
	}
	private function  t_BSSGP_NSEI(template Nsei nsei)
	return template NSEI_BSSGP {
		var template NSEI_BSSGP r;
		if (istemplatekind(nsei, "omit")) {
			return omit;
		} else if (istemplatekind(nsei, "*")) {
			return *;
		} else {
			r := {
				iEI:= '3E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				nSEI := f_oct_or_wc(nsei, 2)
			}
			return r;
		}
	}

	template (value) TLLI_BSSGP ts_BSSGP_TLLI(template (value) GprsTlli tlli) := {
		iEI := '1F'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 4
		},
		tLLI_Value := tlli
	}
	template TLLI_BSSGP tr_BSSGP_TLLI(template GprsTlli tlli) := {
		iEI := '1F'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 4
		},
		tLLI_Value := tlli
	}
	private function f_ts_BSSGP_TLLI(template (omit) GprsTlli tlli) return template (omit) TLLI_BSSGP {
		if (istemplatekind(tlli, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_TLLI(valueof(tlli));
		}
	}
	private function f_tr_BSSGP_TLLI(template GprsTlli tlli) return template TLLI_BSSGP {
		if (istemplatekind(tlli, "omit")) {
			return omit;
		} else if (istemplatekind(tlli, "*")) {
			return *;
		} else {
			return tr_BSSGP_TLLI(valueof(tlli));
		}
	}

	template (value) Suspend_Reference_Number ts_BSSGP_SUSP_REF(template (value) OCT1 susp_ref) := {
		iEI := '1D'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		suspend_Reference_Number_value := susp_ref
	}
	template Suspend_Reference_Number tr_BSSGP_SUSP_REF(template OCT1 susp_ref) := {
		iEI := '1D'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		suspend_Reference_Number_value := susp_ref
	}

	template IMSI_BSSGP tr_BSSGP_IMSI(template hexstring imsi) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := ?,
		type_of_Identity := '001'B,
		oddevenIndicator := ?,
		digits := imsi
	}

	template IMSI_BSSGP ts_BSSGP_IMSI(hexstring imsi) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := { length1 := 0 /* overwritten */ },
		type_of_Identity := '001'B,
		oddevenIndicator := f_hex_is_odd_length(imsi),
		digits := imsi
	}
	private function f_ts_BSSGP_IMSI(template (omit) hexstring imsi) return template (omit) IMSI_BSSGP {
		if (istemplatekind(imsi, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_IMSI(valueof(imsi));
		}
	}
	private function f_tr_BSSGP_IMSI(template hexstring imsi) return template IMSI_BSSGP {
		if (istemplatekind(imsi, "omit")) {
			return omit;
		} else if (istemplatekind(imsi, "*")) {
			return *;
		} else {
			return tr_BSSGP_IMSI(imsi);
		}
	}

	template (present) TMSI_BSSGP tr_BSSGP_TMSI(GsmTmsi tmsi) := {
		iEI := '20'O,
		ext := '1'B,
		lengthIndicator := { length1 := 4 },
		tMSI_Value := int2oct(tmsi, 4)
	}

	template TMSI_BSSGP ts_BSSGP_TMSI(GsmTmsi tmsi) := {
		iEI := '20'O,
		ext := '1'B,
		lengthIndicator := { length1 := 4 },
		tMSI_Value := int2oct(tmsi, 4)
	}
	private function f_ts_BSSGP_TMSI(template (omit) GsmTmsi tmsi) return template (omit) TMSI_BSSGP {
		if (istemplatekind(tmsi, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_TMSI(valueof(tmsi));
		}
	}
	private function f_tr_BSSGP_TMSI(template GsmTmsi tmsi) return template TMSI_BSSGP {
		if (istemplatekind(tmsi, "omit")) {
			return omit;
		} else if (istemplatekind(tmsi, "*")) {
			return *;
		} else if (istemplatekind(tmsi, "?")) {
			return ?;
		} else {
			return tr_BSSGP_TMSI(valueof(tmsi));
		}
	}

	function f_bssgp_length_ind(integer len) return LIN2_2a {
		var LIN2_2a ret;
		if (len > 255) {
			ret := { length2 := len };
		} else {
			ret := { length1 := len };
		}
		return ret;
	}

	template LLC_PDU ts_BSSGP_LLC_PDU(octetstring pdu) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := f_bssgp_length_ind(lengthof(pdu)),
		lLC_PDU := pdu
	}

	template LLC_PDU tr_BSSGP_LLC_PDU(template octetstring pdu := ?) := {
		iEI := '0E'O,
		ext := ?,
		lengthIndicator := ?,
		lLC_PDU := pdu
	}

	function ts_BSSGP_CAUSE(template (omit) BssgpCause cause) return template (omit) Cause_BSSGP {
		var template (omit) Cause_BSSGP ret;
		if (istemplatekind(cause, "omit")) {
			ret := omit;
		} else {
			ret.iEI := '07'O;
			ret.ext := '1'B;
			ret.lengthIndicator := { length1 := 1 };
			ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
		}
		return ret;
	}
	function t_BSSGP_CAUSE(template BssgpCause cause) return template Cause_BSSGP {
		var template Cause_BSSGP ret;
		ret.iEI := '07'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (isvalue(cause)) {
			ret.cause_Value := int2oct(enum2int(valueof(cause)), 1);
		} else {
			ret.cause_Value := ?
		}
		return ret;
	}

	function t_BSSGP_IE_CellId(template BssgpCellId cid) return template Cell_Identifier {
		var template Cell_Identifier ret := {
			iEI := '08'O,
			ext := '1'B,
			lengthIndicator := { length1 := 8 },
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			cI_value := ?
		}
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		if (isvalue(cid) and isvalue(cid.ra_id)) {
			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
		}
		if (isvalue(cid)) {
			ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
		}
		return ret;
	}

	template (value) Tag ts_BSSGP_IE_Tag(OCT1 tag) := {
		iEI := '1E'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		unstructured_Value := tag
	}

	template (present) Tag tr_BSSGP_IE_Tag(template (present) OCT1 tag) := {
		iEI := '1E'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		unstructured_Value := tag
	}

	template (value) RA_Cap_UPD_CAUSE ts_BSSGP_IE_RACU_Cause(template (value) OCT1 cause) := {
		iEI := '1A'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		rA_CAP_UPD_Cause_value := cause
	}

	template (present) RA_Cap_UPD_CAUSE tr_BSSGP_IE_RACU_Cause(template (present) OCT1 cause) := {
		iEI := '1A'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		rA_CAP_UPD_Cause_value := cause
	}

	/* 10.4.12 */
	template PDU_BSSGP ts_BVC_RESET(BssgpCause cause, BssgpBvci bvci,
					template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET := {
			bssgpPduType := '22'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := ts_BSSGP_CAUSE(cause),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := omit,
			extended_Feature_Bitmap := omit
		}
	}
	template PDU_BSSGP tr_BVC_RESET(template BssgpCause cause, template BssgpBvci bvci,
					template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET := {
			bssgpPduType := '22'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := t_BSSGP_CAUSE(cause),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}

	/* 10.4.13 */
	template PDU_BSSGP ts_BVC_RESET_ACK(BssgpBvci bvci, template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET_ACK := {
			bssgpPduType := '23'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := omit,
			extended_Feature_Bitmap := omit
		}
	}
	template PDU_BSSGP tr_BVC_RESET_ACK(template BssgpBvci bvci, template BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET_ACK := {
			bssgpPduType := '23'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}


	/* 10.4.10 */
	template PDU_BSSGP t_BVC_UNBLOCK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK := {
			bssgpPduType := '24'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.11 */
	template PDU_BSSGP t_BVC_UNBLOCK_ACK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK_ACK := {
			bssgpPduType := '25'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.8 */
	template PDU_BSSGP t_BVC_BLOCK(template BssgpBvci bvci, template BssgpCause cause) := {
		pDU_BSSGP_BVC_BLOCK := {
			bssgpPduType := '20'O,
			bVCI := t_BSSGP_BVCI(bvci),
			cause := t_BSSGP_CAUSE(cause)
		}
	}

	/* 10.4.9 */
	template PDU_BSSGP t_BVC_BLOCK_ACK(template BssgpBvci bvci) := {
		pDU_BSSGP_BVC_BLOCK_ACK := {
			bssgpPduType := '21'O,
			bVCI := t_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.4 */
	template PDU_BSSGP t_BVC_FC_BVC(uint16_t bmax, uint16_t bucket_leak_rate,
					uint16_t bmax_default_ms, uint16_t r_default_ms, OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_BVC := {
			bssgpPduType := '26'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			bVC_Bucket_Size := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bmax_default_MS := {
				iEI := '01'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax_default_ms, 2)
			},
			r_default_MS := {
				iEI := '1C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
			},
			bucket_Full_Ratio := omit,
			bVC_Measurement := omit,
			flow_Control_Granularity := omit
		}
	}
	template PDU_BSSGP tr_BVC_FC_BVC(template uint16_t bmax := ?,
					 template uint16_t bucket_leak_rate := ?,
					 template uint16_t bmax_default_ms := ?,
					 template uint16_t r_default_ms := ?,
					 template OCT1 tag := ?) := {
		pDU_BSSGP_FLOW_CONTROL_BVC := {
			bssgpPduType := '26'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			bVC_Bucket_Size := {
				iEI := '05'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bmax_default_MS := {
				iEI := '01'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax_default_ms, 2)
			},
			r_default_MS := {
				iEI := '1C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_default_MS_value := f_oct_or_wc(r_default_ms, 2)
			},
			bucket_Full_Ratio := *,
			bVC_Measurement := *,
			flow_Control_Granularity := *
		}
	}

	/* 10.4.5 */
	template PDU_BSSGP t_BVC_FC_BVC_ACK(template OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_BVC_ACK := {
			bssgpPduType := '27'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			}
		}
	}

	/* 10.4.6 */
	template (value) PDU_BSSGP ts_BVC_FC_MS(GprsTlli tlli, uint16_t bmax, uint16_t bucket_leak_rate,
						OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_MS := {
			bssgpPduType := '28'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			mS_Bucket_Size := {
				iEI := '12'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bucket_Full_Ratio := omit,
			flow_Control_Granularity := omit
		}
	}
	template (present) PDU_BSSGP tr_BVC_FC_MS(template (present) GprsTlli tlli := ?,
						  template (present) uint16_t bmax := ?,
						  template (present) uint16_t bucket_leak_rate := ?,
						  template (present) OCT1 tag := ?) := {
		pDU_BSSGP_FLOW_CONTROL_MS := {
			bssgpPduType := '28'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			},
			mS_Bucket_Size := {
				iEI := '12'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := f_oct_or_wc(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := f_oct_or_wc(bucket_leak_rate, 2)
			},
			bucket_Full_Ratio := *,
			flow_Control_Granularity := *
		}
	}

	/* 10.4.7 */
	template (value) PDU_BSSGP ts_BVC_FC_MS_ACK(template (value) GprsTlli tlli,
						    template (value) OCT1 tag) := {

		pDU_BSSGP_FLOW_CONTROL_MS_ACK := {
			bssgpPduType := '29'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			}
		}
	}
	template (present) PDU_BSSGP tr_BVC_FC_MS_ACK(template (present) GprsTlli tlli,
						      template (present) OCT1 tag := ?) := {

		pDU_BSSGP_FLOW_CONTROL_MS_ACK := {
			bssgpPduType := '29'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			}
		}
	}

	/* 10.4.14 */
	template PDU_BSSGP ts_BSSGP_STATUS(template BssgpBvci bvci, template BssgpCause cause,
					   PDU_BSSGP pdu) := {
		pDU_BSSGP_STATUS := {
			bssgpPduType := '41'O,
			cause := t_BSSGP_CAUSE(cause),
			bVCI := t_BSSGP_BVCI(bvci),
			pDU_in_Error := {
				iEI := '15'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 0 /* overwritten */
				},
				erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
			}
		}
	}
	template PDU_BSSGP tr_BSSGP_STATUS(template BVCI bvci := ?, template BssgpCause cause := ?,
					   template octetstring pdu := ?) := {
		pDU_BSSGP_STATUS := {
			bssgpPduType := '41'O,
			cause := t_BSSGP_CAUSE(cause),
			bVCI := bvci,
			pDU_in_Error := {
				iEI := '15'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := ?
				},
				erroneous_BSSGP_PDU := pdu
			}
		}
	}

	private function f_presence_bit_MultislotCap_GPRS_BSSGP(template (omit) MultislotCap_GPRS_BSSGP mscap_gprs) return BIT1 {
		if (istemplatekind(mscap_gprs, "omit")) {
			return '0'B;
		}
		return '1'B;
	}
	private function f_presence_bit_MultislotCap_EGPRS_BSSGP(template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs) return BIT1 {
		if (istemplatekind(mscap_egprs, "omit")) {
			return '0'B;
		}
		return '1'B;
	}
	template (value) MSRACapabilityValuesRecord_BSSGP ts_RaCapRec_BSSGP(BIT4 att := '0001'B /* E-GSM */, template (omit) MultislotCap_GPRS_BSSGP mscap_gprs := omit, template (omit) MultislotCap_EGPRS_BSSGP mscap_egprs := omit) := {
		mSRACapabilityValues := {
			mSRACapabilityValuesExclude1111 := {
				accessTechnType := att, /* E-GSM */
				accessCapabilities := {
					lengthIndicator := 0, /* overwritten */
					accessCapabilities := {
						rfPowerCapability := '001'B, /* FIXME */
						presenceBitA5 := '0'B,
						a5bits := omit,
						esind := '1'B,
						psbit := '0'B,
						vgcs := '0'B,
						vbs := '0'B,
						presenceBitMultislot := '1'B,
						multislotcap := {
							presenceBitHscsd := '0'B,
							hscsdmultislotclass := omit,
							presenceBitGprs := f_presence_bit_MultislotCap_GPRS_BSSGP(mscap_gprs),
							gprsmultislot := mscap_gprs,
							presenceBitSms := '0'B,
							multislotCap_SMS := omit,
							multislotCapAdditionsAfterRel97 := {
								presenceBitEcsdmulti := '0'B,
								ecsdmultislotclass := omit,
								presenceBitEgprsmulti := f_presence_bit_MultislotCap_EGPRS_BSSGP(mscap_egprs),
								multislotCap_EGPRS := mscap_egprs,
								presenceBitDtmGprsmulti := '0'B,
								multislotCapdtmgprsmultislotsubclass := omit
							}
						},
						accessCapAdditionsAfterRel97 := omit
					},
					spare_bits := omit
				}
			}
		},
		presenceBitMSRACap := '0'B
	};
	template (present) MSRACapabilityValuesRecord_BSSGP
	tr_RaCapRec_BSSGP(template (present) BIT4 att := '0001'B /* E-GSM */, template MultislotCap_GPRS_BSSGP mscap_gprs := *,
			  template MultislotCap_EGPRS_BSSGP mscap_egprs := *) := {
		mSRACapabilityValues := {
			mSRACapabilityValuesExclude1111 := {
				accessTechnType := att, /* E-GSM */
				accessCapabilities := {
					lengthIndicator := ?, /* overwritten */
					accessCapabilities := {
						rfPowerCapability := '001'B, /* FIXME */
						presenceBitA5 := ?,
						a5bits := *,
						esind := '1'B,
						psbit := '0'B,
						vgcs := '0'B,
						vbs := '0'B,
						presenceBitMultislot := '1'B,
						multislotcap := {
							presenceBitHscsd := '0'B,
							hscsdmultislotclass := omit,
							presenceBitGprs := ?,
							gprsmultislot := mscap_gprs,
							presenceBitSms := '0'B,
							multislotCap_SMS := omit,
							multislotCapAdditionsAfterRel97 := {
								presenceBitEcsdmulti := '0'B,
								ecsdmultislotclass := *,
								presenceBitEgprsmulti := ?,
								multislotCap_EGPRS := mscap_egprs,
								presenceBitDtmGprsmulti := ?,
								multislotCapdtmgprsmultislotsubclass := *
							}
						},
						accessCapAdditionsAfterRel97 := *
					},
					spare_bits := *
				}
			}
		},
		presenceBitMSRACap := '0'B
	};


	template QoS_Profile_V t_defaultQos := {
		peak_Bit_Rate := int2oct(80, 2),
		precedence := '000'B,
		a_bit := '0'B,
		t_bit := '0'B,
		c_r_bit := '0'B,
		peakBitRateGranularity := '00'B
	}

	template QoS_Profile ts_QoS_TLV(template QoS_Profile_V qos) := {
		iEI := '18'O,
		ext := '1'B,
		lengthIndicator := { length1 := 3 },
		peak_Bit_Rate := qos.peak_Bit_Rate,
		precedence := qos.precedence,
		a_bit := qos.a_bit,
		t_bit := qos.t_bit,
		c_r_bit := qos.c_r_bit,
		peakBitRateGranularity := qos.peakBitRateGranularity
	}

	template PDU_Lifetime t_DefaultLifetime(uint16_t delay := 65535) := {
		iEI := '16'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		delay_Value := f_oct_or_wc(delay, 2)
	}

	template DRX_Parameters t_defaultDRXparam := {
		iEI := '0A'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		splitPG_CycleCode := '00'O,
		nonDRXTimer := '000'B,
		splitOnCCCH := '0'B,
		cnSpecificDRXCycleLength := '0000'B
	}

	function ts_BSSGP_IE_MSRAcap_omit(template (omit) MSRadioAccessCapabilityV_BSSGP racap) return template (omit) MS_Radio_Access_Capability {
		var template (omit) MS_Radio_Access_Capability ret;
		if (istemplatekind(racap, "omit")) {
			return omit;
		} else {
			ret := {
				iEI := '13'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				mSRadioAccessCapabilityV_BSSGP := racap
			}
			return ret;
		}
	}

	function tr_BSSGP_IE_MSRAcap(template MSRadioAccessCapabilityV_BSSGP racap) return template MS_Radio_Access_Capability {
		var template MS_Radio_Access_Capability ret;
		if (istemplatekind(racap, "omit")) {
			return omit;
		} else {
			ret := {
				iEI := '13'O,
				ext := ?,
				lengthIndicator := ?,
				mSRadioAccessCapabilityV_BSSGP := racap
			}
			return ret;
		}
	}

	/* 10.2.1 */
	template PDU_BSSGP ts_BSSGP_DL_UD(GprsTlli tlli, octetstring pdu,
					  template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit,
					  template (omit) IMSI_BSSGP imsi := omit) := {
		pDU_BSSGP_DL_UNITDATA := {
			bssgpPduType := '00'O,
			tLLI_current := tlli,
			qoS_Profile := t_defaultQos,
			pDU_Lifetime := t_DefaultLifetime(65535),
			mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap),
			priority := omit,
			dRX_Parameters := omit,
			iMSI := imsi,
			tLLI_old := omit,
			pFI := omit,
			lSA_Information := omit,
			service_UTRAN_CCO := omit,
			service_Class_Indicator := omit,
			subscriber_Profile_ID_For_RAT_Priority := omit,
			redirection_Indication := omit,
			redirection_Completed := omit,
			unconfirmed_Send_State_Variable := omit,
			sCI := omit,
			gGSN_PGW_Location := omit,
			eDRX_Paremeters := omit,
			old_Routing_Area_Identification := omit,
			attach_Indicator := omit,
			alignment_octets := omit,
			lLC_PDU := ts_BSSGP_LLC_PDU(pdu),
			initialLLC_PDU := omit
		}
	}
	template PDU_BSSGP tr_BSSGP_DL_UD(template (present) GprsTlli tlli, template (present) octetstring pdu,
					  template IMSI_BSSGP imsi := omit) := {
		pDU_BSSGP_DL_UNITDATA := {
			bssgpPduType := '00'O,
			tLLI_current := tlli,
			qoS_Profile := ?,
			pDU_Lifetime := ?,
			mS_Radio_Access_Capability := *,
			priority := *,
			dRX_Parameters := *,
			iMSI := imsi,
			tLLI_old := *,
			pFI := *,
			lSA_Information := *,
			service_UTRAN_CCO := *,
			service_Class_Indicator := *,
			subscriber_Profile_ID_For_RAT_Priority := *,
			redirection_Indication := *,
			redirection_Completed := *,
			unconfirmed_Send_State_Variable := *,
			sCI := *,
			gGSN_PGW_Location := *,
			eDRX_Paremeters := *,
			old_Routing_Area_Identification := *,
			attach_Indicator := *,
			alignment_octets := *,
			lLC_PDU := tr_BSSGP_LLC_PDU(pdu),
			initialLLC_PDU := *
		}
	}

	/* 10.2.2 */
	template PDU_BSSGP ts_BSSGP_UL_UD(GprsTlli tlli, BssgpCellId cell_id, octetstring payload) := {
		pDU_BSSGP_UL_UNITDATA := {
			bssgpPduType := '01'O,
			tLLI := tlli,
			qoS_Profile := t_defaultQos,
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			pFI := omit,
			lSA_Identifier_List := omit,
			redirect_Attempt_Flag := omit,
			iMSI_BSSGP := omit,
			unconfirmed_Send_State_Variable := omit,
			selected_PLMN_ID := omit,
			selected_Operator := omit,
			cS_Registered_Operator := omit,
			alignment_octets := omit,
			lLC_PDU := ts_BSSGP_LLC_PDU(payload)
		}
	}
	template PDU_BSSGP tr_BSSGP_UL_UD(template GprsTlli tlli := ?, template BssgpCellId cell_id := ?,
					  template octetstring payload := ?) := {
		pDU_BSSGP_UL_UNITDATA := {
			bssgpPduType := '01'O,
			tLLI := tlli,
			qoS_Profile := ?,
			cell_Identifier := t_BSSGP_IE_CellId(cell_id),
			pFI := *,
			lSA_Identifier_List := *,
			redirect_Attempt_Flag := *,
			iMSI_BSSGP := *,
			unconfirmed_Send_State_Variable := *,
			selected_PLMN_ID := *,
			selected_Operator := *,
			cS_Registered_Operator := *,
			alignment_octets := *,
			lLC_PDU := tr_BSSGP_LLC_PDU(payload)
		}
	}

	/* 10.3.2 */
	template PDU_BSSGP tr_BSSGP_CS_PAGING(BssgpBvci bvci) := {
		pDU_BSSGP_PAGING_CS := {
			bssgpPduType := '07'O,
			iMSI := ?,
			dRX_Parameters := ?,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			tLLI := *,
			channel_needed := *,
			eMLPP_Priority := *,
			tMSI := *,
			global_CN_Id := *
		}
	}
	template PDU_BSSGP ts_BSSGP_CS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
		pDU_BSSGP_PAGING_CS := {
			bssgpPduType := '07'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := t_defaultDRXparam,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			tLLI := omit,
			channel_needed := omit,
			eMLPP_Priority := omit,
			tMSI := omit,
			global_CN_Id := omit
		}
	}
	template PDU_BSSGP ts_BSSGP_CS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_CS := {
			bssgpPduType := '07'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := t_defaultDRXparam,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			tLLI := omit,
			channel_needed := omit,
			eMLPP_Priority := omit,
			tMSI := ts_BSSGP_TMSI(tmsi),
			global_CN_Id := omit
		}
	}

	/* 10.3.1 */
	template PDU_BSSGP tr_BSSGP_PS_PAGING(template BssgpBvci bvci) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ?,
			dRX_Parameters := *,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := *,
			aBQP := *,
			qoS_Profile := ?,
			pTMSI := *,
			eDRX_Paremeters := *
		}
	}
	template PDU_BSSGP ts_BSSGP_PS_PAGING_IMSI(BssgpBvci bvci, hexstring imsi) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := omit,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := omit,
			aBQP := omit,
			qoS_Profile := ts_QoS_TLV(t_defaultQos),
			pTMSI := omit,
			eDRX_Paremeters := omit
		}
	}
	template PDU_BSSGP ts_BSSGP_PS_PAGING_PTMSI(BssgpBvci bvci, hexstring imsi, GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_PS := {
			bssgpPduType := '06'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			dRX_Parameters := omit,
			paging_Field4 := {
				bVCI := t_BSSGP_BVCI(bvci)
			},
			pFI := omit,
			aBQP := omit,
			qoS_Profile := ts_QoS_TLV(t_defaultQos),
			pTMSI := ts_BSSGP_TMSI(tmsi),
			eDRX_Paremeters := omit
		}
	}

	template (value) Paging_Field4 ts_BssgpP4BssArea := {
		bSS_Area_Indication := {
			iEI := '02'O,
			ext := '1'B,
			lengthIndicator := {
				length1 := 1
			},
			bSS_indicator := '00'O
		}
	}

	template (value) Paging_Field4 ts_BssgpP4LAC(GSM_Types.LocationAreaIdentification lai) := {
		location_Area := ts_BSSGP_LA_ID(lai)
	}

	template (value) Paging_Field4 ts_BssgpP4RAC(GSM_Types.RoutingAreaIdentification rai) := {
		routeing_Area := ts_BSSGP_RA_ID(rai)
	}

	template (value) Paging_Field4 ts_BssgpP4Bvci(BssgpBvci bvci) := {
		bVCI := t_BSSGP_BVCI(bvci)
	}

	template (value) Location_Area ts_BSSGP_LA_ID(GSM_Types.LocationAreaIdentification input) := {
		iEI := '10'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 5
		},
		mccDigit1 := input.mcc_mnc[0],
		mccDigit2 := input.mcc_mnc[1],
		mccDigit3 := input.mcc_mnc[2],
		mncDigit3 := input.mcc_mnc[3],
		mncDigit1 := input.mcc_mnc[4],
		mncDigit2 := input.mcc_mnc[5],
		lac := int2oct(input.lac, 2)
	}

	template (value) Routeing_Area ts_BSSGP_RA_ID(GSM_Types.RoutingAreaIdentification input) := {
		iEI := '1B'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 6
		},
		mccDigit1 := input.lai.mcc_mnc[0],
		mccDigit2 := input.lai.mcc_mnc[1],
		mccDigit3 := input.lai.mcc_mnc[2],
		mncDigit3 := input.lai.mcc_mnc[3],
		mncDigit1 := input.lai.mcc_mnc[4],
		mncDigit2 := input.lai.mcc_mnc[5],
		lac := int2oct(input.lai.lac, 2),
		rac := int2oct(input.rac, 1)
	}

	private function f_ts_BSSGP_RA_ID(template (omit) GSM_Types.RoutingAreaIdentification input)
	return template (omit) Routeing_Area {
		if (istemplatekind(input, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_RA_ID(valueof(input));
		}
	}

	private function f_tr_BSSGP_RA_ID(template GSM_Types.RoutingAreaIdentification input)
	return template Routeing_Area {
		if (istemplatekind(input, "omit")) {
			return omit;
		} else if (istemplatekind(input, "*")) {
			return *;
		} else if (istemplatekind(input, "?")) {
			return ?;
		} else {
			return ts_BSSGP_RA_ID(valueof(input));
		}
	}

	/* 10.3.6 */
	template (value) PDU_BSSGP ts_BSSGP_SUSPEND(GprsTlli tlli, RoutingAreaIdentification ra_id) := {
		pDU_BSSGP_SUSPEND := {
			bssgpPduType := '0B'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}
	template PDU_BSSGP tr_BSSGP_SUSPEND(template GprsTlli tlli, RoutingAreaIdentification ra_id) := {
		pDU_BSSGP_SUSPEND := {
			bssgpPduType := '0B'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}

	/* 10.3.7 */
	template (value) PDU_BSSGP ts_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
							template (value) OCT1 susp_ref) := {
		pDU_BSSGP_SUSPEND_ACK := {
			bssgpPduType := '0C'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
		}
	}
	template PDU_BSSGP tr_BSSGP_SUSPEND_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
						template OCT1 susp_ref) := {
		pDU_BSSGP_SUSPEND_ACK := {
			bssgpPduType := '0C'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
		}
	}

	/* 10.3.8 */
	template (value) PDU_BSSGP ts_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
							 template (omit) BssgpCause cause) := {
		pDU_BSSGP_SUSPEND_NACK := {
			bssgpPduType := '0D'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := ts_BSSGP_CAUSE(cause)
		}
	}
	template PDU_BSSGP tr_BSSGP_SUSPEND_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
						template BssgpCause cause) := {
		pDU_BSSGP_SUSPEND_NACK := {
			bssgpPduType := '0D'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := t_BSSGP_CAUSE(cause)
		}
	}


	/* 10.3.9 */
	template (value) PDU_BSSGP ts_BSSGP_RESUME(GprsTlli tlli, RoutingAreaIdentification ra_id,
						   OCT1 susp_ref) := {
		pDU_BSSGP_RESUME := {
			bssgpPduType := '0E'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := ts_BSSGP_SUSP_REF(susp_ref)
		}
	}
	template PDU_BSSGP tr_BSSGP_RESUME(template GprsTlli tlli, RoutingAreaIdentification ra_id,
					   template OCT1 susp_ref) := {
		pDU_BSSGP_RESUME := {
			bssgpPduType := '0E'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			suspend_Reference_Number := tr_BSSGP_SUSP_REF(susp_ref)
		}
	}

	/* 10.3.10 */
	template (value) PDU_BSSGP ts_BSSGP_RESUME_ACK(GprsTlli tlli, RoutingAreaIdentification ra_id)
		:= {
		pDU_BSSGP_RESUME_ACK := {
			bssgpPduType := '0F'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}
	template PDU_BSSGP tr_BSSGP_RESUME_ACK(template GprsTlli tlli,
						RoutingAreaIdentification ra_id) := {
		pDU_BSSGP_RESUME_ACK := {
			bssgpPduType := '0F'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id)
		}
	}

	/* 10.3.11 */
	template (value) PDU_BSSGP ts_BSSGP_RESUME_NACK(GprsTlli tlli, RoutingAreaIdentification ra_id,
						template (omit) BssgpCause cause) := {
		pDU_BSSGP_RESUME_NACK := {
			bssgpPduType := '10'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := ts_BSSGP_CAUSE(cause)
		}
	}
	template PDU_BSSGP tr_BSSGP_RESUME_NACK(template GprsTlli tlli,
						RoutingAreaIdentification ra_id,
						template BssgpCause cause) := {
		pDU_BSSGP_RESUME_NACK := {
			bssgpPduType := '10'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			routeing_Area := ts_BSSGP_RA_ID(ra_id),
			cause := t_BSSGP_CAUSE(cause)
		}
	}

	/* 10.3.12 */
	template (value) PDU_BSSGP ts_BSSGP_DUMMY_PAGING_PS(hexstring imsi,
							    template (omit) RoutingAreaIdentification ra) := {
		pDU_BSSGP_DUMMY_PAGING_PS := {
			bssgpPduType := '12'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			routeing_Area := f_ts_BSSGP_RA_ID(ra),
			eDRX_Paremeters := omit
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_DUMMY_PAGING_PS(hexstring imsi,
							      template RoutingAreaIdentification ra) := {
		pDU_BSSGP_DUMMY_PAGING_PS := {
			bssgpPduType := '12'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			routeing_Area := f_tr_BSSGP_RA_ID(ra),
			eDRX_Paremeters := omit
		}
	}

	template (value) Time_Until_Next_Paging_Occasion ts_TimeNextPag(uint8_t mins, uint8_t secs) := {
		iEI := '93'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		minutes := mins,
		spare := '00'B,
		seconds := secs,
		spare2 := '00'B
	}
	template (present) Time_Until_Next_Paging_Occasion tr_TimeNextPag(template (present) uint8_t mins,
									  template (present) uint8_t secs) := {
		iEI := '93'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		minutes := mins,
		spare := ?,
		seconds := secs,
		spare2 := ?
	}

	/* 10.3.13 */
	template (value) PDU_BSSGP ts_BSSGP_DUMMY_PAGING_PS_RESP(hexstring imsi, uint8_t mins, uint8_t secs) := {
		pDU_BSSGP_DUMMY_PAGING_PS_RESPONSE := {
			bssgpPduType := '13'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			time_Until_Next_Paging_Occasion := ts_TimeNextPag(mins, secs)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_DUMMY_PAGING_PS_RESP(hexstring imsi,
								   template (present) uint8_t mins,
								   template (present) uint8_t secs) := {
		pDU_BSSGP_DUMMY_PAGING_PS_RESPONSE := {
			bssgpPduType := '13'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			time_Until_Next_Paging_Occasion := tr_TimeNextPag(mins, secs)
		}
	}

	/* 10.3.14 */
	template (value) PDU_BSSGP ts_BSSGP_PAGING_PS_REJ(hexstring imsi, uint8_t mins, uint8_t secs,
							  template (omit) GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_PS_REJECT := {
			bssgpPduType := '11'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			pTMSI := f_ts_BSSGP_TMSI(tmsi),
			time_Until_Next_Paging_Occasion := ts_TimeNextPag(mins, secs)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_PAGING_PS_REJ(hexstring imsi,
							    template (present) uint8_t mins,
							    template (present) uint8_t secs,
							    template GsmTmsi tmsi) := {
		pDU_BSSGP_PAGING_PS_REJECT := {
			bssgpPduType := '11'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			pTMSI := f_tr_BSSGP_TMSI(tmsi),
			time_Until_Next_Paging_Occasion := tr_TimeNextPag(mins, secs)
		}
	}

	/* 10.3.15 */
	template (value) PDU_BSSGP ts_BSSGP_MS_REG_ENQ(hexstring imsi) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY := {
			bssgpPduType := '14'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			mME_Query := omit
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_MS_REG_ENQ(hexstring imsi) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY := {
			bssgpPduType := '14'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			mME_Query := *
		}
	}

	/* 11.3.126 */
	template (value) PLMN_Identity ts_BSSGP_PlmnId(template (value) BcdMccMnc mccmnc) := {
		iEI := '96'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 3
		},
		mccDigit1 := mccmnc[0],
		mccDigit2 := mccmnc[1],
		mccDigit3 := mccmnc[2],
		mncDigit3 := mccmnc[5],
		mncDigit1 := mccmnc[3],
		mncDigit2 := mccmnc[4]
	}
	template (present) PLMN_Identity tr_BSSGP_PlmnId(template (present) BcdMccMnc mccmnc) := {
		iEI := '96'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 3
		},
		mccDigit1 := mccmnc[0],
		mccDigit2 := mccmnc[1],
		mccDigit3 := mccmnc[2],
		mncDigit3 := mccmnc[5],
		mncDigit1 := mccmnc[3],
		mncDigit2 := mccmnc[4]
	}
	private function f_ts_BSSGP_PlmnId(template (omit) BcdMccMnc mccmnc)
	return template (omit) PLMN_Identity {
		if (istemplatekind(mccmnc, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_PlmnId(mccmnc);
		}
	}
	private function f_tr_BSSGP_PlmnId(template BcdMccMnc mccmnc)
	return template PLMN_Identity {
		if (istemplatekind(mccmnc, "omit")) {
			return omit;
		} else if (istemplatekind(mccmnc, "*")) {
			return *;
		} else if (istemplatekind(mccmnc, "?")) {
			return ?;
		} else {
			return ts_BSSGP_PlmnId(mccmnc);
		}
	}

	/* 10.3.16 */
	template (value) PDU_BSSGP ts_BSSGP_MS_REW_ENQ_RESP(hexstring imsi, template (omit) BcdMccMnc mccmnc) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY_RESPONSE := {
			bssgpPduType := '15'O,
			iMSI := ts_BSSGP_IMSI(imsi),
			pS_Registered_Operator := f_ts_BSSGP_PlmnId(mccmnc)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_MS_REW_ENQ_RESP(hexstring imsi, template BcdMccMnc mccmnc) := {
		pDU_BSSGP_MS_REGISTRATION_ENQUIRY_RESPONSE := {
			bssgpPduType := '15'O,
			iMSI := tr_BSSGP_IMSI(imsi),
			pS_Registered_Operator := f_tr_BSSGP_PlmnId(mccmnc)
		}
	}

	/* 10.4.1 */
	template (value) PDU_BSSGP ts_BSSGP_FLUSH_LL(GprsTlli tlli, template (value) BssgpBvci bvci_old,
						     template (omit) BssgpBvci bvci_new := omit,
						     template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL := {
			bssgpPduType := '2A'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			bVCI_old := t_BSSGP_BVCI(bvci_old),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}
	template PDU_BSSGP tr_BSSGP_FLUSH_LL(template GprsTlli tlli, template BssgpBvci bvci_old,
					     template (omit) BssgpBvci bvci_new := omit,
					     template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL := {
			bssgpPduType := '2A'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			bVCI_old := t_BSSGP_BVCI(bvci_old),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}

	/* 10.4.2 */
	template (value) PDU_BSSGP ts_BSSGP_FLUSH_LL_ACK(GprsTlli tlli, template (value) OCT1 act,
							 template (value) integer oct_affected,
							 template (omit) BssgpBvci bvci_new := omit,
							 template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL_ACK := {
			bssgpPduType := '2B'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			flush_Action := t_FLUSH_ACTION(act),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			number_of_octets_affected := t_NO_OCT_AFF(oct_affected),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}
	template PDU_BSSGP tr_BSSGP_FLUSH_LL_ACK(template GprsTlli tlli, template OCT1 act,
						 template integer oct_affected,
						 template (omit) BssgpBvci bvci_new := omit,
						 template (omit) Nsei nsei := omit) := {
		pDU_BSSGP_FLUSH_LL_ACK := {
			bssgpPduType := '2B'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			flush_Action := t_FLUSH_ACTION(act),
			bVCI_new := t_BSSGP_BVCI(bvci_new),
			number_of_octets_affected := t_NO_OCT_AFF(oct_affected),
			nSEI := t_BSSGP_NSEI(nsei)
		}
	}

	/* 10.4.3 */
	template (value) PDU_BSSGP ts_BSSGP_LLC_DISCARDED(GprsTlli tlli, template (value) integer frames_discarded,
							 template (value) BssgpBvci bvci,
							 template (value) integer oct_deleted) := {
		pDU_BSSGP_LLC_DISCARDED := {
			bssgpPduType := '2C'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			lLC_Frames_Discarded := t_LLC_FRAMES_DISCARDED(frames_discarded),
			bVCI := t_BSSGP_BVCI(bvci),
			number_of_octets_deleted := t_NO_OCT_AFF(oct_deleted),
			pFI := omit
		}
	}
	template PDU_BSSGP tr_BSSGP_LLC_DISCARDED(template GprsTlli tlli, template integer frames_discarded,
						 template BssgpBvci bvci,
						 template integer oct_deleted) := {
		pDU_BSSGP_LLC_DISCARDED := {
			bssgpPduType := '2C'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			lLC_Frames_Discarded := t_LLC_FRAMES_DISCARDED(frames_discarded),
			bVCI := t_BSSGP_BVCI(bvci),
			number_of_octets_deleted := t_NO_OCT_AFF(oct_deleted),
			pFI := *
		}
	}

	/* 10.2.3 */
	template (value) PDU_BSSGP ts_BSSGP_RA_CAP(GprsTlli tlli,
						   template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit) := {
		pDU_BSSGP_RA_CAPABILITY := {
			bssgpPduType := '02'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_RA_CAP(template (present) GprsTlli tlli,
						     template MSRadioAccessCapabilityV_BSSGP racap) := {
		pDU_BSSGP_RA_CAPABILITY := {
			bssgpPduType := '02'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			mS_Radio_Access_Capability := tr_BSSGP_IE_MSRAcap(racap)
		}
	}


	/* 10.3.3 */
	template (value) PDU_BSSGP ts_BSSGP_RA_CAP_UPD(GprsTlli tlli, OCT1 tag) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE := {
			bssgpPduType := '08'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := ts_BSSGP_IE_Tag(tag)
		}
	}
	template (present) PDU_BSSGP tr_BSSGP_RA_CAP_UPD(template (present) GprsTlli tlli,
						     template OCT1 tag) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE := {
			bssgpPduType := '08'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := tr_BSSGP_IE_Tag(tag)
		}
	}


	/* 10.3.4 */
	template (value) PDU_BSSGP
	ts_BSSGP_RA_CAP_UPD_ACK(GprsTlli tlli, OCT1 tag, template (value) OCT1 cause,
			        template (omit) MSRadioAccessCapabilityV_BSSGP racap := omit) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := {
			bssgpPduType := '09'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := ts_BSSGP_IE_Tag(tag),
			iMSI := omit,
			rA_Cap_UPDATE_CAUSE := ts_BSSGP_IE_RACU_Cause(cause),
			mS_Radio_Access_Capability := ts_BSSGP_IE_MSRAcap_omit(racap)
		}
	}
	template (present) PDU_BSSGP
	tr_BSSGP_RA_CAP_UPD_ACK(template (present) GprsTlli tlli, template OCT1 tag, template (present) OCT1 cause,
			        template MSRadioAccessCapabilityV_BSSGP racap := omit) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := {
			bssgpPduType := '09'O,
			tLLI := ts_BSSGP_TLLI(tlli),
			tag := tr_BSSGP_IE_Tag(tag),
			iMSI := omit,
			rA_Cap_UPDATE_CAUSE := tr_BSSGP_IE_RACU_Cause(cause),
			mS_Radio_Access_Capability := tr_BSSGP_IE_MSRAcap(racap)
		}
	}

	type enumerated BssgpRadioCause {
		BSSGP_RADIO_CAUSE_CONTACT_LOST		('00'H),
		BSSGP_RADIO_CAUSE_LINK_QUAL_INSUFF	('01'H),
		BSSGP_RADIO_CAUSE_CELL_RESEL_ORDERED	('02'H),
		BSSGP_RADIO_CAUSE_CELL_RESEL_PREPARE	('03'H),
		BSSGP_RADIO_CAUSE_CELL_RESEL_FAILURE 	('04'H)
	} with { variant "FIELDLENGTH(8)" };

        function ts_BSSGP_RADIO_CAUSE(template (omit) BssgpRadioCause cause) return template (omit) Radio_Cause {
		var template (omit) Radio_Cause ret;
		if (istemplatekind(cause, "omit")) {
			ret := omit;
		} else {
			ret.iEI := '19'O;
			ret.ext := '1'B;
			ret.lengthIndicator := { length1 := 1 };
			ret.radio_Cause_Value := int2oct(enum2int(valueof(cause)), 1);
		}
		return ret;
	}
	function tr_BSSGP_RADIO_CAUSE(template BssgpRadioCause cause) return template (present) Radio_Cause {
		var template Radio_Cause ret;
		ret.iEI := '19'O;
		ret.ext := '1'B;
		ret.lengthIndicator := { length1 := 1 };
		if (isvalue(cause)) {
			ret.radio_Cause_Value := int2oct(enum2int(valueof(cause)), 1);
		} else {
			ret.radio_Cause_Value := ?
		}
		return ret;
	}

	/* 10.3.5 */
	template (value) PDU_BSSGP
	ts_BSSGP_RADIO_STATUS(template (omit) GprsTlli tlli, template (value) BssgpRadioCause cause,
			      template (omit) GsmTmsi tmsi := omit,
			      template (omit) hexstring imsi := omit) := {
		pDU_BSSGP_RADIO_STATUS := {
			bssgpPduType := '0a'O,
			tLLI := f_ts_BSSGP_TLLI(tlli),
			tMSI := f_ts_BSSGP_TMSI(tmsi),
			iMSI := f_ts_BSSGP_IMSI(imsi),
			radio_Cause := ts_BSSGP_RADIO_CAUSE(cause)
		}
	}
	template (present) PDU_BSSGP
	tr_BSSGP_RADIO_STATUS(template GprsTlli tlli, template (present) BssgpRadioCause cause,
			      template GsmTmsi tmsi := *, template hexstring imsi := *) := {
		pDU_BSSGP_RADIO_STATUS := {
			bssgpPduType := '0a'O,
			tLLI := f_tr_BSSGP_TLLI(tlli),
			tMSI := f_tr_BSSGP_TMSI(tmsi),
			iMSI := f_tr_BSSGP_IMSI(imsi),
			radio_Cause := tr_BSSGP_RADIO_CAUSE(cause)
		}
	}

	/* 10.4.15 */
	template (value) PDU_BSSGP
	ts_BSSGP_INVOKE_TRACE(OCT1 eq_trace, OCT2 ref) := {
		pDU_BSSGP_SGSN_INVOKE_TRACE := {
			bssgpPduType := '40'O,
			traceType := {
				iEI := '22'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				equipment_Trace := eq_trace
			},
			traceReference := {
				iEI := '21'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				trace_Reference := ref
			},
			triggerId := omit,
			mobileId := omit,
			omcId := omit,
			transactionId := omit
		}
	}
	template (present) PDU_BSSGP
	tr_BSSGP_INVOKE_TRACE(template (present) OCT1 eq_trace, template (present) OCT2 ref) := {
		pDU_BSSGP_SGSN_INVOKE_TRACE := {
			bssgpPduType := '40'O,
			traceType := {
				iEI := '22'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				equipment_Trace := eq_trace
			},
			traceReference := {
				iEI := '21'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				trace_Reference := ref
			},
			triggerId := *,
			mobileId := *,
			omcId := *,
			transactionId := *
		}
	}

	/* 10.4.36 */
	template (value) PDU_BSSGP
	ts_OVERLOAD(template (value) BIT1 priority_class) := {
		pDU_BSSGP_OVERLOAD := {
			bssgpPduType := '42'O,
			priority_Class_Indicator := {
				iEI := '8f'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				priority_Class_Indicator_Value := priority_class,
				spare := '0000000'B
			}
		}
	}
	template (present) PDU_BSSGP
	tr_OVERLOAD(template (present) BIT1 priority_class) := {
		pDU_BSSGP_OVERLOAD := {
			bssgpPduType := '42'O,
			priority_Class_Indicator := {
				iEI := '8f'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				priority_Class_Indicator_Value := priority_class,
				spare := '0000000'B
			}
		}
	}

	/* 3GPP TS 48.018 11.3.61 */
	const OCT1 RIM_APP_ID_NACC := '01'O;
	const OCT1 RIM_APP_ID_SI3 := '02'O;
	const OCT1 RIM_APP_ID_MBMS_DATA_CH := '03'O;
	const OCT1 RIM_APP_ID_SON_TRANSF := '04'O;
	const OCT1 RIM_APP_ID_UTRA_SI := '05'O;
	template (value) RIM_Application_Identity ts_RIM_Application_Identity(OCT1 app_id) := {
		 iEI := '4B'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 rIMApplicationIdentity := app_id
	}


	/* 3GPP TS 48.018 11.3.62 */
	template (value) RIM_Sequence_Number ts_RIM_Sequence_Number(integer seq) := {
		 iEI := '4C'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 4
		 },
		 rIMSequenceNumber := int2oct(seq, 4)
	}

	/* 3GPP TS 48.018 11.3.62a.1 */
	template (value) RAN_Information_Request_RIM_Container
	ts_RAN_Information_Request_RIM_Container(template (value) RIM_Application_Identity app_id,
						 template (value) RIM_Sequence_Number seq,
						 template (value) RIM_PDU_Indications ind,
						 template (omit) RIM_Protocol_Version_Number ver := omit,
						 template (omit) RAN_Information_Request_Application_Container app_cont := omit,
						 template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '57'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 application_Container := app_cont,
		 sON_Transfer_Application_Identity_TLV := son_app_id
	}
	template RAN_Information_Request_RIM_Container
	tr_RAN_Information_Request_RIM_Container(template RIM_Application_Identity app_id := ?,
						 template RIM_Sequence_Number seq := ?,
						 template RIM_PDU_Indications ind := ?,
						 template RIM_Protocol_Version_Number ver := *,
						 template RAN_Information_Request_Application_Container app_cont := *,
						 template SON_Transfer_Application_Identity_TLV son_app_id := *) := {
		 iEI := '57'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 application_Container := app_cont,
		 sON_Transfer_Application_Identity_TLV := son_app_id
	}


	/* 3GPP TS 48.018 11.3.62a.2 */
	template (value) RAN_Information_RIM_Container
	ts_RAN_Information_RIM_Container(template (value) RIM_Application_Identity app_id,
					 template (value) RIM_Sequence_Number seq,
					 template (value) RIM_PDU_Indications ind,
					 template (omit) RIM_Protocol_Version_Number ver := omit,
					 template (omit) ApplContainer_or_ApplErrContainer app_cont_or_app_err := omit,
					 template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {

		 iEI := '58'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 applContainer_or_ApplErrContainer := app_cont_or_app_err,
		 sON_Transfer_Application_Identity := son_app_id
	}
	template (value) ApplContainer_or_ApplErrContainer
	tsu_ApplContainer_or_ApplErrContainer_NACC(template (value) ApplContainer_or_ApplErrContainer_NACC cont) := {
		nacc := cont
	}
	template (value) ApplContainer_or_ApplErrContainer
	tsu_ApplContainer_or_ApplErrContainer_SI3(template (value) ApplContainer_or_ApplErrContainer_SI3 cont) := {
		si3 := cont
	}
	template (value) ApplContainer_or_ApplErrContainer
	tsu_ApplContainer_or_ApplErrContainer_MBMS_data_channel(template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel cont) := {
		mBMS_data_channel := cont
	}
	template (value) ApplContainer_or_ApplErrContainer_NACC
	tsu_ApplContainer_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		application_Container := ts_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
	}
	template (value) ApplContainer_or_ApplErrContainer_NACC
	tsu_ApplErrContainer_NACC(template (value) BssgpCellId cid,
				  integer cause,
				  template (value) Application_Container_IE_NACC app_cont) := {
		application_Error_Container := ts_Application_Error_Container_NACC(cid, cause, app_cont)
	}
	template (value) ApplContainer_or_ApplErrContainer_SI3
	tsu_ApplContainer_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
		application_Container := ts_RAN_Information_Application_Container_SI3(cid, si3)
	}
	template (value) ApplContainer_or_ApplErrContainer_SI3
	tsu_ApplErrContainer_SI3(template (value) BssgpCellId cid,
				 integer cause,
				 template (value) Application_Container_IE_SI3 app_cont) := {
		application_Error_Container := ts_Application_Error_Container_SI3(cid, cause, app_cont)
	}
	template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel
	tsu_ApplContainer_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
		application_Container := ts_RAN_Information_Application_Container_MBMS_data_channel(cid, data_ch_report)
	}
	template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel
	tsu_ApplErrContainer_MBMS_data_channel(template (value) BssgpCellId cid,
					       integer cause,
					       template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
		application_Error_Container := ts_Application_Error_Container_MBMS_data_channel(cid, cause, app_cont)
	}

	/* 3GPP TS 48.018 11.3.62a.3 */
	template (value) RAN_Information_Ack_RIM_Container
	ts_RAN_Information_Ack_RIM_Container(template (value) RIM_Application_Identity app_id,
					     template (value) RIM_Sequence_Number seq,
					     template (omit) RIM_Protocol_Version_Number ver := omit,
					     template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '5A'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_Protocol_Version_Number := ver,
		 sON_Transfer_Application_Identity := son_app_id
	}

	/* 3GPP TS 48.018 11.3.62a.4 */
	template (value) RAN_Information_Error_RIM_Container
	ts_RAN_Information_Error_RIM_Container(template (value) RIM_Application_Identity app_id,
					       template (value) Cause_BSSGP cause,
					       template (omit) RIM_Protocol_Version_Number ver := omit,
					       PDU_BSSGP pdu,
					       template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '5B'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_cause := cause,
		 rIM_Protocol_Version_Number := ver,
		 pDU_in_Error:= {
			iEI := '15'O,
			ext := '1'B,
			lengthIndicator := {
				length1 := 0 /* overwritten */
			},
			erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
		 },
		 sON_Transfer_Application_Identity := son_app_id
	}

	/* 3GPP TS 48.018 11.3.62a.5 */
	template (value) RAN_Information_Application_Error_RIM_Container
	ts_RAN_Information_Application_Error_RIM_Container(template (value) RIM_Application_Identity app_id,
							   template (value) RIM_Sequence_Number seq,
							   template (value) RIM_PDU_Indications ind,
							   template (omit) RIM_Protocol_Version_Number ver := omit,
							   template (value) Application_Error_Container cont,
							   template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '59'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIM_Application_Identity := app_id,
		 rIM_Sequence_Number := seq,
		 rIM_PDU_Indications := ind,
		 rIM_Protocol_Version_Number := ver,
		 application_Error_Container := cont,
		 sON_Transfer_Application_Identity := son_app_id
	}


	/* 3GPP TS 48.018 11.3.63.1 */
	template (value) RAN_Information_Request_Application_Container
	tsu_RAN_Information_Request_Application_Container_NACC(template (value) BssgpCellId cid) := {
		nacc := ts_RAN_Information_Request_Application_Container_NACC(cid)
	}
	template (value) RAN_Information_Request_Application_Container
	tsu_RAN_Information_Request_Application_Container_SI3(template (value) BssgpCellId cid) := {
		si3 := ts_RAN_Information_Request_Application_Container_SI3(cid)
	}
	template (value) RAN_Information_Request_Application_Container
	tsu_RAN_Information_Request_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid) := {
		mBMS_data_channel := ts_RAN_Information_Request_Application_Container_MBMS_data_channel(cid)
	}

	/* NOTE: The type description of reporting_Cell_Identifier in chapter 11.3.63.1, version V10.6.0 (2012-07) of
	 * 3GPP TS 48.018 clearly states: "Reporting Cell Identifier: This field is encoded as the Cell Identifier
	 * defined in sub-clause 11.3.9". However this seems to be an error in the specification, because the
	 * specifiction in Table 11.3.63.1.1 already has a length field an an IEI defined. Keeping the IEI and lenght
	 * of the BSSGP cell identifier in addition would no make sense. Also in the chapters below the specifiction
	 * of the IEs are similar and there it says "Reporting Cell Identifier: This field is encoded as the value
	 * part of the Cell Identifier IE defined in sub-clause 11.3.9, not including IEI and Length Indicator.",
	 * which actually makes sense. */

	/* 3GPP TS 48.018 11.3.63.1.1 */
	template (value) RAN_Information_Request_Application_Container_NACC
	ts_RAN_Information_Request_Application_Container_NACC(template (value) BssgpCellId cid) := {
		 iEI := '4D'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
	}

	/* 3GPP TS 48.018 11.3.63.1.2 */
	template (value) RAN_Information_Request_Application_Container_SI3
	ts_RAN_Information_Request_Application_Container_SI3(template (value) BssgpCellId cid) := {
		 iEI := '4D'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
	}

	/* 3GPP TS 48.018 11.3.63.1.3 */
	template (value) RAN_Information_Request_Application_Container_MBMS_data_channel
	ts_RAN_Information_Request_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid) := {
		 iEI := '4D'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
	}

	/* 3GPP TS 48.018 11.3.63.2.1 */
	template (value) RAN_Information_Application_Container_NACC
	ts_RAN_Information_Application_Container_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
		 typeBit := bool2bit(psi_type),
		 number_of_SI_PSI := int2bit(si_psi_num, 7),
		 sI_PSI := si_psi
	}

	/* 3GPP TS 48.018 11.3.63.2.2 */
	template (value) RAN_Information_Application_Container_SI3
	ts_RAN_Information_Application_Container_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
		 sI3 := si3
	}

	/* 3GPP TS 48.018 11.3.63.2.3 */
	template (value) RAN_Information_Application_Container_MBMS_data_channel
	ts_RAN_Information_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
		 iEI := '4E'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
		 mBMS_data_channel_report := data_ch_report
	}


	/* 3GPP TS 48.018 11.3.64 */
	template (value) Application_Error_Container
	tsu_Application_Error_Container_NACC(template (value) BssgpCellId cid,
					     integer cause,
					     template (value) Application_Container_IE_NACC app_cont) := {
		nacc := ts_Application_Error_Container_NACC(cid, cause, app_cont)
	}
	template (value) Application_Error_Container
	tsu_Application_Error_Container_SI3(template (value) BssgpCellId cid,
					    integer cause,
					    template (value) Application_Container_IE_SI3 app_cont) := {
		si3 := ts_Application_Error_Container_SI3(cid, cause, app_cont)
	}
	template (value) Application_Error_Container
	tsu_Application_Error_Container_MBMS_data_channel(template (value) BssgpCellId cid,
							  integer cause,
							  template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
		mBMS_data_channel := ts_Application_Error_Container_MBMS_data_channel(cid, cause, app_cont)
	}

	/* 3GPP TS 48.018 11.3.64.1  */
	template (value) Application_Error_Container_NACC
	ts_Application_Error_Container_NACC(template (value) BssgpCellId cid,
					    integer cause,
					    template (value) Application_Container_IE_NACC app_cont) := {
		 iEI := '56'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 nACC_cause := int2oct(cause, 1),
		 erroneousApplicationContainer := app_cont
	}
	template (value) Application_Container_IE_NACC
	tsu_Application_Container_IE_NACC_req(template (value) BssgpCellId cid) := {
		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_NACC(cid)
	}
	template (value) Application_Container_IE_NACC
	tsu_Application_Container_IE_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
	}

	/* 3GPP TS 48.018 11.3.64.2 */
	template (value) Application_Error_Container_SI3
	ts_Application_Error_Container_SI3(template (value) BssgpCellId cid,
					   integer cause,
					   template (value) Application_Container_IE_SI3 app_cont) := {
		 iEI := '56'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 sI3_cause := int2oct(cause, 1),
		 erroneousApplicationContainer := app_cont
	}
	template (value) Application_Container_IE_SI3
	tsu_Application_Container_IE_SI3_req(template (value) BssgpCellId cid) := {
		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_SI3(cid)
	}
	template (value) Application_Container_IE_SI3
	tsu_Application_Container_IE_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_SI3(cid, si3)
	}

	/* 3GPP TS 48.018 11.3.64.3 */
	template (value) Application_Error_Container_MBMS_data_channel
	ts_Application_Error_Container_MBMS_data_channel(template (value) BssgpCellId cid,
							 integer cause,
							 template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
		 iEI := '56'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 mBMS_data_channel_cause := int2oct(cause, 1),
		 erroneousApplicationContainer := app_cont
	}
	template (value) Application_Container_IE_MBMS_data_channel
	tsu_Application_Container_IE_MBMS_data_channel_req(template (value) BssgpCellId cid) := {
		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_MBMS_data_channel(cid)
	}
	template (value) Application_Container_IE_MBMS_data_channel
	tsu_Application_Container_IE_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_MBMS_data_channel(cid, data_ch_report)
	}


	/* 3GPP TS 44.018 10.5.1.3 -> 3GPP TS 24.008 10.5.1.3 */
	function t_LocationAreaIdentification(template BssgpCellId cid) return template BSSGP_Types.LocationAreaIdentification {
		var template BSSGP_Types.LocationAreaIdentification ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?
		}
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		return ret;
	}

	/* 3GPP TS 44.018 10.5.2.11 */
	template (value) ControlChannelDescription ts_ControlChannelDescription(integer ccch_conf,
										integer bs_ag_blks_res,
										boolean att,
										boolean mscr,
										integer bs_pa_mfrms,
										BIT2 cbq3,
										integer t3212) := {
		 cCCH_Conf := int2bit(ccch_conf, 3),
		 bS_AG_BLKS_RES := int2bit(bs_ag_blks_res, 3),
		 aTT := bool2bit(att),
		 mSCR := bool2bit(mscr),
		 bS_PA_MFRMS := int2bit(bs_pa_mfrms, 3),
		 spare1 := '00'B,
		 cBQ3 := cbq3,
		 spare2 := '0'B,
		 t3212 := int2oct(t3212, 1)
	}

	/* 3GPP TS 44.018 10.5.2.3 */
	template (value) CellOptions ts_CellOptions(integer radio_link_timeout,
						    BIT3 dtx,
						    boolean pwrc) := {
		radioLinkTimeout := int2bit(radio_link_timeout, 4),
		dTX1 := dtx[0] & dtx[1],
		pWRC := bool2bit(pwrc),
		dtx2 := dtx[2]
	}

	/* 3GPP TS 44.018 10.5.2.4 */
	template (value) CellSelectionParameters ts_CellSelectionParameters(integer ms_txpwr_max_cch,
									    integer cell_reselection_hysteresis,
									    integer rxlev_access_min,
									    boolean neci,
									    boolean acs) := {
		mS_TXPWR_MAX_CCH := int2bit(ms_txpwr_max_cch, 5),
		cellReselectHysterisis := int2bit(cell_reselection_hysteresis, 3),
		rXLEV_Access_Min := int2bit(rxlev_access_min, 6),
		nECI := bool2bit(neci),
		aCS := bool2bit(acs)
	}

	/* 3GPP TS 44.018 10.5.2.29 */
	template (value) RACHControlParameters ts_RACHControlParameters(boolean re,
									boolean cell_barr_access,
									integer tx_integer,
									integer max_retrans,
									integer ac_15_to_8,
									integer ac_7_to_0) := {
		rE := bool2bit(re),
		cellBarrAccess := bool2bit(cell_barr_access),
		tX_Integer := int2bit(tx_integer, 4),
		maxRetrans := int2bit(max_retrans, 2),
		aC_15_to_8 := int2oct(ac_15_to_8, 1),
		aC_7_to_0 := int2oct(ac_7_to_0, 1)
	}

	/* 3GPP TS 44.018 9.1.35 */
	template (value) SI3 ts_SI3(integer cell_id,
				    template (value) BSSGP_Types.LocationAreaIdentification lai,
				    template (value) ControlChannelDescription cch_descr,
				    template (value) CellOptions cell_opt,
				    template (value) CellSelectionParameters cell_sel_par,
				    template (value) RACHControlParameters rach_ctrl_par,
				    OCT4 rest_octets) := {
		sI3MessageType := '1B'O,
		cellIdentity := int2oct(cell_id, 2),
		locationAreaIdentification := lai,
		controlChannelDescription := cch_descr,
		cellOptions := cell_opt,
		cellSelectionParameters := cell_sel_par,
		rACHControlParameters := rach_ctrl_par,
		sI3RestOctets := rest_octets
	}


	/* 3GPP TS 48.018 11.3.65 */
	const BIT3 RIM_PDU_TYPE_STOP := '000'B;
	const BIT3 RIM_PDU_TYPE_SING_REP := '001'B;
	const BIT3 RIM_PDU_TYPE_MULT_REP := '010'B;
	template (value) RIM_PDU_Indications ts_RIM_PDU_Indications(boolean ack, BIT3 type_ext) := {
		 iEI := '4F'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 ack := bool2bit(ack),
		 pDU_Type_Extension := type_ext,
		 reserved := '0000'B
	}

	/* 3GPP TS 48.018 11.3.67 */
	template (value) RIM_Protocol_Version_Number ts_RIM_Protocol_Version_Number(integer ver) := {
		 iEI := '55'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 1
		 },
		 rIMProtocolVersionNumber := int2oct(ver, 1)
	}

	/* 3GPP TS 48.018 11.3.70 */
	const HEX1 RIM_ADDR_GERAN_CELL_ID := '0'H;
	const HEX1 RIM_ADDR_UTRAN_RNC_ID := '1'H;
	const HEX1 RIM_ADDR_EUTRAN_NODEB_ID := '2'H;
	const HEX1 RIM_ADDR_EHRPD_SECTOR_ID := '3'H;
	template (value) RIM_Routing_Information ts_RIM_Routing_Information(HEX1 addr_discr, template (value) RIM_Routing_Address addr) := {
		 iEI := '54'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 rIMRoutingAddressDiscriminator := addr_discr,
		 spare := '0'H,
		 rIM_Routing_Address := addr
	}
	template RIM_Routing_Information tr_RIM_Routing_Information(template HEX1 addr_discr := ?, template RIM_Routing_Address addr := ?) := {
		 iEI := '54'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 rIMRoutingAddressDiscriminator := addr_discr,
		 spare := '0'H,
		 rIM_Routing_Address := addr
	}

	template RIM_Routing_Address t_RIM_Routing_Address_cid(template BssgpCellId cid := ?) := {
		 cell_Identifier := t_Cell_Identifier_V(cid)
	}
	template RIM_Routing_Address t_RIM_Routing_Address_rncid(template BssgpCellId cid := ?, template integer rnc_id := ?) := {
		 globalRNCID := t_GlobalRNC_ID_BSSGP(cid, rnc_id)
	}
	template RIM_Routing_Address t_RIM_Routing_Address_enbid(template BssgpCellId cid := ?, template integer tac := ?, template octetstring gnbid := ?) := {
		 eNB_Identifier := t_ENB_Identifier_V(cid, tac, gnbid)
	}
	template RIM_Routing_Address t_RIM_Routing_Address_sector(template octetstring sector := ?) := {
		 eHRPD_SectorID := sector
	}

	function t_Cell_Identifier_V(template BssgpCellId cid) return template Cell_Identifier_V {
		var template Cell_Identifier_V ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			cI_value := ?
		}
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		if (isvalue(cid) and isvalue(cid.ra_id)) {
			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
		}
		if (isvalue(cid)) {
			ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
		}
		return ret;
	}

	function t_GlobalRNC_ID_BSSGP(template BssgpCellId cid, template integer rnc_id) return template GlobalRNC_ID_BSSGP {
		var template GlobalRNC_ID_BSSGP ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			lac := ?,
			rac := ?,
			spare := ?,
			rNC_ID := ?
		}
		if (istemplatekind(cid, "omit") and istemplatekind(rnc_id, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*") and istemplatekind(rnc_id, "*")) {
			return *;
		} else if (istemplatekind(cid, "?") and istemplatekind(rnc_id, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
			if (isvalue(cid.ra_id.lai.lac)) {
				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
			}
		}
		if (isvalue(cid) and isvalue(cid.ra_id)) {
			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
		}
		if (isvalue(rnc_id)) {
			ret.spare := '0'H;
			ret.rNC_ID := rnc_id;
		}

		return ret;
	}

	function t_ENB_Identifier_V(template BssgpCellId cid, template integer tac, template octetstring gnbid) return template ENB_Identifier_V {
		var template ENB_Identifier_V ret := {
			mccDigit1 := ?,
			mccDigit2 := ?,
			mccDigit3 := ?,
			mncDigit3 := ?,
			mncDigit1 := ?,
			mncDigit2 := ?,
			tac := ?,
			globaleNBID := ?
		}
		if (istemplatekind(cid, "omit") and istemplatekind(tac, "omit") and istemplatekind(gnbid, "omit")) {
			return omit;
		} else if (istemplatekind(cid, "*") and istemplatekind(tac, "*") and istemplatekind(gnbid, "*")) {
			return *;
		} else if (istemplatekind(cid, "?") and istemplatekind(tac, "?") and istemplatekind(gnbid, "?")) {
			return ?;
		}
		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
			}
		}
		if (isvalue(tac)) {
			ret.tac := int2oct(valueof(tac), 2);
		}
		if (isvalue(gnbid)) {
			ret.globaleNBID := gnbid;
		}

		return ret;
	}

	/* 3GPP TS 48.018 11.3.108 */
	template (value) SON_Transfer_Application_Identity_TLV ts_SON_Transfer_Application_Identity_TLV(template (value) octetstring app_id) := {
		 iEI := '84'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := 0 /* overwritten */
		 },
		 sON_Transfer_Application_Identity := app_id
	}


	/* 3GPP TS 48.018 10.6.1 */
	template (value) PDU_BSSGP
	ts_RAN_INFORMATION_REQUEST(template (value) RIM_Routing_Information dst,
				   template (value) RIM_Routing_Information src,
				   template (value) RAN_Information_Request_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_REQUEST := {
			bssgpPduType := '71'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_RAN_INFORMATION_REQUEST(template RIM_Routing_Information dst := ?,
				   template RIM_Routing_Information src := ?,
				   template RAN_Information_Request_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_REQUEST := {
			bssgpPduType := '71'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.2 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION(template (value) RIM_Routing_Information dst,
				     template (value) RIM_Routing_Information src,
				     template (value) RAN_Information_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION := {
			bssgpPduType := '70'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION(template RIM_Routing_Information dst := ?,
				     template RIM_Routing_Information src := ?,
				     template RAN_Information_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION := {
			bssgpPduType := '70'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.3 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION_ACK(template (value) RIM_Routing_Information dst,
					 template (value) RIM_Routing_Information src,
					 template (value) RAN_Information_Ack_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_ACK := {
			bssgpPduType := '72'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION_ACK(template RIM_Routing_Information dst := ?,
					 template RIM_Routing_Information src := ?,
					 template RAN_Information_Ack_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_ACK := {
			bssgpPduType := '72'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.4 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION_ERROR(template (value) RIM_Routing_Information dst,
					   template (value) RIM_Routing_Information src,
					   template (value) RAN_Information_Error_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_ERROR := {
			bssgpPduType := '73'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION_ERROR(template RIM_Routing_Information dst := ?,
					   template RIM_Routing_Information src := ?,
					   template RAN_Information_Error_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_ERROR := {
			bssgpPduType := '73'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* 3GPP TS 48.018 10.6.5 */
	template (value) PDU_BSSGP
	ts_PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR(template (value) RIM_Routing_Information dst,
						       template (value) RIM_Routing_Information src,
						       template (value) RAN_Information_Application_Error_RIM_Container cont) := {
		pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := {
			bssgpPduType := '74'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}
	template PDU_BSSGP
	tr_PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR(template RIM_Routing_Information dst := ?,
						       template RIM_Routing_Information src := ?,
						       template RAN_Information_Application_Error_RIM_Container cont := ?) := {
		pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := {
			bssgpPduType := '74'O,
			destination_Cell_Identifier := dst,
			source_Cell_Identifier := src,
			rIM_Container := cont
		}
	}

	/* PDU permitted on PTP BVC only (TS 48.018 Section 5.4.1) */
	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP_ONLY := (
		{pDU_BSSGP_DL_UNITDATA := ?},
		{pDU_BSSGP_UL_UNITDATA := ?},
		{pDU_BSSGP_RA_CAPABILITY := ?},
		{pDU_BSSGP_RA_CAPABILITY_UPDATE := ?},
		{pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := ?},
		{pDU_BSSGP_RADIO_STATUS := ?},
		{pDU_BSSGP_FLOW_CONTROL_BVC := ?},
		{pDU_BSSGP_FLOW_CONTROL_BVC_ACK := ?},
		{pDU_BSSGP_FLOW_CONTROL_MS := ?},
		{pDU_BSSGP_FLOW_CONTROL_MS_ACK := ?},
		{pDU_BSSGP_FLOW_CONTROL_PFC := ?},
		{pDU_BSSGP_FLOW_CONTROL_PFC_ACK := ?},
		{pDU_BSSGP_DOWNLOAD_BSS_PFC := ?},
		{pDU_BSSGP_CREATE_BSS_PFC := ?},
		{pDU_BSSGP_CREATE_BSS_PFC_ACK := ?},
		{pDU_BSSGP_CREATE_BSS_PFC_NACK := ?},
		{pDU_BSSGP_MODIFY_BSS_PFC := ?},
		{pDU_BSSGP_MODIFY_BSS_PFC_ACK := ?},
		{pDU_BSSGP_DELETE_BSS_PFC := ?},
		{pDU_BSSGP_DELETE_BSS_PFC_ACK := ?},
		{pDU_BSSGP_DELETE_BSS_PFC_REQ := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUIRED := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUIRED_ACK := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUIRED_NACK := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUEST := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUEST_ACK := ?},
		{pDU_BSSGP_PS_HANDOVER_REQUEST_NACK := ?},
		{pDU_BSSGP_PS_HANDOVER_COMPLETE := ?},
		{pDU_BSSGP_PS_HANDOVER_COMPLETE_ACK := ?},
		{pDU_BSSGP_PS_HANDOVER_CANCEL := ?}
	);

	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP := (
		tr_BSSGP_PERMITTED_PTP_ONLY,
		{pDU_BSSGP_PAGING_PS := ?},
		{pDU_BSSGP_PAGING_CS := ?},
		{pDU_BSSGP_STATUS := ?}
	);

	/* PDU permitted on Signaling BVC only (TS 48.018 Section 5.4.1) */
	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN_ONLY := (
		{pDU_BSSGP_SUSPEND := ?},
		{pDU_BSSGP_SUSPEND_ACK := ?},
		{pDU_BSSGP_SUSPEND_NACK := ?},
		{pDU_BSSGP_RESUME := ?},
		{pDU_BSSGP_RESUME_ACK := ?},
		{pDU_BSSGP_RESUME_NACK := ?},
		{pDU_BSSGP_FLUSH_LL := ?},
		{pDU_BSSGP_FLUSH_LL_ACK := ?},
		{pDU_BSSGP_LLC_DISCARDED := ?},
		{pDU_BSSGP_BVC_BLOCK := ?},
		{pDU_BSSGP_BVC_BLOCK_ACK := ?},
		{pDU_BSSGP_BVC_UNBLOCK := ?},
		{pDU_BSSGP_BVC_UNBLOCK_ACK := ?},
		{pDU_BSSGP_BVC_RESET := ?},
		{pDU_BSSGP_BVC_RESET_ACK := ?},
		{pDU_BSSGP_SGSN_INVOKE_TRACE := ?},
		{pDU_BSSGP_PERFORM_LOCATION_REQUEST := ?},
		{pDU_BSSGP_PERFORM_LOCATION_RESPONSE := ?},
		{pDU_BSSGP_PERFORM_LOCATION_ABORT := ?},
		{pDU_BSSGP_POSITION_COMMAND := ?},
		{pDU_BSSGP_POSITION_RESPONSE := ?},
		{pDU_BSSGP_RAN_INFORMATION := ?},
		{pDU_BSSGP_RAN_INFORMATION_REQUEST := ?},
		{pDU_BSSGP_RAN_INFORMATION_ACK := ?},
		{pDU_BSSGP_RAN_INFORMATION_ERROR := ?},
		{pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := ?},
		{pDU_BSSGP_MBMS_SESSION_START_REQUEST := ?},
		{pDU_BSSGP_MBMS_SESSION_START_RESPONSE := ?},
		{pDU_BSSGP_MBMS_SESSION_STOP_REQUEST := ?},
		{pDU_BSSGP_MBMS_STOP_RESPONSE := ?},
		{pDU_BSSGP_SESSION_UPDATE_REQUEST := ?},
		{pDU_BSSGP_SESSION_UPDATE_RESPONSE := ?}
	);

	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_SIGN := (
		tr_BSSGP_PERMITTED_SIGN_ONLY,
		{pDU_BSSGP_PAGING_PS := ?},
		{pDU_BSSGP_PAGING_CS := ?},
		{pDU_BSSGP_SUSPEND := ?},
		{pDU_BSSGP_STATUS := ?}
	);

	/* PDU permitted on PTM BVC only (TS 48.018 Section 5.4.1) */
	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM_ONLY := (
		{pDU_BSSGP_DL_MBMS_UNITDATA := ?},
		{pDU_BSSGP_UL_MBMS_UNITDATA := ?}
	);

	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTM := (
		tr_BSSGP_PERMITTED_PTM_ONLY,
		{pDU_BSSGP_STATUS := ?}
	);


	/* Template for any PTP BVCI IE */
	template (present) BVCI tr_BSSGP_IE_PtpBvci := {
		iEI := '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		unstructured_value := complement ('0000'O, '0001'O)
	}

	/* message on signaling PTP but containing a ptp BVC */
	/*
	template PDU_BSSGP tr_BSSGP_SIG_FOR_PTP(template Bvci bvci) := (
		{pDU_BSSGP_FLUSH_LL:{?,?,tr_BSSGP_IE_PtpBvci, *, *}},
		{pDU_BSSGP_FLUSH_LL_ACK:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
		{pDU_BSSGP_LLC_DISCARDED:{?,?,?,tr_BSSGP_IE_PtpBvci, ?, *}},
		{pDU_BSSGP_BVC_BLOCK:{?,tr_BSSGP_IE_PtpBvci, ?}},
		{pDU_BSSGP_BVC_BLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
		{pDU_BSSGP_BVC_UNBLOCK:{?,tr_BSSGP_IE_PtpBvci}},
		{pDU_BSSGP_BVC_UNBLOCK_ACK:{?,tr_BSSGP_IE_PtpBvci}},
		{pDU_BSSGP_BVC_RESET:{?,tr_BSSGP_IE_PtpBvci,?,*,*,*}},
		{pDU_BSSGP_BVC_RESET_ACK:{?,tr_BSSGP_IE_PtpBvci,*,*,*}},
		{pDU_BSSGP_STATUS:{?,?,tr_BSSGP_IE_PtpBvci,*}},
		{pDU_BSSGP_PERFORM_LOCATION_REQUEST:{?,?,?,*,tr_BSSGP_IE_PtpBvci,?,?,?,*,*,*,*,*,*,*,*,*}},
		{pDU_BSSGP_PERFORM_LOCATION_RESPONSE:{?,?,tr_BSSGP_IE_PtpBvci,*,*,*,*,*,*}},
		{pDU_BSSGP_PERFORM_LOCATION_ABORT:{?,?,tr_BSSGP_IE_PtpBvci,?}},
		{pDU_BSSGP_POSITION_COMMAND:{
	);
	*/

	/* extract the BVCI IE of given PDU + return it */
	function f_BSSGP_BVCI_IE_get(PDU_BSSGP pdu) return template (omit) BVCI {
		select (pdu) {
		case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL:=?}) {
			return pdu.pDU_BSSGP_FLUSH_LL.bVCI_old;
			}
		case (PDU_BSSGP:{pDU_BSSGP_FLUSH_LL_ACK:=?}) {
			return pdu.pDU_BSSGP_FLUSH_LL_ACK.bVCI_new;
			}
		case (PDU_BSSGP:{pDU_BSSGP_LLC_DISCARDED:=?}) {
			return pdu.pDU_BSSGP_LLC_DISCARDED.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK:=?}) {
			return pdu.pDU_BSSGP_BVC_BLOCK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_BLOCK_ACK:=?}) {
			return pdu.pDU_BSSGP_BVC_BLOCK_ACK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK:=?}) {
			return pdu.pDU_BSSGP_BVC_UNBLOCK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_UNBLOCK_ACK:=?}) {
			return pdu.pDU_BSSGP_BVC_UNBLOCK_ACK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET:=?}) {
			return pdu.pDU_BSSGP_BVC_RESET.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_BVC_RESET_ACK:=?}) {
			return pdu.pDU_BSSGP_BVC_RESET_ACK.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_STATUS:=?}) {
			return pdu.pDU_BSSGP_STATUS.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_REQUEST:=?}) {
			return pdu.pDU_BSSGP_PERFORM_LOCATION_REQUEST.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_RESPONSE:=?}) {
			return pdu.pDU_BSSGP_PERFORM_LOCATION_RESPONSE.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PERFORM_LOCATION_ABORT:=?}) {
			return pdu.pDU_BSSGP_PERFORM_LOCATION_ABORT.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_POSITION_COMMAND:=?}) {
			return pdu.pDU_BSSGP_POSITION_COMMAND.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_POSITION_RESPONSE:=?}) {
			return pdu.pDU_BSSGP_POSITION_RESPONSE.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PAGING_PS:={?,?,*,{bVCI:=?},*,*,?,*,*}}) {
			return pdu.pDU_BSSGP_PAGING_PS.paging_Field4.bVCI;
			}
		case (PDU_BSSGP:{pDU_BSSGP_PAGING_CS:={?,?,?,{bVCI:=?},*,*,*,*,*}}) {
			return pdu.pDU_BSSGP_PAGING_CS.paging_Field4.bVCI;
			}
		case else {
			return omit;
			}
		}
	}

	/* extract the BVCI IE of given PDU + convert it to integer value */
	function f_BSSGP_BVCI_get(PDU_BSSGP pdu) return template (omit) BssgpBvci {
		var template (omit) BVCI bvci_raw := f_BSSGP_BVCI_IE_get(pdu);
		if (istemplatekind(bvci_raw, "omit")) {
			return omit;
		}
		return oct2int(valueof(bvci_raw.unstructured_value));
	}

	/* 3GPP TS 23.003 2.6 */
	type enumerated TlliType {
		TLLI_LOCAL,
		TLLI_FOREIGN,
		TLLI_RANDOM,
		TLLI_AUXILIARY,
		TLLI_RESERVED,
		TLLI_G_RNTI,
		TLLI_RAND_G_RNTI
	}

	/* 3GPP TS 23.003 2.6 */
	function f_gprs_tlli_type(OCT4 tlli) return TlliType {
		var bitstring tllib := oct2bit(tlli);
		if (substr(tllib, 0, 2) == '11'B) {
			return TLLI_LOCAL;
		} else if (substr(tllib, 0, 2) == '10'B) {
			return TLLI_FOREIGN;
		} else if (substr(tllib, 0, 5) == '01111'B) {
			return TLLI_RANDOM;
		} else if (substr(tllib, 0, 4) == '0110'B) {
			return TLLI_RESERVED;
		} else if (substr(tllib, 0, 3) == '010'B) {
			return TLLI_RESERVED;
		} else if (substr(tllib, 0, 4) == '0000'B) {
			return TLLI_G_RNTI;
		} else if (substr(tllib, 0, 4) == '0001'B) {
			return TLLI_RAND_G_RNTI;
		} else {
			setverdict(fail, "Unknonw TLLI Type ", tllib);
			mtc.stop;
		}
	}

	/* build a TLLI of specified type from the given (P)TMSI */
	function f_gprs_tlli_from_tmsi(OCT4 tmsi, TlliType tlli_type) return OCT4 {
		var bitstring tmsi_bits := oct2bit(tmsi);
		var bitstring prefix;
		select (tlli_type) {
		case (TLLI_LOCAL)	{ prefix := '11'B }
		case (TLLI_FOREIGN)	{ prefix := '01111'B }
		case (TLLI_RANDOM)	{ prefix := '0110'B }
		case (TLLI_RESERVED)	{ prefix := '010'B }
		case (TLLI_G_RNTI)	{ prefix := '0000'B }
		case (TLLI_RAND_G_RNTI)	{ prefix := '0001'B }
		case else {
			setverdict(fail, "Unknonw TLLI Type ", tlli_type);
			mtc.stop;
			}
		}
		return bit2oct(prefix & substr(tmsi_bits, lengthof(prefix), 32-lengthof(prefix)));
	}

	function f_gprs_tlli_random() return OCT4 {
		var OCT4 tlli := f_rnd_octstring(4);
		return tlli or4b 'c0000000'O;
	}

} with { encode "RAW" };
