From 413df163d83ae891ef9ac86071a37dbc64d4004b Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Sun, 4 Jun 2017 02:44:26 -0700
Subject: [PATCH] first working version with oaisim. This is prior to MAC
 interface reworking

---
 openair1/PHY/INIT/lte_init.c                  |  31 +-
 openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c |   2 +-
 .../PHY/LTE_ESTIMATION/lte_ue_measurements.c  |  14 +-
 openair1/PHY/LTE_TRANSPORT/dci.c              |  41 +-
 openair1/PHY/LTE_TRANSPORT/dci_tools.c        |  17 +-
 openair1/PHY/LTE_TRANSPORT/if4_tools.c        |  21 +-
 openair1/PHY/LTE_TRANSPORT/if4_tools.h        |   2 +-
 openair1/PHY/LTE_TRANSPORT/pcfich.c           |  23 +-
 openair1/PHY/LTE_TRANSPORT/prach.c            | 136 ++-
 openair1/PHY/LTE_TRANSPORT/print_stats.c      |  43 +-
 .../PHY/LTE_TRANSPORT/ulsch_demodulation.c    |  11 +-
 openair1/PHY/MODULATION/defs.h                |   3 +-
 openair1/PHY/MODULATION/slot_fep_ul.c         |  51 +-
 openair1/PHY/MODULATION/ul_7_5_kHz.c          |   2 +-
 openair1/PHY/defs.h                           |  12 +
 openair1/SCHED/phy_procedures_lte_eNb.c       |  35 +-
 openair1/SCHED/phy_procedures_lte_ue.c        |  22 +-
 openair1/SCHED/ru_procedures.c                |  20 +-
 openair1/SIMULATION/RF/dac.c                  |  27 +-
 openair1/SIMULATION/RF/defs.h                 |   2 +
 openair2/ENB_APP/enb_config.c                 |  16 +-
 openair2/LAYER2/MAC/config.c                  |   5 +
 openair2/LAYER2/MAC/eNB_scheduler_ulsch.c     |   8 +-
 openair2/LAYER2/MAC/main.c                    |   8 +-
 openair2/RRC/LITE/MESSAGES/asn1_msg.c         |  28 +-
 openair2/RRC/LITE/rrc_eNB.c                   |   4 +
 openair2/UTIL/LOG/vcd_signal_dumper.c         |   4 +
 openair2/UTIL/LOG/vcd_signal_dumper.h         |   4 +
 targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h |   4 +-
 targets/RT/USER/lte-enb.c                     |  80 +-
 targets/RT/USER/lte-ru.c                      |  88 +-
 targets/RT/USER/lte-softmodem.c               |   3 +-
 targets/RT/USER/lte-ue.c                      | 884 +++++++++---------
 targets/SIMU/USER/channel_sim.c               |  92 +-
 targets/SIMU/USER/oaisim.c                    |  14 +-
 targets/SIMU/USER/oaisim.h                    |   6 +-
 targets/SIMU/USER/oaisim_functions.c          |  73 +-
 37 files changed, 990 insertions(+), 846 deletions(-)

diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index fe12ba0e18e..8784aa80b34 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -41,7 +41,7 @@ int N_RB_DL_array[6] = {6,15,25,50,75,100};
 
 void phy_config_mib_eNB(int                 Mod_id,
 			int                 CC_id,
-			int                 eutra_band,
+			int                 eutra_band,  
 			int                 dl_Bandwidth,
 			PHICH_Config_t      *phich_config,
 			int                 Nid_cell,
@@ -52,9 +52,10 @@ void phy_config_mib_eNB(int                 Mod_id,
 
   
   LTE_DL_FRAME_PARMS *fp;
+  PHICH_RESOURCE_t phich_resource_table[4]={oneSixth,half,one,two};
 
-  LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u)\n",
-	Mod_id, CC_id, eutra_band, N_RB_DL_array[dl_Bandwidth], Nid_cell, p_eNB,dl_CarrierFreq);
+  LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n",
+	Mod_id, CC_id, eutra_band, N_RB_DL_array[dl_Bandwidth], Nid_cell, p_eNB,dl_CarrierFreq,phich_config->phich_Resource,phich_config->phich_Duration);
 
   if (RC.eNB == NULL) {
     RC.eNB                               = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB***));
@@ -84,7 +85,9 @@ void phy_config_mib_eNB(int                 Mod_id,
   fp->eutra_band                         = eutra_band;
   fp->Ncp                                = Ncp;
   fp->nb_antenna_ports_eNB               = p_eNB;
-  fp->phich_config_common.phich_resource = phich_config->phich_Resource;
+
+  AssertFatal(phich_config->phich_Resource < 4, "Illegal phich_Resource\n");
+  fp->phich_config_common.phich_resource = phich_resource_table[phich_config->phich_Resource];
   fp->phich_config_common.phich_duration = phich_config->phich_Duration;
   fp->dl_CarrierFreq                     = dl_CarrierFreq;
   fp->ul_CarrierFreq                     = ul_CarrierFreq;
@@ -168,6 +171,8 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
   LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig);
   fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset           =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset;
   LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset);
+
+  init_prach_tables(839);
   compute_prach_seq(&fp->prach_config_common,fp->frame_type,
                     RC.eNB[Mod_id][CC_id]->X_u);
 
@@ -245,7 +250,6 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
 
   init_ul_hopping(fp);
 
-
   // MBSFN
   if (mbsfn_SubframeConfigList != NULL) {
     fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count;
@@ -1563,15 +1567,15 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
     if (abstraction_flag==0) {
       for (eNB_id=0; eNB_id<3; eNB_id++) {
 	
-	pusch_vars[UE_id]->rxdataF_ext      = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-	pusch_vars[UE_id]->rxdataF_ext2     = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-	pusch_vars[UE_id]->drs_ch_estimates = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-	pusch_vars[UE_id]->drs_ch_estimates_time = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-	pusch_vars[UE_id]->rxdataF_comp     = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-	pusch_vars[UE_id]->ul_ch_mag  = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
-	pusch_vars[UE_id]->ul_ch_magb = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
+	pusch_vars[UE_id]->rxdataF_ext      = (int32_t**)malloc16( 2*sizeof(int32_t*) );
+	pusch_vars[UE_id]->rxdataF_ext2     = (int32_t**)malloc16( 2*sizeof(int32_t*) );
+	pusch_vars[UE_id]->drs_ch_estimates = (int32_t**)malloc16( 2*sizeof(int32_t*) );
+	pusch_vars[UE_id]->drs_ch_estimates_time = (int32_t**)malloc16( 2*sizeof(int32_t*) );
+	pusch_vars[UE_id]->rxdataF_comp     = (int32_t**)malloc16( 2*sizeof(int32_t*) );
+	pusch_vars[UE_id]->ul_ch_mag  = (int32_t**)malloc16( 2*sizeof(int32_t*) );
+	pusch_vars[UE_id]->ul_ch_magb = (int32_t**)malloc16( 2*sizeof(int32_t*) );
 	
-	for (i=0; i<fp->nb_antennas_rx; i++) {
+	for (i=0; i<2; i++) {
 	  // RK 2 times because of output format of FFT!
 	  // FIXME We should get rid of this
 	  pusch_vars[UE_id]->rxdataF_ext[i]      = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti );
@@ -1594,7 +1598,6 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB,
   
   eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration
   
-  init_prach_tables(839);
 
 
   return (0);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 807c4e3e0a4..99cf55746dc 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -206,7 +206,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id)
 
   LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
   LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id];
-  int32_t **ul_ch_estimates_time=  eNB_pusch_vars->drs_ch_estimates_time[0];
+  int32_t **ul_ch_estimates_time=  eNB_pusch_vars->drs_ch_estimates_time;
   uint8_t cyclic_shift = 0;
   int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size);
 
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
index 09603d96cde..4ce6e6487af 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
@@ -344,10 +344,10 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
 
       for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) {
         k = (nu + nushift)%6;
-#ifdef DEBUG_MEAS_RRC
-        LOG_I(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift,
+	//#ifdef DEBUG_MEAS_RRC
+        LOG_D(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift,
               eNB_offset,k,l);
-#endif
+	//#endif
 
         for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
           rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)];
@@ -422,18 +422,18 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
 
     }
 
-#ifdef DEBUG_MEAS_RRC
+    //#ifdef DEBUG_MEAS_RRC
 
     //    if (slot == 0) {
 
       if (eNB_offset == 0)
-        LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id,
+        LOG_D(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id,
               ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
               10*log10(ue->measurements.rssi),
               ue->rx_total_gain_dB,
               ue->measurements.n0_power_tot_dBm);
 
-      LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n",
+      LOG_D(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n",
             ue->Mod_id,
             ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,eNB_offset,
             (eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
@@ -448,7 +448,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
 
       //    }
 
-#endif
+      //#endif
   }
 
 }
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index a719ae614f1..3913c8a0bd7 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -42,6 +42,7 @@
 
 #include "assertions.h" 
 #include "T.h"
+#include "UTIL/LOG/log.h"
 
 //#define DEBUG_DCI_ENCODING 1
 //#define DEBUG_DCI_DECODING 1
@@ -452,10 +453,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t
 
   //  printf("Mquad %d, RCC %d\n",Mquad,RCC);
 
-  if (!z) {
-    printf("dci.c: pdcch_deinterleaving: FATAL z is Null\n");
-    return;
-  }
+  AssertFatal(z!=NULL,"dci.c: pdcch_deinterleaving: FATAL z is Null\n");
 
   // undo permutation
   for (i=0; i<Mquad; i++) {
@@ -1881,9 +1879,9 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars,
 
 
 #ifdef DEBUG_DCI_DECODING
-  printf("[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols);
+  LOG_I(PHY,"[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols);
 
-  printf("demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config);
+  LOG_I(PHY,"demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config);
 #endif
 
   pdcch_demapping(pdcch_vars[eNB_id]->llr,
@@ -2020,7 +2018,7 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci,
   }
 
 
-  LOG_I(PHY," dci.c: get_num_pdcch_symbols subframe %d FATAL, illegal numCCE %d (num_dci %d)\n",subframe,numCCE,num_dci);
+  //  LOG_I(PHY," dci.c: get_num_pdcch_symbols subframe %d FATAL, illegal numCCE %d (num_dci %d)\n",subframe,numCCE,num_dci);
   //for (i=0;i<num_dci;i++) {
   //  printf("dci_alloc[%d].L = %d\n",i,dci_alloc[i].L);
   //}
@@ -2114,7 +2112,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci,
       if (dci_alloc[i].L == (uint8_t)L) {
 
 #ifdef DEBUG_DCI_ENCODING
-        printf("Generating common DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x)\n",i,num_common_dci,dci_alloc[i].firstCCE,dci_alloc[i].dci_length,1<<dci_alloc[i].L,
+        LOG_I(PHY,"Generating common DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x)\n",i,num_common_dci,dci_alloc[i].firstCCE,dci_alloc[i].dci_length,1<<dci_alloc[i].L,
               *(unsigned int*)dci_alloc[i].dci_pdu);
         dump_dci(frame_parms,&dci_alloc[i]);
 #endif
@@ -2792,14 +2790,13 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
     // CCE is not allocated yet
 
     if (CCEmap_cand == 0) {
-#ifdef DEBUG_DCI_DECODING
 
       if (do_common == 1)
-        LOG_I(PHY,"[DCI search - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
+        LOG_D(PHY,"[DCI search - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
       else
-        LOG_I(PHY,"[DCI search - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
+        LOG_D(PHY,"[DCI search - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask);
+
 
-#endif
 
       dci_decoding(sizeof_bits,
                    L,
@@ -2810,9 +2807,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
         printf("dci_decoded_output[%d] => %x\n",i,dci_decoded_output[i]);
       */
       crc = (crc16(dci_decoded_output,sizeof_bits)>>16) ^ extract_crc(dci_decoded_output,sizeof_bits);
-#ifdef DEBUG_DCI_DECODING
-      printf("crc =>%x\n",crc);
-#endif
+
+      //LOG_I(PHY,"crc =>%x\n",crc);
+
 
       if (((L>1) && ((crc == si_rnti)||
 		     (crc == p_rnti)||
@@ -2828,9 +2825,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
           dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[1];
           dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[2];
           dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[3];
-#ifdef DEBUG_DCI_DECODING
-          printf("DCI => %x,%x,%x,%x\n",dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3]);
-#endif
+
+	  //LOG_I(PHY,"DCI => %x,%x,%x,%x\n",dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3]);
+
         } else {
           dci_alloc[*dci_cnt].dci_pdu[7] = dci_decoded_output[0];
           dci_alloc[*dci_cnt].dci_pdu[6] = dci_decoded_output[1];
@@ -2840,11 +2837,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars,
           dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[5];
           dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[6];
           dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[7];
-#ifdef DEBUG_DCI_DECODING
-          printf("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n",
-              dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3],
-              dci_decoded_output[4],dci_decoded_output[5],dci_decoded_output[6],dci_decoded_output[7]);
-#endif
+	  //LOG_I(PHY,"DCI => %x,%x,%x,%x,%x,%x,%x,%x\n",
+          //    dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3],
+          //    dci_decoded_output[4],dci_decoded_output[5],dci_decoded_output[6],dci_decoded_output[7]);
         }
 
         if (crc==si_rnti) {
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index beaebbca951..764aa2d7f10 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -3039,14 +3039,14 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
         break;
 
       case 50:
-        LOG_D(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
-        LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
-        LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
-        LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
-        LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
-        LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
-        LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
-        LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
+        LOG_I(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]);
+        LOG_I(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type);
+        LOG_I(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]);
+        LOG_I(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs);
+        LOG_I(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid);
+        LOG_I(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi);
+        LOG_I(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv);
+        LOG_I(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC);
         break;
 
       case 100:
@@ -3800,7 +3800,6 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci)
   return(0);
 }
 
-
 int generate_ue_dlsch_params_from_dci(int frame,
 				      uint8_t subframe,
                                       void *dci_pdu,
diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
index 8cdd32406f1..f24794fe2b1 100755
--- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
@@ -39,7 +39,7 @@
 #include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
-void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k) {
+void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type) {
 
   LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
   int32_t **txdataF      = ru->common.txdataF_BF;
@@ -132,7 +132,8 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k)
 
     if (packet_type == IF4p5_PULFFT) {
       for (symbol_id=fp->symbols_per_tti-nsym; symbol_id<fp->symbols_per_tti; symbol_id++) {			
-	LOG_D(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d\n",frame,subframe,symbol_id);
+	LOG_D(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d: %d dB\n",frame,subframe,symbol_id,
+	      dB_fixed(signal_energy((int32_t*)&rxdataF[0][blockoffsetF],db_halflength)));
 	for (element_id=0; element_id<db_halflength; element_id++) {
 	  i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id];
 	  data_block[element_id] = ((uint16_t) lin2alaw[*i]) | ((uint16_t)(lin2alaw[*(i+1)]<<8));
@@ -172,7 +173,7 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k)
   } else if (packet_type == IF4p5_PRACH) {
     // FIX: hard coded prach samples length
     LOG_D(PHY,"IF4p5_PRACH: frame %d, subframe %d\n",frame,subframe);
-    db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES;
+    db_fulllength = PRACH_NUM_SAMPLES;
     
     if (eth->flags == ETH_RAW_IF4p5_MODE) {
       packet_header = (IF4p5_header_t *)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES);
@@ -185,11 +186,11 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k)
 
     if (eth->flags == ETH_RAW_IF4p5_MODE) {
       memcpy((int16_t*)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t),
-             (&prach_rxsigF[0][k]), 
+             (&prach_rxsigF[0][0]), 
              PRACH_BLOCK_SIZE_BYTES);
     } else {
       memcpy((int16_t*)(tx_buffer_prach + sizeof_IF4p5_header_t),
-             (&prach_rxsigF[0][k]),
+             (&prach_rxsigF[0][0]),
              PRACH_BLOCK_SIZE_BYTES);
     }
 
@@ -209,6 +210,7 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k)
   return;  		    
 }
 
+extern void wakeup_prach(PHY_VARS_eNB *eNB,RU_t *ru);
 
 void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) {
   LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
@@ -221,6 +223,7 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint
   uint16_t db_fulllength, db_halflength; 
   int slotoffsetF=0, blockoffsetF=0; 
   eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv);
+  int idx;
 
   if (ru->idx==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );   
   
@@ -297,10 +300,9 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint
     }
 		
   } else if (*packet_type == IF4p5_PRACH) {  
-    LOG_D(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d\n",ru->idx,*frame,*subframe);  
 
     // FIX: hard coded prach samples length
-    db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES;
+    db_fulllength = PRACH_NUM_SAMPLES;
 
     if (eth->flags == ETH_RAW_IF4p5_MODE) {		
       memcpy((&prach_rxsigF[0][0]), 
@@ -311,6 +313,11 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint
              (int16_t*) (rx_buffer+sizeof_IF4p5_header_t),
              PRACH_BLOCK_SIZE_BYTES);
     }
+
+    LOG_I(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d => %d dB\n",ru->idx,*frame,*subframe,
+	  dB_fixed(signal_energy(&prach_rxsigF[0][0],839)));
+    for (idx=0;idx<ru->num_eNB;idx++) ru->wakeup_prach_eNB(ru->eNB_list[idx],ru);
+
   } else if (*packet_type == IF4p5_PULTICK) {
 
   } else {
diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h
index eebbb41557e..7a084a4b510 100644
--- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h
+++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h
@@ -62,7 +62,7 @@ void gen_IF4p5_ul_header(IF4p5_header_t*, uint16_t, int, int);
 
 void gen_IF4p5_prach_header(IF4p5_header_t*, int, int);
 
-void send_IF4p5(RU_t*, int, int, uint16_t, int);
+void send_IF4p5(RU_t*, int, int, uint16_t);
 
 void recv_IF4p5(RU_t*, int*, int*, uint16_t*, uint32_t*);
 
diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c
index ab9b55975d9..ca687cefffb 100644
--- a/openair1/PHY/LTE_TRANSPORT/pcfich.c
+++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c
@@ -31,9 +31,6 @@
 */
 #include "PHY/defs.h"
 
-//uint16_t pcfich_reg[4];
-//uint8_t pcfich_first_reg_idx = 0;
-
 //#define DEBUG_PCFICH
 
 void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
@@ -69,9 +66,9 @@ void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms)
     first_reg = pcfich_reg[3];
   }
 
-  //#ifdef DEBUG_PCFICH
+#ifdef DEBUG_PCFICH
   printf("pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]);
-  //#endif
+#endif
 }
 
 void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
@@ -95,7 +92,6 @@ void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms,
     }
 
     bt[i] = (b[i]&1) ^ ((s>>(i&0x1f))&1);
-    //    printf("scrambling %d : b %d => bt %d, c %d\n",i,b[i],bt[i],((s>>(i&0x1f))&1));
   }
 }
 
@@ -122,7 +118,6 @@ void pcfich_unscrambling(LTE_DL_FRAME_PARMS *frame_parms,
     if (((s>>(i&0x1f))&1) == 1)
       d[i]=-d[i];
 
-    //    printf("scrambling %d : b %d => bt %d, c %d\n",i,b[i],bt[i],((s>>(i&0x1f))&1));
   }
 }
 
@@ -148,7 +143,7 @@ void generate_pcfich(uint8_t num_pdcch_symbols,
 
   int nushiftmod3 = frame_parms->nushift%3;
 #ifdef DEBUG_PCFICH
-  msg("[PHY] Generating PCFICH for %d PDCCH symbols, AMP %d\n",num_pdcch_symbols,amp);
+  printf("[PHY] Generating PCFICH for %d PDCCH symbols, AMP %d\n",num_pdcch_symbols,amp);
 #endif
 
   // scrambling
@@ -247,12 +242,12 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms,
 
       pcfich_d_ptr[0] = ((int16_t*)&rxdataF_comp[0][reg_offset+i])[0]; // RE component
       pcfich_d_ptr[1] = ((int16_t*)&rxdataF_comp[0][reg_offset+i])[1]; // IM component
-      /*
-          printf("rx_pcfich: quad %d, i %d, offset %d => m%d (%d,%d) => pcfich_d_ptr[0] %d \n",pcfich_quad,i,reg_offset+i,m,
+#ifdef DEBUG_PCFICH      
+      printf("rx_pcfich: quad %d, i %d, offset %d =>  (%d,%d) => pcfich_d_ptr[0] %d \n",pcfich_quad,i,reg_offset+i,
              ((int16_t*)&rxdataF_comp[0][reg_offset+i])[0],
              ((int16_t*)&rxdataF_comp[0][reg_offset+i])[1],
              pcfich_d_ptr[0]);
-      */
+#endif
       pcfich_d_ptr+=2;
     }
 
@@ -295,12 +290,12 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms,
     metric = 0;
 
     for (j=0; j<32; j++) {
-      //printf("pcfich_b[%d][%d] %d => pcfich_d[%d] %d\n",i,j,pcfich_b[i][j],j,pcfich_d[j]);
+      //      printf("pcfich_b[%d][%d] %d => pcfich_d[%d] %d\n",i,j,pcfich_b[i][j],j,pcfich_d[j]);
       metric += (int32_t)(((pcfich_b[i][j]==0) ? (pcfich_d[j]) : (-pcfich_d[j])));
     }
 
 #ifdef DEBUG_PCFICH
-    msg("metric %d : %d\n",i,metric);
+    printf("metric %d : %d\n",i,metric);
 #endif
 
     if (metric > old_metric) {
@@ -310,7 +305,7 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms,
   }
 
 #ifdef DEBUG_PCFICH
-  msg("[PHY] PCFICH detected for %d PDCCH symbols\n",num_pdcch_symbols);
+  printf("[PHY] PCFICH detected for %d PDCCH symbols\n",num_pdcch_symbols);
 #endif
   return(num_pdcch_symbols);
 }
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index 3c343eaf4ec..def05cdd2e1 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -1077,7 +1077,7 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
   }
 
 
