From b62885663534a087beacc335cf58ffd5925ad916 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Fri, 1 Jul 2016 03:10:39 -0700
Subject: [PATCH] updates in UE for new process scheduling

---
 openair1/PHY/INIT/lte_init.c                  |   12 +-
 openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c |    4 +-
 .../PHY/LTE_ESTIMATION/lte_ue_measurements.c  |   22 +-
 openair1/PHY/LTE_TRANSPORT/dci_tools.c        |   15 +-
 .../PHY/LTE_TRANSPORT/dlsch_demodulation.c    |    2 +-
 openair1/PHY/LTE_TRANSPORT/drs_modulation.c   |    3 +-
 openair1/PHY/LTE_TRANSPORT/initial_sync.c     |   23 +-
 openair1/PHY/LTE_TRANSPORT/phich.c            |   17 +-
 openair1/PHY/LTE_TRANSPORT/print_stats.c      |    6 +-
 openair1/PHY/LTE_TRANSPORT/proto.h            |   21 +-
 openair1/PHY/LTE_TRANSPORT/pucch.c            |    9 +-
 openair1/PHY/LTE_TRANSPORT/rar_tools.c        |    7 +-
 openair1/PHY/TOOLS/lte_phy_scope.c            |    2 +-
 openair1/PHY/defs.h                           |  102 +-
 openair1/SCHED/defs.h                         |  100 +-
 openair1/SCHED/phy_procedures_lte_ue.c        | 4255 ++++++++---------
 openair1/SCHED/pucch_pc.c                     |    6 +-
 openair1/SCHED/pusch_pc.c                     |   10 +-
 targets/RT/USER/lte-softmodem.c               |    2 +-
 targets/RT/USER/lte-ue.c                      |  557 +--
 20 files changed, 2360 insertions(+), 2815 deletions(-)

diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index e3128d7296..a453b8eb8d 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -259,7 +259,7 @@ void phy_config_sib2_ue(uint8_t Mod_id,int CC_id,
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_UE_CONFIG_SIB2, VCD_FUNCTION_IN);
 
-  LOG_I(PHY,"[UE%d] Frame %d: Applying radioResourceConfigCommon from eNB%d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,CH_index);
+  LOG_I(PHY,"[UE%d] Applying radioResourceConfigCommon from eNB%d\n",Mod_id,CH_index);
 
   frame_parms->prach_config_common.rootSequenceIndex                           =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
 
@@ -369,7 +369,7 @@ void phy_config_sib13_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index,int mbsfn_Are
   LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_UE_g[Mod_id][CC_id]->frame_parms;
 
 
-  LOG_I(PHY,"[UE%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,mbsfn_AreaId_r9,mbsfn_Area_idx);
+  LOG_I(PHY,"[UE%d] Applying MBSFN_Area_id %d for index %d\n",Mod_id,mbsfn_AreaId_r9,mbsfn_Area_idx);
 
   if (mbsfn_Area_idx == 0) {
     frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9;
@@ -517,8 +517,8 @@ void phy_config_afterHO_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_id, Mobility
     //     uint8_t prach_fmt;
     //     int u;
 
-    LOG_I(PHY,"[UE%d] Frame %d: Handover triggered: Applying radioResourceConfigCommon from eNB %d\n",
-          Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx,eNB_id);
+    LOG_I(PHY,"[UE%d] Handover triggered: Applying radioResourceConfigCommon from eNB %d\n",
+          Mod_id,eNB_id);
 
     frame_parms->prach_config_common.rootSequenceIndex                           =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
     frame_parms->prach_config_common.prach_Config_enabled=1;
@@ -752,7 +752,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index,
 
 
   if (physicalConfigDedicated) {
-    LOG_D(PHY,"[UE %d] Frame %d: Received physicalConfigDedicated from eNB %d\n",Mod_id, phy_vars_ue->frame_rx,CH_index);
+    LOG_D(PHY,"[UE %d] Received physicalConfigDedicated from eNB %d\n",Mod_id, CH_index);
     LOG_D(PHY,"------------------------------------------------------------------------\n");
 
     if (physicalConfigDedicated->pdsch_ConfigDedicated) {
@@ -843,7 +843,7 @@ void phy_config_dedicated_ue(uint8_t Mod_id,int CC_id,uint8_t CH_index,
 
 #endif
   } else {
-    LOG_D(PHY,"[PHY][UE %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, phy_vars_ue->frame_rx,CH_index);
+    LOG_D(PHY,"[PHY][UE %d] Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id,CH_index);
     return;
   }
 
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 6980ca358c..b78a7e24fd 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -51,7 +51,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
   ncoef = 32767 - coef;
 
 #ifdef DEBUG_PHY
-  LOG_D(PHY,"frame %d, slot %d: rx_offset (before) = %d\n",ue->frame_rx,ue->slot_rx,ue->rx_offset);
+  LOG_D(PHY,"frame %d: rx_offset (before) = %d\n",ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset);
 #endif //DEBUG_PHY
 
 
@@ -95,7 +95,7 @@ void lte_adjust_synch(LTE_DL_FRAME_PARMS *frame_parms,
 
 #ifdef DEBUG_PHY
   LOG_D(PHY,"frame %d: rx_offset (after) = %d : max_pos = %d,max_pos_fil = %d (peak %d)\n",
-        ue->frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp);
+        ue->proc.proc_rxtx[0].frame_rx,ue->rx_offset,max_pos,max_pos_fil,temp);
 #endif //DEBUG_PHY
 
 
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
index ae484092b8..7a9fd1284d 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c
@@ -77,7 +77,7 @@ int16_t get_PL(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
     RSoffset = 3;
   */
 
-  LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", ue->frame_rx,
+  LOG_D(PHY,"get_PL : Frame %d : rsrp %f dBm/RE (%f), eNB power %d dBm/RE\n", ue->proc.proc_rxtx[0].frame_rx,
         (1.0*dB_fixed_times10(ue->measurements.rsrp[eNB_index])-(10.0*ue->rx_total_gain_dB))/10.0,
         10*log10((double)ue->measurements.rsrp[eNB_index]),
         ue->frame_parms.pdsch_config_common.referenceSignalPower);
@@ -172,7 +172,7 @@ int8_t set_RSRQ_filtered(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index,float rs
 }
 
 void ue_rrc_measurements(PHY_VARS_UE *ue,
-                         uint8_t slot,
+                         uint8_t subframe,
                          uint8_t abstraction_flag)
 {
 
@@ -192,7 +192,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
 
       if (abstraction_flag == 0) {
         if ((ue->frame_parms.frame_type == FDD) &&
-            ((slot == 0) || (slot == 10))) {  // FDD PSS/SSS, compute noise in DTX REs
+            ((subframe == 0) || (subframe == 5))) {  // FDD PSS/SSS, compute noise in DTX REs
 
           if (ue->frame_parms.Ncp==NORMAL) {
             for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
@@ -240,7 +240,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
 	  }
         }
 	else if ((ue->frame_parms.frame_type == TDD) &&
-		 (slot == 1)) {  // TDD SSS, compute noise in DTX REs
+		 (subframe == 0)) {  // TDD SSS, compute noise in DTX REs
 
           if (ue->frame_parms.Ncp==NORMAL) {
             for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) {
@@ -294,7 +294,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
       for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) {
         k = (nu + nushift)%6;
 #ifdef DEBUG_MEAS
-        LOG_I(PHY,"[UE %d] Frame %d slot %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->frame_rx,slot,Nid_cell,nushift,
+        LOG_I(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift,
               eNB_offset,k,l);
 #endif
 
@@ -376,15 +376,15 @@ void ue_rrc_measurements(PHY_VARS_UE *ue,
     //    if (slot == 0) {
 
       if (eNB_offset == 0)
-        LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id,
-              ue->frame_rx,slot,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
+        LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id,
+              ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
               10*log10(ue->measurements.rssi),
               ue->rx_total_gain_dB,
               ue->measurements.n0_power_tot_dBm);
 
-      LOG_I(PHY,"[UE %d] Frame %d, slot %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n",
+      LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n",
             ue->Mod_id,
-            ue->frame_rx,slot,eNB_offset,
+            ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,eNB_offset,
             (eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell,
             10*log10(ue->measurements.rsrp[eNB_offset])-ue->rx_total_gain_dB,
             ue->measurements.rsrp[eNB_offset],
@@ -699,9 +699,9 @@ void lte_ue_measurements(PHY_VARS_UE *ue,
 }
 
 
-void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
+void lte_ue_measurements_emul(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id)
 {
 
-  msg("[PHY] EMUL UE lte_ue_measurements_emul last slot %d, eNB_id %d\n",last_slot,eNB_id);
+  msg("[PHY] EMUL UE lte_ue_measurements_emul subframe %d, eNB_id %d\n",subframe,eNB_id);
 }
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 18e232e967..3f784e22d3 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -6236,6 +6236,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
                                       uint8_t subframe,
                                       DCI_format_t dci_format,
                                       PHY_VARS_UE *ue,
+				      UE_rxtx_proc_t *proc,
                                       uint16_t si_rnti,
                                       uint16_t ra_rnti,
                                       uint16_t p_rnti,
@@ -6269,12 +6270,12 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
       harq_pid = 0;
     else
       harq_pid = subframe2harq_pid(frame_parms,
-                                   pdcch_alloc2ul_frame(frame_parms,ue->frame_rx,subframe),
+                                   pdcch_alloc2ul_frame(frame_parms,proc->frame_rx,subframe),
                                    pdcch_alloc2ul_subframe(frame_parms,subframe));
 
     if (harq_pid == 255) {
       LOG_E(PHY, "frame %d, subframe %d, rnti %x, format %d: illegal harq_pid!\n",
-            ue->frame_rx, subframe, rnti, dci_format);
+            proc->frame_rx, subframe, rnti, dci_format);
       return(-1);
     }
 
@@ -6401,7 +6402,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
 
     if (rballoc > RIV_max) {
       LOG_E(PHY,"frame %d, subframe %d, rnti %x, format %d: FATAL ERROR: generate_ue_ulsch_params_from_dci, rb_alloc > RIV_max\n",
-            ue->frame_rx, subframe, rnti, dci_format);
+            proc->frame_rx, subframe, rnti, dci_format);
       return(-1);
     }
 
@@ -6416,13 +6417,13 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
 
     if (ue->ul_power_control_dedicated[eNB_id].accumulationEnabled == 1) {
       LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ACC) %d, adjusting by %d (TPC %d)\n",
-            ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->f_pusch,
+            ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
             delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC],
             ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC);
       ulsch->f_pusch += delta_PUSCH_acc[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC];
     } else {
       LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d subframe %d: f_pusch (ABS) %d, adjusting to %d (TPC %d)\n",
-            ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->f_pusch,
+            ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->f_pusch,
             delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC],
             ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC);
       ulsch->f_pusch = delta_PUSCH_abs[ue->ulsch[eNB_id]->harq_processes[harq_pid]->TPC];
@@ -7044,7 +7045,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
     }
 
     LOG_D(PHY,"[UE %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d), nb_rb %d, first_rb %d, mcs %d, round %d, rv %d\n",
-          ue->Mod_id,harq_pid,ue->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,
+          ue->Mod_id,harq_pid,proc->frame_rx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift,ulsch->harq_processes[harq_pid]->nb_rb,ulsch->harq_processes[harq_pid]->first_rb,
           ulsch->harq_processes[harq_pid]->mcs,ulsch->harq_processes[harq_pid]->round,ulsch->harq_processes[harq_pid]->rvidx);
 
     // ulsch->n_DMRS2 = ((DCI0_5MHz_TDD_1_6_t *)dci_pdu)->cshift;
@@ -7071,7 +7072,7 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
     return(0);
   } else {
     LOG_E(PHY,"frame %d, subframe %d: FATAL ERROR, generate_ue_ulsch_params_from_dci, Illegal dci_format %d\n",
-          ue->frame_rx, subframe,dci_format);
+          proc->frame_rx, subframe,dci_format);
     return(-1);
   }
 
diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
index c41262727f..ab6c4703d6 100644
--- a/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/dlsch_demodulation.c
@@ -123,7 +123,7 @@ int rx_pdsch(PHY_VARS_UE *ue,
     break;
 
   default:
-    LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->frame_rx,subframe,type);
+    LOG_E(PHY,"[UE %d][FATAL] Frame %d subframe %d: Unknown PDSCH format %d\n",ue->proc.proc_rxtx[0].frame_rx,subframe,type);
     return(-1);
     break;
   }
diff --git a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
index 8ccfc72d20..1f8e605eaf 100644
--- a/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/drs_modulation.c
@@ -43,6 +43,7 @@
 //#define DEBUG_DRS
 
 int generate_drs_pusch(PHY_VARS_UE *ue,
+		       UE_rxtx_proc_t *proc,
                        uint8_t eNB_id,
                        short amp,
                        unsigned int subframe,
@@ -70,7 +71,7 @@ int generate_drs_pusch(PHY_VARS_UE *ue,
   uint32_t v0=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[subframe<<1];
   uint32_t v1=frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.seqhop[1+(subframe<<1)];
   int32_t ref_re,ref_im;
-  uint8_t harq_pid = subframe2harq_pid(frame_parms,ue->frame_tx,subframe);
+  uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
 
   cyclic_shift0 = (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
                    ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2 +
diff --git a/openair1/PHY/LTE_TRANSPORT/initial_sync.c b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
index 673b7a4348..57c9a824a2 100644
--- a/openair1/PHY/LTE_TRANSPORT/initial_sync.c
+++ b/openair1/PHY/LTE_TRANSPORT/initial_sync.c
@@ -239,20 +239,25 @@ int pbch_detection(PHY_VARS_UE *ue, runmode_t mode)
       break;
     }
 
-    ue->frame_rx =   (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
-    ue->frame_rx += frame_mod4;
+    ue->proc.proc_rxtx[0].frame_rx =   (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
+    ue->proc.proc_rxtx[0].frame_rx += frame_mod4;
+
+    ue->proc.proc_rxtx[1].frame_rx =   (((ue->pbch_vars[0]->decoded_output[2]&3)<<6) + (ue->pbch_vars[0]->decoded_output[1]>>2))<<2;
+    ue->proc.proc_rxtx[1].frame_rx += frame_mod4;
 
 #ifndef USER_MODE
     // one frame delay
-    ue->frame_rx ++;
+    ue->proc.proc_rxtx[0].frame_rx ++;
+    ue->proc.proc_rxtx[1].frame_rx ++;
 #endif
-    ue->frame_tx = ue->frame_rx;
+    ue->proc.proc_rxtx[0].frame_tx = ue->proc.proc_rxtx[0].frame_rx;
+    ue->proc.proc_rxtx[1].frame_tx = ue->proc.proc_rxtx[1].frame_rx;
 #ifdef DEBUG_INITIAL_SYNCH
     LOG_I(PHY,"[UE%d] Initial sync: pbch decoded sucessfully mode1_flag %d, tx_ant %d, frame %d, N_RB_DL %d, phich_duration %d, phich_resource %s!\n",
           ue->Mod_id,
           frame_parms->mode1_flag,
           pbch_tx_ant,
-          ue->frame_rx,
+          ue->proc.proc_rxtx[0].frame_rx,
           frame_parms->N_RB_DL,
           frame_parms->phich_config_common.phich_duration,
           phich_resource);  //frame_parms->phich_config_common.phich_resource);
@@ -475,7 +480,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
       if (ue->mac_enabled==1) {
 	LOG_I(PHY,"[UE%d] Sending synch status to higher layers\n",ue->Mod_id);
 	//mac_resynch();
-	mac_xface->dl_phy_sync_success(ue->Mod_id,ue->frame_rx,0,1);//ue->common_vars.eNb_id);
+	mac_xface->dl_phy_sync_success(ue->Mod_id,ue->proc.proc_rxtx[0].frame_rx,0,1);//ue->common_vars.eNb_id);
 	ue->UE_mode[0] = PRACH;
       }
       else {
@@ -491,7 +496,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
     }
 
     LOG_I(PHY,"[UE %d] Frame %d RRC Measurements => rssi %3.1f dBm (dig %3.1f dB, gain %d), N0 %d dBm,  rsrp %3.1f dBm/RE, rsrq %3.1f dB\n",ue->Mod_id,
-	  ue->frame_rx,
+	  ue->proc.proc_rxtx[0].frame_rx,
 	  10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB,
 	  10*log10(ue->measurements.rssi),
 	  ue->rx_total_gain_dB,
@@ -502,7 +507,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
     
     LOG_I(PHY,"[UE %d] Frame %d MIB Information => %s, %s, NidCell %d, N_RB_DL %d, PHICH DURATION %d, PHICH RESOURCE %s, TX_ANT %d\n",
 	  ue->Mod_id,
-	  ue->frame_rx,
+	  ue->proc.proc_rxtx[0].frame_rx,
 	  duplex_string[ue->frame_parms.frame_type],
 	  prefix_string[ue->frame_parms.Ncp],
 	  ue->frame_parms.Nid_cell,
@@ -513,7 +518,7 @@ int initial_sync(PHY_VARS_UE *ue, runmode_t mode)
 
     LOG_I(PHY,"[UE %d] Frame %d Measured Carrier Frequency %.0f Hz (offset %d Hz)\n",
 	  ue->Mod_id,
-	  ue->frame_rx,
+	  ue->proc.proc_rxtx[0].frame_rx,
 	  openair0_cfg[0].rx_freq[0]-ue->common_vars.freq_offset,
 	  ue->common_vars.freq_offset);
 
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index 0d0d5832cb..71de66cfc2 100644
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -1055,6 +1055,7 @@ void generate_phich(LTE_DL_FRAME_PARMS *frame_parms,
 
 
 void rx_phich(PHY_VARS_UE *ue,
+	      UE_rxtx_proc_t *proc,
               uint8_t subframe,
               uint8_t eNB_id)
 {
@@ -1064,7 +1065,7 @@ void rx_phich(PHY_VARS_UE *ue,
   LTE_UE_PDCCH **pdcch_vars = ue->pdcch_vars;
 
   //  uint8_t HI;
-  uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,ue->frame_rx,subframe);
+  uint8_t harq_pid = phich_subframe_to_harq_pid(frame_parms,proc->frame_rx,subframe);
   LTE_UE_ULSCH_t *ulsch = ue->ulsch[eNB_id];
   int16_t phich_d[24],*phich_d_ptr,HI16;
   //  unsigned int i,aa;
@@ -1082,10 +1083,10 @@ void rx_phich(PHY_VARS_UE *ue,
   uint8_t pusch_subframe;
 
   // check if we're expecting a PHICH in this subframe
-  LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,ue->frame_rx,subframe);
+  LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
 
   if (ulsch->harq_processes[harq_pid]->status == ACTIVE) {
-    LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,ue->frame_rx,subframe);
+    LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH RX ACTIVE\n",ue->Mod_id,harq_pid,proc->frame_rx,subframe);
     Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48;
 
     if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0)
@@ -1349,14 +1350,14 @@ void rx_phich(PHY_VARS_UE *ue,
     if (ue->ulsch_Msg3_active[eNB_id] == 1) {
       LOG_D(PHY,"[UE  %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received NAK (%d) nseq %d, ngroup %d\n",
             ue->Mod_id,harq_pid,
-            ue->frame_rx,
+            proc->frame_rx,
             subframe,
             HI16,
             nseq_PHICH,
             ngroup_PHICH);
       get_Msg3_alloc_ret(&ue->frame_parms,
                          subframe,
-                         ue->frame_rx,
+                         proc->frame_rx,
                          &ue->ulsch_Msg3_frame[eNB_id],
                          &ue->ulsch_Msg3_subframe[eNB_id]);
       ulsch->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
@@ -1374,7 +1375,7 @@ void rx_phich(PHY_VARS_UE *ue,
       //#ifdef DEBUG_PHICH
       LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH, received NAK (%d) nseq %d, ngroup %d\n",
             ue->Mod_id,harq_pid,
-            ue->frame_rx,
+            proc->frame_rx,
             subframe,
             HI16,
             nseq_PHICH,
@@ -1394,7 +1395,7 @@ void rx_phich(PHY_VARS_UE *ue,
     if (ue->ulsch_Msg3_active[eNB_id] == 1) {
       LOG_D(PHY,"[UE  %d][PUSCH %d][RAPROC] Frame %d subframe %d Msg3 PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
             ue->Mod_id,harq_pid,
-            ue->frame_rx,
+            proc->frame_rx,
             subframe,
             HI16,
             nseq_PHICH,ngroup_PHICH);
@@ -1402,7 +1403,7 @@ void rx_phich(PHY_VARS_UE *ue,
       //#ifdef PHICH_DEBUG
       LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d PHICH, received ACK (%d) nseq %d, ngroup %d\n\n",
             ue->Mod_id,harq_pid,
-            ue->frame_rx,
+            proc->frame_rx,
             subframe, HI16,
             nseq_PHICH,ngroup_PHICH);
       //#endif
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index a175f4cb8e..1653d0e549 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -55,7 +55,7 @@ extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
 extern openair0_config_t openair0_cfg[];
 #endif
 
-int dump_ue_stats(PHY_VARS_UE *ue, char* buffer, int length, runmode_t mode, int input_level_dBm)
+int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length, runmode_t mode, int input_level_dBm)
 {
 
   uint8_t eNB=0;
@@ -78,7 +78,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, char* buffer, int length, runmode_t mode, int
     /*
     len += sprintf(&buffer[len],
                    "[UE PROC] Frame count: %d\neNB0 RSSI %d dBm/RE (%d dB, %d dB)\neNB1 RSSI %d dBm/RE (%d dB, %d dB)neNB2 RSSI %d dBm/RE (%d dB, %d dB)\nN0 %d dBm/RE, %f dBm/%dPRB (%d dB, %d dB)\n",
-                   ue->frame_rx,
+                   proc->frame_rx,
                    ue->measurements.rx_rssi_dBm[0],
                    ue->measurements.rx_power_dB[0][0],
                    ue->measurements.rx_power_dB[0][1],
@@ -535,7 +535,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, char* buffer, int length, runmode_t mode, int
 
   } else {
     len += sprintf(&buffer[len], "[UE PROC] Frame count: %d, RSSI %3.2f dB (%d dB, %d dB), N0 %3.2f dB (%d dB, %d dB)\n",
-                   ue->frame_rx,
+                   proc->frame_rx,
                    10*log10(ue->measurements.rssi),
                    ue->measurements.rx_power_dB[0][0],
                    ue->measurements.rx_power_dB[0][1],
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index 0afa2936bb..547dd86a9c 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -1328,6 +1328,7 @@ int32_t generate_srs_tx(PHY_VARS_UE *phy_vars_ue,
 */
 
 int32_t generate_drs_pusch(PHY_VARS_UE *phy_vars_ue,
+			   UE_rxtx_proc_t *proc,
                            uint8_t eNB_id,
                            int16_t amp,
                            uint32_t subframe,
@@ -1398,7 +1399,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
                                       uint8_t subframe,
                                       DCI_format_t dci_format,
                                       PHY_VARS_UE *phy_vars_ue,
-                                      uint16_t si_rnti,
+                                      UE_rxtx_proc_t *proc,
+				      uint16_t si_rnti,
                                       uint16_t ra_rnti,
                                       uint16_t p_rnti,
                                       uint16_t cba_rnti,
@@ -1406,7 +1408,8 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
                                       uint8_t use_srs);
 
 int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
-    uint8_t eNB_id);
+					  UE_rxtx_proc_t *proc,
+					  uint8_t eNB_id);
 double sinr_eff_cqi_calc(PHY_VARS_UE *phy_vars_ue,
                          uint8_t eNB_id);
 int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
@@ -1424,16 +1427,13 @@ int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
 
 void dump_ulsch(PHY_VARS_eNB *phy_vars_eNB,eNB_rxtx_proc_t *proc,uint8_t UE_id);
 
-void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid);
-void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
-void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
 
-void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round);
+
 
 
 int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci);
 
-int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t mode, int input_level_dBm);
+int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc, char* buffer, int length, runmode_t mode, int input_level_dBm);
 int dump_eNB_stats(PHY_VARS_eNB *phy_vars_eNB, char* buffer, int length);
 
 
@@ -1550,11 +1550,13 @@ void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
 
 /* \brief  This routine demodulates the PHICH and updates PUSCH/ULSCH parameters.
    @param phy_vars_ue Pointer to UE variables
+   @param proc Pointer to RXN_TXNp4 proc
    @param subframe Subframe of received PDCCH/PHICH
    @param eNB_id Index of eNB
 */
 
 void rx_phich(PHY_VARS_UE *phy_vars_ue,
+	      UE_rxtx_proc_t *proc,
               uint8_t subframe,
               uint8_t eNB_id);
 
@@ -1653,11 +1655,12 @@ void generate_pucch(int32_t **txdataF,
                     uint8_t subframe);
 
 void generate_pucch_emul(PHY_VARS_UE *phy_vars_ue,
+			 UE_rxtx_proc_t *proc,
                          PUCCH_FMT_t format,
                          uint8_t ncs1,
                          uint8_t *pucch_ack_payload,
-                         uint8_t sr,
-                         uint8_t subframe);
+                         uint8_t sr);
+
 
 
 uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c
index e2876f95e3..cb7803fbfc 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch.c
@@ -403,13 +403,16 @@ void generate_pucch(int32_t **txdataF,
 }
 
 void generate_pucch_emul(PHY_VARS_UE *ue,
+			 UE_rxtx_proc_t *proc,
                          PUCCH_FMT_t format,
                          uint8_t ncs1,
                          uint8_t *pucch_payload,
-                         uint8_t sr,
-                         uint8_t subframe)
+                         uint8_t sr)
+
 {
 
+  int subframe = proc->subframe_tx;
+
   UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_flag    = format;
   UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_Ncs1    = ncs1;
 
@@ -428,7 +431,7 @@ void generate_pucch_emul(PHY_VARS_UE *ue,
     ue->pucch_payload[0] = pucch_payload[0] + (pucch_payload[1]<<1);
     UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pucch_payload = pucch_payload[0] + (pucch_payload[1]<<1);
   } else if (format == pucch_format1) {
-    LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,ue->frame_tx,subframe,sr);
+    LOG_D(PHY,"[UE %d] Frame %d subframe %d Generating PUCCH for SR %d\n",ue->Mod_id,proc->frame_tx,subframe,sr);
   }
 
   ue->sr[subframe] = sr;
diff --git a/openair1/PHY/LTE_TRANSPORT/rar_tools.c b/openair1/PHY/LTE_TRANSPORT/rar_tools.c
index dbac1e2280..0cdabe9b9d 100644
--- a/openair1/PHY/LTE_TRANSPORT/rar_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/rar_tools.c
@@ -175,6 +175,7 @@ int generate_eNB_ulsch_params_from_rar(unsigned char *rar_pdu,
 int8_t delta_PUSCH_msg2[8] = {-6,-4,-2,0,2,4,6,8};
 
 int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
+				      UE_rxtx_proc_t *proc,
                                       unsigned char eNB_id )
 {
 
@@ -189,13 +190,13 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
   //  int current_dlsch_cqi = ue->current_dlsch_cqi[eNB_id];
 
   uint8_t *rar = (uint8_t *)(rar_pdu+1);
-  uint8_t harq_pid = subframe2harq_pid(frame_parms,ue->frame_tx,subframe);
+  uint8_t harq_pid = subframe2harq_pid(frame_parms,proc->frame_tx,subframe);
   uint16_t rballoc;
   uint8_t cqireq;
   uint16_t *RIV2nb_rb_LUT, *RIV2first_rb_LUT;
   uint16_t RIV_max = 0;
 
-  LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",ue->frame_tx,subframe,harq_pid);
+  LOG_D(PHY,"[eNB][RAPROC] Frame %d: generate_ue_ulsch_params_from_rar: subframe %d (harq_pid %d)\n",proc->frame_tx,subframe,harq_pid);
 
   switch (frame_parms->N_RB_DL) {
   case 6:
@@ -272,7 +273,7 @@ int generate_ue_ulsch_params_from_rar(PHY_VARS_UE *ue,
     ulsch->uci_format = HLC_subband_cqi_nopmi;
     fill_CQI(ulsch,meas,eNB_id,0,ue->frame_parms.N_RB_DL,0, transmission_mode,ue->sinr_eff);
 
-    if (((ue->frame_tx % 100) == 0) || (ue->frame_tx < 10))
+    if (((proc->frame_tx % 100) == 0) || (proc->frame_tx < 10))
       print_CQI(ulsch->o,ulsch->uci_format,eNB_id,ue->frame_parms.N_RB_DL);
   } else {
     ulsch->O_RI                                = 0;
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index 8af3fcf8d1..f3e5e71775 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -509,7 +509,7 @@ void phy_scope_UE(FD_lte_phy_scope_ue *form,
   float **chest_t_abs;
   float time[FRAME_LENGTH_COMPLEX_SAMPLES];
   float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
-  int frame = phy_vars_ue->frame_rx;
+  int frame = phy_vars_ue->proc.proc_rxtx[0].frame_rx;
   uint32_t total_dlsch_bitrate = phy_vars_ue->bitrate[eNB_id];
   int coded_bits_per_codeword = 0;
   int mcs = 0;
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 0c61fe0bc7..70a661adf0 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -157,11 +157,11 @@ enum transmission_access_mode {
   SCHEDULED_ACCESS,
   CBA_ACCESS};
 
-typedef enum {
-  eNodeB_3GPP=0,    // classical eNodeB function
-  eNodeB_3GPP_BBU,  // classical eNodeB function with transport interface
-  NGFI_RRU_IF4,     // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) 
-  NGFI_RCC_IF4     // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) 
+typedef enum  {
+  eNodeB_3GPP=0,  // classical eNodeB function
+  eNodeB_3GPP_BBU, // eNodeB with NGFI IF5
+  NGFI_RRU_IF4,   // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) 
+  NGFI_RCC_IF4    // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) 
 } eNB_func_t;
   
 typedef struct UE_SCAN_INFO_s {
@@ -250,8 +250,58 @@ typedef struct {
   eNB_rxtx_proc_t proc_rxtx[2];
 } eNB_proc_t;
 
-//! \brief Number of eNB TX and RX threads.
-//! This number must be equal to the number of LTE subframes (10). Each thread is responsible for a single subframe.
+
+/// Context data structure for RX/TX portion of subframe processing
+typedef struct {
+  /// Component Carrier index
+  uint8_t              CC_id;
+  /// timestamp transmitted to HW
+  openair0_timestamp timestamp_tx;
+  /// subframe to act upon for transmission
+  int subframe_tx;
+  /// subframe to act upon for reception
+  int subframe_rx;
+  /// frame to act upon for transmission
+  int frame_tx;
+  /// frame to act upon for reception
+  int frame_rx;
+  /// \brief Instance count for RXn-TXnp4 processing thread.
+  /// \internal This variable is protected by \ref mutex_rxtx.
+  int instance_cnt_rxtx;
+  /// pthread structure for RXn-TXnp4 processing thread
+  pthread_t pthread_rxtx;
+  /// pthread attributes for RXn-TXnp4 processing thread
+  pthread_attr_t attr_rxtx;
+  /// condition variable for tx processing thread
+  pthread_cond_t cond_rxtx;
+  /// mutex for RXn-TXnp4 processing thread
+  pthread_mutex_t mutex_rxtx;
+  /// scheduling parameters for RXn-TXnp4 thread
+  struct sched_param sched_param_rxtx;
+} UE_rxtx_proc_t;
+
+/// Context data structure for eNB subframe processing
+typedef struct {
+  /// Component Carrier index
+  uint8_t              CC_id;
+  /// Last RX timestamp
+  openair0_timestamp timestamp_rx;
+  /// \brief Instance count for synch thread.
+  /// \internal This variable is protected by \ref mutex_synch.
+  int instance_cnt_synch;
+  /// pthread attributes for prach processing thread
+  pthread_attr_t attr_synch;
+  /// scheduling parameters for synch thread
+  struct sched_param sched_param_synch;
+  /// pthread descriptor synch thread
+  pthread_t pthread_synch;
+  /// condition variable for UE synch thread;
+  pthread_cond_t cond_synch;
+  /// mutex for UE synch thread
+  pthread_mutex_t mutex_synch;
+  /// set of scheduling variables RXn-TXnp4 threads
+  UE_rxtx_proc_t proc_rxtx[2];
+} UE_proc_t;
 
 /// Top-level PHY Data Structure for eNB
 typedef struct PHY_VARS_eNB_s {
@@ -491,34 +541,8 @@ typedef struct {
   int UE_scan_carrier;
   /// \brief Indicator that UE is synchronized to an eNB
   int is_synchronized;
-  /// \brief Instance count of TX processing thread (-1 means ready, 0 means busy)
-  int instance_cnt_tx;
-  /// \brief Instance count of RX processing thread (-1 means ready, 0 means busy)
-  int instance_cnt_rx;
-  /// \brief Instance count of initial synchronization thread (-1 means ready, 0 means busy).
-  /// Protected by mutex \ref mutex_synch and condition \ref cond_synch.
-  int instance_cnt_synch;
-  /// \brief Condition variable for TX processing thread
-  pthread_cond_t cond_tx;
-  /// \brief Condition variable for RX processing thread
-  pthread_cond_t cond_rx;
-  /// \brief Condition variable for initial synchronization thread.
-  /// The corresponding mutex is \ref mutex_synch.
-  pthread_cond_t cond_synch;
-  /// \brief Mutex for TX processing thread
-  pthread_mutex_t mutex_tx;
-  /// \brief Mutex for RX processing thread
-  pthread_mutex_t mutex_rx;
-  /// \brief Mutex for initial synchronization thread.
-  /// Used to protect \ref instance_cnt_synch.
-  /// \sa cond_synch
-  pthread_mutex_t mutex_synch;
-  /// \brief Pthread structure for RX processing thread
-  pthread_t       thread_rx;
-  /// \brief Pthread structure for TX processing thread
-  pthread_t       thread_tx;
-  /// \brief Pthread structure to RX processing thread
-  pthread_t       thread_synch;
+  /// Data structure for UE process scheduling
+  UE_proc_t proc;
   /// \brief Total gain of the TX chain (16-bit baseband I/Q to antenna)
   uint32_t tx_total_gain_dB;
   /// \brief Total gain of the RX chain (antenna to baseband I/Q) This is a function of rx_gain_mode (and the corresponding gain) and the rx_gain of the card.
@@ -535,10 +559,6 @@ typedef struct {
   int tx_total_RE;
   /// \brief Maximum transmit power
   int8_t tx_power_max_dBm;
-  /// \brief Frame counters for TX and RX processing
-  uint32_t frame_rx,frame_tx;
-  /// \brief Slot counters for TX and RX processing
-  uint32_t slot_tx,slot_rx;
   /// \brief Number of eNB seen by UE
   uint8_t n_connected_eNB;
   /// \brief indicator that Handover procedure has been initiated
@@ -587,10 +607,14 @@ typedef struct {
   uint32_t high_speed_flag;
   uint32_t perfect_ce;
   int16_t ch_est_alpha;
+  int generate_ul_signal[NUMBER_OF_CONNECTED_eNB_MAX];
+
   UE_SCAN_INFO_t scan_info[NB_BANDS_MAX];
 
   char ulsch_no_allocation_counter[NUMBER_OF_CONNECTED_eNB_MAX];
 
+
+
   unsigned char ulsch_Msg3_active[NUMBER_OF_CONNECTED_eNB_MAX];
   uint32_t  ulsch_Msg3_frame[NUMBER_OF_CONNECTED_eNB_MAX];
   unsigned char ulsch_Msg3_subframe[NUMBER_OF_CONNECTED_eNB_MAX];
diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h
index 62e0a7d9ce..9f0b37ca30 100644
--- a/openair1/SCHED/defs.h
+++ b/openair1/SCHED/defs.h
@@ -72,12 +72,7 @@ enum openair_ERROR {
 
 enum openair_SYNCH_STATUS {
   openair_NOT_SYNCHED=1,
-#ifdef OPENAIR_LTE
   openair_SYNCHED,
-#else
-  openair_SYNCHED_TO_CHSCH,
-  openair_SYNCHED_TO_MRSCH,
-#endif
   openair_SCHED_EXIT
 };
 
@@ -86,65 +81,6 @@ enum openair_SYNCH_STATUS {
 #define DAQ_AGC_OFF 0
 
 
-/*
-typedef struct {
-  boolean_t  is_eNB;
-  uint8_t    mode;
-  uint8_t    synch_source;
-  uint32_t   slot_count;
-  uint32_t   sched_cnt;
-  uint32_t   synch_wait_cnt;
-  uint32_t   sync_state;
-  uint32_t   scheduler_interval_ns;
-  uint32_t   last_adac_cnt;
-  uint8_t    first_sync_call;
-  int32_t    instance_cnt;
-  uint8_t    one_shot_get_frame;
-  uint8_t    do_synch;
-  uint8_t    node_configured;  // &1..basic config, &3..ue config &5..eNb config
-  uint8_t    node_running;
-  uint8_t    tx_test;
-  uint8_t    mac_registered;
-  //uint8_t freq;
-  uint32_t   freq;
-  uint32_t   rx_gain_val;
-  uint32_t   rx_gain_mode;
-  uint32_t   tcxo_dac;
-  uint32_t   auto_freq_correction;
-  int32_t    freq_offset;
-  uint32_t   tx_rx_switch_point;
-  uint32_t   manual_timing_advance;  /// 1 to override automatic timing advance
-  int32_t   timing_advance;
-  uint32_t   dual_tx;                /// 1 for dual-antenna TX, 0 for single-antenna TX
-  uint32_t   tdd;                    /// 1 for TDD mode, 0 for FDD mode
-  uint32_t   rx_rf_mode;
-  uint32_t   node_id;
-  uint32_t   rach_detection_count;
-  uint32_t   channel_vacant[4];
-  uint32_t   target_ue_dl_mcs;
-  uint32_t   target_ue_ul_mcs;
-  uint32_t   ue_ul_nb_rb;
-  uint32_t   ue_dl_rb_alloc;
-  uint32_t   dlsch_rate_adaptation;
-  uint32_t   dlsch_transmission_mode;
-  uint32_t   ulsch_allocation_mode;
-  uint32_t   rx_total_gain_dB;
-  uint32_t   hw_frame;
-  uint32_t   get_frame_done;
-  uint32_t   use_ia_receiver;
-} OPENAIR_DAQ_VARS;
-*/
-
-#ifndef USER_MODE
-int32_t openair_sched_init(void);
-void openair_sched_cleanup(void);
-void openair_sched_exit(char *);
-void openair1_restart(void);
-int32_t init_dlsch_threads(void);
-void cleanup_dlsch_threads(void);
-#endif //USER_MODE
-
-#ifdef OPENAIR_LTE
 /** @addtogroup _PHY_PROCEDURES_
  * @{
  */
@@ -168,7 +104,7 @@ void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t
   @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
   @param *phy_vars_rn pointer to RN variables
 */
-void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
+void phy_procedures_UE_lte(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
 
 #ifdef Rel10
 /*! \brief Top-level entry routine for relay node procedures when acting as eNB. This proc will make us of the existing eNB procs.
@@ -187,22 +123,24 @@ int phy_procedures_RN_UE_RX(unsigned char last_slot, unsigned char next_slot, re
 
 /*! \brief Scheduling for UE TX procedures in normal subframes.
   @param phy_vars_ue Pointer to UE variables on which to act
+  @param proc Pointer to RXn-TXnp4 proc information
   @param eNB_id Local id of eNB on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @param mode calib/normal mode
   @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
 */
-void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type);
+void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type);
 /*! \brief Scheduling for UE RX procedures in normal subframes.
   @param last_slot Index of last slot (0-19)
   @param phy_vars_ue Pointer to UE variables on which to act
+  @param proc Pointer to RXn_TXnp4 proc information
   @param eNB_id Local id of eNB on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @param mode calibration/debug mode
   @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
   @param phy_vars_rn pointer to RN variables
 */
-int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
+int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
 
 /*! \brief Scheduling for UE TX procedures in TDD S-subframes.
   @param phy_vars_ue Pointer to UE variables on which to act
@@ -385,11 +323,11 @@ uint8_t ul_ACK_subframe2_M(LTE_DL_FRAME_PARMS *frame_parms,unsigned char subfram
 
 /*! \brief Indicates the SR TXOp in current subframe.  Implements Table 10.1-5 from 36.213.
   @param phy_vars_ue Pointer to UE variables
+  @param proc Pointer to RXn_TXnp4 thread context
   @param eNB_id ID of eNB which is to receive the SR
-  @param subframe index of next subframe
   @returns 1 if TXOp is active.
 */
-uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
+uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id);
 
 /*! \brief Indicates the SR TXOp in current subframe for eNB and particular UE index.  Implements Table 10.1-5 from 36.213.
   @param phy_vars_eNB Pointer to eNB variables
@@ -426,7 +364,7 @@ int32_t add_ue(int16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
 int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rnti);
 
 void process_timing_advance(module_id_t Mod_id,uint8_t CC_id,int16_t timing_advance);
-void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance);
+void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint16_t timing_advance);
 
 unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
 
@@ -436,15 +374,15 @@ void phy_reset_ue(module_id_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
 subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch = Ncce + N1_pucch.  For
 TDD, this routine computes the complex procedure described in Section 10.1 of 36.213 (through tables 10.1-1,10.1-2)
 @param phy_vars_ue Pointer to UE variables
+@param proc Pointer to RXn-TXnp4 proc information
 @param eNB_id Index of eNB
-@param subframe subframe on which to act
 @param b Pointer to PUCCH payload (b[0],b[1])
 @param SR 1 means there's a positive SR in parallel to ACK/NAK
 @returns n1_pucch
 */
 uint16_t get_n1_pucch(PHY_VARS_UE *phy_vars_ue,
+		      UE_rxtx_proc_t *proc,
                       uint8_t eNB_id,
-		      uint8_t subframe,
                       uint8_t *b,
                       uint8_t SR);
 
@@ -497,21 +435,21 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index);
 
 /*! \brief This function implements the power control mechanism for PUCCH from 36.213.
     @param phy_vars_ue PHY variables
-    @param subframe Index of subframe
+    @param proc Pointer to proc descriptor
     @param eNB_id Index of eNB
     @param pucch_fmt Format of PUCCH that is being transmitted
     @returns Transmit power
  */
-int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt);
+int8_t pucch_power_cntl(PHY_VARS_UE *phy_vars_ue, UE_rxtx_proc_t *proc,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt);
 
 /*! \brief This function implements the power control mechanism for PUCCH from 36.213.
     @param phy_vars_ue PHY variables
-    @param subframe Index of subframe
+    @param proc Pointer to proc descriptor
     @param eNB_id Index of eNB
     @param j index of type of PUSCH (SPS, Normal, Msg3)
     @returns Transmit power
  */
-void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag);
+void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag);
 
 int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index);
 
@@ -543,15 +481,13 @@ int16_t get_target_pucch_rx_power(module_id_t module_idP, uint8_t CC_id);
 
 int get_ue_active_harq_pid(uint8_t Mod_id,uint8_t CC_id,uint16_t rnti,int frame, uint8_t subframe,uint8_t *harq_pid,uint8_t *round,uint8_t ul_flag);
 
-void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid);
-void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
-void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
+void dump_dlsch(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid);
+void dump_dlsch_SI(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe);
+void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe);
+void dump_dlsch2(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint16_t coded_bits_per_codeword,int round);
 
 /*@}*/
 
-#endif //OPENAIR_LTE
-
-extern int slot_irq_handler(int irq, void *cookie);
 
 #endif
 
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index c80fdd0e40..b74a79f148 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -25,7 +25,7 @@
 
   Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
 
- *******************************************************************************/
+*******************************************************************************/
 
 /*! \file phy_procedures_lte_ue.c
  * \brief Implementation of UE procedures from 36.213 LTE specifications
@@ -49,14 +49,6 @@
 #include "SCHED/phy_procedures_emos.h"
 #endif
 
-#ifdef EXMIMO
-#ifdef DRIVER2013
-#include "openair0_lib.h"
-#include "gain_control.h"
-extern int card;
-#endif
-#endif
-
 #define DEBUG_PHY_PROC
 
 #ifndef PUCCH
@@ -75,9 +67,6 @@ fifo_dump_emos_UE emos_dump_UE;
 
 #if defined(ENABLE_ITTI)
 # include "intertask_interface.h"
-#   if ENABLE_RAL
-#     include "timer.h"
-#   endif
 #endif
 
 
@@ -91,24 +80,8 @@ extern int oai_exit;
 uint8_t ulsch_input_buffer[2700] __attribute__ ((aligned(16)));
 uint8_t access_mode;
 
-#ifdef DLSCH_THREAD
-extern int dlsch_instance_cnt[8];
-extern int dlsch_subframe[8];
-extern pthread_mutex_t dlsch_mutex[8];
-/// Condition variable for dlsch thread
-extern pthread_cond_t dlsch_cond[8];
-extern int rx_pdsch_instance_cnt;
-extern int rx_pdsch_slot;
-extern pthread_mutex_t rx_pdsch_mutex;
-/// Condition variable for rx_pdsch thread
-extern pthread_cond_t rx_pdsch_cond;
-#endif
-
 DCI_ALLOC_t dci_alloc_rx[8];
 
-#ifdef DIAG_PHY
-extern int rx_sig_fifo;
-#endif
 
 
 #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
@@ -117,7 +90,7 @@ extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
 
 
 
-void dump_dlsch(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid)
+void dump_dlsch(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid)
 {
   unsigned int coded_bits_per_codeword;
   uint8_t nsymb = (ue->frame_parms.Ncp == 0) ? 14 : 12;
@@ -128,7 +101,7 @@ void dump_dlsch(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid
                                   ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm,
                                   ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl,
                                   ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
-                                  ue->frame_rx,subframe);
+                                  proc->frame_rx,subframe);
 
   write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,2,1);
   write_output("rxsigF0_ext.m","rxsF0_ext", ue->pdsch_vars[0]->rxdataF_ext[0],2*nsymb*ue->frame_parms.ofdm_symbol_size,1,1);
@@ -146,7 +119,7 @@ void dump_dlsch(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid
   write_output("dlsch_mag2.m","dlschmag2",ue->pdsch_vars[0]->dl_ch_magb0,300*12,1,1);
 }
 
-void dump_dlsch_SI(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
+void dump_dlsch_SI(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe)
 {
   unsigned int coded_bits_per_codeword;
   uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12);
@@ -157,7 +130,7 @@ void dump_dlsch_SI(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
                                   2,
                                   1,
                                   ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
-                                  ue->frame_rx,subframe);
+                                  proc->frame_rx,subframe);
   LOG_D(PHY,"[UE %d] Dumping dlsch_SI : ofdm_symbol_size %d, nsymb %d, nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n",
         ue->Mod_id,
 	ue->frame_parms.ofdm_symbol_size,
@@ -190,43 +163,43 @@ void dump_dlsch_SI(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
 #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
 //unsigned int gain_table[31] = {100,112,126,141,158,178,200,224,251,282,316,359,398,447,501,562,631,708,794,891,1000,1122,1258,1412,1585,1778,1995,2239,2512,2818,3162};
 /*
-unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL)
-{
+  unsigned int get_tx_amp_prach(int power_dBm, int power_max_dBm, int N_RB_UL)
+  {
 
   int gain_dB = power_dBm - power_max_dBm;
   int amp_x_100;
 
   switch (N_RB_UL) {
   case 6:
-    amp_x_100 = AMP;      // PRACH is 6 PRBS so no scale
-    break;
+  amp_x_100 = AMP;      // PRACH is 6 PRBS so no scale
+  break;
   case 15:
-    amp_x_100 = 158*AMP;  // 158 = 100*sqrt(15/6)
-    break;
+  amp_x_100 = 158*AMP;  // 158 = 100*sqrt(15/6)
+  break;
   case 25:
-    amp_x_100 = 204*AMP;  // 204 = 100*sqrt(25/6)
-    break;
+  amp_x_100 = 204*AMP;  // 204 = 100*sqrt(25/6)
+  break;
   case 50:
-    amp_x_100 = 286*AMP;  // 286 = 100*sqrt(50/6)
-    break;
+  amp_x_100 = 286*AMP;  // 286 = 100*sqrt(50/6)
+  break;
   case 75:
-    amp_x_100 = 354*AMP;  // 354 = 100*sqrt(75/6)
-    break;
+  amp_x_100 = 354*AMP;  // 354 = 100*sqrt(75/6)
+  break;
   case 100:
-    amp_x_100 = 408*AMP;  // 408 = 100*sqrt(100/6)
-    break;
+  amp_x_100 = 408*AMP;  // 408 = 100*sqrt(100/6)
+  break;
   default:
-    LOG_E(PHY,"Unknown PRB size %d\n",N_RB_UL);
-    mac_xface->macphy_exit("");
-    break;
+  LOG_E(PHY,"Unknown PRB size %d\n",N_RB_UL);
+  mac_xface->macphy_exit("");
+  break;
   }
   if (gain_dB < -30) {
-    return(amp_x_100/3162);
+  return(amp_x_100/3162);
   } else if (gain_dB>0)
-    return(amp_x_100);
+  return(amp_x_100);
   else
-    return(amp_x_100/gain_table[-gain_dB]);  // 245 corresponds to the factor sqrt(25/6)
-}
+  return(amp_x_100/gain_table[-gain_dB]);  // 245 corresponds to the factor sqrt(25/6)
+  }
 */
 
 unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb)
@@ -251,7 +224,7 @@ unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb
 
 #endif
 
-void dump_dlsch_ra(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
+void dump_dlsch_ra(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t subframe)
 {
   unsigned int coded_bits_per_codeword;
   uint8_t nsymb = ((ue->frame_parms.Ncp == 0) ? 14 : 12);
@@ -262,7 +235,7 @@ void dump_dlsch_ra(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
                                   2,
                                   1,
                                   ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
-                                  ue->frame_rx,subframe);
+                                  proc->frame_rx,subframe);
   LOG_D(PHY,"[UE %d] Dumping dlsch_ra : nb_rb %d, mcs %d, nb_rb %d, num_pdcch_symbols %d,G %d\n",
         ue->Mod_id,
         ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb,
@@ -329,7 +302,7 @@ void ra_failed(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
 
   // if contention resolution fails, go back to PRACH
   PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PRACH;
-  LOG_E(PHY,"[UE %d] Frame %d Random-access procedure fails, going back to PRACH, setting SIStatus = 0 and State RRC_IDLE\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx);
+  LOG_E(PHY,"[UE %d] Random-access procedure fails, going back to PRACH, setting SIStatus = 0 and State RRC_IDLE\n",Mod_id);
   //mac_xface->macphy_exit("");
 }
 
@@ -338,7 +311,7 @@ void ra_succeeded(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
 
   int i;
 
-  LOG_I(PHY,"[UE %d][RAPROC] Frame %d Random-access procedure succeeded\n",Mod_id,PHY_vars_UE_g[Mod_id][CC_id]->frame_rx);
+  LOG_I(PHY,"[UE %d][RAPROC] Random-access procedure succeeded\n",Mod_id);
 
   PHY_vars_UE_g[Mod_id][CC_id]->ulsch_Msg3_active[eNB_index] = 0;
   PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index] = PUSCH;
@@ -359,19 +332,13 @@ UE_MODE_t get_ue_mode(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
   return(PHY_vars_UE_g[Mod_id][CC_id]->UE_mode[eNB_index]);
 
 }
-void process_timing_advance_rar(PHY_VARS_UE *ue,uint16_t timing_advance)
-{
-
-  /*
-  if ((timing_advance>>10) & 1) //it is negative
-    timing_advance = timing_advance - (1<<11);
-  */
+void process_timing_advance_rar(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint16_t timing_advance) {
 
   ue->timing_advance = timing_advance*4;
 
 
 #ifdef DEBUG_PHY_PROC
-  LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,ue->frame_rx, ue->timing_advance);
+  LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",ue->Mod_id,proc->frame_rx, ue->timing_advance);
 #endif
 
 }
@@ -392,11 +359,13 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance)
 
 }
 
-uint8_t is_SR_TXOp(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
+uint8_t is_SR_TXOp(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id)
 {
 
+  int subframe=proc->subframe_tx;
+
   LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d Checking for SR TXOp (sr_ConfigIndex %d)\n",
-        ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,ue->frame_tx,subframe,
+        ue->Mod_id,ue->pdcch_vars[eNB_id]->crnti,proc->frame_tx,subframe,
         ue->scheduling_request_config[eNB_id].sr_ConfigIndex);
 
   if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 4) {        // 5 ms SR period
@@ -406,13 +375,13 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
     if (subframe==(ue->scheduling_request_config[eNB_id].sr_ConfigIndex-5))
       return(1);
   } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 34) { // 20 ms SR period
-    if ((10*(ue->frame_tx&1)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15))
+    if ((10*(proc->frame_tx&1)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-15))
       return(1);
   } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 74) { // 40 ms SR period
-    if ((10*(ue->frame_tx&3)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35))
+    if ((10*(proc->frame_tx&3)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-35))
       return(1);
   } else if (ue->scheduling_request_config[eNB_id].sr_ConfigIndex <= 154) { // 80 ms SR period
-    if ((10*(ue->frame_tx&7)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75))
+    if ((10*(proc->frame_tx&7)+subframe) == (ue->scheduling_request_config[eNB_id].sr_ConfigIndex-75))
       return(1);
   }
 
@@ -420,8 +389,8 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t subframe)
 }
 
 uint16_t get_n1_pucch(PHY_VARS_UE *ue,
+		      UE_rxtx_proc_t *proc,
                       uint8_t eNB_id,
-                      uint8_t subframe,
                       uint8_t *b,
                       uint8_t SR)
 {
@@ -434,6 +403,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
   int sf;
   int M;
   // clear this, important for case where n1_pucch selection is not used
+  int subframe=proc->subframe_tx;
 
   ue->pucch_sel[subframe] = 0;
 
@@ -451,10 +421,10 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
 #ifdef DEBUG_PHY_PROC
 
     if (bundling_flag==bundling) {
-      LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,ue->frame_tx,subframe,SR,
+      LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, bundling, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR,
             ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
     } else {
-      LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,ue->frame_tx,subframe,SR,
+      LOG_D(PHY,"[UE%d] Frame %d subframe %d : get_n1_pucch, multiplexing, SR %d/%d\n",ue->Mod_id,proc->frame_tx,subframe,SR,
             ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex);
     }
 
@@ -479,7 +449,7 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
         subframe_offset = 4;
       } else {
         LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
-              ue->Mod_id,ue->frame_tx,subframe,frame_parms->tdd_config);
+              ue->Mod_id,proc->frame_tx,subframe,frame_parms->tdd_config);
         return(0);
       }
 
@@ -589,858 +559,848 @@ uint16_t get_n1_pucch(PHY_VARS_UE *ue,
     }  // switch tdd_config
   }
 
-  LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",ue->frame_tx);
+  LOG_E(PHY,"[UE%d] : Frame %d phy_procedures_lte.c: get_n1pucch, exit without proper return\n",proc->frame_tx);
   return(-1);
 }
 
 
 #ifdef EMOS
 /*
-void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) {
+  void phy_procedures_emos_UE_TX(uint8_t next_slot,uint8_t eNB_id) {
   uint8_t harq_pid;
 
 
   if (next_slot%2==0) {
-    // get harq_pid from subframe relationship
-    harq_pid = subframe2harq_pid(&ue->frame_parms,ue->frame,(next_slot>>1));
-    if (harq_pid==255) {
-      LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n",
-    0,ue->frame);
-      return;
-    }
+  // get harq_pid from subframe relationship
+  harq_pid = subframe2harq_pid(&ue->frame_parms,ue->frame,(next_slot>>1));
+  if (harq_pid==255) {
+  LOG_E(PHY,"[UE%d] Frame %d : FATAL ERROR: illegal harq_pid, returning\n",
+  0,ue->frame);
+  return;
+  }
 
-    if (ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
-      emos_dump_UE.uci_cnt[next_slot>>1] = 1;
-      memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch[eNB_id]->o,MAX_CQI_BITS*sizeof(char));
-      emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch[eNB_id]->O;
-      memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch[eNB_id]->o_RI,2*sizeof(char));
-      emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch[eNB_id]->O_RI;
-      memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch[eNB_id]->o_ACK,4*sizeof(char));
-      emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK;
-    }
-    else {
-      emos_dump_UE.uci_cnt[next_slot>>1] = 0;
-    }
+  if (ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
+  emos_dump_UE.uci_cnt[next_slot>>1] = 1;
+  memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o,ulsch[eNB_id]->o,MAX_CQI_BITS*sizeof(char));
+  emos_dump_UE.UCI_data[0][next_slot>>1].O = ulsch[eNB_id]->O;
+  memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_RI,ulsch[eNB_id]->o_RI,2*sizeof(char));
+  emos_dump_UE.UCI_data[0][next_slot>>1].O_RI = ulsch[eNB_id]->O_RI;
+  memcpy(emos_dump_UE.UCI_data[0][next_slot>>1].o_ACK,ulsch[eNB_id]->o_ACK,4*sizeof(char));
+  emos_dump_UE.UCI_data[0][next_slot>>1].O_ACK = ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK;
+  }
+  else {
+  emos_dump_UE.uci_cnt[next_slot>>1] = 0;
+  }
+  }
   }
-}
 */
 #endif
 
-int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
-PRACH_RESOURCES_t prach_resources_local;
-
-void phy_procedures_UE_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type)
-{
+void ulsch_common_procedures(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc) {
 
-  int i;
-  uint16_t first_rb, nb_rb;
-  uint8_t harq_pid;
-  unsigned int input_buffer_length;
-  unsigned int aa;
-  uint8_t Msg3_flag=0;
-  uint8_t pucch_ack_payload[2];
-  uint8_t n1_pucch;
-  ANFBmode_t bundling_flag;
-  PUCCH_FMT_t format;
-  uint8_t SR_payload;
-  int32_t prach_power;
-  uint8_t nsymb;
+  int aa;
   LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
-  uint8_t generate_ul_signal = 0;
-  uint8_t ack_status=0;
-  int8_t Po_PUCCH;
-  int32_t ulsch_start=0;
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-  int overflow=0;
   int k,l;
-#endif
-  int slot_tx = ue->slot_tx;
-  int subframe_tx = ue->slot_tx>>1;
-  int frame_tx = ue->frame_tx;
-  int Mod_id = ue->Mod_id;
-  int CC_id = ue->CC_id;
-  int tx_amp;
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
+  int nsymb;
+  int subframe_tx = proc->subframe_tx;
+  int frame_tx = proc->frame_tx;
+  int ulsch_start;
+  int overflow=0;
 
-  start_meas(&ue->phy_proc_tx);
+  int dummy_tx_buffer[3840*4] __attribute__((aligned(16)));
 
-#ifdef EMOS
-  //phy_procedures_emos_UE_TX(next_slot);
+  start_meas(&ue->ofdm_mod_stats);
+  nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
+  
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case
+  ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
+		 ue->hw_timing_advance-
+		 ue->timing_advance-
+		 ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
+#else //this is the normal case
+  ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance;
+#endif //else EXMIMO
+  if ((frame_tx%100) == 0)
+    LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n",
+	  ue->Mod_id,frame_tx,subframe_tx,
+	  ulsch_start,
+	  ue->rx_offset,
+	  ue->hw_timing_advance,
+	  ue->timing_advance,
+	  ue->N_TA_offset);
+  
+  
+  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+    if (frame_parms->Ncp == 1)
+      PHY_ofdm_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
+		   dummy_tx_buffer,
+#else
+		   &ue->common_vars.txdata[aa][ulsch_start],
+#endif
+		   frame_parms->ofdm_symbol_size,
+		   nsymb,
+		   frame_parms->nb_prefix_samples,
+		   CYCLIC_PREFIX);
+    else
+      normal_prefix_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
+			dummy_tx_buffer,
+#else
+			&ue->common_vars.txdata[aa][ulsch_start],
+#endif
+			nsymb,
+			&ue->frame_parms);
+    
+    
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
+    apply_7_5_kHz(ue,dummy_tx_buffer,0);
+    apply_7_5_kHz(ue,dummy_tx_buffer,1);
+#else
+    apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],0);
+    apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],1);
+#endif
+    
+    
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
+    overflow = ulsch_start - 9*frame_parms->samples_per_tti;
+    
+    
+    for (k=ulsch_start,l=0; k<cmin(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) {
+      ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
+      ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
+    }
+    
+    for (k=0; k<overflow; k++,l++) {
+      ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
+      ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
+    }
+#if defined(EXMIMO)
+    // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
+    for (k=ulsch_start - (frame_parms->samples_per_tti>>1) ; k<ulsch_start ; k++) {
+      if (k<0)
+	ue->common_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
+      else if (k>(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
+	ue->common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
+      else
+	ue->common_vars.txdata[aa][k] &= 0xFFFEFFFE;
+    }
 #endif
+#endif
+    
+  } //nb_antennas_tx
+  
+  stop_meas(&ue->ofdm_mod_stats);
 
-  if ((slot_tx%2)==0) {
-    ue->tx_power_dBm=-127;
 
-    if (abstraction_flag==0) {
-      for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-        memset(&ue->common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti],
-               0,
-               frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t));
-      }
-    }
 
