diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 43ce9315f67699808c05f0bbc1bbf8a068d7ea9b..bb70757e3e3a38bfd6758563495f1d602c729caa 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -2082,7 +2082,6 @@ add_executable(lte-softmodem
   ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
   ${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
   ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
-  ${OPENAIR_TARGETS}/COMMON/create_tasks.c
   ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c
@@ -2123,7 +2122,6 @@ add_executable(lte-softmodem-nos1
   ${OPENAIR_TARGETS}/RT/USER/lte-softmodem.c
   ${OPENAIR2_DIR}/ENB_APP/NB_IoT_interface.c
   ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
-  ${OPENAIR_TARGETS}/COMMON/create_tasks.c
   ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
   ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
   ${OPENAIR2_DIR}/RRC/NAS/rb_config.c
@@ -2163,7 +2161,6 @@ add_executable(lte-uesoftmodem
   ${OPENAIR_TARGETS}/RT/USER/lte-ru.c
   ${OPENAIR_TARGETS}/RT/USER/rfsim.c
   ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
-  ${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
   ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/multicast_link.c
diff --git a/openair2/ENB_APP/enb_app.c b/openair2/ENB_APP/enb_app.c
index 9e61e971c1a55e51cedaf4f44690685427dd5a69..45f7df8cfaa20c762a0ecb1951e3dc59c9decea6 100644
--- a/openair2/ENB_APP/enb_app.c
+++ b/openair2/ENB_APP/enb_app.c
@@ -41,9 +41,12 @@
 # include "intertask_interface.h"
 # include "timer.h"
 # if defined(ENABLE_USE_MME)
+#   define ENB_REGISTER_RETRY_DELAY 10
 #   include "s1ap_eNB.h"
 #   include "sctp_eNB_task.h"
 #   include "gtpv1u_eNB_task.h"
+#   include "nas_ue_task.h"
+#   include "udp_eNB_task.h"
 # endif
 
 #if defined(FLEXRAN_AGENT_SB_IF)
@@ -54,61 +57,66 @@
 extern unsigned char NB_eNB_INST;
 #endif
 
+extern int emulate_rf;
 extern RAN_CONTEXT_t RC;
+extern void *l2l1_task(void *arg);
 
 #if defined(ENABLE_ITTI)
 
-#include "LAYER2/PROTO_AGENT/proto_agent.h"
-//#include "../PROTO_AGENT/proto_agent.h"
-
-
 /*------------------------------------------------------------------------------*/
-# if defined(ENABLE_USE_MME)
-#   define ENB_REGISTER_RETRY_DELAY 10
-# endif
-
-/*------------------------------------------------------------------------------*/
-
-/*
-static void configure_phy(module_id_t enb_id, const Enb_properties_array_t* enb_properties)
+static void create_remaining_tasks(module_id_t enb_id)
 {
-  MessageDef *msg_p;
-  int CC_id;
-
-  msg_p = itti_alloc_new_message (TASK_ENB_APP, PHY_CONFIGURATION_REQ);
-
-  for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-    PHY_CONFIGURATION_REQ (msg_p).frame_type[CC_id]              = enb_properties->properties[enb_id]->frame_type[CC_id];
-    PHY_CONFIGURATION_REQ (msg_p).prefix_type[CC_id]             = enb_properties->properties[enb_id]->prefix_type[CC_id];
-    PHY_CONFIGURATION_REQ (msg_p).downlink_frequency[CC_id]      = enb_properties->properties[enb_id]->downlink_frequency[CC_id];
-    PHY_CONFIGURATION_REQ (msg_p).uplink_frequency_offset[CC_id] = enb_properties->properties[enb_id]->uplink_frequency_offset[CC_id];
-    PHY_CONFIGURATION_REQ (msg_p).nb_antennas_tx[CC_id]          = enb_properties->properties[enb_id]->nb_antennas_tx[CC_id];
-    PHY_CONFIGURATION_REQ (msg_p).nb_antennas_rx[CC_id]          = enb_properties->properties[enb_id]->nb_antennas_rx[CC_id];
-    PHY_CONFIGURATION_REQ (msg_p).tx_gain[CC_id]                 = enb_properties->properties[enb_id]->tx_gain[CC_id];
-    PHY_CONFIGURATION_REQ (msg_p).rx_gain[CC_id]                 = enb_properties->properties[enb_id]->rx_gain[CC_id];
+  ngran_node_t type = RC.rrc[enb_id]->node_type;
+  int rc;
+  itti_wait_ready(1);
+  switch (type) {
+  case ngran_eNB:
+  case ngran_ng_eNB:
+  case ngran_gNB:
+  case ngran_eNB_CU:
+  case ngran_ng_eNB_CU:
+  case ngran_gNB_CU:
+    rc = itti_create_task(TASK_SCTP, sctp_eNB_task, NULL);
+    AssertFatal(rc >= 0, "Create task for SCTP failed\n");
+    rc = itti_create_task(TASK_S1AP, s1ap_eNB_task, NULL);
+    AssertFatal(rc >= 0, "Create task for S1AP failed\n");
+    if (!emulate_rf){
+      rc = itti_create_task(TASK_UDP, udp_eNB_task, NULL);
+      AssertFatal(rc >= 0, "Create task for UDP failed\n");
+    }
+    rc = itti_create_task(TASK_GTPV1_U, &gtpv1u_eNB_task, NULL);
+    AssertFatal(rc >= 0, "Create task for GTPV1U failed\n");
+    break;
+  default:
+    /* intentionally left blank */
+    break;
   }
-
-  itti_send_msg_to_task (TASK_PHY_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
+  switch (type) {
+  case ngran_eNB:
+  case ngran_ng_eNB:
+  case ngran_gNB:
+  case ngran_eNB_DU:
+  case ngran_gNB_DU:
+    rc = itti_create_task (TASK_L2L1, l2l1_task, NULL);
+    AssertFatal(rc >= 0, "Create task for L2L1 failed\n");
+    break;
+  default:
+    /* intentioally left blank */
+    break;
+  }
+  itti_wait_ready(0);
 }
-*/
 
 /*------------------------------------------------------------------------------*/
-static void configure_rrc(uint32_t enb_id)
+static void configure_rrc(uint32_t enb_id, MessageDef **msg_p)
 {
-  MessageDef *msg_p = NULL;
-  //  int CC_id;
-
-  msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ);
-
-  if (RC.rrc[enb_id]) {
-    RCconfig_RRC(msg_p,enb_id, RC.rrc[enb_id]);
-    
-
-    LOG_I(ENB_APP,"Sending configuration message to RRC task\n");
-    itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), msg_p);
-
-  }
-  else AssertFatal(0,"RRC context for eNB %d not allocated\n",enb_id);
+  RC.rrc[enb_id] = malloc(sizeof(eNB_RRC_INST));
+  AssertFatal(RC.rrc[enb_id], "RRC context for eNB %d not allocated\n", enb_id);
+  LOG_I(ENB_APP, "%s() Creating RRC instance RC.rrc[%d]: %p\n",
+      __FUNCTION__, enb_id, RC.rrc[enb_id]);
+  memset((void *)RC.rrc[enb_id],0,sizeof(eNB_RRC_INST));
+  *msg_p = itti_alloc_new_message (TASK_ENB_APP, RRC_CONFIGURATION_REQ);
+  RCconfig_RRC(*msg_p, enb_id, RC.rrc[enb_id]);
 }
 
 /*------------------------------------------------------------------------------*/
@@ -174,47 +182,48 @@ void *eNB_app_task(void *args_p)
   MessageDef                     *msg_p           = NULL;
   instance_t                      instance;
   int                             result;
+  MessageDef                     *rrc_msg_p[enb_nb];
   /* for no gcc warnings */
   (void)instance;
   int mac_has_f1[MAX_MAC_INST];
-
   memset(mac_has_f1,0,MAX_MAC_INST*sizeof(int));
 
   itti_mark_task_ready (TASK_ENB_APP);
-
-  LOG_I(PHY, "%s() Task ready initialise structures\n", __FUNCTION__);
+  LOG_I(PHY, "%s() Task ready, initialise L1/MAC/RRC structures\n", __FUNCTION__);
 
   RCconfig_L1();
 
   RCconfig_macrlc(mac_has_f1);
 
-  LOG_I(PHY, "%s() RC.nb_L1_inst:%d\n", __FUNCTION__, RC.nb_macrlc_inst);
-
   LOG_I(PHY, "%s() RC.nb_L1_inst:%d\n", __FUNCTION__, RC.nb_L1_inst);
 
-  if (RC.nb_L1_inst>0) AssertFatal(l1_north_init_eNB()==0,"could not initialize L1 north interface\n");
-
+  LOG_I(PHY, "%s() RC.nb_macrlc_inst:%d\n", __FUNCTION__, RC.nb_macrlc_inst);
 
-  AssertFatal (enb_nb <= RC.nb_inst,
-               "Number of eNB is greater than eNB defined in configuration file (%d/%d)!",
-               enb_nb, RC.nb_inst);
+  if (RC.nb_L1_inst>0)
+    AssertFatal(l1_north_init_eNB()==0,"could not initialize L1 north interface\n");
+  if (RC.nb_macrlc_inst>0)
+    AssertFatal(RC.nb_macrlc_inst == enb_id_end-enb_id_start,
+      "Number of MACRLC instances %d != number of RRC instances %d\n",
+      RC.nb_macrlc_inst, enb_id_end-enb_id_start);
 
   LOG_I(ENB_APP,"Allocating eNB_RRC_INST for %d instances\n",RC.nb_inst);
-
   RC.rrc = (eNB_RRC_INST **)malloc(RC.nb_inst*sizeof(eNB_RRC_INST *));
   LOG_I(ENB_APP, "%s() RC.nb_inst:%d RC.rrc:%p\n", __FUNCTION__, RC.nb_inst, RC.rrc);
 
-  if (RC.nb_macrlc_inst>0) AssertFatal(RC.nb_macrlc_inst == enb_id_end-enb_id_start,
-				       "Number of MACRLC instances %d != number of RRC instances %d\n",
-				       RC.nb_macrlc_inst,enb_id_end-enb_id_start);
   for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
-    RC.rrc[enb_id] = (eNB_RRC_INST*)malloc(sizeof(eNB_RRC_INST));
-    LOG_I(ENB_APP, "%s() Creating RRC instance RC.rrc[%d]:%p (%d of %d)\n", __FUNCTION__, enb_id, RC.rrc[enb_id], enb_id+1, enb_id_end);
-    memset((void *)RC.rrc[enb_id],0,sizeof(eNB_RRC_INST));
-    configure_rrc(enb_id);
-    
-    if (RC.nb_macrlc_inst >0 && mac_has_f1[enb_id]==1) RC.rrc[enb_id]->node_type = ngran_eNB_DU;
-    else                                               pdcp_layer_init();
+    configure_rrc(enb_id, &rrc_msg_p[enb_id]);
+
+    if (RC.nb_macrlc_inst > 0 && mac_has_f1[enb_id]==1)
+      RC.rrc[enb_id]->node_type = ngran_eNB_DU;
+    else
+      pdcp_layer_init();
+  }
+
+  create_remaining_tasks(0);
+
+  for (enb_id = enb_id_start; (enb_id < enb_id_end) ; enb_id++) {
+    LOG_I(ENB_APP,"Sending configuration message to RRC task\n");
+    itti_send_msg_to_task (TASK_RRC_ENB, ENB_MODULE_ID_TO_INSTANCE(enb_id), rrc_msg_p[enb_id]);
   }
 
 # if defined(ENABLE_USE_MME)