-#ifdef PRACH_DEBUG
+#if 0
   write_output("prach_txF0.m","prachtxF0",prachF,prach_len-Ncp,1,1);
   write_output("prach_tx0.m","prachtx0",prach+(Ncp<<1),prach_len-Ncp,1,1);
   write_output("txsig.m","txs",(int16_t*)(&ue->common_vars.txdata[0][0]),2*ue->frame_parms.samples_per_tti,1,1);
@@ -1109,9 +1109,16 @@ void rx_prach(PHY_VARS_eNB *eNB,
   int16_t            *prachF=NULL;
   int16_t            **rxsigF=NULL;
   int16_t            **prach_ifft=NULL;
+  int                nb_rx;
 
-  if (ru) fp = &ru->frame_parms;
-  else if (eNB) fp = &eNB->frame_parms;
+  if (ru) { 
+    fp    = &ru->frame_parms;
+    nb_rx = ru->nb_rx;
+  }
+  else if (eNB) {
+    fp    = &eNB->frame_parms;
+    nb_rx = fp->nb_antennas_rx;
+  }
   else AssertFatal(1==0,"rx_prach called without valid RU or eNB descriptor\n");
   
   frame_type          = fp->frame_type;
@@ -1119,7 +1126,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
   prach_ConfigIndex   = fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
   Ncs_config          = fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
   restricted_set      = fp->prach_config_common.prach_ConfigInfo.highSpeedFlag;
-  int16_t *prach[fp->nb_antennas_rx];
+  int16_t *prach[nb_rx];
 
   if (eNB) {
     subframe          = eNB->proc.subframe_prach;
@@ -1130,6 +1137,8 @@ void rx_prach(PHY_VARS_eNB *eNB,
   else {
     subframe          = ru->proc.subframe_prach;
     rxsigF            = ru->prach_rxsigF;
+    LOG_D(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n",
+	  subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex);
   }
 
   int16_t *prach2;
@@ -1157,14 +1166,19 @@ void rx_prach(PHY_VARS_eNB *eNB,
   int32_t lev;
   int16_t levdB;
   int fft_size,log2_ifft_size;
-  uint8_t nb_ant_rx = 1; //eNB->frame_parms.nb_antennas_rx;
 
 #ifdef PRACH_DEBUG
-  int en;
+  int en,en0=0;
 #endif
 
-  for (aa=0; aa<nb_ant_rx; aa++) {
-    if (ru) prach[aa] = (int16_t*)&ru->common.rxdata[aa][subframe*fp->samples_per_tti-ru->N_TA_offset];
+  for (aa=0; aa<nb_rx; aa++) {
+    if ((eNB==NULL) && 
+	(ru!=NULL)) { 
+      prach[aa] = (int16_t*)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset];
+#ifdef PRACH_DEBUG
+      LOG_D(PHY,"RU %d, subframe %d, : prach %p (energy %d)\n",ru->idx,subframe,prach[aa],dB_fixed(en0=signal_energy(prach[aa],fp->samples_per_tti))); 
+#endif
+    }
   }
 
   // First compute physical root sequence
@@ -1250,10 +1264,11 @@ void rx_prach(PHY_VARS_eNB *eNB,
   }
 
 
-  if (((eNB!=NULL) && (ru!=NULL) && (ru->function != NGFI_RRU_IF4p5))||
+  if (((eNB!=NULL) && (ru!=NULL) && (ru->function != NGFI_RAU_IF4p5))||
       ((eNB==NULL) && (ru!=NULL) && (ru->function == NGFI_RRU_IF4p5))) { // compute the DFTs of the PRACH temporal resources
     // Do forward transform
-    for (aa=0; aa<nb_ant_rx; aa++) {
+    LOG_D(PHY,"rx_prach: Doing FFT for N_RB_UL %d\n",fp->N_RB_UL);
+    for (aa=0; aa<nb_rx; aa++) {
       prach2 = prach[aa] + (Ncp<<1);
   
       // do DFT
@@ -1345,49 +1360,53 @@ void rx_prach(PHY_VARS_eNB *eNB,
 	
 	break;
       }
+
+      k = (12*n_ra_prb) - 6*fp->N_RB_UL;
+      
+      if (k<0) {
+	k+=(fp->ofdm_symbol_size);
+      }
+      
+      k*=12;
+      k+=13; 
+      k*=2;
+      int dftsize_x2 = fp->ofdm_symbol_size*24;
+      LOG_D(PHY,"Shifting prach_rxF from %d to 0\n",k);
+
+      if ((k+(839*2)) > dftsize_x2) { // PRACH signal is split around DC 
+	memmove((void*)&rxsigF[aa][dftsize_x2-k],(void*)&rxsigF[aa][0],(k+(839*2)-dftsize_x2)*2);	
+	memmove((void*)&rxsigF[aa][0],(void*)(&rxsigF[aa][k]),(dftsize_x2-k)*2);	
+      }
+      else  // PRACH signal is not split around DC
+	memmove((void*)&rxsigF[aa][0],(void*)(&rxsigF[aa][k]),839*4);	
+      
     }
+	     
   }
 
   if ((eNB==NULL) && (ru!=NULL) && ru->function == NGFI_RRU_IF4p5) {
-    k = (12*n_ra_prb) - 6*fp->N_RB_UL;
-    
-    if (k<0) {
-      k+=(fp->ofdm_symbol_size);
-    }
 
-    k*=12;
-    k+=13; 
-    k*=2;
-    
     /// **** send_IF4 of rxsigF to RAU **** ///    
-    send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH, k);
-
+    send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH);
+    
 #if 0
-    en = dB_fixed(signal_energy(&rxsigF[0][k],840));
-    if (en>60)
-      printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
+    if (dB_fixed(en0)>30) {
+      en = dB_fixed(signal_energy(&rxsigF[0][k],840));
+      //    if (en>60)
+      printf("PRACH (if4p5), k %d, n_ra_prb %d: Frame %d, Subframe %d => %d dB\n",k,n_ra_prb,ru->proc.frame_rx,ru->proc.subframe_rx,en);
+      write_output("rxsigF.m","prach_rxF",rxsigF[0],12288,1,1);
+      exit(-1);
+    }
 #endif
 
     return;
   } else if (eNB!=NULL) {
-    k = (12*n_ra_prb) - 6*fp->N_RB_UL;
-    
-    if (k<0) k+=fp->ofdm_symbol_size;
-    
 
-    k*=12;
-    k+=13; 
-    k*=2;
-
-    // Adjust received rxsigF offset    
-    memmove((&rxsigF[0][k]),
-            (&rxsigF[0][0]),
-            839*2*sizeof(int16_t));
 
 #if 0
-    en = dB_fixed(signal_energy(&rxsigF[0][k],840));
-        /*if (en>60)
-    printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);*/
+    en = dB_fixed(signal_energy(&rxsigF[0][0],840));
+    /*if (en>60)*/
+    printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
 #endif
 
   }
@@ -1493,18 +1512,6 @@ void rx_prach(PHY_VARS_eNB *eNB,
       
 
 
-      
-      k = (12*n_ra_prb) - 6*fp->N_RB_UL;
-      
-      if (k<0)
-	k+=fp->ofdm_symbol_size;
-      
-      k*=12;
-      k+=13; // phi + K/2
-      k*=2;
-      
-
-      
       memset( prachF, 0, sizeof(int16_t)*2*1024 );
 #ifdef PRACH_DEBUG
       if (prach[0]!= NULL) write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1);
@@ -1513,30 +1520,14 @@ void rx_prach(PHY_VARS_eNB *eNB,
       //       write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1);
       // write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1);
 
-      for (aa=0;aa<nb_ant_rx; aa++) {
+      for (aa=0;aa<nb_rx; aa++) {
       // Do componentwise product with Xu*
-	
+
+	k=0;	
 	for (offset=0; offset<(N_ZC<<1); offset+=2) {
 	  prachF[offset]   = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k]   + (int32_t)Xu[offset+1]*rxsigF[aa][k+1])>>15);
 	  prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15);
-	  /*
-	    if (offset<16)
-	    printf("Xu[%d] %d %d, rxsigF[%d][%d] %d %d\n",offset,Xu[offset],Xu[offset+1],aa,k,rxsigF[aa][k],rxsigF[aa][k+1]);
-	  */
-	  /*
-	    mmtmpX0 = _mm_madd_epi16(*(__m128i*)&Xu[offset],*(__m128i*)&rxsigF[aa][k<<1]);
-	    mmtmpX1 = _mm_shufflelo_epi16(*(__m128i*)&Xu[offset],_MM_SHUFFLE(2,3,0,1));
-	    mmtmpX1 = _mm_shufflehi_epi16(mmtmpX1,_MM_SHUFFLE(2,3,0,1));
-	    mmtmpX1 = _mm_sign_epi16(mmtmpX1,*(__m128i*)&conjugate[0]);
-	    mmtmpX1 = _mm_madd_epi16(mmtmpX1,*(__m128i*)&rxsigF[aa][k<<1]);
-	    mmtmpX0 = _mm_srai_epi32(mmtmpX0,15);
-	    mmtmpX1 = _mm_srai_epi32(mmtmpX1,15);
-	    mmtmpX2 = _mm_unpacklo_epi32(mmtmpX0,mmtmpX1);
-	    mmtmpX3 = _mm_unpackhi_epi32(mmtmpX0,mmtmpX1);
-	    *(__m128i*)&prachF[offset] = _mm_packs_epi32(mmtmpX2,mmtmpX3);
-	    */
 	  k+=2;
-	  
 	  if (k==(12*2*fp->ofdm_symbol_size))
 	    k=0;
 	}
@@ -1566,8 +1557,9 @@ void rx_prach(PHY_VARS_eNB *eNB,
 	k+=13;
 	k*=2;
 	printf("Dumping prach, k = %d (n_ra_prb %d)\n",k,n_ra_prb);
-	write_output("rxsigF.m","prach_rxF",&rxsigF[0][k],840,1,1);
+	write_output("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1);
 	write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1);
+	write_output("Xu.m","xu",Xu,N_ZC,1,1);
 	write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1);
 	exit(-1);
       }
@@ -1581,7 +1573,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
     for (i=0; i<NCS2; i++) {
       lev = 0;
       
-      for (aa=0; aa<nb_ant_rx; aa++) {
+      for (aa=0; aa<nb_rx; aa++) {
 	lev += (int32_t)prach_ifft[aa][(preamble_shift2+i)<<1]*prach_ifft[aa][(preamble_shift2+i)<<1] + (int32_t)prach_ifft[aa][1+((preamble_shift2+i)<<1)]*prach_ifft[aa][1+((preamble_shift2+i)<<1)];
       }
      
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index 913288e096c..43803857a23 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -550,7 +550,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length
   return len;
 } // is_clusterhead
 
-
+/*
 int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length)
 {
 
@@ -593,14 +593,12 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length)
     }
     len += sprintf(&buffer[len],"\n");
     len += sprintf(&buffer[len],"\nPERFORMANCE PARAMETERS\n");
-    /*
-    len += sprintf(&buffer[len],"[eNB PROC] Total DLSCH Bitrate for the System %dkbps\n",((eNB->UE_stats[0].dlsch_bitrate + eNB->UE_stats[1].dlsch_bitrate)/1000));
-    len += sprintf(&buffer[len],"[eNB PROC] Total Bits successfully transitted %dKbits in %dframe(s)\n",((eNB->UE_stats[0].total_transmitted_bits + eNB->UE_stats[1].total_transmitted_bits)/1000),eNB->frame+1);
-    len += sprintf(&buffer[len],"[eNB PROC] Average System Throughput %dKbps\n",(eNB->UE_stats[0].total_transmitted_bits + eNB->UE_stats[1].total_transmitted_bits)/((eNB->frame+1)*10));
-    */
 
     for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
-      if ((eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&&
+      if (eNB &&
+	  (eNB->dlsch!=NULL) &&
+	  (eNB->dlsch[(uint8_t)UE_id]!=NULL) &&
+	  (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&&
 	  (eNB->UE_stats[UE_id].mode == PUSCH)) {	
 
         eNB->total_dlsch_bitrate = eNB->UE_stats[UE_id].dlsch_bitrate + eNB->total_dlsch_bitrate;
@@ -643,15 +641,6 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length)
 		       eNB->measurements.wideband_cqi_dB[UE_id][0],
 		       eNB->measurements.wideband_cqi_dB[UE_id][1]);
 	
-	/*	len += sprintf(&buffer[len],"[eNB PROC] Subband CQI:    ");
-	
-	for (i=0; i<eNB->frame_parms.N_RB_DL; i++)
-	  len += sprintf(&buffer[len],"%2d ",
-			 eNB->measurements[eNB_id].subband_cqi_tot_dB[UE_id][i]);
-	
-	len += sprintf(&buffer[len],"\n");
-	*/
-
 	len += sprintf(&buffer[len],"DL TM %d, DL_cqi %d, DL_pmi_single %jx ",
 		       eNB->transmission_mode[UE_id],
 		       eNB->UE_stats[UE_id].DL_cqi[0],
@@ -802,27 +791,6 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length)
         len += sprintf(&buffer[len],"DLSCH total bits ack'ed: %dkbit ",(eNB->UE_stats[UE_id].total_TBS)/1000);
         len += sprintf(&buffer[len],"DLSCH Average throughput (100 frames): %dkbps\n",(eNB->UE_stats[UE_id].dlsch_bitrate/1000));
 	//        len += sprintf(&buffer[len],"[eNB PROC] Transmission Mode %d\n",eNB->transmission_mode[UE_id]);
-	/*
-        if(eNB->transmission_mode[UE_id] == 5) {
-          if(eNB->mu_mimo_mode[UE_id].dl_pow_off == 0)
-            len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in MU-MIMO mode****\n",UE_id);
-          else if(eNB->mu_mimo_mode[UE_id].dl_pow_off == 1)
-            len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in SU-MIMO mode****\n",UE_id);
-          else
-            len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is not scheduled****\n",UE_id);
-        }
-	*/
-	/*
-        len += sprintf(&buffer[len],"[eNB PROC] RB Allocation on Sub-bands: ");
-
-        //  for (j=0;j< mac_xface->frame_parms->N_RBGS;j++)
-        for (j=0; j<7; j++)
-          len += sprintf(&buffer[len],"%d ",
-                         eNB->mu_mimo_mode[UE_id].rballoc_sub[j]);
-
-        len += sprintf(&buffer[len],"\n");
-        len += sprintf(&buffer[len],"[eNB PROC] Total Number of Allocated PRBs = %d\n",eNB->mu_mimo_mode[UE_id].pre_nb_available_rbs);
-	*/
       }
     }
 
@@ -833,3 +801,4 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length)
   
   return len;
 }
+*/
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index 425bd383913..0ef041a50eb 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1810,11 +1810,11 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB,
   //#ifndef OAI_EMU
   write_output("/tmp/ulsch_d.m","ulsch_dseq",&eNB->ulsch[UE_id]->harq_processes[harq_pid]->d[0][96],
                eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
-  write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1);
+  if (eNB->common_vars.rxdata) write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1);
 
   
   if (eNB->frame_parms.nb_antennas_rx>1)
-    write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[1][0],eNB->frame_parms.samples_per_tti*10,1,1);
+    if (eNB->common_vars.rxdata) write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[1][0],eNB->frame_parms.samples_per_tti*10,1,1);
   
 
   write_output("/tmp/rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1);
@@ -1827,11 +1827,12 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB,
   if (eNB->frame_parms.nb_antennas_rx>1)
     write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
 
-
-  write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1);
+  /*
+  if (eNB->srs_vars[UE_id].srs_ch_estimates) write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1);
 
   if (eNB->frame_parms.nb_antennas_rx>1)
-    write_output("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[1],eNB->frame_parms.ofdm_symbol_size,1,1);
+    if (eNB->srs_vars[UE_id].srs_ch_estimates) write_output("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[1],eNB->frame_parms.ofdm_symbol_size,1,1);
+  */
 
   write_output("/tmp/drs_est0.m","drsest0",eNB->pusch_vars[UE_id]->drs_ch_estimates[0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1);
 
diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h
index 1ed81e79936..a4625c25704 100644
--- a/openair1/PHY/MODULATION/defs.h
+++ b/openair1/PHY/MODULATION/defs.h
@@ -71,8 +71,7 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue,
                    int sample_offset,
                    int no_prefix);
 
-int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
-                RU_COMMON *common,
+int slot_fep_ul(RU_t *ru,
                 unsigned char l,
                 unsigned char Ns,
                 int no_prefix);
diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c
index e3da81788e6..cf586dec1a9 100644
--- a/openair1/PHY/MODULATION/slot_fep_ul.c
+++ b/openair1/PHY/MODULATION/slot_fep_ul.c
@@ -24,8 +24,7 @@
 #include "defs.h"
 //#define DEBUG_FEP
 
-int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
-                RU_COMMON *common,
+int slot_fep_ul(RU_t *ru,
                 unsigned char l,
                 unsigned char Ns,
                 int no_prefix)
@@ -34,19 +33,23 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
   char fname[40], vname[40];
 #endif
   unsigned char aa;
-  unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame
-  unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples);
-  unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0);
+  RU_COMMON *common=&ru->common;
+  LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
+  RU_proc_t *proc = &ru->proc;
+  unsigned char symbol = l+((7-fp->Ncp)*(Ns&1)); ///symbol within sub-frame
+  unsigned int nb_prefix_samples = (no_prefix ? 0 : fp->nb_prefix_samples);
+  unsigned int nb_prefix_samples0 = (no_prefix ? 0 : fp->nb_prefix_samples0);
   //  unsigned int subframe_offset;
   unsigned int slot_offset;
 
+
   void (*dft)(int16_t *,int16_t *, int);
 
   int tmp_dft_in[2048] __attribute__ ((aligned (32)));  // This is for misalignment issues for 6 and 15 PRBs
-  unsigned int frame_length_samples = frame_parms->samples_per_tti * 10;
+  unsigned int frame_length_samples = fp->samples_per_tti * 10;
   unsigned int rx_offset;
 
-  switch (frame_parms->ofdm_symbol_size) {
+  switch (fp->ofdm_symbol_size) {
   case 128:
     dft = dft128;
     break;
@@ -78,14 +81,14 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
 
   if (no_prefix) {
     //    subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1);
-    slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns&1);
+    slot_offset = fp->ofdm_symbol_size * (fp->symbols_per_tti>>1) * (Ns&1);
   } else {
     //    subframe_offset = frame_parms->samples_per_tti * (Ns>>1);
-    slot_offset = (frame_parms->samples_per_tti>>1) * (Ns&1);
+    slot_offset = (fp->samples_per_tti>>1) * (Ns&1);
   }
 
-  if (l<0 || l>=7-frame_parms->Ncp) {
-    LOG_E(PHY,"slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp);
+  if (l<0 || l>=7-fp->Ncp) {
+    LOG_E(PHY,"slot_fep: l must be between 0 and %d\n",7-fp->Ncp);
     return(-1);
   }
 
@@ -98,39 +101,33 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms,
   LOG_D(PHY,"slot_fep: Ns %d offset %d, symbol %d, nb_prefix_samples %d\n",Ns,slot_offset,symbol, nb_prefix_samples);
 #endif
 
-  for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
+  for (aa=0; aa<ru->nb_rx; aa++) {
     rx_offset = slot_offset +nb_prefix_samples0;
     if (l==0) {
-
+#ifdef DEBUG_FEP
+      LOG_D(PHY,"slot_fep: symbol 0 %d dB\n",
+	    dB_fixed(signal_energy(&common->rxdata_7_5kHz[aa][rx_offset],fp->ofdm_symbol_size)));
+#endif
       dft( (int16_t *)&common->rxdata_7_5kHz[aa][rx_offset],
-           (int16_t *)&common->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+           (int16_t *)&common->rxdataF[aa][fp->ofdm_symbol_size*symbol],
            1
          );
     } else {
       
-      rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l;
-      /* should never happen for eNB
-      if(rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size))
-      {
-        memcpy((void *)&eNB_common_vars->rxdata_7_5kHz[aa][frame_length_samples],
-               (void *)&eNB_common_vars->rxdata_7_5kHz[aa][0],
-               frame_parms->ofdm_symbol_size*sizeof(int));
-      }
-      */
-
+      rx_offset += (fp->ofdm_symbol_size+nb_prefix_samples)*l;
       // check for 256-bit alignment of input buffer and do DFT directly, else do via intermediate buffer
       if( (rx_offset & 15) != 0){
         memcpy((void *)&tmp_dft_in,
 	       (void *)&common->rxdata_7_5kHz[aa][(rx_offset % frame_length_samples)],
-	       frame_parms->ofdm_symbol_size*sizeof(int));
+	       fp->ofdm_symbol_size*sizeof(int));
         dft( (short *) tmp_dft_in,
-             (short*)  &common->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+             (short*)  &common->rxdataF[aa][fp->ofdm_symbol_size*symbol],
              1
            );
       }
       else{
       dft( (short *)&common->rxdata_7_5kHz[aa][rx_offset],
-           (short*)&common->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol],
+           (short*)&common->rxdataF[aa][fp->ofdm_symbol_size*symbol],
            1
          );
       }
diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c
index bcb18eb3662..14abd2380d2 100644
--- a/openair1/PHY/MODULATION/ul_7_5_kHz.c
+++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c
@@ -197,7 +197,7 @@ void remove_7_5_kHz(RU_t *ru,uint8_t slot)
 
   len = frame_parms->samples_per_tti/2;
 
-  for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) {
+  for (aa=0; aa<ru->nb_rx; aa++) {
 
 #if defined(__x86_64__) || defined(__i386__)
     rxptr128        = (__m128i *)&rxdata[aa][slot_offset];
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 0fc0106201d..2677bbe023d 100644
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -288,6 +288,8 @@ typedef struct RU_proc_t_s {
   int frame_rx;
   /// frame to act upon for transmission
   int frame_tx;
+  /// unwrapped frame count
+  int frame_tx_unwrap;
   /// frame to act upon for reception of prach
   int frame_prach;
   /// frame offset for slave RUs (to correct for frame asynchronism at startup)
@@ -452,6 +454,14 @@ typedef struct eNB_proc_t_s {
   pthread_mutex_t mutex_prach;
   /// mutex for asynch RX/TX thread
   pthread_mutex_t mutex_asynch_rxtx;
+  /// mutex for RU access to eNB processing (PDSCH/PUSCH)
+  pthread_mutex_t mutex_RU;
+  /// mutex for RU access to eNB processing (PRACH)
+  pthread_mutex_t mutex_RU_PRACH;
+  /// mask for RUs serving eNB (PDSCH/PUSCH)
+  int RU_mask;
+  /// mask for RUs serving eNB (PRACH)
+  int RU_mask_prach;
   /// parameters for turbo-decoding worker thread
   td_params tdp;
   /// parameters for turbo-encoding worker thread
@@ -612,6 +622,8 @@ typedef struct RU_t_s{
   void                 (*feptx_prec)(struct RU_t_s *ru);
   /// function pointer to wakeup routine in lte-enb.
   int (*wakeup_rxtx)(struct PHY_VARS_eNB_s *eNB,int frame_rx,int subframe_rx);
+  /// function pointer to wakeup routine in lte-enb.
+  int (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru);
   /// function pointer to eNB entry routine
   void (*eNB_top)(struct PHY_VARS_eNB_s *eNB, int frame_rx, int subframe_rx, char *string);
   /// Timing statistics
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 78953d4fbca..02343d17478 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -495,6 +495,8 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
   int subframe = proc->subframe_tx;
   int frame = proc->frame_tx;
 
+  LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d\n",frame,subframe); 
+
   // generate Cell-Specific Reference Signals for both slots
   if (eNB->abstraction_flag==0) {
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
@@ -695,12 +697,12 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC
 				       P_RNTI,
 				       eNB->UE_stats[0].DL_pmi_single,
 				       0);
-    
+    LOG_I(PHY,"frame %d, subframe %d : SI with mcs %d\n",frame,subframe,eNB->dlsch_SI->harq_processes[0]->mcs);
     
     eNB->dlsch_SI->nCCE[subframe] = dci_alloc->firstCCE;
-    
-    LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI)  => %"PRIu8"\n",eNB->Mod_id,frame,subframe,
-	  eNB->dlsch_SI->nCCE[subframe]);
+   
+    LOG_I(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI)  => %"PRIu8", aggregation %d\n",eNB->Mod_id,frame,subframe,
+	  eNB->dlsch_SI->nCCE[subframe],1<<dci_alloc->L);
     
 #if defined(SMBV) 
     
@@ -824,7 +826,7 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC
   int frame = proc->frame_tx;
   int subframe = proc->subframe_tx;
 
-  LOG_D(PHY,
+  LOG_I(PHY,
 	"[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n",
 	eNB->Mod_id,
 	subframe2harq_pid(fp,
@@ -849,7 +851,6 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC
 				     P_RNTI,
 				     CBA_RNTI,
 				     0);  // do_srs
-  
   LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n",
 	eNB->Mod_id,frame,subframe,dci_alloc->rnti,
 	dci_alloc->firstCCE);
@@ -1391,7 +1392,10 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
                                          fp,
                                          eNB->common_vars.txdataF,
                                          subframe);
-
+    if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) {
+      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: num_pdcch_symbols %d\n",eNB->Mod_id,frame, subframe,
+            num_pdcch_symbols);
+    }
   }
 
 #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious
@@ -1965,7 +1969,7 @@ void prach_procedures(PHY_VARS_eNB *eNB) {
   }
   if (eNB->abstraction_flag == 0) {
     rx_prach(eNB,
-	     NULL,
+	     eNB->RU_list[0],
              preamble_energy_list,
              preamble_delay_list,
              frame,
@@ -1999,12 +2003,13 @@ void prach_procedures(PHY_VARS_eNB *eNB) {
     }
   }
 
-#ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[RAPROC] Most likely preamble %d, energy %d dB delay %d\n",
-        preamble_max,
+  //#ifdef DEBUG_PHY_PROC
+  LOG_D(PHY,"[RAPROC] Frame %d, subframe %d : Most likely preamble %d, energy %d dB delay %d\n",
+        frame,subframe,
+	preamble_max,
         preamble_energy_list[preamble_max],
         preamble_delay_list[preamble_max]);
-#endif
+  //#endif
 
   if (preamble_energy_list[preamble_max] > 580) {
 
@@ -2867,14 +2872,14 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const
 
         if (eNB->ulsch[i]->Msg3_flag == 1) {
 
-          LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
+          LOG_I(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
                 eNB->Mod_id,
                 eNB->CC_id,
                 frame,subframe, i,
                 eNB->ulsch[i]->harq_processes[harq_pid]->round-1,
                 fp->maxHARQ_Msg3Tx-1);
-	  /*dump_ulsch(eNB,proc,i);
-	    exit(-1);*/
+	  dump_ulsch(eNB,proc,i);
+	  exit(-1);
 
 	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
 		eNB->Mod_id,harq_pid,
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 0ef60b499fd..dcbd3fb3694 100644
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -2562,7 +2562,7 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
       proc->frame_tx = proc->frame_rx;
       ue->proc.proc_rxtx[1].frame_rx = proc->frame_rx;
       ue->proc.proc_rxtx[1].frame_tx = proc->frame_tx;
-      LOG_I(PHY,"[UE %d] frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d\n",
+      LOG_I(PHY,"[UE %d] TXPATH frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d\n",
 	    ue->Mod_id,
 	    frame_rx,
 	    subframe_rx,
@@ -2575,7 +2575,7 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin
       
     } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) {
       //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) {
-      LOG_D(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%%1024=%d, phase %d).\n",
+      LOG_I(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%%1024=%d, phase %d).\n",
 	    ue->Mod_id,
 	    proc->frame_rx,
 	    subframe_rx,
@@ -2834,9 +2834,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
     else if ((dci_alloc_rx[i].rnti == SI_RNTI) &&
 	     ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) {
 
-#ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[UE  %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i);
-#endif
+
 
 
       if (generate_ue_dlsch_params_from_dci(frame_rx,
@@ -2852,7 +2850,9 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint
 					    P_RNTI,
 					    ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id],
               0)==0) {
-
+#ifdef DEBUG_PHY_PROC
+	LOG_I(PHY,"[UE  %d] frame %d subframe %d: Found rnti %x, format 1%s, dci_cnt %d, mcs %d\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i,ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs);
+#endif
 	ue->dlsch_SI_received[eNB_id]++;
  
 
@@ -3570,6 +3570,16 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin
   LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n",
 	(r_type == multicast_relay) ? "RN/UE" : "UE",
 	ue->Mod_id,frame_rx, subframe_rx);
+  LOG_D(PHY,"phy_procedures_UR_RX: Frame %d, subframe %d : energy %d\n",
+	frame_rx,subframe_rx,
+	  dB_fixed(signal_energy(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti],
+				 ue->frame_parms.samples_per_tti)));
+
+  /*													   
+  if ((subframe_rx == 5) && ((frame_rx &1) == 0)) {
+    write_output("rxsig5.m","rxs5",&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti],ue->frame_parms.samples_per_tti,1,1);
+    exit(-1);
+    }*/
 #endif
 
   if (ue->frame_parms.Ncp == 0) {  // normal prefix
diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c
index 60b2b81d576..19adae31b88 100644
--- a/openair1/SCHED/ru_procedures.c
+++ b/openair1/SCHED/ru_procedures.c
@@ -150,6 +150,7 @@ void feptx_ofdm(RU_t *ru) {
 	}
       }
       else {
+	LOG_D(PHY,"feptx_ofdm: Writing to position %d\n",slot_offset);
 	tx_offset = (int)slot_offset;
 	txdata = (int16_t*)&ru->common.txdata[aa][tx_offset];
 
@@ -184,8 +185,8 @@ void feptx_ofdm(RU_t *ru) {
          ru->common.txdata[aa][tx_offset] = 0x00000000;
        }
      }
-     LOG_D(PHY,"feptx_ofdm: frame %d, subframe %d: txp (time) %d dB, txp (freq) %d dB\n",
-	   ru->proc.frame_tx,subframe,dB_fixed(signal_energy(txdata,fp->samples_per_tti)),
+     LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n",
+	   ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy(txdata,fp->samples_per_tti)),
 	   dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF)));
     }
   }