-    if (ue->UE_mode[eNB_id] != PRACH) {
-      /*
-      #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d] Frame %d, slot %d: Generating SRS\n",Mod_id,ue->frame,slot_tx);
-      #endif
-        if (abstraction_flag == 0) {
-      #ifdef OFDMA_ULSCH
-      generate_srs_tx(ue,eNB_id,AMP,subframe_tx);
-      #else
-      generate_srs_tx(ue,eNB_id,AMP,subframe_tx);
-      #endif
-        }
+}
 
-      #ifdef PHY_ABSTRACTION
-        else {
-      generate_srs_tx_emul(ue,subframe_tx);
-        }
-      #endif
-      */
-      // get harq_pid from subframe relationship
-      harq_pid = subframe2harq_pid(&ue->frame_parms,
-                                   frame_tx,
-                                   subframe_tx);
+void ue_prach_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) {
 
+  int frame_tx = proc->frame_tx;
+  int subframe_tx = proc->subframe_tx;
+  int prach_power;
+  PRACH_RESOURCES_t prach_resources_local;
 
-      if (ue->mac_enabled == 1) {
-      if ((ue->ulsch_Msg3_active[eNB_id] == 1) &&
-          (ue->ulsch_Msg3_frame[eNB_id] == frame_tx) &&
-          (ue->ulsch_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3
-
-        ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-
-        if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0)
-          generate_ue_ulsch_params_from_rar(ue,
-                                            eNB_id);
-
-        ue->ulsch[eNB_id]->power_offset = 14;
-        LOG_D(PHY,"[UE  %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n",
-              Mod_id,
-              frame_tx,
-              subframe_tx,
-              harq_pid);
-        Msg3_flag = 1;
-      } else {
+  ue->generate_prach=0;
 
-        if (harq_pid==255) {
-          LOG_E(PHY,"[UE%d] Frame %d ulsch_decoding.c: FATAL ERROR: illegal harq_pid, returning\n",
-                Mod_id,frame_tx);
-          mac_xface->macphy_exit("Error in ulsch_decoding");
-          VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
-          stop_meas(&ue->phy_proc_tx);
-          return;
-        }
+  if (ue->mac_enabled==0){
+    ue->prach_resources[eNB_id] = &prach_resources_local;
+    prach_resources_local.ra_RNTI = 0xbeef;
+    prach_resources_local.ra_PreambleIndex = 0;
+  }
 
-        Msg3_flag=0;
+  if (ue->mac_enabled==1){
+    // ask L2 for RACH transport
+    if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
+      ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(ue->Mod_id,
+							   ue->CC_id,
+							   frame_tx,
+							   eNB_id,
+							   subframe_tx);
+      //    LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon);
+    }
+  }
+  
+  if (ue->prach_resources[eNB_id]!=NULL) {
+    
+    ue->generate_prach=1;
+    ue->prach_cnt=0;
+#ifdef SMBV
+    ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;
+#endif
+#ifdef OAI_EMU
+    ue->prach_PreambleIndex=ue->prach_resources[eNB_id]->ra_PreambleIndex;
+#endif
+    
+    if (abstraction_flag == 0) {
+      LOG_I(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n",
+	    ue->Mod_id,
+	    frame_tx,
+	    subframe_tx,
+	    ue->prach_resources[eNB_id]->ra_PreambleIndex,
+	    ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER,
+	    ue->prach_resources[eNB_id]->ra_TDD_map_index,
+	    ue->prach_resources[eNB_id]->ra_RNTI);
+      
+      if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) {
+	ue->tx_power_dBm = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id);
       }
+      else {
+	ue->tx_power_dBm = ue->tx_power_max_dBm;
+	ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;	      
       }
+      
+      ue->tx_total_RE = 96;
+      
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
+      ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm,
+					       ue->tx_power_max_dBm,
+					       ue->frame_parms.N_RB_UL,
+					       6);
+#else
+      ue->prach_vars[eNB_id]->amp = AMP;
+#endif
+      if ((mode == calib_prach_tx) && (((proc->frame_tx&0xfffe)%100)==0))
+	LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",
+	      ue->Mod_id,
+	      proc->frame_rx,
+	      proc->subframe_tx,
+	      ue->tx_power_dBm,
+	      ue->prach_vars[eNB_id]->amp);
+      
+      
+      //      start_meas(&ue->tx_prach);
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
+      prach_power = generate_prach(ue,eNB_id,subframe_tx,frame_tx);
+      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
+      //      stop_meas(&ue->tx_prach);
+      LOG_D(PHY,"[UE  %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n",
+	    ue->Mod_id,
+	    get_PL(ue->Mod_id,ue->CC_id,eNB_id),
+	    ue->tx_power_dBm,
+	    dB_fixed(prach_power),
+	    ue->prach_vars[eNB_id]->amp);
+    } else {
+      UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_flag=1;
+      UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_id=ue->prach_resources[eNB_id]->ra_PreambleIndex;
+      if (ue->mac_enabled==1){
+	mac_xface->Msg1_transmitted(ue->Mod_id,
+				    ue->CC_id,
+				    frame_tx,
+				    eNB_id);
+      }
+    }
+    
+    LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
+	  ue->Mod_id,frame_tx,subframe_tx,eNB_id,
+	  ue->prach_resources[eNB_id]->ra_PreambleIndex,
+	  ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(ue->Mod_id,ue->CC_id,eNB_id),
+	  get_PL(ue->Mod_id,ue->CC_id,eNB_id));
+    
+  }	  
+  
 
