diff --git a/src/sabp/Makefile.am b/src/sabp/Makefile.am
new file mode 100644
index 0000000..a30674c
--- /dev/null
+++ b/src/sabp/Makefile.am
@@ -0,0 +1,148 @@
+ASN_MODULE_SRC=	\
+	SABP_InitiatingMessage.c	\
+	SABP_SABP-PDU.c	\
+	SABP_SuccessfulOutcome.c	\
+	SABP_UnsuccessfulOutcome.c	\
+	SABP_Criticality.c	\
+	SABP_Presence.c	\
+	SABP_ProcedureCode.c	\
+	SABP_ProtocolExtensionID.c	\
+	SABP_ProtocolIE-ID.c	\
+	SABP_TriggeringMessage.c	\
+	SABP_IE-Extensions.c	\
+	SABP_Available-Bandwidth.c	\
+	SABP_Broadcast-Message-Content.c	\
+	SABP_Broadcast-Message-Content-Validity-Indicator.c	\
+	SABP_Category.c	\
+	SABP_Cause.c	\
+	SABP_Criticality-Diagnostics.c	\
+	SABP_CriticalityDiagnostics-IE-List.c	\
+	SABP_MessageStructure.c	\
+	SABP_Data-Coding-Scheme.c	\
+	SABP_Failure-List.c	\
+	SABP_Failure-List-Item.c	\
+	SABP_Message-Identifier.c	\
+	SABP_New-Serial-Number.c	\
+	SABP_Number-of-Broadcasts-Completed-List.c	\
+	SABP_Number-of-Broadcasts-Completed-List-Item.c	\
+	SABP_Number-Of-Broadcasts-Completed-Info.c	\
+	SABP_Number-of-Broadcasts-Requested.c	\
+	SABP_Old-Serial-Number.c	\
+	SABP_Paging-ETWS-Indicator.c	\
+	SABP_Radio-Resource-Loading-List.c	\
+	SABP_Radio-Resource-Loading-List-Item.c	\
+	SABP_Recovery-Indication.c	\
+	SABP_RepetitionNumber0.c	\
+	SABP_RepetitionNumber1.c	\
+	SABP_Repetition-Period.c	\
+	SABP_Serial-Number.c	\
+	SABP_Service-Area-Identifier.c	\
+	SABP_Service-Areas-List.c	\
+	SABP_TypeOfError.c	\
+	SABP_WarningSecurityInfo.c	\
+	SABP_Warning-Type.c	\
+	SABP_Write-Replace.c	\
+	SABP_Write-Replace-Complete.c	\
+	SABP_Write-Replace-Failure.c	\
+	SABP_Kill.c	\
+	SABP_Kill-Complete.c	\
+	SABP_Kill-Failure.c	\
+	SABP_Load-Query.c	\
+	SABP_Load-Query-Complete.c	\
+	SABP_Load-Query-Failure.c	\
+	SABP_Message-Status-Query.c	\
+	SABP_Message-Status-Query-Complete.c	\
+	SABP_Message-Status-Query-Failure.c	\
+	SABP_Reset.c	\
+	SABP_Reset-Complete.c	\
+	SABP_Reset-Failure.c	\
+	SABP_Restart.c	\
+	SABP_Failure.c	\
+	SABP_Error-Indication.c	\
+	SABP_IE.c \
+	$(NULL)
+
+ASN_MODULE_INC=	\
+	SABP_InitiatingMessage.h	\
+	SABP_SABP-PDU.h	\
+	SABP_SuccessfulOutcome.h	\
+	SABP_UnsuccessfulOutcome.h	\
+	SABP_Criticality.h	\
+	SABP_Presence.h	\
+	SABP_ProcedureCode.h	\
+	SABP_ProtocolExtensionID.h	\
+	SABP_ProtocolIE-ID.h	\
+	SABP_TriggeringMessage.h	\
+	SABP_IE-Extensions.h	\
+	SABP_Available-Bandwidth.h	\
+	SABP_Broadcast-Message-Content.h	\
+	SABP_Broadcast-Message-Content-Validity-Indicator.h	\
+	SABP_Category.h	\
+	SABP_Cause.h	\
+	SABP_Criticality-Diagnostics.h	\
+	SABP_CriticalityDiagnostics-IE-List.h	\
+	SABP_MessageStructure.h	\
+	SABP_Data-Coding-Scheme.h	\
+	SABP_Failure-List.h	\
+	SABP_Failure-List-Item.h	\
+	SABP_Message-Identifier.h	\
+	SABP_New-Serial-Number.h	\
+	SABP_Number-of-Broadcasts-Completed-List.h	\
+	SABP_Number-of-Broadcasts-Completed-List-Item.h	\
+	SABP_Number-Of-Broadcasts-Completed-Info.h	\
+	SABP_Number-of-Broadcasts-Requested.h	\
+	SABP_Old-Serial-Number.h	\
+	SABP_Paging-ETWS-Indicator.h	\
+	SABP_Radio-Resource-Loading-List.h	\
+	SABP_Radio-Resource-Loading-List-Item.h	\
+	SABP_Recovery-Indication.h	\
+	SABP_RepetitionNumber0.h	\
+	SABP_RepetitionNumber1.h	\
+	SABP_Repetition-Period.h	\
+	SABP_Serial-Number.h	\
+	SABP_Service-Area-Identifier.h	\
+	SABP_Service-Areas-List.h	\
+	SABP_TypeOfError.h	\
+	SABP_WarningSecurityInfo.h	\
+	SABP_Warning-Type.h	\
+	SABP_Write-Replace.h	\
+	SABP_Write-Replace-Complete.h	\
+	SABP_Write-Replace-Failure.h	\
+	SABP_Kill.h	\
+	SABP_Kill-Complete.h	\
+	SABP_Kill-Failure.h	\
+	SABP_Load-Query.h	\
+	SABP_Load-Query-Complete.h	\
+	SABP_Load-Query-Failure.h	\
+	SABP_Message-Status-Query.h	\
+	SABP_Message-Status-Query-Complete.h	\
+	SABP_Message-Status-Query-Failure.h	\
+	SABP_Reset.h	\
+	SABP_Reset-Complete.h	\
+	SABP_Reset-Failure.h	\
+	SABP_Restart.h	\
+	SABP_Failure.h	\
+	SABP_Error-Indication.h	\
+	SABP_IE.h \
+	$(NULL)
+
+AM_CFLAGS = -I$(top_srcdir)/include $(ASN1C_CFLAGS) $(OSMOCORE_CFLAGS)
+
+noinst_LTLIBRARIES=libosmo-asn1-sabp.la
+libosmo_asn1_sabp_la_SOURCES=$(ASN_MODULE_SRC)
+libosmo_asn1_sabp_la_LIBADD=$(ASN1C_LDADD)
+
+regen: regenerate-from-asn1-source
+
+regenerate-from-asn1-source:
+	ASN1C_PREFIX="SABP_" asn1c -gen-PER $(top_srcdir)/asn1/sabp/SABP-CommonDataTypes.asn $(top_srcdir)/asn1/sabp/SABP-Constants.asn $(top_srcdir)/asn1/sabp/SABP-IEs.asn $(top_srcdir)/asn1/sabp/SABP-PDU.asn
+#	remove the local copy of the runtime code
+	@rm ANY.* INTEGER.* NativeEnumerated.* NativeInteger.* asn_* OCTET_STRING.* converter-sample.c per_* xer_* constr* der_* ber_* BIT_STRING.*
+#	change include style to `#include <dir/foo.h>'
+	sed -i 's/Member/MemberA/' SABP_MessageStructure.[ch]
+	sed -i 's/Member/MemberB/' SABP_Criticality-Diagnostics.[ch]
+#	add missing includes
+	sed -i '/#include "SABP_Serial-Number.h"/a #include <constr_CHOICE.h>' SABP_Old-Serial-Number.h SABP_New-Serial-Number.h
+#	change include style to `#include <dir/foo.h>'
+	$(top_srcdir)/move-asn1-header-files.sh osmocom/sabp $(ASN_MODULE_INC)
+
diff --git a/src/sabp/SABP_Available-Bandwidth.c b/src/sabp/SABP_Available-Bandwidth.c
new file mode 100644
index 0000000..491c69b
--- /dev/null
+++ b/src/sabp/SABP_Available-Bandwidth.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Available-Bandwidth.h>
+
+int
+SABP_Available_Bandwidth_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 20480l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_Available_Bandwidth_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Available_Bandwidth_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Available_Bandwidth_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Available_Bandwidth_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Available_Bandwidth_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Available_Bandwidth_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Available_Bandwidth_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Available_Bandwidth_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Available_Bandwidth_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Available_Bandwidth_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Available_Bandwidth_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Available_Bandwidth_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 15,  15,  0l,  20480l }	/* (0..20480) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Available_Bandwidth_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Available_Bandwidth = {
+	"SABP_Available-Bandwidth",
+	"SABP_Available-Bandwidth",
+	SABP_Available_Bandwidth_free,
+	SABP_Available_Bandwidth_print,
+	SABP_Available_Bandwidth_constraint,
+	SABP_Available_Bandwidth_decode_ber,
+	SABP_Available_Bandwidth_encode_der,
+	SABP_Available_Bandwidth_decode_xer,
+	SABP_Available_Bandwidth_encode_xer,
+	SABP_Available_Bandwidth_decode_uper,
+	SABP_Available_Bandwidth_encode_uper,
+	SABP_Available_Bandwidth_decode_aper,
+	SABP_Available_Bandwidth_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Available_Bandwidth_tags_1,
+	sizeof(asn_DEF_SABP_Available_Bandwidth_tags_1)
+		/sizeof(asn_DEF_SABP_Available_Bandwidth_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Available_Bandwidth_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Available_Bandwidth_tags_1)
+		/sizeof(asn_DEF_SABP_Available_Bandwidth_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Available_Bandwidth_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Broadcast-Message-Content-Validity-Indicator.c b/src/sabp/SABP_Broadcast-Message-Content-Validity-Indicator.c
new file mode 100644
index 0000000..698863b
--- /dev/null
+++ b/src/sabp/SABP_Broadcast-Message-Content-Validity-Indicator.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Broadcast-Message-Content-Validity-Indicator.h>
+
+int
+SABP_Broadcast_Message_Content_Validity_Indicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_Broadcast_Message_Content_Validity_Indicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Broadcast_Message_Content_Validity_Indicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_Validity_Indicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Broadcast_Message_Content_Validity_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Broadcast_Message_Content_Validity_Indicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_Broadcast_Message_Content_Validity_Indicator_value2enum_1[] = {
+	{ 0,	35,	"broadcast-Message-Content-not-valid" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_SABP_Broadcast_Message_Content_Validity_Indicator_enum2value_1[] = {
+	0	/* broadcast-Message-Content-not-valid(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_Broadcast_Message_Content_Validity_Indicator_specs_1 = {
+	asn_MAP_SABP_Broadcast_Message_Content_Validity_Indicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_Broadcast_Message_Content_Validity_Indicator_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator = {
+	"SABP_Broadcast-Message-Content-Validity-Indicator",
+	"SABP_Broadcast-Message-Content-Validity-Indicator",
+	SABP_Broadcast_Message_Content_Validity_Indicator_free,
+	SABP_Broadcast_Message_Content_Validity_Indicator_print,
+	SABP_Broadcast_Message_Content_Validity_Indicator_constraint,
+	SABP_Broadcast_Message_Content_Validity_Indicator_decode_ber,
+	SABP_Broadcast_Message_Content_Validity_Indicator_encode_der,
+	SABP_Broadcast_Message_Content_Validity_Indicator_decode_xer,
+	SABP_Broadcast_Message_Content_Validity_Indicator_encode_xer,
+	SABP_Broadcast_Message_Content_Validity_Indicator_decode_uper,
+	SABP_Broadcast_Message_Content_Validity_Indicator_encode_uper,
+	SABP_Broadcast_Message_Content_Validity_Indicator_decode_aper,
+	SABP_Broadcast_Message_Content_Validity_Indicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator_tags_1,
+	sizeof(asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator_tags_1)
+		/sizeof(asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator_tags_1)
+		/sizeof(asn_DEF_SABP_Broadcast_Message_Content_Validity_Indicator_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Broadcast_Message_Content_Validity_Indicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_Broadcast_Message_Content_Validity_Indicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Broadcast-Message-Content.c b/src/sabp/SABP_Broadcast-Message-Content.c
new file mode 100644
index 0000000..8c21f26
--- /dev/null
+++ b/src/sabp/SABP_Broadcast-Message-Content.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Broadcast-Message-Content.h>
+
+int
+SABP_Broadcast_Message_Content_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size >= 1l && size <= 9968l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+SABP_Broadcast_Message_Content_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Broadcast_Message_Content_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Broadcast_Message_Content_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Broadcast_Message_Content_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Broadcast_Message_Content_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Broadcast_Message_Content_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 14,  14,  1l,  9968l }	/* (SIZE(1..9968)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Broadcast_Message_Content_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Broadcast_Message_Content = {
+	"SABP_Broadcast-Message-Content",
+	"SABP_Broadcast-Message-Content",
+	SABP_Broadcast_Message_Content_free,
+	SABP_Broadcast_Message_Content_print,
+	SABP_Broadcast_Message_Content_constraint,
+	SABP_Broadcast_Message_Content_decode_ber,
+	SABP_Broadcast_Message_Content_encode_der,
+	SABP_Broadcast_Message_Content_decode_xer,
+	SABP_Broadcast_Message_Content_encode_xer,
+	SABP_Broadcast_Message_Content_decode_uper,
+	SABP_Broadcast_Message_Content_encode_uper,
+	SABP_Broadcast_Message_Content_decode_aper,
+	SABP_Broadcast_Message_Content_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Broadcast_Message_Content_tags_1,
+	sizeof(asn_DEF_SABP_Broadcast_Message_Content_tags_1)
+		/sizeof(asn_DEF_SABP_Broadcast_Message_Content_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Broadcast_Message_Content_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Broadcast_Message_Content_tags_1)
+		/sizeof(asn_DEF_SABP_Broadcast_Message_Content_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Broadcast_Message_Content_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Category.c b/src/sabp/SABP_Category.c
new file mode 100644
index 0000000..4bb9d82
--- /dev/null
+++ b/src/sabp/SABP_Category.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Category.h>
+
+int
+SABP_Category_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Category_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_Category_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Category_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Category_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Category_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Category_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Category_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Category_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Category_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Category_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Category_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Category_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Category_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  3l }	/* (0..3,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_Category_value2enum_1[] = {
+	{ 0,	13,	"high-priority" },
+	{ 1,	19,	"background-priority" },
+	{ 2,	15,	"normal-priority" },
+	{ 3,	16,	"default-priority" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_SABP_Category_enum2value_1[] = {
+	1,	/* background-priority(1) */
+	3,	/* default-priority(3) */
+	0,	/* high-priority(0) */
+	2	/* normal-priority(2) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_Category_specs_1 = {
+	asn_MAP_SABP_Category_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_Category_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	5,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Category_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Category = {
+	"SABP_Category",
+	"SABP_Category",
+	SABP_Category_free,
+	SABP_Category_print,
+	SABP_Category_constraint,
+	SABP_Category_decode_ber,
+	SABP_Category_encode_der,
+	SABP_Category_decode_xer,
+	SABP_Category_encode_xer,
+	SABP_Category_decode_uper,
+	SABP_Category_encode_uper,
+	SABP_Category_decode_aper,
+	SABP_Category_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Category_tags_1,
+	sizeof(asn_DEF_SABP_Category_tags_1)
+		/sizeof(asn_DEF_SABP_Category_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Category_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Category_tags_1)
+		/sizeof(asn_DEF_SABP_Category_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Category_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_Category_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Cause.c b/src/sabp/SABP_Cause.c
new file mode 100644
index 0000000..389c47f
--- /dev/null
+++ b/src/sabp/SABP_Cause.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Cause.h>
+
+int
+SABP_Cause_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Cause_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_Cause_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Cause_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Cause_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Cause_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Cause_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Cause_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Cause_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Cause_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Cause_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Cause_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Cause_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Cause_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Cause_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Cause = {
+	"SABP_Cause",
+	"SABP_Cause",
+	SABP_Cause_free,
+	SABP_Cause_print,
+	SABP_Cause_constraint,
+	SABP_Cause_decode_ber,
+	SABP_Cause_encode_der,
+	SABP_Cause_decode_xer,
+	SABP_Cause_encode_xer,
+	SABP_Cause_decode_uper,
+	SABP_Cause_encode_uper,
+	SABP_Cause_decode_aper,
+	SABP_Cause_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Cause_tags_1,
+	sizeof(asn_DEF_SABP_Cause_tags_1)
+		/sizeof(asn_DEF_SABP_Cause_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Cause_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Cause_tags_1)
+		/sizeof(asn_DEF_SABP_Cause_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Cause_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Criticality-Diagnostics.c b/src/sabp/SABP_Criticality-Diagnostics.c
new file mode 100644
index 0000000..76ef94f
--- /dev/null
+++ b/src/sabp/SABP_Criticality-Diagnostics.c
@@ -0,0 +1,103 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Criticality-Diagnostics.h>
+
+static asn_TYPE_member_t asn_MBR_SABP_Criticality_Diagnostics_1[] = {
+	{ ATF_POINTER, 5, offsetof(struct SABP_Criticality_Diagnostics, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_POINTER, 4, offsetof(struct SABP_Criticality_Diagnostics, triggeringMessage),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_TriggeringMessage,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"triggeringMessage"
+		},
+	{ ATF_POINTER, 3, offsetof(struct SABP_Criticality_Diagnostics, procedureCriticality),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCriticality"
+		},
+	{ ATF_POINTER, 2, offsetof(struct SABP_Criticality_Diagnostics, iEsCriticalityDiagnostics),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_CriticalityDiagnostics_IE_List,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iEsCriticalityDiagnostics"
+		},
+	{ ATF_POINTER, 1, offsetof(struct SABP_Criticality_Diagnostics, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_SABP_Criticality_Diagnostics_oms_1[] = { 0, 1, 2, 3, 4 };
+static const ber_tlv_tag_t asn_DEF_SABP_Criticality_Diagnostics_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Criticality_Diagnostics_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* triggeringMessage */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* procedureCriticality */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* iEsCriticalityDiagnostics */
+    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Criticality_Diagnostics_specs_1 = {
+	sizeof(struct SABP_Criticality_Diagnostics),
+	offsetof(struct SABP_Criticality_Diagnostics, _asn_ctx),
+	asn_MAP_SABP_Criticality_Diagnostics_tag2el_1,
+	5,	/* Count of tags in the map */
+	asn_MAP_SABP_Criticality_Diagnostics_oms_1,	/* Optional members */
+	5, 0,	/* Root/Additions */
+	4,	/* Start extensions */
+	6	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Criticality_Diagnostics = {
+	"SABP_Criticality-Diagnostics",
+	"SABP_Criticality-Diagnostics",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Criticality_Diagnostics_tags_1,
+	sizeof(asn_DEF_SABP_Criticality_Diagnostics_tags_1)
+		/sizeof(asn_DEF_SABP_Criticality_Diagnostics_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Criticality_Diagnostics_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Criticality_Diagnostics_tags_1)
+		/sizeof(asn_DEF_SABP_Criticality_Diagnostics_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Criticality_Diagnostics_1,
+	5,	/* Elements count */
+	&asn_SPC_SABP_Criticality_Diagnostics_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Criticality.c b/src/sabp/SABP_Criticality.c
new file mode 100644
index 0000000..15a7b26
--- /dev/null
+++ b/src/sabp/SABP_Criticality.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-CommonDataTypes"
+ * 	found in "../../asn1/sabp/SABP-CommonDataTypes.asn"
+ */
+
+#include <osmocom/sabp/SABP_Criticality.h>
+
+int
+SABP_Criticality_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Criticality_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_Criticality_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Criticality_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Criticality_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Criticality_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Criticality_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Criticality_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Criticality_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Criticality_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Criticality_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Criticality_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Criticality_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Criticality_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  2l }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_Criticality_value2enum_1[] = {
+	{ 0,	6,	"reject" },
+	{ 1,	6,	"ignore" },
+	{ 2,	6,	"notify" }
+};
+static const unsigned int asn_MAP_SABP_Criticality_enum2value_1[] = {
+	1,	/* ignore(1) */
+	2,	/* notify(2) */
+	0	/* reject(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_Criticality_specs_1 = {
+	asn_MAP_SABP_Criticality_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_Criticality_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Criticality_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Criticality = {
+	"SABP_Criticality",
+	"SABP_Criticality",
+	SABP_Criticality_free,
+	SABP_Criticality_print,
+	SABP_Criticality_constraint,
+	SABP_Criticality_decode_ber,
+	SABP_Criticality_encode_der,
+	SABP_Criticality_decode_xer,
+	SABP_Criticality_encode_xer,
+	SABP_Criticality_decode_uper,
+	SABP_Criticality_encode_uper,
+	SABP_Criticality_decode_aper,
+	SABP_Criticality_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Criticality_tags_1,
+	sizeof(asn_DEF_SABP_Criticality_tags_1)
+		/sizeof(asn_DEF_SABP_Criticality_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Criticality_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Criticality_tags_1)
+		/sizeof(asn_DEF_SABP_Criticality_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Criticality_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_Criticality_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_CriticalityDiagnostics-IE-List.c b/src/sabp/SABP_CriticalityDiagnostics-IE-List.c
new file mode 100644
index 0000000..8d5c403
--- /dev/null
+++ b/src/sabp/SABP_CriticalityDiagnostics-IE-List.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_CriticalityDiagnostics-IE-List.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_CriticalityDiagnostics_IE_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_Member_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, iECriticality),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iECriticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct Member, iE_ID),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_ProtocolIE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-ID"
+		},
+	{ ATF_POINTER, 2, offsetof(struct Member, repetitionNumber),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_RepetitionNumber0,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"repetitionNumber"
+		},
+	{ ATF_POINTER, 1, offsetof(struct Member, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_Member_oms_2[] = { 2, 3 };
+static const ber_tlv_tag_t asn_DEF_Member_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_Member_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iECriticality */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* iE-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* repetitionNumber */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_Member_specs_2 = {
+	sizeof(struct Member),
+	offsetof(struct Member, _asn_ctx),
+	asn_MAP_Member_tag2el_2,
+	4,	/* Count of tags in the map */
+	asn_MAP_Member_oms_2,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_Member_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_Member_tags_2,
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	asn_DEF_Member_tags_2,	/* Same as above */
+	sizeof(asn_DEF_Member_tags_2)
+		/sizeof(asn_DEF_Member_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_Member_2,
+	4,	/* Elements count */
+	&asn_SPC_Member_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_CriticalityDiagnostics_IE_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_Member_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_CriticalityDiagnostics_IE_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_SABP_CriticalityDiagnostics_IE_List_specs_1 = {
+	sizeof(struct SABP_CriticalityDiagnostics_IE_List),
+	offsetof(struct SABP_CriticalityDiagnostics_IE_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_CriticalityDiagnostics_IE_List = {
+	"SABP_CriticalityDiagnostics-IE-List",
+	"SABP_CriticalityDiagnostics-IE-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_CriticalityDiagnostics_IE_List_tags_1,
+	sizeof(asn_DEF_SABP_CriticalityDiagnostics_IE_List_tags_1)
+		/sizeof(asn_DEF_SABP_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
+	asn_DEF_SABP_CriticalityDiagnostics_IE_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_CriticalityDiagnostics_IE_List_tags_1)
+		/sizeof(asn_DEF_SABP_CriticalityDiagnostics_IE_List_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_CriticalityDiagnostics_IE_List_constr_1,
+	asn_MBR_SABP_CriticalityDiagnostics_IE_List_1,
+	1,	/* Single element */
+	&asn_SPC_SABP_CriticalityDiagnostics_IE_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Data-Coding-Scheme.c b/src/sabp/SABP_Data-Coding-Scheme.c
new file mode 100644
index 0000000..e04f69d
--- /dev/null
+++ b/src/sabp/SABP_Data-Coding-Scheme.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Data-Coding-Scheme.h>
+
+int
+SABP_Data_Coding_Scheme_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 8l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+SABP_Data_Coding_Scheme_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Data_Coding_Scheme_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Data_Coding_Scheme_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Data_Coding_Scheme_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Data_Coding_Scheme_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Data_Coding_Scheme_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Data_Coding_Scheme_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Data_Coding_Scheme_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Data_Coding_Scheme_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Data_Coding_Scheme_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Data_Coding_Scheme_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Data_Coding_Scheme_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  8l,  8l }	/* (SIZE(8..8)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Data_Coding_Scheme_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Data_Coding_Scheme = {
+	"SABP_Data-Coding-Scheme",
+	"SABP_Data-Coding-Scheme",
+	SABP_Data_Coding_Scheme_free,
+	SABP_Data_Coding_Scheme_print,
+	SABP_Data_Coding_Scheme_constraint,
+	SABP_Data_Coding_Scheme_decode_ber,
+	SABP_Data_Coding_Scheme_encode_der,
+	SABP_Data_Coding_Scheme_decode_xer,
+	SABP_Data_Coding_Scheme_encode_xer,
+	SABP_Data_Coding_Scheme_decode_uper,
+	SABP_Data_Coding_Scheme_encode_uper,
+	SABP_Data_Coding_Scheme_decode_aper,
+	SABP_Data_Coding_Scheme_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Data_Coding_Scheme_tags_1,
+	sizeof(asn_DEF_SABP_Data_Coding_Scheme_tags_1)
+		/sizeof(asn_DEF_SABP_Data_Coding_Scheme_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Data_Coding_Scheme_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Data_Coding_Scheme_tags_1)
+		/sizeof(asn_DEF_SABP_Data_Coding_Scheme_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Data_Coding_Scheme_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Error-Indication.c b/src/sabp/SABP_Error-Indication.c
new file mode 100644
index 0000000..78e62ad
--- /dev/null
+++ b/src/sabp/SABP_Error-Indication.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Error-Indication.h>
+
+static int
+memb_error_Indication_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_error_Indication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_error_Indication_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_error_Indication_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_error_Indication_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_error_Indication_ies_specs_2 = {
+	sizeof(struct error_Indication_ies),
+	offsetof(struct error_Indication_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_error_Indication_ies_2 = {
+	"error-Indication-ies",
+	"error-Indication-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_error_Indication_ies_tags_2,
+	sizeof(asn_DEF_error_Indication_ies_tags_2)
+		/sizeof(asn_DEF_error_Indication_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_error_Indication_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_error_Indication_ies_tags_2)
+		/sizeof(asn_DEF_error_Indication_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_error_Indication_ies_constr_2,
+	asn_MBR_error_Indication_ies_2,
+	1,	/* Single element */
+	&asn_SPC_error_Indication_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Error_Indication_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Error_Indication, error_Indication_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_error_Indication_ies_2,
+		memb_error_Indication_ies_constraint_1,
+		&asn_PER_memb_error_Indication_ies_constr_2,
+		0,
+		"error-Indication-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Error_Indication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Error_Indication_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* error-Indication-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Error_Indication_specs_1 = {
+	sizeof(struct SABP_Error_Indication),
+	offsetof(struct SABP_Error_Indication, _asn_ctx),
+	asn_MAP_SABP_Error_Indication_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Error_Indication = {
+	"SABP_Error-Indication",
+	"SABP_Error-Indication",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Error_Indication_tags_1,
+	sizeof(asn_DEF_SABP_Error_Indication_tags_1)
+		/sizeof(asn_DEF_SABP_Error_Indication_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Error_Indication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Error_Indication_tags_1)
+		/sizeof(asn_DEF_SABP_Error_Indication_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Error_Indication_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Error_Indication_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Failure-List-Item.c b/src/sabp/SABP_Failure-List-Item.c
new file mode 100644
index 0000000..0891016
--- /dev/null
+++ b/src/sabp/SABP_Failure-List-Item.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Failure-List-Item.h>
+
+static asn_TYPE_member_t asn_MBR_SABP_Failure_List_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Failure_List_Item, service_area_identifier),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Service_Area_Identifier,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"service-area-identifier"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Failure_List_Item, cause),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Cause,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"cause"
+		},
+	{ ATF_POINTER, 1, offsetof(struct SABP_Failure_List_Item, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_SABP_Failure_List_Item_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_SABP_Failure_List_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Failure_List_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* service-area-identifier */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cause */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Failure_List_Item_specs_1 = {
+	sizeof(struct SABP_Failure_List_Item),
+	offsetof(struct SABP_Failure_List_Item, _asn_ctx),
+	asn_MAP_SABP_Failure_List_Item_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_SABP_Failure_List_Item_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Failure_List_Item = {
+	"SABP_Failure-List-Item",
+	"SABP_Failure-List-Item",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Failure_List_Item_tags_1,
+	sizeof(asn_DEF_SABP_Failure_List_Item_tags_1)
+		/sizeof(asn_DEF_SABP_Failure_List_Item_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Failure_List_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Failure_List_Item_tags_1)
+		/sizeof(asn_DEF_SABP_Failure_List_Item_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Failure_List_Item_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_Failure_List_Item_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Failure-List.c b/src/sabp/SABP_Failure-List.c
new file mode 100644
index 0000000..1b2bc16
--- /dev/null
+++ b/src/sabp/SABP_Failure-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Failure-List.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_Failure_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  1l,  65535l }	/* (SIZE(1..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_Failure_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_Failure_List_Item,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Failure_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_SABP_Failure_List_specs_1 = {
+	sizeof(struct SABP_Failure_List),
+	offsetof(struct SABP_Failure_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Failure_List = {
+	"SABP_Failure-List",
+	"SABP_Failure-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Failure_List_tags_1,
+	sizeof(asn_DEF_SABP_Failure_List_tags_1)
+		/sizeof(asn_DEF_SABP_Failure_List_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Failure_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Failure_List_tags_1)
+		/sizeof(asn_DEF_SABP_Failure_List_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Failure_List_constr_1,
+	asn_MBR_SABP_Failure_List_1,
+	1,	/* Single element */
+	&asn_SPC_SABP_Failure_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Failure.c b/src/sabp/SABP_Failure.c
new file mode 100644
index 0000000..685fe44
--- /dev/null
+++ b/src/sabp/SABP_Failure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Failure.h>
+
+static int
+memb_failure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_failure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_failure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_failure_ies_specs_2 = {
+	sizeof(struct failure_ies),
+	offsetof(struct failure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_failure_ies_2 = {
+	"failure-ies",
+	"failure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_failure_ies_tags_2,
+	sizeof(asn_DEF_failure_ies_tags_2)
+		/sizeof(asn_DEF_failure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_failure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_failure_ies_tags_2)
+		/sizeof(asn_DEF_failure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_failure_ies_constr_2,
+	asn_MBR_failure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_failure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Failure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Failure, failure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_failure_ies_2,
+		memb_failure_ies_constraint_1,
+		&asn_PER_memb_failure_ies_constr_2,
+		0,
+		"failure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Failure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Failure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* failure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Failure_specs_1 = {
+	sizeof(struct SABP_Failure),
+	offsetof(struct SABP_Failure, _asn_ctx),
+	asn_MAP_SABP_Failure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Failure = {
+	"SABP_Failure",
+	"SABP_Failure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Failure_tags_1,
+	sizeof(asn_DEF_SABP_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Failure_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Failure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Failure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Failure_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Failure_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_IE-Extensions.c b/src/sabp/SABP_IE-Extensions.c
new file mode 100644
index 0000000..f462546
--- /dev/null
+++ b/src/sabp/SABP_IE-Extensions.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_IE-Extensions.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_IE_Extensions_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  1l,  65535l }	/* (SIZE(1..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_IE_Extensions_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_IE_Extensions_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_SABP_IE_Extensions_specs_1 = {
+	sizeof(struct SABP_IE_Extensions),
+	offsetof(struct SABP_IE_Extensions, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_IE_Extensions = {
+	"SABP_IE-Extensions",
+	"SABP_IE-Extensions",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_IE_Extensions_tags_1,
+	sizeof(asn_DEF_SABP_IE_Extensions_tags_1)
+		/sizeof(asn_DEF_SABP_IE_Extensions_tags_1[0]), /* 1 */
+	asn_DEF_SABP_IE_Extensions_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_IE_Extensions_tags_1)
+		/sizeof(asn_DEF_SABP_IE_Extensions_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_IE_Extensions_constr_1,
+	asn_MBR_SABP_IE_Extensions_1,
+	1,	/* Single element */
+	&asn_SPC_SABP_IE_Extensions_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_IE.c b/src/sabp/SABP_IE.c
new file mode 100644
index 0000000..2259b88
--- /dev/null
+++ b/src/sabp/SABP_IE.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_IE.h>
+
+static asn_TYPE_member_t asn_MBR_SABP_IE_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_IE, id),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_ProtocolIE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"id"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_IE, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_IE, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_IE_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_IE_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_IE_specs_1 = {
+	sizeof(struct SABP_IE),
+	offsetof(struct SABP_IE, _asn_ctx),
+	asn_MAP_SABP_IE_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_IE = {
+	"SABP_IE",
+	"SABP_IE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_IE_tags_1,
+	sizeof(asn_DEF_SABP_IE_tags_1)
+		/sizeof(asn_DEF_SABP_IE_tags_1[0]), /* 1 */
+	asn_DEF_SABP_IE_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_IE_tags_1)
+		/sizeof(asn_DEF_SABP_IE_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_IE_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_IE_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_InitiatingMessage.c b/src/sabp/SABP_InitiatingMessage.c
new file mode 100644
index 0000000..b31ddae
--- /dev/null
+++ b/src/sabp/SABP_InitiatingMessage.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_InitiatingMessage.h>
+
+static asn_TYPE_member_t asn_MBR_SABP_InitiatingMessage_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_InitiatingMessage, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_InitiatingMessage, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_InitiatingMessage, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_InitiatingMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_InitiatingMessage_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_InitiatingMessage_specs_1 = {
+	sizeof(struct SABP_InitiatingMessage),
+	offsetof(struct SABP_InitiatingMessage, _asn_ctx),
+	asn_MAP_SABP_InitiatingMessage_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_InitiatingMessage = {
+	"SABP_InitiatingMessage",
+	"SABP_InitiatingMessage",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_InitiatingMessage_tags_1,
+	sizeof(asn_DEF_SABP_InitiatingMessage_tags_1)
+		/sizeof(asn_DEF_SABP_InitiatingMessage_tags_1[0]), /* 1 */
+	asn_DEF_SABP_InitiatingMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_InitiatingMessage_tags_1)
+		/sizeof(asn_DEF_SABP_InitiatingMessage_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_InitiatingMessage_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_InitiatingMessage_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Kill-Complete.c b/src/sabp/SABP_Kill-Complete.c
new file mode 100644
index 0000000..f7b1a85
--- /dev/null
+++ b/src/sabp/SABP_Kill-Complete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Kill-Complete.h>
+
+static int
+memb_kill_Complete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_kill_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_kill_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_kill_Complete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_kill_Complete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_kill_Complete_ies_specs_2 = {
+	sizeof(struct kill_Complete_ies),
+	offsetof(struct kill_Complete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_kill_Complete_ies_2 = {
+	"kill-Complete-ies",
+	"kill-Complete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_kill_Complete_ies_tags_2,
+	sizeof(asn_DEF_kill_Complete_ies_tags_2)
+		/sizeof(asn_DEF_kill_Complete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_kill_Complete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_kill_Complete_ies_tags_2)
+		/sizeof(asn_DEF_kill_Complete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_kill_Complete_ies_constr_2,
+	asn_MBR_kill_Complete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_kill_Complete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Kill_Complete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Kill_Complete, kill_Complete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_kill_Complete_ies_2,
+		memb_kill_Complete_ies_constraint_1,
+		&asn_PER_memb_kill_Complete_ies_constr_2,
+		0,
+		"kill-Complete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Kill_Complete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Kill_Complete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* kill-Complete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Kill_Complete_specs_1 = {
+	sizeof(struct SABP_Kill_Complete),
+	offsetof(struct SABP_Kill_Complete, _asn_ctx),
+	asn_MAP_SABP_Kill_Complete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Kill_Complete = {
+	"SABP_Kill-Complete",
+	"SABP_Kill-Complete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Kill_Complete_tags_1,
+	sizeof(asn_DEF_SABP_Kill_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Kill_Complete_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Kill_Complete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Kill_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Kill_Complete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Kill_Complete_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Kill_Complete_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Kill-Failure.c b/src/sabp/SABP_Kill-Failure.c
new file mode 100644
index 0000000..730d403
--- /dev/null
+++ b/src/sabp/SABP_Kill-Failure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Kill-Failure.h>
+
+static int
+memb_kill_Failure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_kill_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_kill_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_kill_Failure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_kill_Failure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_kill_Failure_ies_specs_2 = {
+	sizeof(struct kill_Failure_ies),
+	offsetof(struct kill_Failure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_kill_Failure_ies_2 = {
+	"kill-Failure-ies",
+	"kill-Failure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_kill_Failure_ies_tags_2,
+	sizeof(asn_DEF_kill_Failure_ies_tags_2)
+		/sizeof(asn_DEF_kill_Failure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_kill_Failure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_kill_Failure_ies_tags_2)
+		/sizeof(asn_DEF_kill_Failure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_kill_Failure_ies_constr_2,
+	asn_MBR_kill_Failure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_kill_Failure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Kill_Failure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Kill_Failure, kill_Failure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_kill_Failure_ies_2,
+		memb_kill_Failure_ies_constraint_1,
+		&asn_PER_memb_kill_Failure_ies_constr_2,
+		0,
+		"kill-Failure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Kill_Failure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Kill_Failure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* kill-Failure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Kill_Failure_specs_1 = {
+	sizeof(struct SABP_Kill_Failure),
+	offsetof(struct SABP_Kill_Failure, _asn_ctx),
+	asn_MAP_SABP_Kill_Failure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Kill_Failure = {
+	"SABP_Kill-Failure",
+	"SABP_Kill-Failure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Kill_Failure_tags_1,
+	sizeof(asn_DEF_SABP_Kill_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Kill_Failure_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Kill_Failure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Kill_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Kill_Failure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Kill_Failure_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Kill_Failure_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Kill.c b/src/sabp/SABP_Kill.c
new file mode 100644
index 0000000..0210a19
--- /dev/null
+++ b/src/sabp/SABP_Kill.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Kill.h>
+
+static int
+memb_kill_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_kill_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_kill_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_kill_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_kill_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_kill_ies_specs_2 = {
+	sizeof(struct kill_ies),
+	offsetof(struct kill_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_kill_ies_2 = {
+	"kill-ies",
+	"kill-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_kill_ies_tags_2,
+	sizeof(asn_DEF_kill_ies_tags_2)
+		/sizeof(asn_DEF_kill_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_kill_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_kill_ies_tags_2)
+		/sizeof(asn_DEF_kill_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_kill_ies_constr_2,
+	asn_MBR_kill_ies_2,
+	1,	/* Single element */
+	&asn_SPC_kill_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Kill_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Kill, kill_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_kill_ies_2,
+		memb_kill_ies_constraint_1,
+		&asn_PER_memb_kill_ies_constr_2,
+		0,
+		"kill-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Kill_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Kill_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* kill-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Kill_specs_1 = {
+	sizeof(struct SABP_Kill),
+	offsetof(struct SABP_Kill, _asn_ctx),
+	asn_MAP_SABP_Kill_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Kill = {
+	"SABP_Kill",
+	"SABP_Kill",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Kill_tags_1,
+	sizeof(asn_DEF_SABP_Kill_tags_1)
+		/sizeof(asn_DEF_SABP_Kill_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Kill_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Kill_tags_1)
+		/sizeof(asn_DEF_SABP_Kill_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Kill_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Kill_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Load-Query-Complete.c b/src/sabp/SABP_Load-Query-Complete.c
new file mode 100644
index 0000000..d633890
--- /dev/null
+++ b/src/sabp/SABP_Load-Query-Complete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Load-Query-Complete.h>
+
+static int
+memb_load_Query_Complete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_load_Query_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_load_Query_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_load_Query_Complete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_load_Query_Complete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_load_Query_Complete_ies_specs_2 = {
+	sizeof(struct load_Query_Complete_ies),
+	offsetof(struct load_Query_Complete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_load_Query_Complete_ies_2 = {
+	"load-Query-Complete-ies",
+	"load-Query-Complete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_load_Query_Complete_ies_tags_2,
+	sizeof(asn_DEF_load_Query_Complete_ies_tags_2)
+		/sizeof(asn_DEF_load_Query_Complete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_load_Query_Complete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_load_Query_Complete_ies_tags_2)
+		/sizeof(asn_DEF_load_Query_Complete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_load_Query_Complete_ies_constr_2,
+	asn_MBR_load_Query_Complete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_load_Query_Complete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Load_Query_Complete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Load_Query_Complete, load_Query_Complete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_load_Query_Complete_ies_2,
+		memb_load_Query_Complete_ies_constraint_1,
+		&asn_PER_memb_load_Query_Complete_ies_constr_2,
+		0,
+		"load-Query-Complete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Load_Query_Complete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Load_Query_Complete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* load-Query-Complete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Load_Query_Complete_specs_1 = {
+	sizeof(struct SABP_Load_Query_Complete),
+	offsetof(struct SABP_Load_Query_Complete, _asn_ctx),
+	asn_MAP_SABP_Load_Query_Complete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Load_Query_Complete = {
+	"SABP_Load-Query-Complete",
+	"SABP_Load-Query-Complete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Load_Query_Complete_tags_1,
+	sizeof(asn_DEF_SABP_Load_Query_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Load_Query_Complete_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Load_Query_Complete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Load_Query_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Load_Query_Complete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Load_Query_Complete_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Load_Query_Complete_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Load-Query-Failure.c b/src/sabp/SABP_Load-Query-Failure.c
new file mode 100644
index 0000000..948e4ad
--- /dev/null
+++ b/src/sabp/SABP_Load-Query-Failure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Load-Query-Failure.h>
+
+static int
+memb_load_Query_Failure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_load_Query_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_load_Query_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_load_Query_Failure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_load_Query_Failure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_load_Query_Failure_ies_specs_2 = {
+	sizeof(struct load_Query_Failure_ies),
+	offsetof(struct load_Query_Failure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_load_Query_Failure_ies_2 = {
+	"load-Query-Failure-ies",
+	"load-Query-Failure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_load_Query_Failure_ies_tags_2,
+	sizeof(asn_DEF_load_Query_Failure_ies_tags_2)
+		/sizeof(asn_DEF_load_Query_Failure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_load_Query_Failure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_load_Query_Failure_ies_tags_2)
+		/sizeof(asn_DEF_load_Query_Failure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_load_Query_Failure_ies_constr_2,
+	asn_MBR_load_Query_Failure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_load_Query_Failure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Load_Query_Failure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Load_Query_Failure, load_Query_Failure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_load_Query_Failure_ies_2,
+		memb_load_Query_Failure_ies_constraint_1,
+		&asn_PER_memb_load_Query_Failure_ies_constr_2,
+		0,
+		"load-Query-Failure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Load_Query_Failure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Load_Query_Failure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* load-Query-Failure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Load_Query_Failure_specs_1 = {
+	sizeof(struct SABP_Load_Query_Failure),
+	offsetof(struct SABP_Load_Query_Failure, _asn_ctx),
+	asn_MAP_SABP_Load_Query_Failure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Load_Query_Failure = {
+	"SABP_Load-Query-Failure",
+	"SABP_Load-Query-Failure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Load_Query_Failure_tags_1,
+	sizeof(asn_DEF_SABP_Load_Query_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Load_Query_Failure_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Load_Query_Failure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Load_Query_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Load_Query_Failure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Load_Query_Failure_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Load_Query_Failure_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Load-Query.c b/src/sabp/SABP_Load-Query.c
new file mode 100644
index 0000000..2283840
--- /dev/null
+++ b/src/sabp/SABP_Load-Query.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Load-Query.h>
+
+static int
+memb_load_Query_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_load_Query_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_load_Query_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_load_Query_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_load_Query_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_load_Query_ies_specs_2 = {
+	sizeof(struct load_Query_ies),
+	offsetof(struct load_Query_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_load_Query_ies_2 = {
+	"load-Query-ies",
+	"load-Query-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_load_Query_ies_tags_2,
+	sizeof(asn_DEF_load_Query_ies_tags_2)
+		/sizeof(asn_DEF_load_Query_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_load_Query_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_load_Query_ies_tags_2)
+		/sizeof(asn_DEF_load_Query_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_load_Query_ies_constr_2,
+	asn_MBR_load_Query_ies_2,
+	1,	/* Single element */
+	&asn_SPC_load_Query_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Load_Query_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Load_Query, load_Query_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_load_Query_ies_2,
+		memb_load_Query_ies_constraint_1,
+		&asn_PER_memb_load_Query_ies_constr_2,
+		0,
+		"load-Query-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Load_Query_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Load_Query_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* load-Query-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Load_Query_specs_1 = {
+	sizeof(struct SABP_Load_Query),
+	offsetof(struct SABP_Load_Query, _asn_ctx),
+	asn_MAP_SABP_Load_Query_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Load_Query = {
+	"SABP_Load-Query",
+	"SABP_Load-Query",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Load_Query_tags_1,
+	sizeof(asn_DEF_SABP_Load_Query_tags_1)
+		/sizeof(asn_DEF_SABP_Load_Query_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Load_Query_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Load_Query_tags_1)
+		/sizeof(asn_DEF_SABP_Load_Query_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Load_Query_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Load_Query_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Message-Identifier.c b/src/sabp/SABP_Message-Identifier.c
new file mode 100644
index 0000000..2789dcc
--- /dev/null
+++ b/src/sabp/SABP_Message-Identifier.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Message-Identifier.h>
+
+int
+SABP_Message_Identifier_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 16l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Message_Identifier_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+SABP_Message_Identifier_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Message_Identifier_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Message_Identifier_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Message_Identifier_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Message_Identifier_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Message_Identifier_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Message_Identifier_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Message_Identifier_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Message_Identifier_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Message_Identifier_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Message_Identifier_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Message_Identifier_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  16l,  16l }	/* (SIZE(16..16)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Message_Identifier_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Message_Identifier = {
+	"SABP_Message-Identifier",
+	"SABP_Message-Identifier",
+	SABP_Message_Identifier_free,
+	SABP_Message_Identifier_print,
+	SABP_Message_Identifier_constraint,
+	SABP_Message_Identifier_decode_ber,
+	SABP_Message_Identifier_encode_der,
+	SABP_Message_Identifier_decode_xer,
+	SABP_Message_Identifier_encode_xer,
+	SABP_Message_Identifier_decode_uper,
+	SABP_Message_Identifier_encode_uper,
+	SABP_Message_Identifier_decode_aper,
+	SABP_Message_Identifier_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Message_Identifier_tags_1,
+	sizeof(asn_DEF_SABP_Message_Identifier_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Identifier_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Message_Identifier_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Message_Identifier_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Identifier_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Message_Identifier_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Message-Status-Query-Complete.c b/src/sabp/SABP_Message-Status-Query-Complete.c
new file mode 100644
index 0000000..dd222e0
--- /dev/null
+++ b/src/sabp/SABP_Message-Status-Query-Complete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Message-Status-Query-Complete.h>
+
+static int
+memb_message_Status_Query_Complete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_message_Status_Query_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_message_Status_Query_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_message_Status_Query_Complete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_message_Status_Query_Complete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_message_Status_Query_Complete_ies_specs_2 = {
+	sizeof(struct message_Status_Query_Complete_ies),
+	offsetof(struct message_Status_Query_Complete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_message_Status_Query_Complete_ies_2 = {
+	"message-Status-Query-Complete-ies",
+	"message-Status-Query-Complete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_message_Status_Query_Complete_ies_tags_2,
+	sizeof(asn_DEF_message_Status_Query_Complete_ies_tags_2)
+		/sizeof(asn_DEF_message_Status_Query_Complete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_message_Status_Query_Complete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_message_Status_Query_Complete_ies_tags_2)
+		/sizeof(asn_DEF_message_Status_Query_Complete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_message_Status_Query_Complete_ies_constr_2,
+	asn_MBR_message_Status_Query_Complete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_message_Status_Query_Complete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Message_Status_Query_Complete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Message_Status_Query_Complete, message_Status_Query_Complete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_message_Status_Query_Complete_ies_2,
+		memb_message_Status_Query_Complete_ies_constraint_1,
+		&asn_PER_memb_message_Status_Query_Complete_ies_constr_2,
+		0,
+		"message-Status-Query-Complete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Message_Status_Query_Complete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Message_Status_Query_Complete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* message-Status-Query-Complete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Message_Status_Query_Complete_specs_1 = {
+	sizeof(struct SABP_Message_Status_Query_Complete),
+	offsetof(struct SABP_Message_Status_Query_Complete, _asn_ctx),
+	asn_MAP_SABP_Message_Status_Query_Complete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Message_Status_Query_Complete = {
+	"SABP_Message-Status-Query-Complete",
+	"SABP_Message-Status-Query-Complete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Message_Status_Query_Complete_tags_1,
+	sizeof(asn_DEF_SABP_Message_Status_Query_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Status_Query_Complete_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Message_Status_Query_Complete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Message_Status_Query_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Status_Query_Complete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Message_Status_Query_Complete_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Message_Status_Query_Complete_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Message-Status-Query-Failure.c b/src/sabp/SABP_Message-Status-Query-Failure.c
new file mode 100644
index 0000000..4a42757
--- /dev/null
+++ b/src/sabp/SABP_Message-Status-Query-Failure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Message-Status-Query-Failure.h>
+
+static int
+memb_message_Status_Query_Failure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_message_Status_Query_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_message_Status_Query_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_message_Status_Query_Failure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_message_Status_Query_Failure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_message_Status_Query_Failure_ies_specs_2 = {
+	sizeof(struct message_Status_Query_Failure_ies),
+	offsetof(struct message_Status_Query_Failure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_message_Status_Query_Failure_ies_2 = {
+	"message-Status-Query-Failure-ies",
+	"message-Status-Query-Failure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_message_Status_Query_Failure_ies_tags_2,
+	sizeof(asn_DEF_message_Status_Query_Failure_ies_tags_2)
+		/sizeof(asn_DEF_message_Status_Query_Failure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_message_Status_Query_Failure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_message_Status_Query_Failure_ies_tags_2)
+		/sizeof(asn_DEF_message_Status_Query_Failure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_message_Status_Query_Failure_ies_constr_2,
+	asn_MBR_message_Status_Query_Failure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_message_Status_Query_Failure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Message_Status_Query_Failure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Message_Status_Query_Failure, message_Status_Query_Failure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_message_Status_Query_Failure_ies_2,
+		memb_message_Status_Query_Failure_ies_constraint_1,
+		&asn_PER_memb_message_Status_Query_Failure_ies_constr_2,
+		0,
+		"message-Status-Query-Failure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Message_Status_Query_Failure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Message_Status_Query_Failure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* message-Status-Query-Failure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Message_Status_Query_Failure_specs_1 = {
+	sizeof(struct SABP_Message_Status_Query_Failure),
+	offsetof(struct SABP_Message_Status_Query_Failure, _asn_ctx),
+	asn_MAP_SABP_Message_Status_Query_Failure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Message_Status_Query_Failure = {
+	"SABP_Message-Status-Query-Failure",
+	"SABP_Message-Status-Query-Failure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Message_Status_Query_Failure_tags_1,
+	sizeof(asn_DEF_SABP_Message_Status_Query_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Status_Query_Failure_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Message_Status_Query_Failure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Message_Status_Query_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Status_Query_Failure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Message_Status_Query_Failure_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Message_Status_Query_Failure_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Message-Status-Query.c b/src/sabp/SABP_Message-Status-Query.c
new file mode 100644
index 0000000..8055733
--- /dev/null
+++ b/src/sabp/SABP_Message-Status-Query.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Message-Status-Query.h>
+
+static int
+memb_message_Status_Query_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_message_Status_Query_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_message_Status_Query_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_message_Status_Query_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_message_Status_Query_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_message_Status_Query_ies_specs_2 = {
+	sizeof(struct message_Status_Query_ies),
+	offsetof(struct message_Status_Query_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_message_Status_Query_ies_2 = {
+	"message-Status-Query-ies",
+	"message-Status-Query-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_message_Status_Query_ies_tags_2,
+	sizeof(asn_DEF_message_Status_Query_ies_tags_2)
+		/sizeof(asn_DEF_message_Status_Query_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_message_Status_Query_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_message_Status_Query_ies_tags_2)
+		/sizeof(asn_DEF_message_Status_Query_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_message_Status_Query_ies_constr_2,
+	asn_MBR_message_Status_Query_ies_2,
+	1,	/* Single element */
+	&asn_SPC_message_Status_Query_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Message_Status_Query_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Message_Status_Query, message_Status_Query_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_message_Status_Query_ies_2,
+		memb_message_Status_Query_ies_constraint_1,
+		&asn_PER_memb_message_Status_Query_ies_constr_2,
+		0,
+		"message-Status-Query-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Message_Status_Query_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Message_Status_Query_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* message-Status-Query-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Message_Status_Query_specs_1 = {
+	sizeof(struct SABP_Message_Status_Query),
+	offsetof(struct SABP_Message_Status_Query, _asn_ctx),
+	asn_MAP_SABP_Message_Status_Query_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Message_Status_Query = {
+	"SABP_Message-Status-Query",
+	"SABP_Message-Status-Query",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Message_Status_Query_tags_1,
+	sizeof(asn_DEF_SABP_Message_Status_Query_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Status_Query_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Message_Status_Query_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Message_Status_Query_tags_1)
+		/sizeof(asn_DEF_SABP_Message_Status_Query_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Message_Status_Query_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Message_Status_Query_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_MessageStructure.c b/src/sabp/SABP_MessageStructure.c
new file mode 100644
index 0000000..db4c0d6
--- /dev/null
+++ b/src/sabp/SABP_MessageStructure.c
@@ -0,0 +1,135 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_MessageStructure.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_MessageStructure_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (SIZE(1..256)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_MemberA_2[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct MemberA, iE_ID),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_ProtocolIE_ID,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-ID"
+		},
+	{ ATF_POINTER, 2, offsetof(struct MemberA, repetitionNumber),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_RepetitionNumber1,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"repetitionNumber"
+		},
+	{ ATF_POINTER, 1, offsetof(struct MemberA, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_MemberA_oms_2[] = { 1, 2 };
+static const ber_tlv_tag_t asn_DEF_MemberA_tags_2[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_MemberA_tag2el_2[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* iE-ID */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* repetitionNumber */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_MemberA_specs_2 = {
+	sizeof(struct MemberA),
+	offsetof(struct MemberA, _asn_ctx),
+	asn_MAP_MemberA_tag2el_2,
+	3,	/* Count of tags in the map */
+	asn_MAP_MemberA_oms_2,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_MemberA_2 = {
+	"SEQUENCE",
+	"SEQUENCE",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_MemberA_tags_2,
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	asn_DEF_MemberA_tags_2,	/* Same as above */
+	sizeof(asn_DEF_MemberA_tags_2)
+		/sizeof(asn_DEF_MemberA_tags_2[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_MemberA_2,
+	3,	/* Elements count */
+	&asn_SPC_MemberA_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_MessageStructure_1[] = {
+	{ ATF_POINTER, 0, 0,
+		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
+		0,
+		&asn_DEF_MemberA_2,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_MessageStructure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_SABP_MessageStructure_specs_1 = {
+	sizeof(struct SABP_MessageStructure),
+	offsetof(struct SABP_MessageStructure, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_MessageStructure = {
+	"SABP_MessageStructure",
+	"SABP_MessageStructure",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_MessageStructure_tags_1,
+	sizeof(asn_DEF_SABP_MessageStructure_tags_1)
+		/sizeof(asn_DEF_SABP_MessageStructure_tags_1[0]), /* 1 */
+	asn_DEF_SABP_MessageStructure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_MessageStructure_tags_1)
+		/sizeof(asn_DEF_SABP_MessageStructure_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_MessageStructure_constr_1,
+	asn_MBR_SABP_MessageStructure_1,
+	1,	/* Single element */
+	&asn_SPC_SABP_MessageStructure_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_New-Serial-Number.c b/src/sabp/SABP_New-Serial-Number.c
new file mode 100644
index 0000000..e279250
--- /dev/null
+++ b/src/sabp/SABP_New-Serial-Number.c
@@ -0,0 +1,157 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_New-Serial-Number.h>
+
+int
+SABP_New_Serial_Number_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_SABP_Serial_Number.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using SABP_Serial_Number,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_New_Serial_Number_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_SABP_Serial_Number.free_struct;
+	td->print_struct   = asn_DEF_SABP_Serial_Number.print_struct;
+	td->check_constraints = asn_DEF_SABP_Serial_Number.check_constraints;
+	td->ber_decoder    = asn_DEF_SABP_Serial_Number.ber_decoder;
+	td->der_encoder    = asn_DEF_SABP_Serial_Number.der_encoder;
+	td->xer_decoder    = asn_DEF_SABP_Serial_Number.xer_decoder;
+	td->xer_encoder    = asn_DEF_SABP_Serial_Number.xer_encoder;
+	td->uper_decoder   = asn_DEF_SABP_Serial_Number.uper_decoder;
+	td->uper_encoder   = asn_DEF_SABP_Serial_Number.uper_encoder;
+	td->aper_decoder   = asn_DEF_SABP_Serial_Number.aper_decoder;
+	td->aper_encoder   = asn_DEF_SABP_Serial_Number.aper_encoder;
+	/* The next four lines are here because of -fknown-extern-type */
+	td->tags           = asn_DEF_SABP_Serial_Number.tags;
+	td->tags_count     = asn_DEF_SABP_Serial_Number.tags_count;
+	td->all_tags       = asn_DEF_SABP_Serial_Number.all_tags;
+	td->all_tags_count = asn_DEF_SABP_Serial_Number.all_tags_count;
+	/* End of these lines */
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_SABP_Serial_Number.per_constraints;
+	td->elements       = asn_DEF_SABP_Serial_Number.elements;
+	td->elements_count = asn_DEF_SABP_Serial_Number.elements_count;
+	td->specifics      = asn_DEF_SABP_Serial_Number.specifics;
+}
+
+void
+SABP_New_Serial_Number_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_New_Serial_Number_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_New_Serial_Number_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_New_Serial_Number_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_New_Serial_Number_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_New_Serial_Number_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_New_Serial_Number_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_New_Serial_Number_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_New_Serial_Number_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_New_Serial_Number_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_New_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_TYPE_descriptor_t asn_DEF_SABP_New_Serial_Number = {
+	"SABP_New-Serial-Number",
+	"SABP_New-Serial-Number",
+	SABP_New_Serial_Number_free,
+	SABP_New_Serial_Number_print,
+	SABP_New_Serial_Number_constraint,
+	SABP_New_Serial_Number_decode_ber,
+	SABP_New_Serial_Number_encode_der,
+	SABP_New_Serial_Number_decode_xer,
+	SABP_New_Serial_Number_encode_xer,
+	SABP_New_Serial_Number_decode_uper,
+	SABP_New_Serial_Number_encode_uper,
+	SABP_New_Serial_Number_decode_aper,
+	SABP_New_Serial_Number_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Number-Of-Broadcasts-Completed-Info.c b/src/sabp/SABP_Number-Of-Broadcasts-Completed-Info.c
new file mode 100644
index 0000000..19dab85
--- /dev/null
+++ b/src/sabp/SABP_Number-Of-Broadcasts-Completed-Info.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Number-Of-Broadcasts-Completed-Info.h>
+
+int
+SABP_Number_Of_Broadcasts_Completed_Info_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_Number_Of_Broadcasts_Completed_Info_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Number_Of_Broadcasts_Completed_Info_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Number_Of_Broadcasts_Completed_Info_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Number_Of_Broadcasts_Completed_Info_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Number_Of_Broadcasts_Completed_Info_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_Number_Of_Broadcasts_Completed_Info_value2enum_1[] = {
+	{ 0,	8,	"overflow" },
+	{ 1,	7,	"unknown" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_SABP_Number_Of_Broadcasts_Completed_Info_enum2value_1[] = {
+	0,	/* overflow(0) */
+	1	/* unknown(1) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_Number_Of_Broadcasts_Completed_Info_specs_1 = {
+	asn_MAP_SABP_Number_Of_Broadcasts_Completed_Info_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_Number_Of_Broadcasts_Completed_Info_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info = {
+	"SABP_Number-Of-Broadcasts-Completed-Info",
+	"SABP_Number-Of-Broadcasts-Completed-Info",
+	SABP_Number_Of_Broadcasts_Completed_Info_free,
+	SABP_Number_Of_Broadcasts_Completed_Info_print,
+	SABP_Number_Of_Broadcasts_Completed_Info_constraint,
+	SABP_Number_Of_Broadcasts_Completed_Info_decode_ber,
+	SABP_Number_Of_Broadcasts_Completed_Info_encode_der,
+	SABP_Number_Of_Broadcasts_Completed_Info_decode_xer,
+	SABP_Number_Of_Broadcasts_Completed_Info_encode_xer,
+	SABP_Number_Of_Broadcasts_Completed_Info_decode_uper,
+	SABP_Number_Of_Broadcasts_Completed_Info_encode_uper,
+	SABP_Number_Of_Broadcasts_Completed_Info_decode_aper,
+	SABP_Number_Of_Broadcasts_Completed_Info_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info_tags_1,
+	sizeof(asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info_tags_1)
+		/sizeof(asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info_tags_1)
+		/sizeof(asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Number_Of_Broadcasts_Completed_Info_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_Number_Of_Broadcasts_Completed_Info_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Number-of-Broadcasts-Completed-List-Item.c b/src/sabp/SABP_Number-of-Broadcasts-Completed-List-Item.c
new file mode 100644
index 0000000..77075e3
--- /dev/null
+++ b/src/sabp/SABP_Number-of-Broadcasts-Completed-List-Item.c
@@ -0,0 +1,123 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Number-of-Broadcasts-Completed-List-Item.h>
+
+static int
+memb_number_of_broadcasts_completed_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_number_of_broadcasts_completed_constr_3 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_Number_of_Broadcasts_Completed_List_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Number_of_Broadcasts_Completed_List_Item, service_area_identifier),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Service_Area_Identifier,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"service-area-identifier"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Number_of_Broadcasts_Completed_List_Item, number_of_broadcasts_completed),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_NativeInteger,
+		memb_number_of_broadcasts_completed_constraint_1,
+		&asn_PER_memb_number_of_broadcasts_completed_constr_3,
+		0,
+		"number-of-broadcasts-completed"
+		},
+	{ ATF_POINTER, 2, offsetof(struct SABP_Number_of_Broadcasts_Completed_List_Item, number_of_broadcasts_completed_info),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Number_Of_Broadcasts_Completed_Info,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"number-of-broadcasts-completed-info"
+		},
+	{ ATF_POINTER, 1, offsetof(struct SABP_Number_of_Broadcasts_Completed_List_Item, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_SABP_Number_of_Broadcasts_Completed_List_Item_oms_1[] = { 2, 3 };
+static const ber_tlv_tag_t asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Number_of_Broadcasts_Completed_List_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* service-area-identifier */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* number-of-broadcasts-completed */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* number-of-broadcasts-completed-info */
+    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Number_of_Broadcasts_Completed_List_Item_specs_1 = {
+	sizeof(struct SABP_Number_of_Broadcasts_Completed_List_Item),
+	offsetof(struct SABP_Number_of_Broadcasts_Completed_List_Item, _asn_ctx),
+	asn_MAP_SABP_Number_of_Broadcasts_Completed_List_Item_tag2el_1,
+	4,	/* Count of tags in the map */
+	asn_MAP_SABP_Number_of_Broadcasts_Completed_List_Item_oms_1,	/* Optional members */
+	2, 0,	/* Root/Additions */
+	3,	/* Start extensions */
+	5	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item = {
+	"SABP_Number-of-Broadcasts-Completed-List-Item",
+	"SABP_Number-of-Broadcasts-Completed-List-Item",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item_tags_1,
+	sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item_tags_1)
+		/sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item_tags_1)
+		/sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Number_of_Broadcasts_Completed_List_Item_1,
+	4,	/* Elements count */
+	&asn_SPC_SABP_Number_of_Broadcasts_Completed_List_Item_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Number-of-Broadcasts-Completed-List.c b/src/sabp/SABP_Number-of-Broadcasts-Completed-List.c
new file mode 100644
index 0000000..56ea92a
--- /dev/null
+++ b/src/sabp/SABP_Number-of-Broadcasts-Completed-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Number-of-Broadcasts-Completed-List.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_Number_of_Broadcasts_Completed_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  1l,  65535l }	/* (SIZE(1..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_Number_of_Broadcasts_Completed_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_Number_of_Broadcasts_Completed_List_Item,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Number_of_Broadcasts_Completed_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_SABP_Number_of_Broadcasts_Completed_List_specs_1 = {
+	sizeof(struct SABP_Number_of_Broadcasts_Completed_List),
+	offsetof(struct SABP_Number_of_Broadcasts_Completed_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Number_of_Broadcasts_Completed_List = {
+	"SABP_Number-of-Broadcasts-Completed-List",
+	"SABP_Number-of-Broadcasts-Completed-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Number_of_Broadcasts_Completed_List_tags_1,
+	sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_tags_1)
+		/sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Number_of_Broadcasts_Completed_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_tags_1)
+		/sizeof(asn_DEF_SABP_Number_of_Broadcasts_Completed_List_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Number_of_Broadcasts_Completed_List_constr_1,
+	asn_MBR_SABP_Number_of_Broadcasts_Completed_List_1,
+	1,	/* Single element */
+	&asn_SPC_SABP_Number_of_Broadcasts_Completed_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Number-of-Broadcasts-Requested.c b/src/sabp/SABP_Number-of-Broadcasts-Requested.c
new file mode 100644
index 0000000..10654a0
--- /dev/null
+++ b/src/sabp/SABP_Number-of-Broadcasts-Requested.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Number-of-Broadcasts-Requested.h>
+
+int
+SABP_Number_of_Broadcasts_Requested_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_Number_of_Broadcasts_Requested_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Number_of_Broadcasts_Requested_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Number_of_Broadcasts_Requested_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Number_of_Broadcasts_Requested_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Number_of_Broadcasts_Requested_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Number_of_Broadcasts_Requested_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Number_of_Broadcasts_Requested_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Number_of_Broadcasts_Requested_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Number_of_Broadcasts_Requested_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Number_of_Broadcasts_Requested_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Number_of_Broadcasts_Requested_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Number_of_Broadcasts_Requested_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Number_of_Broadcasts_Requested_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Number_of_Broadcasts_Requested = {
+	"SABP_Number-of-Broadcasts-Requested",
+	"SABP_Number-of-Broadcasts-Requested",
+	SABP_Number_of_Broadcasts_Requested_free,
+	SABP_Number_of_Broadcasts_Requested_print,
+	SABP_Number_of_Broadcasts_Requested_constraint,
+	SABP_Number_of_Broadcasts_Requested_decode_ber,
+	SABP_Number_of_Broadcasts_Requested_encode_der,
+	SABP_Number_of_Broadcasts_Requested_decode_xer,
+	SABP_Number_of_Broadcasts_Requested_encode_xer,
+	SABP_Number_of_Broadcasts_Requested_decode_uper,
+	SABP_Number_of_Broadcasts_Requested_encode_uper,
+	SABP_Number_of_Broadcasts_Requested_decode_aper,
+	SABP_Number_of_Broadcasts_Requested_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Number_of_Broadcasts_Requested_tags_1,
+	sizeof(asn_DEF_SABP_Number_of_Broadcasts_Requested_tags_1)
+		/sizeof(asn_DEF_SABP_Number_of_Broadcasts_Requested_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Number_of_Broadcasts_Requested_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Number_of_Broadcasts_Requested_tags_1)
+		/sizeof(asn_DEF_SABP_Number_of_Broadcasts_Requested_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Number_of_Broadcasts_Requested_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Old-Serial-Number.c b/src/sabp/SABP_Old-Serial-Number.c
new file mode 100644
index 0000000..53766aa
--- /dev/null
+++ b/src/sabp/SABP_Old-Serial-Number.c
@@ -0,0 +1,157 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Old-Serial-Number.h>
+
+int
+SABP_Old_Serial_Number_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	
+	if(1 /* No applicable constraints whatsoever */) {
+		/* Nothing is here. See below */
+	}
+	
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_SABP_Serial_Number.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using SABP_Serial_Number,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_SABP_Serial_Number.free_struct;
+	td->print_struct   = asn_DEF_SABP_Serial_Number.print_struct;
+	td->check_constraints = asn_DEF_SABP_Serial_Number.check_constraints;
+	td->ber_decoder    = asn_DEF_SABP_Serial_Number.ber_decoder;
+	td->der_encoder    = asn_DEF_SABP_Serial_Number.der_encoder;
+	td->xer_decoder    = asn_DEF_SABP_Serial_Number.xer_decoder;
+	td->xer_encoder    = asn_DEF_SABP_Serial_Number.xer_encoder;
+	td->uper_decoder   = asn_DEF_SABP_Serial_Number.uper_decoder;
+	td->uper_encoder   = asn_DEF_SABP_Serial_Number.uper_encoder;
+	td->aper_decoder   = asn_DEF_SABP_Serial_Number.aper_decoder;
+	td->aper_encoder   = asn_DEF_SABP_Serial_Number.aper_encoder;
+	/* The next four lines are here because of -fknown-extern-type */
+	td->tags           = asn_DEF_SABP_Serial_Number.tags;
+	td->tags_count     = asn_DEF_SABP_Serial_Number.tags_count;
+	td->all_tags       = asn_DEF_SABP_Serial_Number.all_tags;
+	td->all_tags_count = asn_DEF_SABP_Serial_Number.all_tags_count;
+	/* End of these lines */
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_SABP_Serial_Number.per_constraints;
+	td->elements       = asn_DEF_SABP_Serial_Number.elements;
+	td->elements_count = asn_DEF_SABP_Serial_Number.elements_count;
+	td->specifics      = asn_DEF_SABP_Serial_Number.specifics;
+}
+
+void
+SABP_Old_Serial_Number_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Old_Serial_Number_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Old_Serial_Number_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Old_Serial_Number_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Old_Serial_Number_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Old_Serial_Number_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Old_Serial_Number_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Old_Serial_Number_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Old_Serial_Number_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Old_Serial_Number_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Old_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_TYPE_descriptor_t asn_DEF_SABP_Old_Serial_Number = {
+	"SABP_Old-Serial-Number",
+	"SABP_Old-Serial-Number",
+	SABP_Old_Serial_Number_free,
+	SABP_Old_Serial_Number_print,
+	SABP_Old_Serial_Number_constraint,
+	SABP_Old_Serial_Number_decode_ber,
+	SABP_Old_Serial_Number_encode_der,
+	SABP_Old_Serial_Number_decode_xer,
+	SABP_Old_Serial_Number_encode_xer,
+	SABP_Old_Serial_Number_decode_uper,
+	SABP_Old_Serial_Number_encode_uper,
+	SABP_Old_Serial_Number_decode_aper,
+	SABP_Old_Serial_Number_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	0,	/* No PER visible constraints */
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Paging-ETWS-Indicator.c b/src/sabp/SABP_Paging-ETWS-Indicator.c
new file mode 100644
index 0000000..056ec17
--- /dev/null
+++ b/src/sabp/SABP_Paging-ETWS-Indicator.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Paging-ETWS-Indicator.h>
+
+int
+SABP_Paging_ETWS_Indicator_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_Paging_ETWS_Indicator_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Paging_ETWS_Indicator_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Paging_ETWS_Indicator_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Paging_ETWS_Indicator_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Paging_ETWS_Indicator_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Paging_ETWS_Indicator_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Paging_ETWS_Indicator_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Paging_ETWS_Indicator_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Paging_ETWS_Indicator_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Paging_ETWS_Indicator_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Paging_ETWS_Indicator_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Paging_ETWS_Indicator_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  0,  0,  0l,  0l }	/* (0..0,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_Paging_ETWS_Indicator_value2enum_1[] = {
+	{ 0,	6,	"paging" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_SABP_Paging_ETWS_Indicator_enum2value_1[] = {
+	0	/* paging(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_Paging_ETWS_Indicator_specs_1 = {
+	asn_MAP_SABP_Paging_ETWS_Indicator_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_Paging_ETWS_Indicator_enum2value_1,	/* N => "tag"; sorted by N */
+	1,	/* Number of elements in the maps */
+	2,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Paging_ETWS_Indicator_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Paging_ETWS_Indicator = {
+	"SABP_Paging-ETWS-Indicator",
+	"SABP_Paging-ETWS-Indicator",
+	SABP_Paging_ETWS_Indicator_free,
+	SABP_Paging_ETWS_Indicator_print,
+	SABP_Paging_ETWS_Indicator_constraint,
+	SABP_Paging_ETWS_Indicator_decode_ber,
+	SABP_Paging_ETWS_Indicator_encode_der,
+	SABP_Paging_ETWS_Indicator_decode_xer,
+	SABP_Paging_ETWS_Indicator_encode_xer,
+	SABP_Paging_ETWS_Indicator_decode_uper,
+	SABP_Paging_ETWS_Indicator_encode_uper,
+	SABP_Paging_ETWS_Indicator_decode_aper,
+	SABP_Paging_ETWS_Indicator_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Paging_ETWS_Indicator_tags_1,
+	sizeof(asn_DEF_SABP_Paging_ETWS_Indicator_tags_1)
+		/sizeof(asn_DEF_SABP_Paging_ETWS_Indicator_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Paging_ETWS_Indicator_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Paging_ETWS_Indicator_tags_1)
+		/sizeof(asn_DEF_SABP_Paging_ETWS_Indicator_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Paging_ETWS_Indicator_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_Paging_ETWS_Indicator_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Presence.c b/src/sabp/SABP_Presence.c
new file mode 100644
index 0000000..c63bdd9
--- /dev/null
+++ b/src/sabp/SABP_Presence.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-CommonDataTypes"
+ * 	found in "../../asn1/sabp/SABP-CommonDataTypes.asn"
+ */
+
+#include <osmocom/sabp/SABP_Presence.h>
+
+int
+SABP_Presence_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Presence_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_Presence_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Presence_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Presence_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Presence_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Presence_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Presence_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Presence_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Presence_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Presence_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Presence_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Presence_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Presence_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  2l }	/* (0..2) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_Presence_value2enum_1[] = {
+	{ 0,	8,	"optional" },
+	{ 1,	11,	"conditional" },
+	{ 2,	9,	"mandatory" }
+};
+static const unsigned int asn_MAP_SABP_Presence_enum2value_1[] = {
+	1,	/* conditional(1) */
+	2,	/* mandatory(2) */
+	0	/* optional(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_Presence_specs_1 = {
+	asn_MAP_SABP_Presence_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_Presence_enum2value_1,	/* N => "tag"; sorted by N */
+	3,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Presence_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Presence = {
+	"SABP_Presence",
+	"SABP_Presence",
+	SABP_Presence_free,
+	SABP_Presence_print,
+	SABP_Presence_constraint,
+	SABP_Presence_decode_ber,
+	SABP_Presence_encode_der,
+	SABP_Presence_decode_xer,
+	SABP_Presence_encode_xer,
+	SABP_Presence_decode_uper,
+	SABP_Presence_encode_uper,
+	SABP_Presence_decode_aper,
+	SABP_Presence_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Presence_tags_1,
+	sizeof(asn_DEF_SABP_Presence_tags_1)
+		/sizeof(asn_DEF_SABP_Presence_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Presence_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Presence_tags_1)
+		/sizeof(asn_DEF_SABP_Presence_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Presence_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_Presence_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_ProcedureCode.c b/src/sabp/SABP_ProcedureCode.c
new file mode 100644
index 0000000..50b962d
--- /dev/null
+++ b/src/sabp/SABP_ProcedureCode.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-CommonDataTypes"
+ * 	found in "../../asn1/sabp/SABP-CommonDataTypes.asn"
+ */
+
+#include <osmocom/sabp/SABP_ProcedureCode.h>
+
+int
+SABP_ProcedureCode_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_ProcedureCode_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_ProcedureCode_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_ProcedureCode_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProcedureCode_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_ProcedureCode_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProcedureCode_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_ProcedureCode_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProcedureCode_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_ProcedureCode_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_ProcedureCode_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_ProcedureCode_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_ProcedureCode_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_ProcedureCode_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_ProcedureCode_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_ProcedureCode = {
+	"SABP_ProcedureCode",
+	"SABP_ProcedureCode",
+	SABP_ProcedureCode_free,
+	SABP_ProcedureCode_print,
+	SABP_ProcedureCode_constraint,
+	SABP_ProcedureCode_decode_ber,
+	SABP_ProcedureCode_encode_der,
+	SABP_ProcedureCode_decode_xer,
+	SABP_ProcedureCode_encode_xer,
+	SABP_ProcedureCode_decode_uper,
+	SABP_ProcedureCode_encode_uper,
+	SABP_ProcedureCode_decode_aper,
+	SABP_ProcedureCode_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_ProcedureCode_tags_1,
+	sizeof(asn_DEF_SABP_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_SABP_ProcedureCode_tags_1[0]), /* 1 */
+	asn_DEF_SABP_ProcedureCode_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_ProcedureCode_tags_1)
+		/sizeof(asn_DEF_SABP_ProcedureCode_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_ProcedureCode_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_ProtocolExtensionID.c b/src/sabp/SABP_ProtocolExtensionID.c
new file mode 100644
index 0000000..f4d6752
--- /dev/null
+++ b/src/sabp/SABP_ProtocolExtensionID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-CommonDataTypes"
+ * 	found in "../../asn1/sabp/SABP-CommonDataTypes.asn"
+ */
+
+#include <osmocom/sabp/SABP_ProtocolExtensionID.h>
+
+int
+SABP_ProtocolExtensionID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_ProtocolExtensionID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_ProtocolExtensionID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProtocolExtensionID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_ProtocolExtensionID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProtocolExtensionID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_ProtocolExtensionID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProtocolExtensionID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_ProtocolExtensionID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_ProtocolExtensionID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_ProtocolExtensionID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_ProtocolExtensionID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_ProtocolExtensionID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_ProtocolExtensionID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_ProtocolExtensionID = {
+	"SABP_ProtocolExtensionID",
+	"SABP_ProtocolExtensionID",
+	SABP_ProtocolExtensionID_free,
+	SABP_ProtocolExtensionID_print,
+	SABP_ProtocolExtensionID_constraint,
+	SABP_ProtocolExtensionID_decode_ber,
+	SABP_ProtocolExtensionID_encode_der,
+	SABP_ProtocolExtensionID_decode_xer,
+	SABP_ProtocolExtensionID_encode_xer,
+	SABP_ProtocolExtensionID_decode_uper,
+	SABP_ProtocolExtensionID_encode_uper,
+	SABP_ProtocolExtensionID_decode_aper,
+	SABP_ProtocolExtensionID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_ProtocolExtensionID_tags_1,
+	sizeof(asn_DEF_SABP_ProtocolExtensionID_tags_1)
+		/sizeof(asn_DEF_SABP_ProtocolExtensionID_tags_1[0]), /* 1 */
+	asn_DEF_SABP_ProtocolExtensionID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_ProtocolExtensionID_tags_1)
+		/sizeof(asn_DEF_SABP_ProtocolExtensionID_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_ProtocolExtensionID_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_ProtocolIE-ID.c b/src/sabp/SABP_ProtocolIE-ID.c
new file mode 100644
index 0000000..a3b013a
--- /dev/null
+++ b/src/sabp/SABP_ProtocolIE-ID.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-CommonDataTypes"
+ * 	found in "../../asn1/sabp/SABP-CommonDataTypes.asn"
+ */
+
+#include <osmocom/sabp/SABP_ProtocolIE-ID.h>
+
+int
+SABP_ProtocolIE_ID_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 65535l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_ProtocolIE_ID_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_ProtocolIE_ID_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProtocolIE_ID_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_ProtocolIE_ID_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProtocolIE_ID_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_ProtocolIE_ID_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_ProtocolIE_ID_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_ProtocolIE_ID_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_ProtocolIE_ID_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_ProtocolIE_ID_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_ProtocolIE_ID_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_ProtocolIE_ID_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (0..65535) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_ProtocolIE_ID_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_ProtocolIE_ID = {
+	"SABP_ProtocolIE-ID",
+	"SABP_ProtocolIE-ID",
+	SABP_ProtocolIE_ID_free,
+	SABP_ProtocolIE_ID_print,
+	SABP_ProtocolIE_ID_constraint,
+	SABP_ProtocolIE_ID_decode_ber,
+	SABP_ProtocolIE_ID_encode_der,
+	SABP_ProtocolIE_ID_decode_xer,
+	SABP_ProtocolIE_ID_encode_xer,
+	SABP_ProtocolIE_ID_decode_uper,
+	SABP_ProtocolIE_ID_encode_uper,
+	SABP_ProtocolIE_ID_decode_aper,
+	SABP_ProtocolIE_ID_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_ProtocolIE_ID_tags_1,
+	sizeof(asn_DEF_SABP_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_SABP_ProtocolIE_ID_tags_1[0]), /* 1 */
+	asn_DEF_SABP_ProtocolIE_ID_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_ProtocolIE_ID_tags_1)
+		/sizeof(asn_DEF_SABP_ProtocolIE_ID_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_ProtocolIE_ID_constr_1,
+	0, 0,	/* Defined elsewhere */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Radio-Resource-Loading-List-Item.c b/src/sabp/SABP_Radio-Resource-Loading-List-Item.c
new file mode 100644
index 0000000..a7837f2
--- /dev/null
+++ b/src/sabp/SABP_Radio-Resource-Loading-List-Item.c
@@ -0,0 +1,83 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Radio-Resource-Loading-List-Item.h>
+
+static asn_TYPE_member_t asn_MBR_SABP_Radio_Resource_Loading_List_Item_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Radio_Resource_Loading_List_Item, service_area_identifier),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Service_Area_Identifier,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"service-area-identifier"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Radio_Resource_Loading_List_Item, available_bandwidth),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Available_Bandwidth,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"available-bandwidth"
+		},
+	{ ATF_POINTER, 1, offsetof(struct SABP_Radio_Resource_Loading_List_Item, iE_Extensions),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_IE_Extensions,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"iE-Extensions"
+		},
+};
+static const int asn_MAP_SABP_Radio_Resource_Loading_List_Item_oms_1[] = { 2 };
+static const ber_tlv_tag_t asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Radio_Resource_Loading_List_Item_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* service-area-identifier */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* available-bandwidth */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* iE-Extensions */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Radio_Resource_Loading_List_Item_specs_1 = {
+	sizeof(struct SABP_Radio_Resource_Loading_List_Item),
+	offsetof(struct SABP_Radio_Resource_Loading_List_Item, _asn_ctx),
+	asn_MAP_SABP_Radio_Resource_Loading_List_Item_tag2el_1,
+	3,	/* Count of tags in the map */
+	asn_MAP_SABP_Radio_Resource_Loading_List_Item_oms_1,	/* Optional members */
+	1, 0,	/* Root/Additions */
+	2,	/* Start extensions */
+	4	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Radio_Resource_Loading_List_Item = {
+	"SABP_Radio-Resource-Loading-List-Item",
+	"SABP_Radio-Resource-Loading-List-Item",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1,
+	sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1)
+		/sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1)
+		/sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_Item_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Radio_Resource_Loading_List_Item_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_Radio_Resource_Loading_List_Item_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Radio-Resource-Loading-List.c b/src/sabp/SABP_Radio-Resource-Loading-List.c
new file mode 100644
index 0000000..6adbfc7
--- /dev/null
+++ b/src/sabp/SABP_Radio-Resource-Loading-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Radio-Resource-Loading-List.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_Radio_Resource_Loading_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  1l,  65535l }	/* (SIZE(1..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_Radio_Resource_Loading_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_Radio_Resource_Loading_List_Item,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Radio_Resource_Loading_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_SABP_Radio_Resource_Loading_List_specs_1 = {
+	sizeof(struct SABP_Radio_Resource_Loading_List),
+	offsetof(struct SABP_Radio_Resource_Loading_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Radio_Resource_Loading_List = {
+	"SABP_Radio-Resource-Loading-List",
+	"SABP_Radio-Resource-Loading-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Radio_Resource_Loading_List_tags_1,
+	sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_tags_1)
+		/sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Radio_Resource_Loading_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_tags_1)
+		/sizeof(asn_DEF_SABP_Radio_Resource_Loading_List_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Radio_Resource_Loading_List_constr_1,
+	asn_MBR_SABP_Radio_Resource_Loading_List_1,
+	1,	/* Single element */
+	&asn_SPC_SABP_Radio_Resource_Loading_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Recovery-Indication.c b/src/sabp/SABP_Recovery-Indication.c
new file mode 100644
index 0000000..e4c07e4
--- /dev/null
+++ b/src/sabp/SABP_Recovery-Indication.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Recovery-Indication.h>
+
+int
+SABP_Recovery_Indication_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Recovery_Indication_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_Recovery_Indication_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Recovery_Indication_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Recovery_Indication_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Recovery_Indication_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Recovery_Indication_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Recovery_Indication_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Recovery_Indication_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Recovery_Indication_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Recovery_Indication_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Recovery_Indication_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Recovery_Indication_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Recovery_Indication_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 1,  1,  0l,  1l }	/* (0..1) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_Recovery_Indication_value2enum_1[] = {
+	{ 0,	9,	"data-lost" },
+	{ 1,	14,	"data-available" }
+};
+static const unsigned int asn_MAP_SABP_Recovery_Indication_enum2value_1[] = {
+	1,	/* data-available(1) */
+	0	/* data-lost(0) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_Recovery_Indication_specs_1 = {
+	asn_MAP_SABP_Recovery_Indication_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_Recovery_Indication_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Recovery_Indication_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Recovery_Indication = {
+	"SABP_Recovery-Indication",
+	"SABP_Recovery-Indication",
+	SABP_Recovery_Indication_free,
+	SABP_Recovery_Indication_print,
+	SABP_Recovery_Indication_constraint,
+	SABP_Recovery_Indication_decode_ber,
+	SABP_Recovery_Indication_encode_der,
+	SABP_Recovery_Indication_decode_xer,
+	SABP_Recovery_Indication_encode_xer,
+	SABP_Recovery_Indication_decode_uper,
+	SABP_Recovery_Indication_encode_uper,
+	SABP_Recovery_Indication_decode_aper,
+	SABP_Recovery_Indication_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Recovery_Indication_tags_1,
+	sizeof(asn_DEF_SABP_Recovery_Indication_tags_1)
+		/sizeof(asn_DEF_SABP_Recovery_Indication_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Recovery_Indication_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Recovery_Indication_tags_1)
+		/sizeof(asn_DEF_SABP_Recovery_Indication_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Recovery_Indication_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_Recovery_Indication_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Repetition-Period.c b/src/sabp/SABP_Repetition-Period.c
new file mode 100644
index 0000000..2286dfc
--- /dev/null
+++ b/src/sabp/SABP_Repetition-Period.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Repetition-Period.h>
+
+int
+SABP_Repetition_Period_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 4096l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Repetition_Period_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_Repetition_Period_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Repetition_Period_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Repetition_Period_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Repetition_Period_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Repetition_Period_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Repetition_Period_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Repetition_Period_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Repetition_Period_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Repetition_Period_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Repetition_Period_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Repetition_Period_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Repetition_Period_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 12,  12,  1l,  4096l }	/* (1..4096) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Repetition_Period_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Repetition_Period = {
+	"SABP_Repetition-Period",
+	"SABP_Repetition-Period",
+	SABP_Repetition_Period_free,
+	SABP_Repetition_Period_print,
+	SABP_Repetition_Period_constraint,
+	SABP_Repetition_Period_decode_ber,
+	SABP_Repetition_Period_encode_der,
+	SABP_Repetition_Period_decode_xer,
+	SABP_Repetition_Period_encode_xer,
+	SABP_Repetition_Period_decode_uper,
+	SABP_Repetition_Period_encode_uper,
+	SABP_Repetition_Period_decode_aper,
+	SABP_Repetition_Period_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Repetition_Period_tags_1,
+	sizeof(asn_DEF_SABP_Repetition_Period_tags_1)
+		/sizeof(asn_DEF_SABP_Repetition_Period_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Repetition_Period_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Repetition_Period_tags_1)
+		/sizeof(asn_DEF_SABP_Repetition_Period_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Repetition_Period_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_RepetitionNumber0.c b/src/sabp/SABP_RepetitionNumber0.c
new file mode 100644
index 0000000..affee21
--- /dev/null
+++ b/src/sabp/SABP_RepetitionNumber0.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_RepetitionNumber0.h>
+
+int
+SABP_RepetitionNumber0_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 0l && value <= 255l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_RepetitionNumber0_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_RepetitionNumber0_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber0_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber0_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber0_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber0_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber0_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber0_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber0_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber0_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_RepetitionNumber0_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_RepetitionNumber0_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  0l,  255l }	/* (0..255) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_RepetitionNumber0_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_RepetitionNumber0 = {
+	"SABP_RepetitionNumber0",
+	"SABP_RepetitionNumber0",
+	SABP_RepetitionNumber0_free,
+	SABP_RepetitionNumber0_print,
+	SABP_RepetitionNumber0_constraint,
+	SABP_RepetitionNumber0_decode_ber,
+	SABP_RepetitionNumber0_encode_der,
+	SABP_RepetitionNumber0_decode_xer,
+	SABP_RepetitionNumber0_encode_xer,
+	SABP_RepetitionNumber0_decode_uper,
+	SABP_RepetitionNumber0_encode_uper,
+	SABP_RepetitionNumber0_decode_aper,
+	SABP_RepetitionNumber0_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_RepetitionNumber0_tags_1,
+	sizeof(asn_DEF_SABP_RepetitionNumber0_tags_1)
+		/sizeof(asn_DEF_SABP_RepetitionNumber0_tags_1[0]), /* 1 */
+	asn_DEF_SABP_RepetitionNumber0_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_RepetitionNumber0_tags_1)
+		/sizeof(asn_DEF_SABP_RepetitionNumber0_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_RepetitionNumber0_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_RepetitionNumber1.c b/src/sabp/SABP_RepetitionNumber1.c
new file mode 100644
index 0000000..d4209dd
--- /dev/null
+++ b/src/sabp/SABP_RepetitionNumber1.c
@@ -0,0 +1,165 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_RepetitionNumber1.h>
+
+int
+SABP_RepetitionNumber1_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	long value;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	value = *(const long *)sptr;
+	
+	if((value >= 1l && value <= 256l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using NativeInteger,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeInteger.free_struct;
+	td->print_struct   = asn_DEF_NativeInteger.print_struct;
+	td->check_constraints = asn_DEF_NativeInteger.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeInteger.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeInteger.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeInteger.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeInteger.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeInteger.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeInteger.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeInteger.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeInteger.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeInteger.per_constraints;
+	td->elements       = asn_DEF_NativeInteger.elements;
+	td->elements_count = asn_DEF_NativeInteger.elements_count;
+	td->specifics      = asn_DEF_NativeInteger.specifics;
+}
+
+void
+SABP_RepetitionNumber1_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_RepetitionNumber1_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber1_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber1_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber1_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber1_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber1_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber1_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_RepetitionNumber1_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_RepetitionNumber1_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_RepetitionNumber1_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_RepetitionNumber1_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 8,  8,  1l,  256l }	/* (1..256) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_RepetitionNumber1_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_RepetitionNumber1 = {
+	"SABP_RepetitionNumber1",
+	"SABP_RepetitionNumber1",
+	SABP_RepetitionNumber1_free,
+	SABP_RepetitionNumber1_print,
+	SABP_RepetitionNumber1_constraint,
+	SABP_RepetitionNumber1_decode_ber,
+	SABP_RepetitionNumber1_encode_der,
+	SABP_RepetitionNumber1_decode_xer,
+	SABP_RepetitionNumber1_encode_xer,
+	SABP_RepetitionNumber1_decode_uper,
+	SABP_RepetitionNumber1_encode_uper,
+	SABP_RepetitionNumber1_decode_aper,
+	SABP_RepetitionNumber1_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_RepetitionNumber1_tags_1,
+	sizeof(asn_DEF_SABP_RepetitionNumber1_tags_1)
+		/sizeof(asn_DEF_SABP_RepetitionNumber1_tags_1[0]), /* 1 */
+	asn_DEF_SABP_RepetitionNumber1_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_RepetitionNumber1_tags_1)
+		/sizeof(asn_DEF_SABP_RepetitionNumber1_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_RepetitionNumber1_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Reset-Complete.c b/src/sabp/SABP_Reset-Complete.c
new file mode 100644
index 0000000..849d3e2
--- /dev/null
+++ b/src/sabp/SABP_Reset-Complete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Reset-Complete.h>
+
+static int
+memb_reset_Complete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_reset_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_reset_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_reset_Complete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_reset_Complete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_reset_Complete_ies_specs_2 = {
+	sizeof(struct reset_Complete_ies),
+	offsetof(struct reset_Complete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_reset_Complete_ies_2 = {
+	"reset-Complete-ies",
+	"reset-Complete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_reset_Complete_ies_tags_2,
+	sizeof(asn_DEF_reset_Complete_ies_tags_2)
+		/sizeof(asn_DEF_reset_Complete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_reset_Complete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_reset_Complete_ies_tags_2)
+		/sizeof(asn_DEF_reset_Complete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_reset_Complete_ies_constr_2,
+	asn_MBR_reset_Complete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_reset_Complete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Reset_Complete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Reset_Complete, reset_Complete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_reset_Complete_ies_2,
+		memb_reset_Complete_ies_constraint_1,
+		&asn_PER_memb_reset_Complete_ies_constr_2,
+		0,
+		"reset-Complete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Reset_Complete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Reset_Complete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* reset-Complete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Reset_Complete_specs_1 = {
+	sizeof(struct SABP_Reset_Complete),
+	offsetof(struct SABP_Reset_Complete, _asn_ctx),
+	asn_MAP_SABP_Reset_Complete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Reset_Complete = {
+	"SABP_Reset-Complete",
+	"SABP_Reset-Complete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Reset_Complete_tags_1,
+	sizeof(asn_DEF_SABP_Reset_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Reset_Complete_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Reset_Complete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Reset_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Reset_Complete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Reset_Complete_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Reset_Complete_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Reset-Failure.c b/src/sabp/SABP_Reset-Failure.c
new file mode 100644
index 0000000..c4ef4de
--- /dev/null
+++ b/src/sabp/SABP_Reset-Failure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Reset-Failure.h>
+
+static int
+memb_reset_Failure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_reset_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_reset_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_reset_Failure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_reset_Failure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_reset_Failure_ies_specs_2 = {
+	sizeof(struct reset_Failure_ies),
+	offsetof(struct reset_Failure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_reset_Failure_ies_2 = {
+	"reset-Failure-ies",
+	"reset-Failure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_reset_Failure_ies_tags_2,
+	sizeof(asn_DEF_reset_Failure_ies_tags_2)
+		/sizeof(asn_DEF_reset_Failure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_reset_Failure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_reset_Failure_ies_tags_2)
+		/sizeof(asn_DEF_reset_Failure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_reset_Failure_ies_constr_2,
+	asn_MBR_reset_Failure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_reset_Failure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Reset_Failure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Reset_Failure, reset_Failure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_reset_Failure_ies_2,
+		memb_reset_Failure_ies_constraint_1,
+		&asn_PER_memb_reset_Failure_ies_constr_2,
+		0,
+		"reset-Failure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Reset_Failure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Reset_Failure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* reset-Failure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Reset_Failure_specs_1 = {
+	sizeof(struct SABP_Reset_Failure),
+	offsetof(struct SABP_Reset_Failure, _asn_ctx),
+	asn_MAP_SABP_Reset_Failure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Reset_Failure = {
+	"SABP_Reset-Failure",
+	"SABP_Reset-Failure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Reset_Failure_tags_1,
+	sizeof(asn_DEF_SABP_Reset_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Reset_Failure_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Reset_Failure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Reset_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Reset_Failure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Reset_Failure_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Reset_Failure_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Reset.c b/src/sabp/SABP_Reset.c
new file mode 100644
index 0000000..0f18f90
--- /dev/null
+++ b/src/sabp/SABP_Reset.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Reset.h>
+
+static int
+memb_reset_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_reset_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_reset_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_reset_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_reset_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_reset_ies_specs_2 = {
+	sizeof(struct reset_ies),
+	offsetof(struct reset_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_reset_ies_2 = {
+	"reset-ies",
+	"reset-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_reset_ies_tags_2,
+	sizeof(asn_DEF_reset_ies_tags_2)
+		/sizeof(asn_DEF_reset_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_reset_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_reset_ies_tags_2)
+		/sizeof(asn_DEF_reset_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_reset_ies_constr_2,
+	asn_MBR_reset_ies_2,
+	1,	/* Single element */
+	&asn_SPC_reset_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Reset_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Reset, reset_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_reset_ies_2,
+		memb_reset_ies_constraint_1,
+		&asn_PER_memb_reset_ies_constr_2,
+		0,
+		"reset-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Reset_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Reset_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* reset-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Reset_specs_1 = {
+	sizeof(struct SABP_Reset),
+	offsetof(struct SABP_Reset, _asn_ctx),
+	asn_MAP_SABP_Reset_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Reset = {
+	"SABP_Reset",
+	"SABP_Reset",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Reset_tags_1,
+	sizeof(asn_DEF_SABP_Reset_tags_1)
+		/sizeof(asn_DEF_SABP_Reset_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Reset_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Reset_tags_1)
+		/sizeof(asn_DEF_SABP_Reset_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Reset_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Reset_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Restart.c b/src/sabp/SABP_Restart.c
new file mode 100644
index 0000000..a77bca7
--- /dev/null
+++ b/src/sabp/SABP_Restart.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Restart.h>
+
+static int
+memb_restart_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_restart_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_restart_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_restart_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_restart_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_restart_ies_specs_2 = {
+	sizeof(struct restart_ies),
+	offsetof(struct restart_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_restart_ies_2 = {
+	"restart-ies",
+	"restart-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_restart_ies_tags_2,
+	sizeof(asn_DEF_restart_ies_tags_2)
+		/sizeof(asn_DEF_restart_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_restart_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_restart_ies_tags_2)
+		/sizeof(asn_DEF_restart_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_restart_ies_constr_2,
+	asn_MBR_restart_ies_2,
+	1,	/* Single element */
+	&asn_SPC_restart_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Restart_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Restart, restart_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_restart_ies_2,
+		memb_restart_ies_constraint_1,
+		&asn_PER_memb_restart_ies_constr_2,
+		0,
+		"restart-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Restart_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Restart_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* restart-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Restart_specs_1 = {
+	sizeof(struct SABP_Restart),
+	offsetof(struct SABP_Restart, _asn_ctx),
+	asn_MAP_SABP_Restart_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Restart = {
+	"SABP_Restart",
+	"SABP_Restart",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Restart_tags_1,
+	sizeof(asn_DEF_SABP_Restart_tags_1)
+		/sizeof(asn_DEF_SABP_Restart_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Restart_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Restart_tags_1)
+		/sizeof(asn_DEF_SABP_Restart_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Restart_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Restart_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_SABP-PDU.c b/src/sabp/SABP_SABP-PDU.c
new file mode 100644
index 0000000..a11315c
--- /dev/null
+++ b/src/sabp/SABP_SABP-PDU.c
@@ -0,0 +1,82 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_SABP-PDU.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_SABP_PDU_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  2,  2,  0l,  2l }	/* (0..2,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_SABP_PDU_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_SABP_PDU, choice.initiatingMessage),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_InitiatingMessage,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"initiatingMessage"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_SABP_PDU, choice.successfulOutcome),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_SuccessfulOutcome,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"successfulOutcome"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_SABP_PDU, choice.unsuccessfulOutcome),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_UnsuccessfulOutcome,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"unsuccessfulOutcome"
+		},
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_SABP_PDU_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* initiatingMessage */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* successfulOutcome */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* unsuccessfulOutcome */
+};
+static asn_CHOICE_specifics_t asn_SPC_SABP_SABP_PDU_specs_1 = {
+	sizeof(struct SABP_SABP_PDU),
+	offsetof(struct SABP_SABP_PDU, _asn_ctx),
+	offsetof(struct SABP_SABP_PDU, present),
+	sizeof(((struct SABP_SABP_PDU *)0)->present),
+	asn_MAP_SABP_SABP_PDU_tag2el_1,
+	3,	/* Count of tags in the map */
+	0,
+	3	/* Extensions start */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_SABP_PDU = {
+	"SABP_SABP-PDU",
+	"SABP_SABP-PDU",
+	CHOICE_free,
+	CHOICE_print,
+	CHOICE_constraint,
+	CHOICE_decode_ber,
+	CHOICE_encode_der,
+	CHOICE_decode_xer,
+	CHOICE_encode_xer,
+	CHOICE_decode_uper,
+	CHOICE_encode_uper,
+	CHOICE_decode_aper,
+	CHOICE_encode_aper,
+	CHOICE_outmost_tag,
+	0,	/* No effective tags (pointer) */
+	0,	/* No effective tags (count) */
+	0,	/* No tags (pointer) */
+	0,	/* No tags (count) */
+	&asn_PER_type_SABP_SABP_PDU_constr_1,
+	asn_MBR_SABP_SABP_PDU_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_SABP_PDU_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Serial-Number.c b/src/sabp/SABP_Serial-Number.c
new file mode 100644
index 0000000..b0308ed
--- /dev/null
+++ b/src/sabp/SABP_Serial-Number.c
@@ -0,0 +1,171 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Serial-Number.h>
+
+int
+SABP_Serial_Number_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const BIT_STRING_t *st = (const BIT_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	if(st->size > 0) {
+		/* Size in bits */
+		size = 8 * st->size - (st->bits_unused & 0x07);
+	} else {
+		size = 0;
+	}
+	
+	if((size == 16l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using BIT_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Serial_Number_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_BIT_STRING.free_struct;
+	td->print_struct   = asn_DEF_BIT_STRING.print_struct;
+	td->check_constraints = asn_DEF_BIT_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_BIT_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_BIT_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_BIT_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_BIT_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_BIT_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_BIT_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_BIT_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_BIT_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_BIT_STRING.per_constraints;
+	td->elements       = asn_DEF_BIT_STRING.elements;
+	td->elements_count = asn_DEF_BIT_STRING.elements_count;
+	td->specifics      = asn_DEF_BIT_STRING.specifics;
+}
+
+void
+SABP_Serial_Number_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Serial_Number_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Serial_Number_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Serial_Number_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Serial_Number_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Serial_Number_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Serial_Number_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Serial_Number_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Serial_Number_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Serial_Number_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Serial_Number_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Serial_Number_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  16l,  16l }	/* (SIZE(16..16)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Serial_Number_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (3 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Serial_Number = {
+	"SABP_Serial-Number",
+	"SABP_Serial-Number",
+	SABP_Serial_Number_free,
+	SABP_Serial_Number_print,
+	SABP_Serial_Number_constraint,
+	SABP_Serial_Number_decode_ber,
+	SABP_Serial_Number_encode_der,
+	SABP_Serial_Number_decode_xer,
+	SABP_Serial_Number_encode_xer,
+	SABP_Serial_Number_decode_uper,
+	SABP_Serial_Number_encode_uper,
+	SABP_Serial_Number_decode_aper,
+	SABP_Serial_Number_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Serial_Number_tags_1,
+	sizeof(asn_DEF_SABP_Serial_Number_tags_1)
+		/sizeof(asn_DEF_SABP_Serial_Number_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Serial_Number_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Serial_Number_tags_1)
+		/sizeof(asn_DEF_SABP_Serial_Number_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Serial_Number_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Service-Area-Identifier.c b/src/sabp/SABP_Service-Area-Identifier.c
new file mode 100644
index 0000000..7c98288
--- /dev/null
+++ b/src/sabp/SABP_Service-Area-Identifier.c
@@ -0,0 +1,174 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Service-Area-Identifier.h>
+
+static int
+memb_pLMNidentity_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 3l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_lac_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static int
+memb_sac_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_memb_pLMNidentity_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  3l,  3l }	/* (SIZE(3..3)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_lac_constr_3 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_sac_constr_4 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_Service_Area_Identifier_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Service_Area_Identifier, pLMNidentity),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		memb_pLMNidentity_constraint_1,
+		&asn_PER_memb_pLMNidentity_constr_2,
+		0,
+		"pLMNidentity"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Service_Area_Identifier, lac),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		memb_lac_constraint_1,
+		&asn_PER_memb_lac_constr_3,
+		0,
+		"lac"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Service_Area_Identifier, sac),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_OCTET_STRING,
+		memb_sac_constraint_1,
+		&asn_PER_memb_sac_constr_4,
+		0,
+		"sac"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Service_Area_Identifier_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Service_Area_Identifier_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* pLMNidentity */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* lac */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* sac */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Service_Area_Identifier_specs_1 = {
+	sizeof(struct SABP_Service_Area_Identifier),
+	offsetof(struct SABP_Service_Area_Identifier, _asn_ctx),
+	asn_MAP_SABP_Service_Area_Identifier_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Service_Area_Identifier = {
+	"SABP_Service-Area-Identifier",
+	"SABP_Service-Area-Identifier",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Service_Area_Identifier_tags_1,
+	sizeof(asn_DEF_SABP_Service_Area_Identifier_tags_1)
+		/sizeof(asn_DEF_SABP_Service_Area_Identifier_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Service_Area_Identifier_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Service_Area_Identifier_tags_1)
+		/sizeof(asn_DEF_SABP_Service_Area_Identifier_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Service_Area_Identifier_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_Service_Area_Identifier_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Service-Areas-List.c b/src/sabp/SABP_Service-Areas-List.c
new file mode 100644
index 0000000..b055363
--- /dev/null
+++ b/src/sabp/SABP_Service-Areas-List.c
@@ -0,0 +1,59 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Service-Areas-List.h>
+
+static asn_per_constraints_t asn_PER_type_SABP_Service_Areas_List_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  1l,  65535l }	/* (SIZE(1..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_SABP_Service_Areas_List_1[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_Service_Area_Identifier,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Service_Areas_List_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_SABP_Service_Areas_List_specs_1 = {
+	sizeof(struct SABP_Service_Areas_List),
+	offsetof(struct SABP_Service_Areas_List, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Service_Areas_List = {
+	"SABP_Service-Areas-List",
+	"SABP_Service-Areas-List",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Service_Areas_List_tags_1,
+	sizeof(asn_DEF_SABP_Service_Areas_List_tags_1)
+		/sizeof(asn_DEF_SABP_Service_Areas_List_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Service_Areas_List_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Service_Areas_List_tags_1)
+		/sizeof(asn_DEF_SABP_Service_Areas_List_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Service_Areas_List_constr_1,
+	asn_MBR_SABP_Service_Areas_List_1,
+	1,	/* Single element */
+	&asn_SPC_SABP_Service_Areas_List_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_SuccessfulOutcome.c b/src/sabp/SABP_SuccessfulOutcome.c
new file mode 100644
index 0000000..f1f9996
--- /dev/null
+++ b/src/sabp/SABP_SuccessfulOutcome.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_SuccessfulOutcome.h>
+
+static asn_TYPE_member_t asn_MBR_SABP_SuccessfulOutcome_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_SuccessfulOutcome, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_SuccessfulOutcome, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_SuccessfulOutcome, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_SuccessfulOutcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_SuccessfulOutcome_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_SuccessfulOutcome_specs_1 = {
+	sizeof(struct SABP_SuccessfulOutcome),
+	offsetof(struct SABP_SuccessfulOutcome, _asn_ctx),
+	asn_MAP_SABP_SuccessfulOutcome_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_SuccessfulOutcome = {
+	"SABP_SuccessfulOutcome",
+	"SABP_SuccessfulOutcome",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_SuccessfulOutcome_tags_1,
+	sizeof(asn_DEF_SABP_SuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_SABP_SuccessfulOutcome_tags_1[0]), /* 1 */
+	asn_DEF_SABP_SuccessfulOutcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_SuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_SABP_SuccessfulOutcome_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_SuccessfulOutcome_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_SuccessfulOutcome_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_TriggeringMessage.c b/src/sabp/SABP_TriggeringMessage.c
new file mode 100644
index 0000000..ec0c4b5
--- /dev/null
+++ b/src/sabp/SABP_TriggeringMessage.c
@@ -0,0 +1,169 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-CommonDataTypes"
+ * 	found in "../../asn1/sabp/SABP-CommonDataTypes.asn"
+ */
+
+#include <osmocom/sabp/SABP_TriggeringMessage.h>
+
+int
+SABP_TriggeringMessage_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_TriggeringMessage_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_TriggeringMessage_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_TriggeringMessage_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_TriggeringMessage_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_TriggeringMessage_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_TriggeringMessage_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_TriggeringMessage_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_TriggeringMessage_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_TriggeringMessage_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_TriggeringMessage_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_TriggeringMessage_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_TriggeringMessage_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_TriggeringMessage_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED,	 2,  2,  0l,  3l }	/* (0..3) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_TriggeringMessage_value2enum_1[] = {
+	{ 0,	18,	"initiating-message" },
+	{ 1,	18,	"successful-outcome" },
+	{ 2,	20,	"unsuccessful-outcome" },
+	{ 3,	7,	"outcome" }
+};
+static const unsigned int asn_MAP_SABP_TriggeringMessage_enum2value_1[] = {
+	0,	/* initiating-message(0) */
+	3,	/* outcome(3) */
+	1,	/* successful-outcome(1) */
+	2	/* unsuccessful-outcome(2) */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_TriggeringMessage_specs_1 = {
+	asn_MAP_SABP_TriggeringMessage_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_TriggeringMessage_enum2value_1,	/* N => "tag"; sorted by N */
+	4,	/* Number of elements in the maps */
+	0,	/* Enumeration is not extensible */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_TriggeringMessage_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_TriggeringMessage = {
+	"SABP_TriggeringMessage",
+	"SABP_TriggeringMessage",
+	SABP_TriggeringMessage_free,
+	SABP_TriggeringMessage_print,
+	SABP_TriggeringMessage_constraint,
+	SABP_TriggeringMessage_decode_ber,
+	SABP_TriggeringMessage_encode_der,
+	SABP_TriggeringMessage_decode_xer,
+	SABP_TriggeringMessage_encode_xer,
+	SABP_TriggeringMessage_decode_uper,
+	SABP_TriggeringMessage_encode_uper,
+	SABP_TriggeringMessage_decode_aper,
+	SABP_TriggeringMessage_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_TriggeringMessage_tags_1,
+	sizeof(asn_DEF_SABP_TriggeringMessage_tags_1)
+		/sizeof(asn_DEF_SABP_TriggeringMessage_tags_1[0]), /* 1 */
+	asn_DEF_SABP_TriggeringMessage_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_TriggeringMessage_tags_1)
+		/sizeof(asn_DEF_SABP_TriggeringMessage_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_TriggeringMessage_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_TriggeringMessage_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_TypeOfError.c b/src/sabp/SABP_TypeOfError.c
new file mode 100644
index 0000000..e6ec48c
--- /dev/null
+++ b/src/sabp/SABP_TypeOfError.c
@@ -0,0 +1,167 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_TypeOfError.h>
+
+int
+SABP_TypeOfError_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	/* Replace with underlying type checker */
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	return td->check_constraints(td, sptr, ctfailcb, app_key);
+}
+
+/*
+ * This type is implemented using NativeEnumerated,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_TypeOfError_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_NativeEnumerated.free_struct;
+	td->print_struct   = asn_DEF_NativeEnumerated.print_struct;
+	td->check_constraints = asn_DEF_NativeEnumerated.check_constraints;
+	td->ber_decoder    = asn_DEF_NativeEnumerated.ber_decoder;
+	td->der_encoder    = asn_DEF_NativeEnumerated.der_encoder;
+	td->xer_decoder    = asn_DEF_NativeEnumerated.xer_decoder;
+	td->xer_encoder    = asn_DEF_NativeEnumerated.xer_encoder;
+	td->uper_decoder   = asn_DEF_NativeEnumerated.uper_decoder;
+	td->uper_encoder   = asn_DEF_NativeEnumerated.uper_encoder;
+	td->aper_decoder   = asn_DEF_NativeEnumerated.aper_decoder;
+	td->aper_encoder   = asn_DEF_NativeEnumerated.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_NativeEnumerated.per_constraints;
+	td->elements       = asn_DEF_NativeEnumerated.elements;
+	td->elements_count = asn_DEF_NativeEnumerated.elements_count;
+     /* td->specifics      = asn_DEF_NativeEnumerated.specifics;	// Defined explicitly */
+}
+
+void
+SABP_TypeOfError_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_TypeOfError_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_TypeOfError_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_TypeOfError_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_TypeOfError_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_TypeOfError_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_TypeOfError_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_TypeOfError_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_TypeOfError_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_TypeOfError_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_TypeOfError_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_TypeOfError_constr_1 GCC_NOTUSED = {
+	{ APC_CONSTRAINED | APC_EXTENSIBLE,  1,  1,  0l,  1l }	/* (0..1,...) */,
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	0, 0	/* No PER value map */
+};
+static const asn_INTEGER_enum_map_t asn_MAP_SABP_TypeOfError_value2enum_1[] = {
+	{ 0,	14,	"not-understood" },
+	{ 1,	7,	"missing" }
+	/* This list is extensible */
+};
+static const unsigned int asn_MAP_SABP_TypeOfError_enum2value_1[] = {
+	1,	/* missing(1) */
+	0	/* not-understood(0) */
+	/* This list is extensible */
+};
+static const asn_INTEGER_specifics_t asn_SPC_SABP_TypeOfError_specs_1 = {
+	asn_MAP_SABP_TypeOfError_value2enum_1,	/* "tag" => N; sorted by tag */
+	asn_MAP_SABP_TypeOfError_enum2value_1,	/* N => "tag"; sorted by N */
+	2,	/* Number of elements in the maps */
+	3,	/* Extensions before this member */
+	1,	/* Strict enumeration */
+	0,	/* Native long size */
+	0
+};
+static const ber_tlv_tag_t asn_DEF_SABP_TypeOfError_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_TypeOfError = {
+	"SABP_TypeOfError",
+	"SABP_TypeOfError",
+	SABP_TypeOfError_free,
+	SABP_TypeOfError_print,
+	SABP_TypeOfError_constraint,
+	SABP_TypeOfError_decode_ber,
+	SABP_TypeOfError_encode_der,
+	SABP_TypeOfError_decode_xer,
+	SABP_TypeOfError_encode_xer,
+	SABP_TypeOfError_decode_uper,
+	SABP_TypeOfError_encode_uper,
+	SABP_TypeOfError_decode_aper,
+	SABP_TypeOfError_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_TypeOfError_tags_1,
+	sizeof(asn_DEF_SABP_TypeOfError_tags_1)
+		/sizeof(asn_DEF_SABP_TypeOfError_tags_1[0]), /* 1 */
+	asn_DEF_SABP_TypeOfError_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_TypeOfError_tags_1)
+		/sizeof(asn_DEF_SABP_TypeOfError_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_TypeOfError_constr_1,
+	0, 0,	/* Defined elsewhere */
+	&asn_SPC_SABP_TypeOfError_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_UnsuccessfulOutcome.c b/src/sabp/SABP_UnsuccessfulOutcome.c
new file mode 100644
index 0000000..423e8dc
--- /dev/null
+++ b/src/sabp/SABP_UnsuccessfulOutcome.c
@@ -0,0 +1,81 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_UnsuccessfulOutcome.h>
+
+static asn_TYPE_member_t asn_MBR_SABP_UnsuccessfulOutcome_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_UnsuccessfulOutcome, procedureCode),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_ProcedureCode,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"procedureCode"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_UnsuccessfulOutcome, criticality),
+		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
+		-1,	/* IMPLICIT tag at current level */
+		&asn_DEF_SABP_Criticality,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"criticality"
+		},
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_UnsuccessfulOutcome, value),
+		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
+		+1,	/* EXPLICIT tag at current level */
+		&asn_DEF_ANY,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		"value"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_UnsuccessfulOutcome_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_UnsuccessfulOutcome_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* procedureCode */
+    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
+    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* value */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_UnsuccessfulOutcome_specs_1 = {
+	sizeof(struct SABP_UnsuccessfulOutcome),
+	offsetof(struct SABP_UnsuccessfulOutcome, _asn_ctx),
+	asn_MAP_SABP_UnsuccessfulOutcome_tag2el_1,
+	3,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	-1,	/* Start extensions */
+	-1	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_UnsuccessfulOutcome = {
+	"SABP_UnsuccessfulOutcome",
+	"SABP_UnsuccessfulOutcome",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_UnsuccessfulOutcome_tags_1,
+	sizeof(asn_DEF_SABP_UnsuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_SABP_UnsuccessfulOutcome_tags_1[0]), /* 1 */
+	asn_DEF_SABP_UnsuccessfulOutcome_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_UnsuccessfulOutcome_tags_1)
+		/sizeof(asn_DEF_SABP_UnsuccessfulOutcome_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_UnsuccessfulOutcome_1,
+	3,	/* Elements count */
+	&asn_SPC_SABP_UnsuccessfulOutcome_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Warning-Type.c b/src/sabp/SABP_Warning-Type.c
new file mode 100644
index 0000000..4792b6c
--- /dev/null
+++ b/src/sabp/SABP_Warning-Type.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_Warning-Type.h>
+
+int
+SABP_Warning_Type_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 2l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_Warning_Type_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+SABP_Warning_Type_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_Warning_Type_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Warning_Type_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_Warning_Type_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Warning_Type_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_Warning_Type_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_Warning_Type_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_Warning_Type_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_Warning_Type_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_Warning_Type_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_Warning_Type_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_Warning_Type_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  2l,  2l }	/* (SIZE(2..2)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Warning_Type_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Warning_Type = {
+	"SABP_Warning-Type",
+	"SABP_Warning-Type",
+	SABP_Warning_Type_free,
+	SABP_Warning_Type_print,
+	SABP_Warning_Type_constraint,
+	SABP_Warning_Type_decode_ber,
+	SABP_Warning_Type_encode_der,
+	SABP_Warning_Type_decode_xer,
+	SABP_Warning_Type_encode_xer,
+	SABP_Warning_Type_decode_uper,
+	SABP_Warning_Type_encode_uper,
+	SABP_Warning_Type_decode_aper,
+	SABP_Warning_Type_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Warning_Type_tags_1,
+	sizeof(asn_DEF_SABP_Warning_Type_tags_1)
+		/sizeof(asn_DEF_SABP_Warning_Type_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Warning_Type_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Warning_Type_tags_1)
+		/sizeof(asn_DEF_SABP_Warning_Type_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_Warning_Type_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_WarningSecurityInfo.c b/src/sabp/SABP_WarningSecurityInfo.c
new file mode 100644
index 0000000..21eda36
--- /dev/null
+++ b/src/sabp/SABP_WarningSecurityInfo.c
@@ -0,0 +1,166 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-IEs"
+ * 	found in "../../asn1/sabp/SABP-IEs.asn"
+ */
+
+#include <osmocom/sabp/SABP_WarningSecurityInfo.h>
+
+int
+SABP_WarningSecurityInfo_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	const OCTET_STRING_t *st = (const OCTET_STRING_t *)sptr;
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	size = st->size;
+	
+	if((size == 50l)) {
+		/* Constraint check succeeded */
+		return 0;
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+/*
+ * This type is implemented using OCTET_STRING,
+ * so here we adjust the DEF accordingly.
+ */
+static void
+SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
+	td->free_struct    = asn_DEF_OCTET_STRING.free_struct;
+	td->print_struct   = asn_DEF_OCTET_STRING.print_struct;
+	td->check_constraints = asn_DEF_OCTET_STRING.check_constraints;
+	td->ber_decoder    = asn_DEF_OCTET_STRING.ber_decoder;
+	td->der_encoder    = asn_DEF_OCTET_STRING.der_encoder;
+	td->xer_decoder    = asn_DEF_OCTET_STRING.xer_decoder;
+	td->xer_encoder    = asn_DEF_OCTET_STRING.xer_encoder;
+	td->uper_decoder   = asn_DEF_OCTET_STRING.uper_decoder;
+	td->uper_encoder   = asn_DEF_OCTET_STRING.uper_encoder;
+	td->aper_decoder   = asn_DEF_OCTET_STRING.aper_decoder;
+	td->aper_encoder   = asn_DEF_OCTET_STRING.aper_encoder;
+	if(!td->per_constraints)
+		td->per_constraints = asn_DEF_OCTET_STRING.per_constraints;
+	td->elements       = asn_DEF_OCTET_STRING.elements;
+	td->elements_count = asn_DEF_OCTET_STRING.elements_count;
+	td->specifics      = asn_DEF_OCTET_STRING.specifics;
+}
+
+void
+SABP_WarningSecurityInfo_free(asn_TYPE_descriptor_t *td,
+		void *struct_ptr, int contents_only) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	td->free_struct(td, struct_ptr, contents_only);
+}
+
+int
+SABP_WarningSecurityInfo_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
+		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_WarningSecurityInfo_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const void *bufptr, size_t size, int tag_mode) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
+}
+
+asn_enc_rval_t
+SABP_WarningSecurityInfo_encode_der(asn_TYPE_descriptor_t *td,
+		void *structure, int tag_mode, ber_tlv_tag_t tag,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_WarningSecurityInfo_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		void **structure, const char *opt_mname, const void *bufptr, size_t size) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
+}
+
+asn_enc_rval_t
+SABP_WarningSecurityInfo_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
+		int ilevel, enum xer_encoder_flags_e flags,
+		asn_app_consume_bytes_f *cb, void *app_key) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
+}
+
+asn_dec_rval_t
+SABP_WarningSecurityInfo_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->uper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+asn_enc_rval_t
+SABP_WarningSecurityInfo_encode_uper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->uper_encoder(td, constraints, structure, per_out);
+}
+
+asn_enc_rval_t
+SABP_WarningSecurityInfo_encode_aper(asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints,
+		void *structure, asn_per_outp_t *per_out) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->aper_encoder(td, constraints, structure, per_out);
+}
+
+asn_dec_rval_t
+SABP_WarningSecurityInfo_decode_aper(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
+		asn_per_constraints_t *constraints, void **structure, asn_per_data_t *per_data) {
+	SABP_WarningSecurityInfo_1_inherit_TYPE_descriptor(td);
+	return td->aper_decoder(opt_codec_ctx, td, constraints, structure, per_data);
+}
+
+static asn_per_constraints_t asn_PER_type_SABP_WarningSecurityInfo_constr_1 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 0,  0,  50l,  50l }	/* (SIZE(50..50)) */,
+	0, 0	/* No PER value map */
+};
+static const ber_tlv_tag_t asn_DEF_SABP_WarningSecurityInfo_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (4 << 2))
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_WarningSecurityInfo = {
+	"SABP_WarningSecurityInfo",
+	"SABP_WarningSecurityInfo",
+	SABP_WarningSecurityInfo_free,
+	SABP_WarningSecurityInfo_print,
+	SABP_WarningSecurityInfo_constraint,
+	SABP_WarningSecurityInfo_decode_ber,
+	SABP_WarningSecurityInfo_encode_der,
+	SABP_WarningSecurityInfo_decode_xer,
+	SABP_WarningSecurityInfo_encode_xer,
+	SABP_WarningSecurityInfo_decode_uper,
+	SABP_WarningSecurityInfo_encode_uper,
+	SABP_WarningSecurityInfo_decode_aper,
+	SABP_WarningSecurityInfo_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_WarningSecurityInfo_tags_1,
+	sizeof(asn_DEF_SABP_WarningSecurityInfo_tags_1)
+		/sizeof(asn_DEF_SABP_WarningSecurityInfo_tags_1[0]), /* 1 */
+	asn_DEF_SABP_WarningSecurityInfo_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_WarningSecurityInfo_tags_1)
+		/sizeof(asn_DEF_SABP_WarningSecurityInfo_tags_1[0]), /* 1 */
+	&asn_PER_type_SABP_WarningSecurityInfo_constr_1,
+	0, 0,	/* No members */
+	0	/* No specifics */
+};
+
diff --git a/src/sabp/SABP_Write-Replace-Complete.c b/src/sabp/SABP_Write-Replace-Complete.c
new file mode 100644
index 0000000..a3365a4
--- /dev/null
+++ b/src/sabp/SABP_Write-Replace-Complete.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Write-Replace-Complete.h>
+
+static int
+memb_write_Replace_Complete_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_write_Replace_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_write_Replace_Complete_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_write_Replace_Complete_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_write_Replace_Complete_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_write_Replace_Complete_ies_specs_2 = {
+	sizeof(struct write_Replace_Complete_ies),
+	offsetof(struct write_Replace_Complete_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_write_Replace_Complete_ies_2 = {
+	"write-Replace-Complete-ies",
+	"write-Replace-Complete-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_write_Replace_Complete_ies_tags_2,
+	sizeof(asn_DEF_write_Replace_Complete_ies_tags_2)
+		/sizeof(asn_DEF_write_Replace_Complete_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_write_Replace_Complete_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_write_Replace_Complete_ies_tags_2)
+		/sizeof(asn_DEF_write_Replace_Complete_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_write_Replace_Complete_ies_constr_2,
+	asn_MBR_write_Replace_Complete_ies_2,
+	1,	/* Single element */
+	&asn_SPC_write_Replace_Complete_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Write_Replace_Complete_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Write_Replace_Complete, write_Replace_Complete_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_write_Replace_Complete_ies_2,
+		memb_write_Replace_Complete_ies_constraint_1,
+		&asn_PER_memb_write_Replace_Complete_ies_constr_2,
+		0,
+		"write-Replace-Complete-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Write_Replace_Complete_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Write_Replace_Complete_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* write-Replace-Complete-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Write_Replace_Complete_specs_1 = {
+	sizeof(struct SABP_Write_Replace_Complete),
+	offsetof(struct SABP_Write_Replace_Complete, _asn_ctx),
+	asn_MAP_SABP_Write_Replace_Complete_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Write_Replace_Complete = {
+	"SABP_Write-Replace-Complete",
+	"SABP_Write-Replace-Complete",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Write_Replace_Complete_tags_1,
+	sizeof(asn_DEF_SABP_Write_Replace_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Write_Replace_Complete_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Write_Replace_Complete_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Write_Replace_Complete_tags_1)
+		/sizeof(asn_DEF_SABP_Write_Replace_Complete_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Write_Replace_Complete_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Write_Replace_Complete_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Write-Replace-Failure.c b/src/sabp/SABP_Write-Replace-Failure.c
new file mode 100644
index 0000000..b36baeb
--- /dev/null
+++ b/src/sabp/SABP_Write-Replace-Failure.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Write-Replace-Failure.h>
+
+static int
+memb_write_Replace_Failure_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_write_Replace_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_write_Replace_Failure_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_write_Replace_Failure_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_write_Replace_Failure_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_write_Replace_Failure_ies_specs_2 = {
+	sizeof(struct write_Replace_Failure_ies),
+	offsetof(struct write_Replace_Failure_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_write_Replace_Failure_ies_2 = {
+	"write-Replace-Failure-ies",
+	"write-Replace-Failure-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_write_Replace_Failure_ies_tags_2,
+	sizeof(asn_DEF_write_Replace_Failure_ies_tags_2)
+		/sizeof(asn_DEF_write_Replace_Failure_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_write_Replace_Failure_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_write_Replace_Failure_ies_tags_2)
+		/sizeof(asn_DEF_write_Replace_Failure_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_write_Replace_Failure_ies_constr_2,
+	asn_MBR_write_Replace_Failure_ies_2,
+	1,	/* Single element */
+	&asn_SPC_write_Replace_Failure_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Write_Replace_Failure_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Write_Replace_Failure, write_Replace_Failure_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_write_Replace_Failure_ies_2,
+		memb_write_Replace_Failure_ies_constraint_1,
+		&asn_PER_memb_write_Replace_Failure_ies_constr_2,
+		0,
+		"write-Replace-Failure-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Write_Replace_Failure_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Write_Replace_Failure_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* write-Replace-Failure-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Write_Replace_Failure_specs_1 = {
+	sizeof(struct SABP_Write_Replace_Failure),
+	offsetof(struct SABP_Write_Replace_Failure, _asn_ctx),
+	asn_MAP_SABP_Write_Replace_Failure_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Write_Replace_Failure = {
+	"SABP_Write-Replace-Failure",
+	"SABP_Write-Replace-Failure",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Write_Replace_Failure_tags_1,
+	sizeof(asn_DEF_SABP_Write_Replace_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Write_Replace_Failure_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Write_Replace_Failure_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Write_Replace_Failure_tags_1)
+		/sizeof(asn_DEF_SABP_Write_Replace_Failure_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Write_Replace_Failure_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Write_Replace_Failure_specs_1	/* Additional specs */
+};
+
diff --git a/src/sabp/SABP_Write-Replace.c b/src/sabp/SABP_Write-Replace.c
new file mode 100644
index 0000000..11a2bb4
--- /dev/null
+++ b/src/sabp/SABP_Write-Replace.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "SABP-PDU"
+ * 	found in "../../asn1/sabp/SABP-PDU.asn"
+ */
+
+#include <osmocom/sabp/SABP_Write-Replace.h>
+
+static int
+memb_write_Replace_ies_constraint_1(asn_TYPE_descriptor_t *td, const void *sptr,
+			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
+	size_t size;
+	
+	if(!sptr) {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: value not given (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+	
+	/* Determine the number of elements */
+	size = _A_CSEQUENCE_FROM_VOID(sptr)->count;
+	
+	if((size <= 65535l)) {
+		/* Perform validation of the inner elements */
+		return td->check_constraints(td, sptr, ctfailcb, app_key);
+	} else {
+		_ASN_CTFAIL(app_key, td, sptr,
+			"%s: constraint failed (%s:%d)",
+			td->name, __FILE__, __LINE__);
+		return -1;
+	}
+}
+
+static asn_per_constraints_t asn_PER_type_write_Replace_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_per_constraints_t asn_PER_memb_write_Replace_ies_constr_2 GCC_NOTUSED = {
+	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
+	{ APC_CONSTRAINED,	 16,  16,  0l,  65535l }	/* (SIZE(0..65535)) */,
+	0, 0	/* No PER value map */
+};
+static asn_TYPE_member_t asn_MBR_write_Replace_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_SABP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_write_Replace_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_write_Replace_ies_specs_2 = {
+	sizeof(struct write_Replace_ies),
+	offsetof(struct write_Replace_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_write_Replace_ies_2 = {
+	"write-Replace-ies",
+	"write-Replace-ies",
+	SEQUENCE_OF_free,
+	SEQUENCE_OF_print,
+	SEQUENCE_OF_constraint,
+	SEQUENCE_OF_decode_ber,
+	SEQUENCE_OF_encode_der,
+	SEQUENCE_OF_decode_xer,
+	SEQUENCE_OF_encode_xer,
+	SEQUENCE_OF_decode_uper,
+	SEQUENCE_OF_encode_uper,
+	SEQUENCE_OF_decode_aper,
+	SEQUENCE_OF_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_write_Replace_ies_tags_2,
+	sizeof(asn_DEF_write_Replace_ies_tags_2)
+		/sizeof(asn_DEF_write_Replace_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_write_Replace_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_write_Replace_ies_tags_2)
+		/sizeof(asn_DEF_write_Replace_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_write_Replace_ies_constr_2,
+	asn_MBR_write_Replace_ies_2,
+	1,	/* Single element */
+	&asn_SPC_write_Replace_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_SABP_Write_Replace_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct SABP_Write_Replace, write_Replace_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_write_Replace_ies_2,
+		memb_write_Replace_ies_constraint_1,
+		&asn_PER_memb_write_Replace_ies_constr_2,
+		0,
+		"write-Replace-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_SABP_Write_Replace_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_SABP_Write_Replace_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* write-Replace-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_SABP_Write_Replace_specs_1 = {
+	sizeof(struct SABP_Write_Replace),
+	offsetof(struct SABP_Write_Replace, _asn_ctx),
+	asn_MAP_SABP_Write_Replace_tag2el_1,
+	1,	/* Count of tags in the map */
+	0, 0, 0,	/* Optional elements (not needed) */
+	0,	/* Start extensions */
+	2	/* Stop extensions */
+};
+asn_TYPE_descriptor_t asn_DEF_SABP_Write_Replace = {
+	"SABP_Write-Replace",
+	"SABP_Write-Replace",
+	SEQUENCE_free,
+	SEQUENCE_print,
+	SEQUENCE_constraint,
+	SEQUENCE_decode_ber,
+	SEQUENCE_encode_der,
+	SEQUENCE_decode_xer,
+	SEQUENCE_encode_xer,
+	SEQUENCE_decode_uper,
+	SEQUENCE_encode_uper,
+	SEQUENCE_decode_aper,
+	SEQUENCE_encode_aper,
+	0,	/* Use generic outmost tag fetcher */
+	asn_DEF_SABP_Write_Replace_tags_1,
+	sizeof(asn_DEF_SABP_Write_Replace_tags_1)
+		/sizeof(asn_DEF_SABP_Write_Replace_tags_1[0]), /* 1 */
+	asn_DEF_SABP_Write_Replace_tags_1,	/* Same as above */
+	sizeof(asn_DEF_SABP_Write_Replace_tags_1)
+		/sizeof(asn_DEF_SABP_Write_Replace_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_SABP_Write_Replace_1,
+	1,	/* Elements count */
+	&asn_SPC_SABP_Write_Replace_specs_1	/* Additional specs */
+};
+