@@ -248,10 +249,9 @@ void fep0(RU_t *ru,int slot) {
 
   remove_7_5_kHz(ru,(slot&1)+(proc->subframe_rx<<1));
   for (l=0; l<fp->symbols_per_tti/2; l++) {
-    slot_fep_ul(fp,
-		&ru->common,
+    slot_fep_ul(ru,
 		l,
-		(slot&1)+(proc->subframe_rx<<1),
+		(slot&1),
 		0
 		);
   }
@@ -353,16 +353,14 @@ void fep_full(RU_t *ru) {
   remove_7_5_kHz(ru,proc->subframe_rx<<1);
   remove_7_5_kHz(ru,1+(proc->subframe_rx<<1));
   for (l=0; l<fp->symbols_per_tti/2; l++) {
-    slot_fep_ul(fp,
-		&ru->common,
+    slot_fep_ul(ru,
 		l,
-		proc->subframe_rx<<1,
+		0,
 		0
 		);
-    slot_fep_ul(fp,
-		&ru->common,
+    slot_fep_ul(ru,
 		l,
-		1+(proc->subframe_rx<<1),
+		1,
 		0
 		);
   }
diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c
index 4bd006c4766..4822a4d26d0 100644
--- a/openair1/SIMULATION/RF/dac.c
+++ b/openair1/SIMULATION/RF/dac.c
@@ -84,24 +84,33 @@ double dac_fixed_gain(double *s_re[2],
                       uint32_t length_meas,
                       uint8_t B,
                       double txpwr_dBm,
+		      uint8_t do_amp_compute,
+		      double *amp1,
                       int NB_RE)
 {
 
   int i;
   int aa;
-  double amp,amp1;
+  double amp,amp1_local,*amp1p;
 
   amp = //sqrt(NB_RE)*pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
     pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna
-  amp1 = 0;
 
-  for (aa=0; aa<nb_tx_antennas; aa++) {
-    amp1 += sqrt((double)signal_energy((int32_t*)&input[aa][input_offset_meas],length_meas)/NB_RE);
+  if (amp1==NULL) amp1p = &amp1_local;
+  else            amp1p = amp1;
+
+  if (do_amp_compute==1) {
+    *amp1p = 0;
+    for (aa=0; aa<nb_tx_antennas; aa++) {
+      *amp1p += (double)signal_energy((int32_t*)&input[aa][input_offset_meas],length_meas)/NB_RE;
+    }
+    *amp1p/=nb_tx_antennas;
+    *amp1p=sqrt(*amp1p);
   }
 
-  amp1/=nb_tx_antennas;
 
-  //  printf("DAC: amp1 %f dB (%d,%d), tx_power %f\n",20*log10(amp1),input_offset,input_offset_meas,txpwr_dBm);
+
+  //  printf("DAC: amp %f, amp1 %f dB (%d,%d), tx_power %f (%f),length %d,pos %d\n",20*log10(amp),20*log10(*amp1p),input_offset,input_offset_meas,txpwr_dBm,length, 10*log10((double)signal_energy((int32_t*)&input[0][input_offset_meas],length_meas)/NB_RE),input_offset_meas);
 
   /*
     if (nb_tx_antennas==2)
@@ -117,12 +126,12 @@ double dac_fixed_gain(double *s_re[2],
 
   for (i=0; i<length; i++) {
     for (aa=0; aa<nb_tx_antennas; aa++) {
-      s_re[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)])/amp1; ///(1<<(B-1));
-      s_im[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)+1])/amp1; ///(1<<(B-1));
+      s_re[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)])/(*amp1p); 
+      s_im[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)+1])/(*amp1p); 
     }
   }
 
   //  printf("ener %e\n",signal_energy_fp(s_re,s_im,nb_tx_antennas,length,0));
 
-  return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE);
+  return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length<length_meas?length:length_meas,0)/NB_RE);
 }
diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h
index b3d5e47e6b0..74bca6350bb 100644
--- a/openair1/SIMULATION/RF/defs.h
+++ b/openair1/SIMULATION/RF/defs.h
@@ -95,4 +95,6 @@ double dac_fixed_gain(double *s_re[2],
                       unsigned int length_meas,
                       unsigned char B,
                       double gain,
+		      uint8_t do_amp_compute,
+		      double *amp1,
                       int NB_RE);
diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c
index 90cfb6d95a1..f5a4d7f1f67 100644
--- a/openair2/ENB_APP/enb_config.c
+++ b/openair2/ENB_APP/enb_config.c
@@ -1274,27 +1274,31 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) {
 			       RC.config_file_name, i, pusch_nDMRS1);
 
 		if (strcmp(phich_duration,"NORMAL")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = normal;
+		  RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_normal;
 		} else if (strcmp(phich_duration,"EXTENDED")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = extended;
+		  RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_extended;
 		} else
 		  AssertFatal (0,
 			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n",
 			       RC.config_file_name, i, phich_duration);
 
 		if (strcmp(phich_resource,"ONESIXTH")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = oneSixth;
+		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_oneSixth ;
 		} else if (strcmp(phich_resource,"HALF")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = half;
+		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_half;
 		} else if (strcmp(phich_resource,"ONE")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = one;
+		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_one;
 		} else if (strcmp(phich_resource,"TWO")==0) {
-		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = two;
+		  RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_two;
 		} else
 		  AssertFatal (0,
 			       "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n",
 			       RC.config_file_name, i, phich_resource);
 
+		printf("phich.resource %d (%s), phich.duration %d (%s)\n",
+		       RRC_CONFIGURATION_REQ (msg_p).phich_resource[j],phich_resource,
+		       RRC_CONFIGURATION_REQ (msg_p).phich_duration[j],phich_duration);
+
 		if (strcmp(srs_enable, "ENABLE") == 0) {
 		  RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = TRUE;
 		} else if (strcmp(srs_enable, "DISABLE") == 0) {
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index c358d0cc5c5..09b215098f3 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -146,6 +146,9 @@ int rrc_mac_config_req_eNB(module_id_t                      Mod_idP,
     RC.mac[Mod_idP]->common_channels[CC_idP].eutra_band     = eutra_band;
     RC.mac[Mod_idP]->common_channels[CC_idP].dl_CarrierFreq = dl_CarrierFreq;
 
+    LOG_I(MAC,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n",
+	  Mod_idP, CC_idP, eutra_band, mib->message.dl_Bandwidth, physCellId, p_eNB,dl_CarrierFreq,mib->message.phich_Config.phich_Resource,mib->message.phich_Config.phich_Duration);
+
     mac_xface->phy_config_mib_eNB(Mod_idP,CC_idP,
 				  eutra_band,
 				  mib->message.dl_Bandwidth,
@@ -178,6 +181,8 @@ int rrc_mac_config_req_eNB(module_id_t                      Mod_idP,
       RC.mac[Mod_idP]->common_channels[CC_idP].radioResourceConfigCommon = radioResourceConfigCommon;
       if (ul_CarrierFreq>0) RC.mac[Mod_idP]->common_channels[CC_idP].ul_CarrierFreq          = ul_CarrierFreq;
       if (ul_Bandwidth) RC.mac[Mod_idP]->common_channels[CC_idP].ul_Bandwidth                = *ul_Bandwidth;
+      else RC.mac[Mod_idP]->common_channels[CC_idP].ul_Bandwidth                             = RC.mac[Mod_idP]->common_channels[CC_idP].mib->message.dl_Bandwidth;
+
       mac_xface->phy_config_sib2_eNB(Mod_idP, CC_idP, radioResourceConfigCommon, NULL, ul_Bandwidth, additionalSpectrumEmission, mbsfn_SubframeConfigList);
 
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 7c8b730af9f..7d3682ee549 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -790,16 +790,18 @@ abort();
       N_RB_UL      = to_prb(cc[CC_id].ul_Bandwidth);
       eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti);
 
+      
       aggregation=get_aggregation(get_bw_index(module_idP,CC_id), 
 				  eNB_UE_stats->DL_cqi[0],
 				  format0);
       
+
       if (CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)) {
         LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id);
         continue; // break;
       } else{
-	LOG_D(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d mode %s: aggregation level %d\n", 
-	      module_idP,frameP,subframeP,UE_id,rnti,CC_id, mode_string[eNB_UE_stats->mode], 1<<aggregation);
+	LOG_D(MAC,"[eNB %d] frame %d subframe %d,Scheduling PUSCH for UE %d/%x CC %d mode %s: aggregation level %d, N_RB_UL %d\n", 
+	      module_idP,frameP,subframeP,UE_id,rnti,CC_id, mode_string[eNB_UE_stats->mode], 1<<aggregation,N_RB_UL);
       }
 
 
@@ -910,7 +912,7 @@ abort();
               T_INT(TBS), T_INT(ndi));
 
 	    if (mac_eNB_get_rrc_status(module_idP,rnti) < RRC_CONNECTED)
-	      LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n",
+	      LOG_D(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n",
 		    module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs,
 		    first_rb[CC_id],rb_table[rb_table_index],
 		    rb_table_index,TBS,harq_pid);
diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c
index 7b24df95094..70a11180231 100644
--- a/openair2/LAYER2/MAC/main.c
+++ b/openair2/LAYER2/MAC/main.c
@@ -536,6 +536,10 @@ int l2_init_ue(int eMBMS_active, char *uecap_xer,uint8_t cba_group_active, uint8
   mac_xface->ue_process_rar            = ue_process_rar;
   mac_xface->ue_scheduler              = ue_scheduler;
   mac_xface->process_timing_advance    = process_timing_advance;
+  mac_xface->Msg3_transmitted          = Msg3_tx;
+  mac_xface->Msg1_transmitted          = Msg1_tx;
+  mac_xface->ra_failed                 = ra_failed;
+  mac_xface->ra_succeeded              = ra_succeeded;
 
 
   LOG_I(MAC,"[MAIN] PHY Frame configuration \n");
@@ -641,10 +645,6 @@ int l2_init_eNB()
   mac_xface->get_prb                   = get_prb;
   //  mac_xface->get_SB_size               = Get_SB_size;
   mac_xface->get_subframe_direction    = get_subframe_direction;
-  mac_xface->Msg3_transmitted          = Msg3_tx;
-  mac_xface->Msg1_transmitted          = Msg1_tx;
-  mac_xface->ra_failed                 = ra_failed;
-  mac_xface->ra_succeeded              = ra_succeeded;
   mac_xface->mac_phy_remove_ue         = mac_phy_remove_ue;
 
   LOG_I(MAC,"[MAIN] PHY Frame configuration \n");
diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c
index 079d100bde0..6f51a49e4e4 100644
--- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c
+++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c
@@ -223,36 +223,20 @@ uint8_t do_MIB(rrc_eNB_carrier_data_t *carrier, uint32_t N_RB_DL, uint32_t phich
   case 100:
     mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n100;
     break;
-
   default:
-    mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n6;
-    break;
-  }
-
-  switch (phich_Resource) {
-  case oneSixth:
-    mib->message.phich_Config.phich_Resource = 0;
-    break;
-
-  case half:
-    mib->message.phich_Config.phich_Resource = 1;
-    break;
-
-  case one:
-    mib->message.phich_Config.phich_Resource = 2;
-    break;
-
-  case two:
-    mib->message.phich_Config.phich_Resource = 3;
-    break;
+    AssertFatal(1==0,"Unknown dl_Bandwidth %d\n",N_RB_DL);
   }
 
+  AssertFatal(phich_Resource <= PHICH_Config__phich_Resource_two,"Illegal phich_Resource\n");
+  mib->message.phich_Config.phich_Resource = phich_Resource;
+  AssertFatal(phich_Resource <= PHICH_Config__phich_Duration_extended,"Illegal phich_Duration\n");
+  mib->message.phich_Config.phich_Duration = phich_duration;
   LOG_I(RRC,"[MIB] systemBandwidth %x, phich_duration %x, phich_resource %x,sfn %x\n",
          (uint32_t)mib->message.dl_Bandwidth,
          (uint32_t)phich_duration,
          (uint32_t)phich_Resource,
          (uint32_t)sfn);
-  mib->message.phich_Config.phich_Duration = phich_duration;
+
   mib->message.systemFrameNumber.buf = &sfn;
   mib->message.systemFrameNumber.size = 1;
   mib->message.systemFrameNumber.bits_unused=0;
diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c
index 5ff86de40ae..3bd4f1fd59e 100644
--- a/openair2/RRC/LITE/rrc_eNB.c
+++ b/openair2/RRC/LITE/rrc_eNB.c
@@ -140,6 +140,10 @@ init_SI(
   RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Ncp             = configuration->prefix_type[CC_id];
   RC.rrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq  = configuration->downlink_frequency[CC_id];
   RC.rrc[ctxt_pP->module_id]->carrier[CC_id].ul_CarrierFreq  = configuration->downlink_frequency[CC_id]+ configuration->uplink_frequency_offset[CC_id];
+  LOG_I(RRC, "Configuring MIB (N_RB_DL %d,phich_Resource %d,phich_Duration %d)\n", 
+	configuration->N_RB_DL[CC_id],
+	configuration->phich_resource[CC_id],
+	configuration->phich_duration[CC_id]);
   do_MIB(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id],
 #ifdef ENABLE_ITTI
 	 configuration->N_RB_DL[CC_id],
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c
index 1e415d1b608..65922a2ad3f 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.c
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.c
@@ -106,6 +106,8 @@ const char* eurecomVariablesNames[] = {
   "rxcnt",
   "trx_ts",
   "trx_tst",
+  "trx_ts_ue",
+  "trx_tst_ue",
   "trx_write_flags",
   "tx_ts",
   "rx_ts",
@@ -196,6 +198,8 @@ const char* eurecomFunctionsNames[] = {
   "rt_sleep",
   "trx_read",
   "trx_write",
+  "trx_read_ue",
+  "trx_write_ue",
   "trx_read_if",
   "trx_write_if",
   "eNB_thread_rxtx0",
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index 925fdd93336..714cd28e2f8 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -78,6 +78,8 @@ typedef enum {
   VCD_SIGNAL_DUMPER_VARIABLES_RXCNT,
   VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS,
   VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST,
+  VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS_UE,
+  VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST_UE,
   VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS,
   VCD_SIGNAL_DUMPER_VARIABLES_TX_TS,
   VCD_SIGNAL_DUMPER_VARIABLES_RX_TS,
@@ -170,6 +172,8 @@ typedef enum {
   VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP=0,
   VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ,
   VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_UE,
+  VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_UE,
   VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF,
   VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF,
   VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0,
diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h
index f4d6d6df1c6..73aa27826c5 100644
--- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h
+++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h
@@ -61,8 +61,8 @@
 
 // Packet sizes for IF4p5 interface format
 #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks)
-#define PRACH_HARD_CODED_NUM_SAMPLES (839*4)
-#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*PRACH_HARD_CODED_NUM_SAMPLES)  // FIX hard coded prach size
+#define PRACH_NUM_SAMPLES (839)
+#define PRACH_BLOCK_SIZE_BYTES (sizeof(int32_t)*PRACH_NUM_SAMPLES)  
  
 #define RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks))  
 #define RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks))  
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index f1747abae4c..9b9834a9d84 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -104,7 +104,6 @@ struct timing_info_t {
 // Fix per CC openair rf/if device update
 // extern openair0_device openair0;
 
-void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe);
 
 #if defined(ENABLE_ITTI)
 extern volatile int             start_eNB;
@@ -141,7 +140,7 @@ void exit_fun(const char* s);
 
 void init_eNB(int,int);
 void stop_eNB(int nb_inst);
-
+void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru);
 
 static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_name) {
 
@@ -150,8 +149,8 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam
   // ****************************************
   // Common RX procedures subframe n
 
-  do_prach(eNB,proc->frame_rx,proc->subframe_rx);
-  //  phy_procedures_eNB_common_RX(eNB,proc);
+  // if this is IF5 or 3GPP_eNB
+  if (eNB->RU_list[0]->function < NGFI_RAU_IF4p5) wakeup_prach_eNB(eNB,NULL);
 
   // UE-specific RX processing for subframe n
   phy_procedures_eNB_uespec_RX(eNB, proc, no_relay );
@@ -278,11 +277,38 @@ void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string) {
 }
 
 
-int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS *fp) {
+int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) {
+
+  eNB_proc_t *proc=&eNB->proc;
+
+  eNB_rxtx_proc_t *proc_rxtx=&proc->proc_rxtx[proc->frame_rx&1];
+
+  LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
 
   int i;
   struct timespec wait;
   
+  pthread_mutex_lock(&proc->mutex_RU);
+  for (i=0;i<eNB->num_RU;i++) {
+    if (ru == eNB->RU_list[i]) {
+      if ((proc->RU_mask&(1<<i)) > 0)
+	LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information from RU %d (num_RU %d,mask %x) has not been served yet!\n",
+	      eNB->Mod_id,proc->frame_rx,proc->subframe_rx,ru->idx,eNB->num_RU,proc->RU_mask);
+      proc->RU_mask |= (1<<i);
+    }
+  }
+  if (proc->RU_mask != (1<<eNB->num_RU)-1) {  // not all RUs have provided their information so return
+    pthread_mutex_unlock(&proc->mutex_RU);
+    return(0);
+  }
+  else { // all RUs have provided their information so continue on and wakeup eNB processing
+    proc->RU_mask = 0;
+    pthread_mutex_unlock(&proc->mutex_RU);
+  }
+
+
+
+
   wait.tv_sec=0;
   wait.tv_nsec=5000000L;
 
@@ -330,18 +356,37 @@ int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS *
   return(0);
 }
 
-void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe) {
+void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru) {
 
   eNB_proc_t *proc = &eNB->proc;
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
+  int i;
 
-
-
+  if (ru!=NULL) {
+    pthread_mutex_lock(&proc->mutex_RU_PRACH);
+    for (i=0;i<eNB->num_RU;i++) {
+      if (ru == eNB->RU_list[i]) {
+	if ((proc->RU_mask_prach&(1<<i)) > 0)
+	  LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information (PRACH) from RU %d (num_RU %d, mask %x) has not been served yet!\n",
+		eNB->Mod_id,proc->frame_rx,proc->subframe_rx,ru->idx,eNB->num_RU,proc->RU_mask_prach);
+	proc->RU_mask_prach |= (1<<i);
+      }
+    }
+    if (proc->RU_mask_prach != (1<<eNB->num_RU)-1) {  // not all RUs have provided their information so return
+      pthread_mutex_unlock(&proc->mutex_RU_PRACH);
+      return(0);
+    }
+    else { // all RUs have provided their information so continue on and wakeup eNB processing
+      proc->RU_mask_prach = 0;
+      pthread_mutex_unlock(&proc->mutex_RU_PRACH);
+    }
+  }
+    
   // check if we have to detect PRACH first
-  if (is_prach_subframe(fp,frame,subframe)>0) { 
-    LOG_D(PHY,"Triggering prach processing, frame %d, subframe %d\n",frame,subframe);
+  if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { 
+    LOG_D(PHY,"Triggering prach processing, frame %d, subframe %d\n",proc->frame_rx,proc->subframe_rx);
     if (proc->instance_cnt_prach == 0) {
-      LOG_W(PHY,"[eNB] Frame %d Subframe %d, dropping PRACH\n", frame,subframe);
+      LOG_W(PHY,"[eNB] Frame %d Subframe %d, dropping PRACH\n", proc->frame_rx,proc->subframe_rx);
       return;
     }
     
@@ -354,8 +399,8 @@ void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe) {
     
     ++proc->instance_cnt_prach;
     // set timing for prach thread
-    proc->frame_prach = frame;
-    proc->subframe_prach = subframe;
+    proc->frame_prach = proc->frame_rx;
+    proc->subframe_prach = proc->subframe_rx;
     
     // the thread can now be woken up
     if (pthread_cond_signal(&proc->cond_prach) != 0) {
@@ -435,6 +480,8 @@ void init_eNB_proc(int inst) {
 
     proc->first_rx=1;
     proc->first_tx=1;
+    proc->RU_mask=0;
+    proc->RU_mask_prach=0;
 
     pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL);
     pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL);
@@ -443,6 +490,8 @@ void init_eNB_proc(int inst) {
 
     pthread_mutex_init( &proc->mutex_prach, NULL);
     pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL);
+    pthread_mutex_init( &proc->mutex_RU,NULL);
+    pthread_mutex_init( &proc->mutex_RU_PRACH,NULL);
 
     pthread_cond_init( &proc->cond_prach, NULL);
     pthread_cond_init( &proc->cond_asynch_rxtx, NULL);
@@ -672,8 +721,9 @@ void init_eNB_afterRU() {
     
     if (RC.ru[ru_id]==NULL) RC.ru[ru_id] = (RU_t*)malloc(sizeof(RU_t));
     
-    RC.ru[ru_id]->wakeup_rxtx = wakeup_rxtx;
-    RC.ru[ru_id]->eNB_top     = eNB_top;
+    RC.ru[ru_id]->wakeup_rxtx      = wakeup_rxtx;
+    RC.ru[ru_id]->wakeup_prach_eNB = wakeup_prach_eNB;
+    RC.ru[ru_id]->eNB_top          = eNB_top;
   }
 }
 void init_eNB(int single_thread_flag,int wait_for_sync) {
diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c
index 7da58eda4a9..69420fe122a 100644
--- a/targets/RT/USER/lte-ru.c
+++ b/targets/RT/USER/lte-ru.c
@@ -304,7 +304,7 @@ static inline void fh_if5_mobipass_south_out(RU_t *ru) {
 static inline void fh_if4p5_south_out(RU_t *ru) {
   if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
   LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.subframe_tx);
-  send_IF4p5(ru,ru->proc.frame_tx, ru->proc.subframe_tx, IF4p5_PDLFFT, 0);
+  send_IF4p5(ru,ru->proc.frame_tx, ru->proc.subframe_tx, IF4p5_PDLFFT);
 }
 
 /*************************************************************/
@@ -358,34 +358,29 @@ void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) {
   else     
     symbol_mask_full = (1<<fp->symbols_per_tti)-1; 
 
-
+  AssertFatal(proc->symbol_mask[*subframe]==0,"rx_fh_if4p5: proc->symbol_mask[%d] = %x\n",*subframe,proc->symbol_mask[*subframe]);
   do {   // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
     recv_IF4p5(ru, &f, &sf, &packet_type, &symbol_number);
 
-    if (packet_type == IF4p5_PULFFT) {
-      proc->symbol_mask[sf] = proc->symbol_mask[sf] | (1<<symbol_number);
-
-    } else if (packet_type == IF4p5_PULTICK) {           
-      if ((proc->first_rx==0) && (f!=*frame)) 	
-	LOG_E(PHY,"rx_fh_if4p5: PULTICK received frame %d != expected %d\n",f,*frame);       
-      if ((proc->first_rx==0) && (sf!=*subframe)) 	
-	LOG_E(PHY,"rx_fh_if4p5: PULTICK received subframe %d != expected %d (first_rx %d)\n",sf,*subframe,proc->first_rx);       
+    if (packet_type == IF4p5_PULFFT) proc->symbol_mask[sf] = proc->symbol_mask[sf] | (1<<symbol_number);
+    else if (packet_type == IF4p5_PULTICK) {           
+      if ((proc->first_rx==0) && (f!=*frame)) LOG_E(PHY,"rx_fh_if4p5: PULTICK received frame %d != expected %d\n",f,*frame);       
+      if ((proc->first_rx==0) && (sf!=*subframe)) LOG_E(PHY,"rx_fh_if4p5: PULTICK received subframe %d != expected %d (first_rx %d)\n",sf,*subframe,proc->first_rx);       
       break;     
       
     } else if (packet_type == IF4p5_PRACH) {
       // nothing in RU for RAU
     }
-
+    LOG_D(PHY,"rx_fh_if4p5: subframe %d symbol mask %x\n",*subframe,proc->symbol_mask[*subframe]);
   } while(proc->symbol_mask[*subframe] != symbol_mask_full);    
 
   //caculate timestamp_rx, timestamp_tx based on frame and subframe
-  proc->subframe_rx = sf;
-  proc->frame_rx    = f;
+  proc->subframe_rx  = sf;
+  proc->frame_rx     = f;
   proc->timestamp_rx = ((proc->frame_rx * 10)  + proc->subframe_rx ) * fp->samples_per_tti ;
-  proc->timestamp_tx = proc->timestamp_rx +  (4*fp->samples_per_tti);
-  proc->subframe_tx = (sf+4)%10;
-  proc->frame_tx    = (sf>5) ? (f+1)&1023 : f;
-
+  //  proc->timestamp_tx = proc->timestamp_rx +  (4*fp->samples_per_tti);
+  proc->subframe_tx  = (sf+4)%10;
+  proc->frame_tx     = (sf>5) ? (f+1)&1023 : f;
  
   if (proc->first_rx == 0) {
     if (proc->subframe_rx != *subframe){
@@ -411,7 +406,8 @@ void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) {
 
   proc->symbol_mask[sf] = 0;  
   VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
-  
+  LOG_D(PHY,"RU %d: fh_if4p5_south_in sleeping ...\n",ru->idx);
+  usleep(100);
 }
 
 // Dummy FH from south for getting synchronization from master RU
@@ -614,9 +610,13 @@ void fh_if4p5_north_asynch_in(RU_t *ru,int *frame,int *subframe) {
     }
   } while (symbol_mask != symbol_mask_full);    
 
-  proc->subframe_tx = subframe_tx;
-  proc->frame_tx    = frame_tx;
+  proc->subframe_tx  = subframe_tx;
+  proc->frame_tx     = frame_tx;
+
+  if ((frame_tx == 0)&&(subframe_tx == 0)) proc->frame_tx_unwrap += 1024;
 
+  proc->timestamp_tx = (((frame_tx + proc->frame_tx_unwrap) * 10) + subframe_tx) * fp->samples_per_tti;
+  LOG_D(PHY,"RU %d/%d TST %llu, frame %d, subframe %d\n",ru->idx,0,proc->timestamp_tx,frame_tx,subframe_tx);
     // dump VCD output for first RU in list
   if (ru == RC.ru[0]) {
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame_tx );
@@ -649,7 +649,7 @@ void fh_if4p5_north_out(RU_t *ru) {
 
   if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) {
     /// **** in TDD during DL send_IF4 of ULTICK to RCC **** ///
-    send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULTICK, 0);
+    send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULTICK);
     return;
   }
   if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 1 ); 
@@ -658,7 +658,7 @@ void fh_if4p5_north_out(RU_t *ru) {
   if (ru->feprx) { 
     LOG_D(PHY,"Doing FEP/IF4p5 for frame %d, subframe %d\n",proc->frame_rx,proc->subframe_rx);
     ru->feprx(ru);
-    send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT, 0);
+    send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT);
   }
 
   if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 0 );
@@ -667,12 +667,12 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
 
   RU_proc_t *proc = &ru->proc;
   LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
-  void *rxp[fp->nb_antennas_rx];
+  void *rxp[ru->nb_rx];
   unsigned int rxs;
   int i;
 
     
-  for (i=0; i<fp->nb_antennas_rx; i++)
+  for (i=0; i<ru->nb_rx; i++)
     rxp[i] = (void*)&ru->common.rxdata[i][*subframe*fp->samples_per_tti];
   
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
@@ -681,7 +681,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
 				   &(proc->timestamp_rx),
 				   rxp,
 				   fp->samples_per_tti,
-				   fp->nb_antennas_rx);
+				   ru->nb_rx);
   
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
  
@@ -696,6 +696,8 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) {
   proc->subframe_tx  = (proc->subframe_rx+4)%10;
   proc->frame_tx     = (proc->subframe_rx>5) ? (proc->frame_rx+1)&1023 : proc->frame_rx;
 
+  LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, subframe %d\n",ru->idx, 0, proc->timestamp_rx,ru->ts_offset,proc->frame_rx,proc->subframe_rx);
+
     // dump VCD output for first RU in list
   if (ru == RC.ru[0]) {
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_RU, proc->frame_rx );
@@ -734,7 +736,7 @@ void tx_rf(RU_t *ru) {
 
   RU_proc_t *proc = &ru->proc;
   LTE_DL_FRAME_PARMS *fp = &ru->frame_parms;
-  void *txp[fp->nb_antennas_tx]; 
+  void *txp[ru->nb_tx]; 
   unsigned int txs;
   int i;
 
@@ -742,16 +744,18 @@ void tx_rf(RU_t *ru) {
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
   // prepare tx buffer pointers
   
-  for (i=0; i<fp->nb_antennas_tx; i++)
+  for (i=0; i<ru->nb_tx; i++)
     txp[i] = (void*)&ru->common.txdata[i][proc->subframe_tx*fp->samples_per_tti];
   
   txs = ru->rfdevice.trx_write_func(&ru->rfdevice,
 				    proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance,
 				    txp,
 				    fp->samples_per_tti,
-				    fp->nb_antennas_tx,
+				    ru->nb_tx,
 				    1);
   
+  LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, subframe %d\n",ru->idx,
+	proc->timestamp_tx,proc->frame_tx,proc->frame_tx_unwrap,proc->subframe_tx,proc);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
   
     
@@ -967,7 +971,7 @@ void do_ru_synch(RU_t *ru) {
       // continuously read in frames, 1ms at a time, 
       // until we are done with the synchronization procedure
       
-      for (i=0; i<fp->nb_antennas_rx; i++)
+      for (i=0; i<ru->nb_rx; i++)
 	rxp2[i] = (void*)&dummy_rx[i][0];
       for (i=0;i<10;i++)
 	rxs = ru->rfdevice.trx_read_func(&ru->rfdevice,
@@ -986,7 +990,7 @@ void do_ru_synch(RU_t *ru) {
 				   &(proc->timestamp_rx),
 				   rxp,
 				   ru->rx_offset,
-				   fp->nb_antennas_rx);
+				   ru->nb_rx);
   for (i=0;i<4;i++) {
     ru->rfdevice.openair0_cfg->rx_freq[i] = temp_freq1;
     ru->rfdevice.openair0_cfg->tx_freq[i] = temp_freq2;
@@ -1003,6 +1007,8 @@ void wakeup_eNBs(RU_t *ru) {
   int i;
   PHY_VARS_eNB **eNB_list = ru->eNB_list;
 
+  LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d\n",ru->num_eNB,ru->idx);
+
   if (ru->num_eNB==1) {
     // call eNB function directly
 
@@ -1019,7 +1025,7 @@ void wakeup_eNBs(RU_t *ru) {
   }
 }
 
-static inline int wakeup_prach(RU_t *ru) {
+static inline int wakeup_prach_ru(RU_t *ru) {
 
   struct timespec wait;
   
@@ -1035,7 +1041,8 @@ static inline int wakeup_prach(RU_t *ru) {
     ++ru->proc.instance_cnt_prach;
     ru->proc.frame_prach    = ru->proc.frame_rx;
     ru->proc.subframe_prach = ru->proc.subframe_rx;
-    
+
+    LOG_D(PHY,"RU %d: waking up PRACH thread\n",ru->idx);
     // the thread can now be woken up
     AssertFatal(pthread_cond_signal(&ru->proc.cond_prach) == 0, "ERROR pthread_cond_signal for RU prach thread\n");
   }
@@ -1053,8 +1060,8 @@ static void* ru_thread( void* param ) {
   RU_proc_t          *proc    = &ru->proc;
   LTE_DL_FRAME_PARMS *fp      = &ru->frame_parms;
   int                ret;
-  int                subframe =0;
-  int                frame    =0; 
+  int                subframe =9;
+  int                frame    =1023; 
 
   // set default return value
   ru_thread_status = 0;
@@ -1136,7 +1143,7 @@ static void* ru_thread( void* param ) {
 	  proc->frame_rx,proc->subframe_rx);
  
     if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0))
-      wakeup_prach(ru);
+      wakeup_prach_ru(ru);
 
 
 
@@ -1154,6 +1161,7 @@ static void* ru_thread( void* param ) {
     // If this proc is to provide synchronization, do so
     wakeup_slaves(proc);
 
+    LOG_D(PHY,"RU %d/%d frame_tx %d, subframe_tx %d\n",0,ru->idx,proc->frame_tx,proc->subframe_tx);
     // wakeup all eNB processes waiting for this RU
     if (ru->num_eNB>0) wakeup_eNBs(ru);
 
@@ -1168,7 +1176,7 @@ static void* ru_thread( void* param ) {
     if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru);
     // do outgoing fronthaul (south) if needed
     if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru);
-
+ 
     if (ru->fh_north_out) ru->fh_north_out(ru);
   }
   
@@ -1285,20 +1293,22 @@ void init_RU_proc(RU_t *ru) {
   char name[100];
 
 #ifndef OCP_FRAMEWORK
-  LOG_I(PHY,"Initializing RU %d (%s,%s),\n",ru->idx,eNB_functions[ru->function],eNB_timing[ru->if_timing]);
+  LOG_I(PHY,"Initializing RU proc %d (%s,%s),\n",ru->idx,eNB_functions[ru->function],eNB_timing[ru->if_timing]);
 #endif
   proc = &ru->proc;
   memset((void*)proc,0,sizeof(RU_proc_t));
 
   proc->ru = ru;
   proc->instance_cnt_prach       = -1;
-  proc->instance_cnt_synch       = -1;
+  proc->instance_cnt_synch       = -1;     ;
   proc->instance_cnt_FH          = -1;
   proc->instance_cnt_asynch_rxtx = -1;
   proc->first_rx                 = 1;
   proc->first_tx                 = 1;
   proc->frame_offset             = 0;
   proc->num_slaves               = 0;
+  proc->frame_tx_unwrap          = 0;
+
   for (i=0;i<10;i++) proc->symbol_mask[i]=0;
   
   pthread_mutex_init( &proc->mutex_prach, NULL);
@@ -1808,7 +1818,7 @@ void init_RU(const char *rf_config_file) {
 
   } // for ru_id
 
-  sleep(1);
+  //  sleep(1);
   LOG_D(HW,"[lte-softmodem.c] RU threads created\n");
   
 
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 90fc37bbe3b..ae6db702495 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -526,6 +526,7 @@ static void *scope_thread(void *arg)
                    0,7);
 
     } else {
+      /*
       if (RC.eNB[0][0]->mac_enabled==1) {
 	len = dump_eNB_l2_stats (stats_buffer, 0);
 	//fl_set_object_label(form_stats_l2->stats_text, stats_buffer);
@@ -540,7 +541,7 @@ static void *scope_thread(void *arg)
       //fl_set_object_label(form_stats->stats_text, stats_buffer);
       fl_clear_browser(form_stats->stats_text);
       fl_add_browser_line(form_stats->stats_text, stats_buffer);
-
+      */
       ue_cnt=0;
       for(UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) {
 	for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 98206a3c52d..b71a4d06641 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -189,7 +189,9 @@ PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms,
   }					
   else ue = PHY_vars_UE_g[UE_id][0];
 
-  ue->Mod_id=UE_id;
+
+  ue->Mod_id      = UE_id;
+  ue->mac_enabled = 1;
   // initialize all signal buffers
   init_lte_ue_signal(ue,1,abstraction_flag);
   // intialize transport
@@ -298,37 +300,37 @@ static void *UE_thread_synch(void *arg)
   /* CPU 0 is reserved for UHD threads */
   CPU_ZERO(&cpuset);
 
-  #ifdef CPU_AFFINITY
+#ifdef CPU_AFFINITY
   if (get_nprocs() >2)
-  {
-    for (j = 1; j < get_nprocs(); j++)
-      CPU_SET(j, &cpuset);
-
-    s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
-    if (s != 0)
     {
-      perror( "pthread_setaffinity_np");
-      exit_fun("Error setting processor affinity");
+      for (j = 1; j < get_nprocs(); j++)
+	CPU_SET(j, &cpuset);
+
+      s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
+      if (s != 0)
+	{
+	  perror( "pthread_setaffinity_np");
+	  exit_fun("Error setting processor affinity");
+	}
     }
-  }
-  #endif
+#endif
 
   /* Check the actual affinity mask assigned to the thread */
 
   s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
   if (s != 0)
-  {
-    perror( "pthread_getaffinity_np");
-    exit_fun("Error getting processor affinity ");
-  }
+    {
+      perror( "pthread_getaffinity_np");
+      exit_fun("Error getting processor affinity ");
+    }
   memset(cpu_affinity, 0 , sizeof(cpu_affinity));
   for (j = 0; j < CPU_SETSIZE; j++)
-  if (CPU_ISSET(j, &cpuset))
-  {  
-     char temp[1024];
-     sprintf(temp, " CPU_%d ", j);    
-     strcat(cpu_affinity, temp);
-  }
+    if (CPU_ISSET(j, &cpuset))
+      {  
+	char temp[1024];
+	sprintf(temp, " CPU_%d ", j);    
+	strcat(cpu_affinity, temp);
+      }
 
   memset(&sparam, 0 , sizeof (sparam));
   sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
@@ -336,24 +338,24 @@ static void *UE_thread_synch(void *arg)
   
   s = pthread_setschedparam(pthread_self(), policy, &sparam);
   if (s != 0)
-     {
-     perror("pthread_setschedparam : ");
-     exit_fun("Error setting thread priority");
-     }
+    {
+      perror("pthread_setschedparam : ");
+      exit_fun("Error setting thread priority");
+    }
   s = pthread_getschedparam(pthread_self(), &policy, &sparam);
   if (s != 0)
-   {
-     perror("pthread_getschedparam : ");
-     exit_fun("Error getting thread priority");
+    {
+      perror("pthread_getschedparam : ");
+      exit_fun("Error getting thread priority");
 
-   }
+    }
 
   LOG_I( HW, "[SCHED][UE] Started UE synch thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(),
-                   (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
-                   (policy == SCHED_RR)    ? "SCHED_RR" :
-                   (policy == SCHED_OTHER) ? "SCHED_OTHER" :
-                   "???",
-                   (int) sparam.sched_priority, cpu_affinity);
+	 (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
+	 (policy == SCHED_RR)    ? "SCHED_RR" :
+	 (policy == SCHED_OTHER) ? "SCHED_OTHER" :
+	 "???",
+	 (int) sparam.sched_priority, cpu_affinity);
 
 #endif
 
@@ -491,14 +493,16 @@ static void *UE_thread_synch(void *arg)
       LOG_I(PHY,"[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode);
       if (initial_sync( UE, UE->mode ) == 0) {
 
+
+
         hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti;
         LOG_I( HW, "Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n",
-          hw_slot_offset,
-          freq_offset,
-          UE->rx_total_gain_dB,
-          UE->frame_parms.dl_CarrierFreq+freq_offset,
-          UE->frame_parms.ul_CarrierFreq+freq_offset,
-          UE->UE_scan_carrier );
+	       hw_slot_offset,
+	       freq_offset,
+	       UE->rx_total_gain_dB,
+	       UE->frame_parms.dl_CarrierFreq+freq_offset,
+	       UE->frame_parms.ul_CarrierFreq+freq_offset,
+	       UE->UE_scan_carrier );
 
 	if (UE->UE_scan_carrier == 1) {
 
@@ -506,14 +510,14 @@ static void *UE_thread_synch(void *arg)
 	  // rerun with new cell parameters and frequency-offset
 	  for (i=0;i<openair0_cfg[UE->rf_map.card].rx_num_channels;i++) {
 	    openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
-		if (freq_offset >= 0)
-	    {
+	    if (freq_offset >= 0)
+	      {
 	        openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] += UE->common_vars.freq_offset;
-	    }
+	      }
 	    else
-	    {
+	      {
 	        openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] -= UE->common_vars.freq_offset;
-	    }
+	      }
 	    openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] =  openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i]+uplink_frequency_offset[CC_id][i];
 	    UE->frame_parms.dl_CarrierFreq = openair0_cfg[CC_id].rx_freq[i];
 	    freq_offset=0;	    
@@ -712,37 +716,37 @@ static void *UE_thread_rxn_txnp4(void *arg)
   /* CPU 0 is reserved for UHD threads */
   CPU_ZERO(&cpuset);
 
-  #ifdef CPU_AFFINITY
+#ifdef CPU_AFFINITY
   if (get_nprocs() >2)
-  {
-    for (j = 1; j < get_nprocs(); j++)
-      CPU_SET(j, &cpuset);
-
-    s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
-    if (s != 0)
     {
-      perror( "pthread_setaffinity_np");
-      exit_fun("Error setting processor affinity");
+      for (j = 1; j < get_nprocs(); j++)
+	CPU_SET(j, &cpuset);
+
+      s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
+      if (s != 0)
+	{
+	  perror( "pthread_setaffinity_np");
+	  exit_fun("Error setting processor affinity");
+	}
     }
-  }
-  #endif
+#endif
 
   /* Check the actual affinity mask assigned to the thread */
 
   s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
   if (s != 0)
-  {
-    perror( "pthread_getaffinity_np");
-    exit_fun("Error getting processor affinity ");
-  }
+    {
+      perror( "pthread_getaffinity_np");
+      exit_fun("Error getting processor affinity ");
+    }
   memset(cpu_affinity, 0 , sizeof(cpu_affinity));
   for (j = 0; j < CPU_SETSIZE; j++)
-  if (CPU_ISSET(j, &cpuset))
-  {  
-     char temp[1024];
-     sprintf(temp, " CPU_%d ", j);    
-     strcat(cpu_affinity, temp);
-  }
+    if (CPU_ISSET(j, &cpuset))
+      {  
+	char temp[1024];
+	sprintf(temp, " CPU_%d ", j);    
+	strcat(cpu_affinity, temp);
+      }
 
   memset(&sparam, 0 , sizeof (sparam));
   sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
@@ -750,24 +754,24 @@ static void *UE_thread_rxn_txnp4(void *arg)
   
   s = pthread_setschedparam(pthread_self(), policy, &sparam);
   if (s != 0)
-     {
-     perror("pthread_setschedparam : ");
-     exit_fun("Error setting thread priority");
-     }
+    {
+      perror("pthread_setschedparam : ");
+      exit_fun("Error setting thread priority");
+    }
   s = pthread_getschedparam(pthread_self(), &policy, &sparam);
   if (s != 0)
-   {
-     perror("pthread_getschedparam : ");
-     exit_fun("Error getting thread priority");
+    {
+      perror("pthread_getschedparam : ");
+      exit_fun("Error getting thread priority");
 
-   }
+    }
 
   LOG_I( HW, "[SCHED][UE] Started UE RX thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(),
-                   (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
-                   (policy == SCHED_RR)    ? "SCHED_RR" :
-                   (policy == SCHED_OTHER) ? "SCHED_OTHER" :
-                   "???",
-                   (int) sparam.sched_priority, cpu_affinity);
+	 (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
+	 (policy == SCHED_RR)    ? "SCHED_RR" :
+	 (policy == SCHED_OTHER) ? "SCHED_OTHER" :
+	 "???",
+	 (int) sparam.sched_priority, cpu_affinity);
 
 
 #endif
@@ -787,10 +791,10 @@ static void *UE_thread_rxn_txnp4(void *arg)
   char threadname[THREAD_NAME_LEN];
   ret = pthread_getname_np(proc->pthread_rxtx, threadname, THREAD_NAME_LEN);
   if (ret != 0)
-  {
-   perror("pthread_getname_np : ");
-   exit_fun("Error getting thread name");
-  }
+    {
+      perror("pthread_getname_np : ");
+      exit_fun("Error getting thread name");
+    }
 
   pthread_mutex_unlock(&sync_mutex);
   printf("unlocked sync_mutex, waiting (UE_thread_rxtx)\n");
@@ -831,20 +835,20 @@ static void *UE_thread_rxn_txnp4(void *arg)
         (sf_type == SF_S)) {
     
       if (UE->frame_parms.frame_type == TDD) {
-      LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n",
-          threadname,
-          UE->frame_parms.tdd_config,
-          (sf_type==SF_DL? "SF_DL" :
-          (sf_type==SF_UL? "SF_UL" :
-          (sf_type==SF_S ? "SF_S"  : "UNKNOWN_SF_TYPE"))));
+	LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n",
+	      threadname,
+	      UE->frame_parms.tdd_config,
+	      (sf_type==SF_DL? "SF_DL" :
+	       (sf_type==SF_UL? "SF_UL" :
+		(sf_type==SF_S ? "SF_S"  : "UNKNOWN_SF_TYPE"))));
       } else {
         LOG_D(PHY, "%s,%s,%s: calling UE_RX\n",
-            threadname,
-            (UE->frame_parms.frame_type==FDD? "FDD":
-            (UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")),
-            (sf_type==SF_DL? "SF_DL" :
-            (sf_type==SF_UL? "SF_UL" :
-            (sf_type==SF_S ? "SF_S"  : "UNKNOWN_SF_TYPE"))));
+	      threadname,
+	      (UE->frame_parms.frame_type==FDD? "FDD":
+	       (UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")),
+	      (sf_type==SF_DL? "SF_DL" :
+	       (sf_type==SF_UL? "SF_UL" :
+		(sf_type==SF_S ? "SF_S"  : "UNKNOWN_SF_TYPE"))));
       }
       phy_procedures_UE_RX( UE, proc, 0, 0, UE->mode, no_relay, NULL );
     }
@@ -852,13 +856,13 @@ static void *UE_thread_rxn_txnp4(void *arg)
     if (UE->mac_enabled==1) {
 
       ret = mac_xface->ue_scheduler(UE->Mod_id,
-          proc->frame_rx,
-          proc->subframe_rx,
-          proc->frame_tx,
-          proc->subframe_tx,
-          subframe_select(&UE->frame_parms,proc->subframe_tx),
-          0,
-          0/*FIXME CC_id*/);
+				    proc->frame_rx,
+				    proc->subframe_rx,
+				    proc->frame_tx,
+				    proc->subframe_tx,
+				    subframe_select(&UE->frame_parms,proc->subframe_tx),
+				    0,
+				    0/*FIXME CC_id*/);
       
       if (ret == CONNECTION_LOST) {
 	LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n",
@@ -884,10 +888,10 @@ static void *UE_thread_rxn_txnp4(void *arg)
     }
 
     if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_S) &&
-  (UE->frame_parms.frame_type == TDD)) {
+	(UE->frame_parms.frame_type == TDD)) {
 
       if (UE->mode != loop_through_memory) {
-  phy_procedures_UE_S_TX(UE,0,0,no_relay);
+	phy_procedures_UE_S_TX(UE,0,0,no_relay);
       }
     }
 
@@ -1033,7 +1037,8 @@ void *UE_thread(void *arg) {
 					   UE->frame_parms.samples_per_tti*10,
 					   UE->frame_parms.nb_antennas_rx);
 	  
-	  
+	  LOG_D(PHY,"UE TS %llu, synch, samples %d\n",timestamp,UE->frame_parms.samples_per_tti*10);
+
 	  if (rxs!=UE->frame_parms.samples_per_tti*10) {
 	    LOG_E(PHY, "problem in rx 1! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti*10, rxs);
 	    exit_fun("problem in rx 1");
@@ -1067,6 +1072,7 @@ void *UE_thread(void *arg) {
 					     rxp,
 					     UE->frame_parms.samples_per_tti,
 					     UE->frame_parms.nb_antennas_rx);
+	    LOG_D(PHY,"UE TS %llu, subframe %d, samples %d\n",timestamp,sf,UE->frame_parms.samples_per_tti);
 
 	    if (rxs!=UE->frame_parms.samples_per_tti){
 	      LOG_E(PHY, "problem in rx 2! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti, rxs);
@@ -1086,15 +1092,17 @@ void *UE_thread(void *arg) {
 
 	  if (UE->no_timing_correction==0) {
 	    LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offset,UE->mode);
-	    rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
-					     &timestamp,
-					     (void**)UE->common_vars.rxdata,
-					     UE->rx_offset,
-					     UE->frame_parms.nb_antennas_rx);
-	    if (rxs != UE->rx_offset) {
-	      LOG_E(PHY, "problem in rx 3! expect #samples=%d but got only %d!\n", UE->rx_offset, rxs);
-	      exit_fun("problem in rx 3!");
-	      return &UE_thread_retval;
+	    if (UE->rx_offset>0) {
+	      rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
+					       &timestamp,
+					       (void**)UE->common_vars.rxdata,
+					       UE->rx_offset,
+					       UE->frame_parms.nb_antennas_rx);
+	      if (rxs != UE->rx_offset) {
+		LOG_E(PHY, "problem in rx 3! expect #samples=%d but got only %d!\n", UE->rx_offset, rxs);
+		exit_fun("problem in rx 3!");
+		return &UE_thread_retval;
+	      }
 	    }
 	  }
 	  LOG_D(PHY,"Set rx_offset to 0 \n");
@@ -1108,11 +1116,12 @@ void *UE_thread(void *arg) {
 					   (void**)UE->common_vars.rxdata,
 					   UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0,
 					   UE->frame_parms.nb_antennas_rx);
-    if (rxs != (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0)) {
-      LOG_E(PHY, "problem in rx 4! expect #samples=%d but got only %d!\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, rxs);
-      exit_fun("problem in rx 4!");
-      return &UE_thread_retval;
-    }
+	  LOG_D(PHY,"UE TS %llu, subframe %d, samples %d\n",timestamp,0,UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0);
+	  if (rxs != (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0)) {
+	    LOG_E(PHY, "problem in rx 4! expect #samples=%d but got only %d!\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, rxs);
+	    exit_fun("problem in rx 4!");
+	    return &UE_thread_retval;
+	  }
 	  slot_fep(UE,
 		   0,
 		   0,
@@ -1129,26 +1138,25 @@ void *UE_thread(void *arg) {
 
       }// start_rx_stream==0
       else {
-	//UE->proc.proc_rxtx[0].frame_rx++;
-	//UE->proc.proc_rxtx[1].frame_rx++;
-	
 	for (int sf=0;sf<10;sf++) {
+
 	  for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) 
 	    rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)];
 	  // grab signal for subframe
 	  if (UE->mode != loop_through_memory) {
 	    if (sf<9) {
-	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
+	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_UE, 1 );
 	      rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
 					       &timestamp,
 					       rxp,
 					       UE->frame_parms.samples_per_tti,
 					       UE->frame_parms.nb_antennas_rx);
-	      LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d \n", sf, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti),
-	    		  UE->frame_parms.samples_per_tti);
-	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
+
+	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_UE, 0 );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS_MISSING, UE->frame_parms.samples_per_tti - rxs);
+	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS_UE, timestamp&0xffffffff );
+
 	      if (rxs != UE->frame_parms.samples_per_tti) {
 	        LOG_E(PHY, "problem in rx 5! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti, rxs);
 	        exit_fun("problem in rx 5!");
@@ -1159,7 +1167,7 @@ void *UE_thread(void *arg) {
 	      for (i=0; i<UE->frame_parms.nb_antennas_tx; i++)
 		txp[i] = (void*)&UE->common_vars.txdata[i][((sf+2)%10)*UE->frame_parms.samples_per_tti];
 	      
-	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
+	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_UE, 1 );
 	      txs = UE->rfdevice.trx_write_func(&UE->rfdevice,
 						timestamp+
 						(2*UE->frame_parms.samples_per_tti) -
@@ -1169,13 +1177,13 @@ void *UE_thread(void *arg) {
 						UE->frame_parms.samples_per_tti,
 						UE->frame_parms.nb_antennas_tx,
 						1);
-	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
+	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_UE, 0 );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS, txs );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS_MISSING, UE->frame_parms.samples_per_tti - txs);
-        if (txs !=  UE->frame_parms.samples_per_tti) {
-           LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti);
-           exit_fun( "problem transmitting samples" );
-        }
+	      if (txs !=  UE->frame_parms.samples_per_tti) {
+		LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti);
+		exit_fun( "problem transmitting samples" );
+	      }
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS_MISSING, UE->frame_parms.samples_per_tti - txs);
 	    }
 	    
@@ -1187,16 +1195,18 @@ void *UE_thread(void *arg) {
 					       UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0,
 					       UE->frame_parms.nb_antennas_rx);
 
-	      LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d \n", sf, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti),
-	    		  UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0);
+	      LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d => %d dB\n", sf, 
+		    UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti),
+		    UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0,
+		    dB_fixed(signal_energy(rxp[0],UE->frame_parms.samples_per_tti)));
 	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS_MISSING, (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0) - rxs);
