diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 4da698ed603ee999ef4a802ad2079a2d5e7f40e0..1cef7ddaeef6cc85d4a01b7f6dcc382ce7c7ae84 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -167,30 +167,37 @@ unsigned char                   scope_enb_num_ue = 1;
 static SEM                     *mutex;
 //static CND *cond;
 
-static int                      thread0;
-static int                      thread1;
+static int                      main_eNB_thread;
+static int                      main_ue_thread;
 #ifdef USRP
 static SEM *sync_sem; // to sync rx & tx streaming
 #endif
 //static int sync_thread;
 #else
-pthread_t                       thread0;
-pthread_t                       thread1;
+pthread_t                       main_eNB_thread;
+pthread_t                       main_ue_thread;
 pthread_attr_t                  attr_dlsch_threads;
 struct sched_param              sched_param_dlsch;
+
 #ifdef USRP
 pthread_cond_t sync_cond;
 pthread_mutex_t sync_mutex;
 #endif
 #endif
 
+pthread_attr_t                  attr_UE_init_synch;
+pthread_attr_t                  attr_UE_thread_tx;
+pthread_attr_t                  attr_UE_thread_rx;
 pthread_attr_t                  attr_eNB_proc_tx[MAX_NUM_CCs][10];
 pthread_attr_t                  attr_eNB_proc_rx[MAX_NUM_CCs][10];
+struct sched_param              sched_param_UE_init_synch;
+struct sched_param              sched_param_UE_thread_tx;
+struct sched_param              sched_param_UE_thread_rx;
 struct sched_param              sched_param_eNB_proc_tx[MAX_NUM_CCs][10];
 struct sched_param              sched_param_eNB_proc_rx[MAX_NUM_CCs][10];
 
 #ifdef XFORMS
-static pthread_t                thread2; //xforms
+static pthread_t                forms_thread; //xforms
 #endif
 #ifdef EMOS
 static pthread_t                thread3; //emos