-      if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
-
-        generate_ul_signal = 1;
-
-        // deactivate service request
-        ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
-
-        ack_status = get_ack(&ue->frame_parms,
-                             ue->dlsch[eNB_id][0]->harq_ack,
-                             subframe_tx,
-                             ue->ulsch[eNB_id]->o_ACK);
-
-        first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb;
-        nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
-
-
-        //frame_parms->pusch_config_c ommon.ul_ReferenceSignalsPUSCH.cyclicShift = 0;
-
-        //frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[20] = 0;
+  // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue
+  if (mode == calib_prach_tx)
+    ue->prach_resources[eNB_id]=NULL;
+  
+  LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n",
+	ue->Mod_id,frame_tx,subframe_tx,ue->generate_prach,ue->prach_cnt);
+  
+  ue->prach_cnt++;
+  
+  if (ue->prach_cnt==3)
+    ue->generate_prach=0;
+}
 
+void ue_ulsch_uespec_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) {
 
+  int harq_pid;
+  int frame_tx=proc->frame_tx;
+  int subframe_tx=proc->subframe_tx;
+  int Mod_id = ue->Mod_id;
+  int CC_id = ue->CC_id;
+  uint8_t Msg3_flag=0;
+  uint8_t ack_status=0;
+  uint16_t first_rb, nb_rb;
+  unsigned int input_buffer_length;
+  int i;
+  int aa;
+  int tx_amp;
 
+  // get harq_pid from subframe relationship
+  harq_pid = subframe2harq_pid(&ue->frame_parms,
+			       frame_tx,
+			       subframe_tx);
+  
+  
+  if (ue->mac_enabled == 1) {
+    if ((ue->ulsch_Msg3_active[eNB_id] == 1) &&
+	(ue->ulsch_Msg3_frame[eNB_id] == frame_tx) &&
+	(ue->ulsch_Msg3_subframe[eNB_id] == subframe_tx)) { // Initial Transmission of Msg3
+      
+      ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
+      
+      if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0)
+	generate_ue_ulsch_params_from_rar(ue,
+					  proc,
+					  eNB_id);
+      
+      ue->ulsch[eNB_id]->power_offset = 14;
+      LOG_D(PHY,"[UE  %d][RAPROC] Frame %d: Setting Msg3_flag in subframe %d, for harq_pid %d\n",
+	    Mod_id,
+	    frame_tx,
+	    subframe_tx,
+	    harq_pid);
+      Msg3_flag = 1;
+    } else {
+      
+      if (harq_pid==255) {
+	LOG_E(PHY,"[UE%d] Frame %d ulsch_decoding.c: FATAL ERROR: illegal harq_pid, returning\n",
+	      Mod_id,frame_tx);
+	mac_xface->macphy_exit("Error in ulsch_decoding");
+	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+	stop_meas(&ue->phy_proc_tx);
+	return;
+      }
+      
+      Msg3_flag=0;
+    }
+  }
+  
+  if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag == 1) {
+    
+    ue->generate_ul_signal[eNB_id] = 1;
+    
+    // deactivate service request
+    ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
+    
+    ack_status = get_ack(&ue->frame_parms,
+			 ue->dlsch[eNB_id][0]->harq_ack,
+			 subframe_tx,
+			 ue->ulsch[eNB_id]->o_ACK);
+    
+    first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb;
+    nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
+    
+    
+    
+    
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,
-              "[UE  %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n",
-              Mod_id,harq_pid,frame_tx,subframe_tx,
-              first_rb,nb_rb,
-              ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,
-              ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs,
-              ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx,
-              (frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+
-               ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2+
-               frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx])%12,
-              frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
-              ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2,
-              frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[slot_tx],
-              ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1],
-              ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK);
-#endif
-
-        if (ack_status > 0) {
-          LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d Generating ACK (%d,%d) for %d bits on PUSCH\n",
-                Mod_id,
-                ue->ulsch[eNB_id]->rnti,
-                frame_tx,subframe_tx,
-                ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1],
-                ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK);
-        }
-
-
-
-
-
-        //#ifdef DEBUG_PHY_PROC
-        //  debug_LOG_D(PHY,"[UE  %d] Frame %d, Subframe %d ulsch harq_pid %d : O %d, O_ACK %d, O_RI %d, TBS %d\n",Mod_id,ue->frame,subframe_tx,harq_pid,ue->ulsch[eNB_id]->O,ue->ulsch[eNB_id]->O_ACK,ue->ulsch[eNB_id]->O_RI,ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS);
-        //#endif
-        if (Msg3_flag == 1) {
-          LOG_I(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d next slot %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx,
-                subframe_tx, slot_tx,
-                ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb,
-                ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb,
-                ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,
-                ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx,
-                ue->prach_resources[eNB_id]->Msg3[0],
-                ue->prach_resources[eNB_id]->Msg3[1],
-                ue->prach_resources[eNB_id]->Msg3[2],
-                ue->prach_resources[eNB_id]->Msg3[3],
-                ue->prach_resources[eNB_id]->Msg3[4],
-                ue->prach_resources[eNB_id]->Msg3[5],
-                ue->prach_resources[eNB_id]->Msg3[6],
-                ue->prach_resources[eNB_id]->Msg3[7],
-                ue->prach_resources[eNB_id]->Msg3[8]);
-
-          start_meas(&ue->ulsch_encoding_stats);
-
-          if (abstraction_flag==0) {
-            if (ulsch_encoding(ue->prach_resources[eNB_id]->Msg3,
-                               ue,
-                               harq_pid,
-                               eNB_id,
-                               ue->transmission_mode[eNB_id],0,0)!=0) {
-              LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
-              mac_xface->macphy_exit("Error in ulsch_coding");
-              VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
-              stop_meas(&ue->phy_proc_tx);
-              return;
-            }
-          }
-
+    LOG_D(PHY,
+	  "[UE  %d][PUSCH %d] Frame %d subframe %d Generating PUSCH : first_rb %d, nb_rb %d, round %d, mcs %d, rv %d, cyclic_shift %d (cyclic_shift_common %d,n_DMRS2 %d,n_PRS %d), ACK (%d,%d), O_ACK %d\n",
+	  Mod_id,harq_pid,frame_tx,subframe_tx,
+	  first_rb,nb_rb,
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs,
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx,
+	  (ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift+
+	   ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2+
+	   ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe_tx<<1])%12,
+	  ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->n_DMRS2,
+	  ue->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe_tx<<1],
+	  ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1],
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK);
+#endif
+    
+    if (ack_status > 0) {
+      LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d Generating ACK (%d,%d) for %d bits on PUSCH\n",
+	    Mod_id,
+	    ue->ulsch[eNB_id]->rnti,
+	    frame_tx,subframe_tx,
+	    ue->ulsch[eNB_id]->o_ACK[0],ue->ulsch[eNB_id]->o_ACK[1],
+	    ue->ulsch[eNB_id]->harq_processes[harq_pid]->O_ACK);
+    }
+    
+    
+    
+    
+    
+    if (Msg3_flag == 1) {
+      LOG_I(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d Generating (RRCConnectionRequest) Msg3 (nb_rb %d, first_rb %d, round %d, rvidx %d) Msg3: %x.%x.%x|%x.%x.%x.%x.%x.%x\n",Mod_id,frame_tx,
+	    subframe_tx,
+	    ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb,
+	    ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb,
+	    ue->ulsch[eNB_id]->harq_processes[harq_pid]->round,
+	    ue->ulsch[eNB_id]->harq_processes[harq_pid]->rvidx,
+	    ue->prach_resources[eNB_id]->Msg3[0],
+	    ue->prach_resources[eNB_id]->Msg3[1],
+	    ue->prach_resources[eNB_id]->Msg3[2],
+	    ue->prach_resources[eNB_id]->Msg3[3],
+	    ue->prach_resources[eNB_id]->Msg3[4],
+	    ue->prach_resources[eNB_id]->Msg3[5],
+	    ue->prach_resources[eNB_id]->Msg3[6],
+	    ue->prach_resources[eNB_id]->Msg3[7],
+	    ue->prach_resources[eNB_id]->Msg3[8]);
+      
+      start_meas(&ue->ulsch_encoding_stats);
+      
+      if (abstraction_flag==0) {
+	if (ulsch_encoding(ue->prach_resources[eNB_id]->Msg3,
+			   ue,
+			   harq_pid,
+			   eNB_id,
+			   ue->transmission_mode[eNB_id],0,0)!=0) {
+	  LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
+	  mac_xface->macphy_exit("Error in ulsch_coding");
+	  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+	  stop_meas(&ue->phy_proc_tx);
+	  return;
+	}
+      }
+      
 #ifdef PHY_ABSTRACTION
-          else {
-            ulsch_encoding_emul(ue->prach_resources[eNB_id]->Msg3,ue,eNB_id,harq_pid,0);
-          }
-
+      else {
+	ulsch_encoding_emul(ue->prach_resources[eNB_id]->Msg3,ue,eNB_id,harq_pid,0);
+      }
+      
 #endif
-          stop_meas(&ue->ulsch_encoding_stats);
-
-	  if (ue->mac_enabled == 1) {
-	    // signal MAC that Msg3 was sent
-	    mac_xface->Msg3_transmitted(Mod_id,
-					CC_id,
-					frame_tx,
-					eNB_id);
-	  }
-        } else {
-          input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8;
-
-	  if (ue->mac_enabled==1) {
-          //  LOG_D(PHY,"[UE  %d] ULSCH : Searching for MAC SDUs\n",Mod_id);
-          if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) {
-            //if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
-            access_mode=SCHEDULED_ACCESS;
-            mac_xface->ue_get_sdu(Mod_id,
-                                  CC_id,
-                                  frame_tx,
-                                  subframe_tx,
-                                  eNB_id,
-                                  ulsch_input_buffer,
-                                  input_buffer_length,
-                                  &access_mode);
-
-            //}
-            /*
-            else {
-              // Get calibration information from TDD procedures
-              LOG_D(PHY,"[UE %d] Frame %d, subframe %d : ULSCH: Getting TDD Auto-Calibration information\n",
-              Mod_id,ue->frame,subframe_tx);
-              for (i=0;i<input_buffer_length;i++)
-            ulsch_input_buffer[i]= i;
-
-            }
-            */
-          }
-
+      
+      stop_meas(&ue->ulsch_encoding_stats);
+      
+      if (ue->mac_enabled == 1) {
+	// signal MAC that Msg3 was sent
+	mac_xface->Msg3_transmitted(Mod_id,
+				    CC_id,
+				    frame_tx,
+				    eNB_id);
+      }
+    } // Msg3_flag==1
+    else {
+      input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8;
+      
+      if (ue->mac_enabled==1) {
+	//  LOG_D(PHY,"[UE  %d] ULSCH : Searching for MAC SDUs\n",Mod_id);
+	if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->round==0) {
+	  //if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
+	  access_mode=SCHEDULED_ACCESS;
+	  mac_xface->ue_get_sdu(Mod_id,
+				CC_id,
+				frame_tx,
+				subframe_tx,
+				eNB_id,
+				ulsch_input_buffer,
+				input_buffer_length,
+				&access_mode);
+	}
+	
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_ULSCH
-          LOG_D(PHY,"[UE] Frame %d, subframe %d : ULSCH SDU (TX harq_pid %d)  (%d bytes) : \n",frame_tx,subframe_tx,harq_pid, ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3);
-
-          for (i=0; i<ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++)
-            LOG_T(PHY,"%x.",ulsch_input_buffer[i]);
-
-          LOG_T(PHY,"\n");
+	LOG_D(PHY,"[UE] Frame %d, subframe %d : ULSCH SDU (TX harq_pid %d)  (%d bytes) : \n",frame_tx,subframe_tx,harq_pid, ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3);
+	
+	for (i=0; i<ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3; i++)
+	  LOG_T(PHY,"%x.",ulsch_input_buffer[i]);
+	
+	LOG_T(PHY,"\n");
 #endif
 #endif
+      }
+      else {
+	unsigned int taus(void);
+	
+	for (i=0; i<input_buffer_length; i++)
+	  ulsch_input_buffer[i]= (uint8_t)(taus()&0xff);
+	
+      }
+      
+      start_meas(&ue->ulsch_encoding_stats);
+      
+      if (abstraction_flag==0) {
+	
+	if (ulsch_encoding(ulsch_input_buffer,
+			   ue,
+			   harq_pid,
+			   eNB_id,
+			   ue->transmission_mode[eNB_id],0,
+			   0)!=0) {  //  Nbundled, to be updated!!!!
+	  LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
+	  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
+	  stop_meas(&ue->phy_proc_tx);
+	  return;
 	}
-	  else {
-          // the following lines were necessary for the calibration in CROWN
-          /*
-          if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->calibration_flag == 0) {
-              for (i=0;i<input_buffer_length;i++)
-                  ulsch_input_buffer[i]= (uint8_t)(taus()&0xff);
-          }
-          else {
-              // Get calibration information from TDD procedures
-          }
-          */
-
-          unsigned int taus(void);
-
-          for (i=0; i<input_buffer_length; i++)
-            ulsch_input_buffer[i]= (uint8_t)(taus()&0xff);
-
-          // the following lines were necessary for the collaborative UL in PUCCO
-          /*
-          memset(ue->ulsch[eNB_id]->o    ,0,MAX_CQI_BYTES*sizeof(uint8_t));
-          memset(ue->ulsch[eNB_id]->o_RI ,0,2*sizeof(uint8_t));
-          memset(ue->ulsch[eNB_id]->o_ACK,0,4*sizeof(uint8_t));
-          for (i=0;i<input_buffer_length;i++)
-            ulsch_input_buffer[i]= i;
-          */
-	}
-
-          start_meas(&ue->ulsch_encoding_stats);
-
-          if (abstraction_flag==0) {
-            /*
-            if (ue->frame%100==0) {
-              LOG_I(PHY,"Encoding ulsch\n");
-            }
-            */
-            if (ulsch_encoding(ulsch_input_buffer,
-                               ue,
-                               harq_pid,
-                               eNB_id,
-                               ue->transmission_mode[eNB_id],0,
-                               0)!=0) {  //  Nbundled, to be updated!!!!
-              LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
-              VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
-              stop_meas(&ue->phy_proc_tx);
-              return;
-            }
-          }
-
+      }
+      
 #ifdef PHY_ABSTRACTION
-          else {
-            ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0);
-          }
-
+      else {
+	ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0);
+      }
+      
 #endif
-          stop_meas(&ue->ulsch_encoding_stats);
-        }
-
-        if (abstraction_flag == 0) {
-	  if (ue->mac_enabled==1) {
-	    pusch_power_cntl(ue,subframe_tx,eNB_id,1, abstraction_flag);
-	    ue->tx_power_dBm = ue->ulsch[eNB_id]->Po_PUSCH;
-	  }
-	  else {
-	    ue->tx_power_dBm = ue->tx_power_max_dBm;
-	  }
-          ue->tx_total_RE = nb_rb*12;
-	  
+      stop_meas(&ue->ulsch_encoding_stats);
+    }
+    
+    if (abstraction_flag == 0) {
+      if (ue->mac_enabled==1) {
+	pusch_power_cntl(ue,proc,eNB_id,1, abstraction_flag);
+	ue->tx_power_dBm = ue->ulsch[eNB_id]->Po_PUSCH;
+      }
+      else {
+	ue->tx_power_dBm = ue->tx_power_max_dBm;
+      }
+      ue->tx_total_RE = nb_rb*12;
+      
 #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-	  tx_amp = get_tx_amp(ue->tx_power_dBm,
-			      ue->tx_power_max_dBm,
-			      ue->frame_parms.N_RB_UL,
-			      nb_rb);
+      tx_amp = get_tx_amp(ue->tx_power_dBm,
+			  ue->tx_power_max_dBm,
+			  ue->frame_parms.N_RB_UL,
+			  nb_rb);
 #else
-          tx_amp = AMP;
-#endif
-	  LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n",
-		Mod_id,harq_pid,frame_tx,subframe_tx,ue->tx_power_dBm,ue->tx_power_max_dBm, tx_amp);
-          start_meas(&ue->ulsch_modulation_stats);
-          ulsch_modulation(ue->common_vars.txdataF,
+      tx_amp = AMP;
+#endif
+      LOG_D(PHY,"[UE  %d][PUSCH %d] Frame %d subframe %d, generating PUSCH, Po_PUSCH: %d dBm (max %d dBm), amp %d\n",
+	    Mod_id,harq_pid,frame_tx,subframe_tx,ue->tx_power_dBm,ue->tx_power_max_dBm, tx_amp);
+      start_meas(&ue->ulsch_modulation_stats);
+      ulsch_modulation(ue->common_vars.txdataF,
+		       tx_amp,
+		       frame_tx,
+		       subframe_tx,
+		       &ue->frame_parms,
+		       ue->ulsch[eNB_id]);
+      for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++)
+	generate_drs_pusch(ue,
+			   proc,
+			   eNB_id,
 			   tx_amp,
-                           frame_tx,
-                           subframe_tx,
-                           &ue->frame_parms,
-                           ue->ulsch[eNB_id]);
-          for (aa=0; aa<1/*frame_parms->nb_antennas_tx*/; aa++)
-            generate_drs_pusch(ue,
-			       eNB_id,
-			       tx_amp,
-			       subframe_tx,
-			       first_rb,
-			       nb_rb,
-			       aa);
-
-          stop_meas(&ue->ulsch_modulation_stats);
-        }
-
-        if (abstraction_flag==1) {
-          // clear SR
-          ue->sr[subframe_tx]=0;
-        }
-      } // ULSCH is active
-
-#ifdef PUCCH
-      else if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b
-        //      debug_LOG_D(PHY,"[UE%d] Frame %d, subframe %d: Checking for PUCCH 1a/1b\n",Mod_id,frame_tx,subframe_tx);
-        bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
-
-        if ((frame_parms->frame_type==FDD) ||
-            (bundling_flag==bundling)    ||
-            ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((slot_tx!=4)||(slot_tx!=14)))) {
-          format = pucch_format1a;
-          LOG_D(PHY,"[UE] PUCCH 1a\n");
-        } else {
-          format = pucch_format1b;
-          LOG_D(PHY,"[UE] PUCCH 1b\n");
-        }
-
-        // Check for SR and do ACK/NACK accordingly
-        if (is_SR_TXOp(ue,eNB_id,subframe_tx)==1) {
-          LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n",
-                Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx);
-
-	  if (ue->mac_enabled==1) {
-	    SR_payload = mac_xface->ue_get_SR(Mod_id,
-					      CC_id,
-					      frame_tx,
-					      eNB_id,
-					      ue->pdcch_vars[eNB_id]->crnti,
-					      subframe_tx); // subframe used for meas gap
-	  }
-	  else {
-	    SR_payload = 1;
-	  }
-	  
-          if (SR_payload>0) {
-            generate_ul_signal = 1;
-            LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n",
-                  Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload);
-          } else {
-            ue->sr[subframe_tx]=0;
-          }
-        } else {
-          SR_payload=0;
-	}
+			   subframe_tx,
+			   first_rb,
+			   nb_rb,
+			   aa);
+      
+      stop_meas(&ue->ulsch_modulation_stats);
+    }
+    
+    if (abstraction_flag==1) {
+      // clear SR
+      ue->sr[subframe_tx]=0;
+    }
+  } // subframe_scheduling_flag==1
+}
 
-        if (get_ack(&ue->frame_parms,
-                    ue->dlsch[eNB_id][0]->harq_ack,
-                    subframe_tx,pucch_ack_payload) > 0) {
-          // we need to transmit ACK/NAK in this subframe
 
-          generate_ul_signal = 1;
+void ue_pucch_procedures(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag) {
 
-          n1_pucch = get_n1_pucch(ue,
-                                  eNB_id,
-                                  subframe_tx,
-                                  pucch_ack_payload,
-                                  SR_payload);
 
-	  if (ue->mac_enabled == 1) {
-	    Po_PUCCH = pucch_power_cntl(ue,subframe_tx,eNB_id,format);
-	  } 
-	  else {
-	    Po_PUCCH = ue->tx_power_max_dBm;
-	  }
-	  ue->tx_power_dBm = Po_PUCCH;
-          ue->tx_total_RE = 12;
+  uint8_t pucch_ack_payload[2];
+  uint8_t n1_pucch;
+  ANFBmode_t bundling_flag;
+  PUCCH_FMT_t format;
+  uint8_t SR_payload;
+  LTE_DL_FRAME_PARMS *frame_parms = &ue->frame_parms;
+  int frame_tx=proc->frame_tx;
+  int subframe_tx=proc->subframe_tx;
+  int Mod_id = ue->Mod_id;
+  int CC_id = ue->CC_id;
+  int tx_amp;
+  int8_t Po_PUCCH;
 
+  bundling_flag = ue->pucch_config_dedicated[eNB_id].tdd_AckNackFeedbackMode;
+  
+  if ((frame_parms->frame_type==FDD) ||
+      (bundling_flag==bundling)    ||
+      ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe_tx!=2)||(subframe_tx!=7)))) {
+    format = pucch_format1a;
+    LOG_D(PHY,"[UE] PUCCH 1a\n");
+  } else {
+    format = pucch_format1b;
+    LOG_D(PHY,"[UE] PUCCH 1b\n");
+  }
+  
+  // Check for SR and do ACK/NACK accordingly
+  if (is_SR_TXOp(ue,proc,eNB_id)==1) {
+    LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d: got SR_TXOp, Checking for SR for PUSCH from MAC\n",
+	  Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx);
+    
+    if (ue->mac_enabled==1) {
+      SR_payload = mac_xface->ue_get_SR(Mod_id,
+					CC_id,
+					frame_tx,
+					eNB_id,
+					ue->pdcch_vars[eNB_id]->crnti,
+					subframe_tx); // subframe used for meas gap
+    }
+    else {
+      SR_payload = 1;
+    }
+	    
+    if (SR_payload>0) {
+      ue->generate_ul_signal[eNB_id] = 1;
+      LOG_D(PHY,"[UE %d][SR %x] Frame %d subframe %d got the SR for PUSCH is %d\n",
+	    Mod_id,ue->pdcch_vars[eNB_id]->crnti,frame_tx,subframe_tx,SR_payload);
+    } else {
+      ue->sr[subframe_tx]=0;
+    }
+  } else {
+    SR_payload=0;
+  }
+        	  
+  if (get_ack(&ue->frame_parms,
+	      ue->dlsch[eNB_id][0]->harq_ack,
+	      subframe_tx,pucch_ack_payload) > 0) {
+    // we need to transmit ACK/NAK in this subframe
+	    
+    ue->generate_ul_signal[eNB_id] = 1;
+	    
+    n1_pucch = get_n1_pucch(ue,
+			    proc,
+			    eNB_id,
+			    pucch_ack_payload,
+			    SR_payload);
+	    
+    if (ue->mac_enabled == 1) {
+      Po_PUCCH = pucch_power_cntl(ue,proc,eNB_id,format);
+    } 
+    else {
+      Po_PUCCH = ue->tx_power_max_dBm;
+    }
+    ue->tx_power_dBm = Po_PUCCH;
+    ue->tx_total_RE = 12;
+	    
 #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-	  tx_amp = get_tx_amp(Po_PUCCH,
-			      ue->tx_power_max_dBm,
-			      ue->frame_parms.N_RB_UL,
-			      1);
+    tx_amp = get_tx_amp(Po_PUCCH,
+			ue->tx_power_max_dBm,
+			ue->frame_parms.N_RB_UL,
+			1);
 #else
-	  tx_amp = AMP;
+    tx_amp = AMP;
 #endif
-	  
-          if (SR_payload>0) {
-	     LOG_D(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n",
-                  Mod_id,
-                  ue->dlsch[eNB_id][0]->rnti,
-                  frame_tx, subframe_tx,
-		  pucch_ack_payload[0],pucch_ack_payload[1],
-                  ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
-	          Po_PUCCH,
-		  tx_amp);
-          } else {
-            LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n",
-                  Mod_id,
-                  ue->dlsch[eNB_id][0]->rnti,
+	    
+    if (SR_payload>0) {
+      LOG_D(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1a/1b payload %d,%d (with SR for PUSCH), n1_pucch %d, Po_PUCCH, amp %d\n",
+	    Mod_id,
+	    ue->dlsch[eNB_id][0]->rnti,
 	    frame_tx, subframe_tx,
-		  n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload,
-                  Po_PUCCH,
-		  tx_amp);
-	  }
-
-          if (abstraction_flag == 0) {
-
-	  generate_pucch(ue->common_vars.txdataF,
-                           &ue->frame_parms,
-                           ue->ncs_cell,
-                           format,
-                           &ue->pucch_config_dedicated[eNB_id],
-                           n1_pucch,
-                           0,  // n2_pucch
-                           1,  // shortened format
-                           pucch_ack_payload,
-	                   tx_amp,
-	                   subframe_tx);
-
-          } else {
+	    pucch_ack_payload[0],pucch_ack_payload[1],
+	    ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
+	    Po_PUCCH,
+	    tx_amp);
+    } else {
+      LOG_D(PHY,"[UE  %d][PDSCH %x] Frame %d subframe %d Generating PUCCH 1a/1b, n1_pucch %d, b[0]=%d,b[1]=%d (SR_Payload %d), Po_PUCCH %d, amp %d\n",
+	    Mod_id,
+	    ue->dlsch[eNB_id][0]->rnti,
+	    frame_tx, subframe_tx,
+	    n1_pucch,pucch_ack_payload[0],pucch_ack_payload[1],SR_payload,
+	    Po_PUCCH,
+	    tx_amp);
+    }
+	    
+    if (abstraction_flag == 0) {
+	      
+      generate_pucch(ue->common_vars.txdataF,
+		     &ue->frame_parms,
+		     ue->ncs_cell,
+		     format,
+		     &ue->pucch_config_dedicated[eNB_id],
+		     n1_pucch,
+		     0,  // n2_pucch
+		     1,  // shortened format
+		     pucch_ack_payload,
+		     tx_amp,
+		     subframe_tx);
+	      
+    } else {
 #ifdef PHY_ABSTRACTION
-            LOG_D(PHY,"Calling generate_pucch_emul ... (ACK %d %d, SR %d)\n",pucch_ack_payload[0],pucch_ack_payload[1],SR_payload);
-            generate_pucch_emul(ue,
-                                format,
-                                ue->frame_parms.pucch_config_common.nCS_AN,
-                                pucch_ack_payload,
-                                SR_payload,
-                                subframe_tx);
+      LOG_D(PHY,"Calling generate_pucch_emul ... (ACK %d %d, SR %d)\n",pucch_ack_payload[0],pucch_ack_payload[1],SR_payload);
+      generate_pucch_emul(ue,
+			  proc,
+			  format,
+			  ue->frame_parms.pucch_config_common.nCS_AN,
+			  pucch_ack_payload,
+			  SR_payload,
+			  subframe_tx);
 #endif
-          }
-        } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC
-
-	  if (ue->mac_enabled == 1) {
-	    Po_PUCCH = pucch_power_cntl(ue,subframe_tx,eNB_id,pucch_format1);
-	  }
-	  else {
-	    Po_PUCCH = ue->tx_power_max_dBm;
-	  }
-	  ue->tx_power_dBm = Po_PUCCH;
-          ue->tx_total_RE = 12;
-
+    }
+  } else if (SR_payload==1) { // no ACK/NAK but SR is triggered by MAC
+	    
+    if (ue->mac_enabled == 1) {
+      Po_PUCCH = pucch_power_cntl(ue,proc,eNB_id,pucch_format1);
+    }
+    else {
+      Po_PUCCH = ue->tx_power_max_dBm;
+    }
+    ue->tx_power_dBm = Po_PUCCH;
+    ue->tx_total_RE = 12;
+	    
 #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-          tx_amp =  get_tx_amp(Po_PUCCH,
-	                       ue->tx_power_max_dBm,
-	                       ue->frame_parms.N_RB_UL,
-	                       1);
+    tx_amp =  get_tx_amp(Po_PUCCH,
+			 ue->tx_power_max_dBm,
+			 ue->frame_parms.N_RB_UL,
+			 1);
 #else
-	  tx_amp = AMP;
-#endif
-          LOG_D(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n",
-                Mod_id,
-                ue->dlsch[eNB_id][0]->rnti,
-                frame_tx, subframe_tx,
-                ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
-                Po_PUCCH);
-
-          if (abstraction_flag == 0) {
-
-            generate_pucch(ue->common_vars.txdataF,
-                           &ue->frame_parms,
-                           ue->ncs_cell,
-                           pucch_format1,
-                           &ue->pucch_config_dedicated[eNB_id],
-                           ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
-                           0,  // n2_pucch
-                           1,  // shortened format
-                           pucch_ack_payload,  // this is ignored anyway, we just need a pointer
-	                   tx_amp,
-                           subframe_tx);
-          } else {
-            LOG_D(PHY,"Calling generate_pucch_emul ...\n");
-            generate_pucch_emul(ue,
-                                pucch_format1,
-                                ue->frame_parms.pucch_config_common.nCS_AN,
-                                pucch_ack_payload,
-                                SR_payload,
-                                subframe_tx);
-          }
-        }
-      }
-
-#endif  // PUCCH
+    tx_amp = AMP;
+#endif
+    LOG_D(PHY,"[UE  %d][SR %x] Frame %d subframe %d Generating PUCCH 1 (SR for PUSCH), n1_pucch %d, Po_PUCCH %d\n",
+	  Mod_id,
+	  ue->dlsch[eNB_id][0]->rnti,
+	  frame_tx, subframe_tx,
+	  ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
+	  Po_PUCCH);
+	    
+    if (abstraction_flag == 0) {
+	      
+      generate_pucch(ue->common_vars.txdataF,
+		     &ue->frame_parms,
+		     ue->ncs_cell,
+		     pucch_format1,
+		     &ue->pucch_config_dedicated[eNB_id],
+		     ue->scheduling_request_config[eNB_id].sr_PUCCH_ResourceIndex,
+		     0,  // n2_pucch
+		     1,  // shortened format
+		     pucch_ack_payload,  // this is ignored anyway, we just need a pointer
+		     tx_amp,
+		     subframe_tx);
+    } else {
+      LOG_D(PHY,"Calling generate_pucch_emul ...\n");
+      generate_pucch_emul(ue,
+			  proc,
+			  pucch_format1,
+			  ue->frame_parms.pucch_config_common.nCS_AN,
+			  pucch_ack_payload,
+			  SR_payload);
 
-#ifdef CBA
+    }
+  } // SR_Payload==1
+}
 
-      if ((ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) &&
-          (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) {
-        ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1
-        //  ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE;
-        first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb;
-        nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
-        //cba_mcs=ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs;
-        input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8;
-        access_mode=CBA_ACCESS;
-
-        LOG_D(PHY,"[UE %d] Frame %d, subframe %d: CBA num dci %d\n",
-              Mod_id,frame_tx,subframe_tx,
-              ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]);
-
-        mac_xface->ue_get_sdu(Mod_id,
-                              CC_id,
-                              frame_tx,
-                              subframe_tx,
-                              eNB_id,
-                              ulsch_input_buffer,
-                              input_buffer_length,
-                              &access_mode);
-
-        ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]=0;
-
-        if (access_mode > UNKNOWN_ACCESS) {
-
-          if (abstraction_flag==0) {
-            if (ulsch_encoding(ulsch_input_buffer,
-                               ue,
-                               harq_pid,
-                               eNB_id,
-                               ue->transmission_mode[eNB_id],0,
-                               0)!=0) {  //  Nbundled, to be updated!!!!
-              LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
-              return;
-            }
-          }
+void phy_procedures_UE_TX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) {
+  
 
-#ifdef PHY_ABSTRACTION
-          else {
-            ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0);
-          }
+  LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
+  int32_t ulsch_start=0;
+  int subframe_tx = proc->subframe_tx;
+  int frame_tx = proc->frame_tx;
+  unsigned int aa;
 
-#endif
-        } else {
-          ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE;
-          //reset_cba_uci(ue->ulsch[eNB_id]->o);
-          LOG_N(PHY,"[UE %d] Frame %d, subframe %d: CBA transmission cancelled or postponed\n",
-                Mod_id, frame_tx,subframe_tx);
-        }
-      }
 
-#endif // end CBA
 