diff --git a/targets/COMMON/create_tasks.c b/targets/COMMON/create_tasks.c
deleted file mode 100644
index 391e448deb590584e9a4b917edd4a6210b1fa1a5..0000000000000000000000000000000000000000
--- a/targets/COMMON/create_tasks.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-#if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-# include "create_tasks.h"
-# include "log.h"
-
-# ifdef OPENAIR2
-#   if defined(ENABLE_USE_MME)
-#     include "sctp_eNB_task.h"
-#     include "s1ap_eNB.h"
-#     include "nas_ue_task.h"
-#     include "udp_eNB_task.h"
-#     include "gtpv1u_eNB_task.h"
-#   endif
-#   if ENABLE_RAL
-#     include "lteRALue.h"
-#     include "lteRALenb.h"
-#   endif
-#   include "RRC/LTE/rrc_defs.h"
-# endif
-# include "enb_app.h"
-
-extern int emulate_rf;
-
-int create_tasks(uint32_t enb_nb)
-{
-  LOG_D(ENB_APP, "%s(enb_nb:%d\n", __FUNCTION__, enb_nb);
-
-  itti_wait_ready(1);
-  if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) {
-    LOG_E(PDCP, "Create task for L2L1 failed\n");
-    return -1;
-  }
-
-  if (enb_nb > 0) {
-    /* Last task to create, others task must be ready before its start */
-    if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) {
-      LOG_E(ENB_APP, "Create task for eNB APP failed\n");
-      return -1;
-    }
-  }
-
-#   if defined(ENABLE_USE_MME)
-      if (enb_nb > 0) {
-        if (itti_create_task (TASK_SCTP, sctp_eNB_task, NULL) < 0) {
-          LOG_E(SCTP, "Create task for SCTP failed\n");
-          return -1;
-        }
-
-        if (itti_create_task (TASK_S1AP, s1ap_eNB_task, NULL) < 0) {
-          LOG_E(S1AP, "Create task for S1AP failed\n");
-          return -1;
-        }
-        if(!emulate_rf){
-          if (itti_create_task (TASK_UDP, udp_eNB_task, NULL) < 0) {
-            LOG_E(UDP_, "Create task for UDP failed\n");
-            return -1;
-          }
-        }
-
-        if (itti_create_task (TASK_GTPV1_U, &gtpv1u_eNB_task, NULL) < 0) {
-          LOG_E(GTPU, "Create task for GTPV1U failed\n");
-          return -1;
-        }
-      }
-
-#      endif
-
-    if (enb_nb > 0) {
-      LOG_I(RRC,"Creating RRC eNB Task\n");
-
-      if (itti_create_task (TASK_RRC_ENB, rrc_enb_task, NULL) < 0) {
-        LOG_E(RRC, "Create task for RRC eNB failed\n");
-        return -1;
-      }
-    }
-
-
-  itti_wait_ready(0);
-
-  return 0;
-}
-#endif
diff --git a/targets/COMMON/create_tasks.h b/targets/COMMON/create_tasks.h
deleted file mode 100644
index ff1d9ace5199fbc0dbf3bf8b9cc7a52f1db983c5..0000000000000000000000000000000000000000
--- a/targets/COMMON/create_tasks.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The OpenAirInterface Software Alliance licenses this file to You under
- * the OAI Public License, Version 1.1  (the "License"); you may not use this file
- * except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.openairinterface.org/?page_id=698
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *-------------------------------------------------------------------------------
- * For more information about the OpenAirInterface (OAI) Software Alliance:
- *      contact@openairinterface.org
- */
-
-#ifndef CREATE_TASKS_H_
-#define CREATE_TASKS_H_
-
-#if defined(ENABLE_ITTI)
-/* External declaration of L2L1 task that depend on the target */
-extern void *l2l1_task(void *arg);
-
-int create_tasks(uint32_t enb_nb);
-int create_tasks_ue(uint32_t ue_nb);
-#endif
-
-#endif /* CREATE_TASKS_H_ */
diff --git a/targets/COMMON/create_tasks_ue.c b/targets/COMMON/create_tasks_ue.c
index 7e7d545c9f49a00990a0562fb4bae4a8ee090086..6cf5ce78e848945c89c77e5c2b73d2e50260bf09 100644
--- a/targets/COMMON/create_tasks_ue.c
+++ b/targets/COMMON/create_tasks_ue.c
@@ -21,7 +21,6 @@
 
 #if defined(ENABLE_ITTI)
 # include "intertask_interface.h"
