From c26a130033c10f438b941c725d20e27a8f100fbb Mon Sep 17 00:00:00 2001
From: Cedric Roux <cedric.roux@eurecom.fr>
Date: Wed, 11 Dec 2013 10:08:23 +0000
Subject: [PATCH] - Mapped malloc/free for ITTI to itti_malloc/itti_free
 functions for future use within real-time softmodem - Fixed softmodem build
 issues with RAL - Merged ITTI into agilent softmodem for eNB

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@4661 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 common/utils/itti/intertask_interface.c       |  83 +-
 common/utils/itti/intertask_interface.h       |   4 +
 common/utils/itti/intertask_interface_dump.c  |  52 +-
 common/utils/itti/intertask_interface_dump.h  |   6 +-
 openair-cn/NAS/nas_ue_task.c                  |   2 +-
 openair-cn/S1AP/s1ap_eNB.c                    |   2 +-
 openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c |   5 +-
 openair2/ENB_APP/enb_app.c                    |   2 +-
 openair2/LAYER2/MAC/eNB_scheduler.c           |   2 +-
 openair2/LAYER2/MAC/ue_procedures.c           |   2 +-
 openair2/LAYER2/PDCP_v10.1.0/pdcp.c           |   4 +-
 openair2/RRC/LITE/L2_interface.c              |   4 +-
 openair2/RRC/LITE/rrc_UE.c                    |   7 +-
 openair2/RRC/LITE/rrc_eNB.c                   |   4 +-
 openair2/UTIL/LOG/vcd_signal_dumper.c         |   5 +
 openair2/UTIL/LOG/vcd_signal_dumper.h         |   1 +
 .../LTE_RAL_ENB/INCLUDE/lteRALenb_main.h      |   4 +-
 openair3/RAL-LTE/Makefile.inc                 |   4 +-
 targets/RTAI/USER/Makefile                    |  39 +-
 targets/RTAI/USER/lte-enb.c                   | 868 +++++++++++-------
 targets/RTAI/USER/lte-softmodem.c             |   6 +-
 targets/SIMU/USER/oaisim.c                    |   6 +-
 22 files changed, 680 insertions(+), 432 deletions(-)

diff --git a/common/utils/itti/intertask_interface.c b/common/utils/itti/intertask_interface.c
index c27b67e4a2..f091a5e9ae 100644
--- a/common/utils/itti/intertask_interface.c
+++ b/common/utils/itti/intertask_interface.c
@@ -37,10 +37,6 @@
 #include <errno.h>
 #include <signal.h>
 
-#ifdef RTAI
-# include <rtai_fifos.h>
-#endif
-
 #include "assertions.h"
 
 #include <sys/epoll.h>
@@ -50,6 +46,10 @@
 #include "intertask_interface.h"
 #include "intertask_interface_dump.h"
 
+#ifdef RTAI
+# include <rtai_shm.h>
+#endif
+
 #if defined(OAI_EMU) || defined(RTAI)
 # include "vcd_signal_dumper.h"
 #endif
@@ -87,6 +87,11 @@ const int itti_debug_poll = 0;
 # define KERNEL_VERSION_PRE_2_6_30 1
 #endif
 
+#ifdef RTAI
+# define ITTI_MEM_PAGE_SIZE (1024)
+# define ITTI_MEM_SIZE      (16 * 1024 * 1024)
+#endif
+
 typedef enum task_state_s {
     TASK_STATE_NOT_CONFIGURED, TASK_STATE_STARTING, TASK_STATE_READY, TASK_STATE_ENDED, TASK_STATE_MAX,
 } task_state_t;
@@ -174,6 +179,32 @@ typedef struct itti_desc_s {
 
 static itti_desc_t itti_desc;
 
+void *itti_malloc(task_id_t task_id, ssize_t size)
+{
+    void *ptr = NULL;
+
+#ifdef RTAI
+//     ptr = rt_malloc(size);
+    ptr = malloc(size);
+#else
+    ptr = malloc(size);
+#endif
+
+    DevCheck(ptr != NULL, ptr, size, task_id);
+
+    return ptr;
+}
+
+void itti_free(task_id_t task_id, void *ptr)
+{
+    DevAssert(ptr != NULL);
+#ifdef RTAI
+    free(ptr);
+#else
+    free(ptr);
+#endif
+}
+
 static inline message_number_t itti_increment_message_number(void) {
     /* Atomic operation supported by GCC: returns the current message number
      * and then increment it by 1.
@@ -227,6 +258,7 @@ void itti_update_lte_time(uint32_t frame, uint8_t slot)
 
 int itti_send_broadcast_message(MessageDef *message_p) {
     task_id_t destination_task_id;
+    task_id_t origin_task_id;
     thread_id_t origin_thread_id;
     uint32_t thread_id;
     int ret = 0;
@@ -234,7 +266,8 @@ int itti_send_broadcast_message(MessageDef *message_p) {
 
     DevAssert(message_p != NULL);
 
-    origin_thread_id = TASK_GET_THREAD_ID(message_p->ittiMsgHeader.originTaskId);
+    origin_task_id = message_p->ittiMsgHeader.originTaskId;
+    origin_thread_id = TASK_GET_THREAD_ID(origin_task_id);
 
     destination_task_id = TASK_FIRST;
     for (thread_id = THREAD_FIRST; thread_id < itti_desc.thread_max; thread_id++) {
@@ -248,7 +281,7 @@ int itti_send_broadcast_message(MessageDef *message_p) {
         if (thread_id != origin_thread_id) {
             /* Skip tasks which are not running */
             if (itti_desc.threads[thread_id].task_state == TASK_STATE_READY) {
-                new_message_p = malloc (sizeof(MessageDef));
+                new_message_p = itti_malloc (origin_task_id, sizeof(MessageDef));
                 DevAssert(message_p != NULL);
 
                 memcpy (new_message_p, message_p, sizeof(MessageDef));
@@ -278,7 +311,7 @@ inline MessageDef *itti_alloc_new_message_sized(task_id_t origin_task_id, Messag
         origin_task_id = itti_get_current_task_id();
     }
 
-    temp = malloc (sizeof(MessageHeader) + size);
+    temp = itti_malloc (origin_task_id, sizeof(MessageHeader) + size);
     DevAssert(temp != NULL);
 
     temp->ittiMsgHeader.messageId = message_id;
@@ -329,16 +362,7 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
     /* Increment the global message number */
     message_number = itti_increment_message_number ();
 
-/*
- *
- #ifdef RTAI
-    if ((pthread_self() == itti_desc.threads[TASK_GET_THREAD_ID(origin_task_id)].task_thread) ||
-        (task_id == TASK_UNKNOWN) ||
-        ((TASK_GET_PARENT_TASK_ID(origin_task_id) != TASK_UNKNOWN) &&
-        (pthread_self() == itti_desc.threads[TASK_GET_PARENT_TASK_ID(origin_task_id)].task_thread)))
-#endif
-*/
-    itti_dump_queue_message (message_number, message, itti_desc.messages_info[message_id].name,
+    itti_dump_queue_message (origin_task_id, message_number, message, itti_desc.messages_info[message_id].name,
                              sizeof(MessageHeader) + message->ittiMsgHeader.ittiMsgSize);
 
     if (destination_task_id != TASK_UNKNOWN)
@@ -364,7 +388,7 @@ int itti_send_msg_to_task(task_id_t destination_task_id, instance_t instance, Me
                      itti_desc.threads[destination_thread_id].task_state, message_id);
 
             /* Allocate new list element */
-            new = (message_list_t *) malloc (sizeof(struct message_list_s));
+            new = (message_list_t *) itti_malloc (origin_task_id, sizeof(struct message_list_s));
             DevAssert(new != NULL);
 
             /* Fill in members */
@@ -552,7 +576,7 @@ static inline void itti_receive_msg_internal_event_fd(task_id_t task_id, uint8_t
             }
             DevAssert(message != NULL);
             *received_msg = message->msg;
-            free (message);
+            itti_free (ITTI_MSG_ORIGIN_ID(*received_msg), message);
             return;
         }
     }
@@ -659,6 +683,12 @@ void itti_mark_task_ready(task_id_t task_id)
 
     DevCheck(thread_id < itti_desc.thread_max, thread_id, itti_desc.thread_max, 0);
 
+    /* Register the thread in itti dump */
+    itti_dump_thread_use_ring_buffer();
+
+    /* Mark the thread as using LFDS queue */
+    lfds611_queue_use(itti_desc.tasks[task_id].message_queue);
+
 #ifdef RTAI
     /* Assign low priority to created threads */
     {
@@ -668,12 +698,6 @@ void itti_mark_task_ready(task_id_t task_id)
     }
 #endif
 
-    /* Register the thread in itti dump */
-    itti_dump_thread_use_ring_buffer();
-
-    /* Mark the thread as using LFDS queue */
-    lfds611_queue_use(itti_desc.tasks[task_id].message_queue);
-
     itti_desc.threads[thread_id].task_state = TASK_STATE_READY;
 }
 
@@ -779,13 +803,6 @@ int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_i
             ITTI_ERROR("lfds611_queue_new failed for task %u\n", task_id);
             DevAssert(0 == 1);
         }
-
-# ifdef RTAI
-        if (task_id == TASK_L2L1)
-        {
-            ret = rtf_sem_init(56, 0);
-        }
-# endif
     }
 
     /* Initializing each thread */
