diff --git a/dia2gsup/DIA2GSUP_Tests.ttcn b/dia2gsup/DIA2GSUP_Tests.ttcn
index 6e59460..6d1828f 100644
--- a/dia2gsup/DIA2GSUP_Tests.ttcn
+++ b/dia2gsup/DIA2GSUP_Tests.ttcn
@@ -6,8 +6,9 @@
 import from L3_Common all;
 
 import from IPA_Emulation all;
-import from GSUP_Emulation all;
 import from GSUP_Types all;
+import from GSUP_Templates all;
+import from GSUP_Emulation all;
 
 import from DIAMETER_Types all;
 import from DIAMETER_Templates all;
diff --git a/dia2gsup/gen_links.sh b/dia2gsup/gen_links.sh
index 52939f6..e343bd2 100755
--- a/dia2gsup/gen_links.sh
+++ b/dia2gsup/gen_links.sh
@@ -40,7 +40,7 @@
 FILES+="DIAMETER_Templates.ttcn DIAMETER_ts29_272_Templates.ttcn "
 FILES+="IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc
 IPA_Emulation.ttcnpp "
-FILES+="GSUP_Types.ttcn GSUP_Emulation.ttcn "
+FILES+="GSUP_Types.ttcn GSUP_Templates.ttcn GSUP_Emulation.ttcn "
 gen_links $DIR $FILES
 
 ignore_pp_results
diff --git a/epdg/EPDG_Tests.ttcn b/epdg/EPDG_Tests.ttcn
index 353c738..554dd07 100644
--- a/epdg/EPDG_Tests.ttcn
+++ b/epdg/EPDG_Tests.ttcn
@@ -7,8 +7,9 @@
 import from L3_Common all;
 
 import from IPA_Emulation all;
-import from GSUP_Emulation all;
 import from GSUP_Types all;
+import from GSUP_Templates all;
+import from GSUP_Emulation all;
 
 import from DIAMETER_Types all;
 import from DIAMETER_Templates all;
diff --git a/epdg/gen_links.sh b/epdg/gen_links.sh
index bc9d90e..82a0785 100755
--- a/epdg/gen_links.sh
+++ b/epdg/gen_links.sh
@@ -45,7 +45,7 @@
 FILES+="DIAMETER_Templates.ttcn DIAMETER_rfc5447_Templates.ttcn DIAMETER_ts29_273_Templates.ttcn "
 FILES+="IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc
 IPA_Emulation.ttcnpp "
-FILES+="GSUP_Types.ttcn GSUP_Emulation.ttcn "
+FILES+="GSUP_Types.ttcn GSUP_Templates.ttcn GSUP_Emulation.ttcn "
 FILES+="GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn "
 FILES+="GTPv2_CodecPort.ttcn GTPv2_CodecPort_CtrlFunctDef.cc GTPv2_CodecPort_CtrlFunct.ttcn GTPv2_Emulation.ttcn "
 gen_links $DIR $FILES
diff --git a/hlr/HLR_EUSE.ttcn b/hlr/HLR_EUSE.ttcn
index 17e4776..170bcd2 100644
--- a/hlr/HLR_EUSE.ttcn
+++ b/hlr/HLR_EUSE.ttcn
@@ -19,6 +19,7 @@
 module HLR_EUSE {
 
 import from GSUP_Types all;
+import from GSUP_Templates all;
 import from IPA_Emulation all;
 
 import from General_Types all;
diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn
index 794ef9b..46b98c2 100644
--- a/hlr/HLR_Tests.ttcn
+++ b/hlr/HLR_Tests.ttcn
@@ -15,6 +15,7 @@
 
 
 import from GSUP_Types all;
+import from GSUP_Templates all;
 import from GSUP_Emulation all;
 import from IPA_Emulation all;
 
diff --git a/hlr/gen_links.sh b/hlr/gen_links.sh
index c77920d..52e01ba 100755
--- a/hlr/gen_links.sh
+++ b/hlr/gen_links.sh
@@ -44,7 +44,8 @@
 gen_links $DIR $FILES
 
 DIR=../library
-FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp GSUP_Types.ttcn GSUP_Emulation.ttcn "
+FILES="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn GSM_Types.ttcn IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp "
+FILES+="GSUP_Types.ttcn GSUP_Templates.ttcn GSUP_Emulation.ttcn "
 FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn "
 FILES+="Osmocom_VTY_Functions.ttcn "
 FILES+="SS_Templates.ttcn USSD_Helpers.ttcn "
diff --git a/library/GSUP_Templates.ttcn b/library/GSUP_Templates.ttcn
new file mode 100644
index 0000000..0e9a2e5
--- /dev/null
+++ b/library/GSUP_Templates.ttcn
@@ -0,0 +1,1650 @@
+module GSUP_Templates {
+
+/* GSUP_Templates, defining TTCN-3 templates for the GSUP protocol.
+ *
+ * GSUP is a non-standard protocol used between OsmoMSC/OsmoSGSN and OsmoHLR
+ * in order to replace the complex TCAP/MAP protocol.
+ *
+ * (C) 2017-2019 by Harald Welte <laforge@gnumonks.org>
+ * contributions by sysmocom - s.f.m.c. GmbH
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from GSUP_Types all;
+
+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
+	}
+}
+
+/* See 3GPP TS 24.011, figures 8.5 and 8.6 */
+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:
+ *  - IMSI
+ *  - LMSI (not implemented)
+ *  - MSISDN
+ *  - roaming number (not implemented)
+ *  - service centre address
+ */
+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:
+ *  - MSISDN
+ *  - service centre address
+ */
+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 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))
+	}
+);
+
+} with { encode "RAW"; variant "FIELDORDER(msb)" }
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)" }
diff --git a/library/IPA_Emulation.ttcnpp b/library/IPA_Emulation.ttcnpp
index 7a8e8d6..07fefe5 100644
--- a/library/IPA_Emulation.ttcnpp
+++ b/library/IPA_Emulation.ttcnpp
@@ -44,6 +44,7 @@
 
 #ifdef IPA_EMULATION_GSUP
 import from GSUP_Types all;