-# include "create_tasks.h"
 # include "log.h"
 
 # ifdef OPENAIR2
@@ -77,4 +76,4 @@ int create_tasks_ue(uint32_t ue_nb)
 
   return 0;
 }
-#endif
\ No newline at end of file
+#endif
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 3c4c2b71256b3bfba7d8709cffe3e6045d1603dc..d2022540c1ba217fe3e66c41126670323b33a403 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -84,7 +84,6 @@ unsigned short config_frames[4] = {2,9,11,13};
 
 #if defined(ENABLE_ITTI)
 #include "intertask_interface_init.h"
-#include "create_tasks.h"
 #endif
 
 #include "PHY/INIT/phy_init.h"
@@ -1064,13 +1063,16 @@ int main( int argc, char **argv )
   int have_rrc=0;
 
   if (RC.nb_inst > 0)  {
-    
-    // don't create if node doesn't connect to RRC/S1/F1/GTP
-    if (create_tasks(1) < 0) {
-      printf("cannot create ITTI tasks\n");
-      exit(-1); // need a softer mode
+    LOG_I(ENB_APP, "Creating ENB_APP eNB Task\n");
+    if (itti_create_task (TASK_ENB_APP, eNB_app_task, NULL) < 0) {
+      LOG_E(ENB_APP, "Create task for eNB APP failed\n");
+      return -1;
+    }
+    LOG_I(RRC,"Creating RRC eNB Task\n");
+    if (itti_create_task (TASK_RRC_ENB, rrc_enb_task, NULL) < 0) {
+      LOG_E(RRC, "Create task for RRC eNB failed\n");
+      return -1;
     }
-    printf("ITTI tasks created\n");
     have_rrc=1;
   }
   else {
diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h
index 2f8209f2d311ab5214952e670f4d6c4c19335b51..7f0288ea910a9fc3aaa770b3a3b904747f31061b 100644
--- a/targets/RT/USER/lte-softmodem.h
+++ b/targets/RT/USER/lte-softmodem.h
@@ -289,4 +289,6 @@ extern PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms,
                           uint8_t UE_id,
                           uint8_t abstraction_flag);
 
+extern void *eNB_app_task(void* args);
+
 #endif
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index a2a12f9dd9f301a43c0f6a9767db995bc5d2f8a6..e9456f9700779c5c28902db07865aad307e6f774 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -85,7 +85,6 @@
 
 #if defined(ENABLE_ITTI)
 #include "intertask_interface_init.h"
-#include "create_tasks.h"
 #endif
 
 #include "system.h"