diff --git a/openair3/NAS/UE/API/USER/user_api.c b/openair3/NAS/UE/API/USER/user_api.c
index dd5b5758f1fad084d675b2939614350e18f999b8..9fa6ebc0a92afbcb7244976882d87e0246fdee5e 100644
--- a/openair3/NAS/UE/API/USER/user_api.c
+++ b/openair3/NAS/UE/API/USER/user_api.c
@@ -110,23 +110,16 @@ static struct {
  * The buffer used to receive data from the user application layer
  */
 #define USER_API_RECV_BUFFER_SIZE 4096
+// FIXME not reentrant
 static char _user_api_recv_buffer[USER_API_RECV_BUFFER_SIZE];
 
 /*
  * The buffer used to send data to the user application layer
  */
 #define USER_API_SEND_BUFFER_SIZE USER_API_RECV_BUFFER_SIZE
+// FIXME not reentrant
 static char _user_api_send_buffer[USER_API_SEND_BUFFER_SIZE];
 
-/*
- * The decoded data received from the user application layer
- */
-static struct {
-  int n_cmd;    /* number of user data to be processed    */
-#define USER_DATA_MAX 10
-  at_command_t cmd[USER_DATA_MAX];  /* user data to be processed  */
-} _user_data = {};
-
 /****************************************************************************/
 /******************  E X P O R T E D    F U N C T I O N S  ******************/
 /****************************************************************************/
@@ -261,12 +254,12 @@ int user_api_get_fd(void)
  **              Others:        None                                       **
  **                                                                        **
  ***************************************************************************/
-const void* user_api_get_data(int index)
+const void* user_api_get_data(user_at_commands_t *commands, int index)
 {
   LOG_FUNC_IN;
 
-  if (index < _user_data.n_cmd) {
-    LOG_FUNC_RETURN ((void*)(&_user_data.cmd[index]));
+  if (index < commands->n_cmd) {
+    LOG_FUNC_RETURN ((void*)(&commands->cmd[index]));
   }
 
   LOG_FUNC_RETURN (NULL);
@@ -458,22 +451,22 @@ void user_api_close(int fd)
  **      Others:  _user_api_send_buffer, _user_data          **
  **                                                                        **
  ***************************************************************************/
-int user_api_decode_data(int length)
+int user_api_decode_data(user_at_commands_t *commands, int length)
 {
   LOG_FUNC_IN;
 
   /* Parse the AT command line */
   LOG_TRACE(INFO, "USR-API   - Decode user data: %s", _user_api_recv_buffer);
-  _user_data.n_cmd = at_command_decode(_user_api_recv_buffer, length,
-                                       _user_data.cmd);
+  commands->n_cmd = at_command_decode(_user_api_recv_buffer, length,
+                                       commands->cmd);
 
-  if (_user_data.n_cmd > 0) {
+  if (commands->n_cmd > 0) {
     /* AT command data received from the user application layer
      * has been successfully decoded */
     LOG_TRACE(INFO, "USR-API   - %d AT command%s ha%s been successfully "
-              "decoded", _user_data.n_cmd,
-              (_user_data.n_cmd > 1) ? "s" : "",
-              (_user_data.n_cmd > 1) ? "ve" : "s");
+              "decoded", commands->n_cmd,
+              (commands->n_cmd > 1) ? "s" : "",
+              (commands->n_cmd > 1) ? "ve" : "s");
   } else {
     int bytes;
 
@@ -490,7 +483,7 @@ int user_api_decode_data(int length)
     (void) _user_api_send_data(bytes);
   }
 
-  LOG_FUNC_RETURN (_user_data.n_cmd);
+  LOG_FUNC_RETURN (commands->n_cmd);
 }
 
 /****************************************************************************
diff --git a/openair3/NAS/UE/API/USER/user_api.h b/openair3/NAS/UE/API/USER/user_api.h
index 9597c0f1d1bbcedb1908abf4bde53cf9247fb2cd..b3325417c66978c5bf354e682e9c39c6eabda3cf 100644
--- a/openair3/NAS/UE/API/USER/user_api.h
+++ b/openair3/NAS/UE/API/USER/user_api.h
@@ -42,6 +42,7 @@ Description Implements the API used by the NAS layer running in the UE
 
 #include "commonDef.h"
 #include "networkDef.h"
+#include "at_command.h"
 
 /****************************************************************************/
 /*********************  G L O B A L    C O N S T A N T S  *******************/
@@ -51,6 +52,16 @@ Description Implements the API used by the NAS layer running in the UE
 /************************  G L O B A L    T Y P E S  ************************/
 /****************************************************************************/
 
+/*
+ * The decoded data received from the user application layer
+ */
+typedef struct {
+  int n_cmd;    /* number of user data to be processed    */
+#define USER_DATA_MAX 10
+  at_command_t cmd[USER_DATA_MAX];  /* user data to be processed  */
+} user_at_commands_t;
+
+
 /****************************************************************************/
 /********************  G L O B A L    V A R I A B L E S  ********************/
 /****************************************************************************/
@@ -65,14 +76,14 @@ int user_api_emm_callback(Stat_t stat, tac_t tac, ci_t ci, AcT_t AcT, const char
 int user_api_esm_callback(int cid, network_pdn_state_t state);
 
 int user_api_get_fd(void);
-const void* user_api_get_data(int index);
+const void* user_api_get_data(user_at_commands_t *commands, int index);
 
 int user_api_read_data(int fd);
 int user_api_set_data(char *message);
 int user_api_send_data(int fd, int length);
 void user_api_close(int fd);
 
-int user_api_decode_data(int length);
+int user_api_decode_data(user_at_commands_t *commands, int length);
 int user_api_encode_data(const void* data, int add_success_code);
 
 #endif /* __USER_API_H__ */
diff --git a/openair3/NAS/UE/UEprocess.c b/openair3/NAS/UE/UEprocess.c
index aa96a97b739623501c897fa2eb9b1ca2053c5c9a..18756fe4b4b7f60b781bcfa0a771c2281d680212 100644
--- a/openair3/NAS/UE/UEprocess.c
+++ b/openair3/NAS/UE/UEprocess.c
@@ -74,6 +74,7 @@ static void _nas_clean(int usr_fd, int net_fd);
 
 uint8_t usim_test = 0;
 // FIXME user must be set up with right itti message instance
+// FIXME allocate user and initialize its fields
 nas_user_t *user = NULL;
 
 /****************************************************************************/
diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c
index 8373a6f15bdcf429e68f199b49dfbdf394aa5d21..ece175bd05c75cfef6840428ec5469a77e3da6d4 100644
--- a/openair3/NAS/UE/nas_ue_task.c
+++ b/openair3/NAS/UE/nas_ue_task.c
@@ -88,6 +88,12 @@ void *nas_ue_task(void *args_p)
       itti_subscribe_event_fd (TASK_NAS_UE, user->fd);
     }
 
+    user->user_at_commands = calloc(1, sizeof(user_at_commands_t));
+    if ( user->user_at_commands == NULL ) {
+        LOG_E(NAS, "[UE %d] Can't allocate memory for user_at_commands\n", 0);
+        // FIXME stop here
+    }
+
     user->at_response = calloc(1, sizeof(at_response_t));
     if ( user->at_response == NULL ) {
         LOG_E(NAS, "[UE %d] Can't allocate memory for user_at_commands\n", 0);
diff --git a/openair3/NAS/UE/nas_user.c b/openair3/NAS/UE/nas_user.c
index ef95fd052aa4a9227680b215039f6c100718e563..36ba0b7706aaa29d0de0be99e30b0f5808d68aae 100644
--- a/openair3/NAS/UE/nas_user.c
+++ b/openair3/NAS/UE/nas_user.c
@@ -239,11 +239,11 @@ int nas_user_receive_and_process(nas_user_t *user, char *message)
   }
 
   /* Decode the user data message */
-  nb_command = user_api_decode_data (bytes);
+  nb_command = user_api_decode_data (user->user_at_commands, bytes);
 
   for (i = 0; i < nb_command; i++) {
     /* Get the user data to be processed */
-    const void *data = user_api_get_data (i);
+    const void *data = user_api_get_data (user->user_at_commands, i);
 
     if (data == NULL) {
       /* Failed to get user data at the given index;
diff --git a/openair3/NAS/UE/user_defs.h b/openair3/NAS/UE/user_defs.h
index 0661543047770fb27f12c65c010aae7d15cc5e03..00e713a7d382215dcb2b5da119d28a7199dd9f06 100644
--- a/openair3/NAS/UE/user_defs.h
+++ b/openair3/NAS/UE/user_defs.h
@@ -53,6 +53,7 @@ Description NAS type definition to manage a user equipment
 #include "EMM/Authentication.h"
 #include "EMM/IdleMode_defs.h"
 #include "API/USIM/usim_api.h"
+#include "API/USER/user_api.h"
 #include "SecurityModeControl.h"
 #include "userDef.h"
 #include "at_response.h"
@@ -77,6 +78,8 @@ typedef struct {
   //
   nas_user_context_t *nas_user_context;
   at_response_t *at_response; // data structure returned to the user as the result of NAS procedure function call
+  //
+  user_at_commands_t *user_at_commands; //decoded data received from the user application layer
 } nas_user_t;
 
 #endif