@@ -841,6 +848,7 @@ static void * eNB_thread_tx(void *param) {
 
     if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
       LOG_E(PHY,"[SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe);
+      oai_exit=1;
     }
     else {
       
@@ -853,6 +861,7 @@ static void * eNB_thread_tx(void *param) {
       //      LOG_I(PHY,"Waking up and unlocking mutex for eNB proc %d\n",proc->subframe);
       if (pthread_mutex_unlock(&proc->mutex_tx) != 0) {	
 	LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe);
+	oai_exit=1;
       }
     }
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),1);    
@@ -1028,6 +1037,7 @@ static void * eNB_thread_rx(void *param) {
 
 
 
+
 void init_eNB_proc(void) {
 
   int i;
@@ -1475,6 +1485,301 @@ static void *eNB_thread(void *arg)
   return 0;
 }
 
+int is_synchronized=0;
+
+static void *UE_thread_synch(void *arg) {
+
+  int i,hw_slot_offset;
+  PHY_VARS_UE *UE = arg;
+
+#ifdef USRP
+  printf("waiting for USRP sync \n");
+#ifdef RTAI
+  rt_sem_wait(sync_sem);
+#else
+  //pthread_mutex_lock(&sync_mutex);
+  pthread_cond_wait(&sync_cond, &sync_mutex);
+  //pthread_mutex_unlock(&sync_mutex);
+#endif
+  //    printf("starting eNB thread @ %llu\n",get_usrp_time(&openair0));
+#endif
+  
+  while (!oai_exit) {
+    
+    if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
+      LOG_E(PHY,"[SCHED][eNB] error locking mutex for UE initial synch thread\n");
+      oai_exit=1;
+    }
+    else {
+      while (UE->instance_cnt_synch < 0) {
+	pthread_cond_wait(&UE->cond_synch,&UE->mutex_synch);
+      }
+      if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {	
+	LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for UE Initial Synch thread\n");
+	oai_exit=1;
+      }
+    
+
+      if (initial_sync(PHY_vars_UE_g[0][0],mode)==0) {
+	/*
+	  lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms,
+	  PHY_vars_UE_g[0],
+	  0,
+	  1,
+	  16384);
+	*/
+	//for better visualization afterwards
+	/*
+	  for (aa=0; aa<PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx; aa++)
+	  memset(PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[aa],0,
+	  PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int));
+	*/
+	if (mode == rx_calib_ue) {
+	  exit_fun("[HW][UE] UE in RX calibration mode");
+	}
+	else {
+	  is_synchronized = 1;
+	  oai_exit=1;
+	  //start the DMA transfers
+	  //LOG_D(HW,"Before openair0_start_rt_acquisition \n");
+	  //openair0_start_rt_acquisition(0);
+	  
+	  hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti;
+	  LOG_D(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset);
+	}
+      }
+      else {
+	if (openair_daq_vars.freq_offset >= 0) {
+	  openair_daq_vars.freq_offset += 100;
+	  openair_daq_vars.freq_offset *= -1;
+	}
+	else {
+	  openair_daq_vars.freq_offset *= -1;
+	}
+	if (abs(openair_daq_vars.freq_offset) > 7500) {
+	  LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n");
+	  mac_xface->macphy_exit("No cell synchronization found, abondoning");
+	}
+	else {
+	  LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
+	  for (card=0;card<MAX_CARDS;card++) {
+	    for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
+	      openair0_cfg[card].rx_freq[i] = carrier_freq[card][i]+openair_daq_vars.freq_offset;
+	      openair0_cfg[card].tx_freq[i] = carrier_freq[card][i]+openair_daq_vars.freq_offset;
+	    }
+	  }
+	  //	    openair0_dump_config(&openair0_cfg[0],UE_flag);
+	  
+	  //	    rt_sleep_ns(FRAME_PERIOD);
+	} // freq_offset
+      } // initial_sync=0
+    }  // mutex_lock
+    
+  }  // while !oai_exit
+  return(0);
+}
+
+static void *UE_thread_tx(void *arg) {
+
+  PHY_VARS_UE *UE = (PHY_VARS_UE*)arg;
+
+#ifndef OPENAIR2
+  UE->UE_mode[eNB_id]=PUSCH;
+  UE->prach_resources[eNB_id] = &prach_resources_local;
+  prach_resources_local.ra_RNTI = 0xbeef;
+  prach_resources_local.ra_PreambleIndex = 0;
+#endif
+  UE->instance_cnt_tx=-1;
+
+  mlockall(MCL_CURRENT | MCL_FUTURE);
+
+  while (!oai_exit) {
+
+    if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
+      LOG_E(PHY,"[SCHED][eNB] error locking mutex for UE TX\n");
+      oai_exit=1;
+    }
+    else {
+      
+      while (UE->instance_cnt_tx < 0) {
+	pthread_cond_wait(&UE->cond_tx,&UE->mutex_tx);
+      }
+      if (pthread_mutex_unlock(&UE->mutex_tx) != 0) {	
+	LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for UE TX\n");
+	oai_exit=1;
+      }
+    }
+  
+
+    if ((subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1)==SF_UL)||
+	(UE->lte_frame_parms.frame_type == FDD)){
+      phy_procedures_UE_TX(UE,eNB_id,0,mode,no_relay);
+    }
+    if ((subframe_select(&UE->lte_frame_parms,UE->slot_tx>>1)==SF_S) &&
+	((UE->slot_tx&1)==1)) {
+      phy_procedures_UE_S_TX(UE,eNB_id,0,no_relay);
+    }
+
+    if (pthread_mutex_lock(&UE->mutex_tx) != 0) {
+      printf("[openair][SCHED][eNB] error locking mutex for UE TX thread\n");
+    }
+    else {
+      UE->instance_cnt_tx--;
+      
+      if (pthread_mutex_unlock(&UE->mutex_tx) != 0) {	
+	printf("[openair][SCHED][eNB] error unlocking mutex for UE\n");
+      }
+    }
+
+    UE->slot_tx++;
+    if (UE->slot_tx==20) {
+      UE->slot_tx=0;
+      UE->frame_tx++;
+    }
+  }
+  return(0);
+}
+
+static void *UE_thread_rx(void *arg) {
+
+  PHY_VARS_UE *UE = (PHY_VARS_UE*)arg;
+
+  UE->instance_cnt_rx=-1;
+
+  mlockall(MCL_CURRENT | MCL_FUTURE);
+
+  while (!oai_exit) {
+
+    if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
+      LOG_E(PHY,"[SCHED][eNB] error locking mutex for UE RX\n");
+      oai_exit=1;
+    }
+    else {
+      
+      while (UE->instance_cnt_rx < 0) {
+	pthread_cond_wait(&UE->cond_rx,&UE->mutex_rx);
+      }
+      if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {	
+	LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for UE RX\n");
+	oai_exit=1;
+      }
+    
+      if ((subframe_select(&UE->lte_frame_parms,UE->slot_rx>>1)==SF_DL) ||
+	  (UE->lte_frame_parms.frame_type == FDD)){
+	phy_procedures_UE_RX(UE,eNB_id,0,mode,no_relay,NULL);
+      }
+      if ((subframe_select(&UE->lte_frame_parms,UE->slot_rx>>1)==SF_S) &&
+	  ((UE->slot_rx&1)==0)) {
+	phy_procedures_UE_RX(UE,eNB_id,0,mode,no_relay,NULL);
+      }
+      
+      UE->slot_rx++;
+      if (UE->slot_rx==20) {
+	UE->slot_rx=0;
+	UE->frame_rx++;
+      }    
+    }
+  }
+  return(0);
+}
+
+static void *UE_thread_new(void *arg) {
+
+  int slot=0,frame=0,hw_slot,last_slot, next_slot,hw_subframe;
+  // unsigned int aa;
+  static int is_synchronized = 0;
+
+#ifndef USRP
+  //  volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
+  //exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;;
+#endif
+  
+#ifdef USRP
+  printf("waiting for USRP sync \n");
+#ifdef RTAI
+  rt_sem_wait(sync_sem);
+#else
+  //pthread_mutex_lock(&sync_mutex);
+  pthread_cond_wait(&sync_cond, &sync_mutex);
+  //pthread_mutex_unlock(&sync_mutex);
+#endif
+  //    printf("starting eNB thread @ %llu\n",get_usrp_time(&openair0));
+#endif
+  
+  while (!oai_exit) {
+#ifdef USRP
+
+    
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe);
+    vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame);
+    while (rx_cnt < sf_bounds[hw_subframe]) {
+      
+      openair0_timestamp time0,time1;
+      unsigned int rxs;
+      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ,1);
+      
+      rxs = openair0.trx_read_func(&openair0, 
+				   &timestamp, 
+				   &rxdata[rx_cnt*samples_per_packets], 
+				   samples_per_packets);
+      if (rxs != samples_per_packets)
+	oai_exit=1;
+      
+      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ,0);
+      
+      // Transmit TX buffer based on timestamp from RX
+      if (is_synchronized) {
+	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,1);
+	openair0.trx_write_func(&openair0, 
+				(timestamp+samples_per_packets*tx_delay-tx_forward_nsamps), 
+				&txdata[tx_cnt*samples_per_packets], 
+				samples_per_packets, 
+				1);
+	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0);
+      }
+      
+      rx_cnt++;
+      tx_cnt++;
+      
+      if(tx_cnt == max_cnt)
+	tx_cnt = 0;
+    }
+    
+    if(rx_cnt == max_cnt)
+      rx_cnt = 0; 
+#endif
+    
+    if (is_synchronized)  {
+      //    phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0][0], 0, 0,mode,0,NULL);
+      
+    }
+    else {  // we are not yet synchronized
+      
+      if (slot == 18) {
+	// Wake up initial synch thread
+	
+      }
+    }  
+    /*
+      if ((slot%2000)<10)
+      LOG_D(HW,"fun0: doing very hard work\n");
+    */
+    
+    hw_subframe++;
+    slot+=2;
+    if(hw_subframe==10) {
+      hw_subframe = 0;
+      frame++;
+      slot = 1;
+    }
+    
+#if defined(ENABLE_ITTI)
+    itti_update_lte_time(frame, slot);
+#endif
+  }
+}
+
+
 
 
 #ifndef USRP
