diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
index 1e2e59056cb9ca743e9ea2664e872423b6e6aede..bbc78d630d8fa707d08a3d4dfc67d76feccd311b 100755
--- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c
@@ -71,6 +71,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
     slotoffsetF = (subframe)*(fp->ofdm_symbol_size)*((fp->Ncp==1) ? 12 : 14) + 1;
     blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; 
 
+
     if (eth->flags == ETH_RAW_IF4p5_MODE) {
       packet_header = (IF4p5_header_t *)(tx_buffer + MAC_HEADER_SIZE_BYTES);
       data_block = (uint16_t*)(tx_buffer + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t);
@@ -81,6 +82,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
     gen_IF4p5_dl_header(packet_header, frame, subframe);
 		    
     for (symbol_id=0; symbol_id<fp->symbols_per_tti; symbol_id++) {
+      if (eNB->CC_id==1) LOG_I(PHY,"DL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,frame,subframe,symbol_id);
       
       for (element_id=0; element_id<db_halflength; element_id++) {
         i = (uint16_t*) &txdataF[eNB->CC_id][blockoffsetF+element_id];
@@ -231,7 +233,7 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
 
   *packet_type = packet_header->sub_type; 
 
-  //  printf("CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe);
+  //  LOG_I(PHY,"CC_id %d : frame %d, subframe %d\n",eNB->CC_id,*frame,*subframe);
 
   if (*packet_type == IF4p5_PDLFFT) {          
     *symbol_number = ((packet_header->frame_status)>>26)&0x000f;         
@@ -252,6 +254,8 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
   } else if (*packet_type == IF4p5_PULFFT) {         
     *symbol_number = ((packet_header->frame_status)>>26)&0x000f;         
 
+    if (eNB->CC_id==1) LOG_I(PHY,"UL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,*frame,*subframe,*symbol_number);
+
     slotoffsetF = (*symbol_number)*(fp->ofdm_symbol_size) + 1;
     blockoffsetF = slotoffsetF + fp->ofdm_symbol_size - db_halflength - 1; 
     
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 90c26431c954dd7fdbf1458578bfc5bfbb7698a8..b1fdf544b738d4cc7554109b5e8df17515c16c46 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -238,10 +238,14 @@ typedef struct eNB_proc_t_s {
   openair0_timestamp timestamp_tx;
   /// subframe to act upon for reception
   int subframe_rx;
+  /// symbol mask for IF4p5 reception per subframe
+  uint32_t symbol_mask[10];
   /// subframe to act upon for PRACH
   int subframe_prach;
   /// frame to act upon for reception
   int frame_rx;
+  /// frame to act upon for transmission
+  int frame_tx;
   /// frame offset for secondary eNBs (to correct for frame asynchronism at startup)
   int frame_offset;
   /// frame to act upon for PRACH
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index baa4ff1642c37f54327df9f4982fcf2859fad543..0fed5cc9deda0aef94b2ad7726757727270c3088 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -374,7 +374,7 @@ void *freq_thread(void *arg) {
  * \param dummy dummy variable not used
  * \returns 0 in success 
  */
-int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dummy) {
+int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg, int dont_block) {
 
   usrp_state_t *s = (usrp_state_t*)device->priv;
   pthread_t f_thread;
@@ -382,7 +382,12 @@ int trx_usrp_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,
   printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]);
 
   // spawn a thread to handle the frequency change to not block the calling thread
-  pthread_create(&f_thread,NULL,freq_thread,(void*)device);
+  if (dont_block == 1)
+    pthread_create(&f_thread,NULL,freq_thread,(void*)device);
+  else {
+    s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[0]);
+    s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[0]);
+  }
 
   return(0);
   
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 769c8fd727a0b1a31f851d7c61ac0ee79607659b..eaad5615933e2524e921ea49df33fb6a0292c106 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -745,11 +745,10 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
   eNB_proc_t *proc       = &eNB->proc;
 
   uint16_t packet_type;
-  uint32_t symbol_number,symbol_mask,symbol_mask_full;
+  uint32_t symbol_number,symbol_mask_full;
   int subframe_tx,frame_tx;
 
   symbol_number = 0;
-  symbol_mask = 0;
   symbol_mask_full = (1<<fp->symbols_per_tti)-1;
 
   do {   // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
@@ -766,21 +765,24 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
 	//	exit_fun("Exiting");
       }
       if (subframe_tx != *subframe) {
-	LOG_E(PHY,"fh_if4p5_asynch_DL: subframe_tx %d is not what we expect %d\n",subframe_tx,*subframe);
-	*subframe = subframe_tx;
-	//	exit_fun("Exiting");
+	LOG_E(PHY,"fh_if4p5_asynch_DL: (frame %d) subframe_tx %d is not what we expect %d\n",frame_tx,subframe_tx,*subframe);
+	//*subframe = subframe_tx;
+	//exit_fun("Exiting");
       }
     }
     if (packet_type == IF4p5_PDLFFT) {
-      symbol_mask = symbol_mask | (1<<symbol_number);
+      proc->symbol_mask[subframe_tx] =proc->symbol_mask[subframe_tx] | (1<<symbol_number);
     }
     else {
       LOG_E(PHY,"Illegal IF4p5 packet type (should only be IF4p5_PDLFFT%d\n",packet_type);
       exit_fun("Exiting");
     }
-  } while (symbol_mask != symbol_mask_full);    
+  } while (proc->symbol_mask[*subframe] != symbol_mask_full);    
+
+  // intialize this to zero after we're done with the subframe
+  proc->symbol_mask[*subframe] = 0;
   
-  do_OFDM_mod_rt(subframe_tx, eNB);
+  do_OFDM_mod_rt(*subframe, eNB);
 } 
 
 /*!
@@ -978,44 +980,43 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
   uint32_t symbol_number=0;
   uint32_t symbol_mask, symbol_mask_full;
 
-  symbol_mask = 0;
   symbol_mask_full = (1<<fp->symbols_per_tti)-1;
-  prach_rx = 0;
 
+  prach_rx = (is_prach_subframe(fp, *frame, *subframe)>0) ? 1 : 0;                            
+  if (eNB->CC_id==1) LOG_I(PHY,"rx_fh_if4p5: frame %d, subframe %d\n",*frame,*subframe);
   do {   // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!!
     recv_IF4p5(eNB, &proc->frame_rx, &proc->subframe_rx, &packet_type, &symbol_number);
-    proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023;
+
+    //proc->frame_rx = (proc->frame_rx + proc->frame_offset)&1023;
 
     if (packet_type == IF4p5_PULFFT) {
-      symbol_mask = symbol_mask | (1<<symbol_number);
-      prach_rx = (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0) ? 1 : 0;                            
+      proc->symbol_mask[proc->subframe_rx] = proc->symbol_mask[proc->subframe_rx] | (1<<symbol_number);
     } else if (packet_type == IF4p5_PRACH) {
       prach_rx = 0;
     }
 
-  } while( (symbol_mask != symbol_mask_full) || (prach_rx == 1));    
+    if (eNB->CC_id==1) LOG_I(PHY,"rx_fh_if4p5: symbol_mask[%d] %x, prach %d\n",*subframe,proc->symbol_mask[*subframe],prach_rx);
+
+  } while( (proc->symbol_mask[*subframe] != symbol_mask_full) || (prach_rx == 1));    
+  proc->symbol_mask[*subframe] = 0;
+  proc->symbol_mask[(9+*subframe)%10]= 0; // to handle a resynchronization event
+
+  if (eNB->CC_id==1) LOG_I(PHY,"Clearing symbol_mask[%d]\n",*subframe);
 
   //caculate timestamp_rx, timestamp_tx based on frame and subframe
-   proc->timestamp_rx = ((proc->frame_rx * 10)  + proc->subframe_rx ) * fp->samples_per_tti ;
-   proc->timestamp_tx = proc->timestamp_rx +  (4*fp->samples_per_tti);
- 
+  proc->timestamp_rx = ((proc->frame_rx * 10)  + proc->subframe_rx ) * fp->samples_per_tti ;
+  proc->timestamp_tx = proc->timestamp_rx +  (4*fp->samples_per_tti);
+  
  
   if (proc->first_rx == 0) {
     if (proc->subframe_rx != *subframe){
       LOG_E(PHY,"rx_fh_if4p5, CC_id %d: Received Timestamp doesn't correspond to the time we think it is (proc->subframe_rx %d, subframe %d,CCid %d)\n",eNB->CC_id,proc->subframe_rx,*subframe,eNB->CC_id);
-      /*
-      if (proc->subframe_rx> *subframe) {
-	LOG_E(PHY,"rx_fh_if4p5, CC_id %d: this is ahead of time, so adjusting\n",eNB->CC_id);
-	*subframe = proc->subframe_rx;
-      }
-      else {
-	LOG_E(PHY,"rx_fh_ip4p5, CC_id %d: this is behind time, dropping\n");
-	}*/
-      exit_fun("Exiting");
     }
     if (proc->frame_rx != *frame) {
-      LOG_E(PHY,"rx_fh_if4p5: Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d,CCid %d)\n",proc->frame_rx,*frame,eNB->CC_id);
-      exit_fun("Exiting");
+      if (proc->frame_rx == proc->frame_offset) // This means that the RRU has adjusted its frame timing
+	proc->frame_offset = 0;
+      else 
+	LOG_E(PHY,"rx_fh_if4p5: Received Timestamp doesn't correspond to the time we think it is (proc->frame_rx %d frame %d,CCid %d)\n",proc->frame_rx,*frame,eNB->CC_id);
     }
   } else {
     proc->first_rx = 0;
@@ -1024,11 +1025,13 @@ void rx_fh_if4p5(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
     else
       proc->frame_offset = PHY_vars_eNB_g[0][0]->proc.frame_rx;
 
-    *frame = (proc->frame_rx + proc->frame_offset)&1023;
+    *frame = proc->frame_rx;//(proc->frame_rx + proc->frame_offset)&1023;
     *subframe = proc->subframe_rx;        
   }
   
-  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
+
+
+  if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
   
 }
 
