diff --git a/ci-scripts/main.py b/ci-scripts/main.py
index 63e455c6496b2fd5bb0a5566d9a0b997700871be..21d51105f85a68558f3259a080dc866a60fbd69f 100644
--- a/ci-scripts/main.py
+++ b/ci-scripts/main.py
@@ -674,7 +674,8 @@ class SSHConnection():
 			self.command('mkdir -p ' + self.EPCSourceCodePath + '/scripts', '\$', 5)
 			self.command('cd /opt/hss_sim0609', '\$', 5)
 			self.command('echo ' + self.EPCPassword + ' | sudo -S rm -f hss.log daemon.log', '\$', 5)
-			self.command('echo ' + self.EPCPassword + ' | sudo -S echo "Starting sudo session" && sudo daemon --unsafe --name=simulated_hss --chdir=/opt/hss_sim0609 ./starthss_real  ', '\$', 5)
+			# based on Robert's feedback, new method to run simulated HSS
+			self.command('sudo su -c "cd /opt/hss_sim0609 && screen -dm -S simulated_hss ./starthss_real"', '\$', 5)
 		else:
 			logging.error('This option should not occur!')
 		self.close()
diff --git a/ci-scripts/reportTestLocally.sh b/ci-scripts/reportTestLocally.sh
index c4236a4e0e68f53f77df5978c817dfaff8b5189b..b74fe93a1f6aa3dd9066050c39dd93ed4b5a8d7d 100755
--- a/ci-scripts/reportTestLocally.sh
+++ b/ci-scripts/reportTestLocally.sh
@@ -112,7 +112,7 @@ function analyzeIperfFiles {
                 echo "        <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
             fi
         else
-            EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+            EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "bits/sec" | sed -e "s#^.*Bytes *##" -e "s#sec.*#sec#"`
             if [[ $EFFECTIVE_BITRATE =~ .*Kbits/sec.* ]]
             then
                 EFFECTIVE_BITRATE=`echo $EFFECTIVE_BITRATE | sed -e "s# *Kbits/sec.*##"`
@@ -136,9 +136,9 @@ function analyzeIperfFiles {
             else
                 echo "        <td bgcolor = \"green\" >OK</td>" >> ./test_simulator_results.html
             fi
-            EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
-            JITTER=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*Mbits/sec *##" -e "s#ms.*#ms#"`
-            PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "Mbits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
+            EFFECTIVE_BITRATE=`tail -n3 $IPERF_CASE | egrep "bits/sec" | sed -e "s#^.*Bytes *##" -e "s#sec.*#sec#"`
+            JITTER=`tail -n3 $IPERF_CASE | egrep "bits/sec" | sed -e "s#^.*bits/sec *##" -e "s#ms.*#ms#"`
+            PACKETLOSS=`tail -n3 $IPERF_CASE | egrep "bits/sec" | sed -e "s#^.*(##" -e "s#).*##"`
         fi
         echo "        <td>" >> ./test_simulator_results.html
         echo "            <pre>" >> ./test_simulator_results.html
@@ -730,8 +730,8 @@ function report_test {
                 IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_iperf_dl*client*txt 2> /dev/null`
                 analyzeIperfFiles
 
-                #IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}MHz_${UES}users_${CN_CONFIG}_iperf_ul*client*txt 2> /dev/null`
-                #analyzeIperfFiles
+                IPERF_TESTS=`ls $ARCHIVES_LOC/${TMODE}_${BW}prb_${CN_CONFIG}_iperf_ul*client*txt 2> /dev/null`
+                analyzeIperfFiles
             done
           done
         done
diff --git a/ci-scripts/runTestOnVM.sh b/ci-scripts/runTestOnVM.sh
index c3010330f78cbe5606d52f5c7d1d56d2807aa8a6..5467016612f66ead1b7dd1a8c00a72b0ab760a79 100755
--- a/ci-scripts/runTestOnVM.sh
+++ b/ci-scripts/runTestOnVM.sh
@@ -342,6 +342,7 @@ function check_iperf {
         local FILE_COMPLETE=`egrep -c "Server Report" ${LOC_BASE_LOG}_client.txt`
         if [ $FILE_COMPLETE -eq 0 ]
         then
+            # This part will become obsolete once we have UL
             if [[ $LOC_IS_RF_SIM -eq 1 ]] && [[ $LOC_IS_NR -eq 1 ]]
             then
                 echo "no UL integration right now --> normal to have no server report"
@@ -350,11 +351,11 @@ function check_iperf {
                     local EFFECTIVE_BANDWIDTH=`tail -n1 ${LOC_BASE_LOG}_server.txt | sed -e "s#^.*MBytes *##" -e "s#^.*KBytes *##" -e "s#sec.*#sec#"`
                     if [[ $2 =~ .*K.* ]]
                     then
-                        local BW_SUFFIX="K"
+                        local BW_PREFIX="K"
                     else
-                        local BW_SUFFIX="M"
+                        local BW_PREFIX="M"
                     fi
-                    if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*${BW_SUFFIX}bits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*${BW_SUFFIX}bits.* ]]
+                    if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*${BW_PREFIX}bits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*${BW_PREFIX}bits.* ]]
                     then
                         echo "got requested DL bandwidth: $EFFECTIVE_BANDWIDTH"
                     else
@@ -370,10 +371,19 @@ function check_iperf {
                 echo "File Report not found"
             fi
         else
-            local EFFECTIVE_BANDWIDTH=`tail -n3 ${LOC_BASE_LOG}_client.txt | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+            if [ `egrep -c "Mbits/sec" ${LOC_BASE_LOG}_client.txt` -ne 0 ]
+            then
+                local EFFECTIVE_BANDWIDTH=`tail -n3 ${LOC_BASE_LOG}_client.txt | egrep "Mbits/sec" | sed -e "s#^.*MBytes *##" -e "s#sec.*#sec#"`
+                local BW_PREFIX="M"
+            fi
+            if [ `egrep -c "Kbits/sec" ${LOC_BASE_LOG}_client.txt` -ne 0 ]
+            then
+                local EFFECTIVE_BANDWIDTH=`tail -n3 ${LOC_BASE_LOG}_client.txt | egrep "Kbits/sec" | sed -e "s#^.*KBytes *##" -e "s#sec.*#sec#"`
+                local BW_PREFIX="K"
+            fi
             if [ $LOC_IS_DL -eq 1 ] && [ $LOC_IS_BASIC_SIM -eq 1 ]
             then
-                if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*Mbits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*Mbits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_TWO}.*Mbits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_THREE}.*Mbits.* ]]
+                if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*${BW_PREFIX}bits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*${BW_PREFIX}bits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_TWO}.*${BW_PREFIX}bits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_THREE}.*${BW_PREFIX}bits.* ]]
                 then
                     echo "got requested DL bandwidth: $EFFECTIVE_BANDWIDTH"
                 else
@@ -381,7 +391,7 @@ function check_iperf {
                     IPERF_STATUS=-1
                 fi
             else
-                if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*Mbits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*Mbits.* ]]
+                if [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW}.*${BW_PREFIX}bits.* ]] || [[ $EFFECTIVE_BANDWIDTH =~ .*${LOC_REQ_BW_MINUS_ONE}.*${BW_PREFIX}bits.* ]]
                 then
                     if [ $LOC_IS_DL -eq 1 ]
                     then
@@ -390,7 +400,7 @@ function check_iperf {
                         echo "got requested UL bandwidth: $EFFECTIVE_BANDWIDTH"
                     fi
                 else
-                    echo "not basic-sim got LESS than requested DL bandwidth: $EFFECTIVE_BANDWIDTH"
+                    echo "got LESS than requested DL bandwidth: $EFFECTIVE_BANDWIDTH"
                     IPERF_STATUS=-1
                 fi
             fi
@@ -2067,7 +2077,7 @@ function run_test_on_vm {
         fi
 
         echo "############################################################"
-        echo "${CN_CONFIG} : iperf DL -- UE is server and eNB is client"
+        echo "${CN_CONFIG} : iperf DL -- NR-UE is server and gNB is client"
         echo "############################################################"
         THROUGHPUT="30K"
         CURR_IPERF_LOG_BASE=tdd_${PRB}prb_${CN_CONFIG}_iperf_dl
@@ -2078,6 +2088,18 @@ function run_test_on_vm {
         scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
         check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE $THROUGHPUT
 
+        echo "############################################################"
+        echo "${CN_CONFIG} : iperf UL -- gNB is server and NR-UE is client"
+        echo "############################################################"
+        THROUGHPUT="30K"
+        CURR_IPERF_LOG_BASE=tdd_${PRB}prb_${CN_CONFIG}_iperf_ul
+        get_enb_noS1_ip_addr $GNB_VM_CMDS $GNB_VM_IP_ADDR
+        get_ue_ip_addr $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR 1
+        generic_iperf $GNB_VM_CMDS $GNB_VM_IP_ADDR $ENB_IP_ADDR $NR_UE_VM_CMDS $NR_UE_VM_IP_ADDR $UE_IP_ADDR $THROUGHPUT $CURR_IPERF_LOG_BASE 1 0
+        scp -o StrictHostKeyChecking=no ubuntu@$GNB_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_server.txt $ARCHIVES_LOC
+        scp -o StrictHostKeyChecking=no ubuntu@$NR_UE_VM_IP_ADDR:/home/ubuntu/${CURR_IPERF_LOG_BASE}_client.txt $ARCHIVES_LOC
+        check_iperf $ARCHIVES_LOC/$CURR_IPERF_LOG_BASE $THROUGHPUT
+
         echo "############################################################"
         echo "${CN_CONFIG} : Terminate gNB/NR-UE simulators"
         echo "############################################################"
diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt
index 116ed368325eadafd17a723fc41964923590b7ad..bb8b5b3b542bf055bc87db8b4ed91f6232b55d82 100644
--- a/cmake_targets/CMakeLists.txt
+++ b/cmake_targets/CMakeLists.txt
@@ -248,22 +248,18 @@ add_boolean_option(T_TRACER            True  "Activate the T tracer, a debugging
 add_boolean_option(UE_AUTOTEST_TRACE   False "Activate UE autotest specific logs")
 add_boolean_option(UE_DEBUG_TRACE      False "Activate UE debug trace")
 add_boolean_option(UE_TIMING_TRACE     False "Activate UE timing trace")
-add_boolean_option(USRP_REC_PLAY       False "Enable USRP record playback mode")
-add_boolean_option(BASIC_SIMULATOR     False "Has to be True when building the basic simulator, False otherwise")
 add_boolean_option(DEBUG_CONSOLE       False "makes debugging easier, disables stdout/stderr buffering")
 
-add_boolean_option(ENABLE_ITTI True "ITTI is internal messaging, should remain enabled for most targets")
 set (OCP_ITTI ${OPENAIR_DIR}/common/utils/ocp_itti)
-if (${ENABLE_ITTI})
-  add_library(ITTI
-    ${OCP_ITTI}/intertask_interface.cpp
-    ${OPENAIR_DIR}/common/utils/backtrace.c
-    ${OPENAIR_DIR}/common/utils/memory_pools.c
-    )
+add_library(ITTI
+  ${OCP_ITTI}/intertask_interface.cpp
+  ${OPENAIR_DIR}/common/utils/backtrace.c
+  ${OPENAIR_DIR}/common/utils/memory_pools.c
+  )
 add_dependencies(ITTI rrc_flag)
   set(ITTI_LIB ITTI)
   set(GTPU_need_ITTI ${OPENAIR3_DIR}/GTPV1-U/gtpv1u_eNB.c)
-endif (${ENABLE_ITTI})
+
 
 ##################################################
 # ASN.1 grammar C code generation & dependencies #
@@ -661,7 +657,6 @@ set (SHLIB_LOADER_SOURCES
 include_directories("${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/")
 set(HWLIB_USRP_SOURCE
   ${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
-  ${OPENAIR_TARGETS}/ARCH/USRP/USERSPACE/LIB/usrp_lib_config.c
   )
 add_library(oai_usrpdevif MODULE ${HWLIB_USRP_SOURCE} )
 target_link_libraries(oai_usrpdevif uhd)
@@ -1728,7 +1723,6 @@ set(NR_L2_SRC_UE
   ${NR_UE_RRC_DIR}/L2_interface_ue.c
   ${NR_UE_RRC_DIR}/main_ue.c
   ${NR_UE_RRC_DIR}/rrc_UE.c
-  ${LTE_RLC_SRC}
   )
 
 set (MAC_SRC
@@ -2385,6 +2379,9 @@ add_library(rfsimulator MODULE
 	)
 target_link_libraries(rfsimulator SIMU ${ATLAS_LIBRARIES})
 
+add_library(oai_iqplayer MODULE 
+	${OPENAIR_TARGETS}/ARCH/iqplayer/iqplayer_lib.c
+	)
 set(CMAKE_MODULE_PATH "${OPENAIR_DIR}/cmake_targets/tools/MODULES" "${CMAKE_MODULE_PATH}")
 
 #include T directory even if the T is off because T macros are in the code
@@ -2464,6 +2461,7 @@ add_executable(lte-softmodem
   ${OPENAIR_TARGETS}/COMMON/create_tasks.c
   ${OPENAIR_TARGETS}/COMMON/create_tasks_mbms.c
   ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
+  ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
   ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
   ${OPENAIR2_DIR}/RRC/NAS/rb_config.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
@@ -2478,7 +2476,7 @@ add_executable(lte-softmodem
   ${CONFIG_SOURCES}
   ${SHLIB_LOADER_SOURCES}
   )
-add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag)
+add_dependencies(lte-softmodem rrc_flag s1ap_flag x2_flag oai_iqplayer)
 
 target_link_libraries (lte-softmodem
   -Wl,--start-group
@@ -2533,6 +2531,7 @@ add_executable(lte-uesoftmodem
   ${OPENAIR_TARGETS}/RT/USER/rfsim.c
   ${OPENAIR_TARGETS}/COMMON/create_tasks_ue.c
   ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
+  ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
   ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
   ${OPENAIR2_DIR}/RRC/NAS/rb_config.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
@@ -2579,6 +2578,7 @@ add_executable(nr-softmodem
   ${OPENAIR_DIR}/executables/softmodem-common.c
   ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
   ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
+  ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
   ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
   ${OPENAIR2_DIR}/RRC/NAS/rb_config.c
   ${OPENAIR1_DIR}/SIMULATION/ETH_TRANSPORT/netlink_init.c
@@ -2596,7 +2596,7 @@ target_link_libraries (nr-softmodem
   -Wl,--start-group
   UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB SCHED_RU_LIB SCHED_NR_LIB PHY_NR PHY PHY_COMMON PHY_NR_COMMON PHY_RU LFDS GTPV1U SECU_CN SECU_OSA
   ${ITTI_LIB} ${FLPT_MSG_LIB} ${ASYNC_IF_LIB} ${FLEXRAN_AGENT_LIB} LFDS7 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} RRC_LIB NR_RRC_LIB 
-  S1AP_LIB S1AP_ENB L2 L2_LTE L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
+  S1AP_LIB S1AP_ENB L2 L2_NR MAC_NR_COMMON NFAPI_COMMON_LIB NFAPI_LIB NFAPI_VNF_LIB NFAPI_PNF_LIB NFAPI_USER_LIB
   X2AP_LIB X2AP_ENB F1AP_LIB F1AP M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB ${PROTO_AGENT_LIB} ${FSPT_MSG_LIB}
   -Wl,--end-group z dl)
 
@@ -2618,6 +2618,7 @@ add_executable(nr-uesoftmodem
   ${OPENAIR_DIR}/executables/softmodem-common.c
   ${OPENAIR1_DIR}/SIMULATION/TOOLS/taus.c
   ${OPENAIR_TARGETS}/ARCH/COMMON/common_lib.c
+  ${OPENAIR_TARGETS}/ARCH/COMMON/record_player.c
   ${OPENAIR2_DIR}/RRC/NAS/nas_config.c
   ${OPENAIR2_DIR}/LAYER2/NR_MAC_COMMON/nr_mac_common.c
   ${OPENAIR2_DIR}/RRC/NAS/rb_config.c
@@ -2906,7 +2907,7 @@ if (${T_TRACER})
         nr_ulschsim ldpctest polartest smallblocktest cu_test du_test
         #all "add_library" definitions
         ITTI RRC_LIB NR_RRC_LIB S1AP_LIB S1AP_ENB X2AP_LIB X2AP_ENB M2AP_LIB M2AP_ENB M3AP_LIB M3AP_ENB F1AP_LIB F1AP 
-        params_libconfig oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif
+        params_libconfig oai_exmimodevif oai_usrpdevif oai_bladerfdevif oai_lmssdrdevif oai_iqplayer
         oai_eth_transpro oai_mobipass tcp_bridge tcp_bridge_oai
         coding FLPT_MSG ASYNC_IF FLEXRAN_AGENT HASHTABLE MSC UTIL OMG_SUMO
         SECU_OSA SECU_CN SCHED_LIB SCHED_NR_LIB SCHED_RU_LIB SCHED_UE_LIB SCHED_NR_UE_LIB default_sched remote_sched RAL
diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index 89ce451432b6913cef5891cde2c6a7ddf71f5ec4..818b1fd79c70a486933ab1a1cacc7b0b3492be1e 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -296,8 +296,8 @@ check_install_usrp_uhd_driver(){
             x=$((x + 1))
         done
         $SUDO apt-get update
-        $SUDO apt-get -y --allow-unauthenticated install  python python-tk libboost-all-dev libusb-1.0-0-dev
-        $SUDO apt-get -y --allow-unauthenticated install libuhd-dev libuhd003 uhd-host
+        $SUDO apt-get -y install  python python-tk libboost-all-dev libusb-1.0-0-dev
+        $SUDO apt-get -y install libuhd-dev libuhd003 uhd-host
     elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
         $SUDO $INSTALLER -y install python boost libusb-devel libusbx-devel boost-devel python-mako python-docutils cmake
         $SUDO -H pip install requests
@@ -367,9 +367,9 @@ check_install_bladerf_driver(){
             $SUDO add-apt-repository -y ppa:bladerf/bladerf
             $SUDO apt-get update
         fi
-        $SUDO apt-get install -y --allow-unauthenticated  bladerf libbladerf-dev
-        $SUDO apt-get install -y --allow-unauthenticated bladerf-firmware-fx3
-        $SUDO apt-get install -y --allow-unauthenticated bladerf-fpga-hostedx40
+        $SUDO apt-get install -y  bladerf libbladerf-dev
+        $SUDO apt-get install -y bladerf-firmware-fx3
+        $SUDO apt-get install -y bladerf-fpga-hostedx40
    elif [[ "$OS_BASEDISTRO" == "fedora" ]]; then
         install_bladerf_driver_from_source
    else
diff --git a/common/utils/LOG/log.h b/common/utils/LOG/log.h
index 6baec7dfeb2188b1360a2cb9d854a1f061bb0520..8e74f4148ccd3d013a214f1881e40454061a265f 100644
--- a/common/utils/LOG/log.h
+++ b/common/utils/LOG/log.h
@@ -274,16 +274,6 @@ typedef struct {
 } log_t;
 
 
-#if defined(ENABLE_ITTI)
-typedef enum log_instance_type_e {
-  LOG_INSTANCE_UNKNOWN,
-  LOG_INSTANCE_ENB,
-  LOG_INSTANCE_UE,
-} log_instance_type_t;
-
-void log_set_instance_type (log_instance_type_t instance);
-#endif
-
 
 #ifdef LOG_MAIN
 log_t *g_log;
diff --git a/common/utils/LOG/vcd_signal_dumper.c b/common/utils/LOG/vcd_signal_dumper.c
index 9b41b570939dbcbd60be6104f66bedf85ba4dfa5..0043eb32380892cda7846c59f1b4f19a7eeff79f 100644
--- a/common/utils/LOG/vcd_signal_dumper.c
+++ b/common/utils/LOG/vcd_signal_dumper.c
@@ -634,9 +634,6 @@ inline static uint32_t vcd_get_write_index(void)
   return write_index;
 }
 
-#if defined(ENABLE_ITTI)
-int signal_mask(void);
-#endif
 
 void *vcd_dumper_thread_rt(void *args)
 {
@@ -645,9 +642,7 @@ void *vcd_dumper_thread_rt(void *args)
   struct sched_param sched_param;
   uint32_t data_ready_wait;
 
-# if defined(ENABLE_ITTI)
   return 0; //signal_mask(); //function defined at common/utils/ocp_itti/intertask_interface.cpp
-# endif
 
   sched_param.sched_priority = sched_get_priority_min(SCHED_FIFO) + 1;
   sched_setscheduler(0, SCHED_FIFO, &sched_param);
diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c
index 4be0b35d16a28c3fa9492e5a60a81401d0ff9e5e..539e72b2239e0268f7fb949ac8dd9c93bf15f975 100644
--- a/common/utils/T/local_tracer.c
+++ b/common/utils/T/local_tracer.c
@@ -358,23 +358,21 @@ static void forward(void *_forwarder, char *buf, int size) {
 
   f->tail = new;
 #if BASIC_SIMULATOR
-
   /* When runnng the basic simulator, the tracer may be too slow.
    * Let's not take too much memory in the tracee and
    * wait if there is too much data to send. 200MB is
    * arbitrary.
    */
-  while (f->memusage > 200 * 1024 * 1024) {
-    if (pthread_cond_signal(&f->cond)) abort();
-
-    if (pthread_mutex_unlock(&f->lock)) abort();
+    while (f->memusage > 200 * 1024 * 1024) {
+      if (pthread_cond_signal(&f->cond)) abort();
 
-    usleep(1000);
+      if (pthread_mutex_unlock(&f->lock)) abort();
 
-    if (pthread_mutex_lock(&f->lock)) abort();
-  }
+      usleep(1000);
 
-#endif /* BASIC_SIMULATOR */
+      if (pthread_mutex_lock(&f->lock)) abort();
+    }
+#endif
   f->memusage += size+4;
 
   /* warn every 100MB */
diff --git a/common/utils/telnetsrv/DOC/telnetarch.md b/common/utils/telnetsrv/DOC/telnetarch.md
index ebb2342c22304f7c9a08c44880a358e34a187dcd..683b14a1b820353dac10de4db87024b2cf248d4d 100644
--- a/common/utils/telnetsrv/DOC/telnetarch.md
+++ b/common/utils/telnetsrv/DOC/telnetarch.md
@@ -1,6 +1,15 @@
 # telnet server principles
 
-The oai telnet server is implemented in a shared library to be loaded by the [oai shared library loader](loader). The implementation includes a `telnetsrv_autoinit` function which is automatically called at load time, starts the telnet server and registers a first set of commands, which are delivered with the server (telnet, softmodem, loader).
+The oai telnet server is implemented in shared libraries to be loaded by the [oai shared library loader](loader). `libtelnetsrv.so ` contains the code common to all oai softmodem executables, where `libtelnetsrv_<app>.so` contains the code specific to the executable identified by `app`. 
+
+| `<app>` |    executable     |
+| :-----: | :---------------: |
+|   enb   |  `lte-softmodem`  |
+|   gnb   |  `nr-softmodem`   |
+|  4Gue   | `lte-uesoftmodem` |
+|  5Gue   | `nr-uesoftmodem`  |
+
+The implementation includes a `telnetsrv_autoinit` function which is automatically called at load time, starts the telnet server and registers a first set of commands, which are delivered with the server (telnet, softmodem, loader). it also uses the `get_softmodem_function` call to retrieve the running executable id and possibly loads the corresponding `libtelnetsrv_<app>.so`library.
 
 Currently the telnet server only supports one user connection. The same dedicated thread is used to wait for a user connection and process the input received from this connection.
 
@@ -12,10 +21,11 @@ The telnet server provides an API which can be used by any oai component to add
 
 telnet server source files are located in [common/utils/telnetsrv](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/telnetsrv)
 
-1. [telnetsrv.c](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/telnetsrv/telnetsrv.c) contains the telnet server implementation, including the implementation of the telnet CLI command.
+1. [telnetsrv.c](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/telnetsrv/telnetsrv.c) contains the telnet server implementation, including the implementation of the `telnet` CLI command. This implementation is compatible with all softmodem executables and is in charge of loading any additional `libtelnetsrv_<app> .so` containing code specific to the running executables.
 1.  [telnetsrv.h](https://gitlab.eurecom.fr/oai/openairinterface5g/tree/develop/common/utils/telnetsrv/telnetsrv.h) is the telnet server include file containing both private and public data type definitions. It also contains API prototypes for functions that are used to register a new command in the server.
-1.  `telnetsrv\_\<XXX\>.c`: implementation of \<XXX\> CLI command which are delivered with the telnet server.
-1.  `telnetsrv\_\<XXX\>.h`: include file for the implementation of XXX CLI command. Usually included only in the corresponding `.c`file
+1.  `telnetsrv_<XXX\>.c`: implementation of \<XXX\> CLI command which are delivered with the telnet server and are common to all softmodem executables. 
+1. `telnetsrv_<XXX\>.h`: include file for the implementation of XXX CLI command. Usually included only in the corresponding `.c`file
+1.  `telnetsrv_<app>_<XXX>.c`: implementation of \<XXX\> CLI command specific to the executable identified by \<app\>.These sources are used to create `libtelnetsrv_<app>.so` at build time.
 1.  [telnetsrv_CMakeLists.txt](https://gitlab.eurecom.fr/oai/openairinterface5g/blob/develop/common/utils/telnetsrv/telnetsrv_CMakeLists.txt): CMakelists file containing the cmake instructions to build the telnet server. this file is included in the [global oai CMakelists](https://gitlab.eurecom.fr/oai/openairinterface5g/blob/develop/cmake_targets/CMakeLists.txt).
 
 [oai telnet server home](telnetsrv.md)
diff --git a/common/utils/telnetsrv/DOC/telnetusage.md b/common/utils/telnetsrv/DOC/telnetusage.md
index ec49deec735a3b62ae88a19611abff79fcdf60e2..c4777ce0d8ca4e42fd7e1da3d861a829cf771237 100644
--- a/common/utils/telnetsrv/DOC/telnetusage.md
+++ b/common/utils/telnetsrv/DOC/telnetusage.md
@@ -8,7 +8,7 @@ By default the embedded telnet server, which is implemented in a shared library,
  ./build_oai  --build-lib telnetsrv
 ```
 
-This will create the `libtelnetsrv.so` file in the `targets/bin` and `cmake_targets/ran_build/build` sub directories of the oai repository.
+This will create the `libtelnetsrv.so` and `libtelnetsrv_<app> file in the `targets/bin` and `cmake_targets/ran_build/build` sub directories of the oai repository. <app> can be "enb", "gnb", "4GUE" or "5GUE", each library containing functions specific to a given executable.
 
 When starting the softmodem, you must specify the **_\-\-telnetsrv_** option to load and start the telnet server. The telnet server is loaded via the [oai shared library loader](loader).
 
diff --git a/common/utils/telnetsrv/telnetsrv.c b/common/utils/telnetsrv/telnetsrv.c
index 44ab07a49b495f3c0ce594ff912a1b8839c9d801..10163b22b5c0a8bb380b762b9608d596fbffbbe2 100644
--- a/common/utils/telnetsrv/telnetsrv.c
+++ b/common/utils/telnetsrv/telnetsrv.c
@@ -53,6 +53,7 @@
 #include <sys/resource.h>
 #include "common/utils/load_module_shlib.h"
 #include "common/config/config_userapi.h"
+#include "executables/softmodem-common.h"
 #include <readline/history.h>
 
 
@@ -546,6 +547,7 @@ void run_telnetsrv(void) {
   int readc, filled;
   int status;
   int optval = 1;
+  char prompt[sizeof(TELNET_PROMPT_PREFIX)+10];
   pthread_setname_np(pthread_self(), "telnet");
   set_sched(pthread_self(),0,telnetparams.priority);
   sock = socket(AF_INET, SOCK_STREAM, 0);
@@ -570,6 +572,7 @@ void run_telnetsrv(void) {
     fprintf(stderr,"[TELNETSRV] Error %s on listen call\n",strerror(errno));
 
   using_history();
+  int plen=sprintf(prompt,"%s_%s> ",TELNET_PROMPT_PREFIX,get_softmodem_function(NULL));
   printf("\nInitializing telnet server...\n");
 
   while( (telnetparams.new_socket = accept(sock, &cli_addr, &cli_len)) ) {
@@ -613,9 +616,9 @@ void run_telnetsrv(void) {
           HIST_ENTRY *hisentry = history_get(strtol(buf+1,NULL,0));
 
           if (hisentry) {
-            char msg[TELNET_MAX_MSGLENGTH + sizeof(TELNET_PROMPT) +10];
+            char msg[TELNET_MAX_MSGLENGTH + plen +10];
             sprintf(buf,"%s",hisentry->line);
-            sprintf(msg,"%s %s\n",TELNET_PROMPT, hisentry->line);
+            sprintf(msg,"%s %s\n",prompt, hisentry->line);
             send(telnetparams.new_socket, msg, strlen(msg), MSG_NOSIGNAL);
           }
         }
@@ -635,7 +638,7 @@ void run_telnetsrv(void) {
           add_history(buf);
         }
 
-        send(telnetparams.new_socket, TELNET_PROMPT, sizeof(TELNET_PROMPT), MSG_NOSIGNAL);
+        send(telnetparams.new_socket, prompt, strlen(prompt), MSG_NOSIGNAL);
       } else {
         printf ("[TELNETSRV] Closing telnet connection...\n");
         break;
@@ -653,7 +656,7 @@ void run_telnetsrv(void) {
 }
 
 /*------------------------------------------------------------------------------------------------*/
-/* set_telnetmodule loads the commands delivered with the telnet server
+/* load the commands delivered with the telnet server
  *
  *
  *
@@ -709,10 +712,17 @@ int add_sharedmodules(void) {
   return ret;
 }
 
+/* autoinit functions is called by the loader when the telnet shared library is
+   dynamically loaded
+*/
 int telnetsrv_autoinit(void) {
   memset(&telnetparams,0,sizeof(telnetparams));
   config_get( telnetoptions,sizeof(telnetoptions)/sizeof(paramdef_t),"telnetsrv");
-
+  /* possibly load a exec specific shared lib */
+  char *execfunc=get_softmodem_function(NULL);
+  char libname[64];
+  sprintf(libname,"telnetsrv_%s",execfunc);
+  load_module_shlib(libname,NULL,0,NULL);
   if(pthread_create(&telnetparams.telnet_pthread,NULL, (void *(*)(void *))run_telnetsrv, NULL) != 0) {
     fprintf(stderr,"[TELNETSRV] Error %s on pthread_create call\n",strerror(errno));
     return -1;
diff --git a/common/utils/telnetsrv/telnetsrv.h b/common/utils/telnetsrv/telnetsrv.h
index 89f6a8dda11bd3180790359ae666a9b638e2269f..debb9f02ec962c63e798273bb19c481eff38f5c7 100644
--- a/common/utils/telnetsrv/telnetsrv.h
+++ b/common/utils/telnetsrv/telnetsrv.h
@@ -35,7 +35,7 @@
 
 #define TELNET_PORT               9090
 #define TELNET_MAX_MSGLENGTH      2048
-#define TELNET_PROMPT             "softmodem> "
+#define TELNET_PROMPT_PREFIX      "softmodem"
 #define TELNET_MAXCMD             20
 #define TELNET_CMD_MAXSIZE        20
 #define TELNET_HELPSTR_SIZE       80
diff --git a/common/utils/telnetsrv/telnetsrv_CMakeLists.txt b/common/utils/telnetsrv/telnetsrv_CMakeLists.txt
index 05c99aabb808dc12640340c6e8783dbda97170f3..519a1a72ffc02c22af9f4c58ae1e78a975d4931a 100644
--- a/common/utils/telnetsrv/telnetsrv_CMakeLists.txt
+++ b/common/utils/telnetsrv/telnetsrv_CMakeLists.txt
@@ -2,20 +2,32 @@ set(TELNETROOT ${OPENAIR_DIR}/common/utils/telnetsrv )
 
 set(TELNETSRV_SOURCE
     ${TELNETROOT}/telnetsrv.c
-    ${TELNETROOT}/telnetsrv_phycmd.c
     ${TELNETROOT}/telnetsrv_proccmd.c
     ${TELNETROOT}/telnetsrv_loader.c
     ${TELNETROOT}/telnetsrv_measurements.c
     )
-
-#set(TELNETSRV_ETHDEVCMD_SOURCE
-#    ${APPROOT}/telnetsrv/telnetsrv_ethdevcmd.c
-#    )
-
+    
 add_library(telnetsrv MODULE ${TELNETSRV_SOURCE} )
-#add_library(telnetsrv_ethdevcmd MODULE ${TELNETSRV_ETHDEVCMD_SOURCE} )
 target_link_libraries(telnetsrv PRIVATE history)
 
+foreach(TELNETLIB enb gnb 4gUE 5gUE)
+    set(TELNETLIB_SRCS "")
+    foreach(TELNETLIB_ASRC measurements phycmd)
+       set(TELNETLIB_SRC ${OPENAIR_DIR}/common/utils/telnetsrv/telnetsrv_${TELNETLIB}_${TELNETLIB_ASRC}.c)
+       if (EXISTS ${TELNETLIB_SRC})
+          set( TELNETLIB_SRCS "${TELNETLIB_SRC};${TELNETLIB_SRCS}")
+       endif()
+    endforeach()
+    if(NOT "${TELNETLIB_SRCS}" STREQUAL "")
+       message("Add ${TELNETLIB} specific telnet functions in libtelnetsrv_${TELNETLIB}.so")
+       add_library(telnetsrv_${TELNETLIB} MODULE ${TELNETLIB_SRCS} )
+       add_dependencies(telnetsrv telnetsrv_${TELNETLIB})
+       install(TARGETS  telnetsrv_${TELNETLIB} DESTINATION bin)
+    else()
+       message("No specific telnet functions for ${TELNETLIB}")
+    endif()  
+endforeach()
+
 install(TARGETS telnetsrv DESTINATION bin)
 
 if (EXISTS "${OPENAIR_BUILD_DIR}/ran_build/build" AND IS_DIRECTORY "${OPENAIR_BUILD_DIR}/ran_build/build")
diff --git a/common/utils/telnetsrv/telnetsrv_enb_measurements.c b/common/utils/telnetsrv/telnetsrv_enb_measurements.c
new file mode 100644
index 0000000000000000000000000000000000000000..9c5c5b675bbd3830560e72cff6413da79cd2e6fe
--- /dev/null
+++ b/common/utils/telnetsrv/telnetsrv_enb_measurements.c
@@ -0,0 +1,179 @@
+/*
+ * 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
+ */
+
+/*! \file common/utils/telnetsrv/telnetsrv_measurements.c
+ * \brief: implementation of telnet commands related to eNB measurments
+ * \author Francois TABURET
+ * \date 2019
+ * \version 0.1
+ * \company NOKIA BellLabs France
+ * \email: francois.taburet@nokia-bell-labs.com
+ * \note
+ * \warning
+ */
+#define _GNU_SOURCE
+#include <sys/types.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+
+
+
+#define TELNETSERVERCODE
+#include "telnetsrv.h"
+
+#include "common/utils/LOG/log.h"
+#include "common/config/config_userapi.h"
+#include "telnetsrv_measurements.h"
+#include "telnetsrv_ltemeasur_def.h"
+#include "telnetsrv_cpumeasur_def.h"
+#include "openair2/LAYER2/MAC/mac.h"
+#include "openair1/PHY/phy_extern.h"
+
+void measurcmd_display_macstats(telnet_printfunc_t prnt);
+void measurcmd_display_macstats_ue(telnet_printfunc_t prnt);
+void measurcmd_display_rlcstats(telnet_printfunc_t prnt);
+void measurcmd_display_phycpu(telnet_printfunc_t prnt);
+void measurcmd_display_maccpu(telnet_printfunc_t prnt);
+void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt);
+
+
+static telnet_measurgroupdef_t enbmeasurgroups[] = {
+  {"enb",   GROUP_LTESTATS,0, measurcmd_display_macstats,   {NULL}},
+  {"enbues",GROUP_LTESTATS,0, measurcmd_display_macstats_ue,{NULL}},
+  {"rlc",   GROUP_LTESTATS,0, measurcmd_display_rlcstats,   {NULL}},
+  {"phycpu",GROUP_CPUSTATS,0, measurcmd_display_phycpu,     {NULL}},
+  {"maccpu",GROUP_CPUSTATS,0, measurcmd_display_maccpu,      {NULL}},
+  {"pdcpcpu",GROUP_CPUSTATS,0, measurcmd_display_pdcpcpu,      {NULL}},
+};
+#define TELNET_NUM_ENBMEASURGROUPS (sizeof(enbmeasurgroups)/sizeof(telnet_measurgroupdef_t))
+
+static int                     eNB_id =0;
+static double                  cpufreq;
+
+
+#define HDR "---------------------------------"
+
+
+int get_measurgroups(telnet_measurgroupdef_t **measurgroups) {
+  *measurgroups = enbmeasurgroups;
+  return TELNET_NUM_ENBMEASURGROUPS;
+}
+
+
+void measurcmd_display_phycpu(telnet_printfunc_t prnt) {
+  PHY_VARS_eNB *phyvars = RC.eNB[eNB_id][0];
+  telnet_cpumeasurdef_t  cpumeasur[]=CPU_PHYENB_MEASURE;
+  prnt("%s cpu (%1.1g GHz) measurements: PHY (cpustats %s) %s\n",HDR,cpufreq,
+       PRINT_CPUMEAS_STATE,HDR);
+  measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
+}
+
+void measurcmd_display_maccpu(telnet_printfunc_t prnt) {
+  eNB_MAC_INST *macvars = RC.mac[eNB_id];
+  telnet_cpumeasurdef_t  cpumeasur[]=CPU_MACENB_MEASURE;
+  prnt("%s cpu (%1.1g GHz) measurements: MAC (cpustats %s) %s\n",HDR,cpufreq,
+       PRINT_CPUMEAS_STATE,HDR);
+  measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
+}
+
+void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt) {
+  pdcp_stats_t *pdcpvars = &(eNB_pdcp_stats[eNB_id]);
+  telnet_cpumeasurdef_t  cpumeasur[]=CPU_PDCPENB_MEASURE;
+  prnt("%s cpu (%1.1g GHz) measurements: PDCP (cpustats %s) %s \n",HDR,cpufreq,
+       PRINT_CPUMEAS_STATE,HDR);
+  measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
+}
+/*----------------------------------------------------------------------------------------------------*/
+
+
+void measurcmd_display_macstats_ue(telnet_printfunc_t prnt) {
+  UE_list_t *UE_list = &(RC.mac[eNB_id]->UE_list);
+
+  for (int UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
+    for (int i=0; i<UE_list->numactiveCCs[UE_id]; i++) {
+      int CC_id = UE_list->ordered_CCids[i][UE_id];
+      prnt("%s UE %i Id %i CCid %i %s\n",HDR,i,UE_id,CC_id,HDR);
+      eNB_UE_STATS *macuestatptr = &(UE_list->eNB_UE_stats[CC_id][UE_id]);
+      telnet_ltemeasurdef_t  statsptr[]=LTEMAC_UEMEASURE;
+      measurcmd_display_measures(prnt, statsptr, sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
+    }
+  }
+} /* measurcmd_display_macstats_ue */
+
+void measurcmd_display_macstats(telnet_printfunc_t prnt) {
+  for (int CC_id=0 ; CC_id < MAX_NUM_CCs; CC_id++) {
+    eNB_STATS *macstatptr=&(RC.mac[eNB_id]->eNB_stats[CC_id]);
+    telnet_ltemeasurdef_t  statsptr[]=LTEMAC_MEASURE;
+    prnt("%s eNB %i mac stats CC %i frame %u %s\n",
+         HDR, eNB_id, CC_id, RC.mac[eNB_id]->frame,HDR);
+    measurcmd_display_measures(prnt,statsptr,sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
+  }
+} /* measurcmd_display_macstats */
+
+
+void measurcmd_display_one_rlcstat(telnet_printfunc_t prnt, int UE_id, telnet_ltemeasurdef_t *statsptr, int num_rlcmeasure, unsigned int *rlcstats,
+                                   char *rbid_str, protocol_ctxt_t *ctxt, const srb_flag_t srb_flagP, const rb_id_t rb_idP)
+
+{
+  int rlc_status = rlc_stat_req(ctxt,srb_flagP,rb_idP,
+                                rlcstats,   rlcstats+1, rlcstats+2, rlcstats+3, rlcstats+4, rlcstats+5,
+                                rlcstats+6, rlcstats+7, rlcstats+8, rlcstats+9, rlcstats+10, rlcstats+11,
+                                rlcstats+12, rlcstats+13, rlcstats+14, rlcstats+15, rlcstats+16, rlcstats+17,
+                                rlcstats+18, rlcstats+19, rlcstats+20, rlcstats+21, rlcstats+22, rlcstats+23,
+                                rlcstats+24, rlcstats+25, rlcstats+26, rlcstats+27);
+
+  if (rlc_status == RLC_OP_STATUS_OK) {
+    prnt("%s UE %i RLC %s mode %s %s\n",HDR,UE_id, rbid_str,
+         (rlcstats[0]==RLC_MODE_AM)? "AM": (rlcstats[0]==RLC_MODE_UM)?"UM":"NONE",HDR);
+    measurcmd_display_measures(prnt, statsptr, num_rlcmeasure);
+  }
+} /* status measurcmd_rlc_stat_req */
+
+
+void measurcmd_display_rlcstats(telnet_printfunc_t prnt) {
+  protocol_ctxt_t      ctxt;
+  UE_list_t *UE_list = &(RC.mac[eNB_id]->UE_list);
+  telnet_ltemeasurdef_t  statsptr[]=LTE_RLCMEASURE;
+  int num_rlcmeasure = sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t );
+  unsigned int *rlcstats = malloc(num_rlcmeasure*sizeof(unsigned int));
+  eNB_MAC_INST *eNB = RC.mac[eNB_id];
+
+  for(int i=0; i <num_rlcmeasure ; i++) {
+    statsptr[i].vptr = rlcstats + i;
+  }
+
+  for (int UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
+#define NB_eNB_INST 1
+    PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt,eNB_id, ENB_FLAG_YES,UE_list->eNB_UE_stats[0][UE_id].crnti,
+                                   eNB->frame,eNB->subframe,eNB_id);
+    measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DCCH", &ctxt, SRB_FLAG_YES, DCCH);
+    measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DTCH", &ctxt, SRB_FLAG_NO,  DTCH-2);
+  }
+} /* measurcmd_display_macstats_ue */
+
+
+
+
diff --git a/common/utils/telnetsrv/telnetsrv_phycmd.c b/common/utils/telnetsrv/telnetsrv_enb_phycmd.c
similarity index 52%
rename from common/utils/telnetsrv/telnetsrv_phycmd.c
rename to common/utils/telnetsrv/telnetsrv_enb_phycmd.c
index c60126f1c741e4d9d93323e761862d0f7458e561..f7deec1801cba99f0f6052a2e85f86b36df32e74 100644
--- a/common/utils/telnetsrv/telnetsrv_phycmd.c
+++ b/common/utils/telnetsrv/telnetsrv_enb_phycmd.c
@@ -29,7 +29,7 @@
  * \note
  * \warning
  */
-#define _GNU_SOURCE 
+#define _GNU_SOURCE
 #include <string.h>
 #include <pthread.h>
 
@@ -39,104 +39,85 @@
 #define TELNETSRV_PHYCMD_MAIN
 #include "telnetsrv_phycmd.h"
 char *prnbuff;
-extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length);
-
-void init_phytelnet(void)
-{
-prnbuff=malloc(get_phybsize() );
-if (prnbuff == NULL)
-   {
-   fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno));
-   }
-}
+extern int dump_eNB_stats(PHY_VARS_eNB *eNB, char *buffer, int length);
 
-void display_uestatshead( telnet_printfunc_t prnt)
-{
-prnt("cc  ue  rnti Dmcs Umcs tao  tau   Dbr  Dtb   \n");
-}
+void init_phytelnet(void) {
+  prnbuff=malloc(get_phybsize() );
 
-void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag)
-{
+  if (prnbuff == NULL) {
+    fprintf(stderr,"Error %s on malloc in init_phytelnet()\n",strerror(errno));
+  }
+}
 
-int p;
+void display_uestatshead( telnet_printfunc_t prnt) {
+  prnt("cc  ue  rnti Dmcs Umcs tao  tau   Dbr  Dtb   \n");
+}
 
-        p=dump_eNB_l2_stats( prnbuff, 0);
-	if(prntflag>=1)
-	   prnt("%s\n",prnbuff);
-	if(debug>=1)
-	   prnt("%i bytes printed\n",p);	   
+void dump_uestats(int debug, telnet_printfunc_t prnt, uint8_t prntflag) {
+  int p;
+  p=dump_eNB_l2_stats( prnbuff, 0);
 
+  if(prntflag>=1)
+    prnt("%s\n",prnbuff);
 
+  if(debug>=1)
+    prnt("%i bytes printed\n",p);
 }
 
-void display_uestats(int debug, telnet_printfunc_t prnt, int ue)
-{
-   for (int cc=0; cc<1 ; cc++)
-       {
- 
- 
-       }
+void display_uestats(int debug, telnet_printfunc_t prnt, int ue) {
+  for (int cc=0; cc<1 ; cc++) {
+  }
 }
 
-void display_phycounters(char *buf, int debug, telnet_printfunc_t prnt)
-{    
-   prnt("  DLSCH kb      DLSCH kb/s\n");
-
-   dump_uestats(debug, prnt,0);
-
+void display_phycounters(char *buf, int debug, telnet_printfunc_t prnt) {
+  prnt("  DLSCH kb      DLSCH kb/s\n");
+  dump_uestats(debug, prnt,0);
 }
 
-int dump_phyvars(char *buf, int debug, telnet_printfunc_t prnt)
-{
-   
-   
-
-   if (debug > 0)
-       prnt("phy interface module received %s\n",buf);
-   if (strcasestr(buf,"phycnt") != NULL)
-       {
-       display_phycounters(buf, debug, prnt);
-       }
-   if (strcasestr(buf,"uestat") != NULL)
-      {
-      char *cptr=strcasestr(buf+sizeof("uestat"),"UE");
-      display_uestatshead(prnt);
-      if (cptr != NULL)
-         {
-	 int ueidx = strtol( cptr+sizeof("UE"), NULL, 10);
-	 if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0)
-	    {
-	    display_uestats(debug, prnt,ueidx);
-	    }
-	 } /* if cptr != NULL */
-      else
-         {
-	 for (int ue=0; ue<NUMBER_OF_UE_MAX ; ue++)
-	     {
-	     display_uestats(debug, prnt,ue);
-	     }
-	 } /* else cptr != NULL */
-      } /* uestat */
-   if (strcasestr(buf,"uedump") != NULL)
-       {
-       dump_uestats(debug, prnt,1);
-       }           
-   return 0;
+int dump_phyvars(char *buf, int debug, telnet_printfunc_t prnt) {
+  if (debug > 0)
+    prnt("phy interface module received %s\n",buf);
+
+  if (strcasestr(buf,"phycnt") != NULL) {
+    display_phycounters(buf, debug, prnt);
+  }
+
+  if (strcasestr(buf,"uestat") != NULL) {
+    char *cptr=strcasestr(buf+sizeof("uestat"),"UE");
+    display_uestatshead(prnt);
+
+    if (cptr != NULL) {
+      int ueidx = strtol( cptr+sizeof("UE"), NULL, 10);
+
+      if (ueidx < NUMBER_OF_UE_MAX && ueidx >= 0) {
+        display_uestats(debug, prnt,ueidx);
+      }
+    } /* if cptr != NULL */
+    else {
+      for (int ue=0; ue<NUMBER_OF_UE_MAX ; ue++) {
+        display_uestats(debug, prnt,ue);
+      }
+    } /* else cptr != NULL */
+  } /* uestat */
+
+  if (strcasestr(buf,"uedump") != NULL) {
+    dump_uestats(debug, prnt,1);
+  }
+
+  return 0;
 }
 
 
 
 telnetshell_cmddef_t phy_cmdarray[] = {
-   {"disp","[phycnt,uedump,uestat UE<x>]", dump_phyvars},
+  {"disp","[phycnt,uedump,uestat UE<x>]", dump_phyvars},
 
-   {"","",NULL},
+  {"","",NULL},
 };
 
 
 /*-------------------------------------------------------------------------------------*/
-void add_phy_cmds(void)
-{
-
-   init_phytelnet();
-   add_telnetcmd("phy", phy_vardef, phy_cmdarray);
+void add_phy_cmds(void) {
+  init_phytelnet();
+  add_telnetcmd("phy", phy_vardef, phy_cmdarray);
 }
diff --git a/common/utils/telnetsrv/telnetsrv_measurements.c b/common/utils/telnetsrv/telnetsrv_measurements.c
index 7cfc6562254b0522f19cf1ba78d27a8fa956d557..4a11e7c2dd59f4d073d4e6a8712ab78679277642 100644
--- a/common/utils/telnetsrv/telnetsrv_measurements.c
+++ b/common/utils/telnetsrv/telnetsrv_measurements.c
@@ -20,9 +20,9 @@
  */
 
 /*! \file common/utils/telnetsrv/telnetsrv_measurements.c
- * \brief: implementation of telnet commands related to measurments
+ * \brief: implementation of telnet measurement functions common to all softmodems
  * \author Francois TABURET
- * \date 2019
+ * \date 2020
  * \version 0.1
  * \company NOKIA BellLabs France
  * \email: francois.taburet@nokia-bell-labs.com
@@ -47,40 +47,18 @@
 #include "common/utils/LOG/log.h"
 #include "common/config/config_userapi.h"
 #include "telnetsrv_measurements.h"
-#include "telnetsrv_ltemeasur_def.h"
-#include "telnetsrv_cpumeasur_def.h"
-#include "openair2/LAYER2/MAC/mac.h"
-#include "openair1/PHY/phy_extern.h"
-
-void measurcmd_display_macstats(telnet_printfunc_t prnt);
-void measurcmd_display_macstats_ue(telnet_printfunc_t prnt);
-void measurcmd_display_rlcstats(telnet_printfunc_t prnt);
-void measurcmd_display_phycpu(telnet_printfunc_t prnt);
-void measurcmd_display_maccpu(telnet_printfunc_t prnt);
-void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt);
-
-
-static telnet_measurgroupdef_t measurgroups[] = {
-  {"enb",   GROUP_LTESTATS,0, measurcmd_display_macstats,   {NULL}},
-  {"enbues",GROUP_LTESTATS,0, measurcmd_display_macstats_ue,{NULL}},
-  {"rlc",   GROUP_LTESTATS,0, measurcmd_display_rlcstats,   {NULL}},
-  {"phycpu",GROUP_CPUSTATS,0, measurcmd_display_phycpu,     {NULL}},
-  {"maccpu",GROUP_CPUSTATS,0, measurcmd_display_maccpu,      {NULL}},
-  {"pdcpcpu",GROUP_CPUSTATS,0, measurcmd_display_pdcpcpu,      {NULL}},
-};
-#define TELNET_NUM_MEASURGROUPS (sizeof(measurgroups)/sizeof(telnet_measurgroupdef_t))
-
-static int                     eNB_id =0;
+
+
 static char                    *grouptypes[] = {"ltestats","cpustats"};
 static double                  cpufreq;
 #define TELNET_NUM_MEASURTYPES (sizeof(grouptypes)/sizeof(char *))
 
 #define HDR "---------------------------------"
 
-void measurcmd_display_groups(telnet_printfunc_t prnt) {
+void measurcmd_display_groups(telnet_printfunc_t prnt,telnet_measurgroupdef_t *measurgroups,int groups_size) {
   prnt("  %*s %10s %s\n",TELNET_MAXMEASURNAME_LEN-1,"name","type","nombre de mesures");
 
-  for(int i=0; i<TELNET_NUM_MEASURGROUPS; i++)
+  for(int i=0; i<groups_size; i++)
     prnt("%02d %*s %10s %i\n",i,TELNET_MAXMEASURNAME_LEN-1,measurgroups[i].groupname,
          grouptypes[measurgroups[i].type], measurgroups[i].size);
 } /* measurcmd_display_groups */
@@ -96,32 +74,9 @@ void measurcmd_display_cpumeasures(telnet_printfunc_t prnt, telnet_cpumeasurdef_
   prnt("\n\n");
 } /* measurcmd_display_measures */
 
-#define PRINT_CPUMEAS_STATE  ((cpumeas(CPUMEAS_GETSTATE))?"enabled":"disabled")
-void measurcmd_display_phycpu(telnet_printfunc_t prnt) {
-  PHY_VARS_eNB *phyvars = RC.eNB[eNB_id][0];
-  telnet_cpumeasurdef_t  cpumeasur[]=CPU_PHYENB_MEASURE;
-  prnt("%s cpu (%1.1g GHz) measurements: PHY (cpustats %s) %s\n",HDR,cpufreq,
-       PRINT_CPUMEAS_STATE,HDR);
-  measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
-}
-
-void measurcmd_display_maccpu(telnet_printfunc_t prnt) {
-  eNB_MAC_INST *macvars = RC.mac[eNB_id];
-  telnet_cpumeasurdef_t  cpumeasur[]=CPU_MACENB_MEASURE;
-  prnt("%s cpu (%1.1g GHz) measurements: MAC (cpustats %s) %s\n",HDR,cpufreq,
-       PRINT_CPUMEAS_STATE,HDR);
-  measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
-}
 
-void measurcmd_display_pdcpcpu(telnet_printfunc_t prnt) {
-  pdcp_stats_t *pdcpvars = &(eNB_pdcp_stats[eNB_id]);
-  telnet_cpumeasurdef_t  cpumeasur[]=CPU_PDCPENB_MEASURE;
-  prnt("%s cpu (%1.1g GHz) measurements: PDCP (cpustats %s) %s \n",HDR,cpufreq,
-       PRINT_CPUMEAS_STATE,HDR);
-  measurcmd_display_cpumeasures(prnt, cpumeasur, sizeof(cpumeasur)/sizeof(telnet_cpumeasurdef_t));
-}
 /*----------------------------------------------------------------------------------------------------*/
-/* lte measurements functions                         */
+/* cellular measurements functions                         */
 uint64_t measurcmd_getstatvalue(telnet_ltemeasurdef_t *measur,telnet_printfunc_t prnt) {
   uint64_t val;
 
@@ -164,70 +119,7 @@ void measurcmd_display_measures(telnet_printfunc_t prnt, telnet_ltemeasurdef_t
   prnt("\n\n");
 } /* measurcmd_display_measures */
 
-void measurcmd_display_macstats_ue(telnet_printfunc_t prnt) {
-  UE_list_t *UE_list = &(RC.mac[eNB_id]->UE_list);
-
-  for (int UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
-    for (int i=0; i<UE_list->numactiveCCs[UE_id]; i++) {
-      int CC_id = UE_list->ordered_CCids[i][UE_id];
-      prnt("%s UE %i Id %i CCid %i %s\n",HDR,i,UE_id,CC_id,HDR);
-      eNB_UE_STATS *macuestatptr = &(UE_list->eNB_UE_stats[CC_id][UE_id]);
-      telnet_ltemeasurdef_t  statsptr[]=LTEMAC_UEMEASURE;
-      measurcmd_display_measures(prnt, statsptr, sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
-    }
-  }
-} /* measurcmd_display_macstats_ue */
-
-void measurcmd_display_macstats(telnet_printfunc_t prnt) {
-  for (int CC_id=0 ; CC_id < MAX_NUM_CCs; CC_id++) {
-    eNB_STATS *macstatptr=&(RC.mac[eNB_id]->eNB_stats[CC_id]);
-    telnet_ltemeasurdef_t  statsptr[]=LTEMAC_MEASURE;
-    prnt("%s eNB %i mac stats CC %i frame %u %s\n",
-         HDR, eNB_id, CC_id, RC.mac[eNB_id]->frame,HDR);
-    measurcmd_display_measures(prnt,statsptr,sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t));
-  }
-} /* measurcmd_display_macstats */
-
 
-void measurcmd_display_one_rlcstat(telnet_printfunc_t prnt, int UE_id, telnet_ltemeasurdef_t *statsptr, int num_rlcmeasure, unsigned int *rlcstats,
-                                   char *rbid_str, protocol_ctxt_t *ctxt, const srb_flag_t srb_flagP, const rb_id_t rb_idP)
-
-{
-  int rlc_status = rlc_stat_req(ctxt,srb_flagP,rb_idP,
-                                rlcstats,   rlcstats+1, rlcstats+2, rlcstats+3, rlcstats+4, rlcstats+5,
-                                rlcstats+6, rlcstats+7, rlcstats+8, rlcstats+9, rlcstats+10, rlcstats+11,
-                                rlcstats+12, rlcstats+13, rlcstats+14, rlcstats+15, rlcstats+16, rlcstats+17,
-                                rlcstats+18, rlcstats+19, rlcstats+20, rlcstats+21, rlcstats+22, rlcstats+23,
-                                rlcstats+24, rlcstats+25, rlcstats+26, rlcstats+27);
-
-  if (rlc_status == RLC_OP_STATUS_OK) {
-    prnt("%s UE %i RLC %s mode %s %s\n",HDR,UE_id, rbid_str,
-         (rlcstats[0]==RLC_MODE_AM)? "AM": (rlcstats[0]==RLC_MODE_UM)?"UM":"NONE",HDR);
-    measurcmd_display_measures(prnt, statsptr, num_rlcmeasure);
-  }
-} /* status measurcmd_rlc_stat_req */
-
-
-void measurcmd_display_rlcstats(telnet_printfunc_t prnt) {
-  protocol_ctxt_t      ctxt;
-  UE_list_t *UE_list = &(RC.mac[eNB_id]->UE_list);
-  telnet_ltemeasurdef_t  statsptr[]=LTE_RLCMEASURE;
-  int num_rlcmeasure = sizeof(statsptr)/sizeof(telnet_ltemeasurdef_t );
-  unsigned int *rlcstats = malloc(num_rlcmeasure*sizeof(unsigned int));
-  eNB_MAC_INST *eNB = RC.mac[eNB_id];
-
-  for(int i=0; i <num_rlcmeasure ; i++) {
-    statsptr[i].vptr = rlcstats + i;
-  }
-
-  for (int UE_id=UE_list->head; UE_id>=0; UE_id=UE_list->next[UE_id]) {
-#define NB_eNB_INST 1
-    PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt,eNB_id, ENB_FLAG_YES,UE_list->eNB_UE_stats[0][UE_id].crnti,
-                                   eNB->frame,eNB->subframe,eNB_id);
-    measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DCCH", &ctxt, SRB_FLAG_YES, DCCH);
-    measurcmd_display_one_rlcstat(prnt, UE_id, statsptr, num_rlcmeasure, rlcstats, "DTCH", &ctxt, SRB_FLAG_NO,  DTCH-2);
-  }
-} /* measurcmd_display_macstats_ue */
 
 /*------------------------------------------------------------------------------------------------------------------------*/
 /* function called by the telnet server when measur command is entered */
@@ -238,20 +130,24 @@ int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt) {
 
   if (debug > 0)
     prnt(" measurcmd_show received %s\n",buf);
-
-  //   char tmp[20480];
-  //   dump_eNB_l2_stats(tmp, 0);
-  //   prnt("%s\n",tmp);
+  int (*fptr)(telnet_measurgroupdef_t **) = dlsym(RTLD_DEFAULT,"get_measurgroups");
+  if ( fptr == NULL) {
+    prnt("No measures available for this softmodem\n");
+    return 0;
+  }
+  telnet_measurgroupdef_t *measurgroups;
+  int num_measurgroups = fptr( &measurgroups);
+ 
   int s = sscanf(buf,"%ms %i-%i\n",&subcmd, &idx1,&idx2);
 
   if (s>0) {
     if ( strcmp(subcmd,"groups") == 0) {
-      measurcmd_display_groups(prnt);
+      measurcmd_display_groups(prnt,measurgroups,num_measurgroups);
       badcmd=0;
     } else {
       for (int i=0; i<TELNET_NUM_MEASURTYPES; i++) {
         if(strcmp(subcmd,grouptypes[i]) == 0) {
-          for(int j=0; j<TELNET_NUM_MEASURGROUPS; j++) {
+          for(int j=0; j<num_measurgroups; j++) {
             if(i == measurgroups[j].type) {
               badcmd=0;
               measurgroups[j].displayfunc(prnt);
@@ -260,7 +156,7 @@ int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt) {
         }
       }/* for i...*/
 
-      for (int i=0; i<TELNET_NUM_MEASURGROUPS; i++) {
+      for (int i=0; i<num_measurgroups; i++) {
         if(strcmp(subcmd,measurgroups[i].groupname) == 0) {
           measurgroups[i].displayfunc(prnt);
           badcmd=0;
diff --git a/common/utils/telnetsrv/telnetsrv_measurements.h b/common/utils/telnetsrv/telnetsrv_measurements.h
index 46f25da4c52ddc3e17ce071501c0a98481b01eb7..80276bc2d03782c63c2339cdb542fd3a265e04e5 100644
--- a/common/utils/telnetsrv/telnetsrv_measurements.h
+++ b/common/utils/telnetsrv/telnetsrv_measurements.h
@@ -34,16 +34,13 @@
 #include <dlfcn.h>
 #include "telnetsrv.h"
 #include "openair1/PHY/defs_eNB.h"
-#ifdef TELNETSRV_MEASURMENTS_MAIN
+
 
 
 #define TELNET_MAXMEASURNAME_LEN 30
 #define TELNET_MAXMEASURGROUPS 10
 
-telnetshell_vardef_t measur_vardef[] = {
-  {"",0,NULL}
-};
-
+#define PRINT_CPUMEAS_STATE  ((cpumeas(CPUMEAS_GETSTATE))?"enabled":"disabled")
 typedef struct cpumeasurdef {
   char statname[TELNET_MAXMEASURNAME_LEN];
   time_stats_t *astatptr;
@@ -75,6 +72,7 @@ typedef struct mesurgroupdef {
 #define LTEMAC_MEASURGROUP_NAME  "ltemac"
 #define PHYCPU_MEASURGROUP_NAME  "phycpu"
 
+#ifdef TELNETSRV_MEASURMENTS_MAIN
 int measurcmd_show(char *buf, int debug, telnet_printfunc_t prnt);
 int measurcmd_cpustats(char *buf, int debug, telnet_printfunc_t prnt);
 telnetshell_cmddef_t measur_cmdarray[] = {
@@ -83,6 +81,19 @@ telnetshell_cmddef_t measur_cmdarray[] = {
   {"","",NULL}
 };
 
+telnetshell_vardef_t measur_vardef[] = {
+  {"",0,NULL}
+};
+/* function to be implemented in any telnetsrv_xxx_measurements.c sources
+   to allow common measurment code to access measurments data             */
+extern int get_measurgroups(telnet_measurgroupdef_t **measurgroups);
+/* */
+
 #else
-extern void add_measur_cmds(void);
+extern void     add_measur_cmds(void);
+extern void     measurcmd_display_groups(telnet_printfunc_t prnt,telnet_measurgroupdef_t *measurgroups,int groups_size);
+extern void     measurcmd_display_cpumeasures(telnet_printfunc_t prnt, telnet_cpumeasurdef_t  *cpumeasure, int cpumeasure_size) ;
+extern uint64_t measurcmd_getstatvalue(telnet_ltemeasurdef_t *measur,telnet_printfunc_t prnt);
+extern void     measurcmd_display_measures(telnet_printfunc_t prnt, telnet_ltemeasurdef_t  *statsptr, int stats_size);
+
 #endif  /* TELNETSRV_MEASURCMD_MAIN */
diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index e7af164877c6889b50b885fac1c83f826762832d..e03700e4f520367645c0783ba915d3671a73c740 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -93,10 +93,8 @@
 // extern openair0_device openair0;
 
 
-#if defined(ENABLE_ITTI)
-  extern volatile int start_gNB;
-  extern volatile int start_UE;
-#endif
+extern volatile int start_gNB;
+extern volatile int start_UE;
 extern volatile int oai_exit;
 
 extern openair0_config_t openair0_cfg[MAX_CARDS];
@@ -370,7 +368,7 @@ static void *gNB_L1_thread( void *param ) {
 }
 
 
-#if 0 //defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
+#if 0 
 // Wait for gNB application initialization to be complete (gNB registration to MME)
 static void wait_system_ready (char *message, volatile int *start_flag) {
   static char *indicator[] = {".    ", "..   ", "...  ", ".... ", ".....",
diff --git a/executables/nr-softmodem-common.h b/executables/nr-softmodem-common.h
index 5353178f0ebb1a64a1e478ca2096c7ce8661d2c3..ccb3f28d98e59c7ccb08cc8e6c2483027f6469ca 100644
--- a/executables/nr-softmodem-common.h
+++ b/executables/nr-softmodem-common.h
@@ -143,9 +143,7 @@ extern int sync_var;
 extern int transmission_mode;
 extern double cpuf;
 
-#if defined(ENABLE_ITTI)
-  extern volatile int start_eNB;
-  extern volatile int start_UE;
-#endif
+extern volatile int start_eNB;
+extern volatile int start_UE;
 
 #endif
diff --git a/executables/nr-softmodem.c b/executables/nr-softmodem.c
index 68b8b8aa297c2f46a4f55d6b442b2f1f2dd9735a..4534761d871bf934b49bb603ef9a188085cffb8c 100644
--- a/executables/nr-softmodem.c
+++ b/executables/nr-softmodem.c
@@ -71,9 +71,7 @@ unsigned short config_frames[4] = {2,9,11,13};
   #include "UTIL/OTG/otg_vars.h"
 #endif
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "PHY/INIT/phy_init.h"
 
@@ -102,9 +100,7 @@ pthread_mutex_t sync_mutex;
 int sync_var=-1; //!< protected by mutex \ref sync_mutex.
 int config_sync_var=-1;
 
-#if defined(ENABLE_ITTI)
-  volatile int             start_gNB = 0;
-#endif
+volatile int             start_gNB = 0;
 volatile int             oai_exit = 0;
 
 static int wait_for_sync = 0;
@@ -120,9 +116,7 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
 //Temp fix for inexistent NR upper layer
 unsigned char NB_gNB_INST = 1;
 
-#if defined(ENABLE_ITTI)
-  static char                    *itti_dump_file = NULL;
-#endif
+static char                    *itti_dump_file = NULL;
 
 int UE_scan = 1;
 int UE_scan_carrier = 0;
@@ -303,7 +297,7 @@ void exit_function(const char *file, const char *function, const int line, const
   exit(1);
 }
 
-#if defined(ENABLE_ITTI)
+
 void *l2l1_task(void *arg) {
   MessageDef *message_p = NULL;
   int         result;
@@ -376,7 +370,6 @@ void *l2l1_task(void *arg) {
   */
   return NULL;
 }
-#endif
 
 int create_gNB_tasks(uint32_t gnb_nb) {
   LOG_D(GNB_APP, "%s(gnb_nb:%d)\n", __FUNCTION__, gnb_nb);
@@ -648,7 +641,6 @@ void wait_gNBs(void) {
   printf("gNB L1 are configured\n");
 }
 
-#if defined(ENABLE_ITTI)
 /*
  * helper function to terminate a certain ITTI task
  */
@@ -764,7 +756,6 @@ int restart_L1L2(module_id_t gnb_id) {
   pthread_mutex_unlock(&sync_mutex);
   return 0;
 }
-#endif
 
 static  void wait_nfapi_init(char *thread_name) {
   printf( "waiting for NFAPI PNF connection and population of global structure (%s)\n",thread_name);
@@ -823,7 +814,7 @@ int main( int argc, char **argv )
   configure_linux();
   printf("Reading in command-line options\n");
   get_options ();
-  get_common_options();
+  get_common_options(SOFTMODEM_GNB_BIT );
 
   if (CONFIG_ISFLAGSET(CONFIG_ABORT) ) {
     fprintf(stderr,"Getting configuration failed\n");
@@ -844,16 +835,16 @@ int main( int argc, char **argv )
   }
 
   cpuf=get_cpu_freq_GHz();
-#if defined(ENABLE_ITTI)
   itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info);
   // initialize mscgen log after ITTI
   MSC_INIT(MSC_E_UTRAN, THREAD_MAX+TASK_MAX);
-#endif
+
 
 init_opt();
 
 
 #ifdef PDCP_USE_NETLINK
+if(!IS_SOFTMODEM_NOS1)
   netlink_init();
 #if defined(PDCP_USE_NETLINK_QUEUES)
   pdcp_netlink_init();
@@ -868,7 +859,10 @@ init_opt();
   if(IS_SOFTMODEM_NOS1)
 	  init_pdcp();
 
+<<<<<<< HEAD
 
+=======
+>>>>>>> origin/develop
   if (RC.nb_nr_inst > 0)  {
     // don't create if node doesn't connect to RRC/S1/GTP
     AssertFatal(create_gNB_tasks(1) == 0,"cannot create ITTI tasks\n");
@@ -877,8 +871,11 @@ init_opt();
     RCconfig_L1();
   }
 
+<<<<<<< HEAD
 
   
+=======
+>>>>>>> origin/develop
   /* Start the agent. If it is turned off in the configuration, it won't start */
   /*
   RCconfig_nr_flexran();
@@ -992,20 +989,40 @@ init_opt();
   // wait for end of program
   printf("TYPE <CTRL-C> TO TERMINATE\n");
   //getchar();
-#if defined(ENABLE_ITTI)
   printf("Entering ITTI signals handler\n");
   itti_wait_tasks_end();
   printf("Returned from ITTI signal handler\n");
   oai_exit=1;
   printf("oai_exit=%d\n",oai_exit);
-#else
-
-  while (oai_exit==0)
-    sleep(1);
 
+<<<<<<< HEAD
   printf("Terminating application - oai_exit=%d\n",oai_exit);
 #endif
   // stop threads  
+=======
+  // stop threads
+/*#ifdef XFORMS
+
+    printf("waiting for XFORMS thread\n");
+
+    if (do_forms==1) {
+      pthread_join(forms_thread,&status);
+      fl_hide_form(form_stats->stats_form);
+      fl_free_form(form_stats->stats_form);
+
+        fl_hide_form(form_stats_l2->stats_form);
+        fl_free_form(form_stats_l2->stats_form);
+
+        for(UE_id=0; UE_id<scope_enb_num_ue; UE_id++) {
+    for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+      fl_hide_form(form_enb[CC_id][UE_id]->phy_scope_gNB);
+      fl_free_form(form_enb[CC_id][UE_id]->phy_scope_gNB);
+    }
+        }
+    }
+
+#endif*/
+>>>>>>> origin/develop
   printf("stopping MODEM threads\n");
   // cleanup
   stop_gNB(NB_gNB_INST);
diff --git a/executables/nr-ue.c b/executables/nr-ue.c
index f73807bdf2c283077db08fa6f1c8683d5c5eee43..d4ace2ce6842b9b8cd96867cf764a8b6d83dff1d 100644
--- a/executables/nr-ue.c
+++ b/executables/nr-ue.c
@@ -460,6 +460,7 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
     LOG_D(PHY,"phy_procedures_nrUE_RX: slot:%d, time %lu\n", proc->nr_tti_rx, (rdtsc()-a)/3500);
     //printf(">>> nr_ue_pdcch_procedures ended\n");
 #endif
+<<<<<<< HEAD
     if(IS_SOFTMODEM_NOS1){ //&& proc->nr_tti_rx==1
       //Hardcoded rnti value
       protocol_ctxt_t ctxt;
@@ -469,6 +470,16 @@ void processSlotRX( PHY_VARS_NR_UE *UE, UE_nr_rxtx_proc_t *proc) {
       pdcp_run(&ctxt);
       pdcp_fifo_flush_sdus(&ctxt);
     }
+=======
+  if(IS_SOFTMODEM_NOS1){ //&& proc->nr_tti_rx==1
+	  //Hardcoded rnti value
+	  protocol_ctxt_t ctxt;
+	  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, UE->Mod_id, ENB_FLAG_NO,
+                                   0x1234, proc->frame_rx,
+                                   proc->nr_tti_rx, 0);
+	  pdcp_run(&ctxt);
+  }
+>>>>>>> origin/develop
   }
 
   
diff --git a/executables/nr-uesoftmodem.c b/executables/nr-uesoftmodem.c
index 98f0f4fe6fb5ee1ae1ca9d44d358c02a4ac660d8..64e0e03a05f7b8d8d194ec5c12b26e6a3efce0d8 100644
--- a/executables/nr-uesoftmodem.c
+++ b/executables/nr-uesoftmodem.c
@@ -135,6 +135,7 @@ int                      threequarter_fs=0;
 
 uint64_t                 downlink_frequency[MAX_NUM_CCs][4];
 int32_t                  uplink_frequency_offset[MAX_NUM_CCs][4];
+//int32_t					 uplink_counter = 0;
 
 
 extern int16_t nr_dlsch_demod_shift;
@@ -334,8 +335,6 @@ void init_scope(void) {
 
 }
 
-
-#if defined(ENABLE_ITTI)
 void *l2l1_task(void *arg) {
   MessageDef *message_p = NULL;
   int         result;
@@ -375,7 +374,7 @@ void *l2l1_task(void *arg) {
 
   return NULL;
 }
-#endif
+
 
 int16_t dlsch_demod_shift;
 
@@ -669,7 +668,7 @@ int main( int argc, char **argv ) {
   logInit();
   // get options and fill parameters from configuration file
   get_options (); //Command-line options, enb_properties
-  get_common_options();
+  get_common_options(SOFTMODEM_5GUE_BIT );
 #if T_TRACER
   T_Config_Init();
 #endif
diff --git a/executables/softmodem-common.c b/executables/softmodem-common.c
index e05f5b651334618e074cf55e01432c9b73b120e3..b901fe0c64a9463c290afd363238bb81e71ec1f8 100644
--- a/executables/softmodem-common.c
+++ b/executables/softmodem-common.c
@@ -37,6 +37,7 @@
 #include "common/utils/load_module_shlib.h"
 #include "common/utils/telnetsrv/telnetsrv.h"
 #include "executables/thread-common.h"
+#include "common/utils/LOG/log.h"
 #include "softmodem-common.h"
 
 static softmodem_params_t softmodem_params;
@@ -44,7 +45,7 @@ char *parallel_config=NULL;
 char *worker_config=NULL;
 
 
-
+static mapping softmodem_funcs[] = MAPPING_SOFTMODEM_FUNCTIONS;
 static struct timespec start;
 
 uint64_t get_softmodem_optmask(void) {
@@ -60,6 +61,7 @@ softmodem_params_t *get_softmodem_params(void) {
   return &softmodem_params;
 }
 
+<<<<<<< HEAD
 void softmodem_printresources(int sig, telnet_printfunc_t pf) {
    struct rusage usage;
    struct timespec stop;
@@ -121,6 +123,28 @@ void set_softmodem_sighandler(void) {
 }
 #ifndef PHYSICAL_SIMULATOR
 void get_common_options(void) {
+=======
+int32_t check_execmask(uint64_t execmask) {
+  char *softmodemfunc=map_int_to_str(softmodem_funcs, execmask);
+  if (softmodemfunc != NULL) {
+  	  set_softmodem_optmask(execmask);
+  	  return 0;
+  } 
+  return -1;
+}
+char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr) {
+  uint64_t fmask=(get_softmodem_optmask()&SOFTMODEM_FUNC_BITS);
+  char *softmodemfunc=map_int_to_str(softmodem_funcs, fmask);
+  if (sofmodemfunc_mask_ptr != NULL)
+  	  *sofmodemfunc_mask_ptr=fmask;
+  if (softmodemfunc != NULL) {
+  	  return softmodemfunc;
+  }
+  return "???";
+}
+
+void get_common_options(uint32_t execmask) {
+>>>>>>> origin/develop
   uint32_t online_log_messages;
   uint32_t glog_level ;
   uint32_t start_telnetsrv = 0;
@@ -130,6 +154,7 @@ void get_common_options(void) {
   paramdef_t cmdline_params[] =CMDLINE_PARAMS_DESC ;
   paramdef_t cmdline_logparams[] =CMDLINE_LOGPARAMS_DESC ;
   checkedparam_t cmdline_log_CheckParams[] = CMDLINE_LOGPARAMS_CHECK_DESC;
+  check_execmask(execmask);
   config_get( cmdline_params,sizeof(cmdline_params)/sizeof(paramdef_t),NULL);
   config_set_checkfunctions(cmdline_logparams, cmdline_log_CheckParams,
                             sizeof(cmdline_logparams)/sizeof(paramdef_t));
@@ -183,4 +208,4 @@ void get_common_options(void) {
 
   if(worker_config != NULL)   set_worker_conf(worker_config);
 }
-#endif
\ No newline at end of file
+#endif
diff --git a/executables/softmodem-common.h b/executables/softmodem-common.h
index f0984056fa5c697be265d4881d5c2a29976ae685..cfed951469e4be96821972d1f6cab56e344a4adb 100644
--- a/executables/softmodem-common.h
+++ b/executables/softmodem-common.h
@@ -31,6 +31,7 @@
  */
 #ifndef SOFTMODEM_COMMON_H
 #define SOFTMODEM_COMMON_H
+#include "openair1/PHY/defs_common.h"
 #ifdef __cplusplus
 extern "C"
 {
@@ -164,6 +165,14 @@ extern "C"
 #define SOFTMODEM_BASICSIM_BIT        (1<<11)
 #define SOFTMODEM_SIML1_BIT           (1<<12)
 #define SOFTMODEM_DOFORMS_BIT         (1<<15)
+#define SOFTMODEM_RECPLAY_BIT         (1<<16)
+#define SOFTMODEM_ENB_BIT             (1<<20)
+#define SOFTMODEM_GNB_BIT             (1<<21)
+#define SOFTMODEM_4GUE_BIT            (1<<22)
+#define SOFTMODEM_5GUE_BIT            (1<<23)
+#define SOFTMODEM_FUNC_BITS (SOFTMODEM_ENB_BIT | SOFTMODEM_GNB_BIT | SOFTMODEM_5GUE_BIT | SOFTMODEM_4GUE_BIT)
+#define MAPPING_SOFTMODEM_FUNCTIONS {{"enb",SOFTMODEM_ENB_BIT},{"gnb",SOFTMODEM_GNB_BIT},{"4Gue",SOFTMODEM_4GUE_BIT},{"5Gue",SOFTMODEM_5GUE_BIT}}
+
 
 #define IS_SOFTMODEM_NOS1            ( get_softmodem_optmask() & SOFTMODEM_NOS1_BIT)
 #define IS_SOFTMODEM_NOKRNMOD        ( get_softmodem_optmask() & SOFTMODEM_NOKRNMOD_BIT)
@@ -172,7 +181,11 @@ extern "C"
 #define IS_SOFTMODEM_BASICSIM        ( get_softmodem_optmask() & SOFTMODEM_BASICSIM_BIT)
 #define IS_SOFTMODEM_SIML1           ( get_softmodem_optmask() & SOFTMODEM_SIML1_BIT)
 #define IS_SOFTMODEM_DOFORMS         ( get_softmodem_optmask() & SOFTMODEM_DOFORMS_BIT)
-
+#define IS_SOFTMODEM_IQPLAYER        ( get_softmodem_optmask() & SOFTMODEM_RECPLAY_BIT)
+#define IS_SOFTMODEM_ENB_BIT         ( get_softmodem_optmask() & SOFTMODEM_ENB_BIT)
+#define IS_SOFTMODEM_GNB_BIT         ( get_softmodem_optmask() & SOFTMODEM_GNB_BIT)
+#define IS_SOFTMODEM_4GUE_BIT        ( get_softmodem_optmask() & SOFTMODEM_4GUE_BIT)
+#define IS_SOFTMODEM_5GUE_BIT        ( get_softmodem_optmask() & SOFTMODEM_5GUE_BIT)
 
 typedef struct {
   uint64_t       optmask;
@@ -195,7 +208,8 @@ typedef struct {
 extern uint64_t get_softmodem_optmask(void);
 extern uint64_t set_softmodem_optmask(uint64_t bitmask);
 extern softmodem_params_t *get_softmodem_params(void);
-extern void get_common_options(void);
+extern void get_common_options(uint32_t execmask);
+extern char *get_softmodem_function(uint64_t *sofmodemfunc_mask_ptr);
 #define SOFTMODEM_RTSIGNAL  (SIGRTMIN+1)
 extern void set_softmodem_sighandler(void);
 extern uint64_t downlink_frequency[MAX_NUM_CCs][4];
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c
index 8c19f44d2f83a03d57080b44ee225cdd4beb592f..e142d2f29febdac4a98c539f46e9115d461c503f 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch.c
@@ -36,7 +36,7 @@
 
 #include "common/utils/LOG/log.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
-
+#include "executables/softmodem-common.h"
 
 //uint8_t ncs_cell[20][7];
 //#define DEBUG_PUCCH_TXS
@@ -801,9 +801,8 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
       for (j=0; j<NUMBER_OF_UE_MAX; j++) {
         eNB->pucch1_stats_cnt[j][i]=0;
         eNB->pucch1ab_stats_cnt[j][i]=0;
-#if defined(USRP_REC_PLAY) // not 100% sure
-        eNB->pucch1_stats_thres[j][i]=0;
-#endif
+        if ( IS_SOFTMODEM_IQPLAYER)
+          eNB->pucch1_stats_thres[j][i]=0;
       }
     }
 
@@ -1193,15 +1192,13 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
       stat_re=0;
       stat_im=0;
       // Do detection now
-#if defined(USRP_REC_PLAY)
 
-      // It looks like the value is a bit messy when RF is replayed.
+
+      // It looks like the pucch1_thres value is a bit messy when RF is replayed.
       // For instance i assume to skip pucch1_thres from the test below.
       // Not 100% sure
-      if (sigma2_dB<(dB_fixed(stat_max)))  {//
-#else
-      if (sigma2_dB<(dB_fixed(stat_max)-pucch1_thres))  {//
-#endif
+        
+        if (sigma2_dB<(dB_fixed(stat_max) - (IS_SOFTMODEM_IQPLAYER?0:pucch1_thres)) ) {//
         chL = (nsymb>>1)-4;
         chest_mag=0;
         cfo =  (frame_parms->Ncp==0) ? &cfo_pucch_np[14*phase_max] : &cfo_pucch_ep[12*phase_max];
@@ -1339,11 +1336,7 @@ uint32_t rx_pucch(PHY_VARS_eNB *eNB,
         if (fmt==pucch_format1b)
           *(1+payload) = (stat_im<0) ? 1 : 2;
       } else { // insufficient energy on PUCCH so NAK
-#if defined(USRP_REC_PLAY)
-        LOG_D(PHY,"PUCCH 1a/b: NAK subframe %d : sigma2_dB %d, stat_max %d, pucch1_thres %d\n",subframe,sigma2_dB,dB_fixed(stat_max),pucch1_thres);
-#else
         LOG_D(PHY,"In pucch.c PUCCH 1a/b: NAK subframe %d : sigma2_dB %d, stat_max %d, pucch1_thres %d\n",subframe,sigma2_dB,dB_fixed(stat_max),pucch1_thres);
-#endif
         *payload = 4;  // DTX
         ((int16_t *)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[0] = (int16_t)(stat_re);
         ((int16_t *)&eNB->pucch1ab_stats[UE_id][(subframe<<10) + (eNB->pucch1ab_stats_cnt[UE_id][subframe])])[1] = (int16_t)(stat_im);
diff --git a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
index 13ad6a0efe29f832ef560414fd10bebe6ede4a7b..3030a4b974e877d5617a05ae99116eb76a462502 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_ulsch_decoding.c
@@ -727,6 +727,19 @@ uint32_t nr_ulsch_decoding(PHY_VARS_gNB *phy_vars_gNB,
       
     }
   }
+<<<<<<< HEAD
+=======
+
+#ifdef DEBUG_ULSCH_DECODING
+  LOG_I(PHY, "Decoder output (payload): \n");
+  for (i = 0; i < harq_process->TBS / 8; i++) {
+	  //harq_process_ul_ue->a[i] = (unsigned char) rand();
+	  //printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
+	  printf("0x%02x",harq_process->b[i]);
+  }
+#endif
+
+>>>>>>> origin/develop
   ulsch->last_iteration_cnt = ret;
 
   return(ret);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
index 17c442f635836b791bcf6fd2d447590c96b80eb0..35fe8bc8992e6ab507c6e43cf83dfac1b691ccd8 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_transport_proto_ue.h
@@ -1078,6 +1078,7 @@ void nr_pusch_codeword_scrambling(uint8_t *in,
 
 void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                                unsigned char harq_pid,
+                               uint8_t frame,
                                uint8_t slot,
                                uint8_t thread_id,
                                int gNB_id);
diff --git a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
index 1fc1a561785faafdc90fba62e0402e7925788d77..d709719cffcf6880b8e0ed9fb80f4fb3a6e8d90d 100644
--- a/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
+++ b/openair1/PHY/NR_UE_TRANSPORT/nr_ulsch_ue.c
@@ -41,9 +41,15 @@
 #include "PHY/NR_TRANSPORT/nr_sch_dmrs.h"
 #include "PHY/defs_nr_common.h"
 #include "PHY/TOOLS/tools_defs.h"
+#include "executables/nr-softmodem.h"
+#include "executables/softmodem-common.h"
+#include "LAYER2/NR_MAC_UE/mac_proto.h"
 
 //#define DEBUG_SCFDMA
 //#define DEBUG_PUSCH_MAPPING
+//#define DEBUG_MAC_PDU
+
+//extern int32_t uplink_counter;
 
 void nr_pusch_codeword_scrambling(uint8_t *in,
                          uint32_t size,
@@ -86,6 +92,7 @@ void nr_pusch_codeword_scrambling(uint8_t *in,
 
 void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                                unsigned char harq_pid,
+                               uint8_t frame,
                                uint8_t slot,
                                uint8_t thread_id,
                                int gNB_id) {
@@ -104,11 +111,13 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
   int ap, start_symbol, Nid_cell, i;
   int sample_offsetF, N_RE_prime, N_PRB_oh;
   uint16_t n_rnti;
+  uint8_t data_existing =0;
 
   NR_UE_ULSCH_t *ulsch_ue;
   NR_UL_UE_HARQ_t *harq_process_ul_ue;
   NR_DL_FRAME_PARMS *frame_parms = &UE->frame_parms;
   NR_UE_PUSCH *pusch_ue = UE->pusch_vars[thread_id][gNB_id];
+  uint8_t ulsch_input_buffer[MAX_ULSCH_PAYLOAD_BYTES];
 
   num_of_codewords = 1; // tmp assumption
   n_rnti = 0x1234;
@@ -157,14 +166,54 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
                                              0,
                                              harq_process_ul_ue->Nl);
 
+    uint8_t access_mode = SCHEDULED_ACCESS;
+
     //-----------------------------------------------------//
     // to be removed later when MAC is ready
 
     if (harq_process_ul_ue != NULL){
-      for (i = 0; i < harq_process_ul_ue->TBS / 8; i++) {
-        harq_process_ul_ue->a[i] = (unsigned char) rand();
-	//printf("input encoder a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
-      }
+
+    	if (IS_SOFTMODEM_NOS1){
+    		data_existing = nr_ue_get_sdu(UE->Mod_id, UE->CC_id, frame,
+    				slot, 0, ulsch_input_buffer, harq_process_ul_ue->TBS/8, &access_mode);
+    		//IP traffic to be transmitted
+    		if(data_existing){
+    			//harq_process_ul_ue->a = (unsigned char*)calloc(harq_process_ul_ue->TBS/8, sizeof(unsigned char));
+    			memcpy(harq_process_ul_ue->a, ulsch_input_buffer, harq_process_ul_ue->TBS/8);
+
+    			#ifdef DEBUG_MAC_PDU
+    				LOG_I(PHY, "Printing MAC PDU to be encoded, TBS is: %d \n", harq_process_ul_ue->TBS/8);
+    				for (i = 0; i < harq_process_ul_ue->TBS / 8; i++) {
+    					printf("0x%02x",harq_process_ul_ue->a[i]);
+    				}
+    				printf("\n");
+				#endif
+    		}
+    		//Random traffic to be transmitted if there is no IP traffic available for this Tx opportunity
+    		else{
+    			//Use zeros for the header bytes in noS1 mode, in order to make sure that the LCID is not valid
+    			//and block this traffic from being forwarded to the upper layers at the gNB
+    			uint16_t payload_offset = 5;
+    			LOG_D(PHY, "Random data to be tranmsitted: \n");
+    			//Give the header bytes some dummy value in order to block the random packet at the MAC layer of the receiver
+    			for (i = 0; i<payload_offset; i++)
+    				harq_process_ul_ue->a[i] = 0;
+
+    			for (i = payload_offset; i < harq_process_ul_ue->TBS / 8; i++) {
+    				harq_process_ul_ue->a[i] = (unsigned char) rand();
+    				//printf(" input encoder a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
+    				}
+    		}
+    	}
+        //else if(uplink_counter == 0){ //if(!IS_SOFTMODEM_NOS1){
+    	else{
+        	LOG_D(PHY, "Random data to be tranmsitted: \n");
+        	for (i = 0; i < harq_process_ul_ue->TBS / 8; i++) {
+        		harq_process_ul_ue->a[i] = (unsigned char) rand();
+        		//printf(" input encoder a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
+        	}
+        	//uplink_counter++;
+        }
     } else {
       LOG_E(PHY, "[phy_procedures_nrUE_TX] harq_process_ul_ue is NULL !!\n");
       return;
@@ -175,6 +224,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
     /////////////////////////ULSCH coding/////////////////////////
     ///////////
 
+
     nr_ulsch_encoding(ulsch_ue, frame_parms, harq_pid);
 
     ///////////
@@ -219,6 +269,7 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
     ////////////////////////////////////////////////////////////////////////
 
 
+  //}
   }
 
   /////////////////////////DMRS Modulation/////////////////////////
@@ -372,10 +423,12 @@ void nr_ue_ulsch_procedures(PHY_VARS_NR_UE *UE,
     }
   }
 
+  //}
+
   ///////////
   ////////////////////////////////////////////////////////////////////////
 
-  return;
+  LOG_D(PHY, "Is data existing ?: %d \n", data_existing);
 }
 
 
@@ -406,6 +459,13 @@ uint8_t nr_ue_pusch_common_procedures(PHY_VARS_NR_UE *UE,
   if (tx_offset < 0)
     tx_offset += frame_parms->samples_per_frame;
 
+  // clear the transmit data array for the current subframe
+  /*for (int aa=0; aa<UE->frame_parms.nb_antennas_tx; aa++) {
+	  memset(&UE->common_vars.txdata[aa][tx_offset],0,UE->frame_parms.samples_per_slot*sizeof(int32_t));
+	  //memset(&UE->common_vars.txdataF[aa][tx_offset],0,UE->frame_parms.samples_per_slot*sizeof(int32_t));
+  }*/
+
+
   txdata = UE->common_vars.txdata;
   txdataF = UE->common_vars.txdataF;
 
diff --git a/openair1/SCHED/prach_procedures.c b/openair1/SCHED/prach_procedures.c
index 4f2d05ef5043095abf960e1611db6af9fcee73a8..eb9a2922c555e86fe9023ace2a1f3c85de8ee336 100644
--- a/openair1/SCHED/prach_procedures.c
+++ b/openair1/SCHED/prach_procedures.c
@@ -46,9 +46,7 @@
 
 #include <time.h>
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 
 extern int oai_nfapi_rach_ind(nfapi_rach_indication_t *rach_ind);
diff --git a/openair1/SCHED_NR/fapi_nr_l1.h b/openair1/SCHED_NR/fapi_nr_l1.h
index 5a55167c125c6faa9fb0aebf039e23d7075ac90c..07509b3bb7b846b2608048d589c50de1298727c2 100644
--- a/openair1/SCHED_NR/fapi_nr_l1.h
+++ b/openair1/SCHED_NR/fapi_nr_l1.h
@@ -48,4 +48,4 @@ void handle_nr_nfapi_pdsch_pdu(PHY_VARS_gNB *gNB,int frame,int slot,
 
 void nr_fill_rx_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, uint8_t harq_pid);
 
-void nr_fill_crc_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, uint8_t crc_flag);
\ No newline at end of file
+void nr_fill_crc_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, uint8_t crc_flag);
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index 60609bae3f46f94238f3e83c089cf7014fae08ad..a031dc0be6a76b1d4391ce3077b274317892db96 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -39,15 +39,15 @@
 #include "PHY/INIT/phy_init.h"
 #include "PHY/MODULATION/nr_modulation.h"
 #include "T.h"
+#include "executables/nr-softmodem.h"
+#include "executables/softmodem-common.h"
 
 #include "assertions.h"
 #include "msc.h"
 
 #include <time.h>
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 uint8_t SSB_Table[38]={0,2,4,6,8,10,12,14,254,254,16,18,20,22,24,26,28,30,254,254,32,34,36,38,40,42,44,46,254,254,48,50,52,54,56,58,60,62};
 
@@ -279,8 +279,14 @@ void nr_ulsch_procedures(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx, int ULSCH
         
   if (ret > gNB->ulsch[ULSCH_id][0]->max_ldpc_iterations)
     LOG_I(PHY, "ULSCH %d in error\n",ULSCH_id);
-  else
-    LOG_I(PHY, "ULSCH %d received ok\n",ULSCH_id);
+  //gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b
+  else if(gNB->ulsch[ULSCH_id][0]->harq_processes[harq_pid]->b!=NULL){
+	  LOG_I(PHY, "ULSCH received ok \n");
+	  if(IS_SOFTMODEM_NOS1){ //&& gNB->ulsch[ULSCH_id][0]->rnti == 0x1234
+	    nr_fill_crc_indication(gNB,frame_rx, slot_rx, ULSCH_id, 0);
+	    nr_fill_rx_indication(gNB, frame_rx, slot_rx, ULSCH_id, harq_pid);
+	  }
+  }
 
 }
 
@@ -292,25 +298,36 @@ void nr_fill_rx_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_
   // --------------------
 
   nfapi_rx_indication_pdu_t *pdu;
+
   int timing_advance_update;
   int sync_pos;
 
   uint16_t mu = gNB->frame_parms.numerology_index;
   // pthread_mutex_lock(&gNB->UL_INFO_mutex);
+  NR_gNB_ULSCH_t                       *ulsch                 = gNB->ulsch[ULSCH_id][0];
+  NR_UL_gNB_HARQ_t                     *harq_process          = ulsch->harq_processes[harq_pid];
+
+ pthread_mutex_lock(&gNB->UL_INFO_mutex);
 
-  // gNB->UL_INFO.rx_ind.sfn_sf                    = frame<<4| slot_rx;
-  // gNB->UL_INFO.rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG;
+ gNB->UL_INFO.rx_ind.sfn_sf                    = frame<<4| slot_rx;
+ gNB->UL_INFO.rx_ind.rx_indication_body.tl.tag = NFAPI_RX_INDICATION_BODY_TAG;
+ gNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list->rx_indication_rel8.length = gNB->ulsch[ULSCH_id][0]->harq_processes[harq_pid]->TBS>>3;
 
-  pdu = &gNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list[gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus];
+ pdu                                    = &gNB->UL_INFO.rx_ind.rx_indication_body.rx_pdu_list[gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus];
 
-  // pdu->rx_ue_information.handle          = gNB->ulsch[UE_id+1][0]->handle;
-  // pdu->rx_ue_information.tl.tag          = NFAPI_RX_UE_INFORMATION_TAG;
-  // pdu->rx_ue_information.rnti            = gNB->ulsch[UE_id+1][0]->rnti;
-  // pdu->rx_indication_rel8.tl.tag         = NFAPI_RX_INDICATION_REL8_TAG;
-  // pdu->rx_indication_rel8.length         = gNB->ulsch[UE_id+1][0]->harq_processes[harq_pid]->TBS>>3;
-  // pdu->rx_indication_rel8.offset         = 1;   // DJP - I dont understand - but broken unless 1 ????  0;  // filled in at the end of the UL_INFO formation
+ //pdu->rx_ue_information.handle          = gNB->ulsch[ULSCH_id+1][0]->handle;
+ pdu->rx_ue_information.tl.tag          = NFAPI_RX_UE_INFORMATION_TAG;
+ pdu->rx_ue_information.rnti            = gNB->ulsch[ULSCH_id][0]->rnti;
+ pdu->rx_indication_rel8.tl.tag         = NFAPI_RX_INDICATION_REL8_TAG;
+ pdu->rx_indication_rel8.offset         = 1;   // DJP - I dont understand - but broken unless 1 ????  0;  // filled in at the end of the UL_INFO formation
+ pdu->data                              = harq_process->b;//gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
+  // estimate timing advance for MAC
+  sync_pos                               = nr_est_timing_advance_pusch(gNB, ULSCH_id);
+  timing_advance_update                  = sync_pos; // - gNB->frame_parms.nb_prefix_samples/4; //to check
+  // printf("\x1B[33m" "timing_advance_update = %d\n" "\x1B[0m", timing_advance_update);
 
-  pdu->data                              = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
+
+  //  pdu->data                              = gNB->ulsch[ULSCH_id+1][0]->harq_processes[harq_pid]->b;
   sync_pos                               = nr_est_timing_advance_pusch(gNB, ULSCH_id); // estimate timing advance for MAC
   timing_advance_update                  = sync_pos * (1 << mu);                    // scale by the used scs numerology
 
@@ -335,37 +352,37 @@ void nr_fill_rx_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_
   pdu->rx_indication_rel8.timing_advance = timing_advance_update;
 
   // estimate UL_CQI for MAC (from antenna port 0 only)
-  // int SNRtimes10 = dB_fixed_times10(gNB->pusch_vars[UE_id]->ulsch_power[0]) - 300;//(10*gNB->measurements.n0_power_dB[0]);
+  int SNRtimes10 = dB_fixed_times10(gNB->pusch_vars[ULSCH_id]->ulsch_power[0]) - 300;//(10*gNB->measurements.n0_power_dB[0]);
 
-  // if      (SNRtimes10 < -640) pdu->rx_indication_rel8.ul_cqi=0;
-  // else if (SNRtimes10 >  635) pdu->rx_indication_rel8.ul_cqi=255;
-  // else                        pdu->rx_indication_rel8.ul_cqi=(640+SNRtimes10)/5;
+  if      (SNRtimes10 < -640) pdu->rx_indication_rel8.ul_cqi=0;
+  else if (SNRtimes10 >  635) pdu->rx_indication_rel8.ul_cqi=255;
+  else                        pdu->rx_indication_rel8.ul_cqi=(640+SNRtimes10)/5;
 
   // LOG_D(PHY,"[PUSCH %d] Frame %d Subframe %d Filling RX_indication with SNR %d (%d), timing_advance %d (update %d)\n",
   // harq_pid,frame,slot_rx,SNRtimes10,pdu->rx_indication_rel8.ul_cqi,pdu->rx_indication_rel8.timing_advance,
   // timing_advance_update);
 
   gNB->UL_INFO.rx_ind.rx_indication_body.number_of_pdus++;
-  // gNB->UL_INFO.rx_ind.sfn_sf = frame<<4 | slot_rx;
+  gNB->UL_INFO.rx_ind.sfn_sf = frame<<4 | slot_rx;
 
-  // pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
 }
 
-void nr_fill_crc_indication (PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, uint8_t crc_flag){
-  // pthread_mutex_lock(&gNB->UL_INFO_mutex);
-  // nfapi_crc_indication_pdu_t *pdu = &gNB->UL_INFO.crc_ind.crc_indication_body.crc_pdu_list[gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs];
-  // gNB->UL_INFO.crc_ind.sfn_sf                         = frame<<4 | subframe;
-  // gNB->UL_INFO.crc_ind.header.message_id              = NFAPI_CRC_INDICATION;
-  // gNB->UL_INFO.crc_ind.crc_indication_body.tl.tag     = NFAPI_CRC_INDICATION_BODY_TAG;
-  // pdu->instance_length = 0;     // don't know what to do with this
-  // //  pdu->rx_ue_information.handle                       = handle;
-  // pdu->rx_ue_information.tl.tag                       = NFAPI_RX_UE_INFORMATION_TAG;
-  // pdu->rx_ue_information.rnti                         = gNB->ulsch[UE_id]->rnti;
-  // pdu->crc_indication_rel8.tl.tag                     = NFAPI_CRC_INDICATION_REL8_TAG;
-  // pdu->crc_indication_rel8.crc_flag                   = crc_flag;
+void nr_fill_crc_indication (PHY_VARS_gNB *gNB, int frame, int slot_rx, int ULSCH_id,  uint8_t crc_flag) {
+  pthread_mutex_lock(&gNB->UL_INFO_mutex);
+  nfapi_crc_indication_pdu_t *pdu =   &gNB->UL_INFO. crc_ind.crc_indication_body.crc_pdu_list[gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs];
+  gNB->UL_INFO.crc_ind.sfn_sf                         = frame<<4 | slot_rx;
+  gNB->UL_INFO.crc_ind.header.message_id              = NFAPI_CRC_INDICATION;
+  gNB->UL_INFO.crc_ind.crc_indication_body.tl.tag     = NFAPI_CRC_INDICATION_BODY_TAG;
+  pdu->instance_length = 0;     // don't know what to do with this
+  //  pdu->rx_ue_information.handle                       = handle;
+  pdu->rx_ue_information.tl.tag                       = NFAPI_RX_UE_INFORMATION_TAG;
+  pdu->rx_ue_information.rnti                         = gNB->ulsch[ULSCH_id][0]->rnti;
+  pdu->crc_indication_rel8.tl.tag                     = NFAPI_CRC_INDICATION_REL8_TAG;
+  pdu->crc_indication_rel8.crc_flag                   = crc_flag;
   gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs++;
-  //LOG_D(PHY, "%s() rnti:%04x crcs:%d crc_flag:%d\n", __FUNCTION__, pdu->rx_ue_information.rnti, gNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, crc_flag);
-  // pthread_mutex_unlock(&gNB->UL_INFO_mutex);
+  //LOG_D(PHY, "%s() rnti:%04x crcs:%d crc_flag:%d\n", __FUNCTION__, pdu->rx_ue_information.rnti, eNB->UL_INFO.crc_ind.crc_indication_body.number_of_crcs, crc_flag);
+  pthread_mutex_unlock(&gNB->UL_INFO_mutex);
 }
 
 void phy_procedures_gNB_common_RX(PHY_VARS_gNB *gNB, int frame_rx, int slot_rx) {
diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
index 4aec03e25f8fa5e0b60ad4f4dc37b3228d88455e..509f4b60213bb27365d70386e3eee91545275463 100644
--- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
+++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c
@@ -74,15 +74,7 @@ fifo_dump_emos_UE emos_dump_UE;
 
 #include "common/utils/LOG/vcd_signal_dumper.h"
 #include "UTIL/OPT/opt.h"
-
-#if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-#endif
-
-//#include "PHY/defs.h"
-
-//#include "PHY/CODING/extern.h"
-
+#include "intertask_interface.h"
 #include "T.h"
 
 #define DLSCH_RB_ALLOC 0x1fbf  // skip DC RB (total 23/25 RBs)
@@ -2349,6 +2341,7 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
 
   nr_ue_ulsch_procedures(ue,
                          harq_pid,
+                         frame_tx,
                          slot_tx,
                          thread_id,
                          gNB_id);
@@ -2363,8 +2356,8 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
   } // UE_mode==PUSCH
 */
 
-
-  nr_ue_pusch_common_procedures(ue,
+	  LOG_D(PHY, "Sending data \n");
+	  nr_ue_pusch_common_procedures(ue,
                                 harq_pid,
                                 slot_tx,
                                 thread_id,
@@ -2373,6 +2366,7 @@ void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,
 
   //LOG_M("txdata.m","txs",ue->common_vars.txdata[0],1228800,1,1);
 
+
 /*
   if ((ue->UE_mode[eNB_id] == PRACH) &&
       (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) {
diff --git a/openair1/SCHED_UE/phy_procedures_lte_ue.c b/openair1/SCHED_UE/phy_procedures_lte_ue.c
index 40e354c73d6728ecb9c9c9b22e0e053fe36c7313..e0ea4ef2b28dc0144ac6c19e0ad7f336d36d0be2 100644
--- a/openair1/SCHED_UE/phy_procedures_lte_ue.c
+++ b/openair1/SCHED_UE/phy_procedures_lte_ue.c
@@ -53,11 +53,7 @@
 
 #include "common/utils/LOG/vcd_signal_dumper.h"
 #include "UTIL/OPT/opt.h"
-
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
-
+#include "intertask_interface.h"
 #include "PHY/defs_UE.h"
 
 #include "PHY/CODING/coding_extern.h"
@@ -4885,10 +4881,8 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,
                            uint8_t abstraction_flag,
                            uint8_t do_pdcch_flag,
                            runmode_t mode) {
-#if defined(ENABLE_ITTI)
   MessageDef   *msg_p;
   int           result;
-#endif
   int           frame_rx = proc->frame_rx;
   int           frame_tx = proc->frame_tx;
   int           subframe_rx = proc->subframe_rx;
@@ -4905,9 +4899,6 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,
   if ( LOG_DEBUGFLAG(UE_TIMING)) {
     start_meas(&ue->phy_proc[ue->current_thread_id[subframe_rx]]);
   }
-
-#if defined(ENABLE_ITTI)
-
   do {
     // Checks if a message has been sent to PHY sub-task
     itti_poll_msg (TASK_PHY_UE, &msg_p);
@@ -4929,8 +4920,6 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,
     }
   } while(msg_p != NULL);
 
-#endif
-
   for (slot=0; slot<2; slot++) {
     if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)||
         (ue->frame_parms.frame_type == FDD)) {
diff --git a/openair1/SIMULATION/NR_PHY/dlsim.c b/openair1/SIMULATION/NR_PHY/dlsim.c
index 07e8082cf8815bfcb1aa5ce515ce007d88db1895..c0976d254fa9b5d93376e48570a2a4e979939df9 100644
--- a/openair1/SIMULATION/NR_PHY/dlsim.c
+++ b/openair1/SIMULATION/NR_PHY/dlsim.c
@@ -98,6 +98,7 @@ int8_t nr_mac_rrc_data_ind_ue(const module_id_t     module_id,
 
 
 //Dummy Functions
+
 //lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms, unsigned char subframe) {return(SF_DL);}
 int rlc_module_init (int eNB_id) {return(0);}
 
@@ -156,7 +157,6 @@ void mac_rlc_data_ind     (
   num_tb_t                  num_tbP,
   crc_t                    *crcs_pP)
 {}
-
 // needed for some functions
 openair0_config_t openair0_cfg[MAX_CARDS];
 
diff --git a/openair1/SIMULATION/NR_PHY/pbchsim.c b/openair1/SIMULATION/NR_PHY/pbchsim.c
index 19a4a49c8a69c654ac6f12029708a7ade8b10828..f78210a0f857b8c82319e8928918189c6570799b 100644
--- a/openair1/SIMULATION/NR_PHY/pbchsim.c
+++ b/openair1/SIMULATION/NR_PHY/pbchsim.c
@@ -60,6 +60,7 @@ uint16_t NB_UE_INST = 1;
 
 // needed for some functions
 openair0_config_t openair0_cfg[MAX_CARDS];
+uint64_t get_softmodem_optmask(void) {return 0;}
 
 void nr_phy_config_request_sim_pbchsim(PHY_VARS_gNB *gNB,
                                int N_RB_DL,
diff --git a/openair2/GNB_APP/gnb_paramdef.h b/openair2/GNB_APP/gnb_paramdef.h
index 63faa141f1aff8e3680159c97666e3562e05f2d7..2d9ecb8c8a5290ebb000889ba0c936a0d12240c9 100644
--- a/openair2/GNB_APP/gnb_paramdef.h
+++ b/openair2/GNB_APP/gnb_paramdef.h
@@ -45,10 +45,8 @@
 #define GNB_CONF_STRING_OTG_APP_TYPE              "app_type"
 #define GNB_CONF_STRING_OTG_BG_TRAFFIC            "bg_traffic"
 
-#if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
 extern int asn_debug;
 extern int asn1_xer_print;
-#endif
 
 #ifdef LIBCONFIG_LONG
 #define libconfig_int long
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index 8d497c80d36505c7fb87b5e2ccc840b360163580..eef1f9c976282dc4ccfaa652c23f64e337b3bdcb 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -57,9 +57,7 @@
 /* for fair round robin SCHED */
 #include "eNB_scheduler_fairRR.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "assertions.h"
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index e85255e8ce8eba066fdb8adcf36786e41c73aad5..fb765e6dacbfb6a41b18fe4a2483840b570b52e7 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -55,14 +55,12 @@
 //#include "LAYER2/MAC/pre_processor.c"
 #include "pdcp.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "SIMULATION/TOOLS/sim.h" // for taus
 
 #include "T.h"
-
+#include "executables/softmodem-common.h"
 #include "common/ran_context.h"
 #include "LAYER2/MAC/eNB_scheduler_fairRR.h"
 
@@ -1353,28 +1351,31 @@ initiate_ra_proc(module_id_t module_idP,
 
       /* TODO: find better procedure to allocate RNTI */
       do {
-#if defined(USRP_REC_PLAY) // deterministic rnti in usrp record/playback mode
-        static int drnti[MAX_MOBILES_PER_ENB] = { 0xbda7, 0x71da, 0x9c40, 0xc350, 0x2710, 0x4e20, 0x7530, 0x1388, 0x3a98, 0x61a8, 0x88b8, 0xafc8, 0xd6d8, 0x1b58, 0x4268, 0x6978 };
-        int j = 0;
-        int nb_ue = 0;
-
-        for (j = 0; j < MAX_MOBILES_PER_ENB; j++) {
-          if (UE_RNTI(module_idP, j) > 0) {
-            nb_ue++;
-          } else {
-            break;
+        if (IS_SOFTMODEM_IQPLAYER) {  /* iq player mode, use deterministic rnti */
+          static int drnti[MAX_MOBILES_PER_ENB];
+          static int drnti_def[]={ 0xbda7, 0x71da, 0x9c40, 0xc350, 0x2710, 0x4e20, 0x7530, 0x1388, 0x3a98, 0x61a8, 0x88b8, 0xafc8, 0xd6d8, 0x1b58, 0x4268, 0x6978 };
+          for (int j=0; j<MAX_MOBILES_PER_ENB && j< (sizeof(drnti_def)/sizeof(int));j++)
+          	  drnti[i]=drnti_def[i];
+          
+          int nb_ue = 0;
+
+          for (int j = 0; j < MAX_MOBILES_PER_ENB; j++) {
+            if (UE_RNTI(module_idP, j) > 0) {
+              nb_ue++;
+            } else {
+              break;
+            }
           }
-        }
 
-        if (nb_ue >= MAX_MOBILES_PER_ENB) {
-          printf("No more free RNTI available, increase MAX_MOBILES_PER_ENB\n");
-          abort();
-        }
+          if (nb_ue >= MAX_MOBILES_PER_ENB || nb_ue >= (sizeof(drnti_def)/sizeof(int))) {
+            printf("No more free RNTI available, increase MAX_MOBILES_PER_ENB\n");
+            abort();
+          }
 
-        ra[i].rnti = drnti[nb_ue];
-#else
-        ra[i].rnti = taus();
-#endif
+          ra[i].rnti = drnti[nb_ue];
+        } else {
+          ra[i].rnti = taus();
+        }
         loop++;
       } while (loop != 100 &&
                /* TODO: this is not correct, the rnti may be in use without
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_bch.c b/openair2/LAYER2/MAC/eNB_scheduler_bch.c
index f5cd3a075363aa3bcf59b972a242d42531adc063..5b99578d57d340bd724f6d6b81c9f219d9b0994d 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_bch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_bch.c
@@ -44,9 +44,7 @@
 //#include "LAYER2/MAC/pre_processor.c"
 #include "pdcp.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #define ENABLE_MAC_PAYLOAD_DEBUG
 #define DEBUG_eNB_SCHEDULER 1
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 2a56c61a682489d1640c2e7fd5e8002c0437eafe..eba4bdcee992525d6e1ef420111962c3ed90c1ef 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -53,9 +53,7 @@
 
 #include "assertions.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include <dlfcn.h>
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_mch.c b/openair2/LAYER2/MAC/eNB_scheduler_mch.c
index e351b69bb0980e8905941e303da62a90146781fb..2953c8e70b4065b9af032b4efebe6e10909eef1a 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_mch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_mch.c
@@ -48,10 +48,6 @@
 #include "pdcp.h"
 #include "assertions.h"
 
-//#if defined(ENABLE_ITTI)
-//#include "intertask_interface.h"
-//#endif
-//
 #include "SIMULATION/TOOLS/sim.h"	// for taus
 
 #define ENABLE_MAC_PAYLOAD_DEBUG
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index 5189e769757fc79c12b18f844d6fcd6140ce2c2b..e76e6b24ba70a96d5f0140797a86c3b59ccbb2a9 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -48,10 +48,8 @@
 //#include "LAYER2/MAC/pre_processor.c"
 #include "pdcp.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
-
+#include "intertask_interface.h"
+#include "executables/softmodem-common.h"
 #include "T.h"
 
 #define ENABLE_MAC_PAYLOAD_DEBUG
@@ -2184,9 +2182,8 @@ add_new_ue(module_id_t mod_idP,
     UE_list->ordered_ULCCids[0][UE_id] = cc_idP;
     UE_list->num_UEs++;
     UE_list->active[UE_id] = TRUE;
-#if defined(USRP_REC_PLAY) // not specific to record/playback ?
-    UE_list->UE_template[cc_idP][UE_id].pre_assigned_mcs_ul = 0;
-#endif
+    if (IS_SOFTMODEM_IQPLAYER)// not specific to record/playback ?
+      UE_list->UE_template[cc_idP][UE_id].pre_assigned_mcs_ul = 0;
     UE_list->UE_template[cc_idP][UE_id].rach_resource_type = rach_resource_type;
     memset((void *) &UE_list->UE_sched_ctrl[UE_id],
            0,
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 430f73cd9d1b70f85b675f140bf0affa957a8f5d..d240e35a87f72d20a47aedd3f12917178b257cb9 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -48,9 +48,7 @@
 #include "assertions.h"
 #include "pdcp.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "ENB_APP/flexran_agent_defs.h"
 #include "flexran_agent_ran_api.h"
@@ -936,6 +934,7 @@ rx_sdu(const module_id_t enb_mod_idP,
   stop_meas(&mac->rx_ulsch_sdu);
 }
 
+
 //-----------------------------------------------------------------------------
 /*
  * Return the BSR table index corresponding to the number of bytes in input
diff --git a/openair2/LAYER2/MAC/mac_proto.h b/openair2/LAYER2/MAC/mac_proto.h
index c0ad9b176ca99697d8af2826eaf1a83f5367d03c..476fb6858482e93383222e71aaafb55d78499475 100644
--- a/openair2/LAYER2/MAC/mac_proto.h
+++ b/openair2/LAYER2/MAC/mac_proto.h
@@ -1294,3 +1294,4 @@ uint8_t ul_subframe2_k_phich(COMMON_channels_t *cc, sub_frame_t ul_subframe);
 /* MAC ITTI messaging related functions */
 /* Main loop of MAC itti message handling */
 void *mac_enb_task(void *arg);
+
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index 1244125bb683c9573eab6663cf5929454c53ae13..8518cba14c2f4307dcf00261032b07c24899f946 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -56,9 +56,7 @@
 #include "pdcp.h"
 #include "targets/RT/USER/lte-softmodem.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "assertions.h"
 
@@ -2455,10 +2453,8 @@ ue_scheduler(const module_id_t module_idP,
   struct LTE_RACH_ConfigCommon *rach_ConfigCommon =
     (struct LTE_RACH_ConfigCommon *) NULL;
   protocol_ctxt_t ctxt;
-#if defined(ENABLE_ITTI)
   MessageDef *msg_p;
   int result;
-#endif
 #if UE_TIMING_TRACE
   start_meas(&UE_mac_inst[module_idP].ue_scheduler);
 #endif
@@ -2467,7 +2463,6 @@ ue_scheduler(const module_id_t module_idP,
   PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_NO,
                                  UE_mac_inst[module_idP].crnti, txFrameP,
                                  txSubframeP, eNB_indexP);
-#if defined(ENABLE_ITTI)
 
   if(module_idP == 0) {
     do {
@@ -2497,8 +2492,6 @@ ue_scheduler(const module_id_t module_idP,
     } while (msg_p != NULL);
   }
 
-#endif
-
   //Mac_rlc_xface->frameP=frameP;
   //Rrc_xface->Frame_index=Mac_rlc_xface->frameP;
   //if (subframe%5 == 0)
diff --git a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
index 7202f2e5203bfd6a3af5e21b80df0416e4ca2648..5801fabcfb7d7e9e44ad717e08de1efa05e41cda 100644
--- a/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
+++ b/openair2/LAYER2/NR_MAC_COMMON/nr_mac.h
@@ -118,7 +118,8 @@ typedef struct {
 #define UL_SCH_LCID_CCCH                           0x00
 #define UL_SCH_LCID_SRB1                           0x01
 #define UL_SCH_LCID_SRB2                           0x02
-#define UL_SCH_LCID_SRB3                           0x03
+#define UL_SCH_LCID_DTCH						   0x03
+#define UL_SCH_LCID_SRB3                           0x04
 #define UL_SCH_LCID_CCCH_MSG3                      0x21
 #define UL_SCH_LCID_RECOMMENDED_BITRATE_QUERY      0x35
 #define UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT          0x36
@@ -132,5 +133,10 @@ typedef struct {
 #define UL_SCH_LCID_L_BSR                          0x3E
 #define UL_SCH_LCID_PADDING                        0x3F
 
+#define NR_MAX_NUM_LCID							   32
+#define NR_MAX_NUM_LCGID							8
+#define MAX_RLC_SDU_SUBHEADER_SIZE					3
+
 
 #endif /*__LAYER2_MAC_H__ */
+
diff --git a/openair2/LAYER2/NR_MAC_UE/mac_defs.h b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
index 37d1b1216dc766e96a02e3b37143f069b9dd42f4..4cf39bcfdb20817417feed6805d5d40260c3748a 100755
--- a/openair2/LAYER2/NR_MAC_UE/mac_defs.h
+++ b/openair2/LAYER2/NR_MAC_UE/mac_defs.h
@@ -52,8 +52,14 @@
 #include "NR_IF_Module.h"
 #include "../NR_MAC_gNB/nr_mac_common.h"
 #include "PHY/defs_nr_common.h"
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
 
 #define NB_NR_UE_MAC_INST 1
+/*!\brief Maximum number of logical channl group IDs */
+
+
+/*!\brief value for indicating BSR Timer is not running */
+#define NR_MAC_UE_BSR_TIMER_NOT_RUNNING   (0xFFFF)
 
 typedef enum {
     SFN_C_MOD_2_EQ_0, 
@@ -61,6 +67,68 @@ typedef enum {
     SFN_C_IMPOSSIBLE
 } SFN_C_TYPE;
 
+// LTE structure, might need to be adapted for NR
+typedef struct {
+  /// buffer status for each lcgid
+  uint8_t  BSR[NR_MAX_NUM_LCGID]; // should be more for mesh topology
+  /// keep the number of bytes in rlc buffer for each lcgid
+  int32_t  BSR_bytes[NR_MAX_NUM_LCGID];
+  /// after multiplexing buffer remain for each lcid
+  int32_t  LCID_buffer_remain[NR_MAX_NUM_LCID];
+  /// sum of all lcid buffer size
+  uint16_t  All_lcid_buffer_size_lastTTI;
+  /// buffer status for each lcid
+  uint8_t  LCID_status[NR_MAX_NUM_LCID];
+  /// SR pending as defined in 36.321
+  uint8_t  SR_pending;
+  /// SR_COUNTER as defined in 36.321
+  uint16_t SR_COUNTER;
+  /// logical channel group ide for each LCID
+  uint8_t  LCGID[NR_MAX_NUM_LCID];
+  /// retxBSR-Timer, default value is sf2560
+  uint16_t retxBSR_Timer;
+  /// retxBSR_SF, number of subframe before triggering a regular BSR
+  uint16_t retxBSR_SF;
+  /// periodicBSR-Timer, default to infinity
+  uint16_t periodicBSR_Timer;
+  /// periodicBSR_SF, number of subframe before triggering a periodic BSR
+  uint16_t periodicBSR_SF;
+  /// default value is 0: not configured
+  uint16_t sr_ProhibitTimer;
+  /// sr ProhibitTime running
+  uint8_t sr_ProhibitTimer_Running;
+  ///  default value to n5
+  uint16_t maxHARQ_Tx;
+  /// default value is false
+  uint16_t ttiBundling;
+  /// default value is release
+  struct DRX_Config *drx_config;
+  /// default value is release
+  struct MAC_MainConfig__phr_Config *phr_config;
+  ///timer before triggering a periodic PHR
+  uint16_t periodicPHR_Timer;
+  ///timer before triggering a prohibit PHR
+  uint16_t prohibitPHR_Timer;
+  ///DL Pathloss change value
+  uint16_t PathlossChange;
+  ///number of subframe before triggering a periodic PHR
+  int16_t periodicPHR_SF;
+  ///number of subframe before triggering a prohibit PHR
+  int16_t prohibitPHR_SF;
+  ///DL Pathloss Change in db
+  uint16_t PathlossChange_db;
+
+  /// default value is false
+  uint16_t extendedBSR_Sizes_r10;
+  /// default value is false
+  uint16_t extendedPHR_r10;
+
+  //Bj bucket usage per  lcid
+  int16_t Bj[NR_MAX_NUM_LCID];
+  // Bucket size per lcid
+  int16_t bucket_size[NR_MAX_NUM_LCID];
+} NR_UE_SCHEDULING_INFO;
+
 
 #define MAX_NUM_BWP 2
 
@@ -99,6 +167,7 @@ typedef struct {
   RA_state_t ra_state;
   ///     RA-rnti
   uint16_t ra_rnti;
+  uint16_t crnti;
 
   ///     Temporary CRNTI
   uint16_t t_crnti;
@@ -114,6 +183,13 @@ typedef struct {
   nr_ue_if_module_t       *if_module;
   nr_scheduled_response_t scheduled_response;
   nr_phy_config_t         phy_config;
+
+  /// BSR report flag management
+  uint8_t BSR_reporting_active;
+  NR_UE_SCHEDULING_INFO   scheduling_info;
+
+  /// PHR
+  uint8_t PHR_reporting_active;
 } NR_UE_MAC_INST_t;
 
 typedef enum seach_space_mask_e {
diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
index e4ead72dae13ffe3729a3873a1caa7f3047128a8..d62a763a227bcb65fb30bc369e17780f245293f2 100644
--- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
+++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c
@@ -54,10 +54,13 @@
 #include "executables/softmodem-common.h"
 /* log utils */
 #include "common/utils/LOG/log.h"
+#include "SIMULATION/TOOLS/sim.h" // for taus
+#include "openair2/LAYER2/NR_MAC_COMMON/nr_mac.h"
 #include "common/utils/LOG/vcd_signal_dumper.h"
 
 #include <stdio.h>
 #include <math.h>
+//int mbms_rab_id = 2047;
 
 //#define ENABLE_MAC_PAYLOAD_DEBUG 1
 #define DEBUG_EXTRACT_DCI 1
@@ -3293,7 +3296,204 @@ void nr_ue_process_mac_pdu(module_id_t module_idP,
         }
         pdu_ptr += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
         pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
-
         AssertFatal(pdu_len >= 0, "[MAC] nr_ue_process_mac_pdu, residual mac pdu length < 0!\n");
     }
 }
+
+//---------------------------------------------------------------------------------
+
+
+uint16_t
+nr_generate_ulsch_pdu(uint8_t *mac_pdu,
+					  uint8_t *sdus_payload,
+                      uint8_t num_sdus,
+                      uint16_t *sdu_lengths,
+                      uint8_t *sdu_lcids,
+                      uint16_t *crnti,
+                      uint16_t buflen) {
+
+	NR_MAC_SUBHEADER_FIXED *mac_pdu_ptr = (NR_MAC_SUBHEADER_FIXED *) mac_pdu;
+	unsigned char * ulsch_buffer_ptr = sdus_payload;
+	uint8_t last_size=0;
+	uint16_t sdu_length_total=0;
+	int i;
+	int offset=0;
+
+	  // 2) Generation of ULSCH MAC SDU subheaders
+	  for (i = 0; i < num_sdus; i++) {
+	    LOG_D(MAC, "[gNB] Generate ULSCH header num sdu %d len sdu %d\n", num_sdus, sdu_lengths[i]);
+
+	    if (sdu_lengths[i] < 128) {
+	      ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->R = 0;
+	      ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->F = 0;
+	      ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->LCID = sdu_lcids[i];
+	      ((NR_MAC_SUBHEADER_SHORT *) mac_pdu_ptr)->L = (unsigned char) sdu_lengths[i];
+	      last_size = 2;
+	    } else {
+	      ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->R = 0;
+	      ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->F = 1;
+	      ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->LCID = sdu_lcids[i];
+	      ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L1 = ((unsigned short) sdu_lengths[i] >> 8) & 0x7f;
+	      ((NR_MAC_SUBHEADER_LONG *) mac_pdu_ptr)->L2 = (unsigned short) sdu_lengths[i] & 0xff;
+	      last_size = 3;
+	    }
+
+	    mac_pdu_ptr += last_size;
+
+	    // 3) cycle through SDUs, compute each relevant and place dlsch_buffer in
+	    memcpy((void *) mac_pdu_ptr, (void *) ulsch_buffer_ptr, sdu_lengths[i]);
+	    ulsch_buffer_ptr+= sdu_lengths[i];
+	    sdu_length_total+= sdu_lengths[i];
+	    mac_pdu_ptr += sdu_lengths[i];
+	  }
+
+	  offset = ((unsigned char *) mac_pdu_ptr - mac_pdu);
+
+	  // 4) Compute final offset for padding
+	  uint16_t padding_bytes = buflen - offset;
+	  LOG_D(MAC, "Number of padding bytes: %d \n", padding_bytes);
+	  if (padding_bytes > 0) {
+	    ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->R = 0;
+	    ((NR_MAC_SUBHEADER_FIXED *) mac_pdu_ptr)->LCID = UL_SCH_LCID_PADDING;
+	    mac_pdu_ptr++;
+
+	  } else {
+	    // no MAC subPDU with padding
+	  }
+
+  return offset;
+}
+
+
+uint8_t
+nr_ue_get_sdu(module_id_t module_idP, int CC_id, frame_t frameP,
+           sub_frame_t subframe, uint8_t eNB_index,
+           uint8_t *ulsch_buffer, uint16_t buflen, uint8_t *access_mode) {
+  uint8_t total_rlc_pdu_header_len = 0;
+  int16_t buflen_remain = 0;
+  uint8_t lcid = 0;
+  uint16_t sdu_lengths[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+  uint8_t sdu_lcids[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+  uint16_t payload_offset = 0, num_sdus = 0;
+  uint8_t ulsch_sdus[MAX_ULSCH_PAYLOAD_BYTES];
+  uint16_t sdu_length_total = 0;
+  //unsigned short post_padding = 0;
+
+  rlc_buffer_occupancy_t lcid_buffer_occupancy_old =
+    0, lcid_buffer_occupancy_new = 0;
+  LOG_D(MAC,
+        "[UE %d] MAC PROCESS UL TRANSPORT BLOCK at frame%d subframe %d TBS=%d\n",
+        module_idP, frameP, subframe, buflen);
+  AssertFatal(CC_id == 0,
+              "Transmission on secondary CCs is not supported yet\n");
+#if UE_TIMING_TRACE
+  start_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu);
+#endif
+
+  //NR_UE_MAC_INST_t *nr_ue_mac_inst = get_mac_inst(0);
+
+  // Check for DCCH first
+  // TO DO: Multiplex in the order defined by the logical channel prioritization
+  for (lcid = UL_SCH_LCID_SRB1;
+       lcid < NR_MAX_NUM_LCID; lcid++) {
+
+      lcid_buffer_occupancy_old =
+    		  //TODO: Replace static value with CRNTI
+        mac_rlc_get_buffer_occupancy_ind(module_idP,
+        								 0x1234, eNB_index, frameP, //nr_ue_mac_inst->crnti
+                                         subframe, ENB_FLAG_NO,
+                                         lcid);
+      lcid_buffer_occupancy_new = lcid_buffer_occupancy_old;
+
+      if(lcid_buffer_occupancy_new){
+
+        buflen_remain =
+          buflen - (total_rlc_pdu_header_len + sdu_length_total + MAX_RLC_SDU_SUBHEADER_SIZE);
+        LOG_D(MAC,
+              "[UE %d] Frame %d : UL-DXCH -> ULSCH, RLC %d has %d bytes to "
+              "send (Transport Block size %d SDU Length Total %d , mac header len %d, buflen_remain %d )\n", //BSR byte before Tx=%d
+              module_idP, frameP, lcid, lcid_buffer_occupancy_new,
+              buflen, sdu_length_total,
+              total_rlc_pdu_header_len, buflen_remain); // ,nr_ue_mac_inst->scheduling_info.BSR_bytes[nr_ue_mac_inst->scheduling_info.LCGID[lcid]]
+
+        while(buflen_remain > 0 && lcid_buffer_occupancy_new){
+
+        //TODO: Replace static value with CRNTI
+        sdu_lengths[num_sdus] = mac_rlc_data_req(module_idP,
+        						0x1234, eNB_index, //nr_ue_mac_inst->crnti
+                                frameP,
+                                ENB_FLAG_NO,
+                                MBMS_FLAG_NO,
+                                lcid,
+                                buflen_remain,
+                                (char *)&ulsch_sdus[sdu_length_total],0,
+                                0
+                                                );
+        AssertFatal(buflen_remain >= sdu_lengths[num_sdus],
+                    "LCID=%d RLC has segmented %d bytes but MAC has max=%d\n",
+                    lcid, sdu_lengths[num_sdus], buflen_remain);
+
+        if (sdu_lengths[num_sdus]) {
+          sdu_length_total += sdu_lengths[num_sdus];
+          sdu_lcids[num_sdus] = lcid;
+
+
+          //Update total MAC Header size for RLC PDUs
+          /*if(sdu_lengths[num_sdus]<128)
+        	  total_rlc_pdu_header_len += 2;
+          else
+        	  total_rlc_pdu_header_len += 3;*/
+
+          total_rlc_pdu_header_len += MAX_RLC_SDU_SUBHEADER_SIZE; //rlc_pdu_header_len_last;
+
+          //Update number of SDU
+          num_sdus++;
+        }
+
+        /* Get updated BO after multiplexing this PDU */
+        //TODO: Replace static value with CRNTI
+
+        lcid_buffer_occupancy_new =
+          mac_rlc_get_buffer_occupancy_ind(module_idP,
+                                           0x1234, //nr_ue_mac_inst->crnti
+                                           eNB_index, frameP,
+                                           subframe, ENB_FLAG_NO,
+                                           lcid);
+        buflen_remain =
+                  buflen - (total_rlc_pdu_header_len + sdu_length_total + MAX_RLC_SDU_SUBHEADER_SIZE);
+        }
+  }
+
+}
+
+  // Generate ULSCH PDU
+  if (num_sdus>0) {
+  payload_offset = nr_generate_ulsch_pdu(ulsch_buffer,  // mac header
+		  	  	  	  	  	  	  	  	 ulsch_sdus,
+                                         num_sdus,  // num sdus
+                                         sdu_lengths, // sdu length
+                                         sdu_lcids, // sdu lcid
+                                         NULL,  // crnti
+                                         buflen);  // long_bsr
+  }
+  else
+	  return 0;
+
+  // Padding: fill remainder of ULSCH with 0
+  if (buflen - payload_offset > 0){
+  	  for (int j = payload_offset; j < buflen; j++)
+  		  ulsch_buffer[j] = 0;
+  }
+
+#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
+  LOG_I(MAC, "Printing UL MAC payload UE side, payload_offset: %d \n", payload_offset);
+  for (int i = 0; i < buflen ; i++) {
+	  //harq_process_ul_ue->a[i] = (unsigned char) rand();
+	  //printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
+	  printf("%02x ",(unsigned char)ulsch_buffer[i]);
+  }
+  printf("\n");
+#endif
+
+  return 1;
+}
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
index e831b9f56824deb5c8fd7c4a00310bd4991b4610..93de38060d26779db1ad7ef4830b8ecb0ef74b3e 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler.c
@@ -55,9 +55,7 @@
 #include "flexran_agent_extern.h"
 #include "flexran_agent_mac.h"
 
-#if defined(ENABLE_ITTI)
 #include "intertask_interface.h"
-#endif
 
 #include "executables/softmodem-common.h"
 
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
index 9555e1d046abf25ead70053a7eb6fc11d24f0e29..2a36425faef5d5275eaea61eb0b586a2ff5d6662 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c
@@ -46,9 +46,7 @@
 //#include "LAYER2/MAC/pre_processor.c"
 #include "pdcp.h"
 
-#if defined(ENABLE_ITTI)
 #include "intertask_interface.h"
-#endif
 
 #define ENABLE_MAC_PAYLOAD_DEBUG
 #define DEBUG_eNB_SCHEDULER 1
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
index 8572ec4a0a6d7b7ff69d056421a20e745f63d4c1..37808dec8d90618a962db2699f3ff452cfd4249c 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_phytest.c
@@ -34,6 +34,8 @@
 #include "nr_mac_common.h"
 #include "PHY/NR_TRANSPORT/nr_dlsch.h"
 #include "PHY/NR_TRANSPORT/nr_dci.h"
+#include "executables/nr-softmodem.h"
+#include "LAYER2/NR_MAC_COMMON/nr_mac.h"
 #include "executables/softmodem-common.h"
 
 #include "NR_SCS-SpecificCarrier.h"
@@ -834,3 +836,4 @@ void nr_schedule_uss_ulsch_phytest(int Mod_idP,
   fill_dci_pdu_rel15(pdcch_pdu_rel15,&dci_pdu_rel15[0],dci_formats,rnti_types);
   
 }
+
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
index e15eb3686e426c80676f1b559a26c42a14388e48..c357f0071b339354edb2fe961ed4bc07a71fe005 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_primitives.c
@@ -51,9 +51,7 @@
 //#include "LAYER2/MAC/pre_processor.c"
 #include "pdcp.h"
 
-#if defined(ENABLE_ITTI)
 #include "intertask_interface.h"
-#endif
 
 #include "T.h"
 #include "NR_PDCCH-ConfigCommon.h"
diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
index 4ae679b8f564173e3954d29e2aa09d921731345b..34be2246b84d85112145ce025d5b73b4278b2adc 100644
--- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c
@@ -29,6 +29,203 @@
  */
 
 #include "LAYER2/NR_MAC_gNB/mac_proto.h"
+#include "executables/softmodem-common.h"
+//#define ENABLE_MAC_PAYLOAD_DEBUG 1
+
+void nr_process_mac_pdu(
+    module_id_t module_idP,
+    uint8_t CC_id,
+    frame_t frameP,
+    uint8_t *pduP,
+    uint16_t mac_pdu_len)
+{
+
+    // This function is adapting code from the old
+    // parse_header(...) and ue_send_sdu(...) functions of OAI LTE
+
+    uint8_t *pdu_ptr = pduP, rx_lcid, done = 0;
+    int pdu_len = mac_pdu_len;
+    uint16_t mac_ce_len, mac_subheader_len, mac_sdu_len;
+
+
+    //  For both DL/UL-SCH
+    //  Except:
+    //   - UL/DL-SCH: fixed-size MAC CE(known by LCID)
+    //   - UL/DL-SCH: padding
+    //   - UL-SCH:    MSG3 48-bits
+    //  |0|1|2|3|4|5|6|7|  bit-wise
+    //  |R|F|   LCID    |
+    //  |       L       |
+    //  |0|1|2|3|4|5|6|7|  bit-wise
+    //  |R|F|   LCID    |
+    //  |       L       |
+    //  |       L       |
+
+    //  For both DL/UL-SCH
+    //  For:
+    //   - UL/DL-SCH: fixed-size MAC CE(known by LCID)
+    //   - UL/DL-SCH: padding, for single/multiple 1-oct padding CE(s)
+    //   - UL-SCH:    MSG3 48-bits
+    //  |0|1|2|3|4|5|6|7|  bit-wise
+    //  |R|R|   LCID    |
+    //  LCID: The Logical Channel ID field identifies the logical channel instance of the corresponding MAC SDU or the type of the corresponding MAC CE or padding as described in Tables 6.2.1-1 and 6.2.1-2 for the DL-SCH and UL-SCH respectively. There is one LCID field per MAC subheader. The LCID field size is 6 bits;
+    //  L: The Length field indicates the length of the corresponding MAC SDU or variable-sized MAC CE in bytes. There is one L field per MAC subheader except for subheaders corresponding to fixed-sized MAC CEs and padding. The size of the L field is indicated by the F field;
+    //  F: lenght of L is 0:8 or 1:16 bits wide
+    //  R: Reserved bit, set to zero.
+
+    while (!done && pdu_len > 0){
+        mac_ce_len = 0;
+        mac_subheader_len = 1; //  default to fixed-length subheader = 1-oct
+        mac_sdu_len = 0;
+        rx_lcid = ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID;
+
+        LOG_D(MAC, "LCID received at gNB side: %d \n", rx_lcid);
+
+        switch(rx_lcid){
+            //  MAC CE
+
+            /*#ifdef DEBUG_HEADER_PARSING
+              LOG_D(MAC, "[UE] LCID %d, PDU length %d\n", ((NR_MAC_SUBHEADER_FIXED *)pdu_ptr)->LCID, pdu_len);
+            #endif*/
+
+        case UL_SCH_LCID_S_BSR:
+        	//38.321 section 6.1.3.1
+        	//fixed length
+        	mac_ce_len =1;
+        	/* Extract short BSR value */
+        	break;
+
+        case UL_SCH_LCID_S_TRUNCATED_BSR:
+        	//38.321 section 6.1.3.1
+        	//fixed length
+        	mac_ce_len =1;
+        	/* Extract short truncated BSR value */
+        	break;
+
+        case UL_SCH_LCID_L_BSR:
+        	//38.321 section 6.1.3.1
+        	//variable length
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_subheader_len = 2;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        		mac_subheader_len = 3;
+        	}
+        	/* Extract long BSR value */
+        	break;
+
+        case UL_SCH_LCID_L_TRUNCATED_BSR:
+        	//38.321 section 6.1.3.1
+        	//variable length
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_subheader_len = 2;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        		mac_subheader_len = 3;
+        	}
+        	/* Extract long truncated BSR value */
+        	break;
+
+
+        case UL_SCH_LCID_C_RNTI:
+        	//38.321 section 6.1.3.2
+        	//fixed length
+        	mac_ce_len = 2;
+        	/* Extract CRNTI value */
+        	break;
+
+        case UL_SCH_LCID_SINGLE_ENTRY_PHR:
+        	//38.321 section 6.1.3.8
+        	//fixed length
+        	mac_ce_len = 2;
+        	/* Extract SINGLE ENTRY PHR elements for PHR calculation */
+        	break;
+
+        case UL_SCH_LCID_MULTI_ENTRY_PHR_1_OCT:
+        	//38.321 section 6.1.3.9
+        	//  varialbe length
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_subheader_len = 2;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        		mac_subheader_len = 3;
+        	}
+        	/* Extract MULTI ENTRY PHR elements from single octet bitmap for PHR calculation */
+        	break;
+
+        case UL_SCH_LCID_MULTI_ENTRY_PHR_4_OCT:
+        	//38.321 section 6.1.3.9
+        	//  varialbe length
+        	mac_ce_len |= (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+        	mac_subheader_len = 2;
+        	if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
+        		mac_ce_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+        		mac_subheader_len = 3;
+        	}
+        	/* Extract MULTI ENTRY PHR elements from four octets bitmap for PHR calculation */
+        	break;
+
+        case UL_SCH_LCID_PADDING:
+        	done = 1;
+        	//  end of MAC PDU, can ignore the rest.
+        	break;
+
+        case UL_SCH_LCID_DTCH:
+                //  check if LCID is valid at current time.
+                if(((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->F){
+                    //mac_sdu_len |= (uint16_t)(((NR_MAC_SUBHEADER_LONG *)pdu_ptr)->L2)<<8;
+                    mac_subheader_len = 3;
+                    mac_sdu_len = ((uint16_t)(((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L1 & 0x7f) << 8)
+                    | ((uint16_t)((NR_MAC_SUBHEADER_LONG *) pdu_ptr)->L2 & 0xff);
+
+                } else {
+                  mac_sdu_len = (uint16_t)((NR_MAC_SUBHEADER_SHORT *)pdu_ptr)->L;
+                  mac_subheader_len = 2;
+                }
+
+                LOG_D(MAC, "[UE %d] Frame %d : DLSCH -> DL-DTCH %d (gNB %d, %d bytes)\n", module_idP, frameP, rx_lcid, module_idP, mac_sdu_len);
+
+                #if defined(ENABLE_MAC_PAYLOAD_DEBUG)
+                    LOG_T(MAC, "[UE %d] First 32 bytes of DLSCH : \n", module_idP);
+
+                    for (i = 0; i < 32; i++)
+                      LOG_T(MAC, "%x.", (pdu_ptr + mac_subheader_len)[i]);
+
+                    LOG_T(MAC, "\n");
+                #endif
+
+                if (IS_SOFTMODEM_NOS1){
+                  if (rx_lcid < NB_RB_MAX && rx_lcid >= UL_SCH_LCID_DTCH) {
+
+                    mac_rlc_data_ind(module_idP,
+                                     0x1234,
+                                     module_idP,
+                                     frameP,
+                                     ENB_FLAG_YES,
+                                     MBMS_FLAG_NO,
+                                     rx_lcid,
+                                     (char *) (pdu_ptr + mac_subheader_len),
+                                     mac_sdu_len,
+                                     1,
+                                     NULL);
+                  } else {
+                    LOG_E(MAC, "[UE %d] Frame %d : unknown LCID %d (gNB %d)\n", module_idP, frameP, rx_lcid, module_idP);
+                  }
+                }
+
+            break;
+
+        default:
+        	return;
+        	break;
+        }
+        pdu_ptr += ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+        pdu_len -= ( mac_subheader_len + mac_ce_len + mac_sdu_len );
+
+        AssertFatal(pdu_len >= 0, "[MAC] nr_process_mac_pdu, residual mac pdu length < 0!\n");
+    }
+}
+
 
 /*
 * When data are received on PHY and transmitted to MAC
@@ -66,7 +263,20 @@ void nr_rx_sdu(const module_id_t gnb_mod_idP,
           UE_id,
           ul_cqi);
 
-    if (sduP != NULL)
+#if defined(ENABLE_MAC_PAYLOAD_DEBUG)
+  LOG_I(MAC, "Printing received UL MAC payload at gNB side: %d \n");
+  for (int i = 0; i < sdu_lenP ; i++) {
+	  //harq_process_ul_ue->a[i] = (unsigned char) rand();
+	  //printf("a[%d]=0x%02x\n",i,harq_process_ul_ue->a[i]);
+	  printf("%02x ",(unsigned char)sduP[i]);
+  }
+  printf("\n");
+#endif
+
+    if (sduP != NULL){
       UE_scheduling_control->ta_update = timing_advance;
+      LOG_D(MAC, "Received PDU at MAC gNB \n");
+      nr_process_mac_pdu(gnb_mod_idP, CC_idP, frameP, sduP, sdu_lenP);
+    }
   }
 }
diff --git a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
index e0932e28e1bbfa69aa9cdbd4057dbcbf4fef8c68..d55a188817d5cab9c0b0bcb1586cff73108b4ada 100644
--- a/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
+++ b/openair2/LAYER2/NR_MAC_gNB/mac_proto.h
@@ -197,6 +197,14 @@ void config_nr_mib(int Mod_idP,
                    int cellBarred,
                    int intraFreqReselection);
 
+
+void nr_process_mac_pdu(
+    module_id_t module_idP,
+    uint8_t CC_id,
+    frame_t frameP,
+    uint8_t *pduP,
+    uint16_t mac_pdu_len);
+
 /* \brief Function to indicate a received SDU on ULSCH.
 @param Mod_id Instance ID of gNB
 @param CC_id Component carrier index
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index 88cad1890aa5aadf3478f3c7f510ec8d76126361..254d741ae89effc77383003072039540b128746f 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -2297,7 +2297,6 @@ uint64_t pdcp_module_init( uint64_t pdcp_optmask ) {
     if(UE_NAS_USE_TUN) {
       int num_if = (NFAPI_MODE == NFAPI_UE_STUB_PNF || IS_SOFTMODEM_SIML1 )?MAX_NUMBER_NETIF:1;
       netlink_init_tun("ue",num_if);
-      //Add --nr-ip-over-lte option check for next line
       if (IS_SOFTMODEM_NOS1)
     	  nas_config(1, 1, 2, "ue");
       netlink_init_mbms_tun("uem",num_if);
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
index 68f8ab5f130722d5f3b56317f8d0217135e65760..a441ff220ed8800b3ff162ae263844e2e4096af5 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_fifo.c
@@ -129,6 +129,7 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const  ctxt_pP) {
 
       ret = sendto(pdcp_pc5_sockfd, &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),
                    sizeof(sidelink_pc5s_element), 0, (struct sockaddr *)&prose_pdcp_addr,sizeof(prose_pdcp_addr) );
+
     } else if (UE_NAS_USE_TUN) {
       //ret = write(nas_sock_fd[ctxt_pP->module_id], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
        if(rb_id == mbms_rab_id){
@@ -137,18 +138,33 @@ int pdcp_fifo_flush_sdus(const protocol_ctxt_t *const  ctxt_pP) {
         }
        else
        {
-       ret = write(nas_sock_fd[ctxt_pP->module_id], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
+		#if defined(ENABLE_PDCP_PAYLOAD_DEBUG)
+    		LOG_I(PHY, "PDCP output to be sent to TUN interface: \n");
+    		for (int i = sizeof(pdcp_data_ind_header_t); i < sizeToWrite; i++) {
+    			printf("%02x ",(unsigned char)sdu_p->data[i]);
+    		}
+    		printf("\n");
+    	#endif
+    	ret = write(nas_sock_fd[ctxt_pP->module_id], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
        //LOG_I(PDCP,"[PDCP_FIFOS] ret %d TRIED TO PUSH DATA TO rb_id %d handle %d sizeToWrite %d\n",ret,rb_id,nas_sock_fd[ctxt_pP->module_id],sizeToWrite);
        }
     } else if (ENB_NAS_USE_TUN) {
-      ret = write(nas_sock_fd[0], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]),sizeToWrite );
+		#if defined(ENABLE_PDCP_PAYLOAD_DEBUG)
+    		LOG_I(PHY, "PDCP output to be sent to TUN interface: \n");
+    		for (int i = sizeof(pdcp_data_ind_header_t); i < sizeToWrite; i++) {
+    			printf("%02x ",(unsigned char)sdu_p->data[i]);
+    		}
+    		printf("\n");
+		#endif
+    	ret = write(nas_sock_fd[0], &(sdu_p->data[sizeof(pdcp_data_ind_header_t)]), sizeToWrite);
+
     } else if (PDCP_USE_NETLINK) {
       memcpy(NLMSG_DATA(nas_nlh_tx), (uint8_t *) sdu_p->data,  sizeToWrite);
       nas_nlh_tx->nlmsg_len = sizeToWrite;
       ret = sendmsg(nas_sock_fd[0],&nas_msg_tx,0);
     }  //  PDCP_USE_NETLINK
 
-    AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s)\n", errno, strerror(errno));
+    AssertFatal(ret >= 0,"[PDCP_FIFOS] pdcp_fifo_flush_sdus (errno: %d %s), nas_sock_fd[0]: %d\n", errno, strerror(errno), nas_sock_fd[0]);
     
     #if defined(ENABLE_PDCP_PAYLOAD_DEBUG)
     LOG_I(PDCP, "Printing first bytes of PDCP SDU before removing it from the list: \n");
@@ -241,6 +257,15 @@ int pdcp_fifo_read_input_sdus_fromtun (const protocol_ctxt_t *const  ctxt_pP) {
       LOG_D(PDCP, "[FRAME %5u][UE][IP][INSTANCE %u][RB %ld][--- PDCP_DATA_REQ / %d Bytes --->][PDCP][MOD %u][UE %04x][RB %ld]\n",
             ctxt.frame, ctxt.instance, rab_id, len, ctxt.module_id,
             ctxt.rnti, rab_id);
+
+#if defined  ENABLE_PDCP_PAYLOAD_DEBUG
+      LOG_I(PHY, "TUN interface output received from PDCP: \n");
+      for (int i = 0; i < 128; i++) {
+    	  printf("%02x ",(unsigned char)nl_rx_buf[i]);
+      }
+      printf("\n");
+#endif
+
       pdcp_data_req(&ctxt, SRB_FLAG_NO, rab_id, RLC_MUI_UNDEFINED,
                     RLC_SDU_CONFIRM_NO, len, (unsigned char *)nl_rx_buf,
                     PDCP_TRANSMISSION_MODE_DATA
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c
index 8f9ee0af188e93a7fdb9a15c21d0c3b0551ccf99..cb108f5d260c9f0186d00f52ce7e78b54ef3dfad 100644
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp_security.c
@@ -33,7 +33,7 @@
 #include "UTIL/OSA/osa_defs.h"
 
 #include "common/utils/LOG/vcd_signal_dumper.h"
-
+#include "executables/softmodem-common.h"
 #include "LAYER2/MAC/mac_extern.h"
 
 #include "pdcp.h"
@@ -213,28 +213,28 @@ pdcp_validate_security(
   stream_decrypt(pdcp_pP->cipheringAlgorithm,
                  &decrypt_params,
                  &buffer_decrypted);
-#if !defined(USRP_REC_PLAY)
-  if (srb_flagP) {
+  if (!IS_SOFTMODEM_IQPLAYER) {
+    if (srb_flagP) {
     /* Now check the integrity of the complete PDU */
-    decrypt_params.message    = pdcp_pdu_buffer;
-    decrypt_params.blength    = sdu_buffer_size << 3;
-    decrypt_params.key        = pdcp_pP->kRRCint + 16;// 128;
-
-    if (stream_check_integrity(pdcp_pP->integrityProtAlgorithm,
-                               &decrypt_params,
-                               &pdcp_pdu_buffer[sdu_buffer_size]) != 0) {
-      MSC_LOG_EVENT(
-    	  (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE,
-    	  " Security: failed MAC-I Algo %X UE %"PRIx16" ",
-    	  pdcp_pP->integrityProtAlgorithm,
-    	  ctxt_pP->rnti);
-      LOG_E(PDCP, "[OSA][RB %ld] %s failed to validate MAC-I (key %llx) of incoming PDU\n",
-            rb_id, (pdcp_pP->is_ue != 0) ? "UE" : "eNB",((long long unsigned int*)decrypt_params.key)[0]);
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_VALIDATE_SECURITY, VCD_FUNCTION_OUT);
-      return -1;
+      decrypt_params.message    = pdcp_pdu_buffer;
+      decrypt_params.blength    = sdu_buffer_size << 3;
+      decrypt_params.key        = pdcp_pP->kRRCint + 16;// 128;
+
+      if (stream_check_integrity(pdcp_pP->integrityProtAlgorithm,
+                                 &decrypt_params,
+                                 &pdcp_pdu_buffer[sdu_buffer_size]) != 0) {
+        MSC_LOG_EVENT(
+    	    (ctxt_pP->enb_flag == ENB_FLAG_YES) ? MSC_PDCP_ENB:MSC_PDCP_UE,
+    	    " Security: failed MAC-I Algo %X UE %"PRIx16" ",
+    	    pdcp_pP->integrityProtAlgorithm,
+    	    ctxt_pP->rnti);
+        LOG_E(PDCP, "[OSA][RB %ld] %s failed to validate MAC-I (key %llx) of incoming PDU\n",
+              rb_id, (pdcp_pP->is_ue != 0) ? "UE" : "eNB",((long long unsigned int*)decrypt_params.key)[0]);
+        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_VALIDATE_SECURITY, VCD_FUNCTION_OUT);
+        return -1;
+      }
     }
-  }
-#endif
+  } /* !IQPLAYER */
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_VALIDATE_SECURITY, VCD_FUNCTION_OUT);
 
   return 0;
diff --git a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
index ddff2cc3d1c16f925785eb4ade039bd430161bb7..02a0247a03d2e8a3c8dc0e498a364838506d33bf 100644
--- a/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
+++ b/openair2/LAYER2/RLC/AM_v9.3.0/rlc_am_status_report.c
@@ -26,9 +26,7 @@
 //-----------------------------------------------------------------------------
 #include "platform_types.h"
 //-----------------------------------------------------------------------------
-#if ENABLE_ITTI
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 #include "assertions.h"
 #include "list.h"
 #include "rlc_am.h"
diff --git a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
index 4ebd12c26f2673ef2032d28488f7490f9f45e1a0..88bde65107f5d3cf8d260175f53eb95bde85b505 100644
--- a/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
+++ b/openair2/LAYER2/nr_rlc/nr_rlc_oai_api.c
@@ -33,13 +33,13 @@
 static nr_rlc_ue_manager_t *nr_rlc_ue_manager;
 
 /* TODO: handle time a bit more properly */
-#if 0
+//#if 0
 static uint64_t nr_rlc_current_time;
 static int      nr_rlc_current_time_last_frame;
 static int      nr_rlc_current_time_last_subframe;
-#endif
+//#endif
 
-#if 0
+//#if 0
 void mac_rlc_data_ind     (
   const module_id_t         module_idP,
   const rnti_t              rntiP,
@@ -68,6 +68,9 @@ void mac_rlc_data_ind     (
   nr_rlc_manager_lock(nr_rlc_ue_manager);
   ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rntiP);
 
+  if(ue == NULL)
+	  LOG_I(RLC, "RLC instance for the given UE was not found \n");
+
   switch (channel_idP) {
   case 1 ... 2: rb = ue->srb[channel_idP - 1]; break;
   case 3 ... 7: rb = ue->drb[channel_idP - 3]; break;
@@ -75,6 +78,7 @@ void mac_rlc_data_ind     (
   }
 
   if (rb != NULL) {
+	LOG_D(RLC, "RB found! (channel ID %d) \n", channel_idP);
     rb->set_time(rb, nr_rlc_current_time);
     rb->recv_pdu(rb, buffer_pP, tb_sizeP);
   } else {
@@ -177,11 +181,11 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
   if (rb != NULL) {
     nr_rlc_entity_buffer_status_t buf_stat;
     rb->set_time(rb, nr_rlc_current_time);
-    /* 36.321 deals with BSR values up to 3000000 bytes, after what it
-     * reports '> 3000000' (table 6.1.3.1-2). Passing 4000000 is thus
+    /* 38.321 deals with BSR values up to 81338368 bytes, after what it
+     * reports '> 81338368' (table 6.1.3.1-2). Passing 100000000 is thus
      * more than enough.
      */
-    buf_stat = rb->buffer_status(rb, 4000000);
+    buf_stat = rb->buffer_status(rb, 100000000);
     ret.bytes_in_buffer = buf_stat.status_size
                         + buf_stat.retx_size
                         + buf_stat.tx_size;
@@ -199,11 +203,66 @@ mac_rlc_status_resp_t mac_rlc_status_ind(
   ret.head_sdu_is_segmented = 0;
   return ret;
 }
-#endif
+//#endif
+
+rlc_buffer_occupancy_t mac_rlc_get_buffer_occupancy_ind(
+  const module_id_t       module_idP,
+  const rnti_t            rntiP,
+  const eNB_index_t       eNB_index,
+  const frame_t           frameP,
+  const sub_frame_t       subframeP,
+  const eNB_flag_t        enb_flagP,
+  const logical_chan_id_t channel_idP)
+{
+  nr_rlc_ue_t *ue;
+  rlc_buffer_occupancy_t ret;
+  nr_rlc_entity_t *rb;
+
+  if (enb_flagP) {
+    LOG_E(RLC, "Tx mac_rlc_get_buffer_occupancy_ind function is not implemented for eNB LcId=%u\n", channel_idP);
+    exit(1);
+  }
+
+  /* TODO: handle time a bit more properly */
+  if (nr_rlc_current_time_last_frame != frameP ||
+      nr_rlc_current_time_last_subframe != subframeP) {
+    nr_rlc_current_time++;
+    nr_rlc_current_time_last_frame = frameP;
+    nr_rlc_current_time_last_subframe = subframeP;
+  }
+
+  nr_rlc_manager_lock(nr_rlc_ue_manager);
+  ue = nr_rlc_manager_get_ue(nr_rlc_ue_manager, rntiP);
+
+  switch (channel_idP) {
+  case 1 ... 2: rb = ue->srb[channel_idP - 1]; break;
+  case 3 ... 7: rb = ue->drb[channel_idP - 3]; break;
+  default:      rb = NULL;                     break;
+  }
+
+  if (rb != NULL) {
+    nr_rlc_entity_buffer_status_t buf_stat;
+    rb->set_time(rb, nr_rlc_current_time);
+    /* 38.321 deals with BSR values up to 81338368 bytes, after what it
+     * reports '> 81338368' (table 6.1.3.1-2). Passing 100000000 is thus
+     * more than enough.
+     */
+    buf_stat = rb->buffer_status(rb, 100000000);
+    ret = buf_stat.status_size
+        + buf_stat.retx_size
+        + buf_stat.tx_size;
+  } else {
+    ret = 0;
+  }
+
+  nr_rlc_manager_unlock(nr_rlc_ue_manager);
+
+  return ret;
+}
 
 int oai_emulation;
 
-#if 0
+//#if 0
 rlc_op_status_t rlc_data_req     (const protocol_ctxt_t *const ctxt_pP,
                                   const srb_flag_t   srb_flagP,
                                   const MBMS_flag_t  MBMS_flagP,
@@ -255,9 +314,9 @@ rlc_op_status_t rlc_data_req     (const protocol_ctxt_t *const ctxt_pP,
 
   return RLC_OP_STATUS_OK;
 }
-#endif
+//#endif
 
-#if 0
+//#if 0
 int rlc_module_init(int enb_flag)
 {
   static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
@@ -278,13 +337,13 @@ int rlc_module_init(int enb_flag)
 
   return 0;
 }
-#endif
+//#endif
 
-#if 0
+//#if 0
 void rlc_util_print_hex_octets(comp_name_t componentP, unsigned char *dataP, const signed long sizeP)
 {
 }
-#endif
+//#endif
 
 static void deliver_sdu(void *_ue, nr_rlc_entity_t *entity, char *buf, int size)
 {
@@ -755,7 +814,7 @@ __attribute__ ((unused)) static void add_drb(int rnti, struct LTE_DRB_ToAddMod *
   }
 }
 
-#if 0
+//#if 0
 rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP,
     const LTE_SRB_ToAddModList_t   * const srb2add_listP,
     const LTE_DRB_ToAddModList_t   * const drb2add_listP,
@@ -800,9 +859,9 @@ rlc_op_status_t rrc_rlc_config_asn1_req (const protocol_ctxt_t   * const ctxt_pP
 
   return RLC_OP_STATUS_OK;
 }
-#endif
+//#endif
 
-#if 0
+//#if 0
 rlc_op_status_t rrc_rlc_config_req   (
   const protocol_ctxt_t* const ctxt_pP,
   const srb_flag_t      srb_flagP,
@@ -861,16 +920,16 @@ rlc_op_status_t rrc_rlc_config_req   (
   nr_rlc_manager_unlock(nr_rlc_ue_manager);
   return RLC_OP_STATUS_OK;
 }
-#endif
+//#endif
 
-#if 0
+//#if 0
 void rrc_rlc_register_rrc (rrc_data_ind_cb_t rrc_data_indP, rrc_data_conf_cb_t rrc_data_confP)
 {
   /* nothing to do */
 }
-#endif
+//#endif
 
-#if 0
+//#if 0
 rlc_op_status_t rrc_rlc_remove_ue (const protocol_ctxt_t* const x)
 {
   LOG_D(RLC, "%s:%d:%s: remove UE %d\n", __FILE__, __LINE__, __FUNCTION__, x->rnti);
@@ -880,4 +939,4 @@ rlc_op_status_t rrc_rlc_remove_ue (const protocol_ctxt_t* const x)
 
   return RLC_OP_STATUS_OK;
 }
-#endif
+//#endif
diff --git a/openair2/RRC/LTE/L2_interface.c b/openair2/RRC/LTE/L2_interface.c
index 356dd2e481d54e1d767065220408b35bdc88ff98..68017be85bba9f51b06995116a5721df1307e306 100644
--- a/openair2/RRC/LTE/L2_interface.c
+++ b/openair2/RRC/LTE/L2_interface.c
@@ -37,9 +37,7 @@
 #include "msc.h"
 #include "common/ran_context.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "flexran_agent_extern.h"
 #undef C_RNTI // C_RNTI is used in F1AP generated code, prevent preprocessor replace
diff --git a/openair2/RRC/LTE/L2_interface_common.c b/openair2/RRC/LTE/L2_interface_common.c
index 20df462938f960f3f436d28c51bd97c8708c9e45..fa332b5be1e77bd84ddcb3e89e388d186334380d 100644
--- a/openair2/RRC/LTE/L2_interface_common.c
+++ b/openair2/RRC/LTE/L2_interface_common.c
@@ -37,9 +37,7 @@
 #include "msc.h"
 #include "common/ran_context.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 //#define RRC_DATA_REQ_DEBUG
 //#define DEBUG_RRC 1
@@ -135,7 +133,6 @@ rrc_data_ind(
           ctxt_pP->rnti);
   }
 
-#if defined(ENABLE_ITTI)
   {
     MessageDef *message_p;
     // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
@@ -152,11 +149,4 @@ rrc_data_ind(
     RRC_DCCH_DATA_IND (message_p).eNB_index  = ctxt_pP->eNB_index;
     itti_send_msg_to_task (ctxt_pP->enb_flag ? TASK_RRC_ENB : TASK_RRC_UE, ctxt_pP->instance, message_p);
   }
-#else
-  rrc_eNB_decode_dcch(
-    ctxt_pP,
-    DCCH_index,
-    buffer_pP,
-    sdu_sizeP);
-#endif
 }
diff --git a/openair2/RRC/LTE/L2_interface_ue.c b/openair2/RRC/LTE/L2_interface_ue.c
index c9d4e61d0ae7a19ff251dd8903c67cf3fb1d9e69..61ab63955dd529f6d492b3a837383732701521a7 100644
--- a/openair2/RRC/LTE/L2_interface_ue.c
+++ b/openair2/RRC/LTE/L2_interface_ue.c
@@ -37,9 +37,7 @@
 #include "msc.h"
 
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 //#define RRC_DATA_REQ_DEBUG
 
@@ -76,7 +74,6 @@ mac_rrc_data_req_ue(
   LOG_D(RRC,"[UE %d] Frame %d buffer_pP status %d,\n",Mod_idP,frameP, UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size);
 
   if( (UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size > 0) ) {
-#if defined(ENABLE_ITTI)
     {
       MessageDef *message_p;
       int ccch_size = UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size;
@@ -96,7 +93,6 @@ mac_rrc_data_req_ue(
 
       itti_send_msg_to_task (TASK_MAC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p);
     }
-#endif
     memcpy(&buffer_pP[0],&UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.Payload[0],UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size);
     uint8_t Ret_size=UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size;
     //   UE_rrc_inst[Mod_id].Srb0[eNB_index].Tx_buffer.payload_size=0;
@@ -138,7 +134,6 @@ mac_rrc_data_ind_ue(
 
   if(srb_idP == BCCH_SI_MBMS) {
     LOG_D(RRC,"[UE %d] Received SDU for BCCH on MBMS SRB %ld from eNB %d\n",module_idP,srb_idP,eNB_indexP);
-#if defined(ENABLE_ITTI)
     {
       MessageDef *message_p;
       int msg_sdu_size = sizeof(RRC_MAC_BCCH_MBMS_DATA_IND (message_p).sdu);
@@ -161,14 +156,10 @@ mac_rrc_data_ind_ue(
       RRC_MAC_BCCH_MBMS_DATA_IND (message_p).rsrp      = 45 /* TODO change phy to report rspp */;
       itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p);
     }
-#else
-    decode_BCCH_MBMS_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t *)sduP,sdu_lenP, 0, 0);
-#endif
   }
 
   if(srb_idP == BCCH) {
     LOG_D(RRC,"[UE %d] Received SDU for BCCH on SRB %ld from eNB %d\n",module_idP,srb_idP,eNB_indexP);
-#if defined(ENABLE_ITTI)
     {
       MessageDef *message_p;
       int msg_sdu_size = sizeof(RRC_MAC_BCCH_DATA_IND (message_p).sdu);
@@ -191,9 +182,6 @@ mac_rrc_data_ind_ue(
       RRC_MAC_BCCH_DATA_IND (message_p).rsrp      = 45 /* TODO change phy to report rspp */;
       itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p);
     }
-#else
-    decode_BCCH_DLSCH_Message(&ctxt,eNB_indexP,(uint8_t *)sduP,sdu_lenP, 0, 0);
-#endif
   }
 
   if(srb_idP == PCCH) {
@@ -204,7 +192,6 @@ mac_rrc_data_ind_ue(
   if((srb_idP & RAB_OFFSET) == CCCH) {
     if (sdu_lenP>0) {
       LOG_T(RRC,"[UE %d] Received SDU for CCCH on SRB %ld from eNB %d\n",module_idP,srb_idP & RAB_OFFSET,eNB_indexP);
-#if defined(ENABLE_ITTI)
       {
         MessageDef *message_p;
         int msg_sdu_size = CCCH_SDU_SIZE;
@@ -226,20 +213,12 @@ mac_rrc_data_ind_ue(
         RRC_MAC_CCCH_DATA_IND (message_p).rnti      = rntiP;
         itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p);
       }
-#else
-      SRB_INFO *Srb_info;
-      Srb_info = &UE_rrc_inst[module_idP].Srb0[eNB_indexP];
-      memcpy(Srb_info->Rx_buffer.Payload,sduP,sdu_lenP);
-      Srb_info->Rx_buffer.payload_size = sdu_lenP;
-      rrc_ue_decode_ccch(&ctxt, Srb_info, eNB_indexP);
-#endif
     }
   }
 
   if ((srb_idP & RAB_OFFSET) == MCCH) {
     LOG_T(RRC,"[UE %d] Frame %d: Received SDU on MBSFN sync area %d for MCCH on SRB %ld from eNB %d\n",
           module_idP,frameP, mbsfn_sync_areaP, srb_idP & RAB_OFFSET,eNB_indexP);
-#if defined(ENABLE_ITTI)
     {
       MessageDef *message_p;
       int msg_sdu_size = sizeof(RRC_MAC_MCCH_DATA_IND (message_p).sdu);
@@ -259,9 +238,6 @@ mac_rrc_data_ind_ue(
       RRC_MAC_MCCH_DATA_IND (message_p).mbsfn_sync_area = mbsfn_sync_areaP;
       itti_send_msg_to_task (TASK_RRC_UE, ctxt.instance, message_p);
     }
-#else
-    decode_MCCH_Message(&ctxt, eNB_indexP, sduP, sdu_lenP, mbsfn_sync_areaP);
-#endif
   }
 
   //TTN (for D2D)
@@ -297,7 +273,6 @@ rrc_data_req_ue(
     ctxt_pP->rnti,
     muiP,
     sdu_sizeP);
-#if defined(ENABLE_ITTI)
   {
     MessageDef *message_p;
     // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
@@ -325,18 +300,6 @@ rrc_data_req_ue(
       message_p);
     return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
   }
-#else
-  return pdcp_data_req (
-           ctxt_pP,
-           SRB_FLAG_YES,
-           rb_idP,
-           muiP,
-           confirmP,
-           sdu_sizeP,
-           buffer_pP,
-           modeP,NULL, NULL
-         );
-#endif
 }
 
 //------------------------------------------------------------------------------
@@ -352,7 +315,6 @@ rrc_data_ind_ue(
   rb_id_t    DCCH_index = Srb_id;
   LOG_I(RRC, "[UE %x] Frame %d: received a DCCH %ld message on SRB %ld with Size %d from eNB %d\n",
         ctxt_pP->module_id, ctxt_pP->frame, DCCH_index,Srb_id,sdu_sizeP,  ctxt_pP->eNB_index);
-#if defined(ENABLE_ITTI)
   {
     MessageDef *message_p;
     // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
@@ -369,20 +331,11 @@ rrc_data_ind_ue(
     RRC_DCCH_DATA_IND (message_p).eNB_index  = ctxt_pP->eNB_index;
     itti_send_msg_to_task (TASK_RRC_UE, ctxt_pP->instance, message_p);
   }
-#else
-  //#warning "LG put 0 to arg4 that is eNB index"
-  rrc_ue_decode_dcch(
-    ctxt_pP,
-    DCCH_index,
-    buffer_pP,
-    0);
-#endif
 }
 
 //-------------------------------------------------------------------------------------------//
 void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) {
   //-------------------------------------------------------------------------------------------//
-#if defined(ENABLE_ITTI)
   {
     MessageDef *message_p;
     //LOG_I(RRC,"sending a message to task_mac_ue\n");
@@ -391,14 +344,6 @@ void rrc_in_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index) {
     RRC_MAC_IN_SYNC_IND (message_p).enb_index = eNB_index;
     itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p);
   }
-#else
-  UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt=0;
-
-  if (UE_rrc_inst[Mod_idP].Info[eNB_index].T310_active==1) {
-    UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt++;
-  }
-
-#endif
 }
 
 //-------------------------------------------------------------------------------------------//
@@ -412,7 +357,6 @@ void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index
           UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt,
           UE_rrc_inst[Mod_idP].Info[eNB_index].N311_cnt);
 
-#if defined(ENABLE_ITTI)
   {
     MessageDef *message_p;
     message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_OUT_OF_SYNC_IND);
@@ -420,9 +364,6 @@ void rrc_out_of_sync_ind(module_id_t Mod_idP, frame_t frameP, uint16_t eNB_index
     RRC_MAC_OUT_OF_SYNC_IND (message_p).enb_index = eNB_index;
     itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p);
   }
-#else
-  UE_rrc_inst[Mod_idP].Info[eNB_index].N310_cnt++;
-#endif
 }
 
 //------------------------------------------------------------------------------
@@ -442,16 +383,11 @@ mac_UE_get_rrc_status(
 //-------------------------------------------------------------------------------------------//
 int mac_ue_ccch_success_ind(module_id_t Mod_idP, uint8_t eNB_index) {
   //-------------------------------------------------------------------------------------------//
-#if defined(ENABLE_ITTI)
   {
     MessageDef *message_p;
     message_p = itti_alloc_new_message (TASK_MAC_UE, RRC_MAC_CCCH_DATA_CNF);
     RRC_MAC_CCCH_DATA_CNF (message_p).enb_index = eNB_index;
     itti_send_msg_to_task (TASK_RRC_UE, UE_MODULE_ID_TO_INSTANCE(Mod_idP), message_p);
   }
-#else
-  // reset the tx buffer to indicate RRC that ccch was successfully transmitted (for example if contention resolution succeeds)
-  UE_rrc_inst[Mod_idP].Srb0[eNB_index].Tx_buffer.payload_size=0;
-#endif
   return 0;
 }
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.c b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
index 8572fcbc15fede35d17f99f13e644f67b9acbf62..583e10da94eedf7dfadc24722335425a68643f9e 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.c
@@ -89,9 +89,9 @@
 #include "LTE_MeasIdToAddModList.h"
 #include "enb_config.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+
+#include "intertask_interface.h"
+
 
 #include "common/ran_context.h"
 #include "secu_defs.h"
@@ -381,17 +381,12 @@ uint8_t do_MIB_SL(const protocol_ctxt_t *const ctxt_pP, const uint8_t eNB_index,
 }
 
 uint8_t do_SIB1_MBMS(rrc_eNB_carrier_data_t *carrier,
-                     int Mod_id,int CC_id
-#if defined(ENABLE_ITTI)
-  , RrcConfigurationReq *configuration
-#endif
+                     int Mod_id,int CC_id,
+                     RrcConfigurationReq *configuration
                     ) {
   //  SystemInformation_t systemInformation;
-#if defined(ENABLE_ITTI)
   int num_plmn = configuration->num_plmn;
-#else
-  int num_plmn = 1;
-#endif
+
   LTE_PLMN_IdentityInfo_t *PLMN_identity_info;
   LTE_MCC_MNC_Digit_t *dummy_mcc_0;
   LTE_MCC_MNC_Digit_t *dummy_mcc_1;
@@ -438,16 +433,10 @@ uint8_t do_SIB1_MBMS(rrc_eNB_carrier_data_t *carrier,
 
     if (dummy_mcc_0 == NULL || dummy_mcc_1 == NULL || dummy_mcc_2 == NULL)
       exit(1);
-
-#if defined(ENABLE_ITTI)
     *dummy_mcc_0 = (configuration->mcc[i] / 100) % 10;
     *dummy_mcc_1 = (configuration->mcc[i] / 10) % 10;
     *dummy_mcc_2 = (configuration->mcc[i] / 1) % 10;
-#else
-    *dummy_mcc_0 = 0;
-    *dummy_mcc_1 = 0;
-    *dummy_mcc_2 = 1;
-#endif
+
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mcc->list, dummy_mcc_0);
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mcc->list, dummy_mcc_1);
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mcc->list, dummy_mcc_2);
@@ -460,8 +449,6 @@ uint8_t do_SIB1_MBMS(rrc_eNB_carrier_data_t *carrier,
     if (dummy_mnc_0 == NULL || dummy_mnc_1 == NULL || dummy_mnc_2 == NULL)
       exit(1);
 
-#if defined(ENABLE_ITTI)
-
     if (configuration->mnc[i] >= 100) {
       *dummy_mnc_0 = (configuration->mnc[i] / 100) % 10;
       *dummy_mnc_1 = (configuration->mnc[i] / 10) % 10;
@@ -478,11 +465,6 @@ uint8_t do_SIB1_MBMS(rrc_eNB_carrier_data_t *carrier,
       }
     }
 
-#else
-    *dummy_mnc[i][0] = 0;
-    *dummy_mnc[i][1] = 1;
-    *dummy_mnc[i][2] = 0xf;
-#endif
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mnc.list, dummy_mnc_0);
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mnc.list, dummy_mnc_1);
 
@@ -499,36 +481,20 @@ uint8_t do_SIB1_MBMS(rrc_eNB_carrier_data_t *carrier,
 
   // 16 bits
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.trackingAreaCode_r14.buf = MALLOC(2);
-#if defined(ENABLE_ITTI)
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.trackingAreaCode_r14.buf[0] = (configuration->tac >> 8) & 0xff;
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.trackingAreaCode_r14.buf[1] = (configuration->tac >> 0) & 0xff;
-#else
-  (*sib1_MBMS)->cellAccessRelatedInfo_r14.trackingAreaCode_r14.buf[0] = 0x00;
-  (*sib1_MBMS)->cellAccessRelatedInfo_r14.trackingAreaCode_r14.buf[1] = 0x01;
-#endif
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.trackingAreaCode_r14.size=2;
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.trackingAreaCode_r14.bits_unused=0;
   // 28 bits
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf = MALLOC(8);
-#if defined(ENABLE_ITTI)
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[0] = (configuration->cell_identity >> 20) & 0xff;
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[1] = (configuration->cell_identity >> 12) & 0xff;
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[2] = (configuration->cell_identity >>  4) & 0xff;
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[3] = (configuration->cell_identity <<  4) & 0xf0;
-#else
-  (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[0] = 0x00;
-  (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[1] = 0x00;
-  (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[2] = 0x00;
-  (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.buf[3] = 0x10;
-#endif
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.size=4;
   (*sib1_MBMS)->cellAccessRelatedInfo_r14.cellIdentity_r14.bits_unused=4;
-  (*sib1_MBMS)->freqBandIndicator_r14 =
-#if defined(ENABLE_ITTI)
-    configuration->eutra_band[CC_id];
-#else
-    7;
-#endif
+  (*sib1_MBMS)->freqBandIndicator_r14 = configuration->eutra_band[CC_id];
+
   schedulingInfo->si_Periodicity_r14=LTE_SchedulingInfo__si_Periodicity_rf16;
   *sib_type = LTE_SIB_Type_MBMS_r14_sibType13_v920;
   ASN_SEQUENCE_ADD(&schedulingInfo->sib_MappingInfo_r14.list, sib_type);
@@ -827,17 +793,11 @@ LTE_DRX_Config_t *do_DrxConfig(int CC_id,
 }
 
 uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
-                int Mod_id,int CC_id, BOOLEAN_t brOption
-#if defined(ENABLE_ITTI)
-  , RrcConfigurationReq *configuration
-#endif
+                int Mod_id,int CC_id, BOOLEAN_t brOption,
+                RrcConfigurationReq *configuration
                ) {
   //  SystemInformation_t systemInformation;
-#if defined(ENABLE_ITTI)
   int num_plmn = configuration->num_plmn;
-#else
-  int num_plmn = 1;
-#endif
   LTE_PLMN_IdentityInfo_t *PLMN_identity_info;
   LTE_MCC_MNC_Digit_t *dummy_mcc_0;
   LTE_MCC_MNC_Digit_t *dummy_mcc_1;
@@ -892,15 +852,10 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
     if (dummy_mcc_0 == NULL || dummy_mcc_1 == NULL || dummy_mcc_2 == NULL)
       exit(1);
 
-#if defined(ENABLE_ITTI)
+
     *dummy_mcc_0 = (configuration->mcc[i] / 100) % 10;
     *dummy_mcc_1 = (configuration->mcc[i] / 10) % 10;
     *dummy_mcc_2 = (configuration->mcc[i] / 1) % 10;
-#else
-    *dummy_mcc_0 = 0;
-    *dummy_mcc_1 = 0;
-    *dummy_mcc_2 = 1;
-#endif
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mcc->list, dummy_mcc_0);
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mcc->list, dummy_mcc_1);
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mcc->list, dummy_mcc_2);
@@ -913,7 +868,6 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
     if (dummy_mnc_0 == NULL || dummy_mnc_1 == NULL || dummy_mnc_2 == NULL)
       exit(1);
 
-#if defined(ENABLE_ITTI)
 
     if (configuration->mnc[i] >= 100) {
       *dummy_mnc_0 = (configuration->mnc[i] / 100) % 10;
@@ -930,12 +884,6 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
         *dummy_mnc_2 = (configuration->mnc[i] / 1) % 10;
       }
     }
-
-#else
-    *dummy_mnc_0 = 0;
-    *dummy_mnc_1 = 1;
-    *dummy_mnc_2 = 0xf;
-#endif
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mnc.list, dummy_mnc_0);
     ASN_SEQUENCE_ADD(&PLMN_identity_info[i].plmn_Identity.mnc.list, dummy_mnc_1);
 
@@ -952,28 +900,16 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
 
   // 16 bits
   (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf = MALLOC(2);
-#if defined(ENABLE_ITTI)
   (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[0] = (configuration->tac >> 8) & 0xff;
   (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[1] = (configuration->tac >> 0) & 0xff;
-#else
-  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[0] = 0x00;
-  (*sib1)->cellAccessRelatedInfo.trackingAreaCode.buf[1] = 0x01;
-#endif
   (*sib1)->cellAccessRelatedInfo.trackingAreaCode.size = 2;
   (*sib1)->cellAccessRelatedInfo.trackingAreaCode.bits_unused = 0;
   // 28 bits
   (*sib1)->cellAccessRelatedInfo.cellIdentity.buf = MALLOC(8);
-#if defined(ENABLE_ITTI)
   (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[0] = (configuration->cell_identity >> 20) & 0xff;
   (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[1] = (configuration->cell_identity >> 12) & 0xff;
   (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[2] = (configuration->cell_identity >> 4) & 0xff;
   (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[3] = (configuration->cell_identity << 4) & 0xf0;
-#else
-  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[0] = 0x00;
-  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[1] = 0x00;
-  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[2] = 0x00;
-  (*sib1)->cellAccessRelatedInfo.cellIdentity.buf[3] = 0x10;
-#endif
   (*sib1)->cellAccessRelatedInfo.cellIdentity.size=4;
   (*sib1)->cellAccessRelatedInfo.cellIdentity.bits_unused=4;
   //  assign_enum(&(*sib1)->cellAccessRelatedInfo.cellBarred,SystemInformationBlockType1__cellAccessRelatedInfo__cellBarred_notBarred);
@@ -985,12 +921,7 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
   (*sib1)->cellSelectionInfo.q_RxLevMinOffset=NULL;
   //(*sib1)->p_Max = CALLOC(1, sizeof(P_Max_t));
   // *((*sib1)->p_Max) = 23;
-  (*sib1)->freqBandIndicator =
-#if defined(ENABLE_ITTI)
-    configuration->eutra_band[CC_id];
-#else
-    7;
-#endif
+  (*sib1)->freqBandIndicator = configuration->eutra_band[CC_id];
   schedulingInfo.si_Periodicity=LTE_SchedulingInfo__si_Periodicity_rf8;
   if(configuration->eMBMS_M2_configured){
        schedulingInfo2.si_Periodicity=LTE_SchedulingInfo__si_Periodicity_rf8;
@@ -1005,24 +936,12 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
          ASN_SEQUENCE_ADD(&(*sib1)->schedulingInfoList.list,&schedulingInfo2);
   }
   //  ASN_SEQUENCE_ADD(&schedulingInfo.sib_MappingInfo.list,NULL);
-#if defined(ENABLE_ITTI)
 
   if (configuration->frame_type[CC_id] == TDD)
-#endif
   {
     (*sib1)->tdd_Config =                             CALLOC(1,sizeof(struct LTE_TDD_Config));
-    (*sib1)->tdd_Config->subframeAssignment =
-#if defined(ENABLE_ITTI)
-      configuration->tdd_config[CC_id];
-#else
-      3; // +kogo this was frame_parms->tdd_config
-#endif
-    (*sib1)->tdd_Config->specialSubframePatterns =
-#if defined(ENABLE_ITTI)
-      configuration->tdd_config_s[CC_id];
-#else
-      0;
-#endif
+    (*sib1)->tdd_Config->subframeAssignment = configuration->tdd_config[CC_id];
+    (*sib1)->tdd_Config->specialSubframePatterns =  configuration->tdd_config_s[CC_id];
   }
 
   (*sib1)->si_WindowLength = LTE_SystemInformationBlockType1__si_WindowLength_ms20;
@@ -1050,8 +969,6 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
   sib1_1250->freqBandIndicatorPriority_r12 = 0; // long* // FIXME
   sib1_1250->nonCriticalExtension = NULL;
   ////Rel1310
-#if defined(ENABLE_ITTI)
-
   if ((configuration->schedulingInfoSIB1_BR_r13[CC_id] != 0) &&
       (brOption==TRUE)) {
     sib1_1250->nonCriticalExtension = calloc(1, sizeof(LTE_SystemInformationBlockType1_v1310_IEs_t));
@@ -1245,89 +1162,6 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
     sib1_1320->nonCriticalExtension = NULL;
   }
 
-#else
-  sib1_1250->nonCriticalExtension = calloc(1, sizeof(LTE_SystemInformationBlockType1_v1310_IEs_t));
-  memset(sib1_1250->nonCriticalExtension, 0, sizeof(LTE_SystemInformationBlockType1_v1310_IEs_t));
-  SystemInformationBlockType1_v1310_IEs_t *sib1_1310 = sib1_1250->nonCriticalExtension;
-  sib1_1310->hyperSFN_r13 = calloc(1, sizeof(BIT_STRING_t)); // type
-  memset(sib1_1310->hyperSFN_r13, 0, sizeof(BIT_STRING_t));
-  sib1_1310->hyperSFN_r13->buf = calloc(2, sizeof(uint8_t));
-  memset(sib1_1310->hyperSFN_r13->buf, 0, 2*sizeof(uint8_t));
-  sib1_1310->hyperSFN_r13->size = 2;
-  sib1_1310->hyperSFN_r13->bits_unused = 6;
-  sib1_1310->eDRX_Allowed_r13 = NULL; // long*
-  sib1_1310->cellSelectionInfoCE_r13 = calloc(1, sizeof(LTE_CellSelectionInfoCE_r13_t));
-  memset(sib1_1310->cellSelectionInfoCE_r13, 0, sizeof(LTE_CellSelectionInfoCE_r13_t));
-  sib1_1310->cellSelectionInfoCE_r13->q_RxLevMinCE_r13 = -70; // (Q_RxLevMin_t) long
-  sib1_1310->cellSelectionInfoCE_r13->q_QualMinRSRQ_CE_r13 = NULL; // (Q_RxLevMin_t) *long
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13
-    = calloc(1, sizeof(struct LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13));
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->si_WindowLength_BR_r13
-    = LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_WindowLength_BR_r13_ms20; // 0
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->si_RepetitionPattern_r13
-    = LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_RepetitionPattern_r13_everyRF; // 0
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->schedulingInfoList_BR_r13 = calloc(1, sizeof(LTE_SchedulingInfoList_BR_r13_t));
-  SchedulingInfo_BR_r13_t *schedulinginfo_br_13 = calloc(1, sizeof(LTE_SchedulingInfo_BR_r13_t));
-  memset(schedulinginfo_br_13, 0, sizeof(LTE_SchedulingInfo_BR_r13_t));
-  schedulinginfo_br_13->si_Narrowband_r13 = 1;
-  schedulinginfo_br_13->si_TBS_r13 = LTE_SchedulingInfo_BR_r13__si_TBS_r13_b152;
-  ASN_SEQUENCE_ADD(&sib1_1310->bandwidthReducedAccessRelatedInfo_r13->schedulingInfoList_BR_r13->list, schedulinginfo_br_13);
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_DownlinkOrTddSubframeBitmapBR_r13
-    = calloc(1, sizeof(struct LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__fdd_DownlinkOrTddSubframeBitmapBR_r13));
-  memset(sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_DownlinkOrTddSubframeBitmapBR_r13, 0,
-         sizeof(struct LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__fdd_DownlinkOrTddSubframeBitmapBR_r13));
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_DownlinkOrTddSubframeBitmapBR_r13->present
-    = LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__fdd_DownlinkOrTddSubframeBitmapBR_r13_PR_subframePattern10_r13;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_DownlinkOrTddSubframeBitmapBR_r13->choice.subframePattern10_r13.buf = calloc(2, sizeof(uint8_t));
-  memset(sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_DownlinkOrTddSubframeBitmapBR_r13->choice.subframePattern10_r13.buf, 0, 2 * sizeof(uint8_t));
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_DownlinkOrTddSubframeBitmapBR_r13->choice.subframePattern10_r13.size = 2;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_DownlinkOrTddSubframeBitmapBR_r13->choice.subframePattern10_r13.bits_unused = 6;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_UplinkSubframeBitmapBR_r13 = calloc(1, sizeof(BIT_STRING_t));
-  memset(sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_UplinkSubframeBitmapBR_r13, 0, sizeof(BIT_STRING_t));
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_UplinkSubframeBitmapBR_r13->buf = calloc(2, sizeof(uint8_t));
-  memset(sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_UplinkSubframeBitmapBR_r13->buf, 0,
-         2 * sizeof(uint8_t));
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_UplinkSubframeBitmapBR_r13->size = 2;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->fdd_UplinkSubframeBitmapBR_r13->bits_unused = 6;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->startSymbolBR_r13 = 1;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->si_HoppingConfigCommon_r13
-    = LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_HoppingConfigCommon_r13_on;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->si_ValidityTime_r13 = calloc(1, sizeof(long));
-  memset(sib1_1310->bandwidthReducedAccessRelatedInfo_r13->si_ValidityTime_r13, 0, sizeof(long));
-  *sib1_1310->bandwidthReducedAccessRelatedInfo_r13->si_ValidityTime_r13
-    = LTE_SystemInformationBlockType1_v1310_IEs__bandwidthReducedAccessRelatedInfo_r13__si_ValidityTime_r13_true;
-  sib1_1310->bandwidthReducedAccessRelatedInfo_r13->systemInfoValueTagList_r13 = calloc(1, sizeof(LTE_SystemInfoValueTagList_r13_t));
-  LTE_SystemInfoValueTagSI_r13_t *systemInfoValueTagSi_r13 = CALLOC(1, sizeof(LTE_SystemInfoValueTagSI_r13_t));
-  *systemInfoValueTagSi_r13 = 0;
-  ASN_SEQUENCE_ADD(&sib1_1310->bandwidthReducedAccessRelatedInfo_r13->systemInfoValueTagList_r13->list, systemInfoValueTagSi_r13);
-  sib1_1310->nonCriticalExtension = calloc(1, sizeof(LTE_SystemInformationBlockType1_v1320_IEs_t));
-  memset(sib1_1310->nonCriticalExtension, 0, sizeof(LTE_SystemInformationBlockType1_v1320_IEs_t));
-  /////Rel1320
-  LTE_SystemInformationBlockType1_v1320_IEs_t *sib1_1320 = sib1_1310->nonCriticalExtension;
-  sib1_1320->freqHoppingParametersDL_r13 = calloc(1, sizeof(struct LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13));
-  memset(sib1_1320->freqHoppingParametersDL_r13, 0, sizeof(struct LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13));
-  sib1_1320->freqHoppingParametersDL_r13->mpdcch_pdsch_HoppingNB_r13 = calloc(1, sizeof(long));
-  *sib1_1320->freqHoppingParametersDL_r13->mpdcch_pdsch_HoppingNB_r13 = LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__mpdcch_pdsch_HoppingNB_r13_nb2;
-  sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeA_r13 = calloc(1,
-      sizeof(struct LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeA_r13));
-  memset(sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeA_r13, 0,
-         sizeof(struct LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeA_r13));
-  sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeA_r13->present =
-    LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeA_r13_PR_interval_FDD_r13;
-  sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeA_r13->choice.interval_FDD_r13 =
-    LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeA_r13__interval_FDD_r13_int1;
-  sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeB_r13 = calloc(1,
-      sizeof(struct LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeB_r13));
-  memset(sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeB_r13, 0,
-         sizeof(struct LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeB_r13));
-  sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeB_r13->present =
-    LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeB_r13_PR_interval_FDD_r13;
-  sib1_1320->freqHoppingParametersDL_r13->interval_DLHoppingConfigCommonModeB_r13->choice.interval_FDD_r13 =
-    LTE_SystemInformationBlockType1_v1320_IEs__freqHoppingParametersDL_r13__interval_DLHoppingConfigCommonModeB_r13__interval_FDD_r13_int2;
-  sib1_1320->freqHoppingParametersDL_r13->mpdcch_pdsch_HoppingOffset_r13 = calloc(1, sizeof(long));
-  *sib1_1320->freqHoppingParametersDL_r13->mpdcch_pdsch_HoppingOffset_r13 = 1;
-  sib1_1320->nonCriticalExtension = NULL;
-#endif
   (*sib1)->si_WindowLength=LTE_SystemInformationBlockType1__si_WindowLength_ms20;
   (*sib1)->systemInfoValueTag=0;
   //  (*sib1).nonCriticalExtension = calloc(1,sizeof(*(*sib1).nonCriticalExtension));
@@ -1358,10 +1192,8 @@ uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,
 
 uint8_t do_SIB23(uint8_t Mod_id,
 
-                 int CC_id, BOOLEAN_t brOption
-#if defined(ENABLE_ITTI)
-  , RrcConfigurationReq *configuration
-#endif
+                 int CC_id, BOOLEAN_t brOption, 
+                 RrcConfigurationReq *configuration
                 ) {
   struct LTE_SystemInformation_r8_IEs__sib_TypeAndInfo__Member *sib2_part,*sib3_part;
   int eMTC_configured = configuration->eMTC_configured;
@@ -1455,7 +1287,6 @@ uint8_t do_SIB23(uint8_t Mod_id,
   (*sib2)->ac_BarringInfo = NULL;
   (*sib2)->ext1 = NULL;
   (*sib2)->ext2 = NULL;
-#if defined(ENABLE_ITTI)
   (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles                         = rrconfig->rach_numberOfRA_Preambles;
   (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig                        = NULL;
 
@@ -1846,121 +1677,7 @@ uint8_t do_SIB23(uint8_t Mod_id,
     = rrconfig->ue_TimersAndConstants_t311;
   (*sib2)->ue_TimersAndConstants.n311
     = rrconfig->ue_TimersAndConstants_n311;
-#else
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.numberOfRA_Preambles=LTE_RACH_ConfigCommon__preambleInfo__numberOfRA_Preambles_n64;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.preambleInfo.preamblesGroupAConfig = NULL;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.powerRampingStep=LTE_RACH_ConfigCommon__powerRampingParameters__powerRampingStep_dB2;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.powerRampingParameters.preambleInitialReceivedTargetPower=
-    RACH_ConfigCommon__powerRampingParameters__preambleInitialReceivedTargetPower_dBm_100;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.preambleTransMax=LTE_RACH_ConfigCommon__ra_SupervisionInfo__preambleTransMax_n10;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.ra_ResponseWindowSize=LTE_RACH_ConfigCommon__ra_SupervisionInfo__ra_ResponseWindowSize_sf10;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ra_SupervisionInfo.mac_ContentionResolutionTimer=
-    LTE_RACH_ConfigCommon__ra_SupervisionInfo__mac_ContentionResolutionTimer_sf48;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.maxHARQ_Msg3Tx = 4;
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1 = calloc(1, sizeof(struct LTE_RACH_ConfigCommon__ext1));
-  memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1, 0, sizeof(struct LTE_RACH_ConfigCommon__ext1));
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = calloc(1, sizeof(LTE_PreambleTransMax_t));
-  *(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->preambleTransMax_CE_r13 = LTE_PreambleTransMax_n5; // to be re-initialized when we find the enum
-  (*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13 = calloc(1, sizeof(LTE_RACH_CE_LevelInfoList_r13_t));
-  memset((*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13, 0, sizeof(LTE_RACH_CE_LevelInfoList_r13_t));
-  LTE_RACH_CE_LevelInfo_r13_t *rach_ce_levelinfo_r13 = calloc(1, sizeof(LTE_RACH_CE_LevelInfo_r13_t));
-  memset(rach_ce_levelinfo_r13, 0, sizeof(LTE_RACH_CE_LevelInfo_r13_t));
-  rach_ce_levelinfo_r13->preambleMappingInfo_r13.firstPreamble_r13 = 0;
-  rach_ce_levelinfo_r13->preambleMappingInfo_r13.lastPreamble_r13 = 63;
-  rach_ce_levelinfo_r13->ra_ResponseWindowSize_r13 = LTE_RACH_CE_LevelInfo_r13__ra_ResponseWindowSize_r13_sf80;
-  rach_ce_levelinfo_r13->mac_ContentionResolutionTimer_r13 = LTE_RACH_CE_LevelInfo_r13__mac_ContentionResolutionTimer_r13_sf200;
-  rach_ce_levelinfo_r13->rar_HoppingConfig_r13 = LTE_RACH_CE_LevelInfo_r13__rar_HoppingConfig_r13_off;
-  ASN_SEQUENCE_ADD(&(*sib2)->radioResourceConfigCommon.rach_ConfigCommon.ext1->rach_CE_LevelInfoList_r13->list, rach_ce_levelinfo_r13);
-  // BCCH-Config
-  (*sib2)->radioResourceConfigCommon.bcch_Config.modificationPeriodCoeff=LTE_BCCH_Config__modificationPeriodCoeff_n2;
-  // PCCH-Config
-  (*sib2)->radioResourceConfigCommon.pcch_Config.defaultPagingCycle = LTE_PCCH_Config__defaultPagingCycle_rf128;
-  (*sib2)->radioResourceConfigCommon.pcch_Config.nB=LTE_PCCH_Config__nB_oneT;
-  // PRACH-Config
-  (*sib2)->radioResourceConfigCommon.prach_Config.rootSequenceIndex = Mod_id;//0;//384;
-  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_ConfigIndex = 0;//3;
-  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.highSpeedFlag = 0;
-  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.zeroCorrelationZoneConfig = 1;//12;
-  (*sib2)->radioResourceConfigCommon.prach_Config.prach_ConfigInfo.prach_FreqOffset = 2;
-  // PDSCH-Config
-  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.referenceSignalPower=0;  // corresponds to 24.7 dBm 5 MHz/ 27.7 10 MHz/ 30.7 20 MHz
-  (*sib2)->radioResourceConfigCommon.pdsch_ConfigCommon.p_b=0;
-  // PUSCH-Config
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.n_SB=1;
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.hoppingMode=LTE_PUSCH_ConfigCommon__pusch_ConfigBasic__hoppingMode_interSubFrame;
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.pusch_HoppingOffset=0;
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.pusch_ConfigBasic.enable64QAM=0;
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupHoppingEnabled=1;
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH=0;
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled=0;
-  (*sib2)->radioResourceConfigCommon.pusch_ConfigCommon.ul_ReferenceSignalsPUSCH.cyclicShift=0;
-  // PUCCH-Config
-  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.deltaPUCCH_Shift=LTE_PUCCH_ConfigCommon__deltaPUCCH_Shift_ds1;
-  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nRB_CQI = 1;
-  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.nCS_AN = 0;
-  (*sib2)->radioResourceConfigCommon.pucch_ConfigCommon.n1PUCCH_AN = 32;
-  (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.present=LTE_SoundingRS_UL_ConfigCommon_PR_release;
-  (*sib2)->radioResourceConfigCommon.soundingRS_UL_ConfigCommon.choice.release=0;
-  // uplinkPowerControlCommon
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUSCH = -108;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.p0_NominalPUCCH = -108;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.alpha=LTE_UplinkPowerControlCommon__alpha_al1;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1=LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1_deltaF2;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format1b=LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format1b_deltaF3;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2=LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2_deltaF0;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2a=LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2a_deltaF0;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaFList_PUCCH.deltaF_PUCCH_Format2b=LTE_DeltaFList_PUCCH__deltaF_PUCCH_Format2b_deltaF0;
-  (*sib2)->radioResourceConfigCommon.uplinkPowerControlCommon.deltaPreambleMsg3 = 6;
-  (*sib2)->radioResourceConfigCommon.ul_CyclicPrefixLength=UL_CyclicPrefixLength_len1;
-  (*sib2)->radioResourceConfigCommon.ext4 = calloc(1, sizeof(struct LTE_RadioResourceConfigCommonSIB__ext4));
-  memset((*sib2)->radioResourceConfigCommon.ext4, 0, sizeof(struct LTE_RadioResourceConfigCommonSIB__ext4));
-  (*sib2)->radioResourceConfigCommon.ext4->bcch_Config_v1310 = calloc(1, sizeof(LTE_BCCH_Config_v1310_t));
-  memset((*sib2)->radioResourceConfigCommon.ext4->bcch_Config_v1310, 0, sizeof(LTE_BCCH_Config_v1310_t));
-  (*sib2)->radioResourceConfigCommon.ext4->bcch_Config_v1310->modificationPeriodCoeff_v1310 = LTE_BCCH_Config_v1310__modificationPeriodCoeff_v1310_n64;
-  (*sib2)->radioResourceConfigCommon.ext4->pcch_Config_v1310 = NULL;
-  (*sib2)->radioResourceConfigCommon.ext4->freqHoppingParameters_r13 = NULL;
-  (*sib2)->radioResourceConfigCommon.ext4->pdsch_ConfigCommon_v1310 = NULL;
-  (*sib2)->radioResourceConfigCommon.ext4->pusch_ConfigCommon_v1310 = NULL;
-  (*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310 = calloc(1, sizeof(LTE_PRACH_ConfigSIB_v1310_t));
-  memset((*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310, 0, sizeof(PRACH_ConfigSIB_v1310_t));
-  LTE_RSRP_Range_t rsrp_range = 60;
-  ASN_SEQUENCE_ADD(&(*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310->rsrp_ThresholdsPrachInfoList_r13.list, &rsrp_range);
-  (*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310->mpdcch_startSF_CSS_RA_r13 = calloc(1, sizeof(struct LTE_PRACH_ConfigSIB_v1310__mpdcch_startSF_CSS_RA_r13));
-  memset((*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310->mpdcch_startSF_CSS_RA_r13, 0, sizeof(struct LTE_PRACH_ConfigSIB_v1310__mpdcch_startSF_CSS_RA_r13));
-  (*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310->mpdcch_startSF_CSS_RA_r13->present = LTE_PRACH_ConfigSIB_v1310__mpdcch_startSF_CSS_RA_r13_PR_fdd_r13;
-  (*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310->mpdcch_startSF_CSS_RA_r13->choice.fdd_r13 = LTE_PRACH_ConfigSIB_v1310__mpdcch_startSF_CSS_RA_r13__fdd_r13_v5;
-  (*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310->prach_HoppingOffset_r13 = NULL;
-  LTE_PRACH_ParametersCE_r13_t *prach_parametersce_r13 = calloc(1, sizeof(LTE_PRACH_ParametersCE_r13_t));
-  memset(prach_parametersce_r13, 0, sizeof(LTE_PRACH_ParametersCE_r13_t));
-  prach_parametersce_r13->prach_ConfigIndex_r13 = 3;
-  prach_parametersce_r13->prach_FreqOffset_r13 = 1;
-  prach_parametersce_r13->prach_StartingSubframe_r13 = NULL;
-  prach_parametersce_r13->maxNumPreambleAttemptCE_r13 = calloc(1, sizeof(long));
-  *prach_parametersce_r13->maxNumPreambleAttemptCE_r13 = LTE_PRACH_ParametersCE_r13__maxNumPreambleAttemptCE_r13_n3;
-  prach_parametersce_r13->numRepetitionPerPreambleAttempt_r13 = LTE_PRACH_ParametersCE_r13__numRepetitionPerPreambleAttempt_r13_n1;
-  long maxavailablenarrowband = 2;
-  ASN_SEQUENCE_ADD(&prach_parametersce_r13->mpdcch_NarrowbandsToMonitor_r13.list, &maxavailablenarrowband);
-  prach_parametersce_r13->mpdcch_NumRepetition_RA_r13 = LTE_PRACH_ParametersCE_r13__mpdcch_NumRepetition_RA_r13_r1;
-  prach_parametersce_r13->prach_HoppingConfig_r13 = LTE_PRACH_ParametersCE_r13__prach_HoppingConfig_r13_off;
-  ASN_SEQUENCE_ADD(&(*sib2)->radioResourceConfigCommon.ext4->prach_ConfigCommon_v1310->prach_ParametersListCE_r13.list, prach_parametersce_r13);
-  (*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310 = calloc(1, sizeof(LTE_PUCCH_ConfigCommon_v1310_t));
-  memset((*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310, 0, sizeof(LTE_PUCCH_ConfigCommon_v1310_t));
-  (*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310->n1PUCCH_AN_InfoList_r13 = calloc(1, sizeof(LTE_N1PUCCH_AN_InfoList_r13_t));
-  long pucch_info_value1 = 0;
-  long pucch_info_value2 = 2;
-  ASN_SEQUENCE_ADD(&(*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310->n1PUCCH_AN_InfoList_r13->list, &pucch_info_value1);
-  ASN_SEQUENCE_ADD(&(*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310->n1PUCCH_AN_InfoList_r13->list, &pucch_info_value2);
-  (*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310->pucch_NumRepetitionCE_Msg4_Level0_r13 = NULL;
-  (*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310->pucch_NumRepetitionCE_Msg4_Level1_r13 = NULL;
-  (*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310->pucch_NumRepetitionCE_Msg4_Level2_r13 = NULL;
-  (*sib2)->radioResourceConfigCommon.ext4->pucch_ConfigCommon_v1310->pucch_NumRepetitionCE_Msg4_Level3_r13 = NULL;
-  (*sib2)->ue_TimersAndConstants.t300=UE_TimersAndConstants__t300_ms1000;
-  (*sib2)->ue_TimersAndConstants.t301=UE_TimersAndConstants__t301_ms1000;
-  (*sib2)->ue_TimersAndConstants.t310=UE_TimersAndConstants__t310_ms1000;
-  (*sib2)->ue_TimersAndConstants.n310=UE_TimersAndConstants__n310_n20;
-  (*sib2)->ue_TimersAndConstants.t311=UE_TimersAndConstants__t311_ms10000;
-  (*sib2)->ue_TimersAndConstants.n311=UE_TimersAndConstants__n311_n1;
-#endif
+
   (*sib2)->freqInfo.additionalSpectrumEmission = 1;
   (*sib2)->freqInfo.ul_CarrierFreq = NULL;
   (*sib2)->freqInfo.ul_Bandwidth = NULL;
@@ -2724,21 +2441,12 @@ do_RRCConnectionSetup(
   SRB1_config->rlc_Config   = SRB1_rlc_config;
   SRB1_rlc_config->present = LTE_SRB_ToAddMod__rlc_Config_PR_explicitValue;
   SRB1_rlc_config->choice.explicitValue.present=LTE_RLC_Config_PR_am;
-#if defined(ENABLE_ITTI)
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = rrc->srb1_timer_poll_retransmit;
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU          = rrc->srb1_poll_pdu;
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte         = rrc->srb1_poll_byte;
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = rrc->srb1_max_retx_threshold;
   SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering     = rrc->srb1_timer_reordering;
   SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = rrc->srb1_timer_status_prohibit;
-#else
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = LTE_T_PollRetransmit_ms20;;
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU          = LTE_PollPDU_p4;;
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte         = LTE_PollByte_kBinfinity;
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = LTE_UL_AM_RLC__maxRetxThreshold_t8;
-  SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering     = LTE_T_Reordering_ms35;
-  SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = LTE_T_StatusProhibit_ms0;
-#endif
   SRB1_lchan_config = CALLOC(1,sizeof(*SRB1_lchan_config));
   SRB1_config->logicalChannelConfig   = SRB1_lchan_config;
   SRB1_lchan_config->present = LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue;
@@ -3099,21 +2807,12 @@ uint8_t do_RRCConnectionSetup_BR(
   SRB1_config->rlc_Config  = SRB1_rlc_config; // check this
   SRB1_rlc_config->present = LTE_SRB_ToAddMod__rlc_Config_PR_explicitValue;
   SRB1_rlc_config->choice.explicitValue.present = LTE_RLC_Config_PR_am;
-#if defined(ENABLE_ITTI)
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = rrc->srb1_timer_poll_retransmit;
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU          = rrc->srb1_poll_pdu;
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte         = rrc->srb1_poll_byte;
   SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = rrc->srb1_max_retx_threshold;
   SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering     = rrc->srb1_timer_reordering;
   SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = rrc->srb1_timer_status_prohibit;
-#else
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = LTE_T_PollRetransmit_ms20; // FIXME should be 80
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU          = LTE_PollPDU_p4; // FIXME should be infinity
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte         = LTE_PollByte_kBinfinity;
-  SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = LTE_UL_AM_RLC__maxRetxThreshold_t8;
-  SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering     = LTE_T_Reordering_ms35;
-  SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = LTE_T_StatusProhibit_ms0;
-#endif
   SRB1_lchan_config = CALLOC(1, sizeof(*SRB1_lchan_config));
   SRB1_config->logicalChannelConfig = SRB1_lchan_config;
   SRB1_lchan_config->present = LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue;
@@ -3403,9 +3102,9 @@ uint8_t do_RRCConnectionSetup_BR(
   rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.sps_Config = NULL;
   rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.physicalConfigDedicated = physicalConfigDedicated2;
   // rrcConnectionSetup->criticalExtensions.choice.c1.choice.rrcConnectionSetup_r8.radioResourceConfigDedicated.mac_MainConfig = NULL;
-#ifdef XER_PRINT
-  xer_fprint(stdout, &asn_DEF_DL_CCCH_Message, (void *)&dl_ccch_msg);
-#endif
+  if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+    xer_fprint(stdout, &asn_DEF_LTE_DL_CCCH_Message, (void *)&dl_ccch_msg);
+  }
   enc_rval = uper_encode_to_buffer(&asn_DEF_LTE_DL_CCCH_Message,
                                    NULL,
                                    (void *)&dl_ccch_msg,
@@ -3413,31 +3112,8 @@ uint8_t do_RRCConnectionSetup_BR(
                                    100);
   AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
                enc_rval.failed_type->name, enc_rval.encoded);
-#if defined(ENABLE_ITTI)
-# if !defined(DISABLE_XER_SPRINT)
-  {
-    char        message_string[20000];
-    size_t      message_string_size;
-
-    if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_LTE_DL_CCCH_Message, (void *) &dl_ccch_msg)) > 0) {
-      MessageDef *msg_p;
-      msg_p = itti_alloc_new_message_sized (TASK_RRC_ENB, RRC_DL_CCCH, message_string_size + sizeof (IttiMsgText));
-      msg_p->ittiMsg.rrc_dl_ccch.size = message_string_size;
-      memcpy(&msg_p->ittiMsg.rrc_dl_ccch.text, message_string, message_string_size);
-      itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p);
-    }
-  }
-# endif
-#endif
-#ifdef USER_MODE
-  LOG_D(RRC,"RRCConnectionSetup_BR Encoded %d bits (%d bytes), ecause %d\n",
-        enc_rval.encoded,(enc_rval.encoded+7)/8,ecause);
-#endif
-  //  FREEMEM(SRB_list);
-  //  free(SRB1_config);
-  //  free(SRB1_rlc_config);
-  //  free(SRB1_lchan_config);
-  //  free(SRB1_ul_SpecificParameters);
+
+
   return((enc_rval.encoded+7)/8);
 }
 
@@ -3753,25 +3429,10 @@ uint16_t do_RRCConnectionReconfiguration_BR(const protocol_ctxt_t        *const
                                    RRC_BUF_SIZE);
   AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed %s, %lu!\n",
                enc_rval.failed_type->name, enc_rval.encoded);
-#ifdef XER_PRINT
-  xer_fprint(stdout,&asn_DEF_DL_DCCH_Message,(void *)&dl_dcch_msg);
-#endif
-#if defined(ENABLE_ITTI)
-# if !defined(DISABLE_XER_SPRINT)
-  {
-    char        message_string[30000];
-    size_t      message_string_size;
-
-    if ((message_string_size = xer_sprint(message_string, sizeof(message_string), &asn_DEF_LTE_DL_DCCH_Message, (void *) &dl_dcch_msg)) > 0) {
-      MessageDef *msg_p;
-      msg_p = itti_alloc_new_message_sized (TASK_RRC_ENB, RRC_DL_DCCH, message_string_size + sizeof (IttiMsgText));
-      msg_p->ittiMsg.rrc_dl_dcch.size = message_string_size;
-      memcpy(&msg_p->ittiMsg.rrc_dl_dcch.text, message_string, message_string_size);
-      itti_send_msg_to_task(TASK_UNKNOWN, ctxt_pP->instance, msg_p);
-    }
+  if ( LOG_DEBUGFLAG(DEBUG_ASN1) ) {
+    xer_fprint(stdout,&asn_DEF_LTE_DL_DCCH_Message,(void *)&dl_dcch_msg);
   }
-# endif
-#endif
+
   LOG_I(RRC,"RRCConnectionReconfiguration Encoded %d bits (%d bytes)\n",(int)enc_rval.encoded,(int)(enc_rval.encoded+7)/8);
   return((enc_rval.encoded+7)/8);
 }
@@ -4025,21 +3686,12 @@ do_RRCConnectionReestablishment(
     SRB1_config->rlc_Config   = SRB1_rlc_config;
     SRB1_rlc_config->present = LTE_SRB_ToAddMod__rlc_Config_PR_explicitValue;
     SRB1_rlc_config->choice.explicitValue.present=LTE_RLC_Config_PR_am;
-#if defined(ENABLE_ITTI)
     SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = rrc->srb1_timer_poll_retransmit;
     SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU          = rrc->srb1_poll_pdu;
     SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte         = rrc->srb1_poll_byte;
     SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = rrc->srb1_max_retx_threshold;
     SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering     = rrc->srb1_timer_reordering;
     SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = rrc->srb1_timer_status_prohibit;
-#else
-    SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.t_PollRetransmit = LTE_T_PollRetransmit_ms20;;
-    SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollPDU          = LTE_PollPDU_p4;;
-    SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.pollByte         = LTE_PollByte_kBinfinity;
-    SRB1_rlc_config->choice.explicitValue.choice.am.ul_AM_RLC.maxRetxThreshold = LTE_UL_AM_RLC__maxRetxThreshold_t8;
-    SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_Reordering     = LTE_T_Reordering_ms35;
-    SRB1_rlc_config->choice.explicitValue.choice.am.dl_AM_RLC.t_StatusProhibit = LTE_T_StatusProhibit_ms0;
-#endif
     SRB1_lchan_config = CALLOC(1, sizeof(*SRB1_lchan_config));
     SRB1_config->logicalChannelConfig = SRB1_lchan_config;
     SRB1_lchan_config->present = LTE_SRB_ToAddMod__logicalChannelConfig_PR_explicitValue;
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg.h b/openair2/RRC/LTE/MESSAGES/asn1_msg.h
index 34b29093949264e441582680051835cd3a611661..dda23406100c0d1652ca0d096bff624c441fbf1c 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg.h
@@ -91,10 +91,8 @@ LTE_DRX_Config_t *do_DrxConfig(int CC_id, RrcConfigurationReq *configuration, LT
 @param br_flag Do for BL/CE UE configuration
 @return size of encoded bit stream in bytes*/
 
-uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,int Mod_id,int CC_id, BOOLEAN_t brOption
-#if defined(ENABLE_ITTI)
-  ,RrcConfigurationReq *configuration
-#endif
+uint8_t do_SIB1(rrc_eNB_carrier_data_t *carrier,int Mod_id,int CC_id, BOOLEAN_t brOption,
+  RrcConfigurationReq *configuration
                );
 
 /**
@@ -120,10 +118,8 @@ uint8_t do_SIB1_MBMS(rrc_eNB_carrier_data_t *carrier,int Mod_id,int CC_id, RrcCo
 @param MBMS_flag Indicates presence of MBMS system information (when 1)
 @return size of encoded bit stream in bytes*/
 
-uint8_t do_SIB23(uint8_t Mod_id,int CC_id, BOOLEAN_t brOption
-#if defined(ENABLE_ITTI)
-  , RrcConfigurationReq *configuration
-#endif
+uint8_t do_SIB23(uint8_t Mod_id,int CC_id, BOOLEAN_t brOption,
+  RrcConfigurationReq *configuration
                 );
 
 /**
diff --git a/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c b/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c
index 480f5c35163bb94c69c8af5c21c904b84a650af3..350a8baf77faec3e25b78207c1a46b51488f349f 100644
--- a/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c
+++ b/openair2/RRC/LTE/MESSAGES/asn1_msg_NB_IoT.c
@@ -68,10 +68,8 @@
 
 //#include "PHY/defs.h"
 #include "enb_config.h"
+#include "intertask_interface.h"
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
 
 
 
@@ -178,21 +176,15 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id,
   memset(PLMN_identity_info_NB_IoT.plmn_Identity_r13.mcc,0,sizeof(*PLMN_identity_info_NB_IoT.plmn_Identity_r13.mcc));
   asn_set_empty(&PLMN_identity_info_NB_IoT.plmn_Identity_r13.mcc->list);//.size=0;
   //left as it is???
-#if defined(ENABLE_ITTI)
+
   dummy_mcc[0] = (configuration->mcc / 100) % 10;
   dummy_mcc[1] = (configuration->mcc / 10) % 10;
   dummy_mcc[2] = (configuration->mcc / 1) % 10;
-#else
-  dummy_mcc[0] = 0;
-  dummy_mcc[1] = 0;
-  dummy_mcc[2] = 1;
-#endif
   ASN_SEQUENCE_ADD(&PLMN_identity_info_NB_IoT.plmn_Identity_r13.mcc->list,&dummy_mcc[0]);
   ASN_SEQUENCE_ADD(&PLMN_identity_info_NB_IoT.plmn_Identity_r13.mcc->list,&dummy_mcc[1]);
   ASN_SEQUENCE_ADD(&PLMN_identity_info_NB_IoT.plmn_Identity_r13.mcc->list,&dummy_mcc[2]);
   PLMN_identity_info_NB_IoT.plmn_Identity_r13.mnc.list.size=0;
   PLMN_identity_info_NB_IoT.plmn_Identity_r13.mnc.list.count=0;
-#if defined(ENABLE_ITTI)
 
   if (configuration->mnc >= 100) {
     dummy_mnc[0] = (configuration->mnc / 100) % 10;
@@ -210,11 +202,6 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id,
     }
   }
 
-#else
-  dummy_mnc[0] = 0;
-  dummy_mnc[1] = 1;
-  dummy_mnc[2] = 0xf;
-#endif
   ASN_SEQUENCE_ADD(&PLMN_identity_info_NB_IoT.plmn_Identity_r13.mnc.list,&dummy_mnc[0]);
   ASN_SEQUENCE_ADD(&PLMN_identity_info_NB_IoT.plmn_Identity_r13.mnc.list,&dummy_mnc[1]);
 
@@ -230,28 +217,16 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id,
   // 16 bits = 2 byte
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.trackingAreaCode_r13.buf = MALLOC(2); //MALLOC works in byte
   //lefts as it is?
-#if defined(ENABLE_ITTI)
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.trackingAreaCode_r13.buf[0] = (configuration->tac >> 8) & 0xff;
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.trackingAreaCode_r13.buf[1] = (configuration->tac >> 0) & 0xff;
-#else
-  (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.trackingAreaCode_r13.buf[0] = 0x00;
-  (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.trackingAreaCode_r13.buf[1] = 0x01;
-#endif
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.trackingAreaCode_r13.size=2;
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.trackingAreaCode_r13.bits_unused=0;
   // 28 bits --> i have to use 32 bits = 4 byte
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf = MALLOC(8); // why allocate 8 byte?
-#if defined(ENABLE_ITTI)
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[0] = (configuration->cell_identity >> 20) & 0xff;
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[1] = (configuration->cell_identity >> 12) & 0xff;
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[2] = (configuration->cell_identity >>  4) & 0xff;
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[3] = (configuration->cell_identity <<  4) & 0xf0;
-#else
-  (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[0] = 0x00;
-  (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[1] = 0x00;
-  (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[2] = 0x00;
-  (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.buf[3] = 0x10;
-#endif
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.size=4;
   (*sib1_NB_IoT)->cellAccessRelatedInfo_r13.cellIdentity_r13.bits_unused=4;
   //Still set to "notBarred" as in the previous case
@@ -264,11 +239,8 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id,
   *((*sib1_NB_IoT)->p_Max_r13) = 23;
   //FIXME
   (*sib1_NB_IoT)->freqBandIndicator_r13 =
-#if defined(ENABLE_ITTI)
     configuration->eutra_band;
-#else
-    5; //if not configured we use band 5 (UL: 824 MHz - 849MHz / DL: 869 MHz - 894 MHz  FDD mode)
-#endif
+
   //OPTIONAL new parameters, to be used?
   /*
    * freqBandInfo_r13
@@ -305,10 +277,8 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id,
   ASN_SEQUENCE_ADD(&schedulingInfo_NB_IoT[0].sib_MappingInfo_r13.list,&sib_type_NB_IoT[0]);
   ASN_SEQUENCE_ADD(&(*sib1_NB_IoT)->schedulingInfoList_r13.list,&schedulingInfo_NB_IoT[0]);
   //printf("[ASN Debug] SI P: %ld\n",(*sib1_NB_IoT)->schedulingInfoList_r13.list.array[0]->si_Periodicity_r13);
-#if defined(ENABLE_ITTI)
 
   if (configuration->frame_type == TDD)
-#endif
   {
     //FIXME in NB-IoT mandatory to be FDD --> so must give an error
     LOG_E(RRC,"[NB-IoT %d] Frame Type is TDD --> not supported by NB-IoT, exiting\n", Mod_id); //correct?
@@ -342,9 +312,7 @@ uint8_t do_SIB1_NB_IoT(uint8_t Mod_id, int CC_id,
           enc_rval.failed_type->name, enc_rval.encoded);
   }
 
-#ifdef USER_MODE
   LOG_D(RRC,"[NB-IoT] SystemInformationBlockType1-NB Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
-#endif
 
   if (enc_rval.encoded==-1) {
     return(-1);
@@ -563,10 +531,9 @@ uint8_t do_SIB23_NB_IoT(uint8_t Mod_id,
                                    900);
   //  AssertFatal (enc_rval.encoded > 0, "ASN1 message encoding failed (%s, %lu)!\n",
   //               enc_rval.failed_type->name, enc_rval.encoded);
-  //#if defined(ENABLE_ITTI).....
-#ifdef USER_MODE
+
   LOG_D(RRC,"[NB-IoT] SystemInformation-NB Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
-#endif
+
 
   if (enc_rval.encoded==-1) {
     msg("[RRC] ASN1 : SI-NB encoding failed for SIB23_NB_IoT\n");
@@ -748,10 +715,8 @@ uint8_t do_RRCConnectionSetup_NB_IoT(
           enc_rval.failed_type->name, enc_rval.encoded);
   }
 
-#ifdef USER_MODE
-  LOG_D(RRC,"RRCConnectionSetup-NB Encoded %zd bits (%zd bytes), ecause %d\n",
-        enc_rval.encoded,(enc_rval.encoded+7)/8,ecause);
-#endif
+  LOG_D(RRC,"RRCConnectionSetup-NB Encoded %zd bits (%zd bytes)\n",
+        enc_rval.encoded,(enc_rval.encoded+7)/8);
   return((enc_rval.encoded+7)/8);
 }
 
@@ -793,15 +758,11 @@ uint8_t do_SecurityModeCommand_NB_IoT(
           enc_rval.failed_type->name, enc_rval.encoded);
   }
 
-  //#if defined(ENABLE_ITTI)
-  //# if !defined(DISABLE_XER_SPRINT)....
-#ifdef USER_MODE
   LOG_D(RRC,"[NB-IoT %d] securityModeCommand-NB for UE %x Encoded %zd bits (%zd bytes)\n",
         ctxt_pP->module_id,
         ctxt_pP->rnti,
         enc_rval.encoded,
         (enc_rval.encoded+7)/8);
-#endif
 
   if (enc_rval.encoded==-1) {
     LOG_E(RRC,"[NB-IoT %d] ASN1 : securityModeCommand-NB encoding failed for UE %x\n",
@@ -850,15 +811,12 @@ uint8_t do_UECapabilityEnquiry_NB_IoT(
           enc_rval.failed_type->name, enc_rval.encoded);
   }
 
-  //#if defined(ENABLE_ITTI)
-  //# if !defined(DISABLE_XER_SPRINT)....
-#ifdef USER_MODE
   LOG_D(RRC,"[NB-IoT %d] UECapabilityEnquiry-NB for UE %x Encoded %zd bits (%zd bytes)\n",
         ctxt_pP->module_id,
         ctxt_pP->rnti,
         enc_rval.encoded,
         (enc_rval.encoded+7)/8);
-#endif
+
 
   if (enc_rval.encoded==-1) {
     LOG_E(RRC,"[NB-IoT %d] ASN1 : UECapabilityEnquiry-NB encoding failed for UE %x\n",
@@ -940,8 +898,6 @@ uint16_t do_RRCConnectionReconfiguration_NB_IoT(
     xer_fprint(stdout,&asn_DEF_LTE_DL_DCCH_Message_NB,(void *)&dl_dcch_msg_NB_IoT);
   }
 
-  //#if defined(ENABLE_ITTI)
-  //# if !defined(DISABLE_XER_SPRINT)...
   LOG_I(RRC,"RRCConnectionReconfiguration-NB Encoded %zd bits (%zd bytes)\n",enc_rval.encoded,(enc_rval.encoded+7)/8);
   return((enc_rval.encoded+7)/8);
 }
@@ -977,10 +933,8 @@ uint8_t do_RRCConnectionReestablishmentReject_NB_IoT(
   }
 
   //Only change in "asn_DEF_DL_CCCH_Message_NB"
-#ifdef USER_MODE
   LOG_D(RRC,"RRCConnectionReestablishmentReject Encoded %zd bits (%zd bytes)\n",
         enc_rval.encoded,(enc_rval.encoded+7)/8);
-#endif
   return((enc_rval.encoded+7)/8);
 }
 
@@ -1025,10 +979,8 @@ uint8_t do_RRCConnectionReject_NB_IoT(
           enc_rval.failed_type->name, enc_rval.encoded);
   }
 
-#ifdef USER_MODE
   LOG_D(RRC,"RRCConnectionReject-NB Encoded %zd bits (%zd bytes)\n",
         enc_rval.encoded,(enc_rval.encoded+7)/8);
-#endif
   return((enc_rval.encoded+7)/8);
 }
 
diff --git a/openair2/RRC/LTE/rrc_eNB.c b/openair2/RRC/LTE/rrc_eNB.c
index aafd1cbf6f80c51223573a57acce6598dfb547d2..7de5a2c64c1f26584cc8ae076ad3869f215f1828 100644
--- a/openair2/RRC/LTE/rrc_eNB.c
+++ b/openair2/RRC/LTE/rrc_eNB.c
@@ -154,21 +154,15 @@ init_SI(
           (int)configuration->N_RB_DL[CC_id]);
     RC.rrc[ctxt_pP->module_id]->carrier[CC_id].MIB_FeMBMS = (uint8_t *) malloc16(4);
     do_MIB_FeMBMS(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id],
-#ifdef ENABLE_ITTI
                   configuration->N_RB_DL[CC_id],
-                  0 //additionalNonMBSFN
-#else
-                  50,0
-#endif
-                  ,0);
+                  0, //additionalNonMBSFN
+                  0);
     RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_MBMS = 0;
     RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1_MBMS = (uint8_t *) malloc16(32);
     AssertFatal(RC.rrc[ctxt_pP->module_id]->carrier[CC_id].SIB1_MBMS!=NULL,PROTOCOL_RRC_CTXT_FMT" init_SI: FATAL, no memory for SIB1_MBMS allocated\n",
                 PROTOCOL_RRC_CTXT_ARGS(ctxt_pP));
-    RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_MBMS = do_SIB1_MBMS(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id],ctxt_pP->module_id,CC_id
-#if defined(ENABLE_ITTI)
-        , configuration
-#endif
+    RC.rrc[ctxt_pP->module_id]->carrier[CC_id].sizeof_SIB1_MBMS = do_SIB1_MBMS(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id],ctxt_pP->module_id,CC_id,
+         configuration
                                                                               );
     LOG_I(RRC, PROTOCOL_RRC_CTXT_FMT" Contents of SIB1-MBMS\n",
           PROTOCOL_RRC_CTXT_ARGS(ctxt_pP)
@@ -894,7 +888,6 @@ rrc_eNB_free_mem_UE_context(
   //uint8_t                            Status;
   //rnti_t                             rnti;
   //uint64_t                           random_ue_identity;
-#if defined(ENABLE_ITTI)
   //UE_S_TMSI                          Initialue_identity_s_TMSI;
   //EstablishmentCause_t               establishment_cause;
   //ReestablishmentCause_t             reestablishment_cause;
@@ -907,7 +900,6 @@ rrc_eNB_free_mem_UE_context(
   //transport_layer_addr_t             enb_gtp_addrs[S1AP_MAX_E_RAB];
   //rb_id_t                            enb_gtp_ebi[S1AP_MAX_E_RAB];
 #endif
-#endif
 }
 
 //-----------------------------------------------------------------------------
@@ -4887,7 +4879,6 @@ check_handovers(
     if (ue_context_p->ue_context.Status == RRC_RECONFIGURED
         && ue_context_p->ue_context.handover_info != NULL &&
         ue_context_p->ue_context.handover_info->forwarding_state == FORWARDING_NO_EMPTY ) {
-#if defined(ENABLE_ITTI)
       MessageDef   *msg_p;
       int    result;
       protocol_ctxt_t  ctxt;
@@ -5018,7 +5009,6 @@ check_handovers(
 
       ue_context_p->ue_context.handover_info->endmark_state = ENDMARK_EMPTY;
       ue_context_p->ue_context.handover_info->state = HO_FORWARDING_COMPLETE;
-#endif
     }
   }
 }
@@ -5934,7 +5924,6 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
   securityConfigHO->handoverType.choice.intraLTE.securityAlgorithmConfig = NULL; /* TODO: to be checked */
   securityConfigHO->handoverType.choice.intraLTE.keyChangeIndicator = 0;
   securityConfigHO->handoverType.choice.intraLTE.nextHopChainingCount = 0;
-#if defined(ENABLE_ITTI)
   /* Initialize NAS list */
   dedicatedInfoNASList = CALLOC(1, sizeof(struct LTE_RRCConnectionReconfiguration_r8_IEs__dedicatedInfoNASList));
 
@@ -5967,7 +5956,6 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
     dedicatedInfoNASList = NULL;
   }
 
-#endif
   measurements_enabled = RC.rrc[ENB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)]->configuration.enable_x2 ||
                          RC.rrc[ENB_INSTANCE_TO_MODULE_ID(ctxt_pP->instance)]->configuration.enable_measurement_reports;
   memset(buffer, 0, RRC_BUF_SIZE);
@@ -6016,7 +6004,6 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
   *_size = size = ho_size;
   LOG_DUMPMSG(RRC,DEBUG_RRC,(char *)buffer,size,
               "[MSG] RRC Connection Reconfiguration handover\n");
-#if defined(ENABLE_ITTI)
 
   /* Free all NAS PDUs */
   for (i = 0; i < ue_context_pP->ue_context.nb_of_e_rabs; i++) {
@@ -6026,8 +6013,6 @@ rrc_eNB_generate_HO_RRCConnectionReconfiguration(const protocol_ctxt_t *const ct
       ue_context_pP->ue_context.e_rab[i].param.nas_pdu.buffer = NULL;
     }
   }
-
-#endif
   LOG_I(RRC,
         "[eNB %d] Frame %d, Logical Channel DL-DCCH, Generate RRCConnectionReconfiguration handover (bytes %d, UE id %x)\n",
         ctxt_pP->module_id, ctxt_pP->frame, size, ue_context_pP->ue_context.rnti);
diff --git a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
index 749dff3acedf0832f1a737e5382ad66dcdba601a..6bbdef181b4e2793e3c3898e6fc5ee4b5a9dbc8c 100644
--- a/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
+++ b/openair2/RRC/LTE/rrc_eNB_GTPV1U.c
@@ -27,7 +27,6 @@
  * \email: lionel.gauthier@eurecom.fr
  */
 
-//#if defined(ENABLE_USE_MME)
 # include "rrc_defs.h"
 # include "rrc_extern.h"
 # include "RRC/LTE/MESSAGES/asn1_msg.h"
@@ -35,10 +34,10 @@
 # include "rrc_eNB_UE_context.h"
 # include "msc.h"
 
-//# if defined(ENABLE_ITTI)
-#   include "asn1_conversions.h"
-#   include "intertask_interface.h"
-//#endif
+
+#include "asn1_conversions.h"
+#include "intertask_interface.h"
+
 
 # include "common/ran_context.h"
 
@@ -113,7 +112,6 @@ gtpv_data_req(
     return FALSE;
   }
   LOG_D(GTPU,"gtpv_data_req ue rnti %x sdu_sizeP %d rb id %ld", ctxt_pP->rnti, sdu_sizeP, rb_idP);
-#if defined(ENABLE_ITTI)
   {
     MessageDef *message_p;
     // Uses a new buffer to avoid issue with PDCP buffer content that could be changed by PDCP (asynchronous message handling).
@@ -167,8 +165,6 @@ gtpv_data_req(
       return TRUE; // TODO should be changed to a CNF message later, currently RRC lite does not used the returned value anyway.
     }
   }
-#endif
-
   return TRUE;
 
 }
diff --git a/openair2/RRC/LTE/rrc_eNB_S1AP.c b/openair2/RRC/LTE/rrc_eNB_S1AP.c
index 11c6d27f5facd1d66f36b00d276d40f0ea9bdaeb..59998cebcce88304bc42e664abdd5c90dea0295e 100644
--- a/openair2/RRC/LTE/rrc_eNB_S1AP.c
+++ b/openair2/RRC/LTE/rrc_eNB_S1AP.c
@@ -58,7 +58,7 @@
 #include "TLVDecoder.h"
 #include "S1AP_NAS-PDU.h"
 #include "flexran_agent_common_internal.h"
-
+#include "executables/softmodem-common.h"
 extern RAN_CONTEXT_t RC;
 
 extern int
@@ -540,9 +540,10 @@ rrc_pdcp_config_security(
   derive_key_rrc_int(ue_context_pP->ue_context.integrity_algorithm,
                      ue_context_pP->ue_context.kenb,
                      &kRRCint);
-#if !defined(USRP_REC_PLAY)
+ if (!IS_SOFTMODEM_IQPLAYER) {
   SET_LOG_DUMP(DEBUG_SECURITY) ;
-#endif
+ }
+
 
   if ( LOG_DUMPFLAG( DEBUG_SECURITY ) ) {
     if (print_keys ==1 ) {
diff --git a/openair2/RRC/NR/L2_nr_interface.c b/openair2/RRC/NR/L2_nr_interface.c
index fb1ed160cb8b674e46a0656da07080c2dcbec59f..1e8e45ef4d535bbd3a6b50c30f075454b7e80b67 100644
--- a/openair2/RRC/NR/L2_nr_interface.c
+++ b/openair2/RRC/NR/L2_nr_interface.c
@@ -36,9 +36,7 @@
 #include "msc.h"
 #include "common/ran_context.h"
 
-#if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "NR_MIB.h"
 #include "NR_BCCH-BCH-Message.h"
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.c b/openair2/RRC/NR/MESSAGES/asn1_msg.c
index d95507547a3207bff08984f5b7496d5565c826d3..a4092c11fa492ec5d3ba09e3a9215d63b13f00bf 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.c
@@ -99,9 +99,7 @@
   #include "gnb_config.h"
 #endif
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 #include "common/ran_context.h"
 
@@ -263,23 +261,18 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,uint32_t frame) {
   return((enc_rval.encoded+7)/8);
 }
 
-uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier
-#if defined(ENABLE_ITTI)
-  , gNB_RrcConfigurationReq *configuration
-#endif
+uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier, 
+	               gNB_RrcConfigurationReq *configuration
                   ) {
   asn_enc_rval_t enc_rval;
   NR_BCCH_DL_SCH_Message_t *sib1_message ;
   struct NR_SIB1 *sib1 ;
   int i;
   struct NR_PLMN_IdentityInfo nr_plmn_info;
-#if defined(ENABLE_ITTI)
+
   // TODO : Add support for more than one PLMN
   //int num_plmn = configuration->num_plmn;
   int num_plmn = 1;
-#else
-  int num_plmn = 1;
-#endif
   struct NR_PLMN_Identity nr_plmn[num_plmn];
   NR_MCC_MNC_Digit_t nr_mcc_digit[num_plmn][3];
   NR_MCC_MNC_Digit_t nr_mnc_digit[num_plmn][3];
@@ -303,30 +296,18 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier
   memset(nr_plmn,0,num_plmn*sizeof(struct NR_PLMN_Identity));
 
   for (i = 0; i < num_plmn; ++i) {
-#ifdef ENABLE_ITTI
     nr_mcc_digit[i][0] = (configuration->mcc[i]/100)%10;
     nr_mcc_digit[i][1] = (configuration->mcc[i]/10)%10;
     nr_mcc_digit[i][2] = (configuration->mcc[i])%10;
-#else
-    nr_mcc_digit[i][0] = 0;
-    nr_mcc_digit[i][1] = 0;
-    nr_mcc_digit[i][2] = 1;
-#endif
     nr_plmn[i].mcc = CALLOC(1,sizeof(struct NR_MCC));
     memset(nr_plmn[i].mcc,0,sizeof(struct NR_MCC));
     asn_set_empty(&nr_plmn[i].mcc->list);
     ASN_SEQUENCE_ADD(&nr_plmn[i].mcc->list, &nr_mcc_digit[i][0]);
     ASN_SEQUENCE_ADD(&nr_plmn[i].mcc->list, &nr_mcc_digit[i][1]);
     ASN_SEQUENCE_ADD(&nr_plmn[i].mcc->list, &nr_mcc_digit[i][2]);
-#ifdef ENABLE_ITTI
     nr_mnc_digit[i][0] = (configuration->mnc[i]/100)%10;
     nr_mnc_digit[i][1] = (configuration->mnc[i]/10)%10;
     nr_mnc_digit[i][2] = (configuration->mnc[i])%10;
-#else
-    nr_mnc_digit[i][0] = 0;
-    nr_mnc_digit[i][1] = 0;
-    nr_mnc_digit[i][2] = 1;
-#endif
     memset(&nr_plmn[i].mnc,0,sizeof(NR_MNC_t));
     nr_plmn[i].mnc.list.size=0;
     nr_plmn[i].mnc.list.count=0;
@@ -338,17 +319,10 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier
 
   nr_plmn_info.cellIdentity.buf = MALLOC(8);
   memset(nr_plmn_info.cellIdentity.buf,0,8);
-#ifdef ENABLE_ITTI
   nr_plmn_info.cellIdentity.buf[0]= (configuration->cell_identity >> 20) & 0xff;
   nr_plmn_info.cellIdentity.buf[1]= (configuration->cell_identity >> 12) & 0xff;
   nr_plmn_info.cellIdentity.buf[2]= (configuration->cell_identity >> 4) & 0xff;
   nr_plmn_info.cellIdentity.buf[3]= (configuration->cell_identity << 4) & 0xff;
-#else
-  nr_plmn_info.cellIdentity.buf[0]= 0x00;
-  nr_plmn_info.cellIdentity.buf[1]= 0x00;
-  nr_plmn_info.cellIdentity.buf[2]= 0x00;
-  nr_plmn_info.cellIdentity.buf[3]= 0x10;
-#endif
   nr_plmn_info.cellIdentity.size= 4;
   nr_plmn_info.cellIdentity.bits_unused= 4;
   nr_plmn_info.cellReservedForOperatorUse = 0;
@@ -382,7 +356,6 @@ uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier
 }
 
 
-
 void  do_RLC_BEARER(uint8_t Mod_id,
                     int CC_id,
                     struct NR_CellGroupConfig__rlc_BearerToAddModList *rlc_BearerToAddModList,
@@ -600,10 +573,8 @@ void do_SpCellConfig(gNB_RRC_INST *rrc,
   gNB_RrcConfigurationReq  *common_configuration;
   common_configuration = CALLOC(1,sizeof(gNB_RrcConfigurationReq));
   //Fill servingcellconfigcommon config value
-
   //Fill common config to structure
   //  rrc->configuration = common_configuration;
   spconfig->reconfigurationWithSync = CALLOC(1,sizeof(struct NR_ReconfigurationWithSync));
-
 }
 
diff --git a/openair2/RRC/NR/MESSAGES/asn1_msg.h b/openair2/RRC/NR/MESSAGES/asn1_msg.h
index df960609d4d8f28e249a0c92ef268d39707c2c11..3f647cb887b635cbc05522166681c9d66cf45d29 100644
--- a/openair2/RRC/NR/MESSAGES/asn1_msg.h
+++ b/openair2/RRC/NR/MESSAGES/asn1_msg.h
@@ -61,10 +61,8 @@ uint8_t do_MIB_NR(gNB_RRC_INST *rrc,
 @param carrier pointer to Carrier information
 @param configuration Pointer Configuration Request structure  
 @return size of encoded bit stream in bytes*/
-uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier
-#if defined(ENABLE_ITTI)
-  , gNB_RrcConfigurationReq *configuration
-#endif
+uint8_t do_SIB1_NR(rrc_gNB_carrier_data_t *carrier,
+  gNB_RrcConfigurationReq *configuration
                   );
 
 void do_RLC_BEARER(uint8_t Mod_id,
diff --git a/openair2/RRC/NR/nr_rrc_config.h b/openair2/RRC/NR/nr_rrc_config.h
index c30478f0b0651c1c59120f2fc2e33537b9a72555..e19d94b34123076c173795322e046d6fbd97b8dd 100644
--- a/openair2/RRC/NR/nr_rrc_config.h
+++ b/openair2/RRC/NR/nr_rrc_config.h
@@ -117,10 +117,8 @@ typedef struct rach_dedicated_s{
 }rach_dedicated_t;
 
 void rrc_config_servingcellconfigcommon(uint8_t Mod_id,
-                                        int CC_id
-                                        #if defined(ENABLE_ITTI)
-                                        ,gNB_RrcConfigurationReq *common_configuration
-                                        #endif
+                                        int CC_id,
+                                        gNB_RrcConfigurationReq *common_configuration
                                        );
 
 void rrc_config_rlc_bearer(uint8_t Mod_id,
@@ -138,4 +136,4 @@ void rrc_config_physicalcellgroup(uint8_t Mod_id,
                                   physicalcellgroup_t *physicalcellgroup_config
                                  );
 
-#endif
\ No newline at end of file
+#endif
diff --git a/openair2/RRC/NR/nr_rrc_defs.h b/openair2/RRC/NR/nr_rrc_defs.h
index db3d550684e2c7ba16ffedf03997f1c1d8c93b16..02b4154c41afe4ec2ee6143a055e3da638a0c440 100644
--- a/openair2/RRC/NR/nr_rrc_defs.h
+++ b/openair2/RRC/NR/nr_rrc_defs.h
@@ -67,21 +67,15 @@
 #include "NR_EstablishmentCause.h"
 //-------------------
 
-#if defined(ENABLE_ITTI)
-  #include "intertask_interface.h"
-#endif
+#include "intertask_interface.h"
 
 /* TODO: be sure this include is correct.
  * It solves a problem of compilation of the RRH GW,
  * issue #186.
  */
-#if !defined(ENABLE_ITTI)
   #include "as_message.h"
-#endif
 
-#if defined(ENABLE_USE_MME)
   #include "commonDef.h"
-#endif
 
 
 /*I will change the name of the structure for compile purposes--> hope not to undo this process*/
@@ -296,7 +290,6 @@ typedef struct gNB_RRC_UE_s {
   rnti_t                             rnti;
   uint64_t                           random_ue_identity;
 
-#if defined(ENABLE_ITTI)
   /* Information from UE RRC ConnectionRequest */
   UE_S_TMSI                          Initialue_identity_s_TMSI;
   NR_EstablishmentCause_t            establishment_cause;
@@ -329,7 +322,6 @@ typedef struct gNB_RRC_UE_s {
   uint32_t                           enb_gtp_teid[S1AP_MAX_E_RAB];
   transport_layer_addr_t             enb_gtp_addrs[S1AP_MAX_E_RAB];
   rb_id_t                            enb_gtp_ebi[S1AP_MAX_E_RAB];
-#endif
   uint32_t                           ul_failure_timer;
   uint32_t                           ue_release_timer;
   uint32_t                           ue_release_timer_thres;
diff --git a/openair2/RRC/NR/nr_rrc_proto.h b/openair2/RRC/NR/nr_rrc_proto.h
index 1e4b1be054b7b0a99975762277a8ac966133faee..5770b80595efd95d2098d5ca10cf9ad2bbc501fc 100644
--- a/openair2/RRC/NR/nr_rrc_proto.h
+++ b/openair2/RRC/NR/nr_rrc_proto.h
@@ -93,9 +93,7 @@ int parse_CG_ConfigInfo(gNB_RRC_INST *rrc, NR_CG_ConfigInfo_t *CG_ConfigInfo);
 
 
 
-#if defined(ENABLE_ITTI)
 /**\brief RRC eNB task.
    \param void *args_p Pointer on arguments to start the task. */
 void *rrc_gnb_task(void *args_p);
 
-#endif
diff --git a/openair2/RRC/NR/rrc_gNB.c b/openair2/RRC/NR/rrc_gNB.c
index dc0a0dca346146e6f39a9140d2d1e891ef1d5200..fba661055419503d999df33ab65ebc6fddd9d19f 100644
--- a/openair2/RRC/NR/rrc_gNB.c
+++ b/openair2/RRC/NR/rrc_gNB.c
@@ -69,14 +69,15 @@
   #include "UTIL/OSA/osa_defs.h"
 #endif
 
-#   include "rrc_eNB_S1AP.h"
-#   include "rrc_eNB_GTPV1U.h"
+#include "rrc_eNB_S1AP.h"
+#include "rrc_eNB_GTPV1U.h"
+
 
 #include "pdcp.h"
 #include "gtpv1u_eNB_task.h"
 
-#   include "intertask_interface.h"
 
+#include "intertask_interface.h"
 #include "SIMULATION/TOOLS/sim.h" // for taus
 
 #include "executables/softmodem-common.h"
@@ -179,7 +180,6 @@ void rrc_gNB_generate_SgNBAdditionRequestAcknowledge(
 ///---------------------------------------------------------------------------------------------------------------///
 ///---------------------------------------------------------------------------------------------------------------///
 
-
 static void init_NR_SI(gNB_RRC_INST *rrc) {
 
 
@@ -277,7 +277,6 @@ char openair_rrc_gNB_configuration(const module_id_t gnb_mod_idP, gNB_RrcConfigu
   AssertFatal(rrc != NULL, "RC.nrrrc not initialized!");
   AssertFatal(NUMBER_OF_UE_MAX < (module_id_t)0xFFFFFFFFFFFFFFFF, " variable overflow");
   AssertFatal(configuration!=NULL,"configuration input is null\n");
-  
   rrc->module_id = gnb_mod_idP;
   rrc->Nb_ue = 0;
   
@@ -348,7 +347,6 @@ void rrc_gNB_process_AdditionRequestInformation(const module_id_t gnb_mod_idP, x
 
 ///---------------------------------------------------------------------------------------------------------------///
 ///---------------------------------------------------------------------------------------------------------------///
-
 void *rrc_gnb_task(void *args_p) {
   MessageDef                         *msg_p;
   const char                         *msg_name_p;
diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c
deleted file mode 100644
index faff4fcfb964de838392eee955903ed614322681..0000000000000000000000000000000000000000
--- a/openair2/UTIL/LOG/log.c
+++ /dev/null
@@ -1,1832 +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
- */
-
-/*! \file log.c
-* \brief log implementaion
-* \author Navid Nikaein
-* \date 2009 - 2014
-* \version 0.5
-* @ingroup util
-
-*/
-
-#define _GNU_SOURCE  /* required for pthread_getname_np */
-//#define LOG_TEST 1
-
-#define COMPONENT_LOG
-#define COMPONENT_LOG_IF
-#include <ctype.h>
-#define LOG_MAIN
-#include "log.h"
-#include "vcd_signal_dumper.h"
-#include "assertions.h"
-
-#if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-#endif
-
-# include <pthread.h>
-# include <string.h>
-#include "common/config/config_userapi.h"
-// main log variables
-
-
-mapping log_level_names[] = {
-  {"emerg", LOG_EMERG},
-  {"alert", LOG_ALERT},
-  {"crit", LOG_CRIT},
-  {"error", LOG_ERR},
-  {"warn", LOG_WARNING},
-  {"notice", LOG_NOTICE},
-  {"info", LOG_INFO},
-  {"debug", LOG_DEBUG},
-  {"file", LOG_FILE},
-  {"trace", LOG_TRACE},
-  {NULL, -1}
-};
-mapping log_verbosity_names[] = {
-  {"none", 0x0},
-  {"low", 0x5},
-  {"medium", 0x15},
-  {"high", 0x35},
-  {"full", 0x75},
-  {NULL, -1}
-};
-
-// vars for the log thread
-LOG_params log_list[2000];
-int log_list_tail = 0;
-int log_list_nb_elements = 0;
-
-pthread_mutex_t log_lock;
-pthread_cond_t log_notify;
-
-
-#if !defined(LOG_NO_THREAD)
-int log_list_head = 0;
-int log_shutdown;
-#endif
-
-static int gfd;
-
-static char *log_level_highlight_start[] = {LOG_RED, LOG_RED, LOG_RED, LOG_RED, LOG_ORANGE, LOG_BLUE, "", ""};  /*!< \brief Optional start-format strings for highlighting */
-static char *log_level_highlight_end[]   = {LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET, LOG_RESET,LOG_RESET,  "",""};   /*!< \brief Optional end-format strings for highlighting */
-
-#if defined(ENABLE_ITTI)
-static log_instance_type_t log_instance_type;
-#endif
-
-/* get log parameters from configuration file */
-void  log_getconfig(log_t *g_log) {
-  char *gloglevel = NULL;
-  char *glogverbo = NULL;
-  int level,verbosity;
-  paramdef_t logparams_defaults[] = LOG_GLOBALPARAMS_DESC;
-  paramdef_t logparams_level[MAX_LOG_COMPONENTS];
-  paramdef_t logparams_verbosity[MAX_LOG_COMPONENTS];
-  paramdef_t logparams_logfile[MAX_LOG_COMPONENTS];
-  
-  int ret = config_get( logparams_defaults,sizeof(logparams_defaults)/sizeof(paramdef_t),CONFIG_STRING_LOG_PREFIX);
-  if (ret <0) {
-       fprintf(stderr,"[LOG] init aborted, configuration couldn't be performed");
-       return;
-  } 
-  memset(logparams_level,    0, sizeof(paramdef_t)*MAX_LOG_COMPONENTS);
-  memset(logparams_verbosity,0, sizeof(paramdef_t)*MAX_LOG_COMPONENTS);
-  memset(logparams_logfile,  0, sizeof(paramdef_t)*MAX_LOG_COMPONENTS);
-  for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
-    if(g_log->log_component[i].name == NULL) {
-       g_log->log_component[i].name = malloc(16);
-       sprintf((char *)g_log->log_component[i].name,"comp%i?",i);
-       logparams_logfile[i].paramflags = PARAMFLAG_DONOTREAD;
-       logparams_level[i].paramflags = PARAMFLAG_DONOTREAD;
-       logparams_verbosity[i].paramflags = PARAMFLAG_DONOTREAD;
-    }
-    sprintf(logparams_level[i].optname,    LOG_CONFIG_LEVEL_FORMAT,       g_log->log_component[i].name);
-    sprintf(logparams_verbosity[i].optname,LOG_CONFIG_VERBOSITY_FORMAT,   g_log->log_component[i].name);
-    sprintf(logparams_logfile[i].optname,  LOG_CONFIG_LOGFILE_FORMAT,     g_log->log_component[i].name);
-/* workaround: all log options in existing configuration files use lower case component names
-   where component names include uppercase char in log.h....                                */ 
-    for (int j=0 ; j<strlen(logparams_level[i].optname); j++) 
-          logparams_level[i].optname[j] = tolower(logparams_level[i].optname[j]);
-    for (int j=0 ; j<strlen(logparams_level[i].optname); j++) 
-          logparams_verbosity[i].optname[j] = tolower(logparams_verbosity[i].optname[j]);
-    for (int j=0 ; j<strlen(logparams_level[i].optname); j++) 
-          logparams_logfile[i].optname[j] = tolower(logparams_logfile[i].optname[j]);
-/* */
-    logparams_level[i].defstrval     = gloglevel;
-    logparams_verbosity[i].defstrval = glogverbo; 
-
-    logparams_level[i].type          = TYPE_STRING;
-    logparams_verbosity[i].type      = TYPE_STRING;
-    logparams_logfile[i].type        = TYPE_UINT;
-
-    logparams_logfile[i].paramflags  = logparams_logfile[i].paramflags|PARAMFLAG_BOOL;
-    }
-  config_get( logparams_level,    MAX_LOG_COMPONENTS,CONFIG_STRING_LOG_PREFIX); 
-  config_get( logparams_verbosity,MAX_LOG_COMPONENTS,CONFIG_STRING_LOG_PREFIX); 
-  config_get( logparams_logfile,  MAX_LOG_COMPONENTS,CONFIG_STRING_LOG_PREFIX); 
-  for (int i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
-    verbosity = map_str_to_int(log_verbosity_names,*(logparams_verbosity[i].strptr));
-    level     = map_str_to_int(log_level_names,    *(logparams_level[i].strptr));
-    set_comp_log(i, level,verbosity,1);
-    set_component_filelog(*(logparams_logfile[i].uptr));
-    }
-}
-
-
-int logInit (void)
-{
-  int i;
-  g_log = calloc(1, sizeof(log_t));
-
-  if (g_log == NULL) {
-    perror ("cannot allocated memory for log generation module \n");
-    exit(EXIT_FAILURE);
-  }
-
-
-#if ! defined(CN_BUILD)
-  g_log->log_component[PHY].name = "PHY";
-  g_log->log_component[PHY].level = LOG_EMERG;
-  g_log->log_component[PHY].flag =  LOG_MED;
-  g_log->log_component[PHY].interval =  1;
-  g_log->log_component[PHY].fd = 0;
-  g_log->log_component[PHY].filelog = 0;
-  g_log->log_component[PHY].filelog_name = "/tmp/phy.log";
-
-  g_log->log_component[MAC].name = "MAC";
-  g_log->log_component[MAC].level = LOG_EMERG;
-  g_log->log_component[MAC].flag =  LOG_MED;
-  g_log->log_component[MAC].interval =  1;
-  g_log->log_component[MAC].fd = 0;
-  g_log->log_component[MAC].filelog = 0;
-  g_log->log_component[MAC].filelog_name = "/tmp/mac.log";
-
-  g_log->log_component[OPT].name = "OPT";
-  g_log->log_component[OPT].level = LOG_EMERG;
-  g_log->log_component[OPT].flag = LOG_MED;
-  g_log->log_component[OPT].interval =  1;
-  g_log->log_component[OPT].fd = 0;
-  g_log->log_component[OPT].filelog = 0;
-  g_log->log_component[OPT].filelog_name = "";
-
-  g_log->log_component[RLC].name = "RLC";
-  g_log->log_component[RLC].level = LOG_INFO;
-  g_log->log_component[RLC].flag = LOG_MED;
-  g_log->log_component[RLC].interval =  1;
-  g_log->log_component[RLC].fd = 0;
-  g_log->log_component[RLC].filelog = 0;
-  g_log->log_component[RLC].filelog_name = "/tmp/rlc.log";
-
-  g_log->log_component[PDCP].name = "PDCP";
-  g_log->log_component[PDCP].level = LOG_INFO;
-  g_log->log_component[PDCP].flag = LOG_MED;
-  g_log->log_component[PDCP].interval =  1;
-  g_log->log_component[PDCP].fd = 0;
-  g_log->log_component[PDCP].filelog = 0;
-  g_log->log_component[PDCP].filelog_name = "/tmp/pdcp.log";
-
-  g_log->log_component[RRC].name = "RRC";
-  g_log->log_component[RRC].level = LOG_TRACE;
-  g_log->log_component[RRC].flag = LOG_MED;
-  g_log->log_component[RRC].interval =  1;
-  g_log->log_component[RRC].fd = 0;
-  g_log->log_component[RRC].filelog = 0;
-  g_log->log_component[RRC].filelog_name = "/tmp/rrc.log";
-
-  g_log->log_component[EMU].name = "EMU";
-  g_log->log_component[EMU].level = LOG_EMERG;
-  g_log->log_component[EMU].flag =  LOG_MED;
-  g_log->log_component[EMU].interval =  1;
-  g_log->log_component[EMU].fd = 0;
-  g_log->log_component[EMU].filelog = 0;
-  g_log->log_component[EMU].filelog_name = "";
-
-  g_log->log_component[OMG].name = "OMG";
-  g_log->log_component[OMG].level = LOG_EMERG;
-  g_log->log_component[OMG].flag =  LOG_MED;
-  g_log->log_component[OMG].interval =  1;
-  g_log->log_component[OMG].fd = 0;
-  g_log->log_component[OMG].filelog = 0;
-  g_log->log_component[OMG].filelog_name = "/tmp/omg.csv";
-
-  g_log->log_component[OTG].name = "OTG";
-  g_log->log_component[OTG].level = LOG_EMERG;
-  g_log->log_component[OTG].flag =  LOG_MED;
-  g_log->log_component[OTG].interval =  1;
-  g_log->log_component[OTG].fd = 0;
-  g_log->log_component[OTG].filelog = 0;
-  g_log->log_component[OTG].filelog_name = "/tmp/otg.log";
-
-  g_log->log_component[OTG_LATENCY].name = "OTG_LATENCY";
-  g_log->log_component[OTG_LATENCY].level = LOG_EMERG;
-  g_log->log_component[OTG_LATENCY].flag =  LOG_MED;
-  g_log->log_component[OTG_LATENCY].interval =  1;
-  g_log->log_component[OTG_LATENCY].fd = 0;
-  g_log->log_component[OTG_LATENCY].filelog = 0;
-  g_log->log_component[OTG_LATENCY].filelog_name = "/tmp/otg_latency.dat";
-
-  g_log->log_component[OTG_LATENCY_BG].name = "OTG_LATENCY_BG";
-  g_log->log_component[OTG_LATENCY_BG].level = LOG_EMERG;
-  g_log->log_component[OTG_LATENCY_BG].flag =  LOG_MED;
-  g_log->log_component[OTG_LATENCY_BG].interval =  1;
-  g_log->log_component[OTG_LATENCY_BG].fd = 0;
-  g_log->log_component[OTG_LATENCY_BG].filelog = 0;
-  g_log->log_component[OTG_LATENCY_BG].filelog_name = "/tmp/otg_latency_bg.dat";
-
-  g_log->log_component[OTG_GP].name = "OTG_GP";
-  g_log->log_component[OTG_GP].level = LOG_EMERG;
-  g_log->log_component[OTG_GP].flag =  LOG_MED;
-  g_log->log_component[OTG_GP].interval =  1;
-  g_log->log_component[OTG_GP].fd = 0;
-  g_log->log_component[OTG_GP].filelog = 0;
-  g_log->log_component[OTG_GP].filelog_name = "/tmp/otg_goodput.dat";
-
-  g_log->log_component[OTG_GP_BG].name = "OTG_GP_BG";
-  g_log->log_component[OTG_GP_BG].level = LOG_EMERG;
-  g_log->log_component[OTG_GP_BG].flag =  LOG_MED;
-  g_log->log_component[OTG_GP_BG].interval =  1;
-  g_log->log_component[OTG_GP_BG].fd = 0;
-  g_log->log_component[OTG_GP_BG].filelog = 0;
-  g_log->log_component[OTG_GP_BG].filelog_name = "/tmp/otg_goodput_bg.dat";
-
-  g_log->log_component[OTG_JITTER].name = "OTG_JITTER";
-  g_log->log_component[OTG_JITTER].level = LOG_EMERG;
-  g_log->log_component[OTG_JITTER].flag =  LOG_MED;
-  g_log->log_component[OTG_JITTER].interval =  1;
-  g_log->log_component[OTG_JITTER].fd = 0;
-  g_log->log_component[OTG_JITTER].filelog = 0;
-  g_log->log_component[OTG_JITTER].filelog_name = "/tmp/otg_jitter.dat";
-
-  g_log->log_component[OCG].name = "OCG";
-  g_log->log_component[OCG].level = LOG_EMERG;
-  g_log->log_component[OCG].flag =  LOG_MED;
-  g_log->log_component[OCG].interval =  1;
-  g_log->log_component[OCG].fd = 0;
-  g_log->log_component[OCG].filelog = 0;
-  g_log->log_component[OCG].filelog_name = "";
-
-  g_log->log_component[PERF].name = "PERF";
-  g_log->log_component[PERF].level = LOG_EMERG;
-  g_log->log_component[PERF].flag =  LOG_MED;
-  g_log->log_component[PERF].interval =  1;
-  g_log->log_component[PERF].fd = 0;
-  g_log->log_component[PERF].filelog = 0;
-  g_log->log_component[PERF].filelog_name = "";
-
-  g_log->log_component[OIP].name = "OIP";
-  g_log->log_component[OIP].level = LOG_EMERG;
-  g_log->log_component[OIP].flag =  LOG_MED;
-  g_log->log_component[OIP].interval =  1;
-  g_log->log_component[OIP].fd = 0;
-  g_log->log_component[OIP].filelog = 0;
-  g_log->log_component[OIP].filelog_name = "";
-
-  g_log->log_component[CLI].name = "CLI";
-  g_log->log_component[CLI].level = LOG_EMERG;
-  g_log->log_component[CLI].flag =  LOG_MED;
-  g_log->log_component[CLI].interval =  1;
-  g_log->log_component[CLI].fd = 0;
-  g_log->log_component[CLI].filelog =  0;
-  g_log->log_component[CLI].filelog_name = "";
-
-  g_log->log_component[MSC].name = "MSC";
-  g_log->log_component[MSC].level = LOG_EMERG;
-  g_log->log_component[MSC].flag =  LOG_MED;
-  g_log->log_component[MSC].interval =  1;
-  g_log->log_component[MSC].fd = 0;
-  g_log->log_component[MSC].filelog =  0;
-  g_log->log_component[MSC].filelog_name = "/tmp/msc.log";
-
-  g_log->log_component[PROTO_AGENT].name = "PROTO_AGENT";
-  g_log->log_component[PROTO_AGENT].level = LOG_EMERG;
-  g_log->log_component[PROTO_AGENT].flag =  LOG_MED;
-  g_log->log_component[PROTO_AGENT].interval =  1;
-  g_log->log_component[PROTO_AGENT].fd = 0;
-  g_log->log_component[PROTO_AGENT].filelog =  0;
-  g_log->log_component[PROTO_AGENT].filelog_name = "/tmp/proto_agent.log";
-
-
-
-  g_log->log_component[PROTO_AGENT].name = "PROTO_AGENT";
-  g_log->log_component[PROTO_AGENT].level = LOG_EMERG;
-  g_log->log_component[PROTO_AGENT].flag =  LOG_MED;
-  g_log->log_component[PROTO_AGENT].interval =  1;
-  g_log->log_component[PROTO_AGENT].fd = 0;
-  g_log->log_component[PROTO_AGENT].filelog =  0;
-  g_log->log_component[PROTO_AGENT].filelog_name = "/tmp/proto_agent.log";
-
-  g_log->log_component[F1U].name = "F1U";
-  g_log->log_component[F1U].level = LOG_EMERG;
-  g_log->log_component[F1U].flag =  LOG_MED;
-  g_log->log_component[F1U].interval =  1;
-  g_log->log_component[F1U].fd = 0;
-  g_log->log_component[F1U].filelog =  0;
-  g_log->log_component[F1U].filelog_name = "/tmp/f1u.log";
-
-  g_log->log_component[OCM].name = "OCM";
-  g_log->log_component[OCM].level = LOG_EMERG;
-  g_log->log_component[OCM].flag =  LOG_MED;
-  g_log->log_component[OCM].interval =  1;
-  g_log->log_component[OCM].fd = 0;
-  g_log->log_component[OCM].filelog =  0;
-  g_log->log_component[OCM].filelog_name = "/tmp/ocm.log";
-
-  g_log->log_component[HW].name = "HW";
-  g_log->log_component[HW].level = LOG_EMERG;
-  g_log->log_component[HW].flag = LOG_MED;
-  g_log->log_component[HW].interval = 1;
-  g_log->log_component[HW].fd = 0;
-  g_log->log_component[HW].filelog = 0;
-  g_log->log_component[HW].filelog_name = "";
-
-  g_log->log_component[OSA].name = "OSA";
-  g_log->log_component[OSA].level = LOG_EMERG;
-  g_log->log_component[OSA].flag = LOG_MED;
-  g_log->log_component[OSA].interval = 1;
-  g_log->log_component[OSA].fd = 0;
-  g_log->log_component[OSA].filelog = 0;
-  g_log->log_component[OSA].filelog_name = "";
-
-  g_log->log_component[RAL_ENB].name = "eRAL";
-  g_log->log_component[RAL_ENB].level = LOG_EMERG;
-  g_log->log_component[RAL_ENB].flag = LOG_MED;
-  g_log->log_component[RAL_ENB].interval = 1;
-  g_log->log_component[RAL_ENB].fd = 0;
-  g_log->log_component[RAL_ENB].filelog = 0;
-  g_log->log_component[RAL_ENB].filelog_name = "";
-
-  g_log->log_component[RAL_UE].name = "mRAL";
-  g_log->log_component[RAL_UE].level = LOG_EMERG;
-  g_log->log_component[RAL_UE].flag = LOG_MED;
-  g_log->log_component[RAL_UE].interval = 1;
-  g_log->log_component[RAL_UE].fd = 0;
-  g_log->log_component[RAL_UE].filelog = 0;
-  g_log->log_component[RAL_UE].filelog_name = "";
-
-  g_log->log_component[ENB_APP].name = "ENB_APP";
-  g_log->log_component[ENB_APP].level = LOG_EMERG;
-  g_log->log_component[ENB_APP].flag = LOG_MED;
-  g_log->log_component[ENB_APP].interval = 1;
-  g_log->log_component[ENB_APP].fd = 0;
-  g_log->log_component[ENB_APP].filelog = 0;
-  g_log->log_component[ENB_APP].filelog_name = "";
-
-  g_log->log_component[FLEXRAN_AGENT].name = "FLEXRAN_AGENT";
-  g_log->log_component[FLEXRAN_AGENT].level = LOG_DEBUG;
-  g_log->log_component[FLEXRAN_AGENT].flag = LOG_MED;
-  g_log->log_component[FLEXRAN_AGENT].interval = 1;
-  g_log->log_component[FLEXRAN_AGENT].fd = 0;
-  g_log->log_component[FLEXRAN_AGENT].filelog = 0;
-  g_log->log_component[FLEXRAN_AGENT].filelog_name = "";
-  
-  g_log->log_component[TMR].name = "TMR";
-  g_log->log_component[TMR].level = LOG_EMERG;
-  g_log->log_component[TMR].flag = LOG_MED;
-  g_log->log_component[TMR].interval = 1;
-  g_log->log_component[TMR].fd = 0;
-  g_log->log_component[TMR].filelog = 0;
-  g_log->log_component[TMR].filelog_name = "";
-
-  g_log->log_component[USIM].name = "USIM";
-  g_log->log_component[USIM].level = LOG_DEBUG;
-  g_log->log_component[USIM].flag = LOG_NONE;
-  g_log->log_component[USIM].interval = 1;
-  g_log->log_component[USIM].fd = 0;
-  g_log->log_component[USIM].filelog = 0;
-  g_log->log_component[USIM].filelog_name = "/tmp/usim.txt";
-
-  /* following log component are used for the localization*/
-  g_log->log_component[LOCALIZE].name = "LOCALIZE";
-  g_log->log_component[LOCALIZE].level = LOG_EMERG;
-  g_log->log_component[LOCALIZE].flag =  LOG_MED;
-  g_log->log_component[LOCALIZE].interval =  1;
-  g_log->log_component[LOCALIZE].fd = 0;
-  g_log->log_component[LOCALIZE].filelog = 0;
-  g_log->log_component[LOCALIZE].filelog_name = "/tmp/localize.log";
-#endif // ! defined(CN_BUILD)
-
-  g_log->log_component[NAS].name = "NAS";
-  g_log->log_component[NAS].level = LOG_TRACE;
-  g_log->log_component[NAS].flag = LOG_MED;
-  g_log->log_component[NAS].interval =  1;
-  g_log->log_component[NAS].fd = 0;
-  g_log->log_component[NAS].filelog = 0;
-  g_log->log_component[NAS].filelog_name = "/tmp/nas.log";
-
-  g_log->log_component[UDP_].name = "UDP";
-  g_log->log_component[UDP_].level = LOG_EMERG;
-  g_log->log_component[UDP_].flag = LOG_FULL;
-  g_log->log_component[UDP_].interval = 1;
-  g_log->log_component[UDP_].fd = 0;
-  g_log->log_component[UDP_].filelog = 0;
-  g_log->log_component[UDP_].filelog_name = "";
-
-  g_log->log_component[GTPU].name = "GTPV1U";
-  g_log->log_component[GTPU].level = LOG_EMERG;
-  g_log->log_component[GTPU].flag = LOG_FULL;
-  g_log->log_component[GTPU].interval = 1;
-  g_log->log_component[GTPU].fd = 0;
-  g_log->log_component[GTPU].filelog = 0;
-  g_log->log_component[GTPU].filelog_name = "";
-
-  g_log->log_component[S1AP].name = "S1AP";
-  g_log->log_component[S1AP].level = LOG_EMERG;
-  g_log->log_component[S1AP].flag = LOG_FULL;
-  g_log->log_component[S1AP].interval = 1;
-  g_log->log_component[S1AP].fd = 0;
-  g_log->log_component[S1AP].filelog = 0;
-  g_log->log_component[S1AP].filelog_name = "";
-
-  g_log->log_component[SCTP].name = "SCTP";
-  g_log->log_component[SCTP].level = LOG_EMERG;
-  g_log->log_component[SCTP].flag = LOG_MED;
-  g_log->log_component[SCTP].interval = 1;
-  g_log->log_component[SCTP].fd = 0;
-  g_log->log_component[SCTP].filelog = 0;
-  g_log->log_component[SCTP].filelog_name = "";
- 
-  g_log->log_component[RRH].name = "RRH";
-  g_log->log_component[RRH].level = LOG_EMERG;
-  g_log->log_component[RRH].flag = LOG_MED;
-  g_log->log_component[RRH].interval = 1;
-  g_log->log_component[RRH].fd = 0;
-  g_log->log_component[RRH].filelog = 0;
-  g_log->log_component[RRH].filelog_name = "";
-  
-  g_log->level2string[LOG_EMERG]         = "G"; //EMERG
-  g_log->level2string[LOG_ALERT]         = "A"; // ALERT
-  g_log->level2string[LOG_CRIT]          = "C"; // CRITIC
-  g_log->level2string[LOG_ERR]           = "E"; // ERROR
-  g_log->level2string[LOG_WARNING]       = "W"; // WARNING
-  g_log->level2string[LOG_NOTICE]        = "N"; // NOTICE
-  g_log->level2string[LOG_INFO]          = "I"; //INFO
-  g_log->level2string[LOG_DEBUG]         = "D"; // DEBUG
-  g_log->level2string[LOG_FILE]          = "F"; // file
-  g_log->level2string[LOG_TRACE]         = "T"; // TRACE
-
-  g_log->onlinelog = 1; //online log file
-  g_log->syslog = 0;
-  g_log->filelog   = 0;
-  g_log->level  = LOG_TRACE;
-  g_log->flag   = LOG_LOW;
-
-  g_log->config.remote_ip      = 0;
-  g_log->config.remote_level   = LOG_EMERG;
-  g_log->config.facility       = LOG_LOCAL7;
-  g_log->config.audit_ip       = 0;
-  g_log->config.audit_facility = LOG_LOCAL6;
-  g_log->config.format         = 0x00; // online debug inactive
-
-  g_log->filelog_name = "/tmp/openair.log";
-
-  if (g_log->syslog) {
-#if ! defined(CN_BUILD)
-    openlog(g_log->log_component[EMU].name, LOG_PID, g_log->config.facility);
-#endif // ! defined(CN_BUILD)
-  }
-  log_getconfig(g_log);
-  if (g_log->filelog) {
-    gfd = open(g_log->filelog_name, O_WRONLY | O_CREAT, 0666);
-  }
-
-  // could put a loop here to check for all comps
-  for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
-    if (g_log->log_component[i].filelog == 1 ) {
-      g_log->log_component[i].fd = open(g_log->log_component[i].filelog_name,
-                                        O_WRONLY | O_CREAT | O_APPEND, 0666);
-    }
-  }
-
-  printf("log init done\n");
-
-  return 0;
-}
-
-void nfapi_log(char *file, char *func, int line, int comp, int level, const char* format, va_list args)
-{
-  //logRecord_mt(file,func,line, pthread_self(), comp, level, format, ##args)
-  int len = 0;
-  log_component_t *c;
-  char *log_start;
-  char *log_end;
-  /* The main difference with the version above is the use of this local log_buffer.
-   * The other difference is the return value of snprintf which was not used
-   * correctly. It was not a big problem because in practice MAX_LOG_TOTAL is
-   * big enough so that the buffer is never full.
-   */
-  char log_buffer[MAX_LOG_TOTAL];
-
-  /* for no gcc warnings */
-  (void)log_start;
-  (void)log_end;
-
-  c = &g_log->log_component[comp];
-
-  // do not apply filtering for LOG_F
-  // only log messages which are enabled and are below the global log level and component's level threshold
-  if ((level != LOG_FILE) && ((level > c->level) || (level > g_log->level))) {
-    /* if ((level != LOG_FILE) &&
-          ((level > c->level) ||
-           (level > g_log->level) ||
-           ( c->level > g_log->level))) {
-    */
-    return;
-  }
-
-  //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD, VCD_FUNCTION_IN);
-
-  // adjust syslog level for TRACE messages
-  if (g_log->syslog) {
-    if (g_log->level > LOG_DEBUG) {
-      g_log->level = LOG_DEBUG;
-    }
-  }
-
-  // make sure that for log trace the extra info is only printed once, reset when the level changes
-  if ((level == LOG_FILE) || (c->flag == LOG_NONE) || (level == LOG_TRACE)) {
-    log_start = log_buffer;
-    len = vsnprintf(log_buffer, MAX_LOG_TOTAL, format, args);
-    if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    log_end = log_buffer + len;
-  } else {
-    if ( (g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "%s",
-                      log_level_highlight_start[level]);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    log_start = log_buffer + len;
-
-    if ( (g_log->flag & FLAG_COMP) || (c->flag & FLAG_COMP) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s]",
-                      g_log->log_component[comp].name);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    if ( (g_log->flag & FLAG_LEVEL) || (c->flag & FLAG_LEVEL) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s]",
-                      g_log->level2string[level]);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    if ( (g_log->flag & FLAG_THREAD) || (c->flag & FLAG_THREAD) ) {
-#     define THREAD_NAME_LEN 128
-      char threadname[THREAD_NAME_LEN];
-      if (pthread_getname_np(pthread_self(), threadname, THREAD_NAME_LEN) != 0)
-      {
-        perror("pthread_getname_np : ");
-      } else {
-        len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s]", threadname);
-        if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-      }
-#     undef THREAD_NAME_LEN
-    }
-
-    if ( (g_log->flag & FLAG_FUNCT) || (c->flag & FLAG_FUNCT) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s] ",
-                      func);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    if ( (g_log->flag & FLAG_FILE_LINE) || (c->flag & FLAG_FILE_LINE) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s:%d]",
-                      file, line);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    //len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%08lx]", thread_id);
-    //if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-
-    len += vsnprintf(&log_buffer[len], MAX_LOG_TOTAL - len, format, args);
-    if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    log_end = log_buffer + len;
-
-    if ( (g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "%s",
-          log_level_highlight_end[level]);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-  }
-
-  va_end(args);
-
-  // OAI printf compatibility
-  if ((g_log->onlinelog == 1) && (level != LOG_FILE))
-#ifdef RTAI
-    if (len > MAX_LOG_TOTAL) {
-      rt_printk ("[OPENAIR] FIFO_PRINTF WROTE OUTSIDE ITS MEMORY BOUNDARY : ERRORS WILL OCCUR\n");
-    }
-
-  if (len > 0) {
-    rtf_put (FIFO_PRINTF_NO, log_buffer, len);
-  }
-
-#else
-  fwrite(log_buffer, len, 1, stdout);
-#endif
-
-#ifndef RTAI
-
-  if (g_log->syslog) {
-    syslog(g_log->level, "%s", log_buffer);
-  }
-
-  if (g_log->filelog) {
-    if (write(gfd, log_buffer, len) < len) {
-      // TODO assert ?
-    }
-  }
-
-  if ((g_log->log_component[comp].filelog) && (level == LOG_FILE)) {
-    if (write(g_log->log_component[comp].fd, log_buffer, len) < len) {
-      // TODO assert ?
-    }
-  }
-
-#else
-
-  // online print messges
-  if ((g_log->log_component[comp].filelog) && (level == LOG_FILE)) {
-    printf(log_buffer);
-  }
-
-#endif
-
-#if defined(ENABLE_ITTI)
-
-  if (level <= LOG_DEBUG) {
-    task_id_t origin_task_id = TASK_UNKNOWN;
-    MessagesIds messages_id;
-    MessageDef *message_p;
-    size_t      message_string_size;
-    char       *message_msg_p;
-
-    message_string_size = log_end - log_start;
-
-#if !defined(DISABLE_ITTI_DETECT_SUB_TASK_ID)
-
-    /* Try to identify sub task ID from log information (comp, log_instance_type) */
-    switch (comp) {
-    case PHY:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_PHY_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_PHY_UE;
-        break;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case MAC:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_MAC_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_MAC_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case RLC:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_RLC_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_RLC_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case PDCP:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_PDCP_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_PDCP_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    default:
-      break;
-    }
-
-#endif
-
-    switch (level) {
-    case LOG_EMERG:
-    case LOG_ALERT:
-    case LOG_CRIT:
-    case LOG_ERR:
-      messages_id = ERROR_LOG;
-      break;
-
-    case LOG_WARNING:
-      messages_id = WARNING_LOG;
-      break;
-
-    case LOG_NOTICE:
-      messages_id = NOTICE_LOG;
-      break;
-
-    case LOG_INFO:
-      messages_id = INFO_LOG;
-      break;
-
-    default:
-      messages_id = DEBUG_LOG;
-      break;
-    }
-
-    message_p = itti_alloc_new_message_sized(origin_task_id, messages_id, message_string_size);
-
-    switch (level) {
-    case LOG_EMERG:
-    case LOG_ALERT:
-    case LOG_CRIT:
-    case LOG_ERR:
-      message_msg_p = (char *) &message_p->ittiMsg.error_log;
-      break;
-
-    case LOG_WARNING:
-      message_msg_p = (char *) &message_p->ittiMsg.warning_log;
-      break;
-
-    case LOG_NOTICE:
-      message_msg_p = (char *) &message_p->ittiMsg.notice_log;
-      break;
-
-    case LOG_INFO:
-      message_msg_p = (char *) &message_p->ittiMsg.info_log;
-      break;
-
-    default:
-      message_msg_p = (char *) &message_p->ittiMsg.debug_log;
-      break;
-    }
-
-    memcpy(message_msg_p, log_start, message_string_size);
-
-    itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);
-  }
-
-#endif
-#if 0
-  LOG_params log_params;
-  int        len;
-
-  len = vsnprintf(log_params.l_buff_info, MAX_LOG_INFO-1, format, args);
-
-  //2 first parameters must be passed as 'const' to the thread function
-  log_params.file = strdup(file);
-  log_params.func = strdup(func);
-  log_params.line = line;
-  log_params.comp = PHY;//comp;
-  log_params.level = 6; // INFO - level;
-  log_params.format = format;
-  log_params.len = len;
-
-  if (pthread_mutex_lock(&log_lock) != 0) {
-    return;
-  }
-
-  log_list_tail++;
-  log_list[log_list_tail - 1] = log_params;
-
-  if (log_list_tail >= 1000) {
-    log_list_tail = 0;
-  }
-
-  if (log_list_nb_elements < 1000) {
-    log_list_nb_elements++;
-  }
-
-  if(pthread_cond_signal(&log_notify) != 0) {
-    pthread_mutex_unlock(&log_lock);
-    return;
-  }
-
-  if(pthread_mutex_unlock(&log_lock) != 0) {
-    return;
-  }
-
-#endif
-}
-
-//log record: add to a list
-void logRecord(const char *file, const char *func, int line,  int comp,
-               int level, const char *format, ...)
-{
-  va_list    args;
-  LOG_params log_params;
-  int        len;
-
-  va_start(args, format);
-  len = vsnprintf(log_params.l_buff_info, MAX_LOG_INFO-1, format, args);
-  va_end(args);
-
-  //2 first parameters must be passed as 'const' to the thread function
-  log_params.file = strdup(file);
-  log_params.func = strdup(func);
-  log_params.line = line;
-  log_params.comp = comp;
-  log_params.level = level;
-  log_params.format = format;
-  log_params.len = len;
-
-  if (pthread_mutex_lock(&log_lock) != 0) {
-    return;
-  }
-
-  log_list_tail++;
-  log_list[log_list_tail - 1] = log_params;
-
-  if (log_list_tail >= 1000) {
-    log_list_tail = 0;
-  }
-
-  if (log_list_nb_elements < 1000) {
-    log_list_nb_elements++;
-  }
-
-  if(pthread_cond_signal(&log_notify) != 0) {
-    pthread_mutex_unlock(&log_lock);
-    return;
-  }
-
-  if(pthread_mutex_unlock(&log_lock) != 0) {
-    return;
-  }
-
-  //log = malloc(sizeof(LOG_elt));
-  //log->next = NULL;
-  //log->log_params = log_params;
-  /* Add log task to queue */
-  //log_list_add_tail_eurecom(log, &log_list);
-
-}
-
-void logRecord_thread_safe(const char *file, const char *func,
-                           int line,  int comp, int level,
-                           int len, const char *params_string)
-{
-  log_component_t *c;
-  int total_len = 0;
-  char log_buffer[MAX_LOG_TOTAL];
-
-  c = &g_log->log_component[comp];
-
-  // do not apply filtering for LOG_F
-  // only log messages which are enabled and are below the global log level and component's level threshold
-  if ((level != LOG_FILE) && ((c->level > g_log->level) ||
-                              (level > c->level) || (level > g_log->level))) {
-    return;
-  }
-
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD,
-                                          VCD_FUNCTION_IN);
-
-  // adjust syslog level for TRACE messages
-  if (g_log->syslog) {
-    if (g_log->level > LOG_DEBUG) {
-      g_log->level = LOG_DEBUG;
-    }
-  }
-
-  // make sure that for log trace the extra info is only printed once, reset when the level changes
-  if ((level == LOG_FILE) ||  (c->flag == LOG_NONE)  || (level ==LOG_TRACE )) {
-    total_len = snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - 1, "%s",
-                         params_string);
-  } else {
-    if ((g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR)) {
-      total_len += snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - total_len, "%s",
-                            log_level_highlight_start[level]);
-    }
-
-    if ((g_log->flag & FLAG_COMP) || (c->flag & FLAG_COMP) ) {
-      total_len += snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - total_len, "[%s]",
-                            g_log->log_component[comp].name);
-    }
-
-    if ((g_log->flag & FLAG_LEVEL) || (c->flag & FLAG_LEVEL)) {
-      total_len += snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - total_len, "[%s]",
-                            g_log->level2string[level]);
-    }
-
-    if ((g_log->flag & FLAG_FUNCT) || (c->flag & FLAG_FUNCT)) {
-      total_len += snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - total_len, "[%s] ",
-                            func);
-    }
-
-    if ((g_log->flag & FLAG_FILE_LINE) || (c->flag & FLAG_FILE_LINE) )  {
-      total_len += snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - total_len, "[%s:%d]",
-                            file, line);
-    }
-
-    len += snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - len, "%s",
-                    params_string);
-
-    if ((g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR)) {
-      total_len += snprintf(&log_buffer[total_len], MAX_LOG_TOTAL - total_len, "%s",
-                            log_level_highlight_end[level]);
-    }
-  }
-
-  // OAI printf compatibility
-  if ((g_log->onlinelog == 1) && (level != LOG_FILE)) {
-    fprintf(stdout, "%s", log_buffer);
-  }
-
-  if (g_log->syslog) {
-    syslog(g_log->level, "%s", log_buffer);
-  }
-
-  if (g_log->filelog) {
-    if (write(gfd, log_buffer, total_len) < total_len) {
-      // TODO assert ?
-    }
-  }
-
-  if ((g_log->log_component[comp].filelog) && (level == LOG_FILE)) {
-    if (write(g_log->log_component[comp].fd, log_buffer, total_len) < total_len) {
-      // TODO assert ?
-    }
-  }
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD,
-                                          VCD_FUNCTION_OUT);
-}
-
-#if !defined(LOG_NO_THREAD)
-void *log_thread_function(void *list)
-{
-
-  LOG_params log_params;
-
-  for(;;) {
-
-    //log_elt = NULL;
-
-    /* Lock must be taken to wait on conditional variable */
-    pthread_mutex_lock(&log_lock);
-
-    /* Wait on condition variable, check for spurious wakeups.
-       When returning from pthread_cond_wait(), we own the lock. */
-
-    // sleep
-    while((log_list_nb_elements == 0) && (log_shutdown == 0)) {
-      pthread_cond_wait(&log_notify, &log_lock);
-    }
-
-    // exit
-    if ((log_shutdown==1) && (log_list_nb_elements == 0)) {
-      break;
-    }
-
-    /* Grab our task */
-    //log_elt = log_list_remove_head(&log_list);
-    log_params = log_list[log_list_head];
-    log_list_head++;
-    log_list_nb_elements--;
-
-    if (log_list_head >= 1000) {
-      log_list_head = 0;
-    }
-
-
-    /* Unlock */
-    pthread_mutex_unlock(&log_lock);
-
-    /* Get to work */
-    logRecord_thread_safe(log_params.file,
-                          log_params.func,
-                          log_params.line,
-                          log_params.comp,
-                          log_params.level,
-                          log_params.len,
-                          log_params.l_buff_info);
-
-    //free(log_elt);
-  }
-}
-#endif
-
-#if 0
-/* This function does not work. When multiple threads call it at the same time
- * for the same component, both threads end up using the same buffer.
- * The output is the completely messed up/wrong.
- * Kept in case the fix below is not correct or acceptable.
- */
-//log record, format, and print:  executed in the main thread (mt)
-void logRecord_mt(const char *file, const char *func, int line, int comp,
-                  int level, const char *format, ...)
-{
-  int len = 0;
-  va_list args;
-  log_component_t *c;
-  char *log_start;
-  char *log_end;
-
-  /* for no gcc warnings */
-  (void)log_start;
-  (void)log_end;
-
-  c = &g_log->log_component[comp];
-
-  // do not apply filtering for LOG_F
-  // only log messages which are enabled and are below the global log level and component's level threshold
-  if ((level != LOG_FILE) && ((level > c->level) || (level > g_log->level))) {
-    /* if ((level != LOG_FILE) &&
-          ((level > c->level) ||
-           (level > g_log->level) ||
-           ( c->level > g_log->level))) {
-    */
-    return;
-  }
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD,
-                                          VCD_FUNCTION_IN);
-
-  va_start(args, format);
-
-  // adjust syslog level for TRACE messages
-  if (g_log->syslog) {
-    if (g_log->level > LOG_DEBUG) {
-      g_log->level = LOG_DEBUG;
-    }
-  }
-
-  // make sure that for log trace the extra info is only printed once, reset when the level changes
-  if ((level == LOG_FILE) || (c->flag == LOG_NONE) || (level == LOG_TRACE)) {
-    log_start = c->log_buffer;
-    len = vsnprintf(c->log_buffer, MAX_LOG_TOTAL-1, format, args);
-    log_end = c->log_buffer + len;
-  } else {
-    if ( (g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR) ) {
-      len += snprintf(&c->log_buffer[len], MAX_LOG_TOTAL - len, "%s",
-                      log_level_highlight_start[level]);
-    }
-
-    log_start = c->log_buffer + len;
-
-    if ( (g_log->flag & FLAG_COMP) || (c->flag & FLAG_COMP) ) {
-      len += snprintf(&c->log_buffer[len], MAX_LOG_TOTAL - len, "[%s]",
-                      g_log->log_component[comp].name);
-    }
-
-    if ( (g_log->flag & FLAG_LEVEL) || (c->flag & FLAG_LEVEL) ) {
-      len += snprintf(&c->log_buffer[len], MAX_LOG_TOTAL - len, "[%s]",
-                      g_log->level2string[level]);
-    }
-
-    if ( (g_log->flag & FLAG_FUNCT) || (c->flag & FLAG_FUNCT) ) {
-      len += snprintf(&c->log_buffer[len], MAX_LOG_TOTAL - len, "[%s] ",
-                      func);
-    }
-
-    if ( (g_log->flag & FLAG_FILE_LINE) || (c->flag & FLAG_FILE_LINE) ) {
-      len += snprintf(&c->log_buffer[len], MAX_LOG_TOTAL - len, "[%s:%d]",
-                      file, line);
-    }
-
-    len += vsnprintf(&c->log_buffer[len], MAX_LOG_TOTAL - len, format, args);
-    log_end = c->log_buffer + len;
-
-    if ( (g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR) ) {
-      len += snprintf(&c->log_buffer[len], MAX_LOG_TOTAL - len, "%s",
-                      log_level_highlight_end[level]);
-    }
-  }
-
-  va_end(args);
-
-  // OAI printf compatibility
-  if ((g_log->onlinelog == 1) && (level != LOG_FILE))
-    fwrite(c->log_buffer, len, 1, stdout);
-
-  if (g_log->syslog) {
-    syslog(g_log->level, "%s", c->log_buffer);
-  }
-
-  if (g_log->filelog) {
-    if (write(gfd, c->log_buffer, len) < len) {
-      // TODO assert ?
-    }
-  }
-
-  if ((g_log->log_component[comp].filelog) && (level == LOG_FILE)) {
-    if (write(g_log->log_component[comp].fd, c->log_buffer, len) < len) {
-      // TODO assert ?
-    }
-  }
-
-#if defined(ENABLE_ITTI)
-
-  if (level <= LOG_DEBUG) {
-    task_id_t origin_task_id = TASK_UNKNOWN;
-    MessagesIds messages_id;
-    MessageDef *message_p;
-    size_t      message_string_size;
-    char       *message_msg_p;
-
-    message_string_size = log_end - log_start;
-
-#if !defined(DISABLE_ITTI_DETECT_SUB_TASK_ID)
-
-    /* Try to identify sub task ID from log information (comp, log_instance_type) */
-    switch (comp) {
-    case PHY:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_PHY_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_PHY_UE;
-        break;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case MAC:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_MAC_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_MAC_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case RLC:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_RLC_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_RLC_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case PDCP:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_PDCP_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_PDCP_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    default:
-      break;
-    }
-
-#endif
-
-    switch (level) {
-    case LOG_EMERG:
-    case LOG_ALERT:
-    case LOG_CRIT:
-    case LOG_ERR:
-      messages_id = ERROR_LOG;
-      break;
-
-    case LOG_WARNING:
-      messages_id = WARNING_LOG;
-      break;
-
-    case LOG_NOTICE:
-      messages_id = NOTICE_LOG;
-      break;
-
-    case LOG_INFO:
-      messages_id = INFO_LOG;
-      break;
-
-    default:
-      messages_id = DEBUG_LOG;
-      break;
-    }
-
-    message_p = itti_alloc_new_message_sized(origin_task_id, messages_id, message_string_size);
-
-    switch (level) {
-    case LOG_EMERG:
-    case LOG_ALERT:
-    case LOG_CRIT:
-    case LOG_ERR:
-      message_msg_p = (char *) &message_p->ittiMsg.error_log;
-      break;
-
-    case LOG_WARNING:
-      message_msg_p = (char *) &message_p->ittiMsg.warning_log;
-      break;
-
-    case LOG_NOTICE:
-      message_msg_p = (char *) &message_p->ittiMsg.notice_log;
-      break;
-
-    case LOG_INFO:
-      message_msg_p = (char *) &message_p->ittiMsg.info_log;
-      break;
-
-    default:
-      message_msg_p = (char *) &message_p->ittiMsg.debug_log;
-      break;
-    }
-
-    memcpy(message_msg_p, log_start, message_string_size);
-
-    itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);
-  }
-
-#endif
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD,
-                                          VCD_FUNCTION_OUT);
-}
-#endif /* #if 0 */
-
-//log record, format, and print:  executed in the main thread (mt)
-void logRecord_mt(const char *file, const char *func, int line, int comp,
-                  int level, const char *format, ...)
-{
-  int len = 0;
-  va_list args;
-  log_component_t *c;
-  char *log_start;
-  char *log_end;
-  /* The main difference with the version above is the use of this local log_buffer.
-   * The other difference is the return value of snprintf which was not used
-   * correctly. It was not a big problem because in practice MAX_LOG_TOTAL is
-   * big enough so that the buffer is never full.
-   */
-  char log_buffer[MAX_LOG_TOTAL];
-
-  /* for no gcc warnings */
-  (void)log_start;
-  (void)log_end;
-
-  c = &g_log->log_component[comp];
-
-  // do not apply filtering for LOG_F
-  // only log messages which are enabled and are below the global log level and component's level threshold
-  if ((level != LOG_FILE) && ((level > c->level) || (level > g_log->level))) {
-    /* if ((level != LOG_FILE) &&
-          ((level > c->level) ||
-           (level > g_log->level) ||
-           ( c->level > g_log->level))) {
-    */
-    return;
-  }
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD,
-                                          VCD_FUNCTION_IN);
-
-  va_start(args, format);
-
-  // adjust syslog level for TRACE messages
-  if (g_log->syslog) {
-    if (g_log->level > LOG_DEBUG) {
-      g_log->level = LOG_DEBUG;
-    }
-  }
-
-  // make sure that for log trace the extra info is only printed once, reset when the level changes
-  if ((level == LOG_FILE) || (c->flag == LOG_NONE) || (level == LOG_TRACE)) {
-    log_start = log_buffer;
-    len = vsnprintf(log_buffer, MAX_LOG_TOTAL, format, args);
-    if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    log_end = log_buffer + len;
-  } else {
-    if ( (g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "%s",
-                      log_level_highlight_start[level]);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    log_start = log_buffer + len;
-
-    if ( (g_log->flag & FLAG_COMP) || (c->flag & FLAG_COMP) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s]",
-                      g_log->log_component[comp].name);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    if ( (g_log->flag & FLAG_LEVEL) || (c->flag & FLAG_LEVEL) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s]",
-                      g_log->level2string[level]);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    if ( (g_log->flag & FLAG_THREAD) || (c->flag & FLAG_THREAD) ) {
-#     define THREAD_NAME_LEN 128
-      char threadname[THREAD_NAME_LEN];
-      if (pthread_getname_np(pthread_self(), threadname, THREAD_NAME_LEN) != 0)
-      {
-        perror("pthread_getname_np : ");
-      } else {
-        len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s]", threadname);
-        if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-      }
-#     undef THREAD_NAME_LEN
-    }
-
-    if ( (g_log->flag & FLAG_FUNCT) || (c->flag & FLAG_FUNCT) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s] ",
-                      func);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    if ( (g_log->flag & FLAG_FILE_LINE) || (c->flag & FLAG_FILE_LINE) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "[%s:%d]",
-                      file, line);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-
-    len += vsnprintf(&log_buffer[len], MAX_LOG_TOTAL - len, format, args);
-    if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    log_end = log_buffer + len;
-
-    if ( (g_log->flag & FLAG_COLOR) || (c->flag & FLAG_COLOR) ) {
-      len += snprintf(&log_buffer[len], MAX_LOG_TOTAL - len, "%s",
-                      log_level_highlight_end[level]);
-      if (len > MAX_LOG_TOTAL) len = MAX_LOG_TOTAL;
-    }
-  }
-
-  va_end(args);
-
-  // OAI printf compatibility
-  if ((g_log->onlinelog == 1) && (level != LOG_FILE))
-    fwrite(log_buffer, len, 1, stdout);
-
-  if (g_log->syslog) {
-    syslog(g_log->level, "%s", log_buffer);
-  }
-
-  if (g_log->filelog) {
-    if (write(gfd, log_buffer, len) < len) {
-      // TODO assert ?
-    }
-  }
-
-  if ((g_log->log_component[comp].filelog) && (level == LOG_FILE)) {
-    if (write(g_log->log_component[comp].fd, log_buffer, len) < len) {
-      // TODO assert ?
-    }
-  }
-
-#if defined(ENABLE_ITTI)
-
-  if (level <= LOG_DEBUG) {
-    task_id_t origin_task_id = TASK_UNKNOWN;
-    MessagesIds messages_id;
-    MessageDef *message_p;
-    size_t      message_string_size;
-    char       *message_msg_p;
-
-    message_string_size = log_end - log_start;
-
-#if !defined(DISABLE_ITTI_DETECT_SUB_TASK_ID)
-
-    /* Try to identify sub task ID from log information (comp, log_instance_type) */
-    switch (comp) {
-    case PHY:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_PHY_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_PHY_UE;
-        break;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case MAC:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_MAC_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_MAC_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case RLC:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_RLC_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_RLC_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    case PDCP:
-      switch (log_instance_type) {
-      case LOG_INSTANCE_ENB:
-        origin_task_id = TASK_PDCP_ENB;
-        break;
-
-      case LOG_INSTANCE_UE:
-        origin_task_id = TASK_PDCP_UE;
-
-      default:
-        break;
-      }
-
-      break;
-
-    default:
-      break;
-    }
-
-#endif
-
-    switch (level) {
-    case LOG_EMERG:
-    case LOG_ALERT:
-    case LOG_CRIT:
-    case LOG_ERR:
-      messages_id = ERROR_LOG;
-      break;
-
-    case LOG_WARNING:
-      messages_id = WARNING_LOG;
-      break;
-
-    case LOG_NOTICE:
-      messages_id = NOTICE_LOG;
-      break;
-
-    case LOG_INFO:
-      messages_id = INFO_LOG;
-      break;
-
-    default:
-      messages_id = DEBUG_LOG;
-      break;
-    }
-
-    message_p = itti_alloc_new_message_sized(origin_task_id, messages_id, message_string_size);
-
-    switch (level) {
-    case LOG_EMERG:
-    case LOG_ALERT:
-    case LOG_CRIT:
-    case LOG_ERR:
-      message_msg_p = (char *) &message_p->ittiMsg.error_log;
-      break;
-
-    case LOG_WARNING:
-      message_msg_p = (char *) &message_p->ittiMsg.warning_log;
-      break;
-
-    case LOG_NOTICE:
-      message_msg_p = (char *) &message_p->ittiMsg.notice_log;
-      break;
-
-    case LOG_INFO:
-      message_msg_p = (char *) &message_p->ittiMsg.info_log;
-      break;
-
-    default:
-      message_msg_p = (char *) &message_p->ittiMsg.debug_log;
-      break;
-    }
-
-    memcpy(message_msg_p, log_start, message_string_size);
-
-    itti_send_msg_to_task(TASK_UNKNOWN, INSTANCE_DEFAULT, message_p);
-  }
-
-#endif
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_LOG_RECORD,
-                                          VCD_FUNCTION_OUT);
-}
-
-int set_log(int component, int level, int interval)
-{
-  /* Checking parameters */
-  DevCheck((component >= MIN_LOG_COMPONENTS) && (component < MAX_LOG_COMPONENTS),
-           component, MIN_LOG_COMPONENTS, MAX_LOG_COMPONENTS);
-  DevCheck((level <= LOG_TRACE) && (level >= LOG_EMERG), level, LOG_TRACE,
-           LOG_EMERG);
-  DevCheck((interval >= 0) && (interval <= 0xFF), interval, 0, 0xFF);
-
-  g_log->log_component[component].level = level;
-
-  switch (level) {
-  case LOG_TRACE:
-    g_log->log_component[component].flag = LOG_MED ;
-    break;
-
-  case LOG_DEBUG:
-    g_log->log_component[component].flag = LOG_MED ;
-    break;
-
-  case LOG_INFO:
-    g_log->log_component[component].flag = LOG_LOW ;
-    break;
-
-  default:
-    g_log->log_component[component].flag = LOG_NONE ;
-    break;
-  }
-
-  g_log->log_component[component].interval = interval;
-
-  return 0;
-}
-
-int set_comp_log(int component, int level, int verbosity, int interval)
-{
-  /* Checking parameters */
-  DevCheck((component >= MIN_LOG_COMPONENTS) && (component < MAX_LOG_COMPONENTS),
-           component, MIN_LOG_COMPONENTS, MAX_LOG_COMPONENTS);
-  DevCheck((level <= LOG_TRACE) && (level >= LOG_EMERG), level, LOG_TRACE,
-           LOG_EMERG);
-  DevCheck((interval >= 0) && (interval <= 0xFF), interval, 0, 0xFF);
-
-#if 0
-  if ((verbosity == LOG_NONE) || (verbosity == LOG_LOW) ||
-      (verbosity == LOG_MED) || (verbosity == LOG_FULL) ||
-      (verbosity == LOG_HIGH)) {
-    g_log->log_component[component].flag = verbosity;
-  }
-#else
-  g_log->log_component[component].flag = verbosity;
-#endif
-
-  g_log->log_component[component].level = level;
-  g_log->log_component[component].interval = interval;
-
-  return 0;
-}
-
-void set_glog(int level, int verbosity)
-{
-  if( g_log->level >= 0) g_log->level = level;
-  if( g_log->flag >= 0)  g_log->flag = verbosity;
-}
-void set_glog_syslog(int enable)
-{
-  g_log->syslog = enable;
-}
-void set_glog_onlinelog(int enable)
-{
-  g_log->onlinelog = enable;
-}
-void set_glog_filelog(int enable)
-{
-  g_log->filelog = enable;
-}
-
-void set_component_filelog(int comp)
-{
-  if (g_log->log_component[comp].filelog ==  0) {
-    g_log->log_component[comp].filelog =  1;
-
-    if (g_log->log_component[comp].fd == 0) {
-      g_log->log_component[comp].fd = open(g_log->log_component[comp].filelog_name,
-                                           O_WRONLY | O_CREAT | O_TRUNC, 0666);
-    }
-  }
-}
-
-/*
- * for the two functions below, the passed array must have a final entry
- * with string value NULL
- */
-/* map a string to an int. Takes a mapping array and a string as arg */
-int map_str_to_int(mapping *map, const char *str)
-{
-  while (1) {
-    if (map->name == NULL) {
-      return(-1);
-    }
-
-    if (!strcmp(map->name, str)) {
-      return(map->value);
-    }
-
-    map++;
-  }
-}
-
-/* map an int to a string. Takes a mapping array and a value */
-char *map_int_to_str(mapping *map, int val)
-{
-  while (1) {
-    if (map->name == NULL) {
-      return NULL;
-    }
-
-    if (map->value == val) {
-      return map->name;
-    }
-
-    map++;
-  }
-}
-
-int is_newline( char *str, int size)
-{
-  int i;
-
-  for (  i = 0; i < size; i++ ) {
-    if ( str[i] == '\n' ) {
-      return 1;
-    }
-  }
-
-  /* if we get all the way to here, there must not have been a newline! */
-  return 0;
-}
-
-void logClean (void)
-{
-  int i;
-
-  if (g_log->syslog) {
-    closelog();
-  }
-
-  if (g_log->filelog) {
-    close(gfd);
-  }
-
-  for (i=MIN_LOG_COMPONENTS; i < MAX_LOG_COMPONENTS; i++) {
-    if (g_log->log_component[i].filelog) {
-      close(g_log->log_component[i].fd);
-    }
-  }
-}
-
-#if defined(ENABLE_ITTI)
-void log_set_instance_type (log_instance_type_t instance)
-{
-  log_instance_type = instance;
-}
-#endif
-
-#ifdef LOG_TEST
-
-int main(int argc, char *argv[])
-{
-
-  logInit();
-
-  //set_log_syslog(1);
-  test_log();
-
-  return 1;
-}
-
-int test_log(void)
-{
-  LOG_ENTER(MAC); // because the default level is DEBUG
-  LOG_I(EMU, "1 Starting OAI logs version %s Build date: %s on %s\n",
-        BUILD_VERSION, BUILD_DATE, BUILD_HOST);
-  LOG_D(MAC, "1 debug  MAC \n");
-  LOG_N(MAC, "1 notice MAC \n");
-  LOG_W(MAC, "1 warning MAC \n");
-
-  set_comp_log(EMU, LOG_INFO, FLAG_ONLINE);
-  set_comp_log(MAC, LOG_WARNING, 0);
-
-  LOG_I(EMU, "2 Starting OAI logs version %s Build date: %s on %s\n",
-        BUILD_VERSION, BUILD_DATE, BUILD_HOST);
-  LOG_E(MAC, "2 emerge MAC\n");
-  LOG_D(MAC, "2 debug  MAC \n");
-  LOG_N(MAC, "2 notice MAC \n");
-  LOG_W(MAC, "2 warning MAC \n");
-  LOG_I(MAC, "2 info MAC \n");
-
-
-  set_comp_log(MAC, LOG_NOTICE, 1);
-
-  LOG_ENTER(MAC);
-  LOG_I(EMU, "3 Starting OAI logs version %s Build date: %s on %s\n",
-        BUILD_VERSION, BUILD_DATE, BUILD_HOST);
-  LOG_D(MAC, "3 debug  MAC \n");
-  LOG_N(MAC, "3 notice MAC \n");
-  LOG_W(MAC, "3 warning MAC \n");
-  LOG_I(MAC, "3 info MAC \n");
-
-  set_comp_log(MAC, LOG_DEBUG,1);
-  set_comp_log(EMU, LOG_DEBUG,1);
-
-  LOG_ENTER(MAC);
-  LOG_I(EMU, "4 Starting OAI logs version %s Build date: %s on %s\n",
-        BUILD_VERSION, BUILD_DATE, BUILD_HOST);
-  LOG_D(MAC, "4 debug  MAC \n");
-  LOG_N(MAC, "4 notice MAC \n");
-  LOG_W(MAC, "4 warning MAC \n");
-  LOG_I(MAC, "4 info MAC \n");
-
-
-  set_comp_log(MAC, LOG_DEBUG,0);
-  set_comp_log(EMU, LOG_DEBUG,0);
-
-  LOG_I(LOG, "5 Starting OAI logs version %s Build date: %s on %s\n",
-        BUILD_VERSION, BUILD_DATE, BUILD_HOST);
-  LOG_D(MAC, "5 debug  MAC \n");
-  LOG_N(MAC, "5 notice MAC \n");
-  LOG_W(MAC, "5 warning MAC \n");
-  LOG_I(MAC, "5 info MAC \n");
-
-
-  set_comp_log(MAC, LOG_TRACE,0X07F);
-  set_comp_log(EMU, LOG_TRACE,0X07F);
-
-  LOG_ENTER(MAC);
-  LOG_I(LOG, "6 Starting OAI logs version %s Build date: %s on %s\n",
-        BUILD_VERSION, BUILD_DATE, BUILD_HOST);
-  LOG_D(MAC, "6 debug  MAC \n");
-  LOG_N(MAC, "6 notice MAC \n");
-  LOG_W(MAC, "6 warning MAC \n");
-  LOG_I(MAC, "6 info MAC \n");
-  LOG_EXIT(MAC);
-
-  return 0;
-}
-#endif
diff --git a/openair3/NAS/COMMON/UTIL/nas_timer.c b/openair3/NAS/COMMON/UTIL/nas_timer.c
index 7ddcb61d1dc1cca7f1839ed07883b5dac1ec37d9..9ccca12520f3c6101ea9b978bb543cf02d4bde5a 100644
--- a/openair3/NAS/COMMON/UTIL/nas_timer.c
+++ b/openair3/NAS/COMMON/UTIL/nas_timer.c
@@ -43,13 +43,7 @@ Description Timer utilities
 #include <string.h> // memset
 #include <stdlib.h> // malloc, free
 #include <sys/time.h>   // setitimer
-
-#if defined(ENABLE_ITTI)
-# include "intertask_interface.h"
-#else
-# include <signal.h>
-# include <time.h>   // clock_gettime
-#endif
+#include "intertask_interface.h"
 #include "nas_timer.h"
 #include "commonDef.h"
 #include "msc.h"
@@ -69,11 +63,7 @@ Description Timer utilities
  * value when the timer entry was allocated.
  */
 typedef struct {
-#if defined(ENABLE_ITTI)
-  long timer_id;          /* Timer id returned by the timer API from ITTI */
-#else
-  pthread_t pid;          /* Thread identifier of the callback    */
-#endif
+long timer_id;          /* Timer id returned by the timer API from ITTI */
 
   struct timeval itv;     /* Initial interval timer value         */
   struct timeval tv;      /* Interval timer value                 */
@@ -105,10 +95,6 @@ typedef struct {
 #define TIMER_DATABASE_SIZE 256
   timer_queue_t tq[TIMER_DATABASE_SIZE];
   timer_queue_t *head;/* Pointer to the first timer entry to be fired  */
-
-#if !defined(ENABLE_ITTI)
-  pthread_mutex_t mutex;
-#endif
 } nas_timer_database_t;
 
 /*
@@ -118,25 +104,15 @@ static nas_timer_database_t _nas_timer_db = {
   0,
   {},
   NULL
-#if !defined(ENABLE_ITTI)
-  , PTHREAD_MUTEX_INITIALIZER
-#endif
 };
 
-#if defined(ENABLE_ITTI)
 #define nas_timer_lock_db()
 #define nas_timer_unlock_db()
-#else
-#define nas_timer_lock_db()     pthread_mutex_lock(&_nas_timer_db.mutex)
-#define nas_timer_unlock_db()   pthread_mutex_unlock(&_nas_timer_db.mutex)
-#endif
 
 /*
  * The handler executed whenever the system timer expires
  */
-#if !defined(ENABLE_ITTI)
-static void _nas_timer_handler(int signal);
-#endif
+
 
 /*
  * -----------------------------------------------------------------------------
@@ -191,33 +167,6 @@ int nas_timer_init(void)
   /* Initialize the timer database */
   _nas_timer_db_init();
 
-#if !defined(ENABLE_ITTI)
-  /* Setup the timer database handler */
-  struct sigaction act;
-
-  (void) memset (&act, 0, sizeof (act));
-  (void) sigfillset (&act.sa_mask);
-  (void) sigdelset (&act.sa_mask, SIGHUP);
-  (void) sigdelset (&act.sa_mask, SIGINT);
-  (void) sigdelset (&act.sa_mask, SIGTERM);
-  (void) sigdelset (&act.sa_mask, SIGILL);
-  (void) sigdelset (&act.sa_mask, SIGTRAP);
-  (void) sigdelset (&act.sa_mask, SIGIOT);
-# ifndef LINUX
-  (void) sigdelset (&act.sa_mask, SIGEMT);
-# endif
-  (void) sigdelset (&act.sa_mask, SIGFPE);
-  (void) sigdelset (&act.sa_mask, SIGBUS);
-  (void) sigdelset (&act.sa_mask, SIGSEGV);
-  (void) sigdelset (&act.sa_mask, SIGSYS);
-
-  act.sa_handler = _nas_timer_handler;
-
-  if ( sigaction (SIGALRM, &act, 0) < 0 ) {
-    return (RETURNerror);
-  }
-
-#endif
   return (RETURNok);
 }
 
@@ -243,10 +192,8 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args)
 {
   int id;
   nas_timer_entry_t *te;
-#if defined(ENABLE_ITTI)
   int ret;
   long timer_id;
-#endif
 
   /* Do not start null timer */
   if (sec == 0) {
@@ -270,7 +217,6 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args)
 
   /* Insert the new entry into the timer queue */
   _nas_timer_db_insert_entry(id, te);
-#if defined(ENABLE_ITTI)
 # if defined(NAS_MME)
   ret = timer_setup(sec, 0, TASK_NAS_MME, INSTANCE_DEFAULT, TIMER_PERIODIC, args, &timer_id);
 # else
@@ -280,10 +226,7 @@ int nas_timer_start(long sec, nas_timer_callback_t cb, void *args)
   if (ret == -1) {
     return NAS_TIMER_INACTIVE_ID;
   }
-
   te->timer_id = timer_id;
-#endif
-
   return (id);
 }
 
@@ -309,11 +252,7 @@ int nas_timer_stop(int id)
     nas_timer_entry_t *entry;
     /* Remove the entry from the timer queue */
     entry = _nas_timer_db_remove_entry(id);
-#if defined(ENABLE_ITTI)
     timer_remove(entry->timer_id);
-#else
-    (void)entry;
-#endif
     /* Delete the timer entry */
     _nas_timer_db_delete_entry(id);
     return (NAS_TIMER_INACTIVE_ID);
@@ -380,7 +319,7 @@ int nas_timer_restart(int id)
  **      Others:    _nas_timer_db                              **
  **                                                                        **
  ***************************************************************************/
-#if defined(ENABLE_ITTI)
+
 void nas_timer_handle_signal_expiry(long timer_id, void *arg_p)
 {
   /* Get the timer entry for which the system timer expired */
@@ -388,25 +327,7 @@ void nas_timer_handle_signal_expiry(long timer_id, void *arg_p)
 
   te->cb(te->args);
 }
-#else
-static void _nas_timer_handler(int signal)
-{
-  /* At least one timer has been started */
-  assert( (_nas_timer_db.head != NULL) && (_nas_timer_db.head->entry != NULL) );
-
-  /* Get the timer entry for which the system timer expired */
-  nas_timer_entry_t *te = _nas_timer_db.head->entry;
-
-  threadCreate (&te->pid, te->cb, te->args, "nas-timer", -1, OAI_PRIORITY_RT_LOW);
 
-    void *result = NULL;
-    (void) pthread_join(te->pid, &result);
-
-    if (result) {
-      free(result);
-    }
-}
-#endif
 
 /*
  * -----------------------------------------------------------------------------
@@ -605,17 +526,7 @@ static void _nas_timer_db_insert_entry(int id, nas_timer_entry_t *te)
   restart = _nas_timer_db_insert(&_nas_timer_db.tq[id]);
   nas_timer_unlock_db();
 
-#if !defined(ENABLE_ITTI)
-
-  if (restart) {
-    /* The new entry is the first entry of the list;
-     * restart the system timer */
-    setitimer(ITIMER_REAL, &it, 0);
-  }
-
-#else
   (void)(restart);
-#endif
 }
 
 static int _nas_timer_db_insert(timer_queue_t *entry)
@@ -704,21 +615,8 @@ static nas_timer_entry_t *_nas_timer_db_remove_entry(int id)
     tv.tv_usec = ts.tv_nsec/1000;
     /* tv = tv - time() */
     rc = _nas_timer_sub(&_nas_timer_db.head->entry->tv, &tv, &it.it_value);
-
-#if defined(ENABLE_ITTI)
     timer_remove(_nas_timer_db.head->entry->timer_id);
     (void) (rc);
-#else
-
-    if (rc < 0) {
-      /* The system timer should have already expired */
-      _nas_timer_handler(SIGALRM);
-    } else {
-      /* Restart the system timer */
-      setitimer(ITIMER_REAL, &it, 0);
-    }
-
-#endif
   }
 
   /* Return a pointer to the removed entry */
@@ -749,17 +647,6 @@ static int _nas_timer_db_remove(timer_queue_t *entry)
       /* Other timers are scheduled to expire */
       return TRUE;
     }
-
-#if !defined(ENABLE_ITTI)
-    {
-      /* No more timer is scheduled to expire; stop the system timer */
-      struct itimerval it;
-      it.it_interval.tv_sec = it.it_interval.tv_usec = 0;
-      it.it_value.tv_sec = it.it_value.tv_usec = 0;
-      setitimer(ITIMER_REAL, &it, 0);
-      return FALSE;
-    }
-#endif
   }
 
   /* The entry was NOT the first entry of the list */
diff --git a/openair3/NAS/UE/ESM/PdnConnectivity.c b/openair3/NAS/UE/ESM/PdnConnectivity.c
index 48730f2ca9d2f68e981f8268362d89b8af8bde1b..3b5bad7529d386bca0eb92b4afca5bbe8de16d8a 100644
--- a/openair3/NAS/UE/ESM/PdnConnectivity.c
+++ b/openair3/NAS/UE/ESM/PdnConnectivity.c
@@ -61,9 +61,7 @@ Description Defines the PDN connectivity ESM procedure executed by the
 
 #include "emm_sap.h"
 
-#if defined(ENABLE_ITTI)
 # include "assertions.h"
-#endif
 
 /****************************************************************************/
 /****************  E X T E R N A L    D E F I N I T I O N S  ****************/
diff --git a/openair3/NAS/UE/nas_ue_task.c b/openair3/NAS/UE/nas_ue_task.c
index 6df66666389ce1c3f7f36163f51cccf0205b5249..d712a7b7f091a8e80534dd93a789cb443ea3bf54 100644
--- a/openair3/NAS/UE/nas_ue_task.c
+++ b/openair3/NAS/UE/nas_ue_task.c
@@ -20,7 +20,6 @@
  */
 
 #include "utils.h"
-#if defined(ENABLE_ITTI)
 # include "assertions.h"
 # include "intertask_interface.h"
 # include "nas_ue_task.h"
@@ -301,4 +300,3 @@ char *make_port_str_from_ueid(const char *base_port_str, int ueid) {
 
   return itoa(port);
 }
-#endif
diff --git a/openair3/NAS/UE/nas_ue_task.h b/openair3/NAS/UE/nas_ue_task.h
index c9890719cbcf51793c092a3c9d1a88eb2d5adc9f..5615f366b71e4c9c1a2e336dac55fd06577794e0 100644
--- a/openair3/NAS/UE/nas_ue_task.h
+++ b/openair3/NAS/UE/nas_ue_task.h
@@ -33,8 +33,6 @@ typedef struct {
 
 nas_user_t *find_user_from_fd(nas_user_container_t *users, int fd);
 
-# if defined(ENABLE_ITTI)
 void *nas_ue_task(void *args_p);
-# endif
 
 #endif /* NAS_TASK_H_ */
diff --git a/targets/ARCH/ADRV9371_ZC706/SYRTEM_IQ_uninstall_previous_SW.sh b/targets/ARCH/ADRV9371_ZC706/SYRTEM_IQ_uninstall_previous_SW.sh
index 6651a3beb82e136adbafd221d8659b0fc01b6be5..e0d5289f0005d44873e19bb150e51d054a4a991b 100755
--- a/targets/ARCH/ADRV9371_ZC706/SYRTEM_IQ_uninstall_previous_SW.sh
+++ b/targets/ARCH/ADRV9371_ZC706/SYRTEM_IQ_uninstall_previous_SW.sh
@@ -4,7 +4,7 @@ MODULE="riffa"
 KERNEL_VERSION=$(uname -r)
 RHR=/etc/redhat-release
 
-sudo apt-get install -y --allow-unauthenticated linux-headers-`uname -r`
+sudo apt-get install -y linux-headers-`uname -r`
 
 if lsmod | grep "$MODULE" &> /dev/null ; then
 	echo "Previous SYRIQ is loaded!"
diff --git a/targets/ARCH/COMMON/common_lib.c b/targets/ARCH/COMMON/common_lib.c
index 16b86cfd64778d50b8bdefe48ecd8ec2bfdd5445..757ad6f75dea02c3fc1bdec463e44d7f578f1e24 100644
--- a/targets/ARCH/COMMON/common_lib.c
+++ b/targets/ARCH/COMMON/common_lib.c
@@ -41,49 +41,22 @@
 #include "common/utils/LOG/log.h"
 #include "targets/RT/USER/lte-softmodem.h"
 
+char *get_devname(int devtype) {
+char *devnames[MAX_RF_DEV_TYPE]=DEVTYPE_NAMES;
+  if (devtype < MAX_RF_DEV_TYPE && devtype !=MIN_RF_DEV_TYPE )
+  	  return devnames[devtype];
+  return "none";
+}
+
 int set_device(openair0_device *device)
 {
-  switch (device->type) {
-    case EXMIMO_DEV:
-      LOG_I(HW,"[%s] has loaded EXPRESS MIMO device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case USRP_B200_DEV:
-      LOG_I(HW,"[%s] has loaded USRP B200 device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case USRP_X300_DEV:
-      LOG_I(HW,"[%s] has loaded USRP X300 device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case BLADERF_DEV:
-      LOG_I(HW,"[%s] has loaded BLADERF device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case LMSSDR_DEV:
-      LOG_I(HW,"[%s] has loaded LMSSDR device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case IRIS_DEV:
-	  LOG_I(HW,"[%s] has loaded Iris device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case ADRV9371_ZC706_DEV:
-      LOG_I(HW,"[%s] has loaded ADRV9371_ZC706 device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case UEDv2_DEV:
-      LOG_I(HW,"[%s] has loaded UEDv2 device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    case NONE_DEV:
-      LOG_I(HW,"[%s] has not loaded a HW device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
-      break;
-
-    default:
+  char *devname = get_devname(device->type);
+    if (strcmp(devname,"none") != 0) {
+      LOG_I(HW,"[%s] has loaded %s device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"),devname);
+    } else {
       LOG_E(HW,"[%s] invalid HW device.\n",((device->host_type == RAU_HOST) ? "RAU": "RRU"));
       return -1;
-  }
+    }
   return 0;
 }
 
@@ -108,7 +81,7 @@ int set_transport(openair0_device *device)
 }
 
 typedef int(*devfunc_t)(openair0_device *, openair0_config_t *, eth_params_t *);
-//loader_shlibfunc_t shlib_fdesc[2];
+
 
 /* look for the interface library and load it */
 int load_lib(openair0_device *device,
@@ -119,7 +92,14 @@ int load_lib(openair0_device *device,
   loader_shlibfunc_t shlib_fdesc[1];
   int ret=0;
   char *libname;
-  if ( IS_SOFTMODEM_BASICSIM ) {
+  
+  openair0_cfg->recplay_mode = read_recplayconfig(&(openair0_cfg->recplay_conf),&(device->recplay_state));
+
+  if ( openair0_cfg->recplay_mode == RECPLAY_REPLAYMODE ) {
+  	  libname=OAI_IQPLAYER_LIBNAME;
+  	  shlib_fdesc[0].fname="device_init";
+  	  set_softmodem_optmask(SOFTMODEM_RECPLAY_BIT);  // softmodem has to know we use the iqplayer to workaround randomized algorithms
+  } else  if ( IS_SOFTMODEM_BASICSIM ) {
 	  libname=OAI_BASICSIM_LIBNAME;
 	  shlib_fdesc[0].fname="device_init";
   } else if (IS_SOFTMODEM_RFSIM && flag == RAU_LOCAL_RADIO_HEAD) {
diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 03ab4da5f97d4c646ba63162c69e9556f9d6aa5e..7e51bdc81a6ad9690f119cfb25b4292ea847960f 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -35,15 +35,19 @@
 #include <stdint.h>
 #include <sys/types.h>
 #include <openair1/PHY/TOOLS/tools_defs.h>
+#include "record_player.h"
 
-/* name of shared library implementing the radio front end */
+/* default name of shared library implementing the radio front end */
 #define OAI_RF_LIBNAME        "oai_device"
 /* name of shared library implementing the transport */
 #define OAI_TP_LIBNAME        "oai_transpro"
-/* name of shared library implementing the basic/rf simulator */
+/* name of shared library implementing the rf simulator */
 #define OAI_RFSIM_LIBNAME     "rfsimulator"
-/* name of shared library implementing the basic/rf simulator */
+/* name of shared library implementing the basic simulator */
 #define OAI_BASICSIM_LIBNAME  "tcp_bridge_oai"
+/* name of shared library implementing the iq player */
+#define OAI_IQPLAYER_LIBNAME  "oai_iqplayer"
+
 /* flags for BBU to determine whether the attached radio head is local or remote */
 #define RAU_LOCAL_RADIO_HEAD  0
 #define RAU_REMOTE_RADIO_HEAD 1
@@ -101,7 +105,7 @@ typedef enum {
   UEDv2_DEV,
   MAX_RF_DEV_TYPE
 } dev_type_t;
-
+#define DEVTYPE_NAMES {"","EXMIMO","USRP B200","USRP X300","BLADERF","LMSSDR","IRIS","No HW","ADRV9371_ZC706","UEDv2"} 
 /*!\brief transport protocol types
  */
 typedef enum {
@@ -145,6 +149,7 @@ typedef enum {
   gpsdo=2
 } clock_source_t;
 
+
 /*! \brief RF frontend parameters set by application */
 typedef struct {
   //! Module ID for this configuration
@@ -219,15 +224,9 @@ typedef struct {
   char *my_addr;
   //! local port number for Ethernet interface (eNB/BBU, UE)
   unsigned int my_port;
-#if defined(USRP_REC_PLAY)
-  unsigned short sf_mode;           // 1=record, 2=replay
-  char           sf_filename[1024]; // subframes file path
-  unsigned int   sf_max;            // max number of recorded subframes
-  unsigned int   sf_loops;          // number of loops in replay mode
-  unsigned int   sf_read_delay;     // read delay in replay mode
-  unsigned int   sf_write_delay;    // write delay in replay mode
-  unsigned int   eth_mtu;           // ethernet MTU
-#endif
+  //! record player configuration, definition in record_player.h
+  uint32_t       recplay_mode;
+  recplay_conf_t *recplay_conf;
   //! number of samples per tti
   unsigned int  samples_per_tti;
   //! the sample rate for receive.
@@ -298,7 +297,8 @@ struct openair0_device_t {
 
   /* !brief ETH params set by application */
   eth_params_t *eth_params;
-
+  //! record player data, definition in record_player.h
+  recplay_state_t *recplay_state;
   /* !brief Indicates if device already initialized */
   int is_init;
 
@@ -443,11 +443,13 @@ typedef struct {
 
 #define OPTION_LZ4  0x00000001          // LZ4 compression (option_value is set to compressed size)
 
+
 #ifdef __cplusplus
 extern "C"
 {
 #endif
-
+/*! \brief get device name from device type */
+char *get_devname(int devtype);
 /*! \brief Initialize openair RF target. It returns 0 if OK */
 int openair0_device_load(openair0_device *device, openair0_config_t *openair0_cfg);
 /*! \brief Initialize transport protocol . It returns 0 if OK */
@@ -465,6 +467,11 @@ openair0_timestamp get_usrp_time(openair0_device *device);
  * \returns 0 in success
  */
 int openair0_set_rx_frequencies(openair0_device *device, openair0_config_t *openair0_cfg);
+/*! \brief read the iq record/player configuration */
+extern int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_state);
+/*! \brief store recorded iqs from memory to file. */
+extern void iqrecorder_end(openair0_device *device);
+
 
 #define gettid() syscall(__NR_gettid)
 /*@}*/
diff --git a/targets/ARCH/COMMON/record_player.c b/targets/ARCH/COMMON/record_player.c
new file mode 100644
index 0000000000000000000000000000000000000000..2dcd61e47949be1b2311c905e89d62221ffaaf40
--- /dev/null
+++ b/targets/ARCH/COMMON/record_player.c
@@ -0,0 +1,115 @@
+/*
+ * 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
+ */
+
+/** record_player.c
+ *
+ * \author: Nokia bellLabs B. Mongazon F. Taburet
+ *
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/sysinfo.h>
+#include <sys/resource.h>
+#include "common/utils/LOG/log.h"
+#include "assertions.h"
+#include "common_lib.h"
+#include "record_player.h"
+
+/*! \brief read the oai recorder or player configuration, called from common device code
+ * \param recplay_conf:  store parameters
+ *        recplay_state: store recorder or player data while the device runs
+ */
+int read_recplayconfig(recplay_conf_t **recplay_conf, recplay_state_t **recplay_state) {
+  unsigned int    u_sf_record = 0;                       // record mode
+  unsigned int    u_sf_replay = 0;                       // replay mode
+  *recplay_conf = calloc(sizeof(recplay_conf_t),1);
+  paramdef_t device_recplay_params[]=DEVICE_RECPLAY_PARAMS_DESC ;
+  config_get(device_recplay_params,sizeof(device_recplay_params)/sizeof(paramdef_t),DEVICE_RECPLAY_SECTION);
+
+  if (u_sf_record || u_sf_replay ) {
+    struct sysinfo systeminfo;
+    *recplay_state = calloc(sizeof(recplay_state_t),1);
+
+    if ( *recplay_state == NULL) {
+      LOG_E(HW,"calloc error in %s\n", __FILE__);
+      return -1;
+    }
+
+    // Use mmap for IQ files for systems with less than 6GB total RAM
+    sysinfo(&systeminfo);
+
+    if (systeminfo.totalram < 6144000000) {
+      (*recplay_state)->use_mmap = 0;
+    } else {
+      (*recplay_state)->use_mmap = 1;
+    }
+  } else { /* record player enabled */
+    free(*recplay_conf);
+    *recplay_conf=NULL;
+  }
+
+  if (u_sf_replay == 1) return RECPLAY_REPLAYMODE;
+  else if (u_sf_record == 1) return RECPLAY_RECORDMODE;
+
+  return 0;
+}
+
+/*! \brief Terminate operation of the oai iq recorder. to be called by any device
+ * used in record mode
+ * \param device, the hardware used
+ */
+void iqrecorder_end(openair0_device *device) {
+  if (device->recplay_state != NULL) { // subframes store
+    iqfile_header_t    fh = {device->type,device->openair0_cfg->tx_sample_advance, device->openair0_cfg->rx_bw,OAIIQFILE_ID};
+    recplay_state_t *rs = device->recplay_state;
+    recplay_conf_t  *rc = device->openair0_cfg[0].recplay_conf;
+    rs->pFile = fopen (rc->u_sf_filename,"wb+");
+
+    if (rs->pFile == NULL) {
+      LOG_E(HW,"Cannot open %s\n", rc->u_sf_filename);
+    } else {
+      unsigned int i = 0;
+      unsigned int modu = 0;
+
+      if ((modu = rs->nb_samples % 10) != 0) {
+        rs->nb_samples -= modu; // store entire number of frames
+      }
+
+      LOG_I(HW,"Writing file header to %s \n", rc->u_sf_filename );
+      fwrite(&fh, sizeof(fh), 1, rs->pFile);
+      LOG_UI(HW,"Writing %u subframes to %s \n",rs->nb_samples, rc->u_sf_filename );
+
+      for (i = 0; i < rs->nb_samples; i++) {
+        fwrite(rs->ms_sample+i, sizeof(unsigned char), sizeof(iqrec_t), rs->pFile);
+      }
+
+      fclose (rs->pFile);
+      LOG_UI(HW,"File %s closed\n",rc->u_sf_filename );
+    }
+
+    if (rs->ms_sample != NULL) {
+      free((void *)rs->ms_sample);
+      rs->ms_sample = NULL;
+    }
+  }
+}
\ No newline at end of file
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h b/targets/ARCH/COMMON/record_player.h
similarity index 81%
rename from targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h
rename to targets/ARCH/COMMON/record_player.h
index d29cf41db2061a8fd574e95df0f588b17c74ed13..903dda006b02e0eb79e1107665220d80090ea225 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h
+++ b/targets/ARCH/COMMON/record_player.h
@@ -1,5 +1,5 @@
-#ifndef __USRP_LIB_H
-#define __USRP_LIB_H
+#ifndef __RECORD_PLAYER_H
+#define __RECORD_PLAYER_H
 /*
  * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more
  * contributor license agreements.  See the NOTICE file distributed with
@@ -21,7 +21,7 @@
  *      contact@openairinterface.org
  */
 
-/** usrp_lib.h
+/** targets/ARCH/COMMON/record-player.h
  *
  * \author: bruno.mongazon-cazavet@nokia-bell-labs.com
  */
@@ -46,7 +46,7 @@ extern "C"
 /*                                            command line parameters for USRP record/playback                                                                               */
 /*   optname                     helpstr                paramflags                      XXXptr                  defXXXval                            type           numelt   */
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
-#define USRP_DEVICE_PARAMS_DESC {  \
+#define DEVICE_PARAMS_DESC {  \
     {CONFIG_OPT_RECPLAY,      CONFIG_HLP_RECPLAY, PARAMFLAG_BOOL,   uptr:&enable_recplay,                 defuintval:0,                    TYPE_UINT,     0} \
   }
 
@@ -59,6 +59,15 @@ extern "C"
 #define BELL_LABS_IQ_HEADER       0xabababababababab
 #define BELL_LABS_IQ_PER_SF       7680 // Up to 5MHz bw for now
 #define BELL_LABS_IQ_BYTES_PER_SF (BELL_LABS_IQ_PER_SF * 4)
+
+#define    OAIIQFILE_ID "OIQF"
+typedef struct {
+  uint64_t      devtype;
+  uint64_t      tx_sample_advance;
+  double        bw;
+  char          oaiid[4];
+} iqfile_header_t;
+
 typedef struct {
   int64_t       header;
   int64_t       ts;
@@ -75,8 +84,8 @@ typedef struct {
 
 /* help strings definition for config options, used in CMDLINE_XXX_DESC macros and printed when -h option is used */
 #define CONFIG_HLP_SF_FILE      "Path of the file used for subframes record or replay"
-#define CONFIG_HLP_SF_REC       "Record subframes from USRP driver into a file for later replay"
-#define CONFIG_HLP_SF_REP       "Replay subframes into USRP driver from a file"
+#define CONFIG_HLP_SF_REC       "Record subframes from device driver into a file for later replay"
+#define CONFIG_HLP_SF_REP       "Replay subframes from a file using the oai replay driver"
 #define CONFIG_HLP_SF_MAX       "Maximum count of subframes to be recorded in subframe file"
 #define CONFIG_HLP_SF_LOOPS     "Number of loops to replay of the entire subframes file"
 #define CONFIG_HLP_SF_RDELAY    "Delay in microseconds to read a subframe in replay mode"
@@ -91,41 +100,43 @@ typedef struct {
 #define CONFIG_OPT_SF_RDELAY    "subframes-read-delay"
 #define CONFIG_OPT_SF_WDELAY    "subframes-write-delay"
 
-#define USRP_RECPLAY_SECTION "device.recplay"
+#define DEVICE_RECPLAY_SECTION "device.recplay"
 /* For information only - the macro is not usable in C++ */
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
 /*                                            command line parameters for USRP record/playback                                                                               */
-/*   optname                     helpstr                paramflags                      XXXptr                  defXXXval                            type           numelt   */
+/*   optname                     helpstr                paramflags                      XXXptr                           defXXXval                            type           numelt   */
 /*---------------------------------------------------------------------------------------------------------------------------------------------------------------------------*/
-#define USRP_RECPLAY_PARAMS_DESC {  \
-    {CONFIG_OPT_SF_FILE,      CONFIG_HLP_SF_FILE, 0,              strptr:(char **)((*recplay_state)->u_sf_filename),       defstrval:DEF_SF_FILE,            TYPE_STRING,   1024}, \
-    {CONFIG_OPT_SF_REC,       CONFIG_HLP_SF_REC,  PARAMFLAG_BOOL,   uptr:&(u_sf_record),                  defuintval:0,                TYPE_UINT,   0}, \
-    {CONFIG_OPT_SF_REP,       CONFIG_HLP_SF_REP,  PARAMFLAG_BOOL,   uptr:&(u_sf_replay),                  defuintval:0,                TYPE_UINT,   0}, \
-    {CONFIG_OPT_SF_MAX,       CONFIG_HLP_SF_MAX,    0,                uptr:&((*recplay_state)->u_sf_max),                 defintval:DEF_NB_SF,             TYPE_UINT,   0}, \
-    {CONFIG_OPT_SF_LOOPS,     CONFIG_HLP_SF_LOOPS,  0,                uptr:&((*recplay_state)->u_sf_loops),                 defintval:DEF_SF_NB_LOOP,        TYPE_UINT,   0}, \
-    {CONFIG_OPT_SF_RDELAY,    CONFIG_HLP_SF_RDELAY, 0,                uptr:&((*recplay_state)->u_sf_read_delay),              defintval:DEF_SF_DELAY_READ,     TYPE_UINT,   0}, \
-    {CONFIG_OPT_SF_WDELAY,    CONFIG_HLP_SF_WDELAY, 0,                uptr:&((*recplay_state)->u_sf_write_delay),           defintval:DEF_SF_DELAY_WRITE,    TYPE_UINT,   0}, \
+#define DEVICE_RECPLAY_PARAMS_DESC {  \
+    {CONFIG_OPT_SF_FILE,      CONFIG_HLP_SF_FILE, 0,              strptr:(char **)((*recplay_conf)->u_sf_filename),       defstrval:DEF_SF_FILE,            TYPE_STRING,   1024}, \
+    {CONFIG_OPT_SF_REC,       CONFIG_HLP_SF_REC,  PARAMFLAG_BOOL,   uptr:&(u_sf_record),                                  defuintval:0,                TYPE_UINT,   0}, \
+    {CONFIG_OPT_SF_REP,       CONFIG_HLP_SF_REP,  PARAMFLAG_BOOL,   uptr:&(u_sf_replay),                                  defuintval:0,                TYPE_UINT,   0}, \
+    {CONFIG_OPT_SF_MAX,       CONFIG_HLP_SF_MAX,    0,                uptr:&((*recplay_conf)->u_sf_max),                  defintval:DEF_NB_SF,             TYPE_UINT,   0}, \
+    {CONFIG_OPT_SF_LOOPS,     CONFIG_HLP_SF_LOOPS,  0,                uptr:&((*recplay_conf)->u_sf_loops),                defintval:DEF_SF_NB_LOOP,        TYPE_UINT,   0}, \
+    {CONFIG_OPT_SF_RDELAY,    CONFIG_HLP_SF_RDELAY, 0,                uptr:&((*recplay_conf)->u_sf_read_delay),           defintval:DEF_SF_DELAY_READ,     TYPE_UINT,   0}, \
+    {CONFIG_OPT_SF_WDELAY,    CONFIG_HLP_SF_WDELAY, 0,                uptr:&((*recplay_conf)->u_sf_write_delay),          defintval:DEF_SF_DELAY_WRITE,    TYPE_UINT,   0}, \
   }/*! \brief USRP Configuration and state */
+typedef struct {
+  char            u_sf_filename[1024];              // subframes file path
+  unsigned int    u_sf_max ;                  // max number of recorded subframes
+  unsigned int    u_sf_loops ;           // number of loops in replay mode
+  unsigned int    u_sf_read_delay;   // read delay in replay mode
+  unsigned int    u_sf_write_delay ; // write delay in replay mode
+} recplay_conf_t;
 
 typedef struct {
+  int             use_mmap; // default is to use mmap
+  size_t          mapsize;
   FILE            *pFile;
   int             mmapfd;
   int             iqfd;
-  int             use_mmap; // default is to use mmap
-  size_t          mapsize;
   iqrec_t        *ms_sample;                      // memory for all subframes
   unsigned int    nb_samples;
-  char            u_sf_filename[1024];              // subframes file path
-  unsigned int    u_sf_max ;                  // max number of recorded subframes
-  unsigned int    u_sf_loops ;           // number of loops in replay mode
-  unsigned int    u_sf_read_delay;   // read delay in replay mode
-  unsigned int    u_sf_write_delay ; // write delay in replay mode
 } recplay_state_t;
 
 
-extern int read_usrpconfig(uint32_t *recplay_mode, recplay_state_t **recplay_state);
+
 #ifdef __cplusplus
 }
 #endif
-#endif // __USRP_LIB_H
+#endif // __RECORD_PLAYER_H
 
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 0b60a73c434466cb04b6d858f85dcfa1e831078a..f37c8cf5cf586abf04c78372d658453d794fa35f 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -23,7 +23,8 @@
  *
  * \author: HongliangXU : hong-liang-xu@agilent.com
  */
-
+#define _LARGEFILE_SOURCE
+#define _FILE_OFFSET_BITS 64
 #include <string.h>
 #include <pthread.h>
 #include <unistd.h>
@@ -51,8 +52,6 @@
 
 #include <sys/resource.h>
 
-#include "usrp_lib.h"
-
 #ifdef __SSE4_1__
   #include <smmintrin.h>
 #endif
@@ -108,8 +107,6 @@ typedef struct {
   int first_tx;
   //! timestamp of RX packet
   openair0_timestamp rx_timestamp;
-  uint32_t recplay_mode;
-  recplay_state_t *recplay_state;
 } usrp_state_t;
 
 //void print_notes(void)
@@ -271,9 +268,6 @@ static int sync_to_gps(openair0_device *device) {
 static int trx_usrp_start(openair0_device *device) {
   usrp_state_t *s = (usrp_state_t *)device->priv;
 
-  if ( s->recplay_mode == RECPLAY_REPLAYMODE)
-    return 0;
-
   // setup GPIO for TDD, GPIO(4) = ATR_RX
   //set data direction register (DDR) to output
   s->usrp->set_gpio_attr("FP0", "DDR", 0xfff, 0xfff);
@@ -319,86 +313,14 @@ static void trx_usrp_end(openair0_device *device) {
     return;
 
   usrp_state_t *s = (usrp_state_t *)device->priv;
-
+  
   if (s == NULL)
     return;
+  iqrecorder_end(device);
 
-  if (s->recplay_mode != RECPLAY_REPLAYMODE) { // not subframes replay
-    s->rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
-    //send a mini EOB packet
-    s->tx_md.end_of_burst = true;
-    s->tx_stream->send("", 0, s->tx_md);
-    s->tx_md.end_of_burst = false;
-    sleep(1);
-  }
-
-  if (s->recplay_mode == RECPLAY_RECORDMODE) { // subframes store
-    s->recplay_state->pFile = fopen (s->recplay_state->u_sf_filename,"wb+");
-
-    if (s->recplay_state->pFile == NULL) {
-      std::cerr << "Cannot open " << s->recplay_state->u_sf_filename << std::endl;
-    } else {
-      unsigned int i = 0;
-      unsigned int modu = 0;
-
-      if ((modu = s->recplay_state->nb_samples % 10) != 0) {
-        s->recplay_state->nb_samples -= modu; // store entire number of frames
-      }
-
-      std::cerr << "Writing " << s->recplay_state->nb_samples << " subframes to " << s->recplay_state->u_sf_filename << " ..." << std::endl;
-
-      for (i = 0; i < s->recplay_state->nb_samples; i++) {
-        fwrite(s->recplay_state->ms_sample+i, sizeof(unsigned char), sizeof(iqrec_t), s->recplay_state->pFile);
-      }
-
-      fclose (s->recplay_state->pFile);
-      std::cerr << "File " << s->recplay_state->u_sf_filename << " closed." << std::endl;
-    }
-
-    if (s->recplay_state->ms_sample != NULL) {
-      free((void *)s->recplay_state->ms_sample);
-      s->recplay_state->ms_sample = NULL;
-    }
-  } else if (s->recplay_mode == RECPLAY_REPLAYMODE) { // replay
-    if (s->recplay_state->use_mmap) {
-      if (s->recplay_state->ms_sample != MAP_FAILED) {
-        munmap(s->recplay_state->ms_sample, s->recplay_state->mapsize);
-        s->recplay_state->ms_sample = NULL;
-      }
-
-      if (s->recplay_state->mmapfd != 0) {
-        close(s->recplay_state->mmapfd);
-        s->recplay_state->mmapfd = 0;
-      }
-    } else {
-      if (s->recplay_state->ms_sample != NULL) {
-        free(s->recplay_state->ms_sample);
-        s->recplay_state->ms_sample = NULL;
-      }
 
-      if (s->recplay_state->iqfd != 0) {
-        close(s->recplay_state->iqfd);
-        s->recplay_state->iqfd = 0;
-      }
-    }
-  }
-}
-/*! \brief Write iqs function when in replay mode, just introduce a delay, as configured at init time,
-      @param device pointer to the device structure specific to the RF hardware target
-      @param timestamp The timestamp at which the first sample MUST be sent
-      @param buff Buffer which holds the samples
-      @param nsamps number of samples to be sent
-      @param antenna_id index of the antenna if the device has multiple antennas
-      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
-*/
-static int trx_usrp_write_recplay(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
-  struct timespec req;
-  usrp_state_t *s = (usrp_state_t *)device->priv;
-  req.tv_sec = 0;
-  req.tv_nsec = s->recplay_state->u_sf_write_delay * 1000;
-  nanosleep(&req, NULL);
-  return nsamps;
 }
+
 /*! \brief Called to send samples to the USRP RF target
       @param device pointer to the device structure specific to the RF hardware target
       @param timestamp The timestamp at which the first sample MUST be sent
@@ -515,106 +437,6 @@ static int trx_usrp_write(openair0_device *device,
   return ret;
 }
 
-/*! \brief Receive samples from iq file.
- * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
- * the first channel. *ptimestamp is the time at which the first sample
- * was received.
- * \param device the hardware to use
- * \param[out] ptimestamp the time at which the first sample was received.
- * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
- * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
- * \param antenna_id Index of antenna for which to receive samples
- * \returns the number of sample read
-*/
-static int trx_usrp_read_recplay(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
-  int samples_received=0;
-  static unsigned int    cur_samples;
-  static int64_t         wrap_count;
-  static int64_t  wrap_ts;
-  usrp_state_t *s = (usrp_state_t *)device->priv;
-
-
-  if (cur_samples == s->recplay_state->nb_samples) {
-    cur_samples = 0;
-    wrap_count++;
-    if (wrap_count == s->recplay_state->u_sf_loops) {
-      std::cerr << "USRP device terminating subframes replay mode after " << s->recplay_state->u_sf_loops << " loops." << std::endl;
-      exit_function(__FILE__, __FUNCTION__, __LINE__,"replay ended, triggering process termination\n");
-    }
-
-    wrap_ts = wrap_count * (s->recplay_state->nb_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000));
-
-    if (!s->recplay_state->use_mmap) {
-      if (lseek(s->recplay_state->iqfd, 0, SEEK_SET) == 0) {
-        std::cerr << "Seeking at the beginning of IQ file" << std::endl;
-      } else {
-        std::cerr << "Problem seeking at the beginning of IQ file" << std::endl;
-      }
-    }
-  }
-
-  if (s->recplay_state->use_mmap) {
-    if (cur_samples < s->recplay_state->nb_samples) {
-      *ptimestamp = (s->recplay_state->ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts;
-
-      if (cur_samples == 0) {
-        std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts
-                  << " ts=" << *ptimestamp << std::endl;
-      }
-
-      memcpy(buff[0], &s->recplay_state->ms_sample[cur_samples].samples[0], nsamps*4);
-      cur_samples++;
-    }
-  } else {
-    // read sample from file
-    if (read(s->recplay_state->iqfd, s->recplay_state->ms_sample, sizeof(iqrec_t)) != sizeof(iqrec_t)) {
-      std::cerr << "pb reading iqfile at index " << sizeof(iqrec_t)*cur_samples << std::endl;
-      close(s->recplay_state->iqfd);
-      free(s->recplay_state->ms_sample);
-      s->recplay_state->ms_sample = NULL;
-      s->recplay_state->iqfd = 0;
-      exit(-1);
-    }
-
-    if (cur_samples < s->recplay_state->nb_samples) {
-      static int64_t ts0 = 0;
-
-      if ((cur_samples == 0) && (wrap_count == 0)) {
-        ts0 = s->recplay_state->ms_sample->ts;
-      }
-
-      *ptimestamp = ts0 + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)) + wrap_ts;
-
-      if (cur_samples == 0) {
-        std::cerr << "starting subframes file with wrap_count=" << wrap_count << " wrap_ts=" << wrap_ts
-                  << " ts=" << *ptimestamp << std::endl;
-      }
-
-      memcpy(buff[0], &s->recplay_state->ms_sample->samples[0], nsamps*4);
-      cur_samples++;
-      // Prepare for next read
-      off_t where = lseek(s->recplay_state->iqfd, cur_samples * sizeof(iqrec_t), SEEK_SET);
-
-      if (where < 0) {
-        LOG_E(HW,"Cannot lseek in iqfile: %s\n",strerror(errno));
-      }
-    }
-  }
-
-  struct timespec req;
-
-  req.tv_sec = 0;
-
-  req.tv_nsec = s->recplay_state->u_sf_read_delay * 1000;
-
-  nanosleep(&req, NULL);
-
-  return nsamps;
-
-  return samples_received;
-}
-
-
 /*! \brief Receive samples from hardware.
  * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
  * the first channel. *ptimestamp is the time at which the first sample
@@ -716,13 +538,13 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
   s->rx_timestamp = s->rx_md.time_spec.to_ticks(s->sample_rate);
   *ptimestamp = s->rx_timestamp;
 
-  if (s->recplay_mode == RECPLAY_RECORDMODE) { // record mode
+  if (device->recplay_state != NULL) { // record mode
     // Copy subframes to memory (later dump on a file)
-    if (s->recplay_state->nb_samples < s->recplay_state->u_sf_max) {
-      (s->recplay_state->ms_sample+s->recplay_state->nb_samples)->header = BELL_LABS_IQ_HEADER;
-      (s->recplay_state->ms_sample+s->recplay_state->nb_samples)->ts = *ptimestamp;
-      memcpy((s->recplay_state->ms_sample+s->recplay_state->nb_samples)->samples, buff[0], nsamps*4);
-      s->recplay_state->nb_samples++;
+    if (device->recplay_state->nb_samples < device->openair0_cfg->recplay_conf->u_sf_max) {
+      (device->recplay_state->ms_sample+device->recplay_state->nb_samples)->header = BELL_LABS_IQ_HEADER;
+      (device->recplay_state->ms_sample+device->recplay_state->nb_samples)->ts = *ptimestamp;
+      memcpy((device->recplay_state->ms_sample+device->recplay_state->nb_samples)->samples, buff[0], nsamps*4);
+      device->recplay_state->nb_samples++;
     } else     exit_function(__FILE__, __FUNCTION__, __LINE__,"Recording reaches max iq limit\n");
   }
 
@@ -936,7 +758,6 @@ extern "C" {
     }
 
     device->openair0_cfg = openair0_cfg;
-    read_usrpconfig(&(s->recplay_mode), &(s->recplay_state));
     device->trx_start_func = trx_usrp_start;
     device->trx_get_stats_func = trx_usrp_get_stats;
     device->trx_reset_stats_func = trx_usrp_reset_stats;
@@ -945,90 +766,74 @@ extern "C" {
     device->trx_set_freq_func = trx_usrp_set_freq;
     device->trx_set_gains_func   = trx_usrp_set_gains;
 
-    if ( s->recplay_mode == RECPLAY_REPLAYMODE) {
-      // Replay subframes from from file
-      int bw_gain_adjust=0;
-      device->type = USRP_B200_DEV;
-      openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38;
-      bw_gain_adjust=1;
-      openair0_cfg[0].tx_sample_advance     = 80;
-      openair0_cfg[0].tx_bw                 = 20e6;
-      openair0_cfg[0].rx_bw                 = 20e6;
-      openair0_cfg[0].iq_txshift = 4;//shift
-      openair0_cfg[0].iq_rxrescale = 15;//rescale iqs
-      set_rx_gain_offset(&openair0_cfg[0],0,bw_gain_adjust);
-      device->trx_write_func = trx_usrp_write_recplay;
-      device->trx_read_func  = trx_usrp_read_recplay;
-      std::cerr << "USRP device initialized in subframes replay mode for " << s->recplay_state->u_sf_loops << " loops. Use mmap="
-                << s->recplay_state->use_mmap << std::endl;
-    } else {
-      // hotfix! to be checked later
-      uhd::set_thread_priority_safe(1.0);
-      // Initialize USRP device
-      int vers=0,subvers=0,subsubvers=0;
-      int bw_gain_adjust=0;
-
-      if (s->recplay_mode == RECPLAY_RECORDMODE) {
-        std::cerr << "USRP device initialized in subframes record mode" << std::endl;
-      }
-
-      sscanf(uhd::get_version_string().c_str(),"%d.%d.%d",&vers,&subvers,&subsubvers);
-      LOG_I(HW,"UHD version %s (%d.%d.%d)\n",
-            uhd::get_version_string().c_str(),vers,subvers,subsubvers);
-      std::string args;
-
-      if (openair0_cfg[0].sdr_addrs == NULL) {
-        args = "type=b200";
-      } else {
-        args = openair0_cfg[0].sdr_addrs;
-        LOG_I(HW,"Checking for USRP with args %s\n",openair0_cfg[0].sdr_addrs);
-      }
-
-      uhd::device_addrs_t device_adds = uhd::device::find(args);
-
-      if (device_adds.size() == 0) {
-        LOG_E(HW,"No USRP Device Found.\n ");
-        free(s);
-        return -1;
-      } else if (device_adds.size() > 1) {
-        LOG_E(HW,"More than one USRP Device Found. Please specify device more precisely in config file.\n");
-        free(s);
-        return -1;
-      }
-
-      LOG_I(HW,"Found USRP %s\n", device_adds[0].get("type").c_str());
-      double usrp_master_clock;
-
-      if (device_adds[0].get("type") == "b200") {
-        printf("Found USRP b200\n");
-        device->type = USRP_B200_DEV;
-        usrp_master_clock = 30.72e6;
-        args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
-        args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=7680, recv_frame_size=7680" ;
-      }
-
-      if (device_adds[0].get("type") == "n3xx") {
-        printf("Found USRP n300\n");
-        device->type=USRP_X300_DEV; //treat it as X300 for now
-        usrp_master_clock = 122.88e6;
-        args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
-        //args += ", send_buff_size=33554432";
-      }
-
-      if (device_adds[0].get("type") == "x300") {
-        printf("Found USRP x300\n");
-        device->type=USRP_X300_DEV;
-        usrp_master_clock = 184.32e6;
-        args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
-
-        // USRP recommended: https://files.ettus.com/manual/page_usrp_x3x0_config.html
-        if ( 0 != system("sysctl -w net.core.rmem_max=33554432 net.core.wmem_max=33554432") )
-          LOG_W(HW,"Can't set kernel parameters for X3xx\n");
-      }
-
-      s->usrp = uhd::usrp::multi_usrp::make(args);
 
-      if (args.find("clock_source")==std::string::npos) {
+    // hotfix! to be checked later
+    uhd::set_thread_priority_safe(1.0);
+    // Initialize USRP device
+    int vers=0,subvers=0,subsubvers=0;
+    int bw_gain_adjust=0;
+  
+    if (device->openair0_cfg->recplay_mode == RECPLAY_RECORDMODE) {
+      std::cerr << "USRP device initialized in subframes record mode" << std::endl;
+    }
+  
+    sscanf(uhd::get_version_string().c_str(),"%d.%d.%d",&vers,&subvers,&subsubvers);
+    LOG_I(HW,"UHD version %s (%d.%d.%d)\n",
+          uhd::get_version_string().c_str(),vers,subvers,subsubvers);
+    std::string args;
+  
+    if (openair0_cfg[0].sdr_addrs == NULL) {
+      args = "type=b200";
+    } else {
+      args = openair0_cfg[0].sdr_addrs;
+      LOG_I(HW,"Checking for USRP with args %s\n",openair0_cfg[0].sdr_addrs);
+    }
+  
+    uhd::device_addrs_t device_adds = uhd::device::find(args);
+  
+    if (device_adds.size() == 0) {
+      LOG_E(HW,"No USRP Device Found.\n ");
+      free(s);
+      return -1;
+    } else if (device_adds.size() > 1) {
+      LOG_E(HW,"More than one USRP Device Found. Please specify device more precisely in config file.\n");
+      free(s);
+      return -1;
+    }
+  
+    LOG_I(HW,"Found USRP %s\n", device_adds[0].get("type").c_str());
+    double usrp_master_clock;
+  
+    if (device_adds[0].get("type") == "b200") {
+      printf("Found USRP b200\n");
+      device->type = USRP_B200_DEV;
+      usrp_master_clock = 30.72e6;
+      args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
+      args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=7680, recv_frame_size=7680" ;
+    }
+  
+    if (device_adds[0].get("type") == "n3xx") {
+      printf("Found USRP n300\n");
+      device->type=USRP_X300_DEV; //treat it as X300 for now
+      usrp_master_clock = 122.88e6;
+      args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
+      //args += ", send_buff_size=33554432";
+    }
+  
+    if (device_adds[0].get("type") == "x300") {
+      printf("Found USRP x300\n");
+      device->type=USRP_X300_DEV;
+      usrp_master_clock = 184.32e6;
+      args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
+  
+      // USRP recommended: https://files.ettus.com/manual/page_usrp_x3x0_config.html
+      if ( 0 != system("sysctl -w net.core.rmem_max=33554432 net.core.wmem_max=33554432") )
+        LOG_W(HW,"Can't set kernel parameters for X3xx\n");
+    }
+  
+    s->usrp = uhd::usrp::multi_usrp::make(args);
+  
+    if (args.find("clock_source")==std::string::npos) {
 	if (openair0_cfg[0].clock_source == internal) {
 	  //in UHD 3.14 we could use
 	  //s->usrp->set_sync_source("clock_source=internal","time_source=internal");
@@ -1050,358 +855,292 @@ extern "C" {
 	else { 
 	  LOG_W(HW,"Clock source set neither in usrp_args nor on command line, using default!\n");
 	}
-      }
-      else {
+    }
+    else {
 	if (openair0_cfg[0].clock_source != unset) {
 	  LOG_W(HW,"Clock source set in both usrp_args and in clock_source, ingnoring the latter!\n");
 	}
-      }
-      
-      if (s->usrp->get_clock_source(0) == "gpsdo") {
-        s->use_gps = 1;
-
-        if (sync_to_gps(device)==EXIT_SUCCESS) {
-          LOG_I(HW,"USRP synced with GPS!\n");
-        } else {
-          LOG_I(HW,"USRP fails to sync with GPS. Exiting.\n");
-          exit(EXIT_FAILURE);
-        }
-      } else if (s->usrp->get_clock_source(0) == "external") {
-        if (check_ref_locked(s,0)) {
-          LOG_I(HW,"USRP locked to external reference!\n");
-        } else {
-          LOG_I(HW,"Failed to lock to external reference. Exiting.\n");
-          exit(EXIT_FAILURE);
-        }
-      }
-
-      if (device->type==USRP_X300_DEV) {
-        openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
-        std::cerr << "-- Using calibration table: calib_table_x310" << std::endl; // Bell Labs info
-        LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate);
-
-        switch ((int)openair0_cfg[0].sample_rate) {
-          case 122880000:
-            // from usrp_time_offset
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 15; //to be checked
-            openair0_cfg[0].tx_bw                 = 80e6;
-            openair0_cfg[0].rx_bw                 = 80e6;
-            break;
-
-          case 92160000:
-            // from usrp_time_offset
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 15; //to be checked
-            openair0_cfg[0].tx_bw                 = 80e6;
-            openair0_cfg[0].rx_bw                 = 80e6;
-            break;
-
-          case 61440000:
-            // from usrp_time_offset
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 15;
-            openair0_cfg[0].tx_bw                 = 40e6;
-            openair0_cfg[0].rx_bw                 = 40e6;
-            break;
-
-          case 46080000:
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 15;
-            openair0_cfg[0].tx_bw                 = 40e6;
-            openair0_cfg[0].rx_bw                 = 40e6;
-            break;
-
-          case 30720000:
-            // from usrp_time_offset
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 15;
-            openair0_cfg[0].tx_bw                 = 20e6;
-            openair0_cfg[0].rx_bw                 = 20e6;
-            break;
-
-          case 15360000:
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 45;
-            openair0_cfg[0].tx_bw                 = 10e6;
-            openair0_cfg[0].rx_bw                 = 10e6;
-            break;
-
-          case 7680000:
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 50;
-            openair0_cfg[0].tx_bw                 = 5e6;
-            openair0_cfg[0].rx_bw                 = 5e6;
-            break;
-
-          case 1920000:
-            //openair0_cfg[0].samples_per_packet    = 2048;
-            openair0_cfg[0].tx_sample_advance     = 50;
-            openair0_cfg[0].tx_bw                 = 1.25e6;
-            openair0_cfg[0].rx_bw                 = 1.25e6;
-            break;
-
-          default:
-            LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
-            exit(-1);
-            break;
-        }
-      }
-
-      if (device->type == USRP_B200_DEV) {
-        if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) {
-          openair0_cfg[0].rx_gain_calib_table = calib_table_b210;
-          bw_gain_adjust=0;
-          std::cerr << "-- Using calibration table: calib_table_b210" << std::endl; // Bell Labs info
-        } else {
-          openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38;
-          bw_gain_adjust=1;
-          std::cerr << "-- Using calibration table: calib_table_b210_38" << std::endl; // Bell Labs info
-        }
-
-        switch ((int)openair0_cfg[0].sample_rate) {
-          case 46080000:
-            s->usrp->set_master_clock_rate(46.08e6);
-            //openair0_cfg[0].samples_per_packet    = 1024;
-            openair0_cfg[0].tx_sample_advance     = 115;
-            openair0_cfg[0].tx_bw                 = 40e6;
-            openair0_cfg[0].rx_bw                 = 40e6;
-            break;
-
-          case 30720000:
-            s->usrp->set_master_clock_rate(30.72e6);
-            //openair0_cfg[0].samples_per_packet    = 1024;
-            openair0_cfg[0].tx_sample_advance     = 115;
-            openair0_cfg[0].tx_bw                 = 20e6;
-            openair0_cfg[0].rx_bw                 = 20e6;
-            break;
-
-          case 23040000:
-            s->usrp->set_master_clock_rate(23.04e6); //to be checked
-            //openair0_cfg[0].samples_per_packet    = 1024;
-            openair0_cfg[0].tx_sample_advance     = 113;
-            openair0_cfg[0].tx_bw                 = 20e6;
-            openair0_cfg[0].rx_bw                 = 20e6;
-            break;
-
-          case 15360000:
-            s->usrp->set_master_clock_rate(30.72e06);
-            //openair0_cfg[0].samples_per_packet    = 1024;
-            openair0_cfg[0].tx_sample_advance     = 103;
-            openair0_cfg[0].tx_bw                 = 20e6;
-            openair0_cfg[0].rx_bw                 = 20e6;
-            break;
-
-          case 7680000:
-            s->usrp->set_master_clock_rate(30.72e6);
-            //openair0_cfg[0].samples_per_packet    = 1024;
-            openair0_cfg[0].tx_sample_advance     = 80;
-            openair0_cfg[0].tx_bw                 = 20e6;
-            openair0_cfg[0].rx_bw                 = 20e6;
-            break;
-
-          case 1920000:
-            s->usrp->set_master_clock_rate(30.72e6);
-            //openair0_cfg[0].samples_per_packet    = 1024;
-            openair0_cfg[0].tx_sample_advance     = 40;
-            openair0_cfg[0].tx_bw                 = 20e6;
-            openair0_cfg[0].rx_bw                 = 20e6;
-            break;
-
-          default:
-            LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
-            exit(-1);
-            break;
-        }
-      }
-
-      /* device specific */
-      //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered
-      //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered
-      openair0_cfg[0].iq_txshift = 4;//shift
-      openair0_cfg[0].iq_rxrescale = 15;//rescale iqs
-
-      for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) {
-        if (i<openair0_cfg[0].rx_num_channels) {
-          s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i);
-          s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i);
-          set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust);
-          ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i);
-          // limit to maximum gain
-          AssertFatal( openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] <= gain_range.stop(),
-                       "RX Gain too high, lower by %f dB\n",
-                       openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop());
-          s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i);
-          LOG_I(HW,"RX Gain %d %f (%f) => %f (max %f)\n",i,
-                openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i],
-                openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop());
-        }
-      }
-
-      LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels());
-      LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels);
-
-      for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) {
-        ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i);
-
-        if (i<openair0_cfg[0].tx_num_channels) {
-          s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i);
-          s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i);
-          s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i);
-          LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]);
-        }
-      }
-
-      //s->usrp->set_clock_source("external");
-      //s->usrp->set_time_source("external");
-      // display USRP settings
-      LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6);
-      sleep(1);
-      // create tx & rx streamer
-      uhd::stream_args_t stream_args_rx("sc16", "sc16");
-      int samples=openair0_cfg[0].sample_rate;
-      int max=s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps();
-      samples/=10000;
-      LOG_I(HW,"RF board max packet size %u, size for 100µs jitter %d \n", max, samples);
-
-      if ( samples < max ) {
-        stream_args_rx.args["spp"] = str(boost::format("%d") % samples );
-      }
-
-      LOG_I(HW,"rx_max_num_samps %zu\n",
-            s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps());
-
-      for (int i = 0; i<openair0_cfg[0].rx_num_channels; i++)
-        stream_args_rx.channels.push_back(i);
-
-      s->rx_stream = s->usrp->get_rx_stream(stream_args_rx);
-      uhd::stream_args_t stream_args_tx("sc16", "sc16");
-
-      for (int i = 0; i<openair0_cfg[0].tx_num_channels; i++)
-        stream_args_tx.channels.push_back(i);
-
-      s->tx_stream = s->usrp->get_tx_stream(stream_args_tx);
-
-      /* Setting TX/RX BW after streamers are created due to USRP calibration issue */
-      for(int i=0; i<((int) s->usrp->get_tx_num_channels()) && i<openair0_cfg[0].tx_num_channels; i++)
-        s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i);
-
-      for(int i=0; i<((int) s->usrp->get_rx_num_channels()) && i<openair0_cfg[0].rx_num_channels; i++)
-        s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i);
-
-      for (int i=0; i<openair0_cfg[0].rx_num_channels; i++) {
-        LOG_I(HW,"RX Channel %d\n",i);
-        LOG_I(HW,"  Actual RX sample rate: %fMSps...\n",s->usrp->get_rx_rate(i)/1e6);
-        LOG_I(HW,"  Actual RX frequency: %fGHz...\n", s->usrp->get_rx_freq(i)/1e9);
-        LOG_I(HW,"  Actual RX gain: %f...\n", s->usrp->get_rx_gain(i));
-        LOG_I(HW,"  Actual RX bandwidth: %fM...\n", s->usrp->get_rx_bandwidth(i)/1e6);
-        LOG_I(HW,"  Actual RX antenna: %s...\n", s->usrp->get_rx_antenna(i).c_str());
-      }
-
-      for (int i=0; i<openair0_cfg[0].tx_num_channels; i++) {
-        LOG_I(HW,"TX Channel %d\n",i);
-        LOG_I(HW,"  Actual TX sample rate: %fMSps...\n", s->usrp->get_tx_rate(i)/1e6);
-        LOG_I(HW,"  Actual TX frequency: %fGHz...\n", s->usrp->get_tx_freq(i)/1e9);
-        LOG_I(HW,"  Actual TX gain: %f...\n", s->usrp->get_tx_gain(i));
-        LOG_I(HW,"  Actual TX bandwidth: %fM...\n", s->usrp->get_tx_bandwidth(i)/1e6);
-        LOG_I(HW,"  Actual TX antenna: %s...\n", s->usrp->get_tx_antenna(i).c_str());
-        LOG_I(HW,"  Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps());
-      }
-
-      LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs());
-      device->trx_write_func = trx_usrp_write;
-      device->trx_read_func  = trx_usrp_read;
-      s->sample_rate = openair0_cfg[0].sample_rate;
-
-      // TODO:
-      // init tx_forward_nsamps based usrp_time_offset ex
-      if(is_equal(s->sample_rate, (double)30.72e6))
-        s->tx_forward_nsamps  = 176;
-
-      if(is_equal(s->sample_rate, (double)15.36e6))
-        s->tx_forward_nsamps = 90;
-
-      if(is_equal(s->sample_rate, (double)7.68e6))
-        s->tx_forward_nsamps = 50;
+  }
+  
+  if (s->usrp->get_clock_source(0) == "gpsdo") {
+    s->use_gps = 1;
+  
+    if (sync_to_gps(device)==EXIT_SUCCESS) {
+      LOG_I(HW,"USRP synced with GPS!\n");
+    } else {
+      LOG_I(HW,"USRP fails to sync with GPS. Exiting.\n");
+      exit(EXIT_FAILURE);
     }
-
-    if (s->recplay_mode == RECPLAY_RECORDMODE) { // record mode
-      s->recplay_state->ms_sample = (iqrec_t *) malloc(s->recplay_state->u_sf_max * sizeof(iqrec_t));
-
-      if (s->recplay_state->ms_sample == NULL) {
-        std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl;
+  } else if (s->usrp->get_clock_source(0) == "external") {
+    if (check_ref_locked(s,0)) {
+      LOG_I(HW,"USRP locked to external reference!\n");
+    } else {
+      LOG_I(HW,"Failed to lock to external reference. Exiting.\n");
+      exit(EXIT_FAILURE);
+    }
+  }
+  
+  if (device->type==USRP_X300_DEV) {
+    openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
+    std::cerr << "-- Using calibration table: calib_table_x310" << std::endl; // Bell Labs info
+    LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate);
+  
+    switch ((int)openair0_cfg[0].sample_rate) {
+      case 122880000:
+        // from usrp_time_offset
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 15; //to be checked
+        openair0_cfg[0].tx_bw                 = 80e6;
+        openair0_cfg[0].rx_bw                 = 80e6;
+        break;
+  
+      case 92160000:
+        // from usrp_time_offset
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 15; //to be checked
+        openair0_cfg[0].tx_bw                 = 80e6;
+        openair0_cfg[0].rx_bw                 = 80e6;
+        break;
+  
+      case 61440000:
+        // from usrp_time_offset
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 15;
+        openair0_cfg[0].tx_bw                 = 40e6;
+        openair0_cfg[0].rx_bw                 = 40e6;
+        break;
+  
+      case 46080000:
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 15;
+        openair0_cfg[0].tx_bw                 = 40e6;
+        openair0_cfg[0].rx_bw                 = 40e6;
+        break;
+  
+      case 30720000:
+        // from usrp_time_offset
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 15;
+        openair0_cfg[0].tx_bw                 = 20e6;
+        openair0_cfg[0].rx_bw                 = 20e6;
+        break;
+  
+      case 15360000:
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 45;
+        openair0_cfg[0].tx_bw                 = 10e6;
+        openair0_cfg[0].rx_bw                 = 10e6;
+        break;
+  
+      case 7680000:
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 50;
+        openair0_cfg[0].tx_bw                 = 5e6;
+        openair0_cfg[0].rx_bw                 = 5e6;
+        break;
+  
+      case 1920000:
+        //openair0_cfg[0].samples_per_packet    = 2048;
+        openair0_cfg[0].tx_sample_advance     = 50;
+        openair0_cfg[0].tx_bw                 = 1.25e6;
+        openair0_cfg[0].rx_bw                 = 1.25e6;
+        break;
+  
+      default:
+        LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
         exit(-1);
-      }
-
-      memset(s->recplay_state->ms_sample, 0, s->recplay_state->u_sf_max * BELL_LABS_IQ_BYTES_PER_SF);
-    } else if (s->recplay_mode == RECPLAY_REPLAYMODE) {
-      if (s->recplay_state->use_mmap) {
-        // use mmap
-        s->recplay_state->mmapfd = open(s->recplay_state->u_sf_filename, O_RDONLY | O_LARGEFILE);
-
-        if (s->recplay_state->mmapfd != 0) {
-          struct stat sb;
-          fstat(s->recplay_state->mmapfd, &sb);
-          s->recplay_state->mapsize=sb.st_size;
-          std::cerr << "Loading subframes using mmap() from " << s->recplay_state->u_sf_filename << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl;
-          s->recplay_state->ms_sample = (iqrec_t *) mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, s->recplay_state->mmapfd, 0);
-
-          if (s->recplay_state->ms_sample != MAP_FAILED) {
-            s->recplay_state->nb_samples = (sb.st_size / sizeof(iqrec_t));
-            int aligned = (((unsigned long)s->recplay_state->ms_sample & 31) == 0)? 1:0;
-            std::cerr<< "Loaded "<< s->recplay_state->nb_samples << " subframes." << std::endl;
-
-            if (aligned == 0) {
-              std::cerr<< "mmap address is not 32 bytes aligned, exiting." << std::endl;
-              close(s->recplay_state->mmapfd);
-              exit(-1);
-            }
-          } else {
-            std::cerr << "Cannot mmap file, exiting." << std::endl;
-            close(s->recplay_state->mmapfd);
-            exit(-1);
-          }
-        } else {
-          std::cerr << "Cannot open " << s->recplay_state->u_sf_filename << " , exiting." << std::endl;
-          exit(-1);
-        }
-      } else {
-        s->recplay_state->iqfd = open(s->recplay_state->u_sf_filename, O_RDONLY | O_LARGEFILE);
-
-        if (s->recplay_state->iqfd != 0) {
-          struct stat sb;
-          fstat(s->recplay_state->iqfd, &sb);
-          s->recplay_state->mapsize=sb.st_size;
-          s->recplay_state->nb_samples = (sb.st_size / sizeof(iqrec_t));
-          std::cerr << "Loading " << s->recplay_state->nb_samples << " subframes from " << s->recplay_state->u_sf_filename
-                    << " size=" << (uint64_t)sb.st_size << " bytes ..." << std::endl;
-          // allocate buffer for 1 sample at a time
-          s->recplay_state->ms_sample = (iqrec_t *) malloc(sizeof(iqrec_t));
-
-          if (s->recplay_state->ms_sample == NULL) {
-            std::cerr<< "Memory allocation failed for individual subframe replay mode." << std::endl;
-            close(s->recplay_state->iqfd);
-            exit(-1);
-          }
-
-          memset(s->recplay_state->ms_sample, 0, sizeof(iqrec_t));
-
-          // point at beginning of file
-          if (lseek(s->recplay_state->iqfd, 0, SEEK_SET) == 0) {
-            std::cerr << "Initial seek at beginning of the file" << std::endl;
-          } else {
-            std::cerr << "Problem initial seek at beginning of the file" << std::endl;
-          }
-        } else {
-          std::cerr << "Cannot open " << s->recplay_state->u_sf_filename << " , exiting." << std::endl;
-          exit(-1);
-        }
-      }
+        break;
     }
-
-    return 0;
   }
-
-
+  
+  if (device->type == USRP_B200_DEV) {
+    if ((vers == 3) && (subvers == 9) && (subsubvers>=2)) {
+      openair0_cfg[0].rx_gain_calib_table = calib_table_b210;
+      bw_gain_adjust=0;
+      std::cerr << "-- Using calibration table: calib_table_b210" << std::endl; // Bell Labs info
+    } else {
+      openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38;
+      bw_gain_adjust=1;
+      std::cerr << "-- Using calibration table: calib_table_b210_38" << std::endl; // Bell Labs info
+    }
+  
+    switch ((int)openair0_cfg[0].sample_rate) {
+      case 46080000:
+        s->usrp->set_master_clock_rate(46.08e6);
+        //openair0_cfg[0].samples_per_packet    = 1024;
+        openair0_cfg[0].tx_sample_advance     = 115;
+        openair0_cfg[0].tx_bw                 = 40e6;
+        openair0_cfg[0].rx_bw                 = 40e6;
+        break;
+  
+      case 30720000:
+        s->usrp->set_master_clock_rate(30.72e6);
+        //openair0_cfg[0].samples_per_packet    = 1024;
+        openair0_cfg[0].tx_sample_advance     = 115;
+        openair0_cfg[0].tx_bw                 = 20e6;
+        openair0_cfg[0].rx_bw                 = 20e6;
+        break;
+  
+      case 23040000:
+        s->usrp->set_master_clock_rate(23.04e6); //to be checked
+        //openair0_cfg[0].samples_per_packet    = 1024;
+        openair0_cfg[0].tx_sample_advance     = 113;
+        openair0_cfg[0].tx_bw                 = 20e6;
+        openair0_cfg[0].rx_bw                 = 20e6;
+        break;
+  
+      case 15360000:
+        s->usrp->set_master_clock_rate(30.72e06);
+        //openair0_cfg[0].samples_per_packet    = 1024;
+        openair0_cfg[0].tx_sample_advance     = 103;
+        openair0_cfg[0].tx_bw                 = 20e6;
+        openair0_cfg[0].rx_bw                 = 20e6;
+        break;
+  
+      case 7680000:
+        s->usrp->set_master_clock_rate(30.72e6);
+        //openair0_cfg[0].samples_per_packet    = 1024;
+        openair0_cfg[0].tx_sample_advance     = 80;
+        openair0_cfg[0].tx_bw                 = 20e6;
+        openair0_cfg[0].rx_bw                 = 20e6;
+        break;
+  
+      case 1920000:
+        s->usrp->set_master_clock_rate(30.72e6);
+        //openair0_cfg[0].samples_per_packet    = 1024;
+        openair0_cfg[0].tx_sample_advance     = 40;
+        openair0_cfg[0].tx_bw                 = 20e6;
+        openair0_cfg[0].rx_bw                 = 20e6;
+        break;
+  
+      default:
+        LOG_E(HW,"Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
+        exit(-1);
+        break;
+    }
+  }
+  
+  /* device specific */
+  //openair0_cfg[0].txlaunch_wait = 1;//manage when TX processing is triggered
+  //openair0_cfg[0].txlaunch_wait_slotcount = 1; //manage when TX processing is triggered
+  openair0_cfg[0].iq_txshift = 4;//shift
+  openair0_cfg[0].iq_rxrescale = 15;//rescale iqs
+  
+  for(int i=0; i<((int) s->usrp->get_rx_num_channels()); i++) {
+    if (i<openair0_cfg[0].rx_num_channels) {
+      s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i);
+      s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i);
+      set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust);
+      ::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i);
+      // limit to maximum gain
+      AssertFatal( openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] <= gain_range.stop(),
+                   "RX Gain too high, lower by %f dB\n",
+                   openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop());
+      s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i);
+      LOG_I(HW,"RX Gain %d %f (%f) => %f (max %f)\n",i,
+            openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i],
+            openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop());
+    }
+  }
+  
+  LOG_D(HW, "usrp->get_tx_num_channels() == %zd\n", s->usrp->get_tx_num_channels());
+  LOG_D(HW, "openair0_cfg[0].tx_num_channels == %d\n", openair0_cfg[0].tx_num_channels);
+  
+  for(int i=0; i<((int) s->usrp->get_tx_num_channels()); i++) {
+    ::uhd::gain_range_t gain_range_tx = s->usrp->get_tx_gain_range(i);
+  
+    if (i<openair0_cfg[0].tx_num_channels) {
+      s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i);
+      s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i);
+      s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i);
+      LOG_I(HW,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]);
+    }
+  }
+  
+  //s->usrp->set_clock_source("external");
+  //s->usrp->set_time_source("external");
+  // display USRP settings
+  LOG_I(HW,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6);
+  sleep(1);
+  // create tx & rx streamer
+  uhd::stream_args_t stream_args_rx("sc16", "sc16");
+  int samples=openair0_cfg[0].sample_rate;
+  int max=s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps();
+  samples/=10000;
+  LOG_I(HW,"RF board max packet size %u, size for 100µs jitter %d \n", max, samples);
+  
+  if ( samples < max ) {
+    stream_args_rx.args["spp"] = str(boost::format("%d") % samples );
+  }
+  
+  LOG_I(HW,"rx_max_num_samps %zu\n",
+        s->usrp->get_rx_stream(stream_args_rx)->get_max_num_samps());
+  
+  for (int i = 0; i<openair0_cfg[0].rx_num_channels; i++)
+    stream_args_rx.channels.push_back(i);
+  
+  s->rx_stream = s->usrp->get_rx_stream(stream_args_rx);
+  uhd::stream_args_t stream_args_tx("sc16", "sc16");
+  
+  for (int i = 0; i<openair0_cfg[0].tx_num_channels; i++)
+    stream_args_tx.channels.push_back(i);
+  
+  s->tx_stream = s->usrp->get_tx_stream(stream_args_tx);
+  
+  /* Setting TX/RX BW after streamers are created due to USRP calibration issue */
+  for(int i=0; i<((int) s->usrp->get_tx_num_channels()) && i<openair0_cfg[0].tx_num_channels; i++)
+    s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i);
+  
+  for(int i=0; i<((int) s->usrp->get_rx_num_channels()) && i<openair0_cfg[0].rx_num_channels; i++)
+    s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i);
+  
+  for (int i=0; i<openair0_cfg[0].rx_num_channels; i++) {
+    LOG_I(HW,"RX Channel %d\n",i);
+    LOG_I(HW,"  Actual RX sample rate: %fMSps...\n",s->usrp->get_rx_rate(i)/1e6);
+    LOG_I(HW,"  Actual RX frequency: %fGHz...\n", s->usrp->get_rx_freq(i)/1e9);
+    LOG_I(HW,"  Actual RX gain: %f...\n", s->usrp->get_rx_gain(i));
+    LOG_I(HW,"  Actual RX bandwidth: %fM...\n", s->usrp->get_rx_bandwidth(i)/1e6);
+    LOG_I(HW,"  Actual RX antenna: %s...\n", s->usrp->get_rx_antenna(i).c_str());
+  }
+  
+  for (int i=0; i<openair0_cfg[0].tx_num_channels; i++) {
+    LOG_I(HW,"TX Channel %d\n",i);
+    LOG_I(HW,"  Actual TX sample rate: %fMSps...\n", s->usrp->get_tx_rate(i)/1e6);
+    LOG_I(HW,"  Actual TX frequency: %fGHz...\n", s->usrp->get_tx_freq(i)/1e9);
+    LOG_I(HW,"  Actual TX gain: %f...\n", s->usrp->get_tx_gain(i));
+    LOG_I(HW,"  Actual TX bandwidth: %fM...\n", s->usrp->get_tx_bandwidth(i)/1e6);
+    LOG_I(HW,"  Actual TX antenna: %s...\n", s->usrp->get_tx_antenna(i).c_str());
+    LOG_I(HW,"  Actual TX packet size: %lu\n",s->tx_stream->get_max_num_samps());
+  }
+  
+  LOG_I(HW,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs());
+  device->trx_write_func = trx_usrp_write;
+  device->trx_read_func  = trx_usrp_read;
+  s->sample_rate = openair0_cfg[0].sample_rate;
+  
+  // TODO:
+  // init tx_forward_nsamps based usrp_time_offset ex
+  if(is_equal(s->sample_rate, (double)30.72e6))
+    s->tx_forward_nsamps  = 176;
+  
+  if(is_equal(s->sample_rate, (double)15.36e6))
+    s->tx_forward_nsamps = 90;
+  
+  if(is_equal(s->sample_rate, (double)7.68e6))
+    s->tx_forward_nsamps = 50;
+  
+  
+  if (device->recplay_state != NULL) { // record mode
+    device->recplay_state->ms_sample = (iqrec_t *) malloc(openair0_cfg[0].recplay_conf->u_sf_max * sizeof(iqrec_t));
+  
+    if (device->recplay_state->ms_sample == NULL) {
+      std::cerr<< "Memory allocation failed for subframe record or replay mode." << std::endl;
+      exit(-1);
+    }
+  
+    memset(device->recplay_state->ms_sample, 0, openair0_cfg[0].recplay_conf->u_sf_max * BELL_LABS_IQ_BYTES_PER_SF);
+  }
+  return 0;
 }
 /*@}*/
+}/* extern c */
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib_config.c b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib_config.c
deleted file mode 100644
index ebf1d61eedf210463678bc6ede05a122eb366baf..0000000000000000000000000000000000000000
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib_config.c
+++ /dev/null
@@ -1,73 +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
- */
-
-/** usrp_lib_config.c
- *
- * \author: HongliangXU : hong-liang-xu@agilent.com
- */
-
-#include <string.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/sysinfo.h>
-#include <sys/resource.h>
-#include "common/utils/LOG/log.h"
-#include "assertions.h"
-#include "common_lib.h"
-#include "usrp_lib.h"
-
-
-int read_usrpconfig(uint32_t *recplay_mode, recplay_state_t **recplay_state) {
-unsigned int    u_sf_record = 0;                       // record mode
-unsigned int    u_sf_replay = 0;                       // replay mode
-uint32_t enable_recplay;
-
-    paramdef_t usrp_params[] = USRP_DEVICE_PARAMS_DESC;
-    config_get(usrp_params,sizeof(usrp_params)/sizeof(paramdef_t),USRP_SECTION);
-    if (enable_recplay) {
-      *recplay_state = calloc(sizeof(recplay_state_t),1);      
-      paramdef_t usrp_recplay_params[]=USRP_RECPLAY_PARAMS_DESC ;
-      struct sysinfo systeminfo;
- 
-    // Use mmap for IQ files for systems with less than 6GB total RAM
-      sysinfo(&systeminfo);
-
-      if (systeminfo.totalram < 6144000000) {
-        (*recplay_state)->use_mmap = 0;
-      } else {
-        (*recplay_state)->use_mmap = 1;
-      }
-
-      memset((*recplay_state)->u_sf_filename, 0, 1024);
-      config_get(usrp_recplay_params,sizeof(usrp_recplay_params)/sizeof(paramdef_t),USRP_RECPLAY_SECTION);
-
-      if (strlen((*recplay_state)->u_sf_filename) == 0) {
-        (void) strcpy((
-        	*recplay_state)->u_sf_filename, DEF_SF_FILE);
-      }
-    } /* record player enabled */
-    if (u_sf_replay == 1) *recplay_mode = RECPLAY_REPLAYMODE;
-
-    if (u_sf_record == 1) *recplay_mode = RECPLAY_RECORDMODE;
-
-
-    return 0;
-  }
\ No newline at end of file
diff --git a/targets/ARCH/iqplayer/DOC/iqrecordplayer_usage.md b/targets/ARCH/iqplayer/DOC/iqrecordplayer_usage.md
new file mode 100644
index 0000000000000000000000000000000000000000..a6e4138e8ebf8102b56e4acabcbe39dc39308e58
--- /dev/null
+++ b/targets/ARCH/iqplayer/DOC/iqrecordplayer_usage.md
@@ -0,0 +1,163 @@
+# I/Q record-playback
+## using the iq recorder or iq player
+
+This feature provides I/Q record-playback as presented in the 4th OAI workshop. Tests have only been performed with a eNB, but the implementation should allow any softmodem executable to use the iq's record/player.
+The I/Q record/playback feature is briefly described hereafter, it allows you to:
+* record subframes received by the USRP board in a file while the system is operating (for example you can record a full UE connection/traffic/ disconnection sequence). Today the oai USRP device is the only one supporting the recording feature. 
+* replay subframes from a file to operate the system (possibly in multiple loops if the recorded sequence is convenient from the logical point of view). 
+
+The record/replay  are activated and configured using oai configuration parameters
+
+### Record mode
+options for record mode are:
+* `subframes-record` Activate record mode
+* `subframes-file` Path of the file used for subframes recording (default is `/tmp/iqfile`)
+* `subframes-max` Maximum count of subframes to be recorded in subframe file (default is 120000)
+
+Note that the value of `--subframes-max` parameter needs to be tuned according to your RAM capabilities. The default value is 120000, which allows for 120 seconds of record/replay but will require ~3.6GB of RAM and disk space. 
+If RAM does not allow for the parameter value, an error message will be displayed and the run will be aborted. In record mode, to minimize pzerformance impact, 
+subframes are saved into memory and written to disk when the process is terminating . When you estimate the recorded sequence is achieved, you should terminate the eNB/RRU by typing `CTRL-C`. At that time, up to the value of `--subframes-max` subframes will be written on disk. The eNB/RRU will indicate the exact count of subframes written to disk, which may be less (but not higher) that the value of `--subframes-max` parameter (120000 by default). The number of subframes written to disk is rounded to an integral number of frames. 
+Although it is possible to perform recording with a fronthaul setup, it is suggested to perform recording in full eNB mode and then replay in either monolithic or split eNB.
+The option can be used while operating full eNB or RCC/RRU linked by NGFI IF5/IF4p5 fronthaul techniques. One of the advantage of the record/replay technique is that you can replay on a fronthauling setup a file that has been recorded in full eNB mode. This can easily asserts that the fronthauling underlying set up or technique is correct.
+
+>recording session example:
+```bash
+ ./lte-softmodem -O libconfig:/usr/local/oai/conf/enb.band7.tm1.20PRB.usrpb210.conf:dbgl5    --log_config.global_log_options level,thread   --device.recplay.subframes-record 1
+............................................
+............................................
+[CONFIG] device.recplay.subframes-file set to default value "/tmp/iqfile"
+[CONFIG] subframes-record: 0
+[CONFIG] device.recplay.subframes-record set to default value
+[CONFIG] subframes-replay: 0
+[CONFIG] device.recplay.subframes-replay set to default value
+[CONFIG] subframes-max: 120000
+[CONFIG] device.recplay.subframes-max set to default value
+[CONFIG] subframes-loops: 5
+[CONFIG] device.recplay.subframes-loops set to default value
+[CONFIG] subframes-read-delay: 700
+[CONFIG] device.recplay.subframes-read-delay set to default value
+[CONFIG] subframes-write-delay: 15
+[CONFIG] device.recplay.subframes-write-delay set to default value
+[LIBCONFIG] device.recplay: 7/7 parameters successfully set, (7 to default value)
+[CONFIG] subframes-record: 1
+[CONFIG] device.recplay 1 options set from command line
+[CONFIG] loader.oai_device.shlibversion set to default value ""
+[LIBCONFIG] loader.oai_device: 2/2 parameters successfully set, (1 to default value)
+[CONFIG] loader.oai_device 0 options set from command line
+[LOADER] library liboai_device.so successfully loaded
+USRP device initialized in subframes record mode
+[HW]I lte-softmodem UHD version 3.14.1.1-release (3.14.1)
+...................................................
+...................................................
+[PHY]I lte-softmodem prach_I0 = 0.0 dB
+[PHY]I ru thread max_I0 18, min_I0 12
+^C
+Run time: 0h 26s
+	Time executing user inst.: 1s 865251us
+	Time executing system inst.: 2s 805162us
+	Max. Phy. memory usage: 4068328kB
+	Page fault number (no io): 1008741
+	Page fault number (requiring io): 15
+	Number of file system read: 97672
+	Number of filesystem write: 0
+	Number of context switch (process origin, io...): 562871
+	Number of context switch (os origin, priority...): 112
+Linux signal Interrupt...
+/usr/local/oai/develop/openairinterface5g/executables/softmodem-common.c:188 signal_handler() Exiting OAI softmodem: softmodem starting exit procedure
+Exiting ru_thread 
+U[HW]I ru thread Writing file header to /tmp/iqfile 
+[HW]I lte-softmodem Writing file header to /tmp/iqfile 
+[HW]I ru thread Writing 19730 subframes to /tmp/iqfile 
+[HW]I lte-softmodem Writing 19730 subframes to /tmp/iqfile 
+[HW]I lte-softmodem File /tmp/iqfile closed
+[HW]I ru thread File /tmp/iqfile closed
+[PHY]I ru thread RU 0 rf device stopped
+```
+
+### Playback/replay mode
+The option works only for 5MHz bandwidth because the information stored in the iq's file header regarding bandwidth is not yet properly processed. 
+ In this version,  mismatch between file content and run time parameters might lead to unpredictable results. In addition a file recorded on a AVX2-capable processor cannot be replayed on a non-AVX2-capable processor (this is to be further investigated).
+options for replay mode are:
+* `subframes-replay` Activate replay mode
+* `subframes-file` Path of the file used for subframes replay (default is `/tmp/iqfile`)
+* `subframes-loops` Number of iterations to replay the entire subframes file (default is 5)
+* `subframes-read-delay` Delay in microseconds to read a subframe in replay mode (default 200)
+* `subframes-write-delay` Delay in milliseconds to write a subframe in replay mode (default 15)
+
+>iq player session example:
+```bash
+./lte-softmodem -O libconfig:/usr/local/oai/conf/enb.nbiot.band7.tm1.50PRB.usrpb210.conf:dbgl5  --T_stdout 1   --log_config.global_log_options level,thread --eNBs.[0].component_carriers.[0].N_RB_DL 25   --device.recplay.subframes-replay 1
+[CONFIG] get parameters from libconfig /usr/local/oai/conf/enb.nbiot.band7.tm1.50PRB.usrpb210.conf , debug flags: 0x00000005
+................................
+..................................
+[PHY]I lte-softmodem rxdataF[0] 0x55f52df52f40 for RU 0
+[CONFIG] device.recplay.subframes-file set to default value "/tmp/iqfile"
+[CONFIG] subframes-record: 0
+[CONFIG] device.recplay.subframes-record set to default value
+[CONFIG] subframes-replay: 0
+[CONFIG] device.recplay.subframes-replay set to default value
+[CONFIG] subframes-max: 120000
+[CONFIG] device.recplay.subframes-max set to default value
+[CONFIG] subframes-loops: 5
+[CONFIG] device.recplay.subframes-loops set to default value
+[CONFIG] subframes-read-delay: 700
+[CONFIG] device.recplay.subframes-read-delay set to default value
+[CONFIG] subframes-write-delay: 15
+[CONFIG] device.recplay.subframes-write-delay set to default value
+[LIBCONFIG] device.recplay: 7/7 parameters successfully set, (7 to default value)
+[CONFIG] subframes-replay: 1
+[CONFIG] device.recplay 1 options set from command line
+[CONFIG] loader.oai_iqplayer.shlibversion set to default value ""
+[LIBCONFIG] loader.oai_iqplayer: 2/2 parameters successfully set, (1 to default value)
+[CONFIG] loader.oai_iqplayer 0 options set from command line
+[LOADER] library liboai_iqplayer.so successfully loaded
+[HW]I lte-softmodem Loading subframes using mmap() from /tmp/iqfile size=324433632 bytes ...
+[HW]I lte-softmodem Replay iqs from USRP B200 device, bandwidth 5.000000e+06
+[HW]I lte-softmodem Loaded 10550 subframes.
+[HW]I lte-softmodem iqplayer device initialized, replay /tmp/iqfile  for 5 iterations[HW]I lte-softmodem [RAU] has loaded USRP B200 device.
+.............................................
+.............................................
+[PHY]I ru thread max_I0 18, min_I0 12
+[PHY]I lte-softmodem prach_I0 = 0.0 dB
+[PHY]I ru thread max_I0 18, min_I0 0
+[HW]I ru thread starting subframes file with wrap_count=1 wrap_ts=81024000 ts=107616555
+[PHY]I lte-softmodem prach_I0 = 0.0 dB
+[PHY]I ru thread max_I0 18, min_I0 12
+[HW]I ru thread starting subframes file with wrap_count=2 wrap_ts=162048000 ts=188640555
+[PHY]I lte-softmodem prach_I0 = 0.0 dB
+[PHY]I ru thread max_I0 18, min_I0 0
+[HW]I ru thread starting subframes file with wrap_count=3 wrap_ts=243072000 ts=269664555
+[PHY]I lte-softmodem prach_I0 = 0.0 dB
+[PHY]I ru thread max_I0 19, min_I0 12
+[HW]I ru thread starting subframes file with wrap_count=4 wrap_ts=324096000 ts=350688555
+[PHY]I lte-softmodem prach_I0 = 0.0 dB
+[PHY]I ru thread max_I0 18, min_I0 12
+[HW]W ru thread iqplayer device terminating subframes replay  after 5 iteration
+/usr/local/oai/develop/openairinterface5g/targets/ARCH/iqplayer/iqplayer_lib.c:222 trx_iqplayer_read() Exiting OAI softmodem: replay ended, triggering process termination
+```
+
+## iq recorder and iq player implementation overview
+
+### configuration
+The iq's record/player is using the [configuration module](../../../../common/config/DOC/config.md). Configuration parameters supported by the record player are defined in the [record_player.h](../../COMMON/record_player.h) include file.
+ There are no specific sections for the recorder or the replayer, parameters are defined under the `device.recplay`section and the `read_recplayconfig` function is common to both the recorder and the player. `device.recplay` configuration section is read from oai code common to all devices:
+Implemented in [record_player.c](../../COMMON/record_player.c), the `read_recplayconfig` function is called from `load_lib` and reads the configuration parameters, saving them in a `recplay_conf_t` sub-structure of the oai device. It also allocates a `recplay_state_t` structure which will save the recorder or player data. 
+3GPP authentication algorithm doesn't allow session establishment via replaying iq's. When using the replayer, a softmodem parameter is set (`SOFTMODEM_RECPLAY_BIT` in the `optmask` bitmask of the `softmodem_params_t` structure. It allows bypassing or activating specific code in the softmodem to allow session establishment replay. This mechanism only works if in parallel specific code is also activated in the EPC, which is supported by the NOKIA LTE box.
+An easiest scenario is to use the record player in parallel with the noS1 mode, as described [here](../../../../doc/RUNMODEM.md) 
+
+### iq recorder
+most of the implementation is now located in the oai device common code:
+* The`load_lib` function in [common-lib.c](../../COMMON/common_lib.c) reads the record player parameters. 
+* Recorder specific functions are implemented in  `iqrecorder_end` saves the cached iq's to disk, it has to be called by the oai device in it's end function.
+* When recording is enabled, the device must implement iq's caching in it's read function. It also has to call the `iqrecorder_end ` function when  terminating to write iqs to a file on disk. Look at the USRP device ( [../usrp_lib.cpp](../../USRP/USERSPACE/LIB/usrp_lib.cpp) ) for  details.
+
+### iq player
+The replay feature is implemented as a oai device. 
+* The`load_lib` function in [common-lib.c](../../COMMON/common_lib.c) reads the record player parameters, this code is common with the recorder.
+* The player device is implemented in  [iqplayer_lib.c](../iqplayer_lib.c) which at build time creates the `liboai_iqplayer.so` shared library. Thi
+* s device is automatically, dynamicaly loaded when the player feature is activated at runtime when the boolean  `device.recplay.subframes-replay` option is set.
+
+### iq's file format
+The recorder adds a header containing the device type, the bandwith and a format identifier. Using these information when replaying a file has not yet been implemented, so the player only supports USRP B2xx device and 5MHz bandwith. 
+
+[oai Wikis home](https://gitlab.eurecom.fr/oai/openairinterface5g/wikis/home)
diff --git a/targets/ARCH/iqplayer/iqplayer_lib.c b/targets/ARCH/iqplayer/iqplayer_lib.c
new file mode 100644
index 0000000000000000000000000000000000000000..beb05de3fdbf9859f33ad549319bf4ad94def31e
--- /dev/null
+++ b/targets/ARCH/iqplayer/iqplayer_lib.c
@@ -0,0 +1,307 @@
+/*
+ * 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
+ */
+
+/** iqplayer_lib.cpp
+ *
+ * \author:FrancoisTaburet: francois.taburet@nokia-bell-labs.com
+ */
+#define _LARGEFILE_SOURCE
+#define _FILE_OFFSET_BITS 64
+#include <string.h>
+#include <pthread.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/resource.h>
+#include <errno.h>
+#include "common_lib.h"
+#include "assertions.h"
+#include "common/utils/LOG/log.h"
+
+
+
+
+
+
+static void parse_iqfile_header(openair0_device *device, iqfile_header_t *iq_fh) {
+  AssertFatal((memcmp(iq_fh->oaiid,OAIIQFILE_ID,sizeof(OAIIQFILE_ID)) == 0),"iqfile doesn't seem to be compatible with oai (invalid id in header)\n");
+  device->type = iq_fh->devtype;
+  device->openair0_cfg[0].tx_sample_advance=iq_fh->tx_sample_advance;
+  device->openair0_cfg[0].tx_bw =  device->openair0_cfg[0].rx_bw = iq_fh->bw;
+  LOG_UI(HW,"Replay iqs from %s device, bandwidth %e\n",get_devname(iq_fh->devtype),iq_fh->bw);
+}
+
+
+/*! \brief Called to start the iqplayer device. Return 0 if OK, < 0 if error
+    @param device pointer to the device structure specific to the RF hardware target
+*/
+static int iqplayer_loadfile(openair0_device *device, openair0_config_t *openair0_cfg) {
+  recplay_state_t *s = device->recplay_state;
+  recplay_conf_t  *c = openair0_cfg->recplay_conf;
+
+  if (s->use_mmap) {
+    // use mmap
+    s->mmapfd = open(c->u_sf_filename, O_RDONLY );
+
+    if (s->mmapfd != 0) {
+      struct stat sb;
+      fstat(s->mmapfd, &sb);
+      s->mapsize=sb.st_size;
+      LOG_I(HW,"Loading subframes using mmap() from %s size=%lu bytes ...\n",c->u_sf_filename, (uint64_t)sb.st_size );
+      void *mptr = mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, s->mmapfd, 0) ;
+      s->ms_sample = (iqrec_t *) ( mmap(NULL, sb.st_size, PROT_WRITE, MAP_PRIVATE, s->mmapfd, 0) + sizeof(iqfile_header_t));
+
+      if (mptr != MAP_FAILED) {
+        parse_iqfile_header(device, (iqfile_header_t *)mptr);
+        s->ms_sample = (iqrec_t *)((char *)mptr + sizeof(iqfile_header_t));
+        s->nb_samples = ((sb.st_size-sizeof(iqfile_header_t)) / sizeof(iqrec_t));
+        int aligned = (((unsigned long)s->ms_sample & 31) == 0)? 1:0;
+        LOG_I(HW,"Loaded %u subframes.\n",s->nb_samples );
+
+        if (aligned == 0) {
+          LOG_E(HW, "mmap address is not 32 bytes aligned, exiting.\n" );
+          close(s->mmapfd);
+          exit(-1);
+        }
+      } else {
+        LOG_E(HW,"Cannot mmap file, exiting.\n");
+        close(s->mmapfd);
+        exit(-1);
+      }
+    } else {
+      LOG_E( HW,"Cannot open %s exiting.\n", c->u_sf_filename );
+      exit(-1);
+    }
+  } else {
+    s->iqfd = open(c->u_sf_filename, O_RDONLY);
+
+    if (s->iqfd != 0) {
+      struct stat sb;
+      iqfile_header_t fh;
+      size_t hs = read(s->iqfd,&fh,sizeof(fh));
+
+      if (hs == sizeof(fh)) {
+        parse_iqfile_header(device, &fh);
+        fstat(s->iqfd, &sb);
+        s->mapsize=sb.st_size;
+        s->nb_samples = ((sb.st_size-sizeof(iqfile_header_t))/ sizeof(iqrec_t));
+        LOG_I(HW, "Loading %u subframes from %s,size=%lu bytes ...\n",s->nb_samples, c->u_sf_filename,(uint64_t)sb.st_size);
+        // allocate buffer for 1 sample at a time
+        s->ms_sample = (iqrec_t *) malloc(sizeof(iqrec_t));
+
+        if (s->ms_sample == NULL) {
+          LOG_E(HW,"Memory allocation failed for individual subframe replay mode.\n" );
+          close(s->iqfd);
+          exit(-1);
+        }
+
+        memset(s->ms_sample, 0, sizeof(iqrec_t));
+
+        // point at beginning of iqs in file
+        if (lseek(s->iqfd,sizeof(iqfile_header_t), SEEK_SET) == 0) {
+          LOG_I(HW,"Initial seek at beginning of the file\n" );
+        } else {
+          LOG_I(HW,"Problem initial seek at beginning of the file\n");
+        }
+      } else {
+        LOG_E(HW,"Cannot read header in %s exiting.\n",c->u_sf_filename );
+        close(s->iqfd);
+        exit(-1);
+      }
+    } else {
+      LOG_E(HW,"Cannot open %s exiting.\n",c->u_sf_filename );
+      exit(-1);
+    }
+  }
+
+  return 0;
+}
+
+/*! \brief Terminate operation of the oai iq player
+ * \param device, the hardware used
+ */
+static void trx_iqplayer_end(openair0_device *device) {
+  if (device == NULL)
+    return;
+
+  if (device->recplay_state == NULL)
+    return;
+
+  if (device->recplay_state->use_mmap) {
+    if (device->recplay_state->ms_sample != MAP_FAILED) {
+      munmap(device->recplay_state->ms_sample, device->recplay_state->mapsize);
+      device->recplay_state->ms_sample = NULL;
+    }
+
+    if (device->recplay_state->mmapfd != 0) {
+      close(device->recplay_state->mmapfd);
+      device->recplay_state->mmapfd = 0;
+    }
+  } else {
+    if (device->recplay_state->ms_sample != NULL) {
+      free(device->recplay_state->ms_sample);
+      device->recplay_state->ms_sample = NULL;
+    }
+
+    if (device->recplay_state->iqfd != 0) {
+      close(device->recplay_state->iqfd);
+      device->recplay_state->iqfd = 0;
+    }
+  }
+}
+/*! \brief Write iqs function when in replay mode, just introduce a delay, as configured at init time,
+      @param device pointer to the device structure specific to the RF hardware target
+      @param timestamp The timestamp at which the first sample MUST be sent
+      @param buff Buffer which holds the samples
+      @param nsamps number of samples to be sent
+      @param antenna_id index of the antenna if the device has multiple antennas
+      @param flags flags must be set to TRUE if timestamp parameter needs to be applied
+*/
+static int trx_iqplayer_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
+  struct timespec req;
+  req.tv_sec = 0;
+  req.tv_nsec = device->openair0_cfg->recplay_conf->u_sf_write_delay * 1000;
+  nanosleep(&req, NULL);
+  return nsamps;
+}
+
+/*! \brief Receive samples from iq file.
+ * Read \ref nsamps samples from each channel to buffers. buff[0] is the array for
+ * the first channel. *ptimestamp is the time at which the first sample
+ * was received.
+ * \param device the hardware to use
+ * \param[out] ptimestamp the time at which the first sample was received.
+ * \param[out] buff An array of pointers to buffers for received samples. The buffers must be large enough to hold the number of samples \ref nsamps.
+ * \param nsamps Number of samples. One sample is 2 byte I + 2 byte Q => 4 byte.
+ * \param antenna_id Index of antenna for which to receive samples
+ * \returns the number of sample read
+*/
+static int trx_iqplayer_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
+  int samples_received=0;
+  static unsigned int    cur_samples;
+  static int64_t         wrap_count;
+  static int64_t  wrap_ts;
+  recplay_state_t *s = device->recplay_state;
+
+  if (cur_samples == s->nb_samples) {
+    cur_samples = 0;
+    wrap_count++;
+
+    if (wrap_count == device->openair0_cfg->recplay_conf->u_sf_loops) {
+      LOG_W(HW, "iqplayer device terminating subframes replay  after %u iteration\n",device->openair0_cfg->recplay_conf->u_sf_loops);
+      exit_function(__FILE__, __FUNCTION__, __LINE__,"replay ended, triggering process termination\n");
+    }
+
+    wrap_ts = wrap_count * (s->nb_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000));
+
+    if (!device->recplay_state->use_mmap) {
+      if (lseek(device->recplay_state->iqfd, 0, SEEK_SET) == 0) {
+        LOG_I(HW,"Seeking at the beginning of IQ file");
+      } else {
+        LOG_I(HW, "Problem seeking at the beginning of IQ file");
+      }
+    }
+  }
+
+  if (s->use_mmap) {
+    if (cur_samples < s->nb_samples) {
+      *ptimestamp = (s->ms_sample[0].ts + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000))) + wrap_ts;
+
+      if (cur_samples == 0) {
+        LOG_I(HW,"starting subframes file with wrap_count=%lu wrap_ts=%lu ts=%lu\n", wrap_count,wrap_ts,*ptimestamp);
+      }
+
+      memcpy(buff[0], &s->ms_sample[cur_samples].samples[0], nsamps*4);
+      cur_samples++;
+    }
+  } else {
+    // read sample from file
+    if (read(s->iqfd, s->ms_sample, sizeof(iqrec_t)) != sizeof(iqrec_t)) {
+      LOG_E(HW,"pb reading iqfile at index %lu\n",sizeof(iqrec_t)*cur_samples );
+      close(s->iqfd);
+      free(s->ms_sample);
+      s->ms_sample = NULL;
+      s->iqfd = 0;
+      exit(-1);
+    }
+
+    if (cur_samples < s->nb_samples) {
+      static int64_t ts0 = 0;
+
+      if ((cur_samples == 0) && (wrap_count == 0)) {
+        ts0 = s->ms_sample->ts;
+      }
+
+      *ptimestamp = ts0 + (cur_samples * (((int)(device->openair0_cfg[0].sample_rate)) / 1000)) + wrap_ts;
+
+      if (cur_samples == 0) {
+        LOG_I(HW, "starting subframes file with wrap_count=%lu wrap_ts=%lu ts=%lu ",wrap_count,wrap_ts, *ptimestamp);
+      }
+
+      memcpy(buff[0], &s->ms_sample->samples[0], nsamps*4);
+      cur_samples++;
+      // Prepare for next read
+      off_t where = lseek(s->iqfd, cur_samples * sizeof(iqrec_t), SEEK_SET);
+
+      if (where < 0) {
+        LOG_E(HW,"Cannot lseek in iqfile: %s\n",strerror(errno));
+        exit(-1);
+      }
+    }
+  }
+
+  struct timespec req;
+
+  req.tv_sec = 0;
+
+  req.tv_nsec = (device->openair0_cfg[0].recplay_conf->u_sf_read_delay) * 1000;
+
+  nanosleep(&req, NULL);
+
+  return nsamps;
+
+  return samples_received;
+}
+
+
+int device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
+  device->openair0_cfg = openair0_cfg;
+  device->trx_start_func = NULL;
+  device->trx_get_stats_func = NULL;
+  device->trx_reset_stats_func = NULL;
+  device->trx_end_func   = trx_iqplayer_end;
+  device->trx_stop_func  = NULL;
+  device->trx_set_freq_func = NULL;
+  device->trx_set_gains_func   = NULL;
+  // Replay subframes from from file
+  //  openair0_cfg[0].rx_gain_calib_table = calib_table_b210_38;
+  //  bw_gain_adjust=1;
+  device->trx_write_func = trx_iqplayer_write;
+  device->trx_read_func  = trx_iqplayer_read;
+  iqplayer_loadfile(device, openair0_cfg);
+  LOG_UI(HW,"iqplayer device initialized, replay %s  for %i iterations",openair0_cfg->recplay_conf->u_sf_filename,openair0_cfg->recplay_conf->u_sf_loops);
+  return 0;
+}
+
+/*@}*/
diff --git a/targets/COMMON/create_nr_tasks.h b/targets/COMMON/create_nr_tasks.h
index 7f5961f5aef5cdd0a3653ad60f5615aeec5686b5..ca259a2b34a6cce96639ffa1ef2762511d73c3eb 100644
--- a/targets/COMMON/create_nr_tasks.h
+++ b/targets/COMMON/create_nr_tasks.h
@@ -22,12 +22,10 @@
 #ifndef CREATE_NR_TASKS_H_
 #define CREATE_NR_TASKS_H_
 
-#if defined(ENABLE_ITTI)
 /* External declaration of L2L1 task that depend on the target */
 extern void *l2l1_task(void *arg);
 
 int create_gNB_tasks(uint32_t gnb_nb);
 
-#endif
 
 #endif /* CREATE_TASKS_H_ */
diff --git a/targets/COMMON/create_tasks.h b/targets/COMMON/create_tasks.h
index 339f4aaa8f5fdaa1d0a8c2839afda9586e9f2053..843897cefb4a73b0f52fc74e7b2fc80ddeb0790d 100644
--- a/targets/COMMON/create_tasks.h
+++ b/targets/COMMON/create_tasks.h
@@ -22,13 +22,11 @@
 #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);
 int create_tasks_mbms(uint32_t enb_nb);
-#endif
 
 #endif /* CREATE_TASKS_H_ */
diff --git a/targets/COMMON/create_tasks_mbms.h b/targets/COMMON/create_tasks_mbms.h
index 339f4aaa8f5fdaa1d0a8c2839afda9586e9f2053..843897cefb4a73b0f52fc74e7b2fc80ddeb0790d 100644
--- a/targets/COMMON/create_tasks_mbms.h
+++ b/targets/COMMON/create_tasks_mbms.h
@@ -22,13 +22,11 @@
 #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);
 int create_tasks_mbms(uint32_t enb_nb);
-#endif
 
 #endif /* CREATE_TASKS_H_ */
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index ede331c7166ca03fe8cd2df0ed08e28436db7e47..0b365ea938ef92dc7ff1a8d5a56e90c2a1b72718 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -265,7 +265,7 @@ void exit_function(const char *file, const char *function, const int line, const
 
 static void get_options(void) {
   CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
-  get_common_options();
+  get_common_options(SOFTMODEM_ENB_BIT );
   CONFIG_CLEARRTFLAG(CONFIG_NOEXITONHELP);
 
   if ( !(CONFIG_ISFLAGSET(CONFIG_ABORT)) ) {
diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c
index da6ee92665bb2d8ada147938560c6434fdadc863..25371260bf95476b0ebfae8312ccf716e96aee1e 100644
--- a/targets/RT/USER/lte-uesoftmodem.c
+++ b/targets/RT/USER/lte-uesoftmodem.c
@@ -79,10 +79,7 @@
   #include "UTIL/OTG/otg_vars.h"
 #endif
 
-#if defined(ENABLE_ITTI)
-  #include "create_tasks.h"
-#endif
-
+#include "create_tasks.h"
 #include "system.h"
 
 
@@ -300,7 +297,7 @@ static void get_options(void) {
   CONFIG_SETRTFLAG(CONFIG_NOEXITONHELP);
   /* unknown parameters on command line will be checked in main
      after all init have been performed                         */
-  get_common_options();
+  get_common_options(SOFTMODEM_4GUE_BIT );
   get_uethreads_params();
   paramdef_t cmdline_uemodeparams[] =CMDLINE_UEMODEPARAMS_DESC;
   paramdef_t cmdline_ueparams[] =CMDLINE_UEPARAMS_DESC;
@@ -780,19 +777,11 @@ int main( int argc, char **argv ) {
   // wait for end of program
   printf("TYPE <CTRL-C> TO TERMINATE\n");
   //getchar();
-#if defined(ENABLE_ITTI)
   printf("Entering ITTI signals handler\n");
   itti_wait_tasks_end();
   printf("Returned from ITTI signal handler\n");
   oai_exit=1;
   printf("oai_exit=%d\n",oai_exit);
-#else
-
-  while (oai_exit==0)
-    rt_sleep_ns(100000000ULL);
-
-  printf("Terminating application - oai_exit=%d\n",oai_exit);
-#endif
 
   // stop threads
   if(IS_SOFTMODEM_DOFORMS)