diff --git a/common/utils/ocp_itti/intertask_interface.cpp b/common/utils/ocp_itti/intertask_interface.cpp
index 931eb40c0fc04a1798d51cc40ec207837e5688d0..00167f0f4dd0013825f37d3755ccb48bb9ff6206 100644
--- a/common/utils/ocp_itti/intertask_interface.cpp
+++ b/common/utils/ocp_itti/intertask_interface.cpp
@@ -29,8 +29,13 @@ typedef struct task_list_s {
   int nb_events=0;
   int epoll_fd=-1;
   int sem_fd=-1;
+  int created = 0;
+  volatile int ready = 0;
 } task_list_t;
 
+static volatile int init_done = 0;
+static volatile int all_created = 0;
+
 int timer_expired(int fd);
 task_list_t tasks[TASK_MAX];
 
@@ -273,7 +278,13 @@ extern "C" {
   }
 
   int itti_create_task(task_id_t task_id, void *(*start_routine)(void *), void *args_p) {
+    if (all_created) {
+      printf("ITTI: task %d cannot be created at this point\n", task_id);
+      abort();
+    }
     task_list_t *t=&tasks[task_id];
+    printf("ITTI: thread %d created\n", task_id);
+    t->created = 1;
     AssertFatal ( pthread_create (&t->thread, NULL, start_routine, args_p) ==0,
                   "Thread creation for task %d failed!\n", task_id);
     pthread_setname_np( t->thread, itti_get_task_name(task_id) );
@@ -385,12 +396,25 @@ extern "C" {
 
   void itti_update_lte_time(uint32_t frame, uint8_t slot) {}
   void itti_set_task_real_time(task_id_t task_id) {}
+
   void itti_mark_task_ready(task_id_t task_id) {
-    // Function meaning is clear, but legacy implementation is wrong
-    // keep it void is fine: today implementation accepts messages in the queue before task is ready
+    tasks[task_id].ready = 1;
+    while (init_done == 0) usleep(1000);
   }
+
   void itti_wait_ready(int wait_tasks) {
-    // Stupid function, kept for compatibility (the parameter is meaningless!!!)
+    int i;
+    if (wait_tasks) return;
+    all_created = 1;
+    for (i = 0; i < TASK_MAX; i++) {
+      if (!tasks[i].created) continue;
+      printf("ITTI: task %d created, wait for it to be ready\n", i);
+      while (!tasks[i].ready) usleep(1000);
+      printf("ITTI: task %d is ready\n", i);
+    }
+    init_done = 1;
+    printf("ITTI: all tasks should be created from now on\n");
   }
+
   int signal_mask(void) { return 0;}
 }