diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 74541080668d0e417c4c0dcc3767fa2b9bdca601..d1363eaeb9a361a2ba1e9f2a72b459db5ac41d29 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -1525,19 +1525,15 @@ void init_te_thread(PHY_VARS_eNB *eNB,pthread_attr_t *attr_te) {
 
 }
 
-
-
-
-
-void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) {
-
+void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe)
+{
   nfapi_rx_indication_pdu_t *pdu;
 
   int timing_advance_update;
   int sync_pos;
 
   uint32_t harq_pid = subframe2harq_pid(&eNB->frame_parms,
-					frame,subframe);
+                                        frame,subframe);
 
   pthread_mutex_lock(&eNB->UL_INFO_mutex);
   pdu                                    = &eNB->UL_INFO.rx_ind.rx_pdu_list[eNB->UL_INFO.rx_ind.number_of_pdus];
@@ -1546,55 +1542,41 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe) {
   pdu->rx_ue_information.rnti            = eNB->ulsch[UE_id]->rnti;
   pdu->rx_indication_rel8.length         = eNB->ulsch[UE_id]->harq_processes[harq_pid]->TBS>>3;
   pdu->rx_indication_rel8.offset         = 0;  // filled in at the end of the UL_INFO formation
-  pdu->data                              = eNB->ulsch[UE_id]->harq_processes[harq_pid]->b;  
+  pdu->data                              = eNB->ulsch[UE_id]->harq_processes[harq_pid]->b;
   // estimate timing advance for MAC
   sync_pos                               = lte_est_timing_advance_pusch(eNB,UE_id);
   timing_advance_update                  = sync_pos - eNB->frame_parms.nb_prefix_samples/4; //to check
 
-
   //  if (timing_advance_update > 10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);}
   //  if (timing_advance_update < -10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);}
   switch (eNB->frame_parms.N_RB_DL) {
-  case 6:
-    pdu->rx_indication_rel8.timing_advance = timing_advance_update;  
-    break;
-  case 15:
-    pdu->rx_indication_rel8.timing_advance = timing_advance_update/2;  
-    break;
-  case 25:
-    pdu->rx_indication_rel8.timing_advance = timing_advance_update/4;  
-    break;
-  case 50:
-    pdu->rx_indication_rel8.timing_advance = timing_advance_update/8;  
-    break;
-  case 75:
-    pdu->rx_indication_rel8.timing_advance = timing_advance_update/12;  
-    break;
-  case 100:
-    pdu->rx_indication_rel8.timing_advance = timing_advance_update/16;  
-    break;
+  case 6:   /* nothing to do */          break;
+  case 15:  timing_advance_update /= 2;  break;
+  case 25:  timing_advance_update /= 4;  break;
+  case 50:  timing_advance_update /= 8;  break;
+  case 75:  timing_advance_update /= 12; break;
+  case 100: timing_advance_update /= 16; break;
+  default: abort();
   }
   // put timing advance command in 0..63 range
-  pdu->rx_indication_rel8.timing_advance += 31;
-  if (pdu->rx_indication_rel8.timing_advance < 0)  pdu->rx_indication_rel8.timing_advance = 0;
-  if (pdu->rx_indication_rel8.timing_advance > 63) pdu->rx_indication_rel8.timing_advance = 63;
+  timing_advance_update += 31;
+  if (timing_advance_update < 0)  timing_advance_update = 0;
+  if (timing_advance_update > 63) timing_advance_update = 63;
+  pdu->rx_indication_rel8.timing_advance = timing_advance_update;
 
   // estimate UL_CQI for MAC (from antenna port 0 only)
   int SNRtimes10 = dB_fixed_times10(eNB->pusch_vars[UE_id]->ulsch_power[0]) - 200;//(10*eNB->measurements.n0_power_dB[0]);
 
-
   if      (SNRtimes10 < -640) pdu->rx_indication_rel8.ul_cqi=0;
   else if (SNRtimes10 >  635) pdu->rx_indication_rel8.ul_cqi=255;
   else                        pdu->rx_indication_rel8.ul_cqi=(640+SNRtimes10)/5;
 
-
   LOG_D(PHY,"[PUSCH %d] Filling RX_indication with SNR %d (%d), timing_advance %d (update %d)\n",
-	harq_pid,SNRtimes10,pdu->rx_indication_rel8.ul_cqi,pdu->rx_indication_rel8.timing_advance,
-	timing_advance_update);
+        harq_pid,SNRtimes10,pdu->rx_indication_rel8.ul_cqi,pdu->rx_indication_rel8.timing_advance,
+        timing_advance_update);
 
   eNB->UL_INFO.rx_ind.number_of_pdus++;
   pthread_mutex_unlock(&eNB->UL_INFO_mutex);
