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 Misc_Helpers 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;

	template (present) BssgpBvci t_BssgpBvciUser := complement (0);

	type enumerated OsmoNsDialect {
		NS2_DIALECT_UNDEF		('00'H),
		NS2_DIALECT_STATIC_ALIVE	('01'H),
		NS2_DIALECT_STATIC_RESETBLOCK	('02'H),
		NS2_DIALECT_IPACCESS		('03'H),
		NS2_DIALECT_SNS			('04'H)
	};

	/* 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
		}
	}
	template PDU_NS tr_NS_UNITDATA_User(template NS_SDU_ControlBits bits, template octetstring sdu) := {
		pDU_NS_Unitdata := {
			nsPduType := '00'O,
			nS_SDU_ControlBits := bits,
			bVCI := complement ('0000'O),
			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 if (istemplatekind(elem, "*")) {
			return *;
		} else if (istemplatekind(elem, "?")) {
			return ?;
		} 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 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)
		}
	}

	template PDU_NS tr_SNS(template Nsei nsei) := ( tr_SNS_SIZE(nsei),
							tr_SNS_SIZE_ACK(nsei, *),
							tr_SNS_CONFIG(nsei, ?, *, *),
							tr_SNS_CONFIG_ACK(nsei, *),
							tr_SNS_ADD(nsei, ?, *, *),
							tr_SNS_DEL(nsei, ?, *, *),
							tr_SNS_CHG_WEIGHT(nsei, ?, *, *),
							tr_SNS_ACK(nsei, ?, *, *, *) )






	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 tr_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;
		}
	}
	template (value) Flush_Action ts_FLUSH_ACTION(template (value) OCT1 act) := {
		iEI := '0C'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		actionValue := act
	}

	private function tr_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;
		}
	}
	template (value) Number_of_octets_affected ts_NO_OCT_AFF(template (value) integer oct_aff) := {
		iEI := '25'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 3
		},
		number_of_octets_transfered_or_deleted :=  int2oct(valueof(oct_aff), 3)
	}

	private function tr_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;
		}
	}
	template (value) LLC_Frames_Discarded ts_LLC_FRAMES_DISCARDED(template (value) integer frames_discarded) := {
		iEI := '0F'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 1
		},
		number_of_frames_discarded := int2hex(valueof(frames_discarded), 2)
	}


	private function tr_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;
		}
	}
	template (value) BVCI ts_BSSGP_BVCI(template (value) BssgpBvci bvci) := {
		iEI := '04'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		unstructured_value := int2oct(valueof(bvci), 2)
	}
	private function f_ts_BSSGP_BVCI(template (omit) BssgpBvci bvci)
	return template (omit) BVCI {
		if (istemplatekind(bvci, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_BVCI(valueof(bvci));
		}
	}

	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) NSEI_BSSGP ts_BSSGP_NSEI(template (value) Nsei nsei) := {
		iEI:= '3E'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		nSEI := int2oct(valueof(nsei), 2)
	}
	private function f_ts_BSSGP_NSEI(template (omit) Nsei nsei)
	return template (omit) NSEI_BSSGP {
		if (istemplatekind(nsei, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_NSEI(valueof(nsei));
		}
	}

	template (value) TLLI_BSSGP ts_BSSGP_TLLI(template (value) GprsTlli tlli) := {
		iEI := '1F'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 4
		},
		tLLI_Value := tlli
	}
	template (present) TLLI_BSSGP tr_BSSGP_TLLI(template (present) 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 (present) IMSI_BSSGP tr_BSSGP_IMSI(template (present) hexstring imsi) := {
		iEI := '0D'O,
		ext := '1'B,
		lengthIndicator := ?,
		type_of_Identity := '001'B,
		oddevenIndicator := ?,
		digits := imsi
	}

	template (value) 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 tr_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 tr_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) Cell_Identifier ts_BSSGP_IE_CellId(template (value) BssgpCellId cid) := {
		iEI := '08'O,
		ext := '1'B,
		lengthIndicator := { length1 := 8 },
		mccDigit1 := cid.ra_id.lai.mcc_mnc[0],
		mccDigit2 := cid.ra_id.lai.mcc_mnc[1],
		mccDigit3 := cid.ra_id.lai.mcc_mnc[2],
		mncDigit3 := cid.ra_id.lai.mcc_mnc[3],
		mncDigit1 := cid.ra_id.lai.mcc_mnc[4],
		mncDigit2 := cid.ra_id.lai.mcc_mnc[5],
		lac := int2oct(valueof(cid.ra_id.lai.lac), 2),
		rac := int2oct(valueof(cid.ra_id.rac), 1),
		cI_value := int2oct(valueof(cid.cell_id), 2)
	}
	function f_ts_BSSGP_IE_CellId(template (omit) BssgpCellId cid) return template (omit) Cell_Identifier {
		if (istemplatekind(cid, "omit")) {
			return omit;
		} else {
			return ts_BSSGP_IE_CellId(valueof(cid));
		}
	}

	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 (omit) BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET := {
			bssgpPduType := '22'O,
			bVCI := ts_BSSGP_BVCI(bvci),
			cause := ts_BSSGP_CAUSE(cause),
			cell_Identifier := f_ts_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 := tr_BSSGP_BVCI(bvci),
			cause := tr_BSSGP_CAUSE(cause),
			cell_Identifier := tr_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}

	/* 10.4.13 */
	template PDU_BSSGP ts_BVC_RESET_ACK(BssgpBvci bvci, template (omit) BssgpCellId cell_id) := {
		pDU_BSSGP_BVC_RESET_ACK := {
			bssgpPduType := '23'O,
			bVCI := ts_BSSGP_BVCI(bvci),
			cell_Identifier := f_ts_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 := tr_BSSGP_BVCI(bvci),
			cell_Identifier := tr_BSSGP_IE_CellId(cell_id),
			feature_bitmap := *,
			extended_Feature_Bitmap := *
		}
	}


	/* 10.4.10 */
	template (present) PDU_BSSGP tr_BVC_UNBLOCK(template (present) BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK := {
			bssgpPduType := '24'O,
			bVCI := tr_BSSGP_BVCI(bvci)
		}
	}
	template (value) PDU_BSSGP ts_BVC_UNBLOCK(template (value) BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK := {
			bssgpPduType := '24'O,
			bVCI := ts_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.11 */
	template (present) PDU_BSSGP tr_BVC_UNBLOCK_ACK(template (present) BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK_ACK := {
			bssgpPduType := '25'O,
			bVCI := tr_BSSGP_BVCI(bvci)
		}
	}
	template (value) PDU_BSSGP ts_BVC_UNBLOCK_ACK(template (value) BssgpBvci bvci) := {
		pDU_BSSGP_BVC_UNBLOCK_ACK := {
			bssgpPduType := '25'O,
			bVCI := ts_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.8 */
	template (present) PDU_BSSGP tr_BVC_BLOCK(template (present) BssgpBvci bvci,
						  template (present) BssgpCause cause) := {
		pDU_BSSGP_BVC_BLOCK := {
			bssgpPduType := '20'O,
			bVCI := tr_BSSGP_BVCI(bvci),
			cause := tr_BSSGP_CAUSE(cause)
		}
	}
	template (value) PDU_BSSGP ts_BVC_BLOCK(template (value) BssgpBvci bvci,
						template (value) BssgpCause cause) := {
		pDU_BSSGP_BVC_BLOCK := {
			bssgpPduType := '20'O,
			bVCI := ts_BSSGP_BVCI(bvci),
			cause := ts_BSSGP_CAUSE(cause)
		}
	}

	/* 10.4.9 */
	template (present) PDU_BSSGP tr_BVC_BLOCK_ACK(template (present) BssgpBvci bvci) := {
		pDU_BSSGP_BVC_BLOCK_ACK := {
			bssgpPduType := '21'O,
			bVCI := tr_BSSGP_BVCI(bvci)
		}
	}
	template (value) PDU_BSSGP ts_BVC_BLOCK_ACK(template (value) BssgpBvci bvci) := {
		pDU_BSSGP_BVC_BLOCK_ACK := {
			bssgpPduType := '21'O,
			bVCI := ts_BSSGP_BVCI(bvci)
		}
	}

	/* 10.4.4 */
	template (value) PDU_BSSGP ts_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 := int2oct(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := int2oct(bucket_leak_rate, 2)
			},
			bmax_default_MS := {
				iEI := '01'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				bmax := int2oct(bmax_default_ms, 2)
			},
			r_default_MS := {
				iEI := '1C'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_default_MS_value := int2oct(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 (present) PDU_BSSGP tr_BVC_FC_BVC_ACK(template (present) OCT1 tag) := {
		pDU_BSSGP_FLOW_CONTROL_BVC_ACK := {
			bssgpPduType := '27'O,
			tag := {
				iEI := '1E'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 1
				},
				unstructured_Value := tag
			}
		}
	}
	template (value) PDU_BSSGP ts_BVC_FC_BVC_ACK(template (value) 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 := int2oct(bmax, 2)
			},
			bucket_Leak_Rate := {
				iEI := '03'O,
				ext := '1'B,
				lengthIndicator := {
					length1 := 2
				},
				r_Value := int2oct(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 := tr_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 (value) PDU_BSSGP ts_BSSGP_STATUS(template (omit) BssgpBvci bvci,
						   template (value) BssgpCause cause,
						   PDU_BSSGP pdu) := {
		pDU_BSSGP_STATUS := {
			bssgpPduType := '41'O,
			cause := ts_BSSGP_CAUSE(cause),
			bVCI := f_ts_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 BssgpBvci bvci := ?, template BssgpCause cause := ?,
					   template octetstring pdu := ?) := {
		pDU_BSSGP_STATUS := {
			bssgpPduType := '41'O,
			cause := tr_BSSGP_CAUSE(cause),
			bVCI := tr_BSSGP_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 (value) QoS_Profile ts_QoS_TLV(template (value) 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 (value) PDU_Lifetime t_DefaultLifetime(uint16_t delay := 65535) := {
		iEI := '16'O,
		ext := '1'B,
		lengthIndicator := {
			length1 := 2
		},
		delay_Value := int2oct(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 (value) 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 (present) 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 (value) 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 := ts_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 := tr_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 := ts_BSSGP_BVCI(bvci)
			},
			tLLI := *,
			channel_needed := *,
			eMLPP_Priority := *,
			tMSI := *,
			global_CN_Id := *
		}
	}
	template (value) 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 := ts_BSSGP_BVCI(bvci)
			},
			tLLI := omit,
			channel_needed := omit,
			eMLPP_Priority := omit,
			tMSI := omit,
			global_CN_Id := omit
		}
	}
	template (value) 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 := ts_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 := tr_BSSGP_BVCI(bvci)
			},
			pFI := *,
			aBQP := *,
			qoS_Profile := ?,
			pTMSI := *,
			eDRX_Paremeters := *
		}
	}
	template (value) 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 := ts_BSSGP_BVCI(bvci)
			},
			pFI := omit,
			aBQP := omit,
			qoS_Profile := ts_QoS_TLV(t_defaultQos),
			pTMSI := omit,
			eDRX_Paremeters := omit
		}
	}
	template (value) 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 := ts_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 := ts_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 (present) 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 := tr_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 (present) 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 (present) 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 (present) 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 := tr_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(valueof(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(valueof(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 := ts_BSSGP_BVCI(bvci_old),
			bVCI_new := f_ts_BSSGP_BVCI(bvci_new),
			nSEI := f_ts_BSSGP_NSEI(nsei)
		}
	}
	template PDU_BSSGP tr_BSSGP_FLUSH_LL(template (present) 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 := tr_BSSGP_BVCI(bvci_old),
			bVCI_new := f_ts_BSSGP_BVCI(bvci_new),
			nSEI := f_ts_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 := ts_FLUSH_ACTION(act),
			bVCI_new := f_ts_BSSGP_BVCI(bvci_new),
			number_of_octets_affected := ts_NO_OCT_AFF(oct_affected),
			nSEI := f_ts_BSSGP_NSEI(nsei)
		}
	}
	template PDU_BSSGP tr_BSSGP_FLUSH_LL_ACK(template (present) 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 := tr_BSSGP_TLLI(tlli),
			flush_Action := tr_FLUSH_ACTION(act),
			bVCI_new := f_ts_BSSGP_BVCI(bvci_new),
			number_of_octets_affected := tr_NO_OCT_AFF(oct_affected),
			nSEI := f_ts_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 := ts_LLC_FRAMES_DISCARDED(frames_discarded),
			bVCI := ts_BSSGP_BVCI(bvci),
			number_of_octets_deleted := ts_NO_OCT_AFF(oct_deleted),
			pFI := omit
		}
	}
	template PDU_BSSGP tr_BSSGP_LLC_DISCARDED(template (present) GprsTlli tlli, template integer frames_discarded,
						 template BssgpBvci bvci,
						 template integer oct_deleted) := {
		pDU_BSSGP_LLC_DISCARDED := {
			bssgpPduType := '2C'O,
			tLLI := tr_BSSGP_TLLI(tlli),
			lLC_Frames_Discarded := tr_LLC_FRAMES_DISCARDED(frames_discarded),
			bVCI := tr_BSSGP_BVCI(bvci),
			number_of_octets_deleted := tr_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 := tr_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 (present) OCT1 tag) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE := {
			bssgpPduType := '08'O,
			tLLI := tr_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 (present) OCT1 tag, template (present) OCT1 cause,
			        template MSRadioAccessCapabilityV_BSSGP racap := omit) := {
		pDU_BSSGP_RA_CAPABILITY_UPDATE_ACK := {
			bssgpPduType := '09'O,
			tLLI := tr_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 (present) 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
	}
	template RIM_Application_Identity tr_RIM_Application_Identity(template 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)
	}
	function tr_RIM_Sequence_Number(template integer seq := ?) return template RIM_Sequence_Number {
		 var template RIM_Sequence_Number ret;
		 ret.iEI := '4C'O;
		 ret.ext := '1'B;
		 ret.lengthIndicator := { length1 := 4 };
		 if (istemplatekind(seq, "*")) {
			ret.rIMSequenceNumber := *;
		 } else if (istemplatekind(seq, "?")) {
			ret.rIMSequenceNumber := ?;
		 } else {
			ret.rIMSequenceNumber := int2oct(valueof(seq), 4);
		 }
		 return ret;
	}

	/* 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 RAN_Information_RIM_Container
	tr_RAN_Information_RIM_Container(template RIM_Application_Identity app_id := ?,
					 template RIM_Sequence_Number seq := ?,
					 template RIM_PDU_Indications ind := ?,
					 template RIM_Protocol_Version_Number ver := omit,
					 template ApplContainer_or_ApplErrContainer app_cont_or_app_err := omit,
					 template SON_Transfer_Application_Identity_TLV son_app_id := omit) := {

		 iEI := '58'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 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 ApplContainer_or_ApplErrContainer
	tru_ApplContainer_or_ApplErrContainer_NACC(template 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 ApplContainer_or_ApplErrContainer_NACC
	tru_ApplContainer_NACC(template BssgpCellId cid := ?, template boolean psi_type := ?, template integer si_psi_num := ?, template octetstring si_psi := ?) := {
		application_Container := tr_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
	}
	template RAN_Information_Ack_RIM_Container
	tr_RAN_Information_Ack_RIM_Container(template RIM_Application_Identity app_id := ?,
					     template RIM_Sequence_Number seq := ?,
					     template RIM_Protocol_Version_Number ver := omit,
					     template SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '5A'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 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
	}
	template RAN_Information_Error_RIM_Container
	tr_RAN_Information_Error_RIM_Container(template RIM_Application_Identity app_id := ?,
					       template Cause_BSSGP cause := ?,
					       template RIM_Protocol_Version_Number ver := omit,
					       template octetstring pdu := ?,
					       template SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '5B'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 rIM_Application_Identity := app_id,
		 rIM_cause := cause,
		 rIM_Protocol_Version_Number := ver,
		 pDU_in_Error:= {
			iEI := '15'O,
			ext := '1'B,
			lengthIndicator := {
				length1 := ?
			},
			erroneous_BSSGP_PDU := 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
	}
	template RAN_Information_Application_Error_RIM_Container
	tr_RAN_Information_Application_Error_RIM_Container(template RIM_Application_Identity app_id := ?,
							   template RIM_Sequence_Number seq := ?,
							   template RIM_PDU_Indications ind := ?,
							   template RIM_Protocol_Version_Number ver := omit,
							   template Application_Error_Container cont := ?,
							   template SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
		 iEI := '59'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_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 := ts_Cell_Identifier_V(cid)
	}
	template RAN_Information_Request_Application_Container_NACC
	tr_RAN_Information_Request_Application_Container_NACC(template BssgpCellId cid := ?) := {
		 iEI := '4D'O,
		 ext := '1'B,
		 lengthIndicator := {
			length1 := ?
		 },
		 reporting_Cell_Identifier := tr_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 := ts_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 := ts_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 := ts_Cell_Identifier_V(cid),
		 typeBit := bool2bit(psi_type),
		 number_of_SI_PSI := int2bit(si_psi_num, 7),
		 sI_PSI := si_psi
	}
	function tr_RAN_Information_Application_Container_NACC(template BssgpCellId cid := ?, template boolean psi_type := ?,
							       template integer si_psi_num := ?, template octetstring si_psi := ?)
							       return template RAN_Information_Application_Container_NACC {
		 var template RAN_Information_Application_Container_NACC ret;
		 ret.iEI := '4E'O;
		 ret.ext := '1'B;
		 ret.lengthIndicator := { length1 := ? };
		 ret.reporting_Cell_Identifier := tr_Cell_Identifier_V(cid);
		 if (istemplatekind(psi_type, "*")) {
			ret.typeBit := *;
		 } else if (istemplatekind(psi_type, "?")) {
			ret.typeBit := ?;
		 } else {
			ret.typeBit := bool2bit(valueof(psi_type));
		 }
		 if (istemplatekind(si_psi_num, "*")) {
			ret.number_of_SI_PSI := *;
		 } else if (istemplatekind(si_psi_num, "?")) {
			ret.number_of_SI_PSI := ?;
		 } else {
			ret.number_of_SI_PSI := int2bit(valueof(si_psi_num), 7);
		 }
		 ret.sI_PSI := si_psi;
		 return ret;
	}

	/* 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 := ts_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 := ts_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 Application_Error_Container
	rsu_Application_Error_Container_NACC(template BssgpCellId cid := ?,
					     template integer cause := ?,
					     template Application_Container_IE_NACC app_cont := ?) := {
		nacc := tr_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
	}
	function tr_Application_Error_Container_NACC(template BssgpCellId cid := ?,
						     template integer cause := ?,
						     template Application_Container_IE_NACC app_cont := ?)
						     return template Application_Error_Container_NACC {
		 var template Application_Error_Container_NACC ret;
		 ret.iEI := '56'O;
		 ret.ext := '1'B;
		 ret.lengthIndicator := { length1 := ? };
		 ret.erroneousApplicationContainer := app_cont;
		 if (istemplatekind(cause, "*")) {
			ret.nACC_cause := *;
		 } else if (istemplatekind(cause, "?")) {
			ret.nACC_cause := ?;
		 } else {
			ret.nACC_cause := int2oct(valueof(cause), 1);
		 }
		 return ret;
	}

	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 Application_Container_IE_NACC
	rsu_Application_Container_IE_NACC_req(template BssgpCellId cid := ?) := {
		rAN_Information_Request_Application_Container := tr_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
	}
	function tr_RIM_PDU_Indications(template boolean ack := ?, template BIT3 type_ext := ?) return template RIM_PDU_Indications {
		 var template RIM_PDU_Indications ret;
		 ret.iEI := '4F'O;
		 ret.ext := '1'B;
		 ret.lengthIndicator := { length1 := 1 };
		 if (istemplatekind(ack, "*")) {
			ret.ack := *;
		 } else if (istemplatekind(ack, "?")) {
			ret.ack := ?;
		 } else {
			ret.ack := bool2bit(valueof(ack));
		 }
		 if (istemplatekind(type_ext, "*")) {
			ret.pDU_Type_Extension := *;
		 } else if (istemplatekind(type_ext, "?")) {
			ret.pDU_Type_Extension := ?;
		 } else {
			ret.pDU_Type_Extension := valueof(type_ext);
		 }
		 ret.reserved := '0000'B;
		 return ret;
	}

	/* 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)
	}
	function tr_RIM_Protocol_Version_Number(template integer ver := ?) return template RIM_Protocol_Version_Number {
		 var template RIM_Protocol_Version_Number ret;
		 ret.iEI := '55'O;
		 ret.ext := '1'B;
		 ret.lengthIndicator := { length1 := 1 };
		 if (istemplatekind(ver, "*")) {
			ret.rIMProtocolVersionNumber := *;
		 } else if (istemplatekind(ver, "?")) {
			ret.rIMProtocolVersionNumber := ?;
		 } else {
			ret.rIMProtocolVersionNumber := int2oct(valueof(ver), 1);
		 }
		 return ret;
	}

	/* 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 := tr_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 tr_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;
	}
	template (value) Cell_Identifier_V ts_Cell_Identifier_V(template (value) BssgpCellId cid) := {
		mccDigit1 := cid.ra_id.lai.mcc_mnc[0],
		mccDigit2 := cid.ra_id.lai.mcc_mnc[1],
		mccDigit3 := cid.ra_id.lai.mcc_mnc[2],
		mncDigit3 := cid.ra_id.lai.mcc_mnc[3],
		mncDigit1 := cid.ra_id.lai.mcc_mnc[4],
		mncDigit2 := cid.ra_id.lai.mcc_mnc[5],
		lac := int2oct(valueof(cid.ra_id.lai.lac), 2),
		rac := int2oct(valueof(cid.ra_id.rac), 1),
		cI_value := int2oct(valueof(cid.cell_id), 2)
	}

	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;
			}
		}
		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 {
			Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
						log2str("Unknonw TLLI Type ", tllib));
			return TLLI_LOCAL;
		}
	}

	/* 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 {
			Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
						log2str("Unknonw TLLI Type ", tlli_type));
			return '00000000'O;
			}
		}
		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" };
