diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index 5dc629b90bb34eb71da27385e1694bbbebb8d4db..9d1279c3029b8c23537eb06a6cf38c655ee8ae7e 100644
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -3684,12 +3684,14 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,u
        
     if (ue->mac_enabled==1) {
       if (slot==0) {
-	ret = mac_xface->ue_scheduler(ue->Mod_id,
-				      frame_tx,
-				      subframe_rx,
-				      subframe_select(&ue->frame_parms,subframe_tx),
-				      eNB_id,
-				      0/*FIXME CC_id*/);
+        ret = mac_xface->ue_scheduler(ue->Mod_id,
+            frame_rx,
+            subframe_rx,
+            frame_tx,
+            subframe_tx,
+            subframe_select(&ue->frame_parms,subframe_tx),
+            eNB_id,
+            0/*FIXME CC_id*/);
 	   
 	if (ret == CONNECTION_LOST) {
 	  LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id,
diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index 2235c3e1c41a01a2b66009692ac4a72a021a82c4..96855dd1cd7aec0086d95619fdcbfdd94181e902 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -995,10 +995,14 @@ typedef struct {
 /*!\brief Top level UE MAC structure */
 typedef struct {
   uint16_t Node_id;
-  /// frame counter
-  frame_t     frame;
-  /// subframe counter
-  sub_frame_t subframe;
+  /// RX frame counter
+  frame_t     rxFrame;
+  /// RX subframe counter
+  sub_frame_t rxSubframe;
+  /// TX frame counter
+  frame_t     txFrame;
+  /// TX subframe counter
+  sub_frame_t txSubframe;
   /// C-RNTI of UE
   uint16_t crnti;
   /// C-RNTI of UE before HO
diff --git a/openair2/LAYER2/MAC/openair2_proc.c b/openair2/LAYER2/MAC/openair2_proc.c
index 950713de5a0d6ddd1bbfd6d69828844a3368139b..4b635712778439a0fe4bdee87fed61b690f449ab 100644
--- a/openair2/LAYER2/MAC/openair2_proc.c
+++ b/openair2/LAYER2/MAC/openair2_proc.c
@@ -82,7 +82,7 @@ int openair2_stats_read(char *buffer, char **my_buffer, off_t off, int length)
     // mod_id used for PDCP and RLC
     Mod_id = NB_eNB_INST + ue_id ;
 
-    len+=sprintf(&buffer[len],"UE TTI: %d\n",UE_mac_inst[ue_id].frame);
+    len+=sprintf(&buffer[len],"UE RX TTI: %d\n",UE_mac_inst[ue_id].rxFrame);
 
     for (enb_id= 0; enb_id <NB_SIG_CNX_UE; enb_id++) {
 
diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h
index 59d6c352feca094bebe2059038059d313ed22fc9..08f29f8f47ca5ccb3dc17284d8f6e3d534442ccd 100644
--- a/openair2/LAYER2/MAC/proto.h
+++ b/openair2/LAYER2/MAC/proto.h
@@ -515,15 +515,20 @@ void adjust_bsr_info(int buffer_occupancy, uint16_t TBS, UE_TEMPLATE *UE_templat
 /*! \fn  UE_L2_state_t ue_scheduler(const module_id_t module_idP,const frame_t frameP, const sub_frame_t subframe, const lte_subframe_t direction,const uint8_t eNB_index)
    \brief UE scheduler where all the ue background tasks are done.  This function performs the following:  1) Trigger PDCP every 5ms 2) Call RRC for link status return to PHY3) Perform SR/BSR procedures for scheduling feedback 4) Perform PHR procedures.
 \param[in] module_idP instance of the UE
-\param[in] subframe t the subframe number
+\param[in] rxFrame the RX frame number
+\param[in] rxSubframe the RX subframe number
+\param[in] txFrame the TX frame number
+\param[in] txSubframe the TX subframe number
 \param[in] direction  subframe direction
 \param[in] eNB_index  instance of eNB
 @returns L2 state (CONNETION_OK or CONNECTION_LOST or PHY_RESYNCH)
 */
 UE_L2_STATE_t ue_scheduler(
   const module_id_t module_idP,
-  const frame_t frameP,
-  const sub_frame_t subframe,
+  const frame_t rxFrameP,
+  const sub_frame_t rxSubframe,
+  const frame_t txFrameP,
+  const sub_frame_t txSubframe,
   const lte_subframe_t direction,
   const uint8_t eNB_index,
   const int CC_id);
diff --git a/openair2/LAYER2/MAC/ra_procedures.c b/openair2/LAYER2/MAC/ra_procedures.c
index 30137fab33409f3defdf6bbf08130051264f4728..7d562bb35306f2f36419f3b3f449d151cede55a6 100644
--- a/openair2/LAYER2/MAC/ra_procedures.c
+++ b/openair2/LAYER2/MAC/ra_procedures.c
@@ -272,7 +272,7 @@ void Msg1_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id
 
   if (opt_enabled) {
     trace_pdu(0, NULL, 0, module_idP, 2, UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex,
-        UE_mac_inst[module_idP].frame, UE_mac_inst[module_idP].subframe, 0, UE_mac_inst[module_idP].RA_attempt_number);
+        UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, UE_mac_inst[module_idP].RA_attempt_number);
     LOG_D(OPT,"[UE %d][RAPROC] TX MSG1 Frame %d trace pdu for rnti %x  with size %d\n",
           module_idP, frameP, 1, UE_mac_inst[module_idP].RA_Msg3_size);
   }
@@ -296,7 +296,7 @@ void Msg3_tx(module_id_t module_idP,uint8_t CC_id,frame_t frameP, uint8_t eNB_id
 
   if (opt_enabled) { // msg3
     trace_pdu(0, &UE_mac_inst[module_idP].CCCH_pdu.payload[0], UE_mac_inst[module_idP].RA_Msg3_size,
-              module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].frame, UE_mac_inst[module_idP].subframe, 0, 0);
+              module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, 0);
     LOG_D(OPT,"[UE %d][RAPROC] MSG3 Frame %d trace pdu Preamble %d   with size %d\n",
           module_idP, frameP, UE_mac_inst[module_idP].crnti /*UE_mac_inst[module_idP].RA_prach_resources.ra_PreambleIndex*/, UE_mac_inst[module_idP].RA_Msg3_size);
   }
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index d5958f6e5e3d5cf6f450b7908be42cdc3cc4e477..3ba6b0ab0e5de314e8be1a4740e3266a731fb693 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -331,7 +331,7 @@ ue_send_sdu(module_id_t module_idP,
 
   if (opt_enabled) {
     trace_pdu(1, sdu, sdu_len, module_idP, 3, UE_mac_inst[module_idP].crnti,
-        UE_mac_inst[module_idP].frame, UE_mac_inst[module_idP].subframe, 0, 0);
+        UE_mac_inst[module_idP].rxFrame, UE_mac_inst[module_idP].rxSubframe, 0, 0);
     LOG_D(OPT,"[UE %d][DLSCH] Frame %d trace pdu for rnti %x  with size %d\n",
           module_idP, frameP, UE_mac_inst[module_idP].crnti, sdu_len);
   }
@@ -512,8 +512,8 @@ void ue_decode_si(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_i
 	      module_idP,
 	      4,
 	      0xffff,
-	      UE_mac_inst[module_idP].frame,
-	      UE_mac_inst[module_idP].subframe,
+	      UE_mac_inst[module_idP].rxFrame,
+	      UE_mac_inst[module_idP].rxSubframe,
 	      0,
 	      0);
     LOG_D(OPT,"[UE %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n",
@@ -548,8 +548,8 @@ void ue_decode_p(module_id_t module_idP,int CC_id,frame_t frameP, uint8_t eNB_in
 	      module_idP,
 	      4,
 	      P_RNTI,
-		  UE_mac_inst[module_idP].frame,
-	      UE_mac_inst[module_idP].subframe,
+	      UE_mac_inst[module_idP].rxFrame,
+	      UE_mac_inst[module_idP].rxSubframe,
 	      0,
 	      0);
     LOG_D(OPT,"[UE %d][BCH] Frame %d trace pdu for CC_id %d rnti %x with size %d\n",
@@ -1548,9 +1548,9 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
   stop_meas(&UE_mac_inst[module_idP].tx_ulsch_sdu);
   
   if (opt_enabled) {
-    trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].frame, UE_mac_inst[module_idP].subframe, 0, 0);
+    trace_pdu(0, ulsch_buffer, buflen, module_idP, 3, UE_mac_inst[module_idP].crnti, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, 0, 0);
     LOG_D(OPT,"[UE %d][ULSCH] Frame %d trace pdu for rnti %x  with size %d\n",
-          module_idP, UE_mac_inst[module_idP].frame, UE_mac_inst[module_idP].subframe, UE_mac_inst[module_idP].crnti, buflen);
+          module_idP, UE_mac_inst[module_idP].txFrame, UE_mac_inst[module_idP].txSubframe, UE_mac_inst[module_idP].crnti, buflen);
   }
 }
 
@@ -1565,8 +1565,10 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
 UE_L2_STATE_t
 ue_scheduler(
   const module_id_t    module_idP,
-  const frame_t        frameP,
-  const sub_frame_t    subframeP,
+  const frame_t        rxFrameP,
+  const sub_frame_t    rxSubframeP,
+  const frame_t        txFrameP,
+  const sub_frame_t    txSubframeP,
   const lte_subframe_t directionP,
   const uint8_t        eNB_indexP,
   const int            CC_id)
@@ -1590,7 +1592,7 @@ ue_scheduler(
   start_meas(&UE_mac_inst[module_idP].ue_scheduler);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SCHEDULER, VCD_FUNCTION_IN);
 
-  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_NO, UE_mac_inst[module_idP].crnti, frameP, subframeP,eNB_indexP);
+  PROTOCOL_CTXT_SET_BY_MODULE_ID(&ctxt, module_idP, ENB_FLAG_NO, UE_mac_inst[module_idP].crnti, txFrameP, txSubframeP,eNB_indexP);
 #if defined(ENABLE_ITTI)
 
   do {
@@ -1629,11 +1631,13 @@ ue_scheduler(
   //LG#ifdef EXMIMO
   pdcp_run(&ctxt);
   //#endif
-  UE_mac_inst[module_idP].frame = frameP;
-  UE_mac_inst[module_idP].subframe = subframeP;
+  UE_mac_inst[module_idP].txFrame    = txFrameP;
+  UE_mac_inst[module_idP].txSubframe = txSubframeP;
+  UE_mac_inst[module_idP].rxFrame    = rxFrameP;
+  UE_mac_inst[module_idP].rxSubframe = rxSubframeP;
 
 #ifdef CELLULAR
-  rrc_rx_tx(module_idP, frameP, 0, eNB_indexP);
+  rrc_rx_tx(module_idP, txFrameP, 0, eNB_indexP);
 #else
 
   switch (rrc_rx_tx(&ctxt,
@@ -1687,7 +1691,7 @@ ue_scheduler(
       //return(RRC_OK);
     }
 
-    LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",frameP,UE_mac_inst[module_idP].RA_contention_resolution_cnt,
+    LOG_I(MAC,"Frame %d: Contention resolution timer %d/%d\n",txFrameP,UE_mac_inst[module_idP].RA_contention_resolution_cnt,
           ((1+rach_ConfigCommon->ra_SupervisionInfo.mac_ContentionResolutionTimer)<<3));
 
     UE_mac_inst[module_idP].RA_contention_resolution_cnt++;
@@ -1727,10 +1731,10 @@ ue_scheduler(
         }
       }
 
-      if (update_bsr(module_idP,frameP, eNB_indexP, lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid])) {
+      if (update_bsr(module_idP,txFrameP, eNB_indexP, lcid, UE_mac_inst[module_idP].scheduling_info.LCGID[lcid])) {
         UE_mac_inst[module_idP].scheduling_info.SR_pending= 1;
         LOG_D(MAC,"[UE %d][SR] Frame %d subframe %d SR for PUSCH is pending for LCGID %d with BSR level %d (%d bytes in RLC)\n",
-              module_idP, frameP,subframeP,UE_mac_inst[module_idP].scheduling_info.LCGID[lcid],
+              module_idP, txFrameP,txSubframeP,UE_mac_inst[module_idP].scheduling_info.LCGID[lcid],
               UE_mac_inst[module_idP].scheduling_info.BSR[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]],
               UE_mac_inst[module_idP].scheduling_info.BSR_bytes[UE_mac_inst[module_idP].scheduling_info.LCGID[lcid]]);
       }
diff --git a/openair2/PHY_INTERFACE/defs.h b/openair2/PHY_INTERFACE/defs.h
index 0892b4d0b17775667d898f65f315359af37edc2d..e29ccdcc5e28dd64d82683e3295749fa9e8064b5 100644
--- a/openair2/PHY_INTERFACE/defs.h
+++ b/openair2/PHY_INTERFACE/defs.h
@@ -169,7 +169,7 @@ typedef struct {
   void (*dl_phy_sync_success) (module_id_t Mod_id,frame_t frameP, uint8_t CH_index,uint8_t first_sync);
 
   /// Only calls the PDCP for now
-  UE_L2_STATE_t (*ue_scheduler)(module_id_t Mod_id, frame_t frameP,sub_frame_t subframe, lte_subframe_t direction, uint8_t eNB_id, int CC_id);
+  UE_L2_STATE_t (*ue_scheduler)(module_id_t Mod_id, frame_t rxFrameP,sub_frame_t rxSubframe, frame_t txFrameP,sub_frame_t txSubframe, lte_subframe_t direction, uint8_t eNB_id, int CC_id);
 
   /// PHY-Config-Dedicated UE
   void (*phy_config_dedicated_ue)(module_id_t Mod_id,int CC_id,uint8_t CH_index,
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 8e11a826385ecfd1b5691cb951c28a6205aaa7b5..932e875752f9ca25608a95bf32c6ff5f8f499a30 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -749,11 +749,13 @@ static void *UE_thread_rxn_txnp4(void *arg)
     if (UE->mac_enabled==1) {
 
       ret = mac_xface->ue_scheduler(UE->Mod_id,
-				    proc->frame_tx,
-				    proc->subframe_rx,
-				    subframe_select(&UE->frame_parms,proc->subframe_tx),
-				    0,
-				    0/*FIXME CC_id*/);
+          proc->frame_rx,
+          proc->subframe_rx,
+          proc->frame_tx,
+          proc->subframe_tx,
+          subframe_select(&UE->frame_parms,proc->subframe_tx),
+          0,
+          0/*FIXME CC_id*/);
       
       if (ret == CONNECTION_LOST) {
 	LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n",