@@ -844,6 +861,8 @@ int itti_init(task_id_t task_max, thread_id_t thread_max, MessagesIds messages_i
 #ifdef RTAI
     /* Start RT relay thread */
     DevAssert(pthread_create (&itti_desc.rt_relay_thread, NULL, itti_rt_relay_thread, NULL) >= 0);
+
+    rt_global_heap_open();
 #endif
 
 #if defined(OAI_EMU) || defined(RTAI)
diff --git a/common/utils/itti/intertask_interface.h b/common/utils/itti/intertask_interface.h
index 02d5cda60c..d538a9cc8d 100644
--- a/common/utils/itti/intertask_interface.h
+++ b/common/utils/itti/intertask_interface.h
@@ -225,5 +225,9 @@ void itti_wait_tasks_end(void);
  **/
 void itti_send_terminate_message(task_id_t task_id);
 
+void *itti_malloc(task_id_t task_id, ssize_t size);
+
+void itti_free(task_id_t task_id, void *ptr);
+
 #endif /* INTERTASK_INTERFACE_H_ */
 /* @} */
diff --git a/common/utils/itti/intertask_interface_dump.c b/common/utils/itti/intertask_interface_dump.c
index 3dee58b625..e87cb5fd85 100644
--- a/common/utils/itti/intertask_interface_dump.c
+++ b/common/utils/itti/intertask_interface_dump.c
@@ -90,12 +90,12 @@ static const int itti_dump_debug = 0;
 #define ITTI_DUMP_EXIT_SIGNAL       0x4
 
 typedef struct itti_dump_queue_item_s {
-    void    *data;
-    uint32_t data_size;
-    uint32_t message_number;
-    char     message_name[SIGNAL_NAME_LENGTH];
-    uint32_t message_type;
-    uint32_t message_size;
+    MessageDef *data;
+    uint32_t    data_size;
+    uint32_t    message_number;
+    char        message_name[SIGNAL_NAME_LENGTH];
+    uint32_t    message_type;
+    uint32_t    message_size;
 } itti_dump_queue_item_t;
 
 typedef struct {
@@ -215,6 +215,9 @@ static void itti_dump_fwrite_message(itti_dump_queue_item_t *message)
         fwrite (&message->message_number, sizeof(message->message_number), 1, dump_file);
         fwrite (message->message_name, sizeof(message->message_name), 1, dump_file);
         fwrite (message->data, message->data_size, 1, dump_file);
+// #if !defined(RTAI)
+        fflush (dump_file);
+// #endif
     }
 }
 
@@ -303,7 +306,8 @@ static int itti_dump_enqueue_message(itti_dump_queue_item_t *new, uint32_t messa
     return 0;
 }
 
-int itti_dump_queue_message(message_number_t message_number,
+int itti_dump_queue_message(task_id_t sender_task,
+                            message_number_t message_number,
                             MessageDef *message_p,
                             const char *message_name,
                             const uint32_t message_size)
@@ -316,21 +320,22 @@ int itti_dump_queue_message(message_number_t message_number,
         DevAssert(message_name != NULL);
         DevAssert(message_p != NULL);
 
-        new = malloc(sizeof(itti_dump_queue_item_t));
-
-        if (new == NULL) {
-            ITTI_DUMP_ERROR("Failed to allocate memory (%s:%d)\n",
-                       __FILE__, __LINE__);
-            return -1;
-        }
+#if defined(OAI_EMU) || defined(RTAI)
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_IN);
+#endif
+        new = itti_malloc(sender_task, sizeof(itti_dump_queue_item_t));
+#if defined(OAI_EMU) || defined(RTAI)
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_OUT);
+#endif
 
-        new->data = malloc(message_size);
+#if defined(OAI_EMU) || defined(RTAI)
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_IN);
+#endif
+        new->data = itti_malloc(sender_task, message_size);
+#if defined(OAI_EMU) || defined(RTAI)
+        vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC, VCD_FUNCTION_OUT);
+#endif
 
-        if (new->data == NULL) {
-            ITTI_DUMP_ERROR("Failed to allocate memory (%s:%d)\n",
-                       __FILE__, __LINE__);
-            return -1;
-        }
         memcpy(new->data, message_p, message_size);
         new->data_size       = message_size;
         new->message_number  = message_number;
@@ -764,13 +769,16 @@ static void itti_dump_user_data_delete_function(void *user_data, void *user_stat
     if (user_data != NULL)
     {
         itti_dump_queue_item_t *item;
+        task_id_t task_id;
 
         item = (itti_dump_queue_item_t *)user_data;
+        task_id = ITTI_MSG_ORIGIN_ID(item->data);
+
         if (item->data != NULL)
         {
-            free(item->data);
+            itti_free(task_id, item->data);
         }
-        free(item);
+        itti_free(task_id, item);
     }
 }
 
diff --git a/common/utils/itti/intertask_interface_dump.h b/common/utils/itti/intertask_interface_dump.h
index 9c070b8633..a287c37d6b 100644
--- a/common/utils/itti/intertask_interface_dump.h
+++ b/common/utils/itti/intertask_interface_dump.h
@@ -31,13 +31,9 @@
 #ifndef INTERTASK_INTERFACE_DUMP_H_
 #define INTERTASK_INTERFACE_DUMP_H_
 
-int itti_dump_queue_message(message_number_t message_number, MessageDef *message_p, const char *message_name,
+int itti_dump_queue_message(task_id_t sender_task, message_number_t message_number, MessageDef *message_p, const char *message_name,
                             const uint32_t message_size);
 
-int itti_dump_queue_generic_string_message(message_number_t message_number,
-                                           char *string_message,
-                                           const uint32_t string_message_length);
-
 int itti_dump_init(const char * const messages_definition_xml, const char * const dump_file_name);
 
 void itti_dump_exit(void);
diff --git a/openair-cn/NAS/nas_ue_task.c b/openair-cn/NAS/nas_ue_task.c
index 1d28962ac7..31c89d3b4d 100644
--- a/openair-cn/NAS/nas_ue_task.c
+++ b/openair-cn/NAS/nas_ue_task.c
@@ -76,7 +76,7 @@ void *nas_ue_task(void *args_p) {
         break;
     }
 
-    free (msg_p);
+    itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     msg_p = NULL;
   }
 }
diff --git a/openair-cn/S1AP/s1ap_eNB.c b/openair-cn/S1AP/s1ap_eNB.c
index 5ff4624e71..1e4564ce4b 100644
--- a/openair-cn/S1AP/s1ap_eNB.c
+++ b/openair-cn/S1AP/s1ap_eNB.c
@@ -288,7 +288,7 @@ void *s1ap_eNB_task(void *arg)
                 break;
         }
 
-        free(received_msg);
+        itti_free (ITTI_MSG_ORIGIN_ID(received_msg), received_msg);
 
         received_msg = NULL;
     }
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index f931e62447..78f3919887 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -25,7 +25,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
 {
 
   static int max_pos_fil = 0;
-  int temp, i, aa, max_val = 0, max_pos = 0;
+  int temp = 0, i, aa, max_val = 0, max_pos = 0;
   int diff;
   short Re,Im,ncoef;
 
@@ -73,7 +73,8 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
 
 
 #ifdef DEBUG_PHY
-  LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n",phy_vars_ue->frame,phy_vars_ue->rx_offset,max_pos,max_pos_fil,temp);
+  LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n",
+        phy_vars_ue->frame,phy_vars_ue->rx_offset,max_pos,max_pos_fil,temp);
 #endif //DEBUG_PHY
 
 #ifdef CBMIMO1
diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c
index 09b8b48fa8..40034e3109 100644
--- a/openair2/ENB_APP/enb_app.c
+++ b/openair2/ENB_APP/enb_app.c
@@ -250,7 +250,7 @@ void *eNB_app_task(void *args_p)
                 break;
         }
 
-        free (msg_p);
+        itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     } while (1);
 #endif
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index 15f1f8b28a..8f5dcaa3a3 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -4281,7 +4281,7 @@ void eNB_dlsch_ulsch_scheduler(u8 Mod_id,u8 cooperation_flag, u32 frame, u8 subf
           break;
       }
 
-      free (msg_p);
+      itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     }
   } while(msg_p != NULL);
 #endif
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index 4df49aedc0..5f21207b0a 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -1310,7 +1310,7 @@ UE_L2_STATE_t ue_scheduler(u8 Mod_id,u32 frame, u8 subframe, lte_subframe_t dire
           break;
       }
 
-      free (msg_p);
+      itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     }
   } while(msg_p != NULL);
 #endif
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index d8b936d278..882c12aadc 100755
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -519,7 +519,7 @@ void pdcp_run (u32_t frame, u8 eNB_flag, u8 UE_index, u8 eNB_index) {
                          RRC_DCCH_DATA_REQ (msg_p).sdu_p, RRC_DCCH_DATA_REQ (msg_p).mode);
 
           // Message buffer has been processed, free it now.
-          free (RRC_DCCH_DATA_REQ (msg_p).sdu_p);
+          itti_free (ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_REQ (msg_p).sdu_p);
           break;
 
         default:
@@ -527,7 +527,7 @@ void pdcp_run (u32_t frame, u8 eNB_flag, u8 UE_index, u8 eNB_index) {
           break;
       }
 
-      free (msg_p);
+      itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     }
   } while(msg_p != NULL);
 #endif
