diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 70a661adf0c67d636c81b418c6e79586362eb45b..f9a459612986cf06b1b300935d7f844eea7745fe 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -158,10 +158,11 @@ enum transmission_access_mode {
   CBA_ACCESS};
 
 typedef enum  {
-  eNodeB_3GPP=0,  // classical eNodeB function
+  eNodeB_3GPP=0,   // classical eNodeB function
   eNodeB_3GPP_BBU, // eNodeB with NGFI IF5
-  NGFI_RRU_IF4,   // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) 
-  NGFI_RCC_IF4    // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) 
+  NGFI_RRU_IF5,    // NGFI_RRU with IF5
+  NGFI_RRU_IF4,    // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) 
+  NGFI_RCC_IF4     // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) 
 } eNB_func_t;
   
 typedef struct UE_SCAN_INFO_s {
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index a81e9dcfad4cdd65f1786740701664257c7eebbf..db069c64403fbcb95b607f4d033a7a97627fbda4 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -2546,7 +2546,8 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
 
   if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot)
 		
-    if ((eNB->node_function == NGFI_RRU_IF4) || 
+    if ((eNB->node_function == NGFI_RRU_IF4) ||
+        (eNB->node_function == NGFI_RRU_IF5) || 
 	      (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF
 
 	    for (i=0; i<fp->nb_antennas_rx; i++)
@@ -2586,7 +2587,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
 
     } else if(eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF
-      /// **** trx_read_func from IF device **** ///
+      /// **** recv_IF5 of rxdata from RRH **** ///       
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 );  
+
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 );  
+
       nanosleep(&time_req, &time_rem);
       
       proc->timestamp_rx += fp->samples_per_tti;
@@ -2598,7 +2603,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl
       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx );
       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx );
     }
-
+        
+    if (eNB->node_function == NGFI_RRU_IF5) {
+      /// **** send_IF5 of rxdata to BBU **** ///       
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );  
+      //send_IF5(eNB, proc, );
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 );  
+      
+    }
 
     if ((eNB->node_function == NGFI_RRU_IF4) || 
         (eNB->node_function == eNodeB_3GPP)  ||
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 73abd5d698827e043da05c466c0dc94098ec5b19..8fe33fefd5a405cc058d108891eb81c2403f8824 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -331,9 +331,11 @@ const char* eurecomFunctionsNames[] = {
   "itti_relay_thread",
   "test",
   
-  /* IF4 signals */
+  /* IF4/IF5 signals */
   "send_if4",
-  "recv_if4"
+  "recv_if4",
+  "send_if5",
+  "recv_if5"  
 };
 
 struct vcd_module_s vcd_modules[VCD_SIGNAL_DUMPER_MODULE_END] = {
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index b6d0072603d019629703627f0dfae4c435aa5ed7..7bcdc5733bfb0403f811b6a4a58cd946a1027565 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -308,10 +308,12 @@ typedef enum {
   VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_RELAY_THREAD,
   VCD_SIGNAL_DUMPER_FUNCTIONS_TEST,
   
-  /* IF4 signals */
+  /* IF4/IF5 signals */
   VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4,
   VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4,
-  
+  VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5,
+
   VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
   VCD_SIGNAL_DUMPER_FUNCTIONS_END = VCD_SIGNAL_DUMPER_FUNCTIONS_LAST,
 } vcd_signal_dump_functions;
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 9111fe42c6092b53c0f32c84c7867d1ca4813f2c..0668764edd7b42379b7aeb49a12e153a56231180 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -436,7 +436,9 @@ static void* eNB_thread_rxtx( void* param ) {
     if (oai_exit) break;
 
     // UE-specific RX processing for subframe n
-    if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) {
+    if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) ||
+        (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) ||
+        (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) {
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 );
       // this is the ue-specific processing for the subframe and can be multi-threaded later
       phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay );
@@ -474,7 +476,9 @@ static void* eNB_thread_rxtx( void* param ) {
       
       if (oai_exit) break;
       
-      if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { 
+      if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) ||
+          (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) ||
+          (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { 
         phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay, NULL );
 
         /* we're done, let the next one proceed */
@@ -491,8 +495,7 @@ static void* eNB_thread_rxtx( void* param ) {
           exit_fun("nothing to add");
           break;
 	}
-      } else {
-
+      } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) {
         /// **** recv_IF4 of txdataF from RCC **** ///             
         VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );  
         do { 
@@ -500,11 +503,19 @@ static void* eNB_thread_rxtx( void* param ) {
         } while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1); 
         VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 );   
         
+      } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5) {
+        /// **** recv_IF5 of txdata from BBU **** ///       
+        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 );  
+        //recv_IF5();
+        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 );  
+
       }
     }
 
     // eNodeB_3GPP, _BBU and RRU create txdata
-    if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) {
+    if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) ||
+        (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) ||
+        (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4)) {
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 );
       do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] );
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 );
@@ -526,8 +537,9 @@ static void* eNB_thread_rxtx( void* param ) {
           
 
     // eNodeB_3GPP, RRU write to RF device    
-    if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP ||
-        PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) {
+    if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) ||
+        (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) ||
+        (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5)) {
       // Transmit TX buffer based on timestamp from RX  
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
       // prepare tx buffer pointers
@@ -548,14 +560,17 @@ static void* eNB_thread_rxtx( void* param ) {
       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff );
 
     } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) {
-      /// **** trx_write_func to IF device **** ///       
+      /// **** send_IF5 of txdata to RRH **** ///       
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );  
       send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, &seqno, IF5_RRH_GW);
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 );  
 
     } else { 
       /// **** send_IF4 of txdataF to RRU **** ///       
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 );   
       send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