-      if (abstraction_flag == 0) {
-        nsymb = (frame_parms->Ncp == 0) ? 14 : 12;
-
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case
-        ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
-                       ue->hw_timing_advance-
-                       ue->timing_advance-
-                       ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
-#else //this is the normal case
-        ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance;
-#endif //else EXMIMO
-	if ((frame_tx%100) == 0)
-	  LOG_D(PHY,"[UE %d] Frame %d, subframe %d: ulsch_start = %d (rxoff %d, HW TA %d, timing advance %d, TA_offset %d\n",
-		Mod_id,frame_tx,subframe_tx,
-		ulsch_start,
-		ue->rx_offset,
-		ue->hw_timing_advance,
-		ue->timing_advance,
-		ue->N_TA_offset);
- 
-
-        if (generate_ul_signal == 1 ) {
 
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
 
+  ue->generate_ul_signal[eNB_id] = 0;
 
-          start_meas(&ue->ofdm_mod_stats);
+  start_meas(&ue->phy_proc_tx);
 
-          for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-            if (frame_parms->Ncp == 1)
-              PHY_ofdm_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-                           dummy_tx_buffer,
-#else
-                           &ue->common_vars.txdata[aa][ulsch_start],
-#endif
-                           frame_parms->ofdm_symbol_size,
-                           nsymb,
-                           frame_parms->nb_prefix_samples,
-                           CYCLIC_PREFIX);
-            else
-              normal_prefix_mod(&ue->common_vars.txdataF[aa][subframe_tx*nsymb*frame_parms->ofdm_symbol_size],
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-                                dummy_tx_buffer,
-#else
-                                &ue->common_vars.txdata[aa][ulsch_start],
-#endif
-                                nsymb,
-                                &ue->frame_parms);
-
-            /*
-              if (subframe_tx == 8) {
-              printf("Symbol 0 %p (offset %d) base %p\n",
-              &ue->common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe],
-              nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe,
-              ue->common_vars.txdataF[0]);
-              write_output("txsigF8.m","txsF8", &ue->common_vars.txdataF[0][nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*subframe],
-              ue->frame_parms.ofdm_symbol_size*nsymb,1,1);
-              write_output("txsig8.m","txs8", &ue->common_vars.txdata[0][ue->frame_parms.samples_per_tti*subframe],
-              ue->frame_parms.samples_per_tti,1,1);
-              }
-            */
-#ifndef OFDMA_ULSCH
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-            apply_7_5_kHz(ue,dummy_tx_buffer,0);
-            apply_7_5_kHz(ue,dummy_tx_buffer,1);
-#else
-            apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],0);
-            apply_7_5_kHz(ue,&ue->common_vars.txdata[aa][ulsch_start],1);
-#endif
-            /*
-              if (subframe_tx == 8) {
-              write_output("txsig8_mod.m","txs8_mod", &ue->common_vars.txdata[0][ue->frame_parms.samples_per_tti*subframe],
-              ue->frame_parms.samples_per_tti,1,1);
-              }
-            */
+#ifdef EMOS
+  //phy_procedures_emos_UE_TX(next_slot);
 #endif
 
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-            overflow = ulsch_start - 9*frame_parms->samples_per_tti;
-
-            //if ((slot_tx==4) && (aa==0)) printf("ulsch_start %d, overflow %d\n",ulsch_start,overflow);
-            for (k=ulsch_start,l=0; k<cmin(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME,ulsch_start+frame_parms->samples_per_tti); k++,l++) {
-              ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
-              ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
-            }
-
-            for (k=0; k<overflow; k++,l++) {
-              ((short*)ue->common_vars.txdata[aa])[2*k] = ((short*)dummy_tx_buffer)[2*l]<<4;
-              ((short*)ue->common_vars.txdata[aa])[2*k+1] = ((short*)dummy_tx_buffer)[2*l+1]<<4;
-            }
-#if defined(EXMIMO)
-	    // handle switch before 1st TX subframe, guarantee that the slot prior to transmission is switch on
-	    for (k=ulsch_start - (frame_parms->samples_per_tti>>1) ; k<ulsch_start ; k++) {
-	      if (k<0)
-		ue->common_vars.txdata[aa][k+frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
-	      else if (k>(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME))
-		ue->common_vars.txdata[aa][k-frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME] &= 0xFFFEFFFE;
-	      else
-		ue->common_vars.txdata[aa][k] &= 0xFFFEFFFE;
-	    }
-#endif
-#endif
+  ue->tx_power_dBm=-127;
+      
+  if (abstraction_flag==0) {
+    for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+      memset(&ue->common_vars.txdataF[aa][subframe_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti],
+	     0,
+	     frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t));
+    }
+  }
+      
+  if (ue->UE_mode[eNB_id] != PRACH) {
 
-          } //nb_antennas_tx
+    ue_ulsch_uespec_procedures(ue,proc,eNB_id,abstraction_flag);
 
-          stop_meas(&ue->ofdm_mod_stats);
-        } // generate_ul_signal == 1
-        else {  // no uplink so clear signal buffer instead
-          for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
-            memset(&ue->common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2);
-          }
-        }
-      }
-    } // mode != PRACH
-
-    //  }// slot_tx is even
-    //  else {  // slot_tx is odd, do the PRACH here
-
-    if ((ue->UE_mode[eNB_id] == PRACH) && (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) {
-
-      // check if we have PRACH opportunity
-      if (is_prach_subframe(&ue->frame_parms,frame_tx,subframe_tx)) {
-        ue->generate_prach=0;
-
-	if (ue->mac_enabled==1){
-	  // ask L2 for RACH transport
-	  if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
-	    ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(Mod_id,
-									  CC_id,
-									  frame_tx,
-									  eNB_id,
-									  subframe_tx);
-	    //    LOG_I(PHY,"Got prach_resources for eNB %d address %d, RRCCommon %d\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[Mod_id].radioResourceConfigCommon);
-	  }
-	}
-
-        if (ue->prach_resources[eNB_id]!=NULL) {
+  }
+  	  
+  if (ue->UE_mode[eNB_id] == PUSCH) { // check if we need to use PUCCH 1a/1b
+  
 
-          ue->generate_prach=1;
-          ue->prach_cnt=0;
-#ifdef SMBV
-          ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;
-#endif
-#ifdef OAI_EMU
-          ue->prach_PreambleIndex=ue->prach_resources[eNB_id]->ra_PreambleIndex;
+  } // UE_mode==PUSCH
+	
+  	
+#ifdef CBA
+	
+  if ((ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag >= 1) &&
+      (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == CBA_ACTIVE)) {
+    ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag=0; //-=1
+    //  ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE;
+    first_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->first_rb;
+    nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
+    //cba_mcs=ue->ulsch[eNB_id]->harq_processes[harq_pid]->mcs;
+    input_buffer_length = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS/8;
+    access_mode=CBA_ACCESS;
+	  
+    LOG_D(PHY,"[UE %d] Frame %d, subframe %d: CBA num dci %d\n",
+	  Mod_id,frame_tx,subframe_tx,
+	  ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]);
+	  
+    mac_xface->ue_get_sdu(Mod_id,
+			  CC_id,
+			  frame_tx,
+			  subframe_tx,
+			  eNB_id,
+			  ulsch_input_buffer,
+			  input_buffer_length,
+			  &access_mode);
+	  
+    ue->ulsch[eNB_id]->num_cba_dci[subframe_tx]=0;
+	  
+    if (access_mode > UNKNOWN_ACCESS) {
+	    
+      if (abstraction_flag==0) {
+	if (ulsch_encoding(ulsch_input_buffer,
+			   ue,
+			   harq_pid,
+			   eNB_id,
+			   ue->transmission_mode[eNB_id],0,
+			   0)!=0) {  //  Nbundled, to be updated!!!!
+	  LOG_E(PHY,"ulsch_coding.c: FATAL ERROR: returning\n");
+	  return;
+	}
+      }
+	    
+#ifdef PHY_ABSTRACTION
+      else {
+	ulsch_encoding_emul(ulsch_input_buffer,ue,eNB_id,harq_pid,0);
+      }
+	    
 #endif
+    } else {
+      ue->ulsch[eNB_id]->harq_processes[harq_pid]->status= IDLE;
+      //reset_cba_uci(ue->ulsch[eNB_id]->o);
+      LOG_N(PHY,"[UE %d] Frame %d, subframe %d: CBA transmission cancelled or postponed\n",
+	    Mod_id, frame_tx,subframe_tx);
+    }
+  }
+	
+#endif // end CBA
 
-          if (abstraction_flag == 0) {
-            LOG_I(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d : Generating PRACH, preamble %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n",
-                  Mod_id,
-                  frame_tx,
-                  subframe_tx,
-                  ue->prach_resources[eNB_id]->ra_PreambleIndex,
-                  ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER,
-                  ue->prach_resources[eNB_id]->ra_TDD_map_index,
-                  ue->prach_resources[eNB_id]->ra_RNTI);
-
-	    if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) {
-	      ue->tx_power_dBm = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id);
-	    }
-	    else {
-	      ue->tx_power_dBm = ue->tx_power_max_dBm;
-	      ue->prach_resources[eNB_id]->ra_PreambleIndex = 19;	      
-	    }
-
-            ue->tx_total_RE = 96;
-
-#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-            ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm,
-								     ue->tx_power_max_dBm,
-								     ue->frame_parms.N_RB_UL,
-								     6);
-#else
-            ue->prach_vars[eNB_id]->amp = AMP;
-#endif
-	    if ((mode == calib_prach_tx) && (((ue->frame_tx&0xfffe)%100)==0))
-	      LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, Subframe %d : PRACH TX power %d dBm, amp %d\n",Mod_id,ue->frame_rx,ue->slot_tx>>1,ue->tx_power_dBm,
-		    ue->prach_vars[eNB_id]->amp);
-
-
-            //      start_meas(&ue->tx_prach);
-            VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
-            prach_power = generate_prach(ue,eNB_id,subframe_tx,frame_tx);
-            VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
-            //      stop_meas(&ue->tx_prach);
-            LOG_D(PHY,"[UE  %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n",
-                  Mod_id,
-                  get_PL(Mod_id,CC_id,eNB_id),
-                  ue->tx_power_dBm,
-                  dB_fixed(prach_power),
-                  ue->prach_vars[eNB_id]->amp);
-          } else {
-            UE_transport_info[Mod_id][CC_id].cntl.prach_flag=1;
-            UE_transport_info[Mod_id][CC_id].cntl.prach_id=ue->prach_resources[eNB_id]->ra_PreambleIndex;
-	    if (ue->mac_enabled==1){
-	      mac_xface->Msg1_transmitted(Mod_id,
-					  CC_id,
-					  frame_tx,
-					  eNB_id);
-	    }
-          }
-
-          LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
-                Mod_id,frame_tx,subframe_tx,eNB_id,
-                ue->prach_resources[eNB_id]->ra_PreambleIndex,
-                ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_PL(Mod_id,CC_id,eNB_id),
-                get_PL(Mod_id,CC_id,eNB_id));
-
-	}	  
-
+  	
+  if (abstraction_flag == 0) {
+	  
+    if (ue->generate_ul_signal[eNB_id] == 1 )
+      ulsch_common_procedures(ue,proc);
+    else {  // no uplink so clear signal buffer instead
+#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case
+      ulsch_start = (ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
+		     ue->hw_timing_advance-
+		     ue->timing_advance-
+		     ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
+#else //this is the normal case
+      ulsch_start = (frame_parms->samples_per_tti*subframe_tx)-ue->N_TA_offset; //-ue->timing_advance;
+#endif //else EXMIMO
+      for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
+	memset(&ue->common_vars.txdata[aa][ulsch_start],0,frame_parms->samples_per_tti<<2);
       }
-      // if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue
-      if (mode == calib_prach_tx)
-	ue->prach_resources[eNB_id]=NULL;
-
-      LOG_D(PHY,"[UE %d] frame %d subframe %d : generate_prach %d, prach_cnt %d\n",
-            Mod_id,frame_tx,subframe_tx,ue->generate_prach,ue->prach_cnt);
+    }
 
-      ue->prach_cnt++;
+  } // mode != PRACH
+    
+      
+  if ((ue->UE_mode[eNB_id] == PRACH) && 
+      (ue->frame_parms.prach_config_common.prach_Config_enabled==1)) {
+	
+    // check if we have PRACH opportunity
+    if (is_prach_subframe(&ue->frame_parms,frame_tx,subframe_tx)) {
 
-      if (ue->prach_cnt==3)
-        ue->generate_prach=0;
-    } // mode is PRACH
-    else {
-      ue->generate_prach=0;
+      ue_prach_procedures(ue,proc,eNB_id,abstraction_flag,mode);
     }
-  } // slot_tx is even
-
+  } // mode is PRACH
+  else {
+    ue->generate_prach=0;
+  }
+    
+      
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
   stop_meas(&ue->phy_proc_tx);
 }
@@ -1449,37 +1409,31 @@ void phy_procedures_UE_S_TX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_f
 {
   int aa;//i,aa;
   LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
-
+  
   if (abstraction_flag==0) {
-
+    
     for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
 #if defined(EXMIMO) //this is the EXPRESS MIMO case
       int i;
       // set the whole tx buffer to RX
       for (i=0; i<LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti; i++)
-        ue->common_vars.txdata[aa][i] = 0x00010001;
-
+	ue->common_vars.txdata[aa][i] = 0x00010001;
+      
 #else //this is the normal case
       memset(&ue->common_vars.txdata[aa][0],0,
-             (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t));
+	     (LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti)*sizeof(int32_t));
 #endif //else EXMIMO
-
+      
     }
   }
 }
 
-void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode)
+void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode)
 {
-
+  
   LTE_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
-  //  int aa;
-#if defined(EXMIMO) && defined(DRIVER2013)
-  //  exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr;
-  //  int aa;
-#endif
 
-  int slot_rx = ue->slot_rx;
-  int subframe_rx = slot_rx>>1;
+  int subframe_rx = proc->subframe_rx;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_IN);
 
@@ -1489,25 +1443,25 @@ void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_
       LOG_D(PHY,"Calling measurements subframe %d, rxdata %p\n",subframe_rx,ue->common_vars.rxdata);
 
       lte_ue_measurements(ue,
-                          (subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME),
-                          (slot_rx == 2) ? 1 : 0,
-                          0);
+			  (subframe_rx*frame_parms->samples_per_tti+ue->rx_offset)%(frame_parms->samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME),
+			  (subframe_rx == 1) ? 1 : 0,
+			  0);
     } else {
       lte_ue_measurements(ue,
-                          0,
-                          0,
-                          1);
+			  0,
+			  0,
+			  1);
     }
   }
 
   if (l==(6-ue->frame_parms.Ncp)) {
 	
-   // make sure we have signal from PSS/SSS for N0 measurement
+    // make sure we have signal from PSS/SSS for N0 measurement
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_IN);
     ue_rrc_measurements(ue,
-                        slot_rx,
-                        abstraction_flag);
+			subframe_rx,
+			abstraction_flag);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_RRC_MEASUREMENTS, VCD_FUNCTION_OUT);
 
     if (abstraction_flag==1)
@@ -1515,7 +1469,7 @@ void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_
 
   }
 
-  if ((slot_rx==1) && (l==(4-frame_parms->Ncp))) {
+  if ((subframe_rx==0) && (l==(4-frame_parms->Ncp))) {
 
     // AGC
 
@@ -1535,10 +1489,10 @@ void ue_measurement_procedures(uint16_t l, PHY_VARS_UE *ue,uint8_t eNB_id,uint8_
 
     if (abstraction_flag == 0)
       lte_adjust_synch(&ue->frame_parms,
-                       ue,
-                       eNB_id,
-                       0,
-                       16384);
+		       ue,
+		       eNB_id,
+		       0,
+		       16384);
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
 
@@ -1557,14 +1511,14 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
   int Mod_id = ue->Mod_id;
 
   /*
-  if (last_slot<2)
+    if (last_slot<2)
     last_slot_emos = last_slot;
-  else if (last_slot>9)
+    else if (last_slot>9)
     last_slot_emos = last_slot - 8;
-  else {
+    else {
     LOG_E(PHY,"emos rx last_slot_emos %d, last_slot %d\n", last_slot_emos,last_slot);
     mac_xface->macphy_exit("should never happen");
-  }
+    }
   */
 
 #ifdef EMOS_CHANNEL
@@ -1572,14 +1526,14 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
   if ((last_slot==10) || (last_slot==11)) {
     for (i=0; i<ue->frame_parms.nb_antennas_rx; i++)
       for (j=0; j<ue->frame_parms.nb_antennas_tx; j++) {
-        // first OFDM symbol with pilots
-        memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*ue->frame_parms.ofdm_symbol_size],
-               &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0],
-               ue->frame_parms.ofdm_symbol_size*sizeof(int));
-        // second OFDM symbol with pilots
-        memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*ue->frame_parms.ofdm_symbol_size],
-               &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(ue->frame_parms.Ncp == 0 ? 4 : 3)*ue->frame_parms.ofdm_symbol_size],
-               ue->frame_parms.ofdm_symbol_size*sizeof(int));
+	// first OFDM symbol with pilots
+	memcpy(&emos_dump_UE.channel[i][j][(last_slot%2)*2*ue->frame_parms.ofdm_symbol_size],
+	       &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][0],
+	       ue->frame_parms.ofdm_symbol_size*sizeof(int));
+	// second OFDM symbol with pilots
+	memcpy(&emos_dump_UE.channel[i][j][((last_slot%2)*2+1)*ue->frame_parms.ofdm_symbol_size],
+	       &ue->common_vars.dl_ch_estimates[eNB_id][(j<<1) + i][(ue->frame_parms.Ncp == 0 ? 4 : 3)*ue->frame_parms.ofdm_symbol_size],
+	       ue->frame_parms.ofdm_symbol_size*sizeof(int));
       }
   }
 
@@ -1587,7 +1541,7 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
 
   if (last_slot==0) {
     emos_dump_UE.timestamp = rt_get_time_ns();
-    emos_dump_UE.frame_rx = ue->frame_rx;
+    emos_dump_UE.frame_rx = proc->frame_rx;
     emos_dump_UE.UE_mode = ue->UE_mode[eNB_id];
     emos_dump_UE.mimo_mode = ue->transmission_mode[eNB_id];
     emos_dump_UE.freq_offset = ue->common_vars.freq_offset;
@@ -1624,10 +1578,10 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
     bytes = rtf_put(CHANSOUNDER_FIFO_MINOR, &emos_dump_UE, sizeof(fifo_dump_emos_UE));
 
     if (bytes!=sizeof(fifo_dump_emos_UE)) {
-      LOG_W(PHY,"[UE  %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,ue->frame_rx, last_slot);
+      LOG_W(PHY,"[UE  %d] frame %d, slot %d, Problem writing EMOS data to FIFO\n",Mod_id,proc->frame_rx, last_slot);
     } else {
-      if (ue->frame_rx%100==0) {
-        LOG_I(PHY,"[UE  %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,ue->frame_rx, last_slot, bytes);
+      if (proc->frame_rx%100==0) {
+	LOG_I(PHY,"[UE  %d] frame %d, slot %d, Writing %d bytes EMOS data to FIFO\n",Mod_id,proc->frame_rx, last_slot, bytes);
       }
     }
   }
@@ -1636,12 +1590,12 @@ void phy_procedures_emos_UE_RX(PHY_VARS_UE *ue,uint8_t last_slot,uint8_t eNB_id)
 #endif
 
 
-void restart_phy(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag)
+void restart_phy(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t eNB_id,uint8_t abstraction_flag)
 {
 
   //  uint8_t last_slot;
   uint8_t i;
-  LOG_I(PHY,"[UE  %d] frame %d, slot %d, restarting PHY!\n",ue->Mod_id,ue->frame_rx,ue->slot_rx);
+  LOG_I(PHY,"[UE  %d] frame %d, slot %d, restarting PHY!\n",ue->Mod_id,proc->frame_rx,proc->subframe_rx);
   mac_xface->macphy_exit("restart_phy called");
   //   first_run = 1;
 
@@ -1652,8 +1606,8 @@ void restart_phy(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag)
     ue->prach_resources[eNB_id]=NULL;
   }
 
-  ue->frame_rx = -1;
-  ue->frame_tx = -1;
+  proc->frame_rx = -1;
+  proc->frame_tx = -1;
   //  ue->synch_wait_cnt=0;
   //  ue->sched_cnt=-1;
 
@@ -1694,7 +1648,7 @@ void restart_phy(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag)
 }
 
 
-void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
+void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uint8_t abstraction_flag)
 {
 
   //  int i;
@@ -1705,8 +1659,9 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
   uint8_t pbch_trials = 0;
 
   DevAssert(ue);
-  int slot_rx = ue->slot_rx;
-  int frame_rx = ue->frame_rx;
+
+  int frame_rx = proc->frame_rx;
+  int subframe_rx = proc->subframe_rx;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_IN);
 
@@ -1720,12 +1675,12 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
     //LOG_I(PHY,"[UE  %d] Frame %d, Trying PBCH %d (NidCell %d, eNB_id %d)\n",ue->Mod_id,frame_rx,pbch_phase,ue->frame_parms.Nid_cell,eNB_id);
     if (abstraction_flag == 0) {
       pbch_tx_ant = rx_pbch(&ue->common_vars,
-                            ue->pbch_vars[eNB_id],
-                            &ue->frame_parms,
-                            eNB_id,
-                            ue->frame_parms.mode1_flag==1?SISO:ALAMOUTI,
-                            ue->high_speed_flag,
-                            pbch_phase);
+			    ue->pbch_vars[eNB_id],
+			    &ue->frame_parms,
+			    eNB_id,
+			    ue->frame_parms.mode1_flag==1?SISO:ALAMOUTI,
+			    ue->high_speed_flag,
+			    pbch_phase);
 
 
 
@@ -1734,8 +1689,8 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 #ifdef PHY_ABSTRACTION
     else {
       pbch_tx_ant = rx_pbch_emul(ue,
-                                 eNB_id,
-                                 pbch_phase);
+				 eNB_id,
+				 pbch_phase);
     }
 
 #endif
@@ -1778,76 +1733,49 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 
     if (first_run) {
       first_run = 0;
-      LOG_I(PHY,"[UE %d] frame %d, slot %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d).\n",
-            ue->Mod_id,
-            frame_rx,
-            slot_rx,
-            pbch_tx_ant,
-            frame_tx,
-            pbch_phase);
-      ue->frame_rx = (ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF);
-      ue->frame_tx = ue->frame_rx;
-      frame_rx = ue->frame_rx;
-    } else if (((frame_tx & 0x03FF) != (ue->frame_rx & 0x03FF))) {
+      LOG_I(PHY,"[UE %d] frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d).\n",
+	    ue->Mod_id,
+	    frame_rx,
+	    subframe_rx,
+	    pbch_tx_ant,
+	    frame_tx,
+	    pbch_phase);
+      proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF);
+      proc->frame_tx = proc->frame_rx;
+      frame_rx = proc->frame_rx;
+    } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) {
       //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) {
-      LOG_D(PHY,"[UE %d] frame %d, slot %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n",
-            ue->Mod_id,
-            ue->frame_rx,
-            slot_rx,
-            pbch_tx_ant,
-            frame_tx,
-            frame_rx & 0x03FF,
-            pbch_phase);
-
-      ue->frame_rx = (ue->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF);
-      ue->frame_tx = ue->frame_rx;
-      frame_rx = ue->frame_rx;
-      /*
-      LOG_D(PHY,"[UE  %d] frame %d, slot %d: PBCH PDU does not match, ignoring it (PBCH ant_tx=%d, frame_tx=%d).\n",
-          ue->Mod_id,
-          ue->frame,
-          slot_rx,
-          pbch_tx_ant,
-          frame_tx);
-      */
-      //ue->pbch_vars[eNB_id]->pdu_errors_conseq = 21; // this will make it go out of sync
-      //ue->pbch_vars[eNB_id]->pdu_errors_conseq += 1; // this will make it go out of sync
+      LOG_D(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%1024=%d, phase %d).\n",
+	    ue->Mod_id,
+	    proc->frame_rx,
+	    subframe_rx,
+	    pbch_tx_ant,
+	    frame_tx,
+	    frame_rx & 0x03FF,
+	    pbch_phase);
+
+      proc->frame_rx = (proc->frame_rx & 0xFFFFFC00) | (frame_tx & 0x000003FF);
+      proc->frame_tx = proc->frame_rx;
+      frame_rx = proc->frame_rx;
+
     }
 
 #ifdef DEBUG_PHY_PROC
-    LOG_D(PHY,"[UE %d] frame %d, slot %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n",
-          ue->Mod_id,
-          frame_rx,
-          slot_rx,
-          ue->frame_parms.mode1_flag,
-          pbch_tx_ant,
-          frame_tx,
-          ue->frame_parms.N_RB_DL,
-          ue->frame_parms.phich_config_common.phich_duration,
-          ue->frame_parms.phich_config_common.phich_resource);
-    /*
-    if (frame_rx%100 == 0) {
-      LOG_I(PHY,"[UE %d] frame %d, slot %d, PBCH: mode1_flag %d, tx_ant %d, frame_tx %d, phase %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6,Frequency offset %d Hz (%d)\n",
-            ue->Mod_id,
-            frame_rx,
-            slot_rx,
-            ue->frame_parms.mode1_flag,
-            pbch_tx_ant,
-            frame_tx,
-            pbch_phase,
-            ue->frame_parms.N_RB_DL,
-            ue->frame_parms.phich_config_common.phich_duration,
-            ue->frame_parms.phich_config_common.phich_resource,
-            ue->common_vars.freq_offset,openair_daq_vars.freq_offset);
-      //dump_frame_parms(&ue->frame_parms);
-
-    }
-      */
+    LOG_D(PHY,"[UE %d] frame %d, subframe %d, Received PBCH (MIB): mode1_flag %d, tx_ant %d, frame_tx %d. N_RB_DL %d, phich_duration %d, phich_resource %d/6!\n",
+	  ue->Mod_id,
+	  frame_rx,
+	  subframe_rx,
+	  ue->frame_parms.mode1_flag,
+	  pbch_tx_ant,
+	  frame_tx,
+	  ue->frame_parms.N_RB_DL,
+	  ue->frame_parms.phich_config_common.phich_duration,
+	  ue->frame_parms.phich_config_common.phich_resource);
 #endif
 
   } else {
     LOG_E(PHY,"[UE %d] frame %d, slot %d, Error decoding PBCH!\n",
-          ue->Mod_id,frame_rx, slot_rx);
+	  ue->Mod_id,frame_rx, subframe_rx);
     ue->pbch_vars[eNB_id]->pdu_errors_conseq++;
     ue->pbch_vars[eNB_id]->pdu_errors++;
     if (ue->mac_enabled == 1) {
@@ -1868,24 +1796,20 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 
 #ifdef DEBUG_PHY_PROC
   LOG_D(PHY,"[UE %d] frame %d, slot %d, PBCH errors = %d, consecutive errors = %d!\n",
-        ue->Mod_id,frame_rx, slot_rx,
-        ue->pbch_vars[eNB_id]->pdu_errors,
-        ue->pbch_vars[eNB_id]->pdu_errors_conseq);
+	ue->Mod_id,frame_rx, subframe_rx,
+	ue->pbch_vars[eNB_id]->pdu_errors,
+	ue->pbch_vars[eNB_id]->pdu_errors_conseq);
 #endif
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PBCH_PROCEDURES, VCD_FUNCTION_OUT);
 }
 
-int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
+int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t abstraction_flag)
 {
 
   unsigned int dci_cnt=0, i;
-  //DCI_PDU *DCI_pdu;
-  //uint16_t ra_RNTI;
 
-
-  int frame_rx = ue->frame_rx;
-  int slot_rx = ue->slot_rx;
-  int subframe_rx = slot_rx>>1;
+  int frame_rx = proc->frame_rx;
+  int subframe_rx = proc->subframe_rx;
 
 
 #ifdef PHY_ABSTRACTION
@@ -1902,29 +1826,29 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_IN);
     rx_pdcch(&ue->common_vars,
-             ue->pdcch_vars,
-             &ue->frame_parms,
-             subframe_rx,
-             eNB_id,
-             (ue->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
-             ue->high_speed_flag,
-             ue->is_secondary_ue);
+	     ue->pdcch_vars,
+	     &ue->frame_parms,
+	     subframe_rx,
+	     eNB_id,
+	     (ue->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
+	     ue->high_speed_flag,
+	     ue->is_secondary_ue);
 
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN);
     dci_cnt = dci_decoding_procedure(ue,
-                                     dci_alloc_rx,
-                                     (ue->UE_mode[eNB_id] < PUSCH)? 1 : 0,  // if we're in PUSCH don't listen to common search space,
-                                     // later when we need paging or RA during connection, update this ...
-                                     eNB_id,subframe_rx);
+				     dci_alloc_rx,
+				     (ue->UE_mode[eNB_id] < PUSCH)? 1 : 0,  // if we're in PUSCH don't listen to common search space,
+				     // later when we need paging or RA during connection, update this ...
+				     eNB_id,subframe_rx);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_OUT);
     //LOG_D(PHY,"[UE  %d][PUSCH] Frame %d subframe %d PHICH RX\n",ue->Mod_id,frame_rx,subframe_rx);
 
     if (is_phich_subframe(&ue->frame_parms,subframe_rx)) {
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_IN);
-      rx_phich(ue,
-               subframe_rx,eNB_id);
+      rx_phich(ue,proc,
+	       subframe_rx,eNB_id);
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PHICH, VCD_FUNCTION_OUT);
     }
   }
@@ -1933,11 +1857,11 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
   else {
     for (i=0; i<NB_eNB_INST; i++) {
       for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++)
-        if (PHY_vars_eNB_g[i][CC_id]->frame_parms.Nid_cell == ue->frame_parms.Nid_cell)
-          break;
+	if (PHY_vars_eNB_g[i][CC_id]->frame_parms.Nid_cell == ue->frame_parms.Nid_cell)
+	  break;
 
       if (CC_id < MAX_NUM_CCs)
-        break;
+	break;
     }
 
     if (i==NB_eNB_INST) {
@@ -1949,59 +1873,28 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 
     LOG_D(PHY,"Calling dci_decoding_proc_emul ...\n");
     dci_cnt = dci_decoding_procedure_emul(ue->pdcch_vars,
-                                          PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[subframe_rx&1],
-                                          PHY_vars_eNB_g[i][CC_id]->num_common_dci[subframe_rx&1],
-                                          PHY_vars_eNB_g[i][CC_id]->dci_alloc[subframe_rx&1],
-                                          dci_alloc_rx,
-                                          eNB_id);
+					  PHY_vars_eNB_g[i][CC_id]->num_ue_spec_dci[subframe_rx&1],
+					  PHY_vars_eNB_g[i][CC_id]->num_common_dci[subframe_rx&1],
+					  PHY_vars_eNB_g[i][CC_id]->dci_alloc[subframe_rx&1],
+					  dci_alloc_rx,
+					  eNB_id);
     //    printf("DCI: dci_cnt %d\n",dci_cnt);
     UE_id = (uint32_t)find_ue((int16_t)ue->pdcch_vars[eNB_id]->crnti,PHY_vars_eNB_g[i][CC_id]);
 
     if (UE_id>=0) {
-      //      msg("Checking PHICH for UE  %d (eNB %d)\n",UE_id,i);
+      //      printf("Checking PHICH for UE  %d (eNB %d)\n",UE_id,i);
       if (is_phich_subframe(&ue->frame_parms,subframe_rx)) {
-        harq_pid = phich_subframe_to_harq_pid(&ue->frame_parms,frame_rx,subframe_rx);
-
-        if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) {
-          // ue->ulsch[eNB_id]->harq_processes[harq_pid]->phich_ACK=1;
-          ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0;
-          ue->ulsch[eNB_id]->harq_processes[harq_pid]->status = IDLE;
-          ue->ulsch_Msg3_active[eNB_id] = 0;
-          ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0;
-          LOG_D(PHY,"Msg3 inactive\n");
-          /* Phich is not abstracted for the moment
-          if (PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->phich_ACK==0) { // NAK
-            if (ue->ulsch_Msg3_active[eNB_id] == 1) {
-          #ifdef DEBUG_PHY_PROC
-              LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received NAK\n",
-            ue->Mod_id,
-            frame_rx,
-            subframe_rx);
-          #endif
-              get_Msg3_alloc_ret(&ue->frame_parms,
-               subframe_rx,
-               frame_rx,
-                   &ue->ulsch_Msg3_frame[eNB_id],
-               &ue->ulsch_Msg3_subframe[eNB_id]);
-            }
-            //      PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-            //      PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->Ndi = 0;
-            //      PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++;
-          }
-          else {
-          #ifdef DEBUG_PHY_PROC
-            if (ue->ulsch_Msg3_active[eNB_id] == 1)
-              LOG_D(PHY,"[UE  %d][RAPROC] Frame %d, subframe %d: Msg3 PHICH, received ACK\n",
-            ue->Mod_id,
-            frame_rx,
-            subframe_rx);
-          #endif
-                  PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0;
-                  PHY_vars_eNB_g[i][CC_id]->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status = IDLE;
-            // inform MAC?
-            ue->ulsch_Msg3_active[eNB_id] = 0;
-          } //phich_ACK */
-        } // harq_pid is ACTIVE
+	harq_pid = phich_subframe_to_harq_pid(&ue->frame_parms,frame_rx,subframe_rx);
+
+	if (ue->ulsch[eNB_id]->harq_processes[harq_pid]->status == ACTIVE) {
+	  // ue->ulsch[eNB_id]->harq_processes[harq_pid]->phich_ACK=1;
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->subframe_scheduling_flag =0;
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->status = IDLE;
+	  ue->ulsch_Msg3_active[eNB_id] = 0;
+	  ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0;
+	  LOG_D(PHY,"Msg3 inactive\n");
+
+	} // harq_pid is ACTIVE
       } // This is a PHICH subframe
     } // UE_id exists
   }
