diff --git a/src/ranap/Makefile b/src/ranap/Makefile
index 4f84d8a..59db793 100644
--- a/src/ranap/Makefile
+++ b/src/ranap/Makefile
@@ -494,7 +494,27 @@
 	RANAP_SRVCC-CSKeysResponse.c	\
 	RANAP_UeRadioCapabilityMatchRequest.c	\
 	RANAP_UeRadioCapabilityMatchResponse.c	\
-	RANAP_IE.c
+	RANAP_IE.c	\
+	RANAP_DataVolumeReportList.c	\
+	RANAP_RAB-ReleasedList-IuRelComp.c	\
+	RANAP_RAB-RelocationReleaseList.c	\
+	RANAP_RAB-DataForwardingList.c	\
+	RANAP_RAB-SetupList-RelocReq.c	\
+	RANAP_RAB-SetupList-RelocReqAck.c	\
+	RANAP_RAB-FailedList.c	\
+	RANAP_RAB-DataForwardingList-SRNS-CtxReq.c	\
+	RANAP_RAB-ContextList.c	\
+	RANAP_RAB-ContextFailedtoTransferList.c	\
+	RANAP_RAB-DataVolumeReportRequestList.c	\
+	RANAP_RAB-FailedtoReportList.c	\
+	RANAP_RAB-SetupList-EnhancedRelocCompleteReq.c	\
+	RANAP_RAB-SetupList-EnhancedRelocCompleteRes.c	\
+	RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.c	\
+	RANAP_RAB-SetupOrModifiedList.c	\
+	RANAP_RAB-ReleasedList.c	\
+	RANAP_RAB-QueuedList.c	\
+	RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.c	\
+	RANAP_RAB-ContextList-RANAP-RelocInf.c
 
 ASN_MODULE_HEADERS=	\
 	RANAP_Criticality.h	\
@@ -992,7 +1012,31 @@
 	RANAP_SRVCC-CSKeysResponse.h	\
 	RANAP_UeRadioCapabilityMatchRequest.h	\
 	RANAP_UeRadioCapabilityMatchResponse.h	\
-	RANAP_IE.h
+	RANAP_IE.h	\
+	RANAP_DataVolumeReportList.h	\
+	RANAP_RAB-ReleasedList-IuRelComp.h	\
+	RANAP_RAB-RelocationReleaseList.h	\
+	RANAP_RAB-DataForwardingList.h	\
+	RANAP_RAB-SetupList-RelocReq.h	\
+	RANAP_RAB-SetupList-RelocReqAck.h	\
+	RANAP_RAB-FailedList.h	\
+	RANAP_RAB-DataForwardingList-SRNS-CtxReq.h	\
+	RANAP_RAB-ContextList.h	\
+	RANAP_RAB-ContextFailedtoTransferList.h	\
+	RANAP_RAB-DataVolumeReportRequestList.h	\
+	RANAP_RAB-FailedtoReportList.h	\
+	RANAP_RAB-SetupList-EnhancedRelocCompleteReq.h	\
+	RANAP_RAB-SetupList-EnhancedRelocCompleteRes.h	\
+	RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.h	\
+	RANAP_RAB-SetupOrModifiedList.h	\
+	RANAP_RAB-ReleasedList.h	\
+	RANAP_RAB-QueuedList.h	\
+	RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.h	\
+	RANAP_RAB-ContextList-RANAP-RelocInf.h	\
+	RANAP_RAB-SetupList-EnhRelocInfoReq.h	\
+	RANAP_RAB-SetupList-EnhRelocInfoRes.h	\
+	RANAP_RAB-FailedList-EnhRelocInfoRes.h	\
+	RANAP_RAB-ModifyList.h
 
 
 lib_LTLIBRARIES=libosmo-asn1-ranap.la