diff --git a/openair2/RRC/LITE/L2_interface.c b/openair2/RRC/LITE/L2_interface.c
index ee9137f75d..f97fabf6b9 100644
--- a/openair2/RRC/LITE/L2_interface.c
+++ b/openair2/RRC/LITE/L2_interface.c
@@ -485,7 +485,7 @@ u8 rrc_lite_data_req(u8 Mod_id, u32 frame, u8 eNB_flag, unsigned int rb_id, u32
     // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
     u8 *message_buffer;
 
-    message_buffer = malloc (sdu_size);
+    message_buffer = itti_malloc (eNB_flag ? TASK_RRC_ENB : TASK_RRC_UE, sdu_size);
     memcpy (message_buffer, Buffer, sdu_size);
 
     message_p = itti_alloc_new_message (eNB_flag ? TASK_RRC_ENB : TASK_RRC_UE, RRC_DCCH_DATA_REQ);
@@ -524,7 +524,7 @@ void rrc_lite_data_ind(module_id_t Mod_id, u32 frame, u8 eNB_flag,u32 Srb_id, u3
     // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
     u8 *message_buffer;
 
-    message_buffer = malloc (sdu_size);
+    message_buffer = itti_malloc (eNB_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, sdu_size);
     memcpy (message_buffer, Buffer, sdu_size);
 
     message_p = itti_alloc_new_message (eNB_flag ? TASK_PDCP_ENB : TASK_PDCP_UE, RRC_DCCH_DATA_IND);
diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c
index 6463cf7a75..c42effd2d8 100644
--- a/openair2/RRC/LITE/rrc_UE.c
+++ b/openair2/RRC/LITE/rrc_UE.c
@@ -273,7 +273,8 @@ void rrc_ue_generate_RRCConnectionSetupComplete(u8 Mod_id, u32 frame, u8 eNB_ind
   u8 buffer[100];
   u8 size;
 
-  size = do_RRCConnectionSetupComplete(buffer, Transaction_id, sizeof(nas_attach_req_guti), nas_attach_req_guti);
+//   size = do_RRCConnectionSetupComplete(buffer, Transaction_id, sizeof(nas_attach_req_guti), nas_attach_req_guti);
+  size = do_RRCConnectionSetupComplete(buffer, Transaction_id, sizeof(nas_attach_req_imsi), nas_attach_req_imsi);
 
   LOG_I(RRC,"[UE %d][RAPROC] Frame %d : Logical Channel UL-DCCH (SRB1), Generating RRCConnectionSetupComplete (bytes%d, eNB %d)\n",
     Mod_id,frame, size, eNB_index);
@@ -2496,7 +2497,7 @@ void *rrc_ue_task(void *args_p) {
                             RRC_DCCH_DATA_IND (msg_p).ue_index);
 
         // Message buffer has been processed, free it now.
-        free (RRC_DCCH_DATA_IND (msg_p).sdu_p);
+        itti_free (ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_IND (msg_p).sdu_p);
         break;
 
       /* NAS messages */
@@ -2555,7 +2556,7 @@ void *rrc_ue_task(void *args_p) {
         break;
     }
 
-    free (msg_p);
+    itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     msg_p = NULL;
   }
 }
diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c
index 57f7372160..7147c307b8 100644
--- a/openair2/RRC/LITE/rrc_eNB.c
+++ b/openair2/RRC/LITE/rrc_eNB.c
@@ -3056,7 +3056,7 @@ void *rrc_enb_task(void *args_p) {
                              RRC_DCCH_DATA_IND (msg_p).sdu_size);
 
         // Message buffer has been processed, free it now.
-        free (RRC_DCCH_DATA_IND (msg_p).sdu_p);
+        itti_free (ITTI_MSG_ORIGIN_ID(msg_p), RRC_DCCH_DATA_IND (msg_p).sdu_p);
         break;
 
 #if defined(ENABLE_USE_MME)
@@ -3087,7 +3087,7 @@ void *rrc_enb_task(void *args_p) {
         break;
     }
 
-    free (msg_p);
+    itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
     msg_p = NULL;
   }
 }
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 2ebcc82be1..b3fad6c024 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -167,6 +167,7 @@ const char* eurecomFunctionsNames[] = {
     "pdcp_validate_security",
     "itti_enqueue_message",
     "itti_dump_enqueue_message",
+    "itti_dump_enqueue_message_malloc",
     "test"
 };
 
