diff --git a/asn1/rua/eurecom/rua_decoder.c b/asn1/rua/eurecom/rua_decoder.c
new file mode 100644
index 0000000..521ecab
--- /dev/null
+++ b/asn1/rua/eurecom/rua_decoder.c
@@ -0,0 +1,390 @@
+/*******************************************************************************
+
+  Eurecom OpenAirInterface
+  Copyright(c) 1999 - 2012 Eurecom
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms and conditions of the GNU General Public License,
+  version 2, as published by the Free Software Foundation.
+
+  This program is distributed in the hope it will be useful, but WITHOUT
+  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+  more details.
+
+  You should have received a copy of the GNU General Public License along with
+  this program; if not, write to the Free Software Foundation, Inc.,
+  51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+
+  The full GNU General Public License is included in this distribution in
+  the file called "COPYING".
+
+  Contact Information
+  Openair Admin: openair_admin@eurecom.fr
+  Openair Tech : openair_tech@eurecom.fr
+  Forums       : http://forums.eurecom.fr/openairinterface
+  Address      : EURECOM, Campus SophiaTech, 450 Route des Chappes
+                 06410 Biot FRANCE
+
+*******************************************************************************/
+
+/*******************************************************************************
+ * This file had been created by asn1tostruct.py script v0.5
+ * Please do not modify this file but regenerate it via script.
+ * Created on: 2015-08-29 14:31:31.109013 by laforge
+ * from ['../RUA-CommonDataTypes.asn', '../RUA-Constants.asn', '../RUA-Containers.asn', '../RUA-IEs.asn', '../RUA-PDU-Contents.asn', '../RUA-PDU-Descriptions.asn']
+ ******************************************************************************/
+#include "rua_common.h"
+#include "rua_ies_defs.h"
+
+int rua_decode_connecties(
+    ConnectIEs_t *connectIEs,
+    ANY_t *any_p) {
+
+    Connect_t  connect;
+    Connect_t *connect_p = &connect;
+    int i, decoded = 0;
+    int tempDecoded = 0;
+    assert(any_p != NULL);
+    assert(connectIEs != NULL);
+
+    RUA_DEBUG("Decoding message ConnectIEs (%s:%d)\n", __FILE__, __LINE__);
+
+    ANY_to_type_aper(any_p, &asn_DEF_Connect, (void**)&connect_p);
+
+    for (i = 0; i < connect_p->connect_ies.list.count; i++) {
+        IE_t *ie_p;
+        ie_p = connect_p->connect_ies.list.array[i];
+        switch(ie_p->id) {
+            case ProtocolIE_ID_id_CN_DomainIndicator:
+            {
+                CN_DomainIndicator_t  cnDomainIndicator;
+                CN_DomainIndicator_t *cnDomainIndicator_p = &cnDomainIndicator;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_CN_DomainIndicator, (void**)&cnDomainIndicator_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE cN_DomainIndicator failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_CN_DomainIndicator, cnDomainIndicator_p);
+                memcpy(&connectIEs->cN_DomainIndicator, cnDomainIndicator_p, sizeof(CN_DomainIndicator_t));
+            } break;
+            case ProtocolIE_ID_id_Context_ID:
+            {
+                Context_ID_t  contextID;
+                Context_ID_t *contextID_p = &contextID;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_Context_ID, (void**)&contextID_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE context_ID failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_Context_ID, contextID_p);
+                memcpy(&connectIEs->context_ID, contextID_p, sizeof(Context_ID_t));
+            } break;
+            /* Optional field */
+            case ProtocolIE_ID_id_IntraDomainNasNodeSelector:
+            {
+                IntraDomainNasNodeSelector_t  intraDomainNasNodeSelector;
+                IntraDomainNasNodeSelector_t *intraDomainNasNodeSelector_p = &intraDomainNasNodeSelector;
+                connectIEs->presenceMask |= CONNECTIES_INTRADOMAINNASNODESELECTOR_PRESENT;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_IntraDomainNasNodeSelector, (void**)&intraDomainNasNodeSelector_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE intraDomainNasNodeSelector failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_IntraDomainNasNodeSelector, intraDomainNasNodeSelector_p);
+                memcpy(&connectIEs->intraDomainNasNodeSelector, intraDomainNasNodeSelector_p, sizeof(IntraDomainNasNodeSelector_t));
+            } break;
+            case ProtocolIE_ID_id_Establishment_Cause:
+            {
+                Establishment_Cause_t  establishmentCause;
+                Establishment_Cause_t *establishmentCause_p = &establishmentCause;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_Establishment_Cause, (void**)&establishmentCause_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE establishment_Cause failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_Establishment_Cause, establishmentCause_p);
+                memcpy(&connectIEs->establishment_Cause, establishmentCause_p, sizeof(Establishment_Cause_t));
+            } break;
+            case ProtocolIE_ID_id_RANAP_Message:
+            {
+                RANAP_Message_t  ranapMessage;
+                RANAP_Message_t *ranapMessage_p = &ranapMessage;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_Message, (void**)&ranapMessage_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE ranaP_Message failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_RANAP_Message, ranapMessage_p);
+                memcpy(&connectIEs->ranaP_Message, ranapMessage_p, sizeof(RANAP_Message_t));
+            } break;
+            default:
+                RUA_DEBUG("Unknown protocol IE id (%d) for message connecties\n", (int)ie_p->id);
+                return -1;
+        }
+    }
+    return decoded;
+}
+
+int rua_decode_disconnecties(
+    DisconnectIEs_t *disconnectIEs,
+    ANY_t *any_p) {
+
+    Disconnect_t  disconnect;
+    Disconnect_t *disconnect_p = &disconnect;
+    int i, decoded = 0;
+    int tempDecoded = 0;
+    assert(any_p != NULL);
+    assert(disconnectIEs != NULL);
+
+    RUA_DEBUG("Decoding message DisconnectIEs (%s:%d)\n", __FILE__, __LINE__);
+
+    ANY_to_type_aper(any_p, &asn_DEF_Disconnect, (void**)&disconnect_p);
+
+    for (i = 0; i < disconnect_p->disconnect_ies.list.count; i++) {
+        IE_t *ie_p;
+        ie_p = disconnect_p->disconnect_ies.list.array[i];
+        switch(ie_p->id) {
+            case ProtocolIE_ID_id_CN_DomainIndicator:
+            {
+                CN_DomainIndicator_t  cnDomainIndicator;
+                CN_DomainIndicator_t *cnDomainIndicator_p = &cnDomainIndicator;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_CN_DomainIndicator, (void**)&cnDomainIndicator_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE cN_DomainIndicator failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_CN_DomainIndicator, cnDomainIndicator_p);
+                memcpy(&disconnectIEs->cN_DomainIndicator, cnDomainIndicator_p, sizeof(CN_DomainIndicator_t));
+            } break;
+            case ProtocolIE_ID_id_Context_ID:
+            {
+                Context_ID_t  contextID;
+                Context_ID_t *contextID_p = &contextID;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_Context_ID, (void**)&contextID_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE context_ID failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_Context_ID, contextID_p);
+                memcpy(&disconnectIEs->context_ID, contextID_p, sizeof(Context_ID_t));
+            } break;
+            case ProtocolIE_ID_id_Cause:
+            {
+                Cause_t  cause;
+                Cause_t *cause_p = &cause;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_Cause, (void**)&cause_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE cause failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_Cause, cause_p);
+                memcpy(&disconnectIEs->cause, cause_p, sizeof(Cause_t));
+            } break;
+            /* Conditional field */
+            case ProtocolIE_ID_id_RANAP_Message:
+            {
+                RANAP_Message_t  ranapMessage;
+                RANAP_Message_t *ranapMessage_p = &ranapMessage;
+                disconnectIEs->presenceMask |= DISCONNECTIES_RANAP_MESSAGE_PRESENT;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_Message, (void**)&ranapMessage_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE ranaP_Message failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_RANAP_Message, ranapMessage_p);
+                memcpy(&disconnectIEs->ranaP_Message, ranapMessage_p, sizeof(RANAP_Message_t));
+            } break;
+            default:
+                RUA_DEBUG("Unknown protocol IE id (%d) for message disconnecties\n", (int)ie_p->id);
+                return -1;
+        }
+    }
+    return decoded;
+}
+
+int rua_decode_errorindicationies(
+    ErrorIndicationIEs_t *errorIndicationIEs,
+    ANY_t *any_p) {
+
+    ErrorIndication_t  errorIndication;
+    ErrorIndication_t *errorIndication_p = &errorIndication;
+    int i, decoded = 0;
+    int tempDecoded = 0;
+    assert(any_p != NULL);
+    assert(errorIndicationIEs != NULL);
+
+    RUA_DEBUG("Decoding message ErrorIndicationIEs (%s:%d)\n", __FILE__, __LINE__);
+
+    ANY_to_type_aper(any_p, &asn_DEF_ErrorIndication, (void**)&errorIndication_p);
+
+    for (i = 0; i < errorIndication_p->errorIndication_ies.list.count; i++) {
+        IE_t *ie_p;
+        ie_p = errorIndication_p->errorIndication_ies.list.array[i];
+        switch(ie_p->id) {
+            case ProtocolIE_ID_id_Cause:
+            {
+                Cause_t  cause;
+                Cause_t *cause_p = &cause;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_Cause, (void**)&cause_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE cause failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_Cause, cause_p);
+                memcpy(&errorIndicationIEs->cause, cause_p, sizeof(Cause_t));
+            } break;
+            /* Optional field */
+            case ProtocolIE_ID_id_CriticalityDiagnostics:
+            {
+                CriticalityDiagnostics_t  criticalityDiagnostics;
+                CriticalityDiagnostics_t *criticalityDiagnostics_p = &criticalityDiagnostics;
+                errorIndicationIEs->presenceMask |= ERRORINDICATIONIES_CRITICALITYDIAGNOSTICS_PRESENT;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_CriticalityDiagnostics, (void**)&criticalityDiagnostics_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE criticalityDiagnostics failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_CriticalityDiagnostics, criticalityDiagnostics_p);
+                memcpy(&errorIndicationIEs->criticalityDiagnostics, criticalityDiagnostics_p, sizeof(CriticalityDiagnostics_t));
+            } break;
+            default:
+                RUA_DEBUG("Unknown protocol IE id (%d) for message errorindicationies\n", (int)ie_p->id);
+                return -1;
+        }
+    }
+    return decoded;
+}
+
+int rua_decode_connectionlesstransferies(
+    ConnectionlessTransferIEs_t *connectionlessTransferIEs,
+    ANY_t *any_p) {
+
+    ConnectionlessTransfer_t  connectionlessTransfer;
+    ConnectionlessTransfer_t *connectionlessTransfer_p = &connectionlessTransfer;
+    int i, decoded = 0;
+    int tempDecoded = 0;
+    assert(any_p != NULL);
+    assert(connectionlessTransferIEs != NULL);
+
+    RUA_DEBUG("Decoding message ConnectionlessTransferIEs (%s:%d)\n", __FILE__, __LINE__);
+
+    ANY_to_type_aper(any_p, &asn_DEF_ConnectionlessTransfer, (void**)&connectionlessTransfer_p);
+
+    for (i = 0; i < connectionlessTransfer_p->connectionlessTransfer_ies.list.count; i++) {
+        IE_t *ie_p;
+        ie_p = connectionlessTransfer_p->connectionlessTransfer_ies.list.array[i];
+        switch(ie_p->id) {
+            case ProtocolIE_ID_id_RANAP_Message:
+            {
+                RANAP_Message_t  ranapMessage;
+                RANAP_Message_t *ranapMessage_p = &ranapMessage;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_Message, (void**)&ranapMessage_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE ranaP_Message failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_RANAP_Message, ranapMessage_p);
+                memcpy(&connectionlessTransferIEs->ranaP_Message, ranapMessage_p, sizeof(RANAP_Message_t));
+            } break;
+            default:
+                RUA_DEBUG("Unknown protocol IE id (%d) for message connectionlesstransferies\n", (int)ie_p->id);
+                return -1;
+        }
+    }
+    return decoded;
+}
+
+int rua_decode_directtransferies(
+    DirectTransferIEs_t *directTransferIEs,
+    ANY_t *any_p) {
+
+    DirectTransfer_t  directTransfer;
+    DirectTransfer_t *directTransfer_p = &directTransfer;
+    int i, decoded = 0;
+    int tempDecoded = 0;
+    assert(any_p != NULL);
+    assert(directTransferIEs != NULL);
+
+    RUA_DEBUG("Decoding message DirectTransferIEs (%s:%d)\n", __FILE__, __LINE__);
+
+    ANY_to_type_aper(any_p, &asn_DEF_DirectTransfer, (void**)&directTransfer_p);
+
+    for (i = 0; i < directTransfer_p->directTransfer_ies.list.count; i++) {
+        IE_t *ie_p;
+        ie_p = directTransfer_p->directTransfer_ies.list.array[i];
+        switch(ie_p->id) {
+            case ProtocolIE_ID_id_CN_DomainIndicator:
+            {
+                CN_DomainIndicator_t  cnDomainIndicator;
+                CN_DomainIndicator_t *cnDomainIndicator_p = &cnDomainIndicator;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_CN_DomainIndicator, (void**)&cnDomainIndicator_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE cN_DomainIndicator failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_CN_DomainIndicator, cnDomainIndicator_p);
+                memcpy(&directTransferIEs->cN_DomainIndicator, cnDomainIndicator_p, sizeof(CN_DomainIndicator_t));
+            } break;
+            case ProtocolIE_ID_id_Context_ID:
+            {
+                Context_ID_t  contextID;
+                Context_ID_t *contextID_p = &contextID;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_Context_ID, (void**)&contextID_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE context_ID failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_Context_ID, contextID_p);
+                memcpy(&directTransferIEs->context_ID, contextID_p, sizeof(Context_ID_t));
+            } break;
+            case ProtocolIE_ID_id_RANAP_Message:
+            {
+                RANAP_Message_t  ranapMessage;
+                RANAP_Message_t *ranapMessage_p = &ranapMessage;
+                tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_RANAP_Message, (void**)&ranapMessage_p);
+                if (tempDecoded < 0) {
+                    RUA_DEBUG("Decoding of IE ranaP_Message failed\n");
+                    return -1;
+                }
+                decoded += tempDecoded;
+                if (asn1_xer_print)
+                    xer_fprint(stdout, &asn_DEF_RANAP_Message, ranapMessage_p);
+                memcpy(&directTransferIEs->ranaP_Message, ranapMessage_p, sizeof(RANAP_Message_t));
+            } break;
+            default:
+                RUA_DEBUG("Unknown protocol IE id (%d) for message directtransferies\n", (int)ie_p->id);
+                return -1;
+        }
+    }
+    return decoded;
+}
+
