diff --git a/src/Makefile.am b/src/Makefile.am
index d6498b2..e0b916d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,7 +8,7 @@
 
 bin_PROGRAMS = hnbgw
 
-hnbgw_SOURCES = hnbap_encoder.c hnbap_decoder.c rua_encoder.c rua_decoder.c ranap_common.c rua_common.c hnbap_common.c iu_helpers.c asn1helpers.c hnbgw.c hnbgw_hnbap.c hnbgw_rua.c hnbgw_ranap.c 
+hnbgw_SOURCES = hnbap_encoder.c hnbap_decoder.c rua_encoder.c rua_decoder.c ranap_common.c rua_common.c hnbap_common.c iu_helpers.c asn1helpers.c hnbgw.c hnbgw_hnbap.c hnbgw_rua.c hnbgw_ranap.c ranap_decoder.c ranap_encoder.c
 hnbgw_LDADD = $(OSMOCORE_LIBS) $(OSMOVTY_LIBS) $(OSMOGSM_LIBS) $(ASN1C_LIBS) $(COMMON_LDADD) hnbap/libosmo-asn1-hnbap.a rua/libosmo-asn1-rua.a ranap/libosmo-asn1-ranap.a
 
 
diff --git a/src/hnbgw_ranap.c b/src/hnbgw_ranap.c
index 15efb85..9cad6ae 100644
--- a/src/hnbgw_ranap.c
+++ b/src/hnbgw_ranap.c
@@ -32,492 +32,8 @@
 
 #include "hnbgw.h"
 #include "hnbgw_rua.h"