@@ -270,11 +271,15 @@ void *vcd_dumper_thread_rt(void *args)
 {
     vcd_queue_user_data_t *data;
     char binary_string[(sizeof (uint64_t) * BYTE_SIZE) + 1];
+    struct sched_param sched_param;
 
 # if defined(ENABLE_ITTI)
     signal_mask();
 # endif
 
+    sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 1;
+    sched_setscheduler(0, SCHED_FIFO, &sched_param);
+
     while(1) {
         if (lfds611_queue_dequeue(vcd_queue, (void **) &data) == 0) {
             /* No element -> sleep a while */
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index 8730b60771..d6345846f6 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -138,6 +138,7 @@ typedef enum
     VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_VALIDATE_SECURITY,
     VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_ENQUEUE_MESSAGE,
     VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE,
+    VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_DUMP_ENQUEUE_MESSAGE_MALLOC,
     VCD_SIGNAL_DUMPER_FUNCTIONS_TEST,
     VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
     VCD_SIGNAL_DUMPER_FUNCTIONS_END = VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
diff --git a/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_main.h b/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_main.h
index e68122ac59..eb4fc7083b 100755
--- a/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_main.h
+++ b/openair3/RAL-LTE/LTE_RAL_ENB/INCLUDE/lteRALenb_main.h
@@ -81,7 +81,7 @@ typedef struct ral_lte_channel {
     float pkBitrate[2];
     float MTU[2];
 
-#if ! defined(ENABLE_USE_MME)
+// #if ! defined(ENABLE_USE_MME)
     //IP driver parameters
     u16   rbId;
     u16   RadioQoSclass;
@@ -89,7 +89,7 @@ typedef struct ral_lte_channel {
     u16   dscpDL;
     u16   nas_state;
     u16   status;
-#endif
+// #endif
 }ral_lte_channel_t;
 
 /*
diff --git a/openair3/RAL-LTE/Makefile.inc b/openair3/RAL-LTE/Makefile.inc
index 08ed232511..d17beeae87 100755
--- a/openair3/RAL-LTE/Makefile.inc
+++ b/openair3/RAL-LTE/Makefile.inc
@@ -1,6 +1,7 @@
 
 RAL_OBJS =
 
+ifdef $(ENABLE_RAL)
 RAL_OBJS += $(OPENAIR3_DIR)/RAL-LTE/INTERFACE-802.21/C/MIH_C_header_codec.o
 RAL_OBJS += $(OPENAIR3_DIR)/RAL-LTE/INTERFACE-802.21/C/MIH_C_msg_codec.o
 RAL_OBJS += $(OPENAIR3_DIR)/RAL-LTE/INTERFACE-802.21/C/MIH_C_primitive_codec.o
@@ -33,8 +34,7 @@ RAL_OBJS += $(OPENAIR3_DIR)/RAL-LTE/LTE_RAL_UE/SRC/lteRALue_process.o
 RAL_OBJS += $(OPENAIR3_DIR)/RAL-LTE/LTE_RAL_UE/SRC/lteRALue_rrc_msg.o
 RAL_OBJS += $(OPENAIR3_DIR)/RAL-LTE/LTE_RAL_UE/SRC/lteRALue_subscribe.o
 RAL_OBJS += $(OPENAIR3_DIR)/RAL-LTE/LTE_RAL_UE/SRC/lteRALue_thresholds.o
-
-
+endif
 
 EXTRA_CFLAGS += -DMIH_C_MEDIEVAL_EXTENSIONS
 L2_OBJS += $(RAL_OBJS)
diff --git a/targets/RTAI/USER/Makefile b/targets/RTAI/USER/Makefile
index 11006f4edb..60f4e1ba12 100644
--- a/targets/RTAI/USER/Makefile
+++ b/targets/RTAI/USER/Makefile
@@ -2,7 +2,7 @@
 include $(OPENAIR_TARGETS)/Makerules
 
 default: lte-softmodem
-all: lte-softmodem
+all: lte-softmodem lte-enb
 
 include $(OPENAIR_TARGETS)/Makefile.common
 
@@ -19,7 +19,9 @@ endif
 
 CFLAGS += -O2
 CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
-
+ifdef DEBUG
+CFLAGS += -g -ggdb
+endif
 SRC = synctest.c condtest.c #lte-softmodem.c
 
 ifndef RTAI
@@ -33,20 +35,24 @@ endif
 ifeq ($(RTAI),1)
 CFLAGS += -DENABLE_RTAI_CLOCK
 CFLAGS += -DCONFIG_RTAI_LXRT_INLINE  #remend the RTAI warning
-#RTAI_OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o lte-softmodem.o rt_wrapper.o 
 RTAI_OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o 
 ifeq ($(USRP),1)
 RTAI_OBJ += lte-softmodem-usrp.o
 else
-RTAI_OBJ += lte-softmodem.o
+# RTAI_OBJ += lte-softmodem.o
+# RTAI_OBJ += lte-enb.o
+# RTAI_OBJ += lte-softmodem-enb.o
+# RTAI_OBJ += lte-softmodem-ue.o
 endif
 else
-#OBJ += sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o lte-softmodem.o rt_wrapper.o
 OBJ += sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o
 ifeq ($(USRP),1)
 OBJ += lte-softmodem-usrp.o
 else
-OBJ += lte-softmodem.o
+# OBJ += lte-softmodem.o
+# OBJ += lte-enb.o
+# OBJ += lte-softmodem-enb.o
+# OBJ += lte-softmodem-ue.o
 endif
 CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
 endif
@@ -76,6 +82,7 @@ include $(OPENAIR2_DIR)/LAYER2/Makefile.inc
 include $(OPENAIR2_DIR)/UTIL/Makefile.inc
 include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc
 include $(OPENAIR2_DIR)/ENB_APP/Makefile.inc
+include $(OPENAIR3_DIR)/RAL-LTE/Makefile.inc
 
 OBJ +=  $(ENB_APP_OBJS)
 
@@ -176,15 +183,21 @@ SHARED_DEPENDENCIES 	+= $(LFDS_LIB)
 -include $(OBJ:.o=.d)
 -include $(ASN1_MSG_OBJS1:.o=.d)
 -include $(RTAI_OBJ:.o=.d)
+-include lte-softmodem.d
+-include lte-enb.d
 
 $(LFDS_LIB):
 	@if [ ! -d $(LFDS_OBJ_DIR)/bin ]; then mkdir -p $(LFDS_OBJ_DIR)/bin; fi;
 	@if [ ! -d $(LFDS_OBJ_DIR)/obj ]; then mkdir -p $(LFDS_OBJ_DIR)/obj; fi;
 	$(MAKE) -C $(LFDS_DIR) -f makefile.linux OUTDIR=$(LFDS_OBJ_DIR)
 
+ifeq ($(RTAI),1)
+$(RTAI_OBJ) lte-enb.o lte-softmodem.o: %.o : %.c
+else
 $(RTAI_OBJ): %.o : %.c
+endif
 	@echo Compiling $< ...
-	@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) -o $@ $<
+	$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) -o $@ $<
 	@$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $< > $*.d
 	@mv -f $*.d $*.d.tmp
 	@sed -e 's|.*:|$*.o:|' < $*.d.tmp > $*.d
@@ -196,7 +209,11 @@ ifdef ENABLE_ITTI
 $(OBJ) $(RTAI_OBJ): $(ITTI_MESSAGES_H)
 endif
 
+ifeq ($(RTAI),1)
 $(OBJ) $(ASN1_MSG_OBJS1): %.o : %.c
+else
+$(OBJ) $(ASN1_MSG_OBJS1) lte-enb.o lte-softmodem.o: %.o : %.c
+endif
 	@echo Compiling $< ...
 	@$(CC) -c $(CFLAGS) $(EXTRA_CFLAGS) -o $@ $<
 	@$(CC) -MM $(CFLAGS) $(EXTRA_CFLAGS) $< > $*.d
@@ -216,9 +233,13 @@ condtest: condtest.c
 synctest: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ)
 	$(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) -o synctest
 
-lte-softmodem: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(SHARED_DEPENDENCIES)
+lte-softmodem: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-softmodem.o $(SHARED_DEPENDENCIES)
+	@echo Linking $@
+	@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-softmodem.o -o lte-softmodem $(LDFLAGS) $(LIBS)
+
+lte-enb: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-enb.o $(SHARED_DEPENDENCIES)
 	@echo Linking $@
-	@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) -o lte-softmodem $(LDFLAGS) $(LIBS)
+	@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-enb.o -o lte-enb $(LDFLAGS) $(LIBS)
 
 lte-softmodem-usrp: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(USRP_OBJ) $(SHARED_DEPENDENCIES)
 	@echo Linking $@
diff --git a/targets/RTAI/USER/lte-enb.c b/targets/RTAI/USER/lte-enb.c
index f05eddd624..4879c27fef 100644
--- a/targets/RTAI/USER/lte-enb.c
+++ b/targets/RTAI/USER/lte-enb.c
@@ -87,11 +87,19 @@
 #include "UTIL/MATH/oml.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
+#if defined(ENABLE_ITTI)
+# include "intertask_interface_init.h"
+# include "create_tasks.h"
+# if defined(ENABLE_USE_MME)
+#   include "s1ap_eNB.h"
+# endif
+#endif
+
 #ifdef XFORMS
 #include "PHY/TOOLS/lte_phy_scope.h"
 #include "stats.h"
 // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
-// at eNB 0, an UL scope for every UE 
+// at eNB 0, an UL scope for every UE
 FD_lte_phy_scope_ue  *form_ue[NUMBER_OF_UE_MAX];
 FD_lte_phy_scope_enb *form_enb[NUMBER_OF_UE_MAX];
 FD_stats_form *form_stats=NULL;
@@ -136,7 +144,10 @@ exmimo_config_t *p_exmimo_config;
 exmimo_id_t     *p_exmimo_id;
 volatile unsigned int *DAQ_MBOX;
 
-int oai_exit = 0;
+#if defined(ENABLE_ITTI)
+volatile int start_eNB = 0;
+#endif
+volatile int oai_exit = 0;
 int oai_flag = 0;
 
 //int time_offset[4] = {-138,-138,-138,-138};
@@ -178,7 +189,8 @@ void cleanup_ulsch_threads(void);
 
 LTE_DL_FRAME_PARMS *frame_parms;
 
-void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
+void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB,
+                       LTE_DL_FRAME_PARMS *frame_parms, int carrier);
 
 void signal_handler(int sig)
 {
@@ -188,41 +200,45 @@ void signal_handler(int sig)
   if (sig==SIGSEGV) {
     // get void*'s for all entries on the stack
     size = backtrace(array, 10);
-    
+
     // print out all the frames to stderr
     fprintf(stderr, "Error: signal %d:\n", sig);
     backtrace_symbols_fd(array, size, 2);
     exit(-1);
-  }
-  else {
+  } else {
     oai_exit=1;
   }
 }
 
-void exit_fun(const char* s)
+void exit_fun(const char *s)
 {
-  void *array[10];
-  size_t size;
-
-  printf("Exiting: %s\n",s);
+  if (s != NULL) {
+    printf("Exiting: %s\n",s);
+  }
 
   oai_exit=1;
+
+#if defined(ENABLE_ITTI)
+  itti_send_terminate_message (TASK_UNKNOWN);
+#endif
+
   //rt_sleep_ns(FRAME_PERIOD);
 
   //exit (-1);
 }
 
 #ifdef XFORMS
-void *scope_thread(void *arg) {
+void *scope_thread(void *arg)
+{
   s16 prach_corr[1024], i;
   char stats_buffer[16384];
   //FILE *UE_stats, *eNB_stats;
   int len=0;
 
   /*
-    if (UE_flag==1) 
+    if (UE_flag==1)
     UE_stats  = fopen("UE_stats.txt", "w");
-    else 
+    else
     eNB_stats = fopen("eNB_stats.txt", "w");
   */
 
@@ -231,11 +247,11 @@ void *scope_thread(void *arg) {
     fl_set_object_label(form_stats->stats_text, stats_buffer);
     //rewind (eNB_stats);
     //fwrite (stats_buffer, 1, len, eNB_stats);
-    for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
-      phy_scope_eNB(form_enb[UE_id], 
-		    PHY_vars_eNB_g[eNB_id],
-		    UE_id);
-            
+    for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
+      phy_scope_eNB(form_enb[UE_id],
+                    PHY_vars_eNB_g[eNB_id],
+                    UE_id);
+
     }
     //printf("doing forms\n");
     sleep(1);
@@ -244,15 +260,17 @@ void *scope_thread(void *arg) {
   //fclose (UE_stats);
   //fclose (eNB_stats);
 
-  pthread_exit((void*)arg);
+  pthread_exit((void *)arg);
 }
 #endif
 
-void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, u16 next_slot, LTE_DL_FRAME_PARMS *frame_parms)
+void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, u16 next_slot,
+                 LTE_DL_FRAME_PARMS *frame_parms)
 {
   int aa, slot_offset, slot_offset_F;
 
-  slot_offset_F = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp == EXTENDED) ? 6 : 7);
+  slot_offset_F = (next_slot)*(frame_parms->ofdm_symbol_size)*((
+                    frame_parms->Ncp == EXTENDED) ? 6 : 7);
   slot_offset   = (next_slot)*(frame_parms->samples_per_tti>>1);
 
   for (aa = 0; aa < frame_parms->nb_antennas_tx; aa++) {
@@ -265,8 +283,7 @@ void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, u16 next_slot, LTE_DL_FRAME_
                    frame_parms->twiddle_fft,
                    frame_parms->rev,
                    CYCLIC_PREFIX);
-    }
-    else {
+    } else {
       normal_prefix_mod(&txdataF[aa][slot_offset_F],
                         &txdata[aa][slot_offset],
                         7,
@@ -277,6 +294,67 @@ void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, u16 next_slot, LTE_DL_FRAME_
 
 int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
 
+#if defined(ENABLE_ITTI)
+void *l2l1_task(void *arg)
+{
+  MessageDef *message_p = NULL;
+
+  itti_set_task_real_time(TASK_L2L1);
+  itti_mark_task_ready(TASK_L2L1);
+
+  if (UE_flag == 0) {
+    /* Wait for the initialize message */
+    do {
+      if (message_p != NULL) {
+        itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
+      }
+      itti_receive_msg (TASK_L2L1, &message_p);
+
+      switch (ITTI_MSG_ID(message_p)) {
+        case INITIALIZE_MESSAGE:
+          /* Start eNB thread */
+          start_eNB = 1;
+          break;
+
+        case TERMINATE_MESSAGE:
+          oai_exit=1;
+          itti_exit_task ();
+          break;
+
+        default:
+          LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p));
+          break;
+      }
+    } while (ITTI_MSG_ID(message_p) != INITIALIZE_MESSAGE);
+    itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
+  }
+
+  do {
+    // Wait for a message
+    itti_receive_msg (TASK_L2L1, &message_p);
+
+    switch (ITTI_MSG_ID(message_p)) {
+      case TERMINATE_MESSAGE:
+        oai_exit=1;
+        itti_exit_task ();
+        break;
+
+      case MESSAGE_TEST:
+        LOG_I(EMU, "Received %s\n", ITTI_MSG_NAME(message_p));
+        break;
+
+      default:
+        LOG_E(EMU, "Received unexpected message %s\n", ITTI_MSG_NAME(message_p));
+        break;
+    }
+
+    itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
+  } while(1);
+
+  return NULL;
+}
+#endif
+
 /* This is the main eNB thread. It gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */
 static void *eNB_thread(void *arg)
 {
@@ -299,9 +377,24 @@ static void *eNB_thread(void *arg)
   int tx_offset;
 
 
+#if defined(ENABLE_ITTI)
+  /* Wait for eNB application initialization to be complete (eNB registration to MME) */
+  {
+    char *indicator[] = {".  ", ".. ", "...", " ..", "  .", "   "};
+    int i = 0;
+
+    while ((!oai_exit) && (start_eNB == 0)) {
+      LOG_D(HW,"Waiting for eNB application to be ready %s\r", indicator[i]);
+      i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0]));
+      usleep(200000);
+    }
+    LOG_D(HW,"\n");
+  }
+#endif
+
 #ifdef RTAI
   task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF);
