diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 4f7e8014486e58eb44471161925cf72ca8076b80..c36995683d9ea1644a655d4348b96c6eda739e2f 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -84,8 +84,10 @@ typedef struct {
   double sample_rate;
   //! number of samples per RX/TX packet (USRP + Ethernet)
   int samples_per_packet;
-  // delay in sending samples (write)  due to hardware access, softmodem processing and fronthaul delay if exist
-  int tx_delay;
+  //! delay in sending samples (write)  due to hardware access, softmodem processing and fronthaul delay if exist
+  int tx_scheduling_advance;
+  //! offset in samples between TX and RX paths
+  int tx_sample_advance;
   //! adjust the position of the samples after delay when sending   
   unsigned int	tx_forward_nsamps;
   //! number of RX channels (=RX antennas)
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 2371b04770f3981be95ca53a0b847455ac8e611d..d6b588aad1024d16c256779d4f9e78188081dcfc 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -404,6 +404,35 @@ int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_
     //s->usrp->set_master_clock_rate(usrp_master_clock);
 
     openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
+
+    switch (openair0_cfg[0].sample_rate) {
+    case 30.72e6:
+            // from usrp_time_offset
+      openair0_cfg[0].samples_per_packet    = 2048;
+      openair0_cfg[0].tx_sample_advance     = 15;
+      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[card].samples_per_packet;
+      break;
+    case 15.36e6:
+      openair0_cfg[0].samples_per_packet    = 2048;
+      openair0_cfg[0].tx_sample_advance     = 45;
+      openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[card].samples_per_packet;
+      break;
+    case 7.6e6:
+      openair0_cfg[0].samples_per_packet    = 1024;
+      openair0_cfg[0].tx_sample_advance     = 50;
+      openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[card].samples_per_packet;
+      break;
+    case 1.92e6:
+      openair0_cfg[0].samples_per_packet    = 256;
+      openair0_cfg[0].tx_sample_advance     = 50;
+      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[card].samples_per_packet;
+      break;
+    default:
+      printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
+      exit(-1);
+      break;
+    }
+
   } else {
     printf("Found USRP B200");
     s->usrp = uhd::usrp::multi_usrp::make(args);
@@ -415,12 +444,42 @@ int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_
 //    // lock mboard clocks
 //    s->usrp->set_clock_source("internal");
     // set master clock rate and sample rate for tx & rx for streaming
+
+    device->type = USRP_B200_IF
     s->usrp->set_master_clock_rate(30.72e6);
 
     openair0_cfg[0].rx_gain_calib_table = calib_table_b210;
-  }
 
+    switch (openair0_cfg[0].sample_rate) {
+    case 30.72e6:
+            // from usrp_time_offset
+      openair0_cfg[0].samples_per_packet    = 2048;
+      openair0_cfg[0].tx_sample_advance     = 175;
+      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[card].samples_per_packet;
+      break;
+    case 15.36e6:
+      openair0_cfg[0].samples_per_packet    = 2048;
+      openair0_cfg[0].tx_sample_advance     = 95;
+      openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[card].samples_per_packet;
+      break;
+    case 7.6e6:
+      openair0_cfg[0].samples_per_packet    = 1024;
+      openair0_cfg[0].tx_sample_advance     = 70;
+      openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[card].samples_per_packet;
+      break;
+    case 1.92e6:
+      openair0_cfg[0].samples_per_packet    = 256;
+      openair0_cfg[0].tx_sample_advance     = 40;
+      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[card].samples_per_packet;
+      break;
+    default:
+      printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
+      exit(-1);
+      break;
+    }
+  }
 
+   
 
   for(i=0;i<s->usrp->get_rx_num_channels();i++) {
     if (i<openair0_cfg[0].rx_num_channels) {
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index acf924050f8dd37dc31948959ae7841b9a4fdc04..786cd97a59f818feec6a0ec2b31efb5eee21c541 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -293,10 +293,6 @@ static int                      tx_max_power[MAX_NUM_CCs]; /* =  {0,0}*/;
 char ref[128] = "internal";
 char channels[128] = "0";
 
-//unsigned int samples_per_frame = 307200;
-//unsigned int tx_forward_nsamps=0;
-//int tx_delay;
-
 #endif
 
 int                      rx_input_level_dBm;
@@ -1559,7 +1555,7 @@ static void* eNB_thread( void* arg )
   int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9
   
   unsigned int rx_pos = 0;
-  unsigned int tx_pos = 0; //spp*tx_delay;
+  unsigned int tx_pos = 0;
 #endif
   int CC_id=0;	
   struct timespec trx_time0, trx_time1, trx_time2;
@@ -1634,8 +1630,9 @@ static void* eNB_thread( void* arg )
   int frame = 0;
 
 #ifndef EXMIMO
-  spp = openair0_cfg[0].samples_per_packet;
-  tx_pos=spp*openair0_cfg[0].tx_delay;
+  spp        = openair0_cfg[0].samples_per_packet;
+  tx_pos     = openair0_cfg[0].tx_scheduling_advance;
+  tx_advance = openair0_cfg[0].tx_sample_advance;
 #endif
 
   while (!oai_exit) {
@@ -1796,11 +1793,10 @@ static void* eNB_thread( void* arg )
       // prepare tx buffer pointers
       for (i=0; i<PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx; i++)
 	txp[i] = (void*)&txdata[i][tx_pos];
-      //printf("tx_pos %d ts %d, ts_offset %d txp[i] %p, ap %d\n", tx_pos,  timestamp, (timestamp+(tx_delay*spp)-tx_forward_nsamps),txp[i], i);
       // if symb_written < spp ==> error 
       if (frame > 50) {
 	openair0.trx_write_func(&openair0,
-				(timestamp+(openair0_cfg[card].tx_delay*spp)-openair0_cfg[card].tx_forward_nsamps),
+				(timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance),
 				txp,
 				spp,
 				PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx,
@@ -1808,7 +1804,7 @@ static void* eNB_thread( void* arg )
       }
       
       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff );
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_delay*spp)-openair0_cfg[card].tx_forward_nsamps)&0xffffffff );
+      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance)&0xffffffff );
 
       stop_meas( &softmodem_stats_mt );
       clock_gettime( CLOCK_MONOTONIC, &trx_time2 );