diff --git a/src/ranap/RANAP_DataVolumeReportList.c b/src/ranap/RANAP_DataVolumeReportList.c
new file mode 100644
index 0000000..391f673
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReportList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_DataVolumeReportList.h"
+
+static int
+memb_dataVolumeReportListe_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_dataVolumeReportListe_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_dataVolumeReportListe_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_dataVolumeReportListe_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_dataVolumeReportListe_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_dataVolumeReportListe_ies_specs_2 = {
+	sizeof(struct dataVolumeReportListe_ies),
+	offsetof(struct dataVolumeReportListe_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_dataVolumeReportListe_ies_2 = {
+	"dataVolumeReportListe-ies",
+	"dataVolumeReportListe-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_dataVolumeReportListe_ies_tags_2,
+	sizeof(asn_DEF_dataVolumeReportListe_ies_tags_2)
+		/sizeof(asn_DEF_dataVolumeReportListe_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_dataVolumeReportListe_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_dataVolumeReportListe_ies_tags_2)
+		/sizeof(asn_DEF_dataVolumeReportListe_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_dataVolumeReportListe_ies_constr_2,
+	asn_MBR_dataVolumeReportListe_ies_2,
+	1,	/* Single element */
+	&asn_SPC_dataVolumeReportListe_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_DataVolumeReportList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_DataVolumeReportList, dataVolumeReportListe_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_dataVolumeReportListe_ies_2,
+		memb_dataVolumeReportListe_ies_constraint_1,
+		&asn_PER_memb_dataVolumeReportListe_ies_constr_2,
+		0,
+		"dataVolumeReportListe-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_DataVolumeReportList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_DataVolumeReportList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* dataVolumeReportListe-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_DataVolumeReportList_specs_1 = {
+	sizeof(struct RANAP_DataVolumeReportList),
+	offsetof(struct RANAP_DataVolumeReportList, _asn_ctx),
+	asn_MAP_RANAP_DataVolumeReportList_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_RANAP_DataVolumeReportList = {
+	"RANAP_DataVolumeReportList",
+	"RANAP_DataVolumeReportList",
+	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_RANAP_DataVolumeReportList_tags_1,
+	sizeof(asn_DEF_RANAP_DataVolumeReportList_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReportList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_DataVolumeReportList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_DataVolumeReportList_tags_1)
+		/sizeof(asn_DEF_RANAP_DataVolumeReportList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_DataVolumeReportList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_DataVolumeReportList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_DataVolumeReportList.h b/src/ranap/RANAP_DataVolumeReportList.h
new file mode 100644
index 0000000..98aba41
--- /dev/null
+++ b/src/ranap/RANAP_DataVolumeReportList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_DataVolumeReportList_H_
+#define	_RANAP_DataVolumeReportList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_DataVolumeReportList */
+typedef struct RANAP_DataVolumeReportList {
+	struct dataVolumeReportListe_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} dataVolumeReportListe_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_DataVolumeReportList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_DataVolumeReportList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_DataVolumeReportList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.c b/src/ranap/RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.c
new file mode 100644
index 0000000..15ddafe
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.h"
+
+static int
+memb_foo_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_foo_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_foo_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_foo_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_foo_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_foo_ies_specs_2 = {
+	sizeof(struct foo_ies),
+	offsetof(struct foo_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_foo_ies_2 = {
+	"foo-ies",
+	"foo-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_foo_ies_tags_2,
+	sizeof(asn_DEF_foo_ies_tags_2)
+		/sizeof(asn_DEF_foo_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_foo_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_foo_ies_tags_2)
+		/sizeof(asn_DEF_foo_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_foo_ies_constr_2,
+	asn_MBR_foo_ies_2,
+	1,	/* Single element */
+	&asn_SPC_foo_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse, foo_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_foo_ies_2,
+		memb_foo_ies_constraint_1,
+		&asn_PER_memb_foo_ies_constr_2,
+		0,
+		"foo-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* foo-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_specs_1 = {
+	sizeof(struct RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse),
+	offsetof(struct RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse, _asn_ctx),
+	asn_MAP_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_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_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse = {
+	"RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse",
+	"RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse",
+	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_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tags_1,
+	sizeof(asn_DEF_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tags_1)
+		/sizeof(asn_DEF_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.h b/src/ranap/RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.h
new file mode 100644
index 0000000..0678df0
--- /dev/null
+++ b/src/ranap/RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_H_
+#define	_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_GERAN-Iumode-RAB-FailedList-RABAssgntResponse */
+typedef struct RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse {
+	struct foo_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} foo_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_GERAN_Iumode_RAB_FailedList_RABAssgntResponse_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ContextFailedtoTransferList.c b/src/ranap/RANAP_RAB-ContextFailedtoTransferList.c
new file mode 100644
index 0000000..836b5a5
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ContextFailedtoTransferList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ContextFailedtoTransferList.h"
+
+static int
+memb_rabContextFailedtoTransferList_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_rabContextFailedtoTransferList_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_rabContextFailedtoTransferList_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_rabContextFailedtoTransferList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabContextFailedtoTransferList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabContextFailedtoTransferList_ies_specs_2 = {
+	sizeof(struct rabContextFailedtoTransferList_ies),
+	offsetof(struct rabContextFailedtoTransferList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabContextFailedtoTransferList_ies_2 = {
+	"rabContextFailedtoTransferList-ies",
+	"rabContextFailedtoTransferList-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_rabContextFailedtoTransferList_ies_tags_2,
+	sizeof(asn_DEF_rabContextFailedtoTransferList_ies_tags_2)
+		/sizeof(asn_DEF_rabContextFailedtoTransferList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabContextFailedtoTransferList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabContextFailedtoTransferList_ies_tags_2)
+		/sizeof(asn_DEF_rabContextFailedtoTransferList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabContextFailedtoTransferList_ies_constr_2,
+	asn_MBR_rabContextFailedtoTransferList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabContextFailedtoTransferList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ContextFailedtoTransferList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ContextFailedtoTransferList, rabContextFailedtoTransferList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabContextFailedtoTransferList_ies_2,
+		memb_rabContextFailedtoTransferList_ies_constraint_1,
+		&asn_PER_memb_rabContextFailedtoTransferList_ies_constr_2,
+		0,
+		"rabContextFailedtoTransferList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ContextFailedtoTransferList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ContextFailedtoTransferList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabContextFailedtoTransferList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ContextFailedtoTransferList_specs_1 = {
+	sizeof(struct RANAP_RAB_ContextFailedtoTransferList),
+	offsetof(struct RANAP_RAB_ContextFailedtoTransferList, _asn_ctx),
+	asn_MAP_RANAP_RAB_ContextFailedtoTransferList_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_RANAP_RAB_ContextFailedtoTransferList = {
+	"RANAP_RAB-ContextFailedtoTransferList",
+	"RANAP_RAB-ContextFailedtoTransferList",
+	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_RANAP_RAB_ContextFailedtoTransferList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ContextFailedtoTransferList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ContextFailedtoTransferList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ContextFailedtoTransferList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ContextFailedtoTransferList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ContextFailedtoTransferList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ContextFailedtoTransferList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ContextFailedtoTransferList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ContextFailedtoTransferList.h b/src/ranap/RANAP_RAB-ContextFailedtoTransferList.h
new file mode 100644
index 0000000..85c07b3
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ContextFailedtoTransferList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ContextFailedtoTransferList_H_
+#define	_RANAP_RAB_ContextFailedtoTransferList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ContextFailedtoTransferList */
+typedef struct RANAP_RAB_ContextFailedtoTransferList {
+	struct rabContextFailedtoTransferList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabContextFailedtoTransferList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ContextFailedtoTransferList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ContextFailedtoTransferList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ContextFailedtoTransferList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ContextList-RANAP-RelocInf.c b/src/ranap/RANAP_RAB-ContextList-RANAP-RelocInf.c
new file mode 100644
index 0000000..de6c6ae
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ContextList-RANAP-RelocInf.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ContextList-RANAP-RelocInf.h"
+
+static int
+memb_rabContextListRANAPRelocInf_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_rabContextListRANAPRelocInf_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_rabContextListRANAPRelocInf_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_rabContextListRANAPRelocInf_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabContextListRANAPRelocInf_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabContextListRANAPRelocInf_ies_specs_2 = {
+	sizeof(struct rabContextListRANAPRelocInf_ies),
+	offsetof(struct rabContextListRANAPRelocInf_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabContextListRANAPRelocInf_ies_2 = {
+	"rabContextListRANAPRelocInf-ies",
+	"rabContextListRANAPRelocInf-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_rabContextListRANAPRelocInf_ies_tags_2,
+	sizeof(asn_DEF_rabContextListRANAPRelocInf_ies_tags_2)
+		/sizeof(asn_DEF_rabContextListRANAPRelocInf_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabContextListRANAPRelocInf_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabContextListRANAPRelocInf_ies_tags_2)
+		/sizeof(asn_DEF_rabContextListRANAPRelocInf_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabContextListRANAPRelocInf_ies_constr_2,
+	asn_MBR_rabContextListRANAPRelocInf_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabContextListRANAPRelocInf_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ContextList_RANAP_RelocInf_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ContextList_RANAP_RelocInf, rabContextListRANAPRelocInf_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabContextListRANAPRelocInf_ies_2,
+		memb_rabContextListRANAPRelocInf_ies_constraint_1,
+		&asn_PER_memb_rabContextListRANAPRelocInf_ies_constr_2,
+		0,
+		"rabContextListRANAPRelocInf-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ContextList_RANAP_RelocInf_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ContextList_RANAP_RelocInf_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabContextListRANAPRelocInf-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ContextList_RANAP_RelocInf_specs_1 = {
+	sizeof(struct RANAP_RAB_ContextList_RANAP_RelocInf),
+	offsetof(struct RANAP_RAB_ContextList_RANAP_RelocInf, _asn_ctx),
+	asn_MAP_RANAP_RAB_ContextList_RANAP_RelocInf_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_RANAP_RAB_ContextList_RANAP_RelocInf = {
+	"RANAP_RAB-ContextList-RANAP-RelocInf",
+	"RANAP_RAB-ContextList-RANAP-RelocInf",
+	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_RANAP_RAB_ContextList_RANAP_RelocInf_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ContextList_RANAP_RelocInf_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ContextList_RANAP_RelocInf_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ContextList_RANAP_RelocInf_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ContextList_RANAP_RelocInf_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ContextList_RANAP_RelocInf_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ContextList_RANAP_RelocInf_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ContextList_RANAP_RelocInf_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ContextList-RANAP-RelocInf.h b/src/ranap/RANAP_RAB-ContextList-RANAP-RelocInf.h
new file mode 100644
index 0000000..dfa50ef
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ContextList-RANAP-RelocInf.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ContextList_RANAP_RelocInf_H_
+#define	_RANAP_RAB_ContextList_RANAP_RelocInf_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ContextList-RANAP-RelocInf */
+typedef struct RANAP_RAB_ContextList_RANAP_RelocInf {
+	struct rabContextListRANAPRelocInf_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabContextListRANAPRelocInf_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ContextList_RANAP_RelocInf_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ContextList_RANAP_RelocInf;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ContextList_RANAP_RelocInf_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ContextList.c b/src/ranap/RANAP_RAB-ContextList.c
new file mode 100644
index 0000000..6650b91
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ContextList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ContextList.h"
+
+static int
+memb_rabContextList_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_rabContextList_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_rabContextList_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_rabContextList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabContextList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabContextList_ies_specs_2 = {
+	sizeof(struct rabContextList_ies),
+	offsetof(struct rabContextList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabContextList_ies_2 = {
+	"rabContextList-ies",
+	"rabContextList-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_rabContextList_ies_tags_2,
+	sizeof(asn_DEF_rabContextList_ies_tags_2)
+		/sizeof(asn_DEF_rabContextList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabContextList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabContextList_ies_tags_2)
+		/sizeof(asn_DEF_rabContextList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabContextList_ies_constr_2,
+	asn_MBR_rabContextList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabContextList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ContextList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ContextList, rabContextList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabContextList_ies_2,
+		memb_rabContextList_ies_constraint_1,
+		&asn_PER_memb_rabContextList_ies_constr_2,
+		0,
+		"rabContextList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ContextList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ContextList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabContextList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ContextList_specs_1 = {
+	sizeof(struct RANAP_RAB_ContextList),
+	offsetof(struct RANAP_RAB_ContextList, _asn_ctx),
+	asn_MAP_RANAP_RAB_ContextList_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_RANAP_RAB_ContextList = {
+	"RANAP_RAB-ContextList",
+	"RANAP_RAB-ContextList",
+	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_RANAP_RAB_ContextList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ContextList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ContextList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ContextList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ContextList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ContextList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ContextList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ContextList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ContextList.h b/src/ranap/RANAP_RAB-ContextList.h
new file mode 100644
index 0000000..b480389
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ContextList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ContextList_H_
+#define	_RANAP_RAB_ContextList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ContextList */
+typedef struct RANAP_RAB_ContextList {
+	struct rabContextList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabContextList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ContextList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ContextList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ContextList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-DataForwardingList-SRNS-CtxReq.c b/src/ranap/RANAP_RAB-DataForwardingList-SRNS-CtxReq.c
new file mode 100644
index 0000000..aa44e11
--- /dev/null
+++ b/src/ranap/RANAP_RAB-DataForwardingList-SRNS-CtxReq.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-DataForwardingList-SRNS-CtxReq.h"
+
+static int
+memb_rabDataForwardingListSRNSCtxReq_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_rabDataForwardingListSRNSCtxReq_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_rabDataForwardingListSRNSCtxReq_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_rabDataForwardingListSRNSCtxReq_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabDataForwardingListSRNSCtxReq_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabDataForwardingListSRNSCtxReq_ies_specs_2 = {
+	sizeof(struct rabDataForwardingListSRNSCtxReq_ies),
+	offsetof(struct rabDataForwardingListSRNSCtxReq_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabDataForwardingListSRNSCtxReq_ies_2 = {
+	"rabDataForwardingListSRNSCtxReq-ies",
+	"rabDataForwardingListSRNSCtxReq-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_rabDataForwardingListSRNSCtxReq_ies_tags_2,
+	sizeof(asn_DEF_rabDataForwardingListSRNSCtxReq_ies_tags_2)
+		/sizeof(asn_DEF_rabDataForwardingListSRNSCtxReq_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabDataForwardingListSRNSCtxReq_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabDataForwardingListSRNSCtxReq_ies_tags_2)
+		/sizeof(asn_DEF_rabDataForwardingListSRNSCtxReq_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabDataForwardingListSRNSCtxReq_ies_constr_2,
+	asn_MBR_rabDataForwardingListSRNSCtxReq_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabDataForwardingListSRNSCtxReq_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_DataForwardingList_SRNS_CtxReq_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_DataForwardingList_SRNS_CtxReq, rabDataForwardingListSRNSCtxReq_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabDataForwardingListSRNSCtxReq_ies_2,
+		memb_rabDataForwardingListSRNSCtxReq_ies_constraint_1,
+		&asn_PER_memb_rabDataForwardingListSRNSCtxReq_ies_constr_2,
+		0,
+		"rabDataForwardingListSRNSCtxReq-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabDataForwardingListSRNSCtxReq-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_DataForwardingList_SRNS_CtxReq_specs_1 = {
+	sizeof(struct RANAP_RAB_DataForwardingList_SRNS_CtxReq),
+	offsetof(struct RANAP_RAB_DataForwardingList_SRNS_CtxReq, _asn_ctx),
+	asn_MAP_RANAP_RAB_DataForwardingList_SRNS_CtxReq_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_RANAP_RAB_DataForwardingList_SRNS_CtxReq = {
+	"RANAP_RAB-DataForwardingList-SRNS-CtxReq",
+	"RANAP_RAB-DataForwardingList-SRNS-CtxReq",
+	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_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_DataForwardingList_SRNS_CtxReq_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_DataForwardingList_SRNS_CtxReq_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_DataForwardingList_SRNS_CtxReq_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-DataForwardingList-SRNS-CtxReq.h b/src/ranap/RANAP_RAB-DataForwardingList-SRNS-CtxReq.h
new file mode 100644
index 0000000..50d5771
--- /dev/null
+++ b/src/ranap/RANAP_RAB-DataForwardingList-SRNS-CtxReq.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_DataForwardingList_SRNS_CtxReq_H_
+#define	_RANAP_RAB_DataForwardingList_SRNS_CtxReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-DataForwardingList-SRNS-CtxReq */
+typedef struct RANAP_RAB_DataForwardingList_SRNS_CtxReq {
+	struct rabDataForwardingListSRNSCtxReq_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabDataForwardingListSRNSCtxReq_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_DataForwardingList_SRNS_CtxReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_DataForwardingList_SRNS_CtxReq;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_DataForwardingList_SRNS_CtxReq_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-DataForwardingList.c b/src/ranap/RANAP_RAB-DataForwardingList.c
new file mode 100644
index 0000000..ae67293
--- /dev/null
+++ b/src/ranap/RANAP_RAB-DataForwardingList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-DataForwardingList.h"
+
+static int
+memb_rabDataForwardingList_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_rabDataForwardingList_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_rabDataForwardingList_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_rabDataForwardingList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabDataForwardingList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabDataForwardingList_ies_specs_2 = {
+	sizeof(struct rabDataForwardingList_ies),
+	offsetof(struct rabDataForwardingList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabDataForwardingList_ies_2 = {
+	"rabDataForwardingList-ies",
+	"rabDataForwardingList-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_rabDataForwardingList_ies_tags_2,
+	sizeof(asn_DEF_rabDataForwardingList_ies_tags_2)
+		/sizeof(asn_DEF_rabDataForwardingList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabDataForwardingList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabDataForwardingList_ies_tags_2)
+		/sizeof(asn_DEF_rabDataForwardingList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabDataForwardingList_ies_constr_2,
+	asn_MBR_rabDataForwardingList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabDataForwardingList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_DataForwardingList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_DataForwardingList, rabDataForwardingList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabDataForwardingList_ies_2,
+		memb_rabDataForwardingList_ies_constraint_1,
+		&asn_PER_memb_rabDataForwardingList_ies_constr_2,
+		0,
+		"rabDataForwardingList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_DataForwardingList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_DataForwardingList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabDataForwardingList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_DataForwardingList_specs_1 = {
+	sizeof(struct RANAP_RAB_DataForwardingList),
+	offsetof(struct RANAP_RAB_DataForwardingList, _asn_ctx),
+	asn_MAP_RANAP_RAB_DataForwardingList_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_RANAP_RAB_DataForwardingList = {
+	"RANAP_RAB-DataForwardingList",
+	"RANAP_RAB-DataForwardingList",
+	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_RANAP_RAB_DataForwardingList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_DataForwardingList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_DataForwardingList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_DataForwardingList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_DataForwardingList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_DataForwardingList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_DataForwardingList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_DataForwardingList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-DataForwardingList.h b/src/ranap/RANAP_RAB-DataForwardingList.h
new file mode 100644
index 0000000..c049071
--- /dev/null
+++ b/src/ranap/RANAP_RAB-DataForwardingList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_DataForwardingList_H_
+#define	_RANAP_RAB_DataForwardingList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-DataForwardingList */
+typedef struct RANAP_RAB_DataForwardingList {
+	struct rabDataForwardingList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabDataForwardingList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_DataForwardingList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_DataForwardingList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_DataForwardingList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-DataVolumeReportRequestList.c b/src/ranap/RANAP_RAB-DataVolumeReportRequestList.c
new file mode 100644
index 0000000..fc1feaa
--- /dev/null
+++ b/src/ranap/RANAP_RAB-DataVolumeReportRequestList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-DataVolumeReportRequestList.h"
+
+static int
+memb_rabDataVolumeReportRequestList_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_rabDataVolumeReportRequestList_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_rabDataVolumeReportRequestList_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_rabDataVolumeReportRequestList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabDataVolumeReportRequestList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabDataVolumeReportRequestList_ies_specs_2 = {
+	sizeof(struct rabDataVolumeReportRequestList_ies),
+	offsetof(struct rabDataVolumeReportRequestList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabDataVolumeReportRequestList_ies_2 = {
+	"rabDataVolumeReportRequestList-ies",
+	"rabDataVolumeReportRequestList-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_rabDataVolumeReportRequestList_ies_tags_2,
+	sizeof(asn_DEF_rabDataVolumeReportRequestList_ies_tags_2)
+		/sizeof(asn_DEF_rabDataVolumeReportRequestList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabDataVolumeReportRequestList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabDataVolumeReportRequestList_ies_tags_2)
+		/sizeof(asn_DEF_rabDataVolumeReportRequestList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabDataVolumeReportRequestList_ies_constr_2,
+	asn_MBR_rabDataVolumeReportRequestList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabDataVolumeReportRequestList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_DataVolumeReportRequestList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_DataVolumeReportRequestList, rabDataVolumeReportRequestList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabDataVolumeReportRequestList_ies_2,
+		memb_rabDataVolumeReportRequestList_ies_constraint_1,
+		&asn_PER_memb_rabDataVolumeReportRequestList_ies_constr_2,
+		0,
+		"rabDataVolumeReportRequestList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_DataVolumeReportRequestList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_DataVolumeReportRequestList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabDataVolumeReportRequestList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_DataVolumeReportRequestList_specs_1 = {
+	sizeof(struct RANAP_RAB_DataVolumeReportRequestList),
+	offsetof(struct RANAP_RAB_DataVolumeReportRequestList, _asn_ctx),
+	asn_MAP_RANAP_RAB_DataVolumeReportRequestList_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_RANAP_RAB_DataVolumeReportRequestList = {
+	"RANAP_RAB-DataVolumeReportRequestList",
+	"RANAP_RAB-DataVolumeReportRequestList",
+	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_RANAP_RAB_DataVolumeReportRequestList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_DataVolumeReportRequestList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_DataVolumeReportRequestList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_DataVolumeReportRequestList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_DataVolumeReportRequestList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_DataVolumeReportRequestList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_DataVolumeReportRequestList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_DataVolumeReportRequestList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-DataVolumeReportRequestList.h b/src/ranap/RANAP_RAB-DataVolumeReportRequestList.h
new file mode 100644
index 0000000..c76bd48
--- /dev/null
+++ b/src/ranap/RANAP_RAB-DataVolumeReportRequestList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_DataVolumeReportRequestList_H_
+#define	_RANAP_RAB_DataVolumeReportRequestList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-DataVolumeReportRequestList */
+typedef struct RANAP_RAB_DataVolumeReportRequestList {
+	struct rabDataVolumeReportRequestList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabDataVolumeReportRequestList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_DataVolumeReportRequestList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_DataVolumeReportRequestList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_DataVolumeReportRequestList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-FailedList-EnhRelocInfoRes.c b/src/ranap/RANAP_RAB-FailedList-EnhRelocInfoRes.c
new file mode 100644
index 0000000..a113cf1
--- /dev/null
+++ b/src/ranap/RANAP_RAB-FailedList-EnhRelocInfoRes.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-FailedList-EnhRelocInfoRes.h"
+
+static int
+memb_rabFailedListEnhRelocInfoRes_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_rabFailedListEnhRelocInfoRes_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_rabFailedListEnhRelocInfoRes_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_rabFailedListEnhRelocInfoRes_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabFailedListEnhRelocInfoRes_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabFailedListEnhRelocInfoRes_ies_specs_2 = {
+	sizeof(struct rabFailedListEnhRelocInfoRes_ies),
+	offsetof(struct rabFailedListEnhRelocInfoRes_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabFailedListEnhRelocInfoRes_ies_2 = {
+	"rabFailedListEnhRelocInfoRes-ies",
+	"rabFailedListEnhRelocInfoRes-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_rabFailedListEnhRelocInfoRes_ies_tags_2,
+	sizeof(asn_DEF_rabFailedListEnhRelocInfoRes_ies_tags_2)
+		/sizeof(asn_DEF_rabFailedListEnhRelocInfoRes_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabFailedListEnhRelocInfoRes_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabFailedListEnhRelocInfoRes_ies_tags_2)
+		/sizeof(asn_DEF_rabFailedListEnhRelocInfoRes_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabFailedListEnhRelocInfoRes_ies_constr_2,
+	asn_MBR_rabFailedListEnhRelocInfoRes_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabFailedListEnhRelocInfoRes_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_FailedList_EnhRelocInfoRes_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_FailedList_EnhRelocInfoRes, rabFailedListEnhRelocInfoRes_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabFailedListEnhRelocInfoRes_ies_2,
+		memb_rabFailedListEnhRelocInfoRes_ies_constraint_1,
+		&asn_PER_memb_rabFailedListEnhRelocInfoRes_ies_constr_2,
+		0,
+		"rabFailedListEnhRelocInfoRes-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_FailedList_EnhRelocInfoRes_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_FailedList_EnhRelocInfoRes_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabFailedListEnhRelocInfoRes-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_FailedList_EnhRelocInfoRes_specs_1 = {
+	sizeof(struct RANAP_RAB_FailedList_EnhRelocInfoRes),
+	offsetof(struct RANAP_RAB_FailedList_EnhRelocInfoRes, _asn_ctx),
+	asn_MAP_RANAP_RAB_FailedList_EnhRelocInfoRes_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_RANAP_RAB_FailedList_EnhRelocInfoRes = {
+	"RANAP_RAB-FailedList-EnhRelocInfoRes",
+	"RANAP_RAB-FailedList-EnhRelocInfoRes",
+	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_RANAP_RAB_FailedList_EnhRelocInfoRes_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_FailedList_EnhRelocInfoRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_FailedList_EnhRelocInfoRes_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_FailedList_EnhRelocInfoRes_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_FailedList_EnhRelocInfoRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_FailedList_EnhRelocInfoRes_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_FailedList_EnhRelocInfoRes_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_FailedList_EnhRelocInfoRes_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-FailedList-EnhRelocInfoRes.h b/src/ranap/RANAP_RAB-FailedList-EnhRelocInfoRes.h
new file mode 100644
index 0000000..23a0357
--- /dev/null
+++ b/src/ranap/RANAP_RAB-FailedList-EnhRelocInfoRes.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_FailedList_EnhRelocInfoRes_H_
+#define	_RANAP_RAB_FailedList_EnhRelocInfoRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-FailedList-EnhRelocInfoRes */
+typedef struct RANAP_RAB_FailedList_EnhRelocInfoRes {
+	struct rabFailedListEnhRelocInfoRes_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabFailedListEnhRelocInfoRes_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_FailedList_EnhRelocInfoRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_FailedList_EnhRelocInfoRes;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_FailedList_EnhRelocInfoRes_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-FailedList.c b/src/ranap/RANAP_RAB-FailedList.c
new file mode 100644
index 0000000..3dc8d53
--- /dev/null
+++ b/src/ranap/RANAP_RAB-FailedList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-FailedList.h"
+
+static int
+memb_rabFailedList_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_rabFailedList_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_rabFailedList_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_rabFailedList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabFailedList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabFailedList_ies_specs_2 = {
+	sizeof(struct rabFailedList_ies),
+	offsetof(struct rabFailedList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabFailedList_ies_2 = {
+	"rabFailedList-ies",
+	"rabFailedList-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_rabFailedList_ies_tags_2,
+	sizeof(asn_DEF_rabFailedList_ies_tags_2)
+		/sizeof(asn_DEF_rabFailedList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabFailedList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabFailedList_ies_tags_2)
+		/sizeof(asn_DEF_rabFailedList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabFailedList_ies_constr_2,
+	asn_MBR_rabFailedList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabFailedList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_FailedList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_FailedList, rabFailedList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabFailedList_ies_2,
+		memb_rabFailedList_ies_constraint_1,
+		&asn_PER_memb_rabFailedList_ies_constr_2,
+		0,
+		"rabFailedList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_FailedList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_FailedList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabFailedList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_FailedList_specs_1 = {
+	sizeof(struct RANAP_RAB_FailedList),
+	offsetof(struct RANAP_RAB_FailedList, _asn_ctx),
+	asn_MAP_RANAP_RAB_FailedList_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_RANAP_RAB_FailedList = {
+	"RANAP_RAB-FailedList",
+	"RANAP_RAB-FailedList",
+	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_RANAP_RAB_FailedList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_FailedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_FailedList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_FailedList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_FailedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_FailedList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_FailedList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_FailedList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-FailedList.h b/src/ranap/RANAP_RAB-FailedList.h
new file mode 100644
index 0000000..70b01dc
--- /dev/null
+++ b/src/ranap/RANAP_RAB-FailedList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_FailedList_H_
+#define	_RANAP_RAB_FailedList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-FailedList */
+typedef struct RANAP_RAB_FailedList {
+	struct rabFailedList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabFailedList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_FailedList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_FailedList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_FailedList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-FailedtoReportList.c b/src/ranap/RANAP_RAB-FailedtoReportList.c
new file mode 100644
index 0000000..5dfe091
--- /dev/null
+++ b/src/ranap/RANAP_RAB-FailedtoReportList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-FailedtoReportList.h"
+
+static int
+memb_rabFailedtoReportList_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_rabFailedtoReportList_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_rabFailedtoReportList_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_rabFailedtoReportList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabFailedtoReportList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabFailedtoReportList_ies_specs_2 = {
+	sizeof(struct rabFailedtoReportList_ies),
+	offsetof(struct rabFailedtoReportList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabFailedtoReportList_ies_2 = {
+	"rabFailedtoReportList-ies",
+	"rabFailedtoReportList-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_rabFailedtoReportList_ies_tags_2,
+	sizeof(asn_DEF_rabFailedtoReportList_ies_tags_2)
+		/sizeof(asn_DEF_rabFailedtoReportList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabFailedtoReportList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabFailedtoReportList_ies_tags_2)
+		/sizeof(asn_DEF_rabFailedtoReportList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabFailedtoReportList_ies_constr_2,
+	asn_MBR_rabFailedtoReportList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabFailedtoReportList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_FailedtoReportList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_FailedtoReportList, rabFailedtoReportList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabFailedtoReportList_ies_2,
+		memb_rabFailedtoReportList_ies_constraint_1,
+		&asn_PER_memb_rabFailedtoReportList_ies_constr_2,
+		0,
+		"rabFailedtoReportList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_FailedtoReportList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_FailedtoReportList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabFailedtoReportList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_FailedtoReportList_specs_1 = {
+	sizeof(struct RANAP_RAB_FailedtoReportList),
+	offsetof(struct RANAP_RAB_FailedtoReportList, _asn_ctx),
+	asn_MAP_RANAP_RAB_FailedtoReportList_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_RANAP_RAB_FailedtoReportList = {
+	"RANAP_RAB-FailedtoReportList",
+	"RANAP_RAB-FailedtoReportList",
+	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_RANAP_RAB_FailedtoReportList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_FailedtoReportList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_FailedtoReportList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_FailedtoReportList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_FailedtoReportList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_FailedtoReportList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_FailedtoReportList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_FailedtoReportList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-FailedtoReportList.h b/src/ranap/RANAP_RAB-FailedtoReportList.h
new file mode 100644
index 0000000..71a2024
--- /dev/null
+++ b/src/ranap/RANAP_RAB-FailedtoReportList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_FailedtoReportList_H_
+#define	_RANAP_RAB_FailedtoReportList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-FailedtoReportList */
+typedef struct RANAP_RAB_FailedtoReportList {
+	struct rabFailedtoReportList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabFailedtoReportList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_FailedtoReportList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_FailedtoReportList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_FailedtoReportList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ModifyList.c b/src/ranap/RANAP_RAB-ModifyList.c
new file mode 100644
index 0000000..8e86394
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ModifyList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ModifyList.h"
+
+static int
+memb_rabModifyList_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_rabModifyList_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_rabModifyList_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_rabModifyList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabModifyList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabModifyList_ies_specs_2 = {
+	sizeof(struct rabModifyList_ies),
+	offsetof(struct rabModifyList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabModifyList_ies_2 = {
+	"rabModifyList-ies",
+	"rabModifyList-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_rabModifyList_ies_tags_2,
+	sizeof(asn_DEF_rabModifyList_ies_tags_2)
+		/sizeof(asn_DEF_rabModifyList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabModifyList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabModifyList_ies_tags_2)
+		/sizeof(asn_DEF_rabModifyList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabModifyList_ies_constr_2,
+	asn_MBR_rabModifyList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabModifyList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ModifyList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ModifyList, rabModifyList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabModifyList_ies_2,
+		memb_rabModifyList_ies_constraint_1,
+		&asn_PER_memb_rabModifyList_ies_constr_2,
+		0,
+		"rabModifyList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ModifyList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ModifyList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabModifyList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ModifyList_specs_1 = {
+	sizeof(struct RANAP_RAB_ModifyList),
+	offsetof(struct RANAP_RAB_ModifyList, _asn_ctx),
+	asn_MAP_RANAP_RAB_ModifyList_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_RANAP_RAB_ModifyList = {
+	"RANAP_RAB-ModifyList",
+	"RANAP_RAB-ModifyList",
+	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_RANAP_RAB_ModifyList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ModifyList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ModifyList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ModifyList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ModifyList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ModifyList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ModifyList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ModifyList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ModifyList.h b/src/ranap/RANAP_RAB-ModifyList.h
new file mode 100644
index 0000000..9ec1662
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ModifyList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ModifyList_H_
+#define	_RANAP_RAB_ModifyList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ModifyList */
+typedef struct RANAP_RAB_ModifyList {
+	struct rabModifyList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabModifyList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ModifyList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ModifyList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ModifyList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-QueuedList.c b/src/ranap/RANAP_RAB-QueuedList.c
new file mode 100644
index 0000000..d8bf291
--- /dev/null
+++ b/src/ranap/RANAP_RAB-QueuedList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-QueuedList.h"
+
+static int
+memb_rabQueuedList_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_rabQueuedList_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_rabQueuedList_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_rabQueuedList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabQueuedList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabQueuedList_ies_specs_2 = {
+	sizeof(struct rabQueuedList_ies),
+	offsetof(struct rabQueuedList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabQueuedList_ies_2 = {
+	"rabQueuedList-ies",
+	"rabQueuedList-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_rabQueuedList_ies_tags_2,
+	sizeof(asn_DEF_rabQueuedList_ies_tags_2)
+		/sizeof(asn_DEF_rabQueuedList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabQueuedList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabQueuedList_ies_tags_2)
+		/sizeof(asn_DEF_rabQueuedList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabQueuedList_ies_constr_2,
+	asn_MBR_rabQueuedList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabQueuedList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_QueuedList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_QueuedList, rabQueuedList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabQueuedList_ies_2,
+		memb_rabQueuedList_ies_constraint_1,
+		&asn_PER_memb_rabQueuedList_ies_constr_2,
+		0,
+		"rabQueuedList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_QueuedList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_QueuedList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabQueuedList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_QueuedList_specs_1 = {
+	sizeof(struct RANAP_RAB_QueuedList),
+	offsetof(struct RANAP_RAB_QueuedList, _asn_ctx),
+	asn_MAP_RANAP_RAB_QueuedList_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_RANAP_RAB_QueuedList = {
+	"RANAP_RAB-QueuedList",
+	"RANAP_RAB-QueuedList",
+	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_RANAP_RAB_QueuedList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_QueuedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_QueuedList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_QueuedList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_QueuedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_QueuedList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_QueuedList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_QueuedList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-QueuedList.h b/src/ranap/RANAP_RAB-QueuedList.h
new file mode 100644
index 0000000..5380eb3
--- /dev/null
+++ b/src/ranap/RANAP_RAB-QueuedList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_QueuedList_H_
+#define	_RANAP_RAB_QueuedList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-QueuedList */
+typedef struct RANAP_RAB_QueuedList {
+	struct rabQueuedList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabQueuedList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_QueuedList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_QueuedList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_QueuedList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ReleasedList-IuRelComp.c b/src/ranap/RANAP_RAB-ReleasedList-IuRelComp.c
new file mode 100644
index 0000000..d97baa5
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ReleasedList-IuRelComp.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ReleasedList-IuRelComp.h"
+
+static int
+memb_rabReleasedListIuRelComp_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_rabReleasedListIuRelComp_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_rabReleasedListIuRelComp_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_rabReleasedListIuRelComp_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabReleasedListIuRelComp_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabReleasedListIuRelComp_ies_specs_2 = {
+	sizeof(struct rabReleasedListIuRelComp_ies),
+	offsetof(struct rabReleasedListIuRelComp_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabReleasedListIuRelComp_ies_2 = {
+	"rabReleasedListIuRelComp-ies",
+	"rabReleasedListIuRelComp-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_rabReleasedListIuRelComp_ies_tags_2,
+	sizeof(asn_DEF_rabReleasedListIuRelComp_ies_tags_2)
+		/sizeof(asn_DEF_rabReleasedListIuRelComp_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabReleasedListIuRelComp_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabReleasedListIuRelComp_ies_tags_2)
+		/sizeof(asn_DEF_rabReleasedListIuRelComp_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabReleasedListIuRelComp_ies_constr_2,
+	asn_MBR_rabReleasedListIuRelComp_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabReleasedListIuRelComp_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ReleasedList_IuRelComp_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ReleasedList_IuRelComp, rabReleasedListIuRelComp_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabReleasedListIuRelComp_ies_2,
+		memb_rabReleasedListIuRelComp_ies_constraint_1,
+		&asn_PER_memb_rabReleasedListIuRelComp_ies_constr_2,
+		0,
+		"rabReleasedListIuRelComp-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ReleasedList_IuRelComp_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ReleasedList_IuRelComp_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabReleasedListIuRelComp-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ReleasedList_IuRelComp_specs_1 = {
+	sizeof(struct RANAP_RAB_ReleasedList_IuRelComp),
+	offsetof(struct RANAP_RAB_ReleasedList_IuRelComp, _asn_ctx),
+	asn_MAP_RANAP_RAB_ReleasedList_IuRelComp_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_RANAP_RAB_ReleasedList_IuRelComp = {
+	"RANAP_RAB-ReleasedList-IuRelComp",
+	"RANAP_RAB-ReleasedList-IuRelComp",
+	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_RANAP_RAB_ReleasedList_IuRelComp_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ReleasedList_IuRelComp_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ReleasedList_IuRelComp_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ReleasedList_IuRelComp_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ReleasedList_IuRelComp_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ReleasedList_IuRelComp_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ReleasedList_IuRelComp_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ReleasedList_IuRelComp_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ReleasedList-IuRelComp.h b/src/ranap/RANAP_RAB-ReleasedList-IuRelComp.h
new file mode 100644
index 0000000..0a555e7
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ReleasedList-IuRelComp.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ReleasedList_IuRelComp_H_
+#define	_RANAP_RAB_ReleasedList_IuRelComp_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ReleasedList-IuRelComp */
+typedef struct RANAP_RAB_ReleasedList_IuRelComp {
+	struct rabReleasedListIuRelComp_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabReleasedListIuRelComp_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ReleasedList_IuRelComp_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ReleasedList_IuRelComp;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ReleasedList_IuRelComp_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ReleasedList.c b/src/ranap/RANAP_RAB-ReleasedList.c
new file mode 100644
index 0000000..d4f55d3
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ReleasedList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ReleasedList.h"
+
+static int
+memb_rabReleaesdList_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_rabReleaesdList_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_rabReleaesdList_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_rabReleaesdList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabReleaesdList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabReleaesdList_ies_specs_2 = {
+	sizeof(struct rabReleaesdList_ies),
+	offsetof(struct rabReleaesdList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabReleaesdList_ies_2 = {
+	"rabReleaesdList-ies",
+	"rabReleaesdList-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_rabReleaesdList_ies_tags_2,
+	sizeof(asn_DEF_rabReleaesdList_ies_tags_2)
+		/sizeof(asn_DEF_rabReleaesdList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabReleaesdList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabReleaesdList_ies_tags_2)
+		/sizeof(asn_DEF_rabReleaesdList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabReleaesdList_ies_constr_2,
+	asn_MBR_rabReleaesdList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabReleaesdList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ReleasedList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ReleasedList, rabReleaesdList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabReleaesdList_ies_2,
+		memb_rabReleaesdList_ies_constraint_1,
+		&asn_PER_memb_rabReleaesdList_ies_constr_2,
+		0,
+		"rabReleaesdList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ReleasedList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ReleasedList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabReleaesdList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ReleasedList_specs_1 = {
+	sizeof(struct RANAP_RAB_ReleasedList),
+	offsetof(struct RANAP_RAB_ReleasedList, _asn_ctx),
+	asn_MAP_RANAP_RAB_ReleasedList_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_RANAP_RAB_ReleasedList = {
+	"RANAP_RAB-ReleasedList",
+	"RANAP_RAB-ReleasedList",
+	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_RANAP_RAB_ReleasedList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ReleasedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ReleasedList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ReleasedList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ReleasedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ReleasedList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ReleasedList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ReleasedList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ReleasedList.h b/src/ranap/RANAP_RAB-ReleasedList.h
new file mode 100644
index 0000000..5d815d8
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ReleasedList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ReleasedList_H_
+#define	_RANAP_RAB_ReleasedList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ReleasedList */
+typedef struct RANAP_RAB_ReleasedList {
+	struct rabReleaesdList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabReleaesdList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ReleasedList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ReleasedList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ReleasedList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-RelocationReleaseList.c b/src/ranap/RANAP_RAB-RelocationReleaseList.c
new file mode 100644
index 0000000..b836c55
--- /dev/null
+++ b/src/ranap/RANAP_RAB-RelocationReleaseList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-RelocationReleaseList.h"
+
+static int
+memb_rabRelocationReleaseList_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_rabRelocationReleaseList_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_rabRelocationReleaseList_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_rabRelocationReleaseList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabRelocationReleaseList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabRelocationReleaseList_ies_specs_2 = {
+	sizeof(struct rabRelocationReleaseList_ies),
+	offsetof(struct rabRelocationReleaseList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabRelocationReleaseList_ies_2 = {
+	"rabRelocationReleaseList-ies",
+	"rabRelocationReleaseList-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_rabRelocationReleaseList_ies_tags_2,
+	sizeof(asn_DEF_rabRelocationReleaseList_ies_tags_2)
+		/sizeof(asn_DEF_rabRelocationReleaseList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabRelocationReleaseList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabRelocationReleaseList_ies_tags_2)
+		/sizeof(asn_DEF_rabRelocationReleaseList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabRelocationReleaseList_ies_constr_2,
+	asn_MBR_rabRelocationReleaseList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabRelocationReleaseList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_RelocationReleaseList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_RelocationReleaseList, rabRelocationReleaseList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabRelocationReleaseList_ies_2,
+		memb_rabRelocationReleaseList_ies_constraint_1,
+		&asn_PER_memb_rabRelocationReleaseList_ies_constr_2,
+		0,
+		"rabRelocationReleaseList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_RelocationReleaseList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_RelocationReleaseList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabRelocationReleaseList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_RelocationReleaseList_specs_1 = {
+	sizeof(struct RANAP_RAB_RelocationReleaseList),
+	offsetof(struct RANAP_RAB_RelocationReleaseList, _asn_ctx),
+	asn_MAP_RANAP_RAB_RelocationReleaseList_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_RANAP_RAB_RelocationReleaseList = {
+	"RANAP_RAB-RelocationReleaseList",
+	"RANAP_RAB-RelocationReleaseList",
+	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_RANAP_RAB_RelocationReleaseList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_RelocationReleaseList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_RelocationReleaseList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_RelocationReleaseList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_RelocationReleaseList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_RelocationReleaseList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_RelocationReleaseList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_RelocationReleaseList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-RelocationReleaseList.h b/src/ranap/RANAP_RAB-RelocationReleaseList.h
new file mode 100644
index 0000000..a68f756
--- /dev/null
+++ b/src/ranap/RANAP_RAB-RelocationReleaseList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_RelocationReleaseList_H_
+#define	_RANAP_RAB_RelocationReleaseList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-RelocationReleaseList */
+typedef struct RANAP_RAB_RelocationReleaseList {
+	struct rabRelocationReleaseList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabRelocationReleaseList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_RelocationReleaseList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_RelocationReleaseList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_RelocationReleaseList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoReq.c b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoReq.c
new file mode 100644
index 0000000..d606080
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoReq.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-SetupList-EnhRelocInfoReq.h"
+
+static int
+memb_rabSetupListEnhRelocInfoReq_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_rabSetupListEnhRelocInfoReq_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_rabSetupListEnhRelocInfoReq_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_rabSetupListEnhRelocInfoReq_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabSetupListEnhRelocInfoReq_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabSetupListEnhRelocInfoReq_ies_specs_2 = {
+	sizeof(struct rabSetupListEnhRelocInfoReq_ies),
+	offsetof(struct rabSetupListEnhRelocInfoReq_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabSetupListEnhRelocInfoReq_ies_2 = {
+	"rabSetupListEnhRelocInfoReq-ies",
+	"rabSetupListEnhRelocInfoReq-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_rabSetupListEnhRelocInfoReq_ies_tags_2,
+	sizeof(asn_DEF_rabSetupListEnhRelocInfoReq_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhRelocInfoReq_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabSetupListEnhRelocInfoReq_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabSetupListEnhRelocInfoReq_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhRelocInfoReq_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabSetupListEnhRelocInfoReq_ies_constr_2,
+	asn_MBR_rabSetupListEnhRelocInfoReq_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabSetupListEnhRelocInfoReq_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_SetupList_EnhRelocInfoReq_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_SetupList_EnhRelocInfoReq, rabSetupListEnhRelocInfoReq_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabSetupListEnhRelocInfoReq_ies_2,
+		memb_rabSetupListEnhRelocInfoReq_ies_constraint_1,
+		&asn_PER_memb_rabSetupListEnhRelocInfoReq_ies_constr_2,
+		0,
+		"rabSetupListEnhRelocInfoReq-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoReq_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_SetupList_EnhRelocInfoReq_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabSetupListEnhRelocInfoReq-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_SetupList_EnhRelocInfoReq_specs_1 = {
+	sizeof(struct RANAP_RAB_SetupList_EnhRelocInfoReq),
+	offsetof(struct RANAP_RAB_SetupList_EnhRelocInfoReq, _asn_ctx),
+	asn_MAP_RANAP_RAB_SetupList_EnhRelocInfoReq_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_RANAP_RAB_SetupList_EnhRelocInfoReq = {
+	"RANAP_RAB-SetupList-EnhRelocInfoReq",
+	"RANAP_RAB-SetupList-EnhRelocInfoReq",
+	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_RANAP_RAB_SetupList_EnhRelocInfoReq_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoReq_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoReq_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoReq_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_SetupList_EnhRelocInfoReq_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_SetupList_EnhRelocInfoReq_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoReq.h b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoReq.h
new file mode 100644
index 0000000..92f034e
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoReq.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_SetupList_EnhRelocInfoReq_H_
+#define	_RANAP_RAB_SetupList_EnhRelocInfoReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SetupList-EnhRelocInfoReq */
+typedef struct RANAP_RAB_SetupList_EnhRelocInfoReq {
+	struct rabSetupListEnhRelocInfoReq_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabSetupListEnhRelocInfoReq_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_SetupList_EnhRelocInfoReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoReq;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SetupList_EnhRelocInfoReq_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoRes.c b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoRes.c
new file mode 100644
index 0000000..b580e2f
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoRes.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-SetupList-EnhRelocInfoRes.h"
+
+static int
+memb_rabSetupListEnhRelocInfoRes_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_rabSetupListEnhRelocInfoRes_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_rabSetupListEnhRelocInfoRes_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_rabSetupListEnhRelocInfoRes_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabSetupListEnhRelocInfoRes_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabSetupListEnhRelocInfoRes_ies_specs_2 = {
+	sizeof(struct rabSetupListEnhRelocInfoRes_ies),
+	offsetof(struct rabSetupListEnhRelocInfoRes_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabSetupListEnhRelocInfoRes_ies_2 = {
+	"rabSetupListEnhRelocInfoRes-ies",
+	"rabSetupListEnhRelocInfoRes-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_rabSetupListEnhRelocInfoRes_ies_tags_2,
+	sizeof(asn_DEF_rabSetupListEnhRelocInfoRes_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhRelocInfoRes_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabSetupListEnhRelocInfoRes_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabSetupListEnhRelocInfoRes_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhRelocInfoRes_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabSetupListEnhRelocInfoRes_ies_constr_2,
+	asn_MBR_rabSetupListEnhRelocInfoRes_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabSetupListEnhRelocInfoRes_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_SetupList_EnhRelocInfoRes_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_SetupList_EnhRelocInfoRes, rabSetupListEnhRelocInfoRes_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabSetupListEnhRelocInfoRes_ies_2,
+		memb_rabSetupListEnhRelocInfoRes_ies_constraint_1,
+		&asn_PER_memb_rabSetupListEnhRelocInfoRes_ies_constr_2,
+		0,
+		"rabSetupListEnhRelocInfoRes-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoRes_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_SetupList_EnhRelocInfoRes_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabSetupListEnhRelocInfoRes-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_SetupList_EnhRelocInfoRes_specs_1 = {
+	sizeof(struct RANAP_RAB_SetupList_EnhRelocInfoRes),
+	offsetof(struct RANAP_RAB_SetupList_EnhRelocInfoRes, _asn_ctx),
+	asn_MAP_RANAP_RAB_SetupList_EnhRelocInfoRes_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_RANAP_RAB_SetupList_EnhRelocInfoRes = {
+	"RANAP_RAB-SetupList-EnhRelocInfoRes",
+	"RANAP_RAB-SetupList-EnhRelocInfoRes",
+	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_RANAP_RAB_SetupList_EnhRelocInfoRes_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoRes_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoRes_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoRes_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_SetupList_EnhRelocInfoRes_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_SetupList_EnhRelocInfoRes_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoRes.h b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoRes.h
new file mode 100644
index 0000000..611bd03
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhRelocInfoRes.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_SetupList_EnhRelocInfoRes_H_
+#define	_RANAP_RAB_SetupList_EnhRelocInfoRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SetupList-EnhRelocInfoRes */
+typedef struct RANAP_RAB_SetupList_EnhRelocInfoRes {
+	struct rabSetupListEnhRelocInfoRes_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabSetupListEnhRelocInfoRes_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_SetupList_EnhRelocInfoRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SetupList_EnhRelocInfoRes;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SetupList_EnhRelocInfoRes_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteReq.c b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteReq.c
new file mode 100644
index 0000000..2b7579c
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteReq.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-SetupList-EnhancedRelocCompleteReq.h"
+
+static int
+memb_rabSetupListEnhancedRElocCompleteReq_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_rabSetupListEnhancedRElocCompleteReq_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_rabSetupListEnhancedRElocCompleteReq_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_rabSetupListEnhancedRElocCompleteReq_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabSetupListEnhancedRElocCompleteReq_ies_specs_2 = {
+	sizeof(struct rabSetupListEnhancedRElocCompleteReq_ies),
+	offsetof(struct rabSetupListEnhancedRElocCompleteReq_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_2 = {
+	"rabSetupListEnhancedRElocCompleteReq-ies",
+	"rabSetupListEnhancedRElocCompleteReq-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_rabSetupListEnhancedRElocCompleteReq_ies_tags_2,
+	sizeof(asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabSetupListEnhancedRElocCompleteReq_ies_constr_2,
+	asn_MBR_rabSetupListEnhancedRElocCompleteReq_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabSetupListEnhancedRElocCompleteReq_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_SetupList_EnhancedRelocCompleteReq, rabSetupListEnhancedRElocCompleteReq_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabSetupListEnhancedRElocCompleteReq_ies_2,
+		memb_rabSetupListEnhancedRElocCompleteReq_ies_constraint_1,
+		&asn_PER_memb_rabSetupListEnhancedRElocCompleteReq_ies_constr_2,
+		0,
+		"rabSetupListEnhancedRElocCompleteReq-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabSetupListEnhancedRElocCompleteReq-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_specs_1 = {
+	sizeof(struct RANAP_RAB_SetupList_EnhancedRelocCompleteReq),
+	offsetof(struct RANAP_RAB_SetupList_EnhancedRelocCompleteReq, _asn_ctx),
+	asn_MAP_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_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_RANAP_RAB_SetupList_EnhancedRelocCompleteReq = {
+	"RANAP_RAB-SetupList-EnhancedRelocCompleteReq",
+	"RANAP_RAB-SetupList-EnhancedRelocCompleteReq",
+	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_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteReq.h b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteReq.h
new file mode 100644
index 0000000..6a6c9bc
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteReq.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_H_
+#define	_RANAP_RAB_SetupList_EnhancedRelocCompleteReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SetupList-EnhancedRelocCompleteReq */
+typedef struct RANAP_RAB_SetupList_EnhancedRelocCompleteReq {
+	struct rabSetupListEnhancedRElocCompleteReq_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabSetupListEnhancedRElocCompleteReq_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_SetupList_EnhancedRelocCompleteReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteReq;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SetupList_EnhancedRelocCompleteReq_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteRes.c b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteRes.c
new file mode 100644
index 0000000..6c3d464
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteRes.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-SetupList-EnhancedRelocCompleteRes.h"
+
+static int
+memb_rabSetupListEnhancedRelocCompleteRes_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_rabSetupListEnhancedRelocCompleteRes_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_rabSetupListEnhancedRelocCompleteRes_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_rabSetupListEnhancedRelocCompleteRes_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabSetupListEnhancedRelocCompleteRes_ies_specs_2 = {
+	sizeof(struct rabSetupListEnhancedRelocCompleteRes_ies),
+	offsetof(struct rabSetupListEnhancedRelocCompleteRes_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_2 = {
+	"rabSetupListEnhancedRelocCompleteRes-ies",
+	"rabSetupListEnhancedRelocCompleteRes-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_rabSetupListEnhancedRelocCompleteRes_ies_tags_2,
+	sizeof(asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabSetupListEnhancedRelocCompleteRes_ies_constr_2,
+	asn_MBR_rabSetupListEnhancedRelocCompleteRes_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabSetupListEnhancedRelocCompleteRes_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_SetupList_EnhancedRelocCompleteRes, rabSetupListEnhancedRelocCompleteRes_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabSetupListEnhancedRelocCompleteRes_ies_2,
+		memb_rabSetupListEnhancedRelocCompleteRes_ies_constraint_1,
+		&asn_PER_memb_rabSetupListEnhancedRelocCompleteRes_ies_constr_2,
+		0,
+		"rabSetupListEnhancedRelocCompleteRes-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabSetupListEnhancedRelocCompleteRes-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_specs_1 = {
+	sizeof(struct RANAP_RAB_SetupList_EnhancedRelocCompleteRes),
+	offsetof(struct RANAP_RAB_SetupList_EnhancedRelocCompleteRes, _asn_ctx),
+	asn_MAP_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_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_RANAP_RAB_SetupList_EnhancedRelocCompleteRes = {
+	"RANAP_RAB-SetupList-EnhancedRelocCompleteRes",
+	"RANAP_RAB-SetupList-EnhancedRelocCompleteRes",
+	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_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteRes.h b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteRes.h
new file mode 100644
index 0000000..d1f3999
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-EnhancedRelocCompleteRes.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_H_
+#define	_RANAP_RAB_SetupList_EnhancedRelocCompleteRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SetupList-EnhancedRelocCompleteRes */
+typedef struct RANAP_RAB_SetupList_EnhancedRelocCompleteRes {
+	struct rabSetupListEnhancedRelocCompleteRes_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabSetupListEnhancedRelocCompleteRes_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_SetupList_EnhancedRelocCompleteRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SetupList_EnhancedRelocCompleteRes;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SetupList_EnhancedRelocCompleteRes_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SetupList-RelocReq.c b/src/ranap/RANAP_RAB-SetupList-RelocReq.c
new file mode 100644
index 0000000..ac4b3a6
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-RelocReq.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-SetupList-RelocReq.h"
+
+static int
+memb_rabSetupListRelocReq_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_rabSetupListRelocReq_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_rabSetupListRelocReq_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_rabSetupListRelocReq_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabSetupListRelocReq_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabSetupListRelocReq_ies_specs_2 = {
+	sizeof(struct rabSetupListRelocReq_ies),
+	offsetof(struct rabSetupListRelocReq_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabSetupListRelocReq_ies_2 = {
+	"rabSetupListRelocReq-ies",
+	"rabSetupListRelocReq-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_rabSetupListRelocReq_ies_tags_2,
+	sizeof(asn_DEF_rabSetupListRelocReq_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListRelocReq_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabSetupListRelocReq_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabSetupListRelocReq_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListRelocReq_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabSetupListRelocReq_ies_constr_2,
+	asn_MBR_rabSetupListRelocReq_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabSetupListRelocReq_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_SetupList_RelocReq_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_SetupList_RelocReq, rabSetupListRelocReq_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabSetupListRelocReq_ies_2,
+		memb_rabSetupListRelocReq_ies_constraint_1,
+		&asn_PER_memb_rabSetupListRelocReq_ies_constr_2,
+		0,
+		"rabSetupListRelocReq-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SetupList_RelocReq_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_SetupList_RelocReq_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabSetupListRelocReq-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_SetupList_RelocReq_specs_1 = {
+	sizeof(struct RANAP_RAB_SetupList_RelocReq),
+	offsetof(struct RANAP_RAB_SetupList_RelocReq, _asn_ctx),
+	asn_MAP_RANAP_RAB_SetupList_RelocReq_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_RANAP_RAB_SetupList_RelocReq = {
+	"RANAP_RAB-SetupList-RelocReq",
+	"RANAP_RAB-SetupList-RelocReq",
+	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_RANAP_RAB_SetupList_RelocReq_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReq_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SetupList_RelocReq_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReq_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReq_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_SetupList_RelocReq_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_SetupList_RelocReq_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-SetupList-RelocReq.h b/src/ranap/RANAP_RAB-SetupList-RelocReq.h
new file mode 100644
index 0000000..84a3a56
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-RelocReq.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_SetupList_RelocReq_H_
+#define	_RANAP_RAB_SetupList_RelocReq_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SetupList-RelocReq */
+typedef struct RANAP_RAB_SetupList_RelocReq {
+	struct rabSetupListRelocReq_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabSetupListRelocReq_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_SetupList_RelocReq_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SetupList_RelocReq;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SetupList_RelocReq_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SetupList-RelocReqAck.c b/src/ranap/RANAP_RAB-SetupList-RelocReqAck.c
new file mode 100644
index 0000000..0c95d4d
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-RelocReqAck.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-SetupList-RelocReqAck.h"
+
+static int
+memb_rabSetupListRelocReqAck_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_rabSetupListRelocReqAck_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_rabSetupListRelocReqAck_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_rabSetupListRelocReqAck_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabSetupListRelocReqAck_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabSetupListRelocReqAck_ies_specs_2 = {
+	sizeof(struct rabSetupListRelocReqAck_ies),
+	offsetof(struct rabSetupListRelocReqAck_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabSetupListRelocReqAck_ies_2 = {
+	"rabSetupListRelocReqAck-ies",
+	"rabSetupListRelocReqAck-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_rabSetupListRelocReqAck_ies_tags_2,
+	sizeof(asn_DEF_rabSetupListRelocReqAck_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListRelocReqAck_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabSetupListRelocReqAck_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabSetupListRelocReqAck_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupListRelocReqAck_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabSetupListRelocReqAck_ies_constr_2,
+	asn_MBR_rabSetupListRelocReqAck_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabSetupListRelocReqAck_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_SetupList_RelocReqAck_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_SetupList_RelocReqAck, rabSetupListRelocReqAck_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabSetupListRelocReqAck_ies_2,
+		memb_rabSetupListRelocReqAck_ies_constraint_1,
+		&asn_PER_memb_rabSetupListRelocReqAck_ies_constr_2,
+		0,
+		"rabSetupListRelocReqAck-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SetupList_RelocReqAck_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_SetupList_RelocReqAck_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabSetupListRelocReqAck-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_SetupList_RelocReqAck_specs_1 = {
+	sizeof(struct RANAP_RAB_SetupList_RelocReqAck),
+	offsetof(struct RANAP_RAB_SetupList_RelocReqAck, _asn_ctx),
+	asn_MAP_RANAP_RAB_SetupList_RelocReqAck_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_RANAP_RAB_SetupList_RelocReqAck = {
+	"RANAP_RAB-SetupList-RelocReqAck",
+	"RANAP_RAB-SetupList-RelocReqAck",
+	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_RANAP_RAB_SetupList_RelocReqAck_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReqAck_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReqAck_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SetupList_RelocReqAck_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReqAck_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupList_RelocReqAck_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_SetupList_RelocReqAck_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_SetupList_RelocReqAck_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-SetupList-RelocReqAck.h b/src/ranap/RANAP_RAB-SetupList-RelocReqAck.h
new file mode 100644
index 0000000..a1b16dc
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupList-RelocReqAck.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_SetupList_RelocReqAck_H_
+#define	_RANAP_RAB_SetupList_RelocReqAck_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SetupList-RelocReqAck */
+typedef struct RANAP_RAB_SetupList_RelocReqAck {
+	struct rabSetupListRelocReqAck_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabSetupListRelocReqAck_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_SetupList_RelocReqAck_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SetupList_RelocReqAck;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SetupList_RelocReqAck_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-SetupOrModifiedList.c b/src/ranap/RANAP_RAB-SetupOrModifiedList.c
new file mode 100644
index 0000000..499b8b7
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupOrModifiedList.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-SetupOrModifiedList.h"
+
+static int
+memb_rabSetupOrModifiedList_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_rabSetupOrModifiedList_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_rabSetupOrModifiedList_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_rabSetupOrModifiedList_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabSetupOrModifiedList_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabSetupOrModifiedList_ies_specs_2 = {
+	sizeof(struct rabSetupOrModifiedList_ies),
+	offsetof(struct rabSetupOrModifiedList_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabSetupOrModifiedList_ies_2 = {
+	"rabSetupOrModifiedList-ies",
+	"rabSetupOrModifiedList-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_rabSetupOrModifiedList_ies_tags_2,
+	sizeof(asn_DEF_rabSetupOrModifiedList_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupOrModifiedList_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabSetupOrModifiedList_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabSetupOrModifiedList_ies_tags_2)
+		/sizeof(asn_DEF_rabSetupOrModifiedList_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabSetupOrModifiedList_ies_constr_2,
+	asn_MBR_rabSetupOrModifiedList_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabSetupOrModifiedList_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_SetupOrModifiedList_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_SetupOrModifiedList, rabSetupOrModifiedList_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabSetupOrModifiedList_ies_2,
+		memb_rabSetupOrModifiedList_ies_constraint_1,
+		&asn_PER_memb_rabSetupOrModifiedList_ies_constr_2,
+		0,
+		"rabSetupOrModifiedList-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_SetupOrModifiedList_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_SetupOrModifiedList_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabSetupOrModifiedList-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_SetupOrModifiedList_specs_1 = {
+	sizeof(struct RANAP_RAB_SetupOrModifiedList),
+	offsetof(struct RANAP_RAB_SetupOrModifiedList, _asn_ctx),
+	asn_MAP_RANAP_RAB_SetupOrModifiedList_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_RANAP_RAB_SetupOrModifiedList = {
+	"RANAP_RAB-SetupOrModifiedList",
+	"RANAP_RAB-SetupOrModifiedList",
+	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_RANAP_RAB_SetupOrModifiedList_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_SetupOrModifiedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupOrModifiedList_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_SetupOrModifiedList_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_SetupOrModifiedList_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_SetupOrModifiedList_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_SetupOrModifiedList_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_SetupOrModifiedList_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-SetupOrModifiedList.h b/src/ranap/RANAP_RAB-SetupOrModifiedList.h
new file mode 100644
index 0000000..5165ea9
--- /dev/null
+++ b/src/ranap/RANAP_RAB-SetupOrModifiedList.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_SetupOrModifiedList_H_
+#define	_RANAP_RAB_SetupOrModifiedList_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-SetupOrModifiedList */
+typedef struct RANAP_RAB_SetupOrModifiedList {
+	struct rabSetupOrModifiedList_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabSetupOrModifiedList_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_SetupOrModifiedList_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_SetupOrModifiedList;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_SetupOrModifiedList_H_ */
+#include <asn_internal.h>
diff --git a/src/ranap/RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.c b/src/ranap/RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.c
new file mode 100644
index 0000000..de451a0
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.c
@@ -0,0 +1,145 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#include "RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.h"
+
+static int
+memb_rabToBeReleasedListEnhancedRelocCompleteRes_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_rabToBeReleasedListEnhancedRelocCompleteRes_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_rabToBeReleasedListEnhancedRelocCompleteRes_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_rabToBeReleasedListEnhancedRelocCompleteRes_ies_2[] = {
+	{ ATF_POINTER, 0, 0,
+		-1 /* Ambiguous tag (CHOICE?) */,
+		0,
+		&asn_DEF_RANAP_IE,
+		0,	/* Defer constraints checking to the member type */
+		0,	/* No PER visible constraints */
+		0,
+		""
+		},
+};
+static const ber_tlv_tag_t asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_tags_2[] = {
+	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static asn_SET_OF_specifics_t asn_SPC_rabToBeReleasedListEnhancedRelocCompleteRes_ies_specs_2 = {
+	sizeof(struct rabToBeReleasedListEnhancedRelocCompleteRes_ies),
+	offsetof(struct rabToBeReleasedListEnhancedRelocCompleteRes_ies, _asn_ctx),
+	0,	/* XER encoding is XMLDelimitedItemList */
+};
+static /* Use -fall-defs-global to expose */
+asn_TYPE_descriptor_t asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_2 = {
+	"rabToBeReleasedListEnhancedRelocCompleteRes-ies",
+	"rabToBeReleasedListEnhancedRelocCompleteRes-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_rabToBeReleasedListEnhancedRelocCompleteRes_ies_tags_2,
+	sizeof(asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_tags_2)
+		/sizeof(asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_tags_2[0]) - 1, /* 1 */
+	asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_tags_2,	/* Same as above */
+	sizeof(asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_tags_2)
+		/sizeof(asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_tags_2[0]), /* 2 */
+	&asn_PER_type_rabToBeReleasedListEnhancedRelocCompleteRes_ies_constr_2,
+	asn_MBR_rabToBeReleasedListEnhancedRelocCompleteRes_ies_2,
+	1,	/* Single element */
+	&asn_SPC_rabToBeReleasedListEnhancedRelocCompleteRes_ies_specs_2	/* Additional specs */
+};
+
+static asn_TYPE_member_t asn_MBR_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_1[] = {
+	{ ATF_NOFLAGS, 0, offsetof(struct RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes, rabToBeReleasedListEnhancedRelocCompleteRes_ies),
+		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
+		0,
+		&asn_DEF_rabToBeReleasedListEnhancedRelocCompleteRes_ies_2,
+		memb_rabToBeReleasedListEnhancedRelocCompleteRes_ies_constraint_1,
+		&asn_PER_memb_rabToBeReleasedListEnhancedRelocCompleteRes_ies_constr_2,
+		0,
+		"rabToBeReleasedListEnhancedRelocCompleteRes-ies"
+		},
+};
+static const ber_tlv_tag_t asn_DEF_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tags_1[] = {
+	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
+};
+static const asn_TYPE_tag2member_t asn_MAP_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tag2el_1[] = {
+    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* rabToBeReleasedListEnhancedRelocCompleteRes-ies */
+};
+static asn_SEQUENCE_specifics_t asn_SPC_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_specs_1 = {
+	sizeof(struct RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes),
+	offsetof(struct RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes, _asn_ctx),
+	asn_MAP_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_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_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes = {
+	"RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes",
+	"RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes",
+	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_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tags_1,
+	sizeof(asn_DEF_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tags_1[0]), /* 1 */
+	asn_DEF_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tags_1,	/* Same as above */
+	sizeof(asn_DEF_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tags_1)
+		/sizeof(asn_DEF_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_tags_1[0]), /* 1 */
+	0,	/* No PER visible constraints */
+	asn_MBR_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_1,
+	1,	/* Elements count */
+	&asn_SPC_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_specs_1	/* Additional specs */
+};
+
diff --git a/src/ranap/RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.h b/src/ranap/RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.h
new file mode 100644
index 0000000..cffd964
--- /dev/null
+++ b/src/ranap/RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes.h
@@ -0,0 +1,48 @@
+/*
+ * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
+ * From ASN.1 module "RANAP-PDU"
+ * 	found in "../../asn1/ranap/RANAP-PDU.asn"
+ */
+
+#ifndef	_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_H_
+#define	_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_H_
+
+
+#include <asn_application.h>
+
+/* Including external dependencies */
+#include "RANAP_IE.h"
+#include <asn_SEQUENCE_OF.h>
+#include <constr_SEQUENCE_OF.h>
+#include <constr_SEQUENCE.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* RANAP_RAB-ToBeReleasedList-EnhancedRelocCompleteRes */
+typedef struct RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes {
+	struct rabToBeReleasedListEnhancedRelocCompleteRes_ies {
+		A_SEQUENCE_OF(RANAP_IE_t) list;
+		
+		/* Context for parsing across buffer boundaries */
+		asn_struct_ctx_t _asn_ctx;
+	} rabToBeReleasedListEnhancedRelocCompleteRes_ies;
+	/*
+	 * This type is extensible,
+	 * possible extensions are below.
+	 */
+	
+	/* Context for parsing across buffer boundaries */
+	asn_struct_ctx_t _asn_ctx;
+} RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_t;
+
+/* Implementation */
+extern asn_TYPE_descriptor_t asn_DEF_RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif	/* _RANAP_RAB_ToBeReleasedList_EnhancedRelocCompleteRes_H_ */
+#include <asn_internal.h>