-  rt_receive(0, (unsigned long*)((void*)&sem));
+  rt_receive(0, (unsigned long *)((void *)&sem));
   LOG_D(HW,"Started eNB thread (id %p)\n",task);
 #endif
 
@@ -318,175 +411,201 @@ static void *eNB_thread(void *arg)
 
 
   // sync to HW subframe == 0
-  mbox_current = ((volatile unsigned int*)DAQ_MBOX)[0];
+  mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
   rt_sleep_ns((165-mbox_current)*DAQ_PERIOD);
 
   time_in = rt_get_time_ns();
 
-  while (!oai_exit)
-    {
-      //this is the mbox counter where we should be 
-      mbox_target = mbox_bounds[subframe];
-      //this is the mbox counter where we are
-      mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
-      //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD)
-      if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround
-	diff = 150-mbox_current+mbox_target;
-      else if ((mbox_current<15) && (mbox_target>=135))
-	diff = -150+mbox_target-mbox_current;
-      else
-	diff = mbox_target - mbox_current;
-    
-      if (diff < -15) {
-	LOG_D(HW,"Time %.3f: Frame %d, missed subframe, proceeding with next one (subframe %d, hw_subframe %d, mbox_currend %d, mbox_target %d,diff %d) processing time %.3f\n",
-	      (float)(rt_get_time_ns()-time_in)/1e6,
-	      frame, subframe, hw_subframe, mbox_current, mbox_target, diff, (float)(timing_info.time_now-timing_info.time_last)/1e6);
-    
-	subframe++;
-	if (frame>0)	  
-	  oai_exit=1;
-	if (subframe==10){
-	  subframe=0;
-	  frame++;
-	}
-	continue;
+  while (!oai_exit) {
+    //this is the mbox counter where we should be
+    mbox_target = mbox_bounds[subframe];
+    //this is the mbox counter where we are
+    mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
+    //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD)
+    if ((mbox_current>=135) && (mbox_target<15)) { //handle the frame wrap-arround
+      diff = 150-mbox_current+mbox_target;
+    } else if ((mbox_current<15) && (mbox_target>=135)) {
+      diff = -150+mbox_target-mbox_current;
+    } else {
+      diff = mbox_target - mbox_current;
+    }
+
+    if (diff < -15) {
+      LOG_D(HW,
+            "Time %.3f: Frame %d, missed subframe, proceeding with next one (subframe %d, hw_subframe %d, mbox_currend %d, mbox_target %d,diff %d) processing time %.3f\n",
+            (float)(rt_get_time_ns()-time_in)/1e6,
+            frame, subframe, hw_subframe, mbox_current, mbox_target, diff,
+            (float)(timing_info.time_now-timing_info.time_last)/1e6);
+
+      subframe++;
+      if (frame>0) {
+        oai_exit=1;
       }
-      if (diff > 15) {
-	LOG_D(HW,"Time %.3f: Frame %d, skipped subframe, waiting for hw to catch up (subframe %d, hw_subframe %d, mbox_current %d, mbox_target %d, diff %d), processing time %.3f\n",
-	      (float)(rt_get_time_ns()-time_in)/1e6,
-	      frame, subframe, hw_subframe, mbox_current, mbox_target, diff, (float)(timing_info.time_now-timing_info.time_last)/1e6);
-	//exit(-1);
+      if (subframe==10) {
+        subframe=0;
+        frame++;
       }
+      continue;
+    }
+    if (diff > 15) {
+      LOG_D(HW,
+            "Time %.3f: Frame %d, skipped subframe, waiting for hw to catch up (subframe %d, hw_subframe %d, mbox_current %d, mbox_target %d, diff %d), processing time %.3f\n",
+            (float)(rt_get_time_ns()-time_in)/1e6,
+            frame, subframe, hw_subframe, mbox_current, mbox_target, diff,
+            (float)(timing_info.time_now-timing_info.time_last)/1e6);
+      //exit(-1);
+    }
+
+    delay_cnt = 0;
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX,
+                                            *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff);
 
-      delay_cnt = 0;
-      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
+    while ((diff>0) && (!oai_exit)) {
+      time_diff = rt_get_time_ns() - time_in;
+      ret = rt_sleep_ns(diff*DAQ_PERIOD);
+      if (ret) {
+        LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
+      }
+
+      delay_cnt++;
+      if (delay_cnt == 10) {
+        oai_exit = 1;
+        LOG_D(HW,"eNB Frame %d: HW stopped ... \n",frame);
+      }
+      mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
+      if ((mbox_current>=135) && (mbox_target<15)) { //handle the frame wrap-arround
+        diff = 150-mbox_current+mbox_target;
+      } else if ((mbox_current<15) && (mbox_target>=135)) {
+        diff = -150+mbox_target-mbox_current;
+      } else {
+        diff = mbox_target - mbox_current;
+      }
+    }
+
+    hw_subframe = ((((volatile unsigned int *)DAQ_MBOX)[0]+135)%150)/15;
+    LOG_D(HW,
+          "Time: %.3f: Frame %d, subframe %d, hw_subframe %d (mbox %d) processing time %0.3f\n",
+          (float)(rt_get_time_ns()-time_in)/1e6,
+          frame,subframe,hw_subframe,((volatile unsigned int *)DAQ_MBOX)[0],
+          (float)(timing_info.time_now-timing_info.time_last)/1e6);
+
+    last_slot = (subframe<<1)+1;
+    if (last_slot <0) {
+      last_slot+=20;
+    }
+    next_slot = ((subframe<<1)+4)%LTE_SLOTS_PER_FRAME;
+
+    if ((skip_first == 0) || (frame>5))
+    {
+      skip_first = 0;
+      timing_info.time_last = rt_get_time_ns();
+
+      //msg("subframe %d, last_slot %d,next_slot %d\n", subframe,last_slot,next_slot);
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX,
+                                              *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
       vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff);
 
-      while ((diff>0) && (!oai_exit))
-	{
-	  time_diff = rt_get_time_ns() - time_in;
-	  ret = rt_sleep_ns(diff*DAQ_PERIOD);
-	  if (ret)
-	    LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
-
-	  delay_cnt++;
-	  if (delay_cnt == 10)
-	    {
-	      oai_exit = 1;
-	      LOG_D(HW,"eNB Frame %d: HW stopped ... \n",frame);
-	    }
-	  mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
-	  if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround
-	    diff = 150-mbox_current+mbox_target;
-	  else if ((mbox_current<15) && (mbox_target>=135))
-	    diff = -150+mbox_target-mbox_current;
-	  else
-	    diff = mbox_target - mbox_current;
-	}
-
-      hw_subframe = ((((volatile unsigned int *)DAQ_MBOX)[0]+135)%150)/15;
-      LOG_D(HW,"Time: %.3f: Frame %d, subframe %d, hw_subframe %d (mbox %d) processing time %0.3f\n",(float)(rt_get_time_ns()-time_in)/1e6,
-	    frame,subframe,hw_subframe,((volatile unsigned int *)DAQ_MBOX)[0], (float)(timing_info.time_now-timing_info.time_last)/1e6);
-
-      last_slot = (subframe<<1)+1;
-      if (last_slot <0)
-	last_slot+=20;
-      next_slot = ((subframe<<1)+4)%LTE_SLOTS_PER_FRAME;
-
-      if ((skip_first == 0) || (frame>5))
-	{
-          skip_first = 0;
-	  timing_info.time_last = rt_get_time_ns();
-
-	  //msg("subframe %d, last_slot %d,next_slot %d\n", subframe,last_slot,next_slot);
-	  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
-	  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff);
-
-	  phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[0], 0,0,NULL);
-	  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));      
+      phy_procedures_eNB_lte (last_slot, next_slot, PHY_vars_eNB_g[0], 0,0,NULL);
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX,
+                                              *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
 #ifndef IFFT_FPGA
-        
-	  if ((subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,next_slot>>1)==SF_DL)||
-	      ((subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,next_slot>>1)==SF_S)&&((next_slot&1)==0)))
-	    {
-	      //LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot);
-	      /*
-		do_OFDM_mod(PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0],
-		PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0],
-		next_slot,
-		&PHY_vars_eNB_g[0]->lte_frame_parms);
-
-		do_OFDM_mod(PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0],
-		PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0],
-		next_slot+1,
-		&PHY_vars_eNB_g[0]->lte_frame_parms);
-	      */
-
-	      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN,1);
-	      slot_offset_F = (next_slot)*(PHY_vars_eNB_g[0]->lte_frame_parms.ofdm_symbol_size)*7;
-	      slot_offset = (next_slot)*(PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti>>1);
-
-	      normal_prefix_mod(&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0][0][slot_offset_F],
-				dummy_tx_buffer,
-				7,
-				&(PHY_vars_eNB_g[0]->lte_frame_parms));
-	      for (i = 0; i < PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti/2;i++)
-		{
-		  tx_offset = slot_offset + time_offset[0] + i;
-		  ((short*)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[0] = ((short*)dummy_tx_buffer)[2*i]<<4;
-		  ((short*)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[1] = ((short*)dummy_tx_buffer)[2*i+1]<<4;
-		}
-
-	      slot_offset_F = (next_slot+1)*(PHY_vars_eNB_g[0]->lte_frame_parms.ofdm_symbol_size)*7;
-	      slot_offset = (next_slot+1)*(PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti>>1);
-
-	      normal_prefix_mod(&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0][0][slot_offset_F],
-				dummy_tx_buffer,
-				7,
-				&(PHY_vars_eNB_g[0]->lte_frame_parms));
-	      for (i = 0; i < PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti/2;i++)
-		{
-		  tx_offset = slot_offset + i;
-		  ((short*)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[0] = ((short*)dummy_tx_buffer)[2*i]<<4;
-		  ((short*)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[1] = ((short*)dummy_tx_buffer)[2*i+1]<<4;
-		}
-	    }
-	  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN,0);
-	  timing_info.time_now = rt_get_time_ns();
-#endif //IFFT_FPGA
-	  /*
-	    if (frame%100==0)
-	    LOG_D(HW,"hw_slot %d (after): DAQ_MBOX %d\n",hw_slot,DAQ_MBOX[0]);
-	  */
-	}
 
