diff --git a/executables/nr-gnb.c b/executables/nr-gnb.c
index c610107da6f764d2ecb4c722f08e98c0729b7f1f..e86eaf2ada2ce67f2bb7c218cd8e21668156ad13 100644
--- a/executables/nr-gnb.c
+++ b/executables/nr-gnb.c
@@ -682,6 +682,27 @@ static void* gNB_thread_prach( void* param ) {
 extern void init_td_thread(PHY_VARS_gNB *);
 extern void init_te_thread(PHY_VARS_gNB *);
 
+static void* process_stats_thread(void* param) {
+
+  PHY_VARS_gNB *gNB  = (PHY_VARS_gNB*)param;
+
+  reset_meas(&gNB->dlsch_encoding_stats);
+  reset_meas(&gNB->dlsch_scrambling_stats);
+  reset_meas(&gNB->dlsch_modulation_stats);
+
+  wait_sync("process_stats_thread");
+
+  while(!oai_exit)
+  {
+    sleep(1);
+    print_meas(&gNB->dlsch_encoding_stats, "pdsch_encoding", NULL, NULL);
+    print_meas(&gNB->dlsch_scrambling_stats, "pdsch_scrambling", NULL, NULL);
+    print_meas(&gNB->dlsch_modulation_stats, "pdsch_modulation", NULL, NULL);
+  }
+  return(NULL);
+}
+
+
 void init_gNB_proc(int inst) {
   int i=0;
   int CC_id;
@@ -729,6 +750,7 @@ void init_gNB_proc(int inst) {
       threadCreate( &L1_proc_tx->pthread, gNB_L1_thread_tx, gNB,"L1_proc_tx", -1, OAI_PRIORITY_RT);
     }
 
+    if(opp_enabled == 1) threadCreate(&proc->L1_stats_thread, process_stats_thread,(void *)gNB, "time_meas", -1, OAI_PRIORITY_RT_LOW);
     //pthread_create( &proc->pthread_prach, attr_prach, gNB_thread_prach, gNB );
     char name[16];
 
diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index c73b2fa27798a23e16ec0e196bfd47965aafa449..2337dcce7f86889955515b79369383e8b5797340 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -1077,30 +1077,42 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
       cfg->rx_bw = 1.5e6;
     } else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB);
   } else if (mu == NR_MU_1) {
-    if(N_RB == 217) {
+    if(N_RB == 273) {
+      if (fp->threequarter_fs) {
+        cfg->sample_rate=115.2e6;
+        cfg->samples_per_frame = 1152000;
+        cfg->tx_bw = 100e6;
+        cfg->rx_bw = 100e6;
+      } else {
+        cfg->sample_rate=153.6e6;
+        cfg->samples_per_frame = 1536000;
+        cfg->tx_bw = 100e6;
+        cfg->rx_bw = 100e6;
+      }
+    } else if(N_RB == 217) {
       if (fp->threequarter_fs) {
         cfg->sample_rate=92.16e6;
         cfg->samples_per_frame = 921600;
-        cfg->tx_bw = 40e6;
-        cfg->rx_bw = 40e6;
+        cfg->tx_bw = 80e6;
+        cfg->rx_bw = 80e6;
       } else {
         cfg->sample_rate=122.88e6;
         cfg->samples_per_frame = 1228800;
-        cfg->tx_bw = 40e6;
-        cfg->rx_bw = 40e6;
+        cfg->tx_bw = 80e6;
+        cfg->rx_bw = 80e6;
       }
     } else if(N_RB == 106) {
       if (fp->threequarter_fs) {
 	cfg->sample_rate=46.08e6;
 	cfg->samples_per_frame = 460800;
-	cfg->tx_bw = 20e6;
-	cfg->rx_bw = 20e6;
+	cfg->tx_bw = 40e6;
+	cfg->rx_bw = 40e6;
       }
       else {
 	cfg->sample_rate=61.44e6;
 	cfg->samples_per_frame = 614400;
-	cfg->tx_bw = 20e6;
-	cfg->rx_bw = 20e6;
+	cfg->tx_bw = 40e6;
+	cfg->rx_bw = 40e6;
       }
     } else {
       AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
@@ -1623,7 +1635,7 @@ extern void nr_feptx_ofdm(RU_t *ru,int frame_tx,int tti_tx);
 extern void nr_feptx_ofdm_2thread(RU_t *ru,int frame_tx,int tti_tx);
 extern void feptx_prec(RU_t *ru, int frame_tx,int tti_tx);
 extern void init_fep_thread(RU_t *ru);
-extern void init_nr_feptx_thread(RU_t *ru);
+extern void nr_init_feptx_thread(RU_t *ru);
 
 void init_RU_proc(RU_t *ru) {
   int i=0;
@@ -1688,7 +1700,7 @@ void init_RU_proc(RU_t *ru) {
     threadCreate( &proc->pthread_prach, ru_thread_prach, (void *)ru,"RACH", -1, OAI_PRIORITY_RT );
   }
 
-  if (get_nprocs()>=2) {
+  if (get_thread_worker_conf() == WORKER_ENABLE) {
     if (ru->feprx) init_fep_thread(ru);
 
     if (ru->feptx_ofdm) nr_init_feptx_thread(ru);
@@ -1982,8 +1994,8 @@ void set_function_spec_param(RU_t *ru) {
         ru->fh_north_out          = fh_if4p5_north_out;       // send_IF4p5 on reception
         ru->fh_south_out          = tx_rf;                    // send output to RF
         ru->fh_north_asynch_in    = fh_if4p5_north_asynch_in; // TX packets come asynchronously
-        ru->feprx                 = (get_nprocs()<=2) ? fep_full :ru_fep_full_2thread;                 // RX DFTs
-        ru->feptx_ofdm            = (get_nprocs()<=2) ? nr_feptx_ofdm : nr_feptx_ofdm_2thread;               // this is fep with idft only (no precoding in RRU)
+        ru->feprx                 = (get_thread_worker_conf() == WORKER_ENABLE) ? ru_fep_full_2thread : fep_full;                 // RX DFTs
+        ru->feptx_ofdm            = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm;               // this is fep with idft only (no precoding in RRU)
         ru->feptx_prec            = NULL;
         ru->nr_start_if           = nr_start_if;              // need to start the if interface for if4p5
         ru->ifdevice.host_type    = RRU_HOST;
@@ -2004,8 +2016,8 @@ void set_function_spec_param(RU_t *ru) {
         malloc_IF4p5_buffer(ru);
       } else if (ru->function == gNodeB_3GPP) {
         ru->do_prach             = 0;                       // no prach processing in RU
-        ru->feprx                = (get_nprocs()<=2) ? fep_full : ru_fep_full_2thread;                // RX DFTs
-        ru->feptx_ofdm           = (get_nprocs()<=2) ? nr_feptx_ofdm : nr_feptx_ofdm_2thread;              // this is fep with idft and precoding
+        ru->feprx                = (get_thread_worker_conf() == WORKER_ENABLE) ? ru_fep_full_2thread : fep_full;                // RX DFTs
+        ru->feptx_ofdm           = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm;              // this is fep with idft and precoding
         ru->feptx_prec           = NULL;              // this is fep with idft and precoding
         ru->fh_north_in          = NULL;                    // no incoming fronthaul from north
         ru->fh_north_out         = NULL;                    // no outgoing fronthaul to north
@@ -2034,13 +2046,13 @@ void set_function_spec_param(RU_t *ru) {
 
     case REMOTE_IF5: // the remote unit is IF5 RRU
       ru->do_prach               = 0;
-      ru->feprx                  = (get_nprocs()<=2) ? fep_full : fep_full;                   // this is frequency-shift + DFTs
-      ru->feptx_prec             = feptx_prec;          // need to do transmit Precoding + IDFTs
-      ru->feptx_ofdm             = (get_nprocs()<=2) ? nr_feptx_ofdm : nr_feptx_ofdm_2thread; // need to do transmit Precoding + IDFTs
-      ru->fh_south_in            = fh_if5_south_in;     // synchronous IF5 reception
-      ru->fh_south_out           = fh_if5_south_out;    // synchronous IF5 transmission
-      ru->fh_south_asynch_in     = NULL;                // no asynchronous UL
-      ru->start_rf               = NULL;                // no local RF
+      ru->feprx                  = fep_full;                   // this is frequency-shift + DFTs
+      ru->feptx_prec             = feptx_prec;                 // need to do transmit Precoding + IDFTs
+      ru->feptx_ofdm             = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm;                 // need to do transmit Precoding + IDFTs
+      ru->fh_south_in          = fh_if5_south_in;     // synchronous IF5 reception
+      ru->fh_south_out         = fh_if5_south_out;    // synchronous IF5 transmission
+      ru->fh_south_asynch_in   = NULL;                // no asynchronous UL
+      ru->start_rf               = NULL;                 // no local RF
       ru->stop_rf                = NULL;
       ru->nr_start_if            = nr_start_if;         // need to start if interface for IF5
       ru->ifdevice.host_type     = RAU_HOST;
diff --git a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
index d299cbdbaf887a1511898e2405bff97c4bbceea2..aad688c9d4201f4904ecb26e2cb035ff8d5c4bc6 100644
--- a/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
+++ b/nfapi/open-nFAPI/nfapi/public_inc/nfapi_nr_interface.h
@@ -574,44 +574,44 @@ typedef struct {
 } nfapi_nr_dl_config_bch_pdu;
 
 typedef struct {
-	nfapi_tl_t tl;
-	uint16_t length;
-	uint8_t pdu_index;
-	uint16_t rnti;
-    uint16_t nb_mod_symbols;
-    uint8_t time_allocation_type;
-	uint8_t freq_allocation_type;
-    uint8_t start_prb;
-    uint8_t n_prb;
-    uint8_t start_symbol;
-    uint8_t nb_symbols;
-    uint8_t mcs_idx;
-    uint8_t ndi;
-    uint8_t nb_codewords;
-    uint8_t nb_layers;
-    uint16_t coding_rate;
-    uint8_t modulation;
-    uint8_t modulation_order;
-    uint16_t transport_block_size;
-    uint8_t nb_re_dmrs;
-    uint8_t time_alloc_list_flag;
-    uint8_t time_alloc_list;
-    uint8_t rbg_list;
-	uint8_t virtual_resource_block_assignment_flag;
-	uint32_t resource_block_coding;
-	uint8_t redundancy_version;
-	uint8_t transport_blocks;
-	uint8_t transmission_scheme;
-	uint8_t number_of_subbands;
-	uint8_t codebook_index[NFAPI_MAX_NUM_SUBBANDS];
-	uint8_t ue_category_capacity;
-	uint8_t pa;
-	uint8_t delta_power_offset_index;
-	uint8_t ngap;
-	uint8_t transmission_mode;
-	uint8_t num_bf_prb_per_subband;
-	uint8_t num_bf_vector;
-	nfapi_bf_vector_t bf_vector[NFAPI_MAX_BF_VECTORS];
+  nfapi_tl_t tl;
+  uint16_t length;
+  uint8_t pdu_index;
+  uint16_t rnti;
+  uint16_t nb_mod_symbols;
+  uint8_t time_allocation_type;
+  uint8_t freq_allocation_type;
+  uint16_t start_prb;
+  uint16_t n_prb;
+  uint8_t start_symbol;
+  uint8_t nb_symbols;
+  uint8_t mcs_idx;
+  uint8_t ndi;
+  uint8_t nb_codewords;
+  uint8_t nb_layers;
+  uint16_t coding_rate;
+  uint8_t modulation;
+  uint8_t modulation_order;
+  uint16_t transport_block_size;
+  uint8_t nb_re_dmrs;
+  uint8_t time_alloc_list_flag;
+  uint8_t time_alloc_list;
+  uint8_t rbg_list;
+  uint8_t virtual_resource_block_assignment_flag;
+  uint32_t resource_block_coding;
+  uint8_t redundancy_version;
+  uint8_t transport_blocks;
+  uint8_t transmission_scheme;
+  uint8_t number_of_subbands;
+  uint8_t codebook_index[NFAPI_MAX_NUM_SUBBANDS];
+  uint8_t ue_category_capacity;
+  uint8_t pa;
+  uint8_t delta_power_offset_index;
+  uint8_t ngap;
+  uint8_t transmission_mode;
+  uint8_t num_bf_prb_per_subband;
+  uint8_t num_bf_vector;
+  nfapi_bf_vector_t bf_vector[NFAPI_MAX_BF_VECTORS];
 }nfapi_nr_dl_config_dlsch_pdu_rel15_t;
 #define NFAPI_NR_DL_CONFIG_REQUEST_DLSCH_PDU_REL15_TAG
 
diff --git a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
index 4466fc8eeae76ef5453240d9890838ff308912cd..d5a815333e56cfae089d3f83641796b7b814dd80 100644
--- a/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
+++ b/openair1/PHY/CODING/nrLDPC_encoder/ldpc_encoder2.c
@@ -271,17 +271,17 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
   memset(c,0,sizeof(unsigned char) * ncols * Zc);
   memset(d,0,sizeof(unsigned char) * nrows * Zc);
 
-  start_meas(tinput);
+  if(tinput != NULL) start_meas(tinput);
   for (i=0; i<block_length; i++) {
       c[i] = (test_input[i/8]&(1<<(i&7)))>>(i&7);
       //printf("c(%d,%d)=%d\n",j,i,temp);
     }
 
-  stop_meas(tinput);
+  if(tinput != NULL) stop_meas(tinput);
 
   if ((BG==1 && Zc>176) || (BG==2 && Zc>64)) { 
     // extend matrix
-    start_meas(tprep);
+    if(tprep != NULL) start_meas(tprep);
     for (i1=0; i1 < ncols; i1++)
       {
 	memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char));
@@ -296,11 +296,11 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
 	printf("\n");
       */
     }
-    stop_meas(tprep);
+    if(tprep != NULL) stop_meas(tprep);
     //parity check part
-    start_meas(tparity);
+    if(tparity != NULL) start_meas(tparity);
     encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb);
-    stop_meas(tparity);
+    if(tparity != NULL) stop_meas(tparity);
   }
   else {
     if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) {
@@ -308,12 +308,12 @@ int ldpc_encoder_optim(unsigned char *test_input,unsigned char *channel_input,sh
       return(-1);
     }
   }
-  start_meas(toutput);
+  if(toutput != NULL) start_meas(toutput);
   // information part and puncture columns
   memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
   memcpy(&channel_input[block_length-2*Zc], &d[0], ((nrows-no_punctured_columns) * Zc-removed_bit)*sizeof(unsigned char));
 
-  stop_meas(toutput);
+  if(toutput != NULL) stop_meas(toutput);
   return 0;
 }
 
@@ -408,7 +408,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
   memset(c,0,sizeof(unsigned char) * ncols * Zc);
   memset(d,0,sizeof(unsigned char) * nrows * Zc);
 
-  start_meas(tinput);
+  if(tinput != NULL) start_meas(tinput);
 #if 0
   for (i=0; i<block_length; i++) {
     for (j=0; j<n_segments; j++) {
@@ -441,11 +441,11 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
 #endif
 #endif
 
-  stop_meas(tinput);
+  if(tinput != NULL) stop_meas(tinput);
 
   if ((BG==1 && Zc>176) || (BG==2 && Zc>64)) { 
     // extend matrix
-    start_meas(tprep);
+    if(tprep != NULL) start_meas(tprep);
     for (i1=0; i1 < ncols; i1++)
       {
 	memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char));
@@ -460,11 +460,11 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
 	printf("\n");
       */
     }
-    stop_meas(tprep);
+    if(tprep != NULL) stop_meas(tprep);
     //parity check part
-    start_meas(tparity);
+    if(tparity != NULL) start_meas(tparity);
     encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb);
-    stop_meas(tparity);
+    if(tparity != NULL) stop_meas(tparity);
   }
   else {
     if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) {
@@ -472,7 +472,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
       return(-1);
     }
   }
-  start_meas(toutput);
+  if(toutput != NULL) start_meas(toutput);
   // information part and puncture columns
   /*
   memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
@@ -513,7 +513,7 @@ int ldpc_encoder_optim_8seg(unsigned char **test_input,unsigned char **channel_i
     AssertFatal(1==0,"Need AVX2 for now\n");
 #endif
 
-  stop_meas(toutput);
+  if(toutput != NULL) stop_meas(toutput);
   return 0;
 }
 
@@ -613,7 +613,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
   memset(c,0,sizeof(unsigned char) * ncols * Zc);
   memset(d,0,sizeof(unsigned char) * nrows * Zc);
 
-  start_meas(tinput);
+  if(tinput != NULL) start_meas(tinput);
 #if 0
   for (i=0; i<block_length; i++) {
 	//for (j=0; j<n_segments; j++) {
@@ -649,11 +649,11 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
 #endif
 #endif
 
-  stop_meas(tinput);
+  if(tinput != NULL) stop_meas(tinput);
 
   if ((BG==1 && Zc>176) || (BG==2 && Zc>64)) {
     // extend matrix
-    start_meas(tprep);
+    if(tprep != NULL) start_meas(tprep);
     for (i1=0; i1 < ncols; i1++)
       {
 	memcpy(&c_extension[2*i1*Zc], &c[i1*Zc], Zc*sizeof(unsigned char));
@@ -668,11 +668,11 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
 	printf("\n");
       */
     }
-    stop_meas(tprep);
+    if(tprep != NULL) stop_meas(tprep);
     //parity check part
-    start_meas(tparity);
+    if(tparity != NULL) start_meas(tparity);
     encode_parity_check_part_optim(c_extension, d, BG, Zc, Kb);
-    stop_meas(tparity);
+    if(tparity != NULL) stop_meas(tparity);
   }
   else {
     if (encode_parity_check_part_orig(c, d, BG, Zc, Kb, block_length)!=0) {
@@ -680,7 +680,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
       return(-1);
     }
   }
-  start_meas(toutput);
+  if(toutput != NULL) start_meas(toutput);
   // information part and puncture columns
   /*
   memcpy(&channel_input[0], &c[2*Zc], (block_length-2*Zc)*sizeof(unsigned char));
@@ -726,7 +726,7 @@ int ldpc_encoder_optim_8seg_multi(unsigned char **test_input,unsigned char **cha
     AssertFatal(1==0,"Need AVX2 for now\n");
 #endif
 
-  stop_meas(toutput);
+  if(toutput != NULL) stop_meas(toutput);
   return 0;
 }
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
index 9a4df3889514ae1c517292773013309e91f2a35d..aa75bd6555ba50c1103489ea8fdcb6841bbbc6fa 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c
@@ -74,7 +74,10 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
                           int     frame,
                           uint8_t slot,
                           NR_DL_FRAME_PARMS *frame_parms,
-                          nfapi_nr_config_request_t *config) {
+                          nfapi_nr_config_request_t *config,
+                          time_stats_t *dlsch_encoding_stats,
+                          time_stats_t *dlsch_scrambling_stats,
+                          time_stats_t *dlsch_modulation_stats) {
 
   NR_DL_gNB_HARQ_t *harq = dlsch->harq_processes[dci_alloc->harq_pid];
   nfapi_nr_dl_config_dlsch_pdu_rel15_t *rel15 = &harq->dlsch_pdu.dlsch_pdu_rel15;
@@ -89,7 +92,9 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
 
   /// CRC, coding, interleaving and rate matching
   AssertFatal(harq->pdu!=NULL,"harq->pdu is null\n");
+  start_meas(dlsch_encoding_stats);
   nr_dlsch_encoding(harq->pdu, frame, slot, dlsch, frame_parms);
+  stop_meas(dlsch_encoding_stats);
 #ifdef DEBUG_DLSCH
 printf("PDSCH encoding:\nPayload:\n");
 for (int i=0; i<harq->B>>7; i++) {
@@ -107,6 +112,7 @@ printf("\n");
 #endif
 
   /// scrambling
+  start_meas(dlsch_scrambling_stats);
   for (int q=0; q<rel15->nb_codewords; q++)
     memset((void*)scrambled_output[q], 0, (encoded_length>>5)*sizeof(uint32_t));
   uint16_t n_RNTI = (pdcch_params.search_space_type == NFAPI_NR_SEARCH_SPACE_TYPE_UE_SPECIFIC)? \
@@ -120,6 +126,7 @@ printf("\n");
                          Nid,
                          n_RNTI,
                          scrambled_output[q]);
+  stop_meas(dlsch_scrambling_stats);
 #ifdef DEBUG_DLSCH
 printf("PDSCH scrambling:\n");
 for (int i=0; i<encoded_length>>8; i++) {
@@ -130,12 +137,13 @@ for (int i=0; i<encoded_length>>8; i++) {
 #endif
  
   /// Modulation
-
+  start_meas(dlsch_modulation_stats);
   for (int q=0; q<rel15->nb_codewords; q++)
     nr_modulation(scrambled_output[q],
                          encoded_length,
                          Qm,
                          mod_symbs[q]);
+  stop_meas(dlsch_modulation_stats);
 #ifdef DEBUG_DLSCH
 printf("PDSCH Modulation: Qm %d(%d)\n", Qm, nb_symbols);
 for (int i=0; i<nb_symbols>>3; i++) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
index 7c3e22a9e713c0fb9e95e545821508ba37fa59db..3419be30faa9f5e5eeaf21924e5e65350ad3462d 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.h
@@ -74,7 +74,11 @@ uint8_t nr_generate_pdsch(NR_gNB_DLSCH_t *dlsch,
                           int frame,
                           uint8_t slot,
                           NR_DL_FRAME_PARMS *frame_parms,
-                          nfapi_nr_config_request_t *config);
+                          nfapi_nr_config_request_t *config,
+                          time_stats_t *dlsch_encoding_stats,
+                          time_stats_t *dlsch_scrambling_stats,
+                          time_stats_t *dlsch_modulation_stats);
+
 
 void free_gNB_dlsch(NR_gNB_DLSCH_t *dlsch);
 
diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
index b3ce80d1ae2e6a2b5cfa8e841ed0791346f60d07..04098a8440115dac74328ed66b6ea8dc64c4d370 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch_coding.c
@@ -366,7 +366,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
 
     //printf("segment Z %d k %d Kr %d BG %d\n", *pz,dlsch->harq_processes[harq_pid]->K,Kr,BG);
 
-    //start_meas(te_stats);
     for (r=0; r<dlsch->harq_processes[harq_pid]->C; r++) {
       //d_tmp[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
       //channel_input[r] = &dlsch->harq_processes[harq_pid]->d[r][0];
@@ -398,7 +397,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
     //ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,d_tmp,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
     ldpc_encoder_optim_8seg(dlsch->harq_processes[harq_pid]->c,dlsch->harq_processes[harq_pid]->d,Kr,BG,dlsch->harq_processes[harq_pid]->C,NULL,NULL,NULL,NULL);
 
-    //stop_meas(te_stats);
     //printf("end ldpc encoder -- output\n");
 
 #ifdef DEBUG_DLSCH_CODING
@@ -425,7 +423,6 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
         mod_order,nb_rb);
 #endif
 
-    //start_meas(rm_stats);
 #ifdef DEBUG_DLSCH_CODING
   printf("rvidx in encoding = %d\n", rel15.redundancy_version);
 #endif
@@ -447,14 +444,11 @@ int nr_dlsch_encoding(unsigned char *a,int frame,
     for (int i =0; i<16; i++)
       printf("output ratematching e[%d]= %d r_offset %d\n", i,dlsch->harq_processes[harq_pid]->e[i+r_offset], r_offset);
 #endif
-    //stop_meas(rm_stats);
 
-    //start_meas(i_stats);
 	nr_interleaving_ldpc(E,
 						mod_order,
 						dlsch->harq_processes[harq_pid]->e+r_offset,
 						dlsch->harq_processes[harq_pid]->f+r_offset);
-    //stop_meas(i_stats);
 
 
 #ifdef DEBUG_DLSCH_CODING
diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h
index 5d618b60c78cb1eb97be5ef8ac9c02df292a680c..e79f9f28ac9e89c738bbf999db984bde4b18b973 100644
--- a/openair1/PHY/defs_gNB.h
+++ b/openair1/PHY/defs_gNB.h
@@ -465,6 +465,8 @@ typedef struct gNB_L1_proc_t_s {
   pthread_t pthread_single;
   /// pthread structure for asychronous RX/TX processing thread
   pthread_t pthread_asynch_rxtx;
+  /// pthread structure for printing time meas
+  pthread_t L1_stats_thread;
   /// flag to indicate first RX acquisition
   int first_rx;
   /// flag to indicate first TX transmission
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index d2a3739a1f305091d5e1f85571215d4a4cc3ae50..cb6cb7900eb23af89018d5322550212ff17523cb 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -196,7 +196,11 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
                           &gNB->pdcch_vars.dci_alloc[0],
                           gNB->nr_gold_pdsch_dmrs[slot],
                           gNB->common_vars.txdataF,
-                          AMP, frame, slot, fp, cfg);
+                          AMP, frame, slot, fp, cfg,
+                          &gNB->dlsch_encoding_stats,
+                          &gNB->dlsch_scrambling_stats,
+                          &gNB->dlsch_modulation_stats);
+
 	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_GENERATE_DLSCH,0);
       }
     }
diff --git a/openair2/GNB_APP/gnb_config.c b/openair2/GNB_APP/gnb_config.c
index 4c30ef9140704f21b3580554eb75e8baa515b8ec..25cfa3c51668c6f127d9706bc610984c5ed291a4 100644
--- a/openair2/GNB_APP/gnb_config.c
+++ b/openair2/GNB_APP/gnb_config.c
@@ -810,8 +810,9 @@ void RCconfig_NRRRC(MessageDef *msg_p, uint32_t i, gNB_RRC_INST *rrc) {
             NRRRC_CONFIGURATION_REQ (msg_p).N_RB_DL[j]= N_RB_DL;
             if(N_RB_DL == 217)      sf_ahead = 2;
             else if(N_RB_DL == 106) sf_ahead = 4;
-            else                    AssertFatal (0,"Failed to parse gNB configuration file %s, gnb %d unknown value \"%d\" for N_RB_DL choice: 106, 217 !\n",
-                                                 RC.config_file_name, i, N_RB_DL);
+            else                    sf_ahead = 4;
+            /*else                    AssertFatal (0,"Failed to parse gNB configuration file %s, gnb %d unknown value \"%d\" for N_RB_DL choice: 106, 217 !\n",
+                                                 RC.config_file_name, i, N_RB_DL);*/
             
             /*
             if ((N_RB_DL!=6) && (N_RB_DL!=15) && (N_RB_DL!=25) && (N_RB_DL!=50) && (N_RB_DL!=75) && (N_RB_DL!=100)) {
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 6e6197c898bb024af5bda149acc58b613c9084b1..76ebd556ca6046c52caca9f9f982eac08844cef8 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -1191,6 +1191,22 @@ extern "C" {
         LOG_I(HW,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate);
 
         switch ((int)openair0_cfg[0].sample_rate) {
+          case 153600000:
+            // from usrp_time_offset
+            //openair0_cfg[0].samples_per_packet    = 2048;
+            openair0_cfg[0].tx_sample_advance     = 15; //to be checked
+            openair0_cfg[0].tx_bw                 = 100e6;
+            openair0_cfg[0].rx_bw                 = 100e6;
+            break;
+
+          case 115200000:
+            // from usrp_time_offset
+            //openair0_cfg[0].samples_per_packet    = 2048;
+            openair0_cfg[0].tx_sample_advance     = 15; //to be checked
+            openair0_cfg[0].tx_bw                 = 100e6;
+            openair0_cfg[0].rx_bw                 = 100e6;
+            break;
+
           case 122880000:
             // from usrp_time_offset
             //openair0_cfg[0].samples_per_packet    = 2048;