-        if (rxs != (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0)) {
-          LOG_E(PHY, "problem in rx 6! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, rxs);
-          exit_fun("problem in rx 6!");
-          return &UE_thread_retval;
-        }
+	      if (rxs != (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0)) {
+		LOG_E(PHY, "problem in rx 6! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, rxs);
+		exit_fun("problem in rx 6!");
+		return &UE_thread_retval;
+	      }
 
 	      // prepare tx buffer pointers
 	      for (i=0; i<UE->frame_parms.nb_antennas_tx; i++)
@@ -1216,16 +1226,16 @@ void *UE_thread(void *arg) {
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS, txs );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS_MISSING, (UE->frame_parms.samples_per_tti - rx_off_diff) - txs);
               if (txs !=  UE->frame_parms.samples_per_tti - rx_off_diff) {
-                 LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti-rx_off_diff);
-                 exit_fun( "problem transmitting samples" );
+		LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti-rx_off_diff);
+		exit_fun( "problem transmitting samples" );
               }
 
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 1 );
+	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 1 );
 	      // read in first symbol of next frame and adjust for timing drift
-          for (i=0; i<UE->frame_parms.nb_antennas_rx; i++)
-          {
-            rxp[i] = (void*)&UE->common_vars.rxdata[i][0];
-          }
+	      for (i=0; i<UE->frame_parms.nb_antennas_rx; i++)
+		{
+		  rxp[i] = (void*)&UE->common_vars.rxdata[i][0];
+		}
 
 	      rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
 					       &timestamp1,
