diff --git a/executables/nr-ru.c b/executables/nr-ru.c
index 74ea8b7e0729525c9d14a3c7c3e02b0c099d5226..4a2b22331bb4251acd318c39f299aac0ebfb88cd 100644
--- a/executables/nr-ru.c
+++ b/executables/nr-ru.c
@@ -307,7 +307,7 @@ void fh_if5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
 // southbound IF4p5 fronthaul
 void fh_if4p5_south_out(RU_t *ru, int frame, int slot, uint64_t timestamp)
 {
-  nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config;
+  nfapi_nr_config_request_scf_t *cfg = &ru->config;
   if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff );
 
   LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.tti_tx);
@@ -516,7 +516,7 @@ void fh_if5_north_asynch_in(RU_t *ru,int *frame,int *slot) {
 
 void fh_if4p5_north_asynch_in(RU_t *ru,int *frame,int *slot) {
   NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
-  nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config;
+  nfapi_nr_config_request_scf_t *cfg = &ru->config;
   RU_proc_t *proc        = &ru->proc;
   uint16_t packet_type;
   uint32_t symbol_number,symbol_mask,symbol_mask_full=0;
@@ -711,7 +711,7 @@ void rx_rf(RU_t *ru,int *frame,int *slot) {
 void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) { 
   RU_proc_t *proc = &ru->proc;
   NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
-  nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config;
+  nfapi_nr_config_request_scf_t *cfg = &ru->config;
   void *txp[ru->nb_tx];
   unsigned int txs;
   int i,txsymb;
@@ -798,7 +798,7 @@ void *ru_thread_asynch_rxtx( void *param ) {
   static int ru_thread_asynch_rxtx_status;
   RU_t *ru         = (RU_t *)param;
   RU_proc_t *proc  = &ru->proc;
-  nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config;
+  nfapi_nr_config_request_scf_t *cfg = &ru->config;
   int slot=0, frame=0;
   // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe
   wait_sync("ru_thread_asynch_rxtx");
@@ -1043,10 +1043,10 @@ int wakeup_prach_ru(RU_t *ru) {
 void fill_rf_config(RU_t *ru, char *rf_config_file) {
   int i;
   NR_DL_FRAME_PARMS *fp   = ru->nr_frame_parms;
-  nfapi_nr_config_request_scf_t *gNB_config = &ru->gNB_list[0]->gNB_config; //tmp index
+  nfapi_nr_config_request_scf_t *config = &ru->config; //tmp index
   openair0_config_t *cfg   = &ru->openair0_cfg;
-  int mu = gNB_config->ssb_config.scs_common.value;
-  int N_RB = gNB_config->carrier_config.dl_grid_size[gNB_config->ssb_config.scs_common.value].value;
+  int mu = config->ssb_config.scs_common.value;
+  int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
 
   if (mu == NR_MU_0) { //or if LTE
     if(N_RB == 100) {
@@ -1131,7 +1131,7 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
     AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
   }
 
-  if (gNB_config->cell_config.frame_duplex_type.value==TDD)
+  if (config->cell_config.frame_duplex_type.value==TDD)
     cfg->duplex_mode = duplex_mode_TDD;
   else //FDD
     cfg->duplex_mode = duplex_mode_FDD;
@@ -1170,7 +1170,7 @@ int setup_RU_buffers(RU_t *ru) {
   int card,ant;
   //uint16_t N_TA_offset = 0;
   NR_DL_FRAME_PARMS *frame_parms;
-  //nfapi_nr_config_request_t *gNB_config = ru->gNB_list[0]->gNB_config; //tmp index
+  nfapi_nr_config_request_scf_t *config = &ru->config;
 
   if (ru) {
     frame_parms = ru->nr_frame_parms;
@@ -1179,12 +1179,54 @@ int setup_RU_buffers(RU_t *ru) {
     printf("ru pointer is NULL\n");
     return(-1);
   }
+  int mu = config->ssb_config.scs_common.value;
+  int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
 
-  /*  if (frame_parms->frame_type == TDD) {
-      if      (frame_parms->N_RB_DL == 100) ru->N_TA_offset = 624;
-      else if (frame_parms->N_RB_DL == 50)  ru->N_TA_offset = 624/2;
-      else if (frame_parms->N_RB_DL == 25)  ru->N_TA_offset = 624/4;
-    } */
+
+  if (config->cell_config.frame_duplex_type.value == TDD) {
+    int N_TA_offset =  config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples  for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
+
+    double factor=1;
+
+    switch (mu) {
+    case 0: //15 kHz scs
+      AssertFatal(N_TA_offset == 400,"scs_common 15kHz only for FR1\n");
+      if (N_RB <= 25) factor = .25;      // 7.68 Ms/s
+      else if (N_RB <=50) factor = .5;   // 15.36 Ms/s
+      else if (N_RB <=75) factor = 1.0;  // 30.72 Ms/s
+      else if (N_RB <=100) factor = 1.0; // 30.72 Ms/s
+      else AssertFatal(1==0,"Too many PRBS for mu=0\n");
+      break;
+    case 1: //30 kHz sc
+      AssertFatal(N_TA_offset == 400,"scs_common 30kHz only for FR1\n");
+      if (N_RB <= 106) factor = 2.0; // 61.44 Ms/s
+      else if (N_RB <= 275) factor = 4.0; // 122.88 Ms/s
+      break;
+    case 2: //60 kHz scs
+      AssertFatal(1==0,"scs_common should not be 60 kHz\n");
+      break;
+    case 3: //120 kHz scs
+      AssertFatal(N_TA_offset == 431,"scs_common 120kHz only for FR2\n");
+      break;
+    case 4: //240 kHz scs
+      AssertFatal(1==0,"scs_common should not be 60 kHz\n");
+      if (N_RB <= 32) factor = 1.0; // 61.44 Ms/s
+      else if (N_RB <= 66) factor = 2.0; // 122.88 Ms/s
+      else AssertFatal(1==0,"N_RB %d is too big for curretn FR2 implementation\n",N_RB);
+      break;
+
+      if      (N_RB == 100) ru->N_TA_offset = 624;
+      else if (N_RB == 50)  ru->N_TA_offset = 624/2;
+      else if (N_RB == 25)  ru->N_TA_offset = 624/4;
+    }
+    if (frame_parms->threequarter_fs == 1) factor = factor*.75;
+    ru->N_TA_offset = (int)(N_TA_offset * factor);
+    LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d)\n",ru->idx,ru->N_TA_offset,factor,
+	  config->carrier_config.uplink_frequency.value, N_RB);
+  }
+  else ru->N_TA_offset = 0;
+
+  
   if (ru->openair0_cfg.mmapped_dma == 1) {
     // replace RX signal buffers with mmaped HW versions
     for (i=0; i<ru->nb_rx; i++) {
@@ -1397,7 +1439,7 @@ void *ru_thread( void *param ) {
   int                i = 0;
   int                aa;
 
-  nfapi_nr_config_request_scf_t *cfg = &ru->gNB_list[0]->gNB_config;
+  nfapi_nr_config_request_scf_t *cfg = &ru->config;
   
   // set default return value
   ru_thread_status = 0;
@@ -1409,7 +1451,7 @@ void *ru_thread( void *param ) {
 
   if(emulate_rf) {
     fill_rf_config(ru,ru->rf_config_file);
-    nr_init_frame_parms(&ru->gNB_list[0]->gNB_config, fp);
+    nr_init_frame_parms(&ru->config, fp);
     nr_dump_frame_parms(fp);
     nr_phy_init_RU(ru);
 
@@ -1429,8 +1471,10 @@ void *ru_thread( void *param ) {
       AssertFatal(ret==0,"Cannot connect to remote radio\n");
     }
 
+    memcpy((void*)&ru->config,(void*)&RC.gNB[0]->gNB_config,sizeof(ru->config));
+
     if (ru->if_south == LOCAL_RF) { // configure RF parameters only
-      nr_init_frame_parms(&ru->gNB_list[0]->gNB_config, fp);
+      nr_init_frame_parms(&ru->config, fp);
       nr_dump_frame_parms(fp);
       fill_rf_config(ru,ru->rf_config_file);
       nr_phy_init_RU(ru);
@@ -1907,7 +1951,7 @@ void configure_ru(int idx,
   RU_t               *ru           = RC.ru[idx];
   RRU_config_t       *config       = (RRU_config_t *)arg;
   RRU_capabilities_t *capabilities = (RRU_capabilities_t *)arg;
-  nfapi_nr_config_request_scf_t *gNB_config = &ru->gNB_list[0]->gNB_config;
+  nfapi_nr_config_request_scf_t *cfg = &ru->config;
   int ret;
   LOG_I(PHY, "Received capabilities from RRU %d\n",idx);
 
@@ -1930,15 +1974,15 @@ void configure_ru(int idx,
   //config->tdd_config_S[0]        = ru->nr_frame_parms->tdd_config_S;
   config->att_tx[0]              = ru->att_tx;
   config->att_rx[0]              = ru->att_rx;
-  config->N_RB_DL[0]             = gNB_config->carrier_config.dl_grid_size[gNB_config->ssb_config.scs_common.value].value;
-  config->N_RB_UL[0]             = gNB_config->carrier_config.dl_grid_size[gNB_config->ssb_config.scs_common.value].value;
+  config->N_RB_DL[0]             = cfg->carrier_config.dl_grid_size[cfg->ssb_config.scs_common.value].value;
+  config->N_RB_UL[0]             = cfg->carrier_config.dl_grid_size[cfg->ssb_config.scs_common.value].value;
   config->threequarter_fs[0]     = ru->nr_frame_parms->threequarter_fs;
   /*  if (ru->if_south==REMOTE_IF4p5) {
       config->prach_FreqOffset[0]  = ru->nr_frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset;
       config->prach_ConfigIndex[0] = ru->nr_frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
       LOG_I(PHY,"REMOTE_IF4p5: prach_FrequOffset %d, prach_ConfigIndex %d\n",
       config->prach_FreqOffset[0],config->prach_ConfigIndex[0]);*/
-  nr_init_frame_parms(&ru->gNB_list[0]->gNB_config, ru->nr_frame_parms);
+  nr_init_frame_parms(&ru->config, ru->nr_frame_parms);
   nr_phy_init_RU(ru);
 }
 
@@ -1946,23 +1990,23 @@ void configure_rru(int idx,
                    void *arg) {
   RRU_config_t *config     = (RRU_config_t *)arg;
   RU_t         *ru         = RC.ru[idx];
-  nfapi_nr_config_request_scf_t *gNB_config = &ru->gNB_list[0]->gNB_config;
+  nfapi_nr_config_request_scf_t *cfg = &ru->config;
   ru->nr_frame_parms->nr_band                                             = config->band_list[0];
   ru->nr_frame_parms->dl_CarrierFreq                                      = config->tx_freq[0];
   ru->nr_frame_parms->ul_CarrierFreq                                      = config->rx_freq[0];
 
   if (ru->nr_frame_parms->dl_CarrierFreq == ru->nr_frame_parms->ul_CarrierFreq) {
-    gNB_config->cell_config.frame_duplex_type.value                       = TDD;
+    cfg->cell_config.frame_duplex_type.value                       = TDD;
     //ru->nr_frame_parms->tdd_config                                        = config->tdd_config[0];
     //ru->nr_frame_parms->tdd_config_S                                      = config->tdd_config_S[0];
   } else
-    gNB_config->cell_config.frame_duplex_type.value                       = FDD;
+    cfg->cell_config.frame_duplex_type.value                       = FDD;
 
   ru->att_tx                                                              = config->att_tx[0];
   ru->att_rx                                                              = config->att_rx[0];
-  int mu = gNB_config->ssb_config.scs_common.value;
-  gNB_config->carrier_config.dl_grid_size[mu].value                       = config->N_RB_DL[0];
-  gNB_config->carrier_config.dl_grid_size[mu].value                       = config->N_RB_UL[0];
+  int mu = cfg->ssb_config.scs_common.value;
+  cfg->carrier_config.dl_grid_size[mu].value                       = config->N_RB_DL[0];
+  cfg->carrier_config.dl_grid_size[mu].value                       = config->N_RB_UL[0];
   ru->nr_frame_parms->threequarter_fs                                     = config->threequarter_fs[0];
 
   //ru->nr_frame_parms->pdsch_config_common.referenceSignalPower                 = ru->max_pdschReferenceSignalPower-config->att_tx[0];
@@ -1977,7 +2021,7 @@ void configure_rru(int idx,
   }
 
   fill_rf_config(ru,ru->rf_config_file);
-  nr_init_frame_parms(&ru->gNB_list[0]->gNB_config, ru->nr_frame_parms);
+  nr_init_frame_parms(&ru->config, ru->nr_frame_parms);
   nr_phy_init_RU(ru);
 }
 
diff --git a/openair1/PHY/INIT/nr_init_ru.c b/openair1/PHY/INIT/nr_init_ru.c
index 26c118040a7fd6d349d0df52bf38c417097b40b0..b6b1626c4b8c9b3c8ab82d693ec6ba09f38116a7 100644
--- a/openair1/PHY/INIT/nr_init_ru.c
+++ b/openair1/PHY/INIT/nr_init_ru.c
@@ -47,11 +47,10 @@ int nr_phy_init_RU(RU_t *ru) {
   nfapi_nr_config_request_scf_t *cfg;
   ru->nb_log_antennas=0;
   for (int n=0;n<RC.nb_nr_L1_inst;n++) {
-    cfg = &RC.gNB[n]->gNB_config;
+    cfg = &ru->config;
     if (cfg->carrier_config.num_tx_ant.value > ru->nb_log_antennas) ru->nb_log_antennas = cfg->carrier_config.num_tx_ant.value;   
   }
   // copy configuration from gNB[0] in to RU, assume that all gNB instances sharing RU use the same configuration (at least the parts that are needed by the RU, numerology and PRACH)
-  memcpy((void*)&ru->config,(void*)&RC.gNB[0]->gNB_config,sizeof(ru->config));
 
   AssertFatal(ru->nb_log_antennas > 0 && ru->nb_log_antennas < 13, "ru->nb_log_antennas %d ! \n",ru->nb_log_antennas);
   if (ru->if_south <= REMOTE_IF5) { // this means REMOTE_IF5 or LOCAL_RF, so allocate memory for time-domain signals