+
     }
 
     if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) {
@@ -759,7 +774,9 @@ static void* eNB_thread_rx_common( void* param ) {
   }
   
   // Start RF device for this CC
-  if (eNB->node_function == eNodeB_3GPP || eNB->node_function == NGFI_RRU_IF4) {
+  if ((eNB->node_function == eNodeB_3GPP) || 
+      (eNB->node_function == NGFI_RRU_IF4) || 
+      (eNB->node_function == NGFI_RRU_IF5)) {
     if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) 
       LOG_E(HW,"Could not start the RF device\n");
   }
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 656c22ced32f9471e63230b765551f3f94971916..887f95a1117fee0c88131d0c561ff0eb1dec9498 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -385,9 +385,11 @@ void help (void) {
   printf("  --ue-txgain set UE TX gain\n");
   printf("  --ue-scan_carrier set UE to scan around carrier\n");
   printf("  --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n");
-  printf("  --RCC run using NGFI RCC node function\n");
-  printf("  --RRU run using NGFI RRU node function\n");
+  printf("  --RCC run using NGFI RCC node function IF4 split\n");
+  printf("  --RRU run using NGFI RRU node function  IF4 split\n");
   printf("  --eNB run using 3GPP eNB node function\n");   
+  printf("  --BBU run using 3GPP eNB node function with IF5 split\n");   
+  printf("  --RRH run using RRH node function with IF5 split\n");   
   printf("  -C Set the downlink frequency for all component carriers\n");
   printf("  -d Enable soft scope and L1 and L2 stats (Xforms)\n");
   printf("  -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n");
@@ -687,7 +689,8 @@ static void get_options (int argc, char **argv)
     LONG_OPTION_RCC,
     LONG_OPTION_RRU,
     LONG_OPTION_ENB,
-    LONG_OPTION_ENB_BBU
+    LONG_OPTION_ENB_BBU,
+    LONG_OPTION_RRH
 #if T_TRACER
     ,
     LONG_OPTION_T_PORT,
@@ -715,6 +718,7 @@ static void get_options (int argc, char **argv)
     {"RRU", no_argument, NULL, LONG_OPTION_RRU},
     {"eNB", no_argument, NULL, LONG_OPTION_ENB},
     {"BBU", no_argument, NULL, LONG_OPTION_ENB_BBU},
+    {"RRH", no_argument, NULL, LONG_OPTION_RRH},
 #if T_TRACER
     {"T_port",                 required_argument, 0, LONG_OPTION_T_PORT},
     {"T_nowait",               no_argument,       0, LONG_OPTION_T_NOWAIT},
@@ -821,6 +825,10 @@ static void get_options (int argc, char **argv)
     case LONG_OPTION_ENB_BBU:
       node_function = eNodeB_3GPP_BBU;
       break;
+
+    case LONG_OPTION_RRH:
+      node_function = NGFI_RRU_IF5;
+      break;
       
 #if T_TRACER
     case LONG_OPTION_T_PORT: {
@@ -1649,7 +1657,7 @@ int main( int argc, char **argv )
   openair0_cfg[0].log_level = glog_level;
   
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-    if (node_function == NGFI_RRU_IF4) {
+    if (node_function == NGFI_RRU_IF4 || node_function == NGFI_RRU_IF5) {
       PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = RRH_HOST;
       PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST;
     } else {
@@ -1670,39 +1678,12 @@ int main( int argc, char **argv )
   openair0.type = NONE_DEV;
   /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */
   openair0.transp_type = NONE_TP;
-  
-  // Legacy BBU - RRH init  
-  //int returns=-1;
-  ///* BBU can have either a local or a remote radio head */  
-  //if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active  - load library of radio head and initiate it
-    //if (mode!=loop_through_memory) {
-      //returns=openair0_device_load(&openair0, &openair0_cfg[0]);
-      //printf("openair0_device_init returns %d\n",returns);
-      //if (returns<0) {
-	//printf("Exiting, cannot initialize device\n");
-	//exit(-1);
-      //}
-    //}
-    //else if (mode==loop_through_memory) {    
-    //}
-  //}  else { //remote radio head active - load library of transport protocol and initiate it 
-    //if (mode!=loop_through_memory) {
-      //returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params);
-      //printf("openair0_transport_init returns %d\n",returns);
-      //if (returns<0) { 
-	//printf("Exiting, cannot initialize transport protocol\n");
-	//exit(-1);
-      //}
-    //}
-    //else if (mode==loop_through_memory) {    
-    //}
-  //}   
-    
+      
   int returns=-1;
     
   // Handle spatially distributed MIMO antenna ports   
   // Load RF device and initialize
-  if (node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { 
+  if (node_function == NGFI_RRU_IF5 || node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { 
     for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {  
       if (mode!=loop_through_memory) {
         returns=openair0_device_load(&(PHY_vars_eNB_g[0][CC_id]->rfdevice), &openair0_cfg[0]);