+import from GSUP_Templates all;
 #endif
 
 #ifdef IPA_EMULATION_RSPRO
diff --git a/msc/BSC_ConnectionHandler.ttcn b/msc/BSC_ConnectionHandler.ttcn
index e25d496..92ec3b1 100644
--- a/msc/BSC_ConnectionHandler.ttcn
+++ b/msc/BSC_ConnectionHandler.ttcn
@@ -31,6 +31,7 @@
 import from RANAP_Templates all;
 
 import from GSUP_Types all;
+import from GSUP_Templates all;
 import from GSUP_Emulation all;
 
 import from MNCC_Types all;
diff --git a/msc/MSC_Tests.ttcn b/msc/MSC_Tests.ttcn
index 1f8d8d4..7f993c4 100644
--- a/msc/MSC_Tests.ttcn
+++ b/msc/MSC_Tests.ttcn
@@ -47,8 +47,9 @@
 import from MGCP_Templates all;
 import from SDP_Types all;
 
-import from GSUP_Emulation all;
 import from GSUP_Types all;
+import from GSUP_Templates all;
+import from GSUP_Emulation all;
 import from IPA_Emulation all;
 
 import from BSSAP_Types all;
diff --git a/msc/gen_links.sh b/msc/gen_links.sh
index b112a67..8577208 100755
--- a/msc/gen_links.sh
+++ b/msc/gen_links.sh
@@ -93,7 +93,8 @@
 
 DIR=../library
 FILES="Misc_Helpers.ttcn General_Types.ttcn GSM_Types.ttcn Osmocom_Types.ttcn MNCC_Types.ttcn MNCC_EncDec.cc MNCC_CodecPort.ttcn mncc.h MNCC_Emulation.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc "
-FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc GSUP_Types.ttcn GSUP_Emulation.ttcn "
+FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc "
+FILES+="GSUP_Types.ttcn GSUP_Templates.ttcn GSUP_Emulation.ttcn "
 FILES+="Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn L3_Templates.ttcn RLCMAC_CSN1_Templates.ttcn RLCMAC_CSN1_Types.ttcn L3_Common.ttcn "
 FILES+="RAN_Emulation.ttcnpp BSSAP_CodecPort.ttcn BSSMAP_Templates.ttcn RAN_Adapter.ttcnpp MGCP_Types.ttcn MGCP_Templates.ttcn MGCP_CodecPort_CtrlFunct.ttcn MGCP_Emulation.ttcn "
 FILES+="RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunctDef.cc "
diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn
index 4af44ee..13c0be1 100644
--- a/sgsn/SGSN_Tests.ttcn
+++ b/sgsn/SGSN_Tests.ttcn
@@ -31,8 +31,9 @@
 import from L3_Templates all;
 import from L3_Common all;
 
-import from GSUP_Emulation all;
 import from GSUP_Types all;
+import from GSUP_Templates all;
+import from GSUP_Emulation all;
 import from IPA_Emulation all;
 
 import from RAN_Adapter all;
diff --git a/sgsn/gen_links.sh b/sgsn/gen_links.sh
index c78227f..afe6b02 100755
--- a/sgsn/gen_links.sh
+++ b/sgsn/gen_links.sh
@@ -91,7 +91,8 @@
 FILES+="LLC_Templates.ttcn L3_Templates.ttcn L3_Common.ttcn "
 FILES+="RAN_Emulation.ttcnpp RAN_Adapter.ttcnpp SCCP_Templates.ttcn "
 # IPA_Emulation + dependencies
-FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc Native_Functions.ttcn Native_FunctionDefs.cc GSUP_Types.ttcn GSUP_Emulation.ttcn "
+FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc Native_Functions.ttcn Native_FunctionDefs.cc "
+FILES+="GSUP_Types.ttcn GSUP_Templates.ttcn GSUP_Emulation.ttcn "
 FILES+="GTP_CodecPort.ttcn GTP_CodecPort_CtrlFunct.ttcn GTP_CodecPort_CtrlFunctDef.cc GTP_Emulation.ttcn GTP_Templates.ttcn IPCP_Types.ttcn RAW_NS.ttcnpp "
 gen_links $DIR $FILES
 
