diff --git a/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c b/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c
index 0961f33a9082475ee861c6e19cb6c7325459d1f1..8d8d4e95163a1df392883490ae4b5c59a0efa140 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/api/network/nas_message.c
@@ -706,7 +706,7 @@ static int _nas_message_protected_decode(
 
     int bytes = TLV_DECODE_BUFFER_TOO_SHORT;
 
-    char* plain_msg = (char*)malloc(length);
+    char* plain_msg = (char*)calloc(1,length);
     if (plain_msg)
     {
         /* Decrypt the security protected NAS message */
@@ -862,7 +862,7 @@ static int _nas_message_protected_encode(
     emm_security_context_t *emm_security_context   = (emm_security_context_t*)security;
     int bytes = TLV_ENCODE_BUFFER_TOO_SHORT;
 
-    char* plain_msg = (char*)malloc(length);
+    char* plain_msg = (char*)calloc(1,length);
     if (plain_msg) {
         /* Encode the security protected NAS message as plain NAS message */
         int size = _nas_message_plain_encode(plain_msg, &msg->header,
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c b/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c
index bc3d3f5ac7917edc51fbdf2cb8426c71a623fade..0cb19ad37d363ccc3ee817e0eb2f682f43c46089 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/Attach.c
@@ -152,11 +152,14 @@ static int _emm_attach_abort(void *);
 static int _emm_attach_have_changed(const emm_data_context_t *ctx,
                                     emm_proc_attach_type_t type, int ksi,
                                     GUTI_t *guti, imsi_t *imsi, imei_t *imei,
-                                    int eea, int eia);
+                                    int eea, int eia, int ucs2, int uea, int uia, int gea,
+                                    int umts_present, int gprs_present);
 static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid,
                               emm_proc_attach_type_t type, int ksi,
                               GUTI_t *guti, imsi_t *imsi, imei_t *imei,
-                              int eea, int eia, const OctetString *esm_msg);
+                              int eea, int eia, int ucs2, int uea, int uia, int gea,
+                              int umts_present, int gprs_present,
+                              const OctetString *esm_msg);
 
 /*
  * Internal data used for attach procedure
@@ -286,10 +289,10 @@ int emm_proc_attach(emm_proc_attach_type_t type)
         if (_emm_data.security->type != EMM_KSI_NOT_AVAILABLE) {
             emm_as->ksi = _emm_data.security->eksi;
         }
-        LOG_TRACE(INFO, "EMM-PROC  - encryption 0x%X", _emm_data.security->capability.encryption);
-        LOG_TRACE(INFO, "EMM-PROC  - integrity  0x%X", _emm_data.security->capability.integrity);
-        emm_as->encryption = _emm_data.security->capability.encryption;
-        emm_as->integrity = _emm_data.security->capability.integrity;
+        LOG_TRACE(INFO, "EMM-PROC  - eps_encryption 0x%X", _emm_data.security->capability.eps_encryption);
+        LOG_TRACE(INFO, "EMM-PROC  - eps_integrity  0x%X", _emm_data.security->capability.eps_integrity);
+        emm_as->encryption = _emm_data.security->capability.eps_encryption;
+        emm_as->integrity = _emm_data.security->capability.eps_integrity;
     }
     /*
      * Notify ESM that initiation of a PDN connectivity procedure
@@ -1051,7 +1054,9 @@ int emm_proc_attach_set_detach(void)
 int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
                             int native_ksi, int ksi, int native_guti,
                             GUTI_t *guti, imsi_t *imsi, imei_t *imei,
-                            tai_t *tai, int eea, int eia,
+                            tai_t *tai,
+                            int eea, int eia, int ucs2, int uea, int uia, int gea,
+                            int umts_present, int gprs_present,
                             const OctetString *esm_msg)
 {
     LOG_FUNC_IN;
@@ -1061,6 +1066,8 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
 
     LOG_TRACE(INFO, "EMM-PROC  - EPS attach type = %s (%d) requested (ueid=0x%08x)",
               _emm_attach_type_str[type], type, ueid);
+    LOG_TRACE(INFO, "EMM-PROC  - umts_present = %u umts_present = %u",
+            umts_present, gprs_present);
 
     /* Initialize the temporary UE context */
     memset(&ue_ctx, 0 , sizeof(emm_data_context_t));
@@ -1105,7 +1112,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
     if (*emm_ctx != NULL) {
         /* An EMM context already exists for the UE in the network */
         if (_emm_attach_have_changed(*emm_ctx, type, ksi, guti, imsi, imei,
-                                     eea, eia)) {
+                eea, eia, ucs2, uea, uia, gea, umts_present, gprs_present)) {
             /*
              * 3GPP TS 24.301, section 5.5.1.2.7, abnormal case e
              * The attach parameters have changed from the one received within
@@ -1129,7 +1136,8 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
                 LOG_TRACE(WARNING, "EMM-PROC  - Initiate new attach procedure");
                 rc = emm_proc_attach_request(ueid, type, native_ksi, ksi,
                                              native_guti, guti, imsi, imei,
-                                             tai, eea, eia, esm_msg);
+                                             tai, eea, eia, ucs2, uea, uia, gea,
+                                             umts_present, gprs_present, esm_msg);
             }
             LOG_FUNC_RETURN(rc);
         } else {
@@ -1178,7 +1186,7 @@ int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
 
     /* Update the EMM context with the current attach procedure parameters */
     rc = _emm_attach_update(*emm_ctx, ueid, type, ksi, guti, imsi, imei,
-                            eea, eia, esm_msg);
+            eea, eia, ucs2, uea, uia, gea, umts_present, gprs_present, esm_msg);
     if (rc != RETURNok) {
         LOG_TRACE(WARNING, "EMM-PROC  - Failed to update EMM context");
         /* Do not accept the UE to attach to the network */
@@ -2104,9 +2112,11 @@ static int _emm_attach_security(void *args)
 
     /* Initialize the security mode control procedure */
     rc = emm_proc_security_mode_control(emm_ctx->ueid, 0, // TODO: eksi != 0
-                                        emm_ctx->eea, emm_ctx->eia,
-                                        _emm_attach, _emm_attach_release,
-                                        _emm_attach_release);
+            emm_ctx->eea, emm_ctx->eia,emm_ctx->ucs2,
+            emm_ctx->uea, emm_ctx->uia, emm_ctx->gea,
+            emm_ctx->umts_present, emm_ctx->gprs_present,
+            _emm_attach, _emm_attach_release,
+            _emm_attach_release);
     if (rc != RETURNok) {
         /* Failed to initiate the security mode control procedure */
         LOG_TRACE(WARNING, "EMM-PROC  - "
@@ -2373,7 +2383,8 @@ static int _emm_attach_accept(emm_data_context_t *emm_ctx, attach_data_t *data)
 static int _emm_attach_have_changed(const emm_data_context_t *ctx,
                                     emm_proc_attach_type_t type, int ksi,
                                     GUTI_t *guti, imsi_t *imsi, imei_t *imei,
-                                    int eea, int eia)
+                                    int eea, int eia, int ucs2, int uea, int uia, int gea,
+                                    int umts_present, int gprs_present)
 {
     LOG_FUNC_IN;
     /* Emergency bearer services indicator */
@@ -2392,6 +2403,31 @@ static int _emm_attach_have_changed(const emm_data_context_t *ctx,
     if (eia != ctx->eia) {
         LOG_FUNC_RETURN (TRUE);
     }
+    if (umts_present != ctx->umts_present){
+        LOG_FUNC_RETURN (TRUE);
+    }
+    if (ctx->umts_present){
+        if (ucs2 != ctx->ucs2) {
+            LOG_FUNC_RETURN (TRUE);
+        }
+        /* Supported UMTS encryption algorithms */
+        if (uea != ctx->uea) {
+            LOG_FUNC_RETURN (TRUE);
+        }
+        /* Supported UMTS integrity algorithms */
+        if (uia != ctx->uia) {
+            LOG_FUNC_RETURN (TRUE);
+        }
+    }
+    if (gprs_present != ctx->gprs_present){
+        LOG_FUNC_RETURN (TRUE);
+    }
+    if (ctx->gprs_present){
+        if (gea != ctx->gea) {
+            LOG_FUNC_RETURN (TRUE);
+        }
+    }
+
     /* The GUTI if provided by the UE */
     if ( (guti) && (ctx->guti == NULL) ) {
         LOG_FUNC_RETURN (TRUE);
@@ -2461,7 +2497,9 @@ static int _emm_attach_have_changed(const emm_data_context_t *ctx,
 static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid,
                               emm_proc_attach_type_t type, int ksi,
                               GUTI_t *guti, imsi_t *imsi, imei_t *imei,
-                              int eea, int eia, const OctetString *esm_msg)
+                              int eea, int eia, int ucs2, int uea, int uia, int gea,
+                              int umts_present, int gprs_present,
+                              const OctetString *esm_msg)
 {
     LOG_FUNC_IN;
     /* UE identifier */
@@ -2469,11 +2507,20 @@ static int _emm_attach_update(emm_data_context_t *ctx, unsigned int ueid,
     /* Emergency bearer services indicator */
     ctx->is_emergency = (type == EMM_ATTACH_TYPE_EMERGENCY);
     /* Security key set identifier */
-    ctx->ksi = ksi;
+    ctx->ksi  = ksi;
     /* Supported EPS encryption algorithms */
-    ctx->eea = eea;
+    ctx->eea  = eea;
     /* Supported EPS integrity algorithms */
-    ctx->eia = eia;
+    ctx->eia  = eia;
+    ctx->ucs2 = ucs2;
+    ctx->uea  = uea;
+    ctx->uia  = uia;
+    ctx->gea  = gea;
+    LOG_TRACE(WARNING, "EMM-PROC  - umts_present %u", umts_present);
+    LOG_TRACE(WARNING, "EMM-PROC  - gprs_present %u", gprs_present);
+    ctx->umts_present  = umts_present;
+    ctx->gprs_present  = gprs_present;
+
     /* The GUTI if provided by the UE */
     if (guti) {
         if (ctx->guti == NULL) {
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/SecurityModeControl.c b/openair-cn/NAS/EURECOM-NAS/src/emm/SecurityModeControl.c
index 4d941cc997081fcc5afbea18fac0b837a963bb71..9aa4a2cc51a1624cb14652d7a621d09b6dd90a7c 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/SecurityModeControl.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/SecurityModeControl.c
@@ -133,14 +133,20 @@ static int _security_select_algorithms(
  * Internal data used for security mode control procedure
  */
 typedef struct {
-    unsigned int ueid;      /* UE identifier                       */
+    unsigned int ueid;      /* UE identifier                         */
 #define SECURITY_COUNTER_MAX    5
-    unsigned int retransmission_count;  /* Retransmission counter   */
-    int ksi;                /* NAS key set identifier               */
-    int eea;                /* Replayed EPS encryption algorithms   */
-    int eia;                /* Replayed EPS integrity algorithms    */
-    int selected_eea;       /* Selected EPS encryption algorithms   */
-    int selected_eia;       /* Selected EPS integrity algorithms    */
+    unsigned int retransmission_count;  /* Retransmission counter    */
+    int ksi;                /* NAS key set identifier                */
+    int eea;                /* Replayed EPS encryption algorithms    */
+    int eia;                /* Replayed EPS integrity algorithms     */
+    int ucs2;               /* Replayed Alphabet                     */
+    int uea;                /* Replayed UMTS encryption algorithms   */
+    int uia;                /* Replayed UMTS integrity algorithms    */
+    int gea;                /* Replayed G encryption algorithms      */
+    int umts_present:1;
+    int gprs_present:1;
+    int selected_eea;       /* Selected EPS encryption algorithms    */
+    int selected_eia;       /* Selected EPS integrity algorithms     */
     int notify_failure;     /* Indicates whether the security mode control
                              * procedure failure shall be notified to the
                              * ongoing EMM procedure        */
@@ -206,8 +212,8 @@ int emm_proc_security_mode_command(int native_ksi, int ksi,
     /*
      * Check the replayed UE security capabilities
      */
-    UInt8_t eea = (0x80 >> _emm_data.security->capability.encryption);
-    UInt8_t eia = (0x80 >> _emm_data.security->capability.integrity);
+    UInt8_t eea = (0x80 >> _emm_data.security->capability.eps_encryption);
+    UInt8_t eia = (0x80 >> _emm_data.security->capability.eps_integrity);
     if ( (reea != eea) || (reia != eia) ) {
         LOG_TRACE(WARNING, "EMM-PROC  - Replayed UE security capabilities "
                   "rejected");
@@ -412,10 +418,11 @@ int emm_proc_security_mode_command(int native_ksi, int ksi,
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int emm_proc_security_mode_control(unsigned int ueid, int ksi, int eea, int eia,
-                                   emm_common_success_callback_t success,
-                                   emm_common_reject_callback_t reject,
-                                   emm_common_failure_callback_t failure)
+int emm_proc_security_mode_control(unsigned int ueid, int ksi,
+        int eea, int eia,int ucs2, int uea, int uia, int gea, int umts_present, int gprs_present,
+        emm_common_success_callback_t success,
+        emm_common_reject_callback_t reject,
+        emm_common_failure_callback_t failure)
 {
     int rc = RETURNerror;
     int security_context_is_new = FALSE;
@@ -536,9 +543,18 @@ int emm_proc_security_mode_control(unsigned int ueid, int ksi, int eea, int eia,
         data->eea = eea;
         /* Set the EPS integrity algorithms to be replayed to the UE */
         data->eia = eia;
-        /* Set the EPS encryption algorithms to be replayed to the UE */
+        data->ucs2 = ucs2;
+        /* Set the UMTS encryption algorithms to be replayed to the UE */
+        data->uea = uea;
+        /* Set the UMTS integrity algorithms to be replayed to the UE */
+        data->uia = uia;
+        /* Set the GPRS integrity algorithms to be replayed to the UE */
+        data->gea = gea;
+        data->umts_present = umts_present;
+        data->gprs_present = gprs_present;
+        /* Set the EPS encryption algorithms selected to the UE */
         data->selected_eea = emm_ctx->security->selected_algorithms.encryption;
-        /* Set the EPS integrity algorithms to be replayed to the UE */
+        /* Set the EPS integrity algorithms selected to the UE */
         data->selected_eia = emm_ctx->security->selected_algorithms.integrity;
         /* Set the failure notification indicator */
         data->notify_failure = FALSE;
@@ -1017,6 +1033,12 @@ int _security_request(security_data_t *data, int is_new)
     emm_sap.u.emm_as.u.security.ksi          = data->ksi;
     emm_sap.u.emm_as.u.security.eea          = data->eea;
     emm_sap.u.emm_as.u.security.eia          = data->eia;
+    emm_sap.u.emm_as.u.security.ucs2         = data->ucs2;
+    emm_sap.u.emm_as.u.security.uea          = data->uea;
+    emm_sap.u.emm_as.u.security.uia          = data->uia;
+    emm_sap.u.emm_as.u.security.gea          = data->gea;
+    emm_sap.u.emm_as.u.security.umts_present = data->umts_present;
+    emm_sap.u.emm_as.u.security.gprs_present = data->gprs_present;
     emm_sap.u.emm_as.u.security.selected_eea = data->selected_eea;
     emm_sap.u.emm_as.u.security.selected_eia = data->selected_eia;
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h b/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h
index 29c72c688403b90d2e6259f3d62223e5479fc115..283a6a64f2e661a33e5b3e34fe61e9e58cde8ed8 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emmData.h
@@ -135,8 +135,13 @@ typedef struct {
         UInt32_t seq_num:8;
     } dl_count, ul_count;   /* Downlink and uplink count parameters    */
     struct {
-        UInt8_t encryption:4;   /* algorithm used for ciphering        */
-        UInt8_t integrity:4;    /* algorithm used for integrity protection */
+        UInt8_t eps_encryption;   /* algorithm used for ciphering            */
+        UInt8_t eps_integrity;    /* algorithm used for integrity protection */
+        UInt8_t umts_encryption;  /* algorithm used for ciphering            */
+        UInt8_t umts_integrity;   /* algorithm used for integrity protection */
+        UInt8_t gprs_encryption;  /* algorithm used for ciphering            */
+        UInt8_t umts_present:1;
+        UInt8_t gprs_present:1;
     } capability;       /* UE network capability           */
     struct {
         UInt8_t encryption:4;   /* algorithm used for ciphering           */
@@ -373,6 +378,13 @@ typedef struct emm_data_context_s {
     int         ksi;          /* Security key set identifier provided by the UE  */
     int         eea;          /* EPS encryption algorithms supported by the UE   */
     int         eia;          /* EPS integrity algorithms supported by the UE    */
+    int         ucs2;         /* UCS2 Alphabet*/
+    int         uea;          /* UMTS encryption algorithms supported by the UE  */
+    int         uia;          /* UMTS integrity algorithms supported by the UE   */
+    int         gea;          /* GPRS encryption algorithms supported by the UE  */
+    int         umts_present; /* For encoding ue network capabilities (variable size)*/
+    int         gprs_present; /* For encoding ue network capabilities (variable size)*/
+
     auth_vector_t vector;/* EPS authentication vector                            */
     emm_security_context_t *security;    /* Current EPS NAS security context     */
     OctetString esm_msg;      /* ESM message contained within the initial request*/
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c
index 209313daa40804004166daecef3fac781596722c..43aefec960f25139905ce8c4cb9a98450bb48efc 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_main.c
@@ -301,10 +301,10 @@ void emm_main_initialize(emm_indication_callback_t cb, const char *imei)
                        _usim_data.securityctx.ulNAScount.length);
             }
             /* Ciphering algorithm */
-            _emm_data.security->capability.encryption =
+            _emm_data.security->capability.eps_encryption =
                 ((_usim_data.securityctx.algorithmID.value[0] >> 4) & 0xf);
             /* Identity protection algorithm */
-            _emm_data.security->capability.integrity =
+            _emm_data.security->capability.eps_integrity =
                 (_usim_data.securityctx.algorithmID.value[0] & 0xf);
             /* NAS integrity and cyphering keys are not available */
         } else {
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h
index 579f89e0fbbeac7d647b611a6f09212d2fed7492..98fb511e7c4a29292981e98268340bde6139952a 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/emm_proc.h
@@ -159,7 +159,8 @@ int emm_proc_attach_set_detach(void);
 #ifdef NAS_MME
 int emm_proc_attach_request(unsigned int ueid, emm_proc_attach_type_t type,
                             int native_ksi, int ksi, int native_guti, GUTI_t *guti, imsi_t *imsi,
-                            imei_t *imei, tai_t *tai, int eea, int eia, const OctetString *esm_msg);
+                            imei_t *imei, tai_t *tai, int eea, int eia, int ucs2, int uea, int uia, int gea,
+                            int umts_present, int gprs_present, const OctetString *esm_msg);
 int emm_proc_attach_reject(unsigned int ueid, int emm_cause);
 int emm_proc_attach_complete(unsigned int ueid, const OctetString *esm_msg);
 int emm_proc_tracking_area_update_reject(unsigned int ueid, int emm_cause);
@@ -240,7 +241,9 @@ int emm_proc_security_mode_command(int native_ksi, int ksi, int seea, int seia,
 #endif
 
 #ifdef NAS_MME
-int emm_proc_security_mode_control(unsigned int ueid, int ksi, int eea, int eia,
+int emm_proc_security_mode_control(unsigned int ueid, int ksi,
+                                   int eea, int eia,int ucs2, int uea, int uia, int gea,
+                                   int umts_present, int gprs_present,
                                    emm_common_success_callback_t success,
                                    emm_common_reject_callback_t reject,
                                    emm_common_failure_callback_t failure);
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/msg/AttachRequest.c b/openair-cn/NAS/EURECOM-NAS/src/emm/msg/AttachRequest.c
index 9ffd7b8f05c0bccba8ef10e26edf0351e3352316..c5ecc4d540cd65d6d11980b0a980218973f36259 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/msg/AttachRequest.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/msg/AttachRequest.c
@@ -43,7 +43,8 @@ int decode_attach_request(attach_request_msg *attach_request, uint8_t *buffer, u
     int decoded_result = 0;
 
     LOG_FUNC_IN;
-
+    LOG_TRACE(INFO, "EMM  - attach_request len = %d",
+            len);
     // Check if we got a NULL pointer and if buffer length is >= minimum length expected for the message.
     CHECK_PDU_POINTER_AND_LENGTH_DECODER(buffer, ATTACH_REQUEST_MINIMUM_LENGTH, len);
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c
index f8788815ffaf75293e7513f2e3613f709655e332..5abc62eccc6d8543f20aef0ff18c4cc9e3750761 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_as.c
@@ -2037,8 +2037,6 @@ static int _emm_as_establish_cnf(const emm_as_establish_t *msg,
 
             as_msg->selected_encryption_algorithm = htons(0x8000 >> emm_security_context->selected_algorithms.encryption);
             as_msg->selected_integrity_algorithm = htons(0x8000 >> emm_security_context->selected_algorithms.integrity);
-            //as_msg->selected_encryption_algorithm = htons(0x8000 >> emm_security_context->capability.encryption);
-            //as_msg->selected_integrity_algorithm = htons(0x8000 >> emm_security_context->capability.integrity);
 
             LOG_TRACE(DEBUG,
                 "Set nas_msg.selected_encryption_algorithm -> NBO: 0x%04X (%u)",
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_asDef.h b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_asDef.h
index ad57f704d691e9e9fd228cdde1b44c5160a3cb04..d20cea86d0d7bd4100f4b989aad5ba4adb40ecd4 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_asDef.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_asDef.h
@@ -123,6 +123,12 @@ typedef struct {
      */
     UInt8_t eea;        /* Replayed EPS encryption algorithms   */
     UInt8_t eia;        /* Replayed EPS integrity algorithms    */
+    UInt8_t uea;        /* Replayed UMTS encryption algorithms  */
+    uint8_t ucs2;
+    UInt8_t uia;        /* Replayed UMTS integrity algorithms   */
+    UInt8_t gea;        /* Replayed GPRS encryption algorithms   */
+    UInt8_t umts_present;
+    UInt8_t gprs_present;
 
     // Added by LG
     UInt8_t selected_eea; /* Selected EPS encryption algorithms   */
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c
index 490e543f14059a51bedcdf54ceec209b79ac1669..9c16e2db3b8a8b94206668ba4c503a41ad7045ff 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_recv.c
@@ -624,7 +624,20 @@ int emm_recv_attach_request(unsigned int ueid, const attach_request_msg *msg,
                                  msg->naskeysetidentifier.tsc != NAS_KEY_SET_IDENTIFIER_MAPPED,
                                  msg->naskeysetidentifier.naskeysetidentifier,
                                  msg->oldgutitype != GUTI_MAPPED, p_guti, p_imsi, p_imei, p_tai,
-                                 msg->uenetworkcapability.eea, msg->uenetworkcapability.eia,
+                                 msg->uenetworkcapability.eea,
+                                 msg->uenetworkcapability.eia,
+                                 msg->uenetworkcapability.ucs2,
+                                 msg->uenetworkcapability.uea,
+                                 msg->uenetworkcapability.uia,
+                                 0x00 |
+                                       //((msg->uenetworkcapability.spare & 0x7) << 5) | // spare coded as zero
+                                 ((msg->uenetworkcapability.csfb  & 0x1) << 4) |
+                                 ((msg->uenetworkcapability.lpp   & 0x1) << 3) |
+                                 ((msg->uenetworkcapability.lcs   & 0x1) << 2) |
+                                 ((msg->uenetworkcapability.srvcc & 0x1) << 1) |
+                                 (msg->uenetworkcapability.nf     & 0x1),
+                                 msg->uenetworkcapability.umts_present,
+                                 msg->uenetworkcapability.gprs_present,
                                  &msg->esmmessagecontainer.esmmessagecontainercontents);
 
     LOG_FUNC_RETURN (rc);
diff --git a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c
index f2efc199f98c639c00abbcef6269cf65fd39289b..8a0772d13d1fb8d1f7265401e101818d88eb967d 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/emm/sap/emm_send.c
@@ -1244,10 +1244,12 @@ int emm_send_security_mode_command(const emm_as_security_t *msg,
     size += UE_SECURITY_CAPABILITY_MAXIMUM_LENGTH;
     emm_msg->replayeduesecuritycapabilities.eea = msg->eea;
     emm_msg->replayeduesecuritycapabilities.eia = msg->eia;
-    emm_msg->replayeduesecuritycapabilities.non_eps_security_present = 0;
-    emm_msg->replayeduesecuritycapabilities.uea = 0x00;
-    emm_msg->replayeduesecuritycapabilities.uia = 0x00;
-    emm_msg->replayeduesecuritycapabilities.gea = 0x00;
+    emm_msg->replayeduesecuritycapabilities.umts_present = msg->umts_present;
+    emm_msg->replayeduesecuritycapabilities.gprs_present = msg->gprs_present;
+
+    emm_msg->replayeduesecuritycapabilities.uea = msg->uea;
+    emm_msg->replayeduesecuritycapabilities.uia = msg->uia;
+    emm_msg->replayeduesecuritycapabilities.gea = msg->gea;
 
     LOG_FUNC_RETURN (size);
 }
diff --git a/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.c b/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.c
index 2f2f606fb881aeb0abb13fa5af87daaab14b9aac..134e8902789c7381ccd4304f2ee33a4625d7a4ee 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.c
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <string.h>
 
 
 #include "TLVEncoder.h"
@@ -46,6 +47,8 @@ int decode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8
     }
     DECODE_U8(buffer + decoded, ielen, decoded);
 
+    memset(uenetworkcapability, 0, sizeof(UeNetworkCapability));
+
     LOG_TRACE(INFO, "decode_ue_network_capability len = %d",ielen);
     CHECK_LENGTH_DECODER(len - decoded, ielen);
     uenetworkcapability->eea = *(buffer + decoded);
@@ -62,6 +65,8 @@ int decode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8
             uenetworkcapability->ucs2 = (*(buffer + decoded) >> 7) & 0x1;
             uenetworkcapability->uia = *(buffer + decoded) & 0x7f;
             decoded++;
+            uenetworkcapability->umts_present =1;
+            LOG_TRACE(INFO, "uenetworkcapability decoded UMTS\n");
 
             if (ielen > 4) {
                 uenetworkcapability->spare = (*(buffer + decoded) >> 5) & 0x7;
@@ -71,6 +76,8 @@ int decode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8
                 uenetworkcapability->srvcc = (*(buffer + decoded) >> 1) & 0x1;
                 uenetworkcapability->nf    = *(buffer + decoded) & 0x1;
                 decoded++;
+                uenetworkcapability->gprs_present =1;
+                LOG_TRACE(INFO, "uenetworkcapability decoded GPRS\n");
             }
         }
     }
@@ -106,20 +113,28 @@ int encode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8
     encoded++;
     *(buffer + encoded) = uenetworkcapability->eia;
     encoded++;
-    *(buffer + encoded) = uenetworkcapability->uea;
-    encoded++;
-    *(buffer + encoded) = 0x00 | ((uenetworkcapability->ucs2 & 0x1) << 7) |
-    (uenetworkcapability->uia & 0x7f);
-    encoded++;
+    LOG_TRACE(INFO, "uenetworkcapability encoded EPS %u\n", encoded);
 
-    *(buffer + encoded) = 0x00 |
-	//((uenetworkcapability->spare & 0x7) << 5) | // spare coded as zero
-	((uenetworkcapability->csfb  & 0x1) << 4) |
-	((uenetworkcapability->lpp   & 0x1) << 3) |
-	((uenetworkcapability->lcs   & 0x1) << 2) |
-	((uenetworkcapability->srvcc & 0x1) << 1) |
-	(uenetworkcapability->nf     & 0x1);
-    encoded++;
+    if (uenetworkcapability->umts_present) {
+        *(buffer + encoded) = uenetworkcapability->uea;
+        encoded++;
+        *(buffer + encoded) = 0x00 | ((uenetworkcapability->ucs2 & 0x1) << 7) |
+                (uenetworkcapability->uia & 0x7f);
+        encoded++;
+        LOG_TRACE(INFO, "uenetworkcapability encoded UMTS %u\n", encoded);
+    }
+
+    if (uenetworkcapability->gprs_present) {
+        *(buffer + encoded) = 0x00 |
+                //((uenetworkcapability->spare & 0x7) << 5) | // spare coded as zero
+                ((uenetworkcapability->csfb  & 0x1) << 4) |
+                ((uenetworkcapability->lpp   & 0x1) << 3) |
+                ((uenetworkcapability->lcs   & 0x1) << 2) |
+                ((uenetworkcapability->srvcc & 0x1) << 1) |
+                (uenetworkcapability->nf     & 0x1);
+        encoded++;
+        LOG_TRACE(INFO, "uenetworkcapability encoded GPRS %u\n", encoded);
+    }
 
     *lenPtr = encoded - 1 - ((iei > 0) ? 1 : 0);
     return encoded;
@@ -142,6 +157,8 @@ void dump_ue_network_capability_xml(UeNetworkCapability *uenetworkcapability, ui
     printf("    <LCS>%u</LCS>\n", uenetworkcapability->lcs);
     printf("    <SR VCC>%u</SR VCC>\n", uenetworkcapability->srvcc);
     printf("    <NF>%u<NF/>\n", uenetworkcapability->nf);
+    printf("    <UMTS>%u<UMTS/>\n", uenetworkcapability->umts_present);
+    printf("    <GPRS>%u<GPRS/>\n", uenetworkcapability->gprs_present);
     printf("</Ue Network Capability>\n");
 }
 
diff --git a/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.h b/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.h
index c88ac2d6b9adbb7627c50b385f1a41208362ea47..e79a68820ec8e67cc44cf5acc2b5921669c91492 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/ies/UeNetworkCapability.h
@@ -99,6 +99,9 @@ typedef struct UeNetworkCapability_tag {
     /* NF notification procedure capability */
 #define UE_NETWORK_CAPABILITY_NF	1
     uint8_t  nf:1;
+
+    uint8_t  umts_present;
+    uint8_t  gprs_present;
 } UeNetworkCapability;
 
 int encode_ue_network_capability(UeNetworkCapability *uenetworkcapability, uint8_t iei, uint8_t *buffer, uint32_t len);
diff --git a/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.c b/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.c
index 9672cbb40a5fc94cbdf80ee6f3dad358676957b0..a3caa0a97a65bb292bf86b98d10d1114c7f607d2 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.c
+++ b/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.c
@@ -29,6 +29,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <stdint.h>
+#include <string.h>
 
 
 #include "TLVEncoder.h"
@@ -44,6 +45,7 @@ int decode_ue_security_capability(UeSecurityCapability *uesecuritycapability, ui
         CHECK_IEI_DECODER(iei, *buffer);
         decoded++;
     }
+    memset(uesecuritycapability, 0, sizeof(UeSecurityCapability));
     ielen = *(buffer + decoded);
     decoded++;
     CHECK_LENGTH_DECODER(len - decoded, ielen);
@@ -51,14 +53,17 @@ int decode_ue_security_capability(UeSecurityCapability *uesecuritycapability, ui
     decoded++;
     uesecuritycapability->eia = *(buffer + decoded);
     decoded++;
-    if (len == decoded + 3) {
-        uesecuritycapability->non_eps_security_present = 1;
+    if (len >= decoded + 3) {
+        uesecuritycapability->umts_present = 1;
         uesecuritycapability->uea = *(buffer + decoded);
         decoded++;
         uesecuritycapability->uia = *(buffer + decoded) & 0x7f;
         decoded++;
-        uesecuritycapability->gea = *(buffer + decoded) & 0x7f;
-        decoded++;
+        if (len == decoded + 4) {
+            uesecuritycapability->gprs_present = 1;
+            uesecuritycapability->gea = *(buffer + decoded) & 0x7f;
+            decoded++;
+        }
     }
 #if defined (NAS_DEBUG)
     dump_ue_security_capability_xml(uesecuritycapability, iei);
@@ -85,12 +90,14 @@ int encode_ue_security_capability(UeSecurityCapability *uesecuritycapability, ui
     encoded++;
     *(buffer + encoded) =  uesecuritycapability->eia;
     encoded++;
-    if (uesecuritycapability->non_eps_security_present == 1) {
+    if (uesecuritycapability->umts_present) {
         *(buffer + encoded) = uesecuritycapability->uea;
         encoded++;
         *(buffer + encoded) = 0x00 |
         (uesecuritycapability->uia & 0x7f);
         encoded++;
+    }
+    if (uesecuritycapability->gprs_present) {
         *(buffer + encoded) = 0x00 |
         (uesecuritycapability->gea & 0x7f);
         encoded++;
@@ -107,9 +114,11 @@ void dump_ue_security_capability_xml(UeSecurityCapability *uesecuritycapability,
         printf("    <IEI>0x%X</IEI>\n", iei);
     printf("    <EEA>%u</EEA>\n", uesecuritycapability->eea);
     printf("    <EIA>%u</EIA>\n", uesecuritycapability->eia);
-    if (uesecuritycapability->non_eps_security_present == 1) {
+    if (uesecuritycapability->umts_present == 1) {
         printf("    <UEA>%u</UEA>\n", uesecuritycapability->uea);
         printf("    <UIA>%u</UIA>\n", uesecuritycapability->uia);
+    }
+    if (uesecuritycapability->gprs_present == 1) {
         printf("    <GEA>%u</GEA>\n", uesecuritycapability->gea);
     }
     printf("</Ue Security Capability>\n");
diff --git a/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.h b/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.h
index 1b7e27ddccb8008d0b42ec3dece89175db83e984..7f08a149c3841d6543a7bed15277f9a185f1066e 100644
--- a/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.h
+++ b/openair-cn/NAS/EURECOM-NAS/src/ies/UeSecurityCapability.h
@@ -59,7 +59,8 @@ typedef struct UeSecurityCapability_tag {
 #define UE_SECURITY_CAPABILITY_EIA6	0b00000010
 #define UE_SECURITY_CAPABILITY_EIA7	0b00000001
     uint8_t  eia;
-    unsigned non_eps_security_present:1;
+    uint8_t  umts_present;
+    uint8_t  gprs_present;
     /* UMTS encryption algorithms supported (octet 5) */
 #define UE_SECURITY_CAPABILITY_UEA0	0b10000000
 #define UE_SECURITY_CAPABILITY_UEA1	0b01000000
diff --git a/openair-cn/SGI/sgi_task.c b/openair-cn/SGI/sgi_task.c
index 3fe9034644e6a32bab42a39f8a63ab54a7cbbd76..7ca731c88afa87c09d040de0ee36938a8ee27257 100644
--- a/openair-cn/SGI/sgi_task.c
+++ b/openair-cn/SGI/sgi_task.c
@@ -281,7 +281,6 @@ int sgi_init(const pgw_config_t *pgw_config_p)
             return -1;
         }
 #endif
-#if 0
 #ifdef ENABLE_USE_RAW_SOCKET_FOR_SGI
         for (i=0; i < SGI_MAX_EPS_BEARERS_PER_USER; i++) {
             sgi_read_thread_args_t *args_p = malloc(sizeof(sgi_read_thread_args_t));
@@ -292,7 +291,6 @@ int sgi_init(const pgw_config_t *pgw_config_p)
                 return -1;
             }
         }
-#endif
 #endif
     }