@@ -1234,26 +1244,26 @@ void *UE_thread(void *arg) {
 					       UE->frame_parms.nb_antennas_rx);
 
 	      for (i=0; i<UE->frame_parms.nb_antennas_rx; i++)
-	      {
-	        rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.nb_prefix_samples0];
-	      }
+		{
+		  rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.nb_prefix_samples0];
+		}
 
 	      rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
 					       &timestamp1,
-						   rxp,
+					       rxp,
 					       UE->frame_parms.ofdm_symbol_size,
 					       UE->frame_parms.nb_antennas_rx);
 
 	      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 );
 	      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs );
-        if (rxs != (UE->frame_parms.ofdm_symbol_size)) {
-          LOG_E(PHY, "problem in rx 7! expect #samples=%d but got only %d! rx_off_diff=%d\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, rxs, rx_off_diff);
-          exit_fun("problem in rx 7!");
-          return &UE_thread_retval;
-        }
-        UE->rx_offset_diff = rx_off_diff;
-        LOG_D(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff);
-        rx_off_diff = 0;
+	      if (rxs != (UE->frame_parms.ofdm_symbol_size)) {
+		LOG_E(PHY, "problem in rx 7! expect #samples=%d but got only %d! rx_off_diff=%d\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, rxs, rx_off_diff);
+		exit_fun("problem in rx 7!");
+		return &UE_thread_retval;
+	      }
+	      UE->rx_offset_diff = rx_off_diff;
+	      LOG_D(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff);
+	      rx_off_diff = 0;
 	    }
 	  }
 	  // operate on thread sf mod 2
@@ -1271,23 +1281,27 @@ void *UE_thread(void *arg) {
 	  int instance_cnt_rxtx = ++proc->instance_cnt_rxtx;
 	  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, proc->instance_cnt_rxtx);
 	  if(sf == 0)
-	  {
-	     UE->proc.proc_rxtx[0].frame_rx++;
-	     UE->proc.proc_rxtx[1].frame_rx++;
-	  }
+	    {
+	      UE->proc.proc_rxtx[0].frame_rx++;
+	      UE->proc.proc_rxtx[1].frame_rx++;
+	      proc->frame_rx = UE->proc.proc_rxtx[0].frame_rx;
+	    }
+
+
 	  proc->subframe_rx=sf;
 	  proc->subframe_tx=(sf+4)%10;
 	  proc->frame_tx = proc->frame_rx + ((proc->subframe_rx>5)?1:0);
 	  proc->timestamp_tx = timestamp+(4*UE->frame_parms.samples_per_tti)-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0;
 
+	  LOG_D(PHY,"UE TS %llu, frame %d, subframe %d\n",timestamp,proc->frame_rx,proc->subframe_rx);
 #if T_TRACER
 	  T(T_UE_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx));
 #endif
 	  /*
-	  if (sf != (timestamp/UE->frame_parms.samples_per_tti)%10) {
+	    if (sf != (timestamp/UE->frame_parms.samples_per_tti)%10) {
 	    LOG_E(PHY,"steady-state UE_thread error : frame_rx %d, subframe_rx %d, frame_tx %d, subframe_tx %d, rx subframe %d\n",proc->frame_rx,proc->subframe_rx,proc->frame_tx,proc->subframe_tx,(timestamp/UE->frame_parms.samples_per_tti)%10);
 	    exit(-1);
-	  }
+	    }
 	  */
 	  if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) {
 	    LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" );
@@ -1306,7 +1320,7 @@ void *UE_thread(void *arg) {
 	    }
 	    LOG_D(PHY, "firing up rxtx_thread[%d] at subframe %d\n", proc_select, sf);
 
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SIGNAL_COND_RXTX0+proc_select, 0 );
+	    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SIGNAL_COND_RXTX0+proc_select, 0 );
 
 	  } else {
 	    LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rxtx);
@@ -1348,22 +1362,22 @@ void *UE_thread(void *arg) {
     } // UE->is_synchronized==1
       
   } // while !oai_exit
