diff --git a/library/AbisOML_Types.ttcn b/library/AbisOML_Types.ttcn
new file mode 100644
index 0000000..0d37f8a
--- /dev/null
+++ b/library/AbisOML_Types.ttcn
@@ -0,0 +1,1221 @@
+module AbisOML_Types {
+
+/* AbisOML_Types, defining abstract TTCN-3 data types for the A-bis OML protocol.
+ *
+ * A-bis OML is a 3GP standard protocol used between BTS and BSC in a GSM network;
+ * it is specified in 3GPP TS 12.21.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of the GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ */
+
+import from General_Types all;
+import from Osmocom_Types all;
+import from GSM_Types all;
+
+type enumerated OML_MessageDiscriminator {
+	ABIS_OM_MDISC_FOM	('80'H),
+	ABIS_OM_MDISC_MMI	('40'H),
+	ABIS_OM_MDISC_TRAU	('20'H),
+	ABIS_OM_MDISC_MANUF	('10'H)
+} with { variant "FIELDLENGTH(8)" };
+
+type enumerated OML_Placement {
+	ABIS_OM_PLACEMENT_ONLY		('80'H),
+	ABIS_OM_PLACEMENT_FIRST		('40'H),
+	ABIS_OM_PLACEMENT_MIDDLE	('20'H),
+	ABIS_OM_PLACEMENT_LAST		('10'H)
+} with { variant "FIELDLENGTH(8)" };
+
+type union OML_Union {
+	OML_FOM		fom,
+	OML_MANUF	manuf,
+	octetstring	other
+};
+
+type record OML_PDU {
+	OML_MessageDiscriminator	mdisc,
+	OML_Placement			placement,
+	uint8_t				sequence,
+	OML_Union			u
+} with {
+	 variant (u) "CROSSTAG(
+			fom, mdisc = ABIS_OM_MDISC_FOM;
+			manuf, mdisc = ABIS_OM_MDISC_MANUF;
+			other, OTHERWISE;
+		)" };
+
+
+type record OML_FOM_ObjectInstance {
+	uint8_t		bts_nr,
+	uint8_t		trx_nr,
+	uint8_t		ts_nr
+};
+
+
+type record OML_FOM_Header {
+	OML_FOM_MessageType		msg_type,
+	OML_FOM_ObjectClass		obj_class,
+	OML_FOM_ObjectInstance		obj_inst
+};
+
+/* Section 9.1 */
+type enumerated OML_FOM_MessageType {
+	/* SW Download Management Messages */
+	NM_MT_LOAD_INIT			('01'H),
+	NM_MT_LOAD_INIT_ACK		('02'H),
+	NM_MT_LOAD_INIT_NACK		('03'H),
+	NM_MT_LOAD_SEG			('04'H),
+	NM_MT_LOAD_SEG_ACK		('05'H),
+	NM_MT_LOAD_ABORT		('06'H),
+	NM_MT_LOAD_END			('07'H),
+	NM_MT_LOAD_END_ACK		('08'H),
+	NM_MT_LOAD_END_NACK		('09'H),
+	NM_MT_SW_ACT_REQ		('0a'H),
+	NM_MT_SW_ACT_REQ_ACK		('0b'H),
+	NM_MT_SW_ACT_REQ_NACK		('0c'H),
+	NM_MT_ACTIVATE_SW		('0d'H),
+	NM_MT_ACTIVATE_SW_ACK		('0e'H),
+	NM_MT_ACTIVATE_SW_NACK		('0f'H),
+	NM_MT_SW_ACTIVATED_REP		('10'H),
+
+	/* A-bis Interface Management Messages */
+	NM_MT_ESTABLISH_TEI		('21'H),
+	NM_MT_ESTABLISH_TEI_ACK		('22'H),
+	NM_MT_ESTABLISH_TEI_NACK	('23'H),
+	NM_MT_CONN_TERR_SIGN		('24'H),
+	NM_MT_CONN_TERR_SIGN_ACK	('25'H),
+	NM_MT_CONN_TERR_SIGN_NACK	('26'H),
+	NM_MT_DISC_TERR_SIGN		('27'H),
+	NM_MT_DISC_TERR_SIGN_ACK	('28'H),
+	NM_MT_DISC_TERR_SIGN_NACK	('29'H),
+	NM_MT_CONN_TERR_TRAF		('2a'H),
+	NM_MT_CONN_TERR_TRAF_ACK	('2b'H),
+	NM_MT_CONN_TERR_TRAF_NACK	('2c'H),
+	NM_MT_DISC_TERR_TRAF		('2d'H),
+	NM_MT_DISC_TERR_TRAF_ACK	('2e'H),
+	NM_MT_DISC_TERR_TRAF_NACK	('2f'H),
+	/* Transmission Management Messages */	
+	NM_MT_CONN_MDROP_LINK		('31'H),
+	NM_MT_CONN_MDROP_LINK_ACK	('32'H),
+	NM_MT_CONN_MDROP_LINK_NACK	('33'H),
+	NM_MT_DISC_MDROP_LINK		('34'H),
+	NM_MT_DISC_MDROP_LINK_ACK	('35'H),
+	NM_MT_DISC_MDROP_LINK_NACK	('36'H),
+	/* Air Interface Management Messages */
+	NM_MT_SET_BTS_ATTR		('41'H),
+	NM_MT_SET_BTS_ATTR_ACK		('42'H),
+	NM_MT_SET_BTS_ATTR_NACK		('43'H),
+	NM_MT_SET_RADIO_ATTR		('44'H),
+	NM_MT_SET_RADIO_ATTR_ACK	('45'H),
+	NM_MT_SET_RADIO_ATTR_NACK	('46'H),
+	NM_MT_SET_CHAN_ATTR		('47'H),
+	NM_MT_SET_CHAN_ATTR_ACK		('48'H),
+	NM_MT_SET_CHAN_ATTR_NACK	('49'H),
+	/* Test Management Messages */
+	NM_MT_PERF_TEST			('51'H),
+	NM_MT_PERF_TEST_ACK		('52'H),
+	NM_MT_PERF_TEST_NACK		('53'H),
+	NM_MT_TEST_REP			('54'H),
+	NM_MT_SEND_TEST_REP		('55'H),
+	NM_MT_SEND_TEST_REP_ACK		('56'H),
+	NM_MT_SEND_TEST_REP_NACK	('57'H),
+	NM_MT_STOP_TEST			('58'H),
+	NM_MT_STOP_TEST_ACK		('59'H),
+	NM_MT_STOP_TEST_NACK		('5a'H),
+	/* State Management and Event Report Messages */
+	NM_MT_STATECHG_EVENT_REP	('61'H),
+	NM_MT_FAILURE_EVENT_REP		('62'H),
+	NM_MT_STOP_EVENT_REP		('63'H),
+	NM_MT_STOP_EVENT_REP_ACK	('64'H),
+	NM_MT_STOP_EVENT_REP_NACK	('65'H),
+	NM_MT_REST_EVENT_REP		('66'H),
+	NM_MT_REST_EVENT_REP_ACK	('67'H),
+	NM_MT_REST_EVENT_REP_NACK	('68'H),
+	NM_MT_CHG_ADM_STATE		('69'H),
+	NM_MT_CHG_ADM_STATE_ACK		('6a'H),
+	NM_MT_CHG_ADM_STATE_NACK	('6b'H),
+	NM_MT_CHG_ADM_STATE_REQ		('6c'H),
+	NM_MT_CHG_ADM_STATE_REQ_ACK	('6d'H),
+	NM_MT_CHG_ADM_STATE_REQ_NACK	('6e'H),
+
+	NM_MT_REP_OUTST_ALARMS		('93'H),
+	NM_MT_REP_OUTST_ALARMS_ACK	('94'H),
+	NM_MT_REP_OUTST_ALARMS_NACK	('95'H),
+
+	/* Equipment Management Messages */
+	NM_MT_CHANGEOVER		('71'H),
+	NM_MT_CHANGEOVER_ACK		('72'H),
+	NM_MT_CHANGEOVER_NACK		('73'H),
+	NM_MT_OPSTART			('74'H),
+	NM_MT_OPSTART_ACK		('75'H),
+	NM_MT_OPSTART_NACK		('76'H),
+	NM_MT_REINIT			('77'H),
+	NM_MT_REINIT_ACK		('78'H),
+	NM_MT_REINIT_NACK		('79'H),
+	NM_MT_SET_SITE_OUT		('7a'H),
+	NM_MT_SET_SITE_OUT_ACK		('7b'H),
+	NM_MT_SET_SITE_OUT_NACK		('7c'H),
+
+	NM_MT_CHG_HW_CONF		('90'H),
+	NM_MT_CHG_HW_CONF_ACK		('91'H),
+	NM_MT_CHG_HW_CONF_NACK		('92'H),
+
+	/* Measurement Management Messages */
+	NM_MT_MEAS_RES_REQ		('8a'H),
+	NM_MT_MEAS_RES_RESP		('8b'H),
+	NM_MT_STOP_MEAS			('8c'H),
+	NM_MT_START_MEAS		('8d'H),
+
+	/* Other Messages */
+	NM_MT_GET_ATTR			('81'H),
+	NM_MT_GET_ATTR_RESP		('82'H),
+	NM_MT_GET_ATTR_NACK		('83'H),
+	NM_MT_SET_ALARM_THRES		('84'H),
+	NM_MT_SET_ALARM_THRES_ACK	('85'H),
+	NM_MT_SET_ALARM_THRES_NACK	('86'H),
+
+	/* IPA specific messages */
+	NM_MT_IPACC_RESTART		('87'H),
+	NM_MT_IPACC_RESTART_ACK		('88'H),
+	NM_MT_IPACC_RESTART_NACK	('89'H),
+
+	NM_MT_IPACC_RSL_CONNECT		('e0'H),
+	NM_MT_IPACC_RSL_CONNECT_ACK	('e1'H),
+	NM_MT_IPACC_RSL_CONNECT_NACK	('e2'H),
+	NM_MT_IPACC_RSL_DISCONNECT	('e3'H),
+	NM_MT_IPACC_RSL_DISCONNECT_ACK	('e4'H),
+	NM_MT_IPACC_RSL_DISCONNECT_NACK	('e5'H),
+	NM_MT_IPACC_CONN_TRAF		('e6'H),
+	NM_MT_IPACC_CONN_TRAF_ACK	('e7'H),
+	NM_MT_IPACC_CONN_TRAF_NACK	('e8'H),
+	NM_MT_IPACC_DEF_BOOT_SW		('ec'H),
+	NM_MT_IPACC_DEF_BOOT_SW_ACK	('ed'H),
+	MN_MT_IPACC_DEF_BOOT_SW_NACK	('ee'H),
+	NM_MT_IPACC_SET_NVATTR		('ef'H),
+	NM_MT_IPACC_SET_NVATTR_ACK	('f0'H),
+	NM_MT_IPACC_SET_NVATTR_NACK	('f1'H),
+	NM_MT_IPACC_GET_NVATTR		('f2'H),
+	NM_MT_IPACC_GET_NVATTR_ACK	('f3'H),
+	NM_MT_IPACC_GET_NVATTR_NACK	('f4'H),
+	NM_MT_IPACC_SET_ATTR		('f5'H),
+	NM_MT_IPACC_SET_ATTR_ACK	('f6'H),
+	NM_MT_IPACC_SET_ATTR_NACK	('f7'H)
+
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.2 */
+type enumerated OML_FOM_ObjectClass {
+	NM_OC_SITE_MANAGER		('00'H),
+	NM_OC_BTS			('01'H),
+	NM_OC_RADIO_CARRIER		('02'H),
+	NM_OC_CHANNEL			('03'H),
+	NM_OC_BASEB_TRANSC		('04'H),
+
+	NM_OC_IPAC_E1_TRUNK		('0e'H),
+	NM_OC_IPAC_E1_PORT		('0f'H),
+	NM_OC_IPAC_E1_CHAN		('10'H),
+	NM_OC_IPAC_CLK_MODULE		('22'H),
+
+	NM_OC_GPRS_NSE			('f0'H),
+	NM_OC_GPRS_CELL			('f1'H),
+	NM_OC_GPRS_NSVC			('f2'H),
+
+	NM_OC_NULL			('ff'H)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4 */
+type enumerated OML_FOM_IE_Type {
+	NM_ATT_ABIS_CHANNEL		('01'H),
+	NM_ATT_ADD_INFO			('02'H),
+	NM_ATT_ADD_TEXT			('03'H),
+	NM_ATT_ADM_STATE		('04'H),
+	NM_ATT_ARFCN_LIST		('05'H),
+	NM_ATT_AUTON_REPORT		('06'H),
+	NM_ATT_AVAIL_STATUS		('07'H),
+	NM_ATT_BCCH_ARFCN		('08'H),
+	NM_ATT_BSIC			('09'H),
+	NM_ATT_BTS_AIR_TIMER		('0a'H),
+	NM_ATT_CCCH_L_I_P		('0b'H),
+	NM_ATT_CCCH_L_T			('0c'H),
+	NM_ATT_CHAN_COMB		('0d'H),
+	NM_ATT_CONN_FAIL_CRIT		('0e'H),
+	NM_ATT_DEST			('0f'H),
+	/* res */
+	NM_ATT_EVENT_TYPE		('11'H),
+	NM_ATT_FILE_ID			('12'H),
+	NM_ATT_FILE_VERSION		('13'H),
+	NM_ATT_GSM_TIME			('14'H),
+	NM_ATT_HSN			('15'H),
+	NM_ATT_HW_CONFIG		('16'H),
+	NM_ATT_HW_DESC			('17'H),
+	NM_ATT_INTAVE_PARAM		('18'H),
+	NM_ATT_INTERF_BOUND		('19'H),
+	NM_ATT_LIST_REQ_ATTR		('1a'H),
+	NM_ATT_MAIO			('1b'H),
+	NM_ATT_MANUF_STATE		('1c'H),
+	NM_ATT_MANUF_THRESH		('1d'H),
+	NM_ATT_MANUF_ID			('1e'H),
+	NM_ATT_MAX_TA			('1f'H),
+	NM_ATT_MDROP_LINK		('20'H),
+	NM_ATT_MDROP_NEXT		('21'H),
+	NM_ATT_NACK_CAUSES		('22'H),
+	NM_ATT_NY1			('23'H),
+	NM_ATT_OPER_STATE		('24'H),
+	NM_ATT_OVERL_PERIOD		('25'H),
+	NM_ATT_PHYS_CONF		('26'H),
+	NM_ATT_POWER_CLASS		('27'H),
+	NM_ATT_POWER_THRESH		('28'H),
+	NM_ATT_PROB_CAUSE		('29'H),
+	NM_ATT_RACH_B_THRESH		('2a'H),
+	NM_ATT_LDAVG_SLOTS		('2b'H),
+	NM_ATT_RAD_SUBC			('2c'H),
+	NM_ATT_RF_MAXPOWR_R		('2d'H),
+	NM_ATT_SITE_INPUTS		('2e'H),
+	NM_ATT_SITE_OUTPUTS		('2f'H),
+	NM_ATT_SOURCE			('30'H),
+	NM_ATT_SPEC_PROB		('31'H),
+	NM_ATT_START_TIME		('32'H),
+	NM_ATT_T200			('33'H),
+	NM_ATT_TEI			('34'H),
+	NM_ATT_TEST_DUR			('35'H),
+	NM_ATT_TEST_NO			('36'H),
+	NM_ATT_TEST_REPORT		('37'H),
+	NM_ATT_VSWR_THRESH		('38'H),
+	NM_ATT_WINDOW_SIZE		('39'H),
+	/* res */
+	NM_ATT_BS11_RSSI_OFFS		('3d'H),
+	NM_ATT_BS11_TXPWR		('3e'H),
+	NM_ATT_BS11_DIVERSITY		('3f'H),
+	/* res */
+	NM_ATT_TSC			('40'H),
+	NM_ATT_SW_CONFIG		('41'H),
+	NM_ATT_SW_DESCR			('42'H),
+	NM_ATT_SEVERITY			('43'H),
+	NM_ATT_GET_ARI			('44'H),
+	NM_ATT_HW_CONF_CHG		('45'H),
+	NM_ATT_OUTST_ALARM		('46'H),
+	NM_ATT_FILE_DATA		('47'H),
+	NM_ATT_MEAS_RES			('48'H),
+	NM_ATT_MEAS_TYPE		('49'H),
+	/* res */
+	NM_ATT_BS11_ESN_FW_CODE_NO	('4c'H),
+	NM_ATT_BS11_ESN_HW_CODE_NO	('4f'H),
+	/* res */
+	NM_ATT_BS11_ESN_PCB_SERIAL	('55'H),
+	NM_ATT_BS11_EXCESSIVE_DISTANCE	('58'H),
+	NM_ATT_BS11_ALL_TEST_CATG	('60'H),
+	NM_ATT_BS11_BTSLS_HOPPING	('61'H),
+	NM_ATT_BS11_CELL_ALLOC_NR	('62'H),
+	NM_ATT_BS11_CELL_GLOBAL_ID	('63'H),
+
+	NM_ATT_BS11_ENA_INTERF_CLASS	('66'H),
+	NM_ATT_BS11_ENA_INT_INTEC_HANDO	('67'H),
+	NM_ATT_BS11_ENA_INT_INTRC_HANDO	('68'H),
+	NM_ATT_BS11_ENA_MS_PWR_CTRL	('69'H),
+	NM_ATT_BS11_ENA_PWR_BDGT_HO	('6a'H),
+	NM_ATT_BS11_ENA_PWR_CTRL_RLFW	('6b'H),
+	NM_ATT_BS11_ENA_RXLEV_HO	('6c'H),
+	NM_ATT_BS11_ENA_RXQUAL_HO	('6d'H),
+	NM_ATT_BS11_FACCH_QUAL		('6e'H),
+
+	NM_ATT_IPACC_DST_IP		('80'H),
+	NM_ATT_IPACC_DST_IP_PORT	('81'H),
+	NM_ATT_IPACC_SSRC		('82'H),
+	NM_ATT_IPACC_RTP_PAYLD_TYPE	('83'H),
+	NM_ATT_IPACC_BASEB_ID		('84'H),
+	NM_ATT_IPACC_STREAM_ID		('85'H),
+	NM_ATT_IPACC_NV_FLAGS		('86'H),
+	NM_ATT_IPACC_FREQ_CTRL		('87'H),
+	NM_ATT_IPACC_PRIM_OML_CFG	('88'H),
+	NM_ATT_IPACC_SEC_OML_CFG	('89'H),
+	NM_ATT_IPACC_IP_IF_CFG		('8a'H),
+	NM_ATT_IPACC_IP_GW_CFG		('8b'H),
+	NM_ATT_IPACC_IN_SERV_TIME	('8c'H),
+	NM_ATT_IPACC_TRX_BTS_ASS	('8d'H),
+	NM_ATT_IPACC_LOCATION		('8e'H),	/* string describing location */
+	NM_ATT_IPACC_PAGING_CFG		('8f'H),
+	NM_ATT_IPACC_FILE_DATA		('90'H),
+	NM_ATT_IPACC_UNIT_ID		('91'H),	/* Site/BTS/TRX */
+	NM_ATT_IPACC_PARENT_UNIT_ID	('92'H),
+	NM_ATT_IPACC_UNIT_NAME		('93'H),	/* default: nbts-<mac-as-string> */
+	NM_ATT_IPACC_SNMP_CFG		('94'H),
+	NM_ATT_IPACC_PRIM_OML_CFG_LIST	('95'H),
+	NM_ATT_IPACC_PRIM_OML_FB_TOUT	('96'H),
+	NM_ATT_IPACC_CUR_SW_CFG		('97'H),
+	NM_ATT_IPACC_TIMING_BUS		('98'H),
+	NM_ATT_IPACC_CGI		('99'H),
+	NM_ATT_IPACC_RAC		('9a'H),
+	NM_ATT_IPACC_OBJ_VERSION	('9b'H),
+	NM_ATT_IPACC_GPRS_PAGING_CFG	('9c'H),
+	NM_ATT_IPACC_NSEI		('9d'H),
+	NM_ATT_IPACC_BVCI		('9e'H),
+	NM_ATT_IPACC_NSVCI		('9f'H),
+	NM_ATT_IPACC_NS_CFG		('a0'H),
+	NM_ATT_IPACC_BSSGP_CFG		('a1'H),
+	NM_ATT_IPACC_NS_LINK_CFG	('a2'H),
+	NM_ATT_IPACC_RLC_CFG		('a3'H),
+	NM_ATT_IPACC_ALM_THRESH_LIST	('a4'H),
+	NM_ATT_IPACC_MONIT_VAL_LIST	('a5'H),
+	NM_ATT_IPACC_TIB_CONTROL	('a6'H),
+	NM_ATT_IPACC_SUPP_FEATURES	('a7'H),
+	NM_ATT_IPACC_CODING_SCHEMES	('a8'H),
+	NM_ATT_IPACC_RLC_CFG_2		('a9'H),
+	NM_ATT_IPACC_HEARTB_TOUT	('aa'H),
+	NM_ATT_IPACC_UPTIME		('ab'H),
+	NM_ATT_IPACC_RLC_CFG_3		('ac'H),
+	NM_ATT_IPACC_SSL_CFG		('ad'H),
+	NM_ATT_IPACC_SEC_POSSIBLE	('ae'H),
+	NM_ATT_IPACC_IML_SSL_STATE	('af'H),
+	NM_ATT_IPACC_REVOC_DATE		('b0'H),
+
+
+/*
+	NM_ATT_BS11_RF_RES_IND_PER	('8f'H),
+
+	NM_ATT_BS11_RX_LEV_MIN_CELL	('90'H),
+	NM_ATT_BS11_ABIS_EXT_TIME	('91'H),
+	NM_ATT_BS11_TIMER_HO_REQUEST	('92'H),
+	NM_ATT_BS11_TIMER_NCELL		('93'H),
+	NM_ATT_BS11_TSYNC		('94'H),
+	NM_ATT_BS11_TTRAU		('95'H),
+	NM_ATT_BS11_EMRG_CFG_MEMBER	('9b'H),
+	NM_ATT_BS11_TRX_AREA		('9f'H),
+
+	NM_ATT_BS11_BCCH_RECONF		('d7'H),
+	NM_ATT_BS11_BIT_ERR_THESH	('a0'H),
+	NM_ATT_BS11_BOOT_SW_VERS	('a1'H),
+	NM_ATT_BS11_CCLK_ACCURACY	('a3'H),
+	NM_ATT_BS11_CCLK_TYPE		('a4'H),
+	NM_ATT_BS11_INP_IMPEDANCE	('aa'H),
+	NM_ATT_BS11_L1_PROT_TYPE	('ab'H),
+	NM_ATT_BS11_LINE_CFG		('ac'H),
+	NM_ATT_BS11_LI_PORT_1		('ad'H),
+	NM_ATT_BS11_LI_PORT_2		('ae'H),
+
+	NM_ATT_BS11_L1_REM_ALM_TYPE	('b0'H),
+	NM_ATT_BS11_SW_LOAD_INTENDED	('bb'H),
+	NM_ATT_BS11_SW_LOAD_SAFETY	('bc'H),
+	NM_ATT_BS11_SW_LOAD_STORED	('bd'H),
+
+	NM_ATT_BS11_VENDOR_NAME		('c1'H),
+	NM_ATT_BS11_HOPPING_MODE	('c5'H),
+	NM_ATT_BS11_LMT_LOGON_SESSION	('c6'H),
+	NM_ATT_BS11_LMT_LOGIN_TIME	('c7'H),
+	NM_ATT_BS11_LMT_USER_ACC_LEV	('c8'H),
+	NM_ATT_BS11_LMT_USER_NAME	('c9'H),
+
+	NM_ATT_BS11_L1_CONTROL_TS	('d8'H),
+	NM_ATT_BS11_RADIO_MEAS_GRAN	('dc'H),
+	NM_ATT_BS11_RADIO_MEAS_REP	('dd'H),
+
+	NM_ATT_BS11_SH_LAPD_INT_TIMER	('e8'H),
+
+	NM_ATT_BS11_BTS_STATE		('f0'H),
+	NM_ATT_BS11_E1_STATE		('f1'H),
+	NM_ATT_BS11_PLL			('f2'H),
+	NM_ATT_BS11_RX_OFFSET		('f3'H),
+	NM_ATT_BS11_ANT_TYPE		('f4'H),
+	NM_ATT_BS11_PLL_MODE		('fc'H),
+	NM_ATT_BS11_PASSWORD		('fd'H),
+*/
+
+	/* osmocom (osmo-bts) specific attributes, used in combination
+	 * with the "org.osmocom" manufacturer identification */
+	NM_ATT_OSMO_REDUCEPOWER		('fe'H)	/* TLV_TYPE_TV */
+
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4.4 */
+type enumerated OML_FOM_AdministrativeState {
+	NM_STATE_LOCKED			('01'H),
+	NM_STATE_UNLOCKED		('02'H),
+	NM_STATE_SHUTDOWN		('03'H),
+	NM_STATE_NULL			('ff'H)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4.7 */
+type enumerated OML_FOM_AvailabilityStatus {
+	NM_AVSTATE_IN_TEST		(1),
+	NM_AVSTATE_POWER_OFF		(2),
+	NM_AVSTATE_OFF_LINE		(3),
+	NM_AVSTATE_DEPENDENCY		(5),
+	NM_AVSTATE_DEGRADED		(6),
+	NM_AVSTATE_NOT_INSTALLED	(7),
+	NM_AVSTATE_OK			(255)
+} with { variant "FIELDLENGTH(8)" };
+
+type enumerated OML_FOM_OperationalState {
+	NM_OPSTATE_DISABLED		(1),
+	NM_OPSTATE_ENABLED		(2),
+	NM_OPSTATE_NULL			(255)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4.13 */
+type enumerated OML_ChannelCombination {
+	NM_CHANC_TCHFull		('00'H), /* TCH/F + TCH/H + SACCH/TF */
+	NM_CHANC_TCHHalf		('01'H), /* TCH/H(0,1) + FACCH/H(0,1) + SACCH/TH(0,1) */
+	NM_CHANC_TCHHalf2		('02'H), /* TCH/H(0) + FACCH/H(0) + SACCH/TH(0) + TCH/H(1) */
+	NM_CHANC_SDCCH			('03'H), /* SDCCH/8 + SACCH/8 */
+	NM_CHANC_mainBCCH		('04'H), /* FCCH + SCH + BCCH + CCCH */
+	NM_CHANC_BCCHComb		('05'H), /* FCCH + SCH + BCCH + CCCH + SDCCH/4 + SACCH/C4 */
+	NM_CHANC_BCCH			('06'H), /* BCCH + CCCH */
+	NM_CHANC_BCCH_CBCH		('07'H), /* CHANC_BCCHComb + CBCH */
+	NM_CHANC_SDCCH_CBCH		('08'H), /* CHANC_SDCCH8 + CBCH */
+	/* ip.access + Osmocom */
+	NM_CHANC_IPAC_bPDCH		('0b'H), /* PBCCH + PCCCH + PDTCH/F + PACCH/F + PTCCH/F */
+	NM_CHANC_IPAC_cPDCH		('0c'H), /* PBCCH + PDTCH/F + PACCH/F + PTCCH/F */
+	NM_CHANC_IPAC_PDCH		('0d'H), /* PDTCH/F + PACCH/F + PTCCH/F */
+	NM_CHANC_IPAC_TCHFull_PDCH	('80'H),
+	NM_CHANC_IPAC_TCHFull_TCHHalf	('81'H),
+	/* Osmocom */
+	NM_CHANC_OSMO_TCHFull_TCHHalf_PDCH ('90'H)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4.16 */
+type enumerated OML_FOM_EventType {
+	NM_EVT_COMM_FAIL		(1),
+	NM_EVT_QOS_FAIL			(2),
+	NM_EVT_PROC_FAIL		(3),
+	NM_EVT_EQUIP_FAIL		(4),
+	NM_EVT_ENV_FAIL			(5)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4.63 */
+type enumerated OML_FOM_Severity {
+	NM_SEVER_CEASED			(0),
+	NM_SEVER_CRITICAL		(1),
+	NM_SEVER_MAJOR			(2),
+	NM_SEVER_MINOR			(3),
+	NM_SEVER_WARNING		(4),
+	NM_SEVER_INDETERMINATE		(5)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4.36 */
+type enumerated OML_FOM_NackCause {
+	/* General Nack Causes */
+	NM_NACK_INCORR_STRUCT		('01'H),
+	NM_NACK_MSGTYPE_INVAL		('02'H),
+	NM_NACK_OBJCLASS_INVAL		('05'H),
+	NM_NACK_OBJCLASS_NOTSUPP	('06'H),
+	NM_NACK_BTSNR_UNKN		('07'H),
+	NM_NACK_TRXNR_UNKN		('08'H),
+	NM_NACK_OBJINST_UNKN		('09'H),
+	NM_NACK_ATTRID_INVAL		('0c'H),
+	NM_NACK_ATTRID_NOTSUPP		('0d'H),
+	NM_NACK_PARAM_RANGE		('0e'H),
+	NM_NACK_ATTRLIST_INCONSISTENT	('0f'H),
+	NM_NACK_SPEC_IMPL_NOTSUPP	('10'H),
+	NM_NACK_CANT_PERFORM		('11'H),
+	/* Specific Nack Causes */
+	NM_NACK_RES_NOTIMPL		('19'H),
+	NM_NACK_RES_NOTAVAIL		('1a'H),
+	NM_NACK_FREQ_NOTAVAIL		('1b'H),
+	NM_NACK_TEST_NOTSUPP		('1c'H),
+	NM_NACK_CAPACITY_RESTR		('1d'H),
+	NM_NACK_PHYSCFG_NOTPERFORM	('1e'H),
+	NM_NACK_TEST_NOTINIT		('1f'H),
+	NM_NACK_PHYSCFG_NOTRESTORE	('20'H),
+	NM_NACK_TEST_NOSUCH		('21'H),
+	NM_NACK_TEST_NOSTOP		('22'H),
+	NM_NACK_MSGINCONSIST_PHYSCFG	('23'H),
+	NM_NACK_FILE_INCOMPLETE		('25'H),
+	NM_NACK_FILE_NOTAVAIL		('26'H),
+	NM_NACK_FILE_NOTACTIVATE	('27'H),
+	NM_NACK_REQ_NOT_GRANT		('28'H),
+	NM_NACK_WAIT			('29'H),
+	NM_NACK_NOTH_REPORT_EXIST	('2a'H),
+	NM_NACK_MEAS_NOTSUPP		('2b'H),
+	NM_NACK_MEAS_NOTSTART		('2c'H)
+} with { variant "FIELDLENGTH(8)" };
+
+
+
+type record OML_FOM {
+	uint8_t				len,
+	OML_FOM_Header			hdr,
+	OML_FOM_IE_List			ies optional
+} with { variant (len) "LENGTHTO(hdr,ies)" };
+
+type record OML_IE_LV {
+	uint8_t		len,
+	octetstring	payload
+} with { variant (len) "LENGTHTO(payload)" };
+
+type record OML_IE_L16V {
+	uint16_t	len,
+	octetstring	payload
+} with { variant (len) "LENGTHTO(payload)" };
+
+template (value) OML_IE_L16V ts_OML_IE_L16V(template (value) uint16_t len, template (value) octetstring payload) := {
+	len := len,
+	payload := payload
+}
+template OML_IE_L16V tr_OML_IE_L16V(template uint16_t len, template octetstring payload) := {
+	len := len,
+	payload := payload
+}
+
+
+type record OML_IE_AvailStatus {
+	uint16_t			len,
+	OML_FOM_AvailabilityStatus	avail_status
+} with { variant (len) "LENGTHTO(avail_status)" };
+
+/* Section 9.4.1 */
+type record OML_FOM_AbisChannel {
+	uint8_t		bts_port_nr,
+	uint8_t		timeslot_nr,
+	OML_FOM_Subslot	subslot_nr
+};
+type enumerated OML_FOM_Subslot {
+	NM_SUBSLOT_A		(0),
+	NM_SUBSLOT_B		(1),
+	NM_SUBSLOT_C		(2),
+	NM_SUBSLOT_D		(3),
+	NM_SUBSLOT_64k		(255)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Section 9.4.5 */
+type record of uint16_t OML_ArfcnList;
+type record OML_IE_ArfcnList {
+	uint16_t 	len,
+	OML_ArfcnList	arfcn_list
+};
+
+/* Section 9.4.25 */
+type record length(6) of uint8_t OML_FOM_InterfLevBoundaries;
+
+/* Section 9.4.42 */
+type record length(3) of uint8_t OML_FOM_PowerOuthputThresholds;
+
+/* Section 9.4.43 */
+type enumerated OML_FOM_ProbableCauseType {
+	NM_PCAUSE_T_X721	(1),
+	NM_PCAUSE_T_GSM		(2),
+	NM_PCAUSE_T_MANUF	(3)
+} with { variant "FIELDLENGTH(8)" };
+type record OML_FOM_ProbableCause {
+	OML_FOM_ProbableCauseType	cause_type,
+	OCT2				cause_value
+};
+
+/* Section 9.4.53 */
+type record OML_FOM_T200 {
+	uint8_t		sdcch_5ms,
+	uint8_t		facch_f_5ms,
+	uint8_t		facch_h_5ms,
+	uint8_t		sacch_tch_sapi0_10ms,
+	uint8_t		sacch_sdcch_10ms,
+	uint8_t		sdcch_sapi3_5ms,
+	uint8_t		sacch_rch_sapi3_10ms
+};
+
+type union OML_FOM_IE_Body {
+	OML_FOM_AbisChannel		abis_channel,
+	OML_FOM_AdministrativeState	adm_state,
+	OCT1				auton_report,
+	uint16_t			bcch_arfcn,
+	uint8_t				bsic,
+	uint8_t				air_timer,
+	uint8_t				load_ind_period,
+	uint8_t				load_threshold,
+	OML_ChannelCombination		chan_comb,
+	OML_FOM_EventType		event_type,
+	uint16_t			gsm_time,
+	uint8_t				hsn,
+	uint8_t				intave_param,
+	OML_FOM_InterfLevBoundaries	interf_bound,
+	uint8_t				maio,
+	uint8_t				manuf_state,
+	uint8_t				max_ta,
+	OML_FOM_NackCause		nack_causes,
+	uint8_t				ny1,
+	OML_FOM_OperationalState	opstate,
+	uint8_t				power_class,
+	OML_FOM_PowerOuthputThresholds	power_thresh,
+	OML_FOM_ProbableCause		prob_cause,
+	uint8_t				rach_b_thresh,
+	uint16_t			loadavg_slots,
+	uint8_t				radio_subch,
+	uint8_t				rf_maxpwr_r,
+	uint8_t				spec_prob,
+	uint16_t			start_time,
+	OML_FOM_T200			t200,
+	uint8_t				tei,
+	uint8_t				test_no,
+	OCT2				vswr_thresh,
+	uint8_t				window_size,
+	uint8_t				tsc,
+	OML_FOM_Severity		severity,
+	uint8_t				outst_alarm,
+	uint8_t				meas_type,
+
+	OML_IE_AvailStatus		avail_status,
+	OML_IE_ArfcnList		arfcn_list,
+
+	uint32_t		ip,
+	uint16_t		portnr,
+	uint8_t			stream_id,
+	OCT6			sec_oml_cfg,
+	OCT8			ip_if_cfg,
+	OCT12			ip_gw_cfg,
+	uint32_t		in_serv_time,
+	uint16_t		paging_cfg,
+	OCT2			freq_ctrl,
+
+	OML_IE_L16V		other
+};
+
+type record OML_FOM_IE {
+	OML_FOM_IE_Type		iei,
+	OML_FOM_IE_Body		body
+} with { variant (body) "CROSSTAG(
+		abis_channel, iei = NM_ATT_ABIS_CHANNEL;
+		adm_state, iei = NM_ATT_ADM_STATE;
+		auton_report, iei = NM_ATT_AUTON_REPORT;
+		bcch_arfcn, iei = NM_ATT_BCCH_ARFCN;
+		bsic, iei = NM_ATT_BSIC;
+		air_timer, iei = NM_ATT_BTS_AIR_TIMER;
+		load_ind_period, iei = NM_ATT_CCCH_L_I_P;
+		load_threshold, iei = NM_ATT_CCCH_L_T;
+		chan_comb, iei = NM_ATT_CHAN_COMB;
+		event_type, iei = NM_ATT_EVENT_TYPE;
+		gsm_time, iei = NM_ATT_GSM_TIME;
+		hsn, iei = NM_ATT_HSN;
+		intave_param, iei = NM_ATT_INTAVE_PARAM;
+		interf_bound, iei = NM_ATT_INTERF_BOUND;
+		maio, iei = NM_ATT_MAIO;
+		manuf_state, iei = NM_ATT_MANUF_STATE;
+		max_ta, iei = NM_ATT_MAX_TA;
+		nack_causes, iei = NM_ATT_NACK_CAUSES;
+		ny1, iei = NM_ATT_NY1;
+		opstate, iei = NM_ATT_OPER_STATE;
+		power_class, iei = NM_ATT_POWER_CLASS;
+		power_thresh, iei = NM_ATT_POWER_THRESH;
+		prob_cause, iei = NM_ATT_PROB_CAUSE;
+		rach_b_thresh, iei = NM_ATT_RACH_B_THRESH;
+		loadavg_slots, iei = NM_ATT_LDAVG_SLOTS;
+		radio_subch, iei = NM_ATT_RAD_SUBC;
+		rf_maxpwr_r, iei = NM_ATT_RF_MAXPOWR_R;
+		spec_prob, iei = NM_ATT_SPEC_PROB;
+		start_time, iei = NM_ATT_START_TIME;
+		t200, iei = NM_ATT_T200;
+		tei, iei = NM_ATT_TEI;
+		test_no, iei = NM_ATT_TEST_NO;
+		vswr_thresh, iei = NM_ATT_VSWR_THRESH;
+		window_size, iei = NM_ATT_WINDOW_SIZE;
+		tsc, iei = NM_ATT_TSC;
+		severity, iei = NM_ATT_SEVERITY;
+		outst_alarm, iei = NM_ATT_OUTST_ALARM;
+		meas_type, iei = NM_ATT_MEAS_TYPE;
+
+		avail_status, iei = NM_ATT_AVAIL_STATUS;
+		arfcn_list, iei = NM_ATT_ARFCN_LIST;
+
+		ip, iei = NM_ATT_IPACC_DST_IP;
+		portnr, iei = NM_ATT_IPACC_DST_IP_PORT;
+		stream_id, iei = NM_ATT_IPACC_STREAM_ID;
+		sec_oml_cfg, iei = NM_ATT_IPACC_SEC_OML_CFG;
+		ip_if_cfg, iei = NM_ATT_IPACC_IP_IF_CFG;
+		ip_gw_cfg, iei = NM_ATT_IPACC_IP_GW_CFG;
+		in_serv_time, iei = NM_ATT_IPACC_IN_SERV_TIME;
+		paging_cfg, iei = NM_ATT_IPACC_PAGING_CFG;
+		freq_ctrl, iei = NM_ATT_IPACC_FREQ_CTRL;
+
+		other, OTHERWISE;
+	)" };
+
+type record of OML_FOM_IE OML_FOM_IE_List;
+
+type record OML_MANUF_IPA {
+	uint8_t			len,
+	uint8_t			str_len,
+	charstring		manuf_str,
+	OML_FOM_Header		hdr,
+	OML_FOM_IE_List		ies optional
+} with { variant (len) "LENGTHTO(hdr,ies)"
+         variant (str_len) "LENGTHTO(manuf_str)" };
+
+type union OML_MANUF {
+	OML_MANUF_IPA			ipa
+};
+
+
+external function enc_OML_PDU(in OML_PDU msg) return octetstring
+	with { extension "prototype(convert) encode(RAW)" };
+external function dec_OML_PDU(in octetstring stream) return OML_PDU
+	with { extension "prototype(convert) decode(RAW)" };
+
+
+
+template (value) OML_FOM_IE ts_OML_IE(OML_FOM_IE_Type iei, template (value) OML_FOM_IE_Body body) := {
+	iei := iei,
+	body := body
+}
+template OML_FOM_IE tr_OML_IE(OML_FOM_IE_Type iei, template OML_FOM_IE_Body body) := {
+	iei := ?,
+	body := body
+}
+
+template OML_PDU tr_OML_FOM_only := {
+	mdisc := ABIS_OM_MDISC_FOM,
+	placement := ABIS_OM_PLACEMENT_ONLY,
+	sequence := 0,
+	u := ?
+}
+
+template OML_PDU tr_OML_MsgType(template OML_FOM_MessageType msg_type,
+				template OML_FOM_ObjectClass obj_class := ?,
+				template OML_FOM_ObjectInstance obj_inst := ?,
+				template OML_FOM_IE_List ies := *)
+modifies tr_OML_FOM_only := {
+	u := {
+		fom := {
+			hdr := {
+				msg_type := msg_type,
+				obj_class := obj_class,
+				obj_inst := obj_inst
+			},
+			ies := ies
+		}
+	}
+}
+template (value) OML_PDU ts_OML_MsgType(template (value) OML_FOM_MessageType msg_type,
+					template (value) OML_FOM_ObjectClass obj_class,
+					template (value) OML_FOM_ObjectInstance obj_inst,
+					template (omit) OML_FOM_IE_List ies := omit) := {
+	mdisc := ABIS_OM_MDISC_FOM,
+	placement := ABIS_OM_PLACEMENT_ONLY,
+	sequence := 0,
+	u := {
+		fom := {
+			len := 0, /* overwritten */
+			hdr := ts_OML_FomHeader(msg_type, obj_class, obj_inst),
+			ies := ies
+		}
+	}
+}
+
+
+template (value) OML_FOM_Header ts_OML_FomHeader(template (value) OML_FOM_MessageType msg_type,
+						 template (value) OML_FOM_ObjectClass obj_class,
+						 template (value) OML_FOM_ObjectInstance obj_inst) := {
+	msg_type := msg_type,
+	obj_class := obj_class,
+	obj_inst := obj_inst
+}
+template OML_FOM_Header tr_OML_FomHeader(template OML_FOM_MessageType msg_type,
+					 template OML_FOM_ObjectClass obj_class,
+					 template OML_FOM_ObjectInstance obj_inst) := {
+	msg_type := msg_type,
+	obj_class := obj_class,
+	obj_inst := obj_inst
+}
+
+
+template (value) OML_FOM_ObjectInstance ts_OML_ObjectInstance(uint8_t bts, uint8_t trx, uint8_t ts) := {
+	bts_nr := bts,
+	trx_nr := trx,
+	ts_nr := ts
+}
+template OML_FOM_ObjectInstance tr_OML_ObjectInstance(template uint8_t bts, template uint8_t trx,
+						      template uint8_t ts) := {
+	bts_nr := bts,
+	trx_nr := trx,
+	ts_nr := ts
+}
+
+
+
+template (value) OML_PDU ts_OML_IPA_MsgType(template (value) OML_FOM_MessageType msg_type,
+					    template (value) OML_FOM_ObjectClass obj_class,
+					    template (value) OML_FOM_ObjectInstance obj_inst,
+					    template (omit) OML_FOM_IE_List ies := omit) := {
+	mdisc := ABIS_OM_MDISC_MANUF,
+	placement := ABIS_OM_PLACEMENT_ONLY,
+	sequence := 0,
+	u := {
+		manuf := {
+			ipa := {
+				len := 0, /* overwritten */
+				str_len := 13,
+				manuf_str := "com.ipaccess" & char(0,0,0,0),
+				hdr := ts_OML_FomHeader(msg_type, obj_class, obj_inst),
+				ies := ies
+			}
+		}
+	}
+}
+template OML_PDU tr_OML_IPA_MsgType(template OML_FOM_MessageType msg_type := ?,
+				    template OML_FOM_ObjectClass obj_class := ?,
+				    template OML_FOM_ObjectInstance obj_inst := ?,
+				    template OML_FOM_IE_List ies := *) := {
+	mdisc := ABIS_OM_MDISC_MANUF,
+	placement := ABIS_OM_PLACEMENT_ONLY,
+	sequence := 0,
+	u := {
+		manuf := {
+			ipa := {
+				len := ?,
+				str_len := 13,
+				manuf_str := "com.ipaccess" & char(0,0,0,0),
+				hdr := tr_OML_FomHeader(msg_type, obj_class, obj_inst),
+				ies := ies
+			}
+		}
+	}
+}
+
+/* 8.8.1 State Changed Event Report */
+template (value) OML_PDU ts_OML_StateChgEvtRep(template (value) OML_FOM_ObjectClass obj_class,
+					       template (value) OML_FOM_ObjectInstance obj_inst,
+					       template (value) OML_FOM_OperationalState opstate,
+					       template (value) OML_FOM_AvailabilityStatus avstate) :=
+	ts_OML_MsgType(NM_MT_STATECHG_EVENT_REP, obj_class, obj_inst, {
+			ts_OML_IE(NM_ATT_OPER_STATE, OML_FOM_IE_Body:{opstate := opstate}),
+			ts_OML_IE(NM_ATT_AVAIL_STATUS, OML_FOM_IE_Body:{avail_status := {len:= 1, avail_status := avstate}})
+			});
+template OML_PDU tr_OML_StateChgEvtRep(template OML_FOM_ObjectClass obj_class,
+				       template OML_FOM_ObjectInstance obj_inst,
+				       template OML_FOM_OperationalState opstate := ?,
+				       template OML_FOM_AvailabilityStatus avstate := ?) :=
+	tr_OML_MsgType(NM_MT_STATECHG_EVENT_REP, obj_class, obj_inst, {
+			tr_OML_IE(NM_ATT_OPER_STATE, OML_FOM_IE_Body:{opstate := opstate}),
+			tr_OML_IE(NM_ATT_AVAIL_STATUS, OML_FOM_IE_Body:{avail_status := {len := 1, avail_status := avstate}})
+			});
+
+/* 8.8.2 Failure Event Report */
+template (value) OML_PDU ts_OML_FailureEvtRep(template (value) OML_FOM_ObjectClass obj_class,
+					      template (value) OML_FOM_ObjectInstance obj_inst,
+					      template (value) OML_FOM_EventType evt_type,
+					      template (value) OML_FOM_Severity severity,
+					      template (value) OML_FOM_ProbableCause cause) :=
+	ts_OML_MsgType(NM_MT_FAILURE_EVENT_REP, obj_class, obj_inst, {
+			ts_OML_IE(NM_ATT_EVENT_TYPE, OML_FOM_IE_Body:{event_type := evt_type}),
+			ts_OML_IE(NM_ATT_SEVERITY, OML_FOM_IE_Body:{severity := severity}),
+			ts_OML_IE(NM_ATT_PROB_CAUSE, OML_FOM_IE_Body:{prob_cause := cause})
+			});
+template OML_PDU tr_OML_FailureEvtRep(template OML_FOM_ObjectClass obj_class,
+				      template OML_FOM_ObjectInstance obj_inst,
+				      template OML_FOM_EventType evt_type,
+				      template OML_FOM_Severity severity,
+				      template OML_FOM_ProbableCause cause) :=
+	tr_OML_MsgType(NM_MT_FAILURE_EVENT_REP, obj_class, obj_inst, {
+			tr_OML_IE(NM_ATT_EVENT_TYPE, OML_FOM_IE_Body:{event_type := evt_type}),
+			tr_OML_IE(NM_ATT_SEVERITY, OML_FOM_IE_Body:{severity := severity}),
+			tr_OML_IE(NM_ATT_PROB_CAUSE, OML_FOM_IE_Body:{prob_cause := cause}),
+			*
+			});
+
+/* 8.8.5 Change Administrative State */
+template (value) OML_PDU ts_OML_ChangeAdmState(template (value) OML_FOM_ObjectClass obj_class,
+						template (value) OML_FOM_ObjectInstance obj_inst,
+						template (value) OML_FOM_AdministrativeState adm_st) :=
+	ts_OML_MsgType(NM_MT_CHG_ADM_STATE, obj_class, obj_inst, {
+			ts_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
+			});
+template OML_PDU tr_OML_ChangeAdmState(template OML_FOM_ObjectClass obj_class,
+					template OML_FOM_ObjectInstance obj_inst,
+					template OML_FOM_AdministrativeState adm_st) :=
+	tr_OML_MsgType(NM_MT_CHG_ADM_STATE, obj_class, obj_inst, {
+			tr_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
+			});
+
+template (value) OML_PDU ts_OML_ChangeAdmStateACK(template (value) OML_FOM_ObjectClass obj_class,
+						template (value) OML_FOM_ObjectInstance obj_inst,
+						template (value) OML_FOM_AdministrativeState adm_st) :=
+	ts_OML_MsgType(NM_MT_CHG_ADM_STATE_ACK, obj_class, obj_inst, {
+			ts_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
+			});
+template OML_PDU tr_OML_ChangeAdmStateACK(template OML_FOM_ObjectClass obj_class,
+					template OML_FOM_ObjectInstance obj_inst,
+					template OML_FOM_AdministrativeState adm_st) :=
+	tr_OML_MsgType(NM_MT_CHG_ADM_STATE_ACK, obj_class, obj_inst, {
+			tr_OML_IE(NM_ATT_ADM_STATE, OML_FOM_IE_Body:{adm_state := adm_st})
+			});
+template (value) OML_PDU ts_OML_ChangeAdmStateNACK(template (value) OML_FOM_ObjectClass obj_class,
+						template (value) OML_FOM_ObjectInstance obj_inst,
+						template (value) OML_FOM_NackCause cause) :=
+	ts_OML_MsgType(NM_MT_CHG_ADM_STATE_NACK, obj_class, obj_inst, {
+			ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
+			});
+template OML_PDU tr_OML_ChangeAdmStateNACK(template OML_FOM_ObjectClass obj_class,
+					   template OML_FOM_ObjectInstance obj_inst,
+					   template OML_FOM_NackCause cause := ?) :=
+	tr_OML_MsgType(NM_MT_CHG_ADM_STATE_NACK, obj_class, obj_inst, {
+			*,
+			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
+			});
+
+
+
+
+
+/* 8.9.2 Opstart */
+template (value) OML_PDU ts_OML_Opstart(template (value) OML_FOM_ObjectClass obj_class,
+					template (value) OML_FOM_ObjectInstance obj_inst) :=
+	ts_OML_MsgType(NM_MT_OPSTART, obj_class, obj_inst);
+template OML_PDU tr_OML_Opstart(template OML_FOM_ObjectClass obj_class,
+				template OML_FOM_ObjectInstance obj_inst) :=
+	tr_OML_MsgType(NM_MT_OPSTART, obj_class, obj_inst);
+
+template (value) OML_PDU ts_OML_OpstartACK(template (value) OML_FOM_ObjectClass obj_class,
+					   template (value) OML_FOM_ObjectInstance obj_inst) :=
+	ts_OML_MsgType(NM_MT_OPSTART_ACK, obj_class, obj_inst);
+template OML_PDU tr_OML_OpstartACK(template OML_FOM_ObjectClass obj_class,
+				   template OML_FOM_ObjectInstance obj_inst) :=
+	tr_OML_MsgType(NM_MT_OPSTART_ACK, obj_class, obj_inst);
+
+template (value) OML_PDU ts_OML_OpstartNACK(template (value) OML_FOM_ObjectClass obj_class,
+					    template (value) OML_FOM_ObjectInstance obj_inst,
+					    template (value) OML_FOM_NackCause cause) :=
+	ts_OML_MsgType(NM_MT_OPSTART_NACK, obj_class, obj_inst, {
+		ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
+		});
+template OML_PDU tr_OML_OpstartNACK(template OML_FOM_ObjectClass obj_class,
+				   template OML_FOM_ObjectInstance obj_inst,
+				   template OML_FOM_NackCause cause := ?) :=
+	tr_OML_MsgType(NM_MT_OPSTART_NACK, obj_class, obj_inst, {
+		tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
+		});
+
+/* 8.3.5 SW Activate Request */
+template (value) OML_PDU ts_OML_SwActReq(template (value) OML_FOM_ObjectClass obj_class,
+					 template (value) OML_FOM_ObjectInstance obj_inst,
+					 template (value) octetstring hw_config,
+					 template (value) octetstring sw_config) :=
+	ts_OML_MsgType(NM_MT_SW_ACT_REQ, obj_class, obj_inst, {
+		ts_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, hw_config)}),
+		ts_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_config)})
+		});
+template OML_PDU tr_OML_SwActReq(template OML_FOM_ObjectClass obj_class,
+				 template OML_FOM_ObjectInstance obj_inst,
+				 template octetstring hw_config,
+				 template octetstring sw_config) :=
+	tr_OML_MsgType(NM_MT_SW_ACT_REQ, obj_class, obj_inst, {
+		tr_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, hw_config)}),
+		tr_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_config)})
+		});
+
+template (value) OML_PDU ts_OML_SwActReqACK(template (value) OML_FOM_ObjectClass obj_class,
+					 template (value) OML_FOM_ObjectInstance obj_inst,
+					 template (value) octetstring hw_config,
+					 template (value) octetstring sw_config) :=
+	ts_OML_MsgType(NM_MT_SW_ACT_REQ_ACK, obj_class, obj_inst, {
+		ts_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, hw_config)}),
+		ts_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_config)})
+		});
+template OML_PDU tr_OML_SwActReqACK(template OML_FOM_ObjectClass obj_class,
+				 template OML_FOM_ObjectInstance obj_inst,
+				 template octetstring hw_config,
+				 template octetstring sw_config) :=
+	tr_OML_MsgType(NM_MT_SW_ACT_REQ_ACK, obj_class, obj_inst, {
+		tr_OML_IE(NM_ATT_HW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, hw_config)}),
+		tr_OML_IE(NM_ATT_SW_CONFIG, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_config)})
+		});
+
+/* 8.3.6 Activate SW */
+template (value) OML_PDU ts_OML_ActivateSw(template (value) OML_FOM_ObjectClass obj_class,
+					 template (value) OML_FOM_ObjectInstance obj_inst,
+					 template (value) octetstring file_id,
+					 template (value) octetstring sw_desc) :=
+	ts_OML_MsgType(NM_MT_ACTIVATE_SW, obj_class, obj_inst, {
+		ts_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, file_id)}),
+		ts_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_desc)})
+		});
+template OML_PDU tr_OML_ActivateSw(template OML_FOM_ObjectClass obj_class,
+				 template OML_FOM_ObjectInstance obj_inst,
+				 template octetstring file_id,
+				 template octetstring sw_desc) :=
+	tr_OML_MsgType(NM_MT_ACTIVATE_SW, obj_class, obj_inst, {
+		tr_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, file_id)}),
+		tr_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_desc)})
+		});
+
+template (value) OML_PDU ts_OML_ActivateSwACK(template (value) OML_FOM_ObjectClass obj_class,
+					 template (value) OML_FOM_ObjectInstance obj_inst,
+					 template (value) octetstring file_id,
+					 template (value) octetstring sw_desc) :=
+	ts_OML_MsgType(NM_MT_ACTIVATE_SW_ACK, obj_class, obj_inst, {
+		ts_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, file_id)}),
+		ts_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, sw_desc)})
+		});
+template OML_PDU tr_OML_ActivateSwACK(template OML_FOM_ObjectClass obj_class,
+				 template OML_FOM_ObjectInstance obj_inst,
+				 template octetstring file_id,
+				 template octetstring sw_desc) :=
+	tr_OML_MsgType(NM_MT_ACTIVATE_SW_ACK, obj_class, obj_inst, {
+		tr_OML_IE(NM_ATT_FILE_ID, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, file_id)}),
+		tr_OML_IE(NM_ATT_SW_DESCR, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, sw_desc)})
+		});
+
+/* 8.3.7 SW Activated Report */
+template (value) OML_PDU ts_OML_SwActivatedRep(template (value) OML_FOM_ObjectClass obj_class,
+					       template (value) OML_FOM_ObjectInstance obj_inst) :=
+	ts_OML_MsgType(NM_MT_SW_ACTIVATED_REP, obj_class, obj_inst, {});
+template OML_PDU tr_OML_SwActivatedRep(template OML_FOM_ObjectClass obj_class,
+				       template OML_FOM_ObjectInstance obj_inst) :=
+	tr_OML_MsgType(NM_MT_SW_ACTIVATED_REP, obj_class, obj_inst, *);
+
+
+/* 8.6.1 Set BTS Attributes */
+template (value) OML_PDU ts_OML_SetBtsAttr(template (value) OML_FOM_ObjectInstance obj_inst,
+					   template (value) OML_FOM_IE_List ies) :=
+	ts_OML_MsgType(NM_MT_SET_BTS_ATTR, NM_OC_BTS, obj_inst, ies);
+template OML_PDU tr_OML_SetBtsAttr(template OML_FOM_ObjectInstance obj_inst,
+				   template OML_FOM_IE_List ies) :=
+	tr_OML_MsgType(NM_MT_SET_BTS_ATTR, NM_OC_BTS, obj_inst, ies);
+
+
+/* 8.6.2 Set Radio Carrier Attributes */
+template (value) OML_PDU ts_OML_SetRadioAttr(template (value) OML_FOM_ObjectInstance obj_inst,
+					     template (value) uint8_t maxpwr_r,
+					     template (value) OML_ArfcnList arfcn_list) :=
+	ts_OML_MsgType(NM_MT_SET_RADIO_ATTR, NM_OC_RADIO_CARRIER, obj_inst, {
+		ts_OML_IE(NM_ATT_RF_MAXPOWR_R, OML_FOM_IE_Body:{rf_maxpwr_r := maxpwr_r}),
+		ts_OML_IE(NM_ATT_ARFCN_LIST, OML_FOM_IE_Body:{arfcn_list := {len:=0, arfcn_list:=arfcn_list}})
+		});
+template OML_PDU tr_OML_SetRadioAttr(template OML_FOM_ObjectInstance obj_inst,
+				     template uint8_t maxpwr_r,
+				     template OML_ArfcnList arfcn_list) :=
+	tr_OML_MsgType(NM_MT_SET_RADIO_ATTR, NM_OC_RADIO_CARRIER, obj_inst, {
+		tr_OML_IE(NM_ATT_RF_MAXPOWR_R, OML_FOM_IE_Body:{rf_maxpwr_r := maxpwr_r}),
+		tr_OML_IE(NM_ATT_ARFCN_LIST, OML_FOM_IE_Body:{arfcn_list := {len:=0, arfcn_list:=arfcn_list}})
+		});
+
+
+/* 8.6.3 Set Channel Attributes */
+template (value) OML_PDU ts_OML_SetChanAttr(template (value) OML_FOM_ObjectInstance obj_inst,
+					    template (value) OML_ChannelCombination chan_comb,
+					    template (value) uint8_t tsc) :=
+	ts_OML_MsgType(NM_MT_SET_CHAN_ATTR, NM_OC_CHANNEL, obj_inst, {
+		ts_OML_IE(NM_ATT_CHAN_COMB, OML_FOM_IE_Body:{chan_comb := chan_comb}),
+		ts_OML_IE(NM_ATT_TSC, OML_FOM_IE_Body:{tsc := tsc})
+		});
+template OML_PDU tr_OML_SetChanAttr(template OML_FOM_ObjectInstance obj_inst,
+				    template OML_ChannelCombination chan_comb,
+				    template uint8_t tsc) :=
+	tr_OML_MsgType(NM_MT_SET_CHAN_ATTR, NM_OC_CHANNEL, obj_inst, {
+		tr_OML_IE(NM_ATT_CHAN_COMB, OML_FOM_IE_Body:{chan_comb := chan_comb}),
+		*,
+		tr_OML_IE(NM_ATT_TSC, OML_FOM_IE_Body:{tsc := tsc})
+		});
+
+
+/* 8.11.1 Get Attributes */
+template (value) OML_PDU ts_OML_GetAttributes(template (value) OML_FOM_ObjectClass obj_class,
+					      template (value) OML_FOM_ObjectInstance obj_inst,
+					      template (value) octetstring req_attr) :=
+	ts_OML_MsgType(NM_MT_GET_ATTR, obj_class, obj_inst, {
+		ts_OML_IE(NM_ATT_LIST_REQ_ATTR, OML_FOM_IE_Body:{other := ts_OML_IE_L16V(0, req_attr)})
+			});
+template OML_PDU tr_OML_GetAttributes(template OML_FOM_ObjectClass obj_class,
+				      template OML_FOM_ObjectInstance obj_inst,
+				      template octetstring req_attr) :=
+	tr_OML_MsgType(NM_MT_GET_ATTR, obj_class, obj_inst, {
+		tr_OML_IE(NM_ATT_LIST_REQ_ATTR, OML_FOM_IE_Body:{other := tr_OML_IE_L16V(?, req_attr)})
+			});
+
+/* convert a request into an ACK */
+function f_OML_make_ack(OML_PDU orig) return OML_PDU {
+	var OML_PDU resp := orig;
+	if (ischosen(resp.u.fom)) {
+		int2enum(enum2int(orig.u.fom.hdr.msg_type)+1, resp.u.fom.hdr.msg_type);
+	} else if (ischosen(resp.u.manuf)) {
+		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+1, resp.u.manuf.ipa.hdr.msg_type);
+	} else {
+		testcase.stop("Unsupported OML in f_OML_make_ack(): ", orig);
+	}
+	return resp;
+}
+function f_OML_make_ack_exp(OML_PDU orig) return template OML_PDU {
+	var template OML_PDU resp := orig;
+	var OML_FOM_MessageType msg_t;
+	if (ischosen(resp.u.fom)) {
+		resp.u.fom.len := ?;
+		int2enum(enum2int(orig.u.fom.hdr.msg_type)+1, msg_t);
+		resp.u.fom.hdr.msg_type := msg_t;
+	} else if (ischosen(resp.u.manuf)) {
+		resp.u.manuf.ipa.len := ?;
+		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+1, msg_t);
+		resp.u.manuf.ipa.hdr.msg_type := msg_t;
+	} else {
+		testcase.stop("Unsupported OML in f_OML_make_ack(): ", orig);
+	}
+	return resp;
+}
+
+/* convert a request into a NACK, appending the cause IE */
+function f_OML_make_nack(OML_PDU orig, OML_FOM_NackCause cause) return OML_PDU {
+	var OML_PDU resp := orig;
+	if (ischosen(resp.u.fom)) {
+		int2enum(enum2int(orig.u.fom.hdr.msg_type)+2, resp.u.fom.hdr.msg_type);
+		resp.u.fom.ies := orig.u.fom.ies & {
+			valueof(ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause}))
+			};
+	} else if (ischosen(resp.u.manuf)) {
+		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+2, resp.u.manuf.ipa.hdr.msg_type);
+		resp.u.manuf.ipa.ies := orig.u.manuf.ipa.ies & {
+			valueof(ts_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause}))
+			};
+	} else {
+		testcase.stop("Unsupported OML in f_OML_make_nack(): ", orig);
+	}
+	return resp;
+}
+function f_OML_make_nack_exp(OML_PDU orig, template OML_FOM_NackCause cause) return template OML_PDU {
+	var template OML_PDU resp := orig;
+	var OML_FOM_MessageType msg_t;
+	if (ischosen(resp.u.fom)) {
+		resp.u.fom.len := ?;
+		int2enum(enum2int(orig.u.fom.hdr.msg_type)+2, msg_t);
+		resp.u.fom.hdr.msg_type := msg_t;
+		resp.u.fom.ies := { *,
+			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
+			};
+	} else if (ischosen(resp.u.manuf)) {
+		resp.u.manuf.ipa.len := ?;
+		int2enum(enum2int(orig.u.manuf.ipa.hdr.msg_type)+2, msg_t);
+		resp.u.manuf.ipa.hdr.msg_type := msg_t;
+		resp.u.manuf.ipa.ies := { *,
+			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
+			};
+/*
+		resp.u.manuf.ipa.ies := resp.u.manuf.ipa.ies & {
+			tr_OML_IE(NM_ATT_NACK_CAUSES, OML_FOM_IE_Body:{nack_causes := cause})
+			};
+*/
+	} else {
+		testcase.stop("Unsupported OML in f_OML_make_nack_exp(): ", orig);
+	}
+	return resp;
+}
+
+
+
+/***********************************************************************
+ * IPA / Osmocom specifics
+ ***********************************************************************/
+
+
+
+template (value) OML_PDU ts_OML_IPA_RslConnect(uint8_t stream_id, uint16_t port_nr) :=
+	ts_OML_IPA_MsgType(NM_MT_IPACC_RSL_CONNECT, NM_OC_BASEB_TRANSC, ts_OML_ObjectInstance(0,0,255), {
+			   ts_OML_IE(NM_ATT_IPACC_STREAM_ID, OML_FOM_IE_Body:{stream_id := stream_id}),
+			   ts_OML_IE(NM_ATT_IPACC_DST_IP_PORT, OML_FOM_IE_Body:{portnr := port_nr})
+			   });
+template OML_PDU tr_OML_IPA_RslConnect(template uint8_t stream_id, template uint16_t port_nr) :=
+	tr_OML_IPA_MsgType(NM_MT_IPACC_RSL_CONNECT, NM_OC_BASEB_TRANSC, tr_OML_ObjectInstance(0,0,255), {
+			   tr_OML_IE(NM_ATT_IPACC_STREAM_ID, OML_FOM_IE_Body:{stream_id := stream_id}),
+			   tr_OML_IE(NM_ATT_IPACC_DST_IP_PORT, OML_FOM_IE_Body:{portnr := port_nr})
+			   });
+
+
+
+
+
+} with { encode "RAW"; variant "FIELDORDER(msb)" };