+      if ((subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,next_slot>>1)==SF_DL)||
+          ((subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,next_slot>>1)==SF_S)
+           &&((next_slot&1)==0))) {
+        //LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot);
+        /*
+        do_OFDM_mod(PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0],
+        PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0],
+        next_slot,
+        &PHY_vars_eNB_g[0]->lte_frame_parms);
+
+        do_OFDM_mod(PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0],
+        PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0],
+        next_slot+1,
+        &PHY_vars_eNB_g[0]->lte_frame_parms);
+        */
+
+        vcd_signal_dumper_dump_function_by_name(
+          VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN,1);
+        slot_offset_F = (next_slot)*
+                        (PHY_vars_eNB_g[0]->lte_frame_parms.ofdm_symbol_size)*7;
+        slot_offset = (next_slot)*
+                      (PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti>>1);
+
+        normal_prefix_mod(
+          &PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0][0][slot_offset_F],
+          dummy_tx_buffer,
+          7,
+          &(PHY_vars_eNB_g[0]->lte_frame_parms));
+        for (i = 0; i < PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti/2; i++) {
+          tx_offset = slot_offset + time_offset[0] + i;
+          ((short *)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[0]
+            = ((short *)dummy_tx_buffer)[2*i]<<4;
+          ((short *)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[1]
+            = ((short *)dummy_tx_buffer)[2*i+1]<<4;
+        }
+
+        slot_offset_F = (next_slot+1)*
+                        (PHY_vars_eNB_g[0]->lte_frame_parms.ofdm_symbol_size)*7;
+        slot_offset = (next_slot+1)*
+                      (PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti>>1);
+
+        normal_prefix_mod(
+          &PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0][0][slot_offset_F],
+          dummy_tx_buffer,
+          7,
+          &(PHY_vars_eNB_g[0]->lte_frame_parms));
+        for (i = 0; i < PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti/2; i++) {
+          tx_offset = slot_offset + i;
+          ((short *)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[0]
+            = ((short *)dummy_tx_buffer)[2*i]<<4;
+          ((short *)&PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0][tx_offset])[1]
+            = ((short *)dummy_tx_buffer)[2*i+1]<<4;
+        }
+      }
+      vcd_signal_dumper_dump_function_by_name(
+        VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN,0);
+      timing_info.time_now = rt_get_time_ns();
+#endif //IFFT_FPGA
       /*
-	if ((slot%2000)<10)
-	LOG_D(HW,"fun0: doing very hard work\n");
+        if (frame%100==0)
+        LOG_D(HW,"hw_slot %d (after): DAQ_MBOX %d\n",hw_slot,DAQ_MBOX[0]);
       */
+    }
 
+    /*
+    if ((slot%2000)<10)
+    LOG_D(HW,"fun0: doing very hard work\n");
+    */
 
-      if (oai_flag == 2) {
-	//dump_ulsch(PHY_vars_eNB_g[0], subframe, 0);
-	//exit(-1);
-	oai_exit=1;
-      }
 
-      if (oai_flag == 1)
-	oai_flag = 2;
+    if (oai_flag == 2) {
+      //dump_ulsch(PHY_vars_eNB_g[0], subframe, 0);
+      //exit(-1);
+      oai_exit=1;
+      exit_fun("[HW][eNB] HW stopped");
+    }
 
-      subframe++;
-      if (subframe==10) {
-	subframe=0;
-	frame++;
-      }
-      if(frame == 1024) {
-	frame = 0;
-	time_in = rt_get_time_ns();
-      }
-    
+    if (oai_flag == 1) {
+      oai_flag = 2;
     }
 
+    subframe++;
+    if (subframe==10) {
+      subframe=0;
+      frame++;
+    }
+    if(frame == 1024) {
+      frame = 0;
+      time_in = rt_get_time_ns();
+    }
+#if defined(ENABLE_ITTI)
+    itti_update_lte_time(frame, subframe * 2);
+#endif
+  }
+
   LOG_D(HW,"eNB_thread: finished, ran %d times.\n",frame);
 
 #ifdef HARD_RT
@@ -502,8 +621,8 @@ static void *eNB_thread(void *arg)
   return 0;
 }
 