- return NULL;
+  return NULL;
 } // UE_thread
 
 /*
-void *UE_thread_old(void *arg)
-{
+  void *UE_thread_old(void *arg)
+  {
   UNUSED(arg)
   static int UE_thread_retval;
   PHY_VARS_UE *UE = PHY_vars_UE_g[0][0];
   int spp = openair0_cfg[0].samples_per_packet;
   int slot=1, frame=0, hw_subframe=0, rxpos=0, txpos=openair0_cfg[0].tx_scheduling_advance;
-#ifdef __AVX2__
+  #ifdef __AVX2__
   int dummy[2][spp] __attribute__((aligned(32)));
-#else
+  #else
   int dummy[2][spp] __attribute__((aligned(16)));
-#endif
+  #endif
   int dummy_dump = 0;
   int tx_enabled = 0;
   int start_rx_stream = 0;
@@ -1376,11 +1390,11 @@ void *UE_thread_old(void *arg)
 
   openair0_timestamp timestamp;
 
-#ifdef NAS_UE
+  #ifdef NAS_UE
   MessageDef *message_p;
-#endif
+  #endif
 
-#ifdef DEADLINE_SCHEDULER
+  #ifdef DEADLINE_SCHEDULER
 
   struct sched_attr attr;
   unsigned int flags = 0;
@@ -1397,18 +1411,18 @@ void *UE_thread_old(void *arg)
   attr.sched_period   = 500000;
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
-    perror("[SCHED] main eNB thread: sched_setattr failed\n");
-    exit_fun("Nothing to add");
-    return &UE_thread_retval;
+  perror("[SCHED] main eNB thread: sched_setattr failed\n");
+  exit_fun("Nothing to add");
+  return &UE_thread_retval;
   }
   LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %lu started on CPU %d\n",
-        (unsigned long)gettid(), sched_getcpu());
+  (unsigned long)gettid(), sched_getcpu());
 
-#else
+  #else
   struct sched_param sp;
   sp.sched_priority = sched_get_priority_max(SCHED_FIFO);
   pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
-#endif
+  #endif
 
   // Lock memory from swapping. This is a process wide call (not constraint to this thread).
   mlockall(MCL_CURRENT | MCL_FUTURE);
@@ -1418,320 +1432,320 @@ void *UE_thread_old(void *arg)
   printf("Locked sync_mutex, waiting (UE_thread)\n");
 
   while (sync_var<0)
-    pthread_cond_wait(&sync_cond, &sync_mutex);
+  pthread_cond_wait(&sync_cond, &sync_mutex);
 
   pthread_mutex_unlock(&sync_mutex);
   printf("unlocked sync_mutex, waiting (UE_thread)\n");
 
   printf("starting UE thread\n");
 
-#ifdef NAS_UE
+  #ifdef NAS_UE
   message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE);
   itti_send_msg_to_task (TASK_NAS_UE, INSTANCE_DEFAULT, message_p);
-#endif
+  #endif
 
   T0 = rt_get_time_ns();
   first_rx = 1;
   rxpos=0;
 
   while (!oai_exit) {
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe );
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame );
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, dummy_dump );
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe );
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame );
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, dummy_dump );
 
 
-    while (rxpos < (1+hw_subframe)*UE->frame_parms.samples_per_tti) {
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
+  while (rxpos < (1+hw_subframe)*UE->frame_parms.samples_per_tti) {
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
 
-#ifndef USRP_DEBUG
+  #ifndef USRP_DEBUG
 
-      DevAssert( UE->frame_parms.nb_antennas_rx <= 2 );
-      void* rxp[2];
+  DevAssert( UE->frame_parms.nb_antennas_rx <= 2 );
+  void* rxp[2];
 
-      for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
-        rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i];
+  for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
+  rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i];
       
     
-      if (UE->mode != loop_through_memory) {
-	rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
-				     &timestamp,
-				     rxp,
-				     spp - ((first_rx==1) ? rx_off_diff : 0),
-				     UE->frame_parms.nb_antennas_rx);
-
-	if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) {
-	  printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs);
-	  if (UE->is_synchronized == 1) {
-	    exit_fun("problem in rx");
-	    return &UE_thread_retval;
-	  }
-	}
-      }
+  if (UE->mode != loop_through_memory) {
+  rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
+  &timestamp,
+  rxp,
+  spp - ((first_rx==1) ? rx_off_diff : 0),
+  UE->frame_parms.nb_antennas_rx);
+
+  if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) {
+  printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs);
+  if (UE->is_synchronized == 1) {
+  exit_fun("problem in rx");
+  return &UE_thread_retval;
+  }
+  }
+  }
 
-      if (rx_off_diff !=0)
-	LOG_D(PHY,"frame %d, rx_offset %d, rx_off_diff %d\n",UE->frame_rx,UE->rx_offset,rx_off_diff);
+  if (rx_off_diff !=0)
+  LOG_D(PHY,"frame %d, rx_offset %d, rx_off_diff %d\n",UE->frame_rx,UE->rx_offset,rx_off_diff);
 
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
 
-      // Transmit TX buffer based on timestamp from RX
-      if ((tx_enabled==1) && (UE->mode!=loop_through_memory)) {
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
+  // Transmit TX buffer based on timestamp from RX
+  if ((tx_enabled==1) && (UE->mode!=loop_through_memory)) {
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
 
-        DevAssert( UE->frame_parms.nb_antennas_tx <= 2 );
-        void* txp[2];
+  DevAssert( UE->frame_parms.nb_antennas_tx <= 2 );
+  void* txp[2];
 
-        for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
-          txp[i] = (void*)&txdata[i][txpos];
+  for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
+  txp[i] = (void*)&txdata[i][txpos];
 
-        UE->rfdevice.trx_write_func(&openair0,
-                                (timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance),
-                                txp,
-				spp - ((first_rx==1) ? rx_off_diff : 0),
-                                UE->frame_parms.nb_antennas_tx,
-                                1);
+  UE->rfdevice.trx_write_func(&openair0,
+  (timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance),
+  txp,
+  spp - ((first_rx==1) ? rx_off_diff : 0),
+  UE->frame_parms.nb_antennas_tx,
+  1);
 
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
-      }
-      else if (UE->mode == loop_through_memory)
-	rt_sleep_ns(1000000);
-#else
-      // define USRP_DEBUG is active
-      rt_sleep_ns(1000000);
-#endif
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
+  }
+  else if (UE->mode == loop_through_memory)
+  rt_sleep_ns(1000000);
+  #else
+  // define USRP_DEBUG is active
+  rt_sleep_ns(1000000);
+  #endif
 
-      rx_off_diff = 0;
-      first_rx = 0;
+  rx_off_diff = 0;
+  first_rx = 0;
 
-      rxpos += spp;
-      txpos += spp;
+  rxpos += spp;
+  txpos += spp;
 
-      if (txpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti)
-        txpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti;
-    }
+  if (txpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti)
+  txpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti;
+  }
 
-    if (rxpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti)
-      rxpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti;
+  if (rxpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti)
+  rxpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti;
 
-    if (UE->is_synchronized == 1)  {
-      LOG_D( HW, "UE_thread: hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
+  if (UE->is_synchronized == 1)  {
+  LOG_D( HW, "UE_thread: hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
 
-      if (start_rx_stream == 1) {
-	LOG_D(PHY,"Locking mutex_rx (IC %d)\n",UE->instance_cnt_rx);
-        if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
-          LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX thread\n" );
-          exit_fun("nothing to add");
-          return &UE_thread_retval;
-        }
+  if (start_rx_stream == 1) {
+  LOG_D(PHY,"Locking mutex_rx (IC %d)\n",UE->instance_cnt_rx);
+  if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
+  LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
 
-        int instance_cnt_rx = ++UE->instance_cnt_rx;
+  int instance_cnt_rx = ++UE->instance_cnt_rx;
 
-	LOG_D(PHY,"Unlocking mutex_rx (IC %d)\n",instance_cnt_rx);
-        if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {
-          LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX thread\n" );
-          exit_fun("nothing to add");
-          return &UE_thread_retval;
-        }
+  LOG_D(PHY,"Unlocking mutex_rx (IC %d)\n",instance_cnt_rx);
+  if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {
+  LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
 
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx);
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx);
 
 
-        if (instance_cnt_rx == 0) {
-	  LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
-          if (pthread_cond_signal(&UE->proc.cond_rx) != 0) {
-            LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" );
-            exit_fun("nothing to add");
-            return &UE_thread_retval;
-          }
+  if (instance_cnt_rx == 0) {
+  LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
+  if (pthread_cond_signal(&UE->proc.cond_rx) != 0) {
+  LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
 	  
-	  LOG_D(HW,"signalled rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
-	  if (UE->mode == loop_through_memory) {
-	    printf("Processing subframe %d",UE->slot_rx>>1);
-	    getchar();
-	  }
+  LOG_D(HW,"signalled rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
+  if (UE->mode == loop_through_memory) {
+  printf("Processing subframe %d",UE->slot_rx>>1);
+  getchar();
+  }
 
-          if (UE->mode == rx_calib_ue) {
-            if (frame == 10) {
-              LOG_D(PHY,
-                    "[SCHED][UE] Found cell with N_RB_DL %"PRIu8", PHICH CONFIG (%d,%d), Nid_cell %"PRIu16", NB_ANTENNAS_TX %"PRIu8", frequency offset "PRIi32" Hz, RSSI (digital) %hu dB, measured Gain %d dB, total_rx_gain %"PRIu32" dB, USRP rx gain %f dB\n",
-                    UE->frame_parms.N_RB_DL,
-                    UE->frame_parms.phich_config_common.phich_duration,
-                    UE->frame_parms.phich_config_common.phich_resource,
-                    UE->frame_parms.Nid_cell,
-                    UE->frame_parms.nb_antennas_tx_eNB,
-                    UE->common_vars.freq_offset,
-                    UE->measurements.rx_power_avg_dB[0],
-                    UE->measurements.rx_power_avg_dB[0] - rx_input_level_dBm,
-                    UE->rx_total_gain_dB,
-                    openair0_cfg[0].rx_gain[0]
-                   );
-              exit_fun("[HW][UE] UE in RX calibration mode, exiting");
-              return &UE_thread_retval;
-            }
-          }
-        } else {
-          LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rx);
-	  if (instance_cnt_rx > 2) {
-	    exit_fun("instance_cnt_rx > 1");
-	    return &UE_thread_retval;
-	  }
-        }
+  if (UE->mode == rx_calib_ue) {
+  if (frame == 10) {
+  LOG_D(PHY,
+  "[SCHED][UE] Found cell with N_RB_DL %"PRIu8", PHICH CONFIG (%d,%d), Nid_cell %"PRIu16", NB_ANTENNAS_TX %"PRIu8", frequency offset "PRIi32" Hz, RSSI (digital) %hu dB, measured Gain %d dB, total_rx_gain %"PRIu32" dB, USRP rx gain %f dB\n",
+  UE->frame_parms.N_RB_DL,
+  UE->frame_parms.phich_config_common.phich_duration,
+  UE->frame_parms.phich_config_common.phich_resource,
+  UE->frame_parms.Nid_cell,
+  UE->frame_parms.nb_antennas_tx_eNB,
+  UE->common_vars.freq_offset,
+  UE->measurements.rx_power_avg_dB[0],
+  UE->measurements.rx_power_avg_dB[0] - rx_input_level_dBm,
+  UE->rx_total_gain_dB,
+  openair0_cfg[0].rx_gain[0]
+  );
+  exit_fun("[HW][UE] UE in RX calibration mode, exiting");
+  return &UE_thread_retval;
+  }
+  }
+  } else {
+  LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rx);
+  if (instance_cnt_rx > 2) {
+  exit_fun("instance_cnt_rx > 1");
+  return &UE_thread_retval;
+  }
+  }
 
        
-        if ((tx_enabled==1)&&(UE->mode != loop_through_memory)) {
+  if ((tx_enabled==1)&&(UE->mode != loop_through_memory)) {
 
-	  if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
-	    LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" );
-	    exit_fun("nothing to add");
-	    return &UE_thread_retval;
-	  }
+  if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
+  LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
 
 
-          int instance_cnt_tx = ++UE->instance_cnt_tx;
+  int instance_cnt_tx = ++UE->instance_cnt_tx;
 
-          if (pthread_mutex_unlock(&UE->mutex_tx) != 0) {
-            LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX thread\n" );
-            exit_fun("nothing to add");
-            return &UE_thread_retval;
-          }
-	  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx);
+  if (pthread_mutex_unlock(&UE->mutex_tx) != 0) {
+  LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx);
 
 
-          if (instance_cnt_tx == 0) {
-            if (pthread_cond_signal(&UE->cond_tx) != 0) {
-              LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n" );
-              exit_fun("nothing to add");
-              return &UE_thread_retval;
-            }
-	    LOG_D(HW,"signalled tx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
+  if (instance_cnt_tx == 0) {
+  if (pthread_cond_signal(&UE->cond_tx) != 0) {
+  LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
+  LOG_D(HW,"signalled tx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
 
-          } else {
-            LOG_E( PHY, "[SCHED][UE] UE TX thread busy (IC %d)!!\n" );
-	    if (instance_cnt_tx>2) {
-	      exit_fun("instance_cnt_tx > 1");
-	      return &UE_thread_retval;
-	    }
-          }
-        }
+  } else {
+  LOG_E( PHY, "[SCHED][UE] UE TX thread busy (IC %d)!!\n" );
+  if (instance_cnt_tx>2) {
+  exit_fun("instance_cnt_tx > 1");
+  return &UE_thread_retval;
+  }
+  }
+  }
 
-      }
-    } else {
-      // we are not yet synchronized
-      if ((hw_subframe == 9) && (dummy_dump == 0)) {
-        // Wake up initial synch thread
-        if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
-          LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" );
-          exit_fun("nothing to add");
-          return &UE_thread_retval;
-        }
-
-        int instance_cnt_synch = ++UE->instance_cnt_synch;
-
-        if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {
-          LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE initial synch thread\n" );
-          exit_fun("nothing to add");
-          return &UE_thread_retval;
-        }
-
-        dummy_dump = 1;
-
-        if (instance_cnt_synch == 0) {
-          if (pthread_cond_signal(&UE->cond_synch) != 0) {
-            LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n" );
-            exit_fun("nothing to add");
-            return &UE_thread_retval;
-          }
-        } else {
-          LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" );
-          exit_fun("nothing to add");
-          return &UE_thread_retval;
-        }
-      }
-    }
+  }
+  } else {
+  // we are not yet synchronized
+  if ((hw_subframe == 9) && (dummy_dump == 0)) {
+  // Wake up initial synch thread
+  if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
+  LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
 
-    hw_subframe++;
-    slot+=2;
+  int instance_cnt_synch = ++UE->instance_cnt_synch;
 
-    if (hw_subframe==10) {
-      hw_subframe = 0;
-      first_rx = 1;
-      frame++;
-      slot = 1;
+  if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {
+  LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE initial synch thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
 
-      int fail = pthread_mutex_lock(&UE->mutex_synch);
-      int instance_cnt_synch = UE->instance_cnt_synch;
-      fail = fail || pthread_mutex_unlock(&UE->mutex_synch);
+  dummy_dump = 1;
 
-      if (fail) {
-        LOG_E( PHY, "[SCHED][UE] error (un-)locking mutex for UE synch\n" );
-        exit_fun("noting to add");
-        return &UE_thread_retval;
-      }
+  if (instance_cnt_synch == 0) {
+  if (pthread_cond_signal(&UE->cond_synch) != 0) {
+  LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
+  } else {
+  LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" );
+  exit_fun("nothing to add");
+  return &UE_thread_retval;
+  }
+  }
+  }
 
-      if (instance_cnt_synch < 0) {
-        // the UE_thread_synch is ready
-        if (UE->is_synchronized == 1) {
-          rx_off_diff = 0;
-          LTE_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES
-
-	  //	  LOG_I(PHY,"UE->rx_offset %d\n",UE->rx_offset);
-          if ((UE->rx_offset > RX_OFF_MAX) && (start_rx_stream == 0)) {
-            start_rx_stream=1;
-            frame=0;
-            // dump ahead in time to start of frame
-
-#ifndef USRP_DEBUG
-	    if (UE->mode != loop_through_memory) {
-	      LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset);
-	      rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
-					   &timestamp,
-					   (void**)rxdata,
-					   UE->rx_offset,
-					   UE->frame_parms.nb_antennas_rx);
-	      if (rxs != UE->rx_offset) {
-		exit_fun("problem in rx");
-		return &UE_thread_retval;
-	      }
-	      UE->rx_offset=0;
-	      tx_enabled = 1;
-	    }
-	    else
-	      rt_sleep_ns(1000000);
-#else
-            rt_sleep_ns(10000000);
-#endif
+  hw_subframe++;
+  slot+=2;
 
-          } else if ((UE->rx_offset<(FRAME_LENGTH_COMPLEX_SAMPLES/2)) &&
-		     (UE->rx_offset > RX_OFF_MIN) && 
-		     (start_rx_stream==1) && 
-		     (rx_correction_timer == 0)) {
-            rx_off_diff = -UE->rx_offset + RX_OFF_MIN;
-	    LOG_D(PHY,"UE->rx_offset %d > %d, diff %d\n",UE->rx_offset,RX_OFF_MIN,rx_off_diff);
-            rx_correction_timer = 5;
-          } else if ((UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && 
-		     (UE->rx_offset < (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN)) &&
-		     (start_rx_stream==1) && 
-		     (rx_correction_timer == 0)) {   // moving to the left so drop rx_off_diff samples
-            rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES - RX_OFF_MIN - UE->rx_offset;
-	    LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff);
+  if (hw_subframe==10) {
+  hw_subframe = 0;
+  first_rx = 1;
+  frame++;
+  slot = 1;
 
-            rx_correction_timer = 5;
-          }
+  int fail = pthread_mutex_lock(&UE->mutex_synch);
+  int instance_cnt_synch = UE->instance_cnt_synch;
+  fail = fail || pthread_mutex_unlock(&UE->mutex_synch);
 
-          if (rx_correction_timer>0)
-            rx_correction_timer--;
-        }
+  if (fail) {
+  LOG_E( PHY, "[SCHED][UE] error (un-)locking mutex for UE synch\n" );
+  exit_fun("noting to add");
+  return &UE_thread_retval;
+  }
 
-        dummy_dump=0;
-      }
-    }
+  if (instance_cnt_synch < 0) {
+  // the UE_thread_synch is ready
+  if (UE->is_synchronized == 1) {
+  rx_off_diff = 0;
+  LTE_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES
+
+  //	  LOG_I(PHY,"UE->rx_offset %d\n",UE->rx_offset);
+  if ((UE->rx_offset > RX_OFF_MAX) && (start_rx_stream == 0)) {
+  start_rx_stream=1;
+  frame=0;
+  // dump ahead in time to start of frame
+
+  #ifndef USRP_DEBUG
+  if (UE->mode != loop_through_memory) {
+  LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset);
+  rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
+  &timestamp,
+  (void**)rxdata,
+  UE->rx_offset,
+  UE->frame_parms.nb_antennas_rx);
+  if (rxs != UE->rx_offset) {
+  exit_fun("problem in rx");
+  return &UE_thread_retval;
+  }
+  UE->rx_offset=0;
+  tx_enabled = 1;
+  }
+  else
+  rt_sleep_ns(1000000);
+  #else
+  rt_sleep_ns(10000000);
+  #endif
 
-#if defined(ENABLE_ITTI)
-    itti_update_lte_time(frame, slot);
-#endif
+  } else if ((UE->rx_offset<(FRAME_LENGTH_COMPLEX_SAMPLES/2)) &&
+  (UE->rx_offset > RX_OFF_MIN) && 
+  (start_rx_stream==1) && 
+  (rx_correction_timer == 0)) {
+  rx_off_diff = -UE->rx_offset + RX_OFF_MIN;
+  LOG_D(PHY,"UE->rx_offset %d > %d, diff %d\n",UE->rx_offset,RX_OFF_MIN,rx_off_diff);
+  rx_correction_timer = 5;
+  } else if ((UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && 
+  (UE->rx_offset < (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN)) &&
+  (start_rx_stream==1) && 
+  (rx_correction_timer == 0)) {   // moving to the left so drop rx_off_diff samples
+  rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES - RX_OFF_MIN - UE->rx_offset;
+  LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff);
+
+  rx_correction_timer = 5;
+  }
+
+  if (rx_correction_timer>0)
+  rx_correction_timer--;
+  }
+
+  dummy_dump=0;
+  }
+  }
+
+  #if defined(ENABLE_ITTI)
+  itti_update_lte_time(frame, slot);
+  #endif
   }
 
   return &UE_thread_retval;
-}
+  }
 
 */
 
@@ -1827,13 +1841,13 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg)
     }
     
     /*
-    if (frame_parms->frame_type == TDD) {
+      if (frame_parms->frame_type == TDD) {
       if (frame_parms->N_RB_DL == 100)
-        N_TA_offset = 624;
+      N_TA_offset = 624;
       else if (frame_parms->N_RB_DL == 50)
-        N_TA_offset = 624/2;
+      N_TA_offset = 624/2;
       else if (frame_parms->N_RB_DL == 25)
-        N_TA_offset = 624/4;
+      N_TA_offset = 624/4;
       }
     */
     
diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c
index 905ee199322..31c292dee00 100644
--- a/targets/SIMU/USER/channel_sim.c
+++ b/targets/SIMU/USER/channel_sim.c
@@ -60,7 +60,7 @@
 #include "oaisim.h"
 
 #define RF
-//#define DEBUG_SIM
+#define DEBUG_SIM
 
 int number_rb_ul;
 int first_rbUL ;
@@ -77,10 +77,15 @@ int UE_output_mask[NUMBER_OF_RU_MAX];
 pthread_mutex_t RU_output_mutex[NUMBER_OF_UE_MAX];
 pthread_mutex_t UE_output_mutex[NUMBER_OF_RU_MAX];
 
+double ru_amp[NUMBER_OF_RU_MAX];
+
 void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],
 	       node_desc_t *enb_data[NUMBER_OF_RU_MAX],
 	       node_desc_t *ue_data[NUMBER_OF_UE_MAX],
-	       uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *ue_frame_parms,
+	       uint16_t subframe,
+	       uint16_t offset,
+	       uint16_t length,
+	       uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *ue_frame_parms,
 	       uint8_t UE_id,
 	       int CC_id)
 {
@@ -237,22 +242,26 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
       txdata = RC.ru[ru_id]->common.txdata;
       frame_parms = &RC.ru[ru_id]->frame_parms;
 
-      sf_offset = subframe*frame_parms->samples_per_tti;
+      sf_offset = (subframe*frame_parms->samples_per_tti) + offset;
+      LOG_D(EMU,"TXPATH: RU %d : DL_sig reading TX for subframe %d (sf_offset %d, length %d) from %p\n",ru_id,subframe,sf_offset,length,txdata[0]+sf_offset); 
+      int length_meas = frame_parms->ofdm_symbol_size;
       tx_pwr = dac_fixed_gain(s_re,
                               s_im,
                               txdata,
                               sf_offset,
                               nb_antennas_tx,
-                              frame_parms->samples_per_tti,
+                              length,
                               sf_offset,
-                              frame_parms->ofdm_symbol_size,
+                              length_meas,
                               14,
                               frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE
+			      0,
+			      &ru_amp[ru_id],
                               frame_parms->N_RB_DL*12);
 
 #ifdef DEBUG_SIM
       LOG_D(PHY,"[SIM][DL] subframe %d: txp (time) %d dB\n",
-	    subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],frame_parms->samples_per_tti)));
+	    subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],length_meas)));
 	    
       LOG_D(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n",
             ru_id,CC_id,
@@ -261,9 +270,13 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
             subframe);
 
 #endif
+      tx_pwr = signal_energy_fp(s_re,s_im,nb_antennas_tx,
+				length<length_meas?length:length_meas,
+                                0)/(12.0*frame_parms->N_RB_DL);
+ 
       //RU2UE[eNB_id][UE_id]->path_loss_dB = 0;
       multipath_channel(RU2UE[ru_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0,
-                        frame_parms->samples_per_tti,hold_channel);
+                        length,hold_channel);
 #ifdef DEBUG_SIM
       rx_pwr = signal_energy_fp2(RU2UE[ru_id][UE_id][CC_id]->ch[0],
                                  RU2UE[ru_id][UE_id][CC_id]->channel_length)*RU2UE[ru_id][UE_id][CC_id]->channel_length;