@@ -2009,41 +1902,15 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 #endif
 
   //#ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[UE  %d] Frame %d, slot %d, Mode %s: DCI found %i\n",ue->Mod_id,frame_rx,slot_rx,mode_string[ue->UE_mode[eNB_id]],dci_cnt);
+  LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, Mode %s: DCI found %i\n",ue->Mod_id,frame_rx,subframe_rx,mode_string[ue->UE_mode[eNB_id]],dci_cnt);
   //#endif
 
   ue->pdcch_vars[eNB_id]->dci_received += dci_cnt;
-  /*
-  #ifdef DEBUG_PHY_PROC
-  if (slot_rx==18)
-    debug_LOG_D(PHY,"[UE  %d] Frame %d, slot %d: PDCCH: DCI errors %d, DCI received %d, DCI missed %d, DCI False Detection %d \n",
-        ue->Mod_id,frame_rx,slot_rx,
-        ue->pdcch_vars[eNB_id]->dci_errors,
-        ue->pdcch_vars[eNB_id]->dci_received,
-        ue->pdcch_vars[eNB_id]->dci_missed,
-        ue->pdcch_vars[eNB_id]->dci_false);
-  #endif
-  */
+
 #ifdef EMOS
   //emos_dump_UE.dci_cnt[subframe_rx] = dci_cnt;
 #endif
 
-  /*
-    #ifdef DIAG_PHY
-    //if (ue->UE_mode[eNB_id] == PUSCH)
-    if (dci_cnt > 1) {
-    LOG_D(PHY,"[UE  %d][DIAG] frame %d, subframe %d: received %d>1 DCI!\n",ue->Mod_id,frame_rx,subframe_rx,dci_cnt);
-    ue->pdcch_vars[eNB_id]->dci_false++;
-    }
-    else if (dci_cnt==0) {
-    LOG_D(PHY,"[UE  %d][DIAG] frame %d, subframe %d: received %d DCI!\n",ue->Mod_id,frame_rx,subframe_rx,dci_cnt);
-    ue->pdcch_vars[eNB_id]->dci_missed++;
-    }
-    #endif
-  */
-
-  // dci_cnt = 0;
-  //  ra_RNTI = (ue->prach_resources[eNB_id]) ? ue->prach_resources[eNB_id]->ra_RNTI : 0;
   for (i=0; i<dci_cnt; i++) {
 
 #ifdef DEBUG_PHY_PROC
@@ -2055,36 +1922,22 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 
 #endif
 
-    //if ((ue->UE_mode[eNB_id] != PRACH) &&
-    //    (dci_alloc_rx[i].rnti != 0x1234) &&
-
     if ((ue->UE_mode[eNB_id]>PRACH) &&
 	(dci_alloc_rx[i].rnti == ue->pdcch_vars[eNB_id]->crnti) &&
 	(dci_alloc_rx[i].format != format0)) {
       
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[UE  %d][DCI][PDSCH %x] frame %d, subframe %d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n",
-            ue->Mod_id,dci_alloc_rx[i].rnti,
-            frame_rx,subframe_rx,
-            dci_alloc_rx[i].format,
-            ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
-            ue->pdcch_vars[eNB_id]->nCCE[subframe_rx],
-            get_nCCE(3,&ue->frame_parms,get_mi(&ue->frame_parms,0)));
+	    ue->Mod_id,dci_alloc_rx[i].rnti,
+	    frame_rx,subframe_rx,
+	    dci_alloc_rx[i].format,
+	    ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
+	    ue->pdcch_vars[eNB_id]->nCCE[subframe_rx],
+	    get_nCCE(3,&ue->frame_parms,get_mi(&ue->frame_parms,0)));
 
 
 #endif
-#ifdef DIAG_PHY
-      
-      if (!(((subframe_rx == 7) && (dci_alloc_rx[i].format == format1E_2A_M10PRB)) ||
-            ((subframe_rx == 7) && (dci_alloc_rx[i].format == format1)))) {
-        LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format);
-        ue->pdcch_vars[eNB_id]->dci_errors++;
-        ue->pdcch_vars[eNB_id]->dci_false++;
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
-        return(-1);
-      }
-      
-#endif
+
       
       //      dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
       if ((ue->UE_mode[eNB_id] > PRACH) &&
@@ -2100,86 +1953,61 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 					     0,
 					     P_RNTI)==0)) {
 
-#ifdef DIAG_PHY
-	
-        if (ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs != (((frame_rx%1024)%28))) {
-          LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: wrong mcs!\n",ue->Mod_id,frame_rx,subframe_rx,
-                ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs);
-          dump_dci(&ue->frame_parms,(void *)&dci_alloc_rx[i]);
-        }
-	
-#endif
-	
-	
-        ue->dlsch_received[eNB_id]++;
+	ue->dlsch_received[eNB_id]++;
 	
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format);
-        dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
-        LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",ue->Mod_id,subframe_rx,slot_rx,ue->dlsch[eNB_id][0]->active);
+	LOG_D(PHY,"[UE  %d] Generated UE DLSCH C_RNTI format %d\n",ue->Mod_id,dci_alloc_rx[i].format);
+	dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
+	LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d=> %d\n",ue->Mod_id,subframe_rx,ue->dlsch[eNB_id][0]->active);
 #endif
 	
-        // we received a CRNTI, so we're in PUSCH
-        if (ue->UE_mode[eNB_id] != PUSCH) {
+	// we received a CRNTI, so we're in PUSCH
+	if (ue->UE_mode[eNB_id] != PUSCH) {
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[UE  %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,subframe_rx,ue->pdcch_vars[eNB_id]->crnti);
+	  LOG_D(PHY,"[UE  %d] Frame %d, subframe %d: Received DCI with CRNTI %x => Mode PUSCH\n",ue->Mod_id,frame_rx,subframe_rx,ue->pdcch_vars[eNB_id]->crnti);
 #endif
-          //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
-          ue->UE_mode[eNB_id] = PUSCH;
-          //mac_xface->macphy_exit("Connected. Exiting\n");
-        }
+	  //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
+	  ue->UE_mode[eNB_id] = PUSCH;
+	  //mac_xface->macphy_exit("Connected. Exiting\n");
+	}
       } else {
-        LOG_E(PHY,"[UE  %d] Frame %d, subframe %d: Problem in DCI!\n",ue->Mod_id,frame_rx,subframe_rx);
-        dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
+	LOG_E(PHY,"[UE  %d] Frame %d, subframe %d: Problem in DCI!\n",ue->Mod_id,frame_rx,subframe_rx);
+	dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
       }
     }
 
     else if ((dci_alloc_rx[i].rnti == SI_RNTI) &&
-             ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) {
+	     ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) {
 
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[UE  %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i);
-      /*
-      if (((frame_rx%100) == 0) || (frame_rx < 20))
-      dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
-      */
 #endif
-#ifdef DIAG_PHY
 
-      if ((subframe_rx != 5)) {
-        LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received SI_RNTI!\n",ue->Mod_id,frame_rx,subframe_rx);
-        ue->pdcch_vars[eNB_id]->dci_errors++;
-        ue->pdcch_vars[eNB_id]->dci_false++;
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
-        return(-1);
-      }
-
-#endif
 
       if (generate_ue_dlsch_params_from_dci(frame_rx,
 					    subframe_rx,
-                                            (void *)&dci_alloc_rx[i].dci_pdu,
-                                            SI_RNTI,
-                                            dci_alloc_rx[i].format,
-                                            &ue->dlsch_SI[eNB_id],
-                                            &ue->frame_parms,
-                                            ue->pdsch_config_dedicated,
-                                            SI_RNTI,
-                                            0,
-                                            P_RNTI)==0) {
-
-        ue->dlsch_SI_received[eNB_id]++;
+					    (void *)&dci_alloc_rx[i].dci_pdu,
+					    SI_RNTI,
+					    dci_alloc_rx[i].format,
+					    &ue->dlsch_SI[eNB_id],
+					    &ue->frame_parms,
+					    ue->pdsch_config_dedicated,
+					    SI_RNTI,
+					    0,
+					    P_RNTI)==0) {
+
+	ue->dlsch_SI_received[eNB_id]++;
  
 
 	LOG_D(PHY,"[UE  %d] Frame %d, subframe %d : Generate UE DLSCH SI_RNTI format 1%s\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format==format1A?"A":"C");
-        //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
+	//dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
 
       }
     }
 
     else if ((ue->prach_resources[eNB_id]) &&
-             (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) &&
-             (dci_alloc_rx[i].format == format1A)) {
+	     (dci_alloc_rx[i].rnti == ue->prach_resources[eNB_id]->ra_RNTI) &&
+	     (dci_alloc_rx[i].format == format1A)) {
 
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[UE  %d][RAPROC] subframe %d: Found RA rnti %x, format 1A, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,i);
@@ -2188,57 +2016,32 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
       //dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
       //mac_xface->macphy_exit("so far so good...\n");
 #endif
-#ifdef DIAG_PHY
-
-      if (subframe_rx != 9) {
-        LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received RA_RNTI!\n",ue->Mod_id,frame_rx,subframe_rx);
-        ue->pdcch_vars[eNB_id]->dci_errors++;
-        ue->pdcch_vars[eNB_id]->dci_false++;
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
-        return(-1);
-      }
 
-#endif
 
       if (generate_ue_dlsch_params_from_dci(frame_rx,
 					    subframe_rx,
-                                            (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu,
-                                            ue->prach_resources[eNB_id]->ra_RNTI,
-                                            format1A,
-                                            &ue->dlsch_ra[eNB_id],
-                                            &ue->frame_parms,
-                                            ue->pdsch_config_dedicated,
-                                            SI_RNTI,
-                                            ue->prach_resources[eNB_id]->ra_RNTI,
-                                            P_RNTI)==0) {
-
-        ue->dlsch_ra_received[eNB_id]++;
+					    (DCI1A_5MHz_TDD_1_6_t *)&dci_alloc_rx[i].dci_pdu,
+					    ue->prach_resources[eNB_id]->ra_RNTI,
+					    format1A,
+					    &ue->dlsch_ra[eNB_id],
+					    &ue->frame_parms,
+					    ue->pdsch_config_dedicated,
+					    SI_RNTI,
+					    ue->prach_resources[eNB_id]->ra_RNTI,
+					    P_RNTI)==0) {
+
+	ue->dlsch_ra_received[eNB_id]++;
 
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n",
-              ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]);
+	LOG_D(PHY,"[UE  %d] Generate UE DLSCH RA_RNTI format 1A, rb_alloc %x, dlsch_ra[eNB_id] %p\n",
+	      ue->Mod_id,ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even[0],ue->dlsch_ra[eNB_id]);
 #endif
       }
     } else if( (dci_alloc_rx[i].rnti == ue->pdcch_vars[eNB_id]->crnti) &&
-               (dci_alloc_rx[i].format == format0)) {
+	       (dci_alloc_rx[i].format == format0)) {
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[UE  %d][PUSCH] Frame %d subframe %d: Found rnti %x, format 0, dci_cnt %d\n",
-            ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i);
-      /*
-        if (((frame_rx%100) == 0) || (frame_rx < 20))
-        dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
-      */
-#endif
-#ifdef DIAG_PHY
-
-      if (subframe_rx != 9) {
-        LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format 0!\n",ue->Mod_id,frame_rx,subframe_rx);
-        ue->pdcch_vars[eNB_id]->dci_errors++;
-        ue->pdcch_vars[eNB_id]->dci_false++;
-        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
-        return(-1);
-      }
-
+	    ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i);
 #endif
 
       ue->ulsch_no_allocation_counter[eNB_id] = 0;
@@ -2250,6 +2053,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 					     subframe_rx,
 					     format0,
 					     ue,
+					     proc,
 					     SI_RNTI,
 					     0,
 					     P_RNTI,
@@ -2258,34 +2062,22 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 					     0)==0)) {
 
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx);
+	LOG_D(PHY,"[UE  %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx);
 #endif
 
       }
     } else if( (dci_alloc_rx[i].rnti == ue->ulsch[eNB_id]->cba_rnti[0]) &&
-               (dci_alloc_rx[i].format == format0)) {
+	       (dci_alloc_rx[i].format == format0)) {
       // UE could belong to more than one CBA group
       // ue->Mod_id%ue->ulsch[eNB_id]->num_active_cba_groups]
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[UE  %d][PUSCH] Frame %d subframe %d: Found cba rnti %x, format 0, dci_cnt %d\n",
-            ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i);
+	    ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,i);
       /*
-        if (((frame_rx%100) == 0) || (frame_rx < 20))
-        dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
+	if (((frame_rx%100) == 0) || (frame_rx < 20))
+	dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
       */
 #endif
-      /*
-      #ifdef DIAG_PHY
-      if (subframe_rx != 8) {
-        LOG_E(PHY,"[UE  %d][DIAG] frame %d, subframe %d: should not have received CBA RNTI Format 0!\n",
-        ue->Mod_id,frame_rx,subframe_rx);
-        ue->pdcch_vars[eNB_id]->dci_errors++;
-        ue->pdcch_vars[eNB_id]->dci_false++;
-              VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
-        return(-1);
-      }
-      #endif
-      */
 
       ue->ulsch_no_allocation_counter[eNB_id] = 0;
       //dump_dci(&ue->frame_parms,&dci_alloc_rx[i]);
@@ -2296,6 +2088,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 					     subframe_rx,
 					     format0,
 					     ue,
+					     proc,
 					     SI_RNTI,
 					     0,
 					     P_RNTI,
@@ -2304,49 +2097,31 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,uint8_t abstraction_flag)
 					     0)==0)) {
 
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx);
+	LOG_D(PHY,"[UE  %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",ue->Mod_id,subframe_rx);
 #endif
-        ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++;
+	ue->ulsch[eNB_id]->num_cba_dci[(subframe_rx+4)%10]++;
       }
     }
 
     else {
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[UE  %d] frame %d, subframe %d: received DCI %d with RNTI=%x (C-RNTI:%x, CBA_RNTI %x) and format %d!\n",ue->Mod_id,frame_rx,subframe_rx,i,dci_alloc_rx[i].rnti,
-            ue->pdcch_vars[eNB_id]->crnti,
-            ue->ulsch[eNB_id]->cba_rnti[0],
-            dci_alloc_rx[i].format);
+	    ue->pdcch_vars[eNB_id]->crnti,
+	    ue->ulsch[eNB_id]->cba_rnti[0],
+	    dci_alloc_rx[i].format);
       //      dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
-#endif
-#ifdef DIAG_PHY
-      ue->pdcch_vars[eNB_id]->dci_errors++;
-      ue->pdcch_vars[eNB_id]->dci_false++;
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
-      return(-1);
 #endif
     }
 
   }
-/*
-  if ((frame_rx > 1000) && ((frame_rx&1)==0) && (subframe_rx == 5)) {
-    write_output("rxsig0.m","rxs0", ue->common_vars.rxdata[0],10*ue->frame_parms.samples_per_tti,1,1);
-    write_output("rxsigF0.m","rxsF0", ue->common_vars.rxdataF[0],ue->frame_parms.ofdm_symbol_size*2*((ue->frame_parms.Ncp==0)?14:12),2,1);
-    write_output("H00.m","h00",&(ue->common_vars.dl_ch_estimates[0][0][0]),((ue->frame_parms.Ncp==0)?7:6)*(ue->frame_parms.ofdm_symbol_size),1,1);
-
-    write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",ue->pdcch_vars[eNB_id]->rxdataF_ext[0],3*12*ue->frame_parms.N_RB_DL,1,1);
-    write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",ue->pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*ue->frame_parms.N_RB_DL,1,1);
-    write_output("pdcch_rxF_llr.m","pdcch_llr",ue->pdcch_vars[eNB_id]->llr,2400,1,4);
-    mac_xface->macphy_exit("debug exit");
-  }
-*/ 
+
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT);
   return(0);
 }
 
 
-int phy_procedures_UE_RX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,
-                         relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn)
-{
+int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,
+			 relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn) {
  
   uint16_t l,m,n_symb;
   //  int eNB_id = 0,
@@ -2354,1080 +2129,1005 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag
   uint8_t harq_pid = -1;
   int timing_advance;
   uint8_t pilot1,pilot2,pilot3;
-#ifndef DLSCH_THREAD
   uint8_t i_mod = 0;
   int eNB_id_i = 1;
   uint8_t dual_stream_UE = 0;
-#endif
+
   uint8_t *rar;
   int pmch_flag=0;
   uint8_t sync_area=255;
   int pmch_mcs=-1;
   uint8_t mcch_active=0;
-  int frame_rx = ue->frame_rx;
-  int slot_rx = ue->slot_rx;
-  int subframe_rx = slot_rx>>1;
+  int frame_rx = proc->frame_rx;
+  int subframe_rx = proc->subframe_rx;
   int subframe_prev = (subframe_rx+9)%10;
   int CC_id = ue->CC_id;
+  int slot;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_IN);
 
 
   start_meas(&ue->phy_proc_rx);
+
+  for (slot=0;slot<2;slot++) {
+
 #ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX(%d)\n",
-        (r_type == multicast_relay) ? "RN/UE" : "UE",
-        ue->Mod_id,frame_rx, subframe_rx, slot_rx);
+    LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX (%d)\n",
+	  (r_type == multicast_relay) ? "RN/UE" : "UE",
+	  ue->Mod_id,frame_rx, subframe_rx,slot);
 #endif
 #ifdef EMOS
+   
+    if (subframe_rx == 0) {
+      if (frame_rx%1024 == 0)
+	openair_daq_vars.use_ia_receiver = 0;
+      else
+	openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3;
 
-  if ((slot_rx == 0)) {
-    if (frame_rx%1024 == 0)
-      openair_daq_vars.use_ia_receiver = 0;
-    else
-      openair_daq_vars.use_ia_receiver = (openair_daq_vars.use_ia_receiver+1)%3;
-
-    LOG_D(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n",
-          frame_rx,
-          openair_daq_vars.use_ia_receiver,
-          ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs,
-          ue->bitrate[eNB_id]);
-  }
+      LOG_D(PHY,"[MYEMOS] frame %d, IA receiver %d, MCS %d, bitrate %d\n",
+	    frame_rx,
+	    openair_daq_vars.use_ia_receiver,
+	    ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->mcs,
+	    ue->bitrate[eNB_id]);
+    }
 
 #endif
 
-  if (ue->frame_parms.Ncp == 0) {  // normal prefix
-    pilot1 = 4;
-    pilot2 = 7;
-    pilot3 = 11;
-  } else { // extended prefix
-    pilot1 = 3;
-    pilot2 = 6;
-    pilot3 = 9;
-  }
-
-  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) {
-    if ((slot_rx%2)==0)
-      n_symb = 5;//3;
-    else
-      n_symb = 0;
-  } else {
-    /*
-    if (is_pmch_subframe(frame_rx,subframe_rx,&ue->frame_parms)) {
-      if ((slot_rx%2)==0) {
-    n_symb=2;
-    pmch_flag=1;
-      }
-      else
-    n_symb=0;
+    if (ue->frame_parms.Ncp == 0) {  // normal prefix
+      pilot1 = 4;
+      pilot2 = 7;
+      pilot3 = 11;
+    } else { // extended prefix
+      pilot1 = 3;
+      pilot2 = 6;
+      pilot3 = 9;
     }
-    else*/
-    n_symb = ue->frame_parms.symbols_per_tti/2;
-  }
-
-  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-  // This is normal processing (i.e. not MBSFN)
-  // RX processing of symbols in slot_rx
 
-  
-
-  for (l=0; l<n_symb; l++) {
-    if (abstraction_flag == 0) {
-      start_meas(&ue->ofdm_demod_stats);
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
-
-      slot_fep(ue,
-               l,
-               slot_rx,
-               ue->rx_offset,
-               0,
-	       0);
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
-      stop_meas(&ue->ofdm_demod_stats);
+    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+    if (subframe_select(&ue->frame_parms,subframe_rx) == SF_S) {
+      if (slot==0)
+	n_symb = 5;//3;
+      else
+	n_symb = 0;
+    } else {
+      n_symb = ue->frame_parms.symbols_per_tti/2;
     }
+      
+    //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+    // This is normal processing (i.e. not MBSFN)
+    // RX processing of symbols in slot
 
-    //if (subframe_select(&ue->frame_parms,subframe_rx) == SF_DL)
-    ue_measurement_procedures(l,ue,eNB_id,abstraction_flag,mode);
-
-
-    if ((slot_rx==1) && (l==4-ue->frame_parms.Ncp)) {
+   
 
-      /*
-      ue->ulsch_no_allocation_counter[eNB_id]++;
-
-      if (ue->ulsch_no_allocation_counter[eNB_id] == 10) {
-      #ifdef DEBUG_PHY_PROC
-      msg("[UE  %d] no_allocation : setting mode to PRACH\n",ue->Mod_id);
-      #endif
-      ue->UE_mode[eNB_id] = PRACH;
-      ue->pdcch_vars[eNB_id]->crnti = 0x1234;
+    for (l=0; l<n_symb; l++) {
+      if (abstraction_flag == 0) {
+	start_meas(&ue->ofdm_demod_stats);
+	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_IN);
+
+	slot_fep(ue,
+		 l,
+		 (subframe_rx<<1)+slot,
+		 ue->rx_offset,
+		 0,
+		 0);
+	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SLOT_FEP, VCD_FUNCTION_OUT);
+	stop_meas(&ue->ofdm_demod_stats);
       }
-      */
 
-      ue_pbch_procedures(eNB_id,ue,abstraction_flag);
+      ue_measurement_procedures(l,ue,proc,eNB_id,abstraction_flag,mode);
 
-      /*
-      if (ue->UE_mode[eNB_id] == RA_RESPONSE) {
-        ue->Msg3_timer[eNB_id]--;
-        msg("[UE RAR] frame %d: Msg3_timer %d\n",frame_rx,ue->Msg3_timer);
-
-        if (ue->Msg3_timer[eNB_id] == 0) {
-          LOG_D(PHY,"[UE  %d] Frame %d: Msg3_timer = 0 : setting mode to PRACH\n",ue->Mod_id,frame_rx);
-      // I guess here we also need to tell the RRC
-          ue->UE_mode[eNB_id] = PRACH;
-      ue->pdcch_vars[eNB_id]->crnti = 0x1234;
-      }
-      }
-      */
-    }
+      if ((slot==1) && (l==4-ue->frame_parms.Ncp)) {
 
-#ifdef DLSCH_THREAD
-    if (ue->dlsch[eNB_id][0]->active == 1)  {
-      // activate thread since Chest is now done for slot before slot_rx
-      if (l==0) {
-        LOG_I(PHY,"frame %d, slot_rx %d: Calling rx_pdsch_thread for harq_pid %d\n",frame_rx,slot_rx, ue->dlsch[eNB_id][0]->current_harq_pid);
-
-        if (pthread_mutex_lock (&rx_pdsch_mutex) != 0) {               // Signal MAC_PHY Scheduler
-          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);
-        } else {
-          rx_pdsch_instance_cnt++;
-          (slot_rx == 0) ? (rx_pdsch_slot = 19) : (rx_pdsch_slot = (slot_rx-1));
-          pthread_mutex_unlock (&rx_pdsch_mutex);
-
-          if (rx_pdsch_instance_cnt == 0) {
-            if (pthread_cond_signal(&rx_pdsch_cond) != 0) {
-              LOG_E(PHY,"[UE  %d] ERROR pthread_cond_signal for rx_pdsch_cond\n",ue->Mod_id);
-              VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-            }
-          } else {
-            LOG_W(PHY,"[UE  %d] Frame=%d, Slot=%d, RX_PDSCH thread for rx_pdsch_thread busy!!!\n",ue->Mod_id,frame_rx,slot_rx);
-            VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-          }
-        }
+	ue_pbch_procedures(eNB_id,ue,proc,abstraction_flag);
 
-        // trigger DLSCH decoding thread
-        if ((slot_rx%2)==1) // odd slots
-          ue->dlsch[eNB_id][0]->active = 0;
       }
-    }
-
-#endif
-
-    // process last DLSCH symbols + invoke decoding
-    if (((slot_rx%2)==0) && (l==0)) {
-      // Regular PDSCH
-      LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",ue->Mod_id,subframe_prev,ue->dlsch[eNB_id][0]->active);
-
-      if (ue->dlsch[eNB_id][0]->active == 1) {
-#ifndef DLSCH_THREAD //USER_MODE
-        harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid;
-        LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",ue->Mod_id,subframe_prev,harq_pid);
-
-        if ((ue->transmission_mode[eNB_id] == 5) &&
-            (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-            (ue->use_ia_receiver ==1)) {
-          dual_stream_UE = 1;
-          eNB_id_i = ue->n_connected_eNB;
-          i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm;
-
-          if (frame_rx%100==0) {
-            LOG_I(PHY,"using IA receiver\n");
-          }
-        } else {
-          dual_stream_UE = 0;
-          eNB_id_i = eNB_id+1;
-          i_mod = 0;
-        }
-
-        // process symbols 10,11,12 and trigger DLSCH decoding
-        if (abstraction_flag == 0) {
-
-          start_meas(&ue->dlsch_llr_stats);
-
-          for (m=pilot3; m<ue->frame_parms.symbols_per_tti; m++) {
-
-            rx_pdsch(ue,
-                     PDSCH,
-                     eNB_id,
-                     eNB_id_i,
-                     subframe_prev,  // subframe
-                     m,                    // symbol
-                     0,                    // first_symbol_flag
-                     dual_stream_UE,
-                     i_mod,
-                     ue->dlsch[eNB_id][0]->current_harq_pid);
-          }
-
-          stop_meas(&ue->dlsch_llr_stats);
-        }
-
-        ue->dlsch[eNB_id][0]->active = 0;
-
-	//#ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n",
-              ue->Mod_id,
-              ue->dlsch[eNB_id][0]->rnti,
-              harq_pid,
-              (subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev);
-	//#endif
-
-        if (ue->dlsch[eNB_id][0]) {
-          if (abstraction_flag == 0) {
-            ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&ue->frame_parms,
-                ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
-                ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
-                ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm,
-                ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl,
-                ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
-                frame_rx,subframe_prev);
-            start_meas(&ue->dlsch_unscrambling_stats);
-            dlsch_unscrambling(&ue->frame_parms,
-                               0,
-                               ue->dlsch[0][0],
-                               ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G,
-                               ue->pdsch_vars[eNB_id]->llr[0],
-                               0,
-                               subframe_prev<<1);
-            stop_meas(&ue->dlsch_unscrambling_stats);
-
-            start_meas(&ue->dlsch_decoding_stats);
-            ret = dlsch_decoding(ue,
-                                 ue->pdsch_vars[eNB_id]->llr[0],
-                                 &ue->frame_parms,
-                                 ue->dlsch[eNB_id][0],
-                                 ue->dlsch[eNB_id][0]->harq_processes[harq_pid],
-                                 subframe_prev,
-                                 harq_pid,
-                                 1,ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb>10 ? 1 : 0);
-            stop_meas(&ue->dlsch_decoding_stats);
-          }
+     
+      // process last DLSCH symbols + invoke decoding
+      if ((slot==0) && 
+	  (l==0)) {
+	// Regular PDSCH
+	LOG_D(PHY,"[UE %d] dlsch->active in subframe %d => %d\n",ue->Mod_id,subframe_prev,ue->dlsch[eNB_id][0]->active);
+
+       
+	if (ue->dlsch[eNB_id][0]->active == 1) {
+
+	  harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid;
+	  LOG_D(PHY,"[UE %d] PDSCH active in subframe %d, harq_pid %d\n",ue->Mod_id,subframe_prev,harq_pid);
+
+	  if ((ue->transmission_mode[eNB_id] == 5) &&
+	      (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
+	      (ue->use_ia_receiver ==1)) {
+	    dual_stream_UE = 1;
+	    eNB_id_i = ue->n_connected_eNB;
+	    i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm;
+
+	    if (frame_rx%100==0) {
+	      LOG_I(PHY,"using IA receiver\n");
+	    }
+	  } else {
+	    dual_stream_UE = 0;
+	    eNB_id_i = eNB_id+1;
+	    i_mod = 0;
+	  }
+	 	 
+	  // process symbols 10,11,12 and trigger DLSCH decoding
+	  if (abstraction_flag == 0) {
+
+	    start_meas(&ue->dlsch_llr_stats);
+
+	    for (m=pilot3; m<ue->frame_parms.symbols_per_tti; m++) {
+
+	      rx_pdsch(ue,
+		       PDSCH,
+		       eNB_id,
+		       eNB_id_i,
+		       subframe_prev,  // subframe
+		       m,                    // symbol
+		       0,                    // first_symbol_flag
+		       dual_stream_UE,
+		       i_mod,
+		       ue->dlsch[eNB_id][0]->current_harq_pid);
+	    }
 
-          else {
-            LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
+	    stop_meas(&ue->dlsch_llr_stats);
+	  }
+	 
+	  ue->dlsch[eNB_id][0]->active = 0;
+
+	 
+       
+	  //#ifdef DEBUG_PHY_PROC
+	  LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d Scheduling DLSCH decoding\n",
+		ue->Mod_id,
+		ue->dlsch[eNB_id][0]->rnti,
+		harq_pid,
+		(subframe_prev == 9) ? (frame_rx-1) : frame_rx,subframe_prev);
+	  //#endif
+
+	  if (ue->dlsch[eNB_id][0]) {
+	    if (abstraction_flag == 0) {
+	      ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G = get_G(&ue->frame_parms,
+									ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb,
+									ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rb_alloc_even,
+									ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm,
+									ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Nl,
+									ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
+									frame_rx,subframe_prev);
+	      start_meas(&ue->dlsch_unscrambling_stats);
+	      dlsch_unscrambling(&ue->frame_parms,
+				 0,
+				 ue->dlsch[0][0],
+				 ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->G,
+				 ue->pdsch_vars[eNB_id]->llr[0],
+				 0,
+				 subframe_prev<<1);
+	      stop_meas(&ue->dlsch_unscrambling_stats);
+
+	      start_meas(&ue->dlsch_decoding_stats);
+	      ret = dlsch_decoding(ue,
+				   ue->pdsch_vars[eNB_id]->llr[0],
+				   &ue->frame_parms,
+				   ue->dlsch[eNB_id][0],
+				   ue->dlsch[eNB_id][0]->harq_processes[harq_pid],
+				   subframe_prev,
+				   harq_pid,
+				   1,ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->nb_rb>10 ? 1 : 0);
+	      stop_meas(&ue->dlsch_decoding_stats);
+	    }
+	   
+	    else {
+	      LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
 #ifdef PHY_ABSTRACTION
-            ret = dlsch_decoding_emul(ue,
-                                      subframe_prev,
-                                      2,
-                                      eNB_id);
+	      ret = dlsch_decoding_emul(ue,
+					subframe_prev,
+					2,
+					eNB_id);
 #endif
-          }
+	    }
 
-          if (ret == (1+ue->dlsch[eNB_id][0]->max_turbo_iterations)) {
-            ue->dlsch_errors[eNB_id]++;
+	    if (ret == (1+ue->dlsch[eNB_id][0]->max_turbo_iterations)) {
+	      ue->dlsch_errors[eNB_id]++;
 
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n",
-                  ue->Mod_id,ue->dlsch[eNB_id][0]->rnti,
-                  harq_pid,frame_rx,subframe_prev,
-                  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx,
-                  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs,
-                  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS);
-/*
-            if (abstraction_flag ==0 )
-              dump_dlsch(ue,eNB_id,subframe_prev,harq_pid);
-            mac_xface->macphy_exit("");
-*/
-#endif
-          } else {
-            LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d (slot_rx %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
-                  ue->Mod_id,ue->dlsch[eNB_id][0]->rnti,
-                  harq_pid,frame_rx,subframe_prev,slot_rx,
-                  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx,
-                  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs,
-                  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS);
+	      LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d DLSCH in error (rv %d,mcs %d,TBS %d)\n",
+		    ue->Mod_id,ue->dlsch[eNB_id][0]->rnti,
+		    harq_pid,frame_rx,subframe_prev,
+		    ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx,
+		    ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs,
+		    ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS);
+
+#endif
+	    } else {
+	      LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d (slot %d): Received DLSCH (rv %d,mcs %d,TBS %d)\n",
+		    ue->Mod_id,ue->dlsch[eNB_id][0]->rnti,
+		    harq_pid,frame_rx,subframe_prev,slot,
+		    ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx,
+		    ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs,
+		    ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS);
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_DLSCH
-            int j;
-            LOG_D(PHY,"dlsch harq_pid %d (rx): \n",ue->dlsch[eNB_id][0]->current_harq_pid);
-
-            for (j=0; j<ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3; j++)
-              LOG_T(PHY,"%x.",ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b[j]);
-
-            LOG_T(PHY,"\n");
-#endif
-#endif
-	    if (ue->mac_enabled == 1) {
-	      mac_xface->ue_send_sdu(ue->Mod_id,
-				     CC_id,
-				     frame_rx,
-				     ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b,
-				     ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3,
-				     eNB_id);
+	      int j;
+	      LOG_D(PHY,"dlsch harq_pid %d (rx): \n",ue->dlsch[eNB_id][0]->current_harq_pid);
+
+	      for (j=0; j<ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3; j++)
+		LOG_T(PHY,"%x.",ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b[j]);
+
+	      LOG_T(PHY,"\n");
+#endif
+#endif
+	     
+	      if (ue->mac_enabled == 1) {
+		mac_xface->ue_send_sdu(ue->Mod_id,
+				       CC_id,
+				       frame_rx,
+				       ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->b,
+				       ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS>>3,
+				       eNB_id);
+	      }
+	      ue->total_TBS[eNB_id] =  ue->total_TBS[eNB_id] +
+		ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS;
+	      ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] +
+		ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS;
 	    }
-            ue->total_TBS[eNB_id] =  ue->total_TBS[eNB_id] +
-                                              ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS;
-            ue->total_received_bits[eNB_id] = ue->total_TBS[eNB_id] +
-                ue->dlsch[eNB_id][0]->harq_processes[ue->dlsch[eNB_id][0]->current_harq_pid]->TBS;
-          }
-        }
-
+	  }
+	 
 
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
-              ue->Mod_id,
-              ue->dlsch[eNB_id][0]->rnti,harq_pid,
-              frame_rx,subframe_prev,ret,
-              ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs,
-              ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx,
-              ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS);
-
-        if (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",
-                ue->Mod_id,ue->dlsch[eNB_id][0]->rnti,
-                frame_rx,subframe_prev,
-                ue->dlsch_errors[eNB_id],
-                ue->dlsch_received[eNB_id],
-                ue->dlsch_fer[eNB_id],
-                ue->measurements.wideband_cqi_tot[eNB_id]);
-        }
+	  LOG_D(PHY,"[UE  %d][PDSCH %x/%d] Frame %d subframe %d: PDSCH/DLSCH decoding iter %d (mcs %d, rv %d, TBS %d)\n",
+		ue->Mod_id,
+		ue->dlsch[eNB_id][0]->rnti,harq_pid,
+		frame_rx,subframe_prev,ret,
+		ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->mcs,
+		ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->rvidx,
+		ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->TBS);
+
+	  if (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",
+		  ue->Mod_id,ue->dlsch[eNB_id][0]->rnti,
+		  frame_rx,subframe_prev,
+		  ue->dlsch_errors[eNB_id],
+		  ue->dlsch_received[eNB_id],
+		  ue->dlsch_fer[eNB_id],
+		  ue->measurements.wideband_cqi_tot[eNB_id]);
+	  }
 
 #endif