-
 }
 
 void release_harq(PHY_VARS_eNB *eNB,int UE_id,int tb,uint16_t frame,uint8_t subframe,uint16_t mask) {
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_RA.c b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
index 92f3bbde1e73102de2e9c627a21cd0753b20f1cc..c2700ed10665db40532bee8f8a4a5635b4b8a207 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_RA.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_RA.c
@@ -749,8 +749,8 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
 				       (unsigned short*)&rrc_sdu_length,             //
 				       &lcid,                       // sdu_lcid
 				       255,                         // no drx
-				       0,                           // no timing advance
-				       RA_template->cont_res_id,  // contention res id
+				       31,                          // no timing advance
+				       RA_template->cont_res_id,    // contention res id
 				       msg4_padding,                // no padding
 				       msg4_post_padding);
 	
@@ -913,8 +913,8 @@ void generate_Msg4(module_id_t module_idP,int CC_idP,frame_t frameP,sub_frame_t
 					 (unsigned short*)&rrc_sdu_length,             //
 					 &lcid,                       // sdu_lcid
 					 255,                         // no drx
-					 0,                           // no timing advance
-					 RA_template->cont_res_id,  // contention res id
+					 31,                          // no timing advance
+					 RA_template->cont_res_id,    // contention res id
 					 msg4_padding,                // no padding
 					 msg4_post_padding);
 	  
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 2c45ce3ad9c0c7276dc4b649440170f9e3aa96ad..580c02525dd04ecd98540ce637b6c878d497aa13 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -169,7 +169,7 @@ generate_dlsch_header(
     last_size=1;
   }
 
