diff --git a/library/GSUP_Types.ttcn b/library/GSUP_Types.ttcn
index 10955e7..f9faeb7 100644
--- a/library/GSUP_Types.ttcn
+++ b/library/GSUP_Types.ttcn
@@ -323,781 +323,13 @@
 
 type record of GSUP_PDU GSUP_PDUs;
 
+
 external function enc_GSUP_PDU(in GSUP_PDU msg) return octetstring
 	with { extension "prototype(convert) encode(RAW)" };
 
 external function dec_GSUP_PDU(in octetstring msg) return GSUP_PDU
 	with { extension "prototype(convert) decode(RAW)" };
 
-function f_gsup_postprocess_decoded(inout GSUP_PDU gsup) {
-	if (gsup.ies[0].tag == OSMO_GSUP_IMSI_IE) {
-		/* if last digit is 'F', then there's an odd number of digits and we must strip the F */
-		var integer num_digits := lengthof(gsup.ies[0].val.imsi);
-		if (gsup.ies[0].val.imsi[num_digits-1] == 'F'H) {
-			gsup.ies[0].val.imsi := substr(gsup.ies[0].val.imsi, 0, num_digits-1);
-		}
-	}
-}
-
-function f_gsup_preprocess_encoded(inout GSUP_PDU gsup) {
-	if (ischosen(gsup.ies[0].val.imsi)) {
-		/* if number of digits is odd, add a 'F' as padding at the end */
-		var integer num_digits := lengthof(gsup.ies[0].val.imsi);
-		if (num_digits rem 2 == 1) {
-			gsup.ies[0].val.imsi := gsup.ies[0].val.imsi & 'F'H;
-		}
-	}
-}
-
-template (value) GSUP_MSISDN ts_GSUP_MSISDN(hexstring digits,
-					    BIT3 ton := '000'B,
-					    BIT4 npi := '0000'B) := {
-	len := 0, /* overwritten */
-	/* numberingPlanIdentification := npi,
-	typeOfNumber := ton,
-	ext1 := '0'B, */
-	digits := digits
-}
-
-template GSUP_MSISDN tr_GSUP_MSISDN(template hexstring digits,
-				    template BIT3 ton := ?,
-				    template BIT4 npi := ?) := {
-	len := ?,
-	/* numberingPlanIdentification := npi,
-	typeOfNumber := ton,
-	ext1 := '0'B, */
-	digits := digits
-}
-
-
-
-template GSUP_IE ts_GSUP_IE_AuthTuple2G(octetstring rand, octetstring sres,
-				        octetstring kc) := {
-	tag := OSMO_GSUP_AUTH_TUPLE_IE,
-	len := 0, /* overwritten */
-	val := {
-		auth_tuple := {
-			valueof(ts_GSUP_IE_RAND(rand)),
-			valueof(ts_GSUP_IE_SRES(sres)),
-			valueof(ts_GSUP_IE_Kc(kc))
-		}
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_AuthTuple3G(
-					template (present) octetstring rand := ?,
-					template (present) octetstring ik := ?,
-					template (present) octetstring ck := ?,
-					template (present) octetstring autn := ?,
-					template (present) octetstring res := ?) := {
-	tag := OSMO_GSUP_AUTH_TUPLE_IE,
-	len := ?,
-	val := {
-		auth_tuple := {
-			tr_GSUP_IE_RAND(rand),
-			tr_GSUP_IE_IK(ik),
-			tr_GSUP_IE_CK(ck),
-			tr_GSUP_IE_AUTN(autn),
-			tr_GSUP_IE_RES(res)
-		}
-	}
-}
-
-template GSUP_IE ts_GSUP_IE_AuthTuple3G(octetstring rand, octetstring ik,
-					  octetstring ck, octetstring autn,
-					  octetstring res) := {
-	tag := OSMO_GSUP_AUTH_TUPLE_IE,
-	len := 0, /* overwritten */
-	val := {
-		auth_tuple := {
-			valueof(ts_GSUP_IE_RAND(rand)),
-			valueof(ts_GSUP_IE_IK(ik)),
-			valueof(ts_GSUP_IE_CK(ck)),
-			valueof(ts_GSUP_IE_AUTN(autn)),
-			valueof(ts_GSUP_IE_RES(res))
-		}
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_AuthTuple2G3G(
-					template (present) octetstring rand := ?,
-					template (present) octetstring sres := ?,
-					template (present) octetstring kc := ?,
-					template (present) octetstring ik := ?,
-					template (present) octetstring ck := ?,
-					template (present) octetstring autn := ?,
-					template (present) octetstring res := ?) := {
-	tag := OSMO_GSUP_AUTH_TUPLE_IE,
-	len := ?,
-	val := {
-		auth_tuple := {
-			tr_GSUP_IE_RAND(rand),
-			tr_GSUP_IE_SRES(sres),
-			tr_GSUP_IE_Kc(kc),
-			tr_GSUP_IE_IK(ik),
-			tr_GSUP_IE_CK(ck),
-			tr_GSUP_IE_AUTN(autn),
-			tr_GSUP_IE_RES(res)
-		}
-	}
-}
-
-template GSUP_IE ts_GSUP_IE_AuthTuple2G3G(octetstring rand, octetstring sres,
-				          octetstring kc, octetstring ik,
-					  octetstring ck, octetstring autn,
-					  octetstring res) := {
-	tag := OSMO_GSUP_AUTH_TUPLE_IE,
-	len := 0, /* overwritten */
-	val := {
-		auth_tuple := {
-			valueof(ts_GSUP_IE_RAND(rand)),
-			valueof(ts_GSUP_IE_SRES(sres)),
-			valueof(ts_GSUP_IE_Kc(kc)),
-			valueof(ts_GSUP_IE_IK(ik)),
-			valueof(ts_GSUP_IE_CK(ck)),
-			valueof(ts_GSUP_IE_AUTN(autn)),
-			valueof(ts_GSUP_IE_RES(res))
-		}
-	}
-}
-
-template GSUP_IE ts_GSUP_IE_PdpInfo(octetstring apn, octetstring pdp_type, octetstring pdp_qos) := {
-	tag := OSMO_GSUP_PDP_INFO_IE,
-	len := 0, /* overwritten */
-	val := {
-		pdp_info := {
-			valueof(ts_GSUP_IE_APN(apn)),
-			valueof(ts_GSUP_IE_PDP_TYPE(pdp_type)),
-			valueof(ts_GSUP_IE_PDP_QOS(pdp_qos))
-		}
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_PDP_CONTEXT_ID(OCT1 ctx_id) := {
-	tag := OSMO_GSUP_PDP_CONTEXT_ID_IE,
-	len := 0,
-	val := {
-		pdp_ctx_id := ctx_id
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_PDP_CONTEXT_ID(template OCT1 ctx_id) := {
-	tag := OSMO_GSUP_PDP_CONTEXT_ID_IE,
-	len := ?,
-	val := {
-		pdp_ctx_id := ctx_id
-	}
-}
-
-
-template (value) GSUP_IE ts_GSUP_IE_PDP_TYPE(OCT2 pdp_type) := {
-	tag := OSMO_GSUP_PDP_TYPE_IE,
-	len := 0,
-	val := {
-		pdp_type := pdp_type
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_PDP_QOS(octetstring pdp_qos) := {
-	tag := OSMO_GSUP_PDP_QOS_IE,
-	len := 0,
-	val := {
-		pdp_qos := pdp_qos
-	}
-}
-
-
-template GSUP_PDU tr_GSUP(template GSUP_MessageType msgt := ?, template GSUP_IEs ies := *) := {
-	msg_type := msgt,
-	ies := ies
-}
-
-template (present) GSUP_PDU tr_GSUP_IMSI(template (present) GSUP_MessageType msgt := ?, template (present) hexstring imsi := ?) := {
-	msg_type := msgt,
-	ies := { tr_GSUP_IE_IMSI(imsi), * }
-}
-
-template GSUP_PDU ts_GSUP(GSUP_MessageType msgt, GSUP_IEs ies := {}) := {
-	msg_type := msgt,
-	ies := ies
-}
-
-template (value) GSUP_IMEI ts_GSUP_IMEI(hexstring digits) := {
-	len := 0, /* overwritten */
-	digits := digits
-}
-
-template GSUP_IMEI tr_GSUP_IMEI(template hexstring digits) := {
-	len := ?,
-	digits := digits
-}
-
-
-template (value) GSUP_PDU ts_GSUP_SAI_REQ(hexstring imsi) :=
-	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, { valueof(ts_GSUP_IE_IMSI(imsi)) });
-
-template (value) GSUP_PDU ts_GSUP_SAI_REQ_EPS(hexstring imsi) :=
-	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_CURRENT_RAT_TYPE(RAT_TYPE_EUTRAN_SGs))
-	});
-
-template (value) GSUP_PDU ts_GSUP_SAI_REQ_NUM_AUTH(hexstring imsi, OCT1 num_auth_vectors) :=
-	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
-			valueof(ts_GSUP_IE_IMSI(imsi)),
-			valueof(ts_GSUP_IE_NUM_VECTORS_REQ(num_auth_vectors))
-			});
-
-template GSUP_PDU tr_GSUP_SAI_REQ(template hexstring imsi) :=
-	tr_GSUP_IMSI(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, imsi);
-
-template GSUP_PDU tr_GSUP_SAI_REQ_UMTS_AKA_RESYNC(
-		template hexstring imsi,
-		template octetstring auts,
-		template octetstring rand) :=
-	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_REQUEST, {
-			tr_GSUP_IE_IMSI(imsi),
-			tr_GSUP_IE_AUTS(auts),
-			tr_GSUP_IE_RAND(rand),
-			*
-			});
-
-template (value) GSUP_PDU ts_GSUP_SAI_RES(hexstring imsi, GSUP_IE auth_tuple) :=
-	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
-		valueof(ts_GSUP_IE_IMSI(imsi)), auth_tuple });
-
-template GSUP_PDU tr_GSUP_SAI_ERR(template hexstring imsi, template integer cause) :=
-	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
-			tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
-
-template (value) GSUP_PDU ts_GSUP_SAI_ERR(hexstring imsi, integer cause) :=
-	ts_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_ERROR, {
-			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
-
-
-template GSUP_PDU tr_GSUP_SAI_RES(template (present) hexstring imsi,
-				  template (present) GSUP_IE auth_tuple_ie := tr_GSUP_IE(OSMO_GSUP_AUTH_TUPLE_IE)) :=
-	tr_GSUP(OSMO_GSUP_MSGT_SEND_AUTH_INFO_RESULT, {
-			tr_GSUP_IE_IMSI(imsi), *, auth_tuple_ie, * });
-
-template GSUP_PDU ts_GSUP_UL_REQ(hexstring imsi, GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
-					 template octetstring source_name := omit) :=
-	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, f_gen_ts_ies(imsi, dom := dom,
-								     source_name := source_name));
-
-template GSUP_PDU tr_GSUP_UL_REQ(template hexstring imsi) :=
-	tr_GSUP_IMSI(OSMO_GSUP_MSGT_UPDATE_LOCATION_REQUEST, imsi);
-
-template (value) GSUP_PDU ts_GSUP_UL_RES(hexstring imsi, octetstring destination_name := ''O) :=
-	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, { valueof(ts_GSUP_IE_IMSI(imsi)),
-			valueof(ts_GSUP_IE_Destination_Name(destination_name))});
-
-template GSUP_PDU tr_GSUP_UL_RES(template hexstring imsi, template octetstring destination_name := omit) :=
-	tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_RESULT, f_gen_tr_ies(imsi, destination_name := destination_name));
-
-template (value) GSUP_PDU ts_GSUP_UL_ERR(hexstring imsi, integer cause) :=
-	ts_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR, {
-			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
-
-template GSUP_PDU tr_GSUP_UL_ERR(template hexstring imsi, template integer cause := ?,
-		template octetstring destination_name := omit) :=
-	tr_GSUP(OSMO_GSUP_MSGT_UPDATE_LOCATION_ERROR,
-		f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));
-
-template (value) GSUP_PDU ts_GSUP_ISD_REQ(hexstring imsi, hexstring msisdn, octetstring destination_name := ''O) :=
-	ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST, {
-			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_MSISDN(msisdn)),
-			valueof(ts_GSUP_IE_Destination_Name(destination_name))});
-
-template GSUP_PDU tr_GSUP_ISD_REQ(template hexstring imsi, template hexstring msisdn := ?,
-		template octetstring destination_name := omit) :=
-	tr_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_REQUEST,
-		f_gen_tr_ies(imsi, msisdn := msisdn, destination_name := destination_name));
-
-template GSUP_PDU ts_GSUP_ISD_RES(hexstring imsi,
-                                  template octetstring source_name := omit,
-                                  template octetstring destination_name := omit) :=
-	ts_GSUP(OSMO_GSUP_MSGT_INSERT_DATA_RESULT,
-                f_gen_ts_ies(imsi, source_name := source_name,
-                             destination_name := destination_name));
-
-template GSUP_PDU tr_GSUP_ISD_RES(template hexstring imsi) :=
-	tr_GSUP_IMSI(OSMO_GSUP_MSGT_INSERT_DATA_RESULT, imsi);
-
-template GSUP_PDU tr_GSUP_AUTH_FAIL_IND(hexstring imsi) :=
-	tr_GSUP_IMSI(OSMO_GSUP_MSGT_AUTH_FAIL_REPORT, imsi);
-
-template (value) GSUP_PDU ts_GSUP_CL_REQ(hexstring imsi, GSUP_CancelType ctype) :=
-	ts_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_REQUEST, {
-		valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CancelType(ctype)) });
-
-template GSUP_PDU tr_GSUP_CL_RES(template hexstring imsi) :=
-	tr_GSUP_IMSI(OSMO_GSUP_MSGT_LOCATION_CANCEL_RESULT, imsi);
-
-template GSUP_PDU tr_GSUP_CL_ERR(template hexstring imsi, template integer cause := ?) :=
-	tr_GSUP(OSMO_GSUP_MSGT_LOCATION_CANCEL_ERROR, {
-			tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause), * });
-
-template (value) GSUP_PDU ts_GSUP_PURGE_MS_REQ(hexstring imsi, GSUP_CnDomain dom) :=
-	ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
-			valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_CnDomain(dom)) });
-
-template GSUP_PDU tr_GSUP_PURGE_MS_REQ(template hexstring imsi, template GSUP_CnDomain dom := ?) :=
-	tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_REQUEST, {
-			tr_GSUP_IE_IMSI(imsi), *, tr_GSUP_IE_CnDomain(dom) });
-
-template (value) GSUP_PDU ts_GSUP_PURGE_MS_RES(hexstring imsi) :=
-	ts_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
-		valueof(ts_GSUP_IE_IMSI(imsi)) });
-
-template GSUP_PDU tr_GSUP_PURGE_MS_RES(template hexstring imsi) :=
-	tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_RESULT, {
-		tr_GSUP_IE_IMSI(imsi), * });
-
-template GSUP_PDU tr_GSUP_PURGE_MS_ERR(template hexstring imsi, template integer cause) :=
-	tr_GSUP(OSMO_GSUP_MSGT_PURGE_MS_ERROR, {
-		tr_GSUP_IE_IMSI(imsi), tr_GSUP_IE_Cause(cause) });
-
-template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_REQ(hexstring imsi, hexstring imei,
-      template (omit) octetstring source_name := omit) :=
-	ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST, f_gen_ts_ies(imsi, imei := imei, source_name := source_name));
-
-template GSUP_PDU tr_GSUP_CHECK_IMEI_REQ(
-	template hexstring imsi,
-	template hexstring imei
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_CHECK_IMEI_REQUEST,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_IMEI(imei),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SUBSCRIBER_MANAGEMENT)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_RES(hexstring imsi, GSUP_IMEIResult result) :=
-	ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT, {
-		valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_IMEI_Result(result)) });
-
-template GSUP_PDU tr_GSUP_CHECK_IMEI_RES(template hexstring imsi, template GSUP_IMEIResult result,
-					 template octetstring destination_name := omit) :=
-	tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_RESULT,
-		f_gen_tr_ies(imsi, imei_result := result, destination_name := destination_name));
-
-template (value) GSUP_PDU ts_GSUP_CHECK_IMEI_ERR(hexstring imsi, integer cause) :=
-	ts_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, {
-		valueof(ts_GSUP_IE_IMSI(imsi)), valueof(ts_GSUP_IE_Cause(cause)) });
-
-template GSUP_PDU tr_GSUP_CHECK_IMEI_ERR(template hexstring imsi, template integer cause,
-					 template octetstring destination_name := omit) :=
-	tr_GSUP(OSMO_GSUP_MSGT_CHECK_IMEI_ERROR, f_gen_tr_ies(imsi, cause := cause, destination_name := destination_name));
-
-
-/* EPDG Tunnel */
-template (value) GSUP_PDU ts_GSUP_EPDGTunnel_REQ(hexstring imsi,
-						 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
-						 GSUP_CnDomain dom := OSMO_GSUP_CN_DOMAIN_PS,
-						 template (omit) octetstring source_name := omit) :=
-	ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST, f_gen_ts_ies(imsi,
-								 message_class := message_class,
-								 dom := dom,
-								 source_name := source_name));
-
-template (present) GSUP_PDU tr_GSUP_EPDGTunnel_REQ(template (present) hexstring imsi := ?,
-						   template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG) :=
-	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_REQUEST,
-		f_gen_tr_ies(imsi,
-			     message_class := message_class));
-
-
-template (value) GSUP_PDU ts_GSUP_EPDGTunnel_RES(hexstring imsi,
-						GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
-						octetstring destination_name := ''O) :=
-	ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT, {
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_Message_Class(message_class)),
-		valueof(ts_GSUP_IE_Destination_Name(destination_name))
-		});
-
-template (present) GSUP_PDU tr_GSUP_EPDGTunnel_RES(template (present) hexstring imsi,
-						   template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
-						   template octetstring destination_name := omit) :=
-	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_RESULT,
-		f_gen_tr_ies(imsi,
-			     message_class := message_class,
-			     destination_name := destination_name));
-
-template (value) GSUP_PDU ts_GSUP_EPDGTunnel_ERR(hexstring imsi,
-						 GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
-						 integer cause := 0) :=
-	ts_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR, {
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_Cause(cause)),
-		valueof(ts_GSUP_IE_Message_Class(message_class))
-		});
-
-template (present) GSUP_PDU tr_GSUP_EPDGTunnel_ERR(template (present) hexstring imsi,
-						   template (present) GSUP_Message_Class message_class := OSMO_GSUP_MESSAGE_CLASS_IPSEC_EPDG,
-						   template (present) integer cause := ?,
-						   template octetstring destination_name := omit) :=
-	tr_GSUP(OSMO_GSUP_MSGT_EPDG_TUNNEL_ERROR,
-		f_gen_tr_ies(imsi,
-			     message_class := message_class,
-			     cause := cause,
-			     destination_name := destination_name));
-
-
-template (value) GSUP_IE ts_GSUP_IE_CancelType(GSUP_CancelType ctype) := {
-	tag := OSMO_GSUP_CANCEL_TYPE_IE,
-	len := 0, /* overwritten */
-	val := {
-		cancel_type := ctype
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_CancelType(template GSUP_CancelType ctype) :=
-	tr_GSUP_IE(OSMO_GSUP_CANCEL_TYPE_IE, GSUP_IeValue:{cancel_type:=ctype});
-
-template GSUP_IE tr_GSUP_IE_CnDomain(template GSUP_CnDomain domain) :=
-	tr_GSUP_IE(OSMO_GSUP_CN_DOMAIN_IE, GSUP_IeValue:{cn_domain:=domain});
-
-template GSUP_IE tr_GSUP_IE(template GSUP_IEI iei, template GSUP_IeValue val := ?) := {
-	tag := iei,
-	len := ?,
-	val := val
-}
-
-template (value) GSUP_IE ts_GSUP_IE_IMSI(hexstring imsi) := {
-	tag := OSMO_GSUP_IMSI_IE,
-	len := 0, /* overwritten */
-	val := {
-		imsi := imsi
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_IMSI(template (present) hexstring imsi := ?) := {
-	tag := OSMO_GSUP_IMSI_IE,
-	len := ?,
-	val := {
-		imsi := imsi
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_MSISDN(hexstring msisdn) := {
-	tag := OSMO_GSUP_MSISDN_IE,
-	len := 0, /* overwritten */
-	val := {
-		msisdn := ts_GSUP_MSISDN(msisdn)
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_MSISDN(template hexstring msisdn) := {
-	tag := OSMO_GSUP_MSISDN_IE,
-	len := ?,
-	val := {
-		msisdn := tr_GSUP_MSISDN(msisdn)
-	}
-}
-
-
-template (value) GSUP_IE ts_GSUP_IE_Cause(integer cause) := {
-	tag := OSMO_GSUP_CAUSE_IE,
-	len := 0, /* overwritten */
-	val := {
-		cause := cause
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_Cause(template integer cause) := {
-	tag := OSMO_GSUP_CAUSE_IE,
-	len := ?,
-	val := {
-		cause := cause
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_AUTS(octetstring auts) := {
-	tag := OSMO_GSUP_AUTS_IE,
-	len := 0, /* overwritten */
-	val := {
-		auts := auts
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_AUTS(template octetstring auts) := {
-	tag := OSMO_GSUP_AUTS_IE,
-	len := ?,
-	val := {
-		auts := auts
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_RAND(octetstring rand) := {
-	tag := OSMO_GSUP_RAND_IE,
-	len := 0, /* overwritten */
-	val := {
-		rand := rand
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_RAND(template octetstring rand := ?) := {
-	tag := OSMO_GSUP_RAND_IE,
-	len := ?,
-	val := {
-		rand := rand
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_SRES(template (present) octetstring sres := ?) := {
-	tag := OSMO_GSUP_SRES_IE,
-	len := ?,
-	val := {
-		sres := sres
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SRES(octetstring sres) := {
-	tag := OSMO_GSUP_SRES_IE,
-	len := 0, /* overwritten */
-	val := {
-		sres := sres
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_Kc(template (present) octetstring kc := ?) := {
-	tag := OSMO_GSUP_KC_IE,
-	len := ?,
-	val := {
-		kc := kc
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_Kc(octetstring kc) := {
-	tag := OSMO_GSUP_KC_IE,
-	len := 0, /* overwritten */
-	val := {
-		kc := kc
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_IK(template (present) octetstring ik := ?) := {
-	tag := OSMO_GSUP_IK_IE,
-	len := ?,
-	val := {
-		ik := ik
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_IK(octetstring ik) := {
-	tag := OSMO_GSUP_IK_IE,
-	len := 0, /* overwritten */
-	val := {
-		ik := ik
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_CK(template (present) octetstring ck := ?) := {
-	tag := OSMO_GSUP_CK_IE,
-	len := ?,
-	val := {
-		ck := ck
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_CK(octetstring ck) := {
-	tag := OSMO_GSUP_CK_IE,
-	len := 0, /* overwritten */
-	val := {
-		ck := ck
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_AUTN(template (present) octetstring autn := ?) := {
-	tag := OSMO_GSUP_AUTN_IE,
-	len := ?,
-	val := {
-		autn := autn
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_AUTN(octetstring autn) := {
-	tag := OSMO_GSUP_AUTN_IE,
-	len := 0, /* overwritten */
-	val := {
-		autn := autn
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_RES(template (present) octetstring res := ?) := {
-	tag := OSMO_GSUP_RES_IE,
-	len := ?,
-	val := {
-		res := res
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_RES(octetstring res) := {
-	tag := OSMO_GSUP_RES_IE,
-	len := 0, /* overwritten */
-	val := {
-		res := res
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_APN(octetstring apn) := {
-	tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
-	len := 0, /* overwritten */
-	val := {
-		apn := apn
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_APN(template octetstring apn) := {
-	tag := OSMO_GSUP_ACCESS_POINT_NAME_IE,
-	len := ?,
-	val := {
-		apn := apn
-	}
-}
-
-template GSUP_IE ts_GSUP_IE_CnDomain(template GSUP_CnDomain dom) := {
-	tag := OSMO_GSUP_CN_DOMAIN_IE,
-	len := 0, /* overwritten */
-	val := {
-		cn_domain := dom
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SessionId(OCT4 sid) := {
-	tag := OSMO_GSUP_SESSION_ID_IE,
-	len := 0, /* overwritten */
-	val := {
-		session_id := sid
-	}
-}
-template GSUP_IE tr_GSUP_IE_SessionId(template OCT4 sid) := {
-	tag := OSMO_GSUP_SESSION_ID_IE,
-	len := ?,
-	val := {
-		session_id := sid
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SessionState(GSUP_SessionState state) := {
-	tag := OSMO_GSUP_SESSION_STATE_IE,
-	len := 0, /* overwritten */
-	val := {
-		session_state := state
-	}
-}
-template GSUP_IE tr_GSUP_IE_SessionState(template GSUP_SessionState state) := {
-	tag := OSMO_GSUP_SESSION_STATE_IE,
-	len := ?,
-	val := {
-		session_state := state
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SM_RP_MR(OCT1 ref) := {
-	tag := OSMO_GSUP_SM_RP_MR_IE,
-	len := 0, /* overwritten */
-	val := {
-		sm_rp_mr := ref
-	}
-}
-template GSUP_IE tr_GSUP_IE_SM_RP_MR(template OCT1 ref) := {
-	tag := OSMO_GSUP_SM_RP_MR_IE,
-	len := ?,
-	val := {
-		sm_rp_mr := ref
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SM_RP_CAUSE(OCT1 cause) := {
-	tag := OSMO_GSUP_SM_RP_CAUSE_IE,
-	len := 0, /* overwritten */
-	val := {
-		sm_rp_cause := cause
-	}
-}
-template GSUP_IE tr_GSUP_IE_SM_RP_CAUSE(template OCT1 cause) := {
-	tag := OSMO_GSUP_SM_RP_CAUSE_IE,
-	len := ?,
-	val := {
-		sm_rp_cause := cause
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SM_RP_MMS(OCT1 mms) := {
-	tag := OSMO_GSUP_SM_RP_MMS_IE,
-	len := 0, /* overwritten */
-	val := {
-		sm_rp_mms := mms
-	}
-}
-template GSUP_IE tr_GSUP_IE_SM_RP_MMS(template OCT1 mms) := {
-	tag := OSMO_GSUP_SM_RP_MMS_IE,
-	len := ?,
-	val := {
-		sm_rp_mms := mms
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_IMEI(hexstring imei) := {
-	tag := OSMO_GSUP_IMEI_IE,
-	len := 0, /* overwritten */
-	val := {
-		imei := ts_GSUP_IMEI(imei)
-	}
-}
-template GSUP_IE tr_GSUP_IE_IMEI(template hexstring imei) := {
-	tag := OSMO_GSUP_IMEI_IE,
-	len := ?,
-	val := {
-		imei := tr_GSUP_IMEI(imei)
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_IMEI_Result(GSUP_IMEIResult result) := {
-	tag := OSMO_GSUP_IMEI_RESULT_IE,
-	len := 0, /* overwritten */
-	val := {
-		imei_result := result
-	}
-}
-template GSUP_IE tr_GSUP_IE_IMEI_Result(template GSUP_IMEIResult result) := {
-	tag := OSMO_GSUP_IMEI_RESULT_IE,
-	len := ?,
-	val := {
-		imei_result := result
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_NUM_VECTORS_REQ(OCT1 num) := {
-	tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
-	len := 0, /* overwritten */
-	val := {
-		num_auth_vectors := num
-	}
-}
-template GSUP_IE tr_GSUP_IE_NUM_VECTORS_REQ(template OCT1 num) := {
-	tag := OSMO_GSUP_NUM_VECTORS_REQ_IE,
-	len := ?,
-	val := {
-		num_auth_vectors := num
-	}
-}
-
-
-/* Possible identity types for SM-RP-{OA|DA} IEs */
-type enumerated GSUP_SM_RP_ODA_IdType {
-	OSMO_GSUP_SM_RP_ODA_ID_NONE		('00'O),
-	OSMO_GSUP_SM_RP_ODA_ID_IMSI		('01'O),
-	OSMO_GSUP_SM_RP_ODA_ID_MSISDN		('02'O),
-	OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR	('03'O),
-	/* Special value for noSM-RP-DA and noSM-RP-OA */
-	OSMO_GSUP_SM_RP_ODA_ID_NULL		('FF'O)
-} with { variant "FIELDLENGTH(8)" };
-
 /* See 3GPP TS 24.011, figures 8.5 and 8.6 */
 type record GSUP_SM_RP_Addr {
 	BIT1		ext, /* Extension? */
@@ -1109,27 +341,6 @@
 	variant "PADDING_PATTERN('1111'B)"
 };
 
-private function f_pad_SM_RP_Addr(template hexstring number)
-return template hexstring {
-	if (isvalue(number) and not istemplatekind(number, "omit")) {
-		return f_pad_bcd_number(valueof(number));
-	} else {
-		return number;
-	}
-}
-
-template GSUP_SM_RP_Addr t_GSUP_SM_RP_Addr(template hexstring number,
-					   template BIT4 npi := '0001'B,
-					   template BIT3 ton := '001'B,
-					   template BIT1 ext := '1'B) := {
-	ext := ext,
-	ton := ton,
-	npi := npi,
-	/* Work around TITAN's padding problems: encoding works fine,
-	 * but it does not consider 'F'H as padding in decoded data. */
-	number := f_pad_SM_RP_Addr(number)
-}
-
 /**
  * SM-RP-DA represents the SM Destination Address, see 7.6.8.1.
  * It can be either of the following:
@@ -1156,57 +367,6 @@
 	)"
 };
 
-template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_IMSI(hexstring imsi) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
-	id_enc := { imsi := imsi }
-}
-template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_IMSI(template hexstring imsi) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_IMSI,
-	id_enc := { imsi := imsi }
-}
-
-template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
-	id_enc := { msisdn := msisdn }
-}
-template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
-	id_enc := { msisdn := msisdn }
-}
-
-template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
-	id_enc := { smsc_addr := smsc_addr }
-}
-template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
-	id_enc := { smsc_addr := smsc_addr }
-}
-
-template (value) GSUP_SM_RP_DA ts_GSUP_SM_RP_DA_NULL := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
-	id_enc := omit
-}
-template GSUP_SM_RP_DA tr_GSUP_SM_RP_DA_NULL := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
-	id_enc := omit
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SM_RP_DA(GSUP_SM_RP_DA val) := {
-	tag := OSMO_GSUP_SM_RP_DA_IE,
-	len := 0, /* overwritten */
-	val := {
-		sm_rp_da := val
-	}
-}
-template GSUP_IE tr_GSUP_IE_SM_RP_DA(template GSUP_SM_RP_DA val) := {
-	tag := OSMO_GSUP_SM_RP_DA_IE,
-	len := ?,
-	val := {
-		sm_rp_da := val
-	}
-}
-
 /**
  * SM-RP-OA represents the SM Originating Address, see 7.6.8.2.
  * It can be either of the following:
@@ -1228,64 +388,6 @@
 	)"
 };
 
-template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_MSISDN(GSUP_SM_RP_Addr msisdn) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
-	id_enc := { msisdn := msisdn }
-}
-template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_MSISDN(template GSUP_SM_RP_Addr msisdn) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_MSISDN,
-	id_enc := { msisdn := msisdn }
-}
-
-template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_SMSC_ADDR(GSUP_SM_RP_Addr smsc_addr) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
-	id_enc := { smsc_addr := smsc_addr }
-}
-template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_SMSC_ADDR(template GSUP_SM_RP_Addr smsc_addr) := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR,
-	id_enc := { smsc_addr := smsc_addr }
-}
-
-template (value) GSUP_SM_RP_OA ts_GSUP_SM_RP_OA_NULL := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
-	id_enc := omit
-}
-template GSUP_SM_RP_OA tr_GSUP_SM_RP_OA_NULL := {
-	id_type := OSMO_GSUP_SM_RP_ODA_ID_NULL,
-	id_enc := omit
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SM_RP_OA(GSUP_SM_RP_OA val) := {
-	tag := OSMO_GSUP_SM_RP_OA_IE,
-	len := 0, /* overwritten */
-	val := {
-		sm_rp_oa := val
-	}
-}
-template GSUP_IE tr_GSUP_IE_SM_RP_OA(template GSUP_SM_RP_OA val) := {
-	tag := OSMO_GSUP_SM_RP_OA_IE,
-	len := ?,
-	val := {
-		sm_rp_oa := val
-	}
-}
-
-/* SM-RP-UI represents the SM TPDU, see 7.6.8.4 */
-template (value) GSUP_IE ts_GSUP_IE_SM_RP_UI(octetstring val) := {
-	tag := OSMO_GSUP_SM_RP_UI_IE,
-	len := 0, /* overwritten */
-	val := {
-		sm_rp_ui := val
-	}
-}
-template GSUP_IE tr_GSUP_IE_SM_RP_UI(template octetstring val) := {
-	tag := OSMO_GSUP_SM_RP_UI_IE,
-	len := ?,
-	val := {
-		sm_rp_ui := val
-	}
-}
-
 /* SM Alert Reason types, see 7.6.8.8 */
 type enumerated GSUP_SM_ALERT_RSN_Type {
 	GSUP_SM_ALERT_RSN_TYPE_NONE		('00'O),
@@ -1293,728 +395,14 @@
 	GSUP_SM_ALERT_RSN_TYPE_MEM_AVAIL	('02'O)
 } with { variant "FIELDLENGTH(8)" };
 
-/* SM Alert Reason IE (used in READY-FOR-SM), see 7.6.8.8 */
-template (value) GSUP_IE ts_GSUP_IE_SM_ALERT_RSN(GSUP_SM_ALERT_RSN_Type rsn) := {
-	tag := OSMO_GSUP_SM_ALERT_RSN_IE,
-	len := 0, /* overwritten */
-	val := {
-		sm_alert_rsn := rsn
-	}
-}
-template GSUP_IE tr_GSUP_IE_SM_ALERT_RSN(template GSUP_SM_ALERT_RSN_Type rsn) := {
-	tag := OSMO_GSUP_SM_ALERT_RSN_IE,
-	len := ?,
-	val := {
-		sm_alert_rsn := rsn
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_SSInfo(octetstring ss) := {
-	tag := OSMO_GSUP_SS_INFO_IE,
-	len := 0, /* overwritten */
-	val := {
-		ss_info := ss
-	}
-}
-template GSUP_IE tr_GSUP_IE_SSInfo(template octetstring ss) := {
-	tag := OSMO_GSUP_SS_INFO_IE,
-	len := ?,
-	val := {
-		ss_info := ss
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_Message_Class(template GSUP_Message_Class val) := {
-	tag := OSMO_GSUP_MESSAGE_CLASS_IE,
-	len := ?,
-	val := {
-		message_class := val
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_Message_Class(GSUP_Message_Class val) := {
-	tag := OSMO_GSUP_MESSAGE_CLASS_IE,
-	len := 0, /* overwritten */
-	val := {
-		message_class := val
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_Source_Name(template octetstring name) := {
-	tag := OSMO_GSUP_SOURCE_NAME_IE,
-	len := ?,
-	val := {
-		source_name := name
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_Source_Name(octetstring name) := {
-	tag := OSMO_GSUP_SOURCE_NAME_IE,
-	len := 0, /* overwritten */
-	val := {
-		source_name := name
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_Destination_Name(template octetstring name) := {
-	tag := OSMO_GSUP_DESTINATION_NAME_IE,
-	len := ?,
-	val := {
-		destination_name := name
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_Destination_Name(octetstring name) := {
-	tag := OSMO_GSUP_DESTINATION_NAME_IE,
-	len := 0, /* overwritten */
-	val := {
-		destination_name := name
-	}
-}
-
-template GSUP_IE tr_GSUP_IE_AN_APDU(template GSUP_AN_APDU an_apdu) := {
-	tag := OSMO_GSUP_AN_APDU_IE,
-	len := ?,
-	val := {
-		an_apdu := an_apdu
-	}
-}
-
-template (value) GSUP_IE ts_GSUP_IE_AN_APDU(GSUP_AN_APDU an_apdu) := {
-	tag := OSMO_GSUP_AN_APDU_IE,
-	len := 0, /* overwritten */
-	val := {
-		an_apdu := an_apdu
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_SUPPORTED_RAT_TYPES(template (present) GSUP_RatTypes ratt) := {
-	tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
-	len := ?,
-	val := {
-		supported_rat_types := ratt
-	}
-}
-template (value) GSUP_IE ts_GSUP_IE_SUPPORTED_RAT_TYPES(GSUP_RatTypes ratt) := {
-	tag := OSMO_GSUP_SUPPORTED_RAT_TYPES_IE,
-	len := 0, /* overwritten */
-	val := {
-		supported_rat_types := ratt
-	}
-}
-
-template (present) GSUP_IE tr_GSUP_IE_CURRENT_RAT_TYPE(template (present) GSUP_RatType ratt) := {
-	tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
-	len := ?,
-	val := {
-		current_rat_type := ratt
-	}
-}
-template (value) GSUP_IE ts_GSUP_IE_CURRENT_RAT_TYPE(GSUP_RatType ratt) := {
-	tag := OSMO_GSUP_CURRENT_RAT_TYPE_IE,
-	len := 0, /* overwritten */
-	val := {
-		current_rat_type := ratt
-	}
-}
-
-private function f_gen_ts_ies(hexstring imsi,
-			   template (omit) GSUP_Message_Class message_class := omit,
-			   template (omit) hexstring imei := omit,
-			   template (omit) GSUP_CnDomain dom := omit,
-			   template (omit) octetstring source_name := omit,
-			   template (omit) octetstring destination_name := omit
-			  ) return GSUP_IEs {
-	var GSUP_IEs ies := {
-		valueof(ts_GSUP_IE_IMSI(imsi))
-	};
-
-	if (isvalue(dom)) {
-		ies := ies & { valueof(ts_GSUP_IE_CnDomain(dom)) };
-	}
-
-	if (isvalue(imei)) {
-		ies := ies & { valueof(ts_GSUP_IE_IMEI(valueof(imei))) };
-	}
-
-	if (isvalue(message_class)) {
-		ies := ies & { valueof(ts_GSUP_IE_Message_Class(valueof(message_class))) };
-	}
-
-	if (isvalue(source_name)) {
-		ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
-	}
-
-	if (isvalue(destination_name)) {
-		ies := ies & { valueof(ts_GSUP_IE_Destination_Name(valueof(destination_name))) };
-	}
-
-	return ies;
-}
-
-private function f_gen_tr_ies(template hexstring imsi,
-			      template GSUP_Message_Class message_class := omit,
-			      template integer cause := omit,
-			      template hexstring msisdn := omit,
-			      template GSUP_IMEIResult imei_result := omit,
-			      template octetstring source_name := omit,
-			      template octetstring destination_name := omit
-			     ) return template GSUP_IEs {
-	var template GSUP_IEs ies := {
-		tr_GSUP_IE_IMSI(imsi)
-	};
-	var integer idx := 1;
-
-	if (isvalue(cause)) {
-		ies[idx] := tr_GSUP_IE_Cause(cause);
-		idx := idx + 1;
-	}
-
-	if (isvalue(msisdn)) {
-		ies[idx] := tr_GSUP_IE_MSISDN(msisdn);
-		idx := idx + 1;
-	}
-
-	if (isvalue(imei_result)) {
-		ies[idx] := tr_GSUP_IE_IMEI_Result(imei_result);
-		idx := idx + 1;
-	}
-
-	if (isvalue(message_class)) {
-		ies[idx] := tr_GSUP_IE_Message_Class(message_class);
-		idx := idx + 1;
-	}
-
-	if (isvalue(source_name)) {
-		ies[idx] := tr_GSUP_IE_Source_Name(source_name);
-		idx := idx + 1;
-	}
-
-	ies[idx] := *;
-	idx := idx + 1;
-
-	if (isvalue(destination_name)) {
-		ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
-		idx := idx + 1;
-	}
-
-	return ies;
-}
-
-private function f_gen_ts_ss_ies(
-	hexstring imsi,
-	OCT4 sid,
-	GSUP_SessionState state,
-	template (omit) octetstring ss := omit,
-	template (omit) integer cause := omit,
-	template octetstring source_name := omit
-) return GSUP_IEs {
-	/* Mandatory IEs */
-	var GSUP_IEs ies := {
-		valueof(ts_GSUP_IE_IMSI(imsi))
-	};
-
-	/* Cause IE is needed for PROC_SS_ERR */
-	if (isvalue(cause)) {
-		ies := ies & { valueof(ts_GSUP_IE_Cause(valueof(cause))) };
-	}
-
-	/* Mandatory session IEs */
-	ies := ies & { valueof(ts_GSUP_IE_SessionId(sid)) };
-	ies := ies & { valueof(ts_GSUP_IE_SessionState(state)) };
-
-	/* Optional SS payload */
-	if (isvalue(ss)) {
-		ies := ies & { valueof(ts_GSUP_IE_SSInfo(valueof(ss))) };
-	}
-
-	if (isvalue(source_name)) {
-		ies := ies & { valueof(ts_GSUP_IE_Source_Name(valueof(source_name))) };
-	}
-
-	return ies;
-}
-private function f_gen_tr_ss_ies(
-	template hexstring imsi,
-	template OCT4 sid := ?,
-	template GSUP_SessionState state := ?,
-	template octetstring ss := omit,
-	template integer cause := omit,
-	template octetstring destination_name := omit
-) return template GSUP_IEs {
-	/* Mandatory IEs */
-	var template GSUP_IEs ies := {
-		tr_GSUP_IE_IMSI(imsi)
-	};
-	var integer idx := 1;
-
-	/* Cause IE is needed for PROC_SS_ERR */
-	if (istemplatekind(cause, "*")) {
-		ies[idx] := *;
-		idx := idx + 1;
-	} else if (not istemplatekind(cause, "omit")) {
-		ies[idx] := tr_GSUP_IE_Cause(cause);
-		idx := idx + 1;
-	}
-
-	/* Mandatory session IEs */
-	ies[idx] := tr_GSUP_IE_SessionId(sid);
-	ies[idx + 1] := tr_GSUP_IE_SessionState(state);
-	idx := idx + 2;
-
-	/* Optional SS payload */
-	if (istemplatekind(ss, "*")) {
-		ies[idx] := *;
-		idx := idx + 1;
-	} else if (not istemplatekind(ss, "omit")) {
-		ies[idx] := tr_GSUP_IE_SSInfo(ss);
-		idx := idx + 1;
-	}
-
-	if (isvalue(destination_name)) {
-		ies[idx] := tr_GSUP_IE_Destination_Name(destination_name);
-		idx := idx + 1;
-	}
-
-	/* the GSUP Message Class IE is optional, as old implementations don't have it yet */
-	var template GSUP_IEs ies2 := ies;
-	ies2[idx] := tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_USSD);
-	idx := idx + 1;
-
-	return (ies, ies2);
-}
-
-template (value) GSUP_PDU ts_GSUP_PROC_SS_REQ(
-	hexstring imsi,
-	OCT4 sid,
-	GSUP_SessionState state,
-	template (omit) octetstring ss := omit,
-	template (omit) octetstring source_name := omit
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_PROC_SS_REQUEST,
-	f_gen_ts_ss_ies(imsi, sid, state, ss, source_name := source_name)
-);
-template GSUP_PDU tr_GSUP_PROC_SS_REQ(
-	template hexstring imsi,
-	template OCT4 sid := ?,
-	template GSUP_SessionState state := ?,
-	template octetstring ss := *
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_PROC_SS_REQUEST,
-	f_gen_tr_ss_ies(imsi, sid, state, ss)
-);
-
-template (value) GSUP_PDU ts_GSUP_PROC_SS_RES(
-	hexstring imsi,
-	OCT4 sid,
-	GSUP_SessionState state,
-	template (omit) octetstring ss := omit
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_PROC_SS_RESULT,
-	f_gen_ts_ss_ies(imsi, sid, state, ss)
-);
-template GSUP_PDU tr_GSUP_PROC_SS_RES(
-	template hexstring imsi,
-	template OCT4 sid := ?,
-	template GSUP_SessionState state := ?,
-	template octetstring ss := *,
-	template octetstring destination_name := omit
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_PROC_SS_RESULT,
-	f_gen_tr_ss_ies(imsi, sid, state, ss, destination_name := destination_name)
-);
-
-template (value) GSUP_PDU ts_GSUP_PROC_SS_ERR(
-	hexstring imsi,
-	OCT4 sid,
-	GSUP_SessionState state,
-	integer cause
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_PROC_SS_ERROR,
-	f_gen_ts_ss_ies(imsi, sid, state, cause := cause)
-);
-template GSUP_PDU tr_GSUP_PROC_SS_ERR(
-	template hexstring imsi,
-	template OCT4 sid := ?,
-	template GSUP_SessionState state := ?,
-	template integer cause := ?
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_PROC_SS_ERROR,
-	f_gen_tr_ss_ies(imsi, sid, state, cause := cause)
-);
-
-template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_REQ(
-	hexstring imsi,
-	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
-	GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
-	octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
-		valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
-		valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MO_FORWARD_SM_REQ(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
-	template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
-	template octetstring sm_rp_ui /* SM TPDU, see 7.6.8.4 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_MO_FORWARD_SM_REQUEST,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_SM_RP_DA(sm_rp_da),
-		tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
-		tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_RES(
-	hexstring imsi,
-	OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MO_FORWARD_SM_RES(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_MO_FORWARD_SM_RESULT,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MO_FORWARD_SM_ERR(
-	hexstring imsi,
-	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MO_FORWARD_SM_ERR(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_MO_FORWARD_SM_ERROR,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_REQ(
-	hexstring imsi,
-	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
-	GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
-	octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
-	OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
-	{
-		/**
-		 * TODO: add MT-specific fields (and IEs):
-		 *  - smDeliveryTimer
-		 *  - smDeliveryStartTime
-		 */
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_SM_RP_DA(sm_rp_da)),
-		valueof(ts_GSUP_IE_SM_RP_OA(sm_rp_oa)),
-		valueof(ts_GSUP_IE_SM_RP_UI(sm_rp_ui)),
-		valueof(ts_GSUP_IE_SM_RP_MMS(sm_rp_mms)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MT_FORWARD_SM_REQ(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	template GSUP_SM_RP_DA sm_rp_da, /* Destination Address, see 7.6.8.1 */
-	template GSUP_SM_RP_OA sm_rp_oa, /* Originating Address, see 7.6.8.2 */
-	template octetstring sm_rp_ui, /* SM TPDU, see 7.6.8.4 */
-	template OCT1 sm_rp_mms /* MMS (More Messages to Send), see 7.6.8.7 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_MT_FORWARD_SM_REQUEST,
-	{
-		/**
-		 * TODO: add MT-specific fields (and IEs):
-		 *  - smDeliveryTimer
-		 *  - smDeliveryStartTime
-		 */
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_SM_RP_DA(sm_rp_da),
-		tr_GSUP_IE_SM_RP_OA(sm_rp_oa),
-		tr_GSUP_IE_SM_RP_UI(sm_rp_ui),
-		tr_GSUP_IE_SM_RP_MMS(sm_rp_mms),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_RES(
-	hexstring imsi,
-	OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MT_FORWARD_SM_RES(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_MT_FORWARD_SM_RESULT,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MT_FORWARD_SM_ERR(
-	hexstring imsi,
-	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MT_FORWARD_SM_ERR(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_MT_FORWARD_SM_ERROR,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_REQ(
-	hexstring imsi,
-	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	GSUP_SM_ALERT_RSN_Type sm_alert_rsn /* SM Alert Reason, see 7.6.8.8 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_REQ(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	template GSUP_SM_ALERT_RSN_Type sm_alert_rsn := ? /* SM Alert Reason, see 7.6.8.8 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_READY_FOR_SM_REQUEST,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_SM_ALERT_RSN(sm_alert_rsn),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_RES(
-	hexstring imsi,
-	OCT1 sm_rp_mr /* Message Reference, see GSM TS 04.11, 8.2.3 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_RES(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ? /* Message Reference, see GSM TS 04.11, 8.2.3 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_READY_FOR_SM_RESULT,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_MO_READY_FOR_SM_ERR(
-	hexstring imsi,
-	OCT1 sm_rp_mr, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	OCT1 sm_rp_cause /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_SM_RP_MR(sm_rp_mr)),
-		valueof(ts_GSUP_IE_SM_RP_CAUSE(sm_rp_cause)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS))
-	}
-);
-template GSUP_PDU tr_GSUP_MO_READY_FOR_SM_ERR(
-	template hexstring imsi := ?,
-	template OCT1 sm_rp_mr := ?, /* Message Reference, see GSM TS 04.11, 8.2.3 */
-	template OCT1 sm_rp_cause := ? /* RP-Cause value, see GSM TS 04.11, 8.2.5.4 */
-) := tr_GSUP(
-	OSMO_GSUP_MSGT_READY_FOR_SM_ERROR,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_SM_RP_MR(sm_rp_mr),
-		tr_GSUP_IE_SM_RP_CAUSE(sm_rp_cause),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_SMS),
-		tr_GSUP_IE_Source_Name(?)
-	}
-);
-
-function f_gsup_find_nested_ie_multiple(GSUP_IEs ies, GSUP_IEI iei, integer nth,  out GSUP_IeValue ret) return boolean {
-	var integer current := 0;
-	for (var integer i := 0; i < sizeof(ies); i := i+1) {
-		if (ies[i].tag == iei) {
-			if (current == nth) {
-				ret := ies[i].val;
-				return true;
-			} else {
-				current := current + 1;
-			}
-		}
-	}
-	return false;
-}
-
-function f_gsup_find_nested_ie(GSUP_IEs ies, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
-	for (var integer i := 0; i < sizeof(ies); i := i+1) {
-		if (ies[i].tag == iei) {
-			ret := ies[i].val;
-			return true;
-		}
-	}
-	return false;
-}
-
-function f_gsup_find_ie(GSUP_PDU msg, GSUP_IEI iei, out GSUP_IeValue ret) return boolean {
-	return f_gsup_find_nested_ie(msg.ies, iei, ret);
-}
-
-template GSUP_AN_APDU t_GSUP_AN_APDU(
-	template GSUP_AN_PROTO an_proto := ?,
-	template octetstring pdu := ?
-) := {
-	proto := an_proto,
-	pdu := pdu
-};
-
-template GSUP_PDU tr_GSUP_E_AN_APDU(
-	template GSUP_MessageType msgt,
-	template hexstring imsi := ?,
-	template octetstring source_name := ?,
-	template octetstring destination_name := ?,
-	template GSUP_AN_APDU an_apdu := ?
-) := tr_GSUP(
-	msgt,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
-		tr_GSUP_IE_Source_Name(source_name),
-		tr_GSUP_IE_Destination_Name(destination_name),
-		tr_GSUP_IE_AN_APDU(an_apdu)
-	}
-);
-
-template GSUP_PDU tr_GSUP_E_NO_PDU(
-	template GSUP_MessageType msgt,
-	template hexstring imsi := ?,
-	template octetstring source_name := ?,
-	template octetstring destination_name := ?
-) := tr_GSUP(
-	msgt,
-	{
-		tr_GSUP_IE_IMSI(imsi),
-		tr_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC),
-		tr_GSUP_IE_Source_Name(source_name),
-		tr_GSUP_IE_Destination_Name(destination_name)
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_E_AN_APDU(
-	GSUP_MessageType msgt,
-	hexstring imsi,
-	octetstring source_name,
-	octetstring destination_name,
-	GSUP_AN_APDU an_apdu
-) := ts_GSUP(
-	msgt,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
-		valueof(ts_GSUP_IE_Source_Name(source_name)),
-		valueof(ts_GSUP_IE_Destination_Name(destination_name)),
-		valueof(ts_GSUP_IE_AN_APDU(an_apdu))
-	}
-);
-
-template (value) GSUP_PDU ts_GSUP_E_PrepareHandoverResult(
-	hexstring imsi,
-	hexstring msisdn,
-	octetstring source_name,
-	octetstring destination_name,
-	GSUP_AN_APDU an_apdu
-) := ts_GSUP(
-	OSMO_GSUP_MSGT_E_PREPARE_HANDOVER_RESULT,
-	{
-		valueof(ts_GSUP_IE_IMSI(imsi)),
-		valueof(ts_GSUP_IE_MSISDN(msisdn)),
-		valueof(ts_GSUP_IE_Message_Class(OSMO_GSUP_MESSAGE_CLASS_INTER_MSC)),
-		valueof(ts_GSUP_IE_Source_Name(source_name)),
-		valueof(ts_GSUP_IE_Destination_Name(destination_name)),
-		valueof(ts_GSUP_IE_AN_APDU(an_apdu))
-	}
-);
+/* Possible identity types for SM-RP-{OA|DA} IEs */
+type enumerated GSUP_SM_RP_ODA_IdType {
+	OSMO_GSUP_SM_RP_ODA_ID_NONE		('00'O),
+	OSMO_GSUP_SM_RP_ODA_ID_IMSI		('01'O),
+	OSMO_GSUP_SM_RP_ODA_ID_MSISDN		('02'O),
+	OSMO_GSUP_SM_RP_ODA_ID_SMSC_ADDR	('03'O),
+	/* Special value for noSM-RP-DA and noSM-RP-OA */
+	OSMO_GSUP_SM_RP_ODA_ID_NULL		('FF'O)
+} with { variant "FIELDLENGTH(8)" };
 
 } with { encode "RAW"; variant "FIELDORDER(msb)" }