-#endif //DLSCH_THREAD
-      } else {
-        //  printf("PDSCH inactive in subframe %d\n",subframe_rx-1);
-        ue->dlsch[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0;
-      }
 
-      // SI_DLSCH
-      if (ue->dlsch_SI[eNB_id]->active == 1) {
+	} else {
+	  //  printf("PDSCH inactive in subframe %d\n",subframe_rx-1);
+	  ue->dlsch[eNB_id][0]->harq_ack[subframe_prev].send_harq_status = 0;
+	}
+
+       
+	// SI_DLSCH
+	if (ue->dlsch_SI[eNB_id]->active == 1) {
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev);
+	  LOG_D(PHY,"SI is active in subframe %d\n",subframe_prev);
 #endif
 
-        // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding
-        if (abstraction_flag==0) {
-          start_meas(&ue->dlsch_llr_stats);
+	  // process symbols 10,11,12 (13) of last SF and trigger DLSCH decoding
+	  if (abstraction_flag==0) {
+	    start_meas(&ue->dlsch_llr_stats);
 
-          for (m=pilot3; m<ue->frame_parms.symbols_per_tti; m++) {
+	    for (m=pilot3; m<ue->frame_parms.symbols_per_tti; m++) {
 #ifdef DEBUG_PHY_PROC
 
-            LOG_D(PHY,"[UE  %d] Frame %d, slot %d: DLSCH (SI) demod between pilot 3 and 4 (2nd slot), m %d\n",
-                  ue->Mod_id,frame_rx,slot_rx,m);
+	      LOG_D(PHY,"[UE  %d] Frame %d, subframe %d: DLSCH (SI) demod between pilot 3 and 4 (2nd slot), m %d\n",
+		    ue->Mod_id,frame_rx,subframe_rx,m);
 
 #endif
-            rx_pdsch(ue,
-                     SI_PDSCH,
-                     eNB_id,
-                     eNB_id+1,
-                     subframe_prev,  // subframe,
-                     m,
-                     0,
-                     0,
-                     ue->is_secondary_ue,
-                     ue->dlsch_SI[eNB_id]->current_harq_pid);
-          }
+	      rx_pdsch(ue,
+		       SI_PDSCH,
+		       eNB_id,
+		       eNB_id+1,
+		       subframe_prev,  // subframe,
+		       m,
+		       0,
+		       0,
+		       ue->is_secondary_ue,
+		       ue->dlsch_SI[eNB_id]->current_harq_pid);
+	    }
 
-          stop_meas(&ue->dlsch_llr_stats);
-        }
+	    stop_meas(&ue->dlsch_llr_stats);
+	  }
 
-        //  write_output("dlsch_ra_llr.m","llr",pdsch_vars_ra[eNB_id]->llr[0],40,1,0);
+	  //  write_output("dlsch_ra_llr.m","llr",pdsch_vars_ra[eNB_id]->llr[0],40,1,0);
 
-        ue->dlsch_SI[eNB_id]->active = 0;
+	  ue->dlsch_SI[eNB_id]->active = 0;
 
-        if (frame_rx < ue->dlsch_SI_errors[eNB_id])
-          ue->dlsch_SI_errors[eNB_id]=0;
+	  if (frame_rx < ue->dlsch_SI_errors[eNB_id])
+	    ue->dlsch_SI_errors[eNB_id]=0;
 
-        if (ue->dlsch_SI[eNB_id]) {
+	  if (ue->dlsch_SI[eNB_id]) {
 
-          if (abstraction_flag==0) {
+	    if (abstraction_flag==0) {
 
-            //          dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
-            ue->dlsch_SI[eNB_id]->harq_processes[0]->G =
-              get_G(&ue->frame_parms,
-                    ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb,
-                    ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even,
-                    2,
-		    1,
-                    ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
-                    frame_rx,subframe_prev);
+	      //          dump_dci(&ue->frame_parms, &dci_alloc_rx[i]);
+	      ue->dlsch_SI[eNB_id]->harq_processes[0]->G =
+		get_G(&ue->frame_parms,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even,
+		      2,
+		      1,
+		      ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
+		      frame_rx,subframe_prev);
 
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb,
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->G,
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS,
-                  ue->pdcch_vars[eNB_id]->num_pdcch_symbols);
-#endif
-
-
-            dlsch_unscrambling(&ue->frame_parms,
-                               0,
-                               ue->dlsch_SI[eNB_id],
-                               ue->dlsch_SI[eNB_id]->harq_processes[0]->G,
-                               ue->pdsch_vars_SI[eNB_id]->llr[0],
-                               0,
-                               subframe_prev<<1);
-
-            ret = dlsch_decoding(ue,
-                                 ue->pdsch_vars_SI[eNB_id]->llr[0],
-                                 &ue->frame_parms,
-                                 ue->dlsch_SI[eNB_id],
-                                 ue->dlsch_SI[eNB_id]->harq_processes[0],
-                                 subframe_prev,
-                                 ue->dlsch_SI[eNB_id]->current_harq_pid,
-                                 0,0);
+	      LOG_D(PHY,"Decoding DLSCH_SI : rb_alloc %x : nb_rb %d G %d TBS %d, num_pdcch_sym %d\n",ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
+		    ue->dlsch_SI[eNB_id]->harq_processes[0]->nb_rb,
+		    ue->dlsch_SI[eNB_id]->harq_processes[0]->G,
+		    ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS,
+		    ue->pdcch_vars[eNB_id]->num_pdcch_symbols);
+#endif
+
+
+	      dlsch_unscrambling(&ue->frame_parms,
+				 0,
+				 ue->dlsch_SI[eNB_id],
+				 ue->dlsch_SI[eNB_id]->harq_processes[0]->G,
+				 ue->pdsch_vars_SI[eNB_id]->llr[0],
+				 0,
+				 subframe_prev<<1);
+
+	      ret = dlsch_decoding(ue,
+				   ue->pdsch_vars_SI[eNB_id]->llr[0],
+				   &ue->frame_parms,
+				   ue->dlsch_SI[eNB_id],
+				   ue->dlsch_SI[eNB_id]->harq_processes[0],
+				   subframe_prev,
+				   ue->dlsch_SI[eNB_id]->current_harq_pid,
+				   0,0);
 
 #ifdef DEBUG_PHY_PROC
 
-            for (int i=0; i<11; i++)
-              LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,ue->dlsch_SI[eNB_id]->harq_processes[0]->c[0][i]);
+	      for (int i=0; i<11; i++)
+		LOG_D(PHY,"dlsch_output_buffer[%d]=%x\n",i,ue->dlsch_SI[eNB_id]->harq_processes[0]->c[0][i]);
 
 #endif
 
-          }
+	     
+	   
+	 
+       
+     
 
 #ifdef PHY_ABSTRACTION
-          else {
-            LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
-            ret = dlsch_decoding_emul(ue,
-                                      subframe_prev,
-                                      0,
-                                      eNB_id);
-          }
+	      else {
+		LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
+		ret = dlsch_decoding_emul(ue,
+					  subframe_prev,
+					  0,
+					  eNB_id);
+	      }
 
 #endif
-
-          if (ret == (1+ue->dlsch_SI[eNB_id]->max_turbo_iterations)) {
-            ue->dlsch_SI_errors[eNB_id]++;
+	     
+	   
+	 
+       
+	       
+	      if (ret == (1+ue->dlsch_SI[eNB_id]->max_turbo_iterations)) {
+		ue->dlsch_SI_errors[eNB_id]++;
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
-		  ue->Mod_id,
-		  frame_rx,
-		  subframe_prev,
-		  ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS,
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs,
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx,
-		  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1],
-		  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2],
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
-#endif
- 
-	    //	      dump_dlsch_SI(ue,eNB_id,subframe_prev);
-            VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-            stop_meas(&ue->phy_proc_rx);
-	    return(-1);
-          } else {
-
-
+		LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI in error (TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
+		      ue->Mod_id,
+		      frame_rx,
+		      subframe_prev,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1],
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2],
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
+#endif
+		 
+		//	      dump_dlsch_SI(ue,eNB_id,subframe_prev);
+		VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+		stop_meas(&ue->phy_proc_rx);
+		return(-1);
+	      } else {
+		 
+		 
 #ifdef DEBUG_PHY_PROC
-            //if ((frame_rx % 100) == 0)
-            LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
-                  ue->Mod_id,frame_rx,subframe_prev,
-		  ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS,
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs,
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx,
-		  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1],
-		  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2],
-                  ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
-#endif
-
-	    if (ue->mac_enabled == 1) {
-	      /*
-		printf("\n\n");
-		for (i=0;i<ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3;i++)
-		printf("%02x ",ue->dlsch_SI[eNB_id]->harq_processes[0]->b[i]);
-		printf("\n");
-	      */
-	      mac_xface->ue_decode_si(ue->Mod_id,
-				      CC_id,
-				      frame_rx,
-				      eNB_id,
-				      ue->dlsch_SI[eNB_id]->harq_processes[0]->b,
-				      ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3);
+		LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received SI for TBS %d, mcs %d, rvidx %d, rballoc %X.%X.%X.%X\n",
+		      ue->Mod_id,frame_rx,subframe_prev,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rvidx,
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[0],
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[1],
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[2],
+		      ue->dlsch_SI[eNB_id]->harq_processes[0]->rb_alloc_even[3]);
+#endif
+		 
+		if (ue->mac_enabled == 1) {
+		  mac_xface->ue_decode_si(ue->Mod_id,
+					  CC_id,
+					  frame_rx,
+					  eNB_id,
+					  ue->dlsch_SI[eNB_id]->harq_processes[0]->b,
+					  ue->dlsch_SI[eNB_id]->harq_processes[0]->TBS>>3);
+		}
+	      }
 	    }
-          }
-        }
-
-        /*
-        #ifdef DEBUG_PHY_PROC
-        debug_LOG_D(PHY,"[UE  %d] Frame %d, slot %d: dlsch_decoding (SI) ret %d (%d errors)\n",
-            ue->Mod_id,frame_rx,slot_rx,ret,ue->dlsch_SI_errors[eNB_id]);
-        #endif
-        */
-      }
-
-
-      if (ue->dlsch_ra[eNB_id]->active == 1) {
+	  }
+	}
+       
+	if (ue->dlsch_ra[eNB_id]->active == 1) {
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[UE  %d] Frame %d, slot %d: DLSCH (RA) demod symbols 10,11,12\n",ue->Mod_id,frame_rx,slot_rx);
-#endif
-
-        // process symbols 10,11,12 and trigger DLSCH decoding
-        if (abstraction_flag==0) {
-          start_meas(&ue->dlsch_llr_stats);
-
-          for (m=pilot3; m<ue->frame_parms.symbols_per_tti; m++)
-            rx_pdsch(ue,
-                     RA_PDSCH,
-                     eNB_id,
-                     eNB_id+1,
-                     subframe_prev,  // subframe,
-                     m, // symbol
-                     0, // first_symbol_flag
-                     0,
-                     ue->is_secondary_ue,
-                     ue->dlsch_ra[eNB_id]->current_harq_pid);
-        }
-
-        stop_meas(&ue->dlsch_llr_stats);
-
-        ue->dlsch_ra[eNB_id]->active = 0;
-
-        if (frame_rx < ue->dlsch_ra_errors[eNB_id])
-          ue->dlsch_ra_errors[eNB_id]=0;
-
-        if (ue->prach_resources[eNB_id]!=NULL)
-          ue->dlsch_ra[eNB_id]->rnti = ue->prach_resources[eNB_id]->ra_RNTI;
-        else {
-          LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",ue->Mod_id,frame_rx,subframe_prev);
-          mac_xface->macphy_exit("prach_resources is NULL");
-          VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-          stop_meas(&ue->phy_proc_rx);
-          return 0;
-        }
+	  LOG_D(PHY,"[UE  %d] Frame %d, subframe %d: DLSCH (RA) demod symbols 10,11,12\n",ue->Mod_id,frame_rx,subframe_rx);
+#endif
+	   
+	  // process symbols 10,11,12 and trigger DLSCH decoding
+	  if (abstraction_flag==0) {
+	    start_meas(&ue->dlsch_llr_stats);
+	     
+	    for (m=pilot3; m<ue->frame_parms.symbols_per_tti; m++)
+	      rx_pdsch(ue,
+		       RA_PDSCH,
+		       eNB_id,
+		       eNB_id+1,
+		       subframe_prev,  // subframe,
+		       m, // symbol
+		       0, // first_symbol_flag
+		       0,
+		       ue->is_secondary_ue,
+		       ue->dlsch_ra[eNB_id]->current_harq_pid);
+	  }
+	   
+	  stop_meas(&ue->dlsch_llr_stats);
+	   
+	  ue->dlsch_ra[eNB_id]->active = 0;
+	   
+	  if (frame_rx < ue->dlsch_ra_errors[eNB_id])
+	    ue->dlsch_ra_errors[eNB_id]=0;
+
+	  if (ue->prach_resources[eNB_id]!=NULL)
+	    ue->dlsch_ra[eNB_id]->rnti = ue->prach_resources[eNB_id]->ra_RNTI;
+	  else {
+	    LOG_E(PHY,"[UE %d] Frame %d, subframe %d: FATAL, prach_resources is NULL\n",ue->Mod_id,frame_rx,subframe_prev);
+	    mac_xface->macphy_exit("prach_resources is NULL");
+	    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+	    stop_meas(&ue->phy_proc_rx);
+	    return 0;
+	  }
 
-        if (abstraction_flag==0) {
-          ue->dlsch_ra[eNB_id]->harq_processes[0]->G = get_G(&ue->frame_parms,
-									 ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb,
-									 ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even,
-									 2,
-									 1,
-									 ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
-              frame_rx,
-              subframe_prev);
+	  if (abstraction_flag==0) {
+	    ue->dlsch_ra[eNB_id]->harq_processes[0]->G = get_G(&ue->frame_parms,
+							       ue->dlsch_ra[eNB_id]->harq_processes[0]->nb_rb,
+							       ue->dlsch_ra[eNB_id]->harq_processes[0]->rb_alloc_even,
+							       2,
+							       1,
+							       ue->pdcch_vars[eNB_id]->num_pdcch_symbols,
+							       frame_rx,
+							       subframe_prev);
 
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[UE] decoding RA (subframe %d): G %d,rnti %x\n" ,subframe_prev,
-                ue->dlsch_ra[eNB_id]->harq_processes[0]->G,
-                ue->dlsch_ra[eNB_id]->rnti);
-#endif
-
-          dlsch_unscrambling(&ue->frame_parms,
-                             0,
-                             ue->dlsch_ra[eNB_id],
-                             ue->dlsch_ra[eNB_id]->harq_processes[0]->G,
-                             ue->pdsch_vars_ra[eNB_id]->llr[0],
-                             0,
-                             subframe_prev<<1);
-
-          ret = dlsch_decoding(ue,
-                               ue->pdsch_vars_ra[eNB_id]->llr[0],
-                               &ue->frame_parms,
-                               ue->dlsch_ra[eNB_id],
-                               ue->dlsch_ra[eNB_id]->harq_processes[0],
-                               subframe_prev,  // subframe
-			       ue->dlsch_ra[eNB_id]->current_harq_pid,
-                               0,0);
-        }
+	    LOG_D(PHY,"[UE] decoding RA (subframe %d): G %d,rnti %x\n" ,subframe_prev,
+		  ue->dlsch_ra[eNB_id]->harq_processes[0]->G,
+		  ue->dlsch_ra[eNB_id]->rnti);
+#endif
+
+	    dlsch_unscrambling(&ue->frame_parms,
+			       0,
+			       ue->dlsch_ra[eNB_id],
+			       ue->dlsch_ra[eNB_id]->harq_processes[0]->G,
+			       ue->pdsch_vars_ra[eNB_id]->llr[0],
+			       0,
+			       subframe_prev<<1);
+
+	    ret = dlsch_decoding(ue,
+				 ue->pdsch_vars_ra[eNB_id]->llr[0],
+				 &ue->frame_parms,
+				 ue->dlsch_ra[eNB_id],
+				 ue->dlsch_ra[eNB_id]->harq_processes[0],
+				 subframe_prev,  // subframe
+				 ue->dlsch_ra[eNB_id]->current_harq_pid,
+				 0,0);
+	  }
 
 #ifdef PHY_ABSTRACTION
-        else {
-          LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
-          ret = dlsch_decoding_emul(ue,
-                                    subframe_prev,
-                                    1,
-                                    eNB_id);
-        }
+	  else {
+	    LOG_D(PHY,"Calling dlsch_decoding_emul ...\n");
+	    ret = dlsch_decoding_emul(ue,
+				      subframe_prev,
+				      1,
+				      eNB_id);
+	  }
 
 #endif
 
-        if (ret == (1+ue->dlsch_ra[eNB_id]->max_turbo_iterations)) {
-          ue->dlsch_ra_errors[eNB_id]++;
-          LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received RA in error\n",ue->Mod_id,frame_rx,subframe_prev);
+	 
+	   
+	  if (ret == (1+ue->dlsch_ra[eNB_id]->max_turbo_iterations)) {
+	    ue->dlsch_ra_errors[eNB_id]++;
+	    LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received RA in error\n",ue->Mod_id,frame_rx,subframe_prev);
 
-	  //          dump_dlsch_ra(ue,eNB_id,subframe_prev); exit(-1);
+	    //          dump_dlsch_ra(ue,eNB_id,subframe_prev); exit(-1);
 
-          //    oai_exit=1;
-          VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
-          stop_meas(&ue->phy_proc_rx);
-          return(-1);
+	    //    oai_exit=1;
+	    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
+	    stop_meas(&ue->phy_proc_rx);
+	    return(-1);
 
-        } else {
+	  } else {
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Received RAR  mode %d\n",
-                ue->Mod_id,
-                frame_rx,
-                subframe_prev, ue->UE_mode[eNB_id]);
-#endif
-
-	  if (ue->mac_enabled == 1) {
-          if ((ue->UE_mode[eNB_id] != PUSCH) && (ue->prach_resources[eNB_id]->Msg3!=NULL)) {
-            LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n",
-                  ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0),
-                  subframe_prev,
-                  ue->prach_resources[eNB_id]->ra_PreambleIndex);
-
-            timing_advance = mac_xface->ue_process_rar(ue->Mod_id,
-                             CC_id,
-                             frame_rx-((subframe_prev==0) ? 1 : 0),
-                             ue->dlsch_ra[eNB_id]->harq_processes[0]->b,
-                             &ue->pdcch_vars[eNB_id]->crnti,
-                             ue->prach_resources[eNB_id]->ra_PreambleIndex);
-
-
-            if (timing_advance!=0xffff) {
-
-              LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n",
-                    ue->Mod_id,
-                    frame_rx-((subframe_prev==9) ? 1 : 0),
-                    subframe_prev,
-                    ue->pdcch_vars[eNB_id]->crnti,
-                    timing_advance);
-
-              //timing_advance = 0;
-              process_timing_advance_rar(ue,timing_advance);
-
-              if (mode!=debug_prach) {
-                ue->ulsch_Msg3_active[eNB_id]=1;
-                get_Msg3_alloc(&ue->frame_parms,
-                               subframe_prev,
-                               frame_rx-((subframe_prev==9) ? 1 : 0),
-                               &ue->ulsch_Msg3_frame[eNB_id],
-                               &ue->ulsch_Msg3_subframe[eNB_id]);
-
-                LOG_D(PHY,"[UE  %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n",
-                      ue->Mod_id,
-                      frame_rx-((subframe_prev==9) ? 1 : 0),
-                      subframe_prev,
-                      ue->ulsch_Msg3_frame[eNB_id],
-                      ue->ulsch_Msg3_subframe[eNB_id]);
-                harq_pid = subframe2harq_pid(&ue->frame_parms,
-                                             ue->ulsch_Msg3_frame[eNB_id],
-                                             ue->ulsch_Msg3_subframe[eNB_id]);
-                ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0;
-
-                ue->UE_mode[eNB_id] = RA_RESPONSE;
-                //      ue->Msg3_timer[eNB_id] = 10;
-                ue->ulsch[eNB_id]->power_offset = 6;
-                ue->ulsch_no_allocation_counter[eNB_id] = 0;
-              }
-            } else { // PRACH preamble doesn't match RAR
-              LOG_W(PHY,"[UE  %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n",
-                    ue->Mod_id,
-                    ue->prach_resources[eNB_id]->ra_PreambleIndex);
-            }
-          } // mode != PUSCH
-	  }
+	    LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Received RAR  mode %d\n",
+		  ue->Mod_id,
+		  frame_rx,
+		  subframe_prev, ue->UE_mode[eNB_id]);
+#endif
+
+	    if (ue->mac_enabled == 1) {
+	      if ((ue->UE_mode[eNB_id] != PUSCH) && (ue->prach_resources[eNB_id]->Msg3!=NULL)) {
+		LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Invoking MAC for RAR (current preamble %d)\n",
+		      ue->Mod_id,frame_rx-((subframe_prev==9) ? 1 : 0),
+		      subframe_prev,
+		      ue->prach_resources[eNB_id]->ra_PreambleIndex);
+
+		timing_advance = mac_xface->ue_process_rar(ue->Mod_id,
+							   CC_id,
+							   frame_rx-((subframe_prev==0) ? 1 : 0),
+							   ue->dlsch_ra[eNB_id]->harq_processes[0]->b,
+							   &ue->pdcch_vars[eNB_id]->crnti,
+							   ue->prach_resources[eNB_id]->ra_PreambleIndex);
+
+
+		if (timing_advance!=0xffff) {
+
+		  LOG_D(PHY,"[UE  %d][RAPROC] Frame %d subframe %d Got rnti %x and timing advance %d from RAR\n",
+			ue->Mod_id,
+			frame_rx-((subframe_prev==9) ? 1 : 0),
+			subframe_prev,
+			ue->pdcch_vars[eNB_id]->crnti,
+			timing_advance);
+
+		  //timing_advance = 0;
+		  process_timing_advance_rar(ue,proc,timing_advance);
+
+		  if (mode!=debug_prach) {
+		    ue->ulsch_Msg3_active[eNB_id]=1;
+		    get_Msg3_alloc(&ue->frame_parms,
+				   subframe_prev,
+				   frame_rx-((subframe_prev==9) ? 1 : 0),
+				   &ue->ulsch_Msg3_frame[eNB_id],
+				   &ue->ulsch_Msg3_subframe[eNB_id]);
+
+		    LOG_D(PHY,"[UE  %d][RAPROC] Got Msg3_alloc Frame %d subframe %d: Msg3_frame %d, Msg3_subframe %d\n",
+			  ue->Mod_id,
+			  frame_rx-((subframe_prev==9) ? 1 : 0),
+			  subframe_prev,
+			  ue->ulsch_Msg3_frame[eNB_id],
+			  ue->ulsch_Msg3_subframe[eNB_id]);
+		    harq_pid = subframe2harq_pid(&ue->frame_parms,
+						 ue->ulsch_Msg3_frame[eNB_id],
+						 ue->ulsch_Msg3_subframe[eNB_id]);
+		    ue->ulsch[eNB_id]->harq_processes[harq_pid]->round = 0;
+
+		    ue->UE_mode[eNB_id] = RA_RESPONSE;
+		    //      ue->Msg3_timer[eNB_id] = 10;
+		    ue->ulsch[eNB_id]->power_offset = 6;
+		    ue->ulsch_no_allocation_counter[eNB_id] = 0;
+		  }
+		} else { // PRACH preamble doesn't match RAR
+		  LOG_W(PHY,"[UE  %d][RAPROC] Received RAR preamble (%d) doesn't match !!!\n",
+			ue->Mod_id,
+			ue->prach_resources[eNB_id]->ra_PreambleIndex);
+		}
+	      } // mode != PUSCH
+	    }
 	    else {
 	      rar = ue->dlsch_ra[eNB_id]->harq_processes[0]->b+1;
 	      timing_advance = ((((uint16_t)(rar[0]&0x7f))<<4) + (rar[1]>>4));
 	      //timing_advance = ue->dlsch_ra[eNB_id]->harq_processes[0]->b[0];
-	      process_timing_advance_rar(ue,timing_advance);
+	      process_timing_advance_rar(ue,proc,timing_advance);
 	    }
-        } //ret <= MAX_ITERATIONS
-
-        /*
-        #ifdef DEBUG_PHY_PROC
-        debug_LOG_D(PHY,"[UE  %d] Frame %d, slot %d: dlsch_decoding (RA) ret %d (%d errors)\n",
-            ue->Mod_id,frame_rx,slot_rx,ret,ue->dlsch_ra_errors[eNB_id]);
-        #endif
-        */
-      } // dlsch_ra[eNB_id]->active == 1
-
-    }
-
+	  } //ret <= MAX_ITERATIONS
+	} // dlsch_ra[eNB_id]->active == 1
+      }
+     
 