@@ -278,7 +291,7 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
 
 #endif
 
-      LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d (CCid %d): tx_power %.1f dBm/RE, path_loss %1.f dB\n",
+      LOG_D(OCM,"[SIM][DL] Channel RU %d => UE %d (CCid %d): tx_power %.1f dBm/RE, path_loss %1.f dB\n",
             ru_id,UE_id,CC_id,
             (double)frame_parms->pdsch_config_common.referenceSignalPower,
             //         enb_data[eNB_id]->tx_power_dBm,
@@ -286,11 +299,15 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
 
 #ifdef DEBUG_SIM
       rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,
-                                frame_parms->ofdm_symbol_size,
+                                length<length_meas?length:length_meas,
                                 0)/(12.0*frame_parms->N_RB_DL);
-      LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for subframe %d\n",UE_id,
-            10*log10(rx_pwr),
-            10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),subframe);
+     LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI,tx %f dB)for subframe %d (length %d)\n",UE_id,
+	   10*log10(rx_pwr),
+	   10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),
+	   10*log10(tx_pwr),subframe,
+	   length<length_meas?length:length_meas);
+
+      
       LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (noise) -132 dBm/RE (N0fs = %.1f dBm, N0B = %.1f dBm) for subframe %d\n",
             UE_id,
             10*log10(RU2UE[ru_id][UE_id][CC_id]->sampling_rate*1e6)-174,
@@ -311,16 +328,16 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
       rf_rx_simple(r_re0,
                    r_im0,
                    nb_antennas_rx,
-                   frame_parms->samples_per_tti,
+                   length,
                    1e3/RU2UE[ru_id][UE_id][CC_id]->sampling_rate,  // sampling time (ns)
                    (double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227);   // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
 
 #ifdef DEBUG_SIM
       rx_pwr = signal_energy_fp(r_re0,r_im0,
                                 nb_antennas_rx,
-                                frame_parms->ofdm_symbol_size,
+                                length<length_meas?length:length_meas,
                                 0)/(12.0*frame_parms->N_RB_DL);
-      LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dBm/RE for subframe %d\n",
+      LOG_D(OCM,"[SIM][DL] UE %d : ADC in (RU %d) %f dBm/RE for subframe %d\n",
             UE_id,ru_id,
             10*log10(rx_pwr),subframe);
 #endif
@@ -341,12 +358,12 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
 	double *r_im_p[2] = {r_im_DL[ru_id][0],r_im_DL[ru_id][1]};
 
 #ifdef DEBUG_SIM
-	rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->ofdm_symbol_size,0)/(12.0*frame_parms->N_RB_DL);
-	LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for subframe %d\n",UE_id,10*log10(rx_pwr),subframe);
+	rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,length<length_meas?length:length_meas,0)/(12.0*frame_parms->N_RB_DL);
+	LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm/RE for subframe %d\n",UE_id,10*log10(rx_pwr),subframe);
 #endif
 	
 	rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata;
-	sf_offset = subframe*frame_parms->samples_per_tti;
+	sf_offset = (subframe*frame_parms->samples_per_tti)+offset;
 
 
 	adc(r_re_p,
@@ -355,12 +372,13 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM
 	    sf_offset,
 	    rxdata,
 	    nb_antennas_rx,
-	    frame_parms->samples_per_tti,
+	    length,
 	    12);
 	
 #ifdef DEBUG_SIM
-	rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL);
-	LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata);
+	rx_pwr2 = signal_energy(rxdata[0]+sf_offset,length<length_meas?length:length_meas)/(12.0*frame_parms->N_RB_DL);
+	LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p, length %d\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata,length<length_meas?length:length_meas);
+	LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB for subframe %d\n",UE_id,10*log10((double)rx_pwr2*12*frame_parms->N_RB_DL) ,subframe);
 #else
 	UNUSED_VARIABLE(rx_pwr2);
 	UNUSED_VARIABLE(tx_pwr);
@@ -477,7 +495,7 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
     // Compute RX signal for eNB = eNB_id
     for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
       
-      txdata = RC.ru[ru_id]->common.txdata;
+      txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata;
       AssertFatal(txdata != NULL,"txdata is null\n");
       sf_offset = subframe*frame_parms->samples_per_tti;
       if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe] +
@@ -499,10 +517,12 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
 				frame_parms->ofdm_symbol_size,
 				14,
 				(double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
+				1,
+				NULL,
 				PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]);  // This make the previous argument the total power
 	LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for subframe %d (sf_offset %d)\n",
 	      UE_id,
-	      10*log10(tx_pwr),
+	      10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]),
 	      PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe],
 	      PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe],
 	      subframe,sf_offset);
@@ -520,10 +540,17 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
 	      UE2RU[UE_id][ru_id][CC_id]->path_loss_dB);
 
 	rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0);
-	LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for subframe %d, sptti %d\n",
-	      ru_id,10*log10(rx_pwr),rx_pwr,subframe,frame_parms->samples_per_tti);
-	
-	
+	LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (tx_pwr - PL %f) for subframe %d, sptti %d\n",
+	      ru_id,nb_antennas_rx,UE2RU[UE_id][ru_id][CC_id]->nb_rx,10*log10(rx_pwr),10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])+UE2RU[UE_id][ru_id][CC_id]->path_loss_dB,subframe,frame_parms->samples_per_tti);
+	/*	
+	if (abs(10*log10(rx_pwr)-10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])-UE2RU[UE_id][ru_id][CC_id]->path_loss_dB)>3) {
+	  write_output("txsig_re.m","s_re",s_re[0],frame_parms->samples_per_tti,1,7);
+	  write_output("txsig_im.m","s_im",s_im[0],frame_parms->samples_per_tti,1,7);
+	  write_output("rxsig_re.m","r_re",r_re0[0],frame_parms->samples_per_tti,1,7);
+	  write_output("rxsig_im.m","r_im",r_im0[0],frame_parms->samples_per_tti,1,7);
+	  exit(-1);
+	  }*/
+
 	if (UE2RU[UE_id][ru_id][CC_id]->first_run == 1)
 	  UE2RU[UE_id][ru_id][CC_id]->first_run = 0;
 	
@@ -542,6 +569,10 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
     double *r_re_p[2] = {r_re_UL[ru_id][0],r_re_UL[ru_id][1]};
     double *r_im_p[2] = {r_im_UL[ru_id][0],r_im_UL[ru_id][1]};
 
+    rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0);
+    LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (before RF) for subframe %d, gain %f\n",
+	  ru_id,nb_antennas_rx,nb_antennas_rx,10*log10(rx_pwr),subframe,
+	  (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227);
     rf_rx_simple(r_re_p,
 		 r_im_p,
 		 nb_antennas_rx,
@@ -550,8 +581,9 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
 		 (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227);   // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
     
 #ifdef DEBUG_SIM
-    rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL);
-    LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d\n",10*log10(rx_pwr),subframe);
+    rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0);//*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL;
+    LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d (rx_gain %f)\n",10*log10(rx_pwr),subframe,
+	  (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx);
 #endif
     
     rxdata = RC.ru[ru_id]->common.rxdata;
@@ -569,7 +601,7 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
     
 #ifdef DEBUG_SIM
     rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->samples_per_tti)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL);
-    LOG_D(OCM,"[SIM][UL] RU %d rx_pwr (ADC out) %f dB (%d) for subframe %d (offset %d)\n",ru_id,10*log10((double)rx_pwr2),rx_pwr2,subframe,sf_offset);
+    LOG_D(OCM,"[SIM][UL] RU %d rx_pwr (ADC out) %f dB (%d) for subframe %d (offset %d) = %p\n",ru_id,10*log10((double)rx_pwr2),rx_pwr2,subframe,sf_offset,rxdata[0]+sf_offset);
 #else
     UNUSED_VARIABLE(tx_pwr);
     UNUSED_VARIABLE(rx_pwr);
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index 999e2dd8547..12e1352eb2b 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -705,7 +705,6 @@ l2l1_task (void *args_p)
 
     for (sf = 0; sf < 10; sf++) {
       LOG_D(EMU,"************************* Subframe %d\n",sf);
-
       start_meas (&oaisim_stats_f);
 
       wait_for_slot_isr ();
@@ -732,12 +731,13 @@ l2l1_task (void *args_p)
 
         CC_id=0;
         int all_done=0;
+
         while (all_done==0) {
           pthread_mutex_lock(&subframe_mutex);
           int subframe_ru_mask_local = subframe_ru_mask;
           int subframe_UE_mask_local  = subframe_UE_mask;
           pthread_mutex_unlock(&subframe_mutex);
-          LOG_D(EMU,"Frame %d, Subframe %d: Checking masks %x,%x\n",frame,sf,subframe_ru_mask,subframe_UE_mask);
+          LOG_D(EMU,"Frame %d, Subframe %d: Checking masks %x,%x\n",frame,sf,subframe_ru_mask_local,subframe_UE_mask_local);
           if ((subframe_ru_mask_local == ((1<<NB_RU)-1)) &&
               (subframe_UE_mask_local == ((1<<NB_UE_INST)-1)))
              all_done=1;
@@ -745,6 +745,7 @@ l2l1_task (void *args_p)
 	    usleep(1500);
         }
 
+
         //clear subframe masks for next round
         pthread_mutex_lock(&subframe_mutex);
         subframe_ru_mask=0;
@@ -761,9 +762,11 @@ l2l1_task (void *args_p)
 	*/
 	for (ru_id=0;ru_id<NB_RU;ru_id++) {
 	  current_ru_rx_timestamp[ru_id][CC_id] += RC.ru[ru_id]->frame_parms.samples_per_tti;
+	  LOG_D(EMU,"RU %d/%d: TS %llu\n",ru_id,CC_id,current_ru_rx_timestamp[ru_id][CC_id]);
         }
         for (UE_inst = 0; UE_inst<NB_UE_INST;UE_inst++) {
 	  current_UE_rx_timestamp[UE_inst][CC_id] += PHY_vars_UE_g[UE_inst][CC_id]->frame_parms.samples_per_tti;
+	  LOG_D(EMU,"UE %d/%d: TS %llu\n",UE_id,CC_id,current_UE_rx_timestamp[UE_inst][CC_id]);
         }
 
 
@@ -817,14 +820,14 @@ l2l1_task (void *args_p)
               if(eNB_avg_thr)
                 fprintf(eNB_avg_thr,"%d %d\n",RC.eNB[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx,
                         (RC.eNB[eNB_inst][0]->total_system_throughput)/((RC.eNB[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx+1)*10));
-
+	    /*
             if (eNB_stats[eNB_inst]) {
               len = dump_eNB_stats(RC.eNB[eNB_inst][0], stats_buffer, 0);
               rewind (eNB_stats[eNB_inst]);
               fwrite (stats_buffer, 1, len, eNB_stats[eNB_inst]);
               fflush(eNB_stats[eNB_inst]);
             }
-
+	    */
 #ifdef OPENAIR2
 
             if (eNB_l2_stats) {
@@ -1214,6 +1217,7 @@ void wait_RUs() {
   // copy frame parameters from RU to UEs
   for (i=0;i<NB_UE_INST;i++) {
     PHY_vars_UE_g[i][0]->frame_parms.N_RB_DL              = RC.ru[0]->frame_parms.N_RB_DL;
+    PHY_vars_UE_g[i][0]->frame_parms.N_RB_UL              = RC.ru[0]->frame_parms.N_RB_UL;
     PHY_vars_UE_g[i][0]->frame_parms.nb_antennas_tx       = 1;
     PHY_vars_UE_g[i][0]->frame_parms.nb_antennas_rx       = 1;
     // set initially to 2, it will be revised after initial synchronization
@@ -1229,7 +1233,7 @@ void wait_RUs() {
 	  PHY_vars_UE_g[i][0]->frame_parms.ul_CarrierFreq,
 	  PHY_vars_UE_g[i][0]->frame_parms.eutra_band);
 
-    current_UE_rx_timestamp[i][0] = RC.ru[0]->frame_parms.samples_per_tti;
+    current_UE_rx_timestamp[i][0] = RC.ru[0]->frame_parms.samples_per_tti + RC.ru[0]->frame_parms.ofdm_symbol_size + RC.ru[0]->frame_parms.nb_prefix_samples0;
 
   }
   
diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h
index d405e0493bc..adf4b3c1b72 100644
--- a/targets/SIMU/USER/oaisim.h
+++ b/targets/SIMU/USER/oaisim.h
@@ -48,7 +48,11 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM
 	       uint32_t frame,int eNB_id,uint8_t CC_id);
 
 void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],
-               node_desc_t *enb_data[NUMBER_OF_RU_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id);
+               node_desc_t *enb_data[NUMBER_OF_RU_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],
+	       uint16_t subframe,
+	       uint16_t offset,
+	       uint16_t length,
+	       uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id);
 
 void init_ue(node_desc_t  *ue_data, UE_Antenna ue_ant);//Abstraction changes
 void init_enb(node_desc_t  *enb_data, eNB_Antenna enb_ant);//Abstraction changes
diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c
index f9959ebd49c..c50f171923a 100644
--- a/targets/SIMU/USER/oaisim_functions.c
+++ b/targets/SIMU/USER/oaisim_functions.c
@@ -1064,10 +1064,6 @@ int ru_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
       usleep(500);
     }
 
-    // tell top-level we are busy
-    pthread_mutex_lock(&subframe_mutex);
-    subframe_ru_mask|=(1<<ru_id);
-    pthread_mutex_unlock(&subframe_mutex); 
     
     subframe = (last_ru_rx_timestamp[ru_id][CC_id]/RC.ru[ru_id]->frame_parms.samples_per_tti)%10;
     LOG_D(EMU,"RU_trx_read generating UL subframe %d (Ts %llu, current TS %llu)\n",
@@ -1097,13 +1093,13 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
 
   int UE_id = device->Mod_id;
   int CC_id  = device->CC_id;
-  int subframe;
+  int subframe,new_subframe;
   int sample_count=0;
   int read_size;
 
   *ptimestamp = last_UE_rx_timestamp[UE_id][CC_id];
 
-  LOG_D(EMU,"UE_trx_read nsamps %d TS(%llu,%llu) antenna %d\n",nsamps,
+  LOG_D(EMU,"[TXPATH]UE_trx_read nsamps %d TS %llu (%llu) antenna %d\n",nsamps,
         (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id],
         (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id],
 	cc);
@@ -1116,29 +1112,23 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
   while (sample_count<nsamps) {
     while (current_UE_rx_timestamp[UE_id][CC_id] < 
 	   (last_UE_rx_timestamp[UE_id][CC_id]+read_size)) {
-      LOG_D(EMU,"UE_trx_read : current TS %d, last TS %d, sleeping\n",current_UE_rx_timestamp[UE_id][CC_id],last_UE_rx_timestamp[UE_id][CC_id]);
+      LOG_D(EMU,"[TXPATH]UE_trx_read : current TS %d, last TS %d, sleeping\n",current_UE_rx_timestamp[UE_id][CC_id],last_UE_rx_timestamp[UE_id][CC_id]);
 
       usleep(500);
     }
 
     //    LOG_D(EMU,"UE_trx_read : current TS %d, last TS %d, sleeping\n",current_UE_rx_timestamp[UE_id][CC_id],last_UE_rx_timestamp[UE_id][CC_id]);
-      
-    // tell top-level we are busy 
-    pthread_mutex_lock(&subframe_mutex);
-    subframe_UE_mask|=(1<<UE_id);
-    pthread_mutex_unlock(&subframe_mutex);
-
-
-    // otherwise we have one subframe here so generate the received signal
+    // if we cross a subframe-boundary
     subframe = (last_UE_rx_timestamp[UE_id][CC_id]/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10;
-    if ((last_UE_rx_timestamp[UE_id][CC_id]%PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti) > 0)
-      subframe++;
+    new_subframe = ((last_UE_rx_timestamp[UE_id][CC_id]+read_size)/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10;
+    if (new_subframe!=subframe) {
+      // tell top-level we are busy 
+      pthread_mutex_lock(&subframe_mutex);
+      subframe_UE_mask|=(1<<UE_id);
+      LOG_D(EMU,"Setting UE_id %d mask to busy (%d)\n",UE_id,subframe_UE_mask);
+      pthread_mutex_unlock(&subframe_mutex);
 
-    last_UE_rx_timestamp[UE_id][CC_id] += read_size;
-    sample_count += read_size;
- 
-    if (subframe > 9) 
-      return(nsamps);
+    }
 
     LOG_D(PHY,"UE_trx_read generating DL subframe %d (Ts %llu, current TS %llu)\n",
 	  subframe,(unsigned long long)*ptimestamp,
@@ -1147,11 +1137,24 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
 	      enb_data,
 	      ue_data,
 	      subframe,
+	      last_UE_rx_timestamp[UE_id][CC_id]%PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti,
+	      nsamps,
 	      0, //abstraction_flag,
 	      &PHY_vars_UE_g[UE_id][CC_id]->frame_parms,
 	      UE_id,
 	      CC_id);
 
+    LOG_D(EMU,"[TXPATH]UE_trx_read @ TS %llu (%llu)=> frame %d, subframe %d\n",
+	  (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id],
+	  (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id],
+	  ((unsigned long long)last_UE_rx_timestamp[UE_id][CC_id]/(PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti*10))&1023,
+	  subframe);
+
+    last_UE_rx_timestamp[UE_id][CC_id] += read_size;
+    sample_count += read_size;
+ 
+
+
 
   }
 
@@ -1159,8 +1162,34 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void **
   return(nsamps);
 }
 
+extern double ru_amp[NUMBER_OF_RU_MAX];
+
 int ru_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) {
 
+  int ru_id = device->Mod_id;
+
+  LTE_DL_FRAME_PARMS *frame_parms = &RC.ru[ru_id]->frame_parms;
+
+  pthread_mutex_lock(&subframe_mutex);
+  LOG_D(EMU,"[TXPATH] ru_trx_write: RU %d mask %d\n",ru_id,subframe_ru_mask);
+  pthread_mutex_unlock(&subframe_mutex); 
+
+  // compute amplitude of TX signal from first symbol in subframe
+  // note: assumes that the packet is an entire subframe 
+
+  ru_amp[ru_id] = 0;
+  for (int aa=0; aa<RC.ru[ru_id]->nb_tx; aa++) {
+    ru_amp[ru_id] += (double)signal_energy((int32_t*)buff[aa],frame_parms->ofdm_symbol_size)/(12*frame_parms->N_RB_DL);
+  }
+  ru_amp[ru_id] = sqrt(ru_amp[ru_id]);
+
+  LOG_D(EMU,"Setting amp for RU %d to %f (%d)\n",ru_id,ru_amp[ru_id], dB_fixed((double)signal_energy((int32_t*)buff[0],frame_parms->ofdm_symbol_size)));
+  // tell top-level we are done
+  pthread_mutex_lock(&subframe_mutex);
+  subframe_ru_mask|=(1<<ru_id);
+  LOG_D(EMU,"Setting RU %d to busy\n",ru_id);
+  pthread_mutex_unlock(&subframe_mutex);
+
   return(nsamps);
 }
 
-- 
GitLab