diff --git a/library/CBSP_Types.ttcn b/library/CBSP_Types.ttcn
new file mode 100644
index 0000000..43a7d7d
--- /dev/null
+++ b/library/CBSP_Types.ttcn
@@ -0,0 +1,381 @@
+module CBSP_Types {
+
+/* CBSP_Types, defining abstract TTCN-3 data types for the CBSP protocol.
+ *
+ * CBSP is a ETSI/3GPP standard protocol used between CBC (Cell Broadcast Centre) 
+ * and BSC (Base Station Controller) in 2G/GSM/GERAN networks. It is specified
+ * in 3GPP TS 48.049.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of 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 BSSAP_Types all;
+
+
+/* 8.2.2 Message Type */
+type enumerated CBSP_MessageType {
+	CBSP_MSGT_WRITE_REPLACE			('01'O),
+	CBSP_MSGT_WRITE_REPLACE_COMPL		('02'O),
+	CBSP_MSGT_WRITE_REPLACE_FAIL		('03'O),
+	CBSP_MSGT_KILL				('04'O),
+	CBSP_MSGT_KILL_COMPL			('05'O),
+	CBSP_MSGT_KILL_FAIL			('06'O),
+	CBSP_MSGT_LOAD_QUERY			('07'O),
+	CBSP_MSGT_LOAD_QUERY_COMPL		('08'O),
+	CBSP_MSGT_LOAD_QUERY_FAIL		('09'O),
+	CBSP_MSGT_MSG_STATUS_QUERY		('0a'O),
+	CBSP_MSGT_MSG_STATUS_QUERY_COMPL	('0b'O),
+	CBSP_MSGT_MSG_STATUS_QUERY_FAIL		('0c'O),
+	CBSP_MSGT_SET_DRX			('0d'O),
+	CBSP_MSGT_SET_DRX_COMPL			('0e'O),
+	CBSP_MSGT_SET_DRX_FAIL			('0f'O),
+	CBSP_MSGT_RESET				('10'O),
+	CBSP_MSGT_RESET_COMPL			('11'O),
+	CBSP_MSGT_RESET_FAIL			('12'O),
+	CBSP_MSGT_RESTART			('13'O),
+	CBSP_MSGT_FAILURE			('14'O),
+	CBSP_MSGT_ERROR_IND			('15'O),
+	CBSP_MSGT_KEEP_ALIVE			('16'O),
+	CBSP_MSGT_KEEP_ALIVE_COMPL		('17'O)
+} with { variant "FIELDLENGTH(8)" };
+
+/* 8.2.1 Information Element Identifier */
+type enumerated CBSP_IEI {
+	CBSP_IEI_MSG_CONTENT			('01'O),
+	CBSP_IEI_OLD_SERIAL_NR			('02'O),
+	CBSP_IEI_NEW_SERIAL_NR			('03'O),
+	CBSP_IEI_CELL_LIST			('04'O),
+	CBSP_IEI_CATEGORY			('05'O),
+	CBSP_IEI_REP_PERIOD			('06'O),
+	CBSP_IEI_NUM_BCAST_REQ			('07'O),
+	CBSP_IEI_NUM_BCAST_COMPL_LIST		('08'O),
+	CBSP_IEI_FAILURE_LIST			('09'O),
+	CBSP_IEI_RR_LOADING_LIST		('0a'O),
+	CBSP_IEI_CAUSE				('0b'O),
+	CBSP_IEI_DCS				('0c'O),
+	CBSP_IEI_RECOVERY_IND			('0d'O),
+	CBSP_IEI_MSG_ID				('0e'O),
+	CBSP_IEI_EMERG_IND			('0f'O),
+	CBSP_IEI_WARN_TYPE			('10'O),
+	CBSP_IEI_WARN_SEC_INFO			('11'O),
+	CBSP_IEI_CHANNEL_IND			('12'O),
+	CBSP_IEI_NUM_OF_PAGES			('13'O),
+	CBSP_IEI_SCHEDULE_PERIOD		('14'O),
+	CBSP_IEI_NUM_OF_RES_SLOTS		('15'O),
+	CBSP_IEI_BCAST_MSG_TYPE			('16'O),
+	CBSP_IEI_WARNING_PERIOD			('17'O),
+	CBSP_IEI_KEEP_ALIVE_REP_PERIOD		('18'O)
+} with { variant "FIELDLENGTH(8)" };
+
+/* 8.2.7 Category */
+type enumerated CBSP_Category {
+	CBSP_CATEG_HIGH_PRIO			('00'O),
+	CBSP_CATEG_BACKGROUND			('01'O),
+	CBSP_CATEG_NORMAL			('02'O)
+} with { variant "FIELDLENGTH(8)" };
+
+/* Cell ID Discriminator (8.2.11, ...) */
+type enumerated CBSP_CellIdDisc {
+	CBSP_CIDD_WHOLE_CGI		(0),
+	CBSP_CIDD_LAC_CI		(1),
+	CBSP_CIDD_CI			(2),
+	CBSP_CIDD_LAI			(4),
+	CBSP_CIDD_LAC			(5),
+	CBSP_CIDD_ALL_IN_BSC		(6)
+} with { variant "FIELDLENGTH(4)" };
+
+/* 8.2.13 Cause */
+type enumerated CBSP_Cause {
+	CBSP_CAUSE_PARAM_NOT_RECOGNISED		('00'O),
+	CBSP_CAUSE_PARAM_VAL_INVALID		('01'O),
+	CBSP_CAUSE_MSG_REF_NOT_IDENTIFIED	('02'O),
+	CBSP_CAUSE_CELL_ID_NOT_VALID		('03'O),
+	CBSP_CAUSE_UNRECOGNISED_MSG		('04'O),
+	CBSP_CAUSE_MISSING_MAND_IE		('05'O),
+	CBSP_CAUSE_BSC_CAPACITY_EXCEEDED	('06'O),
+	CBSP_CAUSE_CELL_MEMORY_EXCEEDED		('07'O),
+	CBSP_CAUSE_BSC_MEMORY_EXCEEDED		('08'O),
+	CBSP_CAUSE_CB_NOT_SUPPORTED		('09'O),
+	CBSP_CAUSE_CB_NOT_OPERATIONAL		('0a'O),
+	CBSP_CAUSE_INCOMPATIBLE_DRX_PARAM	('0b'O),
+	CBSP_CAUSE_EXT_CHAN_NOT_SUPPORTED	('0c'O),
+	CBSP_CAUSE_MSG_REF_ALREADY_USED		('0d'O),
+	CBSP_CAUSE_UNSPECIFIED_ERROR		('0e'O),
+	CBSP_CAUSE_LAI_OR_LAC_NPT_VALID		('0f'O)
+} with { variant "FIELDLENGTH(8)" };
+
+type record CBSP_IE_MessageContent {
+	uint8_t		user_len,
+	octetstring	val
+} with { variant (val) "FIELDLENGTH(82)" };
+
+/* 8.2.6 Cell List */
+type record CBSP_IE_CellList {
+	uint16_t	len,
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	BSSMAP_FIELD_CellIdentificationList cell_id
+} with {
+	variant (len) "LENGTHTO(cell_id_discr,spare1_4,cell_id)"
+	variant (cell_id) "CROSSTAG(
+		cIl_CGI,		cell_id_discr = '0000'B;
+		cIl_LAC_CI,		cell_id_discr = '0001'B;
+		cIl_CI,			cell_id_discr = '0010'B;
+		cIl_LAI,		cell_id_discr = '0100'B;
+		cIl_LAC,		cell_id_discr = '0101'B;
+		cIl_allInBSS,		cell_id_discr = '0110'B;
+			)"
+};
+
+/* 8.2.10 Number of Broadcasts Completed List */
+type record CBSP_IE_NumBcastComplList {
+	uint16_t	len,
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	CBSP_FIELD_NumBcastCompl list
+} with {
+	variant (len) "LENGTHTO(cell_id_discr,spare1_4,list)"
+	variant (list) "CROSSTAG(
+		cI_CGI,		cell_id_discr = '0000'B;
+		cI_LAC_CI,	cell_id_discr = '0001'B;
+		cI_CI,		cell_id_discr = '0010'B;
+		cI_LAI,		cell_id_discr = '0100'B;
+		cI_LAC,		cell_id_discr = '0101'B;
+		cI_allInBSS,	cell_id_discr = '0110'B;
+			)"
+};
+type union CBSP_FIELD_NumBcastCompl {
+	CBSP_FIELD_NumBcastCompl_CGI		cI_CGI,
+	CBSP_FIELD_NumBcastCompl_LAC_CI		cI_LAC_CI,
+	OCT0					cI_allInBSS,
+	CBSP_FIELD_NumBcastCompl_CI		cI_CI,
+	CBSP_FIELD_NumBcastCompl_LAC		cI_LAC,
+	CBSP_FIELD_NumBcastCompl_LAI		cI_LAI
+};
+type record CBSP_FIELD_NumBcastCompl_CGI {
+	BSSMAP_FIELD_CellIdentification_CGI	ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_LAC_CI {
+	BSSMAP_FIELD_CellIdentification_LAC_CI	ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_LAI {
+	BSSMAP_FIELD_CellIdentification_LAI	ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_CI {
+	OCT2					ci,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type record CBSP_FIELD_NumBcastCompl_LAC {
+	OCT2					lac,
+	uint16_t				num_bcats_compl,
+	CBSP_NumBcastInfo			num_bcast_info,
+	BIT4					spare1_4
+};
+type enumerated CBSP_NumBcastInfo {
+	CBSP_NUM_BCAST_INFO_VALID	(0),
+	CBSP_NUM_BCAST_INFO_OVERFLOW	(1),
+	CBSP_NUM_BCAST_INFO_UNKNOWN	(2)
+} with { variant "FIELDLENGTH(4)" };
+
+
+/* 8.2.11 Failure List */
+type record CBSP_FailureListItem {
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	CBSP_FIELD_CellIdentification cell_id,
+	CBSP_Cause	cause
+} with {
+	variant (cell_id) "CROSSTAG(
+		cI_CGI,		cell_id_discr = '0000'B;
+		cI_LAC_CI,	cell_id_discr = '0001'B;
+		cI_CI,		cell_id_discr = '0010'B;
+		cI_LAI,		cell_id_discr = '0100'B;
+		cI_LAC,		cell_id_discr = '0101'B;
+		cI_allInBSS,	cell_id_discr = '0110'B;
+			)"
+};
+type union CBSP_FIELD_CellIdentification
+{
+	BSSMAP_FIELD_CellIdentification_CGI    cI_CGI,
+	BSSMAP_FIELD_CellIdentification_LAC_CI cI_LAC_CI,
+	OCT2                                   cI_CI,
+	BSSMAP_FIELD_CellIdentification_LAI    cI_LAI,
+	OCT2                                   cI_LAC,
+	OCT2                                   cI_allInBSS
+};
+
+type record of CBSP_FailureListItem CBSP_FailureListItems;
+type record CBSP_IE_FailureList {
+	uint16_t	len,
+	CBSP_FailureListItems list
+} with {
+	variant (len) "LENGTHTO(list)"
+};
+
+/* 8.2.12 RR Loading List */
+type record CBSP_IE_RrLoadingList {
+	uint16_t	len,
+	BIT4		spare1_4,
+	BIT4		cell_id_discr,
+	CBSP_FIELD_RrLoadingList list
+} with {
+	variant (len) "LENGTHTO(cell_id_discr,spare1_4,list)"
+	variant (list) "CROSSTAG(
+		cI_CGI,		cell_id_discr = '0000'B;
+		cI_LAC_CI,	cell_id_discr = '0001'B;
+		cI_CI,		cell_id_discr = '0010'B;
+		cI_LAI,		cell_id_discr = '0100'B;
+		cI_LAC,		cell_id_discr = '0101'B;
+		cI_allInBSS,	cell_id_discr = '0110'B;
+			)"
+};
+type union CBSP_FIELD_RrLoadingList {
+	CBSP_FIELD_RrLoadingList_CGI		cI_CGI,
+	CBSP_FIELD_RrLoadingList_LAC_CI		cI_LAC_CI,
+	OCT0					cI_allInBSS,
+	CBSP_FIELD_RrLoadingList_CI		cI_CI,
+	CBSP_FIELD_RrLoadingList_LAC		cI_LAC,
+	CBSP_FIELD_RrLoadingList_LAI		cI_LAI
+};
+type record CBSP_FIELD_RrLoadingList_CGI {
+	BSSMAP_FIELD_CellIdentification_CGI	ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_LAC_CI {
+	BSSMAP_FIELD_CellIdentification_LAC_CI	ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_LAI {
+	BSSMAP_FIELD_CellIdentification_LAI	ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_CI {
+	OCT2					ci,
+	uint8_t					load1,
+	uint8_t					load2
+};
+type record CBSP_FIELD_RrLoadingList_LAC {
+	OCT2					lac,
+	uint8_t					load1,
+	uint8_t					load2
+};
+
+/* 8.2.15 Recovery Indication */
+type record CBSP_IE_RecoveryInd {
+	BIT4			spare1_4,
+	CBSP_RecoveryInd	recovery
+};
+type enumerated CBSP_RecoveryInd {
+	CBSP_RI_DATA_AVAILABLE	(0),
+	CBSP_RI_DATA_LOST	(1)
+} with { variant "FIELDLENGTH(4)" };
+
+/* 8.2.24 Broadcast Message Type */
+type record CBSP_IE_BcastMsgType {
+	BIT4			spare1_4,
+	CBSP_BcastMsgType	msg_type
+};
+type enumerated CBSP_BcastMsgType {
+	CBSP_BC_MSGT_CBS	(0),
+	CBSP_BC_MSGT_EMERG	(1)
+} with { variant "FIELDLENGTH(4)" };
+
+
+type union CBSP_IE_Body {
+	CBSP_IE_MessageContent	msg_content,
+	uint16_t		old_ser_nr,
+	uint16_t		new_ser_nr,
+	CBSP_IE_CellList	cell_list,
+	CBSP_Category		category,
+	uint16_t		rep_period,
+	uint16_t		num_bcast_req,
+	CBSP_IE_NumBcastComplList num_bcast_compl_list,
+	CBSP_IE_FailureList	failure_list,
+	CBSP_IE_RrLoadingList	rr_loading_list,
+	CBSP_Cause		cause,
+	uint8_t 		dcs,
+	CBSP_IE_RecoveryInd	recovery_ind,
+	uint16_t		msg_id,
+	uint8_t			emerg_ind,
+	uint16_t		warn_type,
+	octetstring		warn_sec_info,
+	uint8_t			channel_ind,
+	uint8_t			num_of_pages,
+	uint8_t			schedule_period,
+	uint8_t			num_of_res_slots,
+	CBSP_IE_BcastMsgType	bcast_msg_type,
+	uint8_t			warning_period,
+	uint8_t			keep_alive_rep_period
+} with {
+	variant (warn_sec_info) "FIELDLENGTH(50)"
+};
+
+type record CBSP_IE {
+	CBSP_IEI		iei,
+	CBSP_IE_Body		body
+} with {
+	variant (body)	"CROSSTAG(	msg_content, iei = CBSP_IEI_MSG_CONTENT;
+					old_ser_nr, iei = CBSP_IEI_OLD_SERIAL_NR;
+					new_ser_nr, iei = CBSP_IEI_NEW_SERIAL_NR;
+					cell_list, iei = CBSP_IEI_CELL_LIST;
+					category, iei = CBSP_IEI_CATEGORY;
+					rep_period, iei = CBSP_IEI_REP_PERIOD;
+					num_bcast_req, iei = CBSP_IEI_NUM_BCAST_REQ;
+					num_bcast_compl_list, iei = CBSP_IEI_NUM_BCAST_COMPL_LIST;
+					failure_list, iei = CBSP_IEI_FAILURE_LIST;
+					rr_loading_list, iei = CBSP_IEI_RR_LOADING_LIST;
+					cause, iei = CBSP_IEI_CAUSE;
+					dcs, iei = CBSP_IEI_DCS;
+					recovery_ind, iei = CBSP_IEI_RECOVERY_IND;
+					msg_id, iei = CBSP_IEI_MSG_ID;
+					emerg_ind, iei = CBSP_IEI_EMERG_IND;
+					warn_type, iei = CBSP_IEI_WARN_TYPE;
+					warn_sec_info, iei = CBSP_IEI_WARN_SEC_INFO;
+					channel_ind, iei = CBSP_IEI_CHANNEL_IND;
+					num_of_pages, iei = CBSP_IEI_NUM_OF_PAGES;
+					schedule_period, iei = CBSP_IEI_SCHEDULE_PERIOD;
+					num_of_res_slots, iei = CBSP_IEI_NUM_OF_RES_SLOTS;
+					bcast_msg_type, iei = CBSP_IEI_BCAST_MSG_TYPE;
+					warning_period, iei = CBSP_IEI_WARNING_PERIOD;
+					keep_alive_rep_period, iei = CBSP_IEI_KEEP_ALIVE_REP_PERIOD
+		)"
+};
+
+type set of CBSP_IE CBSP_IEs;
+
+type record CBSP_PDU {
+	CBSP_MessageType	msg_type,
+	uint24_t		len,
+	CBSP_IEs		ies
+} with {
+	variant (len) "LENGTHTO(ies)"
+};
+
+external function enc_CBSP_PDU(in CBSP_PDU msg) return octetstring
+	with { extension "prototype(convert) encode(RAW)" };
+
+external function dec_CBSP_PDU(in octetstring msg) return CBSP_PDU
+	with { extension "prototype(convert) decode(RAW)" };
+
+
+} with { encode "RAW"; variant "FIELDORDER(msb)" }