@@ -1495,7 +1498,7 @@ static void* eNB_thread_single( void* param ) {
       subframe++;
     }      
 
-    LOG_D(PHY,"eNB thread single %p (proc %p, CC_id %d), frame %d (%p), subframe %d (%p)\n",
+    if (eNB->CC_id==1) LOG_I(PHY,"eNB thread single %p (proc %p, CC_id %d), frame %d (%p), subframe %d (%p)\n",
 	  pthread_self(), proc, eNB->CC_id, frame,&frame,subframe,&subframe);
  
     // synchronization on FH interface, acquire signals/data and block
@@ -1509,6 +1512,8 @@ static void* eNB_thread_single( void* param ) {
     proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10;
     proc_rxtx->frame_tx    = (proc->subframe_rx < 6) ? proc->frame_rx : (proc->frame_rx+1)&1023; 
     proc_rxtx->timestamp_tx = proc->timestamp_tx;
+    // adjust for timing offset between RRU
+    if (eNB->CC_id!=0) proc_rxtx->frame_tx = (proc_rxtx->frame_tx+proc->frame_offset)&1023;
 
     // At this point, all information for subframe has been received on FH interface
     // If this proc is to provide synchronization, do so
@@ -1556,6 +1561,8 @@ void init_eNB_proc(int inst) {
     proc->first_tx=1;
     proc->frame_offset = 0;
 
+    for (i=0;i<10;i++) proc->symbol_mask[i]=0;
+
     pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL);
     pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL);
     pthread_cond_init( &proc_rxtx[0].cond_rxtx, NULL);