diff --git a/asn1/rua/eurecom/rua_encoder.c b/asn1/rua/eurecom/rua_encoder.c
new file mode 100644
index 0000000..56d0f33
--- /dev/null
+++ b/asn1/rua/eurecom/rua_encoder.c
@@ -0,0 +1,216 @@
+/*******************************************************************************
+
+  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.110934 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_encode_connecties(
+    Connect_t *connect,
+    ConnectIEs_t *connectIEs) {
+
+    IE_t *ie;
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_CN_DomainIndicator,
+                          Criticality_reject,
+                          &asn_DEF_CN_DomainIndicator,
+                          &connectIEs->cN_DomainIndicator)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&connect->connect_ies.list, ie);
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_Context_ID,
+                          Criticality_reject,
+                          &asn_DEF_Context_ID,
+                          &connectIEs->context_ID)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&connect->connect_ies.list, ie);
+
+    /* Optional field */
+    if ((connectIEs->presenceMask & CONNECTIES_INTRADOMAINNASNODESELECTOR_PRESENT)
+        == CONNECTIES_INTRADOMAINNASNODESELECTOR_PRESENT) {
+        if ((ie = rua_new_ie(ProtocolIE_ID_id_IntraDomainNasNodeSelector,
+                              Criticality_ignore,
+                              &asn_DEF_IntraDomainNasNodeSelector,
+                              &connectIEs->intraDomainNasNodeSelector)) == NULL) {
+            return -1;
+        }
+        ASN_SEQUENCE_ADD(&connect->connect_ies.list, ie);
+    }
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_Establishment_Cause,
+                          Criticality_reject,
+                          &asn_DEF_Establishment_Cause,
+                          &connectIEs->establishment_Cause)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&connect->connect_ies.list, ie);
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_RANAP_Message,
+                          Criticality_reject,
+                          &asn_DEF_RANAP_Message,
+                          &connectIEs->ranaP_Message)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&connect->connect_ies.list, ie);
+
+    return 0;
+}
+
+int rua_encode_disconnecties(
+    Disconnect_t *disconnect,
+    DisconnectIEs_t *disconnectIEs) {
+
+    IE_t *ie;
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_CN_DomainIndicator,
+                          Criticality_reject,
+                          &asn_DEF_CN_DomainIndicator,
+                          &disconnectIEs->cN_DomainIndicator)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&disconnect->disconnect_ies.list, ie);
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_Context_ID,
+                          Criticality_reject,
+                          &asn_DEF_Context_ID,
+                          &disconnectIEs->context_ID)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&disconnect->disconnect_ies.list, ie);
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_Cause,
+                          Criticality_reject,
+                          &asn_DEF_Cause,
+                          &disconnectIEs->cause)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&disconnect->disconnect_ies.list, ie);
+
+    /* Conditional field */
+    if ((disconnectIEs->presenceMask & DISCONNECTIES_RANAP_MESSAGE_PRESENT)
+        == DISCONNECTIES_RANAP_MESSAGE_PRESENT) {
+        if ((ie = rua_new_ie(ProtocolIE_ID_id_RANAP_Message,
+                              Criticality_reject,
+                              &asn_DEF_RANAP_Message,
+                              &disconnectIEs->ranaP_Message)) == NULL) {
+            return -1;
+        }
+        ASN_SEQUENCE_ADD(&disconnect->disconnect_ies.list, ie);
+    }
+
+    return 0;
+}
+
+int rua_encode_errorindicationies(
+    ErrorIndication_t *errorIndication,
+    ErrorIndicationIEs_t *errorIndicationIEs) {
+
+    IE_t *ie;
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_Cause,
+                          Criticality_ignore,
+                          &asn_DEF_Cause,
+                          &errorIndicationIEs->cause)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&errorIndication->errorIndication_ies.list, ie);
+
+    /* Optional field */
+    if ((errorIndicationIEs->presenceMask & ERRORINDICATIONIES_CRITICALITYDIAGNOSTICS_PRESENT)
+        == ERRORINDICATIONIES_CRITICALITYDIAGNOSTICS_PRESENT) {
+        if ((ie = rua_new_ie(ProtocolIE_ID_id_CriticalityDiagnostics,
+                              Criticality_ignore,
+                              &asn_DEF_CriticalityDiagnostics,
+                              &errorIndicationIEs->criticalityDiagnostics)) == NULL) {
+            return -1;
+        }
+        ASN_SEQUENCE_ADD(&errorIndication->errorIndication_ies.list, ie);
+    }
+
+    return 0;
+}
+
+int rua_encode_connectionlesstransferies(
+    ConnectionlessTransfer_t *connectionlessTransfer,
+    ConnectionlessTransferIEs_t *connectionlessTransferIEs) {
+
+    IE_t *ie;
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_RANAP_Message,
+                          Criticality_reject,
+                          &asn_DEF_RANAP_Message,
+                          &connectionlessTransferIEs->ranaP_Message)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&connectionlessTransfer->connectionlessTransfer_ies.list, ie);
+
+    return 0;
+}
+
+int rua_encode_directtransferies(
+    DirectTransfer_t *directTransfer,
+    DirectTransferIEs_t *directTransferIEs) {
+
+    IE_t *ie;
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_CN_DomainIndicator,
+                          Criticality_reject,
+                          &asn_DEF_CN_DomainIndicator,
+                          &directTransferIEs->cN_DomainIndicator)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_Context_ID,
+                          Criticality_reject,
+                          &asn_DEF_Context_ID,
+                          &directTransferIEs->context_ID)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
+
+    if ((ie = rua_new_ie(ProtocolIE_ID_id_RANAP_Message,
+                          Criticality_reject,
+                          &asn_DEF_RANAP_Message,
+                          &directTransferIEs->ranaP_Message)) == NULL) {
+        return -1;
+    }
+    ASN_SEQUENCE_ADD(&directTransfer->directTransfer_ies.list, ie);
+
+    return 0;
+}
+