@@ -2847,66 +2843,33 @@ int main( int argc, char **argv )
   for (card=0; card<MAX_CARDS; card++) {
 
     if(frame_parms[0]->N_RB_DL == 100) {
-      sample_rate = 30.72e6;
-      bw          = 10.0e6;
-#ifndef EXMIMO
       openair0_cfg[card].sample_rate=30.72e6;
-      openair0_cfg[card].samples_per_packet = 2048;
       openair0_cfg[card].samples_per_frame = 307200; 
       openair0_cfg[card].tx_bw = 10e6;
       openair0_cfg[card].rx_bw = 10e6;
-      // from usrp_time_offset
-      openair0_cfg[card].tx_forward_nsamps = 175;
-      openair0_cfg[card].tx_delay = 8;
-#endif
     } else if(frame_parms[0]->N_RB_DL == 50) {
-      sample_rate = 15.36e6;
-      bw          = 5.0e6;
-#ifndef EXMIMO
       openair0_cfg[card].sample_rate=15.36e6;
-      openair0_cfg[card].samples_per_packet = 2048;
       openair0_cfg[card].samples_per_frame = 153600;
       openair0_cfg[card].tx_bw = 5e6;
       openair0_cfg[card].rx_bw = 5e6;
-      openair0_cfg[card].tx_forward_nsamps = 95;
-      openair0_cfg[card].tx_delay = 5;
-#endif
     } else if (frame_parms[0]->N_RB_DL == 25) {
-      sample_rate = 7.68e6;
-      bw          = 2.5e6;
-#ifndef EXMIMO
       openair0_cfg[card].sample_rate=7.68e6;
       openair0_cfg[card].samples_per_frame = 76800;
       openair0_cfg[card].tx_bw = 2.5e6;
       openair0_cfg[card].rx_bw = 2.5e6;
-      openair0_cfg[card].samples_per_packet = 1024;
-#ifdef OAI_USRP
-    openair0_cfg[card].tx_forward_nsamps = 70;
-    openair0_cfg[card].tx_delay = 5;
-#elif OAI_BLADERF
-      openair0_cfg[card].tx_forward_nsamps = 0;
-      openair0_cfg[card].tx_delay = 8;
-#endif 
-#endif
+
     } else if (frame_parms[0]->N_RB_DL == 6) {
-      sample_rate = 1.92e6;
-      bw          = 0.96e6;
-#ifndef EXMIMO
       openair0_cfg[card].sample_rate=1.92e6;
-      openair0_cfg[card].samples_per_packet = 256;
       openair0_cfg[card].samples_per_frame = 19200;
       openair0_cfg[card].tx_bw = 1.5e6;
       openair0_cfg[card].rx_bw = 1.5e6;
-      openair0_cfg[card].tx_forward_nsamps = 40;
-      openair0_cfg[card].tx_delay = 8;
-#endif
     }
     
 #ifdef ETHERNET
 
     //calib needed
-    openair0_cfg[card].tx_delay = 0;
-    openair0_cfg[card].tx_forward_nsamps = 0;
+    openair0_cfg[card].tx_scheduling_advance = 0;
+    openair0_cfg[card].tx_sample_advance = 0;
     
     if (frame_parms[0]->N_RB_DL == 6) 
       openair0_cfg[card].samples_per_packet = 256;
@@ -2917,9 +2880,6 @@ int main( int argc, char **argv )
 #endif
 
 
-#ifndef EXMIMO
-    openair0_cfg[card].samples_per_packet = openair0_cfg[0].samples_per_packet;
-#endif
     printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card,
            ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx),
            ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx));
@@ -2935,11 +2895,9 @@ int main( int argc, char **argv )
       openair0_cfg[card].remote_ip   = &rrh_eNB_ip[0];
       openair0_cfg[card].remote_port = rrh_eNB_port;
     }
-openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
+    openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
 #endif
-    openair0_cfg[card].sample_rate = sample_rate;
-    openair0_cfg[card].tx_bw = bw;
-    openair0_cfg[card].rx_bw = bw;
+
     // in the case of the USRP, the following variables need to be initialized before the init
     // since the USRP only supports one CC (for the moment), we initialize all the cards with first CC.
     // in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer
@@ -3074,7 +3032,7 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
   // connect the TX/RX buffers
   if (UE_flag==1) {
 #ifdef OAI_USRP
-    openair_daq_vars.timing_advance = 160;
+    openair_daq_vars.timing_advance = 0;
 #else
     openair_daq_vars.timing_advance = 160;
 #endif