@@ -1484,7 +1789,7 @@ static void *UE_thread(void *arg) {
   RT_TASK *task;
 #endif
   // RTIME in, out, diff;
-  int slot=0,frame=0,hw_slot,last_slot, next_slot;
+  int slot=0,frame=0,hw_slot,last_slot,next_slot;
   // unsigned int aa;
   static int is_synchronized = 0;
   int delay_cnt;
@@ -1526,9 +1831,13 @@ static void *UE_thread(void *arg) {
     }
   */
   while (!oai_exit)  {
+
     hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store
-      
+
+     
     if (is_synchronized) {
+
+
       //this is the mbox counter that indicates the start of the frame
       rx_offset_mbox = (PHY_vars_UE_g[0][0]->rx_offset * 150) / (10*PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti);
       //this is the mbox counter where we should be
@@ -1606,7 +1915,7 @@ static void *UE_thread(void *arg) {
     next_slot = (slot+3)%LTE_SLOTS_PER_FRAME;
       
     if (is_synchronized)  {
-      phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0][0], 0, 0,mode,0,NULL);
+      //phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0][0], 0, 0,mode,0,NULL);
 	
     }
     else {  // we are not yet synchronized
@@ -1705,6 +2014,51 @@ static void *UE_thread(void *arg) {
 #endif
 
 
+void init_UE_threads(void) {
+  
+  PHY_VARS_UE *UE=PHY_vars_UE_g[0][0];
+
+  pthread_attr_init(&attr_UE_thread_tx);
+  pthread_attr_setstacksize(&attr_UE_thread_tx,OPENAIR_THREAD_STACK_SIZE);
+  sched_param_UE_thread_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
+  pthread_attr_setschedparam  (&attr_UE_thread_tx, &sched_param_UE_thread_tx);
+  pthread_attr_setschedpolicy (&attr_UE_thread_tx, SCHED_FIFO);
+
+  pthread_attr_init(&attr_UE_thread_rx);
+  pthread_attr_setstacksize(&attr_UE_thread_rx,OPENAIR_THREAD_STACK_SIZE);
+  sched_param_UE_thread_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1;
+  pthread_attr_setschedparam  (&attr_UE_thread_rx, &sched_param_UE_thread_rx);
+  pthread_attr_setschedpolicy (&attr_UE_thread_rx, SCHED_FIFO);
+
+  UE->instance_cnt_tx=-1;
+  UE->instance_cnt_rx=-1;
+  UE->instance_cnt_synch=-1;
+  pthread_mutex_init(&UE->mutex_tx,NULL);
+  pthread_mutex_init(&UE->mutex_rx,NULL);
+  pthread_mutex_init(&UE->mutex_synch,NULL);
+  pthread_cond_init(&UE->cond_tx,NULL);
+  pthread_cond_init(&UE->cond_rx,NULL);
+  pthread_cond_init(&UE->cond_synch,NULL);
+  pthread_create(&UE->thread_tx,NULL,UE_thread_tx,(void*)UE);
+  pthread_create(&UE->thread_rx,NULL,UE_thread_rx,(void*)UE);
+  pthread_create(&UE->thread_rx,NULL,UE_thread_synch,(void*)UE);
+  UE->frame_tx = 0;
+
+#ifdef USRP
+  UE->slot_tx = 2;
+  UE->slot_rx = 0;
+  UE->frame_rx = 0;
+#else
+  UE->slot_tx = 1;
+  UE->slot_rx = 19;
+  UE->frame_rx = 0;
+#endif
+
+  
+  
+} 
+
+
 static void get_options (int argc, char **argv) {
   int c;
   //  char                          line[1000];
@@ -2505,7 +2859,7 @@ int main(int argc, char **argv) {
       }
     }
 
-    ret = pthread_create(&thread2, NULL, scope_thread, NULL);
+    ret = pthread_create(&forms_thread, NULL, scope_thread, NULL);
     printf("Scope thread created, ret=%d\n",ret);
   }
 #endif
@@ -2520,19 +2874,25 @@ int main(int argc, char **argv) {
 #ifndef RTAI
   pthread_attr_init (&attr_dlsch_threads);
   pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE);
-  //attr_dlsch_threads.priority = 1;
   sched_param_dlsch.sched_priority = 90;//sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
   pthread_attr_setschedparam  (&attr_dlsch_threads, &sched_param_dlsch);
   pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
+
+  pthread_attr_init (&attr_UE_init_synch);
+  pthread_attr_setstacksize(&attr_UE_init_synch,OPENAIR_THREAD_STACK_SIZE);
+  sched_param_UE_init_synch.sched_priority = 90;//sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
+  pthread_attr_setschedparam  (&attr_UE_init_synch, &sched_param_UE_init_synch);
+  pthread_attr_setschedpolicy (&attr_UE_init_synch, SCHED_FIFO);
+
 #endif
 
   // start the main thread
   if (UE_flag == 1) {
 #ifndef USRP
 #ifdef RTAI
-    thread1 = rt_thread_create(UE_thread, NULL, 100000000);
+    main_ue_thread = rt_thread_create(UE_thread_new, NULL, 100000000);
 #else
-    error_code = pthread_create(&thread1, &attr_dlsch_threads, UE_thread, NULL);
+    error_code = pthread_create(&main_ue_thread, &attr_dlsch_threads, UE_thread_new, NULL);
     if (error_code!= 0) {
       LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code);
       return(error_code);
@@ -2559,9 +2919,9 @@ int main(int argc, char **argv) {
     }
     printf("Creating eNB_thread \n");
 #ifdef RTAI
-    thread0 = rt_thread_create(eNB_thread, NULL, OPENAIR_THREAD_STACK_SIZE);
+    main_eNB_thread = rt_thread_create(eNB_thread, NULL, OPENAIR_THREAD_STACK_SIZE);
 #else
-    error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL);
+    error_code = pthread_create(&main_eNB_thread, &attr_dlsch_threads, eNB_thread, NULL);
     if (error_code!= 0) {
       LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code);
       return(error_code);
@@ -2603,7 +2963,7 @@ int main(int argc, char **argv) {
   printf("waiting for XFORMS thread\n");
   if (do_forms==1)
     {
-      pthread_join(thread2,&status);
+      pthread_join(forms_thread,&status);
       fl_hide_form(form_stats->stats_form);
       fl_free_form(form_stats->stats_form);
       if (UE_flag==1) {
@@ -2623,9 +2983,9 @@ int main(int argc, char **argv) {
   if (UE_flag == 1) {
 #ifndef USRP
 #ifdef RTAI
-    rt_thread_join(thread1); 
+    rt_thread_join(main_ue_thread); 
 #else
-    pthread_join(thread1,&status); 
+    pthread_join(main_ue_thread,&status); 
 #endif
 #ifdef DLSCH_THREAD
     cleanup_dlsch_threads();
@@ -2635,12 +2995,12 @@ int main(int argc, char **argv) {
   }
   else {
 #ifdef RTAI
-    rt_thread_join(thread0); 
+    rt_thread_join(main_eNB_thread); 
 #else
 #ifdef DEBUG_THREADS
     printf("Joining eNB_thread ...");
 #endif
-    pthread_join(thread0,(void**)&eNB_thread_status_p); 
+    pthread_join(main_eNB_thread,(void**)&eNB_thread_status_p); 
 #ifdef DEBUG_THREADS
     printf("status %d\n",*eNB_thread_status_p);
 #endif
diff --git a/targets/RT/USER/sched_dlsch.c b/targets/RT/USER/sched_dlsch.c
index aee3cb95e8480532e1b4e0cdb3a7b79d790782ea..3f4a2db88f7aa1aa5901d922f5efef7a83629d2e 100644
--- a/targets/RT/USER/sched_dlsch.c
+++ b/targets/RT/USER/sched_dlsch.c
@@ -157,11 +157,11 @@ static void * dlsch_thread(void *param) {
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_DLSCH_THREAD0+dlsch_thread_index,1);    
     if (oai_exit) break;
     
-    LOG_I(PHY,"[SCHED][DLSCH] Frame %d: Calling dlsch_decoding with dlsch_thread_index = %d\n",phy_vars_ue->frame,dlsch_thread_index);
+    LOG_I(PHY,"[SCHED][DLSCH] Frame %d: Calling dlsch_decoding with dlsch_thread_index = %d\n",phy_vars_ue->frame_rx,dlsch_thread_index);
 
     time_in = rt_get_time_ns();
     
-    if (phy_vars_ue->frame < phy_vars_ue->dlsch_errors[eNB_id]) {
+    if (phy_vars_ue->frame_rx < phy_vars_ue->dlsch_errors[eNB_id]) {
         phy_vars_ue->dlsch_errors[eNB_id]=0;
         phy_vars_ue->dlsch_received[eNB_id] = 0;
     }
@@ -197,7 +197,7 @@ static void * dlsch_thread(void *param) {
       	LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
               phy_vars_ue->Mod_id,
               phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid,
-              phy_vars_ue->frame,dlsch_subframe[dlsch_thread_index],ret,
+              phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret,
               phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
               phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
               phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS); 
@@ -209,7 +209,7 @@ static void * dlsch_thread(void *param) {
 #ifdef DEBUG_PHY
 	LOG_I(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d)\n",
 	      phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-	      harq_pid,phy_vars_ue->frame,dlsch_subframe[dlsch_thread_index],
+	      harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],
 	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
 	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
 #endif
@@ -217,14 +217,14 @@ static void * dlsch_thread(void *param) {
       else {
 	LOG_I(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: Received DLSCH (rv %d,mcs %d)\n",
 	      phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-	      harq_pid,phy_vars_ue->frame,dlsch_subframe[dlsch_thread_index],
+	      harq_pid,phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],
 	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
 	      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
 	
 #ifdef OPENAIR2
 	mac_xface->ue_send_sdu(phy_vars_ue->Mod_id,
 			       0, // CC_id
-			       phy_vars_ue->frame,
+			       phy_vars_ue->frame_rx,
 			       phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->b,
 			       phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS>>3,
 			       eNB_id);
@@ -250,14 +250,14 @@ static void * dlsch_thread(void *param) {
     LOG_I(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
 	  phy_vars_ue->Mod_id,
 	  phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,harq_pid,
-	  phy_vars_ue->frame,dlsch_subframe[dlsch_thread_index],ret,
+	  phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],ret,
 	  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs,
 	  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rvidx,
 	  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->TBS);
-    if (phy_vars_ue->frame%100==0) {
+    if (phy_vars_ue->frame_rx%100==0) {
       LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d dlsch_errors %d, dlsch_received %d, dlsch_fer %d, current_dlsch_cqi %d\n",
 	    phy_vars_ue->Mod_id,phy_vars_ue->dlsch_ue[eNB_id][0]->rnti,
-	    phy_vars_ue->frame,dlsch_subframe[dlsch_thread_index],
+	    phy_vars_ue->frame_rx,dlsch_subframe[dlsch_thread_index],
 	    phy_vars_ue->dlsch_errors[eNB_id],
 	    phy_vars_ue->dlsch_received[eNB_id],
 	    phy_vars_ue->dlsch_fer[eNB_id],
diff --git a/targets/RT/USER/sched_rx_pdsch.c b/targets/RT/USER/sched_rx_pdsch.c
index 446fba739562fc04d3d3c390d3c03cc6b0ffbe45..066cf1d5630715305ea31dc403b8a6f311aeb70d 100644
--- a/targets/RT/USER/sched_rx_pdsch.c
+++ b/targets/RT/USER/sched_rx_pdsch.c
@@ -93,7 +93,7 @@ static void * rx_pdsch_thread(void *param) {
   uint8_t rx_pdsch_thread_index = 0;
   uint8_t dlsch_thread_index = 0;
   uint8_t pilot1,pilot2,pilot3,harq_pid,subframe;
-  uint8_t last_slot;
+  //  uint8_t last_slot;
 
   uint8_t dual_stream_UE = 0;
   uint8_t i_mod = 0;
@@ -105,7 +105,7 @@ static void * rx_pdsch_thread(void *param) {
 
   int m,eNB_id = 0;
   int eNB_id_i = 1;
-  PHY_VARS_UE *phy_vars_ue = PHY_vars_UE_g[0];
+  PHY_VARS_UE *UE = PHY_vars_UE_g[0];
 
 #ifdef RTAI
   task = rt_task_init_schmod(nam2num("RX_PDSCH_THREAD"), 0, 0, 0, SCHED_FIFO, 0xF);
@@ -128,7 +128,7 @@ static void * rx_pdsch_thread(void *param) {
   rt_make_hard_real_time();
 #endif
 
-  if (phy_vars_ue->lte_frame_parms.Ncp == 0) {  // normal prefix
+  if (UE->lte_frame_parms.Ncp == 0) {  // normal prefix
     pilot1 = 4;
     pilot2 = 7;
     pilot3 = 11;
@@ -157,27 +157,27 @@ static void * rx_pdsch_thread(void *param) {
     
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PDSCH_THREAD, 1);
  
-      last_slot = rx_pdsch_slot;
-      subframe = last_slot>>1;
+    //      last_slot = rx_pdsch_slot;
+      subframe = UE->slot_rx>>1;
       // Important! assumption that PDCCH procedure of next SF is not called yet
-      harq_pid = phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid;
-      phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&phy_vars_ue->lte_frame_parms,
-                                                                            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
-                                                                            phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
-                                                                            get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs),  
-									    phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
-									    phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
-                                                                            phy_vars_ue->frame,subframe);
-
-      if ((phy_vars_ue->transmission_mode[eNB_id] == 5) && 
-          (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
+      harq_pid = UE->dlsch_ue[eNB_id][0]->current_harq_pid;
+      UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&UE->lte_frame_parms,
+                                                                            UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
+                                                                            UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->rb_alloc,
+                                                                            get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs),  
+									    UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Nl,
+									    UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols,
+                                                                            UE->frame_rx,subframe);
+
+      if ((UE->transmission_mode[eNB_id] == 5) && 
+          (UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
           (openair_daq_vars.use_ia_receiver > 0)) {
 	dual_stream_UE = 1;
-	eNB_id_i = phy_vars_ue->n_connected_eNB;
+	eNB_id_i = UE->n_connected_eNB;
 	if (openair_daq_vars.use_ia_receiver == 2) {
-	  i_mod =  get_Qm(((phy_vars_ue->frame%1024)/3)%28);
+	  i_mod =  get_Qm(((UE->frame_rx%1024)/3)%28);
 	} else {
-	  i_mod =  get_Qm(phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
+	  i_mod =  get_Qm(UE->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->mcs);
 	}
       }
       else {
@@ -188,19 +188,19 @@ static void * rx_pdsch_thread(void *param) {
 
     if (oai_exit) break;
 
-    LOG_D(PHY,"[SCHED][RX_PDSCH] Frame %d, slot %d: Calling rx_pdsch_decoding with harq_pid %d\n",phy_vars_ue->frame,last_slot,harq_pid);
+    LOG_D(PHY,"[SCHED][RX_PDSCH] Frame %d, slot %d: Calling rx_pdsch_decoding with harq_pid %d\n",UE->frame_rx,UE->slot_rx,harq_pid);
 
     time_in = rt_get_time_ns();
 
     // Check if we are in even or odd slot
-    if (last_slot%2) { // odd slots
+    if (UE->slot_rx%2) { // odd slots
 
         // measure time
         //time0 = rt_get_time_ns();
-        //        rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",phy_vars_ue->frame,last_slot,rt_get_time_ns());
-        for (m=pilot2;m<phy_vars_ue->lte_frame_parms.symbols_per_tti;m++) {
+        //        rt_printk("[SCHED][RX_PDSCH][before rx_pdsch] Frame %d, slot %d, time %llu\n",UE->frame,last_slot,rt_get_time_ns());
+        for (m=pilot2;m<UE->lte_frame_parms.symbols_per_tti;m++) {
 
-            rx_pdsch(phy_vars_ue,
+            rx_pdsch(UE,
                      PDSCH,
                      eNB_id,
                      eNB_id_i,
@@ -213,12 +213,12 @@ static void * rx_pdsch_thread(void *param) {
             
         }
         //        time1 = rt_get_time_ns();
-        //        rt_printk("[SCHED][RX_PDSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",phy_vars_ue->frame,last_slot,time0,time1,(time1-time0));
+        //        rt_printk("[SCHED][RX_PDSCH] Frame %d, slot %d, start %llu, end %llu, proc time: %llu ns\n",UE->frame_rx,last_slot,time0,time1,(time1-time0));
 
         dlsch_thread_index = harq_pid;
 	
         if (pthread_mutex_lock (&dlsch_mutex[dlsch_thread_index]) != 0) {               // Signal MAC_PHY Scheduler
-            LOG_E(PHY,"[UE  %d] ERROR pthread_mutex_lock\n",phy_vars_ue->Mod_id);     // lock before accessing shared resource
+            LOG_E(PHY,"[UE  %d] ERROR pthread_mutex_lock\n",UE->Mod_id);     // lock before accessing shared resource
             //	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
             //return(-1);
         }
@@ -228,28 +228,28 @@ static void * rx_pdsch_thread(void *param) {
         
         if (dlsch_instance_cnt[dlsch_thread_index] == 0) {
             if (pthread_cond_signal(&dlsch_cond[dlsch_thread_index]) != 0) {
-                LOG_E(PHY,"[UE  %d] ERROR pthread_cond_signal for dlsch_cond[%d]\n",phy_vars_ue->Mod_id,dlsch_thread_index);
+                LOG_E(PHY,"[UE  %d] ERROR pthread_cond_signal for dlsch_cond[%d]\n",UE->Mod_id,dlsch_thread_index);
                 //	  vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
                 //return(-1);
             }
         }
         else {
-            LOG_W(PHY,"[UE  %d] DLSCH thread for dlsch_thread_index %d busy!!!\n",phy_vars_ue->Mod_id,dlsch_thread_index);
+            LOG_W(PHY,"[UE  %d] DLSCH thread for dlsch_thread_index %d busy!!!\n",UE->Mod_id,dlsch_thread_index);
             //	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
             //return(-1);
         }
         
     } else { // even slots
 
-        for (m=phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols;m<pilot2;m++) { 
+        for (m=UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols;m<pilot2;m++) { 
 
-            rx_pdsch(phy_vars_ue,
+            rx_pdsch(UE,
                      PDSCH,
                      eNB_id,
                      eNB_id_i,
                      subframe,
                      m,
-                     (m==phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
+                     (m==UE->lte_ue_pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
                      dual_stream_UE,
                      i_mod,
                      harq_pid);
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index 6f14f9709eeb2ab03b74fe22475c23e84920ac95..e03dc0b90c545b71c7bb62c67fac92eae33698d9 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -771,8 +771,13 @@ void *l2l1_task(void *args_p) {
 
 		  if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) {
 		    if (frame > 0) {
-		      PHY_vars_UE_g[UE_inst][0]->frame = frame;
-
+		      PHY_vars_UE_g[UE_inst][0]->frame_rx = frame;
+		      PHY_vars_UE_g[UE_inst][0]->slot_rx = last_slot;
+		      PHY_vars_UE_g[UE_inst][0]->slot_tx = next_slot;
+		      if (next_slot > 1)
+			PHY_vars_UE_g[UE_inst][0]->frame_tx = frame;
+		      else
+			PHY_vars_UE_g[UE_inst][0]->frame_tx = frame+1;
 #ifdef OPENAIR2
 		      //Application
 		      update_otg_UE (UE_inst, oai_emulation.info.time_ms);
@@ -781,7 +786,7 @@ void *l2l1_task(void *args_p) {
 		      pdcp_run (frame, 0, UE_inst, 0);
 #endif
 		      for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
-			phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_inst][CC_id], 0, abstraction_flag, normal_txrx,
+			phy_procedures_UE_lte (PHY_vars_UE_g[UE_inst][CC_id], 0, abstraction_flag, normal_txrx,
 					       no_relay, NULL);
 		      }
 		      ue_data[UE_inst]->tx_power_dBm = PHY_vars_UE_g[UE_inst][0]->tx_power_dBm;
@@ -852,8 +857,12 @@ void *l2l1_task(void *args_p) {
 		if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) {
 		  LOG_D(EMU,"[RN %d] PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n",
 			RN_id, UE_inst, frame, slot, next_slot >> 1,last_slot>>1);
-		  PHY_vars_UE_g[UE_inst][0]->frame = frame;
-		  phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_inst][0], 0, abstraction_flag,normal_txrx,
+		  PHY_vars_UE_g[UE_inst][0]->frame_rx = frame;
+		  PHY_vars_UE_g[UE_inst][0]->slot_rx =  last_slot;
+		  PHY_vars_UE_g[UE_inst][0]->slot_tx =  next_slot;
+		  if (next_slot>1) PHY_vars_UE_g[UE_inst][0]->frame_tx = frame;
+		  else PHY_vars_UE_g[UE_inst][0]->frame_tx = frame+1;
+		  phy_procedures_UE_lte (PHY_vars_UE_g[UE_inst][0], 0, abstraction_flag,normal_txrx,
 					 r_type, PHY_vars_RN_g[RN_id]);
 		}
 		else if (last_slot == (LTE_SLOTS_PER_FRAME-2)) {
@@ -873,7 +882,7 @@ void *l2l1_task(void *args_p) {
 	  }
 #endif
 	  emu_transport (frame, last_slot, next_slot, direction, oai_emulation.info.frame_type[0], ethernet_flag);
-	  if ((direction == SF_DL) || (frame_parms[0]->frame_type == 0)) {
+	  if ((direction == SF_DL) || (frame_parms[0]->frame_type == FDD)) {
 	    // consider only sec id 0
 	    /*  for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
 		if (abstraction_flag == 0) {