-int main(int argc, char **argv) {
-
+int main(int argc, char **argv)
+{
 #ifdef RTAI
   RT_TASK *task;
 #endif
@@ -515,8 +634,10 @@ int main(int argc, char **argv) {
     u32 rf_mode_med[4]     = {39375,39375,39375,39375};
     u32 rf_mode_byp[4]     = {22991,22991,22991,22991};
   */
-  u32 my_rf_mode = RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX;
-  u32 rf_mode_base = TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON + /*LNAMax Antennas*/ LNAByp + RFBBNORM;
+  u32 my_rf_mode = RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM +
+                   RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX;
+  u32 rf_mode_base = TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN +
+                     RXLPF25 + LNA1ON + /*LNAMax Antennas*/ LNAByp + RFBBNORM;
   u32 rf_mode[4]     = {my_rf_mode,0,0,0};
   u32 rf_local[4]    = {8255000,8255000,8255000,8255000}; // UE zepto
   //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa
@@ -527,11 +648,11 @@ int main(int argc, char **argv) {
   u32 rf_rxdc[4]     = {32896,32896,32896,32896};
   // Gain for antennas connection
   //u32 rxgain[4]      = {25,20,20,20};
-  //u32 txgain[4]      = {30,25,25,25}; 
+  //u32 txgain[4]      = {30,25,25,25};
 
   // Gain for Cable connection
   u32 rxgain[4]      = {20,20,20,20};
-  u32 txgain[4]      = {25,25,25,25}; 
+  u32 txgain[4]      = {25,25,25,25};
 
 
   u8 frame_type = FDD;
@@ -552,53 +673,73 @@ int main(int argc, char **argv) {
   unsigned int fd;
 
   int amp;
-  unsigned int rxg_max[4]={133,133,133,133}, rxg_med[4]={127,127,127,127}, rxg_byp[4]={120,120,120,120};
+  unsigned int rxg_max[4]= {133,133,133,133}, rxg_med[4]= {127,127,127,127}, rxg_byp[4]= {120,120,120,120};
   int tx_max_power=0;
 
   int ret, ant;
 
   int error_code;
+  char *itti_dump_file = NULL;
 
   mode = normal_txrx;
 
   mme_ip = "146.208.175.6";
 
-  while ((c = getopt(argc, argv, "dC:T:N:R:Vi;")) != -1)
-    {
-      switch (c)
-	{
-	case 'd':
-	  do_forms=1;
-	  printf("Starting XFORMS ...\n");
-	  break;
-	case 'C':
-	  carrier_freq[0] = atoi(optarg);
-	  carrier_freq[1] = atoi(optarg);
-	  carrier_freq[2] = atoi(optarg);
-	  carrier_freq[3] = atoi(optarg);
-	  break;
-	case 'T':
-	  frame_type = TDD; // default FDD
-	  tdd_config = atoi(optarg);
-	  break;
-	case 'R':
-	  N_RB_DL = atoi(optarg);
-	  if ((N_RB_DL != 6) && (N_RB_DL != 15) && (N_RB_DL != 25) &&
-	      (N_RB_DL != 50) && (N_RB_DL != 75) && (N_RB_DL != 100)) {
-	    printf("Illegal N_RB_DL %d (should be one of 6,15,25,50,75,100)\n", N_RB_DL);
-	    exit(-1);
-	  }
-	  break;
-	case 'i':
-	  mme_ip = optarg;
-	  break;
-	case 'V':
-	  ouput_vcd = 1;
-	  break;      
-	default:
-	  break;
-	}
+  while ((c = getopt(argc, argv, "dC:K:O:T:N:R:Vi;")) != -1) {
+    switch (c) {
+      case 'd':
+        do_forms=1;
+        printf("Starting XFORMS ...\n");
+        break;
+      case 'C':
+        carrier_freq[0] = atoi(optarg);
+        carrier_freq[1] = atoi(optarg);
+        carrier_freq[2] = atoi(optarg);
+        carrier_freq[3] = atoi(optarg);
+        break;
+      case 'T':
+        frame_type = TDD; // default FDD
+        tdd_config = atoi(optarg);
+        break;
+      case 'K':
+#if defined(ENABLE_ITTI)
+        itti_dump_file = strdup(optarg);
+#else
+        printf("-K option is disabled when ENABLE_ITTI is not defined\n");
+#endif
+        break;
+      case 'O':
+#if defined(ENABLE_USE_MME)
+        EPC_MODE_ENABLED = 1;
+        if (optarg == NULL) { /* No IP address provided: use localhost */
+          memcpy(&EPC_MODE_MME_ADDRESS[0], "127.0.0.1", 10);
+        } else {
+          u8 ip_length = strlen(optarg) + 1;
+          memcpy(&EPC_MODE_MME_ADDRESS[0], optarg,
+                 ip_length > 16 ? 16 : ip_length);
+        }
+#else
+        printf("You enabled mme mode without s1ap compiled...\n");
+#endif
+        break;
+      case 'R':
+        N_RB_DL = atoi(optarg);
+        if ((N_RB_DL != 6) && (N_RB_DL != 15) && (N_RB_DL != 25) &&
+            (N_RB_DL != 50) && (N_RB_DL != 75) && (N_RB_DL != 100)) {
+          printf("Illegal N_RB_DL %d (should be one of 6,15,25,50,75,100)\n", N_RB_DL);
+          exit(-1);
+        }
+        break;
+      case 'i':
+        mme_ip = optarg;
+        break;
+      case 'V':
+        ouput_vcd = 1;
+        break;
+      default:
+        break;
     }
+  }
 
   set_taus_seed (0);
 
@@ -609,21 +750,37 @@ int main(int argc, char **argv) {
     vcd_signal_dumper_init("/tmp/openair_dump_eNB.vcd");
   }
 
+#if defined(ENABLE_ITTI)
+  log_set_instance_type (LOG_INSTANCE_ENB);
+
+  itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info,
+            messages_definition_xml, itti_dump_file);
+
+  if (create_tasks(1, 0)) {
+    exit(EXIT_FAILURE); // need a softer mode
+  }
+
+  printf("After create tasks\n");
+#endif
 
 #ifdef NAS_NETLINK
   netlink_init();
 #endif
 
+#if !defined(ENABLE_ITTI)
   // to make a graceful exit when ctrl-c is pressed
   signal(SIGSEGV, signal_handler);
   signal(SIGINT, signal_handler);
+#endif
 
 #ifndef RTAI
   check_clock();
 #endif
 
-  init_lte_vars(&frame_parms, frame_type, tdd_config, tdd_config_S, extended_prefix_flag, N_RB_DL, 
-		Nid_cell, cooperation_flag, transmission_mode, abstraction_flag, nb_antennas_rx,0);
+  init_lte_vars(&frame_parms, frame_type, tdd_config, tdd_config_S,
+                extended_prefix_flag, N_RB_DL,
+                Nid_cell, cooperation_flag, transmission_mode, abstraction_flag,
+                nb_antennas_rx,0);
 
   g_log->log_component[HW].level = LOG_INFO;
   g_log->log_component[HW].flag  = LOG_LOW;
@@ -635,19 +792,32 @@ int main(int argc, char **argv) {
   g_log->log_component[RLC].flag  = LOG_LOW;
   g_log->log_component[PDCP].level = LOG_INFO;
   g_log->log_component[PDCP].flag  = LOG_LOW;
-  g_log->log_component[S1AP].level = LOG_INFO;
-  g_log->log_component[S1AP].flag  = LOG_LOW;
   g_log->log_component[RRC].level = LOG_INFO;
   g_log->log_component[RRC].flag  = LOG_LOW;
   g_log->log_component[OIP].level = LOG_INFO;
   g_log->log_component[OIP].flag = LOG_HIGH;
+#if defined(ENABLE_ITTI)
+  g_log->log_component[EMU].level = LOG_INFO;
+  g_log->log_component[EMU].flag  = LOG_HIGH;
+# if defined(ENABLE_USE_MME)
+  g_log->log_component[S1AP].level  = LOG_INFO;
+  g_log->log_component[S1AP].flag   = LOG_HIGH;
+  g_log->log_component[SCTP].level  = LOG_INFO;
+  g_log->log_component[SCTP].flag   = LOG_HIGH;
+# endif
+  g_log->log_component[S1AP].level = LOG_INFO;
+  g_log->log_component[S1AP].flag  = LOG_LOW;
+#else
+#endif
+  g_log->log_component[ENB_APP].level = LOG_INFO;
+  g_log->log_component[ENB_APP].flag  = LOG_HIGH;
 
+  PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB *));
+  PHY_vars_eNB_g[0] = init_lte_eNB(frame_parms,eNB_id,Nid_cell,cooperation_flag,
+                                   transmission_mode,abstraction_flag);
 
-  PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB*));
-  PHY_vars_eNB_g[0] = init_lte_eNB(frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
-  
 #ifndef OPENAIR2
-  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
+  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
     PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
     PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
     PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
@@ -658,7 +828,7 @@ int main(int argc, char **argv) {
   }
 #endif
 
-  
+
   NB_eNB_INST=1;
   NB_INST=1;
 
@@ -670,77 +840,91 @@ int main(int argc, char **argv) {
 
 
   // set eNB to max gain
-  PHY_vars_eNB_g[0]->rx_total_gain_eNB_dB =  rxg_max[0] + rxgain[0] - 30; //was measured at rxgain=30;
+  PHY_vars_eNB_g[0]->rx_total_gain_eNB_dB =  rxg_max[0] + rxgain[0] -
+      30; //was measured at rxgain=30;
   for (i=0; i<4; i++) {
     //        frame_parms->rfmode[i] = rf_mode_max[i];
     rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAMax;
   }
 
-
   // Initialize card
   ret = openair0_open();
   if ( ret != 0 ) {
-    if (ret == -1)
-      printf("Error opening /dev/openair0");
-    if (ret == -2)
-      printf("Error mapping bigshm");
-    if (ret == -3)
-      printf("Error mapping RX or TX buffer");
+    if (ret == -1) {
+      printf("Error opening /dev/openair0\n");
+    }
+    if (ret == -2) {
+      printf("Error mapping bigshm\n");
+    }
+    if (ret == -3) {
+      printf("Error mapping RX or TX buffer\n");
+    }
     return(ret);
   }
 
-  printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[card]);
-  
+  printf ("Detected %d number of cards, %d number of antennas.\n",
+          openair0_num_detected_cards, openair0_num_antennas[card]);
+
   p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
   p_exmimo_id     = openair0_exmimo_pci[card].exmimo_id_ptr;
-  
-  printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
 
-  if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2)
-    p_exmimo_config->framing.eNB_flag   = 0; 
-  else 
-    p_exmimo_config->framing.eNB_flag   = 0;//!UE_flag;
+  printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card,
+         p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev,
+         p_exmimo_id->board_swrev);
+
+  if (p_exmimo_id->board_swrev>=BOARD_SWREV_CNTL2) {
+    p_exmimo_config->framing.eNB_flag   = 0;
+  } else {
+    p_exmimo_config->framing.eNB_flag   = 0;  //!UE_flag;
+  }
   p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
   p_exmimo_config->framing.resampling_factor = 2;
- 
-  for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++) 
+
+  for (ant=0; ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);
+       ant++) {
     p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
-  for (ant=0;ant<frame_parms->nb_antennas_tx;ant++)
+  }
+  for (ant=0; ant<frame_parms->nb_antennas_tx; ant++) {
     p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
-  for (ant=0;ant<frame_parms->nb_antennas_rx;ant++)
+  }
+  for (ant=0; ant<frame_parms->nb_antennas_rx; ant++) {
     p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
-  for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) {
+  }
+  for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx); ant<4;
+       ant++) {
     p_exmimo_config->rf.rf_mode[ant] = 0;
     carrier_freq[ant] = 0; //this turns off all other LIMEs
   }
 
   for (ant = 0; ant < 4; ant++) {
-    if (frame_type == FDD) 
+    if (frame_type == FDD) {
       carrier_freq[ant] = carrier_freq_fdd[ant];
-    else
+    } else {
       carrier_freq[ant] = carrier_freq_tdd[ant];
+    }
   }
-  for (ant = 0; ant<1; ant++) { 
+  for (ant = 0; ant<1; ant++) {
     p_exmimo_config->rf.do_autocal[ant] = 1;
-    if (frame_type == FDD)
-      p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant]-120e6; // LTE FDD band 1 duplex space
-    else
+    if (frame_type == FDD) {
+      p_exmimo_config->rf.rf_freq_rx[ant] =
+        carrier_freq[ant]-120e6;  // LTE FDD band 1 duplex space
+    } else {
       p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant];
+    }
 
     p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant];
     p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant];
     p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant];
-    
+
     p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
     p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];
 
     if ((carrier_freq[ant] >= 850000000) && (carrier_freq[ant] <= 865000000)) {
       p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal_850[ant];
-      p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD;	    
-    }
-    else {
+      p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD;
+    } else {
       p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
-      p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD;	    
+      p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD;
     }
 
     p_exmimo_config->rf.rffe_gain_txlow[ant] = 63;
@@ -751,14 +935,14 @@ int main(int argc, char **argv) {
 
 
   dump_frame_parms(frame_parms);
-  
+
   mac_xface = malloc(sizeof(MAC_xface));
-  
+
 #ifdef OPENAIR2
   int eMBMS_active=0;
   l2_init(frame_parms,eMBMS_active,
-	  0,// cba_group_active
-	  0); //HO active
+          0,// cba_group_active
+          0); //HO active
   mac_xface->mrbch_phy_sync_failure (0, 0, 0);
 #endif
 
@@ -766,36 +950,39 @@ int main(int argc, char **argv) {
 
 
   number_of_cards = openair0_num_detected_cards;
-  if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1
+  if (p_exmimo_id->board_exmimoversion==1) { //ExpressMIMO1
     openair_daq_vars.timing_advance = 138;
-  else //ExpressMIMO2
+  } else { //ExpressMIMO2
     openair_daq_vars.timing_advance = 15;
+  }
 
   setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,0);
 
   openair0_dump_config(card);
 