-    if ((((slot_rx%2)==0) && ((l==pilot1))) ||
-        ((pmch_flag==1)&&(l==1)))  {
+      if (((slot==0) && ((l==pilot1))) ||
+	  ((pmch_flag==1)&&(l==1)))  {
 
 #ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[UE  %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,slot_rx,eNB_id);
+	LOG_D(PHY,"[UE  %d] Frame %d, slot %d: Calling pdcch procedures (eNB %d)\n",ue->Mod_id,frame_rx,slot,eNB_id);
 #endif
 
-      //      rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns());
-      if (ue_pdcch_procedures(eNB_id,ue,abstraction_flag) == -1) {
+	//      rt_printk("[PDCCH] Frame %d, slot %d, start %llu\n",frame_rx,slot_rx,rt_get_time_ns());
+	if (ue_pdcch_procedures(eNB_id,ue,proc,abstraction_flag) == -1) {
 #ifdef DEBUG_PHY_PROC
-	  LOG_E(PHY,"[UE  %d] Frame %d, slot %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,slot_rx);
+	  LOG_E(PHY,"[UE  %d] Frame %d, subframe %d: Error in pdcch procedures\n",ue->Mod_id,frame_rx,subframe_rx);
 #endif
 	  return(-1);
-      }
+	}
     
 
-      //      rt_printk("[PDCCH] Frame %d, slot %d, stop  %llu\n",frame_rx,slot_rx,rt_get_time_ns());
+	//      rt_printk("[PDCCH] Frame %d, slot %d, stop  %llu\n",frame_rx,slot_rx,rt_get_time_ns());
 #ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[eNB_id]->num_pdcch_symbols);
+	LOG_D(PHY,"num_pdcch_symbols %d\n",ue->pdcch_vars[eNB_id]->num_pdcch_symbols);
 #endif
-    }
-
-    if (abstraction_flag==0) {
-
-      if (((slot_rx%2)==1) && (l==0)) {
-        start_meas(&ue->dlsch_llr_stats);
-
-        for (m=ue->pdcch_vars[eNB_id]->num_pdcch_symbols;
-             m<pilot2;
-             m++) {
-
-#ifndef DLSCH_THREAD
-
-          if (ue->dlsch[eNB_id][0]->active == 1)  {
-            harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid;
-            LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",ue->Mod_id,subframe_rx,slot_rx,harq_pid);
-
-            if ((ue->transmission_mode[eNB_id] == 5) &&
-                (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-                (ue->use_ia_receiver ==1)) {
-              dual_stream_UE = 1;
-              eNB_id_i = ue->n_connected_eNB;
-              i_mod =  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm;
-            } else {
-              dual_stream_UE = 0;
-              eNB_id_i = eNB_id+1;
-              i_mod = 0;
-            }
-
-            // process DLSCH received in first slot
-
-            rx_pdsch(ue,
-                     PDSCH,
-                     eNB_id,
-                     eNB_id_i,
-                     subframe_rx,  // subframe,
-                     m,
-                     (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
-                     dual_stream_UE,
-                     i_mod,
-                     ue->dlsch[eNB_id][0]->current_harq_pid);
-          } // CRNTI active
-
-#endif
-
-          if (ue->dlsch_SI[eNB_id]->active == 1)  {
-            // process SI DLSCH in first slot
-            rx_pdsch(ue,
-                     SI_PDSCH,
-                     eNB_id,
-                     eNB_id+1,
-                     subframe_rx,  // subframe,
-                     m,
-                     (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
-                     0,
-                     ue->is_secondary_ue,
-                     ue->dlsch_SI[eNB_id]->current_harq_pid);
-          } // SI active
-
-          if (ue->dlsch_ra[eNB_id]->active == 1)  {
-            rx_pdsch(ue,
-                     RA_PDSCH,
-                     eNB_id,
-                     eNB_id+1,
-                     subframe_rx,  // subframe,
-                     m,
-                     (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,
-                     0,
-                     ue->is_secondary_ue,
-                     ue->dlsch_ra[eNB_id]->current_harq_pid);
-          } // RA active
-        } // loop from first dlsch symbol to end of slot
-
-        stop_meas(&ue->dlsch_llr_stats);
-      } // 2nd quarter
-
-      if (((slot_rx%2)==1) && (l==pilot1)) {
-        start_meas(&ue->dlsch_llr_stats);
-
-        for (m=pilot2; m<pilot3; m++) {
-
-#ifndef DLSCH_THREAD
-
-          if (ue->dlsch[eNB_id][0]->active == 1) {
-            harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid;
-
-            if ((ue->transmission_mode[eNB_id] == 5) &&
-                (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-                (ue->use_ia_receiver ==1)) {
-              dual_stream_UE = 1;
-              eNB_id_i = ue->n_connected_eNB;
-              i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm;
-            } else {
-              dual_stream_UE = 0;
-              eNB_id_i = eNB_id+1;
-              i_mod = 0;
-            }
-
-            rx_pdsch(ue,
-                     PDSCH,
-                     eNB_id,
-                     eNB_id_i,
-                     subframe_rx,  // subframe,
-                     m,
-                     0,
-                     dual_stream_UE,
-                     i_mod,
-                     ue->dlsch[eNB_id][0]->current_harq_pid);
-          } // CRNTI active
-
-#endif
-
-          if(ue->dlsch_SI[eNB_id]->active == 1) {
-            rx_pdsch(ue,
-                     SI_PDSCH,
-                     eNB_id,
-                     eNB_id+1,
-                     subframe_rx,  // subframe,
-                     m,
-                     0,   // first_symbol_flag
-                     0,
-                     ue->is_secondary_ue,
-                     ue->dlsch_SI[eNB_id]->current_harq_pid);
-          } // SI active
-
-          if (ue->dlsch_ra[eNB_id]->active == 1) {
-            rx_pdsch(ue,
-                     RA_PDSCH,
-                     eNB_id,
-                     eNB_id+1,
-                     subframe_rx,  // subframe,
-                     m,
-                     0,   // first_symbol_flag
-                     0,
-                     ue->is_secondary_ue,
-                     ue->dlsch_ra[eNB_id]->current_harq_pid);
-          } // RA active
-
-        } // loop over 3rd quarter
-
-        stop_meas(&ue->dlsch_llr_stats);
-      } // 3rd quarter of subframe
-    } // abstraction_flag==0
-  }// l loop
-
-  // calculate some statistics
-  if (slot_rx==19) {
-    if (frame_rx % 10 == 0) {
-      if ((ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]) != 0)
-        ue->dlsch_fer[eNB_id] = (100*(ue->dlsch_errors[eNB_id] - ue->dlsch_errors_last[eNB_id]))/(ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]);
-
-      ue->dlsch_errors_last[eNB_id] = ue->dlsch_errors[eNB_id];
-      ue->dlsch_received_last[eNB_id] = ue->dlsch_received[eNB_id];
-    }
+      }
+       
+      if (abstraction_flag==0) {
+
+	if ((slot==1) && 
+	    (l==0)) {
+	  start_meas(&ue->dlsch_llr_stats);
+	 
+	  for (m=ue->pdcch_vars[eNB_id]->num_pdcch_symbols;
+	       m<pilot2;
+	       m++) {
+
+	    if (ue->dlsch[eNB_id][0]->active == 1)  {
+	      harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid;
+	      LOG_D(PHY,"[UE %d] PDSCH active in subframe %d (%d), harq_pid %d\n",ue->Mod_id,subframe_rx,subframe_rx,harq_pid);
+
+	      if ((ue->transmission_mode[eNB_id] == 5) &&
+		  (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
+		  (ue->use_ia_receiver ==1)) {
+		dual_stream_UE = 1;
+		eNB_id_i = ue->n_connected_eNB;
+		i_mod =  ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm;
+	      } else {
+		dual_stream_UE = 0;
+		eNB_id_i = eNB_id+1;
+		i_mod = 0;
+	      }
+
+	      // process DLSCH received in first slot
+	     
+	   
+	 
+	      rx_pdsch(ue,
+		       PDSCH,
+		       eNB_id,
+		       eNB_id_i,
+		       subframe_rx,  // subframe,
+		       m,
+		       (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
+		       dual_stream_UE,
+		       i_mod,
+		       ue->dlsch[eNB_id][0]->current_harq_pid);
+	    } // CRNTI active
+
+	   
+
+	    if (ue->dlsch_SI[eNB_id]->active == 1)  {
+	      // process SI DLSCH in first slot
+	      rx_pdsch(ue,
+		       SI_PDSCH,
+		       eNB_id,
+		       eNB_id+1,
+		       subframe_rx,  // subframe,
+		       m,
+		       (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,   // first_symbol_flag
+		       0,
+		       ue->is_secondary_ue,
+		       ue->dlsch_SI[eNB_id]->current_harq_pid);
+	    } // SI active
+
+	    if (ue->dlsch_ra[eNB_id]->active == 1)  {
+	      rx_pdsch(ue,
+		       RA_PDSCH,
+		       eNB_id,
+		       eNB_id+1,
+		       subframe_rx,  // subframe,
+		       m,
+		       (m==ue->pdcch_vars[eNB_id]->num_pdcch_symbols)?1:0,
+		       0,
+		       ue->is_secondary_ue,
+		       ue->dlsch_ra[eNB_id]->current_harq_pid);
+	    } // RA active
+	  } // loop from first dlsch symbol to end of slot
+
+	  stop_meas(&ue->dlsch_llr_stats);
+	} // 2nd quarter
+
+                     
+	if ((slot==1) && (l==pilot1)) {
+	  start_meas(&ue->dlsch_llr_stats);
+
+	  for (m=pilot2; m<pilot3; m++) {
+
+
+	    if (ue->dlsch[eNB_id][0]->active == 1) {
+	      harq_pid = ue->dlsch[eNB_id][0]->current_harq_pid;
+
+	      if ((ue->transmission_mode[eNB_id] == 5) &&
+		  (ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
+		  (ue->use_ia_receiver ==1)) {
+		dual_stream_UE = 1;
+		eNB_id_i = ue->n_connected_eNB;
+		i_mod = ue->dlsch[eNB_id][0]->harq_processes[harq_pid]->Qm;
+	      } else {
+		dual_stream_UE = 0;
+		eNB_id_i = eNB_id+1;
+		i_mod = 0;
+	      }
+
+	      rx_pdsch(ue,
+		       PDSCH,
+		       eNB_id,
+		       eNB_id_i,
+		       subframe_rx,  // subframe,
+		       m,
+		       0,
+		       dual_stream_UE,
+		       i_mod,
+		       ue->dlsch[eNB_id][0]->current_harq_pid);
+	    } // CRNTI active
+
+
+
+	    if(ue->dlsch_SI[eNB_id]->active == 1) {
+	      rx_pdsch(ue,
+		       SI_PDSCH,
+		       eNB_id,
+		       eNB_id+1,
+		       subframe_rx,  // subframe,
+		       m,
+		       0,   // first_symbol_flag
+		       0,
+		       ue->is_secondary_ue,
+		       ue->dlsch_SI[eNB_id]->current_harq_pid);
+	    } // SI active
+
+	    if (ue->dlsch_ra[eNB_id]->active == 1) {
+	      rx_pdsch(ue,
+		       RA_PDSCH,
+		       eNB_id,
+		       eNB_id+1,
+		       subframe_rx,  // subframe,
+		       m,
+		       0,   // first_symbol_flag
+		       0,
+		       ue->is_secondary_ue,
+		       ue->dlsch_ra[eNB_id]->current_harq_pid);
+	    } // RA active
+
+	  } // loop over 3rd quarter
+
+	  stop_meas(&ue->dlsch_llr_stats);
+	} // 3rd quarter of subframe
+      } // abstraction_flag==0
+    }// l loop
+     
+     // calculate some statistics
+    if ((subframe_rx==9) && 
+	(slot==1)) {
+      if (frame_rx % 10 == 0) {
+	if ((ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]) != 0)
+	  ue->dlsch_fer[eNB_id] = (100*(ue->dlsch_errors[eNB_id] - ue->dlsch_errors_last[eNB_id]))/(ue->dlsch_received[eNB_id] - ue->dlsch_received_last[eNB_id]);
+
+	ue->dlsch_errors_last[eNB_id] = ue->dlsch_errors[eNB_id];
+	ue->dlsch_received_last[eNB_id] = ue->dlsch_received[eNB_id];
+      }
 
-    ue->bitrate[eNB_id] = (ue->total_TBS[eNB_id] - ue->total_TBS_last[eNB_id])*100;
-    ue->total_TBS_last[eNB_id] = ue->total_TBS[eNB_id];
-    LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n",
-          ue->Mod_id,frame_rx,ue->total_TBS[eNB_id],
-          ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0);
-    /*
-    if ((frame_rx % 100 == 0)) {
-      LOG_I(PHY,"Throughput %5.1f kbps\n",(float) ue->bitrate[eNB_id]/1000.0);
+      ue->bitrate[eNB_id] = (ue->total_TBS[eNB_id] - ue->total_TBS_last[eNB_id])*100;
+      ue->total_TBS_last[eNB_id] = ue->total_TBS[eNB_id];
+      LOG_D(PHY,"[UE %d] Calculating bitrate Frame %d: total_TBS = %d, total_TBS_last = %d, bitrate %f kbits\n",
+	    ue->Mod_id,frame_rx,ue->total_TBS[eNB_id],
+	    ue->total_TBS_last[eNB_id],(float) ue->bitrate[eNB_id]/1000.0);
+      /*
+	if ((frame_rx % 100 == 0)) {
+	LOG_I(PHY,"Throughput %5.1f kbps\n",(float) ue->bitrate[eNB_id]/1000.0);
+	}
+      */
     }
-    */
-  }
 
-  if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&ue->frame_parms)) {
-    LOG_D(PHY,"ue calling pmch subframe ..\n ");
+    if (is_pmch_subframe((subframe_rx==9?-1:0)+frame_rx,subframe_rx,&ue->frame_parms)) {
+      LOG_D(PHY,"ue calling pmch subframe ..\n ");
 
-    if ((slot_rx%2)==1) {
-      LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n",
-            ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot_rx);
+      if (slot==1) {
+	LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Querying for PMCH demodulation(%d)\n",
+	      ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,slot);
 #ifdef Rel10
-      pmch_mcs = mac_xface->ue_query_mch(ue->Mod_id,
-                                         CC_id,
-                                         (subframe_rx==9?-1:0)+frame_rx,
-                                         subframe_rx,
-                                         eNB_id,
-                                         &sync_area,
-                                         &mcch_active);
+	pmch_mcs = mac_xface->ue_query_mch(ue->Mod_id,
+					   CC_id,
+					   (subframe_rx==9?-1:0)+frame_rx,
+					   subframe_rx,
+					   eNB_id,
+					   &sync_area,
+					   &mcch_active);
 
-      if (phy_vars_rn)
-        phy_vars_rn->mch_avtive[subframe_rx]=0;
+	if (phy_vars_rn)
+	  phy_vars_rn->mch_avtive[subframe_rx]=0;
 
 #else
-      pmch_mcs=-1;
+	pmch_mcs=-1;
 #endif
 
-      if (pmch_mcs>=0) {
-        LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs);
-        fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0);
+	if (pmch_mcs>=0) {
+	  LOG_D(PHY,"[UE %d] Frame %d, subframe %d: Programming PMCH demodulation for mcs %d\n",ue->Mod_id,(subframe_rx==9?-1:0)+frame_rx,subframe_rx,pmch_mcs);
+	  fill_UE_dlsch_MCH(ue,pmch_mcs,1,0,0);
 
-        if (abstraction_flag == 0 ) {
-          for (l=2; l<12; l++) {
+	  if (abstraction_flag == 0 ) {
+	    for (l=2; l<12; l++) {
 
-            slot_fep_mbsfn(ue,
-                           l,
-                           subframe_rx,
-                           0,0);//ue->rx_offset,0);
-          }
+	      slot_fep_mbsfn(ue,
+			     l,
+			     subframe_rx,
+			     0,0);//ue->rx_offset,0);
+	    }
 
-          for (l=2; l<12; l++) {
-            rx_pmch(ue,
-                    0,
-                    subframe_rx,
-                    l);
+	    for (l=2; l<12; l++) {
+	      rx_pmch(ue,
+		      0,
+		      subframe_rx,
+		      l);
 
 
-          }
+	    }
 
-          /*  printf("PMCH decoding, Frame %d, subframe %d, G %d\n",
-               (subframe_rx==9?-1:0)+frame_rx,
-               subframe_rx,
-               ue->dlsch_MCH[0]->harq_processes[0]->G);
-          */
-          ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms,
-              ue->dlsch_MCH[0]->harq_processes[0]->nb_rb,
-              ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even,
-              ue->dlsch_MCH[0]->harq_processes[0]->Qm,
-              1,
-              2,
-              (subframe_rx==9?-1:0)+frame_rx,subframe_rx);
-
-          dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0],
-                             ue->dlsch_MCH[0]->harq_processes[0]->G,
-                             ue->pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1);
-
-          ret = dlsch_decoding(ue,
-                               ue->pdsch_vars_MCH[0]->llr[0],
-                               &ue->frame_parms,
-                               ue->dlsch_MCH[0],
-                               ue->dlsch_MCH[0]->harq_processes[0],
-                               subframe_prev,
-                               0,
-                               0,1);
-        } else { // abstraction
+	    /*  printf("PMCH decoding, Frame %d, subframe %d, G %d\n",
+		(subframe_rx==9?-1:0)+frame_rx,
+		subframe_rx,
+		ue->dlsch_MCH[0]->harq_processes[0]->G);
+	    */
+	    ue->dlsch_MCH[0]->harq_processes[0]->G = get_G(&ue->frame_parms,
+							   ue->dlsch_MCH[0]->harq_processes[0]->nb_rb,
+							   ue->dlsch_MCH[0]->harq_processes[0]->rb_alloc_even,
+							   ue->dlsch_MCH[0]->harq_processes[0]->Qm,
+							   1,
+							   2,
+							   (subframe_rx==9?-1:0)+frame_rx,subframe_rx);
+
+	    dlsch_unscrambling(&ue->frame_parms,1,ue->dlsch_MCH[0],
+			       ue->dlsch_MCH[0]->harq_processes[0]->G,
+			       ue->pdsch_vars_MCH[0]->llr[0],0,subframe_prev<<1);
+
+	    ret = dlsch_decoding(ue,
+				 ue->pdsch_vars_MCH[0]->llr[0],
+				 &ue->frame_parms,
+				 ue->dlsch_MCH[0],
+				 ue->dlsch_MCH[0]->harq_processes[0],
+				 subframe_prev,
+				 0,
+				 0,1);
+	  } else { // abstraction
 #ifdef PHY_ABSTRACTION
-          ret = dlsch_decoding_emul(ue,
-                                    subframe_rx,
-                                    5, // PMCH
-                                    eNB_id);
+	    ret = dlsch_decoding_emul(ue,
+				      subframe_rx,
+				      5, // PMCH
+				      eNB_id);
 #endif
-        }
-
-        if (mcch_active == 1)
-          ue->dlsch_mcch_trials[sync_area][0]++;
-        else
-          ue->dlsch_mtch_trials[sync_area][0]++;
-
-        if (ret == (1+ue->dlsch_MCH[0]->max_turbo_iterations)) {
-          if (mcch_active == 1)
-            ue->dlsch_mcch_errors[sync_area][0]++;
-          else
-            ue->dlsch_mtch_errors[sync_area][0]++;
-
-          LOG_D(PHY,"[%s %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n",
-                (r_type == no_relay)? "UE": "RN/UE", ue->Mod_id,
-                (subframe_rx==9?-1:0)+frame_rx,subframe_rx,
-                ue->dlsch_mcch_errors[sync_area][0],
-                ue->dlsch_mtch_errors[sync_area][0],
-                ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3,
-                ue->dlsch_MCH[0]->max_turbo_iterations,
-                ue->dlsch_MCH[0]->harq_processes[0]->G);
-          dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx);
+	  }
+	 
+	  if (mcch_active == 1)
+	    ue->dlsch_mcch_trials[sync_area][0]++;
+	  else
+	    ue->dlsch_mtch_trials[sync_area][0]++;
+
+	  if (ret == (1+ue->dlsch_MCH[0]->max_turbo_iterations)) {
+	    if (mcch_active == 1)
+	      ue->dlsch_mcch_errors[sync_area][0]++;
+	    else
+	      ue->dlsch_mtch_errors[sync_area][0]++;
+
+	    LOG_D(PHY,"[%s %d] Frame %d, subframe %d: PMCH in error (%d,%d), not passing to L2 (TBS %d, iter %d,G %d)\n",
+		  (r_type == no_relay)? "UE": "RN/UE", ue->Mod_id,
+		  (subframe_rx==9?-1:0)+frame_rx,subframe_rx,
+		  ue->dlsch_mcch_errors[sync_area][0],
+		  ue->dlsch_mtch_errors[sync_area][0],
+		  ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3,
+		  ue->dlsch_MCH[0]->max_turbo_iterations,
+		  ue->dlsch_MCH[0]->harq_processes[0]->G);
+	    dump_mch(ue,0,ue->dlsch_MCH[0]->harq_processes[0]->G,subframe_rx);
 #ifdef DEBUG_DLSCH
 
-          for (int i=0; i<ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) {
-            LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]);
-          }
+	    for (int i=0; i<ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3; i++) {
+	      LOG_T(PHY,"%02x.",ue->dlsch_MCH[0]->harq_processes[0]->c[0][i]);
+	    }
 
-          LOG_T(PHY,"\n");
+	    LOG_T(PHY,"\n");
 #endif
 
-          if (subframe_rx==9)
-            mac_xface->macphy_exit("Why are we exiting here?");
-        } else {
+	    if (subframe_rx==9)
+	      mac_xface->macphy_exit("Why are we exiting here?");
+	  } else {
 #ifdef Rel10
 
-          if ((r_type == no_relay) || (mcch_active == 1)) {
-            mac_xface->ue_send_mch_sdu(ue->Mod_id,
-                                       CC_id,
-                                       frame_rx,
-                                       ue->dlsch_MCH[0]->harq_processes[0]->b,
-                                       ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3,
-                                       eNB_id,// not relevant in eMBMS context
-                                       sync_area);
-            /*   for (i=0;i<ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3;i++)
-              msg("%2x.",ue->dlsch_MCH[0]->harq_processes[0]->b[i]);
-            msg("\n");
-            */
-
-            if (mcch_active == 1)
-              ue->dlsch_mcch_received[sync_area][0]++;
-            else
-              ue->dlsch_mtch_received[sync_area][0]++;
-
-
-            if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) {
-              ue->dlsch_mch_received_sf[subframe_rx%5][0]=0;
-            } else {
-              ue->dlsch_mch_received[0]+=1;
-              ue->dlsch_mch_received_sf[subframe_rx][0]=1;
-            }
-
-          } else if (r_type == multicast_relay) { // mcch is not active here
-            // only 1 harq process exists
-            // Fix me: this could be a pointer copy
-            memcpy (phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b,
-                    ue->dlsch_MCH[0]->harq_processes[0]->b,
-                    ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3);
-            // keep the tbs
-            phy_vars_rn->mch_avtive[subframe_rx] = 1;
-            phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct
-            phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = ue->dlsch_MCH[0]->harq_processes[0]->TBS;
-            phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = ue->dlsch_MCH[0]->harq_processes[0]->mcs;
-            LOG_D(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n",
-                  ue->Mod_id, frame_rx,subframe_rx,sync_area,
-                  phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs,
-                  phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3);
+	    if ((r_type == no_relay) || (mcch_active == 1)) {
+	      mac_xface->ue_send_mch_sdu(ue->Mod_id,
+					 CC_id,
+					 frame_rx,
+					 ue->dlsch_MCH[0]->harq_processes[0]->b,
+					 ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3,
+					 eNB_id,// not relevant in eMBMS context
+					 sync_area);
+	      /*   for (i=0;i<ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3;i++)
+		   printf("%2x.",ue->dlsch_MCH[0]->harq_processes[0]->b[i]);
+		   printf("\n");
+	      */
+
+	      if (mcch_active == 1)
+		ue->dlsch_mcch_received[sync_area][0]++;
+	      else
+		ue->dlsch_mtch_received[sync_area][0]++;
+
+
+	      if (ue->dlsch_mch_received_sf[subframe_rx%5][0] == 1 ) {
+		ue->dlsch_mch_received_sf[subframe_rx%5][0]=0;
+	      } else {
+		ue->dlsch_mch_received[0]+=1;
+		ue->dlsch_mch_received_sf[subframe_rx][0]=1;
+	      }
+
+	    } else if (r_type == multicast_relay) { // mcch is not active here
+	      // only 1 harq process exists
+	      // Fix me: this could be a pointer copy
+	      memcpy (phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b,
+		      ue->dlsch_MCH[0]->harq_processes[0]->b,
+		      ue->dlsch_MCH[0]->harq_processes[0]->TBS>>3);
+	      // keep the tbs
+	      phy_vars_rn->mch_avtive[subframe_rx] = 1;
+	      phy_vars_rn->sync_area[subframe_rx] = sync_area; // this could also go the harq data struct
+	      phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS = ue->dlsch_MCH[0]->harq_processes[0]->TBS;
+	      phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs = ue->dlsch_MCH[0]->harq_processes[0]->mcs;
+	      LOG_D(PHY,"[RN/UE %d] Frame %d subframe %d: store the MCH PDU for MBSFN sync area %d (MCS %d, TBS %d)\n",
+		    ue->Mod_id, frame_rx,subframe_rx,sync_area,
+		    phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->mcs,
+		    phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3);
 #ifdef DEBUG_PHY
 
-            for (int i=0; i<phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3; i++)
-              msg("%02x ",phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b[i]);
+	      for (int i=0; i<phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->TBS>>3; i++)
+		printf("%02x ",phy_vars_rn->dlsch_rn_MCH[subframe_rx]->harq_processes[0]->b[i]);
 
-            msg("\n");
+	      printf("\n");
 #endif
-          } else
-            LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",ue->Mod_id, frame_rx);
+	    } else
+	      LOG_W(PHY,"[UE %d] Frame %d: not supported option\n",ue->Mod_id, frame_rx);
 
 #endif
-        }
+	  }
+	}
       }
     }
-  }
 
 #ifdef EMOS
-  phy_procedures_emos_UE_RX(ue,slot_rx,eNB_id);
+    phy_procedures_emos_UE_RX(ue,slot,eNB_id);
 #endif
 
+  }     
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
   stop_meas(&ue->phy_proc_rx);
   return (0);
 }
-
+   
 #ifdef Rel10
 int phy_procedures_RN_UE_RX(uint8_t slot_rx, uint8_t next_slot, relaying_type_t r_type)
 {
-
+   
   int do_proc =0; // do nothing by default
-
+   
   switch(r_type) {
   case no_relay:
     do_proc=no_relay; // perform the normal UE operation
     break;
-
+     
   case multicast_relay:
     if (slot_rx > 12)
       do_proc = 0; // do nothing
     else // SF#1, SF#2, SF3, SF#3, SF#4, SF#5, SF#6(do rx slot 12)
       do_proc = multicast_relay ; // do PHY procedures UE RX
-
+     
     break;
-
+     
   default: // should'not be here
     LOG_W(PHY,"Not supported relay type %d, do nothing \n", r_type);
     do_proc= 0;
     break;
   }
-
+   
   return do_proc;
 }
 #endif
-
-
-void phy_procedures_UE_lte(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,
-                           relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn)
+ 
+ 
+void phy_procedures_UE_lte(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,
+			   relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn)
 {
 #if defined(ENABLE_ITTI)
   MessageDef   *msg_p;
@@ -3436,251 +3136,114 @@ void phy_procedures_UE_lte(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t abstraction_fl
   unsigned int  Mod_id;
   int           result;
 #endif
-#   if ENABLE_RAL
-  int           CC_id =0;
-#endif
-  int           frame_rx = ue->frame_rx;
-  int           frame_tx = ue->frame_tx;
-  int           slot_rx  = ue->slot_rx;
-  int           slot_tx  = ue->slot_tx;
-  int           subframe_tx = slot_tx>>1;
-  int           subframe_rx = slot_rx>>1;
+   
+  int           frame_rx = proc->frame_rx;
+  int           frame_tx = proc->frame_tx;
+  int           subframe_rx = proc->subframe_rx;
+  int           subframe_tx = proc->subframe_tx;
 #undef DEBUG_PHY_PROC
-
+   
   UE_L2_STATE_t ret;
+  int slot;
 
   if (ue->mac_enabled == 0) {
     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;
   }
-
-
+   
+   
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,1);
-#if defined(EXMIMO)
-#ifndef OAI_USRP
-  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[0].rxcnt_ptr[0]));
-#endif
-#endif
   start_meas(&ue->phy_proc);
 #if defined(ENABLE_ITTI)
 
   do {
     // Checks if a message has been sent to PHY sub-task
     itti_poll_msg (TASK_PHY_UE, &msg_p);
-
+     
     if (msg_p != NULL) {
       msg_name = ITTI_MSG_NAME (msg_p);
       instance = ITTI_MSG_INSTANCE (msg_p);
       Mod_id = instance - NB_eNB_INST;
-
+       
       switch (ITTI_MSG_ID(msg_p)) {
       case PHY_FIND_CELL_REQ:
-        LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name);
-
-        /* TODO process the message */
-#   if ENABLE_RAL
-        {
-          MessageDef *message_p;
-
-          message_p = itti_alloc_new_message(TASK_PHY_UE , PHY_FIND_CELL_IND);
-          memset(&PHY_FIND_CELL_IND(message_p), 0, sizeof(PHY_FIND_CELL_IND(message_p)));
-          PHY_FIND_CELL_IND (message_p).transaction_id   = PHY_FIND_CELL_REQ(msg_p).transaction_id;
-          PHY_FIND_CELL_IND (message_p).cell_nb          = 1;
-          PHY_FIND_CELL_IND (message_p).cells[0].earfcn  = 1;
-          PHY_FIND_CELL_IND (message_p).cells[0].cell_id = 06;
-          PHY_FIND_CELL_IND (message_p).cells[0].rsrp    = 39;
-          PHY_FIND_CELL_IND (message_p).cells[0].rsrq    = 39;
-
-          itti_send_msg_to_task(TASK_RRC_UE, instance, message_p);
-
-        }
-#   endif
-        break;
-
-#   if ENABLE_RAL
-
-      case TIMER_HAS_EXPIRED:
-        // check if it is a measurement timer
-      {
-        hashtable_rc_t       hashtable_rc;
-        hashtable_rc = hashtable_is_key_exists(ue_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t)(TIMER_HAS_EXPIRED(msg_p).timer_id));
-        LOG_I(PHY, "[UE %d] Received TIMER HAS EXPIRED: (hash_rc %d, HASH_TABLE_OK %d)\n", Mod_id, hashtable_rc, HASH_TABLE_OK);
-
-        if (hashtable_rc == HASH_TABLE_OK) {
-          phy_UE_lte_check_measurement_thresholds(instance, (ral_threshold_phy_t*)TIMER_HAS_EXPIRED(msg_p).arg);
-        }
-      }
-      break;
-
-
-      case PHY_MEAS_THRESHOLD_REQ:
-#warning "TO DO LIST OF THRESHOLDS"
-        LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name);
-        {
-          ral_threshold_phy_t* threshold_phy_p  = NULL;
-          int                  index, res;
-          long                 timer_id;
-          hashtable_rc_t       hashtable_rc;
-
-          switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action) {
-
-          case RAL_TH_ACTION_CANCEL_THRESHOLD:
-            break;
-
-          case RAL_TH_ACTION_SET_NORMAL_THRESHOLD:
-          case RAL_TH_ACTION_SET_ONE_SHOT_THRESHOLD:
-            for (index = 0; index < PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.num_thresholds; index++) {
-              threshold_phy_p                  = calloc(1, sizeof(ral_threshold_phy_t));
-              threshold_phy_p->th_action       = PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action;
-              memcpy(&threshold_phy_p->link_param.link_param_type,
-                     &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type,
-                     sizeof(ral_link_param_type_t));
-
-              memcpy(&threshold_phy_p->threshold,
-                     &PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.thresholds[index],
-                     sizeof(ral_threshold_t));
-
-              switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice) {
-
-              case RAL_LINK_CFG_PARAM_CHOICE_TIMER_NULL:
-                switch (PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice) {
-                case RAL_LINK_PARAM_TYPE_CHOICE_GEN:
-                  SLIST_INSERT_HEAD(
-                    &ue_g[Mod_id][CC_id]->ral_thresholds_gen_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_gen],
-                    threshold_phy_p,
-                    ral_thresholds);
-                  break;
-
-                case RAL_LINK_PARAM_TYPE_CHOICE_LTE:
-                  SLIST_INSERT_HEAD(
-                    &ue_g[Mod_id][CC_id]->ral_thresholds_lte_polled[PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type._union.link_param_lte],
-                    threshold_phy_p,
-                    ral_thresholds);
-                  //LOG_E(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER NULL - type LTE in %s\n", Mod_id, msg_name);
-                  break;
-
-                default:
-                  LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.link_param_type.choice %d in %s\n",
-                        Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.link_param_type.choice, msg_name);
-                }
-
-                break;
-
-              case RAL_LINK_CFG_PARAM_CHOICE_TIMER:
-                res = timer_setup(
-                        (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval/1000),//uint32_t      interval_sec,
-                        (uint32_t)(PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param._union.timer_interval%1000),//uint32_t      interval_us,
-                        TASK_PHY_UE,
-                        instance,
-                        TIMER_PERIODIC,
-                        threshold_phy_p,
-                        &timer_id);
-
-                if (res == 0) {
-                  hashtable_rc = hashtable_insert(ue_g[Mod_id][CC_id]->ral_thresholds_timed, (uint64_t )timer_id, (void*)threshold_phy_p);
-
-                  if (hashtable_rc == HASH_TABLE_OK) {
-                    threshold_phy_p->timer_id = timer_id;
-                    LOG_I(PHY, "[UE %d] NORMAL/ONE SHOT - TIMER CHOICE - OK - in Hash %s\n", Mod_id, msg_name);
-                  } else {
-                    LOG_E(PHY, "[UE %d]  %s: Error in hashtable. Could not configure threshold index %d \n",
-                          Mod_id, msg_name, index);
-                  }
-
-                } else {
-                  LOG_E(PHY, "[UE %d]  %s: Could not configure threshold index %d because of timer initialization failure\n",
-                        Mod_id, msg_name, index);
-                }
-
-                break;
-
-              default: // already checked in RRC, should not happen here
-                LOG_E(PHY, "[UE %d] BAD PARAMETER cfg_param.union_choice %d in %s\n",
-                      Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.union_choice, msg_name);
-              }
-            }
-
-            break;
-
-          default:
-            LOG_E(PHY, "[UE %d] BAD PARAMETER th_action value %d in %s\n",
-                  Mod_id, PHY_MEAS_THRESHOLD_REQ(msg_p).cfg_param.th_action, msg_name);
-          }
-
-        }
-        break;
-#   endif
-
+	LOG_I(PHY, "[UE %d] Received %s\n", Mod_id, msg_name);
+	 
+	/* TODO process the message */
+	break;
+	 
       default:
-        LOG_E(PHY, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name);
-        break;
+	LOG_E(PHY, "[UE %d] Received unexpected message %s\n", Mod_id, msg_name);
+	break;
       }
-
+       
       result = itti_free (ITTI_MSG_ORIGIN_ID(msg_p), msg_p);
       AssertFatal (result == EXIT_SUCCESS, "Failed to free memory (%d)!\n", result);
     }
   } while(msg_p != NULL);
-
-#endif
-
-  if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)||
-      (ue->frame_parms.frame_type == FDD)) {
-    phy_procedures_UE_TX(ue,eNB_id,abstraction_flag,mode,r_type);
-  }
-
-  if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) ||
-      (ue->frame_parms.frame_type == FDD)) {
+   
+#endif
+   
+  for (slot=0;slot<2;slot++) {
+     
+    if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_UL)||
+	(ue->frame_parms.frame_type == FDD)) {
+      phy_procedures_UE_TX(ue,proc,eNB_id,abstraction_flag,mode,r_type);
+    }
+     
+    if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_DL) ||
+	(ue->frame_parms.frame_type == FDD)) {
 #ifdef Rel10
-
-    if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 )
+       
+      if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 )
 #endif
-      phy_procedures_UE_RX(ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
-  }
-
-  if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) &&
-      ((slot_tx&1)==1)) {
-    phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag,r_type);
-  }
-
-  if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) &&
-      ((slot_rx&1)==0)) {
+	phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
+    }
+     
+    if ((subframe_select(&ue->frame_parms,subframe_tx)==SF_S) &&
+	(slot==1)) {
+      phy_procedures_UE_S_TX(ue,eNB_id,abstraction_flag,r_type);
+    }
+       
+    if ((subframe_select(&ue->frame_parms,subframe_rx)==SF_S) &&
+	(slot==0)) {
 #ifdef Rel10
-
-    if (phy_procedures_RN_UE_RX(slot_rx, slot_tx, r_type) != 0 )
+	 
+      if (phy_procedures_RN_UE_RX(subframe_rx, subframe_tx, r_type) != 0 )
 #endif
-      phy_procedures_UE_RX(ue,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
-  }
-
-  if (ue->mac_enabled==1) {
-    if (slot_rx%2==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*/);
-
-    if (ret == CONNECTION_LOST) {
-      LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id,
-            frame_rx,subframe_tx);
-      ue->UE_mode[eNB_id] = PRACH;
-      //      mac_xface->macphy_exit("Connection lost");
-    } else if (ret == PHY_RESYNCH) {
-      LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n",
-            ue->Mod_id,
-            frame_rx,subframe_tx);
-      ue->UE_mode[eNB_id] = RESYNCH;
-      //     mac_xface->macphy_exit("Connection lost");
-    } else if (ret == PHY_HO_PRACH) {
-      LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n",
-            ue->Mod_id,frame_rx,subframe_tx);
-      ue->UE_mode[eNB_id] = PRACH;
+	phy_procedures_UE_RX(ue,proc,eNB_id,abstraction_flag,mode,r_type,phy_vars_rn);
     }