-//#include "ranap_common.h"
-
-#include "ranap/RANAP_RANAP-PDU.h"
-#include "ranap/RANAP_ResetAcknowledge.h"
-#include "ranap/RANAP_Reset.h"
-#include "ranap/RANAP_ProtocolIE-ID.h"
-#include "ranap/RANAP_Cause.h"
-#include "ranap/RANAP_CN-DomainIndicator.h"
-#include "ranap/RANAP_GlobalRNC-ID.h"
-#include "ranap/RANAP_CriticalityDiagnostics.h"
-
-/***********************************************************************
- * BEGIN auto-generated copy+pasted
- ***********************************************************************/
-
-/* this is copy+pasted from the asn1tostruct generated code that doesn't
- * compile as a whole */
-
-#define RANAP_DEBUG(x, args ...) DEBUGP(0, x, ## args)
-
-extern int asn1_xer_print;
-
-struct msgb *ranap_generate_successful_outcome(
-					   e_RANAP_ProcedureCode procedureCode,
-					   RANAP_Criticality_t criticality,
-					   asn_TYPE_descriptor_t * td,
-					   void *sptr);
-
-RANAP_IE_t *ranap_new_ie(RANAP_ProtocolIE_ID_t id, RANAP_Criticality_t criticality,
-			 asn_TYPE_descriptor_t *type, void *sptr);
-
-#define RESETIES_RANAP_GLOBALRNC_ID_PRESENT (1 << 0)
-
-typedef struct RANAP_ResetIEs_s {
-    uint16_t             presenceMask;
-    RANAP_Cause_t        cause;
-    RANAP_CN_DomainIndicator_t cN_DomainIndicator;
-    RANAP_GlobalRNC_ID_t globalRNC_ID; ///< Optional field
-} RANAP_ResetIEs_t;
-
-#define RESETACKNOWLEDGEIES_RANAP_CRITICALITYDIAGNOSTICS_PRESENT (1 << 0)
-#define RESETACKNOWLEDGEIES_RANAP_GLOBALRNC_ID_PRESENT     (1 << 1)
-
-typedef struct RANAP_ResetAcknowledgeIEs_s {
-    uint16_t                 presenceMask;
-    RANAP_CN_DomainIndicator_t cN_DomainIndicator;
-    RANAP_CriticalityDiagnostics_t criticalityDiagnostics; ///< Optional field
-    RANAP_GlobalRNC_ID_t     globalRNC_ID; ///< Optional field
-} RANAP_ResetAcknowledgeIEs_t;
-
-int ranap_decode_reseties(
-    RANAP_ResetIEs_t *resetIEs,
-    ANY_t *any_p) {
-
-    RANAP_Reset_t  reset;
-    RANAP_Reset_t *reset_p = &reset;
-    int i, decoded = 0;
-    int tempDecoded = 0;
-    assert(any_p != NULL);
-    assert(resetIEs != NULL);
-
-    RANAP_DEBUG("Decoding message RANAP_ResetIEs (%s:%d)\n", __FILE__, __LINE__);
-
-    ANY_to_type_aper(any_p, &asn_DEF_RANAP_Reset, (void**)&reset_p);
-
-    for (i = 0; i < reset_p->reset_ies.list.count; i++) {
-        RANAP_IE_t *ie_p;
-        ie_p = reset_p->reset_ies.list.array[i];
-        switch(ie_p->id) {
-            case RANAP_ProtocolIE_ID_id_Cause:
-            {
-                RANAP_Cause_t  ranaP_Cause;
-                RANAP_Cause_t *ranaP_Cause_p = &ranaP_Cause;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_Cause, (void**)&ranaP_Cause_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE cause failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_Cause, ranaP_Cause_p);
-                memcpy(&resetIEs->cause, ranaP_Cause_p, sizeof(RANAP_Cause_t));
-            } break;
-            case RANAP_ProtocolIE_ID_id_CN_DomainIndicator:
-            {
-                RANAP_CN_DomainIndicator_t  ranaP_CNDomainIndicator;
-                RANAP_CN_DomainIndicator_t *ranaP_CNDomainIndicator_p = &ranaP_CNDomainIndicator;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_CN_DomainIndicator, (void**)&ranaP_CNDomainIndicator_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE cN_DomainIndicator failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_CN_DomainIndicator, ranaP_CNDomainIndicator_p);
-                memcpy(&resetIEs->cN_DomainIndicator, ranaP_CNDomainIndicator_p, sizeof(RANAP_CN_DomainIndicator_t));
-            } break;
-            /* Optional field */
-            case RANAP_ProtocolIE_ID_id_GlobalRNC_ID:
-            {
-#if 0
-                RANAP_GlobalRNC_ID_t  ranaP_GlobalRNCID;
-                RANAP_GlobalRNC_ID_t *ranaP_GlobalRNCID_p = &ranaP_GlobalRNCID;
-                resetIEs->presenceMask |= RESETIES_RANAP_GLOBALRNC_ID_PRESENT;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_GlobalRNC_ID, (void**)&ranaP_GlobalRNCID_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE globalRNC_ID failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_GlobalRNC_ID, ranaP_GlobalRNCID_p);
-                memcpy(&resetIEs->globalRNC_ID, ranaP_GlobalRNCID_p, sizeof(RANAP_GlobalRNC_ID_t));
-#endif
-            } break;
-            default:
-                RANAP_DEBUG("Unknown protocol IE id (%d) for message reseties\n", (int)ie_p->id);
-                return -1;
-        }
-    }
-    return decoded;
-}
-
-int ranap_encode_resetacknowledgeies(
-    RANAP_ResetAcknowledge_t *resetAcknowledge,
-    RANAP_ResetAcknowledgeIEs_t *resetAcknowledgeIEs) {
-
-    RANAP_IE_t *ie;
-
-    if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_CN_DomainIndicator,
-                          RANAP_Criticality_reject,
-                          &asn_DEF_RANAP_CN_DomainIndicator,
-                          &resetAcknowledgeIEs->cN_DomainIndicator)) == NULL) {
-        return -1;
-    }
-    ASN_SEQUENCE_ADD(&resetAcknowledge->resetAcknowledge_ies.list, ie);
-
-    /* Optional field */
-    if ((resetAcknowledgeIEs->presenceMask & RESETACKNOWLEDGEIES_RANAP_CRITICALITYDIAGNOSTICS_PRESENT)
-        == RESETACKNOWLEDGEIES_RANAP_CRITICALITYDIAGNOSTICS_PRESENT) {
-        if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_CriticalityDiagnostics,
-                              RANAP_Criticality_ignore,
-                              &asn_DEF_RANAP_CriticalityDiagnostics,
-                              &resetAcknowledgeIEs->criticalityDiagnostics)) == NULL) {
-            return -1;
-        }
-        ASN_SEQUENCE_ADD(&resetAcknowledge->resetAcknowledge_ies.list, ie);
-    }
-
-    /* Optional field */
-    if ((resetAcknowledgeIEs->presenceMask & RESETACKNOWLEDGEIES_RANAP_GLOBALRNC_ID_PRESENT)
-        == RESETACKNOWLEDGEIES_RANAP_GLOBALRNC_ID_PRESENT) {
-        if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_GlobalRNC_ID,
-                              RANAP_Criticality_ignore,
-                              &asn_DEF_RANAP_GlobalRNC_ID,
-                              &resetAcknowledgeIEs->globalRNC_ID)) == NULL) {
-            return -1;
-        }
-        ASN_SEQUENCE_ADD(&resetAcknowledge->resetAcknowledge_ies.list, ie);
-    }
-
-    return 0;
-}
-
-#include "ranap/RANAP_InitialUE-Message.h"
-#include "ranap/RANAP_CN-DomainIndicator.h"
-#include "ranap/RANAP_LAI.h"
-#include "ranap/RANAP_SAI.h"
-#include "ranap/RANAP_NAS-PDU.h"
-#include "ranap/RANAP_IuSignallingConnectionIdentifier.h"
-#include "ranap/RANAP_GlobalCN-ID.h"
-
-typedef struct RANAP_InitialUE_MessageIEs_s {
-    RANAP_CN_DomainIndicator_t         cN_DomainIndicator;
-    RANAP_LAI_t                        lai;
-    RANAP_SAI_t                        sai;
-    RANAP_NAS_PDU_t                    nas_pdu;
-    RANAP_IuSignallingConnectionIdentifier_t iuSigConId;
-    RANAP_GlobalRNC_ID_t               globalRNC_ID;
-} RANAP_InitialUE_MessageIEs_t;
-
-int ranap_decode_initialue_messageies(
-    RANAP_InitialUE_MessageIEs_t *initialUE_MessageIEs,
-    ANY_t *any_p) {
-
-    RANAP_InitialUE_Message_t  initialUE_Message;
-    RANAP_InitialUE_Message_t *initialUE_Message_p = &initialUE_Message;
-    int i, decoded = 0;
-    int tempDecoded = 0;
-    assert(any_p != NULL);
-    assert(initialUE_MessageIEs != NULL);
-
-    RANAP_DEBUG("Decoding message RANAP_InitialUE_MessageIEs (%s:%d)\n", __FILE__, __LINE__);
-
-    ANY_to_type_aper(any_p, &asn_DEF_RANAP_InitialUE_Message, (void**)&initialUE_Message_p);
-
-    for (i = 0; i < initialUE_Message_p->initialUE_Message_ies.list.count; i++) {
-        RANAP_IE_t *ie_p;
-        ie_p = initialUE_Message_p->initialUE_Message_ies.list.array[i];
-        switch(ie_p->id) {
-            case RANAP_ProtocolIE_ID_id_CN_DomainIndicator:
-            {
-                RANAP_CN_DomainIndicator_t  ranaP_CNDomainIndicator;
-                RANAP_CN_DomainIndicator_t *ranaP_CNDomainIndicator_p = &ranaP_CNDomainIndicator;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_CN_DomainIndicator, (void**)&ranaP_CNDomainIndicator_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE cN_DomainIndicator failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_CN_DomainIndicator, ranaP_CNDomainIndicator_p);
-                memcpy(&initialUE_MessageIEs->cN_DomainIndicator, ranaP_CNDomainIndicator_p, sizeof(RANAP_CN_DomainIndicator_t));
-            } break;
-            case RANAP_ProtocolIE_ID_id_LAI:
-            {
-                RANAP_LAI_t  ranap_lai;
-                RANAP_LAI_t *ranap_lai_p = &ranap_lai;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_LAI, (void**)&ranap_lai_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE lai failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_LAI, ranap_lai_p);
-                memcpy(&initialUE_MessageIEs->lai, ranap_lai_p, sizeof(RANAP_LAI_t));
-            } break;
-            case RANAP_ProtocolIE_ID_id_SAI:
-            {
-                RANAP_SAI_t  ranap_sai;
-                RANAP_SAI_t *ranap_sai_p = &ranap_sai;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_SAI, (void**)&ranap_sai_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE sai failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_SAI, ranap_sai_p);
-                memcpy(&initialUE_MessageIEs->sai, ranap_sai_p, sizeof(RANAP_SAI_t));
-            } break;
-            case RANAP_ProtocolIE_ID_id_NAS_PDU:
-            {
-                RANAP_NAS_PDU_t  ranap_naspdu;
-                RANAP_NAS_PDU_t *ranap_naspdu_p = &ranap_naspdu;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_NAS_PDU, (void**)&ranap_naspdu_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE nas_pdu failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_NAS_PDU, ranap_naspdu_p);
-                memcpy(&initialUE_MessageIEs->nas_pdu, ranap_naspdu_p, sizeof(RANAP_NAS_PDU_t));
-            } break;
-            case RANAP_ProtocolIE_ID_id_IuSigConId:
-            {
-                RANAP_IuSignallingConnectionIdentifier_t  ranaP_IuSignallingConnectionIdentifier;
-                RANAP_IuSignallingConnectionIdentifier_t *ranaP_IuSignallingConnectionIdentifier_p = &ranaP_IuSignallingConnectionIdentifier;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_IuSignallingConnectionIdentifier, (void**)&ranaP_IuSignallingConnectionIdentifier_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE iuSigConId failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_IuSignallingConnectionIdentifier, ranaP_IuSignallingConnectionIdentifier_p);
-                memcpy(&initialUE_MessageIEs->iuSigConId, ranaP_IuSignallingConnectionIdentifier_p, sizeof(RANAP_IuSignallingConnectionIdentifier_t));
-            } break;
-            case RANAP_ProtocolIE_ID_id_GlobalRNC_ID:
-            {
-                RANAP_GlobalRNC_ID_t  ranaP_GlobalRNCID;
-                RANAP_GlobalRNC_ID_t *ranaP_GlobalRNCID_p = &ranaP_GlobalRNCID;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_GlobalRNC_ID, (void**)&ranaP_GlobalRNCID_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE globalRNC_ID failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_GlobalRNC_ID, ranaP_GlobalRNCID_p);
-                memcpy(&initialUE_MessageIEs->globalRNC_ID, ranaP_GlobalRNCID_p, sizeof(RANAP_GlobalRNC_ID_t));
-            } break;
-            default:
-                RANAP_DEBUG("Unknown protocol IE id (%d) for message initialue_messageies\n", (int)ie_p->id);
-                return -1;
-        }
-    }
-    return decoded;
-}
-
-#include "ranap/RANAP_DirectTransfer.h"
-#include "ranap/RANAP_SAPI.h"
-#include "ranap/RANAP_RAC.h"
-
-#define DIRECTTRANSFERIES_RANAP_LAI_PRESENT (1 << 0)
-#define DIRECTTRANSFERIES_RANAP_RAC_PRESENT (1 << 1)
-#define DIRECTTRANSFERIES_RANAP_SAI_PRESENT (1 << 2)
-#define DIRECTTRANSFERIES_RANAP_SAPI_PRESENT (1 << 3)
-
-typedef struct RANAP_DirectTransferIEs_s {
-    uint16_t  presenceMask;
-    RANAP_NAS_PDU_t nas_pdu;
-    RANAP_LAI_t lai; ///< Optional field
-    RANAP_RAC_t rac; ///< Optional field
-    RANAP_SAI_t sai; ///< Optional field
-    RANAP_SAPI_t sapi; ///< Optional field
-} RANAP_DirectTransferIEs_t;
-
-int ranap_decode_directtransferies(
-    RANAP_DirectTransferIEs_t *directTransferIEs,
-    ANY_t *any_p) {
-
-    RANAP_DirectTransfer_t  directTransfer;
-    RANAP_DirectTransfer_t *directTransfer_p = &directTransfer;
-    int i, decoded = 0;
-    int tempDecoded = 0;
-    assert(any_p != NULL);
-    assert(directTransferIEs != NULL);
-
-    RANAP_DEBUG("Decoding message RANAP_DirectTransferIEs (%s:%d)\n", __FILE__, __LINE__);
-
-    ANY_to_type_aper(any_p, &asn_DEF_RANAP_DirectTransfer, (void**)&directTransfer_p);
-
-    for (i = 0; i < directTransfer_p->directTransfer_ies.list.count; i++) {
-        RANAP_IE_t *ie_p;
-        ie_p = directTransfer_p->directTransfer_ies.list.array[i];
-        switch(ie_p->id) {
-            case RANAP_ProtocolIE_ID_id_NAS_PDU:
-            {
-                RANAP_NAS_PDU_t  ranap_naspdu;
-                RANAP_NAS_PDU_t *ranap_naspdu_p = &ranap_naspdu;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_NAS_PDU, (void**)&ranap_naspdu_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE nas_pdu failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_NAS_PDU, ranap_naspdu_p);
-                memcpy(&directTransferIEs->nas_pdu, ranap_naspdu_p, sizeof(RANAP_NAS_PDU_t));
-            } break;
-            /* Optional field */
-            case RANAP_ProtocolIE_ID_id_LAI:
-            {
-                RANAP_LAI_t  ranap_lai;
-                RANAP_LAI_t *ranap_lai_p = &ranap_lai;
-                directTransferIEs->presenceMask |= DIRECTTRANSFERIES_RANAP_LAI_PRESENT;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_LAI, (void**)&ranap_lai_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE lai failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_LAI, ranap_lai_p);
-                memcpy(&directTransferIEs->lai, ranap_lai_p, sizeof(RANAP_LAI_t));
-            } break;
-            /* Optional field */
-            case RANAP_ProtocolIE_ID_id_RAC:
-            {
-                RANAP_RAC_t  ranap_rac;
-                RANAP_RAC_t *ranap_rac_p = &ranap_rac;
-                directTransferIEs->presenceMask |= DIRECTTRANSFERIES_RANAP_RAC_PRESENT;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_RAC, (void**)&ranap_rac_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE rac failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_RAC, ranap_rac_p);
-                memcpy(&directTransferIEs->rac, ranap_rac_p, sizeof(RANAP_RAC_t));
-            } break;
-            /* Optional field */
-            case RANAP_ProtocolIE_ID_id_SAI:
-            {
-                RANAP_SAI_t  ranap_sai;
-                RANAP_SAI_t *ranap_sai_p = &ranap_sai;
-                directTransferIEs->presenceMask |= DIRECTTRANSFERIES_RANAP_SAI_PRESENT;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_SAI, (void**)&ranap_sai_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE sai failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_SAI, ranap_sai_p);
-                memcpy(&directTransferIEs->sai, ranap_sai_p, sizeof(RANAP_SAI_t));
-            } break;
-            /* Optional field */
-            case RANAP_ProtocolIE_ID_id_SAPI:
-            {
-                RANAP_SAPI_t  ranap_sapi;
-                RANAP_SAPI_t *ranap_sapi_p = &ranap_sapi;
-                directTransferIEs->presenceMask |= DIRECTTRANSFERIES_RANAP_SAPI_PRESENT;
-                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_SAPI, (void**)&ranap_sapi_p);
-                if (tempDecoded < 0) {
-                    RANAP_DEBUG("Decoding of IE sapi failed\n");
-                    return -1;
-                }
-                decoded += tempDecoded;
-                if (asn1_xer_print)
-                    xer_fprint(stdout, &asn_DEF_RANAP_SAPI, ranap_sapi_p);
-                memcpy(&directTransferIEs->sapi, ranap_sapi_p, sizeof(RANAP_SAPI_t));
-            } break;
-            default:
-                RANAP_DEBUG("Unknown protocol IE id (%d) for message directtransferies\n", (int)ie_p->id);
-                return -1;
-        }
-    }
-    return decoded;
-}
-
-int ranap_encode_directtransferies(
-    RANAP_DirectTransfer_t *directTransfer,
-    RANAP_DirectTransferIEs_t *directTransferIEs) {
-
-    RANAP_IE_t *ie;
-
-    if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_NAS_PDU,
-                          RANAP_Criticality_ignore,
-                          &asn_DEF_RANAP_NAS_PDU,
-                          &directTransferIEs->nas_pdu)) == NULL) {
-        return -1;
-    }
-    ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
-
-    /* Optional field */
-    if ((directTransferIEs->presenceMask & DIRECTTRANSFERIES_RANAP_LAI_PRESENT)
-        == DIRECTTRANSFERIES_RANAP_LAI_PRESENT) {
-        if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_LAI,
-                              RANAP_Criticality_ignore,
-                              &asn_DEF_RANAP_LAI,
-                              &directTransferIEs->lai)) == NULL) {
-            return -1;
-        }
-        ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
-    }
-
-    /* Optional field */
-    if ((directTransferIEs->presenceMask & DIRECTTRANSFERIES_RANAP_RAC_PRESENT)
-        == DIRECTTRANSFERIES_RANAP_RAC_PRESENT) {
-        if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_RAC,
-                              RANAP_Criticality_ignore,
-                              &asn_DEF_RANAP_RAC,
-                              &directTransferIEs->rac)) == NULL) {
-            return -1;
-        }
-        ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
-    }
-
-    /* Optional field */
-    if ((directTransferIEs->presenceMask & DIRECTTRANSFERIES_RANAP_SAI_PRESENT)
-        == DIRECTTRANSFERIES_RANAP_SAI_PRESENT) {
-        if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_SAI,
-                              RANAP_Criticality_ignore,
-                              &asn_DEF_RANAP_SAI,
-                              &directTransferIEs->sai)) == NULL) {
-            return -1;
-        }
-        ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
-    }
-
-    /* Optional field */
-    if ((directTransferIEs->presenceMask & DIRECTTRANSFERIES_RANAP_SAPI_PRESENT)
-        == DIRECTTRANSFERIES_RANAP_SAPI_PRESENT) {
-        if ((ie = ranap_new_ie(RANAP_ProtocolIE_ID_id_SAPI,
-                              RANAP_Criticality_ignore,
-                              &asn_DEF_RANAP_SAPI,
-                              &directTransferIEs->sapi)) == NULL) {
-            return -1;
-        }
-        ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
-    }
-
-    return 0;
-}
-
-
-
-
-/***********************************************************************
- * END auto-generated copy+pasted
- ***********************************************************************/
+#include "ranap_common.h"
+#include "ranap_ies_defs.h"
 
 static int ranap_tx_reset_ack(struct hnb_context *hnb,
 				RANAP_CN_DomainIndicator_t domain)