-  printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n",  
-	 p_exmimo_config->rf.rf_mode[0],
-	 p_exmimo_config->rf.rf_mode[1],
-	 p_exmimo_config->rf.rf_mode[2],
-	 p_exmimo_config->rf.rf_mode[3],
-	 (p_exmimo_config->rf.rf_mode[0]&3),  // RXen+TXen
-	 (p_exmimo_config->rf.rf_mode[0]&4)>>2,         //TXLPFen
-	 (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF
-	 (p_exmimo_config->rf.rf_mode[0]&128)>>7,      //RXLPFen
-	 (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF
-	 (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode
-	 (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode
-	 (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode
-	 (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode
-	 (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode
-	 p_exmimo_config->rf.rf_rxdc[0],
-	 p_exmimo_config->rf.rf_local[0],
-	 p_exmimo_config->rf.rf_vcocal[0]);
-  
-  for (ant=0;ant<4;ant++)
+  printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n",
+
+         p_exmimo_config->rf.rf_mode[0],
+         p_exmimo_config->rf.rf_mode[1],
+         p_exmimo_config->rf.rf_mode[2],
+         p_exmimo_config->rf.rf_mode[3],
+         (p_exmimo_config->rf.rf_mode[0]&3),  // RXen+TXen
+         (p_exmimo_config->rf.rf_mode[0]&4)>>2,         //TXLPFen
+         (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF
+         (p_exmimo_config->rf.rf_mode[0]&128)>>7,      //RXLPFen
+         (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF
+         (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode
+         (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode
+         (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode
+         (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode
+         (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode
+         p_exmimo_config->rf.rf_rxdc[0],
+         p_exmimo_config->rf.rf_local[0],
+         p_exmimo_config->rf.rf_vcocal[0]);
+
+  for (ant=0; ant<4; ant++) {
     p_exmimo_config->rf.do_autocal[ant] = 0;
+  }
 
 
   mlockall(MCL_CURRENT | MCL_FUTURE);
@@ -815,13 +1002,12 @@ int main(int argc, char **argv) {
   printf("Init mutex\n");
   //mutex = rt_get_adr(nam2num("MUTEX"));
   mutex = rt_sem_init(nam2num("MUTEX"), 0);
-  if (mutex==0)
-    {
-      printf("Error init mutex\n");
-      exit(-1);
-    }
-  else
+  if (mutex==0) {
+    printf("Error init mutex\n");
+    exit(-1);
+  } else {
     printf("mutex=%p\n",mutex);
+  }
 #endif
 
   DAQ_MBOX = (volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0];
@@ -835,20 +1021,20 @@ int main(int argc, char **argv) {
     printf("Running XFORMS\n");
     fl_initialize (&argc, argv, NULL, 0, 0);
     form_stats = create_form_stats_form();
-    for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
+    for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
       form_enb[UE_id] = create_lte_phy_scope_enb();
       sprintf (title, "UE%d LTE UL SCOPE eNB",UE_id+1);
-      fl_show_form (form_enb[UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
+      fl_show_form (form_enb[UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT,
+                    FL_FULLBORDER, title);
     }
     fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
-    for (UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
+    for (UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
       if (otg_enabled) {
-	fl_set_button(form_enb[UE_id]->button_0,1);
-	fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON");
-      }
-      else {
-	fl_set_button(form_enb[UE_id]->button_0,0);
-	fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF");
+        fl_set_button(form_enb[UE_id]->button_0,1);
+        fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON");
+      } else {
+        fl_set_button(form_enb[UE_id]->button_0,0);
+        fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF");
       }
     }
 
@@ -863,7 +1049,8 @@ int main(int argc, char **argv) {
   pthread_attr_init (&attr_dlsch_threads);
   pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE);
   //attr_dlsch_threads.priority = 1;
-  sched_param_dlsch.sched_priority = sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
+  sched_param_dlsch.sched_priority = sched_get_priority_max(
+                                       SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
   pthread_attr_setschedparam  (&attr_dlsch_threads, &sched_param_dlsch);
   pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
 #endif
@@ -876,17 +1063,17 @@ int main(int argc, char **argv) {
 #else
   error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL);
   if (error_code!= 0) {
-    LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code);
+    LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",
+          error_code);
     return(error_code);
-  }
-  else {
+  } else {
     LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n");
   }
 #endif
 
-#ifdef OPENAIR2
-  init_pdcp_thread(1);
-#endif
+// #ifdef OPENAIR2
+//   init_pdcp_thread(1);
+// #endif
 
 #ifdef ULSCH_THREAD
   init_ulsch_threads();
@@ -899,39 +1086,37 @@ int main(int argc, char **argv) {
   getchar();
   //while (oai_exit==0)
   //  rt_sleep_ns(FRAME_PERIOD);
-  
+
+#if defined(ENABLE_ITTI)
+  itti_wait_tasks_end();
+#else
   rt_sem_wait(mutex);
+#endif
 
   // stop threads
 #ifdef XFORMS
   printf("waiting for XFORMS thread\n");
-  if (do_forms==1)
-    {
-      pthread_join(thread2,&status);
-      fl_hide_form(form_stats->stats_form);
-      fl_free_form(form_stats->stats_form);
-      for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
-        fl_hide_form(form_enb[UE_id]->lte_phy_scope_enb);
-        fl_free_form(form_enb[UE_id]->lte_phy_scope_enb);
-      }
+  if (do_forms==1) {
+    pthread_join(thread2,&status);
+    fl_hide_form(form_stats->stats_form);
+    fl_free_form(form_stats->stats_form);
+    for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
+      fl_hide_form(form_enb[UE_id]->lte_phy_scope_enb);
+      fl_free_form(form_enb[UE_id]->lte_phy_scope_enb);
     }
+  }
 #endif
 
   printf("stopping MODEM threads\n");
   // cleanup
 #ifdef RTAI
-  rt_thread_join(thread0); 
+  rt_thread_join(thread0);
 #else
-  pthread_join(thread0,&status); 
+  pthread_join(thread0,&status);
 #endif
 #ifdef ULSCH_THREAD
   cleanup_ulsch_threads();
 #endif
-  
-
-#ifdef OPENAIR2
-  cleanup_pdcp_thread();
-#endif
 
 #ifdef RTAI
   rt_sem_delete(mutex);
@@ -946,21 +1131,25 @@ int main(int argc, char **argv) {
 
 
 
-  if (ouput_vcd)
+  if (ouput_vcd) {
     vcd_signal_dumper_close();
+  }
 
   logClean();
 
   return 0;
 }
 
-void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
+void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB,
+                       LTE_DL_FRAME_PARMS *frame_parms, int carrier)
+{
 
   int i,j;
   u16 N_TA_offset = 0;
 
-  if (frame_parms->frame_type == TDD)
+  if (frame_parms->frame_type == TDD) {
     N_TA_offset = 624/4;
+  }
 
   if (phy_vars_eNB) {
     if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) {
@@ -972,30 +1161,33 @@ void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_par
       printf("TX antennas > 1 and carrier > 0 not possible\n");
       exit(-1);
     }
-    
+
     // replace RX signal buffers with mmaped HW versions
-    for (i=0;i<frame_parms->nb_antennas_rx;i++) {
+    for (i=0; i<frame_parms->nb_antennas_rx; i++) {
       free(phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
-      phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = ((s32*) openair0_exmimo_pci[card].adc_head[i+carrier]) - N_TA_offset; // N_TA offset for TDD
-        
+      phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = ((s32 *)
+          openair0_exmimo_pci[card].adc_head[i+carrier]) -
+          N_TA_offset; // N_TA offset for TDD
+
       /*
         printf("rxdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
         for (j=0;j<16;j++) {
-	printf("rxbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j]);
-	phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j] = 16-j;
+      printf("rxbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j]);
+      phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j] = 16-j;
         }
       */
     }
-    for (i=0;i<frame_parms->nb_antennas_tx;i++) {
+    for (i=0; i<frame_parms->nb_antennas_tx; i++) {
       free(phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
-      phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = (s32*) openair0_exmimo_pci[card].dac_head[i+carrier];
-        
+      phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = (s32 *)
+          openair0_exmimo_pci[card].dac_head[i+carrier];
+
       /*
         printf("txdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
         for (j=0;j<16;j++) {
-	printf("txbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j]);
-	phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j] = 16-j;
-	}
+      printf("txbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j]);
+      phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j] = 16-j;
+      }
       */
     }
   }
diff --git a/targets/RTAI/USER/lte-softmodem.c b/targets/RTAI/USER/lte-softmodem.c
index 8226d3c298..4bdd1554f6 100644
--- a/targets/RTAI/USER/lte-softmodem.c
+++ b/targets/RTAI/USER/lte-softmodem.c
@@ -483,7 +483,7 @@ void *l2l1_task(void *arg)
       /* Wait for the initialize message */
       do {
         if (message_p != NULL) {
-          free (message_p);
+          itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
         }
         itti_receive_msg (TASK_L2L1, &message_p);
 
@@ -503,7 +503,7 @@ void *l2l1_task(void *arg)
             break;
         }
       } while (ITTI_MSG_ID(message_p) != INITIALIZE_MESSAGE);
-      free (message_p);
+      itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
     }
 
     do {
@@ -525,7 +525,7 @@ void *l2l1_task(void *arg)
           break;
       }
 
-      free (message_p);
+      itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
     } while(1);
 
     return NULL;
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index e7bdc991e6..30c0398bd6 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -470,7 +470,7 @@ void *l2l1_task(void *args_p) {
     /* Wait for the initialize message */
     do {
       if (message_p != NULL) {
-        free (message_p);
+        itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
       }
       itti_receive_msg (TASK_L2L1, &message_p);
 
@@ -487,7 +487,7 @@ void *l2l1_task(void *args_p) {
           break;
       }
     } while (ITTI_MSG_ID(message_p) != INITIALIZE_MESSAGE);
-    free (message_p);
+    itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
   }
 #endif
 
@@ -513,7 +513,7 @@ void *l2l1_task(void *args_p) {
             break;
         }
 
-        free (message_p);
+        itti_free (ITTI_MSG_ORIGIN_ID(message_p), message_p);
       }
     } while(message_p != NULL);
 #endif
-- 
GitLab