-  if (timing_advance_cmd != 0) {
+  if (timing_advance_cmd != 31) {
     if (first_element>0) {
       mac_header_ptr->E = 1;
       mac_header_ptr++;
@@ -457,6 +457,7 @@ schedule_ue_spec(
   nfapi_dl_config_request_body_t *dl_req;
   nfapi_dl_config_request_pdu_t  *dl_config_pdu;
   int                            tdd_sfa;
+  int                            ta_update;
 
 #if 0
   if (UE_list->head==-1) {
@@ -816,7 +817,18 @@ schedule_ue_spec(
         // check first for RLC data on DCCH
         // add the length for  all the control elements (timing adv, drx, etc) : header + payload
 
-        ta_len = (ue_sched_ctl->ta_update!=0) ? 2 : 0;
+        if (ue_sched_ctl->ta_timer == 0) {
+          ta_update = ue_sched_ctl->ta_update;
+          /* if we send TA then set timer to not send it for a while */
+          if (ta_update != 31)
+            ue_sched_ctl->ta_timer = 20;
+          /* reset ta_update */
+          ue_sched_ctl->ta_update = 31;
+        } else {
+          ta_update = 31;
+        }
+
+        ta_len = (ta_update != 31) ? 2 : 0;
 
         header_len_dcch = 2; // 2 bytes DCCH SDU subheader
 
@@ -1094,17 +1106,17 @@ schedule_ue_spec(
                                          sdu_lengths,  //
                                          sdu_lcids,
                                          255,                                   // no drx
-                                         ue_sched_ctl->ta_update, // timing advance
+                                         ta_update, // timing advance
                                          NULL,                                  // contention res id
                                          padding,
                                          post_padding);
 
           //#ifdef DEBUG_eNB_SCHEDULER
-          if (ue_sched_ctl->ta_update) {
+          if (ta_update != 31) {
             LOG_D(MAC,
                   "[eNB %d][DLSCH] Frame %d Generate header for UE_id %d on CC_id %d: sdu_length_total %d, num_sdus %d, sdu_lengths[0] %d, sdu_lcids[0] %d => payload offset %d,timing advance value : %d, padding %d,post_padding %d,(mcs %d, TBS %d, nb_rb %d),header_dcch %d, header_dtch %d\n",
                   module_idP,frameP, UE_id, CC_id, sdu_length_total,num_sdus,sdu_lengths[0],sdu_lcids[0],offset,
-                  ue_sched_ctl->ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch);
+                  ta_update,padding,post_padding,mcs,TBS,nb_rb,header_len_dcch,header_len_dtch);
 	  }
           //#endif
 #ifdef DEBUG_eNB_SCHEDULER
@@ -1116,6 +1128,7 @@ schedule_ue_spec(
 
           LOG_T(MAC,"\n");
 #endif
+
           // cycle through SDUs and place in dlsch_buffer
           memcpy(&UE_list->DLSCH_pdu[CC_id][0][UE_id].payload[0][offset],dlsch_buffer,sdu_length_total);
           // memcpy(RC.mac[0].DLSCH_pdu[0][0].payload[0][offset],dcch_buffer,sdu_lengths[0]);
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
index 6108845a8bf56c08cff0b6dcaf5245d087f22857..7d301395b89b5a509a2cbab8b21fa9680239197e 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_primitives.c
@@ -1724,6 +1724,8 @@ int add_new_ue(module_id_t mod_idP, int cc_idP, rnti_t rntiP,int harq_pidP
     memset((void*)&UE_list->UE_sched_ctrl[UE_id],0,sizeof(UE_sched_ctrl));
     memset((void*)&UE_list->eNB_UE_stats[cc_idP][UE_id],0,sizeof(eNB_UE_STATS));
 
+    UE_list->UE_sched_ctrl[UE_id].ta_update = 31;
+
     for (j=0; j<8; j++) {
       UE_list->UE_template[cc_idP][UE_id].oldNDI[j]    = (j==0)?1:0;   // 1 because first transmission is with format1A (Msg4) for harq_pid 0
       UE_list->UE_template[cc_idP][UE_id].oldNDI_UL[j] = (j==harq_pidP)?0:1; // 1st transmission is with Msg3;
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 009bf7566ac092db478954c64ea6f4583c499709..b8f3c418d0a24588abcdd4dffce57178d99851ca 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -115,7 +115,9 @@ void rx_sdu(const module_id_t enb_mod_idP,
        UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer   = 0;
        UE_list->UE_sched_ctrl[UE_id].ul_failure_timer      = 0;
        UE_list->UE_sched_ctrl[UE_id].ul_scheduled         &= (~(1<<harq_pid));
-       UE_list->UE_sched_ctrl[UE_id].ta_update             = timing_advance;
+       /* don't take into account TA if timer is running */
+       if (UE_list->UE_sched_ctrl[UE_id].ta_timer == 0)
+         UE_list->UE_sched_ctrl[UE_id].ta_update             = timing_advance;
        UE_list->UE_sched_ctrl[UE_id].ul_cqi                = ul_cqi;
        UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors = 0;
        first_rb =  UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid];
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index 1c7a283f84ec99dfb93c5843a6ae630ed9b56154..5337dcf657acd225d0c668d2a311a5609989218c 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -894,6 +894,8 @@ void dlsch_scheduler_pre_processor_reset (int module_idP,
   LOG_D(MAC,"Running preprocessor for UE %d (%x)\n",UE_id,rnti);
   // initialize harq_pid and round
 
+  if (ue_sched_ctl->ta_timer) ue_sched_ctl->ta_timer--;
+
   /*
   eNB_UE_stats *eNB_UE_stats;