diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c
index a0eaf2f9c2c0b21a1f4ea04c07464304aeac01d9..aa96a97b739623501c897fa2eb9b1ca2053c5c9a 100644
--- a/openair3/NAS/UE/UEprocess.c
+++ b/openair3/NAS/UE/UEprocess.c
@@ -408,7 +408,9 @@ static void _nas_clean(int usr_fd, int net_fd)
   LOG_FUNC_IN;
 
   LOG_TRACE (INFO, "UE-MAIN   - Perform EMM and ESM cleanup");
-  nas_network_cleanup ();
+  // FIXME nas_network_cleanup depends on nas_user_t
+  // Why this program should interfere like that with oaisim ?
+  //nas_network_cleanup ();
 
   LOG_TRACE (INFO, "UE-MAIN   - "
              "Closing user connection %d and network connection %d",
diff --git a/openair3/NAS/UE/nas_network.c b/openair3/NAS/UE/nas_network.c
index 2962585ede9e8d65d1d2e29175547d4d5861dab5..6ca4a34c7ffaa13b85d9cabe8dd4f160f84fa72c 100644
--- a/openair3/NAS/UE/nas_network.c
+++ b/openair3/NAS/UE/nas_network.c
@@ -92,11 +92,11 @@ void nas_network_initialize(void)
  **          Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-void nas_network_cleanup(void)
+void nas_network_cleanup(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
-  nas_proc_cleanup();
+  nas_proc_cleanup(user);
 
   LOG_FUNC_OUT;
 }
@@ -161,12 +161,12 @@ int nas_network_process_data(nas_user_t *user, int msg_id, const void *data)
 
     if ( (confirm->errCode == AS_SUCCESS) ||
          (confirm->errCode == AS_TERMINATED_NAS) ) {
-      rc = nas_proc_establish_cnf(confirm->nasMsg.data,
+      rc = nas_proc_establish_cnf(user, confirm->nasMsg.data,
                                   confirm->nasMsg.length);
     } else {
       LOG_TRACE(WARNING, "NET-MAIN  - "
                 "Initial NAS message not delivered");
-      rc = nas_proc_establish_rej();
+      rc = nas_proc_establish_rej(user);
     }
 
     break;
@@ -174,7 +174,7 @@ int nas_network_process_data(nas_user_t *user, int msg_id, const void *data)
 
   case AS_NAS_RELEASE_IND:
     /* Received NAS signalling connection releaase indication */
-    rc = nas_proc_release_ind(msg->msg.nas_release_ind.cause);
+    rc = nas_proc_release_ind(user, msg->msg.nas_release_ind.cause);
     break;
 
   case AS_UL_INFO_TRANSFER_CNF:
@@ -183,9 +183,9 @@ int nas_network_process_data(nas_user_t *user, int msg_id, const void *data)
     if (msg->msg.ul_info_transfer_cnf.errCode != AS_SUCCESS) {
       LOG_TRACE(WARNING, "NET-MAIN  - "
                 "Uplink NAS message not delivered");
-      rc = nas_proc_ul_transfer_rej();
+      rc = nas_proc_ul_transfer_rej(user);
     } else {
-      rc = nas_proc_ul_transfer_cnf();
+      rc = nas_proc_ul_transfer_cnf(user);
     }
 
     break;
@@ -193,7 +193,7 @@ int nas_network_process_data(nas_user_t *user, int msg_id, const void *data)
   case AS_DL_INFO_TRANSFER_IND: {
     const dl_info_transfer_ind_t *info = &msg->msg.dl_info_transfer_ind;
     /* Received downlink data transfer indication */
-    rc = nas_proc_dl_transfer_ind(info->nasMsg.data,
+    rc = nas_proc_dl_transfer_ind(user, info->nasMsg.data,
                                   info->nasMsg.length);
     break;
   }
diff --git a/openair3/NAS/UE/nas_network.h b/openair3/NAS/UE/nas_network.h
index 31716a227625fa70791c6f3ae9ed9a4b56816c6c..fb05c8dd2a044b1c84a1ceb6c3891aa789960d60 100644
--- a/openair3/NAS/UE/nas_network.h
+++ b/openair3/NAS/UE/nas_network.h
@@ -61,7 +61,7 @@ Description NAS procedure functions triggered by the network
 
 void nas_network_initialize(void);
 
-void nas_network_cleanup(void);
+void nas_network_cleanup(nas_user_t *user);
 
 int nas_network_process_data(nas_user_t *user, int command_id, const void *data);
 
diff --git a/openair3/NAS/UE/nas_proc.c b/openair3/NAS/UE/nas_proc.c
index 352fae6e0905ed6f47ec27904cdce4942e0e2c74..c4b1dc99281c8780da9621b368acd65ca9ad6452 100644
--- a/openair3/NAS/UE/nas_proc.c
+++ b/openair3/NAS/UE/nas_proc.c
@@ -64,8 +64,8 @@ Description NAS procedure call manager
 #define NAS_PROC_RSRP_UNKNOWN   255
 
 
-static int _nas_proc_activate(int cid, int apply_to_all);
-static int _nas_proc_deactivate(int cid, int apply_to_all);
+static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all);
+static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all);
 
 /****************************************************************************/
 /******************  E X P O R T E D    F U N C T I O N S  ******************/
@@ -121,12 +121,12 @@ void nas_proc_initialize(nas_user_t *user, emm_indication_callback_t emm_cb,
  **          Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-void nas_proc_cleanup()
+void nas_proc_cleanup(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
   /* Detach the UE from the EPS network */
-  int rc = nas_proc_detach(TRUE);
+  int rc = nas_proc_detach(user, TRUE);
 
   if (rc != RETURNok) {
     LOG_TRACE(ERROR, "NAS-PROC  - Failed to detach from the network");
@@ -377,7 +377,7 @@ int nas_proc_get_signal_quality(nas_user_t *user, int *rsrq, int *rsrp)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT)
+int nas_proc_register(nas_user_t *user, int mode, int format, const network_plmn_t *oper, int AcT)
 {
   LOG_FUNC_IN;
 
@@ -416,7 +416,7 @@ int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_deregister()
+int nas_proc_deregister(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
@@ -446,7 +446,7 @@ int nas_proc_deregister()
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_reg_data(int *mode, int *selected, int format,
+int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format,
                           network_plmn_t *oper, int *AcT)
 {
   LOG_FUNC_IN;
@@ -485,7 +485,7 @@ int nas_proc_get_reg_data(int *mode, int *selected, int format,
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_oper_list(const char **oper_list)
+int nas_proc_get_oper_list(nas_user_t *user, const char **oper_list)
 {
   LOG_FUNC_IN;
 
@@ -510,7 +510,7 @@ int nas_proc_get_oper_list(const char **oper_list)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_reg_status(int *stat)
+int nas_proc_get_reg_status(nas_user_t *user, int *stat)
 {
   LOG_FUNC_IN;
 
@@ -538,7 +538,7 @@ int nas_proc_get_reg_status(int *stat)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_loc_info(char *tac, char *ci, int *AcT)
+int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT)
 {
   LOG_FUNC_IN;
 
@@ -563,7 +563,7 @@ int nas_proc_get_loc_info(char *tac, char *ci, int *AcT)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_detach(int switch_off)
+int nas_proc_detach(nas_user_t *user, int switch_off)
 {
   LOG_FUNC_IN;
 
@@ -594,7 +594,7 @@ int nas_proc_detach(int switch_off)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_attach()
+int nas_proc_attach(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
@@ -626,7 +626,7 @@ int nas_proc_attach()
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_attach_status()
+int nas_proc_get_attach_status(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
@@ -649,7 +649,7 @@ int nas_proc_get_attach_status()
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_pdn_range()
+int nas_proc_get_pdn_range(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
@@ -674,7 +674,7 @@ int nas_proc_get_pdn_range()
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_pdn_status(int *cids, int *states, int n_pdn_max)
+int nas_proc_get_pdn_status(nas_user_t *user, int *cids, int *states, int n_pdn_max)
 {
   LOG_FUNC_IN;
 
@@ -718,7 +718,7 @@ int nas_proc_get_pdn_status(int *cids, int *states, int n_pdn_max)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_pdn_param(int *cids, int *types, const char **apns,
+int nas_proc_get_pdn_param(nas_user_t *user, int *cids, int *types, const char **apns,
                            int n_pdn_max)
 {
   LOG_FUNC_IN;
@@ -770,7 +770,7 @@ int nas_proc_get_pdn_param(int *cids, int *types, const char **apns,
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1,
+int nas_proc_get_pdn_addr(nas_user_t *user, int cid, int *cids, const char **addr1,
                           const char **addr2, int n_pdn_max)
 {
   LOG_FUNC_IN;
@@ -833,7 +833,7 @@ int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1,
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_set_pdn(int cid, int type, const char *apn, int ipv4_addr,
+int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int ipv4_addr,
                      int emergency, int p_cscf, int im_cn_signal)
 {
   LOG_FUNC_IN;
@@ -871,7 +871,7 @@ int nas_proc_set_pdn(int cid, int type, const char *apn, int ipv4_addr,
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_reset_pdn(int cid)
+int nas_proc_reset_pdn(nas_user_t *user, int cid)
 {
   LOG_FUNC_IN;
 
@@ -905,7 +905,7 @@ int nas_proc_reset_pdn(int cid)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_deactivate_pdn(int cid)
+int nas_proc_deactivate_pdn(nas_user_t *user, int cid)
 {
   LOG_FUNC_IN;
 
@@ -913,7 +913,7 @@ int nas_proc_deactivate_pdn(int cid)
 
   if (cid > 0) {
     /* Deactivate only the specified PDN context */
-    rc = _nas_proc_deactivate(cid, FALSE);
+    rc = _nas_proc_deactivate(user, cid, FALSE);
   } else {
     /* Do not deactivate the PDN connection established during initial
      * network attachment (identifier 1) */
@@ -921,7 +921,7 @@ int nas_proc_deactivate_pdn(int cid)
 
     /* Deactivate all active PDN contexts */
     while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max()+1)) {
-      rc = _nas_proc_deactivate(cid++, TRUE);
+      rc = _nas_proc_deactivate(user, cid++, TRUE);
     }
   }
 
@@ -944,7 +944,7 @@ int nas_proc_deactivate_pdn(int cid)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_activate_pdn(int cid)
+int nas_proc_activate_pdn(nas_user_t *user, int cid)
 {
   LOG_FUNC_IN;
 
@@ -956,7 +956,7 @@ int nas_proc_activate_pdn(int cid)
      * procedure prior to attempt to request any PDN connectivity
      */
     LOG_TRACE(WARNING, "NAS-PROC  - UE is not attached to the network");
-    rc = nas_proc_attach();
+    rc = nas_proc_attach(user);
   } else if (emm_main_is_emergency()) {
     /* The UE is attached for emergency bearer services; It shall not
      * request a PDN connection to any other PDN */
@@ -967,13 +967,13 @@ int nas_proc_activate_pdn(int cid)
   if (rc != RETURNerror) {
     if (cid > 0) {
       /* Activate only the specified PDN context */
-      rc = _nas_proc_activate(cid, FALSE);
+      rc = _nas_proc_activate(user, cid, FALSE);
     } else {
       cid = 1;
 
       /* Activate all defined PDN contexts */
       while ((rc != RETURNerror) && (cid < esm_main_get_nb_pdns_max()+1)) {
-        rc = _nas_proc_activate(cid++, TRUE);
+        rc = _nas_proc_activate(user, cid++, TRUE);
       }
     }
   }
@@ -1056,7 +1056,7 @@ int nas_proc_cell_info(nas_user_t *user, int found, tac_t tac, ci_t ci, AcT_t Ac
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_establish_cnf(const Byte_t *data, uint32_t len)
+int nas_proc_establish_cnf(nas_user_t *user, const Byte_t *data, uint32_t len)
 {
   LOG_FUNC_IN;
 
@@ -1093,7 +1093,7 @@ int nas_proc_establish_cnf(const Byte_t *data, uint32_t len)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_establish_rej()
+int nas_proc_establish_rej(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
@@ -1126,7 +1126,7 @@ int nas_proc_establish_rej()
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_release_ind(int cause)
+int nas_proc_release_ind(nas_user_t *user, int cause)
 {
   LOG_FUNC_IN;
 
@@ -1160,7 +1160,7 @@ int nas_proc_release_ind(int cause)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_ul_transfer_cnf()
+int nas_proc_ul_transfer_cnf(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
@@ -1197,7 +1197,7 @@ int nas_proc_ul_transfer_cnf()
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_ul_transfer_rej()
+int nas_proc_ul_transfer_rej(nas_user_t *user)
 {
   LOG_FUNC_IN;
 
@@ -1234,7 +1234,7 @@ int nas_proc_ul_transfer_rej()
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-int nas_proc_dl_transfer_ind(const Byte_t *data, uint32_t len)
+int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len)
 {
   LOG_FUNC_IN;
 
@@ -1281,7 +1281,7 @@ int nas_proc_dl_transfer_ind(const Byte_t *data, uint32_t len)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-static int _nas_proc_activate(int cid, int apply_to_all)
+static int _nas_proc_activate(nas_user_t *user, int cid, int apply_to_all)
 {
   LOG_FUNC_IN;
 
@@ -1354,7 +1354,7 @@ static int _nas_proc_activate(int cid, int apply_to_all)
  **      Others:    None                                       **
  **                                                                        **
  ***************************************************************************/
-static int _nas_proc_deactivate(int cid, int apply_to_all)
+static int _nas_proc_deactivate(nas_user_t *user, int cid, int apply_to_all)
 {
   LOG_FUNC_IN;
 
diff --git a/openair3/NAS/UE/nas_proc.h b/openair3/NAS/UE/nas_proc.h
index aaefe6f0468486923d020c983f42fedd21f4ee6f..9efccb80caf752257e6cad9584c45d7f961d48e6 100644
--- a/openair3/NAS/UE/nas_proc.h
+++ b/openair3/NAS/UE/nas_proc.h
@@ -63,7 +63,7 @@ Description NAS procedure call manager
 void nas_proc_initialize(nas_user_t *user, emm_indication_callback_t emm_cb,
                          esm_indication_callback_t esm_cb, const char *imei);
 
-void nas_proc_cleanup(void);
+void nas_proc_cleanup(nas_user_t *user);
 
 /*
  * --------------------------------------------------------------------------
@@ -80,30 +80,30 @@ int nas_proc_get_msisdn(char *msisdn_str, int *ton_npi);
 
 int nas_proc_get_signal_quality(nas_user_t *user, int *rsrq, int *rsrp);
 
-int nas_proc_register(int mode, int format, const network_plmn_t *oper, int AcT);
-int nas_proc_deregister(void);
-int nas_proc_get_reg_data(int *mode, int *selected, int format,
+int nas_proc_register(nas_user_t *user, int mode, int format, const network_plmn_t *oper, int AcT);
+int nas_proc_deregister(nas_user_t *user);
+int nas_proc_get_reg_data(nas_user_t *user, int *mode, int *selected, int format,
                           network_plmn_t *oper, int *AcT);
-int nas_proc_get_oper_list(const char **oper_list);
+int nas_proc_get_oper_list(nas_user_t *user, const char **oper_list);
 
-int nas_proc_get_reg_status(int *stat);
-int nas_proc_get_loc_info(char *tac, char *ci, int *AcT);
+int nas_proc_get_reg_status(nas_user_t *user, int *stat);
+int nas_proc_get_loc_info(nas_user_t *user, char *tac, char *ci, int *AcT);
 
-int nas_proc_detach(int switch_off);
-int nas_proc_attach(void);
-int nas_proc_get_attach_status(void);
+int nas_proc_detach(nas_user_t *user, int switch_off);
+int nas_proc_attach(nas_user_t *user);
+int nas_proc_get_attach_status(nas_user_t *user);
 
-int nas_proc_reset_pdn(int cid);
-int nas_proc_set_pdn(int cid, int type, const char *apn, int ipv4_addr,
+int nas_proc_reset_pdn(nas_user_t *user, int cid);
+int nas_proc_set_pdn(nas_user_t *user, int cid, int type, const char *apn, int ipv4_addr,
                      int emergency, int p_cscf, int im_cn_signal);
-int nas_proc_get_pdn_range(void);
-int nas_proc_get_pdn_status(int *cids, int *states, int n_pdn_max);
-int nas_proc_get_pdn_param(int *cids, int *types, const char **apns,
+int nas_proc_get_pdn_range(nas_user_t *user);
+int nas_proc_get_pdn_status(nas_user_t *user, int *cids, int *states, int n_pdn_max);
+int nas_proc_get_pdn_param(nas_user_t *user, int *cids, int *types, const char **apns,
                            int n_pdn_max);
-int nas_proc_get_pdn_addr(int cid, int *cids, const char **addr1,
+int nas_proc_get_pdn_addr(nas_user_t *user, int cid, int *cids, const char **addr1,
                           const char **addr2, int n_addr_max);
-int nas_proc_deactivate_pdn(int cid);
-int nas_proc_activate_pdn(int cid);
+int nas_proc_deactivate_pdn(nas_user_t *user, int cid);
+int nas_proc_activate_pdn(nas_user_t *user, int cid);
 
 /*
  * --------------------------------------------------------------------------
@@ -114,14 +114,14 @@ int nas_proc_activate_pdn(int cid);
 int nas_proc_cell_info(nas_user_t *user, int found, tac_t tac, ci_t ci, AcT_t rat, uint8_t rsrp,
                        uint8_t rsrq);
 
-int nas_proc_establish_cnf(const Byte_t *data, uint32_t len);
-int nas_proc_establish_rej(void);
+int nas_proc_establish_cnf(nas_user_t *user, const Byte_t *data, uint32_t len);
+int nas_proc_establish_rej(nas_user_t *user);
 
-int nas_proc_release_ind(int cause);
+int nas_proc_release_ind(nas_user_t *user, int cause);
 
-int nas_proc_ul_transfer_cnf(void);
-int nas_proc_ul_transfer_rej(void);
-int nas_proc_dl_transfer_ind(const Byte_t *data, uint32_t len);
+int nas_proc_ul_transfer_cnf(nas_user_t *user);
+int nas_proc_ul_transfer_rej(nas_user_t *user);
+int nas_proc_dl_transfer_ind(nas_user_t *user, const Byte_t *data, uint32_t len);
 
 
 
diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c
index 85606d2a4cd9c219b14d415940c17aa70b8d90be..78fc49e682a9cd795066e8f4ba2d7c874785d850 100644
--- a/openair3/NAS/UE/nas_ue_task.c
+++ b/openair3/NAS/UE/nas_ue_task.c
@@ -163,7 +163,7 @@ void *nas_ue_task(void *args_p)
 
         if ((NAS_CONN_ESTABLI_CNF (msg_p).errCode == AS_SUCCESS)
             || (NAS_CONN_ESTABLI_CNF (msg_p).errCode == AS_TERMINATED_NAS)) {
-          nas_proc_establish_cnf(NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.data, NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.length);
+          nas_proc_establish_cnf(user, NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.data, NAS_CONN_ESTABLI_CNF (msg_p).nasMsg.length);
 
           /* TODO checks if NAS will free the nas message, better to do it there anyway! */
           // result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), NAS_CONN_ESTABLI_CNF(msg_p).nasMsg.data);
@@ -176,7 +176,7 @@ void *nas_ue_task(void *args_p)
         LOG_I(NAS, "[UE %d] Received %s: cause %u\n", Mod_id, msg_name,
               NAS_CONN_RELEASE_IND (msg_p).cause);
 
-        nas_proc_release_ind (NAS_CONN_RELEASE_IND (msg_p).cause);
+        nas_proc_release_ind (user, NAS_CONN_RELEASE_IND (msg_p).cause);
         break;
 
       case NAS_UPLINK_DATA_CNF:
@@ -184,9 +184,9 @@ void *nas_ue_task(void *args_p)
               NAS_UPLINK_DATA_CNF (msg_p).UEid, NAS_UPLINK_DATA_CNF (msg_p).errCode);
 
         if (NAS_UPLINK_DATA_CNF (msg_p).errCode == AS_SUCCESS) {
-          nas_proc_ul_transfer_cnf ();
+          nas_proc_ul_transfer_cnf (user);
         } else {
-          nas_proc_ul_transfer_rej ();
+          nas_proc_ul_transfer_rej (user);
         }
 
         break;
@@ -195,7 +195,7 @@ void *nas_ue_task(void *args_p)
         LOG_I(NAS, "[UE %d] Received %s: UEid %u, length %u\n", Mod_id, msg_name,
               NAS_DOWNLINK_DATA_IND (msg_p).UEid, NAS_DOWNLINK_DATA_IND (msg_p).nasMsg.length);
 
-        nas_proc_dl_transfer_ind (NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length);
+        nas_proc_dl_transfer_ind (user, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.data, NAS_DOWNLINK_DATA_IND(msg_p).nasMsg.length);
 
         if (0) {
           /* TODO checks if NAS will free the nas message, better to do it there anyway! */
diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c
index 0b7b6627a85015afdec1edc5bbd706560b2815b3..9bdb7206785de00b41cfa7b9a48a9b34a4fc97fd 100644
--- a/openair3/NAS/UE/nas_user.c
+++ b/openair3/NAS/UE/nas_user.c
@@ -1168,7 +1168,7 @@ static int _nas_user_proc_cops(nas_user_t *user, const at_command_t *data)
     if (ret_code != RETURNerror) {
       if (mode == AT_COPS_DEREG) {
         /* Force an attempt to deregister from the network */
-        ret_code = nas_proc_deregister();
+        ret_code = nas_proc_deregister(user);
 
         if (ret_code != RETURNok) {
           LOG_TRACE(ERROR, "USR-MAIN  - Network deregistration failed");
@@ -1178,7 +1178,7 @@ static int _nas_user_proc_cops(nas_user_t *user, const at_command_t *data)
       } else if (mode != AT_COPS_FORMAT) {
         /* Force an attempt to automatically/manualy select
          * and register the GSM/UMTS/EPS network operator */
-        ret_code = nas_proc_register(mode, format,
+        ret_code = nas_proc_register(user, mode, format,
                                      &data->command.cops.plmn, AcT);
 
         if (ret_code != RETURNok) {
@@ -1198,7 +1198,7 @@ static int _nas_user_proc_cops(nas_user_t *user, const at_command_t *data)
      */
 
     /* Get the current network registration data */
-    ret_code = nas_proc_get_reg_data(&mode,
+    ret_code = nas_proc_get_reg_data(user, &mode,
                                      &oper_is_selected, read_format,
                                      &cops->get.plmn, &cops->get.AcT);
 
@@ -1236,7 +1236,7 @@ static int _nas_user_proc_cops(nas_user_t *user, const at_command_t *data)
      * Test command returns a set of parameters, each representing
      * an operator present in the network.
      */
-    cops->tst.size = nas_proc_get_oper_list(&cops->tst.data);
+    cops->tst.size = nas_proc_get_oper_list(user, &cops->tst.data);
     break;
 
   default:
@@ -1308,9 +1308,9 @@ static int _nas_user_proc_cgatt(nas_user_t *user, const at_command_t *data)
       ret_code = RETURNerror;
 
       if (data->command.cgatt.state == AT_CGATT_ATTACHED) {
-        ret_code = nas_proc_attach();
+        ret_code = nas_proc_attach(user);
       } else if (data->command.cgatt.state == AT_CGATT_DETACHED) {
-        ret_code = nas_proc_detach(FALSE);
+        ret_code = nas_proc_detach(user, FALSE);
       }
 
       if (ret_code != RETURNok) {
@@ -1328,7 +1328,7 @@ static int _nas_user_proc_cgatt(nas_user_t *user, const at_command_t *data)
     /*
      * Read command returns the current EPS service state.
      */
-    if (nas_proc_get_attach_status() != TRUE) {
+    if (nas_proc_get_attach_status(user) != TRUE) {
       cgatt->state = AT_CGATT_DETACHED;
     } else {
       cgatt->state = AT_CGATT_ATTACHED;
@@ -1474,7 +1474,7 @@ static int _nas_user_proc_creg(nas_user_t *user, const at_command_t *data)
     case AT_CREG_OFF:
     case AT_CREG_ON:
       /* Get network registration status */
-      ret_code = nas_proc_get_reg_status(&creg->stat);
+      ret_code = nas_proc_get_reg_status(user, &creg->stat);
 
       if (ret_code != RETURNok) {
         LOG_TRACE(ERROR, "USR-MAIN  - Failed to get registration status");
@@ -1623,7 +1623,7 @@ static int _nas_user_proc_cgreg(nas_user_t *user, const at_command_t *data)
     case AT_CGREG_OFF:
     case AT_CGREG_ON:
       /* Get network registration status */
-      ret_code = nas_proc_get_reg_status(&cgreg->stat);
+      ret_code = nas_proc_get_reg_status(user, &cgreg->stat);
 
       if (ret_code != RETURNok) {
         LOG_TRACE(ERROR, "USR-MAIN  - Failed to get registration status");
@@ -1776,7 +1776,7 @@ static int _nas_user_proc_cereg(nas_user_t *user, const at_command_t *data)
     switch (n) {
     case AT_CEREG_BOTH:
       /* Get EPS location information  */
-      ret_code = nas_proc_get_loc_info(cereg->tac, cereg->ci,
+      ret_code = nas_proc_get_loc_info(user, cereg->tac, cereg->ci,
                                        &cereg->AcT);
 
       if (ret_code != RETURNok) {
@@ -1799,7 +1799,7 @@ static int _nas_user_proc_cereg(nas_user_t *user, const at_command_t *data)
     case AT_CEREG_OFF:
     case AT_CEREG_ON:
       /* Get network registration status */
-      ret_code = nas_proc_get_reg_status(&cereg->stat);
+      ret_code = nas_proc_get_reg_status(user, &cereg->stat);
 
       if (ret_code != RETURNok) {
         LOG_TRACE(ERROR, "USR-MAIN  - Failed to get registration status");
@@ -2022,10 +2022,10 @@ static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data)
     if (reset_pdn) {
       /* A special form of the set command, +CGDCONT=<cid> causes
        * the values for context number <cid> to become undefined */
-      ret_code = nas_proc_reset_pdn(cid);
+      ret_code = nas_proc_reset_pdn(user, cid);
     } else {
       /* Define a new PDN connection */
-      ret_code = nas_proc_set_pdn(cid, pdn_type, apn,
+      ret_code = nas_proc_set_pdn(user, cid, pdn_type, apn,
                                   ipv4_addr_allocation, emergency,
                                   p_cscf, im_cn_signalling);
     }
@@ -2043,7 +2043,7 @@ static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data)
      * Read command returns the current settings for each
      * defined PDN connection/default EPS bearer context
      */
-    cgdcont->n_pdns = nas_proc_get_pdn_param(cgdcont->cid,
+    cgdcont->n_pdns = nas_proc_get_pdn_param(user, cgdcont->cid,
                       cgdcont->PDP_type,
                       cgdcont->APN,
                       AT_CGDCONT_RESP_SIZE);
@@ -2061,7 +2061,7 @@ static int _nas_user_proc_cgdcont(nas_user_t *user, const at_command_t *data)
      */
   {
     /* Get the maximum value of a PDN context identifier */
-    int cid_max = nas_proc_get_pdn_range();
+    int cid_max = nas_proc_get_pdn_range(user);
 
     if (cid_max > AT_CGDCONT_RESP_SIZE) {
       /* The range is defined by the user interface */
@@ -2164,9 +2164,9 @@ static int _nas_user_proc_cgact(nas_user_t *user, const at_command_t *data)
     ret_code = RETURNerror;
 
     if (state == AT_CGACT_DEACTIVATED) {
-      ret_code = nas_proc_deactivate_pdn(cid);
+      ret_code = nas_proc_deactivate_pdn(user, cid);
     } else if (state == AT_CGACT_ACTIVATED) {
-      ret_code = nas_proc_activate_pdn(cid);
+      ret_code = nas_proc_activate_pdn(user, cid);
     }
 
     if (ret_code != RETURNok) {
@@ -2184,7 +2184,7 @@ static int _nas_user_proc_cgact(nas_user_t *user, const at_command_t *data)
      * The read command returns the current activation states for
      * all the defined PDN/EPS bearer contexts
      */
-    cgact->n_pdns = nas_proc_get_pdn_status(cgact->cid, cgact->state,
+    cgact->n_pdns = nas_proc_get_pdn_status(user, cgact->cid, cgact->state,
                                             AT_CGACT_RESP_SIZE);
 
     if (cgact->n_pdns == 0) {
@@ -2517,7 +2517,7 @@ static int _nas_user_proc_cgpaddr(nas_user_t *user, const at_command_t *data)
     /*
      * Get the PDP addresses
      */
-    cgpaddr->n_pdns = nas_proc_get_pdn_addr(cid, cgpaddr->cid,
+    cgpaddr->n_pdns = nas_proc_get_pdn_addr(user, cid, cgpaddr->cid,
                                             cgpaddr->PDP_addr_1,
                                             cgpaddr->PDP_addr_2,
                                             AT_CGPADDR_RESP_SIZE);
@@ -2533,7 +2533,7 @@ static int _nas_user_proc_cgpaddr(nas_user_t *user, const at_command_t *data)
     /*
      * The test command returns a list of defined <cid>s.
      */
-    cgpaddr->n_pdns = nas_proc_get_pdn_addr(cid, cgpaddr->cid,
+    cgpaddr->n_pdns = nas_proc_get_pdn_addr(user, cid, cgpaddr->cid,
                                             cgpaddr->PDP_addr_1,
                                             cgpaddr->PDP_addr_2,
                                             AT_CGPADDR_RESP_SIZE);