From 98a9469f5975028f16fdb5f98a9c55777b6d05b2 Mon Sep 17 00:00:00 2001
From: Navid Nikaein <navid.nikaein@eurecom.fr>
Date: Thu, 27 Feb 2014 12:27:58 +0000
Subject: [PATCH] * add oaisim performance profiler OPP (enabled with option q
 ) * fix the bug for IP connectivity when more than 1 UE is connected (test
 with iperf: ok) * set target ul/dl mcs in the eNB scheduler to hardwire the
 desired MCS (option t for UL and m for DL) * add the code related to
 abstraction from http://svn.eurecom.fr/openairsvn/openair4G/tags/asilomar2013
 * cleanup the code * pre-ci passed for all except for eMBMS

git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5093 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
 openair1/PHY/CODING/defs.h                    |    2 +-
 openair1/PHY/INIT/lte_init.c                  |   11 +-
 openair1/PHY/LTE_ESTIMATION/adjust_gain.c     |    3 +-
 openair1/PHY/LTE_TRANSPORT/dci.c              |    6 +-
 openair1/PHY/LTE_TRANSPORT/dci_tools.c        |    6 +-
 openair1/PHY/LTE_TRANSPORT/dlsch_coding.c     |   29 +-
 openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c   |  100 +-
 openair1/PHY/LTE_TRANSPORT/pbch.c             |   36 +-
 openair1/PHY/LTE_TRANSPORT/prach.c            |    4 +
 openair1/PHY/LTE_TRANSPORT/print_stats.c      |   10 +-
 openair1/PHY/LTE_TRANSPORT/ulsch_coding.c     |    4 +-
 .../PHY/LTE_TRANSPORT/ulsch_demodulation.c    |    4 +-
 openair1/PHY/Makefile.inc                     |    2 +
 openair1/PHY/TOOLS/dB_routines.c              |    4 +-
 openair1/PHY/TOOLS/defs.h                     |    2 +
 openair1/PHY/TOOLS/file_output.c              |    3 +-
 openair1/PHY/TOOLS/lut.c                      |   25 +
 openair1/PHY/TOOLS/time_meas.c                |   34 +
 openair1/PHY/TOOLS/time_meas.h                |   73 +-
 openair1/PHY/defs.h                           |   21 +-
 openair1/PHY/extern.h                         |    2 +-
 openair1/PHY/impl_defs_top.h                  |    7 +-
 openair1/PHY/vars.h                           |    8 +-
 openair1/SCHED/phy_procedures_lte_eNb.c       | 5080 +++++++++--------
 openair1/SCHED/phy_procedures_lte_ue.c        |   76 +-
 .../bler_tx1_chan18_nrx1_mcs0.csv             |   75 +
 .../bler_tx1_chan18_nrx1_mcs1.csv             |   72 +
 .../bler_tx1_chan18_nrx1_mcs10.csv            |   83 +
 .../bler_tx1_chan18_nrx1_mcs11.csv            |   40 +
 .../bler_tx1_chan18_nrx1_mcs12.csv            |   33 +
 .../bler_tx1_chan18_nrx1_mcs13.csv            |   32 +
 .../bler_tx1_chan18_nrx1_mcs14.csv            |   61 +
 .../bler_tx1_chan18_nrx1_mcs15.csv            |   48 +
 .../bler_tx1_chan18_nrx1_mcs16.csv            |   50 +
 .../bler_tx1_chan18_nrx1_mcs17.csv            |   55 +
 .../bler_tx1_chan18_nrx1_mcs18.csv            |   38 +
 .../bler_tx1_chan18_nrx1_mcs19.csv            |   43 +
 .../bler_tx1_chan18_nrx1_mcs2.csv             |   66 +
 .../bler_tx1_chan18_nrx1_mcs20.csv            |   41 +
 .../bler_tx1_chan18_nrx1_mcs21.csv            |   40 +
 .../bler_tx1_chan18_nrx1_mcs22.csv            |   29 +
 .../bler_tx1_chan18_nrx1_mcs23.csv            |   31 +
 .../bler_tx1_chan18_nrx1_mcs24.csv            |   29 +
 .../bler_tx1_chan18_nrx1_mcs25.csv            |   25 +
 .../bler_tx1_chan18_nrx1_mcs26.csv            |   24 +
 .../bler_tx1_chan18_nrx1_mcs27.csv            |   21 +
 .../bler_tx1_chan18_nrx1_mcs3.csv             |   64 +
 .../bler_tx1_chan18_nrx1_mcs4.csv             |   63 +
 .../bler_tx1_chan18_nrx1_mcs5.csv             |   54 +
 .../bler_tx1_chan18_nrx1_mcs6.csv             |   57 +
 .../bler_tx1_chan18_nrx1_mcs7.csv             |   45 +
 .../bler_tx1_chan18_nrx1_mcs8.csv             |   33 +
 .../bler_tx1_chan18_nrx1_mcs9.csv             |   25 +
 .../BLER_SIMULATIONS/AWGN/eval_results.m      |  103 +
 openair1/SIMULATION/LTE_PHY/dlsim.c           |   13 +-
 openair1/SIMULATION/LTE_PHY/ulsim.c           |    8 +-
 openair1/SIMULATION/RF/rf.c                   |   91 +-
 openair1/SIMULATION/TOOLS/abstraction.c       |   35 +-
 openair1/SIMULATION/TOOLS/defs.h              |   14 +-
 openair1/SIMULATION/TOOLS/multipath_channel.c |  379 +-
 openair1/SIMULATION/TOOLS/random_channel.c    |  102 +-
 openair2/LAYER2/MAC/defs.h                    |   20 +
 openair2/LAYER2/MAC/eNB_scheduler.c           |   78 +-
 openair2/LAYER2/MAC/rar_tools.c               |    6 +-
 openair2/LAYER2/MAC/ue_procedures.c           |   66 +-
 openair2/LAYER2/PDCP_v10.1.0/pdcp.c           |   98 +-
 openair2/LAYER2/PDCP_v10.1.0/pdcp.h           |   14 +
 .../RLC/UM_v9.3.0/rlc_um_control_primitives.c |   26 +-
 openair2/LAYER2/RLC/rlc.c                     |   40 +-
 openair2/LAYER2/RLC/rlc_rrc.c                 |   74 +-
 openair2/RRC/LITE/rrc_common.c                |   22 +-
 openair2/UTIL/LOG/vcd_signal_dumper.h         |    1 +
 openair2/UTIL/OCG/OCG.h                       |   13 +-
 targets/RTAI/USER/lte-softmodem.c             |    7 +-
 targets/SIMU/USER/Makefile                    |   12 +-
 targets/SIMU/USER/channel_sim.c               |  156 +-
 targets/SIMU/USER/oaisim.c                    |  368 +-
 targets/SIMU/USER/oaisim.h                    |   12 +
 targets/SIMU/USER/oaisim_config.c             |    2 +
 targets/SIMU/USER/oaisim_functions.c          |   37 +-
 targets/SIMU/USER/oaisim_functions.h          |    2 +
 targets/SIMU/USER/sinr_sim.c                  |   23 +-
 targets/TEST/OAI/case02.py                    |    6 +-
 targets/TEST/OAI/case03.py                    |    9 +-
 84 files changed, 5338 insertions(+), 3328 deletions(-)
 create mode 100644 openair1/PHY/TOOLS/lut.c
 create mode 100644 openair1/PHY/TOOLS/time_meas.c
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv
 create mode 100644 openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m

diff --git a/openair1/PHY/CODING/defs.h b/openair1/PHY/CODING/defs.h
index 1ddc73822ec..b89f1343c18 100644
--- a/openair1/PHY/CODING/defs.h
+++ b/openair1/PHY/CODING/defs.h
@@ -373,7 +373,7 @@ run in segments with final trace back after last segment.
 @param traceback flag to indicate that traceback should be performed*/
 void phy_viterbi_dot11_sse2(int8_t *y,uint8_t *decoded_bytes,uint16_t n);
 
-/*!\fn void phy_viterbi_lte_sse2(s8 *y, u8 *decoded_bytes, u16 n)
+/*!\fn void phy_viterbi_lte_sse2(int8_t *y, uint8_t *decoded_bytes, uint16_t n)
 \brief This routine performs a SIMD optmized Viterbi decoder for the LTE 64-state tail-biting convolutional code.
 @param y Pointer to soft input (coded on 8-bits but should be limited to 4-bit precision to avoid overflow)
 @param decoded_bytes Pointer to decoded output
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index 90cafbf2537..32ea176f798 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -582,7 +582,16 @@ void phy_config_dedicated_ue(u8 Mod_id,u8 CH_index,
 
   PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[Mod_id];
 
-  
+  phy_vars_ue->total_TBS[CH_index]=0;
+  phy_vars_ue->total_TBS_last[CH_index]=0;
+  phy_vars_ue->bitrate[CH_index]=0;
+  phy_vars_ue->total_received_bits[CH_index]=0;
+  phy_vars_ue->dlsch_errors[CH_index]=0;
+  phy_vars_ue->dlsch_errors_last[CH_index]=0;
+  phy_vars_ue->dlsch_received[CH_index]=0;
+  phy_vars_ue->dlsch_received_last[CH_index]=0;
+  phy_vars_ue->dlsch_fer[CH_index]=0;
+ 
 
     
     if (physicalConfigDedicated) {
diff --git a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
index bf812c9e61f..8dae8381a20 100644
--- a/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
+++ b/openair1/PHY/LTE_ESTIMATION/adjust_gain.c
@@ -154,10 +154,11 @@ phy_adjust_gain (PHY_VARS_UE *phy_vars_ue, u8 eNB_id) {
 #endif
 
 #ifdef DEBUG_PHY
-  if ((phy_vars_ue->frame%100==0) || (phy_vars_ue->frame < 10))
+      /*  if ((phy_vars_ue->frame%100==0) || (phy_vars_ue->frame < 10))
     msg("[PHY][ADJUST_GAIN] frame %d,  rx_power = %d, rx_power_fil = %d, rx_power_fil_dB = %d, coef=%d, ncoef=%d, rx_total_gain_dB = %d (%d,%d,%d)\n",
         phy_vars_ue->frame,rx_power,rx_power_fil,rx_power_fil_dB,coef,ncoef,phy_vars_ue->rx_total_gain_dB,
 	TARGET_RX_POWER,MAX_RF_GAIN,MIN_RF_GAIN);
+      */
 #endif //DEBUG_PHY
 	
 }
diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c
index db7d798abf4..261e22f3134 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci.c
@@ -45,6 +45,7 @@
 #include "PHY/defs.h"
 #include "PHY/extern.h"
 #include "SCHED/defs.h"
+#include "SIMULATION/TOOLS/defs.h" // for taus 
 #include <emmintrin.h>
 #include <xmmintrin.h>
 #ifdef __SSE3__
@@ -2062,9 +2063,10 @@ u8 generate_dci_top(u8 num_ue_spec_dci,
   y[1] = &yseq1[0];
 
   // reset all bits to <NIL>, here we set <NIL> elements as 2
-  memset(e, 2, DCI_BITS_MAX);
+  //memset(e, 2, DCI_BITS_MAX);
   // here we interpred NIL as a random QPSK sequence. That makes power estimation easier.
-  //for (i=0;i<DCI_BITS_MAX;i++) e[i]=taus()&1;
+  for (i=0;i<DCI_BITS_MAX;i++) 
+    e[i]=taus()&1;
   e_ptr = e;
 
   // generate DCIs in order of decreasing aggregation level, then common/ue spec
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 1056d2b9acd..c2616b0fcbf 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -2636,7 +2636,7 @@ uint16_t quantize_wideband_pmi(PHY_MEASUREMENTS *meas,uint8_t eNB_id) {
   }
 */
  
-uint8_t sinr2cqi(int sinr,uint8_t trans_mode) {
+uint8_t sinr2cqi(double sinr,uint8_t trans_mode) {
   // int flag_LA=0;
 
   if(flag_LA==0){
@@ -2751,7 +2751,9 @@ void fill_CQI(void *o,UCI_format_t uci_format,PHY_MEASUREMENTS *meas,uint8_t eNB
   if(flag_LA==1)
     sinr_tmp = sinr_eff;
   else
-    sinr_tmp = meas->wideband_cqi_avg[eNB_id];
+    sinr_tmp = (double) meas->wideband_cqi_avg[eNB_id];
+
+  LOG_I(PHY,"Filling CQI %f for eNB %d\n",sinr_tmp,eNB_id);
 
   switch (uci_format) {
   case wideband_cqi_rank1_2A:
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
index d8df1473c6c..d495b7c2ca6 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_coding.c
@@ -45,6 +45,7 @@
 #include "PHY/CODING/lte_interleaver_inline.h"
 #include "PHY/LTE_TRANSPORT/defs.h"
 #include "defs.h"
+#include "UTIL/LOG/vcd_signal_dumper.h"
 
 //#define DEBUG_DLSCH_CODING 
 //#define DEBUG_DLSCH_FREE 1
@@ -74,11 +75,12 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) {
 	msg("Freeing dlsch process %d (%p)\n",i,dlsch->harq_processes[i]);
 #endif
 	if (dlsch->harq_processes[i]->b) {
-        free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
+	  free16(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES);
+	  dlsch->harq_processes[i]->b = NULL;
 #ifdef DEBUG_DLSCH_FREE
 	  msg("Freeing dlsch process %d b (%p)\n",i,dlsch->harq_processes[i]->b);
 #endif
-    }
+	}
 	if (dlsch->harq_processes[i]->c) {
 #ifdef DEBUG_DLSCH_FREE
 	  msg("Freeing dlsch process %d c (%p)\n",i,dlsch->harq_processes[i]->c);
@@ -88,14 +90,18 @@ void free_eNB_dlsch(LTE_eNB_DLSCH_t *dlsch) {
 #ifdef DEBUG_DLSCH_FREE
 	    msg("Freeing dlsch process %d c[%d] (%p)\n",i,r,dlsch->harq_processes[i]->c[r]);
 #endif
-	    if (dlsch->harq_processes[i]->c[r]) 
+	    if (dlsch->harq_processes[i]->c[r]) {
 	      free16(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+768);
+	      dlsch->harq_processes[i]->c[r] = NULL;
+	    }
 	  }
 	}
 	free16(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
+	dlsch->harq_processes[i] = NULL;
       }
     }
     free16(dlsch,sizeof(LTE_eNB_DLSCH_t));
+    dlsch = NULL;
   }
   
 }
@@ -137,7 +143,10 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne
           bzero(dlsch->harq_processes[i],sizeof(LTE_DL_eNB_HARQ_t));
 	  //	  dlsch->harq_processes[i]->first_tx=1;
           dlsch->harq_processes[i]->b = (unsigned char*)malloc16(MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
-          if (!dlsch->harq_processes[i]->b) {
+          if (dlsch->harq_processes[i]->b) {
+	    bzero(dlsch->harq_processes[i]->b,MAX_DLSCH_PAYLOAD_BYTES/bw_scaling);
+	  }
+	  else {
               msg("Can't get b\n");
               exit_flag=1;
           }
@@ -145,7 +154,10 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne
 	  for (r=0;r<MAX_NUM_DLSCH_SEGMENTS/bw_scaling;r++) {
 	    // account for filler in first segment and CRCs for multiple segment case
 	    dlsch->harq_processes[i]->c[r] = (unsigned char*)malloc16(((r==0)?8:0) + 3+ 768);  
-	    if (!dlsch->harq_processes[i]->c[r]) {
+	    if (dlsch->harq_processes[i]->c[r]) {
+	      bzero(dlsch->harq_processes[i]->c[r],((r==0)?8:0) + 3+ 768);
+	    } 
+	    else {
 	      msg("Can't get c\n");
 	      exit_flag=2;
 	    }
@@ -169,7 +181,8 @@ LTE_eNB_DLSCH_t *new_eNB_dlsch(unsigned char Kmimo,unsigned char Mdlharq,unsigne
       return(dlsch);
     }
   }
-  msg("new_eNB_dlsch exit flag %d, size of %zd\n", exit_flag, sizeof(LTE_eNB_DLSCH_t));
+  LOG_D(PHY, "new_eNB_dlsch exit flag %d, size of  %ld\n",
+        exit_flag, sizeof(LTE_eNB_DLSCH_t));
   free_eNB_dlsch(dlsch);
   return(NULL);
   
@@ -224,6 +237,8 @@ int dlsch_encoding(unsigned char *a,
   unsigned int Kr=0,Kr_bytes,r,r_offset=0;
   unsigned short m=dlsch->harq_processes[harq_pid]->mcs;
 
+  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_IN);
+
   A = dlsch->harq_processes[harq_pid]->TBS; //6228
   // printf("Encoder: A: %d\n",A);
   mod_order = get_Qm(dlsch->harq_processes[harq_pid]->mcs);
@@ -355,6 +370,8 @@ int dlsch_encoding(unsigned char *a,
       write_output("enc_output.m","enc",dlsch->e,r_offset,1,4);
 #endif
   }
+  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ENCODING, VCD_FUNCTION_OUT);
+
   return(0);
 }
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
index a8bc4cc7b9f..1a988a57dcc 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c
@@ -495,34 +495,14 @@ uint32_t  dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
 	}
     }
   }       
-  //printf("sinr_eff1 = %f\n",sinr_eff);
+  LOG_D(OCM,"sinr_eff (lin, unweighted) = %f\n",sinr_eff);
   sinr_eff =  -beta2_dlsch[TM][mcs]*log((sinr_eff)/(12*rb_count));
+  LOG_D(OCM,"sinr_eff (lin, weighted) = %f\n",sinr_eff);
   sinr_eff = 10 * log10(sinr_eff);
-  LOG_I(OCM,"sinr_eff2 = %f\n",sinr_eff);
-
-  // table lookup
-  sinr_eff *= 10;
-  sinr_eff = floor(sinr_eff);
-  // if ((int)sinr_eff%2) {
-  //   sinr_eff += 1;
-  // }
-  sinr_eff /= 10;
-  msg("Imran sinr_eff after rounding = %f\n",sinr_eff);
- for (index = 0; index < table_length[mcs]; index++) {
-    if(index == 0) {
-      if (sinr_eff < sinr_bler_map[mcs][0][index]) {
-        bler = 1;
-        break;
-      }
-      else if(sinr_eff > sinr_bler_map[mcs][0][table_length[mcs]]){
-	bler = 0;
-	break;
-      }
-    }
-    if (sinr_eff == sinr_bler_map[mcs][0][index]) {
-      bler = sinr_bler_map[mcs][1][index];
-    }
-  }
+  LOG_D(OCM,"sinr_eff (dB) = %f\n",sinr_eff);
+
+  bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]);
+
 #ifdef USER_MODE // need to be adapted for the emulation in the kernel space 
    if (uniformrandom() < bler) {
      LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
@@ -591,56 +571,34 @@ uint32_t  dlsch_decoding(PHY_VARS_UE *phy_vars_ue,
     }
   }
   // averaging of accumulated MI 
-	  I = I/(12*rb_count);  
-	  //Now  I->SINR_effective Mapping
-	  
-	  if(mcs<10)
-	    {
-	      sinr_eff = (p_qpsk[0]*pow(I,7) + p_qpsk[1]*pow(I,6) + p_qpsk[2]*pow(I,5) + p_qpsk[3]*pow(I,4) + p_qpsk[4]*pow(I,3) + p_qpsk[5]*pow(I,2) + p_qpsk[6]*I + p_qpsk[7]);
-	    }
-	  else if(mcs>9 && mcs<17)
-	    {
-	      sinr_eff = (p_qam16[0]*pow(I,7) + p_qam16[1]*pow(I,6) + p_qam16[2]*pow(I,5) + p_qam16[3]*pow(I,4) + p_qam16[4]*pow(I,3) + p_qam16[5]*pow(I,2) + p_qam16[6]*I + p_qam16[7]);
-	    }
-	  else if(mcs>16 && mcs<23)
-	    {
-	      sinr_eff = (p_qam64[0]*pow(I,7) + p_qam64[1]*pow(I,6) + p_qam64[2]*pow(I,5) + p_qam64[3]*pow(I,4) + p_qam64[4]*pow(I,3) + p_qam64[5]*pow(I,2) + p_qam64[6]*I + p_qam64[7]);
-	    }	  
-
-  sinr_eff = sinr_eff + 10*log10(beta2_dlsch_MI[TM][mcs]);
-  msg("SINR_Eff = %e\n",sinr_eff);
-
-  sinr_eff *= 10;
-  sinr_eff = floor(sinr_eff);
-  // if ((int)sinr_eff%2) {
-  //   sinr_eff += 1;
-  // }
-  sinr_eff /= 10;
-  msg("sinr_eff after rounding = %f\n",sinr_eff);
-
-  for (index = 0; index < table_length[mcs]; index++) {
-    if(index == 0) {
-      if (sinr_eff < sinr_bler_map[mcs][0][index]) {
-        bler = 1;
-        break;
-      }
-      else if(sinr_eff > sinr_bler_map[mcs][0][table_length[mcs]]){
-	bler = 0;
-	break;
-      }
+  I = I/(12*rb_count);  
+  //Now  I->SINR_effective Mapping
+  
+  if(mcs<10)
+    {
+      sinr_eff = (p_qpsk[0]*pow(I,7) + p_qpsk[1]*pow(I,6) + p_qpsk[2]*pow(I,5) + p_qpsk[3]*pow(I,4) + p_qpsk[4]*pow(I,3) + p_qpsk[5]*pow(I,2) + p_qpsk[6]*I + p_qpsk[7]);
     }
-    if (sinr_eff == sinr_bler_map[mcs][0][index]) {
-      bler = sinr_bler_map[mcs][1][index];
+  else if(mcs>9 && mcs<17)
+    {
+      sinr_eff = (p_qam16[0]*pow(I,7) + p_qam16[1]*pow(I,6) + p_qam16[2]*pow(I,5) + p_qam16[3]*pow(I,4) + p_qam16[4]*pow(I,3) + p_qam16[5]*pow(I,2) + p_qam16[6]*I + p_qam16[7]);
     }
-  }
-
+  else if(mcs>16 && mcs<23)
+    {
+      sinr_eff = (p_qam64[0]*pow(I,7) + p_qam64[1]*pow(I,6) + p_qam64[2]*pow(I,5) + p_qam64[3]*pow(I,4) + p_qam64[4]*pow(I,3) + p_qam64[5]*pow(I,2) + p_qam64[6]*I + p_qam64[7]);
+    }	  
+  
+  //sinr_eff = sinr_eff + 10*log10(beta2_dlsch_MI[TM][mcs]); 
+  LOG_D(OCM,"SINR_Eff = %e\n",sinr_eff);
+  
+  bler = interp(sinr_eff,&sinr_bler_map[mcs][0][0],&sinr_bler_map[mcs][1][0],table_length[mcs]);
+  
 #ifdef USER_MODE // need to be adapted for the emulation in the kernel space 
-   if (uniformrandom() < bler) {
-    msg("abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
+  if (uniformrandom() < bler) {
+    LOG_I(OCM,"abstraction_decoding failed (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
     return(0);
   }
   else {
-    msg("abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
+    LOG_I(OCM,"abstraction_decoding successful (mcs=%d, sinr_eff=%f, bler=%f)\n",mcs,sinr_eff,bler);
     return(1);
   }
 #endif
@@ -660,7 +618,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue,
   u16 i;
 #endif
 
-  // may not be necessaru for PMCH??
+  // may not be necessary for PMCH??
   for (eNB_id2=0;eNB_id2<NB_eNB_INST;eNB_id2++) {
     if (PHY_vars_eNB_g[eNB_id2]->lte_frame_parms.Nid_cell == phy_vars_ue->lte_frame_parms.Nid_cell)
       break;
diff --git a/openair1/PHY/LTE_TRANSPORT/pbch.c b/openair1/PHY/LTE_TRANSPORT/pbch.c
index 182b40761be..b8687e71c93 100755
--- a/openair1/PHY/LTE_TRANSPORT/pbch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pbch.c
@@ -50,6 +50,10 @@
 #include "extern.h"
 #include "PHY/extern.h"
 
+#ifdef PHY_ABSTRACTION
+#include "SIMULATION/TOOLS/defs.h"
+#endif 
+
 #ifndef __SSE3__
 extern __m128i zero;
 #define _mm_abs_epi16(xmmx) _mm_xor_si128((xmmx),_mm_cmpgt_epi16(zero,(xmmx)))
@@ -900,21 +904,34 @@ u16 rx_pbch(LTE_UE_COMMON *lte_ue_common_vars,
   
 }
 
-
+#ifdef PHY_ABSTRACTION
 u16 rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
 		 u8 eNB_id,
 		 u8 pbch_phase) {
 
-  u8 pbch_error=0;
-
-  LOG_D(PHY,"EMUL UE rx_pbch_emul: eNB_id %d, pbch_phase %d\n",eNB_id,pbch_phase);
+  double bler=0.0, x=0.0;
+  double sinr=0.0;
+  u16 nb_rb = phy_vars_ue->lte_frame_parms.N_RB_DL;
+  s16 f;
+  
+  // compute effective sinr
+  // TODO: adapt this to varible bandwidth
+  for (f=(nb_rb*6-3*12);f<(nb_rb*6+3*12);f++) {
+    if (f!=0) //skip DC
+      sinr += pow(10, 0.1*(phy_vars_ue->sinr_dB[f]));
+  }
+  sinr = 10*log10(sinr/(6*12));
+ 
+  bler = pbch_bler(sinr);
+ 
+  LOG_D(PHY,"EMUL UE rx_pbch_emul: eNB_id %d, pbch_phase %d, sinr %f dB, bler %f \n",
+	eNB_id,
+	pbch_phase,
+	sinr,
+	bler);
 
   if (pbch_phase == (phy_vars_ue->frame % 4)) {
-
-    // abtract pbch error here
-    // pbch_error = pbch_abstraction();
-
-    if (pbch_error == 0) {
+    if (uniformrandom() >= bler) {
       memcpy(phy_vars_ue->lte_ue_pbch_vars[eNB_id]->decoded_output,PHY_vars_eNB_g[eNB_id]->pbch_pdu,PBCH_PDU_SIZE);    
       return(PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_tx_eNB);
     }
@@ -924,3 +941,4 @@ u16 rx_pbch_emul(PHY_VARS_UE *phy_vars_ue,
   else
     return(-1);
 }
+#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index 5ad45e2e005..5ce8cdf9575 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -827,6 +827,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u16 *preamble_energy_list,
     NCS = NCS_restricted[Ncs_config];
   }
 
+  start_meas(&phy_vars_eNB->rx_prach);
+
   n_ra_prb = n_ra_prboffset;
   prach_root_sequence_map = (prach_fmt < 4) ? prach_root_sequence_map0_3 : prach_root_sequence_map4;
   
@@ -1133,6 +1135,8 @@ void rx_prach(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u16 *preamble_energy_list,
 #endif
     //  exit(-1);
   }// preamble_index
+  stop_meas(&phy_vars_eNB->rx_prach);
+
 }
 
 void init_prach_tables(int N_ZC) {
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index dd02ea027ef..2bbc4d73cbc 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -119,6 +119,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
 
     len += sprintf(&buffer[len], "[UE PROC] RX total power eNB%d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.rx_power_tot_dB[eNB],phy_vars_ue->PHY_measurements.rx_power_avg_dB[eNB]);
     len += sprintf(&buffer[len], "[UE PROC] RX total power lin: %d, avg: %d, RX total noise lin: %d, avg: %d\n",phy_vars_ue->PHY_measurements.rx_power_tot[eNB], phy_vars_ue->PHY_measurements.rx_power_avg[eNB], phy_vars_ue->PHY_measurements.n0_power_tot, phy_vars_ue->PHY_measurements.n0_power_avg);
+    len += sprintf(&buffer[len], "[UE PROC] effective SINR %.2f dB\n",phy_vars_ue->sinr_eff);
     len += sprintf(&buffer[len], "[UE PROC] Wideband CQI eNB %d: %d dB, avg: %d dB\n",eNB,phy_vars_ue->PHY_measurements.wideband_cqi_tot[eNB],phy_vars_ue->PHY_measurements.wideband_cqi_avg[eNB]);
 
     len += sprintf(&buffer[len], "[UE PROC] Subband CQI eNB%d (Ant 0): [%d %d %d %d %d %d %d] dB\n",
@@ -195,6 +196,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
       RRC_status = mac_get_rrc_status(phy_vars_ue->Mod_id,0,0);
       len += sprintf(&buffer[len],"[UE PROC] RRC status = %d\n",RRC_status);
 #endif
+      len += sprintf(&buffer[len],"[UE PROC] RSRP[0] %d, RSSI %d, RSRQ[0] %d\n",phy_vars_ue->PHY_measurements.rsrp[0], phy_vars_ue->PHY_measurements.rssi, phy_vars_ue->PHY_measurements.rsrq[0]);
     
     len += sprintf(&buffer[len], "[UE PROC] Transmission Mode %d (mode1_flag %d)\n",phy_vars_ue->transmission_mode[eNB],phy_vars_ue->lte_frame_parms.mode1_flag);
     if (phy_vars_ue->transmission_mode[eNB] == 6)
@@ -252,8 +254,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
   }
 
   len += sprintf(&buffer[len],"EOF\n");
-  /* SR: for trailing '\0' */
-  len ++;
+  len += sprintf(&buffer[len],"\0");
 
   return len;
 } // is_clusterhead
@@ -479,8 +480,7 @@ int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length) {
     len += sprintf(&buffer[len],"\n");
   }
   len += sprintf(&buffer[len],"EOF\n");
-  /* SR: for trailing '\0' */
-  len++;
-
+  len += sprintf(&buffer[len],"\0");
+  
   return len;
 }
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
index 78844a094b5..51bafdff22a 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
@@ -247,12 +247,14 @@ u32 ulsch_encoding(u8 *a,
 
   // fill CQI/PMI information
   if (ulsch->O>0) {
+    /*  //not correctly done
     if (flag_LA==1)
       sinr_eff = sinr_eff_cqi_calc(phy_vars_ue, 0); //eNB_id is missing here
     else
       sinr_eff = 0;
+    */
     rnti = phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti;
-    fill_CQI(ulsch->o,ulsch->uci_format,meas,0,rnti, tmode,sinr_eff);
+    fill_CQI(ulsch->o,ulsch->uci_format,meas,0,rnti, tmode,phy_vars_ue->sinr_eff);
    
     LOG_D(PHY,"UE CQI\n");
     print_CQI(ulsch->o,ulsch->uci_format,0);
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index a45f9a5fd82..ade4091a190 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1607,6 +1607,7 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t subframe, uint8_t UE_id) {
   uint32_t nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12;
   uint8_t harq_pid = subframe2harq_pid(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->frame,subframe);
   printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs),PHY_vars_eNB->ulsch_eNB[UE_id]->Nsymb_pusch);
+#ifndef OAI_EMU 
   write_output("/tmp/ulsch_d.m","ulsch_dseq",&PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->d[0][96], 
 	       PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0);
   write_output("/tmp/rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][0],PHY_vars_eNB->lte_frame_parms.samples_per_tti*10,1,1);
@@ -1639,6 +1640,7 @@ void dump_ulsch(PHY_VARS_eNB *PHY_vars_eNB,uint8_t subframe, uint8_t UE_id) {
   write_output("/tmp/ulsch_rxF_llr.m","ulsch_llr",PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->llr,PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb*12*get_Qm_ul(PHY_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->mcs)*PHY_vars_eNB->ulsch_eNB[UE_id]->Nsymb_pusch,1,0);	
   write_output("/tmp/ulsch_ch_mag.m","ulsch_ch_mag",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][0][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);	  
   //  write_output("ulsch_ch_mag1.m","ulsch_ch_mag1",&PHY_vars_eNB->lte_eNB_pusch_vars[UE_id]->ul_ch_mag[0][1][0],PHY_vars_eNB->lte_frame_parms.N_RB_UL*12*nsymb,1,1);	  
-#endif	  
+#endif	 
+#endif 
 }
 
diff --git a/openair1/PHY/Makefile.inc b/openair1/PHY/Makefile.inc
index fd02e0933f0..b924b02f6d4 100644
--- a/openair1/PHY/Makefile.inc
+++ b/openair1/PHY/Makefile.inc
@@ -80,5 +80,7 @@ PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/sqrt.o
 ifdef SMBV
 PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/smbv.o
 endif
+PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/time_meas.o
+PHY_OBJS += $(TOP_DIR)/PHY/TOOLS/lut.o
 #PHY_OBJS += $(TOP_DIR)/SIMULATION/TOOLS/rangen_double.o
 
diff --git a/openair1/PHY/TOOLS/dB_routines.c b/openair1/PHY/TOOLS/dB_routines.c
index dbc6cef5ae3..e7e41ab2367 100755
--- a/openair1/PHY/TOOLS/dB_routines.c
+++ b/openair1/PHY/TOOLS/dB_routines.c
@@ -569,7 +569,7 @@ s16 dB_fixed_times10(u32 x) {
     dB_power = dB_table_times10[(x&255)-1];
   }
   if (dB_power > 900)
-    return(0);
+    return(900);
   return dB_power;
 }
 
@@ -593,7 +593,7 @@ s8 dB_fixed(u32 x) {
     dB_power = dB_table[(x&255)-1];
   }
   if (dB_power > 90)
-    return(0);
+    return(90);
   return dB_power;
 }
 
diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h
index 6e292f8fa82..d2c7ca63566 100644
--- a/openair1/PHY/TOOLS/defs.h
+++ b/openair1/PHY/TOOLS/defs.h
@@ -588,4 +588,6 @@ void idft2048(int16_t *x,int16_t *y,int scale);
 /** @} */ 
 
 
+double interp(double x, double *xs, double *ys, int count);
+
 #endif //__PHY_TOOLS_DEFS__H__
diff --git a/openair1/PHY/TOOLS/file_output.c b/openair1/PHY/TOOLS/file_output.c
index dc8aa8618fd..c1ed67420b9 100755
--- a/openair1/PHY/TOOLS/file_output.c
+++ b/openair1/PHY/TOOLS/file_output.c
@@ -10,8 +10,7 @@ int write_output(const char *fname,const char *vname,void *data,int length,int d
   int i;
  
  
- printf("Writing %d elements of type %d to %s\n",length,format,fname);
- printf("Writing %d elements of type %d to %s\n",length,format,fname);
+  printf("Writing %d elements of type %d to %s\n",length,format,fname);
   
 
    if (format == 10 || format ==11 || format == 12 )
diff --git a/openair1/PHY/TOOLS/lut.c b/openair1/PHY/TOOLS/lut.c
new file mode 100644
index 00000000000..78d9afca9a2
--- /dev/null
+++ b/openair1/PHY/TOOLS/lut.c
@@ -0,0 +1,25 @@
+double interp(double x, double *xs, double *ys, int count)
+{
+    int i;
+    double dx, dy;
+
+    if (x < xs[0]) {
+        return 1.0; /* return minimum element */
+    }
+
+    if (x > xs[count-1]) {
+        return 0.0; /* return maximum */
+    }
+
+    /* find i, such that xs[i] <= x < xs[i+1] */
+    for (i = 0; i < count-1; i++) {
+        if (xs[i+1] > x) {
+            break;
+        }
+    }
+
+    /* interpolate */
+    dx = xs[i+1] - xs[i];
+    dy = ys[i+1] - ys[i];
+    return ys[i] + (x - xs[i]) * dy / dx;
+}
diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c
new file mode 100644
index 00000000000..0e7b4800350
--- /dev/null
+++ b/openair1/PHY/TOOLS/time_meas.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+#include "time_meas.h"
+
+// global var for openair performance profiler 
+int opp_enabled = 0;
+
+void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time){
+
+  if (opp_enabled) {
+    
+    static int first_time = 0;
+    static double cpu_freq_GHz = 0.0;
+    
+    if (cpu_freq_GHz == 0.0)
+      cpu_freq_GHz = get_cpu_freq_GHz();
+    
+    if (first_time == 0) {
+      first_time=1;
+      fprintf(stderr, "%25s  %25s  %25s  %20s %15s %6f\n","Name","Total","Average/Frame","Trials","CPU_F_GHz", cpu_freq_GHz);
+    }
+    if (ts->trials>0) {
+      //printf("%20s: total: %10.3f ms, average: %10.3f us (%10d trials)\n", name, ts->diff/cpu_freq_GHz/1000000.0, ts->diff/ts->trials/cpu_freq_GHz/1000.0, ts->trials);
+     
+      fprintf(stderr, "%25s:  %15.3f ms (%5.2f%); %15.3f us (%5.2f%); %15d;\n", 
+	      name, 
+	      (ts->diff/cpu_freq_GHz/1000000.0), 
+	      ((ts->diff/cpu_freq_GHz/1000000.0)/(total_exec_time->diff/cpu_freq_GHz/1000000.0))*100,  // percentage 
+	      (ts->diff/ts->trials/cpu_freq_GHz/1000.0), 
+	      ((ts->diff/ts->trials/cpu_freq_GHz/1000.0)/(sf_exec_time->diff/sf_exec_time->trials/cpu_freq_GHz/1000.0))*100,  // percentage 
+	      ts->trials);
+    }
+  }
+  
+}
diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h
index 3da89ba8eb7..203a8b95240 100644
--- a/openair1/PHY/TOOLS/time_meas.h
+++ b/openair1/PHY/TOOLS/time_meas.h
@@ -1,6 +1,9 @@
 #ifdef OMP
 #include <omp.h>
 #endif
+#include <unistd.h>
+// global var to enable openair performance profiler 
+extern int opp_enabled;
 
 typedef struct {
 
@@ -13,6 +16,8 @@ typedef struct {
 static inline void start_meas(time_stats_t *ts) __attribute__((always_inline));
 static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
 
+void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time);
+
 #if defined(__i386__)
 static inline unsigned long long rdtsc_oai(void) __attribute__((always_inline));
 static inline unsigned long long rdtsc_oai(void) {
@@ -31,38 +36,62 @@ static inline unsigned long long rdtsc_oai() {
 
 static inline void start_meas(time_stats_t *ts) {
 
-#ifdef OMP
-  int tid;
+  if (opp_enabled) {
 
-  tid = omp_get_thread_num();
-  if (tid==0)
+#ifdef OMP
+    int tid;
+    
+    tid = omp_get_thread_num();
+    if (tid==0)
 #endif
-    {
-      ts->trials++;
-      ts->in = rdtsc_oai();
-    }
+      {
+	ts->trials++;
+	ts->in = rdtsc_oai();
+      }
+  }
 }
 
 static inline void stop_meas(time_stats_t *ts) {
 
-  long long out = rdtsc_oai();
-
+  if (opp_enabled) {
+    long long out = rdtsc_oai();
+    
 #ifdef OMP
-  int tid;
-  tid = omp_get_thread_num();
-  if (tid==0)
+    int tid;
+    tid = omp_get_thread_num();
+    if (tid==0)
 #endif
-    {
-      ts->diff += (out-ts->in);
-      if ((out-ts->in) > ts->max)
-	ts->max = out-ts->in;
-      
-    }
+      {
+	ts->diff += (out-ts->in);
+	if ((out-ts->in) > ts->max)
+	  ts->max = out-ts->in;
+	
+      }
+  }
 }
 
 static inline void reset_meas(time_stats_t *ts) {
 
-  ts->trials=0;
-  ts->diff=0;
-  ts->max=0;
+  if (opp_enabled){
+    ts->trials=0;
+    ts->diff=0;
+    ts->max=0;
+  }
 }
+
+/*static inline double get_mean_meas_us(time_stats_t *ts, double cpu_freq_GHz) {
+
+  return (double) ts->diff/ts->trials/cpu_freq_GHz/1000.0;
+
+  }*/
+
+static inline double get_cpu_freq_GHz(void) {
+
+  time_stats_t ts;
+  reset_meas(&ts);
+  start_meas(&ts);
+  sleep(1);
+  stop_meas(&ts);
+  return (double)ts.diff/1000000000;
+}
+
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index f8a842e405b..82ce81c194f 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -301,10 +301,16 @@ typedef struct {
   unsigned int total_dlsch_bitrate;
   unsigned int total_transmitted_bits;
   unsigned int total_system_throughput;
- 
+  
+  time_stats_t phy_proc;
+  time_stats_t phy_proc_tx;
+  time_stats_t phy_proc_rx;
+  time_stats_t rx_prach;
+  
   time_stats_t ofdm_mod_stats;
   time_stats_t dlsch_encoding_stats;
   time_stats_t dlsch_modulation_stats;
+   time_stats_t dlsch_scrambling_stats;
   time_stats_t dlsch_rate_matching_stats;
   time_stats_t dlsch_turbo_encoding_stats;
   time_stats_t dlsch_interleaving_stats;
@@ -452,6 +458,9 @@ typedef struct
    /// sinr for all subcarriers of first symbol for the CQI Calculation 
   double *sinr_CQI_dB;
 
+  /// sinr_effective used for CQI calulcation
+  double sinr_eff;
+
   /// N0 (used for abstraction)
   double N0;
   
@@ -488,7 +497,11 @@ typedef struct
 
   /// Transmission mode per eNB
   u8 transmission_mode[NUMBER_OF_CONNECTED_eNB_MAX];
-
+ 
+  time_stats_t phy_proc;
+  time_stats_t phy_proc_tx;
+  time_stats_t phy_proc_rx;
+  
   time_stats_t ofdm_mod_stats;
   time_stats_t ulsch_encoding_stats;
   time_stats_t ulsch_modulation_stats;
@@ -508,6 +521,7 @@ typedef struct
   time_stats_t dlsch_turbo_decoding_stats;
   time_stats_t dlsch_deinterleaving_stats;
   time_stats_t dlsch_llr_stats;
+  time_stats_t dlsch_unscrambling_stats;
   time_stats_t dlsch_tc_init_stats;
   time_stats_t dlsch_tc_alpha_stats;
   time_stats_t dlsch_tc_beta_stats;
@@ -515,7 +529,8 @@ typedef struct
   time_stats_t dlsch_tc_ext_stats;
   time_stats_t dlsch_tc_intl1_stats;
   time_stats_t dlsch_tc_intl2_stats;
-
+  time_stats_t tx_prach;
+  
 #if defined(ENABLE_RAL)
   hash_table_t    *ral_thresholds_timed;
   SLIST_HEAD(ral_thresholds_gen_poll_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
diff --git a/openair1/PHY/extern.h b/openair1/PHY/extern.h
index cae887ad0ad..6628956e5bc 100755
--- a/openair1/PHY/extern.h
+++ b/openair1/PHY/extern.h
@@ -61,7 +61,7 @@ extern unsigned char NB_RN_INST;
 #endif
 
 extern int flag_LA;
-extern double sinr_bler_map[MCS_COUNT][2][20];
+extern double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
 extern double sinr_bler_map_up[MCS_COUNT][2][16];
 extern int table_length[MCS_COUNT];
 extern double sinr_to_cqi[4][16];
diff --git a/openair1/PHY/impl_defs_top.h b/openair1/PHY/impl_defs_top.h
index 0fc0c2a7b9e..17d46e6b15c 100755
--- a/openair1/PHY/impl_defs_top.h
+++ b/openair1/PHY/impl_defs_top.h
@@ -239,6 +239,10 @@
 #define AMP 512//1024 //4096
 #endif
 
+#define AMP_OVER_SQRT2 ((AMP*ONE_OVER_SQRT2_Q15)>>15)
+#define AMP_OVER_2 (AMP>>1)
+
+
 #ifndef OPENAIR_LTE
 ///
 /// PHY-MAC Interface Defs 
@@ -486,7 +490,8 @@ typedef struct
 
 } PHY_MEASUREMENTS_eNB;
 
-#define MCS_COUNT 24
+#define MCS_COUNT 28
+#define MCS_TABLE_LENGTH_MAX 64
 
 #endif //__PHY_IMPLEMENTATION_DEFS_H__ 
 /**@}
diff --git a/openair1/PHY/vars.h b/openair1/PHY/vars.h
index cae0782dd2f..b0103c4d7c1 100755
--- a/openair1/PHY/vars.h
+++ b/openair1/PHY/vars.h
@@ -71,7 +71,7 @@ int flagMag;
 //extern  channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
 //extern  double ABS_SINR_eff_BLER_table[MCS_COUNT][9][9];
 //extern  double ABS_beta[MCS_COUNT];odi
-double sinr_bler_map[MCS_COUNT][2][20];
+double sinr_bler_map[MCS_COUNT][2][MCS_TABLE_LENGTH_MAX];
 int table_length[MCS_COUNT];
 //double sinr_bler_map_up[MCS_COUNT][2][16];
 
@@ -110,8 +110,10 @@ double beta1_dlsch_MI[6][MCS_COUNT] = { {1.32955, 0.59522, 0.54024, 0.98698, 0.8
 double beta2_dlsch_MI[6][MCS_COUNT] = { {1.36875, 0.59304, 0.53870, 0.98239, 0.81637, 0.76847, 0.69842, 0.69885, 0.69967, 0.69826, 0.82660, 0.70559, 0.78404, 0.70670, 0.55393, 0.36893, 0.52225, 0.39752, 0.40494, 0.46239, 0.49247,0.26900,0.34504,1}, {0.43775, 0.78208, 0.72875, 0.77458, 0.64485, 0.69174, 0.66097, 0.63289, 0.59652, 0.61175, 0.44551, 0.56047, 0.57314, 0.57553, 0.58849, 0.52159, 0.21241, 0.30139, 0.37373, 0.32029, 0.37067, 0.36706, 0.27118,1}, {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},  {1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1},{1.079518113138858, 1.105622953570353, 1.031337449900606, 1.073342032668810, 1.242636589110353, 1.255054927783647, 1.291463834317768, 1.317048698347491, 1.354485054187984, 0.338534029291017, 1.85, 1.79, 1.65, 1.54, 1.46, 1.39, 1.33,1, 1,1,1,1,1,1},{0.54448, 0.73731, 0.79165, 0.74407, 0.68042, 0.64906, 0.71349, 0.62109, 0.65815, 0.60940, 0.90549, 0.78708, 1.03176, 0.58431, 0.53379, 0.51224, 0.52767, 0.26848, 0.29642, 0.36879, 0.34148, 0.35279,0.40633,1}};
 */
 //ideal channel estimation values
-double beta1_dlsch[6][MCS_COUNT] = { {2.3814, 0.4956, 0.5273, 1.1708, 0.8014, 0.7889, 0.8111, 0.8139, 0.8124, 0.8479, 1.9280, 1.9664, 2.3857, 2.5147, 2.4511, 3.0158, 2.8643, 5.3013, 5.8594, 6.5372, 7.8073, 7.8030, 7.5295, 7.1320}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
-double beta2_dlsch[6][MCS_COUNT] = { {2.3639, 0.4952, 0.5207, 1.1572, 0.8026, 0.7864, 0.7996, 0.8034, 0.8200, 0.8367, 1.8701, 1.9212, 2.2947, 2.4472, 2.4091, 2.9479, 2.8973, 5.0591, 5.5134, 6.1483, 7.2166, 7.5177, 7.5704, 7.2248}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
+//double beta1_dlsch[6][MCS_COUNT] = { {2.3814, 0.4956, 0.5273, 1.1708, 0.8014, 0.7889, 0.8111, 0.8139, 0.8124, 0.8479, 1.9280, 1.9664, 2.3857, 2.5147, 2.4511, 3.0158, 2.8643, 5.3013, 5.8594, 6.5372, 7.8073, 7.8030, 7.5295, 7.1320}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
+//double beta2_dlsch[6][MCS_COUNT] = { {2.3639, 0.4952, 0.5207, 1.1572, 0.8026, 0.7864, 0.7996, 0.8034, 0.8200, 0.8367, 1.8701, 1.9212, 2.2947, 2.4472, 2.4091, 2.9479, 2.8973, 5.0591, 5.5134, 6.1483, 7.2166, 7.5177, 7.5704, 7.2248}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
+double beta1_dlsch[6][MCS_COUNT] = { {1.199175, 1.085656, 0.983872, 0.843789, 0.816093, 0.853078, 0.899236, 0.919665, 0.888673, 0.924181, 0.814176, 0.794108, 0.770653, 0.826266, 0.982043, 0.979621, 0.985176, 0.901741, 0.870311, 0.911303, 0.898923, 1.003359, 0.988535, 1.030639, 1.151038, 1.116939, 1.214118, 1.219148}, {0.5146, 0.5549, 0.7405, 0.6913, 0.7349, 0.7000, 0.7539, 0.7955, 0.8074, 0.7760, 1.8150, 1.6561, 1.9280, 2.3563, 2.6699, 2.3086, 3.1601, 4.5316, 5.2870, 6.0983, 6.5635, 7.7024, 9.9592, 6.6173}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {1.79358, 1.17908, 2.02600, 1.72040, 1.58618, 1.59039, 1.68111, 1.67062, 1.64911, 1.33274, 4.87800, 3.58797, 3.72338, 5.35700, 2.81752, 1.93472, 2.23259, 1,1,1,1,1,1,1}, {0.4445, 0.5918, 0.7118, 0.7115, 0.7284, 0.7202, 0.7117, 0.8111, 0.8239, 0.7907, 1.8456, 1.8144, 2.3830, 2.6634, 2.6129, 2.8127, 2.7372, 4.9424, 4.8763, 6.8413, 7.1493, 9.4180, 10.1230, 8.9613}};
+double beta2_dlsch[6][MCS_COUNT] = { {0.534622, 0.596561, 0.500838, 0.471721, 0.548218, 0.547974, 0.924245, 0.836484, 0.776917, 0.879691, 0.875722, 0.666933, 0.666393, 0.755377, 1.074985, 1.080290, 1.010914, 0.790892, 0.793435, 0.860249, 0.901508, 0.967060, 0.951372, 1.011493, 1.106151, 1.117076, 1.209397, 1.227790}, {0.5113, 0.5600, 0.7359, 0.6860, 0.7344, 0.6902, 0.7315, 0.7660, 0.7817, 0.7315, 1.7268, 1.5912, 1.8519, 2.2115, 2.4580, 2.1879, 2.9015, 4.1543, 4.6986, 5.3193, 5.6319, 6.5640, 8.2421, 5.6393}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1,1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1,1,1,1,1}, {0.79479, 0.52872, 0.90005, 0.77170, 0.73220, 0.72060, 0.75433, 0.75451, 0.75989, 0.67655, 1.68525, 1.31100, 1.46573, 1.99843, 1.57293, 1.62852, 2.10636, 1,1,1,1,1,1,1}, {0.4398, 0.5823, 0.7094, 0.7043, 0.7282, 0.7041, 0.6979, 0.7762, 0.7871, 0.7469, 1.7752, 1.7443, 2.2266, 2.4767, 2.4146, 2.6040, 2.5708, 4.4488, 4.4944, 5.9630, 6.3740, 8.1097, 8.4210, 7.8027}};
 
 //real channel estimation valus
 /*
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index d0fb239c973..8ce0d6ab4b1 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -25,15 +25,15 @@
   Forums       : http://forums.eurecom.fsr/openairinterface
   Address      : Eurecom, 2229, route des crêtes, 06560 Valbonne Sophia Antipolis, France
 
- *******************************************************************************/
+*******************************************************************************/
 
 /*! \file phy_procedures_lte_eNB.c
  * \brief Implementation of eNB procedures from 36.213 LTE specifications
- * \author R. Knopp, F. Kaltenberger
+ * \author R. Knopp, F. Kaltenberger, N. Nikaein
  * \date 2011
  * \version 0.1
  * \company Eurecom
- * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
+ * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr,navid.nikaein@eurecom.fr
  * \note
  * \warning
  */
@@ -49,7 +49,7 @@
 #include "SCHED/phy_procedures_emos.h"
 #endif
 
-#define DEBUG_PHY_PROC 1
+#define DEBUG_PHY_PROC
 //#define DEBUG_ULSCH
 
 #include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
@@ -79,6 +79,7 @@
 #define PUCCH 1
 
 #define PUCCH1_THRES 25
+#define PUCCH1a_THRES 15
 
 extern inline unsigned int taus(void);
 extern int exit_openair;
@@ -112,35 +113,35 @@ extern int rx_sig_fifo;
 static unsigned char I0_clear = 1;
 
 u8 is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,u8 UE_id,u8 subframe) {
-
+  
   LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking for SR TXOp(sr_ConfigIndex %d)\n",
-      phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,phy_vars_eNB->frame,subframe,
-      phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex);
-
+    phy_vars_eNB->Mod_id,phy_vars_eNB->ulsch_eNB[UE_id]->rnti,phy_vars_eNB->frame,subframe,
+    phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex);
+  
   if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 4) {        // 5 ms SR period
-      if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex)
-        return(1);
+    if ((subframe%5) == phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex)
+      return(1);
   }
   else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 14) {  // 10 ms SR period
-      if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5))
-        return(1);
+    if (subframe==(phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-5))
+      return(1);
   }
   else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 34) { // 20 ms SR period
-      if ((10*(phy_vars_eNB->frame&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15))
-        return(1);
+    if ((10*(phy_vars_eNB->frame&1)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-15))
+      return(1);
   }
   else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 74) { // 40 ms SR period
-      if ((10*(phy_vars_eNB->frame&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35))
-        return(1);
+    if ((10*(phy_vars_eNB->frame&3)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-35))
+      return(1);
   }
   else if (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex <= 154) { // 80 ms SR period
-      if ((10*(phy_vars_eNB->frame&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75))
-        return(1);
+    if ((10*(phy_vars_eNB->frame&7)+subframe) == (phy_vars_eNB->scheduling_request_config[UE_id].sr_ConfigIndex-75))
+      return(1);
   }
 
   return(0);
 }
-
+ 
 s32 add_ue(s16 rnti, PHY_VARS_eNB *phy_vars_eNB) {
   u8 i;
 
@@ -148,19 +149,19 @@ s32 add_ue(s16 rnti, PHY_VARS_eNB *phy_vars_eNB) {
   LOG_I(PHY,"[eNB %d] Adding UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti);
   //#endif
   for (i=0;i<NUMBER_OF_UE_MAX;i++) {
-      if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) {
-          LOG_E(PHY,"Can't add UE, not enough memory allocated\n");
-          return(-1);
-      }
-      else {
-          if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) {
-              LOG_I(PHY,"UE_id %d associated with rnti %x\n",i, rnti);
-              phy_vars_eNB->dlsch_eNB[i][0]->rnti = rnti;
-              phy_vars_eNB->ulsch_eNB[i]->rnti = rnti;
-              phy_vars_eNB->eNB_UE_stats[i].crnti = rnti;
-              return(i);
-          }
+    if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) {
+      LOG_E(PHY,"Can't add UE, not enough memory allocated\n");
+      return(-1);
+    }
+    else {
+      if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) {
+	LOG_I(PHY,"UE_id %d associated with rnti %x\n",i, rnti);
+	phy_vars_eNB->dlsch_eNB[i][0]->rnti = rnti;
+	phy_vars_eNB->ulsch_eNB[i]->rnti = rnti;
+	phy_vars_eNB->eNB_UE_stats[i].crnti = rnti;
+	return(i);
       }
+    }
   }
   return(-1);
 }
@@ -172,20 +173,20 @@ s32 remove_ue(u16 rnti, PHY_VARS_eNB *phy_vars_eNB, u8 abstraction_flag) {
   LOG_I(PHY,"eNB %d removing UE with rnti %x\n",phy_vars_eNB->Mod_id,rnti);
   //#endif
   for (i=0;i<NUMBER_OF_UE_MAX;i++) {
-      if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) {
-          LOG_E(PHY,"Can't remove UE, not enough memory allocated\n");
-          return(-1);
-      }
-      else {
-          if (phy_vars_eNB->eNB_UE_stats[i].crnti==rnti) {
-              //msg("[PHY] UE_id %d\n",i);
-              clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0], abstraction_flag);
-              clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i],abstraction_flag);
-              //phy_vars_eNB->eNB_UE_stats[i].crnti = 0;
-              memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats));
-              return(i);
-          }
+    if ((phy_vars_eNB->dlsch_eNB[i]==NULL) || (phy_vars_eNB->ulsch_eNB[i]==NULL)) {
+      LOG_E(PHY,"Can't remove UE, not enough memory allocated\n");
+      return(-1);
+    }
+    else {
+      if (phy_vars_eNB->eNB_UE_stats[i].crnti==rnti) {
+	//msg("[PHY] UE_id %d\n",i);
+	clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0], abstraction_flag);
+	clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i],abstraction_flag);
+	//phy_vars_eNB->eNB_UE_stats[i].crnti = 0;
+	memset(&phy_vars_eNB->eNB_UE_stats[i],0,sizeof(LTE_eNB_UE_stats));
+	return(i);
       }
+    }
   }
 
   return(-1);
@@ -195,13 +196,13 @@ s8 find_next_ue_index(PHY_VARS_eNB *phy_vars_eNB) {
   u8 i;
 
   for (i=0;i<NUMBER_OF_UE_MAX;i++) {
-      if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) {
-          /*if ((phy_vars_eNB->dlsch_eNB[i]) &&
+    if (phy_vars_eNB->eNB_UE_stats[i].crnti==0) {
+      /*if ((phy_vars_eNB->dlsch_eNB[i]) && 
 	(phy_vars_eNB->dlsch_eNB[i][0]) && 
 	(phy_vars_eNB->dlsch_eNB[i][0]->rnti==0))*/ 
-          LOG_D(PHY,"Next free UE id is %d\n",i);
-          return(i);
-      }
+      LOG_D(PHY,"Next free UE id is %d\n",i);
+      return(i);
+    }
   }
   return(-1);
 }
@@ -217,67 +218,67 @@ int get_ue_active_harq_pid(u8 Mod_id,u16 rnti,u8 subframe,u8 *harq_pid,u8 *round
   u32 frame = PHY_vars_eNB_g[Mod_id]->frame;
 
   if (UE_id==-1) {
-      LOG_E(PHY,"Cannot find UE with rnti %x\n",rnti);
-      *round=0;
-      return(-1);
+    LOG_E(PHY,"Cannot find UE with rnti %x\n",rnti);
+    *round=0;
+    return(-1);
   }
 
   if (ul_flag == 0)  {// this is a DL request
-      DLSCH_ptr = PHY_vars_eNB_g[Mod_id]->dlsch_eNB[(u32)UE_id][0];
-      /*
+    DLSCH_ptr = PHY_vars_eNB_g[Mod_id]->dlsch_eNB[(u32)UE_id][0];
+    /*    
 	  if (subframe<4)
 	  subframe_m4 = subframe+6;
 	  else
 	  subframe_m4 = subframe-4;
-       */
+    */
 #ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d] get_ue_active_harq_pid: Frame %d subframe %d, current harq_id %d\n",
-          Mod_id,frame,subframe,DLSCH_ptr->harq_ids[subframe]);
-#endif
-      // switch on TDD or FDD configuration here later
-      *harq_pid = DLSCH_ptr->harq_ids[subframe];
-      if ((*harq_pid<DLSCH_ptr->Mdlharq) &&
-          ((DLSCH_ptr->harq_processes[*harq_pid]->round > 0))) {
-
-          *round = DLSCH_ptr->harq_processes[*harq_pid]->round;
-          LOG_D(PHY,"round %d\n",*round);
-
-          //    else if ((subframe_m4==5) || (subframe_m4==6)) {
-          //      *harq_pid = 0;//DLSCH_ptr->harq_ids[subframe_m4];//Ankit
-          //     *round    = DLSCH_ptr->harq_processes[*harq_pid]->round;
-          //    }
-      }
-      else {
-          // get first free harq_pid (i.e. round 0)
-          for (i=0;i<DLSCH_ptr->Mdlharq;i++) {
-              if (DLSCH_ptr->harq_processes[i]!=NULL) {
-                  if (DLSCH_ptr->harq_processes[i]->status != ACTIVE) {
-                      *harq_pid = i;//0;//i; //(Ankit)
-                      *round = 0;
-                      return(0);
-                  }
-                  else {
-                      LOG_D(PHY,"process %d is active\n",i);
-                  }
-              }
-              else {
-                  LOG_E(PHY,"[eNB %d] DLSCH process %d for rnti %x (UE_id %d) not allocated\n",Mod_id,i,rnti,UE_id);
-                  return(-1);
-              }
-          }
+    LOG_D(PHY,"[eNB %d] get_ue_active_harq_pid: Frame %d subframe %d, current harq_id %d\n",
+	  Mod_id,frame,subframe,DLSCH_ptr->harq_ids[subframe]);
+#endif
+    // switch on TDD or FDD configuration here later
+    *harq_pid = DLSCH_ptr->harq_ids[subframe];
+    if ((*harq_pid<DLSCH_ptr->Mdlharq) && 
+	((DLSCH_ptr->harq_processes[*harq_pid]->round > 0))) {
+
+      *round = DLSCH_ptr->harq_processes[*harq_pid]->round;
+      LOG_D(PHY,"round %d\n",*round);
+    
+      //    else if ((subframe_m4==5) || (subframe_m4==6)) {
+      //      *harq_pid = 0;//DLSCH_ptr->harq_ids[subframe_m4];//Ankit
+      //     *round    = DLSCH_ptr->harq_processes[*harq_pid]->round;
+      //    }
+    }
+    else {
+      // get first free harq_pid (i.e. round 0)
+      for (i=0;i<DLSCH_ptr->Mdlharq;i++) {
+	if (DLSCH_ptr->harq_processes[i]!=NULL) {
+	  if (DLSCH_ptr->harq_processes[i]->status != ACTIVE) {
+	    *harq_pid = i;//0;//i; //(Ankit)
+	    *round = 0;
+	    return(0);
+	  }
+	  else {
+	    LOG_D(PHY,"process %d is active\n",i);
+	  }
+	}
+	else {
+	  LOG_E(PHY,"[eNB %d] DLSCH process %d for rnti %x (UE_id %d) not allocated\n",Mod_id,i,rnti,UE_id);
+	  return(-1);
+	}
       }
+    }
   }
   else {  // This is a UL request
 
-      ULSCH_ptr = PHY_vars_eNB_g[Mod_id]->ulsch_eNB[(u32)UE_id];
-      ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,subframe);
-      ulsch_frame    = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,frame,subframe);
-      // Note this is for TDD configuration 3,4,5 only
-      *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,
-          ulsch_frame,
-          ulsch_subframe);
-      *round    = ULSCH_ptr->harq_processes[*harq_pid]->round;
-      LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Checking HARQ, round %d\n",Mod_id,*harq_pid,frame,subframe,*round);
+    ULSCH_ptr = PHY_vars_eNB_g[Mod_id]->ulsch_eNB[(u32)UE_id];
+    ulsch_subframe = pdcch_alloc2ul_subframe(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,subframe);
+    ulsch_frame    = pdcch_alloc2ul_frame(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,frame,subframe);
+    // Note this is for TDD configuration 3,4,5 only
+    *harq_pid = subframe2harq_pid(&PHY_vars_eNB_g[Mod_id]->lte_frame_parms,
+				  ulsch_frame,
+				  ulsch_subframe);
+    *round    = ULSCH_ptr->harq_processes[*harq_pid]->round;
+    LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Checking HARQ, round %d\n",Mod_id,*harq_pid,frame,subframe,*round);
   }
   return(0);
 }
@@ -299,69 +300,69 @@ int get_nCCE_offset(unsigned char L, int nCCE, int common_dci, unsigned short rn
     for (i=0;i<nCCE;i++)
     printf("%d.",CCE_table[i]);
     printf("\n");
-   */
+  */
   if (common_dci == 1) {
-      // check CCE(0 ... L-1)
-      nb_candidates = (L==4) ? 4 : 2;
-      for (m = 0 ; m < nb_candidates ; m++) {
-          search_space_free = 1;
-          for (l=0;l<L;l++) {
-              if (CCE_table[(m*L) + l] == 1) {
-                  search_space_free = 0;
-                  break;
-              }
-          }
-          if (search_space_free == 1) {
-              for (l=0;l<L;l++)
-                CCE_table[(m*L)+l]=1;
-              return(m*L);
-          }
+    // check CCE(0 ... L-1)
+    nb_candidates = (L==4) ? 4 : 2;
+    for (m = 0 ; m < nb_candidates ; m++) {
+      search_space_free = 1;
+      for (l=0;l<L;l++) {
+	if (CCE_table[(m*L) + l] == 1) {
+	  search_space_free = 0;
+	  break;
+	}
       }
-      return(-1);
+      if (search_space_free == 1) {
+	for (l=0;l<L;l++)
+	  CCE_table[(m*L)+l]=1;
+	return(m*L);
+      }
+    }
+    return(-1);
 
   }
   else {  // Find first available in ue specific search space
-      // according to procedure in Section 9.1.1 of 36.213 (v. 8.6)
-      // compute Yk
-      Yk = (unsigned int)rnti;
-
-      for (i=0;i<=subframe;i++)
-        Yk = (Yk*39827)%65537;
-
-      Yk = Yk % (nCCE/L);
-
-
-      switch (L) {
-      case 1:
-      case 2:
-        nb_candidates = 6;
-        break;
-      case 4:
-      case 8:
-        nb_candidates = 2;
-        break;
-      default:
-        DevParam(L, nCCE, rnti);
-        break;
-      }
-
-      //        LOG_I(PHY,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates);
-
-      for (m = 0 ; m < nb_candidates ; m++) {
-          search_space_free = 1;
-          for (l=0;l<L;l++) {
-              if (CCE_table[(((Yk+m)%(nCCE/L))*L) + l] == 1) {
-                  search_space_free = 0;
-                  break;
-              }
-          }
-          if (search_space_free == 1) {
-              for (l=0;l<L;l++)
-                CCE_table[(((Yk+m)%(nCCE/L))*L)+l]=1;
-              return(((Yk+m)%(nCCE/L))*L);
-          }
+          // according to procedure in Section 9.1.1 of 36.213 (v. 8.6)
+    // compute Yk
+    Yk = (unsigned int)rnti;
+
+    for (i=0;i<=subframe;i++)
+      Yk = (Yk*39827)%65537;
+
+    Yk = Yk % (nCCE/L);
+
+
+    switch (L) {
+    case 1:
+    case 2:
+      nb_candidates = 6;
+      break;
+    case 4:
+    case 8:
+      nb_candidates = 2;
+      break;
+    default:
+      DevParam(L, nCCE, rnti);
+      break;
+    }
+
+    //        LOG_I(PHY,"rnti %x, Yk = %d, nCCE %d (nCCE/L %d),nb_cand %d\n",rnti,Yk,nCCE,nCCE/L,nb_candidates);
+
+    for (m = 0 ; m < nb_candidates ; m++) {
+      search_space_free = 1;
+      for (l=0;l<L;l++) {
+	if (CCE_table[(((Yk+m)%(nCCE/L))*L) + l] == 1) {
+	  search_space_free = 0;
+	  break;
+	}
       }
-      return(-1);
+      if (search_space_free == 1) {
+	for (l=0;l<L;l++)
+	  CCE_table[(((Yk+m)%(nCCE/L))*L)+l]=1;
+	return(((Yk+m)%(nCCE/L))*L);
+      }
+    }
+    return(-1);
   }
 }
 
@@ -381,13 +382,13 @@ void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_
   msg("[PHY][eNB %d] Frame %d, slot %d: Generating pilots for DL-S\n",
   phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot);
   #endif
-
+    
   for (sect_id=0;sect_id<number_of_cards;sect_id++) {
   if (abstraction_flag == 0) {
 
   for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
-
-
+	  
+	  
   #ifdef IFFT_FPGA
   memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)],
   0,(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)*sizeof(mod_sym_t));
@@ -404,13 +405,13 @@ void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_
 
   msg("[PHY][eNB] Frame %d, subframe %d Generating PSS\n",
   phy_vars_eNB->frame,next_slot>>1);
-
+	
   generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
   4*AMP,
   &phy_vars_eNB->lte_frame_parms,
   2,
   next_slot);
-
+      
   }
   else {
   #ifdef PHY_ABSTRACTION
@@ -420,7 +421,7 @@ void phy_procedures_emos_eNB_TX(unsigned char next_slot, PHY_VARS_eNB *phy_vars_
   }
   }
   }
- */
+*/ 
 
 void phy_procedures_eNB_S_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8 abstraction_flag,relaying_type_t r_type) {
 
@@ -431,30 +432,30 @@ void phy_procedures_eNB_S_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,
 #endif    
 
   if (last_slot%2 == 0) {
-      for (sect_id=0;sect_id<number_of_cards;sect_id++) {
-
-          if (abstraction_flag == 0) {
-              lte_eNB_I0_measurements(phy_vars_eNB,
-                  sect_id,
-                  phy_vars_eNB->first_run_I0_measurements);
-          }
+    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
+    
+      if (abstraction_flag == 0) {
+	lte_eNB_I0_measurements(phy_vars_eNB,
+				sect_id,
+				phy_vars_eNB->first_run_I0_measurements);
+      }
 #ifdef PHY_ABSTRACTION
-          else {
-              lte_eNB_I0_measurements_emul(phy_vars_eNB,
-                  sect_id);
-          }
-#endif
+      else {
+	lte_eNB_I0_measurements_emul(phy_vars_eNB,
+				     sect_id);
       }
-
-      if (I0_clear == 1)
-        I0_clear = 0;
+#endif
+    }
+    
+    if (I0_clear == 1)
+      I0_clear = 0;
   }
-
+  
 }
 
 #ifdef EMOS
 void phy_procedures_emos_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB) {
-
+  
   u8 aa;
   u16 last_subframe_emos;
   u16 pilot_pos1 = 3 - phy_vars_eNB->lte_frame_parms.Ncp, pilot_pos2 = 10 - 2*phy_vars_eNB->lte_frame_parms.Ncp;
@@ -466,44 +467,44 @@ void phy_procedures_emos_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_e
     last_subframe_emos = (last_slot-4)>>1;
   else 
     mac_xface->macphy_exit("should never happen");
-   */
+  */
   last_subframe_emos=0;
 
 #ifdef EMOS_CHANNEL
   //if (last_slot%2==1) // this is for all UL subframes
   if (last_slot==7) 
     for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
-        memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*phy_vars_eNB->lte_frame_parms.N_RB_UL*12],
-            &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos1],
-            phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int));
-        memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*phy_vars_eNB->lte_frame_parms.N_RB_UL*12],
-            &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos2],
-            phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int));
+      memcpy(&emos_dump_eNB.channel[aa][last_subframe_emos*2*phy_vars_eNB->lte_frame_parms.N_RB_UL*12],              
+	     &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos1],
+	     phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int));
+      memcpy(&emos_dump_eNB.channel[aa][(last_subframe_emos*2+1)*phy_vars_eNB->lte_frame_parms.N_RB_UL*12],          
+	     &phy_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][aa][phy_vars_eNB->lte_frame_parms.N_RB_UL*12*pilot_pos2],
+	     phy_vars_eNB->lte_frame_parms.N_RB_UL*12*sizeof(int));
     }
 #endif
 
   if (last_slot==9) {
-      emos_dump_eNB.timestamp = rt_get_time_ns();
-      emos_dump_eNB.frame_tx = phy_vars_eNB->frame;
-      emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB;
-      emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0];
-      memcpy(&emos_dump_eNB.PHY_measurements_eNB,
-          &phy_vars_eNB->PHY_measurements_eNB[0],
-          sizeof(PHY_MEASUREMENTS_eNB));
-      memcpy(&emos_dump_eNB.eNB_UE_stats[0],&phy_vars_eNB->eNB_UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats));
-
-      bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_eNB, sizeof(fifo_dump_emos_eNB));
-      //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test"));
-      if (bytes!=sizeof(fifo_dump_emos_eNB)) {
-          LOG_W(PHY,"[eNB %d] Frame %d, slot %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n",
-              phy_vars_eNB->Mod_id,phy_vars_eNB->frame, last_slot,bytes,sizeof(fifo_dump_emos_eNB));
-      }
-      else {
-          if (phy_vars_eNB->frame%100==0) {
-              LOG_I(PHY,"[eNB %d] Frame %d (%d), slot %d, Writing %d bytes EMOS data to FIFO\n",
-                  phy_vars_eNB->Mod_id,phy_vars_eNB->frame, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, last_slot, bytes);
-          }
+    emos_dump_eNB.timestamp = rt_get_time_ns();
+    emos_dump_eNB.frame_tx = phy_vars_eNB->frame;
+    emos_dump_eNB.rx_total_gain_dB = phy_vars_eNB->rx_total_gain_eNB_dB;
+    emos_dump_eNB.mimo_mode = phy_vars_eNB->transmission_mode[0];
+    memcpy(&emos_dump_eNB.PHY_measurements_eNB,
+           &phy_vars_eNB->PHY_measurements_eNB[0],
+           sizeof(PHY_MEASUREMENTS_eNB));
+    memcpy(&emos_dump_eNB.eNB_UE_stats[0],&phy_vars_eNB->eNB_UE_stats[0],NUMBER_OF_UE_MAX*sizeof(LTE_eNB_UE_stats));
+
+    bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_eNB, sizeof(fifo_dump_emos_eNB));
+    //bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, "test", sizeof("test"));
+    if (bytes!=sizeof(fifo_dump_emos_eNB)) {
+      LOG_W(PHY,"[eNB %d] Frame %d, slot %d, Problem writing EMOS data to FIFO (bytes=%d, size=%d)\n",
+            phy_vars_eNB->Mod_id,phy_vars_eNB->frame, last_slot,bytes,sizeof(fifo_dump_emos_eNB));
+    }
+    else {
+      if (phy_vars_eNB->frame%100==0) {
+        LOG_I(PHY,"[eNB %d] Frame %d (%d), slot %d, Writing %d bytes EMOS data to FIFO\n",
+              phy_vars_eNB->Mod_id,phy_vars_eNB->frame, ((fifo_dump_emos_eNB*)&emos_dump_eNB)->frame_tx, last_slot, bytes);
       }
+    }
   }
 }
 #endif
@@ -523,30 +524,30 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
     rand = (rand%5)+5;
     else
     rand = (rand%4)+5;
-   */
+  */
 
   DCI_pdu->Num_common_dci = 0;
   DCI_pdu->Num_ue_spec_dci=0;
 
   switch (subframe) {
-  case 5:
-    DCI_pdu->Num_common_dci = 1;
-    DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
-    DCI_pdu->dci_alloc[0].L          = 2;
-    DCI_pdu->dci_alloc[0].rnti       = SI_RNTI;
-    DCI_pdu->dci_alloc[0].format     = format1A;
-    DCI_pdu->dci_alloc[0].ra_flag    = 0;
+      case 5:
+      DCI_pdu->Num_common_dci = 1;
+      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1A_5MHz_TDD_1_6_t;
+      DCI_pdu->dci_alloc[0].L          = 2;
+      DCI_pdu->dci_alloc[0].rnti       = SI_RNTI;
+      DCI_pdu->dci_alloc[0].format     = format1A;
+      DCI_pdu->dci_alloc[0].ra_flag    = 0;
 
-    BCCH_alloc_pdu.type              = 1;
-    BCCH_alloc_pdu.vrb_type          = 0;
-    BCCH_alloc_pdu.rballoc           = computeRIV(25,10,3);
-    BCCH_alloc_pdu.ndi               = 1;
-    BCCH_alloc_pdu.rv                = 1;
-    BCCH_alloc_pdu.mcs               = 1;
-    BCCH_alloc_pdu.harq_pid          = 0;
-    BCCH_alloc_pdu.TPC               = 1;      // set to 3 PRB
-    memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&BCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
-    break;
+      BCCH_alloc_pdu.type              = 1;
+      BCCH_alloc_pdu.vrb_type          = 0;
+      BCCH_alloc_pdu.rballoc           = computeRIV(25,10,3);
+      BCCH_alloc_pdu.ndi               = 1;
+      BCCH_alloc_pdu.rv                = 1;
+      BCCH_alloc_pdu.mcs               = 1;
+      BCCH_alloc_pdu.harq_pid          = 0;
+      BCCH_alloc_pdu.TPC               = 1;      // set to 3 PRB
+      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&BCCH_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
+      break;
   case 6:
     /*
       DCI_pdu->Num_ue_spec_dci = 1;
@@ -566,30 +567,30 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
       DLSCH_alloc_pdu1.rv1              = 0;
       DLSCH_alloc_pdu1.tpmi             = 0;
       memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1,sizeof(DCI2_5MHz_2A_M10PRB_TDD_t));
-     */
+    */
     break;
   case 7:
     DCI_pdu->Num_ue_spec_dci = 1;
-
+    
     if (transmission_mode<3) {
-        //user 1
-        DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
-        DCI_pdu->dci_alloc[0].L          = 2;
-        DCI_pdu->dci_alloc[0].rnti       = 0x1235;
-        DCI_pdu->dci_alloc[0].format     = format1;
-        DCI_pdu->dci_alloc[0].ra_flag    = 0;
-
-        DLSCH_alloc_pdu.rballoc          = rballoc;
-        DLSCH_alloc_pdu.TPC              = 0;
-        DLSCH_alloc_pdu.dai              = 0;
-        DLSCH_alloc_pdu.harq_pid         = 0;
-        DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
-        //DLSCH_alloc_pdu.mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
-        DLSCH_alloc_pdu.ndi              = 1;
-        DLSCH_alloc_pdu.rv               = 0;
-        memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
-
-        /*
+      //user 1
+      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; 
+      DCI_pdu->dci_alloc[0].L          = 2;
+      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
+      DCI_pdu->dci_alloc[0].format     = format1;
+      DCI_pdu->dci_alloc[0].ra_flag    = 0;
+      
+      DLSCH_alloc_pdu.rballoc          = rballoc;
+      DLSCH_alloc_pdu.TPC              = 0;
+      DLSCH_alloc_pdu.dai              = 0;
+      DLSCH_alloc_pdu.harq_pid         = 0;
+      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      //DLSCH_alloc_pdu.mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);      
+      DLSCH_alloc_pdu.ndi              = 1;
+      DLSCH_alloc_pdu.rv               = 0;
+      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
+
+      /*
       //user2
       DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; 
       DCI_pdu->dci_alloc[1].L          = 2;
@@ -606,50 +607,50 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
       DLSCH_alloc_pdu.ndi              = 1;
       DLSCH_alloc_pdu.rv               = 0;
       memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
-         */
+      */
     }
     else if (transmission_mode==5) {
-        DCI_pdu->Num_ue_spec_dci = 2;
-        // user 1
-        DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
-        DCI_pdu->dci_alloc[0].L          = 3;
-        DCI_pdu->dci_alloc[0].rnti       = 0x1235;
-        DCI_pdu->dci_alloc[0].format     = format1E_2A_M10PRB;
-        DCI_pdu->dci_alloc[0].ra_flag    = 0;
-
-        DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
-        DLSCH_alloc_pdu1E.rv               = 0;
-        DLSCH_alloc_pdu1E.ndi              = 1;
-        //DLSCH_alloc_pdu1E.mcs            = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
-        //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
-        DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
-        //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
-        phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
-        DLSCH_alloc_pdu1E.harq_pid         = 0;
-        DLSCH_alloc_pdu1E.dai              = 0;
-        DLSCH_alloc_pdu1E.TPC              = 0;
-        DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
-        DLSCH_alloc_pdu1E.rah              = 0;
-        DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
-        memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
-        //user 2
-        DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
-        DCI_pdu->dci_alloc[1].L          = 0;
-        DCI_pdu->dci_alloc[1].rnti       = 0x1236;
-        DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
-        DCI_pdu->dci_alloc[1].ra_flag    = 0;
-        //DLSCH_alloc_pdu1E.mcs            = openair_daq_vars.target_ue_dl_mcs;
-        //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
-        //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
-        DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((phy_vars_eNB->frame%1024)/3)%28);
-        phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
-
-        memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
-        // set the precoder of the second UE orthogonal to the first
-        phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
-    }
+      DCI_pdu->Num_ue_spec_dci = 2;
+      // user 1
+      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
+      DCI_pdu->dci_alloc[0].L          = 3;
+      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
+      DCI_pdu->dci_alloc[0].format     = format1E_2A_M10PRB;
+      DCI_pdu->dci_alloc[0].ra_flag    = 0;
+      
+      DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
+      DLSCH_alloc_pdu1E.rv               = 0;
+      DLSCH_alloc_pdu1E.ndi              = 1;
+      //DLSCH_alloc_pdu1E.mcs            = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
+      DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);      
+      phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
+      DLSCH_alloc_pdu1E.harq_pid         = 0;
+      DLSCH_alloc_pdu1E.dai              = 0;
+      DLSCH_alloc_pdu1E.TPC              = 0;
+      DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
+      DLSCH_alloc_pdu1E.rah              = 0;
+      DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
+      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+      
+      //user 2
+      DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
+      DCI_pdu->dci_alloc[1].L          = 0;
+      DCI_pdu->dci_alloc[1].rnti       = 0x1236;
+      DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
+      DCI_pdu->dci_alloc[1].ra_flag    = 0;
+      //DLSCH_alloc_pdu1E.mcs            = openair_daq_vars.target_ue_dl_mcs; 
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
+      //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
+      DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((phy_vars_eNB->frame%1024)/3)%28);
+      phy_vars_eNB->eNB_UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
+      
+      memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+
+      // set the precoder of the second UE orthogonal to the first
+      phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); 
+      }
     break;
     /*
   case 8:
@@ -671,7 +672,7 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
 
     memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],&RA_alloc_pdu,sizeof(DCI1A_5MHz_TDD_1_6_t));
     break;
-     */
+    */
   case 9:
     DCI_pdu->Num_ue_spec_dci = 2;
 
@@ -692,7 +693,7 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
     UL_alloc_pdu.dai     = 0;
     UL_alloc_pdu.cqi_req = 1;
     memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
-
+       
     DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI0_5MHz_TDD_1_6_t ; 
     DCI_pdu->dci_alloc[1].L          = 2;
     DCI_pdu->dci_alloc[1].rnti       = 0x1236;
@@ -724,7 +725,7 @@ void fill_dci(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
 
   DCI_pdu->nCCE = 0;
   for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) {
-      DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
+    DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
   }
 
 }
@@ -744,40 +745,40 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
     rand = (rand%5)+5;
   else
     rand = (rand%4)+5;
-   */
+  */
 
   DCI_pdu->Num_common_dci = 0;
   DCI_pdu->Num_ue_spec_dci=0;
 
   switch (subframe) {
-  case 5:
+   case 5:
     DCI_pdu->Num_ue_spec_dci = 1;
-
+    
     if (transmission_mode<3) {
-        //user 1
-        DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t;
-        DCI_pdu->dci_alloc[0].L          = 2;
-        DCI_pdu->dci_alloc[0].rnti       = 0x1235;
-        DCI_pdu->dci_alloc[0].format     = format1;
-        DCI_pdu->dci_alloc[0].ra_flag    = 0;
-
-        DLSCH_alloc_pdu.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
-        DLSCH_alloc_pdu.TPC              = 0;
-        DLSCH_alloc_pdu.dai              = 0;
-        DLSCH_alloc_pdu.harq_pid         = 1;
-        DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
-        DLSCH_alloc_pdu.ndi              = 1;
-        DLSCH_alloc_pdu.rv               = 0;
-        memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
-
-        /*
+      //user 1
+      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1_5MHz_TDD_t; 
+      DCI_pdu->dci_alloc[0].L          = 2;
+      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
+      DCI_pdu->dci_alloc[0].format     = format1;
+      DCI_pdu->dci_alloc[0].ra_flag    = 0;
+      
+      DLSCH_alloc_pdu.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
+      DLSCH_alloc_pdu.TPC              = 0;
+      DLSCH_alloc_pdu.dai              = 0;
+      DLSCH_alloc_pdu.harq_pid         = 1;
+      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      DLSCH_alloc_pdu.ndi              = 1;
+      DLSCH_alloc_pdu.rv               = 0;
+      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
+
+      /*
       //user2
       DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1_5MHz_TDD_t; 
       DCI_pdu->dci_alloc[1].L          = 2;
       DCI_pdu->dci_alloc[1].rnti       = 0x1236;
       DCI_pdu->dci_alloc[1].format     = format1;
       DCI_pdu->dci_alloc[1].ra_flag    = 0;
-
+      
       DLSCH_alloc_pdu.rballoc          = rballoc2;
       DLSCH_alloc_pdu.TPC              = 0;
       DLSCH_alloc_pdu.dai              = 0;
@@ -786,40 +787,40 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
       DLSCH_alloc_pdu.ndi              = 1;
       DLSCH_alloc_pdu.rv               = 0;
       memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
-         */
+      */
     }
     else if (transmission_mode==5) {
-        DCI_pdu->Num_ue_spec_dci = 2;
-        // user 1
-        DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
-        DCI_pdu->dci_alloc[0].L          = 2;
-        DCI_pdu->dci_alloc[0].rnti       = 0x1235;
-        DCI_pdu->dci_alloc[0].format     = format1E_2A_M10PRB;
-        DCI_pdu->dci_alloc[0].ra_flag    = 0;
-
-        DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
-        DLSCH_alloc_pdu1E.rv               = 0;
-        DLSCH_alloc_pdu1E.ndi              = 1;
-        DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
-        DLSCH_alloc_pdu1E.harq_pid         = 1;
-        DLSCH_alloc_pdu1E.dai              = 0;
-        DLSCH_alloc_pdu1E.TPC              = 0;
-        DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
-        DLSCH_alloc_pdu1E.rah              = 0;
-        DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
-        memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
-        //user 2
-        DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t;
-        DCI_pdu->dci_alloc[1].L          = 2;
-        DCI_pdu->dci_alloc[1].rnti       = 0x1236;
-        DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
-        DCI_pdu->dci_alloc[1].ra_flag    = 0;
-
-        memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
-
-        // set the precoder of the second UE orthogonal to the first
-        phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555);
+      DCI_pdu->Num_ue_spec_dci = 2;
+      // user 1
+      DCI_pdu->dci_alloc[0].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
+      DCI_pdu->dci_alloc[0].L          = 2;
+      DCI_pdu->dci_alloc[0].rnti       = 0x1235;
+      DCI_pdu->dci_alloc[0].format     = format1E_2A_M10PRB;
+      DCI_pdu->dci_alloc[0].ra_flag    = 0;
+      
+      DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
+      DLSCH_alloc_pdu1E.rv               = 0;
+      DLSCH_alloc_pdu1E.ndi              = 1;
+      DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      DLSCH_alloc_pdu1E.harq_pid         = 1;
+      DLSCH_alloc_pdu1E.dai              = 0;
+      DLSCH_alloc_pdu1E.TPC              = 0;
+      DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
+      DLSCH_alloc_pdu1E.rah              = 0;
+      DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
+      memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+      
+      //user 2
+      DCI_pdu->dci_alloc[1].dci_length = sizeof_DCI1E_5MHz_2A_M10PRB_TDD_t; 
+      DCI_pdu->dci_alloc[1].L          = 2;
+      DCI_pdu->dci_alloc[1].rnti       = 0x1236;
+      DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
+      DCI_pdu->dci_alloc[1].ra_flag    = 0;
+      
+      memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
+
+      // set the precoder of the second UE orthogonal to the first
+      phy_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); 
     }
     break;
 
@@ -888,16 +889,16 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, u8 subframe, PHY_VARS_eNB *phy_vars_eNB) {
     UL_alloc_pdu.dai     = 0;
     UL_alloc_pdu.cqi_req = 1;
     memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&UL_alloc_pdu,sizeof(DCI0_5MHz_TDD_1_6_t));
-     */
+    */
     break;
-
+    
   default:
     break;
   }
 
   DCI_pdu->nCCE = 0;
   for (i=0;i<DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci;i++) {
-      DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
+    DCI_pdu->nCCE += (1<<(DCI_pdu->dci_alloc[i].L));
   }
 
 }
@@ -915,102 +916,102 @@ int QPSK2[4]={AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),((
 extern PHY_MEASUREMENTS PHY_measurements;
 
 void phy_eNB_lte_measurement_thresholds_test_and_report(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP, uint16_t valP) {
-  MessageDef *message_p = NULL;
-  if (
-      (
-          ((threshold_phy_pP->threshold.threshold_val <  valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) ||
-          ((threshold_phy_pP->threshold.threshold_val >  valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD))
-      )  ||
-      (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD)
-  ){
-      message_p = itti_alloc_new_message(TASK_PHY_ENB , PHY_MEAS_REPORT_IND);
-      memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p)));
-
-      memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold,
-          &threshold_phy_pP->threshold,
-          sizeof(PHY_MEAS_REPORT_IND (message_p).threshold));
-
-      memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param,
-          &threshold_phy_pP->link_param,
-          sizeof(PHY_MEAS_REPORT_IND (message_p).link_param));\
-
-          switch (threshold_phy_pP->link_param.choice) {
-          case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL:
-            PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP;
-            break;
-          case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL:
-            //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val.
-            AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n");
-            break;
-          }
-          itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p);
-  }
+    MessageDef *message_p = NULL;
+    if (
+           (
+               ((threshold_phy_pP->threshold.threshold_val <  valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_ABOVE_THRESHOLD)) ||
+               ((threshold_phy_pP->threshold.threshold_val >  valP) && (threshold_phy_pP->threshold.threshold_xdir == RAL_BELOW_THRESHOLD))
+           )  ||
+           (threshold_phy_pP->threshold.threshold_xdir == RAL_NO_THRESHOLD)
+       ){
+        message_p = itti_alloc_new_message(TASK_PHY_ENB , PHY_MEAS_REPORT_IND);
+        memset(&PHY_MEAS_REPORT_IND(message_p), 0, sizeof(PHY_MEAS_REPORT_IND(message_p)));
+
+        memcpy(&PHY_MEAS_REPORT_IND (message_p).threshold,
+                &threshold_phy_pP->threshold,
+                sizeof(PHY_MEAS_REPORT_IND (message_p).threshold));
+
+        memcpy(&PHY_MEAS_REPORT_IND (message_p).link_param,
+                &threshold_phy_pP->link_param,
+                sizeof(PHY_MEAS_REPORT_IND (message_p).link_param));\
+
+        switch (threshold_phy_pP->link_param.choice) {
+            case RAL_LINK_PARAM_CHOICE_LINK_PARAM_VAL:
+                PHY_MEAS_REPORT_IND (message_p).link_param._union.link_param_val = valP;
+                break;
+            case RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL:
+                //PHY_MEAS_REPORT_IND (message_p).link_param._union.qos_param_val.
+                AssertFatal (1 == 0, "TO DO RAL_LINK_PARAM_CHOICE_QOS_PARAM_VAL\n");
+                break;
+        }
+        itti_send_msg_to_task(TASK_RRC_ENB, instanceP, message_p);
+    }
 }
 
 void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold_phy_t* threshold_phy_pP) {
-  unsigned int  mod_id;
-
-  mod_id = instanceP;
+    unsigned int  mod_id;
+
+    mod_id = instanceP;
+
+    switch (threshold_phy_pP->link_param.link_param_type.choice) {
+
+        case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
+            switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
+                case RAL_LINK_PARAM_GEN_DATA_RATE:
+                    phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
+                    break;
+                case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH:
+                    phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
+                    break;
+                case RAL_LINK_PARAM_GEN_SINR:
+                    phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
+                    break;
+                case RAL_LINK_PARAM_GEN_THROUGHPUT:
+                    break;
+                case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE:
+                    break;
+                default:;
+            }
+            break;
 
-  switch (threshold_phy_pP->link_param.link_param_type.choice) {
+        case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
+            switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
+                case RAL_LINK_PARAM_LTE_UE_RSRP:
+                    break;
+                case RAL_LINK_PARAM_LTE_UE_RSRQ:
+                    break;
+                case RAL_LINK_PARAM_LTE_UE_CQI:
+                    break;
+                case RAL_LINK_PARAM_LTE_AVAILABLE_BW:
+                    break;
+                case RAL_LINK_PARAM_LTE_PACKET_DELAY:
+                    break;
+                case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE:
+                    break;
+                case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS:
+                    break;
+                case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES:
+                    break;
+                case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY:
+                    break;
+                case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY:
+                    break;
+                case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS:
+                    break;
+                case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW:
+                    break;
+                default:;
+            }
+            break;
 
-  case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
-    switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
-    case RAL_LINK_PARAM_GEN_DATA_RATE:
-      phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
-      break;
-    case RAL_LINK_PARAM_GEN_SIGNAL_STRENGTH:
-      phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
-      break;
-    case RAL_LINK_PARAM_GEN_SINR:
-      phy_eNB_lte_measurement_thresholds_test_and_report(instanceP, threshold_phy_pP, 0);
-      break;
-    case RAL_LINK_PARAM_GEN_THROUGHPUT:
-      break;
-    case RAL_LINK_PARAM_GEN_PACKET_ERROR_RATE:
-      break;
-    default:;
+        default:;
     }
-    break;
-
-    case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
-      switch (threshold_phy_pP->link_param.link_param_type._union.link_param_gen) {
-      case RAL_LINK_PARAM_LTE_UE_RSRP:
-        break;
-      case RAL_LINK_PARAM_LTE_UE_RSRQ:
-        break;
-      case RAL_LINK_PARAM_LTE_UE_CQI:
-        break;
-      case RAL_LINK_PARAM_LTE_AVAILABLE_BW:
-        break;
-      case RAL_LINK_PARAM_LTE_PACKET_DELAY:
-        break;
-      case RAL_LINK_PARAM_LTE_PACKET_LOSS_RATE:
-        break;
-      case RAL_LINK_PARAM_LTE_L2_BUFFER_STATUS:
-        break;
-      case RAL_LINK_PARAM_LTE_MOBILE_NODE_CAPABILITIES:
-        break;
-      case RAL_LINK_PARAM_LTE_EMBMS_CAPABILITY:
-        break;
-      case RAL_LINK_PARAM_LTE_JUMBO_FEASIBILITY:
-        break;
-      case RAL_LINK_PARAM_LTE_JUMBO_SETUP_STATUS:
-        break;
-      case RAL_LINK_PARAM_LTE_NUM_ACTIVE_EMBMS_RECEIVERS_PER_FLOW:
-        break;
-      default:;
-      }
-      break;
-
-      default:;
-  }
 }
 #   endif
 #endif
 
 void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 abstraction_flag,
-    relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
+			   relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
   u8 *pbch_pdu=&phy_vars_eNB->pbch_pdu[0];
   //  unsigned int nb_dci_ue_spec = 0, nb_dci_common = 0;
   u16 input_buffer_length, re_allocated=0;
@@ -1040,1080 +1041,1098 @@ void phy_procedures_eNB_TX(unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8
   // there is at least one allocation for PDCCH
   u8 smbv_alloc_cnt = 1;
 #endif
+
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
+  start_meas(&phy_vars_eNB->phy_proc_tx);
 
 #ifdef DEBUG_PHY_PROC
   LOG_D(PHY,"[%s %d] Frame %d subframe %d : Doing phy_procedures_eNB_TX(%d)\n", 
-      (r_type == multicast_relay) ? "RN/eNB" : "eNB",
-          phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1, next_slot);
+	(r_type == multicast_relay) ? "RN/eNB" : "eNB",
+	phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1, next_slot);
 #endif
 #ifdef OPENAIR2
   // Get scheduling info for next subframe during odd slot of previous subframe (next_slot is even)
   if (next_slot%2 == 0) 
     mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->frame,next_slot>>1);//,1);
 #endif
+
   for (sect_id = 0 ; sect_id < number_of_cards; sect_id++) {
 
-      if (abstraction_flag==0) {
-          if (next_slot%2 == 0) {
-              for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB;aa++) {
+    if (abstraction_flag==0) {
+      if (next_slot%2 == 0) {
+	for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB;aa++) {
+	 
 #ifdef IFFT_FPGA
-                  memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)],
-                      0,(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t));
+	  memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)],
+		 0,(phy_vars_eNB->lte_frame_parms.N_RB_DL*12)*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t));
 #else
-                  memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)],
-                      0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t));
+	  memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id][aa][next_slot*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti>>1)],
+		 0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(mod_sym_t));
+
 #endif
-              }
-          }
+	}
+      }
+    }
+    if (is_pmch_subframe(phy_vars_eNB->frame,next_slot>>1,&phy_vars_eNB->lte_frame_parms)) {
+      
+      if (abstraction_flag==0){
+	if ((next_slot%2) == 0) {
+	  // This is DL-Cell spec pilots in Control region
+	  generate_pilots_slot(phy_vars_eNB,
+			       phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			       AMP,
+			       next_slot,1);
+	}
       }
-      if (is_pmch_subframe(phy_vars_eNB->frame,next_slot>>1,&phy_vars_eNB->lte_frame_parms)) {
-
-          if (abstraction_flag==0){
-              if ((next_slot%2) == 0) {
-                  // This is DL-Cell spec pilots in Control region
-                  generate_pilots_slot(phy_vars_eNB,
-                      phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                      AMP,
-                      next_slot,1);
-              }
-          }
 #ifdef Rel10
-          // if mcch is active, send regardless of the node type: eNB or RN
-          // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing
-          mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1);
-          switch (r_type){
-          case no_relay:
-            if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
-              //if ((mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
-              LOG_I(PHY,"[eNB%d] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %d, TBS %d) \n",
-                  phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->mcs,
-                  phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
-            else {
-                LOG_D(PHY,"[DeNB %d] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %d (%s)\n",
-                    phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->sync_area,
-                    (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment");
-                mch_pduP = NULL;
-            }
-            break;
-          case multicast_relay:
-            if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){
-                //if (((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){
-                LOG_I(PHY,"[RN %d] Frame %d subframe %d: Got the MCH PDU for MBSFN  sync area %d (MCS %d, TBS %d)\n",
-                    phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,
-                    mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);
-            } else if (phy_vars_rn->mch_avtive[(next_slot>>1)%5] == 1){ // SF2 -> SF7, SF3 -> SF8
-                mch_pduP= &mch_pdu;
-                memcpy(&mch_pduP->payload, // could be a simple copy
-                    phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->b,
-                    phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3);
-                mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3);
-                mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->mcs;
-                LOG_I(PHY,"[RN %d] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %d (MCS %d, TBS %d)\n",
-                    phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,(next_slot>>1)%5,
-                    phy_vars_rn->sync_area[(next_slot>>1)%5],mch_pduP->mcs,mch_pduP->Pdu_size);
-            } else {
-                /* LOG_I(PHY,"[RN %d] Frame %d subframe %d: do not forward MCH pdu for MBSFN  sync area %d (MCS %d, TBS %d)\n",
+      // if mcch is active, send regardless of the node type: eNB or RN
+      // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing 
+	  mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1);
+	  switch (r_type){
+	  case no_relay:
+	    if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 
+	      //if ((mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0 
+	      LOG_I(PHY,"[eNB%d] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %d, TBS %d) \n",
+		    phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->mcs,
+		    phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
+	    else {
+	      LOG_D(PHY,"[DeNB %d] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %d (%s)\n",
+		    phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,mch_pduP->sync_area,
+		    (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment");
+	      mch_pduP = NULL;
+	    }
+	    break;
+	  case multicast_relay:
+	    if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){
+	      //if (((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)){
+	      LOG_I(PHY,"[RN %d] Frame %d subframe %d: Got the MCH PDU for MBSFN  sync area %d (MCS %d, TBS %d)\n",
+		    phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,
+		    mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);
+	    } else if (phy_vars_rn->mch_avtive[(next_slot>>1)%5] == 1){ // SF2 -> SF7, SF3 -> SF8
+	      mch_pduP= &mch_pdu;
+	      memcpy(&mch_pduP->payload, // could be a simple copy
+		     phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->b,
+		     phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3);
+	      mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->TBS>>3);
+	      mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[(next_slot>>1)%5]->harq_processes[0]->mcs;
+	      LOG_I(PHY,"[RN %d] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %d (MCS %d, TBS %d)\n",
+		    phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,(next_slot>>1)%5,
+		    phy_vars_rn->sync_area[(next_slot>>1)%5],mch_pduP->mcs,mch_pduP->Pdu_size);
+	    } else {
+	      /* LOG_I(PHY,"[RN %d] Frame %d subframe %d: do not forward MCH pdu for MBSFN  sync area %d (MCS %d, TBS %d)\n",
 		    phy_vars_rn->Mod_id,phy_vars_rn->frame, next_slot>>1,
 		    mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);*/
-                mch_pduP=NULL;
-            }
-            phy_vars_rn->mch_avtive[next_slot>>1]=0;
-            break;
-          default:
-            LOG_W(PHY,"[eNB %d] Frame %d subframe %d: unknown relaying type %d \n",
-                phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,r_type);
-            mch_pduP=NULL;
-            break;
-          }// switch
-
-          if (mch_pduP){
-              fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag);
-              // Generate PMCH
-              generate_mch(phy_vars_eNB,next_slot>>1,(uint8_t*)mch_pduP->payload,abstraction_flag);
+	      mch_pduP=NULL;
+	    }
+	    phy_vars_rn->mch_avtive[next_slot>>1]=0;
+	    break;
+	  default:
+	    LOG_W(PHY,"[eNB %d] Frame %d subframe %d: unknown relaying type %d \n",
+		  phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,r_type);
+	    mch_pduP=NULL;
+	    break;
+	    }// switch 
+	
+	  if (mch_pduP){
+	    fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag);
+	    // Generate PMCH
+	    generate_mch(phy_vars_eNB,next_slot>>1,(uint8_t*)mch_pduP->payload,abstraction_flag);
 #ifdef DEBUG_PHY
-              for (i=0;i<mch_pduP->Pdu_size;i++)
-                msg("%2x.",(uint8_t)mch_pduP->payload[i]);
-              msg("\n");
+	    for (i=0;i<mch_pduP->Pdu_size;i++)
+	      msg("%2x.",(uint8_t)mch_pduP->payload[i]);
+	    msg("\n");
 #endif 
-          } else {
-              LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->frame,next_slot>>1);
-          }
+	  } else {
+	    LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->frame,next_slot>>1);
+	  }
 #endif
-      }
-
-      else {
-          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
-
-          if (abstraction_flag==0){
-              generate_pilots_slot(phy_vars_eNB,
-                  phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                  AMP,
-                  next_slot,0);
-              generate_pilots_slot(phy_vars_eNB,
-                  phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                  AMP,
-                  next_slot+1,0);
-
-              vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0);
-
-              if (next_slot == 0) {
-
-                  // First half of PSS/SSS (FDD)
-                  if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
-                      generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                          AMP,
-                          &phy_vars_eNB->lte_frame_parms,
-                          (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
-                              0);
-                      generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                          AMP,
-                          &phy_vars_eNB->lte_frame_parms,
-                          (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
-                              0);
-                  }
-              }
-          }
+    }
+    
+    else {
+	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
+	
+	if (abstraction_flag==0){
+	  generate_pilots_slot(phy_vars_eNB,
+			       phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			       AMP,
+			       next_slot,0);
+	  generate_pilots_slot(phy_vars_eNB,
+			       phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			       AMP,
+			       next_slot+1,0);
+	  
+	  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0);
+	
+	  if (next_slot == 0) {
+	  
+	    // First half of PSS/SSS (FDD)
+	    if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+	      generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			   AMP,
+			   &phy_vars_eNB->lte_frame_parms,
+			   (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
+			   0);
+	      generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			   AMP,
+			   &phy_vars_eNB->lte_frame_parms,
+			   (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
+			   0);
+	    }
+	  }
+	}    
       }
       if (next_slot == 0) {
-
-          if ((phy_vars_eNB->frame&3) == 0) {
-              ((u8*) pbch_pdu)[2] = 0;
-              switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
-              case 6:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (0<<5);
-                break;
-              case 15:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (1<<5);
-                break;
-              case 25:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5);
-                break;
-              case 50:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (3<<5);
-                break;
-              case 75:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (4<<5);
-                break;
-              case 100:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (5<<5);
-                break;
-              default:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5);
-                break;
-              }
-              ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xef) |
-                  ((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10);
-
-              switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) {
-              case oneSixth:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (0<<2);
-                break;
-              case half:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (1<<2);
-                break;
-              case one:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (2<<2);
-                break;
-              case two:
-                ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (3<<2);
-                break;
-              default:
-                break;
-              }
-
-              ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xfc) | ((phy_vars_eNB->frame>>8)&0x3);
-              ((u8*) pbch_pdu)[1] = phy_vars_eNB->frame&0xfc;
-              ((u8*) pbch_pdu)[0] = 0;
-          }
-          /// First half of SSS (TDD)
-          if (abstraction_flag==0) {
-
-              if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-                  generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                      AMP,
-                      &phy_vars_eNB->lte_frame_parms,
-                      (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
-                          1);
-              }
-          }
-
-
-
-          frame_tx = (((int) (pbch_pdu[2]&0x3))<<8) + ((int) (pbch_pdu[1]&0xfc)) + phy_vars_eNB->frame%4;
-
+	
+	if ((phy_vars_eNB->frame&3) == 0) {
+	  ((u8*) pbch_pdu)[2] = 0;
+	  switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
+	  case 6:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (0<<5);
+	    break;
+	  case 15:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (1<<5);
+	    break;
+	  case 25:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5);
+	    break;
+	  case 50:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (3<<5);
+	    break;
+	  case 75:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (4<<5);
+	    break;
+          case 100:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (5<<5);
+	    break;
+	  default:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0x1f) | (2<<5);
+	    break;
+	  }
+	  ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xef) | 
+	    ((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10);
+	  
+	  switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) {
+	  case oneSixth:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (0<<2);
+	    break;
+	  case half:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (1<<2);
+	    break;
+	  case one:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (2<<2);
+	    break;
+	  case two:
+	    ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xf3) | (3<<2);
+	    break;
+	  default:
+	    break;
+	  }
+	  
+	  ((u8*) pbch_pdu)[2] = (((u8*) pbch_pdu)[2]&0xfc) | ((phy_vars_eNB->frame>>8)&0x3);
+	  ((u8*) pbch_pdu)[1] = phy_vars_eNB->frame&0xfc;
+	  ((u8*) pbch_pdu)[0] = 0;
+	}
+	/// First half of SSS (TDD)
+	if (abstraction_flag==0) {
+	  
+	  if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
+	    generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			 AMP,
+			 &phy_vars_eNB->lte_frame_parms,
+			 (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
+			 1);
+	  }
+	}
+	
+	
+	
+	frame_tx = (((int) (pbch_pdu[2]&0x3))<<8) + ((int) (pbch_pdu[1]&0xfc)) + phy_vars_eNB->frame%4;
+	
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d] Frame %d, slot %d: Calling generate_pbch, mode1_flag=%d, frame_tx=%d, pdu=%02x%02x%02x\n",
-              phy_vars_eNB->Mod_id,
-              phy_vars_eNB->frame,
-              next_slot,
-              phy_vars_eNB->lte_frame_parms.mode1_flag,
-              frame_tx,
-              ((u8*) pbch_pdu)[2],
-              ((u8*) pbch_pdu)[1],
-              ((u8*) pbch_pdu)[0]);
-#endif
-
-          if (abstraction_flag==0) {
-
-              generate_pbch(&phy_vars_eNB->lte_eNB_pbch,
-                  phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                  AMP,
-                  &phy_vars_eNB->lte_frame_parms,
-                  pbch_pdu,
-                  phy_vars_eNB->frame&3);
-
-          }
+	LOG_D(PHY,"[eNB %d] Frame %d, slot %d: Calling generate_pbch, mode1_flag=%d, frame_tx=%d, pdu=%02x%02x%02x\n",
+	      phy_vars_eNB->Mod_id,
+	      phy_vars_eNB->frame, 
+	      next_slot,
+	      phy_vars_eNB->lte_frame_parms.mode1_flag,
+	      frame_tx,
+	      ((u8*) pbch_pdu)[2],
+	      ((u8*) pbch_pdu)[1],
+	      ((u8*) pbch_pdu)[0]);
+#endif
+	
+	if (abstraction_flag==0) {
+	  
+	  generate_pbch(&phy_vars_eNB->lte_eNB_pbch,
+			phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			AMP,
+			&phy_vars_eNB->lte_frame_parms,
+			pbch_pdu,
+			phy_vars_eNB->frame&3);
+	  
+	}
 #ifdef PHY_ABSTRACTION
-          else {
-              generate_pbch_emul(phy_vars_eNB,pbch_pdu);
-          }
+	else {
+	  generate_pbch_emul(phy_vars_eNB,pbch_pdu); 
+	}
 #endif
       }
-
-
+      
+      
       if (next_slot == 2) {
-
-          if (abstraction_flag==0) {
-
-              if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-                  //	  printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1);
-                  generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                      AMP,
-                      &phy_vars_eNB->lte_frame_parms,
-                      2,
-                      2);
-              }
+	
+	if (abstraction_flag==0) {
+	  
+          if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
+	    //	  printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1);
+	    generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			 AMP,
+			 &phy_vars_eNB->lte_frame_parms,
+			 2,
+			 2);
           }
+	}
       } 
-
+      
       // Second half of PSS/SSS (FDD)
       if (next_slot == 10) {
-
-          if (abstraction_flag==0) {
-
-              if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
-                  generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                      AMP,
-                      &phy_vars_eNB->lte_frame_parms,
-                      (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
-                          10);
-                  generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                      AMP,
-                      &phy_vars_eNB->lte_frame_parms,
-                      (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
-                          10);
-
-              }
-          }
+	
+	if (abstraction_flag==0) {
+	  
+	  if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
+	    generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			 AMP,
+			 &phy_vars_eNB->lte_frame_parms,
+			 (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
+			 10);
+	    generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			 AMP,
+			 &phy_vars_eNB->lte_frame_parms,
+			 (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 5 : 4,
+			 10);
+	    
+	  }
+	}
       }
       //  Second-half of SSS (TDD)
       if (next_slot == 10) {
-          if (abstraction_flag==0) {
-
-              if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-                  generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                      AMP,
-                      &phy_vars_eNB->lte_frame_parms,
-                      (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
-                          11);
-              }
-          }
+	if (abstraction_flag==0) {
+	  
+	  if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
+	    generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			 AMP,
+			 &phy_vars_eNB->lte_frame_parms,
+			 (phy_vars_eNB->lte_frame_parms.Ncp==0) ? 6 : 5,
+			 11);
+	  }
+	}
       }
       // Second half of PSS (TDD)
       if (next_slot == 12) {
-
-          if (abstraction_flag==0) {
-
-              if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-                  //	    printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1);
-                  generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                      AMP,
-                      &phy_vars_eNB->lte_frame_parms,
-                      2,
-                      12);
-              }
-          }
+	
+	if (abstraction_flag==0) {
+	  
+	  if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
+	    //	    printf("Generating PSS (frame %d, subframe %d)\n",phy_vars_eNB->frame,next_slot>>1);
+	    generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+			 AMP,
+			 &phy_vars_eNB->lte_frame_parms,
+			 2,
+			 12);
+	  }
+	}
       }
-
-
-
-      //return;
-
-
-      sect_id=0;
-
-      if ((next_slot % 2)==0) {
-          //#ifdef DEBUG_PHY_PROC
-          //    msg("[PHY][eNB %d] UE %d: Mode %s\n",phy_vars_eNB->Mod_id,0,mode_string[phy_vars_eNB->eNB_UE_stats[0].mode]);
-          //#endif
+    
+      
+    
+    //return;
+    
+    
+    sect_id=0;
+    
+    if ((next_slot % 2)==0) {
+      //#ifdef DEBUG_PHY_PROC
+      //    msg("[PHY][eNB %d] UE %d: Mode %s\n",phy_vars_eNB->Mod_id,0,mode_string[phy_vars_eNB->eNB_UE_stats[0].mode]);
+      //#endif
 
 #if defined(SMBV) && !defined(EXMIMO)
-          // PBCH takes one allocation
-          if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-              if (next_slot==0)
+        // PBCH takes one allocation
+        if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+            if (next_slot==0) 
                 smbv_alloc_cnt++;
-          }
+        }
 #endif
-
+      
 #ifdef OPENAIR2
-          // if there are two users and we want to do cooperation
-          //    if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) && (phy_vars_eNB->eNB_UE_stats[1].mode == PUSCH))
-          //      mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,phy_vars_eNB->cooperation_flag,phy_vars_eNB->frame,next_slot>>1);//,1);
-          //    else
-
-
-          // Parse DCI received from MAC
-          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
-          DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id,
-              phy_vars_eNB->frame,
-              next_slot>>1);
+      // if there are two users and we want to do cooperation
+      //    if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) && (phy_vars_eNB->eNB_UE_stats[1].mode == PUSCH))
+      //      mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,phy_vars_eNB->cooperation_flag,phy_vars_eNB->frame,next_slot>>1);//,1);
+      //    else
+
+      
+      // Parse DCI received from MAC
+      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
+      DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id,
+				       phy_vars_eNB->frame,
+				       next_slot>>1);
 #else
-          DCI_pdu = &DCI_pdu_tmp;
+    DCI_pdu = &DCI_pdu_tmp;
 #ifdef EMOS
-          if (((phy_vars_eNB->frame%1024)%3 == 0) && (next_slot == 0)) {
-              //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28;
-              openair_daq_vars.target_ue_dl_mcs = taus()%28;
-              LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->frame,openair_daq_vars.target_ue_dl_mcs);
-          }
-          /*
-    if (phy_vars_eNB->frame > 28000) {
+    if (((phy_vars_eNB->frame%1024)%3 == 0) && (next_slot == 0)) {
+      //openair_daq_vars.target_ue_dl_mcs = (openair_daq_vars.target_ue_dl_mcs+1)%28;
+      openair_daq_vars.target_ue_dl_mcs = taus()%28;
+      LOG_D(PHY,"[MYEMOS] frame %d, increasing MCS to %d\n",phy_vars_eNB->frame,openair_daq_vars.target_ue_dl_mcs);
+    }
+    /*
+    if (phy_vars_eNB->frame > 28000) {
       LOG_E(PHY,"More that 28000 frames reached! Exiting!\n");
       mac_xface->macphy_exit("");
     } 
-           */
+    */     
 #endif
 #ifdef EMOS_CHANNEL
-          fill_dci_emos(DCI_pdu,next_slot>>1,phy_vars_eNB);
+    fill_dci_emos(DCI_pdu,next_slot>>1,phy_vars_eNB);
 #else
-          fill_dci(DCI_pdu,next_slot>>1,phy_vars_eNB);
+    fill_dci(DCI_pdu,next_slot>>1,phy_vars_eNB);
 #endif
 #endif
 
-          // clear existing ulsch dci allocations before applying info from MAC  (this is table
-          ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1);
-          ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1);
-
-          if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) ||
-              (phy_vars_eNB->lte_frame_parms.frame_type == 0)) {
-              harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe);
-              for (i=0;i<NUMBER_OF_UE_MAX;i++)
-                if (phy_vars_eNB->ulsch_eNB[i]) {
-                    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0;
-                    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0;
-                }
-          }
+    // clear existing ulsch dci allocations before applying info from MAC  (this is table
+    ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1);
+    ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1);
 
+    if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) ||
+	(phy_vars_eNB->lte_frame_parms.frame_type == 0)) {
+      harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe);
+      for (i=0;i<NUMBER_OF_UE_MAX;i++)
+	if (phy_vars_eNB->ulsch_eNB[i]) {
+	  phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0;
+	  phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0;
+	}
+    }
+  
 #ifdef EMOS
-          //emos_dump_eNB.dci_cnt[next_slot>>1] = DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci; //nb_dci_common+nb_dci_ue_spec;
+      //emos_dump_eNB.dci_cnt[next_slot>>1] = DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci; //nb_dci_common+nb_dci_ue_spec;
 #endif
-          // clear previous allocation information for all UEs
-          for (i=0;i<NUMBER_OF_UE_MAX;i++) {
-              phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[next_slot>>1] = 0;
-          }
-
-          init_nCCE_table();
-
-          num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
-              DCI_pdu->dci_alloc,
-              &phy_vars_eNB->lte_frame_parms,
-              next_slot>>1);
-          DCI_pdu->nCCE = get_nCCE(num_pdcch_symbols,
-              &phy_vars_eNB->lte_frame_parms,
-              get_mi(&phy_vars_eNB->lte_frame_parms,next_slot>>1));
-          LOG_D(PHY,"num_pdcch_symbols %d, nCCE %d\n",num_pdcch_symbols,DCI_pdu->nCCE);
-
+      // clear previous allocation information for all UEs
+      for (i=0;i<NUMBER_OF_UE_MAX;i++) {
+	phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[next_slot>>1] = 0;
+      }
+      
+      init_nCCE_table();
+      
+      num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
+						DCI_pdu->dci_alloc,
+						&phy_vars_eNB->lte_frame_parms,
+						next_slot>>1);
+      DCI_pdu->nCCE = get_nCCE(num_pdcch_symbols,
+			       &phy_vars_eNB->lte_frame_parms,
+			       get_mi(&phy_vars_eNB->lte_frame_parms,next_slot>>1));
+      LOG_D(PHY,"num_pdcch_symbols %d, nCCE %d\n",num_pdcch_symbols,DCI_pdu->nCCE);
+      
 #if defined(SMBV) && !defined(EXMIMO)
-          // Sets up PDCCH and DCI table
-          if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) {
-              msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->frame,next_slot>>1,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
-              dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]);
-              smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
-          }
+      // Sets up PDCCH and DCI table
+      if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) {
+          msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->frame,next_slot>>1,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
+          dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]);
+          smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
+      }
 #endif      
-
-          printf("PHY @0\n");
-          for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
+      
+      for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
 #ifdef DEBUG_PHY_PROC
-              if (DCI_pdu->dci_alloc[i].rnti != SI_RNTI) {
-                  LOG_D(PHY,"[eNB] Subframe %d : Doing DCI index %d/%d\n",next_slot>>1,i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci);
-                  dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
-              }
+	if (DCI_pdu->dci_alloc[i].rnti != SI_RNTI) {
+	  LOG_D(PHY,"[eNB] Subframe %d : Doing DCI index %d/%d\n",next_slot>>1,i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci);
+	  dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
+	}
 #endif
-              printf("PHY @1 %d\n",i);
-
-              if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) {
+	
+	if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) {
 #ifdef DEBUG_PHY_PROC
-                  LOG_D(PHY,"[eNB %d] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
-#endif
-                  generate_eNB_dlsch_params_from_dci(next_slot>>1,
-                      &DCI_pdu->dci_alloc[i].dci_pdu[0],
-                      DCI_pdu->dci_alloc[i].rnti,
-                      DCI_pdu->dci_alloc[i].format,
-                      &phy_vars_eNB->dlsch_eNB_SI,
-                      &phy_vars_eNB->lte_frame_parms,
-                      phy_vars_eNB->pdsch_config_dedicated,
-                      SI_RNTI,
-                      0,
-                      P_RNTI,
-                      phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
-
-                  if ((phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
-                      DCI_pdu->nCCE,
-                      1,
-                      SI_RNTI,
-                      next_slot>>1)) == -1) {
-                      LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (SI)!!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1);
-                  }
-                  else {
-                      LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (SI)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,
-                          phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1],DCI_pdu->nCCE);
+	  LOG_D(PHY,"[eNB %d] SI generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
+#endif
+	  generate_eNB_dlsch_params_from_dci(next_slot>>1,
+					     &DCI_pdu->dci_alloc[i].dci_pdu[0],
+					     DCI_pdu->dci_alloc[i].rnti,
+					     DCI_pdu->dci_alloc[i].format,
+					     &phy_vars_eNB->dlsch_eNB_SI,
+					     &phy_vars_eNB->lte_frame_parms,
+					     phy_vars_eNB->pdsch_config_dedicated,
+					     SI_RNTI,
+					     0,
+					     P_RNTI,
+					     phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+	  
+	  if ((phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
+										DCI_pdu->nCCE,
+										1,
+										SI_RNTI,
+										next_slot>>1)) == -1) {
+	    LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (SI)!!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1);
+	  } 
+	  else {
+	    LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (SI)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,
+		  phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1],DCI_pdu->nCCE);
 
 #if defined(SMBV) && !defined(EXMIMO)
-                      // configure SI DCI
-                      if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                          msg("[SMBV] Frame %3d, SI in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
-                          smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "SI", &DCI_pdu->dci_alloc[i], i);
-                      }
+        // configure SI DCI
+        if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+            msg("[SMBV] Frame %3d, SI in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
+            smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "SI", &DCI_pdu->dci_alloc[i], i);
+        }
 #endif
-                  }
-                  DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1];
-
-              }
-              else if (DCI_pdu->dci_alloc[i].ra_flag == 1) {
+	  }
+	  DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_SI->nCCE[next_slot>>1];
+	  
+	}
+	else if (DCI_pdu->dci_alloc[i].ra_flag == 1) {
 #ifdef DEBUG_PHY_PROC
-                  LOG_D(PHY,"[eNB %d] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
-#endif
-                  generate_eNB_dlsch_params_from_dci(next_slot>>1,
-                      &DCI_pdu->dci_alloc[i].dci_pdu[0],
-                      DCI_pdu->dci_alloc[i].rnti,
-                      DCI_pdu->dci_alloc[i].format,
-                      &phy_vars_eNB->dlsch_eNB_ra,
-                      &phy_vars_eNB->lte_frame_parms,
-                      phy_vars_eNB->pdsch_config_dedicated,
-                      SI_RNTI,
-                      DCI_pdu->dci_alloc[i].rnti,
-                      P_RNTI,
-                      phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
-
-                  //	  mac_xface->macphy_exit("Transmitted RAR, exiting\n");
-
-                  if ((phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
-                      DCI_pdu->nCCE,
-                      1,
-                      DCI_pdu->dci_alloc[i].rnti,
-                      next_slot>>1)) == -1) {
-                      LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (RA) !!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1);
-                  }
-                  else {
-                      LOG_I(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (RA)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,
-                          phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1],DCI_pdu->nCCE);
+	  LOG_D(PHY,"[eNB %d] RA generate_eNB_dlsch_params_from_dci\n", phy_vars_eNB->Mod_id);
+#endif
+	  generate_eNB_dlsch_params_from_dci(next_slot>>1,
+					     &DCI_pdu->dci_alloc[i].dci_pdu[0],
+					     DCI_pdu->dci_alloc[i].rnti,
+					     DCI_pdu->dci_alloc[i].format,
+					     &phy_vars_eNB->dlsch_eNB_ra,
+					     &phy_vars_eNB->lte_frame_parms,
+					     phy_vars_eNB->pdsch_config_dedicated,
+					     SI_RNTI,
+					     DCI_pdu->dci_alloc[i].rnti,
+					     P_RNTI,
+					     phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+	  
+	  //	  mac_xface->macphy_exit("Transmitted RAR, exiting\n");
+
+	  if ((phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
+										DCI_pdu->nCCE,
+										1,
+										DCI_pdu->dci_alloc[i].rnti,
+										next_slot>>1)) == -1) {
+	    LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for common DCI (RA) !!!\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1);
+	  }
+	  else {
+	    LOG_I(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for common DCI (RA)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,
+		  phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1],DCI_pdu->nCCE);
 #if defined(SMBV) && !defined(EXMIMO)
-                      // configure RA DCI
-                      if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                          msg("[SMBV] Frame %3d, RA in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
-                          smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "RA", &DCI_pdu->dci_alloc[i], i);
-                      }
+        // configure RA DCI
+        if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+            msg("[SMBV] Frame %3d, RA in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
+            smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), "RA", &DCI_pdu->dci_alloc[i], i);
+        }
 #endif
 
-                  }
-                  DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1];
+	  }
+	  DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB_ra->nCCE[next_slot>>1];
 
-              }
-              else if (DCI_pdu->dci_alloc[i].format != format0){ // this is a normal DLSCH allocation
+	}
+
+	else if (DCI_pdu->dci_alloc[i].format != format0){ // this is a normal DLSCH allocation
 
 #ifdef OPENAIR2
 #ifdef DEBUG_PHY_PROC
-                  LOG_D(PHY,"[eNB] Searching for RNTI %x\n",DCI_pdu->dci_alloc[i].rnti);
+	  LOG_D(PHY,"[eNB] Searching for RNTI %x\n",DCI_pdu->dci_alloc[i].rnti);
 #endif
-                  UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
+	  UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
 #else
-                  UE_id = i;
+	  UE_id = i;
 #endif
-                  if (UE_id>=0) {
-                      //	  dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
+	  if (UE_id>=0) {
+	    //	  dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
 #if defined(SMBV) && !defined(EXMIMO)
-                      // Configure this user
-                      if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                          msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %d in TM%d\n",phy_vars_eNB->frame,next_slot>>1,(smbv_frame_cnt*10) + (next_slot>>1),UE_id+1,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(u8)UE_id]);
-                          smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(u8)UE_id],DCI_pdu->dci_alloc[i].rnti);
-                      }
+          // Configure this user
+          if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+              msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %d in TM%d\n",phy_vars_eNB->frame,next_slot>>1,(smbv_frame_cnt*10) + (next_slot>>1),UE_id+1,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(u8)UE_id]);
+              smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(u8)UE_id],DCI_pdu->dci_alloc[i].rnti);
+          }
 #endif
-                      generate_eNB_dlsch_params_from_dci(next_slot>>1,
-                          &DCI_pdu->dci_alloc[i].dci_pdu[0],
-                          DCI_pdu->dci_alloc[i].rnti,
-                          DCI_pdu->dci_alloc[i].format,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id],
-                          &phy_vars_eNB->lte_frame_parms,
-                          phy_vars_eNB->pdsch_config_dedicated,
-                          SI_RNTI,
-                          0,
-                          P_RNTI,
-                          phy_vars_eNB->eNB_UE_stats[(u8)UE_id].DL_pmi_single);
-                      LOG_D(PHY,"[eNB %d][PDSCH %x/%d] Frame %d subframe %d: Generated dlsch params\n",
-                          phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid,phy_vars_eNB->frame,next_slot>>1);
-                      if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
-                          DCI_pdu->nCCE,
-                          0,
-                          DCI_pdu->dci_alloc[i].rnti,
-                          next_slot>>1)) == -1) {
-                          LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for UE spec DCI (PDSCH %x) !!!\n",
-                              phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti);
-                      }
-                      else {
-                          LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %x)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,
-                              DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1],DCI_pdu->nCCE);
+	    generate_eNB_dlsch_params_from_dci(next_slot>>1,
+					       &DCI_pdu->dci_alloc[i].dci_pdu[0],
+					       DCI_pdu->dci_alloc[i].rnti,
+					       DCI_pdu->dci_alloc[i].format,
+					       phy_vars_eNB->dlsch_eNB[(u8)UE_id],
+					       &phy_vars_eNB->lte_frame_parms,
+					       phy_vars_eNB->pdsch_config_dedicated,
+					       SI_RNTI,
+					       0,
+					       P_RNTI,
+					       phy_vars_eNB->eNB_UE_stats[(u8)UE_id].DL_pmi_single);
+	    LOG_D(PHY,"[eNB %d][PDSCH %x/%d] Frame %d subframe %d: Generated dlsch params\n",
+		  phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid,phy_vars_eNB->frame,next_slot>>1);
+	    if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1] = get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
+											     DCI_pdu->nCCE,
+											     0,
+											     DCI_pdu->dci_alloc[i].rnti,
+											     next_slot>>1)) == -1) {
+	      LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources for UE spec DCI (PDSCH %x) !!!\n",
+		    phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti);
+	    }
+	    else {
+	      LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %x)  => %d/%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,
+		    DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1],DCI_pdu->nCCE);
 
 #if defined(SMBV) && !defined(EXMIMO)
-                          DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1];
-                          // configure UE-spec DCI
-                          if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                              msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
-                              smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i);
-                          }
+          DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1];
+          // configure UE-spec DCI
+          if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+              msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
+              smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i);
+          }
 #endif
-                      }
-                      DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1];
+	    }
+	    DCI_pdu->dci_alloc[i].nCCE = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nCCE[next_slot>>1];
 #ifdef DEBUG_PHY_PROC      
-                      //if (phy_vars_eNB->frame%100 == 0)
-                      LOG_I(PHY,"[eNB %d][DCI][PDSCH %x] Frame %d subframe %d UE_id %d Generated DCI format %d, aggregation %d\n",
-                          phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti,
-                          phy_vars_eNB->frame, next_slot>>1,UE_id,
-                          DCI_pdu->dci_alloc[i].format,
-                          1<<DCI_pdu->dci_alloc[i].L);
-#endif
-                  }
-                  else {
-                      LOG_D(PHY,"[eNB %d][PDSCH] Frame %d : No UE_id with corresponding rnti %x, dropping DLSCH\n",
-                          phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti);
-                  }
-              } else {
-                  LOG_W(PHY,"[eNB %d] Frame %d : DCI not recognised, No UE_id with corresponding rnti %x, dropping DLSCH\n",
-                      phy_vars_eNB->Mod_id,phy_vars_eNB->frame,DCI_pdu->dci_alloc[i].rnti);
-              }
-
+	    //if (phy_vars_eNB->frame%100 == 0)
+	    LOG_I(PHY,"[eNB %d][DCI][PDSCH %x] Frame %d subframe %d UE_id %d Generated DCI format %d, aggregation %d\n",
+		  phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti,
+		  phy_vars_eNB->frame, next_slot>>1,UE_id,
+		  DCI_pdu->dci_alloc[i].format,
+		  1<<DCI_pdu->dci_alloc[i].L);
+#endif
+	  }
+	  else {
+	    LOG_D(PHY,"[eNB %d][PDSCH] Frame %d : No UE_id with corresponding rnti %x, dropping DLSCH\n",
+		  phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti);
+	  }
+	}
 
-          }
+      }
 
-          // Apply physicalConfigDedicated if needed
-          phy_config_dedicated_eNB_step2(phy_vars_eNB);
+      // Apply physicalConfigDedicated if needed
+      phy_config_dedicated_eNB_step2(phy_vars_eNB);
 
-          for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
-              if (DCI_pdu->dci_alloc[i].format == format0) {  // this is a ULSCH allocation
+      for (i=0;i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {    
+	if (DCI_pdu->dci_alloc[i].format == format0) {  // this is a ULSCH allocation
 
-                  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
-                      pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1),
-                      pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1));
-                  if (harq_pid==255) {
-                      LOG_E(PHY,"[eNB %d] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame);
-                      mac_exit_wrapper("Invalid harq_pid (255) detected");
-                  }
+	  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
+				       pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->frame,next_slot>>1),
+				       pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1));
+	  if (harq_pid==255) {
+	    LOG_E(PHY,"[eNB %d] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame);
+	    mac_exit_wrapper("Invalid harq_pid (255) detected");
+	  }
 #ifdef OPENAIR2
-                  UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
+	  UE_id = find_ue((s16)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
 #else
-                  UE_id = i;
+	  UE_id = i;
 #endif
-                  if (UE_id<0) {
-                      LOG_E(PHY,"[eNB %d] Frame %d: Unknown UE_id for rnti %x\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti);
-                      mac_exit_wrapper("Invalid UE id (< 0) detected");
-                  }
+	  if (UE_id<0) {
+	    LOG_E(PHY,"[eNB %d] Frame %d: Unknown UE_id for rnti %x\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame,(s16)DCI_pdu->dci_alloc[i].rnti);
+	    mac_exit_wrapper("Invalid UE id (< 0) detected");
+	  }
 #ifdef DEBUG_PHY_PROC
-                  if (phy_vars_eNB->frame%100 == 0)
-                    LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generated format0 DCI (rnti %x, dci %x) (DCI pos %d/%d), aggregation %d\n",
-                        phy_vars_eNB->Mod_id,
-                        subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
-                            pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1),
-                            pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)),
-                            pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1),
-                            next_slot>>1,DCI_pdu->dci_alloc[i].rnti,
-                            *(unsigned int *)&DCI_pdu->dci_alloc[i].dci_pdu[0],
-                            i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
-                            1<<DCI_pdu->dci_alloc[i].L);
-#endif
-
-                  //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
-                  //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti);
-                  generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0],
-                      DCI_pdu->dci_alloc[i].rnti,
-                      (next_slot>>1),
-                      format0,
-                      UE_id,
-                      phy_vars_eNB,
-                      SI_RNTI,
-                      0,
-                      P_RNTI,
-                      CBA_RNTI,
-                      0);  // do_srs
-
-                  if ((DCI_pdu->dci_alloc[i].nCCE=get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
-                      DCI_pdu->nCCE,
-                      0,
-                      DCI_pdu->dci_alloc[i].rnti,
-                      next_slot>>1)) == -1) {
-                      LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources (%d) for UE spec DCI (PUSCH %x) !!!\n",
-                          phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->nCCE,DCI_pdu->dci_alloc[i].rnti);
-                  }
-                  else {
-                      LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %x) => %d/%d\n",
-                          phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti,
-                          DCI_pdu->dci_alloc[i].nCCE,DCI_pdu->nCCE);
+      if (phy_vars_eNB->frame%100 == 0)
+	    LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generated format0 DCI (rnti %x, dci %x) (DCI pos %d/%d), aggregation %d\n",
+		  phy_vars_eNB->Mod_id, 
+		  subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
+				    pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1),
+				    pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)),
+		  pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,(((next_slot>>1)==0)?1:0)+phy_vars_eNB->frame,next_slot>>1),
+		  next_slot>>1,DCI_pdu->dci_alloc[i].rnti,
+		  *(unsigned int *)&DCI_pdu->dci_alloc[i].dci_pdu[0],
+		  i,DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
+		  1<<DCI_pdu->dci_alloc[i].L);
+#endif
+
+	  //dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
+      //LOG_D(PHY,"[eNB] cba generate_eNB_ulsch_params_from_dci for ue %d for dci rnti %x\n", UE_id, DCI_pdu->dci_alloc[i].rnti);
+	  generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0],
+					     DCI_pdu->dci_alloc[i].rnti,
+					     (next_slot>>1),
+					     format0,
+					     UE_id,
+					     phy_vars_eNB,
+					     SI_RNTI,
+					     0,
+					     P_RNTI,
+					     CBA_RNTI,
+					     0);  // do_srs
+
+	  if ((DCI_pdu->dci_alloc[i].nCCE=get_nCCE_offset(1<<DCI_pdu->dci_alloc[i].L,
+							  DCI_pdu->nCCE,
+							  0,
+							  DCI_pdu->dci_alloc[i].rnti,
+							  next_slot>>1)) == -1) {
+	    LOG_E(PHY,"[eNB %d] Frame %d subframe %d : No available CCE resources (%d) for UE spec DCI (PUSCH %x) !!!\n",
+		  phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->nCCE,DCI_pdu->dci_alloc[i].rnti);
+	  }
+	  else {
+	    LOG_D(PHY,"[eNB %d] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %x) => %d/%d\n",
+		  phy_vars_eNB->Mod_id,phy_vars_eNB->frame,next_slot>>1,DCI_pdu->dci_alloc[i].rnti,
+		  DCI_pdu->dci_alloc[i].nCCE,DCI_pdu->nCCE);
 
 #if defined(SMBV) && !defined(EXMIMO)
-                      // configure UE-spec DCI for UL Grant
-                      if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                          msg("[SMBV] Frame %3d, SF %d UL DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
-                          smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i);
-                      }
+        // configure UE-spec DCI for UL Grant
+        if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+            msg("[SMBV] Frame %3d, SF %d UL DCI %d\n",phy_vars_eNB->frame,next_slot>>1,i);
+            smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (next_slot>>1), UE_id+1, &DCI_pdu->dci_alloc[i], i);
+        }
 #endif
 
-                  }
-                  /*
+	  }
+	  /*
 	    #ifdef DEBUG_PHY_PROC
 	    LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Setting subframe_scheduling_flag for UE %d harq_pid %d (ul subframe %d)\n",
 	    phy_vars_eNB->Mod_id,harq_pid,
 	    phy_vars_eNB->frame,next_slot>>1,i,harq_pid,
 	    pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1));
 	    #endif
-                   */
-                  if ((DCI_pdu->dci_alloc[i].rnti  >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI))
-                    phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1;
-                  else
-                    phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-
-              }
-          }
-
-
-
+	  */
+	  if ((DCI_pdu->dci_alloc[i].rnti  >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI))
+	    phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1;
+	  else 
+	    phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
+	
+	}
+      }
 
+    
 
 
-          // if we have DCI to generate do it now
-          if ((DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci)>0) {
 
 
-          }
-          else {  // for emulation!!
-              phy_vars_eNB->num_ue_spec_dci[(next_slot>>1)&1]=0;
-              phy_vars_eNB->num_common_dci[(next_slot>>1)&1]=0;
-          }
+      // if we have DCI to generate do it now
+      if ((DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci)>0) {
 
-          if (abstraction_flag == 0) {
+ 
+      }
+      else {  // for emulation!!
+	phy_vars_eNB->num_ue_spec_dci[(next_slot>>1)&1]=0;
+	phy_vars_eNB->num_common_dci[(next_slot>>1)&1]=0;
+      }
+ 
+      if (abstraction_flag == 0) {
 #ifdef DEBUG_PHY_PROC
-              if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0)
-                LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %d,ue_spec %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
+	if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0)
+	  LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %d,ue_spec %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
 #endif
 
-              for (sect_id=0;sect_id<number_of_cards;sect_id++)
-                num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci,
-                    DCI_pdu->Num_common_dci,
-                    DCI_pdu->dci_alloc,
-                    0,
-                    AMP,
-                    &phy_vars_eNB->lte_frame_parms,
-                    phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                    next_slot>>1);
+	for (sect_id=0;sect_id<number_of_cards;sect_id++) 
+	  num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci,
+					       DCI_pdu->Num_common_dci,
+					       DCI_pdu->dci_alloc,
+					       0,
+					       AMP,
+					       &phy_vars_eNB->lte_frame_parms,
+					       phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+					       next_slot>>1);
 
 #ifdef DEBUG_PHY_PROC
-              //	LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,num_pdcch_symbols);
+//	LOG_I(PHY,"[eNB %d] Frame %d, subframe %d: num_pdcch_symbols %d)\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1,num_pdcch_symbols);
 
 #endif
-          }
+      }
 
 #ifdef PHY_ABSTRACTION
-          else {
-              LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1);
-              num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,next_slot>>1);
-          }
+      else {
+	LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1);
+	num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,next_slot>>1);
+      }
 #endif
 
-          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
+      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,0);
 
 #ifdef DEBUG_PHY_PROC
-          //LOG_D(PHY,"[eNB %d] Frame %d, slot %d: num_pdcch_symbols=%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot,num_pdcch_symbols);
+      //LOG_D(PHY,"[eNB %d] Frame %d, slot %d: num_pdcch_symbols=%d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot,num_pdcch_symbols);
 #endif
 
-          // Check for SI activity
+      // Check for SI activity
 
-          if (phy_vars_eNB->dlsch_eNB_SI->active == 1) {
-              input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8;
+      if (phy_vars_eNB->dlsch_eNB_SI->active == 1) {
+	input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8;
 
 
 #ifdef OPENAIR2
-              DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->frame,
-                  SI_RNTI,
-                  0);
+	DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
+					     phy_vars_eNB->frame,
+					     SI_RNTI,
+					     0);
 #else
-              DLSCH_pdu = DLSCH_pdu_tmp;
-              for (i=0;i<input_buffer_length;i++)
-                DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
+	DLSCH_pdu = DLSCH_pdu_tmp;
+	for (i=0;i<input_buffer_length;i++)
+	  DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
 #endif      
-
+    
 #if defined(SMBV) && !defined(EXMIMO)
-              // Configures the data source of allocation (allocation is configured by DCI)
-              if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                  msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt);
-                  smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), DLSCH_pdu, input_buffer_length);
-              }
+    // Configures the data source of allocation (allocation is configured by DCI)
+    if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+        msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt);
+        smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), DLSCH_pdu, input_buffer_length);
+    }
 #endif      
 
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_DLSCH
-              LOG_D(PHY,"[eNB %d][SI] Frame %d, slot %d: Calling generate_dlsch (SI) with input size = %d, num_pdcch_symbols %d\n",
-                  phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot, input_buffer_length,num_pdcch_symbols);
-              for (i=0;i<input_buffer_length;i++)
-                LOG_T(PHY,"%x.",i,DLSCH_pdu[i]);
-              LOG_T(PHY,"\n");
-#endif
-#endif
-
-              if (abstraction_flag == 0) {
-
-                  dlsch_encoding(DLSCH_pdu,
-                      &phy_vars_eNB->lte_frame_parms,
-                      num_pdcch_symbols,
-                      phy_vars_eNB->dlsch_eNB_SI,
-                      phy_vars_eNB->frame,next_slot>>1,
-                      &phy_vars_eNB->dlsch_rate_matching_stats,
-                      &phy_vars_eNB->dlsch_turbo_encoding_stats,
-                      &phy_vars_eNB->dlsch_interleaving_stats);
-
-                  dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
-                      0,
-                      phy_vars_eNB->dlsch_eNB_SI,
-                      get_G(&phy_vars_eNB->lte_frame_parms,
-                          phy_vars_eNB->dlsch_eNB_SI->nb_rb,
-                          phy_vars_eNB->dlsch_eNB_SI->rb_alloc,
-                          get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs),
-                          num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
-                          0,
-                          next_slot);
-
-                  for (sect_id=0;sect_id<number_of_cards;sect_id++)
-                    re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                        AMP,
-                        next_slot/2,
-                        &phy_vars_eNB->lte_frame_parms,
-                        num_pdcch_symbols,
-                        phy_vars_eNB->dlsch_eNB_SI);
-              }
+	LOG_D(PHY,"[eNB %d][SI] Frame %d, slot %d: Calling generate_dlsch (SI) with input size = %d, num_pdcch_symbols %d\n",
+	      phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot, input_buffer_length,num_pdcch_symbols);
+	for (i=0;i<input_buffer_length;i++)
+	  LOG_T(PHY,"%x.",i,DLSCH_pdu[i]);
+	LOG_T(PHY,"\n");
+#endif
+#endif
+
+	if (abstraction_flag == 0) {
+
+	  start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
+	  dlsch_encoding(DLSCH_pdu,
+			 &phy_vars_eNB->lte_frame_parms,
+			 num_pdcch_symbols,
+			 phy_vars_eNB->dlsch_eNB_SI,
+			 phy_vars_eNB->frame,next_slot>>1,
+			 &phy_vars_eNB->dlsch_rate_matching_stats,
+			 &phy_vars_eNB->dlsch_turbo_encoding_stats,
+			 &phy_vars_eNB->dlsch_interleaving_stats);
+	  stop_meas(&phy_vars_eNB->dlsch_encoding_stats);  
+	
+	  start_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
+	  dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
+			   0,
+			   phy_vars_eNB->dlsch_eNB_SI,
+			   get_G(&phy_vars_eNB->lte_frame_parms,
+				 phy_vars_eNB->dlsch_eNB_SI->nb_rb,
+				 phy_vars_eNB->dlsch_eNB_SI->rb_alloc,
+				 get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs),
+				 num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
+			   0,
+			   next_slot);      
+	  stop_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
+	
+	  start_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
+	  for (sect_id=0;sect_id<number_of_cards;sect_id++) 
+	    re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+					    AMP,
+					    next_slot/2,
+					    &phy_vars_eNB->lte_frame_parms,
+					    num_pdcch_symbols,
+					    phy_vars_eNB->dlsch_eNB_SI);
+	  stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
+	} 
 #ifdef PHY_ABSTRACTION
-              else {
-                  dlsch_encoding_emul(phy_vars_eNB,
-                      DLSCH_pdu,
-                      phy_vars_eNB->dlsch_eNB_SI);
-              }
+	else {
+	  start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
+	  dlsch_encoding_emul(phy_vars_eNB,
+			      DLSCH_pdu,
+			      phy_vars_eNB->dlsch_eNB_SI);
+	  stop_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
+	}
 #endif
-              phy_vars_eNB->dlsch_eNB_SI->active = 0;
-
-          }
+	phy_vars_eNB->dlsch_eNB_SI->active = 0;
+      
+      }
 
-          // Check for RA activity
-          if (phy_vars_eNB->dlsch_eNB_ra->active == 1) {
+      // Check for RA activity
+      if (phy_vars_eNB->dlsch_eNB_ra->active == 1) {
 #ifdef DEBUG_PHY_PROC
-              LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, slot %d, RA active, filling RAR:\n",
-                  phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot);
+	LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, slot %d, RA active, filling RAR:\n",
+	      phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot);
 #endif
 
-              input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8;
+	input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8;
 
 #ifdef OPENAIR2
-              crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->frame,
-                  dlsch_input_buffer,
-                  phy_vars_eNB->lte_frame_parms.N_RB_UL,
-                  input_buffer_length);
-              /*
+	crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id,
+				    phy_vars_eNB->frame,
+				    dlsch_input_buffer,
+				    phy_vars_eNB->lte_frame_parms.N_RB_UL,
+				    input_buffer_length);
+	/*
 	  for (i=0;i<input_buffer_length;i++)
 	  LOG_T(PHY,"%x.",dlsch_input_buffer[i]);
 	  LOG_T(PHY,"\n");
-               */
-              UE_id = add_ue(crnti,phy_vars_eNB);
-              if (UE_id==-1) {
-                  LOG_W(PHY,"[eNB] Max user count reached.\n");
-                  //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n");
-                  mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-                      phy_vars_eNB->frame,
-                      crnti);
-              }
-              else {
-                  phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode = RA_RESPONSE;
-                  // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged)
-                  phy_vars_eNB->first_sr[(u32)UE_id] = 1;
-
-                  generate_eNB_ulsch_params_from_rar(dlsch_input_buffer,
-                      phy_vars_eNB->frame,
-                      (next_slot>>1),
-                      phy_vars_eNB->ulsch_eNB[(u32)UE_id],
-                      &phy_vars_eNB->lte_frame_parms);
-
-                  phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 1;
-
-                  get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms,
-                      next_slot>>1,
-                      phy_vars_eNB->frame,
-                      &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame,
-                      &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe);
+	*/
+	UE_id = add_ue(crnti,phy_vars_eNB);
+	if (UE_id==-1) {
+	  LOG_W(PHY,"[eNB] Max user count reached.\n");
+	  //mac_xface->macphy_exit("[PHY][eNB] Max user count reached.\n");
+	  mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
+				    phy_vars_eNB->frame,
+				    crnti);
+	}
+	else {
+	  phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode = RA_RESPONSE;
+	  // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged)
+	  phy_vars_eNB->first_sr[(u32)UE_id] = 1;
+
+	  generate_eNB_ulsch_params_from_rar(dlsch_input_buffer,
+					     phy_vars_eNB->frame,
+					     (next_slot>>1),
+					     phy_vars_eNB->ulsch_eNB[(u32)UE_id],
+					     &phy_vars_eNB->lte_frame_parms);
+
+	  phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 1;
+
+	  get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms,
+			 next_slot>>1,
+			 phy_vars_eNB->frame,
+			 &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame,
+			 &phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe);
 #else
-                  for (i=0;i<input_buffer_length;i++)
-                    dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff);
+	  for (i=0;i<input_buffer_length;i++)
+	    dlsch_input_buffer[i]= (unsigned char) i; //(taus()&0xff);
 
-                  dlsch_input_buffer[1] = (phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4
-                  dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0;  // 4 LSBs of timing advance + divide by 4
-                  //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset);
+	  dlsch_input_buffer[1] = (phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)>>(2+4); // 7 MSBs of timing advance + divide by 4
+	  dlsch_input_buffer[2] = ((phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset)<<(4-2))&0xf0;  // 4 LSBs of timing advance + divide by 4
+	  //LOG_I(PHY,"UE %d: timing_offset = %d\n",UE_id,phy_vars_eNB->eNB_UE_stats[0].UE_timing_offset); 
 #endif
 
 #if defined(SMBV) && !defined(EXMIMO)
-                  // Configures the data source of allocation (allocation is configured by DCI)
-                  if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                      msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt);
-                      smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), dlsch_input_buffer, input_buffer_length);
-                  }
+      // Configures the data source of allocation (allocation is configured by DCI)
+      if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+          msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt);
+          smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (next_slot>>1), dlsch_input_buffer, input_buffer_length);
+      }
 #endif      
 
 #ifdef DEBUG_PHY_PROC
-                  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, next slot %d: Calling generate_dlsch (RA) with input size = %d,Msg3 frame %d, Msg3 subframe %d\n",
-                      phy_vars_eNB->Mod_id,
-                      phy_vars_eNB->frame, next_slot,input_buffer_length,
-                      phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame,
-                      phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe);
-#endif
-
-                  if (abstraction_flag == 0) {
-
-                      dlsch_encoding(dlsch_input_buffer,
-                          &phy_vars_eNB->lte_frame_parms,
-                          num_pdcch_symbols,
-                          phy_vars_eNB->dlsch_eNB_ra,
-                          phy_vars_eNB->frame,next_slot>>1,
-                          &phy_vars_eNB->dlsch_rate_matching_stats,
-                          &phy_vars_eNB->dlsch_turbo_encoding_stats,
-                          &phy_vars_eNB->dlsch_interleaving_stats);
-
-                      //	phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI;
-                      dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
-                          0,
-                          phy_vars_eNB->dlsch_eNB_ra,
-                          get_G(&phy_vars_eNB->lte_frame_parms,
-                              phy_vars_eNB->dlsch_eNB_ra->nb_rb,
-                              phy_vars_eNB->dlsch_eNB_ra->rb_alloc,
-                              get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs),
-                              num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
-                              0,
-                              next_slot);
-                      for (sect_id=0;sect_id<number_of_cards;sect_id++)
-                        re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                            AMP,
-                            next_slot/2,
-                            &phy_vars_eNB->lte_frame_parms,
-                            num_pdcch_symbols,
-                            phy_vars_eNB->dlsch_eNB_ra);
-                  }
+	  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, next slot %d: Calling generate_dlsch (RA) with input size = %d,Msg3 frame %d, Msg3 subframe %d\n",
+		phy_vars_eNB->Mod_id,
+		phy_vars_eNB->frame, next_slot,input_buffer_length, 
+		phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame,
+		phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe);
+#endif
+
+	  if (abstraction_flag == 0) {
+
+	    dlsch_encoding(dlsch_input_buffer,
+			   &phy_vars_eNB->lte_frame_parms,
+			   num_pdcch_symbols,
+			   phy_vars_eNB->dlsch_eNB_ra,
+			   phy_vars_eNB->frame,next_slot>>1,
+			   &phy_vars_eNB->dlsch_rate_matching_stats,
+			   &phy_vars_eNB->dlsch_turbo_encoding_stats,
+			   &phy_vars_eNB->dlsch_interleaving_stats);
+
+	    //	phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI;
+	    dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
+			     0,
+			     phy_vars_eNB->dlsch_eNB_ra,
+			     get_G(&phy_vars_eNB->lte_frame_parms,
+				   phy_vars_eNB->dlsch_eNB_ra->nb_rb,
+				   phy_vars_eNB->dlsch_eNB_ra->rb_alloc,
+				   get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs),
+				   num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
+			     0,
+			     next_slot);
+	    for (sect_id=0;sect_id<number_of_cards;sect_id++) 
+	      re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+					      AMP,
+					      next_slot/2,
+					      &phy_vars_eNB->lte_frame_parms,
+					      num_pdcch_symbols,
+					      phy_vars_eNB->dlsch_eNB_ra);
+	  }
 #ifdef PHY_ABSTRACTION
-                  else {
-                      dlsch_encoding_emul(phy_vars_eNB,
-                          dlsch_input_buffer,
-                          phy_vars_eNB->dlsch_eNB_ra);
-                  }
-#endif
-                  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id,
-                      phy_vars_eNB->frame,next_slot>>1);
-
+	  else {
+	    dlsch_encoding_emul(phy_vars_eNB,
+				dlsch_input_buffer,
+				phy_vars_eNB->dlsch_eNB_ra);
+	  }
+#endif
+	  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id,
+		phy_vars_eNB->frame,next_slot>>1);
+	
 #ifdef DEBUG_PHY_PROC    
-                  LOG_D(PHY,"[eNB %d] Frame %d, slot %d, DLSCH (RA) re_allocated = %d\n",phy_vars_eNB->Mod_id,
-                      phy_vars_eNB->frame, next_slot, re_allocated);
+	  LOG_D(PHY,"[eNB %d] Frame %d, slot %d, DLSCH (RA) re_allocated = %d\n",phy_vars_eNB->Mod_id,
+		phy_vars_eNB->frame, next_slot, re_allocated);
 #endif
 
 #ifdef OPENAIR2
-              } //max user count
+	} //max user count
 #endif
-              phy_vars_eNB->dlsch_eNB_ra->active = 0;
-          }
-
-          // Now scan UE specific DLSCH
-          for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) {
-              if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&&
-                  (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&&
-                  (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 1)) {
-                  harq_pid = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid;
-                  input_buffer_length = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS/8;
+	phy_vars_eNB->dlsch_eNB_ra->active = 0;
+      }
 
+      // Now scan UE specific DLSCH
+      for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) {
+	if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&&
+	    (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&&
+	    (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 1)) {
+	  harq_pid = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->current_harq_pid;
+	  input_buffer_length = phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS/8;
+      
 
 #ifdef DEBUG_PHY_PROC
-                  LOG_I(PHY,"[eNB %d][PDSCH %x/%d] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %d, G %d, nb_rb %d, mcs %d, pmi_alloc %x, rv %d (round %d)\n",
-                      phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti,harq_pid,
-                      phy_vars_eNB->frame, next_slot>>1, input_buffer_length,
-                      get_G(&phy_vars_eNB->lte_frame_parms,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc,
-                          get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs),
-                          num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs,
-                          pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->pmi_alloc),
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->rvidx,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round);
-#endif
-
-                  phy_vars_eNB->eNB_UE_stats[(u8)UE_id].dlsch_sliding_cnt++;
-                  if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->harq_processes[harq_pid]->round == 0) {
-
-                      phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[0]++;
-
+	LOG_I(PHY,"[eNB %d][PDSCH %x/%d] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %d, G %d, nb_rb %d, mcs %d, pmi_alloc %x, rv %d (round %d)\n",
+	      phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti,harq_pid,
+	      phy_vars_eNB->frame, next_slot>>1, input_buffer_length,
+	      get_G(&phy_vars_eNB->lte_frame_parms,
+		    phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb,
+		    phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc,
+		    get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs),
+		    num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
+	      phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb,
+	      phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs,
+	      pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->pmi_alloc),
+	      phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->rvidx,
+	      phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round);
+#endif
+
+	  phy_vars_eNB->eNB_UE_stats[(u8)UE_id].dlsch_sliding_cnt++;
+	  if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->harq_processes[harq_pid]->round == 0) {
+
+	    phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[0]++;
+	  
 #ifdef OPENAIR2
-                      DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
-                          phy_vars_eNB->frame,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti,
-                          0);
-                      phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS;
+	    DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
+						 phy_vars_eNB->frame,
+						 phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti,
+						 0);
+	    phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS;
 #else
-                      DLSCH_pdu = DLSCH_pdu_tmp;
-                      for (i=0;i<input_buffer_length;i++)
-                        DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
+	    DLSCH_pdu = DLSCH_pdu_tmp;
+	    for (i=0;i<input_buffer_length;i++)
+	      DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
 #endif      
 
 #if defined(SMBV) && !defined(EXMIMO)
-                      // Configures the data source of allocation (allocation is configured by DCI)
-                      if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
-                          msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt);
-                          smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length);
-                      }
+        // Configures the data source of allocation (allocation is configured by DCI)
+        if (smbv_is_config_frame(phy_vars_eNB->frame) && (smbv_frame_cnt < 4)) {
+            msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %d\n",phy_vars_eNB->frame,(smbv_frame_cnt*10) + (next_slot>>1),smbv_alloc_cnt);
+            smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length);
+        }
 #endif      
 
 
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_DLSCH
-                      LOG_T(PHY,"eNB DLSCH SDU: \n");
-                      for (i=0;i<phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS>>3;i++)
-                        LOG_T(PHY,"%x.",(u8)DLSCH_pdu[i]);
-                      LOG_T(PHY,"\n");
+	    LOG_T(PHY,"eNB DLSCH SDU: \n");
+	    for (i=0;i<phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->TBS>>3;i++)
+	      LOG_T(PHY,"%x.",(u8)DLSCH_pdu[i]);
+	    LOG_T(PHY,"\n");
 #endif
 #endif
-                  }
-                  else {
-                      phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round]++;
+	  }
+	  else {
+	    phy_vars_eNB->eNB_UE_stats[(u32)UE_id].dlsch_trials[phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->round]++;	
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_DLSCH  
-                      LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n");
-#endif
-#endif
-                  }
-                  if (abstraction_flag==0) {
-
-                      // 36-212
-                      dlsch_encoding(DLSCH_pdu,
-                          &phy_vars_eNB->lte_frame_parms,
-                          num_pdcch_symbols,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0],
-                          phy_vars_eNB->frame,next_slot>>1,
-                          &phy_vars_eNB->dlsch_rate_matching_stats,
-                          &phy_vars_eNB->dlsch_turbo_encoding_stats,
-                          &phy_vars_eNB->dlsch_interleaving_stats);
-                      // 36-211
-                      dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
-                          0,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0],
-                          get_G(&phy_vars_eNB->lte_frame_parms,
-                              phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb,
-                              phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc,
-                              get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs),
-                              num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
-                              0,
-                              next_slot);
-                      for (sect_id=0;sect_id<number_of_cards;sect_id++) {
-
-                          /*          if ((phy_vars_eNB->transmission_mode[(u8)UE_id] == 5) &&
+	    LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n");
+#endif
+#endif
+	  }
+	  if (abstraction_flag==0) {
+
+	    // 36-212
+	    start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
+	    dlsch_encoding(DLSCH_pdu,
+			   &phy_vars_eNB->lte_frame_parms,
+			   num_pdcch_symbols,
+			   phy_vars_eNB->dlsch_eNB[(u8)UE_id][0],
+			   phy_vars_eNB->frame,next_slot>>1,
+			   &phy_vars_eNB->dlsch_rate_matching_stats,
+			   &phy_vars_eNB->dlsch_turbo_encoding_stats,
+			   &phy_vars_eNB->dlsch_interleaving_stats);
+	    stop_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
+	    // 36-211
+	    start_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
+	    dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
+			     0,
+			     phy_vars_eNB->dlsch_eNB[(u8)UE_id][0],
+			     get_G(&phy_vars_eNB->lte_frame_parms,
+				   phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->nb_rb,
+				   phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rb_alloc,
+				   get_Qm(phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs),
+				   num_pdcch_symbols,phy_vars_eNB->frame,next_slot>>1),
+			     0,
+			     next_slot);      
+	    stop_meas(&phy_vars_eNB->dlsch_scrambling_stats);	      
+	    start_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
+	    for (sect_id=0;sect_id<number_of_cards;sect_id++) {
+	    
+	      /*          if ((phy_vars_eNB->transmission_mode[(u8)UE_id] == 5) &&
 			  (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->dl_power_off == 0)) 
 			  amp = (s16)(((s32)AMP*(s32)ONE_OVER_SQRT2_Q15)>>15);
 			  else*/
-                          //              amp = AMP;
-                          //	    if (UE_id == 1)
-                          //	    LOG_I(PHY,"[MYEMOS] MCS_i %d\n", phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs);
-
-                          re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
-                              AMP,
-                              next_slot/2,
-                              &phy_vars_eNB->lte_frame_parms,
-                              num_pdcch_symbols,
-                              phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]);
-                      }
-                  }
+	      //              amp = AMP;
+	    //	    if (UE_id == 1)
+	    //	    LOG_I(PHY,"[MYEMOS] MCS_i %d\n", phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[harq_pid]->mcs);
+
+	      re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[sect_id],
+					      AMP,
+					      next_slot/2,
+					      &phy_vars_eNB->lte_frame_parms,
+					      num_pdcch_symbols,
+					      phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]);
+	    }
+	    stop_meas(&phy_vars_eNB->dlsch_modulation_stats);	      
+	  }
 #ifdef PHY_ABSTRACTION
-                  else {
-                      dlsch_encoding_emul(phy_vars_eNB,
-                          DLSCH_pdu,
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]);
-                  }
-#endif
-                  phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active = 0;
-
-                  //mac_xface->macphy_exit("first dlsch transmitted\n");
-              }
-
-              else if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&&
-                  (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&&
-                  (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 0)) {
+	  else {
+	    start_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
+	    dlsch_encoding_emul(phy_vars_eNB,
+				DLSCH_pdu,
+				phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]);
+	    stop_meas(&phy_vars_eNB->dlsch_encoding_stats);	      
+	  }
+#endif
+	  phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active = 0;
+	
+	  //mac_xface->macphy_exit("first dlsch transmitted\n");
+	}
 
-                  // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later)
-                  phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->subframe_tx[next_slot>>1]=0;
+	else if ((phy_vars_eNB->dlsch_eNB[(u8)UE_id][0])&&
+		 (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->rnti>0)&&
+		 (phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->active == 0)) {
+      
+	  // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later)
+	  phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->subframe_tx[next_slot>>1]=0;
 #ifdef DEBUG_PHY_PROC
-                  //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,next_slot>>1,UE_id);
+	  //LOG_D(PHY,"[eNB %d] DCI: Clearing subframe_tx for subframe %d, UE %d\n",phy_vars_eNB->Mod_id,next_slot>>1,UE_id);
 #endif
-              }
-          }
-
+	}
+      } 
+  
 
 
-          // if we have PHICH to generate
-          //    printf("[PHY][eNB] Frame %d subframe %d Checking for phich\n",phy_vars_eNB->frame,next_slot>>1);
-          if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)) {
+      // if we have PHICH to generate
+      //    printf("[PHY][eNB] Frame %d subframe %d Checking for phich\n",phy_vars_eNB->frame,next_slot>>1); 
+      if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,next_slot>>1)) {
 #ifdef DEBUG_PHY_PROC
-              //      LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_phich_top\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1);
-#endif
-              for (sect_id=0;sect_id<number_of_cards;sect_id++) {
-                  generate_phich_top(phy_vars_eNB,
-                      next_slot>>1,
-                      AMP,
-                      sect_id,
-                      abstraction_flag);
-              }
-          }
+	//      LOG_D(PHY,"[eNB %d] Frame %d, subframe %d: Calling generate_phich_top\n",phy_vars_eNB->Mod_id,phy_vars_eNB->frame, next_slot>>1);
+#endif
+	for (sect_id=0;sect_id<number_of_cards;sect_id++) {
+	  generate_phich_top(phy_vars_eNB,
+			     next_slot>>1,
+			     AMP,
+			     sect_id,
+			     abstraction_flag);
+	}
       }
-
+    }
+   
 #ifdef EMOS
-      phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB);
+    phy_procedures_emos_eNB_TX(next_slot, phy_vars_eNB);
 #endif
   }
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0);
+  stop_meas(&phy_vars_eNB->phy_proc_tx);
+
 }
 
 void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,u8 last_slot,u8 UE_id, u8 harq_pid) {
-  // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
+    // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
 
   int frame = ((last_slot>>1)>=8 ? -1 : 0) + phy_vars_eNB->frame;
 
   LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d (last_slot %d): process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n",
-      phy_vars_eNB->Mod_id,
-      frame,last_slot>>1,last_slot,
-      UE_id,phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active,
-      phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe,
-      phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame);
+	phy_vars_eNB->Mod_id,
+	frame,last_slot>>1,last_slot,
+	UE_id,phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active,
+	phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe,
+	phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame);
   phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_flag = 0;
-
+  
   if ((phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active == 1) && 
       ((last_slot%2)==1) && 
       (phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_subframe == (last_slot>>1)) &&
       (phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_frame == frame))   {
-
-      //    harq_pid = 0;
-
-      phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 0;
-      phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_flag = 1;
-      phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1;
-      LOG_D(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n",
-          phy_vars_eNB->Mod_id,
-          frame,last_slot,last_slot>>1,UE_id);
+    
+    //    harq_pid = 0;
+    
+    phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_active = 0;
+    phy_vars_eNB->ulsch_eNB[(u32)UE_id]->Msg3_flag = 1;
+    phy_vars_eNB->ulsch_eNB[(u32)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1;
+    LOG_D(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n",
+	  phy_vars_eNB->Mod_id,
+	  frame,last_slot,last_slot>>1,UE_id);
   }
 }
 
@@ -2124,12 +2143,12 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,u8 last_slot,u8 UE_id, u8 harq_pid)
 // rate-adaptation based on the error statistics derived from the ACK/NAK process
 
 void process_HARQ_feedback(u8 UE_id, 
-    u8 subframe,
-    PHY_VARS_eNB *phy_vars_eNB,
-    u8 pusch_flag,
-    u8 *pucch_payload,
-    u8 pucch_sel,
-    u8 SR_payload) {
+			   u8 subframe, 
+			   PHY_VARS_eNB *phy_vars_eNB,
+			   u8 pusch_flag, 
+			   u8 *pucch_payload, 
+			   u8 pucch_sel,
+			   u8 SR_payload) {
 
   u8 dl_harq_pid[8],dlsch_ACK[8],j,dl_subframe;
   LTE_eNB_DLSCH_t *dlsch             =  phy_vars_eNB->dlsch_eNB[(u32)UE_id][0];
@@ -2141,222 +2160,222 @@ void process_HARQ_feedback(u8 UE_id,
   int frame = ((subframe>=8) ? -1 : 0) + phy_vars_eNB->frame;
 
   if (phy_vars_eNB->lte_frame_parms.frame_type == 0){ //FDD
-      subframe_m4 = (subframe<4) ? subframe+6 : subframe-4;
+    subframe_m4 = (subframe<4) ? subframe+6 : subframe-4;
 
-      dl_harq_pid[0] = dlsch->harq_ids[subframe_m4];
-      M=1;
-      if (pusch_flag == 1)
-        dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0];
-      else
-        dlsch_ACK[0] = pucch_payload[0];
-      LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d for subframe %d\n",phy_vars_eNB->Mod_id,
-          frame,dlsch_ACK[0],subframe_m4);
+    dl_harq_pid[0] = dlsch->harq_ids[subframe_m4];
+    M=1;
+    if (pusch_flag == 1)
+      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0];
+    else
+      dlsch_ACK[0] = pucch_payload[0];
+    LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d for subframe %d\n",phy_vars_eNB->Mod_id,
+	  frame,dlsch_ACK[0],subframe_m4);
   }
   else {  // TDD Handle M=1,2 cases only
+    
+    M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms,
+			 subframe);
+    // Now derive ACK information for TDD
+    if (pusch_flag == 1) { // Do PUSCH ACK/NAK first
+      // detect missing DAI
+      //FK: this code is just a guess
+      //RK: not exactly, yes if scheduled from PHICH (i.e. no DCI format 0)
+      //    otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this,
+      //    but we have to adapt the code below.  For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used
+
+      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0];
+      dlsch_ACK[1] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[1];
+      //      printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
+    }
 
-      M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms,
-          subframe);
-      // Now derive ACK information for TDD
-      if (pusch_flag == 1) { // Do PUSCH ACK/NAK first
-          // detect missing DAI
-          //FK: this code is just a guess
-          //RK: not exactly, yes if scheduled from PHICH (i.e. no DCI format 0)
-          //    otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this,
-          //    but we have to adapt the code below.  For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used
-
-          dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[0];
-          dlsch_ACK[1] = phy_vars_eNB->ulsch_eNB[(u8)UE_id]->o_ACK[1];
-          //      printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
-      }
-
-      else {  // PUCCH ACK/NAK
-          if ((SR_payload == 1)&&(pucch_sel!=2)) {  // decode Table 7.3 if multiplexing and SR=1
-              nb_ACK = 0;
-              if (M == 2) {
-                  if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) // b[0],b[1]
-                    nb_ACK = 1;
-                  else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
-                    nb_ACK = 2;
-              }
-              else if (M == 3) {
-                  if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1))
-                    nb_ACK = 1;
-                  else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
-                    nb_ACK = 2;
-                  else if ((pucch_payload[0] == 0) && (pucch_payload[1] == 1))
-                    nb_ACK = 3;
-              }
-          }
-          else if (pucch_sel == 2) {  // bundling or M=1
-              //	printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]);
-              dlsch_ACK[0] = pucch_payload[0];
-              dlsch_ACK[1] = pucch_payload[0];
-          }
-          else {  // multiplexing with no SR, this is table 10.1
-              if (M==1)
-                dlsch_ACK[0] = pucch_payload[0];
-              else if (M==2) {
-                  if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
-                      ((pucch_sel == 0) && (pucch_payload[0] == 0) && (pucch_payload[1] == 1)))
-                    dlsch_ACK[0] = 1;
-                  else
-                    dlsch_ACK[0] = 0;
-
-                  if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
-                      ((pucch_sel == 1) && (pucch_payload[0] == 0) && (pucch_payload[1] == 0)))
-                    dlsch_ACK[1] = 1;
-                  else
-                    dlsch_ACK[1] = 0;
-              }
-          }
+    else {  // PUCCH ACK/NAK
+      if ((SR_payload == 1)&&(pucch_sel!=2)) {  // decode Table 7.3 if multiplexing and SR=1 
+	nb_ACK = 0;
+	if (M == 2) {
+	  if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) // b[0],b[1]
+	    nb_ACK = 1;
+	  else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
+	    nb_ACK = 2;
+	}
+	else if (M == 3) {
+	  if ((pucch_payload[0] == 1) && (pucch_payload[1] == 1)) 
+	    nb_ACK = 1;
+	  else if ((pucch_payload[0] == 1) && (pucch_payload[1] == 0))
+	    nb_ACK = 2;
+	  else if ((pucch_payload[0] == 0) && (pucch_payload[1] == 1))
+	    nb_ACK = 3;
+	}
+      }
+      else if (pucch_sel == 2) {  // bundling or M=1
+	//	printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]);
+	dlsch_ACK[0] = pucch_payload[0];
+	dlsch_ACK[1] = pucch_payload[0];
+      }
+      else {  // multiplexing with no SR, this is table 10.1
+	if (M==1) 
+	  dlsch_ACK[0] = pucch_payload[0];
+	else if (M==2) {
+	  if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
+	      ((pucch_sel == 0) && (pucch_payload[0] == 0) && (pucch_payload[1] == 1)))
+	    dlsch_ACK[0] = 1;
+	  else
+	    dlsch_ACK[0] = 0;
+
+	  if (((pucch_sel == 1) && (pucch_payload[0] == 1) && (pucch_payload[1] == 1)) ||
+	      ((pucch_sel == 1) && (pucch_payload[0] == 0) && (pucch_payload[1] == 0)))
+	    dlsch_ACK[1] = 1;
+	  else
+	    dlsch_ACK[1] = 0;
+	}
       }
+    }
   }
 
   // handle case where positive SR was transmitted with multiplexing
   if ((SR_payload == 1)&&(pucch_sel!=2)&&(pusch_flag == 0)) {
-      nb_alloc = 0;
-      for (m=0;m<M;m++) {
-          dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
-              subframe,
-              m);
-
-          if (dlsch->subframe_tx[dl_subframe]==1)
-            nb_alloc++;
-      }
-      if (nb_alloc == nb_ACK)
-        all_ACKed = 1;
-      else
-        all_ACKed = 0;
+    nb_alloc = 0;
+    for (m=0;m<M;m++) {
+      dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
+						 subframe,
+						 m);
+      
+      if (dlsch->subframe_tx[dl_subframe]==1) 
+	nb_alloc++;
+    }
+    if (nb_alloc == nb_ACK)
+      all_ACKed = 1;
+    else 
+      all_ACKed = 0;
 
-      //    printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed);
+    //    printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed);
   }
 
 
   for (m=0,mp=-1;m<M;m++) {
 
-      dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
-          subframe,
-          m);
-
-      if (dlsch->subframe_tx[dl_subframe]==1) {
-          if (pusch_flag == 1)
-            mp++;
-          else
-            mp = m;
-
-          dl_harq_pid[m]     = dlsch->harq_ids[dl_subframe];
-
-          if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing
-              if ((SR_payload == 1)&&(all_ACKed == 1))
-                dlsch_ACK[m] = 1;
-              else
-                dlsch_ACK[m] = 0;
-          }
-          if (dl_harq_pid[m]<dlsch->Mdlharq) {
-              dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]];
-#ifdef DEBUG_PHY_PROC	
-              LOG_I(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id,
-                  dlsch->rnti,dl_harq_pid[m],dl_subframe,
-                  dlsch_harq_proc->status,dlsch_harq_proc->round,
-                  dlsch->harq_processes[dl_harq_pid[m]]->mcs,
-                  dlsch->harq_processes[dl_harq_pid[m]]->rvidx,
-                  dlsch->harq_processes[dl_harq_pid[m]]->TBS);
-              if (dlsch_harq_proc->status==DISABLED)
-                LOG_E(PHY,"dlsch_harq_proc is disabled? \n");
-#endif
-              if ((dl_harq_pid[m]<dlsch->Mdlharq) &&
-                  (dlsch_harq_proc->status == ACTIVE)) {
-                  // dl_harq_pid of DLSCH is still active
-
-                  //	  msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]);
-                  if ( dlsch_ACK[mp]==0) {
-                      // Received NAK
-#ifdef DEBUG_PHY_PROC	
-                      LOG_I(PHY,"[eNB %d][PDSCH %x/%d] NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id,
-                          dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
-#endif
+    dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
+					       subframe,
+					       m);
 
-                      //	    if (dlsch_harq_proc->round == 0)
-                      ue_stats->dlsch_NAK[dlsch_harq_proc->round]++;
+    if (dlsch->subframe_tx[dl_subframe]==1) {
+      if (pusch_flag == 1)
+	mp++;
+      else
+	mp = m;
 
-                      // then Increment DLSCH round index
-                      dlsch_harq_proc->round++;
+      dl_harq_pid[m]     = dlsch->harq_ids[dl_subframe];
 
-                      if (dlsch_harq_proc->round == dlsch->Mdlharq) {
-                          // This was the last round for DLSCH so reset round and increment l2_error counter
+      if ((pucch_sel != 2)&&(pusch_flag == 0)) { // multiplexing
+	if ((SR_payload == 1)&&(all_ACKed == 1))
+	  dlsch_ACK[m] = 1;
+	else	
+	  dlsch_ACK[m] = 0;
+      }
+      if (dl_harq_pid[m]<dlsch->Mdlharq) {
+	dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]];
+#ifdef DEBUG_PHY_PROC	
+	LOG_I(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id,
+	      dlsch->rnti,dl_harq_pid[m],dl_subframe,
+	      dlsch_harq_proc->status,dlsch_harq_proc->round,
+	      dlsch->harq_processes[dl_harq_pid[m]]->mcs,
+	      dlsch->harq_processes[dl_harq_pid[m]]->rvidx,
+	      dlsch->harq_processes[dl_harq_pid[m]]->TBS);
+	if (dlsch_harq_proc->status==DISABLED)
+	  LOG_E(PHY,"dlsch_harq_proc is disabled? \n");
+#endif
+	if ((dl_harq_pid[m]<dlsch->Mdlharq) &&
+	    (dlsch_harq_proc->status == ACTIVE)) {
+	  // dl_harq_pid of DLSCH is still active
+	  
+	  //	  msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]);
+	  if ( dlsch_ACK[mp]==0) {
+	    // Received NAK 
 #ifdef DEBUG_PHY_PROC	
-                          LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id,
-                              dlsch->rnti,dl_harq_pid[m]);
+	    LOG_I(PHY,"[eNB %d][PDSCH %x/%d] NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id,
+		  dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
+#endif
+	    
+	    //	    if (dlsch_harq_proc->round == 0)
+	    ue_stats->dlsch_NAK[dlsch_harq_proc->round]++;
+	    
+	    // then Increment DLSCH round index 
+	    dlsch_harq_proc->round++;
+	    
+	    if (dlsch_harq_proc->round == dlsch->Mdlharq) {
+	      // This was the last round for DLSCH so reset round and increment l2_error counter
+#ifdef DEBUG_PHY_PROC	
+	      LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id,
+		    dlsch->rnti,dl_harq_pid[m]);
 #endif
-                          dlsch_harq_proc->round = 0;
-                          ue_stats->dlsch_l2_errors++;
-                          dlsch_harq_proc->status = SCH_IDLE;
-                          dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
-                      }
-                  }
-                  else {
+	      dlsch_harq_proc->round = 0;
+	      ue_stats->dlsch_l2_errors++;
+	      dlsch_harq_proc->status = SCH_IDLE;
+	      dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
+	    }
+	  }
+	  else {
 #ifdef DEBUG_PHY_PROC	
-                      LOG_I(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id,
-                          dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
+	    LOG_I(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id,
+		  dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
 #endif
-                      ue_stats->dlsch_ACK[dlsch_harq_proc->round]++;
+	    ue_stats->dlsch_ACK[dlsch_harq_proc->round]++;
 
-                      // Received ACK so set round to 0 and set dlsch_harq_pid IDLE
-                      dlsch_harq_proc->round  = 0;
-                      dlsch_harq_proc->status = SCH_IDLE;
-                      dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
+	    // Received ACK so set round to 0 and set dlsch_harq_pid IDLE
+	    dlsch_harq_proc->round  = 0;
+	    dlsch_harq_proc->status = SCH_IDLE; 
+	    dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
 
-                      ue_stats->total_TBS = ue_stats->total_TBS +
-                          phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
-                      /*
+	    ue_stats->total_TBS = ue_stats->total_TBS + 
+	      phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
+	    /*
 	    ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits +
 	      phy_vars_eNB->dlsch_eNB[(u8)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
-                       */
-                  }
-
-                  // Do fine-grain rate-adaptation for DLSCH
-                  if (ue_stats->dlsch_NAK[0] > dlsch->error_threshold) {
-                      if (ue_stats->dlsch_mcs_offset == 1)
-                        ue_stats->dlsch_mcs_offset=0;
-                      else
-                        ue_stats->dlsch_mcs_offset=-1;
-                  }
+	    */
+	  }
+	  
+	  // Do fine-grain rate-adaptation for DLSCH 
+	  if (ue_stats->dlsch_NAK[0] > dlsch->error_threshold) {
+	    if (ue_stats->dlsch_mcs_offset == 1)
+	      ue_stats->dlsch_mcs_offset=0;
+	    else
+	      ue_stats->dlsch_mcs_offset=-1;
+	  }
 #ifdef DEBUG_PHY_PROC	  
-                  LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame,
-                      dlsch_harq_proc->round,dl_harq_pid[m],subframe);
-#endif
-
-                  // Clear NAK stats and adjust mcs offset
-                  // after measurement window timer expires
-                  if ((ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) ) {
-                      if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] < 2))
-                        ue_stats->dlsch_mcs_offset = 1;
-                      if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK[0] > 2))
-                        ue_stats->dlsch_mcs_offset = 0;
-                      if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] > 2))
-                        ue_stats->dlsch_mcs_offset = -1;
-                      if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK[0] < 2))
-                        ue_stats->dlsch_mcs_offset = 0;
-
-                      for (j=0;j<phy_vars_eNB->dlsch_eNB[j][0]->Mdlharq;j++)
-                        ue_stats->dlsch_NAK[j] = 0;
-                      ue_stats->dlsch_sliding_cnt = 0;
-                  }
-
-
-              }
-          }
+	  LOG_D(PHY,"[process_HARQ_feedback] Frame %d Setting round to %d for pid %d (subframe %d)\n",frame,
+		dlsch_harq_proc->round,dl_harq_pid[m],subframe);
+#endif
+	  
+	  // Clear NAK stats and adjust mcs offset
+	  // after measurement window timer expires
+	  if ((ue_stats->dlsch_sliding_cnt == dlsch->ra_window_size) ) {
+	    if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] < 2))
+	      ue_stats->dlsch_mcs_offset = 1;
+	    if ((ue_stats->dlsch_mcs_offset == 1) && (ue_stats->dlsch_NAK[0] > 2))
+	      ue_stats->dlsch_mcs_offset = 0;
+	    if ((ue_stats->dlsch_mcs_offset == 0) && (ue_stats->dlsch_NAK[0] > 2))
+	      ue_stats->dlsch_mcs_offset = -1;
+	    if ((ue_stats->dlsch_mcs_offset == -1) && (ue_stats->dlsch_NAK[0] < 2))
+	      ue_stats->dlsch_mcs_offset = 0;
+	    
+	    for (j=0;j<phy_vars_eNB->dlsch_eNB[j][0]->Mdlharq;j++)
+	      ue_stats->dlsch_NAK[j] = 0;
+	    ue_stats->dlsch_sliding_cnt = 0;
+	  }
+	  
+	  
+	}
       }
+    }
   }
 }
 
 void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
-    u8 UE_id,
-    u8 subframe,
-    s16 *n1_pucch0,
-    s16 *n1_pucch1,
-    s16 *n1_pucch2,
-    s16 *n1_pucch3) {
+		      u8 UE_id,
+		      u8 subframe,
+		      s16 *n1_pucch0,
+		      s16 *n1_pucch1,
+		      s16 *n1_pucch2,
+		      s16 *n1_pucch3) {
 
   LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
   u8 nCCE0,nCCE1;
@@ -2364,143 +2383,143 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
   int frame = ((subframe>=8) ? -1 : 0) + phy_vars_eNB->frame;
 
   if (frame_parms->frame_type == FDD ) {
-      sf = (subframe<4) ? (subframe+6) : (subframe-4);
-      //    printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]);
+    sf = (subframe<4) ? (subframe+6) : (subframe-4); 
+    //    printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf]);
 
-      if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[sf]>0) {
-          *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf];
-          *n1_pucch1 = -1;
-      }
-      else {
-          *n1_pucch0 = -1;
-          *n1_pucch1 = -1;
-      }
+    if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[sf]>0) {
+      *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[sf];
+      *n1_pucch1 = -1;
+    }
+    else {
+      *n1_pucch0 = -1;
+      *n1_pucch1 = -1;
+    }
   }
   else {
 
-      switch (frame_parms->tdd_config) {
-      case 1:  // DL:S:UL:UL:DL:DL:S:UL:UL:DL
-        if (subframe == 2) {  // ACK subframes 5 and 6
-            /*	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) {
+    switch (frame_parms->tdd_config) {
+    case 1:  // DL:S:UL:UL:DL:DL:S:UL:UL:DL
+      if (subframe == 2) {  // ACK subframes 5 and 6
+	/*	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) {
 		nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[6];
-             *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
+		*n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
 		}
 		else
-             *n1_pucch1 = -1;*/
-
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) {
-                nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5];
-                *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch0 = -1;
+		*n1_pucch1 = -1;*/
 
-            *n1_pucch1 = -1;
-        }
-        else if (subframe == 3) {   // ACK subframe 9
-
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) {
-                nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9];
-                *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch0 = -1;
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) {
+	  nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5];
+	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch0 = -1;
 
-            *n1_pucch1 = -1;
+	*n1_pucch1 = -1;	
+      }
+      else if (subframe == 3) {   // ACK subframe 9
+	
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) {
+	  nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9];
+	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch0 = -1;
 
-        }
-        else if (subframe == 7) {  // ACK subframes 0 and 1
-            //harq_ack[0].nCCE;
-            //harq_ack[1].nCCE;
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) {
-                nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0];
-                *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch0 = -1;
+	*n1_pucch1 = -1;
+	
+      }
+      else if (subframe == 7) {  // ACK subframes 0 and 1
+	//harq_ack[0].nCCE;  
+	//harq_ack[1].nCCE;
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) {
+	  nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0];
+	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch0 = -1;
 
-            *n1_pucch1 = -1;
-        }
-        else if (subframe == 8) {   // ACK subframes 4
-            //harq_ack[4].nCCE;
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[4]>0) {
-                nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[4];
-                *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch0 = -1;
+	*n1_pucch1 = -1;
+      }
+      else if (subframe == 8) {   // ACK subframes 4
+	//harq_ack[4].nCCE;
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[4]>0) {
+	  nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[4];
+	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch0 = -1;
 
-            *n1_pucch1 = -1;
-        }
-        else {
-            LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
-                phy_vars_eNB->Mod_id,
-                frame,
-                subframe,frame_parms->tdd_config);
-            return;
-        }
-        break;
-      case 3:  // DL:S:UL:UL:UL:DL:DL:DL:DL:DL
-        if (subframe == 2) {  // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe)
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) {
-                nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[6];
-                *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch1 = -1;
+	*n1_pucch1 = -1;
+      }
+      else {
+	LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
+	      phy_vars_eNB->Mod_id,
+	      frame,
+	      subframe,frame_parms->tdd_config);
+	return;
+      }
+      break;
+    case 3:  // DL:S:UL:UL:UL:DL:DL:DL:DL:DL
+      if (subframe == 2) {  // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe)
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[6]>0) {
+	  nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[6];
+	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch1 = -1;
 
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) {
-                nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5];
-                *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch0 = -1;
-        }
-        else if (subframe == 3) {   // ACK subframes 7 and 8
-            LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n",
-                phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]);
-
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]>0) {
-                nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[8];
-                *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
-                LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1);
-            }
-            else
-              *n1_pucch1 = -1;
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[5]>0) {
+	  nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[5];
+	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch0 = -1;
+      }
+      else if (subframe == 3) {   // ACK subframes 7 and 8
+	LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n",
+	      phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]);
+
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[8]>0) {
+	  nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[8];
+	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
+	  LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1);
+	}
+	else
+	  *n1_pucch1 = -1;
 
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7]>0) {
-                nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[7];
-                *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
-                LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0);
-            }
-            else
-              *n1_pucch0 = -1;
-        }
-        else if (subframe == 4) {  // ACK subframes 9 and 0
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) {
-                nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0];
-                *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch1 = -1;
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[7]>0) {
+	  nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[7];
+	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
+	  LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0);
+	}
+	else
+	  *n1_pucch0 = -1;
+      }
+      else if (subframe == 4) {  // ACK subframes 9 and 0
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[0]>0) {
+	  nCCE1 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[0];
+	  *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch1 = -1;
 
-            if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) {
-                nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9];
-                *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
-            }
-            else
-              *n1_pucch0 = -1;
-        }
-        else {
-            LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
-                phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config);
-            return;
-        }
-        break;
-      }  // switch tdd_config
-      // Don't handle the case M>2
-      *n1_pucch2 = -1;
-      *n1_pucch3 = -1;
+	if (phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->subframe_tx[9]>0) {
+	  nCCE0 = phy_vars_eNB->dlsch_eNB[(u32)UE_id][0]->nCCE[9];
+	  *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN; 
+	}
+	else
+	  *n1_pucch0 = -1;
+      }
+      else {
+	LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
+	      phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config);
+	return;
+      }
+      break;
+    }  // switch tdd_config     
+    // Don't handle the case M>2
+    *n1_pucch2 = -1;
+    *n1_pucch3 = -1;
   }
 }
 
@@ -2516,44 +2535,44 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag
   memset(&preamble_energy_list[0],0,64*sizeof(u16));
   memset(&preamble_delay_list[0],0,64*sizeof(u16));
   if (abstraction_flag == 0) {
-      //    LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id,
-      //          frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB);
+    //    LOG_I(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id,
+    //          frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB);        
 
-      //    LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset);
+    //    LOG_I(PHY,"[eNB %d][RAPROC] PRACH: rootSequenceIndex %d, prach_ConfigIndex %d, zeroCorrelationZoneConfig %d, highSpeedFlag %d, prach_FreqOffset %d\n",phy_vars_eNB->Mod_id,phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex, phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag,phy_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset);
 
-      rx_prach(phy_vars_eNB,
-          subframe,
-          preamble_energy_list,
-          preamble_delay_list,
-          frame,
-          0);
+    rx_prach(phy_vars_eNB,
+	     subframe,
+	     preamble_energy_list,
+	     preamble_delay_list,
+	     frame,
+	     0);
   }
   else {
-      for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
-
-          LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n",
-              UE_id,PHY_vars_UE_g[UE_id],PHY_vars_UE_g[UE_id]->generate_prach,
-              PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex,
-              phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,
-              PHY_vars_UE_g[UE_id]->prach_PreambleIndex);
-
-          if ((PHY_vars_UE_g[UE_id]->generate_prach==1) &&
-              (PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex ==
-                  phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) {
-              preamble_energy_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 80;
-              preamble_delay_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 5;
-
-          }
+    for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
+      
+      LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n",
+	    UE_id,PHY_vars_UE_g[UE_id],PHY_vars_UE_g[UE_id]->generate_prach,
+	    PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex,
+	    phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,
+	    PHY_vars_UE_g[UE_id]->prach_PreambleIndex);
+      
+      if ((PHY_vars_UE_g[UE_id]->generate_prach==1) &&
+	  (PHY_vars_UE_g[UE_id]->lte_frame_parms.prach_config_common.rootSequenceIndex ==
+	   phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) {
+	preamble_energy_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 80;
+	preamble_delay_list[PHY_vars_UE_g[UE_id]->prach_PreambleIndex] = 5;
+	
       }
+    }
   }
   preamble_energy_max = preamble_energy_list[0];
   preamble_max = 0;
 
   for (i=1;i<64;i++) {
-      if (preamble_energy_max < preamble_energy_list[i]) {
-          preamble_energy_max = preamble_energy_list[i];
-          preamble_max = i;
-      }
+    if (preamble_energy_max < preamble_energy_list[i]) {
+      preamble_energy_max = preamble_energy_list[i];
+      preamble_max = i;
+    }
   }
 
 #ifdef DEBUG_PHY_PROC
@@ -2564,28 +2583,28 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,u8 subframe,u8 abstraction_flag
 #endif
 
   if (preamble_energy_list[preamble_max] > 60) {
-      UE_id = find_next_ue_index(phy_vars_eNB);
-      if (UE_id>=0) {
-          phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits
-          //phy_vars_eNb->eNB_UE_stats[(u32)UE_id].mode = PRACH;
-          phy_vars_eNB->eNB_UE_stats[(u32)UE_id].sector = 0;
-          LOG_I(PHY,"[eNB %d][RAPROC] Initiating RA procedure with preamble %d, energy %d, delay %d\n",
-              phy_vars_eNB->Mod_id,
-              preamble_max,
-              preamble_energy_max,
-              preamble_delay_list[preamble_max]);
+    UE_id = find_next_ue_index(phy_vars_eNB);
+    if (UE_id>=0) {
+      phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits
+      //phy_vars_eNb->eNB_UE_stats[(u32)UE_id].mode = PRACH;
+      phy_vars_eNB->eNB_UE_stats[(u32)UE_id].sector = 0;
+      LOG_I(PHY,"[eNB %d][RAPROC] Initiating RA procedure with preamble %d, energy %d, delay %d\n",
+	    phy_vars_eNB->Mod_id,
+	    preamble_max,
+	    preamble_energy_max,
+	    preamble_delay_list[preamble_max]);
 #ifdef OPENAIR2	  
-          mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id,
-              frame,
-              preamble_max,
-              preamble_delay_list[preamble_max],
-              0,subframe,0);
+      mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id,
+				  frame,
+				  preamble_max,
+				  preamble_delay_list[preamble_max],
+				  0,subframe,0);
 #endif
-      }
-      else {
-          LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n",
-              phy_vars_eNB->Mod_id,frame, subframe);
-      }
+    }
+    else {
+      LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n", 
+	    phy_vars_eNB->Mod_id,frame, subframe);
+    }
   }
 }
 
@@ -2618,61 +2637,64 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8
   int frame = ((last_slot>>1)>=8 ? -1 : 0 )+ phy_vars_eNB->frame;
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
+  start_meas(&phy_vars_eNB->phy_proc_rx);
 #ifdef DEBUG_PHY_PROC
   LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, last_slot);
 #endif
 
   if (abstraction_flag == 0) {
-      remove_7_5_kHz(phy_vars_eNB,last_slot-1);
-      remove_7_5_kHz(phy_vars_eNB,last_slot);
+    remove_7_5_kHz(phy_vars_eNB,last_slot-1);
+    remove_7_5_kHz(phy_vars_eNB,last_slot);
   }
   //#ifdef OPENAIR2
   // check if we have to detect PRACH first
   if ((last_slot&1)==1){
-      //    printf("Checking PRACH for eNB %d, subframe %d\n",phy_vars_eNB->Mod_id,last_slot>>1);
-      if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,last_slot>>1)>0) {
-          //     printf("Running prach procedures\n");
-          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
-          prach_procedures(phy_vars_eNB,last_slot>>1,abstraction_flag);
-          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
-      }
+    //    printf("Checking PRACH for eNB %d, subframe %d\n",phy_vars_eNB->Mod_id,last_slot>>1);
+    if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,last_slot>>1)>0) {
+      //     printf("Running prach procedures\n");
+      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
+      prach_procedures(phy_vars_eNB,last_slot>>1,abstraction_flag);
+      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
+    }
   }
   //#endif
   if (abstraction_flag == 0) {
-      for (l=0;l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2;l++) {
-
-          for (sect_id=0;sect_id<number_of_cards;sect_id++) {
-              slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
-                  &phy_vars_eNB->lte_eNB_common_vars,
-                  l,
-                  last_slot,
-                  sect_id,
+    start_meas(&phy_vars_eNB->ofdm_demod_stats);	      	      	  
+    for (l=0;l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2;l++) {
+      
+      for (sect_id=0;sect_id<number_of_cards;sect_id++) {
+	slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
+		    &phy_vars_eNB->lte_eNB_common_vars,
+		    l,
+		    last_slot,
+		    sect_id,
 #ifdef HW_PREFIX_REMOVAL
-                  1
+		    1
 #else
-                  0
-#endif
-              );
-              slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
-                  &phy_vars_eNB->lte_eNB_common_vars,
-                  l,
-                  last_slot-1,
-                  sect_id,
+		    0
+#endif
+		    );
+        slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
+                    &phy_vars_eNB->lte_eNB_common_vars,
+                    l,
+                    last_slot-1,
+                    sect_id,
 #ifdef HW_PREFIX_REMOVAL
-                  1
+                    1
 #else
-                  0
+                    0
 #endif
-              );
+                    );
 
-          }
       }
+    }
+    stop_meas(&phy_vars_eNB->ofdm_demod_stats);	      	      	  
   }
   sect_id = 0;
 
   /*
     for (UE_id=0;UE_id<NUMBER_OF_UE_MAX;UE_id++) {
-
+    
     if ((phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode>PRACH) && (last_slot%2==1)) {
     #ifdef DEBUG_PHY_PROC	
     LOG_D(PHY,"[eNB %d] frame %d, slot %d: Doing SRS estimation and measurements for UE_id %d (UE_mode %d)\n",
@@ -2681,7 +2703,7 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8
     UE_id,phy_vars_eNB->eNB_UE_stats[(u32)UE_id].mode);
     #endif
     for (sect_id=0;sect_id<number_of_cards;sect_id++) {
-
+	
     lte_srs_channel_estimation(&phy_vars_eNB->lte_frame_parms,
     &phy_vars_eNB->lte_eNB_common_vars,
     &phy_vars_eNB->lte_eNB_srs_vars[(u32)UE_id],
@@ -2700,13 +2722,13 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8
     phy_vars_eNB->PHY_measurements_eNB[sect_id].rx_rssi_dBm[(u32)UE_id]);
     #endif
     }
-
+      
     sect_id=0;
     #ifdef USER_MODE
     //write_output("srs_est0.m","srsest0",phy_vars_eNB->lte_eNB_common_vars.srs_ch_estimates[0][0],512,1,1);
     //write_output("srs_est1.m","srsest1",phy_vars_eNB->lte_eNB_common_vars.srs_ch_estimates[0][1],512,1,1);
     #endif
-
+      
     //msg("timing advance in\n");
     sync_pos = lte_est_timing_advance(&phy_vars_eNB->lte_frame_parms,
     &phy_vars_eNB->lte_eNB_srs_vars[(u32)UE_id],
@@ -2714,191 +2736,196 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8
     phy_vars_eNB->first_run_timing_advance[(u32)UE_id],
     number_of_cards,
     24576);
-
+      
     //msg("timing advance out\n");
-
+      
     //phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8;
     phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset = 0;
     phy_vars_eNB->eNB_UE_stats[(u32)UE_id].sector = sect_id;
-    #ifdef DEBUG_PHY_PROC
+    #ifdef DEBUG_PHY_PROC	
     LOG_D(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing_advance = %d\n",
     phy_vars_eNB->Mod_id,
-    phy_vars_eNB->frame, last_slot,
+    phy_vars_eNB->frame, last_slot, 
     UE_id, sect_id,
     phy_vars_eNB->eNB_UE_stats[(u32)UE_id].UE_timing_offset);
     #endif
     }
     }
     else {
-
+    
     }
-   */
+  */
   // Check for active processes in current subframe
   harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
-      frame,last_slot>>1);
+			       frame,last_slot>>1);
   //  printf("[eNB][PUSCH] subframe %d => harq_pid %d\n",last_slot>>1,harq_pid);
 
   /*
     #ifdef OPENAIR2
-    if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) &&
+    if ((phy_vars_eNB->eNB_UE_stats[0].mode == PUSCH) && 
     (phy_vars_eNB->eNB_UE_stats[1].mode == PUSCH))
     two_ues_connected = 1;
     #else
     two_ues_connected = 1;
     #endif
-   */
+  */
 
   pusch_active = 0;
-  // reset the cba flag used for collision detection
+  // reset the cba flag used for collision detection 
   for (i=0; i < NUM_MAX_CBA_GROUP; i++){
-      phy_vars_eNB->cba_last_reception[i]=0;
+    phy_vars_eNB->cba_last_reception[i]=0;
   }
   //  LOG_I(PHY,"subframe %d: nPRS %d\n",last_slot>>1,phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[last_slot-1]);
-
-  for (i=0;i<NUMBER_OF_UE_MAX;i++) {
-
-      /*
+ 
+  for (i=0;i<NUMBER_OF_UE_MAX;i++) { 
+  
+    /*
       if ((i == 1) && (phy_vars_eNB->cooperation_flag > 0) && (two_ues_connected == 1))
       break;
-       */
+    */
 #ifdef OPENAIR2
-      if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE)
-        process_Msg3(phy_vars_eNB,last_slot,i,harq_pid);
+    if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE)
+      process_Msg3(phy_vars_eNB,last_slot,i,harq_pid);
 #endif
 
-      /*
+    /*  
 #ifdef DEBUG_PHY_PROC
     if (phy_vars_eNB->ulsch_eNB[i]) {
-
+      
       LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d rnti %x, alloc %d\n",phy_vars_eNB->Mod_id,
 	     harq_pid,frame,last_slot>>1,
 	     (phy_vars_eNB->ulsch_eNB[i]->rnti),
-	     (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag)
+	     (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag) 
 	     );
     }
 #endif
-       */
-      if ((phy_vars_eNB->ulsch_eNB[i]) &&
-          (phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
-          (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1) &&
-          ((last_slot%2)==1)) {
-
-          pusch_active = 1;
-          round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
+    */
+    if ((phy_vars_eNB->ulsch_eNB[i]) &&
+	(phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
+	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1) && 
+	((last_slot%2)==1)) {
+ 
+      pusch_active = 1;
+      round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
 
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x\n",
-              phy_vars_eNB->Mod_id,harq_pid,
-              frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->rnti);
+      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x\n",
+	    phy_vars_eNB->Mod_id,harq_pid,
+	    frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->rnti);
 #endif
-
+  
 #ifdef DEBUG_PHY_PROC
-          if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){
-              LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
-                  phy_vars_eNB->Mod_id,
-                  frame,
-                  last_slot,last_slot>>1,
-                  phy_vars_eNB->eNB_UE_stats[i].sector);
-          } else {
-              LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n",
-                  phy_vars_eNB->Mod_id,
-                  frame,
-                  last_slot,last_slot>>1,
-                  i,
-                  mode_string[phy_vars_eNB->eNB_UE_stats[i].mode],
-                  phy_vars_eNB->eNB_UE_stats[i].sector);
-          }
+      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1){
+	LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
+	      phy_vars_eNB->Mod_id,
+	      frame,
+	      last_slot,last_slot>>1,
+	      phy_vars_eNB->eNB_UE_stats[i].sector);
+      } else {
+	LOG_D(PHY,"[eNB %d] frame %d, slot %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s sect_id %d\n",
+	      phy_vars_eNB->Mod_id,
+	      frame,
+	      last_slot,last_slot>>1,
+	      i,
+	      mode_string[phy_vars_eNB->eNB_UE_stats[i].mode],
+	      phy_vars_eNB->eNB_UE_stats[i].sector);
+      }
 #endif
 
-          nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[last_slot-1];
+      nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[last_slot-1];
 
-          phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12;
+      phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift + nPRS)%12;
 
-          if (frame_parms->frame_type == FDD ) {
-              int subframe = last_slot >> 1;
-              int sf = (subframe<4) ? (subframe+6) : (subframe-4);
+    if (frame_parms->frame_type == FDD ) {
+      int subframe = last_slot >> 1;
+      int sf = (subframe<4) ? (subframe+6) : (subframe-4); 
 
-              if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission
-                  phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1;
-              }
-              else {
-                  phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0;
-              }
-          }
+      if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1;
+      }
+      else {
+        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0;
+      }
+    }
 
 #ifdef DEBUG_PHY_PROC
-          LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n",
-              phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx,
-              phy_vars_eNB->ulsch_eNB[i]->cyclicShift,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2,
-              phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
-              nPRS,
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK);
-#endif
-          if (abstraction_flag==0) {
-              rx_ulsch(phy_vars_eNB,
-                  last_slot>>1,
-                  phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                  i,
-                  phy_vars_eNB->ulsch_eNB,
-                  0);
-          }
+      LOG_I(PHY,"[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n",
+	    phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx,
+	    phy_vars_eNB->ulsch_eNB[i]->cyclicShift,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2,
+	    phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
+	    nPRS,
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK);
+#endif
+      start_meas(&phy_vars_eNB->ulsch_demodulation_stats);	      	      	  
+      if (abstraction_flag==0) {
+	rx_ulsch(phy_vars_eNB,
+		 last_slot>>1,
+		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+		 i,
+		 phy_vars_eNB->ulsch_eNB,
+		 0);
+      }
 #ifdef PHY_ABSTRACTION
-          else {
-              rx_ulsch_emul(phy_vars_eNB,
-                  last_slot>>1,
-                  phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                  i);
-          }
+      else {
+	rx_ulsch_emul(phy_vars_eNB,
+		      last_slot>>1,
+		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+		      i);
+      }
 #endif
+      stop_meas(&phy_vars_eNB->ulsch_demodulation_stats);	      	      	  
 
-          for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++)
-            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) - phy_vars_eNB->rx_total_gain_eNB_dB;
 
-          if (abstraction_flag == 0) {
-              ret = ulsch_decoding(phy_vars_eNB,
-                  i,
-                  last_slot>>1,
-                  0, // control_only_flag
-                  0, //Nbundled, to be updated!!!!
-                  0);
-          }
+      for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++)
+	phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) - phy_vars_eNB->rx_total_gain_eNB_dB;
+
+      start_meas(&phy_vars_eNB->ulsch_decoding_stats);
+      if (abstraction_flag == 0) {
+	ret = ulsch_decoding(phy_vars_eNB,
+			     i,
+			     last_slot>>1,
+			     0, // control_only_flag
+			     0, //Nbundled, to be updated!!!!
+			     0);  
+      }
 #ifdef PHY_ABSTRACTION
-          else {
-              ret = ulsch_decoding_emul(phy_vars_eNB,
-                  last_slot>>1,
-                  i,
-                  &rnti);
-          }
+      else {
+	ret = ulsch_decoding_emul(phy_vars_eNB,
+				  last_slot>>1,
+				  i,
+				  &rnti);
+      }
 #endif
+      stop_meas(&phy_vars_eNB->ulsch_decoding_stats);
 
 #ifdef DEBUG_PHY_PROC
-          LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
-              phy_vars_eNB->Mod_id,harq_pid,
-              frame,last_slot>>1,
-              phy_vars_eNB->ulsch_eNB[i]->rnti,
-              dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-              dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
-              phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-              phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
-              phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],
-              phy_vars_eNB->ulsch_eNB[i]->o_ACK[1],
-              ret);
+      LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
+	  phy_vars_eNB->Mod_id,harq_pid,
+	  frame,last_slot>>1,
+      phy_vars_eNB->ulsch_eNB[i]->rnti,
+	  dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+	  dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
+	  phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
+	  phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
+	  phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],
+	  phy_vars_eNB->ulsch_eNB[i]->o_ACK[1],
+	  ret);
 #endif //DEBUG_PHY_PROC
-          /*
+      /*
 	if ((two_ues_connected==1) && (phy_vars_eNB->cooperation_flag==2)) {
 	for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++) {
-	phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[j])
+	phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_0[j]) 
 	- phy_vars_eNB->rx_total_gain_eNB_dB;
-	phy_vars_eNB->eNB_UE_stats[i+1].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_1[j])
+	phy_vars_eNB->eNB_UE_stats[i+1].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power_1[j]) 
 	- phy_vars_eNB->rx_total_gain_eNB_dB;
 	}
 	#ifdef DEBUG_PHY_PROC
@@ -2911,684 +2938,688 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8
 	#endif
 	}
 	else {
-           */
-          for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++)
-            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j])
-            - phy_vars_eNB->rx_total_gain_eNB_dB;
+      */
+      for (j=0;j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx;j++)
+	phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] = dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]) 
+	  - phy_vars_eNB->rx_total_gain_eNB_dB;
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n",
-              phy_vars_eNB->Mod_id,frame,last_slot>>1,i,
-              dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-              dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]));
+      LOG_D(PHY,"[eNB %d] Frame %d subframe %d: ULSCH %d RX power (%d,%d) dB\n",
+	    phy_vars_eNB->Mod_id,frame,last_slot>>1,i,
+	    dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+	    dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]));
 #endif
 
-          //      }
-
-
-          phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
+      //      }
+      
+    
+      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n",
-              phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid);
+      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n",
+	    phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid);
 #endif
-          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
+      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
 
-          if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
+      if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
 #ifdef DEBUG_PHY_PROC
-              //if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50))
-              print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
+	//if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50)) 
+	print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
 #endif
-              extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode);
-              phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0];
-          }
-
-          if (ret == (1+MAX_TURBO_ITERATIONS)) {
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
-
-              LOG_D(PHY,"[UE][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
-              //	dump_ulsch(phy_vars_eNB, last_slot>>1, i);
-              //	exit(-1);
-
-              if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
-                  LOG_I(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
-                      phy_vars_eNB->Mod_id,
-                      frame,last_slot,last_slot>>1, i,
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
-                      phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
-
-                  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round ==
-                      phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
-                      LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
-                          phy_vars_eNB->Mod_id, i);
-                      phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
+	extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode);
+	phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0];
+      }
+    
+      if (ret == (1+MAX_TURBO_ITERATIONS)) {
+	phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
+
+	LOG_D(PHY,"[UE][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
+	//	dump_ulsch(phy_vars_eNB, last_slot>>1, i);
+	//	exit(-1);
+
+	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+	  LOG_I(PHY,"[eNB %d][RAPROC] frame %d, slot %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
+		phy_vars_eNB->Mod_id,
+		frame,last_slot,last_slot>>1, i,
+		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
+		phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
+
+	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round == 
+	      phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
+	    LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
+		  phy_vars_eNB->Mod_id, i);
+	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
 #ifdef OPENAIR2
-                      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-                          frame,
-                          phy_vars_eNB->eNB_UE_stats[i].crnti);
-#endif
-                      remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
-                      phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 0;
-                      //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;
-
-                  }
-                  else {
-                      // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI)
-                      phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 1;
-
-                      get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
-                          last_slot>>1,
-                          frame,
-                          &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
-                          &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
-                  }
-                  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1,
-                      harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-                  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
-                    printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
-                  printf("\n");
-                  dump_ulsch(phy_vars_eNB,last_slot>>1,i);
-                  mac_exit_wrapper("Msg3 error");
-              } // This is Msg3 error
-              else { //normal ULSCH
-                  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n",
-                      phy_vars_eNB->Mod_id,harq_pid,
-                      frame,last_slot>>1, i,
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
-                      phy_vars_eNB->ulsch_eNB[i]->Mdlharq,
-                      phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],
-                      phy_vars_eNB->ulsch_eNB[i]->o_ACK[1]);
-
-                  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,last_slot>>1,
-                      harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-                  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0]!=NULL){
-                      for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
-                        LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
-                      LOG_T(PHY,"\n");
-                  }
-
-
-                  //	  dump_ulsch(phy_vars_eNB,last_slot>>1,i);
-                  //	  mac_xface->macphy_exit("");
-
-                  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) {
-                      LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n",
-                          phy_vars_eNB->Mod_id,harq_pid,
-                          frame,last_slot>>1, i,
-                          phy_vars_eNB->ulsch_eNB[i]->Mdlharq);
-
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0;
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
-                      phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
-                      phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]++;
-                      //dump_ulsch(phy_vars_eNB, last_slot>>1, i);
-                      //mac_xface->macphy_exit("");
-                  }
-
-                  // If we've dropped the UE, go back to PRACH mode for this UE
-                  if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == 20) {
-                      LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached, removing UE\n",
-                          phy_vars_eNB->Mod_id,frame,last_slot>>1, i);
-                      phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
+	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
+				      frame,
+				      phy_vars_eNB->eNB_UE_stats[i].crnti);
+#endif
+	    remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
+	    phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 0;
+	    //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;
+
+	  }
+	  else {
+	    // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI)
+	    phy_vars_eNB->ulsch_eNB[(u32)i]->Msg3_active = 1;
+	    
+	    get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
+			       last_slot>>1,
+			       frame,
+			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
+			       &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
+	  }
+	  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1,
+		harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
+	    printf("%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
+	  printf("\n");
+	  dump_ulsch(phy_vars_eNB,last_slot>>1,i);
+#ifndef EXMIMO_IOT
+	  LOG_W(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error\n", frame,last_slot>>1);
+#else 
+	  mac_exit_wrapper("Msg3 error");
+#endif 
+	} // This is Msg3 error
+	else { //normal ULSCH
+	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n",
+		phy_vars_eNB->Mod_id,harq_pid,
+		frame,last_slot>>1, i,
+		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
+		phy_vars_eNB->ulsch_eNB[i]->Mdlharq,
+		phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],
+		phy_vars_eNB->ulsch_eNB[i]->o_ACK[1]);
+	  	  
+	  LOG_I(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:\n",frame,last_slot>>1,
+		harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0]!=NULL){
+	    for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
+	      LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->c[0][j]);
+	    LOG_T(PHY,"\n");	  
+	  }
+	  
+
+//	  dump_ulsch(phy_vars_eNB,last_slot>>1,i);
+//	  mac_xface->macphy_exit("");
+	  
+	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mdlharq) {
+	    LOG_I(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mdlharq %d reached\n",
+		  phy_vars_eNB->Mod_id,harq_pid,
+		  frame,last_slot>>1, i,
+		  phy_vars_eNB->ulsch_eNB[i]->Mdlharq);
+	    
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0;
+	    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
+	    phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
+	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]++;
+	    //dump_ulsch(phy_vars_eNB, last_slot>>1, i);
+	    //mac_xface->macphy_exit("");
+	  }
+	
+	  // If we've dropped the UE, go back to PRACH mode for this UE
+	  if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] == 20) {
+	    LOG_I(PHY,"[eNB %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached, removing UE\n",
+		  phy_vars_eNB->Mod_id,frame,last_slot>>1, i);
+	    phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
 #ifdef OPENAIR2
-                      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-                          frame,
-                          phy_vars_eNB->eNB_UE_stats[i].crnti);
+	    mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
+				      frame,
+				      phy_vars_eNB->eNB_UE_stats[i].crnti);
 #endif
-                      remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
-                      phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]=0;
-                  }
-              }
-          }  // ulsch in error
-          else {
-              LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
-                  phy_vars_eNB->Mod_id,harq_pid,
-                  frame,last_slot>>1);
-
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0;
-
-              if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+	    remove_ue(phy_vars_eNB->eNB_UE_stats[i].crnti,phy_vars_eNB,abstraction_flag);
+	    phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid]=0;
+	  }
+	}
+      }  // ulsch in error
+      else {
+	LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
+	      phy_vars_eNB->Mod_id,harq_pid,
+	      frame,last_slot>>1);	    
+
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
+	phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0;
+
+	if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
 #ifdef OPENAIR2
 #ifdef DEBUG_PHY_PROC
-                  LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n",
-                      phy_vars_eNB->Mod_id,
-                      frame,harq_pid,i);
+	  LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n",
+		phy_vars_eNB->Mod_id,
+		frame,harq_pid,i);
 #endif
-                  mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id,
-                      frame,
-                      phy_vars_eNB->ulsch_eNB[i]->rnti,
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	  mac_xface->terminate_ra_proc(phy_vars_eNB->Mod_id,
+				       frame,
+				       phy_vars_eNB->ulsch_eNB[i]->rnti,
+				       phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
+				       phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
 #endif
 
-                  phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
-                  phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
+	  phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
+	  phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
 
 #ifdef DEBUG_PHY_PROC
-                  LOG_I(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,last_slot>>1,i);
+	  LOG_I(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,last_slot>>1,i);
 #endif //DEBUG_PHY_PROC
 
-                  for (j=0;j<phy_vars_eNB->dlsch_eNB[i][0]->Mdlharq;j++) {
-                      phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[j]=0;
-                      phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
-                  }
-
-                  //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n");
-              }
-              else {
+	  for (j=0;j<phy_vars_eNB->dlsch_eNB[i][0]->Mdlharq;j++) {
+	    phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[j]=0;
+	    phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
+	  }
 
+	  //mac_xface->macphy_exit("Mode PUSCH. Exiting.\n");
+	}
+	else {
+	  
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_ULSCH
-                  LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1,
-                      harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-                  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
-                    LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
-                  LOG_T(PHY,"\n");
+	  LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,last_slot>>1,
+		harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	  for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
+	    LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
+	  LOG_T(PHY,"\n");
 #endif
 #endif
-                  //dump_ulsch(phy_vars_eNB,last_slot>>1,i);
-                  //mac_xface->macphy_exit("");
-
+	  //dump_ulsch(phy_vars_eNB,last_slot>>1,i);
+          //mac_xface->macphy_exit("");
+ 
 
 #ifdef OPENAIR2
-                  //	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) {
-                  mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-                      frame,
-                      phy_vars_eNB->ulsch_eNB[i]->rnti,
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-                      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-                  //}
-                  /*
+	  //	  if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->calibration_flag == 0) {
+	  mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
+			    frame,
+			    phy_vars_eNB->ulsch_eNB[i]->rnti,
+			    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
+			    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	  //}
+	  /*
 	    else {
 	    // Retrieve calibration information and do whatever
-	    LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	    LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->frame,last_slot>>1,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);	    
 	    }
-                   */
+	  */
 #endif
-              }
+	}
 
-              // estimate timing advance for MAC
-              if (abstraction_flag == 0) {
-                  sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,last_slot>>1);
-                  phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check
-              }
+	// estimate timing advance for MAC
+	if (abstraction_flag == 0) {
+	  sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,last_slot>>1);
+	  phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/8; //to check 
+	}
 
-#ifdef DEBUG_PHY_PROC
-              LOG_I(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing advance = %d\n",
-                  phy_vars_eNB->Mod_id,
-                  frame, last_slot,
-                  i, sect_id,
-                  phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
+#ifdef DEBUG_PHY_PROC	
+	LOG_I(PHY,"[eNB %d] frame %d, slot %d: user %d in sector %d: timing advance = %d\n",
+	      phy_vars_eNB->Mod_id,
+	      frame, last_slot, 
+	      i, sect_id,
+	      phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
 #endif
+	
 
-
-          }  // ulsch not in error
-
-          // process HARQ feedback
+      }  // ulsch not in error
+      
+      // process HARQ feedback
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id,
-              phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-              frame,last_slot>>1,
-              i);
-#endif
-          process_HARQ_feedback(i,
-              last_slot>>1,
-              phy_vars_eNB,
-              1, // pusch_flag
-              0,
-              0,
-              0);
-
-          //#ifdef DEBUG_PHY_PROC
-          LOG_I(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n",
-              phy_vars_eNB->Mod_id,frame,last_slot>>1,
-              phy_vars_eNB->eNB_UE_stats[i].sector,
-              harq_pid,
-              i,
-              ret,
-              phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status,
-              phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],
-              phy_vars_eNB->ulsch_eNB[i]->o_ACK[1],
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
-          //#endif
-
-
-          if (frame % 100 == 0) {
-              if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] -
-                  phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]) != 0)
-                phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_pid][round] =
-                    (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round] -
-                        phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round]))/
-                        (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] -
-                            phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]);
-
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round] =
-                  phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round];
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round] =
-                  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round];
-          }
-
+      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id,
+	    phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+	    frame,last_slot>>1,
+	    i);
+#endif
+      process_HARQ_feedback(i,
+			    last_slot>>1,
+			    phy_vars_eNB,
+			    1, // pusch_flag
+			    0,
+			    0,
+			    0);
+      
+      //#ifdef DEBUG_PHY_PROC
+      LOG_I(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n", 
+	    phy_vars_eNB->Mod_id,frame,last_slot>>1,
+	    phy_vars_eNB->eNB_UE_stats[i].sector, 
+	    harq_pid, 
+	    i, 
+	    ret, 
+	    phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status, 
+	    phy_vars_eNB->ulsch_eNB[i]->o_ACK[0],	
+	    phy_vars_eNB->ulsch_eNB[i]->o_ACK[1], 
+	    phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
+	    phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
+      //#endif
+
+
+      if (frame % 100 == 0) {
+	if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - 
+	     phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]) != 0)
+	  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_pid][round] = 
+	    (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round] - 
+		  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round]))/
+	    (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round] - 
+	     phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round]);
+
+	phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_pid][round] = 
+	  phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][round];
+	phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_pid][round] = 
+	  phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][round];
       }
 
+    }
+  
 
 #ifdef PUCCH
-      else if ((phy_vars_eNB->dlsch_eNB[i][0]) &&
-          (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0) &&
-          ((last_slot%2)==1)){ // check for PUCCH
-
-          // check SR availability
-          do_SR = is_SR_subframe(phy_vars_eNB,i,last_slot>>1);
-          //      do_SR = 0;
-
-          // Now ACK/NAK
-          // First check subframe_tx flag for earlier subframes
-          get_n1_pucch_eNB(phy_vars_eNB,
-              i,
-              last_slot>>1,
-              &n1_pucch0,
-              &n1_pucch1,
-              &n1_pucch2,
-              &n1_pucch3);
-
-          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n",
-              phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-              frame,last_slot>>1,
-              n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR);
-
-          if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) {  // no TX PDSCH that have to be checked and no SR for this UE_id
-          }
-          else {
-              // otherwise we have some PUCCH detection to do
-
-              if (do_SR == 1) {
-                  phy_vars_eNB->eNB_UE_stats[i].sr_total++;
-
-                  if (abstraction_flag == 0)
-                    metric0 = rx_pucch(phy_vars_eNB,
-                        pucch_format1,
-                        i,
-                        phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
-                        0, // n2_pucch
-                        1, // shortened format
-                        &SR_payload,
-                        last_slot>>1,
-                        PUCCH1_THRES);
+    else if ((phy_vars_eNB->dlsch_eNB[i][0]) &&
+	     (phy_vars_eNB->dlsch_eNB[i][0]->rnti>0) &&
+	     ((last_slot%2)==1)){ // check for PUCCH
+
+      // check SR availability
+      do_SR = is_SR_subframe(phy_vars_eNB,i,last_slot>>1);
+      //      do_SR = 0;
+    
+      // Now ACK/NAK
+      // First check subframe_tx flag for earlier subframes
+      get_n1_pucch_eNB(phy_vars_eNB,
+		       i,
+		       last_slot>>1,
+		       &n1_pucch0,
+		       &n1_pucch1,
+		       &n1_pucch2,
+		       &n1_pucch3);
+
+      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n",
+	    phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+	    frame,last_slot>>1,
+	    n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR);
+
+      if ((n1_pucch0==-1) && (n1_pucch1==-1) && (do_SR==0)) {  // no TX PDSCH that have to be checked and no SR for this UE_id
+      }
+      else {
+	// otherwise we have some PUCCH detection to do
+      
+	if (do_SR == 1) {
+	  phy_vars_eNB->eNB_UE_stats[i].sr_total++;
+	
+	  if (abstraction_flag == 0)
+	    metric0 = rx_pucch(phy_vars_eNB,
+			       pucch_format1,
+			       i,
+			       phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
+			       0, // n2_pucch
+			       1, // shortened format
+			       &SR_payload,
+			       last_slot>>1,
+			       PUCCH1_THRES);
 #ifdef PHY_ABSTRACTION
-                  else {
-                      metric0 = rx_pucch_emul(phy_vars_eNB,
-                          i,
-                          pucch_format1,
-                          0,
-                          &SR_payload,
-                          last_slot>>1);
-                      LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id,
-                          phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex);
-                  }
-#endif
-
-                  if (SR_payload == 1) {
-                      LOG_I(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id,
-                          phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1);
-                      phy_vars_eNB->eNB_UE_stats[i].sr_received++;
-                      if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
-                          phy_vars_eNB->first_sr[i] = 0;
-                          phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->round=0;
-                          phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE;
-                          LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
-                              phy_vars_eNB->Mod_id,
-                              phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1);
-                      }
+	  else {
+	    metric0 = rx_pucch_emul(phy_vars_eNB,
+				    i,
+				    pucch_format1,
+				    0,
+				    &SR_payload,
+				    last_slot>>1);
+	    LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id,
+		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1,SR_payload,phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex);
+	  }
+#endif
+
+	  if (SR_payload == 1) {
+	    LOG_I(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id,
+		  phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1);
+	    phy_vars_eNB->eNB_UE_stats[i].sr_received++;
+	    if (phy_vars_eNB->first_sr[i] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
+	      phy_vars_eNB->first_sr[i] = 0;
+	      phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->round=0;
+	      phy_vars_eNB->dlsch_eNB[i][0]->harq_processes[0]->status=SCH_IDLE;
+	      LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
+		    phy_vars_eNB->Mod_id,
+		    phy_vars_eNB->ulsch_eNB[i]->rnti,frame,last_slot>>1);
+	    }
 #ifdef OPENAIR2
-                      mac_xface->SR_indication(phy_vars_eNB->Mod_id,
-                          frame,
-                          phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1);
+	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
+				     frame,
+				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1);
 #endif
-                  }
-              }// do_SR==1
-              if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
-              }
-              else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD
-                  // if SR was detected, use the n1_pucch from SR, else use n1_pucch0
-                  n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex:n1_pucch0;
-                  if (abstraction_flag == 0)
-                    metric0 = rx_pucch(phy_vars_eNB,
-                        pucch_format1a,
-                        i,
-                        (u16)n1_pucch0,
-                        0, //n2_pucch
-                        1, // shortened format
-                        pucch_payload0,
-                        last_slot>>1,
-                        PUCCH1_THRES);
-                  else {
+	  } 
+	}// do_SR==1
+	if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
+	}
+	else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD
+	  // if SR was detected, use the n1_pucch from SR, else use n1_pucch0
+	  n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex:n1_pucch0;
+	  if (abstraction_flag == 0)
+	    metric0 = rx_pucch(phy_vars_eNB,
+			       pucch_format1a,
+			       i,
+			       (u16)n1_pucch0,
+			       0, //n2_pucch
+			       1, // shortened format
+			       pucch_payload0,
+			       last_slot>>1,
+			       PUCCH1a_THRES);
+	  else {
 #ifdef PHY_ABSTRACTION
-                      metric0 = rx_pucch_emul(phy_vars_eNB,i,
-                          pucch_format1a,
-                          0,
-                          pucch_payload0,
-                          last_slot>>1);
+	    metric0 = rx_pucch_emul(phy_vars_eNB,i,
+				    pucch_format1a,
+				    0,
+				    pucch_payload0,
+				    last_slot>>1);
 #endif
-                  }
+	  }	
 #ifdef DEBUG_PHY_PROC	  
-                  LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
-                      phy_vars_eNB->Mod_id,
-                      phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                      frame,last_slot>>1,
-                      pucch_payload0[0],metric0);
-#endif
-
-                  process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB,
-                      0,// pusch_flag
-                      pucch_payload0,
-                      2,
-                      SR_payload);
-
-              } // FDD
-              else {  //TDD
-
-                  bundling_flag = phy_vars_eNB->pucch_config_dedicated[i].tdd_AckNackFeedbackMode;
-
-                  // fix later for 2 TB case and format1b
-
-                  if ((frame_parms->frame_type==FDD) ||
-                      (bundling_flag==bundling)    ||
-                      ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((last_slot!=4)||(last_slot!=14)))) {
-                      format = pucch_format1a;
-                      //	    msg("PUCCH 1a\n");
-                  }
-                  else {
-                      format = pucch_format1b;
-                      //	    msg("PUCCH 1b\n");
-                  }
-
-                  // if SR was detected, use the n1_pucch from SR
-                  if (SR_payload==1) {
+	  LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
+		phy_vars_eNB->Mod_id,
+		phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+		frame,last_slot>>1,
+		pucch_payload0[0],metric0);
+#endif
+
+	  process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB,
+				0,// pusch_flag
+				pucch_payload0,
+				2,
+				SR_payload);
+
+	} // FDD
+	else {  //TDD
+	
+	  bundling_flag = phy_vars_eNB->pucch_config_dedicated[i].tdd_AckNackFeedbackMode;
+	
+	  // fix later for 2 TB case and format1b
+
+	  if ((frame_parms->frame_type==FDD) || 
+	      (bundling_flag==bundling)    || 
+	      ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((last_slot!=4)||(last_slot!=14)))) {
+	    format = pucch_format1a;
+	    //	    msg("PUCCH 1a\n");
+	  }
+	  else {
+	    format = pucch_format1b;
+	    //	    msg("PUCCH 1b\n");
+	  }
+	
+	  // if SR was detected, use the n1_pucch from SR
+	  if (SR_payload==1) {
 #ifdef DEBUG_PHY_PROC	  
-                      LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id,
-                          phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                          frame,last_slot>>1,
-                          n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
-#endif
-                      if (abstraction_flag == 0)
-                        metric0 = rx_pucch(phy_vars_eNB,
-                            format,
-                            i,
-                            phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
-                            0, //n2_pucch
-                            1, // shortened format
-                            pucch_payload0,
-                            last_slot>>1,
-                            PUCCH1_THRES);
-                      else {
+	    LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id,
+		  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+		  frame,last_slot>>1,
+		  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
+#endif
+	    if (abstraction_flag == 0) 
+	      metric0 = rx_pucch(phy_vars_eNB,
+				 format,
+				 i,
+				 phy_vars_eNB->scheduling_request_config[i].sr_PUCCH_ResourceIndex,
+				 0, //n2_pucch
+				 1, // shortened format
+				 pucch_payload0,
+				 last_slot>>1,
+				 PUCCH1a_THRES);
+	    else {
 #ifdef PHY_ABSTRACTION
-                          metric0 = rx_pucch_emul(phy_vars_eNB,i,
-                              format,
-                              0,
-                              pucch_payload0,
-                              last_slot>>1);
-#endif
-                      }
-                  }
-                  else {  //using n1_pucch0/n1_pucch1 resources
+	      metric0 = rx_pucch_emul(phy_vars_eNB,i,
+				      format,
+				      0,
+				      pucch_payload0,
+				      last_slot>>1);
+#endif
+	    } 
+	  }
+	  else {  //using n1_pucch0/n1_pucch1 resources
 #ifdef DEBUG_PHY_PROC	  
-                      LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id,
-                          phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                          frame,last_slot>>1,
-                          n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
-#endif
-                      metric0=0;
-                      metric1=0;
-
-                      // Check n1_pucch0 metric
-                      if (n1_pucch0 != -1) {
-                          if (abstraction_flag == 0)
-                            metric0 = rx_pucch(phy_vars_eNB,
-                                format,
-                                i,
-                                (u16)n1_pucch0,
-                                0, // n2_pucch
-                                1, // shortened format
-                                pucch_payload0,
-                                last_slot>>1,
-                                PUCCH1_THRES);
-                          else {
+	    LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id,
+		  phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+		  frame,last_slot>>1,
+		  n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
+#endif
+	    metric0=0;
+	    metric1=0;
+	    
+	    // Check n1_pucch0 metric
+	    if (n1_pucch0 != -1) {
+	      if (abstraction_flag == 0) 
+		metric0 = rx_pucch(phy_vars_eNB,
+				   format,
+				   i,
+				   (u16)n1_pucch0,
+				   0, // n2_pucch
+				   1, // shortened format
+				   pucch_payload0,
+				   last_slot>>1,
+				   PUCCH1a_THRES);
+	      else {
 #ifdef PHY_ABSTRACTION
-                              metric0 = rx_pucch_emul(phy_vars_eNB,i,
-                                  format,
-                                  0,
-                                  pucch_payload0,
-                                  last_slot>>1);
+		metric0 = rx_pucch_emul(phy_vars_eNB,i,
+					format,
+					0,
+					pucch_payload0,
+					last_slot>>1);
 #endif
-                          }
-                      }
+	      }
+	    }
 
-                      // Check n1_pucch1 metric
-                      if (n1_pucch1 != -1) {
-                          if (abstraction_flag == 0)
-                            metric1 = rx_pucch(phy_vars_eNB,
-                                format,
-                                i,
-                                (u16)n1_pucch1,
-                                0, //n2_pucch
-                                1, // shortened format
-                                pucch_payload1,
-                                last_slot>>1,
-                                PUCCH1_THRES);
-                          else {
+	    // Check n1_pucch1 metric
+	    if (n1_pucch1 != -1) {
+	      if (abstraction_flag == 0)
+		metric1 = rx_pucch(phy_vars_eNB,
+				   format,
+				   i,
+				   (u16)n1_pucch1,
+				   0, //n2_pucch
+				   1, // shortened format
+				   pucch_payload1,
+				   last_slot>>1,
+				   PUCCH1a_THRES);
+	      else {
 #ifdef PHY_ABSTRACTION
-                              metric1 = rx_pucch_emul(phy_vars_eNB,i,
-                                  format,
-                                  1,
-                                  pucch_payload1,
-                                  last_slot>>1);
-
+		metric1 = rx_pucch_emul(phy_vars_eNB,i,
+					format,
+					1,
+					pucch_payload1,
+					last_slot>>1);
 
+		
 #endif
-                          }
-                      }
-                  }
-
-                  if (SR_payload == 1) {
-                      pucch_payload = pucch_payload0;
-                      if (bundling_flag == bundling)
-                        pucch_sel = 2;
-                  }
-                  else if (bundling_flag == multiplexing) {  // multiplexing + no SR
-                      pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0;
-                      pucch_sel     = (metric1>metric0) ? 1 : 0;
-                  }
-                  else { // bundling + no SR
-                      if (n1_pucch1 != -1)
-                        pucch_payload = pucch_payload1;
-                      else if (n1_pucch0 != -1)
-                        pucch_payload = pucch_payload0;
-                      pucch_sel = 2;  // indicate that this is a bundled ACK/NAK
-                  }
+	      }
+	    }
+	  }
+
+	  if (SR_payload == 1) {
+	    pucch_payload = pucch_payload0;
+	    if (bundling_flag == bundling)
+	      pucch_sel = 2;
+	  }
+	  else if (bundling_flag == multiplexing) {  // multiplexing + no SR
+	    pucch_payload = (metric1>metric0) ? pucch_payload1 : pucch_payload0;
+	    pucch_sel     = (metric1>metric0) ? 1 : 0;
+	  }
+	  else { // bundling + no SR
+	    if (n1_pucch1 != -1)
+	      pucch_payload = pucch_payload1;
+	    else if (n1_pucch0 != -1)
+	      pucch_payload = pucch_payload0;
+	    pucch_sel = 2;  // indicate that this is a bundled ACK/NAK  
+	  }
 #ifdef DEBUG_PHY_PROC	  
-                  LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id,
-                      phy_vars_eNB->dlsch_eNB[i][0]->rnti,
-                      frame,last_slot>>1,
-                      metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
+	  LOG_I(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id,
+		phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+		frame,last_slot>>1,
+		metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
 #endif	  
-                  process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB,
-                      0,// pusch_flag
-                      pucch_payload,
-                      pucch_sel,
-                      SR_payload);
-              }
-          }
-      } // PUCCH processing
-
-#endif //PUCCH
-
-      if ((frame % 10 == 0) && (last_slot==9)) {
-          phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS -
-              phy_vars_eNB->eNB_UE_stats[i].total_TBS_last)*10;
-
-          phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS;
+	  process_HARQ_feedback(i,last_slot>>1,phy_vars_eNB,
+				0,// pusch_flag
+				pucch_payload,
+				pucch_sel,
+				SR_payload);
+	}
       }
-
-      num_active_cba_groups = phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups;
-      /*if (num_active_cba_groups > 0 )
+    } // PUCCH processing
+    
+#endif //PUCCH
+  
+    if ((frame % 10 == 0) && (last_slot==9)) {
+      phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS - 
+						     phy_vars_eNB->eNB_UE_stats[i].total_TBS_last)*10;
+      
+      phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS;
+    }
+    
+    num_active_cba_groups = phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups;
+    /*if (num_active_cba_groups > 0 )
     LOG_D(PHY,"[eNB] last slot %d trying cba transmission decoding UE %d num_grps %d rnti %x flag %d\n",
 	  last_slot, i, num_active_cba_groups,phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],
 	  phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag );
-       */
-      if ((phy_vars_eNB->ulsch_eNB[i]) &&
-          (num_active_cba_groups > 0) &&
-          (phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]>0) &&
-          (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1) &&
-          ((last_slot%2)==1)) {
-
-
-          rnti=0;
+    */ 
+    if ((phy_vars_eNB->ulsch_eNB[i]) &&
+	(num_active_cba_groups > 0) &&
+	(phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]>0) &&
+	(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1) &&
+	((last_slot%2)==1)) {
+     
+      
+      rnti=0;
 
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n",
-              phy_vars_eNB->Mod_id,harq_pid,
-              frame,last_slot>>1,
-              i, (u16)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]);
-#endif
-          if (abstraction_flag==0) {
-              rx_ulsch(phy_vars_eNB,
-                  last_slot>>1,
-                  phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                  i,
-                  phy_vars_eNB->ulsch_eNB,
-                  0);
-          }
+      LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n",
+	    phy_vars_eNB->Mod_id,harq_pid,
+	    frame,last_slot>>1,
+	    i, (u16)phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]);
+#endif
+      if (abstraction_flag==0) {
+	rx_ulsch(phy_vars_eNB,
+		 last_slot>>1,
+		 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+		 i,
+		 phy_vars_eNB->ulsch_eNB,
+		 0);
+      }
 #ifdef PHY_ABSTRACTION
-          else {
-              rx_ulsch_emul(phy_vars_eNB,
-                  last_slot>>1,
-                  phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
-                  i);
-          }
+      else {
+	rx_ulsch_emul(phy_vars_eNB,
+		      last_slot>>1,
+		      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+		      i);
+      }
 #endif
-
-          if (abstraction_flag == 0) {
-              ret = ulsch_decoding(phy_vars_eNB,
-                  i,
-                  last_slot>>1,
-                  0, // control_only_flag
-                  0,  //Nbundled, to be updated!!!!
-                  0);
-          }
+      
+      if (abstraction_flag == 0) {
+	ret = ulsch_decoding(phy_vars_eNB,
+			     i,
+			     last_slot>>1,
+			     0, // control_only_flag
+			     0,  //Nbundled, to be updated!!!!
+			     0);  
+      }
 #ifdef PHY_ABSTRACTION
-          else {
-              ret = ulsch_decoding_emul(phy_vars_eNB,
-                  last_slot>>1,
-                  i,
-                  &rnti);
-          }
+      else {
+	ret = ulsch_decoding_emul(phy_vars_eNB,
+				  last_slot>>1,
+				  i,
+				  &rnti);
+      }
 #endif
-          if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
+      if (phy_vars_eNB->ulsch_eNB[i]->cqi_crc_status == 1) {
 #ifdef DEBUG_PHY_PROC
-              //if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50))
-              //	print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
+	//if (((phy_vars_eNB->frame%10) == 0) || (phy_vars_eNB->frame < 50)) 
+	//	print_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,0);
 #endif
-              extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode);
-              phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0];
-          }
-          /*  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag, total cba groups %d %d\n",
+	extract_CQI(phy_vars_eNB->ulsch_eNB[i]->o,phy_vars_eNB->ulsch_eNB[i]->uci_format,&phy_vars_eNB->eNB_UE_stats[i], &rnti, &access_mode);
+	phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->o_RI[0];
+      }
+      /*  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag, total cba groups %d %d\n",
 	    phy_vars_eNB->Mod_id,harq_pid,phy_vars_eNB->frame,last_slot>>1,i,harq_pid,
 	     phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups,num_active_cba_groups);
-           */
-          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0;
-          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->status= SCH_IDLE;
-
-          if ((num_active_cba_groups > 0) &&
-              //  (i % num_active_cba_groups == 0) && // this ue is used a a template for the CBA
-              (i + num_active_cba_groups < NUMBER_OF_UE_MAX) &&
-              (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) &&
-              (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) {
+      */
+      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0;
+      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->status= SCH_IDLE;
+      
+      if ((num_active_cba_groups > 0) &&
+	  //  (i % num_active_cba_groups == 0) && // this ue is used a a template for the CBA
+	  (i + num_active_cba_groups < NUMBER_OF_UE_MAX) &&
+	  (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->cba_rnti[i%num_active_cba_groups] > 0 ) &&
+	  (phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->num_active_cba_groups> 0)) {
 #ifdef DEBUG_PHY_PROC
-              LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n",
-                  phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid,
-                  i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups);
+	LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n",
+	      phy_vars_eNB->Mod_id,harq_pid,frame,last_slot>>1,i,harq_pid,
+	      i+num_active_cba_groups, i%phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups);
 #endif
-              phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1;
-              phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE;
-              phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS;
-          }
-
-          if (ret == (1+MAX_TURBO_ITERATIONS)) {
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
-          } // ulsch in error
-          else {
-              LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
-                  phy_vars_eNB->Mod_id,harq_pid,
-                  frame,last_slot>>1);
-
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
-              phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0;
+	phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1;
+	phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE;
+	phy_vars_eNB->ulsch_eNB[i+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS;
+      }
+      
+      if (ret == (1+MAX_TURBO_ITERATIONS)) {
+	phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
+      } // ulsch in error
+      else {
+	LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
+	      phy_vars_eNB->Mod_id,harq_pid,
+	      frame,last_slot>>1);	    
+	
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
+	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
+	phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors[harq_pid] = 0;
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_ULSCH
-              LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
-                  frame,last_slot>>1,
-                  harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-              for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
-                LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
-              LOG_T(PHY,"\n");
-#endif
-#endif
-              if (access_mode > UNKNOWN_ACCESS){
-                  LOG_I(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n",
-                      phy_vars_eNB->Mod_id, frame,last_slot>>1,
-                      i, phy_vars_eNB->ulsch_eNB[i]->rnti,
-                      i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]);
-                  // detect if there is a CBA collision
-                  if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) {
-                      mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-                          frame,
-                          phy_vars_eNB->ulsch_eNB[i]->rnti,
-                          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-                          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
-                      phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(last_slot>>1);
-                  } else {
-                      LOG_N(PHY,"[eNB %d] Frame %d subframe %d : CBA collision detected for UE%d for group %d, set the SR for this UE \n ",
-                          phy_vars_eNB->Mod_id,frame,last_slot>>1,
-                          i,i%num_active_cba_groups );
-                      mac_xface->SR_indication(phy_vars_eNB->Mod_id,
-                          frame,
-                          phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1);
-                  }
-
-              }
-          } // ULSCH CBA not in error
-      }
-
+	LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
+	      frame,last_slot>>1,
+	      harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	for (j=0;j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3;j++)
+	  LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
+	LOG_T(PHY,"\n");
+#endif
+#endif
+	if (access_mode > UNKNOWN_ACCESS){
+	  LOG_I(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n", 
+		phy_vars_eNB->Mod_id, frame,last_slot>>1,
+		i, phy_vars_eNB->ulsch_eNB[i]->rnti,
+		i % phy_vars_eNB->ulsch_eNB[i]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[i]->cba_rnti[i%num_active_cba_groups]);
+	  // detect if there is a CBA collision 
+	  if (phy_vars_eNB->cba_last_reception[i%num_active_cba_groups] == 0 ) {
+	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
+			      frame,
+			      phy_vars_eNB->ulsch_eNB[i]->rnti,
+			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
+			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+	    phy_vars_eNB->cba_last_reception[i%num_active_cba_groups]=1;//(last_slot>>1);
+	  } else {
+	    LOG_N(PHY,"[eNB %d] Frame %d subframe %d : CBA collision detected for UE%d for group %d, set the SR for this UE \n ",
+		  phy_vars_eNB->Mod_id,frame,last_slot>>1,
+		  i,i%num_active_cba_groups ); 
+	    mac_xface->SR_indication(phy_vars_eNB->Mod_id,
+				     frame,
+				     phy_vars_eNB->dlsch_eNB[i][0]->rnti,last_slot>>1);
+	  }
+	  
+	}
+      } // ULSCH CBA not in error 
+    }
+       
   } // loop i=0 ... NUMBER_OF_UE_MAX-1
 
   if (((last_slot&1) == 1 ) &&
       (pusch_active == 0)){
-      if (abstraction_flag == 0) {
-          //      LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n",
-          //	  (((last_slot>>1)==9)?-1:0) + phy_vars_eNB->frame,last_slot>>1);
-          lte_eNB_I0_measurements(phy_vars_eNB,
-              0,
-              phy_vars_eNB->first_run_I0_measurements);
-      }
+    if (abstraction_flag == 0) {
+      //      LOG_D(PHY,"[eNB] Frame %d, subframe %d Doing I0_measurements\n",
+      //	  (((last_slot>>1)==9)?-1:0) + phy_vars_eNB->frame,last_slot>>1);
+      lte_eNB_I0_measurements(phy_vars_eNB,
+			      0,
+			      phy_vars_eNB->first_run_I0_measurements);
+    }
 #ifdef PHY_ABSTRACTION
-      else {
-          lte_eNB_I0_measurements_emul(phy_vars_eNB,
-              sect_id);
-      }
+    else {
+      lte_eNB_I0_measurements_emul(phy_vars_eNB,
+				   sect_id);
+    }
 #endif
-
-
-      if (I0_clear == 1)
-        I0_clear = 0;
+  
+    
+    if (I0_clear == 1)
+      I0_clear = 0;
   }
 
 #ifdef EMOS
@@ -3596,14 +3627,15 @@ void phy_procedures_eNB_RX(unsigned char last_slot,PHY_VARS_eNB *phy_vars_eNB,u8
 #endif
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0);
-
+  stop_meas(&phy_vars_eNB->phy_proc_rx);
+   
 }
 
 #undef DEBUG_PHY_PROC
 
 #ifdef Rel10  
 int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, relaying_type_t r_type){
-
+  
   int do_proc=0;// do nothing
   switch(r_type){
   case no_relay:
@@ -3624,7 +3656,7 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r
 }
 #endif 
 void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY_VARS_eNB *phy_vars_eNB,u8 abstraction_flag, 
-    relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) {
+			    relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn) {
 #if defined(ENABLE_ITTI)
   MessageDef   *msg_p;
   const char   *msg_name;
@@ -3635,40 +3667,41 @@ void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY
   /*
     if (phy_vars_eNB->frame >= 1000)
     mac_xface->macphy_exit("Exiting after 1000 Frames\n");
-   */
+  */
   vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_ENB, (last_slot + 1) % 20);
   vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_ENB, phy_vars_eNB->frame);
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1);
+  start_meas(&phy_vars_eNB->phy_proc);
 
 #if defined(ENABLE_ITTI)
   do {
-      // Checks if a message has been sent to PHY sub-task
-      itti_poll_msg (TASK_PHY_ENB, &msg_p);
+    // Checks if a message has been sent to PHY sub-task
+    itti_poll_msg (TASK_PHY_ENB, &msg_p);
 
-      if (msg_p != NULL) {
-          msg_name = ITTI_MSG_NAME (msg_p);
-          instance = ITTI_MSG_INSTANCE (msg_p);
-          Mod_id = instance;
+    if (msg_p != NULL) {
+      msg_name = ITTI_MSG_NAME (msg_p);
+      instance = ITTI_MSG_INSTANCE (msg_p);
+      Mod_id = instance;
 
-          switch (ITTI_MSG_ID(msg_p)) {
+      switch (ITTI_MSG_ID(msg_p)) {
 #   if defined(ENABLE_RAL)
-          case TIMER_HAS_EXPIRED:
+        case TIMER_HAS_EXPIRED:
             // check if it is a measurement timer
-            {
-              hashtable_rc_t       hashtable_rc;
+        {
+            hashtable_rc_t       hashtable_rc;
 
-              hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id));
-              if (hashtable_rc == HASH_TABLE_OK) {
-                  phy_eNB_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg);
-              }
+            hashtable_rc = hashtable_is_key_exists(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id));
+            if (hashtable_rc == HASH_TABLE_OK) {
+                phy_eNB_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg);
             }
+        }
             break;
 
 
-          case PHY_MEAS_THRESHOLD_REQ:
+        case PHY_MEAS_THRESHOLD_REQ:
 #warning "TO DO LIST OF THRESHOLDS"
-            LOG_I(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name);
-            {
+          LOG_I(PHY, "[ENB %d] Received %s\n", Mod_id, msg_name);
+          {
               ral_threshold_phy_t* threshold_phy_p  = NULL;
               int                  index, res;
               long                 timer_id;
@@ -3676,126 +3709,126 @@ void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY
 
               switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) {
 
-              case RAL_TH_ACTION_CANCEL_THRESHOLD:
-                break;
+                  case RAL_TH_ACTION_CANCEL_THRESHOLD:
+                      break;
 
-              case RAL_TH_ACTION_SET_NORMAL_THRESHOLD:
-              case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD:
-                for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) {
-                    threshold_phy_p                  = calloc(1, sizeof(ral_threshold_phy_t));
-                    threshold_phy_p->th_action       = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action;
-                    memcpy(&threshold_phy_p->link_param.link_param_type,
-                        &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type,
-                        sizeof(ral_link_param_type_t));
-
-                    memcpy(&threshold_phy_p->threshold,
-                        &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index],
-                        sizeof(ral_threshold_t));
-
-                    switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) {
-
-                    case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL:
-                      switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) {
-                      case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
-                        SLIST_INSERT_HEAD(
-                            &PHY_vars_eNB_g[Mod_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen],
-                            threshold_phy_p,
-                            ral_thresholds);
-                        break;
-
-                      case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
-                        SLIST_INSERT_HEAD(
-                            &PHY_vars_eNB_g[Mod_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte],
-                            threshold_phy_p,
-                            ral_thresholds);
-                        break;
-
-                      default:
-                        LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n",
-                            Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name);
+                  case RAL_TH_ACTION_SET_NORMAL_THRESHOLD:
+                  case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD:
+                      for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) {
+                          threshold_phy_p                  = calloc(1, sizeof(ral_threshold_phy_t));
+                          threshold_phy_p->th_action       = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action;
+                          memcpy(&threshold_phy_p->link_param.link_param_type,
+                                  &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type,
+                                  sizeof(ral_link_param_type_t));
+
+                          memcpy(&threshold_phy_p->threshold,
+                                  &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index],
+                                  sizeof(ral_threshold_t));
+
+                          switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) {
+
+                              case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL:
+                                  switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) {
+                                      case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
+                                          SLIST_INSERT_HEAD(
+                                              &PHY_vars_eNB_g[Mod_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen],
+                                              threshold_phy_p,
+                                              ral_thresholds);
+                                          break;
+
+                                      case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
+                                          SLIST_INSERT_HEAD(
+                                              &PHY_vars_eNB_g[Mod_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte],
+                                              threshold_phy_p,
+                                              ral_thresholds);
+                                          break;
+
+                                      default:
+                                          LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n",
+                                                  Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name);
+                                  }
+                                  break;
+
+                              case RAL_LINK_CFG_PARAM_CHOICE_TIMER:
+                                  res = timer_setup(
+                                      (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t      interval_sec,
+                                      (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t      interval_us,
+                                      TASK_PHY_ENB,
+                                      instance,
+                                      TIMER_PERIODIC,
+                                      threshold_phy_p,
+                                      &timer_id);
+
+                                  if (res == 0) {
+                                      hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p);
+                                      if (hashtable_rc == HASH_TABLE_OK) {
+                                          threshold_phy_p->timer_id = timer_id;
+                                      } else {
+                                          LOG_E(PHY, "[ENB %d]  %s: Error in hashtable. Could not configure threshold index %d \n",
+                                                  Mod_id, msg_name, index);
+                                      }
+
+                                  } else {
+                                      LOG_E(PHY, "[ENB %d]  %s: Could not configure threshold index %d because of timer initialization failure\n",
+                                              Mod_id, msg_name, index);
+                                  }
+                                  break;
+
+                              default: // already checked in RRC, should not happen here
+                                  LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.union_choice %d in %s\n",
+                                           Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name);
+                          }
                       }
                       break;
 
-                      case RAL_LINK_CFG_PARAM_CHOICE_TIMER:
-                        res = timer_setup(
-                            (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t      interval_sec,
-                            (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t      interval_us,
-                            TASK_PHY_ENB,
-                            instance,
-                            TIMER_PERIODIC,
-                            threshold_phy_p,
-                            &timer_id);
-
-                        if (res == 0) {
-                            hashtable_rc = hashtable_insert(PHY_vars_eNB_g[Mod_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p);
-                            if (hashtable_rc == HASH_TABLE_OK) {
-                                threshold_phy_p->timer_id = timer_id;
-                            } else {
-                                LOG_E(PHY, "[ENB %d]  %s: Error in hashtable. Could not configure threshold index %d \n",
-                                    Mod_id, msg_name, index);
-                            }
-
-                        } else {
-                            LOG_E(PHY, "[ENB %d]  %s: Could not configure threshold index %d because of timer initialization failure\n",
-                                Mod_id, msg_name, index);
-                        }
-                        break;
-
-                      default: // already checked in RRC, should not happen here
-                        LOG_E(PHY, "[ENB %d] BAD PARAMETER cfg_param.union_choice %d in %s\n",
-                            Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name);
-                    }
-                }
-                break;
-
-              default:
-                LOG_E(PHY, "[ENB %d] BAD PARAMETER th_action value %d in %s\n",
-                    Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name);
+                  default:
+                      LOG_E(PHY, "[ENB %d] BAD PARAMETER th_action value %d in %s\n",
+                              Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name);
               }
 
-            }
-            break;
+          }
+          break;
 #   endif
 
-            /* Messages from eNB app */
-          case PHY_CONFIGURATION_REQ:
-            LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name);
-            /* TODO */
+        /* Messages from eNB app */
+        case PHY_CONFIGURATION_REQ:
+          LOG_I(PHY, "[eNB %d] Received %s\n", instance, msg_name);
+          /* TODO */
 
-            break;
+          break;
 
-          default:
-            LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name);
-            break;
-          }
-
-          result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
-          AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+        default:
+          LOG_E(PHY, "[ENB %d] Received unexpected message %s\n", Mod_id, msg_name);
+          break;
       }
+
+      result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
+      AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
+    }
   } while(msg_p != NULL);
 #endif
 
   if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD)&&(subframe_select(&phy_vars_eNB->lte_frame_parms,next_slot>>1)==SF_DL))||
       (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) && ((next_slot&1)==0)) {
 #ifdef Rel10 
-      if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 )
+    if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 ) 
 #endif 
-        phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
+      phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
   }
   if ((((phy_vars_eNB->lte_frame_parms.frame_type == TDD )&&(subframe_select(&phy_vars_eNB->lte_frame_parms,last_slot>>1)==SF_UL)) ||
       (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) && ((last_slot&1)==1)){
-      phy_procedures_eNB_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type);
+    phy_procedures_eNB_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type);
   }
   if ((subframe_select(&phy_vars_eNB->lte_frame_parms,next_slot>>1)==SF_S) &&
       ((next_slot&1)==0)) {
 #ifdef Rel10 
-      if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 )
+    if (phy_procedures_RN_eNB_TX(last_slot, next_slot, r_type) != 0 )
 #endif 
-        phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
+      phy_procedures_eNB_TX(next_slot,phy_vars_eNB,abstraction_flag,r_type,phy_vars_rn);
   }
   if ((subframe_select(&phy_vars_eNB->lte_frame_parms,last_slot>>1)==SF_S) &&
       ((last_slot&1)==0)){
-      phy_procedures_eNB_S_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type);
+    phy_procedures_eNB_S_RX(last_slot,phy_vars_eNB,abstraction_flag,r_type);
   }
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0);
 
@@ -3804,5 +3837,6 @@ void phy_procedures_eNB_lte(unsigned char last_slot, unsigned char next_slot,PHY
   if (phy_vars_eNB->frame==1024)
     phy_vars_eNB->frame=0;
 
+  stop_meas(&phy_vars_eNB->phy_proc);
 }
 
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 95e0a6740f4..db3cc3a9250 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -29,11 +29,11 @@
 
 /*! \file phy_procedures_lte_ue.c
  * \brief Implementation of UE procedures from 36.213 LTE specifications
- * \author R. Knopp, F. Kaltenberger
+ * \author R. Knopp, F. Kaltenberger, N. Nikaein
  * \date 2011
  * \version 0.1
  * \company Eurecom
- * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr
+ * \email: knopp@eurecom.fr,florian.kaltenberger@eurecom.fr, navid.nikaein@eurecom.fr
  * \note
  * \warning
  */
@@ -628,6 +628,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
+  start_meas(&phy_vars_ue->phy_proc_tx);
 
 #ifdef EMOS
   //phy_procedures_emos_UE_TX(next_slot);
@@ -696,6 +697,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	      phy_vars_ue->Mod_id,phy_vars_ue->frame);
 	  mac_xface->macphy_exit("");
           vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+	  stop_meas(&phy_vars_ue->phy_proc_tx);
 	  return;
 	}
 	Msg3_flag=0;
@@ -789,6 +791,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 		phy_vars_ue->prach_resources[eNB_id]->Msg3[7],
 		phy_vars_ue->prach_resources[eNB_id]->Msg3[8]);
 
+	  start_meas(&phy_vars_ue->ulsch_encoding_stats);	      
 	  if (abstraction_flag==0) {
 	    if (ulsch_encoding(phy_vars_ue->prach_resources[eNB_id]->Msg3,
 			       phy_vars_ue,
@@ -798,6 +801,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	      LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
 	      mac_xface->macphy_exit("");
               vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+	      stop_meas(&phy_vars_ue->phy_proc_tx);
 	      return;
 	    }
 	  }
@@ -806,6 +810,8 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	    ulsch_encoding_emul(phy_vars_ue->prach_resources[eNB_id]->Msg3,phy_vars_ue,eNB_id,harq_pid,0);
 	  }
 #endif
+	  stop_meas(&phy_vars_ue->ulsch_encoding_stats);	      
+
 
 #ifdef OPENAIR2
 	  // signal MAC that Msg3 was sent
@@ -875,6 +881,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	  */
 
 #endif //OPENAIR2
+	  start_meas(&phy_vars_ue->ulsch_encoding_stats);	      
 	  if (abstraction_flag==0) {
 	    /*
 	    if (phy_vars_ue->frame%100==0) {
@@ -889,6 +896,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 			       0)!=0) {  //  Nbundled, to be updated!!!!
 	      LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
               vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+	      stop_meas(&phy_vars_ue->phy_proc_tx);
 	      return;
 	    }
 	  }
@@ -897,6 +905,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	    ulsch_encoding_emul(ulsch_input_buffer,phy_vars_ue,eNB_id,harq_pid,0);
 	  }
 #endif
+	  stop_meas(&phy_vars_ue->ulsch_encoding_stats);	      
 	}
 	if (abstraction_flag == 0) {
 #ifdef OPENAIR2
@@ -912,6 +921,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 		AMP
 #endif
 	);    
+	  start_meas(&phy_vars_ue->ulsch_modulation_stats);	      	      	  
 #ifdef OFDMA_ULSCH
 	  ulsch_modulation(phy_vars_ue->lte_ue_common_vars.txdataF,
 #ifdef EXMIMO                       
@@ -937,6 +947,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
                        phy_vars_ue->ulsch_ue[eNB_id]);
       
 #endif //OFDMA_ULSCH
+	  start_meas(&phy_vars_ue->ulsch_modulation_stats);	      	      	  
 	}
 	if (abstraction_flag==1) {
 	  // clear SR
@@ -977,6 +988,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 			       0)!=0) {  //  Nbundled, to be updated!!!!
 	      LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
               vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+	      stop_meas(&phy_vars_ue->phy_proc_tx);
 	      return;
 	    }
 	  }
@@ -1001,11 +1013,11 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	    (bundling_flag==bundling)    || 
 	    ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((next_slot!=4)||(next_slot!=14)))) {
 	  format = pucch_format1a;
-	  //	debug_msg("PUCCH 1a\n");
+	  LOG_D(PHY,"[UE] PUCCH 1a\n");
 	}
 	else {
 	  format = pucch_format1b;
-	  //	debug_msg("PUCCH 1b\n");
+	  LOG_D(PHY,"[UE] PUCCH 1b\n");
 	}
 	
 	// Check for SR and do ACK/NACK accordingly
@@ -1174,6 +1186,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	ulsch_start = (frame_parms->samples_per_tti*subframe);
 #endif //else EXMIMO
 
+	start_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
 	for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++) {
 	    if (frame_parms->Ncp == 1) 
 	      PHY_ofdm_mod(&phy_vars_ue->lte_ue_common_vars.txdataF[aa][subframe*nsymb*frame_parms->ofdm_symbol_size],
@@ -1242,6 +1255,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 #endif
 	  
 	  } //nb_antennas_tx
+	stop_meas(&phy_vars_ue->ofdm_mod_stats);	      	      	  
 	} // generate_ul_signal == 1
       } 
     } // mode != PRACH
@@ -1298,7 +1312,9 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 #else
 	    phy_vars_ue->lte_ue_prach_vars[eNB_id]->amp = AMP;
 #endif
+	    start_meas(&phy_vars_ue->tx_prach);
 	    prach_power = generate_prach(phy_vars_ue,eNB_id,next_slot>>1,phy_vars_ue->frame);
+	    stop_meas(&phy_vars_ue->tx_prach);
 	    LOG_D(PHY,"[UE  %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n",
 		  phy_vars_ue->Mod_id,
 		  get_PL(phy_vars_ue->Mod_id,eNB_id),
@@ -1309,9 +1325,11 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
 	  else {
 	    UE_transport_info[phy_vars_ue->Mod_id].cntl.prach_flag=1;
 	    UE_transport_info[phy_vars_ue->Mod_id].cntl.prach_id=phy_vars_ue->prach_resources[eNB_id]->ra_PreambleIndex;
+#ifdef OPENAIR2
 	    mac_xface->Msg1_transmitted(phy_vars_ue->Mod_id,
 					 phy_vars_ue->frame,
 					 eNB_id);
+#endif
 	  }
 	  LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
 		phy_vars_ue->Mod_id,phy_vars_ue->frame,next_slot>>1,eNB_id,
@@ -1333,6 +1351,7 @@ void phy_procedures_UE_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abs
     }
   } // next_slot is even
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+  stop_meas(&phy_vars_ue->phy_proc_tx);
 }
 
 void phy_procedures_UE_S_TX(u8 next_slot,PHY_VARS_UE *phy_vars_ue,u8 eNB_id,u8 abstraction_flag,relaying_type_t r_type) {
@@ -1453,6 +1472,9 @@ void lte_ue_measurement_procedures(u8 last_slot, u16 l, PHY_VARS_UE *phy_vars_ue
     ue_rrc_measurements(phy_vars_ue,
 			last_slot,
 			abstraction_flag);
+
+    phy_vars_ue->sinr_eff =  sinr_eff_cqi_calc(phy_vars_ue, 0);
+
   }  
 
   if ((last_slot==1) && (l==(4-frame_parms->Ncp))) {
@@ -2250,6 +2272,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
   int pmch_mcs=-1;
   u8 mcch_active=0;
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
+  start_meas(&phy_vars_ue->phy_proc_rx);
 #ifdef DEBUG_PHY_PROC
   LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX(%d)\n", 
 	(r_type == multicast_relay) ? "RN/UE" : "UE",
@@ -2301,11 +2324,13 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
   // RX processing of symbols in last_slot
   for (l=0;l<n_symb;l++) {
     if (abstraction_flag == 0) {
+      start_meas(&phy_vars_ue->ofdm_demod_stats);
       slot_fep(phy_vars_ue,
 	       l,
 	       last_slot,
 	       phy_vars_ue->rx_offset,
 	       0);
+      stop_meas(&phy_vars_ue->ofdm_demod_stats);
     }
   
     //if (subframe_select(&phy_vars_ue->lte_frame_parms,last_slot>>1) == SF_DL)
@@ -2399,6 +2424,8 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 
 	// process symbols 10,11,12 and trigger DLSCH decoding
 	if (abstraction_flag == 0) {
+	  
+	  start_meas(&phy_vars_ue->dlsch_llr_stats);
 	  for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) {
 
 	    rx_pdsch(phy_vars_ue,
@@ -2412,6 +2439,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 		     i_mod,
 		     phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid);
 	  }
+	  stop_meas(&phy_vars_ue->dlsch_llr_stats);
 	}
 	
 	phy_vars_ue->dlsch_ue[eNB_id][0]->active = 0;
@@ -2432,14 +2460,17 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
                                                                                   get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs),
                                                                                   phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
                                                                                   phy_vars_ue->frame,(((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1)));
-                dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,
-                                   0,
-                                   phy_vars_ue->dlsch_ue[0][0],
-                                   phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G,
-                                   phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],
-                                   0,
-                                   ((((last_slot>>1)==0) ? 9 : ((last_slot>>1))-1))<<1);
-        
+	    start_meas(&phy_vars_ue->dlsch_unscrambling_stats);
+	    dlsch_unscrambling(&phy_vars_ue->lte_frame_parms,
+			       0,
+			       phy_vars_ue->dlsch_ue[0][0],
+			       phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G,
+			       phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],
+			       0,
+			       ((((last_slot>>1)==0) ? 9 : ((last_slot>>1))-1))<<1);
+	    stop_meas(&phy_vars_ue->dlsch_unscrambling_stats);
+
+	    start_meas(&phy_vars_ue->dlsch_decoding_stats);
 	    ret = dlsch_decoding(phy_vars_ue,
 				 phy_vars_ue->lte_ue_pdsch_vars[eNB_id]->llr[0],
 				 &phy_vars_ue->lte_frame_parms,
@@ -2448,7 +2479,8 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 				 (((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1)),
 				 harq_pid,
 				 1,0);
-	  }
+	    stop_meas(&phy_vars_ue->dlsch_decoding_stats);
+	}
 
 	  else {
 	    LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
@@ -2538,6 +2570,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	
 	// process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding
 	if (abstraction_flag==0) {
+	  start_meas(&phy_vars_ue->dlsch_llr_stats);
 	  for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) {
 #ifdef DEBUG_PHY_PROC
 	    /*
@@ -2556,6 +2589,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
              phy_vars_ue->is_secondary_ue,
              phy_vars_ue->dlsch_ue_SI[eNB_id]->current_harq_pid);
 	  }
+	  stop_meas(&phy_vars_ue->dlsch_llr_stats);
 	}
 	//	write_output("dlsch_ra_llr.m","llr",lte_ue_pdsch_vars_ra[eNB_id]->llr[0],40,1,0);
 
@@ -2628,6 +2662,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	    //	    dump_dlsch_SI(phy_vars_ue,eNB_id,(((last_slot>>1)==0) ? 9 : ((last_slot>>1)-1)));
 #endif
             vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+	    stop_meas(&phy_vars_ue->phy_proc_rx);
 	    return(-1);
 	  }
 	  else {
@@ -2673,6 +2708,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
       
 	// process symbols 10,11,12 and trigger DLSCH decoding
 	if (abstraction_flag==0) {
+	  start_meas(&phy_vars_ue->dlsch_llr_stats);
 	  for (m=pilot3;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++)
 	    rx_pdsch(phy_vars_ue,
 		     RA_PDSCH,
@@ -2685,6 +2721,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
              phy_vars_ue->is_secondary_ue,
              phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid);
 	}
+	stop_meas(&phy_vars_ue->dlsch_llr_stats);
 
 	phy_vars_ue->dlsch_ue_ra[eNB_id]->active = 0;
 	
@@ -2696,7 +2733,8 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	else {
 	  LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",phy_vars_ue->Mod_id,phy_vars_ue->frame,last_slot>>1);
 	  mac_xface->macphy_exit("");
-      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+	  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+	  stop_meas(&phy_vars_ue->phy_proc_rx);
 	  return 0;
 	}
 
@@ -2751,6 +2789,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 #endif
 	  //	  oai_exit=1;
           vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+	  stop_meas(&phy_vars_ue->phy_proc_rx);
 	  return(-1);
 
 	}
@@ -2859,7 +2898,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
     if (abstraction_flag==0) {
 
       if (((last_slot%2)==1) && (l==0)) {
-	
+	start_meas(&phy_vars_ue->dlsch_llr_stats);
 	for (m=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols;
 	     m<pilot2;
 	     m++) {      
@@ -2921,9 +2960,11 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
              phy_vars_ue->dlsch_ue_ra[eNB_id]->current_harq_pid);
 	  } // RA active
 	} // loop from first dlsch symbol to end of slot
+ 	stop_meas(&phy_vars_ue->dlsch_llr_stats);
       } // 2nd quarter
     
       if (((last_slot%2)==1) && (l==pilot1)) {
+	start_meas(&phy_vars_ue->dlsch_llr_stats);
 	for (m=pilot2;m<pilot3;m++) {
 	  
 #ifndef DLSCH_THREAD
@@ -2981,6 +3022,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
 	  } // RA active
 	  
 	} // loop over 3rd quarter
+	 stop_meas(&phy_vars_ue->dlsch_llr_stats);
       } // 3rd quarter of subframe
     } // abstraction_flag==0   
   }// l loop
@@ -3152,6 +3194,7 @@ int lte_ue_pdcch_procedures(u8 eNB_id,u8 last_slot, PHY_VARS_UE *phy_vars_ue,u8
     }
   }
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+  stop_meas(&phy_vars_ue->phy_proc_rx);
   return (0);
  }
 
@@ -3310,7 +3353,7 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold
   vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
 #endif
 #endif
-
+  start_meas(&phy_vars_ue->phy_proc);	
 #if defined(ENABLE_ITTI)
   do {
     // Checks if a message has been sent to PHY sub-task
@@ -3521,4 +3564,5 @@ void phy_UE_lte_check_measurement_thresholds(instance_t instanceP, ral_threshold
     phy_vars_ue->frame++;
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
+  stop_meas(&phy_vars_ue->phy_proc);
 }
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv
new file mode 100644
index 00000000000..cb650854d31
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs0.csv
@@ -0,0 +1,75 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+-7.000000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.900000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.800000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.700000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.600000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.500000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.400000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.300000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.200000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.100000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-6.000000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.900000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.800000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.700000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.600000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.500000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.400000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.300000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.200000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.100000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-5.000000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.900000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.800000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.700000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.600000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.500000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.400000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.300000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.200000;0;680;0.090667;5002;5002;0;0;0;0;0;0;0
+-4.100000;0;680;0.090667;4999;5002;0;0;0;0;0;0;0
+-4.000000;0;680;0.090667;4994;5002;0;0;0;0;0;0;0
+-3.900000;0;680;0.090667;4980;5002;0;0;0;0;0;0;0
+-3.800000;0;680;0.090667;4954;5002;0;0;0;0;0;0;0
+-3.700000;0;680;0.090667;4921;5002;0;0;0;0;0;0;0
+-3.600000;0;680;0.090667;4833;5002;0;0;0;0;0;0;0
+-3.500000;0;680;0.090667;4639;5002;0;0;0;0;0;0;0
+-3.400000;0;680;0.090667;4467;5002;0;0;0;0;0;0;0
+-3.300000;0;680;0.090667;4169;5002;0;0;0;0;0;0;0
+-3.200000;0;680;0.090667;3725;5002;0;0;0;0;0;0;0
+-3.100000;0;680;0.090667;3342;5002;0;0;0;0;0;0;0
+-3.000000;0;680;0.090667;2792;5002;0;0;0;0;0;0;0
+-2.900000;0;680;0.090667;2290;5002;0;0;0;0;0;0;0
+-2.800000;0;680;0.090667;1859;5002;0;0;0;0;0;0;0
+-2.700000;0;680;0.090667;1438;5002;0;0;0;0;0;0;0
+-2.600000;0;680;0.090667;1097;5002;0;0;0;0;0;0;0
+-2.500000;0;680;0.090667;1000;6360;0;0;0;0;0;0;0
+-2.400000;0;680;0.090667;1000;8356;0;0;0;0;0;0;0
+-2.300000;0;680;0.090667;963;10000;0;0;0;0;0;0;0
+-2.200000;0;680;0.090667;740;10000;0;0;0;0;0;0;0
+-2.100000;0;680;0.090667;634;10000;0;0;0;0;0;0;0
+-2.000000;0;680;0.090667;519;10000;0;0;0;0;0;0;0
+-1.900000;0;680;0.090667;519;10000;0;0;0;0;0;0;0
+-1.800000;0;680;0.090667;494;10000;0;0;0;0;0;0;0
+-1.700000;0;680;0.090667;425;10000;0;0;0;0;0;0;0
+-1.600000;0;680;0.090667;420;10000;0;0;0;0;0;0;0
+-1.500000;0;680;0.090667;372;10000;0;0;0;0;0;0;0
+-1.400000;0;680;0.090667;347;10000;0;0;0;0;0;0;0
+-1.300000;0;680;0.090667;297;10000;0;0;0;0;0;0;0
+-1.200000;0;680;0.090667;294;10000;0;0;0;0;0;0;0
+-1.100000;0;680;0.090667;260;10000;0;0;0;0;0;0;0
+-1.000000;0;680;0.090667;254;10000;0;0;0;0;0;0;0
+-0.900000;0;680;0.090667;247;10000;0;0;0;0;0;0;0
+-0.800000;0;680;0.090667;209;10000;0;0;0;0;0;0;0
+-0.700000;0;680;0.090667;190;10000;0;0;0;0;0;0;0
+-0.600000;0;680;0.090667;207;10000;0;0;0;0;0;0;0
+-0.500000;0;680;0.090667;171;10000;0;0;0;0;0;0;0
+-0.400000;0;680;0.090667;169;10000;0;0;0;0;0;0;0
+-0.300000;0;680;0.090667;150;10000;0;0;0;0;0;0;0
+-0.200000;0;680;0.090667;125;10000;0;0;0;0;0;0;0
+-0.100000;0;680;0.090667;125;10000;0;0;0;0;0;0;0
+-0.000000;0;680;0.090667;110;10000;0;0;0;0;0;0;0
+0.100000;0;680;0.090667;103;10000;0;0;0;0;0;0;0
+0.200000;0;680;0.090667;104;10000;0;0;0;0;0;0;0
+0.300000;0;680;0.090667;88;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv
new file mode 100644
index 00000000000..7aa750f13f5
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs1.csv
@@ -0,0 +1,72 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+-6.000000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.900000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.800000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.700000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.600000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.500000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.400000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.300000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.200000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.100000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-5.000000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.900000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.800000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.700000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.600000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.500000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.400000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.300000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.200000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.100000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-4.000000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-3.900000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-3.800000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-3.700000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-3.600000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-3.500000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-3.400000;1;904;0.120533;5002;5002;0;0;0;0;0;0;0
+-3.300000;1;904;0.120533;5001;5002;0;0;0;0;0;0;0
+-3.200000;1;904;0.120533;5000;5002;0;0;0;0;0;0;0
+-3.100000;1;904;0.120533;4997;5002;0;0;0;0;0;0;0
+-3.000000;1;904;0.120533;4985;5002;0;0;0;0;0;0;0
+-2.900000;1;904;0.120533;4957;5002;0;0;0;0;0;0;0
+-2.800000;1;904;0.120533;4907;5002;0;0;0;0;0;0;0
+-2.700000;1;904;0.120533;4820;5002;0;0;0;0;0;0;0
+-2.600000;1;904;0.120533;4639;5002;0;0;0;0;0;0;0
+-2.500000;1;904;0.120533;4448;5002;0;0;0;0;0;0;0
+-2.400000;1;904;0.120533;4108;5002;0;0;0;0;0;0;0
+-2.300000;1;904;0.120533;3632;5002;0;0;0;0;0;0;0
+-2.200000;1;904;0.120533;3086;5002;0;0;0;0;0;0;0
+-2.100000;1;904;0.120533;2593;5002;0;0;0;0;0;0;0
+-2.000000;1;904;0.120533;1930;5002;0;0;0;0;0;0;0
+-1.900000;1;904;0.120533;1445;5002;0;0;0;0;0;0;0
+-1.800000;1;904;0.120533;1025;5002;0;0;0;0;0;0;0
+-1.700000;1;904;0.120533;1000;6622;0;0;0;0;0;0;0
+-1.600000;1;904;0.120533;1000;8803;0;0;0;0;0;0;0
+-1.500000;1;904;0.120533;806;10000;0;0;0;0;0;0;0
+-1.400000;1;904;0.120533;681;10000;0;0;0;0;0;0;0
+-1.300000;1;904;0.120533;560;10000;0;0;0;0;0;0;0
+-1.200000;1;904;0.120533;484;10000;0;0;0;0;0;0;0
+-1.100000;1;904;0.120533;466;10000;0;0;0;0;0;0;0
+-1.000000;1;904;0.120533;370;10000;0;0;0;0;0;0;0
+-0.900000;1;904;0.120533;401;10000;0;0;0;0;0;0;0
+-0.800000;1;904;0.120533;389;10000;0;0;0;0;0;0;0
+-0.700000;1;904;0.120533;363;10000;0;0;0;0;0;0;0
+-0.600000;1;904;0.120533;335;10000;0;0;0;0;0;0;0
+-0.500000;1;904;0.120533;305;10000;0;0;0;0;0;0;0
+-0.400000;1;904;0.120533;276;10000;0;0;0;0;0;0;0
+-0.300000;1;904;0.120533;302;10000;0;0;0;0;0;0;0
+-0.200000;1;904;0.120533;258;10000;0;0;0;0;0;0;0
+-0.100000;1;904;0.120533;242;10000;0;0;0;0;0;0;0
+-0.000000;1;904;0.120533;233;10000;0;0;0;0;0;0;0
+0.100000;1;904;0.120533;229;10000;0;0;0;0;0;0;0
+0.200000;1;904;0.120533;210;10000;0;0;0;0;0;0;0
+0.300000;1;904;0.120533;190;10000;0;0;0;0;0;0;0
+0.400000;1;904;0.120533;162;10000;0;0;0;0;0;0;0
+0.500000;1;904;0.120533;144;10000;0;0;0;0;0;0;0
+0.600000;1;904;0.120533;156;10000;0;0;0;0;0;0;0
+0.700000;1;904;0.120533;138;10000;0;0;0;0;0;0;0
+0.800000;1;904;0.120533;130;10000;0;0;0;0;0;0;0
+0.900000;1;904;0.120533;101;10000;0;0;0;0;0;0;0
+1.000000;1;904;0.120533;94;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv
new file mode 100644
index 00000000000..b3792f15399
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs10.csv
@@ -0,0 +1,83 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+1.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.300000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.400000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.500000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.600000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.700000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.800000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+1.900000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.300000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.400000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.500000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.600000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.700000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.800000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+2.900000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.300000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.400000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.500000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.600000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.700000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.800000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+3.900000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+4.000000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+4.100000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+4.200000;10;4008;0.267200;5002;5002;0;0;0;0;0;0;0
+4.300000;10;4008;0.267200;4992;5002;0;0;0;0;0;0;0
+4.400000;10;4008;0.267200;4947;5002;0;0;0;0;0;0;0
+4.500000;10;4008;0.267200;4838;5002;0;0;0;0;0;0;0
+4.600000;10;4008;0.267200;4521;5002;0;0;0;0;0;0;0
+4.700000;10;4008;0.267200;3977;5002;0;0;0;0;0;0;0
+4.800000;10;4008;0.267200;3034;5002;0;0;0;0;0;0;0
+4.900000;10;4008;0.267200;2257;5002;0;0;0;0;0;0;0
+5.000000;10;4008;0.267200;1435;5002;0;0;0;0;0;0;0
+5.100000;10;4008;0.267200;1000;5561;0;0;0;0;0;0;0
+5.200000;10;4008;0.267200;1000;8160;0;0;0;0;0;0;0
+5.300000;10;4008;0.267200;974;10000;0;0;0;0;0;0;0
+5.400000;10;4008;0.267200;845;10000;0;0;0;0;0;0;0
+5.500000;10;4008;0.267200;752;10000;0;0;0;0;0;0;0
+5.600000;10;4008;0.267200;738;10000;0;0;0;0;0;0;0
+5.700000;10;4008;0.267200;703;10000;0;0;0;0;0;0;0
+5.800000;10;4008;0.267200;635;10000;0;0;0;0;0;0;0
+5.900000;10;4008;0.267200;630;10000;0;0;0;0;0;0;0
+6.000000;10;4008;0.267200;574;10000;0;0;0;0;0;0;0
+6.100000;10;4008;0.267200;557;10000;0;0;0;0;0;0;0
+6.200000;10;4008;0.267200;556;10000;0;0;0;0;0;0;0
+6.300000;10;4008;0.267200;507;10000;0;0;0;0;0;0;0
+6.400000;10;4008;0.267200;492;10000;0;0;0;0;0;0;0
+6.500000;10;4008;0.267200;453;10000;0;0;0;0;0;0;0
+6.600000;10;4008;0.267200;488;10000;0;0;0;0;0;0;0
+6.700000;10;4008;0.267200;442;10000;0;0;0;0;0;0;0
+6.800000;10;4008;0.267200;441;10000;0;0;0;0;0;0;0
+6.900000;10;4008;0.267200;429;10000;0;0;0;0;0;0;0
+7.000000;10;4008;0.267200;388;10000;0;0;0;0;0;0;0
+7.100000;10;4008;0.267200;355;10000;0;0;0;0;0;0;0
+7.200000;10;4008;0.267200;361;10000;0;0;0;0;0;0;0
+7.300000;10;4008;0.267200;325;10000;0;0;0;0;0;0;0
+7.400000;10;4008;0.267200;313;10000;0;0;0;0;0;0;0
+7.500000;10;4008;0.267200;302;10000;0;0;0;0;0;0;0
+7.600000;10;4008;0.267200;238;10000;0;0;0;0;0;0;0
+7.700000;10;4008;0.267200;254;10000;0;0;0;0;0;0;0
+7.800000;10;4008;0.267200;225;10000;0;0;0;0;0;0;0
+7.900000;10;4008;0.267200;199;10000;0;0;0;0;0;0;0
+8.000000;10;4008;0.267200;225;10000;0;0;0;0;0;0;0
+8.100000;10;4008;0.267200;181;10000;0;0;0;0;0;0;0
+8.200000;10;4008;0.267200;177;10000;0;0;0;0;0;0;0
+8.300000;10;4008;0.267200;167;10000;0;0;0;0;0;0;0
+8.400000;10;4008;0.267200;158;10000;0;0;0;0;0;0;0
+8.500000;10;4008;0.267200;161;10000;0;0;0;0;0;0;0
+8.600000;10;4008;0.267200;124;10000;0;0;0;0;0;0;0
+8.700000;10;4008;0.267200;128;10000;0;0;0;0;0;0;0
+8.800000;10;4008;0.267200;129;10000;0;0;0;0;0;0;0
+8.900000;10;4008;0.267200;117;10000;0;0;0;0;0;0;0
+9.000000;10;4008;0.267200;104;10000;0;0;0;0;0;0;0
+9.100000;10;4008;0.267200;97;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv
new file mode 100644
index 00000000000..6d500ea1a65
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs11.csv
@@ -0,0 +1,40 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+2.000000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.100000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.200000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.300000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.400000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.500000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.600000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.700000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.800000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+2.900000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.000000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.100000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.200000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.300000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.400000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.500000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.600000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.700000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.800000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+3.900000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+4.000000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+4.100000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+4.200000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+4.300000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+4.400000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+4.500000;11;4392;0.292800;5002;5002;0;0;0;0;0;0;0
+4.600000;11;4392;0.292800;5001;5002;0;0;0;0;0;0;0
+4.700000;11;4392;0.292800;4986;5002;0;0;0;0;0;0;0
+4.800000;11;4392;0.292800;4941;5002;0;0;0;0;0;0;0
+4.900000;11;4392;0.292800;4730;5002;0;0;0;0;0;0;0
+5.000000;11;4392;0.292800;4250;5002;0;0;0;0;0;0;0
+5.100000;11;4392;0.292800;3440;5002;0;0;0;0;0;0;0
+5.200000;11;4392;0.292800;2397;5002;0;0;0;0;0;0;0
+5.300000;11;4392;0.292800;1403;5002;0;0;0;0;0;0;0
+5.400000;11;4392;0.292800;1000;6845;0;0;0;0;0;0;0
+5.500000;11;4392;0.292800;657;10000;0;0;0;0;0;0;0
+5.600000;11;4392;0.292800;255;10000;0;0;0;0;0;0;0
+5.700000;11;4392;0.292800;151;10000;0;0;0;0;0;0;0
+5.800000;11;4392;0.292800;65;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv
new file mode 100644
index 00000000000..bdcb811f2e1
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs12.csv
@@ -0,0 +1,33 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+3.000000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.100000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.200000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.300000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.400000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.500000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.600000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.700000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.800000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+3.900000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.000000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.100000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.200000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.300000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.400000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.500000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.600000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.700000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.800000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+4.900000;12;4968;0.331200;5002;5002;0;0;0;0;0;0;0
+5.000000;12;4968;0.331200;5001;5002;0;0;0;0;0;0;0
+5.100000;12;4968;0.331200;4999;5002;0;0;0;0;0;0;0
+5.200000;12;4968;0.331200;4980;5002;0;0;0;0;0;0;0
+5.300000;12;4968;0.331200;4909;5002;0;0;0;0;0;0;0
+5.400000;12;4968;0.331200;4655;5002;0;0;0;0;0;0;0
+5.500000;12;4968;0.331200;4022;5002;0;0;0;0;0;0;0
+5.600000;12;4968;0.331200;3049;5002;0;0;0;0;0;0;0
+5.700000;12;4968;0.331200;1912;5002;0;0;0;0;0;0;0
+5.800000;12;4968;0.331200;1063;5002;0;0;0;0;0;0;0
+5.900000;12;4968;0.331200;843;10000;0;0;0;0;0;0;0
+6.000000;12;4968;0.331200;310;10000;0;0;0;0;0;0;0
+6.100000;12;4968;0.331200;86;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv
new file mode 100644
index 00000000000..99baee16f7b
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs13.csv
@@ -0,0 +1,32 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+4.000000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.100000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.200000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.300000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.400000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.500000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.600000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.700000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.800000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+4.900000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.000000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.100000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.200000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.300000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.400000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.500000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.600000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.700000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.800000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+5.900000;13;5736;0.382400;5002;5002;0;0;0;0;0;0;0
+6.000000;13;5736;0.382400;5000;5002;0;0;0;0;0;0;0
+6.100000;13;5736;0.382400;4991;5002;0;0;0;0;0;0;0
+6.200000;13;5736;0.382400;4940;5002;0;0;0;0;0;0;0
+6.300000;13;5736;0.382400;4741;5002;0;0;0;0;0;0;0
+6.400000;13;5736;0.382400;4192;5002;0;0;0;0;0;0;0
+6.500000;13;5736;0.382400;3241;5002;0;0;0;0;0;0;0
+6.600000;13;5736;0.382400;2133;5002;0;0;0;0;0;0;0
+6.700000;13;5736;0.382400;1057;5002;0;0;0;0;0;0;0
+6.800000;13;5736;0.382400;889;10000;0;0;0;0;0;0;0
+6.900000;13;5736;0.382400;311;10000;0;0;0;0;0;0;0
+7.000000;13;5736;0.382400;87;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv
new file mode 100644
index 00000000000..d8049c8abe3
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs14.csv
@@ -0,0 +1,61 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+5.000000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.100000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.200000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.300000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.400000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.500000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.600000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.700000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.800000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+5.900000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.000000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.100000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.200000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.300000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.400000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.500000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.600000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.700000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.800000;14;6456;0.430400;5002;5002;0;0;0;0;0;0;0
+6.900000;14;6456;0.430400;5001;5002;0;0;0;0;0;0;0
+7.000000;14;6456;0.430400;4994;5002;0;0;0;0;0;0;0
+7.100000;14;6456;0.430400;4958;5002;0;0;0;0;0;0;0
+7.200000;14;6456;0.430400;4813;5002;0;0;0;0;0;0;0
+7.300000;14;6456;0.430400;4460;5002;0;0;0;0;0;0;0
+7.400000;14;6456;0.430400;3755;5002;0;0;0;0;0;0;0
+7.500000;14;6456;0.430400;2907;5002;0;0;0;0;0;0;0
+7.600000;14;6456;0.430400;1964;5002;0;0;0;0;0;0;0
+7.700000;14;6456;0.430400;1264;5002;0;0;0;0;0;0;0
+7.800000;14;6456;0.430400;1000;6588;0;0;0;0;0;0;0
+7.900000;14;6456;0.430400;998;10000;0;0;0;0;0;0;0
+8.000000;14;6456;0.430400;712;10000;0;0;0;0;0;0;0
+8.100000;14;6456;0.430400;588;10000;0;0;0;0;0;0;0
+8.200000;14;6456;0.430400;548;10000;0;0;0;0;0;0;0
+8.300000;14;6456;0.430400;548;10000;0;0;0;0;0;0;0
+8.400000;14;6456;0.430400;442;10000;0;0;0;0;0;0;0
+8.500000;14;6456;0.430400;420;10000;0;0;0;0;0;0;0
+8.600000;14;6456;0.430400;395;10000;0;0;0;0;0;0;0
+8.700000;14;6456;0.430400;361;10000;0;0;0;0;0;0;0
+8.800000;14;6456;0.430400;334;10000;0;0;0;0;0;0;0
+8.900000;14;6456;0.430400;310;10000;0;0;0;0;0;0;0
+9.000000;14;6456;0.430400;306;10000;0;0;0;0;0;0;0
+9.100000;14;6456;0.430400;302;10000;0;0;0;0;0;0;0
+9.200000;14;6456;0.430400;280;10000;0;0;0;0;0;0;0
+9.300000;14;6456;0.430400;270;10000;0;0;0;0;0;0;0
+9.400000;14;6456;0.430400;254;10000;0;0;0;0;0;0;0
+9.500000;14;6456;0.430400;259;10000;0;0;0;0;0;0;0
+9.600000;14;6456;0.430400;247;10000;0;0;0;0;0;0;0
+9.700000;14;6456;0.430400;228;10000;0;0;0;0;0;0;0
+9.800000;14;6456;0.430400;208;10000;0;0;0;0;0;0;0
+9.900000;14;6456;0.430400;211;10000;0;0;0;0;0;0;0
+10.000000;14;6456;0.430400;190;10000;0;0;0;0;0;0;0
+10.100000;14;6456;0.430400;182;10000;0;0;0;0;0;0;0
+10.200000;14;6456;0.430400;175;10000;0;0;0;0;0;0;0
+10.300000;14;6456;0.430400;137;10000;0;0;0;0;0;0;0
+10.400000;14;6456;0.430400;161;10000;0;0;0;0;0;0;0
+10.500000;14;6456;0.430400;142;10000;0;0;0;0;0;0;0
+10.600000;14;6456;0.430400;133;10000;0;0;0;0;0;0;0
+10.700000;14;6456;0.430400;119;10000;0;0;0;0;0;0;0
+10.800000;14;6456;0.430400;107;10000;0;0;0;0;0;0;0
+10.900000;14;6456;0.430400;80;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv
new file mode 100644
index 00000000000..e9413cf454a
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs15.csv
@@ -0,0 +1,48 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+6.000000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.100000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.200000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.300000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.400000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.500000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.600000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.700000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.800000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+6.900000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.000000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.100000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.200000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.300000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.400000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.500000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.600000;15;7224;0.481600;5002;5002;0;0;0;0;0;0;0
+7.700000;15;7224;0.481600;4999;5002;0;0;0;0;0;0;0
+7.800000;15;7224;0.481600;4985;5002;0;0;0;0;0;0;0
+7.900000;15;7224;0.481600;4898;5002;0;0;0;0;0;0;0
+8.000000;15;7224;0.481600;4612;5002;0;0;0;0;0;0;0
+8.100000;15;7224;0.481600;4067;5002;0;0;0;0;0;0;0
+8.200000;15;7224;0.481600;3175;5002;0;0;0;0;0;0;0
+8.300000;15;7224;0.481600;2186;5002;0;0;0;0;0;0;0
+8.400000;15;7224;0.481600;1363;5002;0;0;0;0;0;0;0
+8.500000;15;7224;0.481600;1000;6598;0;0;0;0;0;0;0
+8.600000;15;7224;0.481600;913;10000;0;0;0;0;0;0;0
+8.700000;15;7224;0.481600;582;10000;0;0;0;0;0;0;0
+8.800000;15;7224;0.481600;437;10000;0;0;0;0;0;0;0
+8.900000;15;7224;0.481600;369;10000;0;0;0;0;0;0;0
+9.000000;15;7224;0.481600;355;10000;0;0;0;0;0;0;0
+9.100000;15;7224;0.481600;293;10000;0;0;0;0;0;0;0
+9.200000;15;7224;0.481600;288;10000;0;0;0;0;0;0;0
+9.300000;15;7224;0.481600;274;10000;0;0;0;0;0;0;0
+9.400000;15;7224;0.481600;266;10000;0;0;0;0;0;0;0
+9.500000;15;7224;0.481600;231;10000;0;0;0;0;0;0;0
+9.600000;15;7224;0.481600;178;10000;0;0;0;0;0;0;0
+9.700000;15;7224;0.481600;186;10000;0;0;0;0;0;0;0
+9.800000;15;7224;0.481600;151;10000;0;0;0;0;0;0;0
+9.900000;15;7224;0.481600;190;10000;0;0;0;0;0;0;0
+10.000000;15;7224;0.481600;122;10000;0;0;0;0;0;0;0
+10.100000;15;7224;0.481600;158;10000;0;0;0;0;0;0;0
+10.200000;15;7224;0.481600;131;10000;0;0;0;0;0;0;0
+10.300000;15;7224;0.481600;125;10000;0;0;0;0;0;0;0
+10.400000;15;7224;0.481600;125;10000;0;0;0;0;0;0;0
+10.500000;15;7224;0.481600;106;10000;0;0;0;0;0;0;0
+10.600000;15;7224;0.481600;88;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv
new file mode 100644
index 00000000000..e89fda9219a
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs16.csv
@@ -0,0 +1,50 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+5.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.200000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.300000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.400000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.500000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.600000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.700000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.800000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+5.900000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.200000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.300000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.400000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.500000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.600000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.700000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.800000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+6.900000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.200000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.300000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.400000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.500000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.600000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.700000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.800000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+7.900000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+8.000000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+8.100000;16;7736;0.515733;5002;5002;0;0;0;0;0;0;0
+8.200000;16;7736;0.515733;5000;5002;0;0;0;0;0;0;0
+8.300000;16;7736;0.515733;4992;5002;0;0;0;0;0;0;0
+8.400000;16;7736;0.515733;4936;5002;0;0;0;0;0;0;0
+8.500000;16;7736;0.515733;4730;5002;0;0;0;0;0;0;0
+8.600000;16;7736;0.515733;4205;5002;0;0;0;0;0;0;0
+8.700000;16;7736;0.515733;3357;5002;0;0;0;0;0;0;0
+8.800000;16;7736;0.515733;2255;5002;0;0;0;0;0;0;0
+8.900000;16;7736;0.515733;1374;5002;0;0;0;0;0;0;0
+9.000000;16;7736;0.515733;1000;7260;0;0;0;0;0;0;0
+9.100000;16;7736;0.515733;690;10000;0;0;0;0;0;0;0
+9.200000;16;7736;0.515733;354;10000;0;0;0;0;0;0;0
+9.300000;16;7736;0.515733;214;10000;0;0;0;0;0;0;0
+9.400000;16;7736;0.515733;127;10000;0;0;0;0;0;0;0
+9.500000;16;7736;0.515733;138;10000;0;0;0;0;0;0;0
+9.600000;16;7736;0.515733;105;10000;0;0;0;0;0;0;0
+9.700000;16;7736;0.515733;108;10000;0;0;0;0;0;0;0
+9.800000;16;7736;0.515733;93;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv
new file mode 100644
index 00000000000..92ebc450c23
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs17.csv
@@ -0,0 +1,55 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+6.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.400000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.500000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.600000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.700000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.800000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+6.900000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.400000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.500000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.600000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.700000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.800000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+7.900000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.400000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.500000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.600000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.700000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.800000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+8.900000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+9.000000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+9.100000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+9.200000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+9.300000;17;7736;0.343822;5002;5002;0;0;0;0;0;0;0
+9.400000;17;7736;0.343822;4987;5002;0;0;0;0;0;0;0
+9.500000;17;7736;0.343822;4939;5002;0;0;0;0;0;0;0
+9.600000;17;7736;0.343822;4707;5002;0;0;0;0;0;0;0
+9.700000;17;7736;0.343822;4220;5002;0;0;0;0;0;0;0
+9.800000;17;7736;0.343822;3337;5002;0;0;0;0;0;0;0
+9.900000;17;7736;0.343822;2314;5002;0;0;0;0;0;0;0
+10.000000;17;7736;0.343822;1353;5002;0;0;0;0;0;0;0
+10.100000;17;7736;0.343822;1000;6908;0;0;0;0;0;0;0
+10.200000;17;7736;0.343822;781;10000;0;0;0;0;0;0;0
+10.300000;17;7736;0.343822;417;10000;0;0;0;0;0;0;0
+10.400000;17;7736;0.343822;288;10000;0;0;0;0;0;0;0
+10.500000;17;7736;0.343822;209;10000;0;0;0;0;0;0;0
+10.600000;17;7736;0.343822;195;10000;0;0;0;0;0;0;0
+10.700000;17;7736;0.343822;158;10000;0;0;0;0;0;0;0
+10.800000;17;7736;0.343822;203;10000;0;0;0;0;0;0;0
+10.900000;17;7736;0.343822;161;10000;0;0;0;0;0;0;0
+11.000000;17;7736;0.343822;119;10000;0;0;0;0;0;0;0
+11.100000;17;7736;0.343822;138;10000;0;0;0;0;0;0;0
+11.200000;17;7736;0.343822;124;10000;0;0;0;0;0;0;0
+11.300000;17;7736;0.343822;94;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv
new file mode 100644
index 00000000000..9b32fb2fee1
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs18.csv
@@ -0,0 +1,38 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+7.000000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.100000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.200000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.300000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.400000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.500000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.600000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.700000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.800000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+7.900000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.000000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.100000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.200000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.300000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.400000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.500000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.600000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.700000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.800000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+8.900000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+9.000000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+9.100000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+9.200000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+9.300000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+9.400000;18;7992;0.355200;5002;5002;0;0;0;0;0;0;0
+9.500000;18;7992;0.355200;5001;5002;0;0;0;0;0;0;0
+9.600000;18;7992;0.355200;4983;5002;0;0;0;0;0;0;0
+9.700000;18;7992;0.355200;4928;5002;0;0;0;0;0;0;0
+9.800000;18;7992;0.355200;4709;5002;0;0;0;0;0;0;0
+9.900000;18;7992;0.355200;4200;5002;0;0;0;0;0;0;0
+10.000000;18;7992;0.355200;3257;5002;0;0;0;0;0;0;0
+10.100000;18;7992;0.355200;2195;5002;0;0;0;0;0;0;0
+10.200000;18;7992;0.355200;1197;5002;0;0;0;0;0;0;0
+10.300000;18;7992;0.355200;1000;8488;0;0;0;0;0;0;0
+10.400000;18;7992;0.355200;533;10000;0;0;0;0;0;0;0
+10.500000;18;7992;0.355200;185;10000;0;0;0;0;0;0;0
+10.600000;18;7992;0.355200;61;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv
new file mode 100644
index 00000000000..8ed3997616e
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs19.csv
@@ -0,0 +1,43 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+8.000000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.100000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.200000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.300000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.400000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.500000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.600000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.700000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.800000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+8.900000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.000000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.100000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.200000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.300000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.400000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.500000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.600000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.700000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.800000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+9.900000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.000000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.100000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.200000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.300000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.400000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.500000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.600000;19;9144;0.406400;5002;5002;0;0;0;0;0;0;0
+10.700000;19;9144;0.406400;5000;5002;0;0;0;0;0;0;0
+10.800000;19;9144;0.406400;4992;5002;0;0;0;0;0;0;0
+10.900000;19;9144;0.406400;4914;5002;0;0;0;0;0;0;0
+11.000000;19;9144;0.406400;4677;5002;0;0;0;0;0;0;0
+11.100000;19;9144;0.406400;4127;5002;0;0;0;0;0;0;0
+11.200000;19;9144;0.406400;3249;5002;0;0;0;0;0;0;0
+11.300000;19;9144;0.406400;2219;5002;0;0;0;0;0;0;0
+11.400000;19;9144;0.406400;1276;5002;0;0;0;0;0;0;0
+11.500000;19;9144;0.406400;1000;7658;0;0;0;0;0;0;0
+11.600000;19;9144;0.406400;597;10000;0;0;0;0;0;0;0
+11.700000;19;9144;0.406400;297;10000;0;0;0;0;0;0;0
+11.800000;19;9144;0.406400;180;10000;0;0;0;0;0;0;0
+11.900000;19;9144;0.406400;115;10000;0;0;0;0;0;0;0
+12.000000;19;9144;0.406400;117;10000;0;0;0;0;0;0;0
+12.100000;19;9144;0.406400;82;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv
new file mode 100644
index 00000000000..ba98e86b2d1
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs2.csv
@@ -0,0 +1,66 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+-5.000000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.900000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.800000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.700000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.600000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.500000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.400000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.300000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.200000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.100000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-4.000000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.900000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.800000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.700000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.600000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.500000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.400000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.300000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.200000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.100000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-3.000000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-2.900000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-2.800000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-2.700000;2;1096;0.146133;5002;5002;0;0;0;0;0;0;0
+-2.600000;2;1096;0.146133;5001;5002;0;0;0;0;0;0;0
+-2.500000;2;1096;0.146133;4999;5002;0;0;0;0;0;0;0
+-2.400000;2;1096;0.146133;4988;5002;0;0;0;0;0;0;0
+-2.300000;2;1096;0.146133;4982;5002;0;0;0;0;0;0;0
+-2.200000;2;1096;0.146133;4943;5002;0;0;0;0;0;0;0
+-2.100000;2;1096;0.146133;4846;5002;0;0;0;0;0;0;0
+-2.000000;2;1096;0.146133;4704;5002;0;0;0;0;0;0;0
+-1.900000;2;1096;0.146133;4432;5002;0;0;0;0;0;0;0
+-1.800000;2;1096;0.146133;4087;5002;0;0;0;0;0;0;0
+-1.700000;2;1096;0.146133;3653;5002;0;0;0;0;0;0;0
+-1.600000;2;1096;0.146133;3052;5002;0;0;0;0;0;0;0
+-1.500000;2;1096;0.146133;2449;5002;0;0;0;0;0;0;0
+-1.400000;2;1096;0.146133;1900;5002;0;0;0;0;0;0;0
+-1.300000;2;1096;0.146133;1378;5002;0;0;0;0;0;0;0
+-1.200000;2;1096;0.146133;1000;5333;0;0;0;0;0;0;0
+-1.100000;2;1096;0.146133;1000;7587;0;0;0;0;0;0;0
+-1.000000;2;1096;0.146133;910;10000;0;0;0;0;0;0;0
+-0.900000;2;1096;0.146133;703;10000;0;0;0;0;0;0;0
+-0.800000;2;1096;0.146133;580;10000;0;0;0;0;0;0;0
+-0.700000;2;1096;0.146133;488;10000;0;0;0;0;0;0;0
+-0.600000;2;1096;0.146133;429;10000;0;0;0;0;0;0;0
+-0.500000;2;1096;0.146133;386;10000;0;0;0;0;0;0;0
+-0.400000;2;1096;0.146133;427;10000;0;0;0;0;0;0;0
+-0.300000;2;1096;0.146133;371;10000;0;0;0;0;0;0;0
+-0.200000;2;1096;0.146133;316;10000;0;0;0;0;0;0;0
+-0.100000;2;1096;0.146133;327;10000;0;0;0;0;0;0;0
+-0.000000;2;1096;0.146133;322;10000;0;0;0;0;0;0;0
+0.100000;2;1096;0.146133;288;10000;0;0;0;0;0;0;0
+0.200000;2;1096;0.146133;243;10000;0;0;0;0;0;0;0
+0.300000;2;1096;0.146133;246;10000;0;0;0;0;0;0;0
+0.400000;2;1096;0.146133;220;10000;0;0;0;0;0;0;0
+0.500000;2;1096;0.146133;210;10000;0;0;0;0;0;0;0
+0.600000;2;1096;0.146133;190;10000;0;0;0;0;0;0;0
+0.700000;2;1096;0.146133;210;10000;0;0;0;0;0;0;0
+0.800000;2;1096;0.146133;181;10000;0;0;0;0;0;0;0
+0.900000;2;1096;0.146133;167;10000;0;0;0;0;0;0;0
+1.000000;2;1096;0.146133;144;10000;0;0;0;0;0;0;0
+1.100000;2;1096;0.146133;146;10000;0;0;0;0;0;0;0
+1.200000;2;1096;0.146133;112;10000;0;0;0;0;0;0;0
+1.300000;2;1096;0.146133;138;10000;0;0;0;0;0;0;0
+1.400000;2;1096;0.146133;96;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv
new file mode 100644
index 00000000000..3fb27a64bf1
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs20.csv
@@ -0,0 +1,41 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+9.000000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.100000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.200000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.300000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.400000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.500000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.600000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.700000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.800000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+9.900000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.000000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.100000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.200000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.300000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.400000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.500000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.600000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.700000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.800000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+10.900000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+11.000000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+11.100000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+11.200000;20;9912;0.440533;5002;5002;0;0;0;0;0;0;0
+11.300000;20;9912;0.440533;5000;5002;0;0;0;0;0;0;0
+11.400000;20;9912;0.440533;4985;5002;0;0;0;0;0;0;0
+11.500000;20;9912;0.440533;4905;5002;0;0;0;0;0;0;0
+11.600000;20;9912;0.440533;4681;5002;0;0;0;0;0;0;0
+11.700000;20;9912;0.440533;4143;5002;0;0;0;0;0;0;0
+11.800000;20;9912;0.440533;3197;5002;0;0;0;0;0;0;0
+11.900000;20;9912;0.440533;2159;5002;0;0;0;0;0;0;0
+12.000000;20;9912;0.440533;1179;5002;0;0;0;0;0;0;0
+12.100000;20;9912;0.440533;1000;8312;0;0;0;0;0;0;0
+12.200000;20;9912;0.440533;559;10000;0;0;0;0;0;0;0
+12.300000;20;9912;0.440533;329;10000;0;0;0;0;0;0;0
+12.400000;20;9912;0.440533;215;10000;0;0;0;0;0;0;0
+12.500000;20;9912;0.440533;175;10000;0;0;0;0;0;0;0
+12.600000;20;9912;0.440533;118;10000;0;0;0;0;0;0;0
+12.700000;20;9912;0.440533;124;10000;0;0;0;0;0;0;0
+12.800000;20;9912;0.440533;109;10000;0;0;0;0;0;0;0
+12.900000;20;9912;0.440533;95;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv
new file mode 100644
index 00000000000..8520c063fd8
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs21.csv
@@ -0,0 +1,40 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+10.000000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.100000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.200000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.300000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.400000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.500000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.600000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.700000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.800000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+10.900000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.000000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.100000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.200000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.300000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.400000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.500000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.600000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.700000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.800000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+11.900000;21;10680;0.474667;5002;5002;0;0;0;0;0;0;0
+12.000000;21;10680;0.474667;5000;5002;0;0;0;0;0;0;0
+12.100000;21;10680;0.474667;4989;5002;0;0;0;0;0;0;0
+12.200000;21;10680;0.474667;4935;5002;0;0;0;0;0;0;0
+12.300000;21;10680;0.474667;4780;5002;0;0;0;0;0;0;0
+12.400000;21;10680;0.474667;4284;5002;0;0;0;0;0;0;0
+12.500000;21;10680;0.474667;3477;5002;0;0;0;0;0;0;0
+12.600000;21;10680;0.474667;2490;5002;0;0;0;0;0;0;0
+12.700000;21;10680;0.474667;1564;5002;0;0;0;0;0;0;0
+12.800000;21;10680;0.474667;1000;5635;0;0;0;0;0;0;0
+12.900000;21;10680;0.474667;853;10000;0;0;0;0;0;0;0
+13.000000;21;10680;0.474667;466;10000;0;0;0;0;0;0;0
+13.100000;21;10680;0.474667;273;10000;0;0;0;0;0;0;0
+13.200000;21;10680;0.474667;200;10000;0;0;0;0;0;0;0
+13.300000;21;10680;0.474667;200;10000;0;0;0;0;0;0;0
+13.400000;21;10680;0.474667;142;10000;0;0;0;0;0;0;0
+13.500000;21;10680;0.474667;144;10000;0;0;0;0;0;0;0
+13.600000;21;10680;0.474667;121;10000;0;0;0;0;0;0;0
+13.700000;21;10680;0.474667;101;10000;0;0;0;0;0;0;0
+13.800000;21;10680;0.474667;83;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv
new file mode 100644
index 00000000000..74d7a16de28
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs22.csv
@@ -0,0 +1,29 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+11.000000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.100000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.200000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.300000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.400000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.500000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.600000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.700000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.800000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+11.900000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+12.000000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+12.100000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+12.200000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+12.300000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+12.400000;22;11448;0.508800;5002;5002;0;0;0;0;0;0;0
+12.500000;22;11448;0.508800;5001;5002;0;0;0;0;0;0;0
+12.600000;22;11448;0.508800;4998;5002;0;0;0;0;0;0;0
+12.700000;22;11448;0.508800;4991;5002;0;0;0;0;0;0;0
+12.800000;22;11448;0.508800;4926;5002;0;0;0;0;0;0;0
+12.900000;22;11448;0.508800;4729;5002;0;0;0;0;0;0;0
+13.000000;22;11448;0.508800;4189;5002;0;0;0;0;0;0;0
+13.100000;22;11448;0.508800;3307;5002;0;0;0;0;0;0;0
+13.200000;22;11448;0.508800;2256;5002;0;0;0;0;0;0;0
+13.300000;22;11448;0.508800;1299;5002;0;0;0;0;0;0;0
+13.400000;22;11448;0.508800;1000;8110;0;0;0;0;0;0;0
+13.500000;22;11448;0.508800;538;10000;0;0;0;0;0;0;0
+13.600000;22;11448;0.508800;213;10000;0;0;0;0;0;0;0
+13.700000;22;11448;0.508800;63;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv
new file mode 100644
index 00000000000..1b6e4fc14c6
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs23.csv
@@ -0,0 +1,31 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+12.000000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.100000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.200000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.300000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.400000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.500000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.600000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.700000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.800000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+12.900000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.000000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.100000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.200000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.300000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.400000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.500000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.600000;23;12576;0.558933;5002;5002;0;0;0;0;0;0;0
+13.700000;23;12576;0.558933;5001;5002;0;0;0;0;0;0;0
+13.800000;23;12576;0.558933;4986;5002;0;0;0;0;0;0;0
+13.900000;23;12576;0.558933;4946;5002;0;0;0;0;0;0;0
+14.000000;23;12576;0.558933;4715;5002;0;0;0;0;0;0;0
+14.100000;23;12576;0.558933;4207;5002;0;0;0;0;0;0;0
+14.200000;23;12576;0.558933;3458;5002;0;0;0;0;0;0;0
+14.300000;23;12576;0.558933;2467;5002;0;0;0;0;0;0;0
+14.400000;23;12576;0.558933;1564;5002;0;0;0;0;0;0;0
+14.500000;23;12576;0.558933;1000;6038;0;0;0;0;0;0;0
+14.600000;23;12576;0.558933;824;10000;0;0;0;0;0;0;0
+14.700000;23;12576;0.558933;395;10000;0;0;0;0;0;0;0
+14.800000;23;12576;0.558933;153;10000;0;0;0;0;0;0;0
+14.900000;23;12576;0.558933;68;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv
new file mode 100644
index 00000000000..f86bde20d4a
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs24.csv
@@ -0,0 +1,29 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+13.000000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.100000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.200000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.300000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.400000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.500000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.600000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.700000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.800000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+13.900000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+14.000000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+14.100000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+14.200000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+14.300000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+14.400000;24;13536;0.601600;5002;5002;0;0;0;0;0;0;0
+14.500000;24;13536;0.601600;4997;5002;0;0;0;0;0;0;0
+14.600000;24;13536;0.601600;4976;5002;0;0;0;0;0;0;0
+14.700000;24;13536;0.601600;4858;5002;0;0;0;0;0;0;0
+14.800000;24;13536;0.601600;4525;5002;0;0;0;0;0;0;0
+14.900000;24;13536;0.601600;3912;5002;0;0;0;0;0;0;0
+15.000000;24;13536;0.601600;2863;5002;0;0;0;0;0;0;0
+15.100000;24;13536;0.601600;1938;5002;0;0;0;0;0;0;0
+15.200000;24;13536;0.601600;1156;5002;0;0;0;0;0;0;0
+15.300000;24;13536;0.601600;1000;8723;0;0;0;0;0;0;0
+15.400000;24;13536;0.601600;524;10000;0;0;0;0;0;0;0
+15.500000;24;13536;0.601600;255;10000;0;0;0;0;0;0;0
+15.600000;24;13536;0.601600;100;10000;0;0;0;0;0;0;0
+15.700000;24;13536;0.601600;66;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv
new file mode 100644
index 00000000000..ac5c5c1c4e4
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs25.csv
@@ -0,0 +1,25 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+14.000000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.100000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.200000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.300000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.400000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.500000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.600000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.700000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.800000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+14.900000;25;14112;0.627200;5002;5002;0;0;0;0;0;0;0
+15.000000;25;14112;0.627200;5001;5002;0;0;0;0;0;0;0
+15.100000;25;14112;0.627200;5000;5002;0;0;0;0;0;0;0
+15.200000;25;14112;0.627200;4973;5002;0;0;0;0;0;0;0
+15.300000;25;14112;0.627200;4871;5002;0;0;0;0;0;0;0
+15.400000;25;14112;0.627200;4599;5002;0;0;0;0;0;0;0
+15.500000;25;14112;0.627200;3924;5002;0;0;0;0;0;0;0
+15.600000;25;14112;0.627200;3115;5002;0;0;0;0;0;0;0
+15.700000;25;14112;0.627200;2107;5002;0;0;0;0;0;0;0
+15.800000;25;14112;0.627200;1274;5002;0;0;0;0;0;0;0
+15.900000;25;14112;0.627200;1000;7614;0;0;0;0;0;0;0
+16.000000;25;14112;0.627200;699;10000;0;0;0;0;0;0;0
+16.100000;25;14112;0.627200;296;10000;0;0;0;0;0;0;0
+16.200000;25;14112;0.627200;146;10000;0;0;0;0;0;0;0
+16.300000;25;14112;0.627200;77;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv
new file mode 100644
index 00000000000..c3a649c4439
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs26.csv
@@ -0,0 +1,24 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+15.000000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.100000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.200000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.300000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.400000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.500000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.600000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.700000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.800000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+15.900000;26;15264;0.678400;5002;5002;0;0;0;0;0;0;0
+16.000000;26;15264;0.678400;5000;5002;0;0;0;0;0;0;0
+16.100000;26;15264;0.678400;4975;5002;0;0;0;0;0;0;0
+16.200000;26;15264;0.678400;4911;5002;0;0;0;0;0;0;0
+16.300000;26;15264;0.678400;4635;5002;0;0;0;0;0;0;0
+16.400000;26;15264;0.678400;4057;5002;0;0;0;0;0;0;0
+16.500000;26;15264;0.678400;3231;5002;0;0;0;0;0;0;0
+16.600000;26;15264;0.678400;2244;5002;0;0;0;0;0;0;0
+16.700000;26;15264;0.678400;1336;5002;0;0;0;0;0;0;0
+16.800000;26;15264;0.678400;1000;6596;0;0;0;0;0;0;0
+16.900000;26;15264;0.678400;724;10000;0;0;0;0;0;0;0
+17.000000;26;15264;0.678400;340;10000;0;0;0;0;0;0;0
+17.100000;26;15264;0.678400;142;10000;0;0;0;0;0;0;0
+17.200000;26;15264;0.678400;63;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv
new file mode 100644
index 00000000000..11771acc871
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs27.csv
@@ -0,0 +1,21 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+16.000000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.100000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.200000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.300000;27;15840;0.704000;5002;5002;0;0;0;0;0;0;0
+16.400000;27;15840;0.704000;4999;5002;0;0;0;0;0;0;0
+16.500000;27;15840;0.704000;4981;5002;0;0;0;0;0;0;0
+16.600000;27;15840;0.704000;4887;5002;0;0;0;0;0;0;0
+16.700000;27;15840;0.704000;4688;5002;0;0;0;0;0;0;0
+16.800000;27;15840;0.704000;4176;5002;0;0;0;0;0;0;0
+16.900000;27;15840;0.704000;3340;5002;0;0;0;0;0;0;0
+17.000000;27;15840;0.704000;2386;5002;0;0;0;0;0;0;0
+17.100000;27;15840;0.704000;1510;5002;0;0;0;0;0;0;0
+17.200000;27;15840;0.704000;1000;5552;0;0;0;0;0;0;0
+17.300000;27;15840;0.704000;926;10000;0;0;0;0;0;0;0
+17.400000;27;15840;0.704000;516;10000;0;0;0;0;0;0;0
+17.500000;27;15840;0.704000;287;10000;0;0;0;0;0;0;0
+17.600000;27;15840;0.704000;198;10000;0;0;0;0;0;0;0
+17.700000;27;15840;0.704000;135;10000;0;0;0;0;0;0;0
+17.800000;27;15840;0.704000;102;10000;0;0;0;0;0;0;0
+17.900000;27;15840;0.704000;94;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv
new file mode 100644
index 00000000000..ddfee7f1588
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs3.csv
@@ -0,0 +1,64 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+-4.000000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.900000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.800000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.700000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.600000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.500000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.400000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.300000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.200000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.100000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-3.000000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.900000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.800000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.700000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.600000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.500000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.400000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.300000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.200000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.100000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-2.000000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-1.900000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-1.800000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-1.700000;3;1416;0.188800;5002;5002;0;0;0;0;0;0;0
+-1.600000;3;1416;0.188800;5001;5002;0;0;0;0;0;0;0
+-1.500000;3;1416;0.188800;4992;5002;0;0;0;0;0;0;0
+-1.400000;3;1416;0.188800;4981;5002;0;0;0;0;0;0;0
+-1.300000;3;1416;0.188800;4928;5002;0;0;0;0;0;0;0
+-1.200000;3;1416;0.188800;4836;5002;0;0;0;0;0;0;0
+-1.100000;3;1416;0.188800;4691;5002;0;0;0;0;0;0;0
+-1.000000;3;1416;0.188800;4365;5002;0;0;0;0;0;0;0
+-0.900000;3;1416;0.188800;3918;5002;0;0;0;0;0;0;0
+-0.800000;3;1416;0.188800;3317;5002;0;0;0;0;0;0;0
+-0.700000;3;1416;0.188800;2690;5002;0;0;0;0;0;0;0
+-0.600000;3;1416;0.188800;2011;5002;0;0;0;0;0;0;0
+-0.500000;3;1416;0.188800;1459;5002;0;0;0;0;0;0;0
+-0.400000;3;1416;0.188800;1000;5044;0;0;0;0;0;0;0
+-0.300000;3;1416;0.188800;1000;7616;0;0;0;0;0;0;0
+-0.200000;3;1416;0.188800;923;10000;0;0;0;0;0;0;0
+-0.100000;3;1416;0.188800;692;10000;0;0;0;0;0;0;0
+0.000000;3;1416;0.188800;560;10000;0;0;0;0;0;0;0
+0.100000;3;1416;0.188800;518;10000;0;0;0;0;0;0;0
+0.200000;3;1416;0.188800;423;10000;0;0;0;0;0;0;0
+0.300000;3;1416;0.188800;388;10000;0;0;0;0;0;0;0
+0.400000;3;1416;0.188800;366;10000;0;0;0;0;0;0;0
+0.500000;3;1416;0.188800;349;10000;0;0;0;0;0;0;0
+0.600000;3;1416;0.188800;370;10000;0;0;0;0;0;0;0
+0.700000;3;1416;0.188800;309;10000;0;0;0;0;0;0;0
+0.800000;3;1416;0.188800;293;10000;0;0;0;0;0;0;0
+0.900000;3;1416;0.188800;242;10000;0;0;0;0;0;0;0
+1.000000;3;1416;0.188800;277;10000;0;0;0;0;0;0;0
+1.100000;3;1416;0.188800;233;10000;0;0;0;0;0;0;0
+1.200000;3;1416;0.188800;230;10000;0;0;0;0;0;0;0
+1.300000;3;1416;0.188800;222;10000;0;0;0;0;0;0;0
+1.400000;3;1416;0.188800;205;10000;0;0;0;0;0;0;0
+1.500000;3;1416;0.188800;182;10000;0;0;0;0;0;0;0
+1.600000;3;1416;0.188800;187;10000;0;0;0;0;0;0;0
+1.700000;3;1416;0.188800;167;10000;0;0;0;0;0;0;0
+1.800000;3;1416;0.188800;156;10000;0;0;0;0;0;0;0
+1.900000;3;1416;0.188800;124;10000;0;0;0;0;0;0;0
+2.000000;3;1416;0.188800;110;10000;0;0;0;0;0;0;0
+2.100000;3;1416;0.188800;112;10000;0;0;0;0;0;0;0
+2.200000;3;1416;0.188800;88;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv
new file mode 100644
index 00000000000..a7789f16e55
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs4.csv
@@ -0,0 +1,63 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+-3.000000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.900000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.800000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.700000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.600000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.500000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.400000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.300000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.200000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.100000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-2.000000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.900000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.800000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.700000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.600000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.500000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.400000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.300000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.200000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.100000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-1.000000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-0.900000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-0.800000;4;1800;0.240000;5002;5002;0;0;0;0;0;0;0
+-0.700000;4;1800;0.240000;4997;5002;0;0;0;0;0;0;0
+-0.600000;4;1800;0.240000;4995;5002;0;0;0;0;0;0;0
+-0.500000;4;1800;0.240000;4964;5002;0;0;0;0;0;0;0
+-0.400000;4;1800;0.240000;4885;5002;0;0;0;0;0;0;0
+-0.300000;4;1800;0.240000;4725;5002;0;0;0;0;0;0;0
+-0.200000;4;1800;0.240000;4470;5002;0;0;0;0;0;0;0
+-0.100000;4;1800;0.240000;4037;5002;0;0;0;0;0;0;0
+0.000000;4;1800;0.240000;3475;5002;0;0;0;0;0;0;0
+0.100000;4;1800;0.240000;2867;5002;0;0;0;0;0;0;0
+0.200000;4;1800;0.240000;2104;5002;0;0;0;0;0;0;0
+0.300000;4;1800;0.240000;1477;5002;0;0;0;0;0;0;0
+0.400000;4;1800;0.240000;1059;5002;0;0;0;0;0;0;0
+0.500000;4;1800;0.240000;1000;7320;0;0;0;0;0;0;0
+0.600000;4;1800;0.240000;963;10000;0;0;0;0;0;0;0
+0.700000;4;1800;0.240000;674;10000;0;0;0;0;0;0;0
+0.800000;4;1800;0.240000;554;10000;0;0;0;0;0;0;0
+0.900000;4;1800;0.240000;498;10000;0;0;0;0;0;0;0
+1.000000;4;1800;0.240000;442;10000;0;0;0;0;0;0;0
+1.100000;4;1800;0.240000;390;10000;0;0;0;0;0;0;0
+1.200000;4;1800;0.240000;380;10000;0;0;0;0;0;0;0
+1.300000;4;1800;0.240000;325;10000;0;0;0;0;0;0;0
+1.400000;4;1800;0.240000;323;10000;0;0;0;0;0;0;0
+1.500000;4;1800;0.240000;281;10000;0;0;0;0;0;0;0
+1.600000;4;1800;0.240000;309;10000;0;0;0;0;0;0;0
+1.700000;4;1800;0.240000;255;10000;0;0;0;0;0;0;0
+1.800000;4;1800;0.240000;271;10000;0;0;0;0;0;0;0
+1.900000;4;1800;0.240000;246;10000;0;0;0;0;0;0;0
+2.000000;4;1800;0.240000;215;10000;0;0;0;0;0;0;0
+2.100000;4;1800;0.240000;198;10000;0;0;0;0;0;0;0
+2.200000;4;1800;0.240000;206;10000;0;0;0;0;0;0;0
+2.300000;4;1800;0.240000;177;10000;0;0;0;0;0;0;0
+2.400000;4;1800;0.240000;174;10000;0;0;0;0;0;0;0
+2.500000;4;1800;0.240000;161;10000;0;0;0;0;0;0;0
+2.600000;4;1800;0.240000;170;10000;0;0;0;0;0;0;0
+2.700000;4;1800;0.240000;141;10000;0;0;0;0;0;0;0
+2.800000;4;1800;0.240000;121;10000;0;0;0;0;0;0;0
+2.900000;4;1800;0.240000;121;10000;0;0;0;0;0;0;0
+3.000000;4;1800;0.240000;128;10000;0;0;0;0;0;0;0
+3.100000;4;1800;0.240000;93;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv
new file mode 100644
index 00000000000..6b1c7da61d5
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs5.csv
@@ -0,0 +1,54 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+-2.000000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.900000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.800000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.700000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.600000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.500000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.400000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.300000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.200000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.100000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-1.000000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.900000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.800000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.700000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.600000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.500000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.400000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.300000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.200000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+-0.100000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+0.000000;5;2216;0.295467;5002;5002;0;0;0;0;0;0;0
+0.100000;5;2216;0.295467;4999;5002;0;0;0;0;0;0;0
+0.200000;5;2216;0.295467;4989;5002;0;0;0;0;0;0;0
+0.300000;5;2216;0.295467;4946;5002;0;0;0;0;0;0;0
+0.400000;5;2216;0.295467;4837;5002;0;0;0;0;0;0;0
+0.500000;5;2216;0.295467;4620;5002;0;0;0;0;0;0;0
+0.600000;5;2216;0.295467;4265;5002;0;0;0;0;0;0;0
+0.700000;5;2216;0.295467;3655;5002;0;0;0;0;0;0;0
+0.800000;5;2216;0.295467;2933;5002;0;0;0;0;0;0;0
+0.900000;5;2216;0.295467;2253;5002;0;0;0;0;0;0;0
+1.000000;5;2216;0.295467;1517;5002;0;0;0;0;0;0;0
+1.100000;5;2216;0.295467;1031;5002;0;0;0;0;0;0;0
+1.200000;5;2216;0.295467;1000;8037;0;0;0;0;0;0;0
+1.300000;5;2216;0.295467;825;10000;0;0;0;0;0;0;0
+1.400000;5;2216;0.295467;605;10000;0;0;0;0;0;0;0
+1.500000;5;2216;0.295467;436;10000;0;0;0;0;0;0;0
+1.600000;5;2216;0.295467;374;10000;0;0;0;0;0;0;0
+1.700000;5;2216;0.295467;326;10000;0;0;0;0;0;0;0
+1.800000;5;2216;0.295467;325;10000;0;0;0;0;0;0;0
+1.900000;5;2216;0.295467;305;10000;0;0;0;0;0;0;0
+2.000000;5;2216;0.295467;269;10000;0;0;0;0;0;0;0
+2.100000;5;2216;0.295467;257;10000;0;0;0;0;0;0;0
+2.200000;5;2216;0.295467;210;10000;0;0;0;0;0;0;0
+2.300000;5;2216;0.295467;213;10000;0;0;0;0;0;0;0
+2.400000;5;2216;0.295467;193;10000;0;0;0;0;0;0;0
+2.500000;5;2216;0.295467;178;10000;0;0;0;0;0;0;0
+2.600000;5;2216;0.295467;152;10000;0;0;0;0;0;0;0
+2.700000;5;2216;0.295467;145;10000;0;0;0;0;0;0;0
+2.800000;5;2216;0.295467;128;10000;0;0;0;0;0;0;0
+2.900000;5;2216;0.295467;144;10000;0;0;0;0;0;0;0
+3.000000;5;2216;0.295467;124;10000;0;0;0;0;0;0;0
+3.100000;5;2216;0.295467;113;10000;0;0;0;0;0;0;0
+3.200000;5;2216;0.295467;97;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv
new file mode 100644
index 00000000000..bb91a58267d
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs6.csv
@@ -0,0 +1,57 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+-1.000000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.900000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.800000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.700000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.600000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.500000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.400000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.300000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.200000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.100000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+-0.000000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+0.100000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+0.200000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+0.300000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+0.400000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+0.500000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+0.600000;6;2600;0.346667;5002;5002;0;0;0;0;0;0;0
+0.700000;6;2600;0.346667;4996;5002;0;0;0;0;0;0;0
+0.800000;6;2600;0.346667;4977;5002;0;0;0;0;0;0;0
+0.900000;6;2600;0.346667;4927;5002;0;0;0;0;0;0;0
+1.000000;6;2600;0.346667;4757;5002;0;0;0;0;0;0;0
+1.100000;6;2600;0.346667;4438;5002;0;0;0;0;0;0;0
+1.200000;6;2600;0.346667;3918;5002;0;0;0;0;0;0;0
+1.300000;6;2600;0.346667;3176;5002;0;0;0;0;0;0;0
+1.400000;6;2600;0.346667;2309;5002;0;0;0;0;0;0;0
+1.500000;6;2600;0.346667;1557;5002;0;0;0;0;0;0;0
+1.600000;6;2600;0.346667;1000;5177;0;0;0;0;0;0;0
+1.700000;6;2600;0.346667;1000;8453;0;0;0;0;0;0;0
+1.800000;6;2600;0.346667;817;10000;0;0;0;0;0;0;0
+1.900000;6;2600;0.346667;579;10000;0;0;0;0;0;0;0
+2.000000;6;2600;0.346667;444;10000;0;0;0;0;0;0;0
+2.100000;6;2600;0.346667;475;10000;0;0;0;0;0;0;0
+2.200000;6;2600;0.346667;431;10000;0;0;0;0;0;0;0
+2.300000;6;2600;0.346667;347;10000;0;0;0;0;0;0;0
+2.400000;6;2600;0.346667;391;10000;0;0;0;0;0;0;0
+2.500000;6;2600;0.346667;334;10000;0;0;0;0;0;0;0
+2.600000;6;2600;0.346667;334;10000;0;0;0;0;0;0;0
+2.700000;6;2600;0.346667;320;10000;0;0;0;0;0;0;0
+2.800000;6;2600;0.346667;297;10000;0;0;0;0;0;0;0
+2.900000;6;2600;0.346667;287;10000;0;0;0;0;0;0;0
+3.000000;6;2600;0.346667;250;10000;0;0;0;0;0;0;0
+3.100000;6;2600;0.346667;259;10000;0;0;0;0;0;0;0
+3.200000;6;2600;0.346667;246;10000;0;0;0;0;0;0;0
+3.300000;6;2600;0.346667;226;10000;0;0;0;0;0;0;0
+3.400000;6;2600;0.346667;216;10000;0;0;0;0;0;0;0
+3.500000;6;2600;0.346667;198;10000;0;0;0;0;0;0;0
+3.600000;6;2600;0.346667;175;10000;0;0;0;0;0;0;0
+3.700000;6;2600;0.346667;185;10000;0;0;0;0;0;0;0
+3.800000;6;2600;0.346667;166;10000;0;0;0;0;0;0;0
+3.900000;6;2600;0.346667;137;10000;0;0;0;0;0;0;0
+4.000000;6;2600;0.346667;144;10000;0;0;0;0;0;0;0
+4.100000;6;2600;0.346667;123;10000;0;0;0;0;0;0;0
+4.200000;6;2600;0.346667;119;10000;0;0;0;0;0;0;0
+4.300000;6;2600;0.346667;107;10000;0;0;0;0;0;0;0
+4.400000;6;2600;0.346667;111;10000;0;0;0;0;0;0;0
+4.500000;6;2600;0.346667;95;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv
new file mode 100644
index 00000000000..739656f3b3b
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs7.csv
@@ -0,0 +1,45 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+0.000000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.100000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.200000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.300000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.400000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.500000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.600000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.700000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.800000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+0.900000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+1.000000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+1.100000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+1.200000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+1.300000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+1.400000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+1.500000;7;3112;0.414933;5002;5002;0;0;0;0;0;0;0
+1.600000;7;3112;0.414933;4997;5002;0;0;0;0;0;0;0
+1.700000;7;3112;0.414933;4981;5002;0;0;0;0;0;0;0
+1.800000;7;3112;0.414933;4892;5002;0;0;0;0;0;0;0
+1.900000;7;3112;0.414933;4746;5002;0;0;0;0;0;0;0
+2.000000;7;3112;0.414933;4388;5002;0;0;0;0;0;0;0
+2.100000;7;3112;0.414933;3664;5002;0;0;0;0;0;0;0
+2.200000;7;3112;0.414933;2843;5002;0;0;0;0;0;0;0
+2.300000;7;3112;0.414933;1992;5002;0;0;0;0;0;0;0
+2.400000;7;3112;0.414933;1285;5002;0;0;0;0;0;0;0
+2.500000;7;3112;0.414933;1000;6867;0;0;0;0;0;0;0
+2.600000;7;3112;0.414933;773;10000;0;0;0;0;0;0;0
+2.700000;7;3112;0.414933;427;10000;0;0;0;0;0;0;0
+2.800000;7;3112;0.414933;300;10000;0;0;0;0;0;0;0
+2.900000;7;3112;0.414933;276;10000;0;0;0;0;0;0;0
+3.000000;7;3112;0.414933;215;10000;0;0;0;0;0;0;0
+3.100000;7;3112;0.414933;198;10000;0;0;0;0;0;0;0
+3.200000;7;3112;0.414933;193;10000;0;0;0;0;0;0;0
+3.300000;7;3112;0.414933;179;10000;0;0;0;0;0;0;0
+3.400000;7;3112;0.414933;173;10000;0;0;0;0;0;0;0
+3.500000;7;3112;0.414933;169;10000;0;0;0;0;0;0;0
+3.600000;7;3112;0.414933;124;10000;0;0;0;0;0;0;0
+3.700000;7;3112;0.414933;149;10000;0;0;0;0;0;0;0
+3.800000;7;3112;0.414933;123;10000;0;0;0;0;0;0;0
+3.900000;7;3112;0.414933;133;10000;0;0;0;0;0;0;0
+4.000000;7;3112;0.414933;129;10000;0;0;0;0;0;0;0
+4.100000;7;3112;0.414933;101;10000;0;0;0;0;0;0;0
+4.200000;7;3112;0.414933;109;10000;0;0;0;0;0;0;0
+4.300000;7;3112;0.414933;69;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv
new file mode 100644
index 00000000000..89ce70d3507
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs8.csv
@@ -0,0 +1,33 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+1.000000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.100000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.200000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.300000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.400000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.500000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.600000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.700000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.800000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+1.900000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+2.000000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+2.100000;8;3496;0.466133;5002;5002;0;0;0;0;0;0;0
+2.200000;8;3496;0.466133;4999;5002;0;0;0;0;0;0;0
+2.300000;8;3496;0.466133;4982;5002;0;0;0;0;0;0;0
+2.400000;8;3496;0.466133;4943;5002;0;0;0;0;0;0;0
+2.500000;8;3496;0.466133;4782;5002;0;0;0;0;0;0;0
+2.600000;8;3496;0.466133;4443;5002;0;0;0;0;0;0;0
+2.700000;8;3496;0.466133;3858;5002;0;0;0;0;0;0;0
+2.800000;8;3496;0.466133;2987;5002;0;0;0;0;0;0;0
+2.900000;8;3496;0.466133;2063;5002;0;0;0;0;0;0;0
+3.000000;8;3496;0.466133;1290;5002;0;0;0;0;0;0;0
+3.100000;8;3496;0.466133;1000;7204;0;0;0;0;0;0;0
+3.200000;8;3496;0.466133;741;10000;0;0;0;0;0;0;0
+3.300000;8;3496;0.466133;407;10000;0;0;0;0;0;0;0
+3.400000;8;3496;0.466133;240;10000;0;0;0;0;0;0;0
+3.500000;8;3496;0.466133;199;10000;0;0;0;0;0;0;0
+3.600000;8;3496;0.466133;198;10000;0;0;0;0;0;0;0
+3.700000;8;3496;0.466133;153;10000;0;0;0;0;0;0;0
+3.800000;8;3496;0.466133;141;10000;0;0;0;0;0;0;0
+3.900000;8;3496;0.466133;131;10000;0;0;0;0;0;0;0
+4.000000;8;3496;0.466133;115;10000;0;0;0;0;0;0;0
+4.100000;8;3496;0.466133;98;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv
new file mode 100644
index 00000000000..d40f4e4f6f0
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs9.csv
@@ -0,0 +1,25 @@
+SNR; MCS; TBS; rate; err0; trials0; err1; trials1; err2; trials2; err3; trials3; dci_err
+2.000000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.100000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.200000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.300000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.400000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.500000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.600000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.700000;9;4008;0.534400;5002;5002;0;0;0;0;0;0;0
+2.800000;9;4008;0.534400;5001;5002;0;0;0;0;0;0;0
+2.900000;9;4008;0.534400;4999;5002;0;0;0;0;0;0;0
+3.000000;9;4008;0.534400;4983;5002;0;0;0;0;0;0;0
+3.100000;9;4008;0.534400;4920;5002;0;0;0;0;0;0;0
+3.200000;9;4008;0.534400;4740;5002;0;0;0;0;0;0;0
+3.300000;9;4008;0.534400;4318;5002;0;0;0;0;0;0;0
+3.400000;9;4008;0.534400;3635;5002;0;0;0;0;0;0;0
+3.500000;9;4008;0.534400;2657;5002;0;0;0;0;0;0;0
+3.600000;9;4008;0.534400;1780;5002;0;0;0;0;0;0;0
+3.700000;9;4008;0.534400;1000;5063;0;0;0;0;0;0;0
+3.800000;9;4008;0.534400;1000;9741;0;0;0;0;0;0;0
+3.900000;9;4008;0.534400;505;10000;0;0;0;0;0;0;0
+4.000000;9;4008;0.534400;269;10000;0;0;0;0;0;0;0
+4.100000;9;4008;0.534400;141;10000;0;0;0;0;0;0;0
+4.200000;9;4008;0.534400;118;10000;0;0;0;0;0;0;0
+4.300000;9;4008;0.534400;93;10000;0;0;0;0;0;0;0
diff --git a/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m
new file mode 100644
index 00000000000..dd833103ce1
--- /dev/null
+++ b/openair1/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/eval_results.m
@@ -0,0 +1,103 @@
+set(0, 'DefaultLineMarkerSize', 10);
+set(0, 'Defaultaxesfontsize', 14);
+set(0, 'DefaultLineLineWidth', 2);
+
+root_path = 'Rayleigh8_perfectCE_new';
+tx_mode = 6;
+channel = 8;
+
+%%
+addpath('../../../EMOS/LTE/POST_PROCESSING')
+load SISO.mat
+
+scale_bps = (8*12+3*8)*6*100;
+c_siso = [c_siso_4Qam; c_siso_16Qam; c_siso_64Qam];
+bps_siso = c_siso.*scale_bps;
+
+snr_all = -20:0.2:40;
+throughput_all = zeros(length(snr_all),22);
+
+plot_style = {'b-*';'r-*';'g-*';'y-*';'k-*';...
+    'b-o';'r-o';'g-o';'y-o';'k-o';...
+    'b-s';'r-s';'g-s';'y-s';'k-s';...
+    'b-d';'r-d';'g-d';'y-d';'k-d';...
+    'b-x';'r-x';'g-x';'y-x';'k-x';...
+    'b-+';'r-+';'g-+';'y-+';'k-+'};
+
+
+%%
+figure(1)
+hold off
+figure(2)
+hold off
+legend_str = {};
+i=1;
+for mcs=0:28
+    file = fullfile(root_path,sprintf('second_bler_tx%d_mcs%d_chan%d.csv',tx_mode,mcs,channel));
+    try
+        data = dlmread(file,';',1,0);
+    catch exception
+        disp(sprintf('Problem with file %s:',file));
+        disp(exception.message);
+        continue
+    end
+    snr = data(:,1);
+    bler = data(:,5)./data(:,6); % round 1
+    bler4 = data(:,11)./data(:,6); % round 4
+    harq_adjust = data(:,6)./sum(data(:,6:2:12),2);
+    if size(data,2)>13
+        uncoded_ber = data(:,14);
+    else
+        uncoded_ber = ones(size(data,1),1);
+    end
+    if (length(snr)==1)
+    throughput_all(:,mcs+1) = (1-bler4).*harq_adjust.*get_tbs(mcs,25)*6*100;
+    else
+    throughput_all(:,mcs+1) = interp1(snr, (1-bler4).*harq_adjust.*get_tbs(mcs,25)*6*100,snr_all,'nearest','extrap');
+    end
+    throughput_all(1:find(snr_all==snr(1)),mcs+1) = 0;
+    figure(1)
+    semilogy(snr,bler(:,1),plot_style{mcs+1});
+    hold on
+    figure(2)
+    semilogy(snr,uncoded_ber,plot_style{mcs+1});
+    hold on
+    legend_str{i} = sprintf('mcs %d',mcs);
+    i=i+1;
+end
+
+%%
+h_fig = figure(1);
+h_leg = legend(legend_str,'location','eastoutside');
+set(h_leg,'FontSize',10);
+title(sprintf('Tx mode %d: BLER vs SNR',tx_mode));
+ylabel 'BLER'
+xlabel 'SNR'
+ylim([0.001 1])
+grid on
+saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_bler.fig',tx_mode,channel)));
+saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_bler.emf',tx_mode,channel)));
+
+h_fig = figure(2);
+h_leg = legend(legend_str,'location','eastoutside');
+set(h_leg,'FontSize',10);
+title(sprintf('Tx mode %d: uncoded BER vs SNR',tx_mode));
+ylabel 'uncoded BER'
+xlabel 'SNR'
+ylim([0.0001 1])
+grid on
+saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_ber.fig',tx_mode,channel)));
+saveas(h_fig,fullfile(root_path,sprintf('tx_mode%d_channel%d_ber.emf',tx_mode,channel)));
+
+%%
+h_fig = figure(4);
+hold off
+plot(snr_all,(max(throughput_all,[],2)))
+%plot(snr_all,throughput_all)
+hold on
+plot(SNR,max(bps_siso),'r--');
+legend('simulation','SISO mutual information','location','northwest');
+xlabel('SNR [dB]')
+ylabel('Throughput [bps]')
+grid on
+
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index 6aff4dbc930..2203e06740b 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -280,11 +280,7 @@ int main(int argc, char **argv) {
   int print_perf=0;
   int llr8_flag=0;
 
-  reset_meas(&ts);
-  start_meas(&ts);
-  sleep(1);
-  stop_meas(&ts);
-  cpu_freq_GHz = (double)ts.diff/1000000000;
+  cpu_freq_GHz = (double)get_cpu_freq_GHz();
 
   printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz);
 
@@ -483,6 +479,7 @@ int main(int argc, char **argv) {
 	break;
       case 'P':
 	print_perf=1;
+	opp_enabled=1; // to enable the time meas
 	break;
       case 'L':
 	llr8_flag=1;
@@ -1657,9 +1654,9 @@ int main(int argc, char **argv) {
 	    //	    printf("amc: ****************** eNB2UE[%d]->n_rx = %d,dd %d\n",round,eNB2UE[round]->nb_rx,eNB2UE[round]->channel_offset);
 	    if(abstx==1 && num_rounds>1)
 	      if(round==0 && hold_channel==0){
-		random_channel(eNB2UE[1]);
-		random_channel(eNB2UE[2]);
-		random_channel(eNB2UE[3]);		
+		random_channel(eNB2UE[1],0);
+		random_channel(eNB2UE[2],0);
+		random_channel(eNB2UE[3],0);		
 	      }
 	  }
 	
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 8c5c39cb77f..d7b6fafe28c 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -201,7 +201,6 @@ int main(int argc, char **argv) {
   u8 N0=30;
   double tx_gain=1.0;
   double cpu_freq_GHz;
-  time_stats_t ts;
   int avg_iter,iter_trials;
 
   uint32_t UL_alloc_pdu;
@@ -212,11 +211,7 @@ int main(int argc, char **argv) {
   uint8_t llr8_flag=0;
   int nb_rb_set = 0;
 
-  reset_meas(&ts);
-  start_meas(&ts);
-  sleep(1);
-  stop_meas(&ts);
-  cpu_freq_GHz = (double)ts.diff/1000000000;
+  cpu_freq_GHz = (double)get_cpu_freq_GHz();
 
   printf("Detected cpu_freq %f GHz\n",cpu_freq_GHz);
 
@@ -389,6 +384,7 @@ int main(int argc, char **argv) {
       break;
     case 'P':
       dump_perf=1;
+      opp_enabled=1;
       break;
     case 'L':
       llr8_flag=1;
diff --git a/openair1/SIMULATION/RF/rf.c b/openair1/SIMULATION/RF/rf.c
index 0d45494e4b3..3ddc50f84f6 100644
--- a/openair1/SIMULATION/RF/rf.c
+++ b/openair1/SIMULATION/RF/rf.c
@@ -2,7 +2,11 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <math.h>
+
+//#include "PHY/defs.h"
+#include "SIMULATION/TOOLS/defs.h"
  
+/*
 extern void randominit(void);
 extern double gaussdouble(double,double);
   //free(input_data);
@@ -10,6 +14,7 @@ extern double gaussdouble(double,double);
 //extern int write_output(const char *,const char *,void *,int,int,char);
 //flag change
 extern int write_output(const char *,const char *,void *,int,int,char);
+*/
 
 //double pn[1024];
 
@@ -206,8 +211,9 @@ void rf_rx_simple(double **r_re,
 #ifdef RF_MAIN
 #define INPUT_dBm -70.0
 
-#include "../../PHY/TOOLS/defs.h"
-#include "../TOOLS/defs.h"
+int QPSK[4]={AMP_OVER_SQRT2|(AMP_OVER_SQRT2<<16),AMP_OVER_SQRT2|((65536-AMP_OVER_SQRT2)<<16),((65536-AMP_OVER_SQRT2)<<16)|AMP_OVER_SQRT2,((65536-AMP_OVER_SQRT2)<<16)|(65536-AMP_OVER_SQRT2)};
+int QPSK2[4]={AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),((65536-AMP_OVER_2)<<16)|AMP_OVER_2,((65536-AMP_OVER_2)<<16)|(65536-AMP_OVER_2)};
+
 
 int main(int argc, char* argv[]) {
 
@@ -217,31 +223,71 @@ int main(int argc, char* argv[]) {
   int length      = 100000;
   int i,j,n;
   double input_amp = pow(10.0,(.05*INPUT_dBm))/sqrt(2);
-  double **r_re,**r_im;
   double nf[2] = {3.0,3.0};
   double ip =0.0;
+  double path_loss_dB = -90, rx_gain_dB = 125;
+  double tx_pwr, rx_pwr;
+
+  u32 **input = malloc(nb_antennas*sizeof(u32*));
+  u32 **output = malloc(nb_antennas*sizeof(u32*));
   
-  r_re = malloc(nb_antennas*sizeof (double *));
-  r_im = malloc(nb_antennas*sizeof (double *));
-  printf("Input amp = %f\n",input_amp);
+  double **s_re = malloc(nb_antennas*sizeof (double *));
+  double **s_im = malloc(nb_antennas*sizeof (double *));
+  double **r_re = malloc(nb_antennas*sizeof (double *));
+  double **r_im = malloc(nb_antennas*sizeof (double *));
 
-  randominit();
+  channel_desc_t *channel;
 
-  for (i=0;i<nb_antennas;i++) {
+  srand(0);
+  randominit(0);
+  set_taus_seed(0);
+
+  channel = new_channel_desc_scm(nb_antennas,
+				 nb_antennas,
+				 AWGN,
+				 7.68e6,
+				 0,
+				 0,
+				 path_loss_dB);
 
+  for (i=0;i<nb_antennas;i++) {
+    s_re[i] = (double *)malloc(length * sizeof (double ));
+    s_im[i] = (double *)malloc(length * sizeof (double ));
     r_re[i] = (double *)malloc(length * sizeof (double ));
     r_im[i] = (double *)malloc(length * sizeof (double ));
-
+    input[i] = (u32*)malloc(length * sizeof(u32));
+    output[i] = (u32*)malloc(length * sizeof(u32));
   }    
 
   for (i=0;i<nb_antennas;i++) {
-    // generate fs/4 complex exponential
-    for (j=0;j<length;j++) {
-      r_re[i][j] = 0; //input_amp; // * cos(M_PI*j/2);
-      r_im[i][j] = 0; //input_amp; // * sin(M_PI*j/2);
+    // generate a random QPSK signal
+    for (j=0;j<length/2;j++) {
+      input[i][j] = QPSK[taus()&3];
     }
   }
   
+  tx_pwr = dac_fixed_gain(s_re,
+			  s_im,
+			  input,
+			  0,
+			  nb_antennas,
+			  length,
+			  0,
+			  512,
+			  14,
+			  15.0);
+
+  multipath_channel(channel,s_re,s_im,r_re,r_im,
+		    length,0);
+  
+  rf_rx_simple(r_re,
+	       r_im,
+	       nb_antennas,
+	       length,
+	       1.0/7.68e6 * 1e9,// sampling time (ns)
+	       rx_gain_dB - 66.227);
+
+  /*
   rf_rx(r_re,
 	r_im,
 	nb_antennas,
@@ -257,9 +303,22 @@ int main(int argc, char* argv[]) {
 	-500.0,          // pn_amp (dBc)
 	-0.0,              // IQ imbalance (dB),
 	0.0);           // IQ phase imbalance (rad)
+  */
 
-  write_output("/tmp/test_output_re.m","rfout_re",r_re[0],length,1,7);
-  write_output("/tmp/test_output_im.m","rfout_im",r_im[0],length,1,7);
-  //  write_output("pn.m","pnoise",pn,1024,1,7);
+  adc(r_re,
+      r_im,
+      0,
+      0,
+      output,
+      nb_antennas,
+      length,
+      12);
+  
+  write_output("s_im.m","s_im",s_im[0],length,1,7);
+  write_output("s_re.m","s_re",s_re[0],length,1,7);
+  write_output("r_im.m","r_im",r_im[0],length,1,7);
+  write_output("r_re.m","r_re",r_re[0],length,1,7);
+  write_output("input.m","rfin",input[0],length,1,1);
+  write_output("output.m","rfout",output[0],length,1,1);
 }
 #endif
diff --git a/openair1/SIMULATION/TOOLS/abstraction.c b/openair1/SIMULATION/TOOLS/abstraction.c
index 046fe1618de..ff631aa78f3 100644
--- a/openair1/SIMULATION/TOOLS/abstraction.c
+++ b/openair1/SIMULATION/TOOLS/abstraction.c
@@ -69,7 +69,8 @@ void freq_channel(channel_desc_t *desc,u16 nb_rb,s16 n_samples) {
     init_freq_channel(desc,nb_rb,n_samples);
     freq_channel_init=1;
   }
-    
+   
+  start_meas(&desc->interp_freq);
   for (f=-n_samples/2;f<n_samples/2;f++) {
 	clut = cos_lut[n_samples/2+f];
         slut = sin_lut[n_samples/2+f];
@@ -88,6 +89,7 @@ void freq_channel(channel_desc_t *desc,u16 nb_rb,s16 n_samples) {
 	}
       }
   }
+  stop_meas(&desc->interp_freq);
 }
 
 double compute_pbch_sinr(channel_desc_t *desc,
@@ -188,7 +190,7 @@ double compute_sinr(channel_desc_t *desc,
 }
 
 int pbch_polynomial_degree;
-double a[7];
+double pbch_awgn_polynomial[7];
 
 void load_pbch_desc(FILE *pbch_file_fd) {
 
@@ -213,8 +215,8 @@ void load_pbch_desc(FILE *pbch_file_fd) {
       printf("fscanf failed: %s\n", strerror(errno));
       exit(EXIT_FAILURE);
     }
-    a[i] = strtod(dummy,NULL);
-    printf("%f ",a[i]);
+    pbch_awgn_polynomial[i] = strtod(dummy,NULL);
+    printf("%f ",pbch_awgn_polynomial[i]);
   }
   printf("\n");
 } 
@@ -222,19 +224,24 @@ void load_pbch_desc(FILE *pbch_file_fd) {
 double pbch_bler(double sinr) {
 
   int i;
-  double log10_bler=a[pbch_polynomial_degree];
+  double log10_bler=pbch_awgn_polynomial[pbch_polynomial_degree];
   double sinrpow=sinr;
+  double bler=0.0;
   //  printf("log10bler %f\n",log10_bler);
   if (sinr<-7.9)
-    return(1.0);
+    bler= 1.0;
   else if (sinr>=0.0)
-    return(1e-4);
-
-  for (i=1;i<=pbch_polynomial_degree;i++) {
-    //    printf("sinrpow %f\n",sinrpow);
-    log10_bler += (a[pbch_polynomial_degree-i]*sinrpow);
-    sinrpow *= sinr;
-    //    printf("log10bler %f\n",log10_bler);
+    bler=0.0001;
+  else  {
+    for (i=1;i<=pbch_polynomial_degree;i++) {
+      //    printf("sinrpow %f\n",sinrpow);
+      log10_bler += (pbch_awgn_polynomial[pbch_polynomial_degree-i]*sinrpow);
+      sinrpow *= sinr;
+      //    printf("log10bler %f\n",log10_bler);
+    }
+    bler = pow(10.0,log10_bler);
   }
-  return(pow(10.0,log10_bler));
+  printf ("sinr %f bler %f\n",sinr,bler);
+  return(bler);
+
 }
diff --git a/openair1/SIMULATION/TOOLS/defs.h b/openair1/SIMULATION/TOOLS/defs.h
index fde0e6c40e0..b1960e70c18 100644
--- a/openair1/SIMULATION/TOOLS/defs.h
+++ b/openair1/SIMULATION/TOOLS/defs.h
@@ -63,7 +63,12 @@ typedef struct {
   /// initial phase for frequency offset simulation 
   double ip;
   /// number of paths taken by transmit signal
-  u16 nb_paths;
+  u16 nb_paths; 
+  /// timing measurements
+  time_stats_t random_channel;
+  time_stats_t interp_time;
+  time_stats_t interp_freq;
+  time_stats_t convolution;
 } channel_desc_t;
 
 typedef struct {
@@ -164,7 +169,7 @@ typedef enum {
 \param random_aoa If set to 1, AoA of ricean component is randomized
 */
 
-channel_desc_t *new_channel_desc(u8 nb_tx,u8 nb_rx, u8 nb_taps, u8 channel_length, double *amps, double* delays, struct complex** R_sqrt, double Td, double BW, double ricean_factor, double aoa, double forgetting_factor, double max_Doppler, s32 channel_offset, double path_loss_dB,u8 random_aoa);
+//channel_desc_t *new_channel_desc(u8 nb_tx,u8 nb_rx, u8 nb_taps, u8 channel_length, double *amps, double* delays, struct complex** R_sqrt, double Td, double BW, double ricean_factor, double aoa, double forgetting_factor, double max_Doppler, s32 channel_offset, double path_loss_dB,u8 random_aoa);
 
 channel_desc_t *new_channel_desc_scm(u8 nb_tx,
 				     u8 nb_rx, 
@@ -180,7 +185,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
 \brief This routine generates a random channel response (time domain) according to a tapped delay line model. 
 \param desc Pointer to the channel descriptor
 */
-int random_channel(channel_desc_t *desc);
+int random_channel(channel_desc_t *desc, u8 abstraction_flag);
 
 /**\fn void multipath_channel(channel_desc_t *desc,
 		       double **tx_sig_re, 
@@ -239,6 +244,9 @@ double compute_sinr(channel_desc_t *desc,
 			 u16 nb_rb);
 
 double pbch_bler(double sinr);
+
+void load_pbch_desc(FILE *pbch_file_fd);
+
 /**@}*/
 
 /**
diff --git a/openair1/SIMULATION/TOOLS/multipath_channel.c b/openair1/SIMULATION/TOOLS/multipath_channel.c
index 8876900eb8d..a98a35bd772 100644
--- a/openair1/SIMULATION/TOOLS/multipath_channel.c
+++ b/openair1/SIMULATION/TOOLS/multipath_channel.c
@@ -1,199 +1,180 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-#include "defs.h"
-#include "SIMULATION/RF/defs.h"
-
-//#define DEBUG_CH
-/*
-int init_multipath_channel(channel_desc_t *channel) {
-  int i;
-  if (channel->nb_taps<=0) {
-    msg("init_multipath_channel: nb_taps must be > 0\n");
-    return(-1);
-  }
-  if (channel->channel_length<=0) {
-    msg("init_multipath_channel: channel_length must be > 0\n");
-    return(-1);
-  }
-  if (channel->nb_tx<=0) {
-    msg("init_multipath_channel: nb_tx must be > 0\n");
-    return(-1);
-  }
-  if (channel->nb_rx<=0) {
-    msg("init_multipath_channel: nb_rx must be > 0\n");
-    return(-1);
-  }
-  channel->amps = (double*) malloc(channel->nb_taps*sizeof(double));
-  if (!channel->amps) {
-    msg("init_multipath_channel: cannot allocate amps\n");
-    return(-1);
-  }
-  channel->delays = (double*) malloc(channel->nb_taps*sizeof(double));
-  if (!channel->delays) {
-    msg("init_multipath_channel: cannot allocate delays\n");
-    return(-1);
-  }
-  channel->state = (struct complex **) malloc(channel->nb_tx*channel->nb_rx*sizeof(struct complex *));
-  if (!channel->state) {
-    msg("init_multipath_channel: cannot allocate state\n");
-    return(-1);
-  }
-  for (i=0; i<channel->nb_tx*channel->nb_rx; i++) {
-    channel->state[i] = (struct complex *) malloc(channel->nb_taps*sizeof(struct complex));
-    if (!channel->state[i]) {
-      msg("init_multipath_channel: cannot allocate state\n");
-      return(-1);
-    }
-  }
-  channel->ch = (struct complex **) malloc(channel->nb_tx*channel->nb_rx*sizeof(struct complex *));
-  if (!channel->ch) {
-    msg("init_multipath_channel: cannot allocate ch\n");
-    return(-1);
-  }
-  for (i=0; i<channel->nb_tx*channel->nb_rx; i++) {
-    channel->ch[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex));
-    if (!channel->ch[i]) {
-      msg("init_multipath_channel: cannot allocate ch\n");
-      return(-1);
-    }
-  }
-  channel->R_tx_sqrt = (struct complex **) malloc(channel->nb_tx*channel->nb_tx*sizeof(struct complex *));
-  if (!channel->Rx_tx_sqrt) {
-    msg("init_multipath_channel: cannot allocate R_tx_sqrt\n");
-    return(-1);
-  }
-  for (i=0; i<channel->nb_tx*channel->nb_tx; i++) {
-    channel->R_tx_sqrt[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex));
-    if (!channel->R_tx_sqrt[i]) {
-      msg("init_multipath_channel: cannot allocate R_tx_sqrt\n");
-      return(-1);
-    }
-  }
-  channel->R_rx_sqrt = (struct complex **) malloc(channel->nb_rx*channel->nb_rx*sizeof(struct complex *));
-  if (!channel->R_rx_sqrt) {
-    msg("init_multipath_channel: cannot allocate R_rx_sqrt\n");
-    return(-1);
-  }
-  for (i=0; i<channel->nb_rx*channel->nb_rx; i++) {
-    channel->R_rx_sqrt[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex));
-    if (!channel->R_rx_sqrt[i]) {
-      msg("init_multipath_channel: cannot allocate R_rx_sqrt\n");
-      return(-1);
-    }
-  }
-  return(0);
-}
-
-int free_multipath_channel(channel_desc_t *channel) {
-  int i;
-  free(channel->amps);
-  free(channel->delays);
-  for (i=0; i<channel->nb_tx*channel->nb_rx; i++) {
-    free(channel->state[i] = (struct complex *) malloc(channel->nb_taps*sizeof(struct complex));
-    if (!channel->state[i]) {
-      msg("init_multipath_channel: cannot allocate state\n");
-      return(-1);
-    }
-  }
-  free(channel->state);
-  channel->ch = (struct complex **) malloc(channel->nb_tx*channel->nb_rx*sizeof(struct complex *));
-  if (!channel->ch) {
-    msg("init_multipath_channel: cannot allocate ch\n");
-    return(-1);
-  }
-  for (i=0; i<channel->nb_tx*channel->nb_rx; i++) {
-    channel->ch[i] = (struct complex *) malloc(channel->channel_length*sizeof(struct complex));
-    if (!channel->ch[i]) {
-      msg("init_multipath_channel: cannot allocate ch\n");
-      return(-1);
-    }
-  }
-  channel->R_tx_sqrt = (struct complex *) malloc(channel->nb_tx*channel->nb_tx*sizeof(struct complex));
-  if (!channel->Rx_tx_sqrt) {
-    msg("init_multipath_channel: cannot allocate Rx_tx_sqrt\n");
-    return(-1);
-  }
-  channel->R_rx_sqrt = (struct complex *) malloc(channel->nb_rx*channel->nb_rx*sizeof(struct complex));
-  if (!channel->R_rx_sqrt) {
-    msg("init_multipath_channel: cannot allocate R_rx_sqrt\n");
-    return(-1);
-  }
-  return(0);
-}
-*/
-
-u8 multipath_channel_nosigconv(channel_desc_t *desc){
-  
-       random_channel(desc);
-       return(1);
-}
-
-//#define DEBUG_CH
-void multipath_channel(channel_desc_t *desc,
-		       double **tx_sig_re, 
-		       double **tx_sig_im, 
-		       double **rx_sig_re,
-		       double **rx_sig_im,
-		       u32 length,
-		       u8 keep_channel) {
- 
-  int i,ii,j,l;
-  struct complex rx_tmp,tx;
-
-  double path_loss = pow(10,desc->path_loss_dB/20);
-  int dd;
-  dd = abs(desc->channel_offset);
-
-#ifdef DEBUG_CH
-  printf("[CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length);
-#endif
-
-    if (keep_channel) {
-      // do nothing - keep channel
-    } else {
-      random_channel(desc);
-    }
-
-#ifdef DEBUG_CH
-  for (l = 0;l<(int)desc->channel_length;l++) {
-    printf("%p (%f,%f) ",desc->ch[0],desc->ch[0][l].x,desc->ch[0][l].y);
-  }
-  printf("\n");
-#endif
-
-  for (i=0;i<((int)length-dd);i++) {
-    for (ii=0;ii<desc->nb_rx;ii++) {
-      rx_tmp.x = 0;
-      rx_tmp.y = 0;
-      for (j=0;j<desc->nb_tx;j++) {
-	for (l = 0;l<(int)desc->channel_length;l++) {
-	  if ((i>=0) && (i-l)>=0) {
-	    tx.x = tx_sig_re[j][i-l];
-	    tx.y = tx_sig_im[j][i-l];
-	  }
-	  else {
-	    tx.x =0;
-	    tx.y =0;
-	  }
-	  rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
-	  rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
-	} //l
-      }  // j
-      rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
-      rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
-      /*
-      if ((ii==0)&&((i%32)==0)) {
-	printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
-      }
-      */
-      //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]);
-      //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]);
-      
-    } // ii
-  } // i
-}
-
-
-
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#include "defs.h"
+#include "SIMULATION/RF/defs.h"
+
+//#define DEBUG_CH
+u8 multipath_channel_nosigconv(channel_desc_t *desc){
+  
+  random_channel(desc,0);
+       return(1);
+}
+
+#define CHANNEL_SSE
+#ifdef CHANNEL_SSE
+void multipath_channel(channel_desc_t *desc,
+		       double **tx_sig_re, 
+		       double **tx_sig_im, 
+		       double **rx_sig_re,
+		       double **rx_sig_im,
+		       u32 length,
+		       u8 keep_channel) {
+ 
+  int i,ii,j,l;
+  int length1, length2, tail;
+  __m128d rx_tmp128_re_f,rx_tmp128_im_f,rx_tmp128_re,rx_tmp128_im, rx_tmp128_1,rx_tmp128_2,rx_tmp128_3,rx_tmp128_4,tx128_re,tx128_im,ch128_x,ch128_y,pathloss128;
+
+  double path_loss = pow(10,desc->path_loss_dB/20);
+  int dd = abs(desc->channel_offset);
+
+  pathloss128 = _mm_set1_pd(path_loss);
+
+#ifdef DEBUG_CH
+  printf("[CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length);
+#endif
+
+    if (keep_channel) {
+      // do nothing - keep channel
+    } else {
+      random_channel(desc,0);
+    }
+
+    start_meas(&desc->convolution);
+
+#ifdef DEBUG_CH
+  for (l = 0;l<(int)desc->channel_length;l++) {
+    printf("%p (%f,%f) ",desc->ch[0],desc->ch[0][l].x,desc->ch[0][l].y);
+  }
+  printf("\n");
+#endif
+
+  tail = ((int)length-dd)%2;
+  if(tail)
+    length1 = ((int)length-dd)-1;
+  else
+    length1 = ((int)length-dd);
+  length2 = length1/2;
+  for (i=0;i<length2;i++) { //
+    for (ii=0;ii<desc->nb_rx;ii++) {
+      // rx_tmp.x = 0;
+      // rx_tmp.y = 0;
+      rx_tmp128_re_f = _mm_setzero_pd();
+      rx_tmp128_im_f = _mm_setzero_pd();
+      for (j=0;j<desc->nb_tx;j++) {
+	for (l = 0;l<(int)desc->channel_length;l++) {
+	  if ((i>=0) && (i-l)>=0) { //SIMD correct only if length1 > 2*channel_length...which is almost always satisfied
+	    // tx.x = tx_sig_re[j][i-l];
+	    // tx.y = tx_sig_im[j][i-l];
+	    tx128_re = _mm_loadu_pd(&tx_sig_re[j][2*i-l]); // tx_sig_re[j][i-l+1], tx_sig_re[j][i-l]
+	    tx128_im = _mm_loadu_pd(&tx_sig_im[j][2*i-l]);
+	  }
+	  else {
+	    //tx.x =0;
+	    //tx.y =0;
+	    tx128_re = _mm_setzero_pd();
+	    tx128_im = _mm_setzero_pd();
+	  }
+	  ch128_x = _mm_set1_pd(desc->ch[ii+(j*desc->nb_rx)][l].x);
+	  ch128_y = _mm_set1_pd(desc->ch[ii+(j*desc->nb_rx)][l].y);
+	  //  rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
+	  //  rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
+	  rx_tmp128_1 = _mm_mul_pd(tx128_re,ch128_x);
+	  rx_tmp128_2 = _mm_mul_pd(tx128_re,ch128_y);
+	  rx_tmp128_3 = _mm_mul_pd(tx128_im,ch128_x);
+	  rx_tmp128_4 = _mm_mul_pd(tx128_im,ch128_y);
+	  rx_tmp128_re = _mm_sub_pd(rx_tmp128_1,rx_tmp128_4);
+	  rx_tmp128_im = _mm_add_pd(rx_tmp128_2,rx_tmp128_3);
+	  rx_tmp128_re_f = _mm_add_pd(rx_tmp128_re_f,rx_tmp128_re);
+	  rx_tmp128_im_f = _mm_add_pd(rx_tmp128_im_f,rx_tmp128_im);
+	} //l
+      }  // j
+      //rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
+      //rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
+      rx_tmp128_re_f = _mm_mul_pd(rx_tmp128_re_f,pathloss128);
+      rx_tmp128_im_f = _mm_mul_pd(rx_tmp128_im_f,pathloss128);
+      _mm_storeu_pd(&rx_sig_re[ii][2*i+dd],rx_tmp128_re_f); // max index: length-dd -1 + dd = length -1
+      _mm_storeu_pd(&rx_sig_im[ii][2*i+dd],rx_tmp128_im_f);
+      /*
+      if ((ii==0)&&((i%32)==0)) {
+	printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
+      }
+      */
+      //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]);
+      //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]);
+      
+    } // ii
+  } // i
+
+  stop_meas(&desc->convolution);
+
+}
+
+#else
+void multipath_channel(channel_desc_t *desc,
+		       double **tx_sig_re, 
+		       double **tx_sig_im, 
+		       double **rx_sig_re,
+		       double **rx_sig_im,
+		       u32 length,
+		       u8 keep_channel) {
+ 
+  int i,ii,j,l;
+  struct complex rx_tmp,tx;
+
+  double path_loss = pow(10,desc->path_loss_dB/20);
+  int dd;
+  dd = abs(desc->channel_offset);
+
+#ifdef DEBUG_CH
+  printf("[CHANNEL] keep = %d : path_loss = %g (%f), nb_rx %d, nb_tx %d, dd %d, len %d \n",keep_channel,path_loss,desc->path_loss_dB,desc->nb_rx,desc->nb_tx,dd,desc->channel_length);
+#endif
+
+    if (keep_channel) {
+      // do nothing - keep channel
+    } else {
+      random_channel(desc,0);
+    }
+
+#ifdef DEBUG_CH
+  for (l = 0;l<(int)desc->channel_length;l++) {
+    printf("%p (%f,%f) ",desc->ch[0],desc->ch[0][l].x,desc->ch[0][l].y);
+  }
+  printf("\n");
+#endif
+
+  for (i=0;i<((int)length-dd);i++) {
+    for (ii=0;ii<desc->nb_rx;ii++) {
+      rx_tmp.x = 0;
+      rx_tmp.y = 0;
+      for (j=0;j<desc->nb_tx;j++) {
+	for (l = 0;l<(int)desc->channel_length;l++) {
+	  if ((i>=0) && (i-l)>=0) {
+	    tx.x = tx_sig_re[j][i-l];
+	    tx.y = tx_sig_im[j][i-l];
+	  }
+	  else {
+	    tx.x =0;
+	    tx.y =0;
+	  }
+	  rx_tmp.x += (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].x) - (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].y);
+	  rx_tmp.y += (tx.y * desc->ch[ii+(j*desc->nb_rx)][l].x) + (tx.x * desc->ch[ii+(j*desc->nb_rx)][l].y);
+	} //l
+      }  // j
+      rx_sig_re[ii][i+dd] = rx_tmp.x*path_loss;
+      rx_sig_im[ii][i+dd] = rx_tmp.y*path_loss;
+      /*
+      if ((ii==0)&&((i%32)==0)) {
+	printf("%p %p %f,%f => %e,%e\n",rx_sig_re[ii],rx_sig_im[ii],rx_tmp.x,rx_tmp.y,rx_sig_re[ii][i-dd],rx_sig_im[ii][i-dd]);
+      }
+      */
+      //rx_sig_re[ii][i] = sqrt(.5)*(tx_sig_re[0][i] + tx_sig_re[1][i]);
+      //rx_sig_im[ii][i] = sqrt(.5)*(tx_sig_im[0][i] + tx_sig_im[1][i]);
+      
+    } // ii
+  } // i
+}
+#endif
+
+
diff --git a/openair1/SIMULATION/TOOLS/random_channel.c b/openair1/SIMULATION/TOOLS/random_channel.c
index b42049f5208..04c7da0d241 100644
--- a/openair1/SIMULATION/TOOLS/random_channel.c
+++ b/openair1/SIMULATION/TOOLS/random_channel.c
@@ -11,24 +11,24 @@
 #include "UTIL/LOG/log.h"
 //#define DEBUG_CH
 
-channel_desc_t *new_channel_desc(u8 nb_tx,
-				 u8 nb_rx, 
-				 u8 nb_taps, 
-				 u8 channel_length, 
-				 double *amps, 
-				 double *delays, 
-				 struct complex** R_sqrt, 
-				 double Td, 
-				 double BW, 
-				 double ricean_factor, 
-				 double aoa, 
-				 double forgetting_factor,
-				 double max_Doppler, 
-				 s32 channel_offset, 
-				 double path_loss_dB,
-				 u8 random_aoa) {
-
-  channel_desc_t *chan_desc = (channel_desc_t *)malloc(sizeof(channel_desc_t));
+void fill_channel_desc(channel_desc_t *chan_desc,
+		       u8 nb_tx,
+		       u8 nb_rx, 
+		       u8 nb_taps, 
+		       u8 channel_length, 
+		       double *amps, 
+		       double *delays, 
+		       struct complex** R_sqrt, 
+		       double Td, 
+		       double BW, 
+		       double ricean_factor, 
+		       double aoa, 
+		       double forgetting_factor,
+		       double max_Doppler, 
+		       s32 channel_offset, 
+		       double path_loss_dB,
+		       u8 random_aoa) {
+  
   u16 i,j;
   double delta_tau;
 
@@ -106,7 +106,11 @@ channel_desc_t *new_channel_desc(u8 nb_tx,
 
   chan_desc->nb_paths=10;
 
-  return(chan_desc);
+  reset_meas(&chan_desc->random_channel);
+  reset_meas(&chan_desc->interp_time);
+  reset_meas(&chan_desc->interp_freq);
+  reset_meas(&chan_desc->convolution);
+
 }
 
 double mbsfn_delays[] = {0,.03,.15,.31,.37,1.09,12.490,12.52,12.64,12.80,12.86,13.58,27.49,27.52,27.64,27.80,27.86,28.58};
@@ -457,22 +461,23 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       aoa = .03;
       maxDoppler = 0;
 
-      chan_desc = new_channel_desc(nb_tx,
-				   nb_rx,
-				   nb_taps,
-				   channel_length,
-				   default_amps_lin,
-				   NULL,
-				   NULL,
-				   Td,
-				   BW,
-				   ricean_factor,
-				   aoa,
-				   forgetting_factor,
-				   maxDoppler,
-				   channel_offset, 
-				   path_loss_dB,
-				   0);
+      fill_channel_desc(chan_desc,
+			nb_tx,
+			nb_rx,
+			nb_taps,
+			channel_length,
+			default_amps_lin,
+			NULL,
+			NULL,
+			Td,
+			BW,
+			ricean_factor,
+			aoa,
+			forgetting_factor,
+			maxDoppler,
+			channel_offset, 
+			path_loss_dB,
+			0);
       break;
 
   case Rice8:
@@ -483,7 +488,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       aoa = .03;
       maxDoppler = 0;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -509,7 +514,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       aoa = .03;
       maxDoppler = 0;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -535,7 +540,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       aoa = .03;
       maxDoppler = 800;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -570,7 +575,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       else
 	R_sqrt_ptr2 = NULL;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -605,7 +610,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       else 
 	R_sqrt_ptr2 = NULL;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -631,7 +636,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       aoa = .03;
       maxDoppler = 0;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -657,7 +662,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       aoa = 0.0;
       maxDoppler = 0;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -694,7 +699,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       else
 	R_sqrt_ptr2 = NULL;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -729,7 +734,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
       else 
 	R_sqrt_ptr2 = NULL;
 
-      chan_desc = new_channel_desc(nb_tx,
+      fill_channel_desc(chan_desc,nb_tx,
 				   nb_rx,
 				   nb_taps,
 				   channel_length,
@@ -762,7 +767,7 @@ channel_desc_t *new_channel_desc_scm(u8 nb_tx,
 }
 
 
-int random_channel(channel_desc_t *desc) {
+int random_channel(channel_desc_t *desc, u8 abstraction_flag) {
 		    
   double s;
   int i,k,l,aarx,aatx;
@@ -774,7 +779,7 @@ int random_channel(channel_desc_t *desc) {
     return(-1);
   }
 
-
+  start_meas(&desc->random_channel);
   for (i=0;i<(int)desc->nb_taps;i++) {
     for (aarx=0;aarx<desc->nb_rx;aarx++) {
       for (aatx=0;aatx<desc->nb_tx;aatx++) {
@@ -862,9 +867,12 @@ int random_channel(channel_desc_t *desc) {
     */
 
   } //nb_taps      
+  stop_meas(&desc->random_channel);
 
   //memset((void *)desc->ch[aarx+(aatx*desc->nb_rx)],0,(int)(desc->channel_length)*sizeof(struct complex));
   
+  if (abstraction_flag==0) {
+  start_meas(&desc->interp_time);
   for (aarx=0;aarx<desc->nb_rx;aarx++) {
     for (aatx=0;aatx<desc->nb_tx;aatx++) {
       if (desc->channel_length == 1) {
@@ -895,6 +903,8 @@ int random_channel(channel_desc_t *desc) {
       } //channel_length
     } //aatx
   } //aarx
+  stop_meas(&desc->interp_time);
+  }
 
   if (desc->first_run==1)
     desc->first_run = 0;
diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index a3f108ee2bb..12b74d5b5dd 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -655,6 +655,18 @@ typedef struct{
   eNB_STATS eNB_stats;
   /// eNB to UE statistics 
   eNB_UE_STATS eNB_UE_stats[NUMBER_OF_UE_MAX];
+  
+  // MAC function execution peformance profiler
+  time_stats_t eNB_scheduler;
+  time_stats_t schedule_si;
+  time_stats_t schedule_ra;
+  time_stats_t schedule_ulsch;
+  time_stats_t fill_DLSCH_dci;
+  time_stats_t schedule_dlsch_preprocessor; 
+  time_stats_t schedule_dlsch; // include rlc_data_req + MAC header + preprocessor
+  time_stats_t schedule_mch;
+  time_stats_t rx_ulsch_sdu; // include rlc_data_ind
+  
 }eNB_MAC_INST;
 
 typedef struct {
@@ -805,6 +817,14 @@ typedef struct{
   uint16_t cba_rnti[NUM_MAX_CBA_GROUP];
   uint8_t cba_last_access[NUM_MAX_CBA_GROUP];
 //#endif
+  
+  time_stats_t ue_scheduler; // total 
+  time_stats_t tx_ulsch_sdu;  // inlcude rlc_data_req + mac header gen
+  time_stats_t rx_dlsch_sdu ; // include mac_rrc_data_ind or mac_rlc_status_ind+mac_rlc_data_ind and  mac header parser
+  time_stats_t ue_query_mch; 
+  time_stats_t rx_mch_sdu; 
+  time_stats_t rx_si; // include mac_rrc_data_ind
+    
 }UE_MAC_INST;
 
 typedef struct {
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index 5f225556406..17f884211f6 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -529,6 +529,8 @@ void rx_sdu(module_id_t enb_mod_idP,frame_t frameP,rnti_t rntiP,u8 *sdu, u16 sdu
   unsigned short rx_lengths[NB_RB_MAX];
   module_id_t         ue_mod_id = find_UE_id(enb_mod_idP,rntiP);
   int ii,j;
+  start_meas(&eNB_mac_inst[enb_mod_idP].rx_ulsch_sdu);
+  
   for(ii=0; ii<NB_RB_MAX; ii++) rx_lengths[ii] = 0;
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,1);
@@ -648,7 +650,7 @@ void rx_sdu(module_id_t enb_mod_idP,frame_t frameP,rnti_t rntiP,u8 *sdu, u16 sdu
   }
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_SDU,0);
-
+  stop_meas(&eNB_mac_inst[enb_mod_idP].rx_ulsch_sdu);
 }
 
 unsigned char generate_dlsch_header(unsigned char *mac_header,
@@ -986,6 +988,8 @@ void add_ue_spec_dci(DCI_PDU *DCI_pdu,void *pdu,rnti_t rnti,unsigned char dci_si
 
 void schedule_SI(module_id_t module_idP,frame_t frameP, unsigned char *nprb,unsigned int *nCCE) {
 
+  start_meas(&eNB_mac_inst[module_idP].schedule_si);
+  
   unsigned char bcch_sdu_length;
   int mcs = -1;
   void *BCCH_alloc_pdu=(void*)&eNB_mac_inst[module_idP].BCCH_alloc_pdu;
@@ -1088,13 +1092,16 @@ void schedule_SI(module_id_t module_idP,frame_t frameP, unsigned char *nprb,unsi
       eNB_mac_inst[module_idP].bcch_active=1;
       *nprb=3;
       *nCCE=4;
-      return;
   }
-  eNB_mac_inst[module_idP].bcch_active=0;
-  *nprb=0;
-  *nCCE=0;
-  //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",module_idP,frameP);
-
+  else {
+    eNB_mac_inst[module_idP].bcch_active=0;
+    *nprb=0;
+    *nCCE=0;
+    //LOG_D(MAC,"[eNB %d] Frame %d : BCCH not active \n",Mod_id,frame);
+  }
+  // this might be misleading when bcch is inactive
+  stop_meas(&eNB_mac_inst[module_idP].schedule_si);
+  return;
 }
 
 #ifdef Rel10
@@ -1588,6 +1595,7 @@ MCH_PDU *get_mch_sdu(uint8_t module_idP,uint32_t frameP, sub_frame_t subframeP)
 // First stage of Random-Access Scheduling
 void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,unsigned char Msg3_subframe,unsigned char *nprb,unsigned int *nCCE) {
 
+  start_meas(&eNB_mac_inst[module_idP].schedule_ra);
   RA_TEMPLATE *RA_template = (RA_TEMPLATE *)&eNB_mac_inst[module_idP].RA_template[0];
   unsigned char i;//,harq_pid,round;
   u16 rrc_sdu_length;
@@ -1942,6 +1950,7 @@ void schedule_RA(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,un
            */
       }
   }
+  stop_meas(&eNB_mac_inst[module_idP].schedule_ra);
 }
 
 // This has to be updated to include BSR information
@@ -1980,10 +1989,9 @@ u8 rb_table[33] = {1,2,3,4,5,6,8,9,10,12,15,16,18,20,24,25,27,30,32,36,40,45,48,
 
 void schedule_ulsch(module_id_t module_idP, frame_t frameP,unsigned char cooperation_flag,sub_frame_t subframeP, unsigned char sched_subframe,unsigned int *nCCE) {//,int calibration_flag) {
 
+  start_meas(&eNB_mac_inst[module_idP].schedule_ulsch);
   u8           granted_UEs;
   unsigned int nCCE_available;
-
-
   u16 first_rb=1,i;
 
   granted_UEs = find_ulgranted_UEs(module_idP);
@@ -2017,6 +2025,7 @@ void schedule_ulsch(module_id_t module_idP, frame_t frameP,unsigned char coopera
   if ((eNB_mac_inst[module_idP].num_active_cba_groups > 0) && (*nCCE == 0))
     schedule_ulsch_cba_rnti(module_idP, cooperation_flag, frameP, subframeP, sched_subframe, granted_UEs, nCCE, &nCCE_available, &first_rb);
 #endif   
+  stop_meas(&eNB_mac_inst[module_idP].schedule_ulsch);
 
 }
 #ifdef CBA
@@ -2660,8 +2669,8 @@ u32 allocate_prbs_sub(int nb_rb, u8 *rballoc) {
 
 
 void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP,u32 RBalloc,u8 RA_scheduled,int mbsfn_flag) {
+  
   // loop over all allocated UEs and compute frequency allocations for PDSCH
-
   module_id_t   ue_mod_id = -1;
   u8            first_rb,nb_rb=3;
   rnti_t        rnti;
@@ -2680,7 +2689,9 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP
 
   if (mbsfn_flag>0)
     return;
-
+  
+  start_meas(&eNB_mac_inst[module_idP].fill_DLSCH_dci);
+  
   // clear vrb_map
   memset(vrb_map,0,100);
 
@@ -3392,6 +3403,7 @@ void fill_DLSCH_dci(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP
 
 
   }
+  stop_meas(&eNB_mac_inst[module_idP].fill_DLSCH_dci);
 }
 
 
@@ -3442,6 +3454,11 @@ void schedule_ue_spec(module_id_t   module_idP,
   int                   mcs;
   u16                   min_rb_unit;
   short                 ta_update        = 0;
+ 
+  if (mbsfn_flag>0)
+    return;
+  
+  reset_meas(&eNB_mac_inst[module_idP].schedule_dlsch);
 
   switch (mac_xface->lte_frame_parms->N_RB_DL) {
   case 6:
@@ -3461,9 +3478,6 @@ void schedule_ue_spec(module_id_t   module_idP,
     break;
   }
 
-  if (mbsfn_flag>0)
-    return;
-
   //int **rballoc_sub = (int **)malloc(1792*sizeof(int *));
   granted_UEs = find_dlgranted_UEs(module_idP);
 
@@ -3505,14 +3519,15 @@ void schedule_ue_spec(module_id_t   module_idP,
 
 
   /// CALLING Pre_Processor for downlink scheduling (Returns estimation of RBs required by each UE and the allocation on sub-band)
+  start_meas(&eNB_mac_inst[module_idP].schedule_dlsch_preprocessor); 
   dlsch_scheduler_pre_processor(module_idP,
-      frameP,
-      subframeP,
-      dl_pow_off,
-      pre_nb_available_rbs,
-      mac_xface->lte_frame_parms->N_RBGS,
-      rballoc_sub_UE);
-
+				frameP,
+				subframeP,
+				dl_pow_off,
+				pre_nb_available_rbs,
+				mac_xface->lte_frame_parms->N_RBGS,
+				rballoc_sub_UE);
+  stop_meas(&eNB_mac_inst[module_idP].schedule_dlsch_preprocessor); 
 
   for (ue_mod_id=0;ue_mod_id<granted_UEs;ue_mod_id++) {
 
@@ -3596,11 +3611,13 @@ void schedule_ue_spec(module_id_t   module_idP,
       if (eNB_UE_stats==NULL)
         mac_xface->macphy_exit("[MAC][eNB] Cannot find eNB_UE_stats\n");
 
-      //eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs;
-      // int flag_LA=0;
-      //printf("CQI %d\n",eNB_UE_stats->DL_cqi[0]);
-
-      eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]];
+      if (openair_daq_vars.target_ue_dl_mcs <= 0) {
+	eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]];
+	LOG_T(MAC,"CQI %d\n",eNB_UE_stats->DL_cqi[0]);
+      }
+      else 
+	eNB_UE_stats->dlsch_mcs1 = openair_daq_vars.target_ue_dl_mcs;
+      
 
       if(eNB_UE_stats->dlsch_mcs1>22)
         eNB_UE_stats->dlsch_mcs1=22;
@@ -4285,10 +4302,12 @@ void schedule_ue_spec(module_id_t   module_idP,
       }
       //printf("MAC nCCE : %d\n",*nCCE_used);
   }
+  stop_meas(&eNB_mac_inst[module_idP].schedule_dlsch);
 }
 
 void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,u8 cooperation_flag, frame_t frameP, sub_frame_t subframeP) {//, int calibration_flag) {
-
+ 
+  start_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
   unsigned char nprb=0;
   unsigned int nCCE=0;
   int mbsfn_status=0;
@@ -4411,8 +4430,9 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,u8 cooperation_flag, frame
 
 #ifdef Rel10
   if (eNB_mac_inst[module_idP].MBMS_flag >0) {
-
+    start_meas(&eNB_mac_inst[module_idP].schedule_mch);
       mbsfn_status = schedule_MBMS(module_idP,frameP,subframeP);
+    stop_meas(&eNB_mac_inst[module_idP].schedule_mch);
   }
 #endif
 
@@ -4688,4 +4708,6 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,u8 cooperation_flag, frame
   LOG_D(MAC,"frameP %d, subframeP %d nCCE %d\n",frameP,subframeP,nCCE);
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_ULSCH_SCHEDULER,0);
+  stop_meas(&eNB_mac_inst[module_idP].eNB_scheduler);
+  
 }
diff --git a/openair2/LAYER2/MAC/rar_tools.c b/openair2/LAYER2/MAC/rar_tools.c
index 70f20446d78..ebe7d4a89b9 100644
--- a/openair2/LAYER2/MAC/rar_tools.c
+++ b/openair2/LAYER2/MAC/rar_tools.c
@@ -106,7 +106,7 @@ unsigned short fill_rar(module_id_t module_idP,
   rar[2] |= ((mcs&0x8)>>3);  // mcs 10
   rar[3] = (((mcs&0x7)<<5)) | ((TPC&7)<<2) | ((ULdelay&1)<<1) | (cqireq&1); 
 
-  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",module_idP,frame,
+  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Generating RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for ra_idx %d, CRNTI %x,preamble %d/%d,TIMING OFFSET %d\n",module_idP,frameP,
       *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5],
       ra_idx,
       eNB_mac_inst[module_idP].RA_template[ra_idx].rnti,
@@ -118,7 +118,7 @@ unsigned short fill_rar(module_id_t module_idP,
       trace_pdu(1, dlsch_buffer, input_buffer_length, module_idP, 2, 1,
           eNB_mac_inst[module_idP].subframe, 0, 0);
       LOG_I(OPT,"[eNB %d][RAPROC] RAR Frame %d trace pdu for rnti %x and  rapid %d size %d\n",
-          module_idP, frame, eNB_mac_inst[module_idP].RA_template[ra_idx].rnti,
+          module_idP, frameP, eNB_mac_inst[module_idP].RA_template[ra_idx].rnti,
           rarh->RAPID, input_buffer_length);
   } 
 #endif 
@@ -131,7 +131,7 @@ uint16_t ue_process_rar(module_id_t module_idP, frame_t frameP, u8 *dlsch_buffer
   //  RAR_PDU *rar = (RAR_PDU *)(dlsch_buffer+1);
   uint8_t *rar = (uint8_t *)(dlsch_buffer+1);
 
-  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",module_idP,frame,
+  LOG_I(MAC,"[eNB %d][RAPROC] Frame %d Received RAR (%02x|%02x.%02x.%02x.%02x.%02x.%02x) for preamble %d/%d\n",module_idP,frameP,
       *(uint8_t*)rarh,rar[0],rar[1],rar[2],rar[3],rar[4],rar[5],
       rarh->RAPID,preamble_index);
 #ifdef DEBUG_RAR
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index afe7ad30592..d85a6f112b5 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -274,6 +274,7 @@ void ue_send_sdu(module_id_t module_idP,frame_t frameP,u8 *sdu,u16 sdu_len,u8 eN
   unsigned short rx_lengths[NB_RB_MAX];
   unsigned char *tx_sdu;
 
+  start_meas(&UE_mac_inst[module_idP].rx_dlsch_sdu);
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_IN);
 
   LOG_T(MAC,"sdu: %x.%x.%x\n",sdu[0],sdu[1],sdu[2]);
@@ -412,10 +413,12 @@ void ue_send_sdu(module_id_t module_idP,frame_t frameP,u8 *sdu,u16 sdu_len,u8 eN
       payload_ptr+= rx_lengths[i];
   }
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_SDU, VCD_FUNCTION_OUT);
+  stop_meas(&UE_mac_inst[module_idP].rx_dlsch_sdu);
 }
 
 void ue_decode_si(module_id_t module_idP,frame_t frameP, u8 eNB_index, void *pdu,u16 len) {
 
+  start_meas(&UE_mac_inst[module_idP].rx_si);
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_IN);
 
   LOG_D(MAC,"[UE %d] Frame %d Sending SI to RRC (LCID Id %d,len %d)\n",module_idP,frameP,BCCH,len);
@@ -429,6 +432,7 @@ void ue_decode_si(module_id_t module_idP,frame_t frameP, u8 eNB_index, void *pdu
       eNB_index,
       0);
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_DECODE_SI, VCD_FUNCTION_OUT);
+  stop_meas(&UE_mac_inst[module_idP].rx_si);
 }
 
 #ifdef Rel10
@@ -484,7 +488,9 @@ void ue_send_mch_sdu(module_id_t module_idP, frame_t frameP, u8 *sdu, u16 sdu_le
   unsigned char rx_lcids[NB_RB_MAX]; 
   unsigned short rx_lengths[NB_RB_MAX];
 
-  //  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_IN);
+  start_meas(&UE_mac_inst[module_idP].rx_mch_sdu); 
+  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_IN);
+  
   LOG_D(MAC,"[UE %d] Frame %d : process the mch PDU for sync area %d \n",module_idP,frameP, sync_area);
   LOG_D(MAC,"[UE %d] sdu: %x.%x\n", module_idP,sdu[0], sdu[1]);
   LOG_D(MAC,"[UE %d] parse_mch_header, demultiplex\n",module_idP);
@@ -534,7 +540,8 @@ void ue_send_mch_sdu(module_id_t module_idP, frame_t frameP, u8 *sdu, u16 sdu_le
       payload_ptr += rx_lengths[i];
   }
 
-  //  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_OUT);
+  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU, VCD_FUNCTION_OUT);
+  stop_meas(&UE_mac_inst[module_idP].rx_mch_sdu); 
 }
 
 s8 ue_get_mbsfn_sf_alloction (module_id_t module_idP, u8 mbsfn_sync_area, unsigned char eNB_index){
@@ -558,7 +565,9 @@ int ue_query_mch(module_id_t module_idP, uint32_t frameP, uint32_t subframe, uin
   int mbsfn_period = 0;// 1<<(UE_mac_inst[module_idP].mbsfn_SubframeConfig[0]->radioframeAllocationPeriod);
   int mcch_period = 0;// 32<<(UE_mac_inst[module_idP].mbsfn_AreaInfo[0]->mcch_Config_r9.mcch_RepetitionPeriod_r9);
   int mch_scheduling_period = -1;
-
+ 
+  start_meas(&UE_mac_inst[module_idP].ue_query_mch); 
+  
   if (UE_mac_inst[module_idP].pmch_Config[0])
     mch_scheduling_period = 8<<(UE_mac_inst[module_idP].pmch_Config[0]->mch_SchedulingPeriod_r9);
 
@@ -757,6 +766,8 @@ int ue_query_mch(module_id_t module_idP, uint32_t frameP, uint32_t subframe, uin
       }
   } // end of for
 
+  stop_meas(&UE_mac_inst[module_idP].ue_query_mch); 
+
   if ( (mcch_flag==1))// || (msi_flag==1))
     *mcch_active=1;
 
@@ -1035,6 +1046,7 @@ void ue_get_sdu(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 e
   int j; // used for padding
   // Compute header length
 
+  start_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu);
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_IN);
 
 #ifdef CBA
@@ -1263,6 +1275,7 @@ void ue_get_sdu(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 e
   UE_mac_inst[module_idP].scheduling_info.SR_pending=0;
   UE_mac_inst[module_idP].scheduling_info.SR_COUNTER=0;
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SDU, VCD_FUNCTION_OUT);
+    stop_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu);
 }
 
 // called at each subframe
@@ -1272,8 +1285,6 @@ void ue_get_sdu(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, u8 e
 // 3. Perform SR/BSR procedures for scheduling feedback
 // 4. Perform PHR procedures
 
-
-
 UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP, lte_subframe_t directionP,u8 eNB_indexP) {
 
   int lcid; // lcid index
@@ -1292,7 +1303,7 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
   instance_t    instance;
   int           result;
 #endif
-
+  start_meas(&UE_mac_inst[module_idP].ue_scheduler); 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_IN);
 
 #if defined(ENABLE_ITTI)
@@ -1329,37 +1340,11 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
   //Rrc_xface->Frame_index=Mac_rlc_xface->frameP;
   //if (subframe%5 == 0)
 #ifdef EXMIMO
-  pdcp_run(frameP, 0, module_idP, eNB_index);
-  /*
-  ret = pthread_mutex_trylock (&pdcp_mutex);
-  if (ret != 0) {
-    if (ret==EBUSY)
-      LOG_E(PDCP,"Mutex busy\n");
-    else
-      LOG_E(PDCP,"Cannot lock mutex\n");
-    //return(-1);
-  }
-  else {
-    pdcp_instance_cnt++;
-    pthread_mutex_unlock(&pdcp_mutex);
-
-    if (pdcp_instance_cnt == 0) {
-      if (pthread_cond_signal(&pdcp_cond) != 0) {
-	LOG_E(PDCP,"pthread_cond_signal unsuccessfull\n");
-	//return(-1);
-      }
-    }
-    else {
-      LOG_W(PDCP,"PDCP thread busy!!! inst_cnt=%d\n",pdcp_instance_cnt);
-    }
-  }
-   */
+  pdcp_run(frameP, 0, module_idP, eNB_indexP);
 #endif 
   UE_mac_inst[module_idP].frame = frameP;
   UE_mac_inst[module_idP].subframe = subframeP;
 
-
-
 #ifdef CELLULAR
   rrc_rx_tx(module_idP, frameP, 0, eNB_indexP);
 #else
@@ -1371,10 +1356,14 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
     break;
   case RRC_ConnSetup_failed:
     LOG_E(MAC,"RRCConnectionSetup failed, returning to IDLE state\n");
+    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
+    stop_meas(&UE_mac_inst[module_idP].ue_scheduler); 
     return(CONNECTION_LOST);
     break;
   case RRC_PHY_RESYNCH:
     LOG_E(MAC,"RRC Loss of synch, returning PHY_RESYNCH\n");
+    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
+    stop_meas(&UE_mac_inst[module_idP].ue_scheduler); 
     return(PHY_RESYNCH);
   case RRC_Handover_failed:
     LOG_N(MAC,"Handover failure for UE %d eNB_index %d\n",module_idP,eNB_indexP);
@@ -1384,6 +1373,8 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
     break;
   case RRC_HO_STARTED:
     LOG_I(MAC,"RRC handover, Instruct PHY to start the contention-free PRACH and synchronization\n");
+    vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
+    stop_meas(&UE_mac_inst[module_idP].ue_scheduler); 
     return(PHY_HO_PRACH);
   default:
     break;
@@ -1397,9 +1388,10 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
         rach_ConfigCommon = &UE_mac_inst[module_idP].radioResourceConfigCommon->rach_ConfigCommon;
       else {
           LOG_E(MAC,"FATAL: radioResourceConfigCommon is NULL!!!\n");
-          mac_xface->macphy_exit("");
-          vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
-          return(RRC_OK);
+	  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
+	  stop_meas(&UE_mac_inst[module_idP].ue_scheduler); 
+	  mac_xface->macphy_exit("");
+	  //return(RRC_OK);
       }
 
       LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",frameP,UE_mac_inst[module_idP].RA_contention_resolution_cnt,
@@ -1454,6 +1446,7 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
       UE_mac_inst[module_idP].ul_active=0;
       LOG_T(MAC,"[UE %d] Release all SRs \n", module_idP);
       vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
+      stop_meas(&UE_mac_inst[module_idP].ue_scheduler); 
       return(CONNECTION_OK);
   }
 
@@ -1494,6 +1487,7 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
   }
   //If the UE has UL resources allocated for new transmission for this TTI here:
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_OUT);
+  stop_meas(&UE_mac_inst[module_idP].ue_scheduler); 
   return(CONNECTION_OK);
 }
 
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
index 8f427b47a41..5cdfdd9c9f5 100755
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.c
@@ -88,6 +88,7 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
   u16                current_sn      = 0;
   mem_block_t       *pdcp_pdu_p      = NULL;
   rlc_op_status_t    rlc_status;
+  boolean_t          ret=TRUE;
 
   AssertError (enb_mod_idP < NUMBER_OF_eNB_MAX, return FALSE, "eNB id is too high (%u/%d) %u %u!\n", enb_mod_idP, NUMBER_OF_eNB_MAX, ue_mod_idP, rb_idP);
   AssertError (ue_mod_idP < NUMBER_OF_UE_MAX, return FALSE, "UE id is too high (%u/%d) %u %u!\n", ue_mod_idP, NUMBER_OF_UE_MAX, enb_mod_idP, rb_idP);
@@ -123,7 +124,12 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
       // XXX What does following call do?
       mac_xface->macphy_exit("PDCP sdu buffer size > MAX_IP_PACKET_SIZE");
   }
-
+ 
+  if (enb_flagP == 0) 
+    start_meas(&eNB_pdcp_stats[enb_mod_idP].data_req);
+  else 
+    start_meas(&UE_pdcp_stats[ue_mod_idP].data_req);
+ 
   // PDCP transparent mode for MBMS traffic 
 
   if (modeP == PDCP_TM) {
@@ -183,7 +189,11 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
               memset(&pdu_header.mac_i[0],0,PDCP_CONTROL_PLANE_DATA_PDU_MAC_I_SIZE);
               if (pdcp_serialize_control_plane_data_pdu_with_SRB_sn_buffer((unsigned char*)pdcp_pdu_p->data, &pdu_header) == FALSE) {
                   LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n");
-                  return FALSE;
+		  if (enb_flagP == 0) 
+		    stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req);
+		  else 
+		    stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req);
+		  return FALSE;
               }
           } else {
               pdcp_user_plane_data_pdu_header_with_long_sn pdu_header;
@@ -192,7 +202,11 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
               current_sn = pdu_header.sn ;
               if (pdcp_serialize_user_plane_data_pdu_with_long_sn_buffer((unsigned char*)pdcp_pdu_p->data, &pdu_header) == FALSE) {
                   LOG_E(PDCP, "Cannot fill PDU buffer with relevant header fields!\n");
-                  return FALSE;
+		  if (enb_flagP == 0) 
+		    stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req);
+		  else 
+		    stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req);
+		  return FALSE;
               }
           }
           /*
@@ -203,6 +217,10 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
               LOG_E(PDCP, "There must be a problem with PDCP initialization, ignoring this PDU...\n");
 
               free_mem_block(pdcp_pdu_p);
+	      if (enb_flagP == 0) 
+		stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req);
+	      else 
+		stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req);
               return FALSE;
           }
 
@@ -234,6 +252,10 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
           //util_flush_hex_octets(PDCP, (unsigned char*)pdcp_pdu->data, pdcp_pdu_size);
       } else {
           LOG_E(PDCP, "Cannot create a mem_block for a PDU!\n");
+	  if (enb_flagP == 0) 
+	    stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req);
+	  else 
+	    stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req);
 #if defined(STOP_ON_IP_TRAFFIC_OVERLOAD)
         AssertFatal(0, "[FRAME %5u][%s][PDCP][MOD %u/%u][RB %u] PDCP_DATA_REQ SDU DROPPED, OUT OF MEMORY \n",
             frameP,
@@ -253,25 +275,32 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
   switch (rlc_status) {
   case RLC_OP_STATUS_OK:
     LOG_D(PDCP, "Data sending request over RLC succeeded!\n");
+    ret=TRUE;
     break;
 
   case RLC_OP_STATUS_BAD_PARAMETER:
     LOG_W(PDCP, "Data sending request over RLC failed with 'Bad Parameter' reason!\n");
-    return FALSE;
-
+    ret= FALSE;
+    break;
   case RLC_OP_STATUS_INTERNAL_ERROR:
     LOG_W(PDCP, "Data sending request over RLC failed with 'Internal Error' reason!\n");
-    return FALSE;
+    ret= FALSE;
+    break;
 
   case RLC_OP_STATUS_OUT_OF_RESSOURCES:
     LOG_W(PDCP, "Data sending request over RLC failed with 'Out of Resources' reason!\n");
-    return FALSE;
+    ret= FALSE;
+    break;
 
   default:
     LOG_W(PDCP, "RLC returned an unknown status code after PDCP placed the order to send some data (Status Code:%d)\n", rlc_status);
-    return FALSE;
+    ret= FALSE;
+    break;
   }
-
+  if (enb_flagP == 0) 
+    stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_req);
+  else 
+    stop_meas(&UE_pdcp_stats[ue_mod_idP].data_req);
   /*
    * Control arrives here only if rlc_data_req() returns RLC_OP_STATUS_OK
    * so we return TRUE afterwards
@@ -286,7 +315,7 @@ boolean_t pdcp_data_req(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
       Pdcp_stats_tx_bytes[module_id][(rb_id & RAB_OFFSET2 )>> RAB_SHIFT2][(rb_id & RAB_OFFSET)-DTCH] += sdu_buffer_size;
     }
     }*/
-  return TRUE;
+  return ret;
 
 }
 
@@ -303,6 +332,11 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
   pdcp_sn_t    sequence_number = 0;
   u8           payload_offset  = 0;
 
+  if (enb_flagP)
+    start_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind);
+  else 
+    start_meas(&UE_pdcp_stats[ue_mod_idP].data_ind);
+
   AssertFatal (enb_mod_idP >= oai_emulation.info.first_enb_local,
       "eNB inst is too low (%u/%d)!\n",
       enb_mod_idP,
@@ -335,10 +369,14 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
           enb_mod_idP, ue_mod_idP, rb_idP, sdu_buffer_sizeP, enb_flagP, enb_mod_idP);
   }
   sdu_list_p = &pdcp_sdu_list;
-#
+
 
   if (sdu_buffer_sizeP == 0) {
       LOG_W(PDCP, "SDU buffer size is zero! Ignoring this chunk!\n");
+      if (enb_flagP)
+	stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind);
+      else 
+	stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind);
       return FALSE;
   }
 
@@ -357,7 +395,11 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
       if (sdu_buffer_sizeP < pdcp_header_len + pdcp_tailer_len ) {
           LOG_W(PDCP, "Incoming (from RLC) SDU is short of size (size:%d)! Ignoring...\n", sdu_buffer_sizeP);
           free_mem_block(sdu_buffer_pP);
-          return FALSE;
+	  if (enb_flagP)
+	    stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind);
+	  else 
+	    stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind);
+	  return FALSE;
       }
 
       /*
@@ -410,7 +452,11 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
               (u8*)&sdu_buffer_pP->data[pdcp_header_len]);
           free_mem_block(sdu_buffer_pP);
           // free_mem_block(new_sdu);
-          return TRUE;
+          if (enb_flagP)
+	    stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind);
+	  else 
+	    stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind);
+	  return TRUE;
       }
       payload_offset=PDCP_USER_PLANE_DATA_PDU_LONG_SN_HEADER_SIZE;
 #if defined(ENABLE_SECURITY)
@@ -437,13 +483,21 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
       if (otg_rx_pkt(src_id, dst_id,ctime,&sdu_buffer_pP->data[payload_offset],
           sdu_buffer_sizeP - payload_offset ) == 0 ) {
           free_mem_block(sdu_buffer_pP);
-          return TRUE;
+           if (enb_flagP)
+	     stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind);
+	   else 
+	     stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind);
+	  return TRUE;
       }
   }
 #else
   if (otg_enabled==1) {
       LOG_D(OTG,"Discarding received packed\n");
       free_mem_block(sdu_buffer_pP);
+      if (enb_flagP)
+	stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind);
+      else 
+	stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind);
       return TRUE;
   }
 #endif
@@ -516,7 +570,10 @@ boolean_t pdcp_data_ind(module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
 #endif
 
   free_mem_block(sdu_buffer_pP);
-
+  if (enb_flagP)
+    stop_meas(&eNB_pdcp_stats[enb_mod_idP].data_ind);
+  else 
+    stop_meas(&UE_pdcp_stats[ue_mod_idP].data_ind);
   return TRUE;
 }
 
@@ -529,6 +586,10 @@ void pdcp_run (frame_t frameP, eNB_flag_t  enb_flagP, module_id_t ue_mod_idP, mo
   instance_t    instance;
   int           result;
 #endif
+  if (enb_flagP)
+    start_meas(&eNB_pdcp_stats[enb_mod_idP].pdcp_run);
+  else 
+    start_meas(&UE_pdcp_stats[ue_mod_idP].pdcp_run);
 
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_IN);
 
@@ -602,7 +663,12 @@ void pdcp_run (frame_t frameP, eNB_flag_t  enb_flagP, module_id_t ue_mod_idP, mo
   // PDCP -> NAS/IP traffic: RX
   pdcp_fifo_flush_sdus(frameP, enb_flagP, enb_mod_idP, ue_mod_idP);
 
-  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_OUT);
+  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDCP_RUN, VCD_FUNCTION_OUT); 
+  if (enb_flagP)
+    stop_meas(&eNB_pdcp_stats[enb_mod_idP].pdcp_run);
+  else 
+    stop_meas(&UE_pdcp_stats[ue_mod_idP].pdcp_run);
+
 }
 
 boolean_t rrc_pdcp_config_asn1_req (module_id_t               enb_mod_idP,
diff --git a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
index 4393438cf6b..7e6cb20af7f 100755
--- a/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
+++ b/openair2/LAYER2/PDCP_v10.1.0/pdcp.h
@@ -102,6 +102,18 @@ public_pdcp(unsigned int Pdcp_stats_rx_bytes[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_M
 public_pdcp(unsigned int Pdcp_stats_rx_bytes_last[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
 public_pdcp(unsigned int Pdcp_stats_rx_rate[NB_MODULES_MAX][NB_CNX_CH][NB_RAB_MAX]);
 
+typedef struct pdcp_stats_t {
+  time_stats_t pdcp_run;
+  time_stats_t data_req;
+  time_stats_t data_ind;
+  time_stats_t encrption;
+  time_stats_t decrption;
+  time_stats_t pdcp_ip;
+  time_stats_t ip_pdcp;
+
+}pdcp_stats_t; // common to eNB and UE
+
+
 typedef struct pdcp_t {
   boolean_t instanciated_instance;
   u16       header_compression_profile;
@@ -384,6 +396,8 @@ typedef struct pdcp_missing_pdu_info_t {
 #define PDCP_MAX_SN_12BIT 4095 // 2^12-1
 
 protected_pdcp(signed int             pdcp_2_nas_irq;)
+public_pdcp(pdcp_stats_t           UE_pdcp_stats[NUMBER_OF_UE_MAX];)
+public_pdcp(pdcp_stats_t           eNB_pdcp_stats[NUMBER_OF_eNB_MAX];)
 protected_pdcp(pdcp_t                 pdcp_array_ue[NUMBER_OF_UE_MAX][NB_RB_MAX];)
 protected_pdcp(pdcp_t                 pdcp_array_eNB[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][NB_RB_MAX];)
 #if defined(Rel10)
diff --git a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
index ffd19b260fd..4686ae59b19 100755
--- a/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
+++ b/openair2/LAYER2/RLC/UM_v9.3.0/rlc_um_control_primitives.c
@@ -59,7 +59,7 @@ void config_req_rlc_um (frame_t         frameP,
       rlc_p = &rlc_array_ue[ue_module_idP][rb_idP].rlc.um;
   }
   LOG_D(RLC, "[FRAME %05d][%s][RRC][MOD %u/%u][][--- CONFIG_REQ timer_reordering=%d sn_field_length=%d is_mXch=%d --->][RLC_UM][MOD %u/%u][RB %u]    \n",
-      frame,
+      frameP,
       (eNB_flagP) ? "eNB" : "UE",
           enb_module_idP,
           ue_module_idP,
@@ -72,9 +72,9 @@ void config_req_rlc_um (frame_t         frameP,
 
   rlc_um_init(rlc_p);
   if (rlc_um_fsm_notify_event (rlc_p, RLC_UM_RECEIVE_CRLC_CONFIG_REQ_ENTER_DATA_TRANSFER_READY_STATE_EVENT)) {
-      rlc_um_set_debug_infos(rlc_p, frame, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP);
+      rlc_um_set_debug_infos(rlc_p, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP);
       rlc_um_configure(rlc_p,
-          frame,
+          frameP,
           config_um_pP->timer_reordering,
           config_um_pP->sn_field_length,
           config_um_pP->sn_field_length,
@@ -120,7 +120,7 @@ void config_req_rlc_um_asn1 (frame_t            frameP,
 
   //-----------------------------------------------------------------------------
   LOG_D(RLC, "[FRAME %05d][%s][RRC][MOD %u/%u][][--- CONFIG_REQ timer_reordering=%dms sn_field_length=  --->][RLC_UM][MOD %u/%u][RB %u]    \n",
-      frame,
+      frameP,
       (eNB_flagP) ? "eNB" : "UE",
           enb_module_idP,
           ue_module_idP,
@@ -131,7 +131,7 @@ void config_req_rlc_um_asn1 (frame_t            frameP,
 
   rlc_um_init(rlc_p);
   if (rlc_um_fsm_notify_event (rlc_p, RLC_UM_RECEIVE_CRLC_CONFIG_REQ_ENTER_DATA_TRANSFER_READY_STATE_EVENT)) {
-      rlc_um_set_debug_infos(rlc_p, frame, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP);
+      rlc_um_set_debug_infos(rlc_p, frameP, eNB_flagP, enb_module_idP, ue_module_idP, rb_idP, rb_typeP);
       if (ul_rlc_pP != NULL) {
           switch (ul_rlc_pP->sn_FieldLength) {
           case SN_FieldLength_size5:
@@ -142,7 +142,7 @@ void config_req_rlc_um_asn1 (frame_t            frameP,
             break;
           default:
             LOG_E(RLC,"[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID Uplink sn_FieldLength %d, RLC NOT CONFIGURED\n",
-                frame,
+                frameP,
                 (rlc_p->is_enb) ? "eNB" : "UE",
                     rlc_p->enb_module_id,
                     rlc_p->ue_module_id,
@@ -162,7 +162,7 @@ void config_req_rlc_um_asn1 (frame_t            frameP,
             break;
           default:
             LOG_E(RLC,"[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID Downlink sn_FieldLength %d, RLC NOT CONFIGURED\n",
-                frame,
+                frameP,
                 (rlc_p->is_enb) ? "eNB" : "UE",
                     rlc_p->enb_module_id,
                     rlc_p->ue_module_id,
@@ -174,7 +174,7 @@ void config_req_rlc_um_asn1 (frame_t            frameP,
               t_Reordering = t_Reordering_tab[dl_rlc_pP->t_Reordering];
           } else {
               LOG_E(RLC,"[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID T_Reordering %d, RLC NOT CONFIGURED\n",
-                  frame,
+                  frameP,
                   (rlc_p->is_enb) ? "eNB" : "UE",
                       rlc_p->enb_module_id,
                       rlc_p->ue_module_id,
@@ -185,14 +185,14 @@ void config_req_rlc_um_asn1 (frame_t            frameP,
       }
       if (eNB_flagP > 0) {
           rlc_um_configure(rlc_p,
-              frame,
+              frameP,
               t_Reordering,
               ul_sn_FieldLength,
               dl_sn_FieldLength,
               mbms_flagP);
       } else {
           rlc_um_configure(rlc_p,
-              frame,
+              frameP,
               t_Reordering,
               dl_sn_FieldLength,
               ul_sn_FieldLength,
@@ -321,7 +321,7 @@ void rlc_um_configure(rlc_um_entity_t *rlc_pP,
       rlc_pP->rx_header_min_length_in_bytes = 1;
   } else if (rx_sn_field_lengthP != 0) {
       LOG_E(RLC, "[FRAME %05d][%s][RLC_UM][MOD %u/%u][RB %u][CONFIGURE] INVALID RX SN LENGTH %d BITS NOT IMPLEMENTED YET, RLC NOT CONFIGURED\n",
-          frame,
+          frameP,
           (rlc_pP->is_enb) ? "eNB" : "UE",
               rlc_pP->enb_module_id,
               rlc_pP->ue_module_id,
@@ -342,7 +342,7 @@ void rlc_um_configure(rlc_um_entity_t *rlc_pP,
       rlc_pP->tx_header_min_length_in_bytes = 1;
   } else if (tx_sn_field_lengthP != 0) {
       LOG_E(RLC, "[FRAME %05d][%s][RLC_UM][MOD %02d/%02][RB %u][CONFIGURE] INVALID RX SN LENGTH %d BITS NOT IMPLEMENTED YET, RLC NOT CONFIGURED\n",
-          frame,
+          frameP,
           (rlc_pP->is_enb) ? "eNB" : "UE",
               rlc_pP->enb_module_id,
               rlc_pP->ue_module_id,
@@ -378,7 +378,7 @@ void rlc_um_set_debug_infos(rlc_um_entity_t *rlc_pP,
 //-----------------------------------------------------------------------------
 {
   LOG_D(RLC, "[FRAME %05d][%s][RLC_UM][SET DEBUG INFOS] enb_module_id %u ue_module_id %u rb_id %d rb_type %d\n",
-      frame,
+      frameP,
       (rlc_pP->is_enb) ? "eNB" : "UE",
           eNB_flagP,
           enb_module_idP,
diff --git a/openair2/LAYER2/RLC/rlc.c b/openair2/LAYER2/RLC/rlc.c
index 471710ab08c..8863e5f3647 100644
--- a/openair2/LAYER2/RLC/rlc.c
+++ b/openair2/LAYER2/RLC/rlc.c
@@ -436,7 +436,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
 
   if (MBMS_flagP == 0) {
       LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][RB %u] Display of rlc_data_req:\n",
-          frame,
+          frameP,
           (eNB_flagP) ? "eNB" : "UE",
           enb_mod_idP,
           ue_mod_idP,
@@ -476,7 +476,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
 
                   if (((rlc_am_entity_t*)rlc_p)->is_data_plane) {
                       LOG_D(RLC, "[FRAME %5u][%s][PDCP][INST %u/%u][RB %u][--- RLC_AM_DATA_REQ/%d Bytes --->][RLC_AM][INST %u/%u][RB %u]\n",
-                          frame,
+                          frameP,
                           (eNB_flagP) ? "eNB" : "UE",
                           enb_mod_idP,
                           ue_mod_idP,
@@ -487,7 +487,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                           rb_idP);
                   } else {
                       LOG_D(RLC, "[FRAME %5u][%s][RRC][INST %u/%u][][--- RLC_AM_DATA_REQ/%d Bytes --->][RLC_AM][INST %u/%u][RB %u]\n",
-                          frame,
+                          frameP,
                           (eNB_flagP) ? "eNB" : "UE",
                           enb_mod_idP,
                           ue_mod_idP,
@@ -498,7 +498,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                           rb_idP);
                   }
                   LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
-                  rlc_am_data_req((rlc_am_entity_t*)rlc_p, frame, new_sdu_p);
+                  rlc_am_data_req((rlc_am_entity_t*)rlc_p, frameP, new_sdu_p);
                   return RLC_OP_STATUS_OK;
               } else {
                   return RLC_OP_STATUS_INTERNAL_ERROR;
@@ -520,7 +520,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                   LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
                   if (((rlc_am_entity_t*)rlc_p)->is_data_plane) {
                       LOG_D(RLC, "[FRAME %5u][%s][PDCP][INST %u/%u][RB %u][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][RB %u]\n",
-                          frame,
+                          frameP,
                           (eNB_flagP) ? "eNB" : "UE",
                           enb_mod_idP,
                           ue_mod_idP,
@@ -531,7 +531,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                           rb_idP);
                   } else {
                       LOG_D(RLC, "[FRAME %5u][%s][RRC][INST %u/%u][][--- RLC_UM_DATA_REQ/%d Bytes --->][RLC_UM][INST %u/%u][RB %u]\n",
-                                     frame,
+                                     frameP,
                                      (eNB_flagP) ? "eNB" : "UE",
                                      enb_mod_idP,
                                      ue_mod_idP,
@@ -542,7 +542,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                                      rb_idP);
                   }
                   LOG_D(RLC, "%s\n",RLC_FG_COLOR_DEFAULT);
-                  rlc_um_data_req((rlc_um_entity_t*)rlc_p, frame, new_sdu_p);
+                  rlc_um_data_req((rlc_um_entity_t*)rlc_p, frameP, new_sdu_p);
 
                   //free_mem_block(new_sdu);
                   return RLC_OP_STATUS_OK;
@@ -565,7 +565,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                   LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
                   if (((rlc_tm_entity_t*)rlc_p)->is_data_plane) {
                       LOG_D(RLC, "[FRAME %5u][%s][PDCP][INST %u/%u][RB %u][--- RLC_TM_DATA_REQ/%d Bytes --->][RLC_TM][INST %u/%u][RB %u]\n",
-                                 frame,
+                                 frameP,
                                  (eNB_flagP) ? "eNB" : "UE",
                                  enb_mod_idP,
                                  ue_mod_idP,
@@ -576,7 +576,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                                  rb_idP);
                   } else {
                        LOG_D(RLC, "[FRAME %5u][%s][RRC][INST %u/%u][][--- RLC_TM_DATA_REQ/%d Bytes --->][RLC_TM][INST %u/%u][RB %u]\n",
-                                     frame,
+                                     frameP,
                                      (eNB_flagP) ? "eNB" : "UE",
                                      enb_mod_idP,
                                      ue_mod_idP,
@@ -626,7 +626,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                       LOG_D(RLC, "%s\n",RLC_FG_BRIGHT_COLOR_RED);
                       if (rlc_um_p->is_data_plane) {
                           LOG_D(RLC, "[FRAME %5u][PDCP][INST %u/%u][RB %u][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][INST %u/%u][RB %u]\n",
-                            frame,
+                            frameP,
                             enb_mod_idP,
                             ue_mod_idP,
                             rb_idP,
@@ -639,7 +639,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                       } else {
                           if (eNB_flagP) {
                               LOG_D(RLC, "[FRAME %5u][RRC_eNB][INST %u/%u][][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][INST %u/%u][RB %u]\n",
-                                 frame,
+                                 frameP,
                                  enb_mod_idP,
                                  ue_mod_idP,
                                  rb_idP,
@@ -650,7 +650,7 @@ rlc_op_status_t rlc_data_req     (module_id_t  enb_mod_idP,
                                  mbms_rb_id);
                           } else {
                               LOG_D(RLC, "[FRAME %5u][RRC_UE][INST %u/%u][][--- RLC_UM_DATA_REQ/%d Bytes (MBMS) --->][RLC_UM][INST %u/%u][RB %u]\n",
-                                 frame,
+                                 frameP,
                                  enb_mod_idP,
                                  ue_mod_idP,
                                  rb_idP,
@@ -701,7 +701,7 @@ void rlc_data_ind     (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
   }
 
   LOG_D(RLC, "[FRAME %5u][%s][RLC][INST %u/%u][RB %u] Display of rlc_data_ind: size %u\n",
-        frame,
+        frameP,
         (eNB_flagP) ? "eNB" : "UE",
         enb_mod_idP,
         ue_mod_idP,
@@ -718,7 +718,7 @@ void rlc_data_ind     (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
         break;
       case RLC_MODE_AM:
           LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][INST %u/%u][RB %u][--- RLC_DATA_IND/%d Bytes --->][PDCP][INST %u/%u][RB %u]\n",
-                   frame,
+                   frameP,
                    (eNB_flagP) ? "eNB" : "UE",
                    enb_mod_idP,
                    ue_mod_idP,
@@ -730,7 +730,7 @@ void rlc_data_ind     (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
           break;
       case RLC_MODE_UM:
           LOG_D(RLC, "[FRAME %5u][%s][RLC_UM][INST %u/%u][RB %u][--- RLC_DATA_IND/%d Bytes --->][PDCP][INST %u/%u][RB %u]\n",
-                   frame,
+                   frameP,
                    (eNB_flagP) ? "eNB" : "UE",
                    enb_mod_idP,
                    ue_mod_idP,
@@ -742,7 +742,7 @@ void rlc_data_ind     (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
           break;
       case RLC_MODE_TM:
           LOG_D(RLC, "[FRAME %5u][%s][RLC_TM][INST %u/%u][RB %u][--- RLC_DATA_IND/%d Bytes --->][PDCP][INST %u/%u][RB %u]\n",
-                 frame,
+                 frameP,
                  (eNB_flagP) ? "eNB" : "UE",
                  enb_mod_idP,
                  ue_mod_idP,
@@ -753,7 +753,7 @@ void rlc_data_ind     (module_id_t enb_mod_idP, module_id_t ue_mod_idP, frame_t
                  rb_idP);
           break;
   }
-  pdcp_data_ind (enb_mod_idP, ue_mod_idP, frame, eNB_flagP, MBMS_flagP, rb_idP % NB_RB_MAX, sdu_sizeP, sdu_pP, is_data_planeP);
+  pdcp_data_ind (enb_mod_idP, ue_mod_idP, frameP, eNB_flagP, MBMS_flagP, rb_idP % NB_RB_MAX, sdu_sizeP, sdu_pP, is_data_planeP);
 }
 //-----------------------------------------------------------------------------
 void rlc_data_conf     (module_id_t     enb_mod_idP,
@@ -780,7 +780,7 @@ void rlc_data_conf     (module_id_t     enb_mod_idP,
                     break;
                 case RLC_MODE_AM:
                     LOG_D(RLC, "[FRAME %5u][%s][RLC_AM][INST %u/%u][RB %u][--- RLC_DATA_CONF /MUI %d --->][RRC][INST %u/%u][][RLC_DATA_CONF/ MUI %d]\n",
-                            frame,
+                            frameP,
                             (eNB_flagP) ? "eNB" : "UE",
                             enb_mod_idP,
                             ue_mod_idP,
@@ -791,7 +791,7 @@ void rlc_data_conf     (module_id_t     enb_mod_idP,
                     break;
                 case RLC_MODE_UM:
                     LOG_D(RLC, "[FRAME %5u][%s][RLC_UM][INST %u/%u][RB %u][--- RLC_DATA_CONF /MUI %d --->][RRC][INST %u/%u][][RLC_DATA_CONF/ MUI %d]\n",
-                            frame,
+                            frameP,
                             (eNB_flagP) ? "eNB" : "UE",
                             enb_mod_idP,
                             ue_mod_idP,
@@ -802,7 +802,7 @@ void rlc_data_conf     (module_id_t     enb_mod_idP,
                     break;
                 case RLC_MODE_TM:
                     LOG_D(RLC, "[FRAME %5u][%s][RLC_TM][INST %u/%u][RB %u][--- RLC_DATA_CONF /MUI %d --->][RRC][INST %u/%u][][RLC_DATA_CONF/ MUI %d]\n",
-                            frame,
+                            frameP,
                             (eNB_flagP) ? "eNB" : "UE",
                             enb_mod_idP,
                             ue_mod_idP,
diff --git a/openair2/LAYER2/RLC/rlc_rrc.c b/openair2/LAYER2/RLC/rlc_rrc.c
index 49b98c136ec..3922869c474 100644
--- a/openair2/LAYER2/RLC/rlc_rrc.c
+++ b/openair2/LAYER2/RLC/rlc_rrc.c
@@ -468,7 +468,7 @@ rlc_op_status_t
 rb_release_rlc_am (rlc_am_entity_t *rlcP, frame_t frameP, module_id_t enb_mod_idP, module_id_t ue_mod_idP)
 {
 //-----------------------------------------------------------------------------
-  rlc_am_cleanup(rlcP,frame);
+  rlc_am_cleanup(rlcP,frameP);
   return RLC_OP_STATUS_OK;
 }
 //-----------------------------------------------------------------------------
@@ -504,20 +504,20 @@ rlc_op_status_t rrc_rlc_remove_rlc   (module_id_t enb_mod_idP, module_id_t ue_mo
         switch (rlc_mode) {
         case RLC_MODE_AM:
             LOG_D(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB AM\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP);
             lcid = rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am.channel_id;
             AssertFatal (lcid2rbid_eNB[enb_mod_idP][ue_mod_idP][lcid] == rb_idP, "Mismatch in RLC AM LC %u/RB %u mapping for RB %u\n", lcid, lcid2rbid_eNB[enb_mod_idP][ue_mod_idP][lcid], rb_idP);
             lcid2rbid_eNB[enb_mod_idP][ue_mod_idP][lcid] = RLC_RB_UNALLOCATED;
-            status = rb_release_rlc_am(&rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am, frame, enb_mod_idP, ue_mod_idP);
+            status = rb_release_rlc_am(&rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am, frameP, enb_mod_idP, ue_mod_idP);
             rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am.allocation = 0;
             rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_NONE;
             break;
         case RLC_MODE_TM:
             LOG_D(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB TM\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP);
@@ -530,7 +530,7 @@ rlc_op_status_t rrc_rlc_remove_rlc   (module_id_t enb_mod_idP, module_id_t ue_mo
             break;
         case RLC_MODE_UM:
             LOG_D(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB UM\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP);
@@ -543,7 +543,7 @@ rlc_op_status_t rrc_rlc_remove_rlc   (module_id_t enb_mod_idP, module_id_t ue_mo
             break;
         default:
             LOG_E(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] RELEASE RB mode %d\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP,
@@ -556,20 +556,20 @@ rlc_op_status_t rrc_rlc_remove_rlc   (module_id_t enb_mod_idP, module_id_t ue_mo
         switch (rlc_mode) {
         case RLC_MODE_AM:
             LOG_D(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB AM\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP);
             lcid = rlc_array_ue[ue_mod_idP][rb_idP].rlc.am.channel_id;
             AssertFatal (lcid2rbid_ue[ue_mod_idP][lcid] == rb_idP, "Mismatch in RLC AM LC %u/RB %u mapping for RB %u\n", lcid, lcid2rbid_ue[ue_mod_idP][lcid], rb_idP);
             lcid2rbid_ue[ue_mod_idP][lcid] = RLC_RB_UNALLOCATED;
-            status = rb_release_rlc_am(&rlc_array_ue[ue_mod_idP][rb_idP].rlc.am, frame, enb_mod_idP, ue_mod_idP);
+            status = rb_release_rlc_am(&rlc_array_ue[ue_mod_idP][rb_idP].rlc.am, frameP, enb_mod_idP, ue_mod_idP);
             rlc_array_ue[ue_mod_idP][rb_idP].rlc.am.allocation = 0;
             rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_NONE;
             break;
         case RLC_MODE_TM:
             LOG_D(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB TM\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP);
@@ -582,7 +582,7 @@ rlc_op_status_t rrc_rlc_remove_rlc   (module_id_t enb_mod_idP, module_id_t ue_mo
             break;
         case RLC_MODE_UM:
             LOG_D(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB UM\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP);
@@ -595,7 +595,7 @@ rlc_op_status_t rrc_rlc_remove_rlc   (module_id_t enb_mod_idP, module_id_t ue_mo
             break;
         default:
             LOG_E(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] RELEASE RB mode %d\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP,
@@ -637,7 +637,7 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
         rlc_mode = rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode;
         if (rlc_mode != RLC_MODE_NONE) {
             LOG_E(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB RB IS ALREADY ALLOCATED\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP,
@@ -653,14 +653,14 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
                 rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.am.allocation = 1;
                 rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_AM;
                 LOG_I(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
                         chan_idP);
             } else {
                 LOG_D(RLC,"[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM IS ALREADY ALLOCATED\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
@@ -674,14 +674,14 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
                 rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.tm.allocation = 1;
                 rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_TM;
                 LOG_I(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
                         chan_idP);
             } else {
                 LOG_D(RLC,"[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM IS ALREADY ALLOCATED\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
@@ -695,14 +695,14 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
                 rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].rlc.um.allocation = 1;
                 rlc_array_eNB[enb_mod_idP][ue_mod_idP][rb_idP].mode = RLC_MODE_UM;
                 LOG_I(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
                         chan_idP);
             } else {
                 LOG_D(RLC,"[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM IS ALREADY ALLOCATED\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
@@ -712,7 +712,7 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
             break;
         default:
             LOG_E(RLC, "[Frame %05u][eNB][RLC_RRC][INST %u/%u][RB %u] %s BAD PARAMETER RLC MODE %d\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP,
@@ -724,7 +724,7 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
         rlc_mode = rlc_array_ue[ue_mod_idP][rb_idP].mode;
         if (rlc_mode != RLC_MODE_NONE) {
             LOG_E(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB RB IS ALREADY ALLOCATED\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP,
@@ -740,14 +740,14 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
                 rlc_array_ue[ue_mod_idP][rb_idP].rlc.am.allocation = 1;
                 rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_AM;
                 LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
                         chan_idP);
             } else {
                 LOG_D(RLC,"[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB AM IS ALREADY ALLOCATED\n",
-                    frame,
+                    frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
@@ -761,14 +761,14 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
                 rlc_array_ue[ue_mod_idP][rb_idP].rlc.tm.allocation = 1;
                 rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_TM;
                 LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
                         chan_idP);
             } else {
                 LOG_D(RLC,"[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB TM IS ALREADY ALLOCATED\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
@@ -782,14 +782,14 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
                 rlc_array_ue[ue_mod_idP][rb_idP].rlc.um.allocation = 1;
                 rlc_array_ue[ue_mod_idP][rb_idP].mode = RLC_MODE_UM;
                 LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
                         chan_idP);
             } else {
                 LOG_D(RLC,"[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u][LCH Id %d] ADD RB UM IS ALREADY ALLOCATED\n",
-                        frame,
+                        frameP,
                         enb_mod_idP,
                         ue_mod_idP,
                         rb_idP,
@@ -799,7 +799,7 @@ rlc_op_status_t rrc_rlc_add_rlc   (module_id_t enb_mod_idP, module_id_t ue_mod_i
             break;
         default:
             LOG_E(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] %s BAD PARAMETER RLC MODE %d\n",
-                    frame,
+                    frameP,
                     enb_mod_idP,
                     ue_mod_idP,
                     rb_idP,
@@ -816,7 +816,7 @@ rlc_op_status_t rrc_rlc_config_req   (module_id_t enb_mod_idP, module_id_t ue_mo
     rlc_op_status_t status;
 
     LOG_D(RLC, "[FRAME %05u][%s][RLC][MOD %u/%u] CONFIG_REQ for Rab %u\n",
-            frame,
+            frameP,
             (enb_flagP) ? "eNB" : "UE",
             enb_mod_idP,
             ue_mod_idP,
@@ -846,20 +846,20 @@ rlc_op_status_t rrc_rlc_config_req   (module_id_t enb_mod_idP, module_id_t ue_mo
     switch (actionP) {
 
         case ACTION_ADD:
-            if ((status = rrc_rlc_add_rlc(enb_mod_idP, ue_mod_idP, frame, enb_flagP, rb_idP, rb_idP, rlc_infoP.rlc_mode)) != RLC_OP_STATUS_OK) {
+            if ((status = rrc_rlc_add_rlc(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, rb_idP, rb_idP, rlc_infoP.rlc_mode)) != RLC_OP_STATUS_OK) {
               return status;
             }
         case ACTION_MODIFY:
             switch (rlc_infoP.rlc_mode) {
                 case RLC_MODE_AM:
                     LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB AM\n",
-                            frame,
+                            frameP,
                             enb_mod_idP,
                             ue_mod_idP,
                             rb_idP);
 
                     config_req_rlc_am(
-                      frame,
+                      frameP,
                       enb_flagP,
                       enb_mod_idP,
                       ue_mod_idP,
@@ -869,12 +869,12 @@ rlc_op_status_t rrc_rlc_config_req   (module_id_t enb_mod_idP, module_id_t ue_mo
                     break;
                 case RLC_MODE_UM:
                     LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB UM\n",
-                            frame,
+                            frameP,
                             enb_mod_idP,
                             ue_mod_idP,
                             rb_idP);
                     config_req_rlc_um(
-                      frame,
+                      frameP,
                       enb_flagP,
                       enb_mod_idP,
                       ue_mod_idP,
@@ -884,12 +884,12 @@ rlc_op_status_t rrc_rlc_config_req   (module_id_t enb_mod_idP, module_id_t ue_mo
                     break;
                 case RLC_MODE_TM:
                     LOG_I(RLC, "[Frame %05u][UE][RLC_RRC][INST %u/%u][RB %u] MODIFY RB TM\n",
-                            frame,
+                            frameP,
                             enb_mod_idP,
                             ue_mod_idP,
                             rb_idP);
                     config_req_rlc_tm(
-                      frame,
+                      frameP,
                       enb_flagP,
                       enb_mod_idP,
                       ue_mod_idP,
@@ -903,7 +903,7 @@ rlc_op_status_t rrc_rlc_config_req   (module_id_t enb_mod_idP, module_id_t ue_mo
             break;
 
         case ACTION_REMOVE:
-            return rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, rb_idP, frame, enb_flagP);
+            return rrc_rlc_remove_rlc(enb_mod_idP, ue_mod_idP, rb_idP, frameP, enb_flagP);
             break;
         default:
             return RLC_OP_STATUS_BAD_PARAMETER;
@@ -919,7 +919,7 @@ rlc_op_status_t rrc_rlc_data_req     (module_id_t enb_mod_idP, module_id_t ue_mo
   sdu = get_free_mem_block(sdu_sizeP);
   if (sdu != NULL) {
     memcpy (sdu->data, sduP, sdu_sizeP);
-    return rlc_data_req(enb_mod_idP, ue_mod_idP, frame, enb_flagP, MBMS_flagP, rb_idP, muiP, confirmP, sdu_sizeP, sdu);
+    return rlc_data_req(enb_mod_idP, ue_mod_idP, frameP, enb_flagP, MBMS_flagP, rb_idP, muiP, confirmP, sdu_sizeP, sdu);
   } else {
     return RLC_OP_STATUS_INTERNAL_ERROR;
   }
diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c
index 310cbf90d66..2c7a82ff2a6 100644
--- a/openair2/RRC/LITE/rrc_common.c
+++ b/openair2/RRC/LITE/rrc_common.c
@@ -304,9 +304,9 @@ void rrc_t310_expiration(frame_t frameP, u8 Mod_id, u8 eNB_index) {
     if (UE_rrc_inst[Mod_id].Srb2[eNB_index].Active == 1) {
       msg ("[RRC Inst %d] eNB_index %d, Remove RB %d\n ", Mod_id, eNB_index,
            UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id);
-      rrc_pdcp_config_req (eNB_index, Mod_id, frame, 0, ACTION_REMOVE,
+      rrc_pdcp_config_req (eNB_index, Mod_id, frameP, 0, ACTION_REMOVE,
                            UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id, 0);
-      rrc_rlc_config_req (eNB_index, Mod_id, frame, 0, ACTION_REMOVE,
+      rrc_rlc_config_req (eNB_index, Mod_id, frameP, 0, ACTION_REMOVE,
                           UE_rrc_inst[Mod_id].Srb2[eNB_index].Srb_info.Srb_id, SIGNALLING_RADIO_BEARER, Rlc_info_um);
       UE_rrc_inst[Mod_id].Srb2[eNB_index].Active = 0;
       UE_rrc_inst[Mod_id].Srb2[eNB_index].Status = IDLE;
@@ -326,13 +326,13 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){
     if (UE_rrc_inst[Mod_id].Info[index].T300_active == 1) {
       if ((UE_rrc_inst[Mod_id].Info[index].T300_cnt % 10) == 0)
         LOG_D(RRC,
-              "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", Mod_id, frame, UE_rrc_inst[Mod_id].Info[index].T300_cnt);
+              "[UE %d][RAPROC] Frame %d T300 Count %d ms\n", Mod_id, frameP, UE_rrc_inst[Mod_id].Info[index].T300_cnt);
       if (UE_rrc_inst[Mod_id].Info[index].T300_cnt
           == T300[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t300]) {
         UE_rrc_inst[Mod_id].Info[index].T300_active = 0;
         // ALLOW CCCH to be used
         UE_rrc_inst[Mod_id].Srb0[index].Tx_buffer.payload_size = 0;
-        rrc_ue_generate_RRCConnectionRequest (Mod_id, frame, index);
+        rrc_ue_generate_RRCConnectionRequest (Mod_id, frameP, index);
         return (RRC_ConnSetup_failed);
       }
       UE_rrc_inst[Mod_id].Info[index].T300_cnt++;
@@ -356,11 +356,11 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){
         UE_rrc_inst[Mod_id].Info[index].N311_cnt = 0;
       }
       if ((UE_rrc_inst[Mod_id].Info[index].T310_cnt % 10) == 0)
-        LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", Mod_id, frame, UE_rrc_inst[Mod_id].Info[index].T310_cnt);
+        LOG_D(RRC, "[UE %d] Frame %d T310 Count %d ms\n", Mod_id, frameP, UE_rrc_inst[Mod_id].Info[index].T310_cnt);
       if (UE_rrc_inst[Mod_id].Info[index].T310_cnt
           == T310[UE_rrc_inst[Mod_id].sib2[index]->ue_TimersAndConstants.t310]) {
         UE_rrc_inst[Mod_id].Info[index].T310_active = 0;
-        rrc_t310_expiration (frame, Mod_id, index);
+        rrc_t310_expiration (frameP, Mod_id, index);
         return (RRC_PHY_RESYNCH);
       }
       UE_rrc_inst[Mod_id].Info[index].T310_cnt++;
@@ -369,7 +369,7 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){
     
     if (UE_rrc_inst[Mod_id].Info[index].T304_active==1) {
       if ((UE_rrc_inst[Mod_id].Info[index].T304_cnt % 10) == 0)
-	LOG_D(RRC,"[UE %d][RAPROC] Frame %d T304 Count %d ms\n",Mod_id,frame,
+	LOG_D(RRC,"[UE %d][RAPROC] Frame %d T304 Count %d ms\n",Mod_id,frameP,
 	      UE_rrc_inst[Mod_id].Info[index].T304_cnt);
       if (UE_rrc_inst[Mod_id].Info[index].T304_cnt == 0) {
 	UE_rrc_inst[Mod_id].Info[index].T304_active = 0;
@@ -382,11 +382,11 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){
     }
     // Layer 3 filtering of RRC measurements
     if (UE_rrc_inst[Mod_id].QuantityConfig[0] != NULL) {
-      ue_meas_filtering(Mod_id,frame,index);
+      ue_meas_filtering(Mod_id,frameP,index);
     }
-    ue_measurement_report_triggering(Mod_id,frame,index);
+    ue_measurement_report_triggering(Mod_id,frameP,index);
     if (UE_rrc_inst[Mod_id].Info[0].handoverTarget > 0)       
-      LOG_I(RRC,"[UE %d] Frame %d : RRC handover initiated\n", Mod_id, frame);
+      LOG_I(RRC,"[UE %d] Frame %d : RRC handover initiated\n", Mod_id, frameP);
     if((UE_rrc_inst[Mod_id].Info[index].State == RRC_HO_EXECUTION)   && 
        (UE_rrc_inst[Mod_id].HandoverInfoUe.targetCellId != 0xFF)) {
       UE_rrc_inst[Mod_id].Info[index].State= RRC_IDLE;
@@ -395,7 +395,7 @@ RRC_status_t rrc_rx_tx(u8 Mod_id,frame_t frameP, eNB_flag_t eNB_flagP,u8 index){
 
   }
   else {
-    check_handovers(Mod_id,frame);
+    check_handovers(Mod_id,frameP);
   }
   
   return (RRC_OK);
diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h
index ee19868b980..1979984d7b2 100644
--- a/openair2/UTIL/LOG/vcd_signal_dumper.h
+++ b/openair2/UTIL/LOG/vcd_signal_dumper.h
@@ -88,6 +88,7 @@ typedef enum
     VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PROCESS_RAR,
     VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER,
     VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GET_SR,
+    VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SEND_MCH_SDU,
     VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES,
     VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES,
     VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES,
diff --git a/openair2/UTIL/OCG/OCG.h b/openair2/UTIL/OCG/OCG.h
index 8550f27f9ca..e32fd1a1deb 100644
--- a/openair2/UTIL/OCG/OCG.h
+++ b/openair2/UTIL/OCG/OCG.h
@@ -657,12 +657,13 @@ The following diagram is based on graphviz (http://www.graphviz.org/), you need
     unsigned char multicast_group;
     char *multicast_ifname;
     // status
-    unsigned char ocg_enabled;
-    unsigned char ocm_enabled;
-    unsigned char opt_enabled;
-    unsigned char opt_mode; 
-    unsigned char otg_enabled; 
-    unsigned char omv_enabled;
+    unsigned char ocg_enabled; // openair config generator
+    unsigned char ocm_enabled; // openair channel modeling 
+    unsigned char opt_enabled;//openair packet tracer
+    unsigned char opt_mode;  // openair packet tracer mode: wireshark, pcap
+    unsigned char otg_enabled;  // openair traffic generator
+    unsigned char omv_enabled; // openair mobility visulizer
+    unsigned char opp_enabled; // openair performance profiler 
     char *itti_dump_file;
     unsigned char vcd_enabled;
     char *vcd_file;
diff --git a/targets/RTAI/USER/lte-softmodem.c b/targets/RTAI/USER/lte-softmodem.c
index f2693bbb223..81c44bada97 100644
--- a/targets/RTAI/USER/lte-softmodem.c
+++ b/targets/RTAI/USER/lte-softmodem.c
@@ -1118,7 +1118,7 @@ static void get_options (int argc, char **argv)
     {"no-L2-connect",   no_argument,        NULL, LONG_OPTION_NO_L2_CONNECT},
     {NULL, 0, NULL, 0}};
 
-  while ((c = getopt_long (argc, argv, "C:dF:K:O:ST:UV",long_options,NULL)) != -1)
+  while ((c = getopt_long (argc, argv, "C:dF:K:qO:ST:UV",long_options,NULL)) != -1)
     {
       switch (c)
         {
@@ -1254,7 +1254,10 @@ static void get_options (int argc, char **argv)
         case 'V':
           ouput_vcd = 1;
           break;
-
+	  /*	case  'q': 
+	  opp_enabled = 1;
+	  break;
+	  */
         default:
           break;
         }
diff --git a/targets/SIMU/USER/Makefile b/targets/SIMU/USER/Makefile
index aefc4350682..27aaa933e59 100644
--- a/targets/SIMU/USER/Makefile
+++ b/targets/SIMU/USER/Makefile
@@ -17,7 +17,13 @@ CPUFLAGS += $(shell if grep --silent ssse3 /proc/cpuinfo ; then echo "-mssse3" ;
 CPUFLAGS += $(shell if grep --silent -w sse4 /proc/cpuinfo ; then echo "-msse4" ; else echo ""; fi)
 linux = $(shell if [ `uname` = "Linux" ] ; then echo "1" ; else echo "0" ; fi)
 
-CFLAGS += -g -ggdb -Wstrict-prototypes -Wpointer-sign
+ifdef DEBUG
+CFLAGS += -g -ggdb -DDEBUG_PHY
+else 
+CFLAGE += -O2	
+endif
+
+CFLAGS += -Wstrict-prototypes -Wpointer-sign
 CFLAGS += -DUSER_MODE -DNB_ANTENNAS_RX=2 -DNB_ANTENNAS_TXRX=2 -DNB_ANTENNAS_TX=2 $(CPUFLAGS) -I/usr/include/X11 #-Wno-packed-bitfield-compat
 
 # Check if GCC version is greater or equal to 4.4
@@ -94,10 +100,6 @@ else
   endif
 endif
 
-ifdef DEBUG_PHY
-CFLAGS += -DDEBUG_PHY
-endif
-
 ifdef JF
 CFLAGS += -DJUMBO_FRAME
 endif
diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c
index bfc889e404a..e64f432533e 100644
--- a/targets/SIMU/USER/channel_sim.c
+++ b/targets/SIMU/USER/channel_sim.c
@@ -140,9 +140,10 @@ void do_DL_sig(double **r_re0,double **r_im0,
   if (abstraction_flag != 0) {
     //for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
 
+    if (!hold_channel) {
       // calculate the random channel from each eNB
       for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
-        random_channel(eNB2UE[eNB_id][UE_id]);
+        random_channel(eNB2UE[eNB_id][UE_id],abstraction_flag);
         /*
 	for (i=0;i<eNB2UE[eNB_id][UE_id]->nb_taps;i++)
 	  printf("eNB2UE[%d][%d]->a[0][%d] = (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->a[0][i].x,eNB2UE[eNB_id][UE_id]->a[0][i].y);
@@ -175,13 +176,14 @@ void do_DL_sig(double **r_re0,double **r_im0,
         return; //exit(-1);
       }
       
+#ifdef DEBUG_SIM
       rx_pwr = signal_energy_fp2(eNB2UE[att_eNB_id][UE_id]->ch[0],
                                  eNB2UE[att_eNB_id][UE_id]->channel_length)*eNB2UE[att_eNB_id][UE_id]->channel_length;
       LOG_D(OCM,"Channel eNB %d => UE %d : tx_power %d dBm, path_loss %f dB\n",
             att_eNB_id,UE_id,
             PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,
             eNB2UE[att_eNB_id][UE_id]->path_loss_dB);
-
+#endif
 
       //dlsch_abstraction(PHY_vars_UE_g[UE_id]->sinr_dB, rb_alloc, 8);
       // fill in perfect channel estimates
@@ -189,7 +191,8 @@ void do_DL_sig(double **r_re0,double **r_im0,
       s32 **dl_channel_est = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.dl_ch_estimates[0];
       //      double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0);
       double scale = pow(10.0,(PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0);
-      scale = scale * sqrt(512.0/300.0); //TODO: make this variable for all BWs
+      //this factor is not really needed (it was actually wrong in the non abstraction mode)
+      //scale = scale * sqrt(512.0/300.0); //TODO: make this variable for all BWs
       LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale)));
       // freq_channel(desc1,frame_parms->N_RB_DL,nb_samples);
       //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8);
@@ -211,19 +214,21 @@ void do_DL_sig(double **r_re0,double **r_im0,
 	    }
 	}
 
+      /*
       if(PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id]>=5)
 	{
-	  /*	  lte_ue_measurements(PHY_vars_UE_g[UE_id],
+	  lte_ue_measurements(PHY_vars_UE_g[UE_id],
 			      ((next_slot-1)>>1)*frame_parms->samples_per_tti,
 			      1,
 			      abstraction_flag);
-	  */		      
+	  		      
 	  PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE_g[UE_id]->PHY_measurements,0);
 	  //  printf("pmi_alloc in channel sim: %d",PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[0][0]->pmi_alloc);
-	}
-
-      // calculate the SNR for the attached eNB
-      init_snr(eNB2UE[att_eNB_id][UE_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB, &PHY_vars_UE_g[UE_id]->N0, PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id]->dlsch_eNB[UE_id][0]->pmi_alloc,PHY_vars_eNB_g[att_eNB_id]->mu_mimo_mode[UE_id].dl_pow_off);
+        }
+      */		      
+      
+      // calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved)
+      init_snr(eNB2UE[att_eNB_id][UE_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB, &PHY_vars_UE_g[UE_id]->N0, PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id]->eNB_UE_stats[UE_id].DL_pmi_single,PHY_vars_eNB_g[att_eNB_id]->mu_mimo_mode[UE_id].dl_pow_off);
 
       // calculate sinr here
       for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
@@ -231,9 +236,7 @@ void do_DL_sig(double **r_re0,double **r_im0,
           calculate_sinr(eNB2UE[eNB_id][UE_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB);
         }
       }
-
-      
-    //} //UE_id
+    } // hold channel
   }
   
   else { //abstraction_flag
@@ -241,11 +244,13 @@ void do_DL_sig(double **r_re0,double **r_im0,
        Call do_OFDM_mod from phy_procedures_eNB_TX function
     */
    
-     for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
+    for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
+      start_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats);
       do_OFDM_mod(PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdataF[0],
 		  PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0],
 		  ((next_slot==19) ? -1 : 0 ) + PHY_vars_eNB_g[eNB_id]->frame,next_slot,
 		  &PHY_vars_eNB_g[eNB_id]->lte_frame_parms);
+      stop_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats);
     }
    
     //for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
@@ -288,7 +293,7 @@ void do_DL_sig(double **r_re0,double **r_im0,
                                 PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower);
 
 #ifdef DEBUG_SIM
-        LOG_D(OCM,"eNB %d: tx_pwr %f dBm, for slot %d (subframe %d)\n",
+        LOG_D(OCM,"[SIM][DL] eNB %d: tx_pwr %f dBm, for slot %d (subframe %d)\n",
               eNB_id,
               10*log10(tx_pwr),
               next_slot,
@@ -300,13 +305,13 @@ void do_DL_sig(double **r_re0,double **r_im0,
 #ifdef DEBUG_SIM	  
         rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id]->ch[0],
                                    eNB2UE[eNB_id][UE_id]->channel_length)*eNB2UE[eNB_id][UE_id]->channel_length;
-        LOG_D(OCM,"Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr);
+        LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr);
 #endif
 
 
 #ifdef DEBUG_SIM
         for (i=0;i<eNB2UE[eNB_id][UE_id]->channel_length;i++)
-          printf("ch(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->ch[0][i]);
+          printf("ch(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->ch[0][i].x,eNB2UE[eNB_id][UE_id]->ch[0][i].y);
 #endif
 
         LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n",
@@ -316,8 +321,8 @@ void do_DL_sig(double **r_re0,double **r_im0,
               eNB2UE[eNB_id][UE_id]->path_loss_dB);
 
 #ifdef DEBUG_SIM      
-        rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,512,0);
-        printf("[SIM][DL] UE %d : rx_pwr %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
+        rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,512,0)*512.0/300.0;
+        LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
 #endif      
 
         if (eNB2UE[eNB_id][UE_id]->first_run == 1)
@@ -356,9 +361,9 @@ void do_DL_sig(double **r_re0,double **r_im0,
                      1e3/eNB2UE[eNB_id][UE_id]->BW,  // sampling time (ns)
                      (double)PHY_vars_UE_g[UE_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)
 
-        rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->ofdm_symbol_size,0);
 #ifdef DEBUG_SIM    
-        printf("[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n",
+        rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->ofdm_symbol_size,0)*512.0/300;
+        LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dB for slot %d (subframe %d)\n",
                UE_id,eNB_id,
                10*log10(rx_pwr),next_slot,next_slot>>1);
 #endif    	
@@ -370,9 +375,9 @@ void do_DL_sig(double **r_re0,double **r_im0,
         }
 
       }      
-      rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->ofdm_symbol_size,0);
 #ifdef DEBUG_SIM    
-      printf("[SIM][DL] UE %d : ADC in %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);  
+      rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->ofdm_symbol_size,0)*512.0/300.0;
+      LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);  
 #endif    
 
       rxdata = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.rxdata;
@@ -387,8 +392,8 @@ void do_DL_sig(double **r_re0,double **r_im0,
 	  frame_parms->samples_per_tti>>1,
 	  12);
       
-      rx_pwr2 = signal_energy(rxdata[0]+slot_offset,512);
 #ifdef DEBUG_SIM
+      rx_pwr2 = signal_energy(rxdata[0]+slot_offset,512)*512.0/300.0;
       LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d), writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1,rxdata);  
 #else
       UNUSED_VARIABLE(rx_pwr2);
@@ -421,81 +426,57 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
 
 #ifdef PHY_ABSTRACTION_UL
   double min_path_loss=-200;
-
-  int subframe = (next_slot>>1);
-
-  u8 harq_pid;
-  u16 ul_nb_rb=0;
+  u16 ul_nb_rb=0 ;
   u16 ul_fr_rb=0;
-#endif
+  int ulnbrb2 ;
+  int ulfrrb2 ;
+  u8 harq_pid;
+  int subframe = (next_slot>>1);
+#endif  
 
+  /*
   if (next_slot==4) 
-  {
     hold_channel = 0;
-  }
+  else
+    hold_channel = 1;
+  */
+
+  if (abstraction_flag!=0)  {
 #ifdef PHY_ABSTRACTION_UL
-  if (abstraction_flag!=0) 
-  {
-    for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) 
+   for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) 
     {
       for (UE_id=0;UE_id<NB_UE_INST;UE_id++) 
       {
-        random_channel(UE2eNB[UE_id][eNB_id]);
-        freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
-      }
-    }
-    for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++)
-    {
-			//channel now is ready for uplink,now find out which UEs are connected to you 			
-      for (UE_id=0;UE_id<NB_UE_INST;UE_id++)
-      {
-        att_eNB_id=0;
-        // if UE is not attached yet, find assume its the eNB with the smallest pathloss
-        if (att_eNB_id >= 0)
-        {
-          for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++)
-          {
-            if (min_path_loss<UE2eNB[UE_id][eNB_id]->path_loss_dB)
-            {
-              min_path_loss = UE2eNB[UE_id][eNB_id]->path_loss_dB;
-              att_eNB_id=eNB_id;
-              LOG_D(OCM,"UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id);
-					  }
-          }
-        }
-        if (att_eNB_id<0)
-        {
-          LOG_E(OCM,"Cannot find eNB for UE %d, return\n",UE_id);
-          return; //exit(-1);
-        }
-        // If the UE is attached to you, perform the uplink / abstraction procedure:
-        if(att_eNB_id >= 0)
-        {
-          //{ // REceived power at the eNB
-          rx_pwr = signal_energy_fp2(UE2eNB[UE_id][att_eNB_id]->ch[0],
-                                     UE2eNB[UE_id][att_eNB_id]->channel_length)*UE2eNB[UE_id][att_eNB_id]->channel_length; // calculate the rx power at the eNB
-
-          //  write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1);
-          if(subframe>1 && subframe <5)
+	if (!hold_channel) {
+	  random_channel(UE2eNB[UE_id][eNB_id],abstraction_flag);
+	  freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
+	  
+	  // REceived power at the eNB
+	  rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id]->ch[0],
+				     UE2eNB[UE_id][eNB_id]->channel_length)*UE2eNB[UE_id][att_eNB_id]->channel_length; // calculate the rx power at the eNB
+	}
+
+	//  write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1);
+	if(subframe>1 && subframe <5)
           {
             harq_pid = subframe2harq_pid(frame_parms,frame,subframe);
             ul_nb_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(u8)UE_id]->harq_processes[harq_pid]->nb_rb;
             ul_fr_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(u8)UE_id]->harq_processes[harq_pid]->first_rb;
           }
-
-          if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1))
+	
+	if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1))
           {
             number_rb_ul = ul_nb_rb;
             first_rbUL = ul_fr_rb;
             init_snr_up(UE2eNB[UE_id][att_eNB_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id]->N0,ul_nb_rb,ul_fr_rb);
-
+	    
           }
-        } // If this UE is attached to you(means perform Uplink abstraction procedure)
-      } //uE_id
-    }
-  }
+      } //UE_id
+    } //eNB_id
 #else
- if (abstraction_flag!=0) {
+/* the following functions are not needed */
+/*  
+if (abstraction_flag!=0) {
     for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
       for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
 	random_channel(UE2eNB[UE_id][eNB_id]);
@@ -503,7 +484,9 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
       }
     }
   }
+*/
 #endif
+  }
   else { //without abstraction
 
     /*
@@ -548,7 +531,7 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
                                   PHY_vars_UE_g[UE_id]->tx_power_dBm);
           //ue_data[UE_id]->tx_power_dBm);
 #ifdef DEBUG_SIM
-	  printf("[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n",UE_id,10*log10(tx_pwr),PHY_vars_UE_g[UE_id]->tx_power_dBm,next_slot,next_slot>>1,slot_offset,slot_offset_meas);
+	  LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n",UE_id,10*log10(tx_pwr),PHY_vars_UE_g[UE_id]->tx_power_dBm,next_slot,next_slot>>1,slot_offset,slot_offset_meas);
 #endif
 	  
 	  multipath_channel(UE2eNB[UE_id][eNB_id],s_re,s_im,r_re0,r_im0,
@@ -557,12 +540,12 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
 #ifdef DEBUG_SIM	  
           rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id]->ch[0],
                                      UE2eNB[UE_id][eNB_id]->channel_length)*UE2eNB[UE_id][eNB_id]->channel_length;
-          printf("[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr),hold_channel);
+          LOG_D(OCM,"[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr),hold_channel);
 #endif
 
 #ifdef DEBUG_SIM    
 	  rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
-	  printf("[SIM][UL] eNB %d : rx_pwr %f dB (%f) for slot %d (subframe %d), sptti %d\n",
+	  LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dB (%f) for slot %d (subframe %d), sptti %d\n",
 		 eNB_id,10*log10(rx_pwr),rx_pwr,next_slot,next_slot>>1,frame_parms->samples_per_tti);  
 #endif
 
@@ -610,9 +593,9 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
                    1e3/UE2eNB[0][eNB_id]->BW,  // sampling time (ns)
                    (double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227);   // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
 
-      rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
 #ifdef DEBUG_SIM    
-      printf("[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);  
+      rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
+      LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);  
 #endif
       
       rxdata = PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.rxdata[0];
@@ -627,10 +610,9 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
           frame_parms->samples_per_tti>>1,
           12);
       
-      rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1);
 #ifdef DEBUG_SIM    
-      printf("[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n",
-             eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1);  
+      rx_pwr2 = signal_energy(rxdata[0]+slot_offset,frame_parms->samples_per_tti>>1);
+      LOG_D(OCM,"[SIM][UL] eNB %d rx_pwr (ADC out) %f dB (%d) for slot %d (subframe %d)\n",eNB_id,10*log10((double)rx_pwr2),rx_pwr2,next_slot,next_slot>>1);  
 #else
       UNUSED_VARIABLE(tx_pwr);
       UNUSED_VARIABLE(rx_pwr);
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index d7d9397495a..4bb261a8fa3 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -95,10 +95,10 @@ char           smbv_ip[16];
 #define SF_VAR                 10
 
 //constant for OAISIM soft realtime calibration
-#define SF_DEVIATION_OFFSET_NS 100000        /*= 0.1ms : should be as a number of UE */
-#define SLEEP_STEP_US          100           /*  = 0.01ms could be adaptive, should be as a number of UE */
-#define K                      2             /* averaging coefficient */
-#define TARGET_SF_TIME_NS      1000000       /* 1ms = 1000000 ns */
+//#define SF_DEVIATION_OFFSET_NS 100000        /*= 0.1ms : should be as a number of UE */
+//#define SLEEP_STEP_US          100           /*  = 0.01ms could be adaptive, should be as a number of UE */
+//#define K                      2             /* averaging coefficient */
+//#define TARGET_SF_TIME_NS      1000000       /* 1ms = 1000000 ns */
 
 frame_t                frame = 0;
 char                   stats_buffer[16384];
@@ -127,18 +127,18 @@ u8                     rate_adaptation_flag;
 extern u8              abstraction_flag;
 extern u8              ethernet_flag;
 extern u16             Nid_cell;
-extern struct timespec time_spec;
-extern unsigned long   time_last;
-extern unsigned long   time_now;
-extern int             td;
-extern int             td_avg;
-extern int             sleep_time_us;
+
 extern LTE_DL_FRAME_PARMS *frame_parms;
 
 #ifdef XFORMS
 int otg_enabled;
 #endif
 
+time_stats_t oaisim_stats;
+time_stats_t oaisim_stats_f;
+time_stats_t dl_chan_stats;
+time_stats_t ul_chan_stats;
+
 // this should reflect the channel models in openair1/SIMULATION/TOOLS/defs.h
 mapping small_scale_names[] = {
     {"custom", custom},
@@ -188,7 +188,7 @@ void help(void) {
   printf ("-K [log_file] Enable ITTI logging into log_file\n");
   printf ("-l Set the global log level (8:trace, 7:debug, 6:info, 4:warn, 3:error) \n");
   printf ("-L [0-1] 0 to disable new link adaptation, 1 to enable new link adapatation\n");
-  printf ("-m Gives a fixed DL mcs\n");
+  printf ("-m Gives a fixed DL mcs for eNB scheduler\n");
   printf ("-M Set the machine ID for Ethernet-based emulation\n");
   printf ("-n Set the number of frames for the simulation\n");
   printf ("-O [enb_conf_file] eNB configuration file name\n");
@@ -197,12 +197,13 @@ void help(void) {
   printf ("    - wireshark: Enable tracing of layers above PHY using an UDP socket\n");
   printf ("    - pcap:      Enable tracing of layers above PHY to a pcap file\n");
   printf ("    - tshark:    Not implemented yet\n");
+  printf ("-q Enable Openair performance profiler \n");
   printf ("-Q Activate and set the MBMS service: 0 : not used (default eMBMS disabled), 1: eMBMS and RRC Connection enabled, 2: eMBMS relaying and RRC Connection enabled, 3: eMBMS enabled, RRC Connection disabled, 4: eMBMS relaying enabled, RRC Connection disabled\n");
   printf ("-R [6,15,25,50,75,100] Sets N_RB_DL\n");
   printf ("-r Activates rate adaptation (DL for now)\n");
   printf ("-s snr_dB set a fixed (average) SNR, this deactivates the openair channel model generator (OCM)\n");
   printf ("-S snir_dB set a fixed (average) SNIR, this deactivates the openair channel model generator (OCM)\n");
-  printf ("-t Set the delay spread (microseconds)\n");
+  printf ("-t Gives a fixed UL mcs for eNB scheduler\n");
   printf ("-T activate the traffic generator: cbr, mcbr, bcbr, mscbr\n");
   printf ("-u Set the number of local UE\n");
   printf ("-U Set the mobility model for UE, options are: STATIC, RWP, RWALK\n");
@@ -513,9 +514,11 @@ void *l2l1_task(void *args_p) {
       AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
   }
 #endif
-
+  start_meas(&oaisim_stats);
   for (frame = 0; (l2l1_state != L2L1_TERMINATED) && (frame < oai_emulation.info.n_frames); frame++) {
 
+    start_meas(&oaisim_stats_f);
+
 #if defined(ENABLE_ITTI)
       do {
           // Checks if a message has been sent to L2L1 task
@@ -602,7 +605,7 @@ void *l2l1_task(void *args_p) {
       update_ocm ();
 
       for (slot = 0; slot < 20; slot++) {
-
+	
           wait_for_slot_isr ();
 
 #if defined(ENABLE_ITTI)
@@ -815,14 +818,16 @@ void *l2l1_task(void *args_p) {
            frame_parms);
            }
            }*/
-                  for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) {
-                      do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,
-                          frame_parms, UE_inst);
+                  start_meas(&dl_chan_stats);
+		  for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) {
+                      do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst);
                   }
+		  stop_meas(&dl_chan_stats);
               }
               if ((direction == SF_UL) || (frame_parms->frame_type == 0)) { //if ((subframe<2) || (subframe>4))
-                  do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,
-                      frame_parms, frame);
+                   start_meas(&ul_chan_stats);
+		   do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame); 
+		   stop_meas(&ul_chan_stats);
                   /*
            int ccc;
            fprintf(SINRpost,"SINRdb For eNB New Subframe : \n ");
@@ -842,11 +847,12 @@ void *l2l1_task(void *args_p) {
              frame,next_slot,
              frame_parms);
              }
-             }*/
-                      for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) {
-                          do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,
-                              frame_parms, UE_inst);
-                      }
+             }*/ 
+		    start_meas(&dl_chan_stats);
+		    for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) {
+		      do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst);
+		    }
+		    stop_meas(&dl_chan_stats);
                       /*
              for (aarx=0;aarx<UE2eNB[1][0]->nb_rx;aarx++)
              for (aatx=0;aatx<UE2eNB[1][0]->nb_tx;aatx++)
@@ -855,8 +861,9 @@ void *l2l1_task(void *args_p) {
                        */
                   }
                   else { // UL part
-                      do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,
-                          frame_parms, frame);
+		    start_meas(&ul_chan_stats);
+                      do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame);
+		      stop_meas(&ul_chan_stats);
 
                       /*        int ccc;
              fprintf(SINRpost,"SINRdb For eNB New Subframe : \n ");
@@ -887,33 +894,7 @@ void *l2l1_task(void *args_p) {
          write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
          }
                */
-
-              if (next_slot % 2 == 0) {
-                  clock_gettime (CLOCK_REALTIME, &time_spec);
-                  time_last = time_now;
-                  time_now = (unsigned long) time_spec.tv_nsec;
-                  td = (int) (time_now - time_last);
-                  if (td > 0) {
-                      td_avg = (int) (((K * (long) td) + (((1 << 3) - K) * ((long) td_avg))) >> 3); // in us
-                      LOG_T(
-                          EMU,
-                          "sleep frame %d, time_now %ldus,time_last %ldus,average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n", frame, time_now, time_last, td_avg, td/1000, (td_avg-TARGET_SF_TIME_NS)/1000);
-                  }
-                  if (td_avg < (TARGET_SF_TIME_NS - SF_DEVIATION_OFFSET_NS)) {
-                      sleep_time_us += SLEEP_STEP_US;
-                      LOG_D(EMU, "Faster than realtime increase the avg sleep time for %d us, frame %d\n", sleep_time_us, frame);
-                      // LOG_D(EMU,"Faster than realtime increase the avg sleep time for %d us, frame %d, time_now %ldus,time_last %ldus,average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n",    sleep_time_us,frame, time_now,time_last,td_avg, td/1000,(td_avg-TARGET_SF_TIME_NS)/1000);
-                  }
-                  else
-                    if (td_avg > (TARGET_SF_TIME_NS + SF_DEVIATION_OFFSET_NS)) {
-                        sleep_time_us -= SLEEP_STEP_US;
-                        LOG_D(
-                            EMU,
-                            "Slower than realtime reduce the avg sleep time for %d us, frame %d, time_now\n", sleep_time_us, frame);
-                        //LOG_T(EMU,"Slower than realtime reduce the avg sleep time for %d us, frame %d, time_now %ldus,time_last %ldus,average time difference %ldns, CURRENT TIME DIFF %dus, avgerage difference from the target %dus\n",     sleep_time_us,frame, time_now,time_last,td_avg, td/1000,(td_avg-TARGET_SF_TIME_NS)/1000);
-                    }
-              } // end if next_slot%2
-            } // if Channel_Flag==0
+      } // if Channel_Flag==0
 
       } //end of slot
 
@@ -955,19 +936,16 @@ void *l2l1_task(void *args_p) {
       }
 #endif
 
-      // calibrate at the end of each frame if there is some time  left
-      if ((sleep_time_us > 0) && (ethernet_flag == 0)) {
-          LOG_I(EMU, "[TIMING] Adjust average frame duration, sleep for %d us\n", sleep_time_us);
-          //usleep (sleep_time_us);
-          sleep_time_us = 0; // reset the timer, could be done per n SF
-      }
 #ifdef SMBV
       if ((frame == config_frames[0]) || (frame == config_frames[1]) || (frame == config_frames[2]) || (frame == config_frames[3])) {
           smbv_frame_cnt++;
       }
 #endif
+      stop_meas(&oaisim_stats_f);
   } //end of frame
 
+  stop_meas(&oaisim_stats);
+
 #if defined(ENABLE_ITTI)
   itti_terminate_tasks(TASK_L2L1);
 #endif
@@ -1011,8 +989,8 @@ int main(int argc, char **argv) {
 #endif
 
   // time calibration for soft realtime mode  
-  //time_t t0,t1;
-  //clock_t start, stop;
+  char pbch_file_path[512];
+  FILE *pbch_file_fd;
 
 #ifdef PROC
   int node_id;
@@ -1085,7 +1063,10 @@ int main(int argc, char **argv) {
   smbv_init_config(smbv_fname, smbv_nframes);
   smbv_write_config_from_frame_parms(smbv_fname, &PHY_vars_eNB_g[0]->lte_frame_parms);
 #endif
-
+  // oai performance profiler is enabled 
+  if (oai_emulation.info.opp_enabled == 1)
+    reset_opp_meas();
+  
   init_time ();
 
   init_slot_isr ();
@@ -1125,6 +1106,9 @@ int main(int argc, char **argv) {
   if (oai_emulation.info.otg_enabled == 1)
     kpi_gen ();
 
+  if (oai_emulation.info.opp_enabled == 1)
+    print_opp_meas();
+  
   // relase all rx state
   if (ethernet_flag == 1) {
       emu_transport_release ();
@@ -1200,6 +1184,266 @@ int main(int argc, char **argv) {
   return (0);
 }
 
+void reset_opp_meas(void){
+  u8 eNB_id=0,UE_id=0;
+ 
+  reset_meas(&oaisim_stats);
+  reset_meas(&oaisim_stats_f); // frame 
+  
+  // init time stats here (including channel)
+  reset_meas(&dl_chan_stats);
+  reset_meas(&ul_chan_stats);
+  
+  for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
+    reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc);
+    reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc_rx);
+    reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc_tx);
+    
+    reset_meas(&PHY_vars_UE_g[UE_id]->ofdm_demod_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->rx_dft_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_channel_estimation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_freq_offset_estimation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_decoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_rate_unmatching_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_turbo_decoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_deinterleaving_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_llr_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_unscrambling_stats);
+    
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_init_stats);    
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_alpha_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_beta_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_gamma_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_ext_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl1_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl2_stats);
+    
+    reset_meas(&PHY_vars_UE_g[UE_id]->tx_prach);
+    
+    reset_meas(&PHY_vars_UE_g[UE_id]->ofdm_mod_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_encoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_modulation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_segmentation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_rate_matching_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_turbo_encoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_interleaving_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_multiplexing_stats);
+    /*
+     * L2 functions
+     */ 
+    
+    // UE MAC
+    reset_meas(&UE_mac_inst[UE_id].ue_scheduler); // total 
+    reset_meas(&UE_mac_inst[UE_id].tx_ulsch_sdu);  // inlcude rlc_data_req + mac header gen
+    reset_meas(&UE_mac_inst[UE_id].rx_dlsch_sdu); // include mac_rrc_data_ind or mac_rlc_status_ind+mac_rlc_data_ind and  mac header parser
+    reset_meas(&UE_mac_inst[UE_id].ue_query_mch); 
+    reset_meas(&UE_mac_inst[UE_id].rx_mch_sdu); // include rld_data_ind+ parse mch header 
+    reset_meas(&UE_mac_inst[UE_id].rx_si); // include rlc_data_ind + mac header parser
+
+    reset_meas(&UE_pdcp_stats[UE_id].pdcp_run);
+    reset_meas(&UE_pdcp_stats[UE_id].data_req);
+    reset_meas(&UE_pdcp_stats[UE_id].data_ind);
+    /* reset_meas(&UE_pdcp_stats[UE_id].encrption);
+    reset_meas(&UE_pdcp_stats[UE_id].decrption);
+    reset_meas(&UE_pdcp_stats[UE_id].pdcp_ip);
+    reset_meas(&UE_pdcp_stats[UE_id].ip_pdcp);
+    */
+    for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_rx);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_tx);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->rx_prach);
+    
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_encoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_modulation_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_scrambling_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_rate_matching_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_turbo_encoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_interleaving_stats);
+    
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_demod_stats);
+      //reset_meas(&PHY_vars_eNB_g[eNB_id]->rx_dft_stats);
+      //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_channel_estimation_stats);
+      //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_freq_offset_estimation_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_decoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demodulation_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_rate_unmatching_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_turbo_decoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_deinterleaving_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demultiplexing_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_llr_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_init_stats);    
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_alpha_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_beta_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_gamma_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_ext_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl1_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl2_stats);
+    
+      reset_meas(&eNB2UE[eNB_id][UE_id]->random_channel);
+      reset_meas(&eNB2UE[eNB_id][UE_id]->interp_time);
+      reset_meas(&eNB2UE[eNB_id][UE_id]->interp_freq);
+      reset_meas(&eNB2UE[eNB_id][UE_id]->convolution);
+      reset_meas(&UE2eNB[UE_id][eNB_id]->random_channel);
+      reset_meas(&UE2eNB[UE_id][eNB_id]->interp_time);
+      reset_meas(&UE2eNB[UE_id][eNB_id]->interp_freq);
+      reset_meas(&UE2eNB[UE_id][eNB_id]->convolution);
+      /* 
+       * L2 functions 
+       */
+      // eNB MAC
+      reset_meas(&eNB_mac_inst[eNB_id].eNB_scheduler); // total 
+      reset_meas(&eNB_mac_inst[eNB_id].schedule_si); // only schedule + tx
+      reset_meas(&eNB_mac_inst[eNB_id].schedule_ra); // only ra
+      reset_meas(&eNB_mac_inst[eNB_id].schedule_ulsch); // onlu ulsch
+      reset_meas(&eNB_mac_inst[eNB_id].fill_DLSCH_dci);// only dci
+      reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor); // include rlc_data_req + MAC header gen
+      reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch); // include rlc_data_req + MAC header gen + pre-processor
+      reset_meas(&eNB_mac_inst[eNB_id].schedule_mch); // only embms 
+      reset_meas(&eNB_mac_inst[eNB_id].rx_ulsch_sdu); // include rlc_data_ind + mac header parser
+     
+      reset_meas(&eNB_pdcp_stats[UE_id].pdcp_run);
+      reset_meas(&eNB_pdcp_stats[UE_id].data_req);
+      reset_meas(&eNB_pdcp_stats[UE_id].data_ind);
+      /*
+      reset_meas(&eNB_pdcp_stats[UE_id].encrption);
+      reset_meas(&eNB_pdcp_stats[UE_id].decrption);
+      reset_meas(&eNB_pdcp_stats[UE_id].pdcp_ip);
+      reset_meas(&eNB_pdcp_stats[UE_id].ip_pdcp);
+      */
+    }
+  }
+}
+
+void print_opp_meas(void){
+  u8 eNB_id=0,UE_id=0;
+
+  print_meas(&oaisim_stats,"[OAI][total_exec_time]", &oaisim_stats,&oaisim_stats);
+  print_meas(&oaisim_stats_f,"[OAI][SF_exec_time]", &oaisim_stats,&oaisim_stats_f);
+  
+  print_meas(&dl_chan_stats,"[DL][chan_stats]",&oaisim_stats,&oaisim_stats_f);
+  print_meas(&ul_chan_stats,"[UL][chan_stats]", &oaisim_stats,&oaisim_stats_f);
+  
+  for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
+    for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
+      print_meas(&eNB2UE[eNB_id][UE_id]->random_channel,"[DL][random_channel]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&eNB2UE[eNB_id][UE_id]->interp_time,"[DL][interp_time]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&eNB2UE[eNB_id][UE_id]->interp_freq,"[DL][interp_freq]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&eNB2UE[eNB_id][UE_id]->convolution,"[DL][convolution]",&oaisim_stats,&oaisim_stats_f);
+
+      print_meas(&UE2eNB[UE_id][eNB_id]->random_channel,"[UL][random_channel]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&UE2eNB[UE_id][eNB_id]->interp_time,"[UL][interp_time]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&UE2eNB[UE_id][eNB_id]->interp_freq,"[UL][interp_freq]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&UE2eNB[UE_id][eNB_id]->convolution,"[UL][convolution]",&oaisim_stats,&oaisim_stats_f);
+    }
+  }
+
+  for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
+    print_meas(&PHY_vars_UE_g[UE_id]->phy_proc,"[UE][total_phy_proc]",&oaisim_stats,&oaisim_stats_f);
+    
+    print_meas(&PHY_vars_UE_g[UE_id]->phy_proc_rx,"[UE][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ofdm_demod_stats,"[UE][ofdm_demod]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->rx_dft_stats,"[UE][rx_dft]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_channel_estimation_stats,"[UE][channel_est]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_freq_offset_estimation_stats,"[UE][freq_offset]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_llr_stats,"[UE][llr]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_unscrambling_stats,"[UE][unscrambling]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_decoding_stats,"[UE][decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_rate_unmatching_stats,"[UE][rate_unmatching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_deinterleaving_stats,"[UE][deinterleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_turbo_decoding_stats,"[UE][turbo_decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_init_stats,"[UE][ |_tc_init]",&oaisim_stats,&oaisim_stats_f);    
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_alpha_stats,"[UE][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_beta_stats,"[UE][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_gamma_stats,"[UE][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_ext_stats,"[UE][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl1_stats,"[UE][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl2_stats,"[UE][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f);
+    
+    print_meas(&PHY_vars_UE_g[UE_id]->phy_proc_tx,"[UE][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ofdm_mod_stats,"[UE][ofdm_mod]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_modulation_stats,"[UE][modulation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_encoding_stats,"[UE][encoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_segmentation_stats,"[UE][segmentation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_rate_matching_stats,"[UE][rate_matching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_turbo_encoding_stats,"[UE][turbo_encoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_interleaving_stats,"[UE][interleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_multiplexing_stats,"[UE][multiplexing]",&oaisim_stats,&oaisim_stats_f);
+
+  }
+  
+  for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
+    print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc,"[eNB][total_phy_proc]",&oaisim_stats,&oaisim_stats_f);
+
+    print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_rx,"[eNB][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats,"[eNB][ofdm_mod]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_modulation_stats,"[eNB][modulation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_scrambling_stats,"[eNB][scrambling]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_encoding_stats,"[eNB][encoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_interleaving_stats,"[eNB][|_interleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_rate_matching_stats,"[eNB][|_rate_matching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_turbo_encoding_stats,"[eNB][|_turbo_encoding]",&oaisim_stats,&oaisim_stats_f);
+    
+    
+    print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_tx,"[eNB][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_demod_stats,"[eNB][ofdm_demod]",&oaisim_stats,&oaisim_stats_f);
+    //print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_channel_estimation_stats,"[eNB][channel_est]");
+    //print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_freq_offset_estimation_stats,"[eNB][freq_offset]");
+    //print_meas(&PHY_vars_eNB_g[eNB_id]->rx_dft_stats,"[eNB][rx_dft]");
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demodulation_stats,"[eNB][demodulation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_decoding_stats,"[eNB][decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_deinterleaving_stats,"[eNB][|_deinterleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demultiplexing_stats,"[eNB][|_demultiplexing]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_rate_unmatching_stats,"[eNB][|_rate_unmatching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_turbo_decoding_stats,"[eNB][|_turbo_decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_init_stats,"[eNB][ |_tc_init]",&oaisim_stats,&oaisim_stats_f);    
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_alpha_stats,"[eNB][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_beta_stats,"[eNB][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_gamma_stats,"[eNB][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_ext_stats,"[eNB][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl1_stats,"[eNB][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl2_stats,"[eNB][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f);
+    
+    print_meas(&PHY_vars_eNB_g[eNB_id]->rx_prach,"[eNB][rx_prach]",&oaisim_stats,&oaisim_stats_f);
+
+  }
+
+ for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
+   
+   print_meas(&UE_mac_inst[UE_id].ue_scheduler,"[UE][mac_scheduler]",&oaisim_stats,&oaisim_stats_f); 
+   print_meas(&UE_mac_inst[UE_id].tx_ulsch_sdu,"[UE][tx_ulsch_sdu]",&oaisim_stats,&oaisim_stats_f);
+   print_meas(&UE_mac_inst[UE_id].rx_dlsch_sdu,"[UE][rx_dlsch_sdu]",&oaisim_stats,&oaisim_stats_f);
+   print_meas(&UE_mac_inst[UE_id].ue_query_mch,"[UE][query_MCH]",&oaisim_stats,&oaisim_stats_f); 
+   print_meas(&UE_mac_inst[UE_id].rx_mch_sdu,"[UE][rx_mch_sdu]",&oaisim_stats,&oaisim_stats_f);
+   print_meas(&UE_mac_inst[UE_id].rx_si,"[UE][rx_si]",&oaisim_stats,&oaisim_stats_f); 
+   
+   print_meas(&UE_pdcp_stats[UE_id].pdcp_run,"[UE][total_pdcp_run]",&oaisim_stats,&oaisim_stats_f);
+   print_meas(&UE_pdcp_stats[UE_id].data_req,"[UE][DL][pdcp_data_req]",&oaisim_stats,&oaisim_stats_f);
+   print_meas(&UE_pdcp_stats[UE_id].data_ind,"[UE][UL][pdcp_data_ind]",&oaisim_stats,&oaisim_stats_f);
+
+  }
+  
+  for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
+   
+    print_meas(&eNB_mac_inst[eNB_id].eNB_scheduler,"[eNB][mac_scheduler]",&oaisim_stats,&oaisim_stats_f); 
+    print_meas(&eNB_mac_inst[eNB_id].schedule_si,"[eNB][DL][SI]",&oaisim_stats,&oaisim_stats_f); 
+    print_meas(&eNB_mac_inst[eNB_id].schedule_ra,"[eNB][DL][RA]",&oaisim_stats,&oaisim_stats_f); 
+    print_meas(&eNB_mac_inst[eNB_id].fill_DLSCH_dci,"[eNB][DL/UL][fill_DCI]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor,"[eNB][DL][preprocessor]",&oaisim_stats,&oaisim_stats_f); 
+    print_meas(&eNB_mac_inst[eNB_id].schedule_dlsch,"[eNB][DL][schedule_tx_dlsch]",&oaisim_stats,&oaisim_stats_f); 
+    print_meas(&eNB_mac_inst[eNB_id].schedule_mch,"[eNB][DL][mch]",&oaisim_stats,&oaisim_stats_f); 
+    print_meas(&eNB_mac_inst[eNB_id].schedule_ulsch,"[eNB][UL][ULSCH]",&oaisim_stats,&oaisim_stats_f); 
+    print_meas(&eNB_mac_inst[eNB_id].rx_ulsch_sdu,"[eNB][UL][rx_ulsch_sdu]",&oaisim_stats,&oaisim_stats_f); 
+
+    print_meas(&eNB_pdcp_stats[UE_id].pdcp_run,"[eNB][pdcp_run]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&eNB_pdcp_stats[UE_id].data_req,"[eNB][DL][pdcp_data_req]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&eNB_pdcp_stats[UE_id].data_ind,"[eNB][UL][pdcp_data_ind]",&oaisim_stats,&oaisim_stats_f);
+  }
+  
+}
+
+
 /*
  static void *sigh(void *arg) {
 
diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h
index 86bd4df113d..b5bac619e1e 100644
--- a/targets/SIMU/USER/oaisim.h
+++ b/targets/SIMU/USER/oaisim.h
@@ -45,4 +45,16 @@ void do_OFDM_mod(mod_sym_t **txdataF, s32 **txdata, frame_t frame, u16 next_slot
 #ifdef OPENAIR2
 int omv_write (int pfd,  Node_list enb_node_list, Node_list ue_node_list, Data_Flow_Unit omv_data);
 void omv_end (int pfd, Data_Flow_Unit omv_data);
+
+void reset_opp_meas(void);
+void print_opp_meas(void);
+
 #endif
+
+
+
+
+
+
+
+
diff --git a/targets/SIMU/USER/oaisim_config.c b/targets/SIMU/USER/oaisim_config.c
index 9fcdbfaf11b..8ef289f6eb2 100644
--- a/targets/SIMU/USER/oaisim_config.c
+++ b/targets/SIMU/USER/oaisim_config.c
@@ -337,6 +337,8 @@ void init_oai_emulation() {
   oai_emulation.info.cli_enabled=0;// I flag
   oai_emulation.info.omv_enabled =0; // v flag 
   oai_emulation.info.vcd_enabled=0;
+  oai_emulation.info.opp_enabled=0;
+
   oai_emulation.info.cba_group_active=0;
   oai_emulation.info.eMBMS_active_state=0;
   oai_emulation.info.handover_active=0;
diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c
index 80c8b44953d..a5694217051 100644
--- a/targets/SIMU/USER/oaisim_functions.c
+++ b/targets/SIMU/USER/oaisim_functions.c
@@ -58,7 +58,7 @@ int           for_times             = 0;
 static char  *conf_config_file_name = NULL;
 u16           Nid_cell              = 0; //needed by init_lte_vars
 int           nb_antennas_rx        = 2; // //
-u8            target_dl_mcs         = 0;
+u8            target_dl_mcs         = 0; // not set
 u8            rate_adaptation_flag  = 0;
 u8            set_sinr              = 0;
 double        snr_dB, sinr_dB;
@@ -72,7 +72,7 @@ double        forgetting_factor     = 0.0;
 u8            beta_ACK              = 0;
 u8            beta_RI               = 0;
 u8            beta_CQI              = 2;
-u8            target_ul_mcs         = 2;
+u8            target_ul_mcs         = 4;
 LTE_DL_FRAME_PARMS *frame_parms     = NULL;
 int           map1,map2;
 double      **ShaF                  = NULL;
@@ -123,7 +123,8 @@ extern pdcp_mbms_t pdcp_mbms_array_ue[NUMBER_OF_UE_MAX][maxServiceCount][maxSess
 extern pdcp_mbms_t pdcp_mbms_array_eNB[NUMBER_OF_eNB_MAX][maxServiceCount][maxSessionPerPMCH];
 #endif
 
-extern void help (void);
+extern time_stats_t dl_chan_stats;
+extern time_stats_t ul_chan_stats;
 
 void get_simulation_options(int argc, char *argv[]) {
   int                           option;
@@ -182,7 +183,7 @@ void get_simulation_options(int argc, char *argv[]) {
       {NULL, 0, NULL, 0}
   };
 
-  while ((option = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hHi:IJ:j:k:K:l:L:m:M:n:N:oO:p:P:Q:rR:s:S:t:T:u:U:vV:w:W:x:X:y:Y:z:Z:", long_options, NULL)) != -1) {
+  while ((option = getopt_long (argc, argv, "aA:b:B:c:C:D:d:eE:f:FGg:hHi:IJ:j:k:K:l:L:m:M:n:N:oO:p:P:qQ:rR:s:S:t:T:u:U:vV:w:W:x:X:y:Y:z:Z:", long_options, NULL)) != -1) {
       switch (option) {
       case LONG_OPTION_ENB_CONF:
         if (optarg) {
@@ -474,7 +475,11 @@ void get_simulation_options(int argc, char *argv[]) {
         }
         oai_emulation.info.opt_mode = opt_type;
         break;
-
+    case 'q':
+      // openair performane profiler 
+      oai_emulation.info.opp_enabled = 1; // this var is used for OCG
+      opp_enabled = 1; // this is the global var used by oaisim 
+      break;
       case 'Q':
         //eMBMS_active=1;
         // 0 : not used (default), 1: eMBMS and RRC enabled, 2: eMBMS relaying and RRC enabled, 3: eMBMS enabled, RRC disabled, 4: eMBMS relaying enabled, RRC disabled
@@ -507,9 +512,7 @@ void get_simulation_options(int argc, char *argv[]) {
         break;
 
       case 't':
-        //Td = atof (optarg);
-        printf("[SIM] Option t is no longer supported on the command line. Please specify your channel model in the xml template\n");
-        exit(-1);
+	target_ul_mcs = atoi (optarg);
         break;
 
       case 'T':
@@ -856,7 +859,10 @@ void init_ocm() {
       get_beta_map_up();
 #endif
       get_MIESM_param();
+
+      //load_pbch_desc();
   }
+  
 
   for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
       enb_data[eNB_id] = (node_desc_t *)malloc(sizeof(node_desc_t));
@@ -912,7 +918,7 @@ void init_ocm() {
               forgetting_factor,
               0,
               0);
-          random_channel(eNB2UE[eNB_id][UE_id]);
+          random_channel(eNB2UE[eNB_id][UE_id],abstraction_flag);
           LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
               map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id);
 
@@ -924,15 +930,12 @@ void init_ocm() {
               0,
               0);
 
-          random_channel(UE2eNB[UE_id][eNB_id]);
-      }
-  }
-
-  // Not needed anymore, done automatically in init_freq_channel upon first call to the function
+      random_channel(UE2eNB[UE_id][eNB_id],abstraction_flag);
 
-  // if (abstraction_flag==1)
-  //    init_freq_channel(eNB2UE[0][0],PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL,PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL*12+1);
-  freq_channel(eNB2UE[0][0],PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL,PHY_vars_UE_g[0]->lte_frame_parms.N_RB_DL*12+1);
+      // to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed.
+      //UE2eNB[UE_id][eNB_id] = eNB2UE[eNB_id][UE_id];
+    }
+  }
 }
 
 void init_otg_pdcp_buffer() {
diff --git a/targets/SIMU/USER/oaisim_functions.h b/targets/SIMU/USER/oaisim_functions.h
index 42641d1c8c3..a4fbd51a8d0 100644
--- a/targets/SIMU/USER/oaisim_functions.h
+++ b/targets/SIMU/USER/oaisim_functions.h
@@ -40,6 +40,8 @@ void init_time();
 
 void init_pad();
 
+void help(void);
+
 int init_slot_isr(void);
 
 void wait_for_slot_isr(void);
diff --git a/targets/SIMU/USER/sinr_sim.c b/targets/SIMU/USER/sinr_sim.c
index 41769a04f33..62104bfb7f6 100644
--- a/targets/SIMU/USER/sinr_sim.c
+++ b/targets/SIMU/USER/sinr_sim.c
@@ -35,7 +35,7 @@
 
 #define PI 3.1416
 #define Am 20
-#define MCS_COUNT 24
+
 #define MCL (-70) /*minimum coupling loss (MCL) in dB*/
 //double sinr[NUMBER_OF_eNB_MAX][2*25];
 /*
@@ -169,7 +169,7 @@ void calc_path_loss(node_desc_t* enb_data, node_desc_t* ue_data, channel_desc_t
   
   path_loss = env_desc.fading.free_space_model_parameters.pathloss_0_dB - 
                 10*env_desc.fading.free_space_model_parameters.pathloss_exponent * log10(dist/1000); 
-  //printf("dist %f, Path loss %f\n",dist,ch_desc->path_loss_dB);
+  LOG_D(OCM,"dist %f, Path loss %f\n",dist,ch_desc->path_loss_dB);
 
   /* Calculating the angle in the range -pi to pi from the slope */
   alpha = atan2((ue_data->x - enb_data->x), (ue_data->y - enb_data->y));
@@ -522,20 +522,13 @@ void get_beta_map() {
   file_path = (char*) malloc(512);
 
   for (mcs = 0; mcs < MCS_COUNT; mcs++) {
-    sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/Perf_Curves_Abs/awgn_bler_tx1_mcs%d.csv",getenv("OPENAIR1_DIR"),mcs);
+    sprintf(file_path,"%s/SIMULATION/LTE_PHY/BLER_SIMULATIONS/AWGN/AWGN_results/bler_tx1_chan18_nrx1_mcs%d.csv",getenv("OPENAIR1_DIR"),mcs);
     fp = fopen(file_path,"r");
     if (fp == NULL) {
-      LOG_W(OCM,"ERROR: Unable to open the file %s, try an alternative path\n", file_path);
-      memset(file_path, 0, 512);
-      sprintf(file_path,"AWGN/awgn_snr_bler_mcs%d.csv",mcs);
-      LOG_I(OCM,"Opening the alternative path %s\n", file_path);
-      fp = fopen(file_path,"r");
-      if (fp == NULL) {
-      LOG_E(OCM,"ERROR: Unable to open the file %s, exisitng\n", file_path);
+      LOG_E(OCM,"ERROR: Unable to open the file %s! Exitng.\n", file_path);
       exit(-1);
       }
-    }
-    // else {
+     // else {
     if (fgets (buffer, 1000, fp) != NULL) {
       if (fgets (buffer, 1000, fp) != NULL) {
         table_length[mcs] = 0;
@@ -551,6 +544,10 @@ void get_beta_map() {
             sinr_bler_map[mcs][0][table_length[mcs]] = perf_array[0];
             sinr_bler_map[mcs][1][table_length[mcs]] = (perf_array[4] / perf_array[5]);
             table_length[mcs]++;
+	if (table_length[mcs]>MCS_TABLE_LENGTH_MAX) {
+	  LOG_E(OCM,"Error reading MCS table. Increase MCS_TABLE_LENGTH_MAX (mcs %d)!\n",mcs);
+	  exit(-1);
+	}
           }
           if (fgets (buffer, 1000, fp) != NULL) {
           }
@@ -560,10 +557,8 @@ void get_beta_map() {
       fclose(fp);
       //   }
     LOG_D(OCM,"Print the table for mcs %d\n",mcs);
-    // printf("Print the table for mcs %d\n",mcs);
     for (t = 0; t<table_length[mcs]; t++)
       LOG_D(OCM,"%lf  %lf \n ",sinr_bler_map[mcs][0][t],sinr_bler_map[mcs][1][t]);
-      // printf("%lf  %lf \n ",sinr_bler_map[mcs][0][t],sinr_bler_map[mcs][1][t]);
   }
   free(file_path);
 }
diff --git a/targets/TEST/OAI/case02.py b/targets/TEST/OAI/case02.py
index 251085be9aa..437eba6f777 100644
--- a/targets/TEST/OAI/case02.py
+++ b/targets/TEST/OAI/case02.py
@@ -80,7 +80,7 @@ def execute(oai, user, pw, logfile,logdir):
         oai.send_expect_false('./oaisim.rel8 ' + conf, '[E]', 30)
         
     except log.err, e:
-        log.fail(case, test, name, conf, e.value, diag, logfile)
+        log.fail(case, test, name, conf, e.value, diag, logfile,trace)
     else:
         log.ok(case, test, name, conf, '', logfile)
         
@@ -143,7 +143,7 @@ def execute(oai, user, pw, logfile,logdir):
         diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels'
         for i in range(NUM_UE) :
             for j in range(NUM_eNB) :
-                conf = '-A AWGN -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1'
+                conf = '-A AWGN -s 20 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1'
                 trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt'
                 tee = ' 2>&1 | tee ' + trace
                 oai.send_expect('./oaisim.rel8 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i),  (i+1) * 200)
@@ -158,7 +158,7 @@ def execute(oai, user, pw, logfile,logdir):
         diag = 'RRC procedure is not finished completely in FDD mode, check the execution logs and trace BCCH, CCCH, and DCCH channels'
         for i in range(NUM_UE) :
             for j in range(NUM_eNB) :
-                conf = '-A AWGN -F -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1'
+                conf = '-A AWGN -F -s 20 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -x1'
                 trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt'
                 tee = ' 2>&1 | tee ' + trace
                 oai.send_expect('./oaisim.rel8 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i),  (i+1) * 200)
diff --git a/targets/TEST/OAI/case03.py b/targets/TEST/OAI/case03.py
index a33292d048e..303ae013df5 100644
--- a/targets/TEST/OAI/case03.py
+++ b/targets/TEST/OAI/case03.py
@@ -105,7 +105,7 @@ def execute(oai, user, pw, logfile,logdir):
         diag = 'RRC procedure is not finished completely, check the execution logs and trace BCCH, CCCH, and DCCH channels'
         for i in range(NUM_UE) :
             for j in range(NUM_eNB) :
-                conf = '-A AWGN -l7 -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1)
+                conf = '-A AWGN -s20 -l7 -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1)
                 trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt'
                 tee = ' 2>&1 | tee ' + trace
                 oai.send_expect('./oaisim.rel10 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i),  (i+1) * 200)
@@ -120,7 +120,7 @@ def execute(oai, user, pw, logfile,logdir):
         diag = 'RRC procedure is not finished completely in FDD mode, check the execution logs and trace BCCH, CCCH, and DCCH channels'
         for i in range(NUM_UE) :
             for j in range(NUM_eNB) :
-                conf = '-A AWGN -l7 -F -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1)
+                conf = '-A AWGN -s20 -l7 -F -x 1 -n' + str((i+1+j) * 100) + ' -u' + str(i+1) +' -b'+ str(j+1)
                 trace = logdir + '/log_' + case + test + '_' + str(i) + str(j) + '.txt'
                 tee = ' 2>&1 | tee ' + trace
                 oai.send_expect('./oaisim.rel10 ' + conf + tee, ' Received RRCConnectionReconfigurationComplete from UE ' + str(i),  (i+1) * 200)
@@ -195,7 +195,7 @@ def execute(oai, user, pw, logfile,logdir):
                 log_name = logdir + '/log_' + case + test + '_' + str(i) + str(j)
                 itti_name = log_name + '.log'
                 trace_name = log_name + '.txt'
-                conf = '-A AWGN -l7 -s 15 -x 1 -Q3 --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name
+                conf = '-A AWGN -l7 -x 1 -Q3 --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name
                 tee = ' 2>&1 | tee -a ' + trace_name
                 command = './oaisim.rel10.itti ' + conf
                 oai.send('echo ' + command + ' > ' + trace_name + ';')
@@ -205,3 +205,6 @@ def execute(oai, user, pw, logfile,logdir):
     else:
         log.ok(case, test, name, conf, '', logfile)  
         
+
+
+
-- 
GitLab