-  }
-  }
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
-  stop_meas(&ue->phy_proc);
+       
+    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*/);
+	   
+	if (ret == CONNECTION_LOST) {
+	  LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, returning to PRACH\n",ue->Mod_id,
+		frame_rx,subframe_tx);
+	  ue->UE_mode[eNB_id] = PRACH;
+	  //      mac_xface->macphy_exit("Connection lost");
+	} else if (ret == PHY_RESYNCH) {
+	  LOG_E(PHY,"[UE %d] Frame %d, subframe %d RRC Connection lost, trying to resynch\n",
+		ue->Mod_id,
+		frame_rx,subframe_tx);
+	  ue->UE_mode[eNB_id] = RESYNCH;
+	  //     mac_xface->macphy_exit("Connection lost");
+	} else if (ret == PHY_HO_PRACH) {
+	  LOG_I(PHY,"[UE %d] Frame %d, subframe %d, return to PRACH and perform a contention-free access\n",
+		ue->Mod_id,frame_rx,subframe_tx);
+	  ue->UE_mode[eNB_id] = PRACH;
+	}
+      }
+    }
+       
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_LTE,0);
+    stop_meas(&ue->phy_proc);
+  } // slot
 }
+ 
+ 
diff --git a/openair1/SCHED/pucch_pc.c b/openair1/SCHED/pucch_pc.c
index 229ae3f1a3..7eaf1738dc 100644
--- a/openair1/SCHED/pucch_pc.c
+++ b/openair1/SCHED/pucch_pc.c
@@ -42,7 +42,7 @@
 #include "PHY/LTE_TRANSPORT/proto.h"
 #include "PHY/extern.h"
 
-int8_t pucch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt)
+int8_t pucch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t subframe,uint8_t eNB_id,PUCCH_FMT_t pucch_fmt)
 {
 
   int8_t Po_PUCCH;
@@ -98,7 +98,7 @@ int8_t pucch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FM
   if (pucch_fmt!=pucch_format1) {
     LOG_I(PHY,"[UE  %d][PDSCH %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB, g_pucch %d dB\n",
           ue->Mod_id,
-          ue->dlsch[eNB_id][0]->rnti,ue->frame_tx,subframe,
+          ue->dlsch[eNB_id][0]->rnti,proc->frame_tx,subframe,
           Po_PUCCH,
           ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
           get_PL(ue->Mod_id,ue->CC_id,eNB_id),
@@ -106,7 +106,7 @@ int8_t pucch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,PUCCH_FM
   } else {
     LOG_I(PHY,"[UE  %d][SR %x] frame %d, subframe %d: Po_PUCCH %d dBm : Po_NOMINAL_PUCCH %d dBm, PL %d dB g_pucch %d dB\n",
           ue->Mod_id,
-          ue->dlsch[eNB_id][0]->rnti,ue->frame_tx,subframe,
+          ue->dlsch[eNB_id][0]->rnti,proc->frame_tx,subframe,
           Po_PUCCH,
           ue->frame_parms.ul_power_control_config_common.p0_NominalPUCCH,
           get_PL(ue->Mod_id,ue->CC_id,eNB_id),
diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c
index 074cd507ef..6babb4fef0 100644
--- a/openair1/SCHED/pusch_pc.c
+++ b/openair1/SCHED/pusch_pc.c
@@ -136,13 +136,13 @@ int16_t get_hundred_times_delta_IF(PHY_VARS_UE *ue,uint8_t eNB_id,uint8_t harq_p
 
 uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100};
 
-void pusch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag)
+void pusch_power_cntl(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t j, uint8_t abstraction_flag)
 {
 
 
   uint8_t harq_pid = subframe2harq_pid(&ue->frame_parms,
-                                       ue->frame_tx,
-                                       subframe);
+                                       proc->frame_tx,
+                                       proc->subframe_tx);
 
   uint8_t nb_rb = ue->ulsch[eNB_id]->harq_processes[harq_pid]->nb_rb;
   int8_t PL;
@@ -164,7 +164,7 @@ void pusch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,uint8_t j,
     ue->ulsch[eNB_id]->Po_PUSCH += (mac_xface->get_Po_NOMINAL_PUSCH(ue->Mod_id,0) + PL);
 
     LOG_I(PHY,"[UE  %d][RAPROC] frame %d, subframe %d: Msg3 Po_PUSCH %d dBm (%d,%d,100*PL=%d,%d,%d)\n",
-          ue->Mod_id,ue->frame_tx,subframe,ue->ulsch[eNB_id]->Po_PUSCH,
+          ue->Mod_id,proc->frame_tx,proc->subframe_tx,ue->ulsch[eNB_id]->Po_PUSCH,
           100*mac_xface->get_Po_NOMINAL_PUSCH(ue->Mod_id,0),
           hundred_times_log10_NPRB[nb_rb-1],
           100*PL,
@@ -183,7 +183,7 @@ void pusch_power_cntl(PHY_VARS_UE *ue,uint8_t subframe,uint8_t eNB_id,uint8_t j,
       ue->ulsch[eNB_id]->PHR = 40;
 
     LOG_D(PHY,"[UE  %d][PUSCH %d] frame %d, subframe %d: Po_PUSCH %d dBm : tx power %d, Po_NOMINAL_PUSCH %d,log10(NPRB) %f,PHR %d, PL %d, alpha*PL %f,delta_IF %f,f_pusch %d\n",
-          ue->Mod_id,harq_pid,ue->frame_tx,subframe,
+          ue->Mod_id,harq_pid,proc->frame_tx,proc->subframe_tx,
           ue->ulsch[eNB_id]->Po_PUSCH,
           ue->tx_power_max_dBm,
           ue->frame_parms.ul_power_control_config_common.p0_NominalPUSCH,
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index bd877e7aff..4447999bfd 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -499,7 +499,7 @@ static void *scope_thread(void *arg)
 
   while (!oai_exit) {
     if (UE_flag==1) {
-      len = dump_ue_stats (PHY_vars_UE_g[0][0], stats_buffer, 0, mode,rx_input_level_dBm);
+      len = dump_ue_stats (PHY_vars_UE_g[0][0], &PHY_vars_UE_g[0][0]->proc.proc_rxtx[0],stats_buffer, 0, mode,rx_input_level_dBm);
       //fl_set_object_label(form_stats->stats_text, stats_buffer);
       fl_clear_browser(form_stats->stats_text);
       fl_add_browser_line(form_stats->stats_text, stats_buffer);
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 66c60056b3..1c023c4457 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -306,7 +306,7 @@ static void *UE_thread_synch(void *arg)
   pthread_mutex_unlock(&sync_mutex);
   printf("unlocked sync_mutex (UE_sync_thread)\n");
 
-  printf("starting UE synch thread (IC %d)\n",UE->instance_cnt_synch);
+  printf("starting UE synch thread (IC %d)\n",UE->proc.instance_cnt_synch);
   ind = 0;
   found = 0;
 
@@ -358,34 +358,8 @@ static void *UE_thread_synch(void *arg)
 
         openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i];
         openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i];
-#ifdef OAI_USRP
-        openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
-
-#if 0 // UHD 3.8	
-        switch(UE->frame_parms.N_RB_DL) {
-        case 6:
-          openair0_cfg[card].rx_gain[i] -= 12;
-          break;
-
-        case 25:
-          openair0_cfg[card].rx_gain[i] -= 6;
-          break;
-
-        case 50:
-          openair0_cfg[card].rx_gain[i] -= 3;
-          break;
-
-        case 100:
-          openair0_cfg[card].rx_gain[i] -= 0;
-          break;
-
-        default:
-          printf( "Unknown number of RBs %d\n", UE->frame_parms.N_RB_DL );
-          break;
-        }
-#endif
+        openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;
         printf( "UE synch: setting RX gain (%d,%d) to %f\n", card, i, openair0_cfg[card].rx_gain[i] );
-#endif
       }
     }
 
@@ -393,19 +367,19 @@ static void *UE_thread_synch(void *arg)
 
   while (oai_exit==0) {
 
-    if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
+    if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) {
       LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" );
       exit_fun("noting to add");
       return &UE_thread_synch_retval;
     }
     
 
-    while (UE->instance_cnt_synch < 0) {
+    while (UE->proc.instance_cnt_synch < 0) {
       // the thread waits here most of the time
-      pthread_cond_wait( &UE->cond_synch, &UE->mutex_synch );
+      pthread_cond_wait( &UE->proc.cond_synch, &UE->proc.mutex_synch );
     }
 
-    if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {
+    if (pthread_mutex_unlock(&UE->proc.mutex_synch) != 0) {
       LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for UE Initial Synch thread\n" );
       exit_fun("nothing to add");
       return &UE_thread_synch_retval;
@@ -437,36 +411,8 @@ static void *UE_thread_synch(void *arg)
 
           openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i];
           openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i];
-#ifdef OAI_USRP
-          openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;  // 65 calibrated for USRP B210 @ 2.6 GHz
-
-#if 0 // UHD 3.8	  
-          switch(UE->frame_parms.N_RB_DL) {
-          case 6:
-            openair0_cfg[card].rx_gain[i] -= 12;
-            break;
-
-          case 25:
-            openair0_cfg[card].rx_gain[i] -= 6;
-            break;
-
-          case 50:
-            openair0_cfg[card].rx_gain[i] -= 3;
-            break;
-
-          case 100:
-            openair0_cfg[card].rx_gain[i] -= 0;
-            break;
-
-          default:
-            printf("Unknown number of RBs %d\n",UE->frame_parms.N_RB_DL);
-            break;
-          }
-#endif	  
-
+          openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;
           printf("UE synch: setting RX gain (%d,%d) to %f\n",card,i,openair0_cfg[card].rx_gain[i]);
-#endif
-
         }
 
       }
@@ -537,32 +483,27 @@ static void *UE_thread_synch(void *arg)
 	else {
 	  UE->is_synchronized = 1;
 
-	 if( UE->mode == rx_dump_frame ){
-	   FILE *fd;
-	   if ((UE->frame_rx&1) == 0) {  // this guarantees SIB1 is present 
-	     if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) {
-	       fwrite((void*)&UE->common_vars.rxdata[0][0],
-		      sizeof(int32_t),
-		      10*UE->frame_parms.samples_per_tti,
-		      fd);
-	       LOG_I(PHY,"Dummping Frame ... bye bye \n");
-	       fclose(fd);
-	       exit(0);
-	     }
-	     else {
-	       LOG_E(PHY,"Cannot open file for writing\n");
-	       exit(0);
-	     }
-	   }
-	   else {
-	     UE->is_synchronized = 0;
-	   }
-	 }
-	 
-
-
-	  UE->slot_rx = 0;
-	  UE->slot_tx = 4;
+	  if( UE->mode == rx_dump_frame ){
+	    FILE *fd;
+	    if ((UE->proc.proc_rxtx[0].frame_rx&1) == 0) {  // this guarantees SIB1 is present 
+	      if ((fd = fopen("rxsig_frame0.dat","w")) != NULL) {
+		fwrite((void*)&UE->common_vars.rxdata[0][0],
+		       sizeof(int32_t),
+		       10*UE->frame_parms.samples_per_tti,
+		       fd);
+		LOG_I(PHY,"Dummping Frame ... bye bye \n");
+		fclose(fd);
+		exit(0);
+	      }
+	      else {
+		LOG_E(PHY,"Cannot open file for writing\n");
+		exit(0);
+	      }
+	    }
+	    else {
+	      UE->is_synchronized = 0;
+	    }
+	  }
 	}
       } else {
         // initial sync failed
@@ -631,16 +572,16 @@ static void *UE_thread_synch(void *arg)
 
 
 
-    if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
+    if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) {
       LOG_E( PHY, "[SCHED][UE] error locking mutex for UE synch\n" );
       exit_fun("noting to add");
       return &UE_thread_synch_retval;
     }
 
     // indicate readiness
-    UE->instance_cnt_synch--;
+    UE->proc.instance_cnt_synch--;
 
-    if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {
+    if (pthread_mutex_unlock(&UE->proc.mutex_synch) != 0) {
       LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE synch\n" );
       exit_fun("noting to add");
       return &UE_thread_synch_retval;
@@ -658,6 +599,7 @@ static void *UE_thread_synch(void *arg)
  * \param arg is a pointer to a \ref PHY_VARS_UE structure.
  * \returns a pointer to an int. The storage is not on the heap and must not be freed.
  */
+/*
 static void *UE_thread_tx(void *arg)
 {
   static int UE_thread_tx_retval;
@@ -677,7 +619,7 @@ static void *UE_thread_tx(void *arg)
   attr.sched_nice = 0;
   attr.sched_priority = 0;
 
-  /* This creates a 1ms reservation every 10ms period*/
+  // This creates a 1ms reservation every 10ms period
   attr.sched_policy   = SCHED_DEADLINE;
   attr.sched_runtime  = 900000;  // each tx thread requires .5ms to finish its job
   attr.sched_deadline = 1000000; // each tx thread will finish within 1ms
@@ -695,8 +637,8 @@ static void *UE_thread_tx(void *arg)
   char cpu_affinity[1024];
   cpu_set_t cpuset;
 
-  /* Set affinity mask to include CPUs 1 to MAX_CPUS */
-  /* CPU 0 is reserved for UHD threads */
+  // Set affinity mask to include CPUs 1 to MAX_CPUS 
+  // CPU 0 is reserved for UHD threads 
   CPU_ZERO(&cpuset);
 
   #ifdef CPU_AFFINITY
@@ -714,7 +656,7 @@ static void *UE_thread_tx(void *arg)
   }
 #endif
 
-  /* Check the actual affinity mask assigned to the thread */
+  // Check the actual affinity mask assigned to the thread
 
   s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
   if (s != 0)
@@ -836,44 +778,24 @@ static void *UE_thread_tx(void *arg)
 
   return &UE_thread_tx_retval;
 }
+*/
+
 
 /*!
- * \brief This is the UE receive thread.
+ * \brief This is the UE thread for RX subframe n and TX subframe n+4.
  * This thread performs the phy_procedures_UE_RX() on every received slot.
+ * then, if TX is enabled it performs TX for n+4. 
  * \param arg is a pointer to a \ref PHY_VARS_UE structure.
  * \returns a pointer to an int. The storage is not on the heap and must not be freed.
  */
 
-/*
-#ifdef OAI_USRP
-void rescale(int16_t *input,int length)
-{
-#if defined(__x86_64__) || defined(__i386__)
-  __m128i *input128 = (__m128i *)input;
-#elif defined(__arm__)
-  int16x8_t *input128 = (int16x8_t *)input;
-#endif
-  int i;
-
-  for (i=0; i<length>>2; i++) {
-#if defined(__x86_64__) || defined(__i386__)
-    input128[i] = _mm_srai_epi16(input128[i],4);
-#elif defined(__arm__)
-    input128[i] = vshrq_n_s16(input128[i],4);
-#endif
-  }
-}
-#endif
-*/
-
-static void *UE_thread_rx(void *arg)
+static void *UE_thread_rxn_txnp4(void *arg)
 {
   static int UE_thread_rx_retval;
-  PHY_VARS_UE *UE = (PHY_VARS_UE*)arg;
-  int i;
+  UE_rxtx_proc_t *proc = (UE_rxtx_proc_t *)arg;
   int ret;
-
-  UE->instance_cnt_rx=-1;
+  PHY_VARS_UE *UE=PHY_vars_UE_g[0][proc->CC_id];
+  proc->instance_cnt_rxtx=-1;
 
 
 #ifdef DEADLINE_SCHEDULER
@@ -970,10 +892,10 @@ static void *UE_thread_rx(void *arg)
   // Lock memory from swapping. This is a process wide call (not constraint to this thread).
   mlockall(MCL_CURRENT | MCL_FUTURE);
 
-  printf("waiting for sync (UE_thread_rx)\n");
+  printf("waiting for sync (UE_thread_rxn_txnp4)\n");
 
   pthread_mutex_lock(&sync_mutex);
-  printf("Locked sync_mutex, waiting (UE_thread_rx)\n");
+  printf("Locked sync_mutex, waiting (UE_thread_rxn_txnp4)\n");
 
   while (sync_var<0)
     pthread_cond_wait(&sync_cond, &sync_mutex);
@@ -981,160 +903,76 @@ static void *UE_thread_rx(void *arg)
   pthread_mutex_unlock(&sync_mutex);
   printf("unlocked sync_mutex, waiting (UE_thread_rx)\n");
 
-  printf("Starting UE RX thread\n");
+  printf("Starting UE RXN_TXNP4 thread\n");
 
   while (!oai_exit) {
-    if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
+    if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) {
       LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" );
       exit_fun("nothing to add");
       return &UE_thread_rx_retval;
     }
 
-    while (UE->instance_cnt_rx < 0) {
+    while (proc->instance_cnt_rxtx < 0) {
       // most of the time, the thread is waiting here
-      pthread_cond_wait( &UE->cond_rx, &UE->mutex_rx );
+      pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx );
     }
 
-    if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {
-      LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" );
+    if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) {
+      LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" );
       exit_fun("nothing to add");
       return &UE_thread_rx_retval;
     }
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 1 );
-    for (i=0; i<2; i++) {
-      if ((subframe_select( &UE->frame_parms, UE->slot_rx>>1 ) == SF_DL) ||
-          (UE->frame_parms.frame_type == FDD)) {
-	/*
-#ifdef OAI_USRP
-	// this does the adjustments of RX signal amplitude to bring into least 12 significant bits
-	int slot_length = UE->frame_parms.samples_per_tti>>1;
-	int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset;
-	int frame_length = UE->frame_parms.samples_per_tti*10;
-	int aa;
-	if (rx_offset > frame_length)
-	  rx_offset-=frame_length;
-
-
-	if (rx_offset >= 0) {
-	  if (rx_offset + slot_length < frame_length)
-	    for (aa=0;aa<UE->frame_parms.nb_antennas_rx;aa++)
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)],
-		      slot_length);
-	  else {
-	    int diff = rx_offset + slot_length - frame_length;
-	    for (aa=0;aa<UE->frame_parms.nb_antennas_rx;aa++){
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)],
-		      slot_length-diff);
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][0],
-		      diff);
-	    }
-	  }
-	}
-	else {
-	    for (aa=0;aa<UE->frame_parms.nb_antennas_rx;aa++){
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)],
-		      -rx_offset);
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][0],
-		      slot_length+rx_offset);
-	    }
-	}
-#endif
-	*/
-        phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL );
-      }
-
-      if ((subframe_select( &UE->frame_parms, UE->slot_rx>>1 ) == SF_S) &&
-          ((UE->slot_rx&1) == 0)) {
-	/*
-#ifdef OAI_USRP
-	// this does the adjustments of RX signal amplitude to bring into least 12 significant bits
-	int slot_length = UE->frame_parms.samples_per_tti>>1;
-	int rx_offset = (UE->slot_rx)*slot_length + UE->rx_offset;
-	int frame_length = UE->frame_parms.samples_per_tti*10;
-	if (rx_offset > frame_length)
-	  rx_offset-=frame_length;
-	int aa;
-
-	if (rx_offset >= 0) {
-	  if (rx_offset + slot_length < frame_length)
-	    for (aa=0;aa<UE->frame_parms.nb_antennas_rx;aa++)
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)],
-		      slot_length);
-	  else {
-	    int diff = rx_offset + slot_length - frame_length;
-	    for (aa=0;aa<UE->frame_parms.nb_antennas_rx;aa++){
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][rx_offset&(~0x3)],
-		      slot_length-diff);
-	      rescale((int16_t*)&UE->common_vars.rxdata[aa][0],
-		      diff);
-	    }
-	  }
-	}
-	else {
-	  for (aa=0;aa<UE->frame_parms.nb_antennas_rx;aa++){
-	    rescale((int16_t*)&UE->common_vars.rxdata[aa][(frame_length+rx_offset)&(~0x3)],
-		    -rx_offset);
-	    rescale((int16_t*)&UE->common_vars.rxdata[aa][0],
-		    slot_length+rx_offset);
-	  }
-	}
-#endif
-	*/
-        phy_procedures_UE_RX( UE, 0, 0, UE->mode, no_relay, NULL );
-      }
 
-      if ((UE->mac_enabled==1) && (i==0)) {
-        ret = mac_xface->ue_scheduler(UE->Mod_id,
-                                      UE->frame_tx,
-                                      UE->slot_rx>>1,
-                                      subframe_select(&UE->frame_parms,UE->slot_tx>>1),
-                                      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",
-                 UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 );
-          UE->UE_mode[0] = PRACH;
-        } else if (ret == PHY_RESYNCH) {
-          LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, trying to resynch\n",
-                 UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 );
-          UE->UE_mode[0] = RESYNCH;
-        } else if (ret == PHY_HO_PRACH) {
-          LOG_I( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u, return to PRACH and perform a contention-free access\n",
-                 UE->Mod_id, UE->frame_rx, UE->slot_tx>>1 );
-          UE->UE_mode[0] = PRACH;
-        }
-      }
-
-      UE->slot_rx++;
-
-      if (UE->slot_rx == 20) {
-        UE->slot_rx = 0;
-        UE->frame_rx++;
-        VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_UE, UE->frame_rx );
+    if ((subframe_select( &UE->frame_parms, proc->subframe_rx) == SF_DL) ||
+	(UE->frame_parms.frame_type == FDD) ||
+	(subframe_select( &UE->frame_parms, proc->subframe_rx ) == SF_S)) {
+      phy_procedures_UE_RX( UE, proc, 0, 0, UE->mode, no_relay, NULL );
+    }
+    
+    
+    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*/);
+      
+      if (ret == CONNECTION_LOST) {
+	LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n",
+	       UE->Mod_id, proc->frame_rx, proc->subframe_tx );
+	UE->UE_mode[0] = PRACH;
+      } else if (ret == PHY_RESYNCH) {
+	LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, trying to resynch\n",
+	       UE->Mod_id, proc->frame_rx, proc->subframe_tx );
+	UE->UE_mode[0] = RESYNCH;
+      } else if (ret == PHY_HO_PRACH) {
+	LOG_I( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u, return to PRACH and perform a contention-free access\n",
+	       UE->Mod_id, proc->frame_rx, proc->subframe_tx );
+	UE->UE_mode[0] = PRACH;
       }
-
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_UE, UE->slot_rx>>1 );
     }
+    
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RX, 0 );
-
-    if (pthread_mutex_lock(&UE->mutex_rx) != 0) {
+    
+    if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) {
       LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" );
       exit_fun("noting to add");
       return &UE_thread_rx_retval;
     }
-
-    UE->instance_cnt_rx--;
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, UE->instance_cnt_rx);
-
-    if (pthread_mutex_unlock(&UE->mutex_rx) != 0) {
+    
+    proc->instance_cnt_rxtx--;
+    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, proc->instance_cnt_rxtx);
+    
+    if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) {
       LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" );
       exit_fun("noting to add");
       return &UE_thread_rx_retval;
     }
   }
-
+  
   // thread finished
   return &UE_thread_rx_retval;
 }
@@ -1150,13 +988,185 @@ static void *UE_thread_rx(void *arg)
 /*!
  * \brief This is the main UE thread.
  * This thread controls the other three UE threads:
- * - UE_thread_rx
- * - UE_thread_tx
+ * - UE_thread_rxn_txnp4 (even subframes)
+ * - UE_thread_rxn_txnp4 (odd subframes)
  * - UE_thread_synch
  * \param arg unused
  * \returns a pointer to an int. The storage is not on the heap and must not be freed.
  */
-void *UE_thread(void *arg)
+
+void *UE_thread(void *arg) {
+
+  static int UE_thread_retval;
+  PHY_VARS_UE *UE = PHY_vars_UE_g[0][0];
+  //  int tx_enabled = 0;
+  unsigned int rxs;
+  int dummy_rx[UE->frame_parms.nb_antennas_rx][UE->frame_parms.samples_per_tti];
+  openair0_timestamp timestamp;
+  void* rxp[2];
+
+
+#ifdef NAS_UE
+  MessageDef *message_p;
+#endif
+
+  int start_rx_stream = 0;
+
+#ifdef DEADLINE_SCHEDULER
+
+  struct sched_attr attr;
+  unsigned int flags = 0;
+
+  attr.size = sizeof(attr);
+  attr.sched_flags = 0;
+  attr.sched_nice = 0;
+  attr.sched_priority = 0;//sched_get_priority_max(SCHED_DEADLINE);
+
+  // This creates a .5 ms  reservation
+  attr.sched_policy = SCHED_DEADLINE;
+  attr.sched_runtime  = 100000;
+  attr.sched_deadline = 500000;
+  attr.sched_period   = 500000;
+
+  if (sched_setattr(0, &attr, flags) < 0 ) {
+    perror("[SCHED] main eNB thread: sched_setattr failed\n");
+    exit_fun("Nothing to add");
+    return &UE_thread_retval;
+  }
+  LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %lu started on CPU %d\n",
+        (unsigned long)gettid(), sched_getcpu());
+
+#else
+  struct sched_param sp;
+  sp.sched_priority = sched_get_priority_max(SCHED_FIFO);
+  pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp);
+#endif
+
+  // Lock memory from swapping. This is a process wide call (not constraint to this thread).
+  mlockall(MCL_CURRENT | MCL_FUTURE);
+
+  printf("waiting for sync (UE_thread)\n");
+  pthread_mutex_lock(&sync_mutex);
+  printf("Locked sync_mutex, waiting (UE_thread)\n");
+
+  while (sync_var<0)
+    pthread_cond_wait(&sync_cond, &sync_mutex);
+
+  pthread_mutex_unlock(&sync_mutex);
+  printf("unlocked sync_mutex, waiting (UE_thread)\n");
+
+  printf("starting UE thread\n");
+
+#ifdef NAS_UE
+  message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE);
+  itti_send_msg_to_task (TASK_NAS_UE, INSTANCE_DEFAULT, message_p);
+#endif 
+
+  while (!oai_exit) {
+    
+    if (UE->is_synchronized == 0) {
+      
+      if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) {
+	LOG_E( PHY, "[SCHED][UE] verror locking mutex for UE initial synch thread\n" );
+	exit_fun("nothing to add");
+	return &UE_thread_retval;
+      }
+      
+      int instance_cnt_synch = UE->proc.instance_cnt_synch;
+      
+      if (pthread_mutex_unlock(&UE->proc.mutex_synch) != 0) {
+	LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE initial synch thread\n" );
+	exit_fun("nothing to add");
+	return &UE_thread_retval;
+      }
+      
+      if (instance_cnt_synch < 0) {  // we can invoke the synch
+	// grab 10 ms of signal and wakeup synch thread
+	for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
+	  rxp[i] = (void*)&rxdata[i][0];
+      
+	if (UE->mode != loop_through_memory) {
+	  rxs = openair0.trx_read_func(&openair0,
+				       &timestamp,
+				       rxp,
+				       UE->frame_parms.samples_per_tti*10,
+				       UE->frame_parms.nb_antennas_rx);
+	}
+	instance_cnt_synch = ++UE->proc.instance_cnt_synch;
+	if (instance_cnt_synch == 0) {
+	  if (pthread_cond_signal(&UE->proc.cond_synch) != 0) {
+	    LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n" );
+	    exit_fun("nothing to add");
+	    return &UE_thread_retval;
+	  }
+	} else {
+	  LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" );
+	  exit_fun("nothing to add");
+	  return &UE_thread_retval;
+	}
+      } // 
+      else {
+	// grab 10 ms of signal into dummy buffer
+
+	if (UE->mode != loop_through_memory) {
+	  for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
+	    rxp[i] = (void*)&dummy_rx[i][0];
+	  for (int sf=0;sf<10;sf++) 
+	    rxs = openair0.trx_read_func(&openair0,
+					 &timestamp,
+					 rxp,
+					 UE->frame_parms.samples_per_tti,
+					 UE->frame_parms.nb_antennas_rx);
+	}
+      }
+      
+    } // UE->is_synchronized==0
+    else {
+      if (start_rx_stream==0) {
+	start_rx_stream=1;
+	if (UE->mode != loop_through_memory) {
+	  LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset);
+	  rxs = openair0.trx_read_func(&openair0,
+				       &timestamp,
+				       (void**)rxdata,
+				       UE->rx_offset,
+				       UE->frame_parms.nb_antennas_rx);
+
+	  if (rxs != UE->rx_offset) {
+	    exit_fun("problem in rx");
+	    return &UE_thread_retval;
+	  }
+	  UE->rx_offset=0;
+	} //UE->mode != loop_through_memory
+	else
+	  rt_sleep_ns(1000000);
+	// read in first symbol (to process one subframe we need symbol 0 - 14 and 1st symbol of next subframe
+	rxs = openair0.trx_read_func(&openair0,
+				     &timestamp,
+				     (void**)rxdata,
+				     UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0,
+				     UE->frame_parms.nb_antennas_rx);
+      }// start_rx_stream==0
+      
+      if (UE->mode != loop_through_memory) {
+	for (int sf=0;sf<10;sf++) 
+	  for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
+	    rxp[i] = (void*)&dummy_rx[i][sf*UE->frame_parms.samples_per_tti];
+	
+	rxs = openair0.trx_read_func(&openair0,
+				     &timestamp,
+				     rxp,
+				     UE->frame_parms.samples_per_tti,
+				     UE->frame_parms.nb_antennas_rx);
+      }
+      
+    } // UE->is_synchronized==1
+      
+  } // while !oai_exit
+} // UE_thread
+
+/*
+void *UE_thread_old(void *arg)
 {
   UNUSED(arg)
   static int UE_thread_retval;
@@ -1176,6 +1186,7 @@ void *UE_thread(void *arg)
   int first_rx = 0;
   RTIME T0;
   unsigned int rxs;
+  void* rxp[2];
 
   openair0_timestamp timestamp;
 
@@ -1254,9 +1265,7 @@ void *UE_thread(void *arg)
       for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
         rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i];
       
-      /*      if (dummy_dump == 0)
-	      printf("writing %d samples to %d (first_rx %d)\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos,first_rx);*/
-      
+    
       if (UE->mode != loop_through_memory) {
 	rxs = openair0.trx_read_func(&openair0,
 				     &timestamp,
@@ -1342,7 +1351,7 @@ void *UE_thread(void *arg)
 
         if (instance_cnt_rx == 0) {
 	  LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 );
-          if (pthread_cond_signal(&UE->cond_rx) != 0) {
+          if (pthread_cond_signal(&UE->proc.cond_rx) != 0) {
             LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" );
             exit_fun("nothing to add");
             return &UE_thread_retval;
@@ -1538,7 +1547,7 @@ void *UE_thread(void *arg)
   return &UE_thread_retval;
 }
 
-
+*/
 
 /*!
  * \brief Initialize the UE theads.
@@ -1561,23 +1570,21 @@ void init_UE_threads(void)
 #endif
 
   // the threads are not yet active, therefore access is allowed without locking
-  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_setname_np( UE->thread_tx, "UE_thread_tx" );
-  pthread_create(&UE->thread_rx,NULL,UE_thread_rx,(void*)UE);
-  pthread_setname_np( UE->thread_rx, "UE_thread_rx" );
-  pthread_create(&UE->thread_synch,NULL,UE_thread_synch,(void*)UE);
-  pthread_setname_np( UE->thread_synch, "UE_thread_synch" );
-  UE->frame_tx = 0;
-  UE->frame_rx = 0;
+  UE->proc.proc_rxtx[0].instance_cnt_rxtx = -1;
+  UE->proc.proc_rxtx[1].instance_cnt_rxtx = -1;
+  UE->proc.instance_cnt_synch = -1;
+  pthread_mutex_init(&UE->proc.proc_rxtx[0].mutex_rxtx,NULL);
+  pthread_mutex_init(&UE->proc.proc_rxtx[1].mutex_rxtx,NULL);
+  pthread_mutex_init(&UE->proc.mutex_synch,NULL);
+  pthread_cond_init(&UE->proc.proc_rxtx[0].cond_rxtx,NULL);
+  pthread_cond_init(&UE->proc.proc_rxtx[1].cond_rxtx,NULL);
+  pthread_cond_init(&UE->proc.cond_synch,NULL);
+  pthread_create(&UE->proc.proc_rxtx[0].pthread_rxtx,NULL,UE_thread_rxn_txnp4,(void*)&UE->proc.proc_rxtx[0]);
+  pthread_setname_np( UE->proc.proc_rxtx[0].pthread_rxtx, "UE_thread_rxn_txnp4_even" );
+  pthread_create(&UE->proc.proc_rxtx[1].pthread_rxtx,NULL,UE_thread_rxn_txnp4,(void*)&UE->proc.proc_rxtx[1]);
+  pthread_setname_np( UE->proc.proc_rxtx[1].pthread_rxtx, "UE_thread_rxn_txnp4_odd" );
+  pthread_create(&UE->proc.pthread_synch,NULL,UE_thread_synch,(void*)UE);
+  pthread_setname_np( UE->proc.pthread_synch, "UE_thread_synch" );
 }
 
 
-- 
GitLab