diff --git a/openair1/PHY/INIT/defs.h b/openair1/PHY/INIT/defs.h
index f08ca678db02cdc77517e4eb3df7f58221089f87..f21ea458ddfc2078721392a822e991fbf83bc6fb 100644
--- a/openair1/PHY/INIT/defs.h
+++ b/openair1/PHY/INIT/defs.h
@@ -31,7 +31,7 @@
 
 #include "PHY/defs.h"
 
-#ifdef OPENAIR_LTE
+
 #include "SystemInformationBlockType2.h"
 //#include "RadioResourceConfigCommonSIB.h"
 #include "RadioResourceConfigDedicated.h"
@@ -41,18 +41,6 @@
 #ifdef Rel10
 #include "SCellToAddMod-r10.h"
 #endif
-#else
-
-/**
-\fn int phy_init(unsigned char nb_antennas_tx)
-\brief Allocate and Initialize the PHY variables after receiving static configuration
-@param nb_antennas_tx Number of TX antennas
-*/
-int phy_init(unsigned char nb_antennas_tx);
-#endif
-
-#ifdef OPENAIR_LTE
-
 /** @addtogroup _PHY_STRUCTURES_
  * @{
  */
@@ -325,17 +313,28 @@ void phy_config_dedicated_scell_eNB(uint8_t Mod_id,
                                     int CC_id);
 
 #endif
-#endif
+
 
 
 /*! !\fn void phy_cleanup(void)
 \brief Cleanup the PHY variables*/
 void phy_cleanup(void);
 
-#ifdef OPENAIR_LTE
+
 int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
 void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
-#endif
+
+void lte_param_init(unsigned char N_tx, 
+		    unsigned char N_rx,
+		    unsigned char transmission_mode,
+		    uint8_t extended_prefix_flag,
+		    frame_t frame_type, 
+		    uint16_t Nid_cell,
+		    uint8_t tdd_config,
+		    uint8_t N_RB_DL,
+		    uint8_t threequarter_fs,
+                    uint8_t osf,
+		    uint32_t perfect_ce);
 
 /** @} */
 #endif
diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c
index 9787c476a6cde640a0e1e7f653f7bc0f9bfa50db..5c8a5ec436525f0f57314a995f63bd42e7c205f8 100644
--- a/openair1/PHY/INIT/lte_init.c
+++ b/openair1/PHY/INIT/lte_init.c
@@ -121,7 +121,7 @@ void phy_config_sib2_eNB(uint8_t Mod_id,
   //int32_t rx_total_gain_eNB_dB        = PHY_vars_eNB_g[Mod_id][CC_id]->rx_total_gain_eNB_dB;
   int i;
 
-  LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[0].frame_tx);
+  LOG_D(PHY,"[eNB%d] CCid %d Frame %d: Applying radioResourceConfigCommon\n",Mod_id,CC_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc.frame_tx);
 
   frame_parms->prach_config_common.rootSequenceIndex                           =radioResourceConfigCommon->prach_Config.rootSequenceIndex;
   LOG_D(PHY,"prach_config_common.rootSequenceIndex = %d\n",frame_parms->prach_config_common.rootSequenceIndex );
@@ -388,7 +388,7 @@ void phy_config_sib13_eNB(uint8_t Mod_id,int CC_id,int mbsfn_Area_idx,
   LTE_DL_FRAME_PARMS *frame_parms = &PHY_vars_eNB_g[Mod_id][CC_id]->frame_parms;
 
 
-  LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc[0].frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx);
+  LOG_I(PHY,"[eNB%d] Frame %d: Applying MBSFN_Area_id %d for index %d\n",Mod_id,PHY_vars_eNB_g[Mod_id][CC_id]->proc.frame_tx,mbsfn_AreaId_r9,mbsfn_Area_idx);
 
   if (mbsfn_Area_idx == 0) {
     frame_parms->Nid_cell_mbsfn = (uint16_t)mbsfn_AreaId_r9;
@@ -409,7 +409,7 @@ void phy_config_dedicated_eNB_step2(PHY_VARS_eNB *eNB)
     physicalConfigDedicated = eNB->physicalConfigDedicated[UE_id];
 
     if (physicalConfigDedicated != NULL) {
-      LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id, eNB->proc[0].frame_tx,physicalConfigDedicated,UE_id);
+      LOG_I(PHY,"[eNB %d] Frame %d: Sent physicalConfigDedicated=%p for UE %d\n",eNB->Mod_id, eNB->proc.frame_tx,physicalConfigDedicated,UE_id);
       LOG_D(PHY,"------------------------------------------------------------------------\n");
 
       if (physicalConfigDedicated->pdsch_ConfigDedicated) {
@@ -644,7 +644,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id,
   int8_t UE_id = find_ue(rnti,eNB);
 
   if (UE_id == -1) {
-    LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, eNB->proc[0].frame_tx );
+    LOG_E( PHY, "[eNB %"PRIu8"] Frame %d: find_ue() returns -1\n", Mod_id, eNB->proc.frame_tx );
     return;
   }
 
@@ -653,7 +653,7 @@ void phy_config_dedicated_eNB(uint8_t Mod_id,
     eNB->physicalConfigDedicated[UE_id] = physicalConfigDedicated;
     LOG_I(PHY,"phy_config_dedicated_eNB: physicalConfigDedicated=%p\n",physicalConfigDedicated);
   } else {
-    LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, eNB->proc[0].frame_tx,UE_id);
+    LOG_E(PHY,"[eNB %d] Frame %d: Received NULL radioResourceConfigDedicated from eNB %d\n",Mod_id, eNB->proc.frame_tx,UE_id);
     return;
   }
 
diff --git a/openair1/PHY/INIT/lte_param_init.c b/openair1/PHY/INIT/lte_param_init.c
index d13b624cfd5fdff042bbd1839c91d382c7a9677a..0e18537965e04dd91483a86f46670a9332f03d2c 100644
--- a/openair1/PHY/INIT/lte_param_init.c
+++ b/openair1/PHY/INIT/lte_param_init.c
@@ -9,8 +9,8 @@
 #include "PHY/defs.h"
 #include "PHY/extern.h"
 
-extern PHY_VARS_eNB *PHY_vars_eNB;
-extern PHY_VARS_UE *PHY_vars_UE;
+extern PHY_VARS_eNB *eNB;
+extern PHY_VARS_UE *UE;
 
 void lte_param_init(unsigned char N_tx, 
 		    unsigned char N_rx,
@@ -30,8 +30,8 @@ void lte_param_init(unsigned char N_tx,
 
 
   printf("Start lte_param_init\n");
-  PHY_vars_eNB = malloc(sizeof(PHY_VARS_eNB));
-  PHY_vars_UE = malloc(sizeof(PHY_VARS_UE));
+  eNB = malloc(sizeof(PHY_VARS_eNB));
+  UE = malloc(sizeof(PHY_VARS_UE));
   //PHY_config = malloc(sizeof(PHY_CONFIG));
   mac_xface = malloc(sizeof(MAC_xface));
 
@@ -39,7 +39,7 @@ void lte_param_init(unsigned char N_tx,
   randominit(0);
   set_taus_seed(0);
 
-  frame_parms = &(PHY_vars_eNB->frame_parms);
+  frame_parms = &(eNB->frame_parms);
 
   frame_parms->N_RB_DL            = N_RB_DL;   //50 for 10MHz and 25 for 5 MHz
   frame_parms->N_RB_UL            = N_RB_DL;
@@ -66,40 +66,40 @@ void lte_param_init(unsigned char N_tx,
 
   //  phy_init_top(frame_parms); //allocation
 
-  PHY_vars_UE->is_secondary_ue = 0;
-  PHY_vars_UE->frame_parms = *frame_parms;
-  PHY_vars_eNB->frame_parms = *frame_parms;
+  UE->is_secondary_ue = 0;
+  UE->frame_parms = *frame_parms;
+  eNB->frame_parms = *frame_parms;
 
   phy_init_lte_top(frame_parms);
   dump_frame_parms(frame_parms);
 
-  PHY_vars_UE->measurements.n_adj_cells=0;
-  PHY_vars_UE->measurements.adj_cell_id[0] = Nid_cell+1;
-  PHY_vars_UE->measurements.adj_cell_id[1] = Nid_cell+2;
+  UE->measurements.n_adj_cells=0;
+  UE->measurements.adj_cell_id[0] = Nid_cell+1;
+  UE->measurements.adj_cell_id[1] = Nid_cell+2;
 
   for (i=0; i<3; i++)
-    lte_gold(frame_parms,PHY_vars_UE->lte_gold_table[i],Nid_cell+i);
+    lte_gold(frame_parms,UE->lte_gold_table[i],Nid_cell+i);
 
-  phy_init_lte_ue(PHY_vars_UE,1,0);
-  phy_init_lte_eNB(PHY_vars_eNB,0,0,0);
+  phy_init_lte_ue(UE,1,0);
+  phy_init_lte_eNB(eNB,0,0,0);
 
-  generate_pcfich_reg_mapping(&PHY_vars_UE->frame_parms);
-  generate_phich_reg_mapping(&PHY_vars_UE->frame_parms);
+  generate_pcfich_reg_mapping(&UE->frame_parms);
+  generate_phich_reg_mapping(&UE->frame_parms);
 
   // DL power control init
   if (transmission_mode == 1) {
-    PHY_vars_eNB->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
-    ((PHY_vars_eNB->frame_parms).pdsch_config_common).p_b = 0;
-    PHY_vars_UE->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
-    ((PHY_vars_UE->frame_parms).pdsch_config_common).p_b = 0;
+    eNB->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((eNB->frame_parms).pdsch_config_common).p_b = 0;
+    UE->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((UE->frame_parms).pdsch_config_common).p_b = 0;
   } else { // rho_a = rhob
-    PHY_vars_eNB->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
-    ((PHY_vars_eNB->frame_parms).pdsch_config_common).p_b = 1;
-    PHY_vars_UE->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
-    ((PHY_vars_UE->frame_parms).pdsch_config_common).p_b = 1;
+    eNB->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((eNB->frame_parms).pdsch_config_common).p_b = 1;
+    UE->pdsch_config_dedicated->p_a  = dB0; // 4 = 0dB
+    ((UE->frame_parms).pdsch_config_common).p_b = 1;
   }
 
-  PHY_vars_UE->perfect_ce = perfect_ce;
+  UE->perfect_ce = perfect_ce;
 
   printf("Done lte_param_init\n");
 
diff --git a/openair1/PHY/LTE_ESTIMATION/defs.h b/openair1/PHY/LTE_ESTIMATION/defs.h
index c20d24e34f2cb6ae324b87d13920617fdf889938..ebba52670d40b2d5325f43f7c36b45b518e7f3ea 100644
--- a/openair1/PHY/LTE_ESTIMATION/defs.h
+++ b/openair1/PHY/LTE_ESTIMATION/defs.h
@@ -219,7 +219,6 @@ void phy_adjust_gain (PHY_VARS_UE *phy_vars_ue,
 int lte_ul_channel_estimation(PHY_VARS_eNB *phy_vars_eNB,
                               module_id_t eNB_id,
                               module_id_t UE_id,
-                              uint8_t subframe,
                               uint8_t l,
                               uint8_t Ns,
                               uint8_t cooperation_flag);
@@ -242,7 +241,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
                            unsigned char number_of_cards,
                            short coef);
 
-int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id,uint8_t subframe);
+int lte_est_timing_advance_pusch(PHY_VARS_eNB* phy_vars_eNB,module_id_t UE_id);
 
 void lte_eNB_I0_measurements(PHY_VARS_eNB *phy_vars_eNB,
 			     int subframe,
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 7467dd38a54bff7028cfcfbd776b1a8811102d1a..6980ca358cb55686e0c47bb10679ebe0f9ee93a8 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -195,7 +195,7 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
 }
 
 
-int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id,uint8_t thread_id)
+int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id)
 {
   static int first_run=1;
   static int max_pos_fil2=0;
@@ -236,7 +236,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id,uint8_t thread_
     max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15;
 
 #ifdef DEBUG_PHY
-  LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc[thread_id].frame_rx,max_pos,max_pos_fil2,sync_pos);
+  LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,max_pos_fil2,sync_pos);
 #endif //DEBUG_PHY
 
   return(max_pos_fil2-sync_pos);
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
index 723b143d26144bfaee89c7d2368ae89f07b06925..84975c1deb416d674b824f66d583ca2a1179ff87 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_ul_channel_estimation.c
@@ -55,7 +55,6 @@ static int16_t ru_90c[2*128] = {32767, 0,32766, -402,32758, -804,32746, -1206,32
 int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
                                   uint8_t eNB_id,
                                   uint8_t UE_id,
-                                  uint8_t thread_id,
                                   unsigned char l,
                                   unsigned char Ns,
                                   uint8_t cooperation_flag)
@@ -68,8 +67,8 @@ int32_t lte_ul_channel_estimation(PHY_VARS_eNB *eNB,
   int32_t **ul_ch_estimates_0=  pusch_vars->drs_ch_estimates_0[eNB_id];
   int32_t **ul_ch_estimates_1=  pusch_vars->drs_ch_estimates_1[eNB_id];
   int32_t **rxdataF_ext=  pusch_vars->rxdataF_ext[eNB_id];
-  int subframe = eNB->proc[thread_id].subframe_rx;
-  uint8_t harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe);
+  int subframe = eNB->proc.subframe_rx;
+  uint8_t harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe);
   int16_t delta_phase = 0;
   int16_t *ru1 = ru_90;
   int16_t *ru2 = ru_90;
diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
index 90c67ed70fe817810cb7d58c0893864f2ea287c9..4538deee13c4149f3374f67ec9be03a18719cb94 100644
--- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c
+++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c
@@ -2,7 +2,7 @@
     OpenAirInterface
     Copyright(c) 1999 - 2014 Eurecom
 
-    OpenAirInterface is free software: you can redistribute it and/or modify
+    OpenAirInterface is free software: you can redistrirbute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation, either version 3 of the License, or
     (at your option) any later version.
@@ -7077,12 +7077,11 @@ int generate_ue_ulsch_params_from_dci(void *dci_pdu,
 
 }
 
-int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
+int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *eNB,
+				       void *dci_pdu,
                                        uint16_t rnti,
-                                       uint8_t thread_id,
                                        DCI_format_t dci_format,
                                        uint8_t UE_id,
-                                       PHY_VARS_eNB *eNB,
                                        uint16_t si_rnti,
                                        uint16_t ra_rnti,
                                        uint16_t p_rnti,
@@ -7096,7 +7095,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
   ANFBmode_t AckNackFBMode = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
   LTE_eNB_ULSCH_t *ulsch=eNB->ulsch[UE_id];
   LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
-  int subframe = eNB->proc[thread_id].subframe_tx;
+  int subframe = eNB->proc.subframe_tx;
 
   uint32_t cqi_req = 0;
   uint32_t dai = 0;
@@ -7117,11 +7116,10 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
 
     harq_pid = subframe2harq_pid(frame_parms,
                                  pdcch_alloc2ul_frame(frame_parms,
-						      eNB->proc[thread_id].frame_tx,
+						      eNB->proc.frame_tx,
 						      subframe),
                                  pdcch_alloc2ul_subframe(frame_parms,subframe));
     
-    //    printf("eNB: thread_id %d, subframe %d, frame_tx %d\n",thread_id,subframe,eNB->proc[thread_id].frame_tx);
 
     switch (frame_parms->N_RB_DL) {
     case 6:
@@ -7639,7 +7637,7 @@ int generate_eNB_ulsch_params_from_dci(void *dci_pdu,
 
 
     LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d, subframe %d : Programming PUSCH with n_DMRS2 %d (cshift %d)\n",
-          eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift);
+          eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe,ulsch->harq_processes[harq_pid]->n_DMRS2,cshift);
 
 
 
diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c
index e46fb1756ab3bcb6309bff94606747c25c883a71..54564637d646c940b0d844ef49da88ecc2f1531d 100644
--- a/openair1/PHY/LTE_TRANSPORT/phich.c
+++ b/openair1/PHY/LTE_TRANSPORT/phich.c
@@ -1416,7 +1416,6 @@ void rx_phich(PHY_VARS_UE *ue,
 }
 
 void generate_phich_top(PHY_VARS_eNB *eNB,
-                        unsigned char thread_id,
                         int16_t amp,
                         uint8_t sect_id,
                         uint8_t abstraction_flag)
@@ -1432,7 +1431,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
   uint8_t pusch_subframe;
   uint8_t UE_id;
   uint32_t pusch_frame;
-  int subframe = eNB->proc[thread_id].subframe_tx;
+  int subframe = eNB->proc.subframe_tx;
 
   // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211
 
@@ -1444,7 +1443,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
   if (frame_parms->Ncp == 1)
     NSF_PHICH = 2;
 
-  pusch_frame = phich_frame2_pusch_frame(frame_parms,eNB->proc[thread_id].frame_tx,subframe);
+  pusch_frame = phich_frame2_pusch_frame(frame_parms,eNB->proc.frame_tx,subframe);
   pusch_subframe = phich_subframe2_pusch_subframe(frame_parms,subframe);
   harq_pid = subframe2harq_pid(frame_parms,pusch_frame,pusch_subframe);
 
@@ -1453,7 +1452,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
       if (ulsch[UE_id]->harq_processes[harq_pid]->phich_active == 1) {
 
         LOG_D(PHY,"[eNB][PUSCH %d/%x] Frame %d subframe %d (pusch_subframe %d,pusch_frame %d) phich active %d\n",
-              harq_pid,ulsch[UE_id]->rnti,eNB->proc[thread_id].frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active);
+              harq_pid,ulsch[UE_id]->rnti,eNB->proc.frame_tx,subframe,pusch_subframe,pusch_frame,ulsch[UE_id]->harq_processes[harq_pid]->phich_active);
 
         ngroup_PHICH = (ulsch[UE_id]->harq_processes[harq_pid]->first_rb +
                         ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%Ngroup_PHICH;
@@ -1467,7 +1466,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
         nseq_PHICH = ((ulsch[UE_id]->harq_processes[harq_pid]->first_rb/Ngroup_PHICH) +
                       ulsch[UE_id]->harq_processes[harq_pid]->n_DMRS)%(2*NSF_PHICH);
         LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d Generating PHICH, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d dci_alloc %d)\n",
-              eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,
+              eNB->Mod_id,harq_pid,eNB->proc.frame_tx,
               subframe,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,
               ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
               ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
@@ -1475,7 +1474,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
 
         if (ulsch[UE_id]->Msg3_active == 1) {
           LOG_D(PHY,"[eNB %d][PUSCH %d][RAPROC] Frame %d, subframe %d: Generating Msg3 PHICH for UE %d, ngroup_PHICH %d/%d, nseq_PHICH %d : HI %d, first_rb %d\n",
-                eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe,
+                eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe,
                 UE_id,ngroup_PHICH,Ngroup_PHICH,nseq_PHICH,ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK,
                 ulsch[UE_id]->harq_processes[harq_pid]->first_rb);
         }
@@ -1505,7 +1504,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
             (ulsch[UE_id]->harq_processes[harq_pid]->rar_alloc == 0) ) {
           if (ulsch[UE_id]->harq_processes[harq_pid]->phich_ACK==0 ) {
             LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d, subframe %d : PHICH NACK / (no format0 DCI) Setting subframe_scheduling_flag\n",
-                  eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe);
+                  eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe);
             ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
             ulsch[UE_id]->harq_processes[harq_pid]->rvidx = rv_table[ulsch[UE_id]->harq_processes[harq_pid]->round&3];
             ulsch[UE_id]->harq_processes[harq_pid]->O_RI                                  = 0;
@@ -1515,7 +1514,7 @@ void generate_phich_top(PHY_VARS_eNB *eNB,
 
           } else {
             LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d PHICH ACK (no format0 DCI) Clearing subframe_scheduling_flag, setting round to 0\n",
-                  eNB->Mod_id,harq_pid,eNB->proc[thread_id].frame_tx,subframe);
+                  eNB->Mod_id,harq_pid,eNB->proc.frame_tx,subframe);
             ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 0;
             ulsch[UE_id]->harq_processes[harq_pid]->round=0;
           }
diff --git a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c
index 4e0d6bba02670a0a9487f0c84f29c2d4bd9ae1f5..b32d56f5be43e6ab68e6135db8bc4e217180285f 100644
--- a/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c
+++ b/openair1/PHY/LTE_TRANSPORT/pilots_mbsfn.c
@@ -43,13 +43,13 @@
 
 int generate_mbsfn_pilot(PHY_VARS_eNB *eNB,
                          int32_t **txdataF,
-                         int16_t amp,
-                         uint16_t subframe)
+                         int16_t amp)
+
 {
 
   LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
   uint32_t subframe_offset,Nsymb,samples_per_symbol;
-
+  int subframe = eNB->proc.subframe_tx;
 
 
   if (subframe<0 || subframe>= 10) {
diff --git a/openair1/PHY/LTE_TRANSPORT/pmch.c b/openair1/PHY/LTE_TRANSPORT/pmch.c
index 56a01b940e58f1ea02d445c9bcc340caf591cd29..084b2b1793e6aabb69e94b8680106d149b8a89c3 100644
--- a/openair1/PHY/LTE_TRANSPORT/pmch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pmch.c
@@ -286,11 +286,11 @@ void fill_UE_dlsch_MCH(PHY_VARS_UE *ue,int mcs,int ndi,int rvidx,int eNB_id)
   }
 }
 
-void generate_mch(PHY_VARS_eNB *eNB,int thread_id,uint8_t *a,int abstraction_flag)
+void generate_mch(PHY_VARS_eNB *eNB,uint8_t *a,int abstraction_flag)
 {
 
   int G;
-  int subframe = eNB->proc[thread_id].subframe_tx;
+  int subframe = eNB->proc.subframe_tx;
 
   if (abstraction_flag != 0) {
     if (eNB_transport_info_TB_index[eNB->Mod_id][eNB->CC_id]!=0)
@@ -312,18 +312,18 @@ void generate_mch(PHY_VARS_eNB *eNB,int thread_id,uint8_t *a,int abstraction_fla
               eNB->frame_parms.N_RB_DL,
               eNB->dlsch_MCH->harq_processes[0]->rb_alloc,
               get_Qm(eNB->dlsch_MCH->harq_processes[0]->mcs),1,
-              2,eNB->proc[thread_id].frame_tx,subframe);
+              2,eNB->proc.frame_tx,subframe);
 
     generate_mbsfn_pilot(eNB,
                          eNB->common_vars.txdataF[0],
-                         AMP,
-                         subframe);
+                         AMP);
+
 
     if (dlsch_encoding(a,
                        &eNB->frame_parms,
                        1,
                        eNB->dlsch_MCH,
-                       eNB->proc[thread_id].frame_tx,
+                       eNB->proc.frame_tx,
                        subframe,
                        &eNB->dlsch_rate_matching_stats,
                        &eNB->dlsch_turbo_encoding_stats,
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index c18982f1703f84deb027a26fc065a38c041c0432..15c7bda04561a4e5fa199ada878bad03d11fb6c4 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -1056,7 +1056,6 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1
 //__m128i mmtmpX0,mmtmpX1,mmtmpX2,mmtmpX3;
 
 void rx_prach(PHY_VARS_eNB *eNB,
-	      uint8_t subframe,
 	      uint16_t *preamble_energy_list, 
 	      uint16_t *preamble_delay_list, 
 	      uint16_t Nf, 
@@ -1065,7 +1064,7 @@ void rx_prach(PHY_VARS_eNB *eNB,
 
   int i;
   lte_frame_type_t frame_type = eNB->frame_parms.frame_type;
-
+  int subframe                = eNB->proc.subframe_rx;
   uint16_t rootSequenceIndex  = eNB->frame_parms.prach_config_common.rootSequenceIndex;
   uint8_t prach_ConfigIndex   = eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex;
   uint8_t Ncs_config          = eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig;
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index 9297d91376e214aedb2c4638db19c6570ef26130..829b05530e35b022f53a407d1317119f4beeccee 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -583,7 +583,7 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length)
   for (eNB_id=0; eNB_id<number_of_cards_l; eNB_id++) {
     len += sprintf(&buffer[len],"eNB %d/%d Frame %d: RX Gain %d dB, I0 %d dBm (%d,%d) dB \n",
                    eNB_id,number_of_cards_l,
-                   eNB->proc[0].frame_tx,
+                   eNB->proc.frame_tx,
                    eNB->rx_total_gain_dB,
                    eNB->measurements[eNB_id].n0_power_tot_dBm,
                    eNB->measurements[eNB_id].n0_power_dB[0],
@@ -621,9 +621,9 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length)
 
     
 	
-	len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),eNB->proc[0].frame_tx+1);
+	len += sprintf(&buffer[len],"Total DLSCH %d kbits / %d frames ",(eNB->total_transmitted_bits/1000),eNB->proc.frame_tx+1);
 	len += sprintf(&buffer[len],"Total DLSCH throughput %d kbps ",(eNB->total_dlsch_bitrate/1000));
-	len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,eNB->proc[0].frame_tx+1);
+	len += sprintf(&buffer[len],"Total DLSCH trans %d / %d frames\n",success,eNB->proc.frame_tx+1);
 	//len += sprintf(&buffer[len],"[eNB PROC] FULL MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->FULL_MUMIMO_transmissions,eNB->check_for_total_transmissions);
 	//len += sprintf(&buffer[len],"[eNB PROC] MU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_MUMIMO_transmissions,eNB->check_for_total_transmissions);
 	//len += sprintf(&buffer[len],"[eNB PROC] SU-MIMO Transmissions/Total Transmissions = %d/%d\n",eNB->check_for_SUMIMO_transmissions,eNB->check_for_total_transmissions);
diff --git a/openair1/PHY/LTE_TRANSPORT/proto.h b/openair1/PHY/LTE_TRANSPORT/proto.h
index 6b10a115df950e93c0d3e93b9de708f62a18efdd..fc9e80076049434909230ed7c988142becef4fc3 100644
--- a/openair1/PHY/LTE_TRANSPORT/proto.h
+++ b/openair1/PHY/LTE_TRANSPORT/proto.h
@@ -228,12 +228,11 @@ int mch_modulation(int32_t **txdataF,
 
 /** \brief Top-level generation function for eNB TX of MBSFN
     @param phy_vars_eNB Pointer to eNB variables
-    @param subframe Subframe for PMCH
     @param a Pointer to transport block
     @param abstraction_flag
 
 */
-void generate_mch(PHY_VARS_eNB *phy_vars_eNB,int subframe,uint8_t *a,int abstraction_flag);
+void generate_mch(PHY_VARS_eNB *phy_vars_eNB,uint8_t *a,int abstraction_flag);
 
 /** \brief This function generates the frequency-domain pilots (cell-specific downlink reference signals)
     @param phy_vars_eNB Pointer to eNB variables
@@ -301,8 +300,7 @@ int32_t generate_pilots_slot(PHY_VARS_eNB *phy_vars_eNB,
 
 int32_t generate_mbsfn_pilot(PHY_VARS_eNB *phy_vars_eNB,
                              int32_t **txdataF,
-                             int16_t amp,
-                             uint16_t subframe);
+                             int16_t amp);
 
 int32_t generate_pss(int32_t **txdataF,
                      int16_t amp,
@@ -1409,27 +1407,26 @@ int32_t generate_ue_ulsch_params_from_rar(PHY_VARS_UE *phy_vars_ue,
     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(void *dci_pdu,
+int generate_eNB_ulsch_params_from_dci(PHY_VARS_eNB *PHY_vars_eNB,
+				       void *dci_pdu,
                                        rnti_t rnti,
-                                       uint8_t subframe,
-                                       DCI_format_t dci_format,
+				       DCI_format_t dci_format,
                                        uint8_t UE_id,
-                                       PHY_VARS_eNB *PHY_vars_eNB,
-                                       uint16_t si_rnti,
+				       uint16_t si_rnti,
                                        uint16_t ra_rnti,
                                        uint16_t p_rnti,
                                        uint16_t cba_rnti,
                                        uint8_t use_srs);
 
-#ifdef USER_MODE
-void dump_ulsch(PHY_VARS_eNB *phy_vars_eNb,uint8_t subframe, uint8_t UE_id);
+
+void dump_ulsch(PHY_VARS_eNB *phy_vars_eNb,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);
-#endif
+
 
 int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci);
 
@@ -1477,14 +1474,12 @@ void generate_RIV_tables(void);
 int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode);
 
 void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
-              uint32_t subframe,
               uint8_t eNB_id,  // this is the effective sector id
               uint8_t UE_id,
               LTE_eNB_ULSCH_t **ulsch,
               uint8_t cooperation_flag);
 
 void rx_ulsch_emul(PHY_VARS_eNB *phy_vars_eNB,
-                   uint8_t subframe,
                    uint8_t sect_id,
                    uint8_t UE_index);
 
@@ -1532,18 +1527,15 @@ int32_t ulsch_encoding_emul(uint8_t *ulsch_buffer,
 */
 unsigned int  ulsch_decoding(PHY_VARS_eNB *phy_vars_eNB,
                              uint8_t UE_id,
-                             uint8_t subframe,
                              uint8_t control_only_flag,
                              uint8_t Nbundled,
                              uint8_t llr8_flag);
 
 uint32_t ulsch_decoding_emul(PHY_VARS_eNB *phy_vars_eNB,
-                             uint8_t subframe,
                              uint8_t UE_index,
                              uint16_t *crnti);
 
 void generate_phich_top(PHY_VARS_eNB *phy_vars_eNB,
-                        uint8_t subframe,
                         int16_t amp,
                         uint8_t sect_id,
                         uint8_t abstraction_flag);
@@ -1671,11 +1663,11 @@ uint32_t rx_pucch(PHY_VARS_eNB *phy_vars_eNB,
 		  uint8_t pucch1_thres);
 
 int32_t rx_pucch_emul(PHY_VARS_eNB *phy_vars_eNB,
-		       uint8_t UE_index,
-		       PUCCH_FMT_t fmt,
-		       uint8_t n1_pucch_sel,
-		       uint8_t *payload,
-		       uint8_t subframe);
+		      uint8_t UE_index,
+		      PUCCH_FMT_t fmt,
+		      uint8_t n1_pucch_sel,
+		      uint8_t *payload);
+
 
 
 /*!
@@ -1702,7 +1694,6 @@ int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,
 /*!
   \brief Process PRACH waveform
   @param phy_vars_eNB Pointer to eNB top-level descriptor
-  @param subframe subframe index to operate on
   @param preamble_energy_list List of energies for each candidate preamble
   @param preamble_delay_list List of delays for each candidate preamble
   @param Nf System frame number
@@ -1710,7 +1701,7 @@ int32_t generate_prach(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,
   @returns 0 on success
 
 */
-void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint8_t subframe,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex);
+void rx_prach(PHY_VARS_eNB *phy_vars_eNB,uint16_t *preamble_energy_list, uint16_t *preamble_delay_list, uint16_t Nf, uint8_t tdd_mapindex);
 
 /*!
   \brief Helper for MAC, returns number of available PRACH in TDD for a particular configuration index
diff --git a/openair1/PHY/LTE_TRANSPORT/pucch.c b/openair1/PHY/LTE_TRANSPORT/pucch.c
index 75ebcdfbfeeda23ac31a8752ad9b979ebd689e1c..547a0f2217262392dacdb79d47af58679f314688 100644
--- a/openair1/PHY/LTE_TRANSPORT/pucch.c
+++ b/openair1/PHY/LTE_TRANSPORT/pucch.c
@@ -1067,12 +1067,12 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *eNB,
                       uint8_t UE_index,
                       PUCCH_FMT_t fmt,
                       uint8_t n1_pucch_sel,
-                      uint8_t *payload,
-                      uint8_t thread_id)
+                      uint8_t *payload)
+
 {
   uint8_t UE_id;
   uint16_t rnti;
-  int subframe = eNB->proc[thread_id].subframe_rx;
+  int subframe = eNB->proc.subframe_rx;
   uint8_t CC_id = eNB->CC_id;
 
   rnti = eNB->ulsch[UE_index]->rnti;
@@ -1095,7 +1095,7 @@ int32_t rx_pucch_emul(PHY_VARS_eNB *eNB,
     payload[0] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[0];
     payload[1] = PHY_vars_UE_g[UE_id][CC_id]->pucch_payload[1];
   } else
-    LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",eNB->proc[thread_id].frame_rx);
+    LOG_E(PHY,"[eNB] Frame %d: Can't handle formats 2/2a/2b\n",eNB->proc.frame_rx);
 
   if (PHY_vars_UE_g[UE_id][CC_id]->pucch_sel[subframe] == n1_pucch_sel)
     return(99);
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
index 4e45a856bdbbe79a2f74b188f1bdecc60bf52e81..035b3bce61b6351f9618006a7316278176b45ca1 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_coding.c
@@ -70,35 +70,35 @@ void free_ue_ulsch(LTE_UE_ULSCH_t *ulsch)
 
   if (ulsch) {
 #ifdef DEBUG_ULSCH_FREE
-    msg("Freeing ulsch %p\n",ulsch);
+    printf("Freeing ulsch %p\n",ulsch);
 #endif
 
     for (i=0; i<8; i++) {
 #ifdef DEBUG_ULSCH_FREE
-      msg("Freeing ulsch process %d\n",i);
+      printf("Freeing ulsch process %d\n",i);
 #endif
 
       if (ulsch->harq_processes[i]) {
 #ifdef DEBUG_ULSCH_FREE
-        msg("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]);
+        printf("Freeing ulsch process %d (%p)\n",i,ulsch->harq_processes[i]);
 #endif
 
         if (ulsch->harq_processes[i]->b) {
           free16(ulsch->harq_processes[i]->b,MAX_ULSCH_PAYLOAD_BYTES);
           ulsch->harq_processes[i]->b = NULL;
 #ifdef DEBUG_ULSCH_FREE
-          msg("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b);
+          printf("Freeing ulsch process %d b (%p)\n",i,ulsch->harq_processes[i]->b);
 #endif
         }
 
 #ifdef DEBUG_ULSCH_FREE
-        msg("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c);
+        printf("Freeing ulsch process %d c (%p)\n",i,ulsch->harq_processes[i]->c);
 #endif
 
         for (r=0; r<MAX_NUM_ULSCH_SEGMENTS; r++) {
 
 #ifdef DEBUG_ULSCH_FREE
-          msg("Freeing ulsch process %d c[%d] (%p)\n",i,r,ulsch->harq_processes[i]->c[r]);
+          printf("Freeing ulsch process %d c[%d] (%p)\n",i,r,ulsch->harq_processes[i]->c[r]);
 #endif
 
           if (ulsch->harq_processes[i]->c[r]) {
@@ -302,7 +302,7 @@ uint32_t ulsch_encoding(uint8_t *a,
     ulsch->harq_processes[harq_pid]->control_only = 0;
 
 #ifdef DEBUG_ULSCH_CODING
-    msg("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n",
+    printf("[PHY][UE] ULSCH coding : A %d, Qm %d, mcs %d, harq_pid %d, round %d, RV %d\n",
         ulsch->harq_processes[harq_pid]->TBS,
         Q_m,
         ulsch->harq_processes[harq_pid]->mcs,
@@ -311,16 +311,16 @@ uint32_t ulsch_encoding(uint8_t *a,
         ulsch->harq_processes[harq_pid]->rvidx);
 
     for (i=0; i<ulsch->harq_processes[harq_pid]->O_ACK; i++)
-      msg("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]);
+      printf("ulsch_coding: o_ACK[%d] %d\n",i,ulsch->o_ACK[i]);
 
     for (i=0; i<ulsch->O_RI; i++)
-      msg("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]);
+      printf("ulsch_coding: o_RI[%d] %d\n",i,ulsch->o_RI[i]);
 
-    msg("ulsch_coding: O=%d\n",ulsch->O);
+    printf("ulsch_coding: O=%d\n",ulsch->O);
 
     for (i=0; i<1+((8+ulsch->O)/8); i++) {
       //    ulsch->o[i] = i;
-      msg("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]);
+      printf("ulsch_coding: O[%d] %d\n",i,ulsch->o[i]);
     }
 
     if ((tmode != 4))
@@ -380,20 +380,20 @@ uint32_t ulsch_encoding(uint8_t *a,
 
 
 #ifdef DEBUG_ULSCH_CODING
-        msg("Generating Code Segment %d (%d bits)\n",r,Kr);
+        printf("Generating Code Segment %d (%d bits)\n",r,Kr);
         // generate codewords
 
-        msg("bits_per_codeword (Kr)= %d\n",Kr);
-        msg("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
-        msg("Ncp %d\n",frame_parms->Ncp);
-        msg("Qm %d\n",Q_m);
+        printf("bits_per_codeword (Kr)= %d\n",Kr);
+        printf("N_RB = %d\n",ulsch->harq_processes[harq_pid]->nb_rb);
+        printf("Ncp %d\n",frame_parms->Ncp);
+        printf("Qm %d\n",Q_m);
 #endif
 
         //  offset=0;
 
 
 #ifdef DEBUG_ULSCH_CODING
-        msg("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
+        printf("Encoding ... iind %d f1 %d, f2 %d\n",iind,f1f2mat_old[iind*2],f1f2mat_old[(iind*2)+1]);
 #endif
         start_meas(te_stats);
         threegpplte_turbo_encoder(ulsch->harq_processes[harq_pid]->c[r],
@@ -526,7 +526,7 @@ uint32_t ulsch_encoding(uint8_t *a,
 
     for (r=0; r<ulsch->harq_processes[harq_pid]->C; r++) {
 #ifdef DEBUG_ULSCH_CODING
-      msg("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
+      printf("Rate Matching, Code segment %d (coded bits (G) %d,unpunctured/repeated bits per code segment %d,mod_order %d, nb_rb %d)...\n",
           r,
           G,
           Kr*3,
@@ -633,7 +633,7 @@ uint32_t ulsch_encoding(uint8_t *a,
   //  Do ACK coding, Section 5.2.2.6 36.213 (p.23-24 in v8.6)
   wACK_idx = (ulsch->bundling==0) ? 4 : ((Nbundled-1)&3);
 #ifdef DEBUG_ULSCH_CODING
-  msg("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
+  printf("ulsch_coding.c: Bundling %d, Nbundled %d, wACK_idx %d\n",
       ulsch->bundling,Nbundled,wACK_idx);
 #endif
 
@@ -865,7 +865,7 @@ uint32_t ulsch_encoding(uint8_t *a,
     for (q=0; q<Q_m; q++) {
       y[q+(Q_m*((r*Cmux) + columnset[j]))]  = ulsch->q_ACK[(q+(Q_m*i))%len_ACK];
 #ifdef DEBUG_ULSCH_CODING
-      msg("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i),
+      printf("ulsch_coding.c: ACK %d => y[%d]=%d (i %d, r*Cmux %d, columnset %d)\n",q+(Q_m*i),
           q+(Q_m*((r*Cmux) + columnset[j])),ulsch->q_ACK[(q+(Q_m*i))%len_ACK],
           i,r*Cmux,columnset[j]);
 #endif
@@ -965,7 +965,7 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer,
     //    print_CQI(ulsch->o,ulsch->uci_format,eNB_id);
 
     // save PUSCH pmi for later (transmission modes 4,5,6)
-    //    msg("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
+    //    printf("ulsch: saving pmi for DL %x\n",pmi2hex_2Ar1(((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi));
     // if (ulsch->uci_format != HLC_subband_cqi_mcs_CBA)
     dlsch[0]->harq_processes[harq_pid]->pmi_alloc = ((wideband_cqi_rank1_2A_5MHz *)ulsch->o)->pmi;
   }
@@ -986,20 +986,20 @@ int ulsch_encoding_emul(uint8_t *ulsch_buffer,
   UE_transport_info[ue->Mod_id][ue->CC_id].eNB_id[0]  = eNB_id;
   UE_transport_info[ue->Mod_id][ue->CC_id].harq_pid[0] = harq_pid;
   UE_transport_info[ue->Mod_id][ue->CC_id].tbs[0]     = ue->ulsch[eNB_id]->harq_processes[harq_pid]->TBS>>3 ;
-  // msg("\nue->Mod_id%d\n",ue->Mod_id);
+  // printf("\nue->Mod_id%d\n",ue->Mod_id);
 
   UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_flag = 1;
   //UE_transport_info[ue->Mod_id].cntl.pusch_uci = *(uint32_t *)ulsch->o;
   memcpy(UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_uci,
          ulsch->o,
          MAX_CQI_BYTES);
-  // msg("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1);
+  // printf("[UE]cqi is %d \n", ((HLC_subband_cqi_rank1_2A_5MHz *)ulsch->o)->cqi1);
 
   UE_transport_info[ue->Mod_id][ue->CC_id].cntl.length_uci = ulsch->O;
   UE_transport_info[ue->Mod_id][ue->CC_id].cntl.uci_format = ulsch->uci_format;
   UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ri = (ulsch->o_RI[0]&1)+((ulsch->o_RI[1]&1)<<1);
   UE_transport_info[ue->Mod_id][ue->CC_id].cntl.pusch_ack =   (ulsch->o_ACK[0]&1) + ((ulsch->o_ACK[1]&1)<<1);
-  //msg("ack is %d %d %d\n",UE_transport_info[ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1);
+  //printf("ack is %d %d %d\n",UE_transport_info[ue->Mod_id].cntl.pusch_ack, (ulsch->o_ACK[1]&1)<<1, ulsch->o_ACK[0]&1);
   return(0);
 
 }
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
index 4a6bfa5f52c86a2ba0b5b0eb08b4a15b9cc11675..0850836b361313b498ff2789a3d8ae233e7051b7 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_decoding.c
@@ -220,7 +220,6 @@ uint8_t extract_cqi_crc(uint8_t *cqi,uint8_t CQI_LENGTH)
 
 unsigned int  ulsch_decoding(PHY_VARS_eNB *eNB,
                              uint8_t UE_id,
-                             uint8_t thread_id,
                              uint8_t control_only_flag,
                              uint8_t Nbundled,
                              uint8_t llr8_flag)
@@ -260,7 +259,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *eNB,
   int16_t cseq[6*14*1200];
   int off;
   int status[20];
-  int subframe = eNB->proc[thread_id].subframe_rx;
+  int subframe = eNB->proc.subframe_rx;
   LTE_UL_eNB_HARQ_t *ulsch_harq;
 
   uint8_t (*tc)(int16_t *y,
@@ -279,7 +278,7 @@ unsigned int  ulsch_decoding(PHY_VARS_eNB *eNB,
                 time_stats_t *,
                 time_stats_t *);
 
-  harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe);
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING0+harq_pid,1);
 
@@ -1501,18 +1500,17 @@ int ulsch_abstraction_MIESM(double* sinr_dB,uint8_t TM, uint8_t mcs,uint16_t nrb
 #endif
 
 uint32_t ulsch_decoding_emul(PHY_VARS_eNB *eNB,
-                             uint8_t thread_id,
                              uint8_t UE_index,
                              uint16_t *crnti)
 {
 
   uint8_t UE_id;
   uint16_t rnti;
-  int subframe = eNB->proc[thread_id].subframe_rx;
+  int subframe = eNB->proc.subframe_rx;
   uint8_t harq_pid;
   uint8_t CC_id = eNB->CC_id;
 
-  harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc[thread_id].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc.frame_rx,subframe);
 
   rnti = eNB->ulsch[UE_index]->rnti;
 #ifdef DEBUG_PHY
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index 87c21b6a6b76f74a2771a0d4cb07a54cc33eaf43..53cab326f1422419747c1f2858c29f12f7303666 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1577,7 +1577,6 @@ int32_t avgU[2];
 int32_t avgU_0[2],avgU_1[2]; // For the Distributed Alamouti Scheme
 
 void rx_ulsch(PHY_VARS_eNB *eNB,
-              uint32_t thread_id,
               uint8_t eNB_id,  // this is the effective sector id
               uint8_t UE_id,
               LTE_eNB_ULSCH_t **ulsch,
@@ -1603,9 +1602,9 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
   uint8_t Qm;
   uint16_t rx_power_correction;
   int16_t *llrp;
-  int subframe = eNB->proc[thread_id].subframe_rx;
+  int subframe = eNB->proc.subframe_rx;
 
-  harq_pid = subframe2harq_pid(frame_parms,eNB->proc[thread_id].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(frame_parms,eNB->proc.frame_rx,subframe);
   Qm = get_Qm_ul(ulsch[UE_id]->harq_processes[harq_pid]->mcs);
 #ifdef DEBUG_ULSCH
   msg("rx_ulsch: eNB_id %d, harq_pid %d, nb_rb %d first_rb %d, cooperation %d\n",eNB_id,harq_pid,ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,ulsch[UE_id]->harq_processes[harq_pid]->first_rb,
@@ -1640,7 +1639,6 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
     lte_ul_channel_estimation(eNB,
                               eNB_id,
                               UE_id,
-                              thread_id,
                               l%(frame_parms->symbols_per_tti/2),
                               l/(frame_parms->symbols_per_tti/2),
                               cooperation_flag);
@@ -1887,25 +1885,24 @@ void rx_ulsch(PHY_VARS_eNB *eNB,
 }
 
 void rx_ulsch_emul(PHY_VARS_eNB *eNB,
-                   uint8_t subframe,
                    uint8_t sect_id,
                    uint8_t UE_index)
 {
-  msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,subframe,sect_id,UE_index);
+  msg("[PHY] EMUL eNB %d rx_ulsch_emul : subframe %d, sect_id %d, UE_index %d\n",eNB->Mod_id,eNB->proc.subframe_rx,sect_id,UE_index);
   eNB->pusch_vars[UE_index]->ulsch_power[0] = 31622; //=45dB;
   eNB->pusch_vars[UE_index]->ulsch_power[1] = 31622; //=45dB;
 
 }
 
 
-void dump_ulsch(PHY_VARS_eNB *eNB,uint8_t thread_id, uint8_t UE_id)
+void dump_ulsch(PHY_VARS_eNB *eNB,uint8_t UE_id)
 {
 
   uint32_t nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
   uint8_t harq_pid;
-  int subframe = eNB->proc[thread_id].subframe_rx;
+  int subframe = eNB->proc.subframe_rx;
 
-  harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc[thread_id].frame_rx,subframe);
+  harq_pid = subframe2harq_pid(&eNB->frame_parms,eNB->proc.frame_rx,subframe);
 
   printf("Dumping ULSCH in subframe %d with harq_pid %d, for NB_rb %d, mcs %d, Qm %d, N_symb %d\n", subframe,harq_pid,eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb,
          eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs,get_Qm_ul(eNB->ulsch[UE_id]->harq_processes[harq_pid]->mcs),
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c
index b4f7f024803d0595c1fa0d674fae81d5cb3f5559..32d3f3e34db4f1b992204d3c1dd82ca717b92d07 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_modulation.c
@@ -45,7 +45,7 @@
 #include "defs.h"
 #include "UTIL/LOG/vcd_signal_dumper.h"
 
-//#define OFDMA_ULSCH
+
 
 //#define DEBUG_ULSCH_MODULATION
 
@@ -72,7 +72,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
 #elif defined(__arm__)
   int16x8_t norm128;
 #endif
-  //  msg("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH);
+  //  printf("Doing lte_dft for Msc_PUSCH %d\n",Msc_PUSCH);
 
   d0 = (uint32_t *)d;
   d1 = d0+Msc_PUSCH;
@@ -87,7 +87,7 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
   d10 = d9+Msc_PUSCH;
   d11 = d10+Msc_PUSCH;
 
-  //  msg("symbol 0 (d0 %p, d %p)\n",d0,d);
+  //  printf("symbol 0 (d0 %p, d %p)\n",d0,d);
   for (i=0,ip=0; i<Msc_PUSCH; i++,ip+=4) {
     dft_in0[ip]   =  d0[i];
     dft_in0[ip+1] =  d1[i];
@@ -101,13 +101,13 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
     dft_in2[ip+1] =  d9[i];
     dft_in2[ip+2] =  d10[i];
     dft_in2[ip+3] =  d11[i];
-    //    msg("dft%d %d: %d,%d,%d,%d\n",Msc_PUSCH,ip,d0[i],d1[i],d2[i],d3[i]);
+    //    printf("dft%d %d: %d,%d,%d,%d\n",Msc_PUSCH,ip,d0[i],d1[i],d2[i],d3[i]);
 
     //    dft_in_re2[ip+1] =  d9[i];
     //    dft_in_re2[ip+2] =  d10[i];
   }
 
-  //  msg("\n");
+  //  printf("\n");
 
   switch (Msc_PUSCH) {
   case 12:
@@ -350,10 +350,10 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
   z10 = z9+Msc_PUSCH;
   z11 = z10+Msc_PUSCH;
 
-  //  msg("symbol0 (dft)\n");
+  //  printf("symbol0 (dft)\n");
   for (i=0,ip=0; i<Msc_PUSCH; i++,ip+=4) {
     z0[i]     = dft_out0[ip];
-    //    msg("%d,%d,",((short*)&z0[i])[0],((short*)&z0[i])[1]);
+    //    printf("%d,%d,",((short*)&z0[i])[0],((short*)&z0[i])[1]);
     z1[i]     = dft_out0[ip+1];
     z2[i]     = dft_out0[ip+2];
     z3[i]     = dft_out0[ip+3];
@@ -365,11 +365,11 @@ void dft_lte(int32_t *z,int32_t *d, int32_t Msc_PUSCH, uint8_t Nsymb)
     z9[i]     = dft_out2[ip+1];
     z10[i]    = dft_out2[ip+2];
     z11[i]    = dft_out2[ip+3];
-    //    msg("out dft%d %d: %d,%d,%d,%d,%d,%d,%d,%d\n",Msc_PUSCH,ip,z0[i],z1[i],z2[i],z3[i],z4[i],z5[i],z6[i],z7[i]);
+    //    printf("out dft%d %d: %d,%d,%d,%d,%d,%d,%d,%d\n",Msc_PUSCH,ip,z0[i],z1[i],z2[i],z3[i],z4[i],z5[i],z6[i],z7[i]);
 
   }
 
-  //  msg("\n");
+  //  printf("\n");
 }
 
 #endif
@@ -403,7 +403,7 @@ void ulsch_modulation(int32_t **txdataF,
   uint8_t c;
 
   if (!ulsch) {
-    msg("ulsch_modulation.c: Null ulsch\n");
+    printf("ulsch_modulation.c: Null ulsch\n");
     return;
   }
 
@@ -411,7 +411,7 @@ void ulsch_modulation(int32_t **txdataF,
   x2 = (ulsch->rnti<<14) + (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.3.1
 
   if (harq_pid > 7) {
-    msg("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid);
+    printf("ulsch_modulation.c: Illegal harq_pid %d\n",harq_pid);
     return;
   }
 
@@ -419,12 +419,12 @@ void ulsch_modulation(int32_t **txdataF,
   nb_rb = ulsch->harq_processes[harq_pid]->nb_rb;
 
   if (nb_rb == 0) {
-    msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb);
+    printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal nb_rb %d\n",frame,subframe,nb_rb);
     return;
   }
 
   if (first_rb >25 ) {
-    msg("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb);
+    printf("ulsch_modulation.c: Frame %d, Subframe %d Illegal first_rb %d\n",frame,subframe,first_rb);
     return;
   }
 
@@ -439,12 +439,12 @@ void ulsch_modulation(int32_t **txdataF,
   Msc_PUSCH = ulsch->harq_processes[harq_pid]->nb_rb*12;
 
 #ifdef DEBUG_ULSCH_MODULATION
-  msg("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n",
+  printf("ulsch_modulation.c: Doing modulation (rnti %x,x2 %x) for G=%d bits, harq_pid %d , nb_rb %d, Q_m %d, Nsymb_pusch %d (nsymb %d), subframe %d\n",
       ulsch->rnti,x2,G,harq_pid,ulsch->harq_processes[harq_pid]->nb_rb,Q_m, ulsch->Nsymb_pusch,nsymb,subframe);
 #endif
 
   // scrambling (Note the placeholding bits are handled in ulsch_coding.c directly!)
-  //msg("ulsch bits: ");
+  //printf("ulsch bits: ");
   s = lte_gold_generic(&x1, &x2, 1);
   k=0;
 
@@ -454,14 +454,14 @@ void ulsch_modulation(int32_t **txdataF,
       c = (uint8_t)((s>>j)&1);
 
       if (ulsch->h[k] == PUSCH_x) {
-        //  msg("i %d: PUSCH_x\n",i);
+        //  printf("i %d: PUSCH_x\n",i);
         ulsch->b_tilde[k] = 1;
       } else if (ulsch->h[k] == PUSCH_y) {
-        //  msg("i %d: PUSCH_y\n",i);
+        //  printf("i %d: PUSCH_y\n",i);
         ulsch->b_tilde[k] = ulsch->b_tilde[k-1];
       } else {
         ulsch->b_tilde[k] = (ulsch->h[k]+c)&1;
-        //  msg("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c);
+        //  printf("i %d : %d (h %d c %d)\n", (i<<5)+j,ulsch->b_tilde[k],ulsch->h[k],c);
       }
 
     }
@@ -469,7 +469,7 @@ void ulsch_modulation(int32_t **txdataF,
     s = lte_gold_generic(&x1, &x2, 0);
   }
 
-  //msg("\n");
+  //printf("\n");
 
 
   gain_lin_QPSK = (short)((amp*ONE_OVER_SQRT2_Q15)>>15);
@@ -493,7 +493,7 @@ void ulsch_modulation(int32_t **txdataF,
         ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1)  ? (gain_lin_QPSK) : -gain_lin_QPSK;
         ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK;
         //      if (i<Msc_PUSCH)
-        //  msg("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
+        //  printf("input %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
 
         // UE1, x0*
         ((int16_t*)&ulsch->d[i+1])[0] = (ulsch->b_tilde[j-2] == 1)  ? (-gain_lin_QPSK) : gain_lin_QPSK;
@@ -626,7 +626,7 @@ void ulsch_modulation(int32_t **txdataF,
         ((int16_t*)&ulsch->d[i])[0] = (ulsch->b_tilde[j] == 1)  ? (-gain_lin_QPSK) : gain_lin_QPSK;
         ((int16_t*)&ulsch->d[i])[1] = (ulsch->b_tilde[j+1] == 1)? (-gain_lin_QPSK) : gain_lin_QPSK;
         //        if (i<Msc_PUSCH)
-        //    msg("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
+        //    printf("input %d/%d Msc_PUSCH %d (%p): %d,%d\n", i,Msymb,Msc_PUSCH,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
 
         break;
 
@@ -650,7 +650,7 @@ void ulsch_modulation(int32_t **txdataF,
 
         ((int16_t*)&ulsch->d[i])[0]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_re])>>15);
         ((int16_t*)&ulsch->d[i])[1]=(int16_t)(((int32_t)amp*qam16_table[qam16_table_offset_im])>>15);
-        //      msg("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
+        //      printf("input(16qam) %d (%p): %d,%d\n", i,&ulsch->d[i],((int16_t*)&ulsch->d[i])[0],((int16_t*)&ulsch->d[i])[1]);
         break;
 
       case 6:
@@ -710,14 +710,14 @@ void ulsch_modulation(int32_t **txdataF,
     //    re_offset0++;
   }
 
-  //  msg("re_offset0 %d\n",re_offset0);
+  //  printf("re_offset0 %d\n",re_offset0);
 
 
   for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) {
     re_offset = re_offset0;
     symbol_offset = (int)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb));
 #ifdef DEBUG_ULSCH_MODULATION
-    msg("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
+    printf("symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
 #endif
     txptr = &txdataF[0][symbol_offset];
 
@@ -727,10 +727,10 @@ void ulsch_modulation(int32_t **txdataF,
     // Skip reference symbols
     else {
 
-      //      msg("copying %d REs\n",Msc_PUSCH);
+      //      printf("copying %d REs\n",Msc_PUSCH);
       for (i=0; i<Msc_PUSCH; i++,j++) {
 #ifdef DEBUG_ULSCH_MODULATION
-        msg("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]);
+        printf("re_offset %d (%p): %d,%d\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1]);
 #endif
         txptr[re_offset++] = ulsch->z[j];
 
@@ -748,13 +748,13 @@ void ulsch_modulation(int32_t **txdataF,
     //    re_offset0++;
   }
 
-  //    msg("re_offset0 %d\n",re_offset0);
+  //    printf("re_offset0 %d\n",re_offset0);
   //  printf("txdataF %p\n",&txdataF[0][0]);
   for (j=0,l=0; l<(nsymb-ulsch->srs_active); l++) {
     re_offset = re_offset0;
     symbol_offset = (uint32_t)frame_parms->ofdm_symbol_size*(l+(subframe*nsymb));
 #ifdef DEBUG_ULSCH_MODULATION
-    msg("ulsch_mod (OFDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
+    printf("ulsch_mod (OFDMA) symbol %d (subframe %d): symbol_offset %d\n",l,subframe,symbol_offset);
 #endif
     txptr = &txdataF[0][symbol_offset];
 
@@ -763,11 +763,11 @@ void ulsch_modulation(int32_t **txdataF,
     }
     // Skip reference symbols
     else {
-      //      msg("copying %d REs\n",Msc_PUSCH);
+      //      printf("copying %d REs\n",Msc_PUSCH);
       for (i=0; i<Msc_PUSCH; i++,j++) {
 
 #ifdef DEBUG_ULSCH_MODULATION
-        msg("re_offset %d (%p): %d,%d => %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]);
+        printf("re_offset %d (%p): %d,%d => %p\n", re_offset,&ulsch->z[j],((int16_t*)&ulsch->z[j])[0],((int16_t*)&ulsch->z[j])[1],&txptr[re_offset]);
 #endif //DEBUG_ULSCH_MODULATION
         txptr[re_offset++] = ulsch->z[j];
 
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index 601e2fb1998c998bd0d99269212307f2b8c8793a..28c407b08888cc05037126ae86bd13e27c2eec95 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -183,7 +183,7 @@ void phy_scope_eNB(FD_lte_phy_scope_enb *form,
   float time[FRAME_LENGTH_COMPLEX_SAMPLES];
   float time2[2048];
   float freq[nsymb_ce*nb_antennas_rx*nb_antennas_tx];
-  int frame = phy_vars_enb->proc[0].frame_tx;
+  int frame = phy_vars_enb->proc.frame_tx;
   uint32_t total_dlsch_bitrate = phy_vars_enb->total_dlsch_bitrate;
   int coded_bits_per_codeword = 0;
   uint8_t harq_pid; // in TDD config 3 it is sf-2, i.e., can be 0,1,2
diff --git a/openair1/PHY/TOOLS/time_meas.c b/openair1/PHY/TOOLS/time_meas.c
index ba1014e9a01d8cc8a3d228abe15aaca0cf33acdb..d7328f20ccfa1dda2ce3ddf68af77caeea01e37a 100644
--- a/openair1/PHY/TOOLS/time_meas.c
+++ b/openair1/PHY/TOOLS/time_meas.c
@@ -48,7 +48,7 @@ double get_cpu_freq_GHz(void) {
   return cpu_freq_GHz; 
 }
 
-void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name){
+void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name){
 
   if (opp_enabled) {
 
diff --git a/openair1/PHY/TOOLS/time_meas.h b/openair1/PHY/TOOLS/time_meas.h
index 3e621ac281bb41dde0164b9ad848f87becfd9f0f..a0f674113b58a0f1f5aeafd73f075a09ccf1d190 100644
--- a/openair1/PHY/TOOLS/time_meas.h
+++ b/openair1/PHY/TOOLS/time_meas.h
@@ -69,7 +69,7 @@ static inline void start_meas(time_stats_t *ts) __attribute__((always_inline));
 static inline void stop_meas(time_stats_t *ts) __attribute__((always_inline));
 
 
-void print_meas_now(time_stats_t *ts, const char* name, int subframe, FILE* file_name);
+void print_meas_now(time_stats_t *ts, const char* name, FILE* file_name);
 void print_meas(time_stats_t *ts, const char* name, time_stats_t * total_exec_time, time_stats_t * sf_exec_time);
 double get_time_meas_us(time_stats_t *ts);
 double get_cpu_freq_GHz(void);
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index dd543bbbf8528b43445bfb9d72db0917f4fa43dd..c483035abc0f26847d65fabc3828e4290f6243eb 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -192,10 +192,14 @@ typedef struct {
   int subframe_tx;
   /// subframe to act upon for reception
   int subframe_rx;
+  /// subframe to act upon for PRACH
+  int subframe_prach;
   /// frame to act upon for transmission
   int frame_tx;
   /// frame to act upon for reception
   int frame_rx;
+  /// frame to act upon for PRACH
+  int frame_prach;
   /// \brief Instance count for tx processing thread.
   /// \internal This variable is protected by \ref mutex_tx.
   int instance_cnt_tx;
@@ -232,14 +236,13 @@ typedef struct {
 
 //! \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.
-#define NUM_ENB_THREADS 1
 
 /// Top-level PHY Data Structure for eNB
 typedef struct PHY_VARS_eNB_s {
   /// Module ID indicator for this instance
   module_id_t          Mod_id;
   uint8_t              CC_id;
-  eNB_proc_t           proc[NUM_ENB_THREADS];
+  eNB_proc_t           proc;
   eNB_func_t           node_function;
   uint8_t              local_flag;
   uint32_t             rx_total_gain_dB;
diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h
index fa6239d930007c073ae4c04f213338ae7370fede..21746841265991ba786c7c0915f761793418a7c1 100644
--- a/openair1/SCHED/defs.h
+++ b/openair1/SCHED/defs.h
@@ -161,8 +161,6 @@ void cleanup_dlsch_threads(void);
 void phy_procedures_eNB_lte(uint8_t subframe,PHY_VARS_eNB **phy_vars_eNB,uint8_t abstraction_flag, relaying_type_t r_type, PHY_VARS_RN *phy_vars_rn);
 
 /*! \brief Top-level entry routine for UE procedures.  Called every slot by process scheduler. In even slots, it performs RX functions from previous subframe (if required).  On odd slots, it generate TX waveform for the following subframe.
-  @param last_slot Index of last slot (0-19)
-  @param next_slot Index of next_slot (0-19)
   @param phy_vars_ue Pointer to UE variables on which to act
   @param eNB_id ID of eNB on which to act
   @param abstraction_flag Indicator of PHY abstraction
@@ -215,61 +213,60 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 void phy_procedures_UE_S_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag,relaying_type_t r_type);
 
 /*! \brief Scheduling for UE RX procedures in TDD S-subframes.
-  @param thread_index Thread index in proc vector
   @param phy_vars_ue Pointer to UE variables on which to act
   @param eNB_id Local id of eNB on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @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_S_RX(uint8_t thread_index,PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type);
+void phy_procedures_UE_S_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_flag, relaying_type_t r_type);
 
 /*! \brief Scheduling for eNB TX procedures in normal subframes.
-  @param thread_index Index of thread in proc vector
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @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 the RN variables
 */
-void phy_procedures_eNB_TX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
+void phy_procedures_eNB_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn);
 
 /*! \brief Scheduling for eNB RX UE-specific procedures in normal subframes.
-  @param thread_index Thread index in proc vector
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @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_eNB_uespec_RX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type);
+void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type);
 
 /*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
-  @param thread_index Index of thread in proc vector
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @param r_type indicates the relaying operation: 0: no_relaying, 1: unicast relaying type 1, 2: unicast relaying type 2, 3: multicast relaying
 */
 
 /*! \brief Scheduling for eNB RX common procedures in normal subframes.
-  @param thread_index Thread index in proc vector
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param abstraction_flag Indicator of PHY abstraction
 */
-void phy_procedures_eNB_common_RX(uint8_t thread_index,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag);
+void phy_procedures_eNB_common_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag);
 
 /*! \brief Scheduling for eNB TX procedures in TDD S-subframes.
-  @param thread_index Index of thread in proc vector
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @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_eNB_S_TX(uint8_t next_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type);
+void phy_procedures_eNB_S_TX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type);
 
 /*! \brief Scheduling for eNB RX procedures in TDD S-subframes.
-  @param last_slot Index of next slot (0-19)
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param abstraction_flag Indicator of PHY abstraction
   @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_eNB_S_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type);
+void phy_procedures_eNB_S_RX(PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,relaying_type_t r_type);
+
+/*! \brief Scheduling for eNB PRACH RX procedures 
+  @param phy_vars_eNB Pointer to eNB variables on which to act
+  @param abstraction_flag Indicator of PHY abstraction
+*/
+void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag);
 
 /*! \brief Function to compute subframe type as a function of Frame type and TDD Configuration (implements Table 4.2.2 from 36.211, p.11 from version 8.6) and subframe index.
   @param frame_parms Pointer to DL frame parameter descriptor
@@ -277,12 +274,6 @@ void phy_procedures_eNB_S_RX(uint8_t last_slot,PHY_VARS_eNB *phy_vars_eNB,uint8_
   @returns Subframe type (DL,UL,S)
 */
 
-/*! \brief Scheduling for eNB PRACH RX procedures 
-  @param phy_vars_eNB Pointer to eNB variables on which to act
-  @param thread_id Index of thread in proc vector
-  @param abstraction_flag Indicator of PHY abstraction
-*/
-void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_flag);
 
 lte_subframe_t subframe_select(LTE_DL_FRAME_PARMS *frame_parms,uint8_t subframe);
 
@@ -400,10 +391,9 @@ uint8_t is_SR_TXOp(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe);
 /*! \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
   @param UE_id ID of UE which may be issuing the SR
-  @param subframe index of last subframe
   @returns 1 if TXOp is active.
 */
-uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t subframe);
+uint8_t is_SR_subframe(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id);
 
 /*! \brief Gives the UL subframe corresponding to a PDDCH order in subframe n
   @param frame_parms Pointer to DL frame parameters
@@ -443,14 +433,14 @@ subframe n-4 which is acknowledged in subframe n (for FDD) according to n1_pucch
 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 eNB_id Index of eNB
-@param thread_id Index of thread where procedures are executed
+@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,
                       uint8_t eNB_id,
-                      uint8_t thread_id,
+		      uint8_t subframe,
                       uint8_t *b,
                       uint8_t SR);
 
@@ -468,7 +458,6 @@ TDD, this routine computes the procedure described in Section 10.1 of 36.213 (th
 */
 void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
                       uint8_t UE_id,
-                      uint8_t subframe,
                       int16_t *n1_pucch0,
                       int16_t *n1_pucch1,
                       int16_t *n1_pucch2,
@@ -477,7 +466,6 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
 
 /*! \brief This function retrieves the harq_pid of the corresponding DLSCH process and updates the error statistics of the DLSCH based on the received ACK info from UE along with the round index.  It also performs the fine-grain rate-adaptation based on the error statistics derived from the ACK/NAK process.
   @param UE_id Local UE index on which to act
-  @param subframe Index of subframe
   @param phy_vars_eNB Pointer to eNB variables on which to act
   @param pusch_flag Indication that feedback came from PUSCH
   @param pucch_payload Resulting payload from pucch
@@ -485,7 +473,6 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
   @param SR_payload Indication of SR presence (TDD specific)
 */
 void process_HARQ_feedback(uint8_t UE_id,
-                           uint8_t subframe,
                            PHY_VARS_eNB *phy_vars_eNB,
                            uint8_t pusch_flag,
                            uint8_t *pucch_payload,
@@ -548,8 +535,6 @@ 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 ulsch_decoding_procedures(unsigned char last_slot, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_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);
diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c
index 0b4fffe3d36a28af3e6ac0bb2a4c26b353f48ef0..564a7951c667521cfaf63b0320999a7882295384 100644
--- a/openair1/SCHED/phy_mac_stub.c
+++ b/openair1/SCHED/phy_mac_stub.c
@@ -48,7 +48,7 @@
 #include "SCHED/phy_procedures_emos.h"
 #endif
 
-void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
+void fill_dci(DCI_PDU *DCI_pdu,PHY_VARS_eNB *eNB)
 {
 
 
@@ -57,7 +57,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
 
   uint32_t rballoc = 0x7FFF;
   //uint32_t rballoc2 = 0x000F;
-  int subframe = eNB->proc[thread_id].subframe_tx;
+  int subframe = eNB->proc.subframe_tx;
 
   LTE_eNB_DLSCH_t *DLSCH_ptr = eNB->dlsch[0][0];
 
@@ -89,7 +89,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_1_5MHz_FDD_t*)&bcch_pdu)->harq_pid          = 0;
@@ -100,7 +100,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_1_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid          = 0;
@@ -117,7 +117,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_5MHz_FDD_t*)&bcch_pdu)->harq_pid          = 0;
@@ -128,7 +128,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_5MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid          = 0;
@@ -144,7 +144,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_10MHz_FDD_t*)&bcch_pdu)->harq_pid          = 0;
@@ -155,7 +155,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_10MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid          =  DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
@@ -171,7 +171,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_20MHz_FDD_t*)&bcch_pdu)->harq_pid          = 0;
@@ -182,7 +182,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
         ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->type              = 1;
         ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->vrb_type          = 0;
         ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rballoc           = computeRIV(25,10,3);
-        ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc[thread_id].frame_tx&1;
+        ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->ndi               = eNB->proc.frame_tx&1;
         ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->rv                = 1;
         ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->mcs               = 1;
         ((DCI1A_20MHz_TDD_1_6_t*)&bcch_pdu)->harq_pid          = 0;
@@ -236,7 +236,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = eNB->target_ue_dl_mcs;
           //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((eNB->frame%1024)%28);
-          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = eNB->proc[thread_id].frame_tx&1;
+          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = eNB->proc.frame_tx&1;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
 
@@ -267,7 +267,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs              = eNB->target_ue_dl_mcs;
           //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((eNB->frame%1024)%28);
-          ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi              = eNB->proc[thread_id].frame_tx&1;
+          ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi              = eNB->proc.frame_tx&1;
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
 
@@ -303,7 +303,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = eNB->target_ue_dl_mcs;
           //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((eNB->frame%1024)%28);
-          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi              = eNB->proc[thread_id].frame_tx&1;
+          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi              = eNB->proc.frame_tx&1;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
 
@@ -334,7 +334,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs              = eNB->target_ue_dl_mcs;
           //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((eNB->frame%1024)%28);
-          ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi              = eNB->proc[thread_id].frame_tx&1;
+          ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi              = eNB->proc.frame_tx&1;
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_10MHz_TDD_t));
 
@@ -369,7 +369,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = eNB->target_ue_dl_mcs;
           //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((eNB->frame%1024)%28);
-          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = eNB->proc[thread_id].frame_tx&1;
+          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = eNB->proc.frame_tx&1;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_5MHz_TDD_t));
 
@@ -400,7 +400,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs              = eNB->target_ue_dl_mcs;
           //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((eNB->frame%1024)%28);
-          ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi              = eNB->proc[thread_id].frame_tx&1;
+          ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi              = eNB->proc.frame_tx&1;
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&dlsch_pdu,sizeof(DCI1_20MHz_TDD_t));
 
@@ -437,10 +437,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
 
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tpmi     = 0;
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv1      = 0;
-      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1     = eNB->proc[thread_id].frame_tx&1;
+      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi1     = eNB->proc.frame_tx&1;
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1     = eNB->target_ue_dl_mcs;
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rv2      = 0;
-      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2     = eNB->proc[thread_id].frame_tx&1;
+      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->ndi2     = eNB->proc.frame_tx&1;
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2     = eNB->target_ue_dl_mcs;
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->tb_swap  = 0;
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->harq_pid = DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
@@ -459,7 +459,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
 
       DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
       DLSCH_alloc_pdu1E.rv               = 0;
-      DLSCH_alloc_pdu1E.ndi              = eNB->proc[thread_id].frame_tx&1;
+      DLSCH_alloc_pdu1E.ndi              = eNB->proc.frame_tx&1;
       //DLSCH_alloc_pdu1E.mcs            = cqi_to_mcs[eNB->eNB_UE_stats->DL_cqi[0]];
       //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
       DLSCH_alloc_pdu1E.mcs              = eNB->target_ue_dl_mcs;
@@ -482,7 +482,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
       //DLSCH_alloc_pdu1E.mcs            = eNB->target_ue_dl_mcs;
       //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
       //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((eNB->frame%1024)%28);
-      DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((eNB->proc[thread_id].frame_tx%1024)/3)%28);
+      DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((eNB->proc.frame_tx%1024)/3)%28);
       eNB->UE_stats[1].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
 
       memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
@@ -533,7 +533,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
     UL_alloc_pdu.hopping = 0;
     UL_alloc_pdu.rballoc = computeRIV(25,2,eNB->ue_ul_nb_rb);
     UL_alloc_pdu.mcs     = eNB->target_ue_ul_mcs;
-    UL_alloc_pdu.ndi     = eNB->proc[thread_id].frame_tx&1;
+    UL_alloc_pdu.ndi     = eNB->proc.frame_tx&1;
     UL_alloc_pdu.TPC     = 0;
     UL_alloc_pdu.cshift  = 0;
     UL_alloc_pdu.dai     = 0;
@@ -555,7 +555,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t thread_id, PHY_VARS_eNB *eNB)
     else
       UL_alloc_pdu.rballoc = computeRIV(25,0,eNB->ue_ul_nb_rb);
     UL_alloc_pdu.mcs     = eNB->target_ue_ul_mcs;
-    UL_alloc_pdu.ndi     = eNB->proc[thread_id].frame_tx&1;
+    UL_alloc_pdu.ndi     = eNB->proc.frame_tx&1;
     UL_alloc_pdu.TPC     = 0;
     if ((cooperation_flag==0) || (cooperation_flag==1))
       UL_alloc_pdu.cshift  = 0;
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 9dd3d98e0083fc2021f3a494c926f62569104737..c2dc89c2c501e5033f7d74a60a3bd5b956727c5f 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -101,10 +101,10 @@ extern uint8_t smbv_frame_cnt;
 extern int rx_sig_fifo;
 #endif
 
-uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,uint8_t UE_id,uint8_t thread_id)
+uint8_t is_SR_subframe(PHY_VARS_eNB *eNB,uint8_t UE_id)
 {
 
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   const int subframe = proc->subframe_rx;
   const int frame = proc->frame_rx;
 
@@ -339,10 +339,10 @@ void phy_procedures_emos_eNB_TX(unsigned char subframe, PHY_VARS_eNB *eNB)
 
 
 
-void phy_procedures_eNB_S_RX(unsigned char thread_id,PHY_VARS_eNB *eNB,uint8_t abstraction_flag,relaying_type_t r_type)
+void phy_procedures_eNB_S_RX(PHY_VARS_eNB *eNB,uint8_t abstraction_flag,relaying_type_t r_type)
 {
   UNUSED(r_type);
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   int subframe = proc->subframe_rx;
 
 #ifdef DEBUG_PHY_PROC
@@ -435,14 +435,15 @@ int QPSK2[4]= {AMP_OVER_2|(AMP_OVER_2<<16),AMP_OVER_2|((65536-AMP_OVER_2)<<16),(
 
 unsigned int taus(void);
 
-void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int thread_id,int abstraction_flag,relaying_type_t r_type) {
+void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int abstraction_flag,relaying_type_t r_type) {
 
 #ifdef Rel10
   MCH_PDU *mch_pduP;
   MCH_PDU  mch_pdu;
   //  uint8_t sync_area=255;
 #endif
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
+  int subframe = proc->subframe_tx;
 
   if (abstraction_flag==0) {
     // This is DL-Cell spec pilots in Control region
@@ -507,7 +508,7 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int thread_
   if (mch_pduP) {
     fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag);
     // Generate PMCH
-    generate_mch(eNB,thread_id,(uint8_t*)mch_pduP->payload,abstraction_flag);
+    generate_mch(eNB,(uint8_t*)mch_pduP->payload,abstraction_flag);
   } else {
     LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",proc->frame_tx,subframe);
   }
@@ -515,12 +516,14 @@ void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int thread_
 #endif
 }
 
-void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int abstraction_flag) {
+void common_signal_procedures (PHY_VARS_eNB *eNB,int abstraction_flag) {
 
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
   int **txdataF = eNB->common_vars.txdataF[0];
   uint8_t *pbch_pdu=&eNB->pbch_pdu[0];
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
+  int subframe = proc->subframe_tx;
+  int frame = proc->frame_tx;
 
   // generate Cell-Specific Reference Signals for both slots
   if (abstraction_flag==0) {
@@ -557,7 +560,7 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int
     }
     
     // generate PBCH (Physical Broadcast CHannel) info
-    if ((proc->frame_tx&3) == 0) {
+    if ((frame&3) == 0) {
       pbch_pdu[2] = 0;
       
       // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators
@@ -617,8 +620,8 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int
 	break;
       }
       
-      pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((proc->frame_tx>>8)&0x3);
-      pbch_pdu[1] = proc->frame_tx&0xfc;
+      pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((frame>>8)&0x3);
+      pbch_pdu[1] = frame&0xfc;
       pbch_pdu[0] = 0;
     }
       
@@ -640,7 +643,7 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int
                     AMP,
                     fp,
                     pbch_pdu,
-                    proc->frame_tx&3);
+                    frame&3);
     }
 #ifdef PHY_ABSTRACTION
     else {
@@ -700,10 +703,12 @@ void common_signal_procedures (int subframe,int thread_id,PHY_VARS_eNB *eNB,int
 
 }
 
-void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) {
+void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) {
 
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
+  int frame = proc->frame_tx;
+  int subframe = proc->subframe_tx;
 
   // if we have SI_RNTI, configure dlsch parameters and CCE index
   if (dci_alloc->rnti == SI_RNTI) {
@@ -724,14 +729,14 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,
     
     eNB->dlsch_SI->nCCE[subframe] = dci_alloc->firstCCE;
     
-    LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI)  => %"PRIu8"\n",eNB->Mod_id,proc->frame_tx,subframe,
+    LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI)  => %"PRIu8"\n",eNB->Mod_id,frame,subframe,
 	  eNB->dlsch_SI->nCCE[subframe]);
     
 #if defined(SMBV) 
     
     // configure SI DCI
-    if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-      LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i);
+    if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",frame,subframe,i);
       smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", dci_alloc, i);
     }
     
@@ -757,13 +762,13 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,
     
     eNB->dlsch_ra->nCCE[subframe] = dci_alloc->firstCCE;
     
-    LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA)  => %"PRIu8"\n",eNB->Mod_id,proc->frame_tx,subframe,
+    LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA)  => %"PRIu8"\n",eNB->Mod_id,frame,subframe,
 	  eNB->dlsch_ra->nCCE[subframe]);
 #if defined(SMBV) 
     
     // configure RA DCI
-    if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-      LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i);
+    if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",frame,subframe,i);
       smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", dci_alloc, i);
     }
     
@@ -781,8 +786,8 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,
     if (UE_id>=0) {
 #if defined(SMBV) 
       // Configure this user
-      if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-	LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",proc->frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1,
+      if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+	LOG_D(PHY,"[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",frame,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1,
               dci_alloc->rnti,eNB->transmission_mode[(uint8_t)UE_id]);
 	smbv_configure_user(smbv_fname,UE_id+1,eNB->transmission_mode[(uint8_t)UE_id],dci_alloc->rnti);
       }
@@ -803,19 +808,19 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,
 					 P_RNTI,
 					 eNB->UE_stats[(uint8_t)UE_id].DL_pmi_single);
       LOG_D(PHY,"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d subframe %d: Generated dlsch params\n",
-	    eNB->Mod_id,dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->current_harq_pid,proc->frame_tx,subframe);
+	    eNB->Mod_id,dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->current_harq_pid,frame,subframe);
       
       
       eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe] = dci_alloc->firstCCE;
       
-      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16")  => %"PRIu8"/%u\n",eNB->Mod_id,proc->frame_tx,subframe,
+      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16")  => %"PRIu8"/%u\n",eNB->Mod_id,frame,subframe,
 	    dci_alloc->rnti,eNB->dlsch[(uint8_t)UE_id][0]->nCCE[subframe]);
       
 #if defined(SMBV) 
       
       // configure UE-spec DCI
-      if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-	LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",proc->frame_tx,subframe,i);
+      if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+	LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",frame,subframe,i);
 	smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1,dci_alloc, i);
       }
       
@@ -823,43 +828,44 @@ void generate_eNB_dlsch_params(const int frame,const int subframe,int thread_id,
       
       LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n",
 	    eNB->Mod_id, dci_alloc->rnti,
-	    proc->frame_tx, subframe,UE_id,
+	    frame, subframe,UE_id,
 	    dci_alloc->format,
 	    1<<dci_alloc->L);
     } else {
       LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n",
-	    eNB->Mod_id,proc->frame_tx,dci_alloc->rnti);
+	    eNB->Mod_id,frame,dci_alloc->rnti);
     }
   }
   
 }
 
-void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) {
+void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) {
 
   int harq_pid;
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
-  eNB_proc_t *proc = &eNB->proc[thread_id];
-  
+  eNB_proc_t *proc = &eNB->proc;
+  int frame = proc->frame_tx;
+  int subframe = proc->frame_rx;
+
   LOG_D(PHY,
 	"[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n",
 	eNB->Mod_id,
 	subframe2harq_pid(fp,
-			  pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe),
+			  pdcch_alloc2ul_frame(fp,frame,subframe),
 			  pdcch_alloc2ul_subframe(fp,subframe)),
-	proc->frame_tx,
+	frame,
 	subframe,
-	pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe),
+	pdcch_alloc2ul_frame(fp,frame,subframe),
 	pdcch_alloc2ul_subframe(fp,subframe),
 	dci_alloc->rnti,
 	dci_alloc->dci_pdu[0],
 	1<<dci_alloc->L);
   
-  generate_eNB_ulsch_params_from_dci(&dci_alloc->dci_pdu[0],
+  generate_eNB_ulsch_params_from_dci(eNB,
+				     &dci_alloc->dci_pdu[0],
 				     dci_alloc->rnti,
-				     thread_id,
 				     format0,
 				     UE_id,
-				     eNB,
 				     SI_RNTI,
 				     0,
 				     P_RNTI,
@@ -867,14 +873,14 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id,
 				     0);  // do_srs
   
   LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n",
-	eNB->Mod_id,proc->frame_tx,subframe,dci_alloc->rnti,
+	eNB->Mod_id,frame,subframe,dci_alloc->rnti,
 	dci_alloc->firstCCE);
   
 #if defined(SMBV) 
   
   // configure UE-spec DCI for UL Grant
-  if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-    LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",proc->frame_tx,subframe,i);
+  if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+    LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",frame,subframe,i);
     smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i);
   }
   
@@ -883,11 +889,11 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id,
   
   // get the hard_pid for this subframe 
   harq_pid = subframe2harq_pid(fp,
-			       pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe),
+			       pdcch_alloc2ul_frame(fp,frame,subframe),
 			       pdcch_alloc2ul_subframe(fp,subframe));
   
   if (harq_pid==255) { // should not happen, log an error and exit, this is a fatal error
-    LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,proc->frame_tx);
+    LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",eNB->Mod_id,frame);
     mac_xface->macphy_exit("FATAL\n"); 
   }
   
@@ -898,9 +904,11 @@ void generate_eNB_ulsch_params(const int frame,const int subframe,int thread_id,
   
 }
 
-void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int subframe,int thread_id,int num_pdcch_symbols,int abstraction_flag) {
+void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t *dlsch1,LTE_eNB_UE_stats *ue_stats,int ra_flag,int num_pdcch_symbols,int abstraction_flag) {
 
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
+  int frame=proc->frame_tx;
+  int subframe=proc->subframe_tx;
   int harq_pid = dlsch->current_harq_pid;
   LTE_DL_eNB_HARQ_t *dlsch_harq=dlsch->harq_processes[harq_pid];
   int input_buffer_length = dlsch_harq->TBS/8;
@@ -913,13 +921,13 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
   LOG_D(PHY,
 	"[eNB %"PRIu8"][PDSCH %"PRIx16"/%"PRIu8"] Frame %d, subframe %d: Generating PDSCH/DLSCH with input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")\n",
 	eNB->Mod_id, dlsch->rnti,harq_pid,
-	proc->frame_tx, subframe, input_buffer_length,
+	frame, subframe, input_buffer_length,
 	get_G(fp,
 	      dlsch_harq->nb_rb,
 	      dlsch_harq->rb_alloc,
 	      get_Qm(dlsch_harq->mcs),
 	      dlsch_harq->Nl,
-	      num_pdcch_symbols,proc->frame_tx,subframe),
+	      num_pdcch_symbols,frame,subframe),
 	dlsch_harq->nb_rb,
 	dlsch_harq->mcs,
 	pmi2hex_2Ar1(dlsch_harq->pmi_alloc),
@@ -931,14 +939,14 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
         MSC_PHY_ENB,MSC_PHY_UE,
         NULL,0,
         "%05u:%02u PDSCH/DLSCH input size = %"PRIu16", G %d, nb_rb %"PRIu16", mcs %"PRIu8", pmi_alloc %"PRIx16", rv %"PRIu8" (round %"PRIu8")",
-        proc->frame_tx, subframe,
+        frame, subframe,
         input_buffer_length,
         get_G(fp,
         		dlsch_harq->nb_rb,
         		dlsch_harq->rb_alloc,
         		get_Qm(dlsch_harq->mcs),
         		dlsch_harq->Nl,
-        		num_pdcch_symbols,proc->frame_tx,subframe),
+        		num_pdcch_symbols,frame,subframe),
         dlsch_harq->nb_rb,
         dlsch_harq->mcs,
         pmi2hex_2Ar1(dlsch_harq->pmi_alloc),
@@ -957,14 +965,14 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
 	  if (ra_flag == 0) {
 	    DLSCH_pdu = mac_xface->get_dlsch_sdu(eNB->Mod_id,
 						 eNB->CC_id,
-						 proc->frame_tx,
+						 frame,
 						 dlsch->rnti,
 						 0);
 	  }
 	  else {
 	    int16_t crnti = mac_xface->fill_rar(eNB->Mod_id,
 						eNB->CC_id,
-						proc->frame_tx,
+						frame,
 						DLSCH_pdu_rar,
 						fp->N_RB_UL,
 						input_buffer_length);
@@ -981,7 +989,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
 	      LOG_W(PHY,"[eNB] Max user count reached.\n");
 	      mac_xface->cancel_ra_proc(eNB->Mod_id,
 					eNB->CC_id,
-					proc->frame_tx,
+					frame,
 					crnti);
 	    } else {
 	      eNB->UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE;
@@ -989,7 +997,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
 	      eNB->first_sr[(uint32_t)UE_id] = 1;
 	      
 	      generate_eNB_ulsch_params_from_rar(DLSCH_pdu,
-						 proc->frame_tx,
+						 frame,
 						 (subframe),
 						 eNB->ulsch[(uint32_t)UE_id],
 						 fp);
@@ -998,11 +1006,11 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
 	      
 	      get_Msg3_alloc(fp,
 			     subframe,
-			     proc->frame_tx,
+			     frame,
 			     &eNB->ulsch[(uint32_t)UE_id]->Msg3_frame,
 			     &eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe);
 	      LOG_D(PHY,"[eNB][RAPROC] Frame %d subframe %d, Activated Msg3 demodulation for UE %"PRId8" in frame %"PRIu32", subframe %"PRIu8"\n",
-		    proc->frame_tx,
+		    frame,
 		    subframe,
 		    UE_id,
 		    eNB->ulsch[(uint32_t)UE_id]->Msg3_frame,
@@ -1021,8 +1029,8 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
 #if defined(SMBV) 
 
         // Configures the data source of allocation (allocation is configured by DCI)
-        if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-          LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
+        if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+          LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",frame,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
 	  //          smbv_configure_datalist_for_user(smbv_fname, find_ue(dlsch->rnti,eNB)+1, DLSCH_pdu, input_buffer_length);
         }
 
@@ -1057,7 +1065,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
                        fp,
                        num_pdcch_symbols,
                        dlsch,
-                       proc->frame_tx,subframe,
+                       frame,subframe,
                        &eNB->dlsch_rate_matching_stats,
                        &eNB->dlsch_turbo_encoding_stats,
                        &eNB->dlsch_interleaving_stats);
@@ -1072,7 +1080,7 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
                                dlsch_harq->rb_alloc,
                                get_Qm(dlsch_harq->mcs),
                                dlsch_harq->Nl,
-                               num_pdcch_symbols,proc->frame_tx,subframe),
+                               num_pdcch_symbols,frame,subframe),
                          0,
                          subframe<<1);
         stop_meas(&eNB->dlsch_scrambling_stats);
@@ -1103,14 +1111,15 @@ void pdsch_procedures(PHY_VARS_eNB *eNB,LTE_eNB_DLSCH_t *dlsch, LTE_eNB_DLSCH_t
       dlsch->active = 0;
 }
 
-void phy_procedures_eNB_TX(unsigned char thread_id,
-			   PHY_VARS_eNB *eNB,
+void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
 			   uint8_t abstraction_flag,
                            relaying_type_t r_type,
 			   PHY_VARS_RN *rn)
 {
   UNUSED(rn);
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
+  int frame=proc->frame_tx;
+  int subframe=proc->subframe_tx;
   //  uint16_t input_buffer_length;
   uint32_t i,aa;
   uint8_t harq_pid;
@@ -1128,8 +1137,6 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
   // there is at least one allocation for PDCCH
   uint8_t smbv_alloc_cnt = 1;
 #endif
-  int frame = proc->frame_tx;
-  int subframe = proc->subframe_tx;
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
   start_meas(&eNB->phy_proc_tx);
@@ -1157,7 +1164,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
 // This is called only for the CC_id = 0 and triggers scheduling for all CC_id's
   if (eNB->mac_enabled==1) {
     if (eNB->CC_id == 0) {
-      mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,proc->frame_tx,subframe);//,1);
+      mac_xface->eNB_dlsch_ulsch_scheduler(eNB->Mod_id,0,frame,subframe);//,1);
     }
   }
 
@@ -1169,18 +1176,18 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
     }
   }
 
-  if (is_pmch_subframe(proc->frame_tx,subframe,fp)) {
-    pmch_procedures(eNB,rn,subframe,thread_id,abstraction_flag,r_type);
+  if (is_pmch_subframe(frame,subframe,fp)) {
+    pmch_procedures(eNB,rn,abstraction_flag,r_type);
   }
   else {
     // this is not a pmch subframe, so generate PSS/SSS/PBCH
-    common_signal_procedures(subframe,thread_id,eNB,abstraction_flag);
+    common_signal_procedures(eNB,abstraction_flag);
   }
 
 #if defined(SMBV) 
 
   // PBCH takes one allocation
-  if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
+  if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
     if (subframe==0)
       smbv_alloc_cnt++;
   }
@@ -1192,21 +1199,21 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
     DCI_pdu = mac_xface->get_dci_sdu(eNB->Mod_id,
 				     eNB->CC_id,
-				     proc->frame_tx,
+				     frame,
 				     subframe);
   }
   else {
     DCI_pdu = &DCI_pdu_tmp;
 #ifdef EMOS_CHANNEL
-    fill_dci_emos(DCI_pdu,thread_id,eNB);
+    fill_dci_emos(DCI_pdu,eNB);
 #else
-    fill_dci(DCI_pdu,thread_id,eNB);
+    fill_dci(DCI_pdu,eNB);
 #endif
   }
 
   // clear existing ulsch dci allocations before applying info from MAC  (this is table
   ul_subframe = pdcch_alloc2ul_subframe(fp,subframe);
-  ul_frame = pdcch_alloc2ul_frame(fp,proc->frame_tx,subframe);
+  ul_frame = pdcch_alloc2ul_frame(fp,frame,subframe);
 
   if ((subframe_select(fp,ul_subframe)==SF_UL) ||
       (fp->frame_type == FDD)) {
@@ -1232,8 +1239,8 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
 
 #if defined(SMBV) 
   // Sets up PDCCH and DCI table
-  if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) {
-    LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",proc->frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
+  if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) {
+    LOG_D(PHY,"[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",frame,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
     dump_dci(fp,&DCI_pdu->dci_alloc[0]);
     smbv_configure_pdcch(smbv_fname,(smbv_frame_cnt*10) + (subframe),num_pdcch_symbols,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
   }
@@ -1258,7 +1265,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
     }
     else UE_id=0;
     
-    generate_eNB_dlsch_params(frame,subframe,thread_id,eNB,dci_alloc,UE_id);
+    generate_eNB_dlsch_params(eNB,dci_alloc,UE_id);
 
   }
 
@@ -1277,10 +1284,10 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
 	UE_id = i;
       
       if (UE_id<0) { // should not happen, log an error and exit, this is a fatal error
-	LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,proc->frame_tx,dci_alloc->rnti);
+	LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",eNB->Mod_id,frame,dci_alloc->rnti);
 	mac_xface->macphy_exit("FATAL\n"); 
       }
-      generate_eNB_ulsch_params(frame,subframe,thread_id,eNB,dci_alloc,UE_id);
+      generate_eNB_ulsch_params(eNB,dci_alloc,UE_id);
     }
   }
 
@@ -1300,7 +1307,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
   if (abstraction_flag == 0) {
 
     if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0)
-      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,proc->frame_tx, subframe,
+      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,frame, subframe,
             DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
 
     num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci,
@@ -1316,7 +1323,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
 
 #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious
   else {
-    LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,proc->frame_tx, subframe);
+    LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,frame, subframe);
     num_pdcch_symbols = generate_dci_top_emul(eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe);
   }
 
@@ -1328,13 +1335,13 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
 
   if (eNB->dlsch_SI->active == 1) {
 
-    pdsch_procedures(eNB,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,subframe,thread_id,num_pdcch_symbols,abstraction_flag);
+    pdsch_procedures(eNB,eNB->dlsch_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,num_pdcch_symbols,abstraction_flag);
 
 #if defined(SMBV) 
 
     // Configures the data source of allocation (allocation is configured by DCI)
-    if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-      LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
+    if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",frame,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
       smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), DLSCH_pdu, input_buffer_length);
     }
 
@@ -1347,8 +1354,8 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
 #if defined(SMBV) 
 
     // Configures the data source of allocation (allocation is configured by DCI)
-    if (smbv_is_config_frame(proc->frame_tx) && (smbv_frame_cnt < 4)) {
-      LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",proc->frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
+    if (smbv_is_config_frame(frame) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",frame,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
       smbv_configure_datalist_for_alloc(smbv_fname, smbv_alloc_cnt++, (smbv_frame_cnt*10) + (subframe), dlsch_input_buffer, input_buffer_length);
     }
     
@@ -1357,11 +1364,11 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
     
     LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA),Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n",
 	  eNB->Mod_id,
-	  proc->frame_tx, subframe,
+	  frame, subframe,
 	  eNB->ulsch[(uint32_t)UE_id]->Msg3_frame,
 	  eNB->ulsch[(uint32_t)UE_id]->Msg3_subframe);
     
-    pdsch_procedures(eNB,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,subframe,thread_id,num_pdcch_symbols,abstraction_flag);
+    pdsch_procedures(eNB,eNB->dlsch_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,num_pdcch_symbols,abstraction_flag);
     
     
     eNB->dlsch_ra->active = 0;
@@ -1374,7 +1381,7 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
         (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&&
         (eNB->dlsch[(uint8_t)UE_id][0]->active == 1)) {
 
-      pdsch_procedures(eNB,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,subframe,thread_id,num_pdcch_symbols,abstraction_flag);
+      pdsch_procedures(eNB,eNB->dlsch[(uint8_t)UE_id][0],eNB->dlsch[(uint8_t)UE_id][1],&eNB->UE_stats[(uint32_t)UE_id],0,num_pdcch_symbols,abstraction_flag);
 
 
     }
@@ -1395,7 +1402,6 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
   if (is_phich_subframe(fp,subframe))
   {
     generate_phich_top(eNB,
-                       thread_id,
                        AMP,
                        0,
                        abstraction_flag);
@@ -1414,11 +1420,11 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
     start_meas(&eNB->ofdm_mod_stats);
     do_OFDM_mod(eNB->common_vars.txdataF[0],
                 eNB->common_vars.txdata[0],
-                proc->frame_tx,subframe<<1,
+                frame,subframe<<1,
                 fp);
     do_OFDM_mod(eNB->common_vars.txdataF[0],
                 eNB->common_vars.txdata[0],
-                proc->frame_tx,1+(subframe<<1),
+                frame,1+(subframe<<1),
                 fp);
     stop_meas(&eNB->ofdm_mod_stats);
   }
@@ -1431,10 +1437,10 @@ void phy_procedures_eNB_TX(unsigned char thread_id,
 
 }
 
-void process_Msg3(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t UE_id, uint8_t harq_pid)
+void process_Msg3(PHY_VARS_eNB *eNB,uint8_t UE_id, uint8_t harq_pid)
 {
   // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   int subframe = proc->subframe_rx;
   int frame = proc->frame_rx;
 
@@ -1468,7 +1474,6 @@ void process_Msg3(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t UE_id, uint8_t har
 // rate-adaptation based on the error statistics derived from the ACK/NAK process
 
 void process_HARQ_feedback(uint8_t UE_id,
-                           uint8_t thread_id,
                            PHY_VARS_eNB *eNB,
                            uint8_t pusch_flag,
                            uint8_t *pucch_payload,
@@ -1476,7 +1481,7 @@ void process_HARQ_feedback(uint8_t UE_id,
                            uint8_t SR_payload)
 {
 
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
   uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe;
   LTE_eNB_DLSCH_t *dlsch             =  eNB->dlsch[(uint32_t)UE_id][0];
@@ -1741,14 +1746,13 @@ void process_HARQ_feedback(uint8_t UE_id,
 
 void get_n1_pucch_eNB(PHY_VARS_eNB *eNB,
                       uint8_t UE_id,
-                      uint8_t thread_id,
                       int16_t *n1_pucch0,
                       int16_t *n1_pucch1,
                       int16_t *n1_pucch2,
                       int16_t *n1_pucch3)
 {
 
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   LTE_DL_FRAME_PARMS *frame_parms=&eNB->frame_parms;
   uint8_t nCCE0,nCCE1;
   int sf;
@@ -1880,7 +1884,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *eNB,
   }
 }
 
-void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_flag)
+void prach_procedures(PHY_VARS_eNB *eNB,uint8_t abstraction_flag)
 {
 
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
@@ -1888,7 +1892,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_fl
   uint16_t preamble_max,preamble_energy_max;
   uint16_t i;
   int8_t UE_id;
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   int subframe = proc->subframe_rx;
   int frame = proc->frame_rx;
   uint8_t CC_id = eNB->CC_id;
@@ -1902,7 +1906,6 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_fl
 
 
     rx_prach(eNB,
-             subframe,
              preamble_energy_list,
              preamble_delay_list,
              frame,
@@ -1999,17 +2002,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,uint8_t thread_id,uint8_t abstraction_fl
   }
 }
 
-void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *eNB, unsigned char abstraction_flag)
-{
-  UNUSED(subframe);
-  UNUSED(i);
-  UNUSED(eNB);
-  UNUSED(abstraction_flag);
-  LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called");
-}
-
-
-void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
+void pucch_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
 
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
   uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0};
@@ -2019,7 +2012,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,
   int32_t metric0=0,metric1=0,metric0_SR=0;
   ANFBmode_t bundling_flag;
   PUCCH_FMT_t format;
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   const int subframe = proc->subframe_rx;
   const int frame = proc->frame_rx;
 
@@ -2028,14 +2021,13 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,
       (eNB->ulsch[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { 
 
       // check SR availability
-      do_SR = is_SR_subframe(eNB,UE_id,thread_id);
+      do_SR = is_SR_subframe(eNB,UE_id);
       //      do_SR = 0;
 
       // Now ACK/NAK
       // First check subframe_tx flag for earlier subframes
       get_n1_pucch_eNB(eNB,
                        UE_id,
-                       thread_id,
                        &n1_pucch0,
                        &n1_pucch1,
                        &n1_pucch2,
@@ -2098,8 +2090,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,
 				       UE_id,
 				       pucch_format1,
 				       0,
-				       &SR_payload,
-				       thread_id);
+				       &SR_payload);
             LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id,
                   eNB->ulsch[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex);
           }
@@ -2182,7 +2173,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,
                 pucch_payload0[0],metric0);
 #endif
 
-          process_HARQ_feedback(UE_id,thread_id,eNB,
+          process_HARQ_feedback(UE_id,eNB,
                                 0,// pusch_flag
                                 pucch_payload0,
                                 2,
@@ -2313,7 +2304,7 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,
                 frame,subframe,
                 metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
 #endif
-          process_HARQ_feedback(UE_id,thread_id,eNB,
+          process_HARQ_feedback(UE_id,eNB,
                                 0,// pusch_flag
                                 pucch_payload,
                                 pucch_sel,
@@ -2324,9 +2315,9 @@ void pucch_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,
     }
 }
 
-void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
+void cba_procedures(PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
 
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   uint8_t access_mode;
   int num_active_cba_groups;
   const int subframe = proc->subframe_rx;
@@ -2352,7 +2343,6 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in
     
     if (abstraction_flag==0) {
       rx_ulsch(eNB,
-	       thread_id,
 	       eNB->UE_stats[UE_id].sector,  // this is the effective sector id
 	       UE_id,
 	       eNB->ulsch,
@@ -2372,7 +2362,6 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in
     if (abstraction_flag == 0) {
       ret = ulsch_decoding(eNB,
 			   UE_id,
-			   thread_id,
 			   0, // control_only_flag
 			   eNB->ulsch[UE_id]->harq_processes[harq_pid]->V_UL_DAI,
 			   eNB->ulsch[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
@@ -2381,7 +2370,6 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in
 #ifdef PHY_ABSTRACTION
     else {
       ret = ulsch_decoding_emul(eNB,
-				thread_id,
 				UE_id,
 				&rnti);
     }
@@ -2489,20 +2477,26 @@ void cba_procedures(const unsigned char thread_id,PHY_VARS_eNB *eNB,int UE_id,in
 
 
 
-void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) {
+void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag) {
 
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   int i,l;
   LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms;
   void *rxp[fp->nb_antennas_rx]; 
   unsigned int rxs;
-  
-  AssertFatal(thread_id < NUM_ENB_THREADS, "Bad thread_id %d", thread_id);
+  int subframe = proc->subframe_rx;
+  int frame = proc->frame_rx;
+
+  if (subframe==9) { 
+    subframe=0;
+    frame++;
+  }
+  else subframe++;
 
   //  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_COMMON_RX,1);
   start_meas(&eNB->phy_proc_rx);
 #ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,proc->frame_rx, proc->subframe_rx);
+  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe);
 #endif
 
   if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot)
@@ -2511,7 +2505,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
       if ((eNB->node_function == NGFI_RRU_IF4) || 
 	  (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF and front-end processing
 	for (i=0; i<fp->nb_antennas_rx; i++)
-	  rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][proc->subframe*fp->samples_per_tti];
+	  rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][subframe*fp->samples_per_tti];
 
 	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
 	rxs = openair0.trx_read_func(&openair0,
@@ -2521,9 +2515,11 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
 				     fp->nb_antennas_rx);
 	proc->frame_rx    = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023;
 	proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10;
+	AssertFatal(proc->subframe_rx == subframe, "Received Timestamp doesn't correspond to the time we think it is");
+
 	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx );
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx );
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, frame );
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, subframe );
 
 	if (frame > 20){ 
 	  if (rxs != fp->samples_per_tti>>1)
@@ -2583,15 +2579,18 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
  
   
     // check if we have to detect PRACH first
-    if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) {
+    if (is_prach_subframe(fp,frame,subframe)>0) {
       // wake up thread for PRACH RX
       if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
-	LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", thread_id, proc->instance_cnt_prach );
+	LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB PRACH thread %d (IC %d)\n", proc->instance_cnt_prach );
 	exit_fun( "error locking mutex_prach" );
 	return;
       }
       
       int cnt_prach = ++proc->instance_cnt_prach;
+      // set timing for prach thread
+      proc->frame_prach = frame;
+      proc->subframe_prach = subframe;
 
       pthread_mutex_unlock( &proc->mutex_prach );
       
@@ -2603,7 +2602,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
 	  return;
 	}
       } else {
-	LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", proc->frame_tx);
+	LOG_W( PHY,"[eNB] Frame %d, eNB PRACH thread busy!!\n", frame);
 	exit_fun( "PRACH thread busy" );
 	return;
       }
@@ -2614,7 +2613,7 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
     // wake up TX thread
     // lock the TX mutex and make sure the thread is ready
     if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
-      LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", thread_id, proc->instance_cnt_tx );
+      LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", proc->instance_cnt_tx );
       exit_fun( "error locking mutex_tx" );
       return;
     }
@@ -2627,20 +2626,20 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
     // we want to generate subframe (n+3), so TS_tx = TX_rx+2.5*samples_per_tti,
     // and proc->subframe_tx = proc->subframe_rx+3
     proc->timestamp_tx = proc->timestamp_rx + (fp->samples_per_tti<<1) + (fp->samples_per_tti>>1);
-    proc->frame_tx    = (proc->subframe_rx > 6) ? (proc->frame_rx+1) : proc->frame_rx;
-    proc->subframe_tx = (proc->subframe_rx + 3)%10;
+    proc->frame_tx     = (subframe > 6) ? (frame+1) : frame;
+    proc->subframe_tx  = (subframe + 3)%10;
 
     pthread_mutex_unlock( &proc->mutex_tx );
 
     if (cnt_tx == 0){
       // the thread was presumably waiting where it should and can now be woken up
       if (pthread_cond_signal(&proc->cond_tx) != 0) {
-	LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", thread_id);
+	LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread\n");
 	exit_fun( "ERROR pthread_cond_signal" );
 	return;
       }
     } else {
-      LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (cnt_tx %i)\n", proc->frame_tx, thread_id, cnt_tx );
+      LOG_W( PHY,"[eNB] Frame %d, eNB TX thread busy!! (cnt_tx %i)\n", frame, cnt_tx );
       exit_fun( "TX thread busy" );
       return;
     }
@@ -2652,11 +2651,11 @@ void phy_procedures_eNB_common_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
   }
 }
 
-void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type)
+void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type)
 {
   //RX processing for ue-specific resources (i
   UNUSED(r_type);
-  eNB_proc_t *proc = &eNB->proc[thread_id];
+  eNB_proc_t *proc = &eNB->proc;
   uint32_t l, ret=0,i,j,k;
   uint32_t harq_pid, harq_idx, round;
   uint8_t nPRS;
@@ -2668,8 +2667,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
   const int subframe = proc->subframe_rx;
   const int frame = proc->frame_rx;
 
-  AssertFatal(thread_id < NUM_ENB_THREADS, "Bad thread_id %d", thread_id);
-
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
   start_meas(&eNB->phy_proc_rx);
 #ifdef DEBUG_PHY_PROC
@@ -2720,7 +2717,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
   // Do PUCCH processing first
 
   for (i=0; i<NUMBER_OF_UE_MAX; i++) {
-    pucch_procedures(thread_id,eNB,i,harq_pid,abstraction_flag);
+    pucch_procedures(eNB,i,harq_pid,abstraction_flag);
   }
 
   for (i=0; i<NUMBER_OF_UE_MAX; i++) {
@@ -2728,7 +2725,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
     // check for Msg3
     if (eNB->mac_enabled==1) {
       if (eNB->UE_stats[i].mode == RA_RESPONSE) {
-	process_Msg3(eNB,thread_id,i,harq_pid);
+	process_Msg3(eNB,i,harq_pid);
       }
     }
 
@@ -2810,7 +2807,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
 
       if (abstraction_flag==0) {
         rx_ulsch(eNB,
-                 thread_id,
                  eNB->UE_stats[i].sector,  // this is the effective sector id
                  i,
                  eNB->ulsch,
@@ -2834,7 +2830,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
       if (abstraction_flag == 0) {
         ret = ulsch_decoding(eNB,
                              i,
-                             thread_id,
                              0, // control_only_flag
                              eNB->ulsch[i]->harq_processes[harq_pid]->V_UL_DAI,
 			     eNB->ulsch[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
@@ -2843,7 +2838,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
 #ifdef PHY_ABSTRACTION
       else {
         ret = ulsch_decoding_emul(eNB,
-                                  thread_id,
                                   i,
                                   &rnti);
       }
@@ -2869,8 +2863,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
       eNB->ulsch[(uint32_t)i]->harq_processes[harq_pid]->delta_TF =
         get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0); // 0 means bw_factor is not considered
 
-      //dump_ulsch(eNB, thread_id, i);
-
       eNB->UE_stats[i].ulsch_decoding_attempts[harq_pid][eNB->ulsch[i]->harq_processes[harq_pid]->round]++;
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d Clearing subframe_scheduling_flag\n",
@@ -2880,7 +2872,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
 
       if (eNB->ulsch[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
 #ifdef DEBUG_PHY_PROC
-        //if (((proc->frame_tx%10) == 0) || (proc->frame_tx < 50))
+        //if (((frame%10) == 0) || (frame < 50))
         print_CQI(eNB->ulsch[i]->harq_processes[harq_pid]->o,eNB->ulsch[i]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL);
 #endif
         extract_CQI(eNB->ulsch[i]->harq_processes[harq_pid]->o,
@@ -3139,7 +3131,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
 
         // estimate timing advance for MAC
         if (abstraction_flag == 0) {
-          sync_pos = lte_est_timing_advance_pusch(eNB,i,thread_id);
+          sync_pos = lte_est_timing_advance_pusch(eNB,i);
           eNB->UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check
         }
 
@@ -3162,7 +3154,6 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
             i);
 #endif
       process_HARQ_feedback(i,
-                            thread_id,
                             eNB,
                             1, // pusch_flag
                             0,
@@ -3226,7 +3217,7 @@ void phy_procedures_eNB_uespec_RX(const unsigned char thread_id,PHY_VARS_eNB *eN
     }
 
     // CBA (non-LTE)
-    cba_procedures(thread_id,eNB,i,harq_pid,abstraction_flag);
+    cba_procedures(eNB,i,harq_pid,abstraction_flag);
   } // loop i=0 ... NUMBER_OF_UE_MAX-1
 
   if (abstraction_flag == 0) {
diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c
index b055544449af58c76d6dabf8ec00467df4150c61..d757a7573c8848e056dc53eaff7dcfda164ef1c6 100644
--- a/openair1/SIMULATION/LTE_PHY/dlsim.c
+++ b/openair1/SIMULATION/LTE_PHY/dlsim.c
@@ -57,13 +57,13 @@
 #include "UTIL/LOG/log.h"
 #include "UTIL/LISTS/list.h"
 
-extern unsigned int dlsch_tbs25[27][25],TBStable[27][110];
-extern unsigned char offset_mumimo_llr_drange_fix;
+#include "unitary_defs.h"
+
 
 #include "PHY/TOOLS/lte_phy_scope.h"
 
-PHY_VARS_eNB *PHY_vars_eNB;
-PHY_VARS_UE *PHY_vars_UE;
+PHY_VARS_eNB *eNB;
+PHY_VARS_UE *UE;
 
 int otg_enabled=0;
 /*the following parameters are used to control the processing times calculations*/
@@ -96,7 +96,7 @@ DCI1E_5MHz_2A_M10PRB_TDD_t  DLSCH_alloc_pdu2_1E[2];
 uint64_t DLSCH_alloc_pdu_1[2];
 
 #define UL_RB_ALLOC 0x1ff;
-#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2)
+#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2)
 //#define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
 //#define DLSCH_RB_ALLOC 0x0001
 void do_OFDM_mod_l(int32_t **txdataF, int32_t **txdata, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms)
@@ -485,7 +485,7 @@ int main(int argc, char **argv)
 
     case 'u':
       dual_stream_UE=1;
-      openair_daq_vars.use_ia_receiver = 1;
+      UE->use_ia_receiver = 1;
 
       if ((n_tx!=2) || (transmission_mode!=5)) {
         msg("IA receiver only supported for TM5!");
@@ -627,7 +627,7 @@ int main(int argc, char **argv)
     fl_show_form (form_ue->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
     
     if (!dual_stream_UE==0) {
-      openair_daq_vars.use_ia_receiver = 1;
+      UE->use_ia_receiver = 1;
       fl_set_button(form_ue->button_0,1);
       fl_set_object_label(form_ue->button_0, "IA Receiver ON");
       fl_set_object_color(form_ue->button_0, FL_GREEN, FL_GREEN);
@@ -653,7 +653,7 @@ int main(int argc, char **argv)
 
 
     
-  eNB_id_i = PHY_vars_UE->n_connected_eNB;
+  eNB_id_i = UE->n_connected_eNB;
 
   printf("Setting mcs1 = %d\n",mcs1);
   printf("Setting mcs2 = %d\n",mcs2);
@@ -674,7 +674,7 @@ int main(int argc, char **argv)
     txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
   */
 
-  frame_parms = &PHY_vars_eNB->lte_frame_parms;
+  frame_parms = &eNB->frame_parms;
 
   s_re = malloc(2*sizeof(double*));
   s_im = malloc(2*sizeof(double*));
@@ -683,7 +683,7 @@ int main(int argc, char **argv)
   //  r_re0 = malloc(2*sizeof(double*));
   //  r_im0 = malloc(2*sizeof(double*));
 
-  nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12;
+  nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
 
   printf("Channel Model= (%s,%d)\n",channel_model_input, channel_model);
   printf("SCM-A=%d, SCM-B=%d, SCM-C=%d, SCM-D=%d, EPA=%d, EVA=%d, ETU=%d, Rayleigh8=%d, Rayleigh1=%d, Rayleigh1_corr=%d, Rayleigh1_anticorr=%d, Rice1=%d, Rice8=%d\n",
@@ -838,7 +838,7 @@ int main(int argc, char **argv)
   }
 
 
-  PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti;
+  UE->pdcch_vars[0]->crnti = n_rnti;
 
   // Fill in UL_alloc
   UL_alloc_pdu.type    = 0;
@@ -882,22 +882,22 @@ int main(int argc, char **argv)
   DLSCH_alloc_pdu2_1E[1].tpmi             = (transmission_mode>=5 ? 5 : 0) ;  // precoding
   DLSCH_alloc_pdu2_1E[1].dl_power_off     = (transmission_mode==5 ? 0 : 1);
 
-  eNB2UE[0] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
-                                   PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
+  eNB2UE[0] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
+                                   UE->frame_parms.nb_antennas_rx,
                                    channel_model,
-                                   N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
-				   N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
+                                   N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
+				   N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
                                    forgetting_factor,
                                    rx_sample_offset,
                                    0);
 
   if(num_rounds>1) {
     for(n=1; n<4; n++)
-      eNB2UE[n] = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
-                                       PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
+      eNB2UE[n] = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
+                                       UE->frame_parms.nb_antennas_rx,
                                        channel_model,
-				       N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
-				       N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
+				       N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
+				       N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
 				       forgetting_factor,
                                        rx_sample_offset,
                                        0);
@@ -933,42 +933,42 @@ int main(int argc, char **argv)
   for (k=0; k<n_users; k++) {
     // Create transport channel structures for 2 transport blocks (MIMO)
     for (i=0; i<2; i++) {
-      PHY_vars_eNB->dlsch_eNB[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0);
+      eNB->dlsch[k][i] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0);
 
-      if (!PHY_vars_eNB->dlsch_eNB[k][i]) {
+      if (!eNB->dlsch[k][i]) {
         printf("Can't get eNB dlsch structures\n");
         exit(-1);
       }
 
-      PHY_vars_eNB->dlsch_eNB[k][i]->rnti = n_rnti+k;
+      eNB->dlsch[k][i]->rnti = n_rnti+k;
     }
   }
 
   for (i=0; i<2; i++) {
-    PHY_vars_UE->dlsch_ue[0][i]  = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
+    UE->dlsch[0][i]  = new_ue_dlsch(Kmimo,8,Nsoft,MAX_TURBO_ITERATIONS,N_RB_DL,0);
 
-    if (!PHY_vars_UE->dlsch_ue[0][i]) {
+    if (!UE->dlsch[0][i]) {
       printf("Can't get ue dlsch structures\n");
       exit(-1);
     }
 
-    PHY_vars_UE->dlsch_ue[0][i]->rnti   = n_rnti;
+    UE->dlsch[0][i]->rnti   = n_rnti;
   }
 
   // structure for SIC at UE
-  PHY_vars_UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0);
+  UE->dlsch_eNB[0] = new_eNB_dlsch(Kmimo,8,Nsoft,N_RB_DL,0);
 
   if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
 
-    PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff);
+    eNB->UE_stats[0].DL_pmi_single = (unsigned short)(taus()&0xffff);
 
     if (n_users>1)
-      PHY_vars_eNB->eNB_UE_stats[1].DL_pmi_single = (PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI
+      eNB->UE_stats[1].DL_pmi_single = (eNB->UE_stats[0].DL_pmi_single ^ 0x1555); //opposite PMI
   } else {
-    PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single = 0;
+    eNB->UE_stats[0].DL_pmi_single = 0;
 
     if (n_users>1)
-      PHY_vars_eNB->eNB_UE_stats[1].DL_pmi_single = 0;
+      eNB->UE_stats[1].DL_pmi_single = 0;
   }
 
 
@@ -992,9 +992,9 @@ int main(int argc, char **argv)
       case 2:
         if (common_flag == 0) {
 
-          if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+          if (eNB->frame_parms.frame_type == TDD) {
 
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1_1_5MHz_TDD_t;
               dci_length_bytes = sizeof(DCI1_1_5MHz_TDD_t);
@@ -1048,7 +1048,7 @@ int main(int argc, char **argv)
               break;
             }
           } else {
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1_1_5MHz_FDD_t;
               dci_length_bytes = sizeof(DCI1_1_5MHz_FDD_t);
@@ -1104,7 +1104,7 @@ int main(int argc, char **argv)
           dci_alloc[num_dci].L          = 1;
           dci_alloc[num_dci].rnti       = n_rnti+k;
           dci_alloc[num_dci].format     = format1;
-          dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
+          dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
 
           printf("Generating dlsch params for user %d\n",k);
           generate_eNB_dlsch_params_from_dci(0,
@@ -1112,26 +1112,26 @@ int main(int argc, char **argv)
                                              &DLSCH_alloc_pdu_1[0],
                                              n_rnti+k,
                                              format1,
-                                             PHY_vars_eNB->dlsch_eNB[0],
-                                             &PHY_vars_eNB->lte_frame_parms,
-                                             PHY_vars_eNB->pdsch_config_dedicated,
+                                             eNB->dlsch[0],
+                                             &eNB->frame_parms,
+                                             eNB->pdsch_config_dedicated,
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             eNB->UE_stats[0].DL_pmi_single);
 
           num_dci++;
           num_ue_spec_dci++;
         } else {
-          if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+          if (eNB->frame_parms.frame_type == TDD) {
 
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
               dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
-              ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1145,7 +1145,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
-              ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1159,7 +1159,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1171,7 +1171,7 @@ int main(int argc, char **argv)
             case 100:
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1183,13 +1183,13 @@ int main(int argc, char **argv)
               break;
             }
           } else {
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
               dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1202,7 +1202,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t);
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1215,7 +1215,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t);
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1228,7 +1228,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t);
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1244,7 +1244,7 @@ int main(int argc, char **argv)
           dci_alloc[num_dci].rnti       = SI_RNTI;
           dci_alloc[num_dci].format     = format1A;
           dci_alloc[num_dci].firstCCE       = 0;
-          dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
+          dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
 
           printf("Generating dlsch params for user %d\n",k);
           generate_eNB_dlsch_params_from_dci(0,
@@ -1252,13 +1252,13 @@ int main(int argc, char **argv)
                                              &DLSCH_alloc_pdu_1[0],
                                              SI_RNTI,
                                              format1A,
-                                             PHY_vars_eNB->dlsch_eNB[0],
-                                             &PHY_vars_eNB->lte_frame_parms,
-                                             PHY_vars_eNB->pdsch_config_dedicated,
+                                             eNB->dlsch[0],
+                                             &eNB->frame_parms,
+                                             eNB->pdsch_config_dedicated,
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             eNB->UE_stats[0].DL_pmi_single);
 
           num_common_dci++;
           num_dci++;
@@ -1270,11 +1270,11 @@ int main(int argc, char **argv)
       case 3:
         if (common_flag == 0) {
 
-          if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) {
+          if (eNB->frame_parms.nb_antennas_tx == 2) {
 
-            if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+            if (eNB->frame_parms.frame_type == TDD) {
 
-              switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+              switch (eNB->frame_parms.N_RB_DL) {
               case 6:
                 dci_length = sizeof_DCI2A_1_5MHz_2A_TDD_t;
                 dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_TDD_t);
@@ -1341,7 +1341,7 @@ int main(int argc, char **argv)
             }
 
             else {
-              switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+              switch (eNB->frame_parms.N_RB_DL) {
               case 6:
                 dci_length = sizeof_DCI2A_1_5MHz_2A_FDD_t;
                 dci_length_bytes = sizeof(DCI2A_1_5MHz_2A_FDD_t);
@@ -1402,7 +1402,7 @@ int main(int argc, char **argv)
                 break;
               }
             }
-          } else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) {
+          } else if (eNB->frame_parms.nb_antennas_tx == 4) {
 
           }
 
@@ -1411,7 +1411,7 @@ int main(int argc, char **argv)
           dci_alloc[num_dci].L          = 1;
           dci_alloc[num_dci].rnti       = n_rnti+k;
           dci_alloc[num_dci].format     = format2A;
-          dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
+          dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
 
           printf("Generating dlsch params for user %d / format 2A (%d)\n",k,format2A);
           generate_eNB_dlsch_params_from_dci(0,
@@ -1419,26 +1419,26 @@ int main(int argc, char **argv)
                                              &DLSCH_alloc_pdu_1[0],
                                              n_rnti+k,
                                              format2A,
-                                             PHY_vars_eNB->dlsch_eNB[0],
-                                             &PHY_vars_eNB->lte_frame_parms,
-                                             PHY_vars_eNB->pdsch_config_dedicated,
+                                             eNB->dlsch[0],
+                                             &eNB->frame_parms,
+                                             eNB->pdsch_config_dedicated,
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             eNB->UE_stats[0].DL_pmi_single);
 
           num_dci++;
           num_ue_spec_dci++;
         } else {
-          if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+          if (eNB->frame_parms.frame_type == TDD) {
 
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
               dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
-              ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1452,7 +1452,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
-              ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1466,7 +1466,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1478,7 +1478,7 @@ int main(int argc, char **argv)
             case 100:
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1490,13 +1490,13 @@ int main(int argc, char **argv)
               break;
             }
           } else {
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
               dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1509,7 +1509,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t);
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1522,7 +1522,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t);
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1535,7 +1535,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t);
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1551,7 +1551,7 @@ int main(int argc, char **argv)
           dci_alloc[num_dci].rnti       = SI_RNTI;
           dci_alloc[num_dci].format     = format1A;
           dci_alloc[num_dci].firstCCE       = 0;
-          dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
+          dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
 
           printf("Generating dlsch params for user %d\n",k);
           generate_eNB_dlsch_params_from_dci(0,
@@ -1559,13 +1559,13 @@ int main(int argc, char **argv)
                                              &DLSCH_alloc_pdu_1[0],
                                              SI_RNTI,
                                              format1A,
-                                             PHY_vars_eNB->dlsch_eNB[0],
-                                             &PHY_vars_eNB->lte_frame_parms,
-                                             PHY_vars_eNB->pdsch_config_dedicated,
+                                             eNB->dlsch[0],
+                                             &eNB->frame_parms,
+                                             eNB->pdsch_config_dedicated,
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             eNB->UE_stats[0].DL_pmi_single);
 
           num_common_dci++;
           num_dci++;
@@ -1578,11 +1578,11 @@ int main(int argc, char **argv)
       case 4:
         if (common_flag == 0) {
 
-          if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 2) {
+          if (eNB->frame_parms.nb_antennas_tx == 2) {
 
-            if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+            if (eNB->frame_parms.frame_type == TDD) {
 
-              switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+              switch (eNB->frame_parms.N_RB_DL) {
               case 6:
                 dci_length = sizeof_DCI2_1_5MHz_2A_TDD_t;
                 dci_length_bytes = sizeof(DCI2_1_5MHz_2A_TDD_t);
@@ -1649,7 +1649,7 @@ int main(int argc, char **argv)
             }
 
             else {
-              switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+              switch (eNB->frame_parms.N_RB_DL) {
               case 6:
                 dci_length = sizeof_DCI2_1_5MHz_2A_FDD_t;
                 dci_length_bytes = sizeof(DCI2_1_5MHz_2A_FDD_t);
@@ -1710,7 +1710,7 @@ int main(int argc, char **argv)
                 break;
               }
             }
-          } else if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx == 4) {
+          } else if (eNB->frame_parms.nb_antennas_tx == 4) {
 
           }
 
@@ -1719,7 +1719,7 @@ int main(int argc, char **argv)
           dci_alloc[num_dci].L          = 1;
           dci_alloc[num_dci].rnti       = n_rnti+k;
           dci_alloc[num_dci].format     = format2;
-          dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
+          dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
 
           printf("Generating dlsch params for user %d\n",k);
           generate_eNB_dlsch_params_from_dci(0,
@@ -1727,26 +1727,26 @@ int main(int argc, char **argv)
                                              &DLSCH_alloc_pdu_1[0],
                                              n_rnti+k,
                                              format2,
-                                             PHY_vars_eNB->dlsch_eNB[0],
-                                             &PHY_vars_eNB->lte_frame_parms,
-                                             PHY_vars_eNB->pdsch_config_dedicated,
+                                             eNB->dlsch[0],
+                                             &eNB->frame_parms,
+                                             eNB->pdsch_config_dedicated,
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             eNB->UE_stats[0].DL_pmi_single);
 
           num_dci++;
           num_ue_spec_dci++;
         } else {
-          if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+          if (eNB->frame_parms.frame_type == TDD) {
 
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1A_1_5MHz_TDD_1_6_t;
               dci_length_bytes = sizeof(DCI1A_1_5MHz_TDD_1_6_t);
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
-              ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_1_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1760,7 +1760,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_5MHz_TDD_1_6_t);
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 0;
-              ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_5MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1774,7 +1774,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_10MHz_TDD_1_6_t);
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_10MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1786,7 +1786,7 @@ int main(int argc, char **argv)
             case 100:
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->dai              = 0;
               ((DCI1A_20MHz_TDD_1_6_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
@@ -1798,13 +1798,13 @@ int main(int argc, char **argv)
               break;
             }
           } else {
-            switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+            switch (eNB->frame_parms.N_RB_DL) {
             case 6:
               dci_length = sizeof_DCI1A_1_5MHz_FDD_t;
               dci_length_bytes = sizeof(DCI1A_1_5MHz_FDD_t);
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1817,7 +1817,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_5MHz_FDD_t);
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1830,7 +1830,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_10MHz_FDD_t);
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_10MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1843,7 +1843,7 @@ int main(int argc, char **argv)
               dci_length_bytes = sizeof(DCI1A_20MHz_FDD_t);
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->type             = 1;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->vrb_type         = 1;
-              ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_DL,0,9);
+              ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->rballoc          = computeRIV(eNB->frame_parms.N_RB_DL,0,9);
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->TPC              = TPC;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->harq_pid         = 0;
               ((DCI1A_20MHz_FDD_t *)&DLSCH_alloc_pdu_1[k])->mcs             = mcs1;
@@ -1859,7 +1859,7 @@ int main(int argc, char **argv)
           dci_alloc[num_dci].rnti       = SI_RNTI;
           dci_alloc[num_dci].format     = format1A;
           dci_alloc[num_dci].firstCCE       = 0;
-          dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
+          dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
 
           printf("Generating dlsch params for user %d\n",k);
           generate_eNB_dlsch_params_from_dci(0,
@@ -1867,13 +1867,13 @@ int main(int argc, char **argv)
                                              &DLSCH_alloc_pdu_1[0],
                                              SI_RNTI,
                                              format1A,
-                                             PHY_vars_eNB->dlsch_eNB[0],
-                                             &PHY_vars_eNB->lte_frame_parms,
-                                             PHY_vars_eNB->pdsch_config_dedicated,
+                                             eNB->dlsch[0],
+                                             &eNB->frame_parms,
+                                             eNB->pdsch_config_dedicated,
                                              SI_RNTI,
                                              0,
                                              P_RNTI,
-                                             PHY_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
+                                             eNB->UE_stats[0].DL_pmi_single);
 
           num_common_dci++;
           num_dci++;
@@ -1896,15 +1896,15 @@ int main(int argc, char **argv)
                                            &DLSCH_alloc_pdu2_1E[k],
                                            n_rnti+k,
                                            format1E_2A_M10PRB,
-                                           PHY_vars_eNB->dlsch_eNB[k],
-                                           &PHY_vars_eNB->lte_frame_parms,
-                                           PHY_vars_eNB->pdsch_config_dedicated,
+                                           eNB->dlsch[k],
+                                           &eNB->frame_parms,
+                                           eNB->pdsch_config_dedicated,
                                            SI_RNTI,
                                            0,
                                            P_RNTI,
-                                           PHY_vars_eNB->eNB_UE_stats[k].DL_pmi_single);
+                                           eNB->UE_stats[k].DL_pmi_single);
 
-        dump_dci(&PHY_vars_eNB->lte_frame_parms,&dci_alloc[num_dci]);
+        dump_dci(&eNB->frame_parms,&dci_alloc[num_dci]);
         num_ue_spec_dci++;
         num_dci++;
 
@@ -1929,7 +1929,7 @@ int main(int argc, char **argv)
 
     if (n_frames==1) printf("num_pdcch_symbols %d, numCCE %d => ",num_pdcch_symbols,numCCE);
 
-    numCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe));
+    numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe));
 
     if (n_frames==1) printf("%d\n",numCCE);
 
@@ -1952,10 +1952,10 @@ int main(int argc, char **argv)
 
     for (k=0; k<n_users; k++) {
 
-      input_buffer_length0 = PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->TBS/8;
+      input_buffer_length0 = eNB->dlsch[k][0]->harq_processes[0]->TBS/8;
       input_buffer0[k] = (unsigned char *)malloc(input_buffer_length0+4);
       memset(input_buffer0[k],0,input_buffer_length0+4);
-      input_buffer_length1 = PHY_vars_eNB->dlsch_eNB[k][1]->harq_processes[0]->TBS/8;
+      input_buffer_length1 = eNB->dlsch[k][1]->harq_processes[0]->TBS/8;
       input_buffer1[k] = (unsigned char *)malloc(input_buffer_length1+4);
       memset(input_buffer1[k],0,input_buffer_length1+4);
 
@@ -1994,11 +1994,11 @@ int main(int argc, char **argv)
   }
 
   // this is for user 0 only
-  coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
-                                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->nb_rb,
-                                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rb_alloc,
-                                  get_Qm(PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->mcs),
-                                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->Nl,
+  coded_bits_per_codeword = get_G(&eNB->frame_parms,
+                                  eNB->dlsch[0][0]->harq_processes[0]->nb_rb,
+                                  eNB->dlsch[0][0]->harq_processes[0]->rb_alloc,
+                                  get_Qm(eNB->dlsch[0][0]->harq_processes[0]->mcs),
+                                  eNB->dlsch[0][0]->harq_processes[0]->Nl,
                                   num_pdcch_symbols,
                                   0,subframe);
 
@@ -2006,8 +2006,8 @@ int main(int argc, char **argv)
   printf("uncoded_ber_bit=%p\n",uncoded_ber_bit);
 
   snr_step = input_snr_step;
-  PHY_vars_UE->high_speed_flag = 1;
-  PHY_vars_UE->ch_est_alpha=0;
+  UE->high_speed_flag = 1;
+  UE->ch_est_alpha=0;
 
   for (ch_realization=0; ch_realization<n_ch_rlz; ch_realization++) {
     if(abstx) {
@@ -2015,7 +2015,7 @@ int main(int argc, char **argv)
     }
 
     for (SNR=snr0; SNR<snr1; SNR+=snr_step) {
-      PHY_vars_UE->frame_rx=0;
+      UE->frame_rx=0;
       errs[0]=0;
       errs[1]=0;
       errs[2]=0;
@@ -2035,32 +2035,32 @@ int main(int argc, char **argv)
       round=0;
       avg_iter = 0;
       iter_trials=0;
-      reset_meas(&PHY_vars_eNB->phy_proc_tx); // total eNB tx
-      reset_meas(&PHY_vars_eNB->dlsch_scrambling_stats);
-      reset_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
-      reset_meas(&PHY_vars_eNB->ofdm_mod_stats);
-      reset_meas(&PHY_vars_eNB->dlsch_modulation_stats);
-      reset_meas(&PHY_vars_eNB->dlsch_encoding_stats);
-      reset_meas(&PHY_vars_eNB->dlsch_interleaving_stats);
-      reset_meas(&PHY_vars_eNB->dlsch_rate_matching_stats);
-      reset_meas(&PHY_vars_eNB->dlsch_turbo_encoding_stats);
-
-      reset_meas(&PHY_vars_UE->phy_proc_rx); // total UE rx
-      reset_meas(&PHY_vars_UE->ofdm_demod_stats);
-      reset_meas(&PHY_vars_UE->dlsch_channel_estimation_stats);
-      reset_meas(&PHY_vars_UE->dlsch_freq_offset_estimation_stats);
-      reset_meas(&PHY_vars_UE->rx_dft_stats);
-      reset_meas(&PHY_vars_UE->dlsch_decoding_stats);
-      reset_meas(&PHY_vars_UE->dlsch_turbo_decoding_stats);
-      reset_meas(&PHY_vars_UE->dlsch_deinterleaving_stats);
-      reset_meas(&PHY_vars_UE->dlsch_rate_unmatching_stats);
-      reset_meas(&PHY_vars_UE->dlsch_tc_init_stats);
-      reset_meas(&PHY_vars_UE->dlsch_tc_alpha_stats);
-      reset_meas(&PHY_vars_UE->dlsch_tc_beta_stats);
-      reset_meas(&PHY_vars_UE->dlsch_tc_gamma_stats);
-      reset_meas(&PHY_vars_UE->dlsch_tc_ext_stats);
-      reset_meas(&PHY_vars_UE->dlsch_tc_intl1_stats);
-      reset_meas(&PHY_vars_UE->dlsch_tc_intl2_stats);
+      reset_meas(&eNB->phy_proc_tx); // total eNB tx
+      reset_meas(&eNB->dlsch_scrambling_stats);
+      reset_meas(&UE->dlsch_unscrambling_stats);
+      reset_meas(&eNB->ofdm_mod_stats);
+      reset_meas(&eNB->dlsch_modulation_stats);
+      reset_meas(&eNB->dlsch_encoding_stats);
+      reset_meas(&eNB->dlsch_interleaving_stats);
+      reset_meas(&eNB->dlsch_rate_matching_stats);
+      reset_meas(&eNB->dlsch_turbo_encoding_stats);
+
+      reset_meas(&UE->phy_proc_rx); // total UE rx
+      reset_meas(&UE->ofdm_demod_stats);
+      reset_meas(&UE->dlsch_channel_estimation_stats);
+      reset_meas(&UE->dlsch_freq_offset_estimation_stats);
+      reset_meas(&UE->rx_dft_stats);
+      reset_meas(&UE->dlsch_decoding_stats);
+      reset_meas(&UE->dlsch_turbo_decoding_stats);
+      reset_meas(&UE->dlsch_deinterleaving_stats);
+      reset_meas(&UE->dlsch_rate_unmatching_stats);
+      reset_meas(&UE->dlsch_tc_init_stats);
+      reset_meas(&UE->dlsch_tc_alpha_stats);
+      reset_meas(&UE->dlsch_tc_beta_stats);
+      reset_meas(&UE->dlsch_tc_gamma_stats);
+      reset_meas(&UE->dlsch_tc_ext_stats);
+      reset_meas(&UE->dlsch_tc_intl1_stats);
+      reset_meas(&UE->dlsch_tc_intl2_stats);
       // initialization
       struct list time_vector_tx;
       initialize(&time_vector_tx);
@@ -2088,9 +2088,9 @@ int main(int argc, char **argv)
         //if (trials%100==0)
         eNB2UE[0]->first_run = 1;
 
-        ret = PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations+1;
+        ret = UE->dlsch[0][0]->max_turbo_iterations+1;
 
-        while ((round < num_rounds) && (ret > PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations)) {
+        while ((round < num_rounds) && (ret > UE->dlsch[0][0]->max_turbo_iterations)) {
           //    printf("Trial %d, round %d\n",trials,round);
           round_trials[round]++;
 
@@ -2110,13 +2110,13 @@ int main(int argc, char **argv)
 PMI_FEEDBACK:
 
           //  printf("Trial %d : Round %d, pmi_feedback %d \n",trials,round,pmi_feedback);
-          for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
-            memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
+          for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
+            memset(&eNB->common_vars.txdataF[eNB_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
           }
 
           if (input_fd==NULL) {
 
-            start_meas(&PHY_vars_eNB->phy_proc_tx);
+            start_meas(&eNB->phy_proc_tx);
 
             // Simulate HARQ procedures!!!
             if (common_flag == 0) {
@@ -2124,14 +2124,14 @@ PMI_FEEDBACK:
               if (round == 0) {   // First round
                 TB0_active = 1;
 
-                PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3;
+                eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3;
 
-                if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+                if (eNB->frame_parms.frame_type == TDD) {
 
                   switch (transmission_mode) {
                   case 1:
                   case 2:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi             = trials&1;
                       ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv              = 0;
@@ -2160,7 +2160,7 @@ PMI_FEEDBACK:
                     break;
 
                   case 3:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
                       ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
@@ -2206,7 +2206,7 @@ PMI_FEEDBACK:
                   switch (transmission_mode) {
                   case 1:
                   case 2:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi             = trials&1;
                       ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv              = 0;
@@ -2235,7 +2235,7 @@ PMI_FEEDBACK:
                     break;
 
                   case 3:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
                       ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv1              = 0;
@@ -2280,15 +2280,15 @@ PMI_FEEDBACK:
 
                 }
               } else {
-                PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->rvidx = round&3;
+                eNB->dlsch[0][0]->harq_processes[0]->rvidx = round&3;
 
-                if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+                if (eNB->frame_parms.frame_type == TDD) {
 
 
                   switch (transmission_mode) {
                   case 1:
                   case 2:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi             = trials&1;
                       ((DCI1_1_5MHz_TDD_t *)&DLSCH_alloc_pdu_1[0])->rv              = round&3;;
@@ -2317,7 +2317,7 @@ PMI_FEEDBACK:
                     break;
 
                   case 3:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       if (TB0_active==1) {
                         ((DCI2A_1_5MHz_2A_TDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
@@ -2395,7 +2395,7 @@ PMI_FEEDBACK:
                   switch (transmission_mode) {
                   case 1:
                   case 2:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi             = trials&1;
                       ((DCI1_1_5MHz_FDD_t *)&DLSCH_alloc_pdu_1[0])->rv              = round&3;;
@@ -2424,7 +2424,7 @@ PMI_FEEDBACK:
                     break;
 
                   case 3:
-                    switch (PHY_vars_eNB->lte_frame_parms.N_RB_DL) {
+                    switch (eNB->frame_parms.N_RB_DL) {
                     case 6:
                       if (TB0_active==1) {
                         ((DCI2A_1_5MHz_2A_FDD_t *)&DLSCH_alloc_pdu_1[0])->ndi1             = trials&1;
@@ -2507,8 +2507,8 @@ PMI_FEEDBACK:
                                                    dci_alloc,
                                                    0,
                                                    AMP,
-                                                   &PHY_vars_eNB->lte_frame_parms,
-                                                   PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
+                                                   &eNB->frame_parms,
+                                                   eNB->common_vars.txdataF[eNB_id],
                                                    subframe);
 	    
             if (num_pdcch_symbols_2 > num_pdcch_symbols) {
@@ -2518,115 +2518,115 @@ PMI_FEEDBACK:
 
             for (k=0; k<n_users; k++) {
               for (int cw=0; cw<Kmimo; cw++) {
-                coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
-                                                PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->nb_rb,
-                                                PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->rb_alloc,
-                                                get_Qm(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs),
-                                                PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Nl,
+                coded_bits_per_codeword = get_G(&eNB->frame_parms,
+                                                eNB->dlsch[k][cw]->harq_processes[0]->nb_rb,
+                                                eNB->dlsch[k][cw]->harq_processes[0]->rb_alloc,
+                                                get_Qm(eNB->dlsch[k][cw]->harq_processes[0]->mcs),
+                                                eNB->dlsch[k][cw]->harq_processes[0]->Nl,
                                                 num_pdcch_symbols,
                                                 0,subframe);
 
 #ifdef TBS_FIX   // This is for MESH operation!!!
-                tbs = (double)3*TBStable[get_I_TBS(PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->mcs)][PHY_vars_eNB->dlsch_eNB[k][cw]->nb_rb-1]/4;
+                tbs = (double)3*TBStable[get_I_TBS(eNB->dlsch[k][cw]->harq_processes[0]->mcs)][eNB->dlsch[k][cw]->nb_rb-1]/4;
 #else
-                tbs = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->TBS;
+                tbs = eNB->dlsch[k][cw]->harq_processes[0]->TBS;
 #endif
                 rate = (double)tbs/(double)coded_bits_per_codeword;
 
                 if ((SNR==snr0) && (trials==0) && (round==0))
                   printf("User %d, cw %d: Rate = %f (%f bits/dim) (G %d, TBS %d, mod %d, pdcch_sym %d, ndi %d)\n",
-                         k,cw,rate,rate*get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs),
+                         k,cw,rate,rate*get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs),
                          coded_bits_per_codeword,
                          tbs,
-                         get_Qm(PHY_vars_eNB->dlsch_eNB[k][0]->harq_processes[0]->mcs),
+                         get_Qm(eNB->dlsch[k][0]->harq_processes[0]->mcs),
                          num_pdcch_symbols,
-                         PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->round);
+                         eNB->dlsch[0][0]->harq_processes[0]->round);
 
                 // use the PMI from previous trial
                 if (DLSCH_alloc_pdu2_1E[0].tpmi == 5) {
-                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL);
-                  PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&PHY_vars_UE->PHY_measurements,0,PHY_vars_UE->lte_frame_parms.N_RB_DL);
+                  eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,eNB->frame_parms.N_RB_DL);
+                  UE->dlsch[0][0]->harq_processes[0]->pmi_alloc = quantize_subband_pmi(&UE->measurements,0,UE->frame_parms.N_RB_DL);
 
                   if (n_users>1)
-                    PHY_vars_eNB->dlsch_eNB[1][0]->harq_processes[0]->pmi_alloc = (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555);
+                    eNB->dlsch[1][0]->harq_processes[0]->pmi_alloc = (eNB->dlsch[0][0]->harq_processes[0]->pmi_alloc ^ 0x1555);
 
                   /*
                     if ((trials<10) && (round==0)) {
-                    printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[0][0]->pmi_alloc),pmi_feedback);
+                    printf("tx PMI UE0 %x (pmi_feedback %d)\n",pmi2hex_2Ar1(eNB->dlsch[0][0]->pmi_alloc),pmi_feedback);
                     if (transmission_mode ==5)
-                    printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(PHY_vars_eNB->dlsch_eNB[1][0]->pmi_alloc));
+                    printf("tx PMI UE1 %x\n",pmi2hex_2Ar1(eNB->dlsch[1][0]->pmi_alloc));
                     }
                   */
                 }
 
 
-                start_meas(&PHY_vars_eNB->dlsch_encoding_stats);
+                start_meas(&eNB->dlsch_encoding_stats);
 
                 if (dlsch_encoding(((cw==0) ? input_buffer0[k] : input_buffer1[k]),
-                                   &PHY_vars_eNB->lte_frame_parms,
+                                   &eNB->frame_parms,
                                    num_pdcch_symbols,
-                                   PHY_vars_eNB->dlsch_eNB[k][cw],
+                                   eNB->dlsch[k][cw],
                                    0,subframe,
-                                   &PHY_vars_eNB->dlsch_rate_matching_stats,
-                                   &PHY_vars_eNB->dlsch_turbo_encoding_stats,
-                                   &PHY_vars_eNB->dlsch_interleaving_stats
+                                   &eNB->dlsch_rate_matching_stats,
+                                   &eNB->dlsch_turbo_encoding_stats,
+                                   &eNB->dlsch_interleaving_stats
                                   )<0)
                   exit(-1);
 
                 /*
                 if (transmission_mode == 3) {
                 if (dlsch_encoding(input_buffer1[k],
-                   &PHY_vars_eNB->lte_frame_parms,
+                   &eNB->frame_parms,
                    num_pdcch_symbols,
-                   PHY_vars_eNB->dlsch_eNB[k][1],
+                   eNB->dlsch[k][1],
                    0,subframe,
-                   &PHY_vars_eNB->dlsch_rate_matching_stats,
-                   &PHY_vars_eNB->dlsch_turbo_encoding_stats,
-                   &PHY_vars_eNB->dlsch_interleaving_stats
+                   &eNB->dlsch_rate_matching_stats,
+                   &eNB->dlsch_turbo_encoding_stats,
+                   &eNB->dlsch_interleaving_stats
                    )<0)
                 exit(-1);
                 }
                 */
-                stop_meas(&PHY_vars_eNB->dlsch_encoding_stats);
+                stop_meas(&eNB->dlsch_encoding_stats);
 
-                PHY_vars_eNB->dlsch_eNB[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI;
-                start_meas(&PHY_vars_eNB->dlsch_scrambling_stats);
-                dlsch_scrambling(&PHY_vars_eNB->lte_frame_parms,
+                eNB->dlsch[k][cw]->rnti = (common_flag==0) ? n_rnti+k : SI_RNTI;
+                start_meas(&eNB->dlsch_scrambling_stats);
+                dlsch_scrambling(&eNB->frame_parms,
                                  0,
-                                 PHY_vars_eNB->dlsch_eNB[k][cw],
+                                 eNB->dlsch[k][cw],
                                  coded_bits_per_codeword,
                                  0,
                                  subframe<<1);
-                stop_meas(&PHY_vars_eNB->dlsch_scrambling_stats);
+                stop_meas(&eNB->dlsch_scrambling_stats);
 
                 if (n_frames==1) {
-                  for (s=0; s<PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->C; s++) {
-                    if (s<PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Cminus)
-                      Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kminus;
+                  for (s=0; s<eNB->dlsch[k][cw]->harq_processes[0]->C; s++) {
+                    if (s<eNB->dlsch[k][cw]->harq_processes[0]->Cminus)
+                      Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kminus;
                     else
-                      Kr = PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->Kplus;
+                      Kr = eNB->dlsch[k][cw]->harq_processes[0]->Kplus;
 
                     Kr_bytes = Kr>>3;
 
                     for (i=0; i<Kr_bytes; i++)
-                      printf("%d : (%x)\n",i,PHY_vars_eNB->dlsch_eNB[k][cw]->harq_processes[0]->c[s][i]);
+                      printf("%d : (%x)\n",i,eNB->dlsch[k][cw]->harq_processes[0]->c[s][i]);
                   }
                 }
               }
 
-              start_meas(&PHY_vars_eNB->dlsch_modulation_stats);
+              start_meas(&eNB->dlsch_modulation_stats);
      
-              re_allocated = dlsch_modulation(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
+              re_allocated = dlsch_modulation(eNB->common_vars.txdataF[eNB_id],
                                               AMP,
                                               subframe,
-                                              &PHY_vars_eNB->lte_frame_parms,
+                                              &eNB->frame_parms,
                                               num_pdcch_symbols,
-                                              PHY_vars_eNB->dlsch_eNB[k][0],
-                                              (transmission_mode==3)||(transmission_mode==4) ? PHY_vars_eNB->dlsch_eNB[k][1] : NULL);	      
+                                              eNB->dlsch[k][0],
+                                              (transmission_mode==3)||(transmission_mode==4) ? eNB->dlsch[k][1] : NULL);	      
               /* avoid gcc warnings */
               (void)re_allocated;
 
-              stop_meas(&PHY_vars_eNB->dlsch_modulation_stats);
+              stop_meas(&eNB->dlsch_modulation_stats);
               /*
               if (trials==0 && round==0)
               printf("RE count %d\n",re_allocated);
@@ -2634,54 +2634,54 @@ PMI_FEEDBACK:
             } //n_users
 
 
-            generate_pilots(PHY_vars_eNB,
-                            PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
+            generate_pilots(eNB,
+                            eNB->common_vars.txdataF[eNB_id],
                             AMP,
                             LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
 
-            start_meas(&PHY_vars_eNB->ofdm_mod_stats);
+            start_meas(&eNB->ofdm_mod_stats);
 
-            do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
-                          PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id],
+            do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
+                          eNB->common_vars.txdata[eNB_id],
                           (subframe*2),
-                          &PHY_vars_eNB->lte_frame_parms);
+                          &eNB->frame_parms);
 
-            do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
-                          PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id],
+            do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
+                          eNB->common_vars.txdata[eNB_id],
                           (subframe*2)+1,
-                          &PHY_vars_eNB->lte_frame_parms);
+                          &eNB->frame_parms);
 
-            stop_meas(&PHY_vars_eNB->ofdm_mod_stats);
-            stop_meas(&PHY_vars_eNB->phy_proc_tx);
+            stop_meas(&eNB->ofdm_mod_stats);
+            stop_meas(&eNB->phy_proc_tx);
 
-            do_OFDM_mod_l(PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id],
-                          PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id],
+            do_OFDM_mod_l(eNB->common_vars.txdataF[eNB_id],
+                          eNB->common_vars.txdata[eNB_id],
                           (subframe*2)+2,
-                          &PHY_vars_eNB->lte_frame_parms);
+                          &eNB->frame_parms);
 
             if (n_frames==1) {
-              write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],
-                           nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
+              write_output("txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB_id][0][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],
+                           nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
 
-              if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
-                write_output("txsigF1.m","txsF1", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],
-                             nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
+              if (eNB->frame_parms.nb_antennas_tx>1)
+                write_output("txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB_id][1][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],
+                             nsymb*eNB->frame_parms.ofdm_symbol_size,1,1);
             }
             tx_lev = 0;
 
-            for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
-              tx_lev += signal_energy(&PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]
-                                      [subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti],
-                                      PHY_vars_eNB->lte_frame_parms.samples_per_tti);
+            for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
+              tx_lev += signal_energy(&eNB->common_vars.txdata[eNB_id][aa]
+                                      [subframe*eNB->frame_parms.samples_per_tti],
+                                      eNB->frame_parms.samples_per_tti);
             }
 
             tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
 
             if (n_frames==1) {
               printf("tx_lev = %d (%d dB)\n",tx_lev,tx_lev_dB);
-              write_output("txsig0.m","txs0", &PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][0][subframe* PHY_vars_eNB->lte_frame_parms.samples_per_tti],
+              write_output("txsig0.m","txs0", &eNB->common_vars.txdata[eNB_id][0][subframe* eNB->frame_parms.samples_per_tti],
 
-                           PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1);
+                           eNB->frame_parms.samples_per_tti,1,1);
             }
           }
 
@@ -2710,20 +2710,20 @@ PMI_FEEDBACK:
             }
           */
 
-          //    printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,awgn_flag);
+          //    printf("Copying tx ..., nsymb %d (n_tx %d), awgn %d\n",nsymb,eNB->frame_parms.nb_antennas_tx,awgn_flag);
           for (i=0; i<2*frame_parms->samples_per_tti; i++) {
-            for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
+            for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
               if (awgn_flag == 0) {
-                s_re[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]);
-                s_im[aa][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]);
+                s_re[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]);
+                s_im[aa][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
               } else {
-                for (aarx=0; aarx<PHY_vars_UE->lte_frame_parms.nb_antennas_rx; aarx++) {
+                for (aarx=0; aarx<UE->frame_parms.nb_antennas_rx; aarx++) {
                   if (aa==0) {
-                    r_re[aarx][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)]);
-                    r_im[aarx][i] = ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]);
+                    r_re[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]);
+                    r_im[aarx][i] = ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
                   } else {
-                    r_re[aarx][i] += ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)]);
-                    r_im[aarx][i] += ((double)(((short *)PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id][aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) +(i<<1)+1]);
+                    r_re[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)]);
+                    r_im[aarx][i] += ((double)(((short *)eNB->common_vars.txdata[eNB_id][aa]))[(2*subframe*UE->frame_parms.samples_per_tti) +(i<<1)+1]);
                   }
 
                 }
@@ -2744,12 +2744,12 @@ PMI_FEEDBACK:
                 random_channel(eNB2UE[3],0);
               }
 	    
-	    if (PHY_vars_UE->perfect_ce==1) {
+	    if (UE->perfect_ce==1) {
                   // fill in perfect channel estimates
-                  freq_channel(eNB2UE[round],PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1);
+                  freq_channel(eNB2UE[round],UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1);
 		  /*
 		  write_output("channel.m","ch",eNB2UE[round]->ch[0],eNB2UE[round]->channel_length,1,8);
-                  write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1,1,8);
+                  write_output("channelF.m","chF",eNB2UE[round]->chF[0],12*UE->frame_parms.N_RB_DL + 1,1,8);
 		  */
 	    }
 	  }
@@ -2813,24 +2813,24 @@ PMI_FEEDBACK:
 
           //AWGN
           // This is the SNR on the PDSCH for OFDM symbols without pilots -> rho_A
-          sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(NB_RB*12)) - SNR - get_pa_dB(PHY_vars_eNB->pdsch_config_dedicated);
+          sigma2_dB = 10*log10((double)tx_lev) +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)) - SNR - get_pa_dB(eNB->pdsch_config_dedicated);
           sigma2 = pow(10,sigma2_dB/10);
 
           if (n_frames==1)
-            printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(PHY_vars_eNB->pdsch_config_dedicated));
+            printf("Sigma2 %f (sigma2_dB %f,%f,%f )\n",sigma2,sigma2_dB,10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(NB_RB*12)),get_pa_dB(eNB->pdsch_config_dedicated));
 
           for (i=0; i<2*frame_parms->samples_per_tti; i++) {
-            for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
+            for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
               //printf("s_re[0][%d]=> %f , r_re[0][%d]=> %f\n",i,s_re[aa][i],i,r_re[aa][i]);
-              ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i] =
+              ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i] =
                 (short) (r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
-              ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti)+2*i+1] =
+              ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti)+2*i+1] =
                 (short) (r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
             }
           }
 
-          //    lte_sync_time_init(PHY_vars_eNB->lte_frame_parms,lte_ue_common_vars);
-          //    lte_sync_time(lte_ue_common_vars->rxdata, PHY_vars_eNB->lte_frame_parms);
+          //    lte_sync_time_init(eNB->frame_parms,common_vars);
+          //    lte_sync_time(common_vars->rxdata, eNB->frame_parms);
           //    lte_sync_time_free();
 
           /*
@@ -2850,13 +2850,13 @@ PMI_FEEDBACK:
           */
 
           if (n_frames==1) {
-            printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
-            printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&PHY_vars_UE->lte_ue_common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
+            printf("RX level in null symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
+            printf("RX level in data symbol %d\n",dB_fixed(signal_energy(&UE->common_vars.rxdata[0][160+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES)],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
             printf("rx_level Null symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))));
             printf("rx_level data symbol %f\n",10*log10(signal_energy_fp(r_re,r_im,1,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2,256+(2*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES))));
           }
 
-          if (PHY_vars_eNB->lte_frame_parms.Ncp == 0) {  // normal prefix
+          if (eNB->frame_parms.Ncp == 0) {  // normal prefix
             pilot1 = 4;
             pilot2 = 7;
             pilot3 = 11;
@@ -2866,7 +2866,7 @@ PMI_FEEDBACK:
             pilot3 = 9;
           }
 
-          start_meas(&PHY_vars_UE->phy_proc_rx);
+          start_meas(&UE->phy_proc_rx);
 
           // Inner receiver scheduling for 3 slots
           for (Ns=(2*subframe); Ns<((2*subframe)+3); Ns++) {
@@ -2887,24 +2887,24 @@ PMI_FEEDBACK:
 
               */
 
-              start_meas(&PHY_vars_UE->ofdm_demod_stats);
-              slot_fep(PHY_vars_UE,
+              start_meas(&UE->ofdm_demod_stats);
+              slot_fep(UE,
                        l,
                        Ns%20,
                        0,
                        0,
 		       0);
-              stop_meas(&PHY_vars_UE->ofdm_demod_stats);
+              stop_meas(&UE->ofdm_demod_stats);
 
-              if (PHY_vars_UE->perfect_ce==1) {
+              if (UE->perfect_ce==1) {
                 if (awgn_flag==0) {
                   for(k=0; k<NUMBER_OF_eNB_MAX; k++) {
                     for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
                       for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
                         for (i=0; i<frame_parms->N_RB_DL*12; i++) {
-                          ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
+                          ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
                                 eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP);
-                          ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
+                          ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
                                 eNB2UE[round]->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP);
                         }
                       }
@@ -2914,8 +2914,8 @@ PMI_FEEDBACK:
                   for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
                     for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
                       for (i=0; i<frame_parms->N_RB_DL*12; i++) {
-                        ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
-                        ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2;
+                        ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
+                        ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+((l+(Ns%2)*pilot2)*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2;
                       }
                     }
                   }
@@ -2924,31 +2924,31 @@ PMI_FEEDBACK:
 
 
               if ((Ns==((2*subframe))) && (l==0)) {
-                lte_ue_measurements(PHY_vars_UE,
-                                    subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti,
+                lte_ue_measurements(UE,
+                                    subframe*UE->frame_parms.samples_per_tti,
                                     1,
                                     0);
                 /*
                   debug_msg("RX RSSI %d dBm, digital (%d, %d) dB, linear (%d, %d), avg rx power %d dB (%d lin), RX gain %d dB\n",
-                  PHY_vars_UE->PHY_measurements.rx_rssi_dBm[0] - ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx==2) ? 3 : 0),
-                  PHY_vars_UE->PHY_measurements.wideband_cqi_dB[0][0],
-                  PHY_vars_UE->PHY_measurements.wideband_cqi_dB[0][1],
-                  PHY_vars_UE->PHY_measurements.wideband_cqi[0][0],
-                  PHY_vars_UE->PHY_measurements.wideband_cqi[0][1],
-                  PHY_vars_UE->PHY_measurements.rx_power_avg_dB[0],
-                  PHY_vars_UE->PHY_measurements.rx_power_avg[0],
-                  PHY_vars_UE->rx_total_gain_dB);
+                  UE->measurements.rx_rssi_dBm[0] - ((UE->frame_parms.nb_antennas_rx==2) ? 3 : 0),
+                  UE->measurements.wideband_cqi_dB[0][0],
+                  UE->measurements.wideband_cqi_dB[0][1],
+                  UE->measurements.wideband_cqi[0][0],
+                  UE->measurements.wideband_cqi[0][1],
+                  UE->measurements.rx_power_avg_dB[0],
+                  UE->measurements.rx_power_avg[0],
+                  UE->rx_total_gain_dB);
                   debug_msg("N0 %d dBm digital (%d, %d) dB, linear (%d, %d), avg noise power %d dB (%d lin)\n",
-                  PHY_vars_UE->PHY_measurements.n0_power_tot_dBm,
-                  PHY_vars_UE->PHY_measurements.n0_power_dB[0],
-                  PHY_vars_UE->PHY_measurements.n0_power_dB[1],
-                  PHY_vars_UE->PHY_measurements.n0_power[0],
-                  PHY_vars_UE->PHY_measurements.n0_power[1],
-                  PHY_vars_UE->PHY_measurements.n0_power_avg_dB,
-                  PHY_vars_UE->PHY_measurements.n0_power_avg);
+                  UE->measurements.n0_power_tot_dBm,
+                  UE->measurements.n0_power_dB[0],
+                  UE->measurements.n0_power_dB[1],
+                  UE->measurements.n0_power[0],
+                  UE->measurements.n0_power[1],
+                  UE->measurements.n0_power_avg_dB,
+                  UE->measurements.n0_power_avg);
                   debug_msg("Wideband CQI tot %d dB, wideband cqi avg %d dB\n",
-                  PHY_vars_UE->PHY_measurements.wideband_cqi_tot[0],
-                  PHY_vars_UE->PHY_measurements.wideband_cqi_avg[0]);
+                  UE->measurements.wideband_cqi_tot[0],
+                  UE->measurements.wideband_cqi_avg[0]);
                 */
 
                 if (transmission_mode==5 || transmission_mode==6) {
@@ -2965,21 +2965,21 @@ PMI_FEEDBACK:
               if ((Ns==(2*subframe)) && (l==pilot1)) {// process symbols 0,1,2
 
                 if (dci_flag == 1) {
-                  PHY_vars_UE->UE_mode[0] = PUSCH;
-                  start_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats);
-                  rx_pdcch(&PHY_vars_UE->lte_ue_common_vars,
-                           PHY_vars_UE->lte_ue_pdcch_vars,
-                           &PHY_vars_UE->lte_frame_parms,
+                  UE->UE_mode[0] = PUSCH;
+                  start_meas(&UE->dlsch_rx_pdcch_stats);
+                  rx_pdcch(&UE->common_vars,
+                           UE->pdcch_vars,
+                           &UE->frame_parms,
                            subframe,
                            0,
-                           (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
-                           PHY_vars_UE->high_speed_flag,
+                           (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
+                           UE->high_speed_flag,
                            0);
-                  stop_meas(&PHY_vars_UE->dlsch_rx_pdcch_stats);
+                  stop_meas(&UE->dlsch_rx_pdcch_stats);
                   // overwrite number of pdcch symbols
-                  PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
+                  UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
 
-                  dci_cnt = dci_decoding_procedure(PHY_vars_UE,
+                  dci_cnt = dci_decoding_procedure(UE,
                                                    dci_alloc_rx,1,
                                                    eNB_id,
                                                    subframe);
@@ -3005,7 +3005,7 @@ PMI_FEEDBACK:
 
                   for (i=0; i<dci_cnt; i++) {
                     //        printf("Generating dlsch parameters for RNTI %x\n",dci_alloc_rx[i].rnti);
-                    if (round == 0) PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->first_tx=1;
+                    if (round == 0) UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->first_tx=1;
 
                     if ((dci_alloc_rx[i].rnti == n_rnti) &&
                         (generate_ue_dlsch_params_from_dci(0,
@@ -3013,26 +3013,26 @@ PMI_FEEDBACK:
                                                            dci_alloc_rx[i].dci_pdu,
                                                            dci_alloc_rx[i].rnti,
                                                            dci_alloc_rx[i].format,
-                                                           PHY_vars_UE->dlsch_ue[0],
-                                                           &PHY_vars_UE->lte_frame_parms,
-                                                           PHY_vars_UE->pdsch_config_dedicated,
+                                                           UE->dlsch[0],
+                                                           &UE->frame_parms,
+                                                           UE->pdsch_config_dedicated,
                                                            SI_RNTI,
                                                            0,
                                                            P_RNTI)==0)) {
-                      //dump_dci(&PHY_vars_UE->lte_frame_parms,&dci_alloc_rx[i]);
-                      coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
-                                                      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->nb_rb,
-                                                      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->rb_alloc_even,
-                                                      get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs),
-                                                      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->Nl,
-                                                      PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,
+                      //dump_dci(&UE->frame_parms,&dci_alloc_rx[i]);
+                      coded_bits_per_codeword = get_G(&eNB->frame_parms,
+                                                      UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->nb_rb,
+                                                      UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->rb_alloc_even,
+                                                      get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs),
+                                                      UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->Nl,
+                                                      UE->pdcch_vars[0]->num_pdcch_symbols,
                                                       0,subframe);
                       /*
-                      rate = (double)dlsch_tbs25[get_I_TBS(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs)][PHY_vars_UE->dlsch_ue[0][0]->nb_rb-1]/(coded_bits_per_codeword);
-                      rate*=get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs);
+                      rate = (double)dlsch_tbs25[get_I_TBS(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs)][UE->dlsch[0][0]->nb_rb-1]/(coded_bits_per_codeword);
+                      rate*=get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs);
                       */
-                      printf("num_pdcch_symbols %d, G %d, TBS %d\n",PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,
-                             PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->TBS);
+                      printf("num_pdcch_symbols %d, G %d, TBS %d\n",UE->pdcch_vars[0]->num_pdcch_symbols,coded_bits_per_codeword,
+                             UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->TBS);
 
                       dlsch_active = 1;
                     } else {
@@ -3057,10 +3057,10 @@ PMI_FEEDBACK:
                 }  // if dci_flag==1
                 else { //dci_flag == 0
 
-                  PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti;
-                  PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
+                  UE->pdcch_vars[0]->crnti = n_rnti;
+                  UE->pdcch_vars[0]->num_pdcch_symbols = num_pdcch_symbols;
 
-                  if (round == 0) PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx=1;
+                  if (round == 0) UE->dlsch[0][0]->harq_processes[0]->first_tx=1;
 
                   switch (transmission_mode) {
                   case 1:
@@ -3070,28 +3070,28 @@ PMI_FEEDBACK:
                                                       &DLSCH_alloc_pdu_1[0],
                                                       (common_flag==0)? C_RNTI : SI_RNTI,
                                                       (common_flag==0)? format1 : format1A,
-                                                      PHY_vars_UE->dlsch_ue[0],
-                                                      &PHY_vars_UE->lte_frame_parms,
-                                                      PHY_vars_UE->pdsch_config_dedicated,
+                                                      UE->dlsch[0],
+                                                      &UE->frame_parms,
+                                                      UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
                                                       P_RNTI);
                     break;
 
                   case 3:
-                    //        printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx);
+                    //        printf("Rate: TM3 (before) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx);
                     generate_ue_dlsch_params_from_dci(0,
 						      subframe,
                                                       &DLSCH_alloc_pdu_1[0],
                                                       (common_flag==0)? C_RNTI : SI_RNTI,
                                                       (common_flag==0)? format2A : format1A,
-                                                      PHY_vars_UE->dlsch_ue[0],
-                                                      &PHY_vars_UE->lte_frame_parms,
-                                                      PHY_vars_UE->pdsch_config_dedicated,
+                                                      UE->dlsch[0],
+                                                      &UE->frame_parms,
+                                                      UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
                                                       P_RNTI);
-                    //        printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->first_tx);
+                    //        printf("Rate: TM3 (after) round %d (%d) first_tx %d\n",round,UE->dlsch[0][0]->harq_processes[0]->round,UE->dlsch[0][0]->harq_processes[0]->first_tx);
                     break;
 
                   case 4:
@@ -3100,9 +3100,9 @@ PMI_FEEDBACK:
                                                       &DLSCH_alloc_pdu_1[0],
                                                       (common_flag==0)? C_RNTI : SI_RNTI,
                                                       (common_flag==0)? format2 : format1A,
-                                                      PHY_vars_UE->dlsch_ue[0],
-                                                      &PHY_vars_UE->lte_frame_parms,
-                                                      PHY_vars_UE->pdsch_config_dedicated,
+                                                      UE->dlsch[0],
+                                                      &UE->frame_parms,
+                                                      UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
                                                       P_RNTI);
@@ -3115,9 +3115,9 @@ PMI_FEEDBACK:
                                                       &DLSCH_alloc_pdu2_1E[0],
                                                       C_RNTI,
                                                       format1E_2A_M10PRB,
-                                                      PHY_vars_UE->dlsch_ue[0],
-                                                      &PHY_vars_UE->lte_frame_parms,
-                                                      PHY_vars_UE->pdsch_config_dedicated,
+                                                      UE->dlsch[0],
+                                                      &UE->frame_parms,
+                                                      UE->pdsch_config_dedicated,
                                                       SI_RNTI,
                                                       0,
                                                       P_RNTI);
@@ -3133,45 +3133,45 @@ PMI_FEEDBACK:
                 if ((Ns==(1+(2*subframe))) && (l==0)) {// process PDSCH symbols 1,2,3,4,5,(6 Normal Prefix)
 
                   if ((transmission_mode == 5) &&
-                      (PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->dl_power_off==0) &&
-                      (openair_daq_vars.use_ia_receiver ==1)) {
+                      (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->dl_power_off==0) &&
+                      (UE->use_ia_receiver ==1)) {
                     dual_stream_UE = 1;
                   } else {
                     dual_stream_UE = 0;
                   }
 
 
-                  start_meas(&PHY_vars_UE->dlsch_llr_stats);
+                  start_meas(&UE->dlsch_llr_stats);
 
-                  for (m=PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols;
+                  for (m=UE->pdcch_vars[0]->num_pdcch_symbols;
                        m<pilot2;
                        m++) {
-                    if (rx_pdsch(PHY_vars_UE,
+                    if (rx_pdsch(UE,
                                  PDSCH,
                                  eNB_id,
                                  eNB_id_i,
                                  subframe,
                                  m,
-                                 (m==PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols)?1:0,
+                                 (m==UE->pdcch_vars[0]->num_pdcch_symbols)?1:0,
                                  dual_stream_UE,
                                  i_mod,
-                                 PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid)==-1) {
+                                 UE->dlsch[0][0]->current_harq_pid)==-1) {
                       dlsch_active = 0;
                       break;
                     }
                   }
 
-                  stop_meas(&PHY_vars_UE->dlsch_llr_stats);
+                  stop_meas(&UE->dlsch_llr_stats);
                 }
 
                 if ((Ns==(1+(2*subframe))) && (l==pilot1)) {
                   // process symbols (6 Extended Prefix),7,8,9
-                  start_meas(&PHY_vars_UE->dlsch_llr_stats);
+                  start_meas(&UE->dlsch_llr_stats);
 
                   for (m=pilot2;
                        m<pilot3;
                        m++) {
-                    if (rx_pdsch(PHY_vars_UE,
+                    if (rx_pdsch(UE,
                                  PDSCH,
                                  eNB_id,
                                  eNB_id_i,
@@ -3180,22 +3180,22 @@ PMI_FEEDBACK:
                                  0,
                                  dual_stream_UE,
                                  i_mod,
-                                 PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid)==-1) {
+                                 UE->dlsch[0][0]->current_harq_pid)==-1) {
                       dlsch_active=0;
                       break;
                     }
                   }
 
-                  stop_meas(&PHY_vars_UE->dlsch_llr_stats);
+                  stop_meas(&UE->dlsch_llr_stats);
                 }
 
                 if ((Ns==(2+(2*subframe))) && (l==0)) { // process symbols 10,11,(12,13 Normal Prefix) do deinterleaving for TTI
-                  start_meas(&PHY_vars_UE->dlsch_llr_stats);
+                  start_meas(&UE->dlsch_llr_stats);
 
                   for (m=pilot3;
-                       m<PHY_vars_UE->lte_frame_parms.symbols_per_tti;
+                       m<UE->frame_parms.symbols_per_tti;
                        m++) {
-                    if (rx_pdsch(PHY_vars_UE,
+                    if (rx_pdsch(UE,
                                  PDSCH,
                                  eNB_id,
                                  eNB_id_i,
@@ -3204,61 +3204,61 @@ PMI_FEEDBACK:
                                  0,
                                  dual_stream_UE,
                                  i_mod,
-                                 PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid)==-1) {
+                                 UE->dlsch[0][0]->current_harq_pid)==-1) {
                       dlsch_active=0;
                       break;
                     }
                   }
 
-                  stop_meas(&PHY_vars_UE->dlsch_llr_stats);
+                  stop_meas(&UE->dlsch_llr_stats);
                 }
 
                 if (test_perf ==0 ) {
                   if ((n_frames==1) && (Ns==(2+(2*subframe))) && (l==0))  {
                     write_output("ch0.m","ch0",eNB2UE[0]->ch[0],eNB2UE[0]->channel_length,1,8);
 
-                    if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
-                      write_output("ch1.m","ch1",eNB2UE[0]->ch[PHY_vars_eNB->lte_frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8);
+                    if (eNB->frame_parms.nb_antennas_tx>1)
+                      write_output("ch1.m","ch1",eNB2UE[0]->ch[eNB->frame_parms.nb_antennas_rx],eNB2UE[0]->channel_length,1,8);
 
                     //common vars
-                    write_output("rxsig0.m","rxs0", &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1);
-                    write_output("rxsigF0.m","rxsF0", &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
+                    write_output("rxsig0.m","rxs0", &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1);
+                    write_output("rxsigF0.m","rxsF0", &UE->common_vars.rxdataF[0][0],UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
 
-                    if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) {
-                      write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1);
-                      write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
+                    if (UE->frame_parms.nb_antennas_rx>1) {
+                      write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1);
+                      write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
                     }
 
                     write_output("dlsch00_r0.m","dl00_r0",
-                                 &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]),
-                                 PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
+                                 &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]),
+                                 UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
 
-                    if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1)
+                    if (UE->frame_parms.nb_antennas_rx>1)
                       write_output("dlsch01_r0.m","dl01_r0",
-                                   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]),
-                                   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
+                                   &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]),
+                                   UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
 
-                    if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)
+                    if (eNB->frame_parms.nb_antennas_tx>1)
                       write_output("dlsch10_r0.m","dl10_r0",
-                                   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]),
-                                   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
+                                   &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]),
+                                   UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
 
-                    if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1))
+                    if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1))
                       write_output("dlsch11_r0.m","dl11_r0",
-                                   &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]),
-                                   PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
+                                   &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]),
+                                   UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1);
 
                     //pdsch_vars
-                    dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round);
-                    //dump_dlsch2(PHY_vars_UE,eNB_id_i,coded_bits_per_codeword);
-                    write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
+                    dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round);
+                    //dump_dlsch2(UE,eNB_id_i,coded_bits_per_codeword);
+                    write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
 
                     //pdcch_vars
-                    write_output("pdcchF0_ext.m","pdcchF_ext", PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,1,1);
-                    write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
+                    write_output("pdcchF0_ext.m","pdcchF_ext", UE->pdcch_vars[eNB_id]->rxdataF_ext[0],2*3*UE->frame_parms.ofdm_symbol_size,1,1);
+                    write_output("pdcch00_ch0_ext.m","pdcch00_ch0_ext",UE->pdcch_vars[eNB_id]->dl_ch_estimates_ext[0],300*3,1,1);
 
-                    write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
-                    write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4);
+                    write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",UE->pdcch_vars[eNB_id]->rxdataF_comp[0],4*300,1,1);
+                    write_output("pdcch_rxF_llr.m","pdcch_llr",UE->pdcch_vars[eNB_id]->llr,2400,1,4);
 
                   }
                 }
@@ -3271,30 +3271,30 @@ PMI_FEEDBACK:
           if(abstx) {
             if (trials==0 && round==0 && transmission_mode>=5) {
               for (iii=0; iii<NB_RB; iii++) {
-                //fprintf(csv_fd, "%d, %d", (PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii]));
-                fprintf(csv_fd,"%x,%x,",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]));
-                printf("%x ",(PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]));
+                //fprintf(csv_fd, "%d, %d", (UE->lte_ue_pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->lte_ue_pdsch_vars[eNB_id_i]->pmi_ext[iii]));
+                fprintf(csv_fd,"%x,%x,",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]),(UE->pdsch_vars[eNB_id]->pmi_ext[iii]));
+                printf("%x ",(UE->pdsch_vars[eNB_id]->pmi_ext[iii]));
               }
             }
           }
 
           for (int cw=Kmimo-1; cw>=0; cw--) {
-            PHY_vars_UE->dlsch_ue[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
-            coded_bits_per_codeword = get_G(&PHY_vars_eNB->lte_frame_parms,
-                                            PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->nb_rb,
-                                            PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->rb_alloc,
-                                            get_Qm(PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->mcs),
-                                            PHY_vars_eNB->dlsch_eNB[0][cw]->harq_processes[0]->Nl,
+            UE->dlsch[0][cw]->rnti = (common_flag==0) ? n_rnti: SI_RNTI;
+            coded_bits_per_codeword = get_G(&eNB->frame_parms,
+                                            eNB->dlsch[0][cw]->harq_processes[0]->nb_rb,
+                                            eNB->dlsch[0][cw]->harq_processes[0]->rb_alloc,
+                                            get_Qm(eNB->dlsch[0][cw]->harq_processes[0]->mcs),
+                                            eNB->dlsch[0][cw]->harq_processes[0]->Nl,
                                             num_pdcch_symbols,
                                             0,subframe);
 
-            PHY_vars_UE->dlsch_ue[0][cw]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid]->G = coded_bits_per_codeword;
+            UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid]->G = coded_bits_per_codeword;
 
 
             // calculate uncoded BLER
             uncoded_ber=0;
             for (i=0;i<coded_bits_per_codeword;i++)
-              if (PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e[i] != (PHY_vars_UE->lte_ue_pdsch_vars[0]->llr[0][i]<0)) {
+              if (eNB->dlsch[0][0]->harq_processes[0]->e[i] != (UE->pdsch_vars[0]->llr[0][i]<0)) {
                 uncoded_ber_bit[i] = 1;
                 uncoded_ber++;
               }
@@ -3308,29 +3308,29 @@ PMI_FEEDBACK:
               write_output("uncoded_ber_bit.m","uncoded_ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
             
 
-            start_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
-            dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,
+            start_meas(&UE->dlsch_unscrambling_stats);
+            dlsch_unscrambling(&UE->frame_parms,
                                0,
-                               PHY_vars_UE->dlsch_ue[0][cw],
+                               UE->dlsch[0][cw],
                                coded_bits_per_codeword,
-                               PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw],
+                               UE->pdsch_vars[eNB_id]->llr[cw],
                                0,
                                subframe<<1);
-            stop_meas(&PHY_vars_UE->dlsch_unscrambling_stats);
-
-            start_meas(&PHY_vars_UE->dlsch_decoding_stats);
-            ret = dlsch_decoding(PHY_vars_UE,
-                                 PHY_vars_UE->lte_ue_pdsch_vars[eNB_id]->llr[cw],
-                                 &PHY_vars_UE->lte_frame_parms,
-                                 PHY_vars_UE->dlsch_ue[0][cw],
-                                 PHY_vars_UE->dlsch_ue[0][cw]->harq_processes[PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid],
+            stop_meas(&UE->dlsch_unscrambling_stats);
+
+            start_meas(&UE->dlsch_decoding_stats);
+            ret = dlsch_decoding(UE,
+                                 UE->pdsch_vars[eNB_id]->llr[cw],
+                                 &UE->frame_parms,
+                                 UE->dlsch[0][cw],
+                                 UE->dlsch[0][cw]->harq_processes[UE->dlsch[0][cw]->current_harq_pid],
                                  subframe,
-                                 PHY_vars_UE->dlsch_ue[0][cw]->current_harq_pid,
+                                 UE->dlsch[0][cw]->current_harq_pid,
                                  1,llr8_flag);
-            stop_meas(&PHY_vars_UE->dlsch_decoding_stats);
+            stop_meas(&UE->dlsch_decoding_stats);
 
             if (cw==1) {
-              if (ret <= PHY_vars_UE->dlsch_ue[0][cw]->max_turbo_iterations) {
+              if (ret <= UE->dlsch[0][cw]->max_turbo_iterations) {
               } else {
                 errs2[round]++;
               }
@@ -3338,10 +3338,10 @@ PMI_FEEDBACK:
           }
 
 
-          stop_meas(&PHY_vars_UE->phy_proc_rx);
+          stop_meas(&UE->phy_proc_rx);
 
 
-          if (ret <= PHY_vars_UE->dlsch_ue[0][0]->max_turbo_iterations) {
+          if (ret <= UE->dlsch[0][0]->max_turbo_iterations) {
 
             avg_iter += ret;
             iter_trials++;
@@ -3349,15 +3349,15 @@ PMI_FEEDBACK:
             if (n_frames==1)
               printf("No DLSCH errors found (round %d),uncoded ber %f\n",round,uncoded_ber);
 
-            PHY_vars_UE->total_TBS[eNB_id] =  PHY_vars_UE->total_TBS[eNB_id] + PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[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;
             TB0_active = 0;
 
-            if (PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) {   //try to decode second stream using SIC
+            if (UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->mimo_mode == LARGE_CDD) {   //try to decode second stream using SIC
               /*
-              for (round = 0 ; round < PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->round ; round++) {
+              for (round = 0 ; round < UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->round ; round++) {
               // re-encoding of first stream
-              dlsch0_ue_harq = PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
-              dlsch0_eNB_harq = PHY_vars_UE->dlsch_eNB[eNB_id]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid];
+              dlsch0_ue_harq = UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
+              dlsch0_eNB_harq = UE->dlsch[eNB_id]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid];
               dlsch0_eNB_harq->mimo_mode    = LARGE_CDD;
               dlsch0_eNB_harq->rb_alloc[0]  = dlsch0_ue_harq->rb_alloc_even[0];
               dlsch0_eNB_harq->nb_rb        = dlsch0_ue_harq->nb_rb;
@@ -3369,17 +3369,17 @@ PMI_FEEDBACK:
               dlsch0_eNB_harq->dl_power_off = dlsch0_ue_harq->dl_power_off;
               dlsch0_eNB_harq->status       = dlsch0_ue_harq->status;
 
-              PHY_vars_UE->dlsch_eNB[eNB_id]->active       = PHY_vars_UE->dlsch_ue[eNB_id][0]->active;
-              PHY_vars_UE->dlsch_eNB[eNB_id]->rnti         = PHY_vars_UE->dlsch_ue[eNB_id][0]->rnti;
+              UE->dlsch[eNB_id]->active       = UE->dlsch[eNB_id][0]->active;
+              UE->dlsch[eNB_id]->rnti         = UE->dlsch[eNB_id][0]->rnti;
 
-              dlsch_encoding(PHY_vars_UE->dlsch_ue[eNB_id][0]->harq_processes[PHY_vars_UE->dlsch_ue[eNB_id][0]->current_harq_pid]->b,
-                   &PHY_vars_UE->lte_frame_parms,
+              dlsch_encoding(UE->dlsch[eNB_id][0]->harq_processes[UE->dlsch[eNB_id][0]->current_harq_pid]->b,
+                   &UE->frame_parms,
                    num_pdcch_symbols,
-                   PHY_vars_UE->dlsch_eNB[0],
+                   UE->dlsch[0],
                    0,subframe,
-                   &PHY_vars_UE->dlsch_rate_matching_stats,
-                   &PHY_vars_UE->dlsch_turbo_encoding_stats,
-                   &PHY_vars_UE->dlsch_interleaving_stats
+                   &UE->dlsch_rate_matching_stats,
+                   &UE->dlsch_turbo_encoding_stats,
+                   &UE->dlsch_interleaving_stats
                    );
 
                    //scrambling
@@ -3402,73 +3402,73 @@ PMI_FEEDBACK:
               //if ((n_frames==1) || (SNR>=30)) {
               printf("DLSCH errors found (round %d), uncoded ber %f\n",round,uncoded_ber);
 
-              for (s=0; s<PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->C; s++) {
-                if (s<PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Cminus)
-                  Kr = PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kminus;
+              for (s=0; s<UE->dlsch[0][0]->harq_processes[0]->C; s++) {
+                if (s<UE->dlsch[0][0]->harq_processes[0]->Cminus)
+                  Kr = UE->dlsch[0][0]->harq_processes[0]->Kminus;
                 else
-                  Kr = PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kplus;
+                  Kr = UE->dlsch[0][0]->harq_processes[0]->Kplus;
 
                 Kr_bytes = Kr>>3;
 
                 printf("Decoded_output (Segment %d):\n",s);
 
                 for (i=0; i<Kr_bytes; i++)
-                  printf("%d : %x (%x)\n",i,PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->c[s][i],PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->c[s][i]^PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->c[s][i]);
+                  printf("%d : %x (%x)\n",i,UE->dlsch[0][0]->harq_processes[0]->c[s][i],UE->dlsch[0][0]->harq_processes[0]->c[s][i]^eNB->dlsch[0][0]->harq_processes[0]->c[s][i]);
               }
 
               sprintf(fname,"rxsig0_r%d.m",round);
               sprintf(vname,"rxs0_r%d",round);
-              write_output(fname,vname, &PHY_vars_UE->lte_ue_common_vars.rxdata[0][0],10*PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1);
+              write_output(fname,vname, &UE->common_vars.rxdata[0][0],10*UE->frame_parms.samples_per_tti,1,1);
               sprintf(fname,"rxsigF0_r%d.m",round);
               sprintf(vname,"rxs0F_r%d",round);
-              write_output(fname,vname, &PHY_vars_UE->lte_ue_common_vars.rxdataF[0][0],2*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,2,1);
+              write_output(fname,vname, &UE->common_vars.rxdataF[0][0],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1);
 	     
-              if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) {
+              if (UE->frame_parms.nb_antennas_rx>1) {
                 sprintf(fname,"rxsig1_r%d.m",round);
                 sprintf(vname,"rxs1_r%d.m",round);
-                write_output(fname,vname, PHY_vars_UE->lte_ue_common_vars.rxdata[1],PHY_vars_UE->lte_frame_parms.samples_per_tti,1,1);
+                write_output(fname,vname, UE->common_vars.rxdata[1],UE->frame_parms.samples_per_tti,1,1);
                 sprintf(fname,"rxsig1F_r%d.m",round);
                 sprintf(vname,"rxs1F_r%d.m",round);
-                write_output(fname,vname, PHY_vars_UE->lte_ue_common_vars.rxdataF[1],2*PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,2,1);
+                write_output(fname,vname, UE->common_vars.rxdataF[1],2*UE->frame_parms.ofdm_symbol_size*nsymb,2,1);
               }
 
               sprintf(fname,"dlsch00_r%d.m",round);
               sprintf(vname,"dl00_r%d",round);
               write_output(fname,vname,
-                           &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][0][0]),
-                           PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb,1,1);
+                           &(UE->common_vars.dl_ch_estimates[eNB_id][0][0]),
+                           UE->frame_parms.ofdm_symbol_size*nsymb,1,1);
 
-              if (PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) {
+              if (UE->frame_parms.nb_antennas_rx>1) {
                 sprintf(fname,"dlsch01_r%d.m",round);
                 sprintf(vname,"dl01_r%d",round);
                 write_output(fname,vname,
-                             &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][1][0]),
-                             PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
+                             &(UE->common_vars.dl_ch_estimates[eNB_id][1][0]),
+                             UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1);
               }
 
-              if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) {
+              if (eNB->frame_parms.nb_antennas_tx>1) {
                 sprintf(fname,"dlsch10_r%d.m",round);
                 sprintf(vname,"dl10_r%d",round);
                 write_output(fname,vname,
-                             &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][2][0]),
-                             PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
+                             &(UE->common_vars.dl_ch_estimates[eNB_id][2][0]),
+                             UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1);
               }
 
-              if ((PHY_vars_UE->lte_frame_parms.nb_antennas_rx>1) && (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1)) {
+              if ((UE->frame_parms.nb_antennas_rx>1) && (eNB->frame_parms.nb_antennas_tx>1)) {
                 sprintf(fname,"dlsch11_r%d.m",round);
                 sprintf(vname,"dl11_r%d",round);
                 write_output(fname,vname,
-                             &(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[eNB_id][3][0]),
-                             PHY_vars_UE->lte_frame_parms.ofdm_symbol_size*nsymb/2,1,1);
+                             &(UE->common_vars.dl_ch_estimates[eNB_id][3][0]),
+                             UE->frame_parms.ofdm_symbol_size*nsymb/2,1,1);
               }
 
               //pdsch_vars
-              dump_dlsch2(PHY_vars_UE,eNB_id,coded_bits_per_codeword,round);
+              dump_dlsch2(UE,eNB_id,coded_bits_per_codeword,round);
               /*
-              write_output("dlsch_e.m","e",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
+              write_output("dlsch_e.m","e",eNB->dlsch[0][0]->harq_processes[0]->e,coded_bits_per_codeword,1,4);
               write_output("dlsch_ber_bit.m","ber_bit",uncoded_ber_bit,coded_bits_per_codeword,1,0);
-              write_output("dlsch_eNB_w.m","w",PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
-              write_output("dlsch_UE_w.m","w",PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
+              write_output("dlsch_w.m","w",eNB->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,4);
+              write_output("dlsch_w.m","w",UE->dlsch[0][0]->harq_processes[0]->w[0],3*(tbs+64),1,0);
               */
 
               if (round == 3) exit(-1);
@@ -3477,12 +3477,12 @@ PMI_FEEDBACK:
             //      printf("round %d errors %d/%d\n",round,errs[round],trials);
 
             round++;
-            //      PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->round++;
+            //      UE->dlsch[0][0]->harq_processes[0]->round++;
           }
 
 	  if (xforms==1) {
 	    phy_scope_UE(form_ue,
-			 PHY_vars_UE,
+			 UE,
 			 eNB_id,
 			 0,// UE_id
 			 subframe);
@@ -3498,29 +3498,29 @@ PMI_FEEDBACK:
         //len = chbch_stats_read(stats_buffer,NULL,0,4096);
         //printf("%s\n\n",stats_buffer);
 
-        if (PHY_vars_UE->frame_rx % 10 == 0) {
-          PHY_vars_UE->bitrate[eNB_id] = (PHY_vars_UE->total_TBS[eNB_id] - PHY_vars_UE->total_TBS_last[eNB_id])*10;
-          LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",PHY_vars_UE->Mod_id,PHY_vars_UE->total_TBS[eNB_id],PHY_vars_UE->total_TBS_last[eNB_id],
-                PHY_vars_UE->bitrate[eNB_id]/1000);
-          PHY_vars_UE->total_TBS_last[eNB_id] = PHY_vars_UE->total_TBS[eNB_id];
+        if (UE->frame_rx % 10 == 0) {
+          UE->bitrate[eNB_id] = (UE->total_TBS[eNB_id] - UE->total_TBS_last[eNB_id])*10;
+          LOG_D(PHY,"[UE %d] Calculating bitrate: total_TBS = %d, total_TBS_last = %d, bitrate = %d kbits/s\n",UE->Mod_id,UE->total_TBS[eNB_id],UE->total_TBS_last[eNB_id],
+                UE->bitrate[eNB_id]/1000);
+          UE->total_TBS_last[eNB_id] = UE->total_TBS[eNB_id];
         }
 
 
-        PHY_vars_UE->frame_rx++;
+        UE->frame_rx++;
 
         /* calculate the total processing time for each packet,
          * get the max, min, and number of packets that exceed t>2000us
          */
-        double t_tx = (double)PHY_vars_eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
-        double t_tx_ifft = (double)PHY_vars_eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_tx_mod = (double)PHY_vars_eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_tx_enc = (double)PHY_vars_eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_tx = (double)eNB->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
+        double t_tx_ifft = (double)eNB->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_tx_mod = (double)eNB->dlsch_modulation_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_tx_enc = (double)eNB->dlsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
 
 
-        double t_rx = (double)PHY_vars_UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0;
-        double t_rx_fft = (double)PHY_vars_UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_rx_demod = (double)PHY_vars_UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_rx_dec = (double)PHY_vars_UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_rx = (double)UE->phy_proc_rx.p_time/cpu_freq_GHz/1000.0;
+        double t_rx_fft = (double)UE->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_rx_demod = (double)UE->dlsch_rx_pdcch_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_rx_dec = (double)UE->dlsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
 
         if (t_tx > t_tx_max)
           t_tx_max = t_tx;
@@ -3644,7 +3644,7 @@ PMI_FEEDBACK:
 
       printf("\n**********************SNR = %f dB (tx_lev %f, sigma2_dB %f)**************************\n",
              SNR,
-             (double)tx_lev_dB+10*log10(PHY_vars_UE->lte_frame_parms.ofdm_symbol_size/(NB_RB*12)),
+             (double)tx_lev_dB+10*log10(UE->frame_parms.ofdm_symbol_size/(NB_RB*12)),
              sigma2_dB);
 
       printf("Errors (%d(%d)/%d %d/%d %d/%d %d/%d), Pe = (%e,%e,%e,%e), dci_errors %d/%d, Pe = %e => effective rate %f  (%2.1f%%,%f, %f), normalized delay %f (%f)\n",
@@ -3667,119 +3667,119 @@ PMI_FEEDBACK:
              rate*effective_rate,
              100*effective_rate,
              rate,
-             rate*get_Qm(PHY_vars_UE->dlsch_ue[0][0]->harq_processes[PHY_vars_UE->dlsch_ue[0][0]->current_harq_pid]->mcs),
+             rate*get_Qm(UE->dlsch[0][0]->harq_processes[UE->dlsch[0][0]->current_harq_pid]->mcs),
              (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/
-             (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+             (double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
              (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
 
       if (print_perf==1) {
         printf("eNB TX function statistics (per 1ms subframe)\n\n");
-        std_phy_proc_tx = sqrt((double)PHY_vars_eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                               2)/PHY_vars_eNB->phy_proc_tx.trials - pow((double)PHY_vars_eNB->phy_proc_tx.diff/PHY_vars_eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2));
-        printf("Total PHY proc tx                 :%f us (%d trials)\n",(double)PHY_vars_eNB->phy_proc_tx.diff/PHY_vars_eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->phy_proc_tx.trials);
+        std_phy_proc_tx = sqrt((double)eNB->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                               2)/eNB->phy_proc_tx.trials - pow((double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000,2));
+        printf("Total PHY proc tx                 :%f us (%d trials)\n",(double)eNB->phy_proc_tx.diff/eNB->phy_proc_tx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_tx.trials);
         printf("|__ Statistcs                           std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3,
                n_tx_dropped);
-        std_phy_proc_tx_ifft = sqrt((double)PHY_vars_eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                    2)/PHY_vars_eNB->ofdm_mod_stats.trials - pow((double)PHY_vars_eNB->ofdm_mod_stats.diff/PHY_vars_eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2));
-        printf("OFDM_mod time                     :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_mod_stats.diff/PHY_vars_eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ofdm_mod_stats.trials);
+        std_phy_proc_tx_ifft = sqrt((double)eNB->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                    2)/eNB->ofdm_mod_stats.trials - pow((double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2));
+        printf("OFDM_mod time                     :%f us (%d trials)\n",(double)eNB->ofdm_mod_stats.diff/eNB->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,eNB->ofdm_mod_stats.trials);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3);
-        std_phy_proc_tx_mod = sqrt((double)PHY_vars_eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_eNB->dlsch_modulation_stats.trials - pow((double)PHY_vars_eNB->dlsch_modulation_stats.diff/PHY_vars_eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2));
-        printf("DLSCH modulation time             :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_modulation_stats.diff/PHY_vars_eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_eNB->dlsch_modulation_stats.trials);
+        std_phy_proc_tx_mod = sqrt((double)eNB->dlsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/eNB->dlsch_modulation_stats.trials - pow((double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000,2));
+        printf("DLSCH modulation time             :%f us (%d trials)\n",(double)eNB->dlsch_modulation_stats.diff/eNB->dlsch_modulation_stats.trials/cpu_freq_GHz/1000.0,
+               eNB->dlsch_modulation_stats.trials);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3);
-        printf("DLSCH scrambling time             :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_scrambling_stats.diff/PHY_vars_eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_eNB->dlsch_scrambling_stats.trials);
-        std_phy_proc_tx_enc = sqrt((double)PHY_vars_eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_eNB->dlsch_encoding_stats.trials - pow((double)PHY_vars_eNB->dlsch_encoding_stats.diff/PHY_vars_eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2));
-        printf("DLSCH encoding time               :%f us (%d trials)\n",(double)PHY_vars_eNB->dlsch_encoding_stats.diff/PHY_vars_eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_eNB->dlsch_modulation_stats.trials);
+        printf("DLSCH scrambling time             :%f us (%d trials)\n",(double)eNB->dlsch_scrambling_stats.diff/eNB->dlsch_scrambling_stats.trials/cpu_freq_GHz/1000.0,
+               eNB->dlsch_scrambling_stats.trials);
+        std_phy_proc_tx_enc = sqrt((double)eNB->dlsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/eNB->dlsch_encoding_stats.trials - pow((double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000,2));
+        printf("DLSCH encoding time               :%f us (%d trials)\n",(double)eNB->dlsch_encoding_stats.diff/eNB->dlsch_encoding_stats.trials/cpu_freq_GHz/1000.0,
+               eNB->dlsch_modulation_stats.trials);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3);
         printf("|__ DLSCH turbo encoding time         :%f us (%d trials)\n",
-               ((double)PHY_vars_eNB->dlsch_turbo_encoding_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double)
-               PHY_vars_eNB->dlsch_turbo_encoding_stats.diff/PHY_vars_eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_turbo_encoding_stats.trials);
+               ((double)eNB->dlsch_turbo_encoding_stats.trials/eNB->dlsch_encoding_stats.trials)*(double)
+               eNB->dlsch_turbo_encoding_stats.diff/eNB->dlsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_turbo_encoding_stats.trials);
         printf("|__ DLSCH rate-matching time          :%f us (%d trials)\n",
-               ((double)PHY_vars_eNB->dlsch_rate_matching_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double)
-               PHY_vars_eNB->dlsch_rate_matching_stats.diff/PHY_vars_eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_rate_matching_stats.trials);
+               ((double)eNB->dlsch_rate_matching_stats.trials/eNB->dlsch_encoding_stats.trials)*(double)
+               eNB->dlsch_rate_matching_stats.diff/eNB->dlsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_rate_matching_stats.trials);
         printf("|__ DLSCH sub-block interleaving time :%f us (%d trials)\n",
-               ((double)PHY_vars_eNB->dlsch_interleaving_stats.trials/PHY_vars_eNB->dlsch_encoding_stats.trials)*(double)
-               PHY_vars_eNB->dlsch_interleaving_stats.diff/PHY_vars_eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->dlsch_interleaving_stats.trials);
+               ((double)eNB->dlsch_interleaving_stats.trials/eNB->dlsch_encoding_stats.trials)*(double)
+               eNB->dlsch_interleaving_stats.diff/eNB->dlsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->dlsch_interleaving_stats.trials);
 
         printf("\n\nUE RX function statistics (per 1ms subframe)\n\n");
-        std_phy_proc_rx = sqrt((double)PHY_vars_UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                               2)/PHY_vars_UE->phy_proc_rx.trials - pow((double)PHY_vars_UE->phy_proc_rx.diff/PHY_vars_UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2));
-        printf("Total PHY proc rx                                   :%f us (%d trials)\n",(double)PHY_vars_UE->phy_proc_rx.diff/PHY_vars_UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->phy_proc_rx.trials*2/3);
+        std_phy_proc_rx = sqrt((double)UE->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                               2)/UE->phy_proc_rx.trials - pow((double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000,2));
+        printf("Total PHY proc rx                                   :%f us (%d trials)\n",(double)UE->phy_proc_rx.diff/UE->phy_proc_rx.trials/cpu_freq_GHz/1000.0,
+               UE->phy_proc_rx.trials*2/3);
         printf("|__Statistcs                                            std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median,
                rx_q1, rx_q3, n_rx_dropped);
-        std_phy_proc_rx_fft = sqrt((double)PHY_vars_UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_UE->ofdm_demod_stats.trials - pow((double)PHY_vars_UE->ofdm_demod_stats.diff/PHY_vars_UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2));
-        printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)PHY_vars_UE->ofdm_demod_stats.diff/PHY_vars_UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->ofdm_demod_stats.trials*2/3);
+        std_phy_proc_rx_fft = sqrt((double)UE->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/UE->ofdm_demod_stats.trials - pow((double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2));
+        printf("DLSCH OFDM demodulation and channel_estimation time :%f us (%d trials)\n",(nsymb)*(double)UE->ofdm_demod_stats.diff/UE->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0,
+               UE->ofdm_demod_stats.trials*2/3);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3);
         printf("|__ DLSCH rx dft                                        :%f us (%d trials)\n",
-               (nsymb*PHY_vars_UE->lte_frame_parms.nb_antennas_rx)*(double)PHY_vars_UE->rx_dft_stats.diff/PHY_vars_UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->rx_dft_stats.trials*2/3);
+               (nsymb*UE->frame_parms.nb_antennas_rx)*(double)UE->rx_dft_stats.diff/UE->rx_dft_stats.trials/cpu_freq_GHz/1000.0,UE->rx_dft_stats.trials*2/3);
         printf("|__ DLSCH channel estimation time                       :%f us (%d trials)\n",
-               (4.0)*(double)PHY_vars_UE->dlsch_channel_estimation_stats.diff/PHY_vars_UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_channel_estimation_stats.trials*2/3);
+               (4.0)*(double)UE->dlsch_channel_estimation_stats.diff/UE->dlsch_channel_estimation_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_channel_estimation_stats.trials*2/3);
         printf("|__ DLSCH frequency offset estimation time              :%f us (%d trials)\n",
-               (4.0)*(double)PHY_vars_UE->dlsch_freq_offset_estimation_stats.diff/PHY_vars_UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->dlsch_freq_offset_estimation_stats.trials*2/3);
-        printf("DLSCH rx pdcch                                       :%f us (%d trials)\n",(double)PHY_vars_UE->dlsch_rx_pdcch_stats.diff/PHY_vars_UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->dlsch_rx_pdcch_stats.trials);
-        std_phy_proc_rx_demod = sqrt((double)PHY_vars_UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                     2)/PHY_vars_UE->dlsch_llr_stats.trials - pow((double)PHY_vars_UE->dlsch_llr_stats.diff/PHY_vars_UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2));
-        printf("DLSCH Channel Compensation and LLR generation time  :%f us (%d trials)\n",(3)*(double)PHY_vars_UE->dlsch_llr_stats.diff/PHY_vars_UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->dlsch_llr_stats.trials/3);
+               (4.0)*(double)UE->dlsch_freq_offset_estimation_stats.diff/UE->dlsch_freq_offset_estimation_stats.trials/cpu_freq_GHz/1000.0,
+               UE->dlsch_freq_offset_estimation_stats.trials*2/3);
+        printf("DLSCH rx pdcch                                       :%f us (%d trials)\n",(double)UE->dlsch_rx_pdcch_stats.diff/UE->dlsch_rx_pdcch_stats.trials/cpu_freq_GHz/1000.0,
+               UE->dlsch_rx_pdcch_stats.trials);
+        std_phy_proc_rx_demod = sqrt((double)UE->dlsch_llr_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                     2)/UE->dlsch_llr_stats.trials - pow((double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000,2));
+        printf("DLSCH Channel Compensation and LLR generation time  :%f us (%d trials)\n",(3)*(double)UE->dlsch_llr_stats.diff/UE->dlsch_llr_stats.trials/cpu_freq_GHz/1000.0,
+               UE->dlsch_llr_stats.trials/3);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3);
-        printf("DLSCH unscrambling time                             :%f us (%d trials)\n",(double)PHY_vars_UE->dlsch_unscrambling_stats.diff/PHY_vars_UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->dlsch_unscrambling_stats.trials);
-        std_phy_proc_rx_dec = sqrt((double)PHY_vars_UE->dlsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_UE->dlsch_decoding_stats.trials - pow((double)PHY_vars_UE->dlsch_decoding_stats.diff/PHY_vars_UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000,2));
+        printf("DLSCH unscrambling time                             :%f us (%d trials)\n",(double)UE->dlsch_unscrambling_stats.diff/UE->dlsch_unscrambling_stats.trials/cpu_freq_GHz/1000.0,
+               UE->dlsch_unscrambling_stats.trials);
+        std_phy_proc_rx_dec = sqrt((double)UE->dlsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/UE->dlsch_decoding_stats.trials - pow((double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000,2));
         printf("DLSCH Decoding time (%02.2f Mbit/s, avg iter %1.2f)    :%f us (%d trials, max %f)\n",
-               PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter/iter_trials,
-               (double)PHY_vars_UE->dlsch_decoding_stats.diff/PHY_vars_UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_decoding_stats.trials,
-               (double)PHY_vars_UE->dlsch_decoding_stats.max/cpu_freq_GHz/1000.0);
+               eNB->dlsch[0][0]->harq_processes[0]->TBS/1000.0,(double)avg_iter/iter_trials,
+               (double)UE->dlsch_decoding_stats.diff/UE->dlsch_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_decoding_stats.trials,
+               (double)UE->dlsch_decoding_stats.max/cpu_freq_GHz/1000.0);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n",std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3);
         printf("|__ DLSCH Rate Unmatching                               :%f us (%d trials)\n",
-               (double)PHY_vars_UE->dlsch_rate_unmatching_stats.diff/PHY_vars_UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_rate_unmatching_stats.trials);
+               (double)UE->dlsch_rate_unmatching_stats.diff/UE->dlsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_rate_unmatching_stats.trials);
         printf("|__ DLSCH Turbo Decoding(%d bits)                       :%f us (%d trials)\n",
-               PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Cminus ? PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kminus : PHY_vars_UE->dlsch_ue[0][0]->harq_processes[0]->Kplus,
-               (double)PHY_vars_UE->dlsch_turbo_decoding_stats.diff/PHY_vars_UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->dlsch_turbo_decoding_stats.trials);
+               UE->dlsch[0][0]->harq_processes[0]->Cminus ? UE->dlsch[0][0]->harq_processes[0]->Kminus : UE->dlsch[0][0]->harq_processes[0]->Kplus,
+               (double)UE->dlsch_turbo_decoding_stats.diff/UE->dlsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,UE->dlsch_turbo_decoding_stats.trials);
         printf("    |__ init                                            %f us (cycles/iter %f, %d trials)\n",
-               (double)PHY_vars_UE->dlsch_tc_init_stats.diff/PHY_vars_UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_UE->dlsch_tc_init_stats.diff/PHY_vars_UE->dlsch_tc_init_stats.trials/((double)avg_iter/iter_trials),
-               PHY_vars_UE->dlsch_tc_init_stats.trials);
+               (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
+               (double)UE->dlsch_tc_init_stats.diff/UE->dlsch_tc_init_stats.trials/((double)avg_iter/iter_trials),
+               UE->dlsch_tc_init_stats.trials);
         printf("    |__ alpha                                           %f us (cycles/iter %f, %d trials)\n",
-               (double)PHY_vars_UE->dlsch_tc_alpha_stats.diff/PHY_vars_UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_UE->dlsch_tc_alpha_stats.diff/PHY_vars_UE->dlsch_tc_alpha_stats.trials*2,
-               PHY_vars_UE->dlsch_tc_alpha_stats.trials);
+               (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0,
+               (double)UE->dlsch_tc_alpha_stats.diff/UE->dlsch_tc_alpha_stats.trials*2,
+               UE->dlsch_tc_alpha_stats.trials);
         printf("    |__ beta                                            %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_UE->dlsch_tc_beta_stats.diff/PHY_vars_UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_UE->dlsch_tc_beta_stats.diff/PHY_vars_UE->dlsch_tc_beta_stats.trials*2,
-               PHY_vars_UE->dlsch_tc_beta_stats.trials);
+               (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0,
+               (double)UE->dlsch_tc_beta_stats.diff/UE->dlsch_tc_beta_stats.trials*2,
+               UE->dlsch_tc_beta_stats.trials);
         printf("    |__ gamma                                           %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_UE->dlsch_tc_gamma_stats.diff/PHY_vars_UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_UE->dlsch_tc_gamma_stats.diff/PHY_vars_UE->dlsch_tc_gamma_stats.trials*2,
-               PHY_vars_UE->dlsch_tc_gamma_stats.trials);
+               (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0,
+               (double)UE->dlsch_tc_gamma_stats.diff/UE->dlsch_tc_gamma_stats.trials*2,
+               UE->dlsch_tc_gamma_stats.trials);
         printf("    |__ ext                                             %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_UE->dlsch_tc_ext_stats.diff/PHY_vars_UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_UE->dlsch_tc_ext_stats.diff/PHY_vars_UE->dlsch_tc_ext_stats.trials*2,
-               PHY_vars_UE->dlsch_tc_ext_stats.trials);
+               (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0,
+               (double)UE->dlsch_tc_ext_stats.diff/UE->dlsch_tc_ext_stats.trials*2,
+               UE->dlsch_tc_ext_stats.trials);
         printf("    |__ intl1                                           %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_UE->dlsch_tc_intl1_stats.diff/PHY_vars_UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_UE->dlsch_tc_intl1_stats.diff/PHY_vars_UE->dlsch_tc_intl1_stats.trials,
-               PHY_vars_UE->dlsch_tc_intl1_stats.trials);
+               (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0,
+               (double)UE->dlsch_tc_intl1_stats.diff/UE->dlsch_tc_intl1_stats.trials,
+               UE->dlsch_tc_intl1_stats.trials);
         printf("    |__ intl2+HD+CRC                                    %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_UE->dlsch_tc_intl2_stats.diff/PHY_vars_UE->dlsch_tc_intl2_stats.trials,
-               PHY_vars_UE->dlsch_tc_intl2_stats.trials);
+               (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0,
+               (double)UE->dlsch_tc_intl2_stats.diff/UE->dlsch_tc_intl2_stats.trials,
+               UE->dlsch_tc_intl2_stats.trials);
       }
 
       if ((transmission_mode != 3) && (transmission_mode != 4)) {
         fprintf(bler_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
                 SNR,
                 mcs1,
-                PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+                eNB->dlsch[0][0]->harq_processes[0]->TBS,
                 rate,
                 errs[0],
                 round_trials[0],
@@ -3794,8 +3794,8 @@ PMI_FEEDBACK:
         fprintf(bler_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d\n",
                 SNR,
                 mcs1,mcs2,
-                PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
-                PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS,
+                eNB->dlsch[0][0]->harq_processes[0]->TBS,
+                eNB->dlsch[0][1]->harq_processes[0]->TBS,
                 rate,
                 errs[0],
                 round_trials[0],
@@ -3828,7 +3828,7 @@ PMI_FEEDBACK:
           fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
                   SNR,
                   mcs1,
-                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+                  eNB->dlsch[0][0]->harq_processes[0]->TBS,
                   rate,
                   errs[0],
                   round_trials[0],
@@ -3844,7 +3844,7 @@ PMI_FEEDBACK:
           fprintf(time_meas_fd,"%f;%d;%d;%f; %2.1f%%;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;",
                   SNR,
                   mcs1,
-                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+                  eNB->dlsch[0][0]->harq_processes[0]->TBS,
                   rate*effective_rate,
                   100*effective_rate,
                   rate,
@@ -3865,14 +3865,14 @@ PMI_FEEDBACK:
                   round_trials[0],
                   (double)dci_errors/(round_trials[0]),
                   (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/
-                  (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+                  (double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
                   (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
         } else {
           fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
                   SNR,
                   mcs1,mcs2,
-                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
-                  PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS,
+                  eNB->dlsch[0][0]->harq_processes[0]->TBS,
+                  eNB->dlsch[0][1]->harq_processes[0]->TBS,
                   rate,
                   errs[0],
                   round_trials[0],
@@ -3888,8 +3888,8 @@ PMI_FEEDBACK:
           fprintf(time_meas_fd,"%f;%d;%d;%d;%d;%f;%2.1f;%f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%d;%d;%e;%f;%f;",
                   SNR,
                   mcs1,mcs2,
-                  PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
-                  PHY_vars_eNB->dlsch_eNB[0][1]->harq_processes[0]->TBS,
+                  eNB->dlsch[0][0]->harq_processes[0]->TBS,
+                  eNB->dlsch[0][1]->harq_processes[0]->TBS,
                   rate*effective_rate,
                   100*effective_rate,
                   rate,
@@ -3910,36 +3910,36 @@ PMI_FEEDBACK:
                   round_trials[0],
                   (double)dci_errors/(round_trials[0]),
                   (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/
-                  (double)PHY_vars_eNB->dlsch_eNB[0][0]->harq_processes[0]->TBS,
+                  (double)eNB->dlsch[0][0]->harq_processes[0]->TBS,
                   (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
         }
 
         //fprintf(time_meas_fd,"eNB_PROC_TX(%d); OFDM_MOD(%d); DL_MOD(%d); DL_SCR(%d); DL_ENC(%d); UE_PROC_RX(%d); OFDM_DEMOD_CH_EST(%d); RX_PDCCH(%d); CH_COMP_LLR(%d); DL_USCR(%d); DL_DECOD(%d);\n",
         fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d; %d; %d; %d;",
-                PHY_vars_eNB->phy_proc_tx.trials,
-                PHY_vars_eNB->ofdm_mod_stats.trials,
-                PHY_vars_eNB->dlsch_modulation_stats.trials,
-                PHY_vars_eNB->dlsch_scrambling_stats.trials,
-                PHY_vars_eNB->dlsch_encoding_stats.trials,
-                PHY_vars_UE->phy_proc_rx.trials,
-                PHY_vars_UE->ofdm_demod_stats.trials,
-                PHY_vars_UE->dlsch_rx_pdcch_stats.trials,
-                PHY_vars_UE->dlsch_llr_stats.trials,
-                PHY_vars_UE->dlsch_unscrambling_stats.trials,
-                PHY_vars_UE->dlsch_decoding_stats.trials
+                eNB->phy_proc_tx.trials,
+                eNB->ofdm_mod_stats.trials,
+                eNB->dlsch_modulation_stats.trials,
+                eNB->dlsch_scrambling_stats.trials,
+                eNB->dlsch_encoding_stats.trials,
+                UE->phy_proc_rx.trials,
+                UE->ofdm_demod_stats.trials,
+                UE->dlsch_rx_pdcch_stats.trials,
+                UE->dlsch_llr_stats.trials,
+                UE->dlsch_unscrambling_stats.trials,
+                UE->dlsch_decoding_stats.trials
                );
         fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;%f;",
-                get_time_meas_us(&PHY_vars_eNB->phy_proc_tx),
-                get_time_meas_us(&PHY_vars_eNB->ofdm_mod_stats),
-                get_time_meas_us(&PHY_vars_eNB->dlsch_modulation_stats),
-                get_time_meas_us(&PHY_vars_eNB->dlsch_scrambling_stats),
-                get_time_meas_us(&PHY_vars_eNB->dlsch_encoding_stats),
-                get_time_meas_us(&PHY_vars_UE->phy_proc_rx),
-                nsymb*get_time_meas_us(&PHY_vars_UE->ofdm_demod_stats),
-                get_time_meas_us(&PHY_vars_UE->dlsch_rx_pdcch_stats),
-                3*get_time_meas_us(&PHY_vars_UE->dlsch_llr_stats),
-                get_time_meas_us(&PHY_vars_UE->dlsch_unscrambling_stats),
-                get_time_meas_us(&PHY_vars_UE->dlsch_decoding_stats)
+                get_time_meas_us(&eNB->phy_proc_tx),
+                get_time_meas_us(&eNB->ofdm_mod_stats),
+                get_time_meas_us(&eNB->dlsch_modulation_stats),
+                get_time_meas_us(&eNB->dlsch_scrambling_stats),
+                get_time_meas_us(&eNB->dlsch_encoding_stats),
+                get_time_meas_us(&UE->phy_proc_rx),
+                nsymb*get_time_meas_us(&UE->ofdm_demod_stats),
+                get_time_meas_us(&UE->dlsch_rx_pdcch_stats),
+                3*get_time_meas_us(&UE->dlsch_llr_stats),
+                get_time_meas_us(&UE->dlsch_unscrambling_stats),
+                get_time_meas_us(&UE->dlsch_decoding_stats)
                );
         //fprintf(time_meas_fd,"eNB_PROC_TX_STD;eNB_PROC_TX_MAX;eNB_PROC_TX_MIN;eNB_PROC_TX_MED;eNB_PROC_TX_Q1;eNB_PROC_TX_Q3;eNB_PROC_TX_DROPPED;\n");
         fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%d;", std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3, n_tx_dropped);
@@ -3969,17 +3969,17 @@ PMI_FEEDBACK:
 
         /*
         fprintf(time_meas_fd,"%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;",
-        PHY_vars_eNB->phy_proc_tx.trials,
-        PHY_vars_eNB->ofdm_mod_stats.trials,
-        PHY_vars_eNB->dlsch_modulation_stats.trials,
-        PHY_vars_eNB->dlsch_scrambling_stats.trials,
-        PHY_vars_eNB->dlsch_encoding_stats.trials,
-        PHY_vars_UE->phy_proc_rx.trials,
-        PHY_vars_UE->ofdm_demod_stats.trials,
-        PHY_vars_UE->dlsch_rx_pdcch_stats.trials,
-        PHY_vars_UE->dlsch_llr_stats.trials,
-        PHY_vars_UE->dlsch_unscrambling_stats.trials,
-        PHY_vars_UE->dlsch_decoding_stats.trials);
+        eNB->phy_proc_tx.trials,
+        eNB->ofdm_mod_stats.trials,
+        eNB->dlsch_modulation_stats.trials,
+        eNB->dlsch_scrambling_stats.trials,
+        eNB->dlsch_encoding_stats.trials,
+        UE->phy_proc_rx.trials,
+        UE->ofdm_demod_stats.trials,
+        UE->dlsch_rx_pdcch_stats.trials,
+        UE->dlsch_llr_stats.trials,
+        UE->dlsch_unscrambling_stats.trials,
+        UE->dlsch_decoding_stats.trials);
         */
         printf("[passed] effective rate : %f  (%2.1f%%,%f)): log and break \n",rate*effective_rate, 100*effective_rate, rate );
         break;
@@ -4030,9 +4030,9 @@ PMI_FEEDBACK:
 
   for (i=0; i<2; i++) {
     printf("eNB %d\n",i);
-    free_eNB_dlsch(PHY_vars_eNB->dlsch_eNB[0][i]);
+    free_eNB_dlsch(eNB->dlsch[0][i]);
     printf("UE %d\n",i);
-    free_ue_dlsch(PHY_vars_UE->dlsch_ue[0][i]);
+    free_ue_dlsch(UE->dlsch[0][i]);
   }
 
 
diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
index 78bb09c552c8739ce9cc445c33afb6c8b6993d18..73da52085f8d79df699c8fc5ad9f9ceb1f1eec2d 100644
--- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c
@@ -48,13 +48,14 @@
 #include "PHY/TOOLS/lte_phy_scope.h"
 #endif
 
+#include "unitary_defs.h"
 #define N_TRIALS 100
 
-PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2;
-PHY_VARS_UE *PHY_vars_UE;
+PHY_VARS_eNB *eNB,*eNB1,*eNB2;
+PHY_VARS_UE *UE;
 
 #define UL_RB_ALLOC 0x1ff;
-#define CCCH_RB_ALLOC computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,0,2)
+#define CCCH_RB_ALLOC computeRIV(eNB->frame_parms.N_RB_UL,0,2)
 #define DLSCH_RB_ALLOC ((uint16_t)0x1fbf) // igore DC component,RB13
 
 DCI_PDU DCI_pdu;
@@ -459,17 +460,7 @@ int main(int argc, char **argv)
   int CCE_table[800];
 
   number_of_cards = 1;
-  openair_daq_vars.rx_rf_mode = 1;
 
-  /*
-    rxdataF    = (int **)malloc16(2*sizeof(int*));
-    rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
-    rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
-
-    rxdata    = (int **)malloc16(2*sizeof(int*));
-    rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
-    rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
-  */
   while ((c = getopt (argc, argv, "hapFg:R:c:n:s:x:y:z:L:M:N:I:f:i:S:P:Y")) != -1) {
     switch (c) {
     case 'a':
@@ -719,7 +710,7 @@ int main(int argc, char **argv)
 
 
   mac_xface->computeRIV = computeRIV;
-  mac_xface->lte_frame_parms = &PHY_vars_eNB->lte_frame_parms;
+  mac_xface->frame_parms = &eNB->frame_parms;
   //  init_transport_channels(transmission_mode);
 
   if (n_frames==1)
@@ -729,27 +720,27 @@ int main(int argc, char **argv)
 
   printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
 
-  frame_parms = &PHY_vars_eNB->lte_frame_parms;
+  frame_parms = &eNB->frame_parms;
   get_dci(frame_parms, log2L, log2Lcommon, format_selector, n_rnti);
 
-  txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[eNb_id];
+  txdata = eNB->common_vars.txdata[eNb_id];
 
   s_re = malloc(2*sizeof(double*));
   s_im = malloc(2*sizeof(double*));
   r_re = malloc(2*sizeof(double*));
   r_im = malloc(2*sizeof(double*));
 
-  nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == 0) ? 14 : 12;
+  nsymb = (eNB->frame_parms.Ncp == 0) ? 14 : 12;
 
   printf("Subframe %d, FFT Size %d, Extended Prefix %d, Samples per subframe %d, Symbols per subframe %d\n",
          subframe,NUMBER_OF_OFDM_CARRIERS,
-         PHY_vars_eNB->lte_frame_parms.Ncp,PHY_vars_eNB->lte_frame_parms.samples_per_tti,nsymb);
+         eNB->frame_parms.Ncp,eNB->frame_parms.samples_per_tti,nsymb);
 
-  eNB2UE = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB,
-                                PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
+  eNB2UE = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx_eNB,
+                                UE->frame_parms.nb_antennas_rx,
                                 channel_model,
-				N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
-				N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_DL),
+				N_RB2sampling_rate(eNB->frame_parms.N_RB_DL),
+				N_RB2channel_bandwidth(eNB->frame_parms.N_RB_DL),
                                 0,
                                 0,
                                 0);
@@ -769,12 +760,12 @@ int main(int argc, char **argv)
 
 
 
-  PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0);
-  PHY_vars_UE->ulsch_ue[0]   = new_ue_ulsch(N_RB_DL,0);
+  eNB->ulsch[0] = new_eNB_ulsch(MAX_TURBO_ITERATIONS,N_RB_DL,0);
+  UE->ulsch[0]   = new_ue_ulsch(N_RB_DL,0);
 
 
-  PHY_vars_eNB->proc[subframe].frame_tx    = 0;
-  PHY_vars_eNB->proc[subframe].subframe_tx = subframe;
+  eNB->proc.frame_tx    = 0;
+  eNB->proc.subframe_tx = subframe;
 
   if (input_fd==NULL) {
     msg("No input file, so starting TX\n");
@@ -812,9 +803,9 @@ int main(int argc, char **argv)
   }
 
 
-  PHY_vars_UE->UE_mode[0] = PUSCH;
+  UE->UE_mode[0] = PUSCH;
 
-  //  nCCE_max = get_nCCE(3,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,0));
+  //  nCCE_max = get_nCCE(3,&eNB->frame_parms,get_mi(&eNB->frame_parms,0));
   //printf("nCCE_max %d\n",nCCE_max);
 
   //printf("num_phich interferers %d\n",num_phich_interf);
@@ -832,31 +823,31 @@ int main(int argc, char **argv)
 
     for (trial=0; trial<n_frames; trial++) {
 
-      //    printf("DCI (SF %d): txdataF %p (0 %p)\n",subframe,&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][512*14*subframe],&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0]);
-      for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) {
-        memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
+      //    printf("DCI (SF %d): txdataF %p (0 %p)\n",subframe,&eNB->common_vars.txdataF[eNb_id][aa][512*14*subframe],&eNB->common_vars.txdataF[eNb_id][aa][0]);
+      for (aa=0; aa<eNB->frame_parms.nb_antennas_tx_eNB; aa++) {
+        memset(&eNB->common_vars.txdataF[eNb_id][aa][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(int32_t));
 
         /*
-        re_offset = PHY_vars_eNB->lte_frame_parms.first_carrier_offset;
-        txptr = (uint32_t*)&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti];
-        for (i=0;i<PHY_vars_eNB->lte_frame_parms.N_RB_DL*6;i++) {
-        txptr[re_offset++] = PHY_vars_eNB->lte_frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3];
+        re_offset = eNB->frame_parms.first_carrier_offset;
+        txptr = (uint32_t*)&eNB->common_vars.txdataF[eNb_id][aa][subframe*eNB->frame_parms.samples_per_tti];
+        for (i=0;i<eNB->frame_parms.N_RB_DL*6;i++) {
+        txptr[re_offset++] = eNB->frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3];
         //printf("%i => %d,%d\n",re_offset-1,*(int16_t*)&txptr[re_offset-1],*(1+(int16_t*)&txptr[re_offset-1]));
         }
         re_offset=1; //skip DC
-        for (i=0;i<PHY_vars_eNB->lte_frame_parms.N_RB_DL*6;i++)
-        txptr[re_offset++] = PHY_vars_eNB->lte_frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3];
+        for (i=0;i<eNB->frame_parms.N_RB_DL*6;i++)
+        txptr[re_offset++] = eNB->frame_parms.mode1_flag==1 ? QPSK[taus()&3] : QPSK2[taus()&3];
         */
       }
 
 
-      generate_pilots_slot(PHY_vars_eNB,
-                           PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id],
+      generate_pilots_slot(eNB,
+                           eNB->common_vars.txdataF[eNb_id],
                            AMP,    //1024,
                            (subframe*2),
                            0);
-      generate_pilots_slot(PHY_vars_eNB,
-                           PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id],
+      generate_pilots_slot(eNB,
+                           eNB->common_vars.txdataF[eNb_id],
                            AMP,    //1024,
                            (subframe*2)+1,
                            0);
@@ -866,18 +857,18 @@ int main(int argc, char **argv)
         numCCE=0;
         n_trials_common++;
         common_active = 1;
-	if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 50) { 
+	if (eNB->frame_parms.N_RB_DL >= 50) { 
 	  n_trials_ul++;
 	  ul_active = 1;
 	}
-        if (PHY_vars_eNB->lte_frame_parms.N_RB_DL >= 25) { 
+        if (eNB->frame_parms.N_RB_DL >= 25) { 
 	  n_trials_dl++;
 	  dl_active = 1; 
 	}
 
         num_pdcch_symbols = get_num_pdcch_symbols(DCI_pdu.Num_common_dci+DCI_pdu.Num_ue_spec_dci,
                             DCI_pdu.dci_alloc, frame_parms, subframe);
-	numCCE = get_nCCE(num_pdcch_symbols,&PHY_vars_eNB->lte_frame_parms,get_mi(&PHY_vars_eNB->lte_frame_parms,subframe));
+	numCCE = get_nCCE(num_pdcch_symbols,&eNB->frame_parms,get_mi(&eNB->frame_parms,subframe));
 
         if (n_frames==1) {
           printf("num_dci %d, num_pddch_symbols %d, nCCE %d\n",
@@ -930,91 +921,83 @@ int main(int argc, char **argv)
                                              DCI_pdu.dci_alloc,
                                              0,
                                              AMP,
-                                             &PHY_vars_eNB->lte_frame_parms,
-                                             PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id],
+                                             &eNB->frame_parms,
+                                             eNB->common_vars.txdataF[eNb_id],
                                              subframe);
 
         if (n_frames==1)
           printf("num_pdcch_symbols at TX %d\n",num_pdcch_symbols);
 
-        if (is_phich_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)) {
+        if (is_phich_subframe(&eNB->frame_parms,subframe)) {
           if (n_frames==1)
             printf("generating PHICH\n");
 
-          harq_pid = phich_subframe_to_harq_pid(&PHY_vars_eNB->lte_frame_parms, PHY_vars_eNB->proc[subframe].frame_tx, subframe);
+          harq_pid = phich_subframe_to_harq_pid(&eNB->frame_parms, eNB->proc.frame_tx, subframe);
 
           phich_ACK = taus()&1;
-          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->phich_active = 1;
-          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb     = 0;
-          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS       = 0;
-          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->phich_ACK    = phich_ACK;
-          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->dci_alloc    = 1;
+          eNB->ulsch[0]->harq_processes[harq_pid]->phich_active = 1;
+          eNB->ulsch[0]->harq_processes[harq_pid]->first_rb     = 0;
+          eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS       = 0;
+          eNB->ulsch[0]->harq_processes[harq_pid]->phich_ACK    = phich_ACK;
+          eNB->ulsch[0]->harq_processes[harq_pid]->dci_alloc    = 1;
 
-          PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->first_rb       = 0;
-          PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->n_DMRS         = 0;
+          UE->ulsch[0]->harq_processes[harq_pid]->first_rb       = 0;
+          UE->ulsch[0]->harq_processes[harq_pid]->n_DMRS         = 0;
 
-          generate_phich_top(PHY_vars_eNB,
-                             subframe,AMP,0,0);
+          generate_phich_top(eNB,AMP,0,0);
           
           // generate 3 interfering PHICH
           if (num_phich_interf>0) {
-            PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 4;
-            generate_phich_top(PHY_vars_eNB,
-                   subframe,
-                   1024,
-                   0,0);
+            eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 4;
+            generate_phich_top(eNB,1024,0,0);
           }
 
           if (num_phich_interf>1) {
-            PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 8;
-            PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 1;
-            generate_phich_top(PHY_vars_eNB,
-                   subframe,
-                   1024,0,0);
+            eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 8;
+            eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1;
+            generate_phich_top(eNB,1024,0,0);
           }
           if (num_phich_interf>2) {
-            PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 12;
-            PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->n_DMRS = 1;
-            generate_phich_top(PHY_vars_eNB,
-                   subframe,
-                   1024,0,0);
+            eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 12;
+            eNB->ulsch[0]->harq_processes[harq_pid]->n_DMRS = 1;
+            generate_phich_top(eNB,1024,0,0);
 
           }
 
-          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->first_rb = 0;
+          eNB->ulsch[0]->harq_processes[harq_pid]->first_rb = 0;
           
         }
 
-        //  write_output("pilotsF.m","rsF",txdataF[0],lte_PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1);
+        //  write_output("pilotsF.m","rsF",txdataF[0],lte_eNB->frame_parms.ofdm_symbol_size,1,1);
 
         if (n_frames==1) {
-          write_output("txsigF0.m","txsF0", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1);
+          write_output("txsigF0.m","txsF0", eNB->common_vars.txdataF[eNb_id][0],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1);
 
-          if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB > 1)
-            write_output("txsigF1.m","txsF1", PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1);
+          if (eNB->frame_parms.nb_antennas_tx_eNB > 1)
+            write_output("txsigF1.m","txsF1", eNB->common_vars.txdataF[eNb_id][1],4*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX,1,1);
         }
 
         tx_lev = 0;
 
 
 
-        for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) {
-          if (PHY_vars_eNB->lte_frame_parms.Ncp == 1)
-            PHY_ofdm_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],        // input,
-                         &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti],         // output
-                         PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,
+        for (aa=0; aa<eNB->frame_parms.nb_antennas_tx_eNB; aa++) {
+          if (eNB->frame_parms.Ncp == 1)
+            PHY_ofdm_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],        // input,
+                         &txdata[aa][subframe*eNB->frame_parms.samples_per_tti],         // output
+                         eNB->frame_parms.ofdm_symbol_size,
                          2*nsymb,                 // number of symbols
-                         PHY_vars_eNB->lte_frame_parms.nb_prefix_samples,               // number of prefix samples
+                         eNB->frame_parms.nb_prefix_samples,               // number of prefix samples
                          CYCLIC_PREFIX);
           else {
-            normal_prefix_mod(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNb_id][aa][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],
-                              &txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti],
+            normal_prefix_mod(&eNB->common_vars.txdataF[eNb_id][aa][subframe*nsymb*eNB->frame_parms.ofdm_symbol_size],
+                              &txdata[aa][subframe*eNB->frame_parms.samples_per_tti],
                               2*nsymb,
                               frame_parms);
           }
 
-          tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti],
-                                  PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size);
+          tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti],
+                                  eNB->frame_parms.ofdm_symbol_size);
         }
 
         tx_lev_dB = (unsigned int) dB_fixed(tx_lev);
@@ -1023,18 +1006,18 @@ int main(int argc, char **argv)
 
 
       for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
-        for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) {
+        for (aa=0; aa<eNB->frame_parms.nb_antennas_tx_eNB; aa++) {
           if (awgn_flag == 0) {
-            s_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]);
-            s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]);
+            s_re[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]);
+            s_im[aa][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]);
           } else {
-            for (aarx=0; aarx<PHY_vars_UE->lte_frame_parms.nb_antennas_rx; aarx++) {
+            for (aarx=0; aarx<UE->frame_parms.nb_antennas_rx; aarx++) {
               if (aa==0) {
-                r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]);
-                r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]);
+                r_re[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]);
+                r_im[aarx][i] = ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]);
               } else {
-                r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)]);
-                r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + (i<<1)+1]);
+                r_re[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)]);
+                r_im[aarx][i] += ((double)(((short *)txdata[aa]))[(2*subframe*UE->frame_parms.samples_per_tti) + (i<<1)+1]);
               }
             }
           }
@@ -1054,7 +1037,7 @@ int main(int argc, char **argv)
       // scale by path_loss = NOW - P_noise
       //sigma2       = pow(10,sigma2_dB/10);
       //N0W          = -95.87;
-      sigma2_dB = (double)tx_lev_dB +10*log10((double)PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(double)(12*PHY_vars_eNB->lte_frame_parms.N_RB_DL)) - SNR;
+      sigma2_dB = (double)tx_lev_dB +10*log10((double)eNB->frame_parms.ofdm_symbol_size/(double)(12*eNB->frame_parms.N_RB_DL)) - SNR;
 
       if (n_frames==1)
         printf("sigma2_dB %f (SNR %f dB) tx_lev_dB %d\n",sigma2_dB,SNR,tx_lev_dB);
@@ -1064,37 +1047,37 @@ int main(int argc, char **argv)
 
       //  printf("Sigma2 %f (sigma2_dB %f)\n",sigma2,sigma2_dB);
       for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
-        for (aa=0; aa<PHY_vars_UE->lte_frame_parms.nb_antennas_rx; aa++) {
+        for (aa=0; aa<UE->frame_parms.nb_antennas_rx; aa++) {
 
-          ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
-          ((short*) PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(
+          ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] = (short) (.667*(r_re[aa][i] + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+          ((short*) UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] = (short) (.667*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(
                 0.0,1.0)));
           /*
-          ((short*)PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i] =
-            ((short*)txdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i];
-          ((short*)PHY_vars_UE->lte_ue_common_vars.rxdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1] =
-            ((short*)txdata[aa])[(2*subframe*PHY_vars_UE->lte_frame_parms.samples_per_tti) + 2*i+1];
+          ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i] =
+            ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i];
+          ((short*)UE->common_vars.rxdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1] =
+            ((short*)txdata[aa])[(2*subframe*UE->frame_parms.samples_per_tti) + 2*i+1];
           */
         }
       }
 
       // UE receiver
-      for (l=0; l<PHY_vars_eNB->lte_frame_parms.symbols_per_tti; l++) {
+      for (l=0; l<eNB->frame_parms.symbols_per_tti; l++) {
 
-        //  subframe_offset = (l/PHY_vars_eNB->lte_frame_parms.symbols_per_tti)*PHY_vars_eNB->lte_frame_parms.samples_per_tti;
+        //  subframe_offset = (l/eNB->frame_parms.symbols_per_tti)*eNB->frame_parms.samples_per_tti;
         //      printf("subframe_offset = %d\n",subframe_offset);
 
-        slot_fep(PHY_vars_UE,
-                 l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2),
-                 (2*subframe)+(l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2)),
+        slot_fep(UE,
+                 l%(eNB->frame_parms.symbols_per_tti/2),
+                 (2*subframe)+(l/(eNB->frame_parms.symbols_per_tti/2)),
                  0,
                  0,
 		 0);
 
-        if (PHY_vars_UE->perfect_ce == 1) {
+        if (UE->perfect_ce == 1) {
           if (awgn_flag==0) {
             // fill in perfect channel estimates
-            freq_channel(eNB2UE,PHY_vars_UE->lte_frame_parms.N_RB_DL,12*PHY_vars_UE->lte_frame_parms.N_RB_DL + 1);
+            freq_channel(eNB2UE,UE->frame_parms.N_RB_DL,12*UE->frame_parms.N_RB_DL + 1);
 
             //write_output("channel.m","ch",desc1->ch[0],desc1->channel_length,1,8);
             //write_output("channelF.m","chF",desc1->chF[0],nb_samples,1,8);
@@ -1102,9 +1085,9 @@ int main(int argc, char **argv)
               for(aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
                 for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
                   for (i=0; i<frame_parms->N_RB_DL*12; i++) {
-                    ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
+                    ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
                           eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].x*AMP);
-                    ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
+                    ((int16_t *) UE->common_vars.dl_ch_estimates[k][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(int16_t)(
                           eNB2UE->chF[aarx+(aa*frame_parms->nb_antennas_rx)][i].y*AMP);
                   }
                 }
@@ -1114,42 +1097,42 @@ int main(int argc, char **argv)
             for(aa=0; aa<frame_parms->nb_antennas_tx_eNB; aa++) {
               for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) {
                 for (i=0; i<frame_parms->N_RB_DL*12; i++) {
-                  ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
-                  ((int16_t *) PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2;
+                  ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=(short)(AMP);
+                  ((int16_t *) UE->common_vars.dl_ch_estimates[0][(aa<<1)+aarx])[2*i+1+(l*frame_parms->ofdm_symbol_size+LTE_CE_FILTER_LENGTH)*2]=0/2;
                 }
               }
             }
           }
         }
 
-        if (l==((PHY_vars_eNB->lte_frame_parms.Ncp==0)?4:3)) {
+        if (l==((eNB->frame_parms.Ncp==0)?4:3)) {
 
-          //      write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1);
+          //      write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1);
 
           // do PDCCH procedures here
-          PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = n_rnti;
+          UE->pdcch_vars[0]->crnti = n_rnti;
 
           //    printf("Doing RX : num_pdcch_symbols at TX %d\n",num_pdcch_symbols);
-          rx_pdcch(&PHY_vars_UE->lte_ue_common_vars,
-                   PHY_vars_UE->lte_ue_pdcch_vars,
-                   &PHY_vars_UE->lte_frame_parms,
+          rx_pdcch(&UE->common_vars,
+                   UE->pdcch_vars,
+                   &UE->frame_parms,
                    subframe,
                    0,
-                   (PHY_vars_UE->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
-                   PHY_vars_UE->high_speed_flag,
-                   PHY_vars_UE->is_secondary_ue);
-
-          if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe)) {
-            PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->status = ACTIVE;
-            //PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms,0,subframe)]->Ndi = 1;
-            rx_phich(PHY_vars_UE,
+                   (UE->frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI,
+                   UE->high_speed_flag,
+                   UE->is_secondary_ue);
+
+          if (is_phich_subframe(&UE->frame_parms,subframe)) {
+            UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->status = ACTIVE;
+            //UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms,0,subframe)]->Ndi = 1;
+            rx_phich(UE,
                      subframe,
                      0);
           }
 
-          //    if (PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols)
+          //    if (UE->pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols)
           //      break;
-          dci_cnt = dci_decoding_procedure(PHY_vars_UE,
+          dci_cnt = dci_decoding_procedure(UE,
                                            dci_alloc_rx,1,
                                            0,subframe);
 
@@ -1158,7 +1141,7 @@ int main(int argc, char **argv)
           dl_rx=0;
 
           if (n_frames==1)  {
-            numCCE = get_nCCE(PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols, &PHY_vars_UE->lte_frame_parms, get_mi(&PHY_vars_UE->lte_frame_parms,subframe));
+            numCCE = get_nCCE(UE->pdcch_vars[0]->num_pdcch_symbols, &UE->frame_parms, get_mi(&UE->frame_parms,subframe));
 
             for (i = 0; i < dci_cnt; i++)
               printf("dci %d: rnti 0x%x, format %d, L %d, nCCE %d/%d dci_length %d\n",i, dci_alloc_rx[i].rnti, dci_alloc_rx[i].format,
@@ -1168,21 +1151,21 @@ int main(int argc, char **argv)
           for (i=0; i<dci_cnt; i++) {
             if (dci_alloc_rx[i].rnti == SI_RNTI) {
               if (n_frames==1)
-                dump_dci(&PHY_vars_UE->lte_frame_parms, &dci_alloc_rx[i]);
+                dump_dci(&UE->frame_parms, &dci_alloc_rx[i]);
 
               common_rx=1;
             }
 
             if ((dci_alloc_rx[i].rnti == n_rnti) && (dci_alloc_rx[i].format == format0)) {
               if (n_frames==1)
-                dump_dci(&PHY_vars_UE->lte_frame_parms, &dci_alloc_rx[i]);
+                dump_dci(&UE->frame_parms, &dci_alloc_rx[i]);
 
               ul_rx=1;
             }
 
             if ((dci_alloc_rx[i].rnti == n_rnti) && ((dci_alloc_rx[i].format == format1))) {
               if (n_frames==1)
-                dump_dci(&PHY_vars_UE->lte_frame_parms, &dci_alloc_rx[i]);
+                dump_dci(&UE->frame_parms, &dci_alloc_rx[i]);
 
               dl_rx=1;
             }
@@ -1207,12 +1190,12 @@ int main(int argc, char **argv)
             //   exit(-1);
           }
 
-          if (PHY_vars_UE->lte_ue_pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols)
+          if (UE->pdcch_vars[0]->num_pdcch_symbols != num_pdcch_symbols)
             n_errors_cfi++;
 
           /*
-           if (is_phich_subframe(&PHY_vars_UE->lte_frame_parms,subframe))
-             if (PHY_vars_UE->ulsch_ue[0]->harq_processes[phich_subframe_to_harq_pid(&PHY_vars_UE->lte_frame_parms, PHY_vars_UE->frame, subframe)]->Ndi != phich_ACK)
+           if (is_phich_subframe(&UE->frame_parms,subframe))
+             if (UE->ulsch[0]->harq_processes[phich_subframe_to_harq_pid(&UE->frame_parms, UE->frame, subframe)]->Ndi != phich_ACK)
                n_errors_hi++;
           */
 
@@ -1230,7 +1213,7 @@ int main(int argc, char **argv)
 
 #ifdef XFORMS
       phy_scope_UE(form_ue,
-                   PHY_vars_UE,
+                   UE,
                    eNb_id,0,subframe);
 #endif
 
@@ -1250,22 +1233,22 @@ int main(int argc, char **argv)
     if (n_tx>1)
       write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
 
-    write_output("rxsig0.m","rxs0", PHY_vars_UE->lte_ue_common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
-    write_output("rxsigF0.m","rxsF0", PHY_vars_UE->lte_ue_common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1);
+    write_output("rxsig0.m","rxs0", UE->common_vars.rxdata[0],10*frame_parms->samples_per_tti,1,1);
+    write_output("rxsigF0.m","rxsF0", UE->common_vars.rxdataF[0],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1);
 
     if (n_rx>1) {
-      write_output("rxsig1.m","rxs1", PHY_vars_UE->lte_ue_common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1);
-      write_output("rxsigF1.m","rxsF1", PHY_vars_UE->lte_ue_common_vars.rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1);
+      write_output("rxsig1.m","rxs1", UE->common_vars.rxdata[1],10*frame_parms->samples_per_tti,1,1);
+      write_output("rxsigF1.m","rxsF1", UE->common_vars.rxdataF[1],NUMBER_OF_OFDM_CARRIERS*2*((frame_parms->Ncp==0)?14:12),2,1);
     }
 
-    write_output("H00.m","h00",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1);
+    write_output("H00.m","h00",&(UE->common_vars.dl_ch_estimates[0][0][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1);
 
     if (n_tx==2)
-      write_output("H10.m","h10",&(PHY_vars_UE->lte_ue_common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size),1,1);
+      write_output("H10.m","h10",&(UE->common_vars.dl_ch_estimates[0][2][0]),((frame_parms->Ncp==0)?7:6)*(eNB->frame_parms.ofdm_symbol_size),1,1);
 
-    write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->rxdataF_ext[0],3*12*PHY_vars_UE->lte_frame_parms.N_RB_DL,1,1);
-    write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->rxdataF_comp[0],4*12*PHY_vars_UE->lte_frame_parms.N_RB_DL,1,1);
-    write_output("pdcch_rxF_llr.m","pdcch_llr",PHY_vars_UE->lte_ue_pdcch_vars[eNb_id]->llr,2400,1,4);
+    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);
   }
 
   for (i=0; i<2; i++) {
diff --git a/openair1/SIMULATION/LTE_PHY/prachsim.c b/openair1/SIMULATION/LTE_PHY/prachsim.c
index 37fc3a6a102d30d5883e3a6d78deeb5a4627007d..58e5428e827140b3a9744d2012ad513e2cdb8eed 100644
--- a/openair1/SIMULATION/LTE_PHY/prachsim.c
+++ b/openair1/SIMULATION/LTE_PHY/prachsim.c
@@ -43,10 +43,12 @@
 
 #include "OCG_vars.h"
 
+#include "unitary_defs.h"
+
 int current_dlsch_cqi; //FIXME!
 
-PHY_VARS_eNB *PHY_vars_eNB;
-PHY_VARS_UE *PHY_vars_UE;
+PHY_VARS_eNB *eNB;
+PHY_VARS_UE *UE;
 
 #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
 
@@ -105,17 +107,9 @@ int main(int argc, char **argv)
   logInit();
 
   number_of_cards = 1;
-  openair_daq_vars.rx_rf_mode = 1;
 
-  /*
-    rxdataF    = (int **)malloc16(2*sizeof(int*));
-    rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
-    rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
 
-    rxdata    = (int **)malloc16(2*sizeof(int*));
-    rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
-    rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
-  */
+
   while ((c = getopt (argc, argv, "hHaA:Cr:p:g:n:s:S:t:x:y:v:V:z:N:F:d:Z:L:R:")) != -1) {
     switch (c) {
     case 'a':
@@ -343,10 +337,10 @@ int main(int argc, char **argv)
 
   printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
 
-  frame_parms = &PHY_vars_eNB->lte_frame_parms;
+  frame_parms = &eNB->frame_parms;
 
 
-  txdata = PHY_vars_UE->lte_ue_common_vars.txdata;
+  txdata = UE->common_vars.txdata;
   printf("txdata %p\n",&txdata[0][subframe*frame_parms->samples_per_tti]);
 
   s_re = malloc(2*sizeof(double*));
@@ -361,11 +355,11 @@ int main(int argc, char **argv)
 
 
   msg("[SIM] Using SCM/101\n");
-  UE2eNB = new_channel_desc_scm(PHY_vars_UE->lte_frame_parms.nb_antennas_tx,
-                                PHY_vars_eNB->lte_frame_parms.nb_antennas_rx,
+  UE2eNB = new_channel_desc_scm(UE->frame_parms.nb_antennas_tx,
+                                eNB->frame_parms.nb_antennas_rx,
                                 channel_model,
-				N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
-				N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
+				N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
+				N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
                                 0.0,
                                 delay,
                                 0);
@@ -388,32 +382,35 @@ int main(int argc, char **argv)
     bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
   }
 
-  PHY_vars_UE->lte_frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex;
-  PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
-  PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config;
-  PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
-  PHY_vars_UE->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
+  UE->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex;
+  UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
+  UE->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config;
+  UE->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
+  UE->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
+
 
+  eNB->frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex;
+  eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
+  eNB->frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config;
+  eNB->frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
+  eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
 
-  PHY_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex=rootSequenceIndex;
-  PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0;
-  PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=NCS_config;
-  PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.highSpeedFlag=hs_flag;
-  PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
+  eNB->node_function = eNodeB_3GPP;
+  eNB->proc.subframe_rx = subframe;
 
   /* N_ZC not used later, so prach_fmt is also useless, don't set */
-  //prach_fmt = get_prach_fmt(PHY_vars_eNB->lte_frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
-  //                          PHY_vars_eNB->lte_frame_parms.frame_type);
+  //prach_fmt = get_prach_fmt(eNB->frame_parms.prach_config_common.prach_ConfigInfo.prach_ConfigIndex,
+  //                          eNB->frame_parms.frame_type);
   /* N_ZC not used later, no need to set */
   //N_ZC = (prach_fmt <4)?839:139;
 
-  compute_prach_seq(&PHY_vars_eNB->lte_frame_parms.prach_config_common,PHY_vars_eNB->lte_frame_parms.frame_type,PHY_vars_eNB->X_u);
+  compute_prach_seq(&eNB->frame_parms.prach_config_common,eNB->frame_parms.frame_type,eNB->X_u);
 
-  compute_prach_seq(&PHY_vars_UE->lte_frame_parms.prach_config_common,PHY_vars_UE->lte_frame_parms.frame_type,PHY_vars_UE->X_u);
+  compute_prach_seq(&UE->frame_parms.prach_config_common,UE->frame_parms.frame_type,UE->X_u);
 
-  PHY_vars_UE->lte_ue_prach_vars[0]->amp = AMP;
+  UE->prach_vars[0]->amp = AMP;
 
-  PHY_vars_UE->prach_resources[0] = &prach_resources;
+  UE->prach_resources[0] = &prach_resources;
 
   if (preamble_tx == 99)
     preamble_tx = (uint16_t)(taus()&0x3f);
@@ -421,10 +418,10 @@ int main(int argc, char **argv)
   if (n_frames == 1)
     printf("raPreamble %d\n",preamble_tx);
 
-  PHY_vars_UE->prach_resources[0]->ra_PreambleIndex = preamble_tx;
-  PHY_vars_UE->prach_resources[0]->ra_TDD_map_index = 0;
+  UE->prach_resources[0]->ra_PreambleIndex = preamble_tx;
+  UE->prach_resources[0]->ra_TDD_map_index = 0;
 
-  tx_lev = generate_prach(PHY_vars_UE,
+  tx_lev = generate_prach(UE,
                           0, //eNB_id,
                           subframe,
                           0); //Nf
@@ -436,7 +433,7 @@ int main(int argc, char **argv)
   //write_output("txsig1.m","txs1", txdata[1],FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
 
   // multipath channel
-  dump_prach_config(&PHY_vars_eNB->lte_frame_parms,subframe);
+  dump_prach_config(&eNB->frame_parms,subframe);
 
   for (i=0; i<2*frame_parms->samples_per_tti; i++) {
     for (aa=0; aa<1; aa++) {
@@ -444,7 +441,7 @@ int main(int argc, char **argv)
         s_re[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]);
         s_im[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]);
       } else {
-        for (aarx=0; aarx<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aarx++) {
+        for (aarx=0; aarx<eNB->frame_parms.nb_antennas_rx; aarx++) {
           if (aa==0) {
             r_re[aarx][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]);
             r_im[aarx][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]);
@@ -491,15 +488,14 @@ int main(int argc, char **argv)
         }
 
         for (i=0; i<frame_parms->samples_per_tti; i++) {
-          for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
+          for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
 
-            ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
-            ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+            ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (.167*(r_re[aa][i] +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+            ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (.167*(r_im[aa][i] + (iqim*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
           }
         }
 
-        rx_prach(PHY_vars_eNB,
-                 subframe,
+        rx_prach(eNB,
                  preamble_energy_list,
                  preamble_delay_list,
                  0,   //Nf
@@ -530,12 +526,12 @@ int main(int argc, char **argv)
               printf("preamble %d : energy %d, delay %d\n",i,preamble_energy_list[i],preamble_delay_list[i]);
 
           write_output("prach0.m","prach0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1);
-          write_output("prachF0.m","prachF0", &PHY_vars_eNB->lte_eNB_prach_vars.prachF[0],24576,1,1);
+          write_output("prachF0.m","prachF0", &eNB->prach_vars.prachF[0],24576,1,1);
           write_output("rxsig0.m","rxs0",
-                       &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],
+                       &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],
                        frame_parms->samples_per_tti,1,1);
-          write_output("rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],512*nsymb*2,2,1);
-          write_output("prach_preamble.m","prachp",&PHY_vars_eNB->X_u[0],839,1,1);
+          write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1);
+          write_output("prach_preamble.m","prachp",&eNB->X_u[0],839,1,1);
         }
       }
 
diff --git a/openair1/SIMULATION/LTE_PHY/pucchsim.c b/openair1/SIMULATION/LTE_PHY/pucchsim.c
index fa96ac584338633f266594fa79f47d8c51dc0c8c..d3c3df07547fcb49f45ecee4f81eb47ba4fa7dda 100644
--- a/openair1/SIMULATION/LTE_PHY/pucchsim.c
+++ b/openair1/SIMULATION/LTE_PHY/pucchsim.c
@@ -45,10 +45,12 @@
 #include "OCG_vars.h"
 #include "UTIL/LOG/log_extern.h"
 
+#include "unitary_defs.h"
+
 int current_dlsch_cqi; //FIXME!
 
-PHY_VARS_eNB *PHY_vars_eNB;
-PHY_VARS_UE *PHY_vars_UE;
+PHY_VARS_eNB *eNB;
+PHY_VARS_UE *UE;
 
 #define DLSCH_RB_ALLOC 0x1fbf // igore DC component,RB13
 
@@ -101,17 +103,6 @@ int main(int argc, char **argv)
   uint16_t n2_pucch = 0;
 
   number_of_cards = 1;
-  openair_daq_vars.rx_rf_mode = 1;
-
-  /*
-    rxdataF    = (int **)malloc16(2*sizeof(int*));
-    rxdataF[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
-    rxdataF[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
-
-    rxdata    = (int **)malloc16(2*sizeof(int*));
-    rxdata[0] = (int *)malloc16(FRAME_LENGTH_BYTES);
-    rxdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
-  */
 
   while ((c = getopt (argc, argv, "har:pf:g:n:s:S:x:y:z:N:F:T:R:")) != -1) {
     switch (c) {
@@ -311,10 +302,11 @@ int main(int argc, char **argv)
 		 n_rx,
 		 transmission_mode,
 		 extended_prefix_flag,
-		 Nid_cell,
 		 FDD,
+		 Nid_cell,
 		 3,
 		 N_RB_DL,
+		 0,
 		 osf,
 		 0);
 
@@ -328,10 +320,10 @@ int main(int argc, char **argv)
 
   printf("SNR0 %f, SNR1 %f\n",snr0,snr1);
 
-  frame_parms = &PHY_vars_eNB->lte_frame_parms;
+  frame_parms = &eNB->frame_parms;
 
 
-  txdata = PHY_vars_eNB->lte_eNB_common_vars.txdata[eNB_id];
+  txdata = eNB->common_vars.txdata[eNB_id];
 
   s_re = malloc(2*sizeof(double*));
   s_im = malloc(2*sizeof(double*));
@@ -345,11 +337,11 @@ int main(int argc, char **argv)
 
 
   printf("[SIM] Using SCM/101\n");
-  UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
-                                PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
+  UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
+                                UE->frame_parms.nb_antennas_rx,
                                 channel_model,
- 				N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
-				N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
+ 				N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
+				N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
                                 0.0,
                                 0,
                                 0);
@@ -373,22 +365,22 @@ int main(int argc, char **argv)
     bzero(r_im[i],FRAME_LENGTH_COMPLEX_SAMPLES*sizeof(double));
   }
 
-  init_ncs_cell(&PHY_vars_eNB->lte_frame_parms,PHY_vars_eNB->ncs_cell);
+  init_ncs_cell(&eNB->frame_parms,eNB->ncs_cell);
 
-  init_ncs_cell(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->ncs_cell);
+  init_ncs_cell(&UE->frame_parms,UE->ncs_cell);
 
-  PHY_vars_eNB->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
-  PHY_vars_eNB->lte_frame_parms.pucch_config_common.nRB_CQI          = 0;
-  PHY_vars_eNB->lte_frame_parms.pucch_config_common.nCS_AN           = 0;
-  PHY_vars_UE->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
-  PHY_vars_UE->lte_frame_parms.pucch_config_common.nRB_CQI          = 0;
-  PHY_vars_UE->lte_frame_parms.pucch_config_common.nCS_AN           = 0;
+  eNB->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
+  eNB->frame_parms.pucch_config_common.nRB_CQI          = 0;
+  eNB->frame_parms.pucch_config_common.nCS_AN           = 0;
+  UE->frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
+  UE->frame_parms.pucch_config_common.nRB_CQI          = 0;
+  UE->frame_parms.pucch_config_common.nCS_AN           = 0;
 
   pucch_payload = 0;
 
-  generate_pucch(PHY_vars_UE->lte_ue_common_vars.txdataF,
+  generate_pucch(UE->common_vars.txdataF,
                  frame_parms,
-                 PHY_vars_UE->ncs_cell,
+                 UE->ncs_cell,
                  pucch_format,
                  &pucch_config_dedicated,
                  n1_pucch,
@@ -397,34 +389,34 @@ int main(int argc, char **argv)
                  &pucch_payload,
                  AMP, //amp,
                  subframe); //subframe
-  write_output("txsigF0.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1);
+  write_output("txsigF0.m","txsF0", &UE->common_vars.txdataF[0][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX*nsymb,1,1);
 
   tx_lev = 0;
 
 
 
-  for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
+  for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
     if (frame_parms->Ncp == 1)
-      PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],        // input,
-                   &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],         // output
+      PHY_ofdm_mod(&UE->common_vars.txdataF[aa][2*subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],        // input,
+                   &txdata[aa][eNB->frame_parms.samples_per_tti*subframe],         // output
                    frame_parms->ofdm_symbol_size,
                    nsymb,                 // number of symbols
                    frame_parms->nb_prefix_samples,               // number of prefix samples
                    CYCLIC_PREFIX);
     else {
-      normal_prefix_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[eNB_id][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],
-                        &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],
+      normal_prefix_mod(&UE->common_vars.txdataF[eNB_id][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],
+                        &txdata[aa][eNB->frame_parms.samples_per_tti*subframe],
                         nsymb,
                         frame_parms);
-      //apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],subframe<<1);
-      //apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],1+(subframe<<1));
-      apply_7_5_kHz(PHY_vars_UE,&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],0);
-      apply_7_5_kHz(PHY_vars_UE,&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],1);
+      //apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1);
+      //apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1));
+      apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],0);
+      apply_7_5_kHz(UE,&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],1);
 
 
     }
 
-    tx_lev += signal_energy(&txdata[aa][subframe*PHY_vars_eNB->lte_frame_parms.samples_per_tti],
+    tx_lev += signal_energy(&txdata[aa][subframe*eNB->frame_parms.samples_per_tti],
                             OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
   }
 
@@ -436,7 +428,7 @@ int main(int argc, char **argv)
   // multipath channel
 
   for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
-    for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
+    for (aa=0; aa<eNB->frame_parms.nb_antennas_tx; aa++) {
       s_re[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)]);
       s_im[aa][i] = ((double)(((short *)&txdata[aa][subframe*frame_parms->samples_per_tti]))[(i<<1)+1]);
     }
@@ -498,17 +490,17 @@ int main(int argc, char **argv)
         //printf("n_trial %d\n",n_trials);
         // fill measurement symbol (19) with noise
         for (i=0; i<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
-          for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
+          for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
 
-            ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
-            ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+            ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+            ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
           }
         }
 
 
 
         for (i=0; i<2*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
-          for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
+          for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
             if (n_trials==0) {
               //    r_re[aa][i] += (pow(10.0,.05*interf1)*r_re1[aa][i] + pow(10.0,.05*interf2)*r_re2[aa][i]);
               //    r_im[aa][i] += (pow(10.0,.05*interf1)*r_im1[aa][i] + pow(10.0,.05*interf2)*r_im2[aa][i]);
@@ -516,31 +508,31 @@ int main(int argc, char **argv)
 
 
             if (sig==1) {
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(
+              ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) (((tx_gain*r_re[aa][i]) +sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+              ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) (((tx_gain*r_im[aa][i]) + (iqim*r_re[aa][i]*tx_gain) + sqrt(sigma2/2)*gaussdouble(
                     0.0,1.0)));
             } else {
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+              ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+              ((short*) &eNB->common_vars.rxdata[0][aa][subframe*frame_parms->samples_per_tti])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
 
             }
           }
         }
 
-        remove_7_5_kHz(PHY_vars_eNB,subframe<<1);
-        remove_7_5_kHz(PHY_vars_eNB,1+(subframe<<1));
+        remove_7_5_kHz(eNB,subframe<<1);
+        remove_7_5_kHz(eNB,1+(subframe<<1));
 
-        for (l=0; l<PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2; l++) {
+        for (l=0; l<eNB->frame_parms.symbols_per_tti/2; l++) {
 
-          slot_fep_ul(&PHY_vars_eNB->lte_frame_parms,
-                      &PHY_vars_eNB->lte_eNB_common_vars,
+          slot_fep_ul(&eNB->frame_parms,
+                      &eNB->common_vars,
                       l,
                       subframe*2,// slot
                       0,
                       0
                      );
-          slot_fep_ul(&PHY_vars_eNB->lte_frame_parms,
-                      &PHY_vars_eNB->lte_eNB_common_vars,
+          slot_fep_ul(&eNB->frame_parms,
+                      &eNB->common_vars,
                       l,
                       1+(subframe*2),//slot
                       0,
@@ -553,12 +545,12 @@ int main(int argc, char **argv)
 
         //      if (sig == 1)
         //    printf("*");
-        lte_eNB_I0_measurements(PHY_vars_eNB,
+        lte_eNB_I0_measurements(eNB,
                                 subframe,
 				0,
                                 1);
-        PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size/(12*NB_RB)));
-        stat = rx_pucch(PHY_vars_eNB,
+        eNB->measurements[0].n0_power_tot_dB = N0;//(int8_t)(sigma2_dB-10*log10(eNB->frame_parms.ofdm_symbol_size/(12*NB_RB)));
+        stat = rx_pucch(eNB,
                         pucch_format,
                         0,
                         n1_pucch,
@@ -593,7 +585,7 @@ int main(int argc, char **argv)
     }
 
     if (pucch_format==pucch_format1)
-      printf("pucch_trials %d : pucch1_false %d,pucch1_missed %d, N0 %d dB, stat_no_sig %f dB, stat_sig %f dB\n",pucch_tx,pucch1_false,pucch1_missed,PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB,
+      printf("pucch_trials %d : pucch1_false %d,pucch1_missed %d, N0 %d dB, stat_no_sig %f dB, stat_sig %f dB\n",pucch_tx,pucch1_false,pucch1_missed,eNB->measurements[0].n0_power_tot_dB,
              10*log10(stat_no_sig),10*log10(stat_sig));
     else if (pucch_format==pucch_format1a)
       printf("pucch_trials %d : pucch1a_errors %d\n",pucch_tx,pucch1_false);
@@ -605,8 +597,8 @@ int main(int argc, char **argv)
   if (n_frames==1) {
     //write_output("txsig0.m","txs0", &txdata[0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1);
     write_output("txsig0pucch.m", "txs0", &txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES,1,1);
-    write_output("rxsig0.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1);
-    write_output("rxsigF0.m","rxsF0", &PHY_vars_eNB->lte_eNB_common_vars.rxdataF[0][0][0],512*nsymb*2,2,1);
+    write_output("rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0][subframe*frame_parms->samples_per_tti],frame_parms->samples_per_tti,1,1);
+    write_output("rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0][0],512*nsymb*2,2,1);
   }
 
 
diff --git a/openair1/SIMULATION/LTE_PHY/ulsim.c b/openair1/SIMULATION/LTE_PHY/ulsim.c
index 56f8eb146a6980542034d137d559fc22dfe4a747..96c0083f94841d7a23eab8247a9b5aaf75a65294 100644
--- a/openair1/SIMULATION/LTE_PHY/ulsim.c
+++ b/openair1/SIMULATION/LTE_PHY/ulsim.c
@@ -51,13 +51,15 @@
 #include "LAYER2/MAC/vars.h"
 #include "OCG_vars.h"
 
+#include "unitary_defs.h"
+
 #include "PHY/TOOLS/lte_phy_scope.h"
 
-extern unsigned short dftsizes[33];
-extern short *ul_ref_sigs[30][2][33];
+PHY_VARS_eNB *eNB;
+PHY_VARS_UE *UE;
+
+
 
-PHY_VARS_eNB *PHY_vars_eNB;
-PHY_VARS_UE *PHY_vars_UE;
 
 //#define MCS_COUNT 23//added for PHY abstraction
 
@@ -186,7 +188,6 @@ int main(int argc, char **argv)
   uint8_t max_turbo_iterations=4;
   uint8_t llr8_flag=0;
   int nb_rb_set = 0;
-  int sf;
 
   int threequarter_fs=0;
   opp_enabled=1; // to enable the time meas
@@ -478,9 +479,9 @@ int main(int argc, char **argv)
 		 0);
 
   if (nb_rb_set == 0)
-    nb_rb = PHY_vars_eNB->lte_frame_parms.N_RB_UL;
+    nb_rb = eNB->frame_parms.N_RB_UL;
 
-  printf("1 . rxdataF_comp[0] %p\n",PHY_vars_eNB->lte_eNB_pusch_vars[0]->rxdataF_comp[0][0]);
+  printf("1 . rxdataF_comp[0] %p\n",eNB->pusch_vars[0]->rxdataF_comp[0][0]);
   printf("Setting mcs = %d\n",mcs);
   printf("n_frames = %d\n", n_frames);
 
@@ -497,9 +498,9 @@ int main(int argc, char **argv)
     txdata[1] = (int *)malloc16(FRAME_LENGTH_BYTES);
   */
 
-  frame_parms = &PHY_vars_eNB->lte_frame_parms;
+  frame_parms = &eNB->frame_parms;
 
-  txdata = PHY_vars_UE->lte_ue_common_vars.txdata;
+  txdata = UE->common_vars.txdata;
 
 
   s_re = malloc(2*sizeof(double*));
@@ -509,7 +510,7 @@ int main(int argc, char **argv)
   //  r_re0 = malloc(2*sizeof(double*));
   //  r_im0 = malloc(2*sizeof(double*));
 
-  nsymb = (PHY_vars_eNB->lte_frame_parms.Ncp == NORMAL) ? 14 : 12;
+  nsymb = (eNB->frame_parms.Ncp == NORMAL) ? 14 : 12;
 
 
   sprintf(bler_fname,"ULbler_mcs%d_nrb%d_ChannelModel%d_nsim%d.csv",mcs,nb_rb,chMod,n_frames);
@@ -594,40 +595,40 @@ int main(int argc, char **argv)
     fl_show_form (form_enb->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
   }
 
-  PHY_vars_UE->lte_ue_pdcch_vars[0]->crnti = 14;
+  UE->pdcch_vars[0]->crnti = 14;
 
-  PHY_vars_UE->lte_frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
-  PHY_vars_UE->lte_frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7;
-  PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = 0;
-  PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = 0;
-  PHY_vars_UE->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = 0;
+  UE->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
+  UE->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7;
+  UE->soundingrs_ul_config_dedicated[eNB_id].srs_Bandwidth = 0;
+  UE->soundingrs_ul_config_dedicated[eNB_id].transmissionComb = 0;
+  UE->soundingrs_ul_config_dedicated[eNB_id].freqDomainPosition = 0;
 
-  PHY_vars_eNB->lte_frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
-  PHY_vars_eNB->lte_frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7;
+  eNB->frame_parms.soundingrs_ul_config_common.srs_BandwidthConfig = 2;
+  eNB->frame_parms.soundingrs_ul_config_common.srs_SubframeConfig = 7;
 
-  PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 1;
-  PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = 0;
-  PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = 0;
-  PHY_vars_eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = 0;
-  PHY_vars_eNB->cooperation_flag = cooperation_flag;
-  //  PHY_vars_eNB->eNB_UE_stats[0].SRS_parameters = PHY_vars_UE->SRS_parameters;
+  eNB->soundingrs_ul_config_dedicated[UE_id].srs_ConfigIndex = 1;
+  eNB->soundingrs_ul_config_dedicated[UE_id].srs_Bandwidth = 0;
+  eNB->soundingrs_ul_config_dedicated[UE_id].transmissionComb = 0;
+  eNB->soundingrs_ul_config_dedicated[UE_id].freqDomainPosition = 0;
+  eNB->cooperation_flag = cooperation_flag;
+  //  eNB->eNB_UE_stats[0].SRS_parameters = UE->SRS_parameters;
 
-  PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK;
-  PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index  = beta_RI;
-  PHY_vars_eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI;
-  PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK;
-  PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_RI_Index  = beta_RI;
-  PHY_vars_UE->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI;
+  eNB->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK;
+  eNB->pusch_config_dedicated[UE_id].betaOffset_RI_Index  = beta_RI;
+  eNB->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI;
+  UE->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK;
+  UE->pusch_config_dedicated[eNB_id].betaOffset_RI_Index  = beta_RI;
+  UE->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI;
 
-  PHY_vars_UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1;
+  UE->ul_power_control_dedicated[eNB_id].deltaMCS_Enabled = 1;
 
   printf("PUSCH Beta : ACK %f, RI %f, CQI %f\n",(double)beta_ack[beta_ACK]/8,(double)beta_ri[beta_RI]/8,(double)beta_cqi[beta_CQI]/8);
 
-  UE2eNB = new_channel_desc_scm(PHY_vars_eNB->lte_frame_parms.nb_antennas_tx,
-                                PHY_vars_UE->lte_frame_parms.nb_antennas_rx,
+  UE2eNB = new_channel_desc_scm(eNB->frame_parms.nb_antennas_tx,
+                                UE->frame_parms.nb_antennas_rx,
                                 channel_model,
-				N_RB2sampling_rate(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
-				N_RB2channel_bandwidth(PHY_vars_eNB->lte_frame_parms.N_RB_UL),
+				N_RB2sampling_rate(eNB->frame_parms.N_RB_UL),
+				N_RB2channel_bandwidth(eNB->frame_parms.N_RB_UL),
                                 forgetting_factor,
                                 delay,
                                 0);
@@ -635,39 +636,39 @@ int main(int argc, char **argv)
   UE2eNB->max_Doppler = maxDoppler;
 
   // NN: N_RB_UL has to be defined in ulsim
-  PHY_vars_eNB->ulsch_eNB[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0);
-  PHY_vars_UE->ulsch_ue[0]   = new_ue_ulsch(N_RB_DL,0);
+  eNB->ulsch[0] = new_eNB_ulsch(max_turbo_iterations,N_RB_DL,0);
+  UE->ulsch[0]   = new_ue_ulsch(N_RB_DL,0);
 
   // Create transport channel structures for 2 transport blocks (MIMO)
   for (i=0; i<2; i++) {
-    PHY_vars_eNB->dlsch_eNB[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0);
-    PHY_vars_UE->dlsch_ue[0][i]  = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
+    eNB->dlsch[0][i] = new_eNB_dlsch(1,8,1827072,N_RB_DL,0);
+    UE->dlsch[0][i]  = new_ue_dlsch(1,8,1827072,MAX_TURBO_ITERATIONS,N_RB_DL,0);
 
-    if (!PHY_vars_eNB->dlsch_eNB[0][i]) {
+    if (!eNB->dlsch[0][i]) {
       printf("Can't get eNB dlsch structures\n");
       exit(-1);
     }
 
-    if (!PHY_vars_UE->dlsch_ue[0][i]) {
+    if (!UE->dlsch[0][i]) {
       printf("Can't get ue dlsch structures\n");
       exit(-1);
     }
 
-    PHY_vars_eNB->dlsch_eNB[0][i]->rnti = 14;
-    PHY_vars_UE->dlsch_ue[0][i]->rnti   = 14;
+    eNB->dlsch[0][i]->rnti = 14;
+    UE->dlsch[0][i]->rnti   = 14;
 
   } 
 
 
-  switch (PHY_vars_eNB->lte_frame_parms.N_RB_UL) {
+  switch (eNB->frame_parms.N_RB_UL) {
   case 6:
     break;
 
   case 25:
-    if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+    if (eNB->frame_parms.frame_type == TDD) {
       ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->type    = 0;
-      ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
-      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
+      ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
+      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
       ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs     = mcs;
       ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi     = 1;
       ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC     = 0;
@@ -676,8 +677,8 @@ int main(int argc, char **argv)
       ((DCI0_5MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai     = 1;
     } else {
       ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->type    = 0;
-      ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
-      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
+      ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
+      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
       ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->mcs     = mcs;
       ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->ndi     = 1;
       ((DCI0_5MHz_FDD_t*)&UL_alloc_pdu)->TPC     = 0;
@@ -688,10 +689,10 @@ int main(int argc, char **argv)
     break;
 
   case 50:
-    if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+    if (eNB->frame_parms.frame_type == TDD) {
       ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->type    = 0;
-      ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
-      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
+      ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
+      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
       ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs     = mcs;
       ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi     = 1;
       ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC     = 0;
@@ -700,8 +701,8 @@ int main(int argc, char **argv)
       ((DCI0_10MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai     = 1;
     } else {
       ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->type    = 0;
-      ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
-      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
+      ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
+      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
       ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->mcs     = mcs;
       ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->ndi     = 1;
       ((DCI0_10MHz_FDD_t*)&UL_alloc_pdu)->TPC     = 0;
@@ -712,10 +713,10 @@ int main(int argc, char **argv)
     break;
 
   case 100:
-    if (PHY_vars_eNB->lte_frame_parms.frame_type == TDD) {
+    if (eNB->frame_parms.frame_type == TDD) {
       ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->type    = 0;
-      ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
-      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
+      ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
+      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
       ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->mcs     = mcs;
       ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->ndi     = 1;
       ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->TPC     = 0;
@@ -724,8 +725,8 @@ int main(int argc, char **argv)
       ((DCI0_20MHz_TDD_1_6_t*)&UL_alloc_pdu)->dai     = 1;
     } else {
       ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->type    = 0;
-      ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(PHY_vars_eNB->lte_frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
-      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,PHY_vars_eNB->lte_frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
+      ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc = computeRIV(eNB->frame_parms.N_RB_UL,first_rb,nb_rb);// 12 RBs from position 8
+      printf("nb_rb %d/%d, rballoc %d (dci %x)\n",nb_rb,eNB->frame_parms.N_RB_UL,((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->rballoc,*(uint32_t *)&UL_alloc_pdu);
       ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->mcs     = mcs;
       ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->ndi     = 1;
       ((DCI0_20MHz_FDD_t*)&UL_alloc_pdu)->TPC     = 0;
@@ -740,47 +741,45 @@ int main(int argc, char **argv)
   }
 
 
-  PHY_vars_UE->PHY_measurements.rank[0] = 0;
-  PHY_vars_UE->transmission_mode[0] = 2;
-  PHY_vars_UE->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing;
-  PHY_vars_eNB->transmission_mode[0] = 2;
-  PHY_vars_eNB->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing;
-  PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
-  PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
-  PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
-  PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
-  PHY_vars_UE->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
-  PHY_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
-  PHY_vars_UE->frame_tx=1;
-
-  for (sf=0; sf<10; sf++) {
-    PHY_vars_eNB->proc[sf].frame_tx=1;
-    PHY_vars_eNB->proc[sf].subframe_tx=sf;
-    PHY_vars_eNB->proc[sf].frame_rx=1;
-    PHY_vars_eNB->proc[sf].subframe_rx=sf;
-  }
+  UE->measurements.rank[0] = 0;
+  UE->transmission_mode[0] = 2;
+  UE->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing;
+  eNB->transmission_mode[0] = 2;
+  eNB->pucch_config_dedicated[0].tdd_AckNackFeedbackMode = bundling_flag == 1 ? bundling : multiplexing;
+  UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
+  eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 1;
+  UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
+  eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
+  UE->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
+  eNB->frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
+
+  
+
+
+  eNB->proc.frame_rx=1;
+  eNB->proc.subframe_rx=subframe;
+
+  eNB->proc.frame_tx=pdcch_alloc2ul_frame(&eNB->frame_parms,1,subframe);
+  eNB->proc.subframe_tx=pdcch_alloc2ul_subframe(&eNB->frame_parms,subframe);
+
+  UE->frame_tx = eNB->proc.frame_rx;
+  UE->frame_rx = eNB->proc.frame_tx;
 
   printf("Init UL hopping UE\n");
-  init_ul_hopping(&PHY_vars_UE->lte_frame_parms);
+  init_ul_hopping(&UE->frame_parms);
   printf("Init UL hopping eNB\n");
-  init_ul_hopping(&PHY_vars_eNB->lte_frame_parms);
+  init_ul_hopping(&eNB->frame_parms);
 
-  PHY_vars_eNB->proc[subframe].frame_rx = PHY_vars_UE->frame_tx;
 
-  if (ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe) > subframe) // allocation was in previous frame
-    PHY_vars_eNB->proc[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].frame_tx = (PHY_vars_UE->frame_tx-1)&1023;
+  UE->dlsch[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&eNB->frame_parms,subframe)].send_harq_status = 1;
 
-  PHY_vars_UE->dlsch_ue[0][0]->harq_ack[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].send_harq_status = 1;
 
 
-  //  printf("UE frame %d, eNB frame %d (eNB frame_tx %d)\n",PHY_vars_UE->frame,PHY_vars_eNB->proc[subframe].frame_rx,PHY_vars_eNB->proc[ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe)].frame_tx);
-  PHY_vars_UE->frame_tx = (PHY_vars_UE->frame_tx-1)&1023;
-
   generate_ue_ulsch_params_from_dci((void *)&UL_alloc_pdu,
                                     14,
-                                    ul_subframe2pdcch_alloc_subframe(&PHY_vars_UE->lte_frame_parms,subframe),
+                                    eNB->proc.subframe_tx,
                                     format0,
-                                    PHY_vars_UE,
+                                    UE,
                                     SI_RNTI,
                                     0,
                                     P_RNTI,
@@ -790,13 +789,12 @@ int main(int argc, char **argv)
 
   //  printf("RIV %d\n",UL_alloc_pdu.rballoc);
 
-  generate_eNB_ulsch_params_from_dci((void *)&UL_alloc_pdu,
+  generate_eNB_ulsch_params_from_dci(eNB,
+				     (void *)&UL_alloc_pdu,
                                      14,
-                                     ul_subframe2pdcch_alloc_subframe(&PHY_vars_eNB->lte_frame_parms,subframe),
                                      format0,
                                      0,
-                                     PHY_vars_eNB,
-                                     SI_RNTI,
+				     SI_RNTI,
                                      0,
                                      P_RNTI,
                                      CBA_RNTI,
@@ -804,15 +802,13 @@ int main(int argc, char **argv)
 
   coded_bits_per_codeword = nb_rb * (12 * get_Qm_ul(mcs)) * nsymb;
 
-  if (cqi_flag == 1) coded_bits_per_codeword-=PHY_vars_UE->ulsch_ue[0]->O;
+  if (cqi_flag == 1) coded_bits_per_codeword-=UE->ulsch[0]->O;
 
   rate = (double)dlsch_tbs25[get_I_TBS(mcs)][nb_rb-1]/(coded_bits_per_codeword);
 
   printf("Rate = %f (mod %d), coded bits %d\n",rate,get_Qm_ul(mcs),coded_bits_per_codeword);
 
 
-  PHY_vars_UE->frame_tx = (PHY_vars_UE->frame_tx+1)&1023;
-
 
   for (ch_realization=0; ch_realization<n_ch_rlz; ch_realization++) {
 
@@ -830,7 +826,7 @@ int main(int argc, char **argv)
 
 
     //    if ((subframe>5) || (subframe < 4))
-    //      PHY_vars_UE->frame++;
+    //      UE->frame++;
 
     for (SNR=snr0; SNR<snr1; SNR+=input_snr_step) {
       errs[0]=0;
@@ -850,10 +846,10 @@ int main(int argc, char **argv)
       //randominit(0);
 
 
-      harq_pid = subframe2harq_pid(&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->frame_tx,subframe);
-      input_buffer_length = PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/8;
+      harq_pid = subframe2harq_pid(&UE->frame_parms,UE->frame_tx,subframe);
+      input_buffer_length = UE->ulsch[0]->harq_processes[harq_pid]->TBS/8;
       input_buffer = (unsigned char *)malloc(input_buffer_length+4);
-      //      printf("UL frame %d/subframe %d, harq_pid %d\n",PHY_vars_UE->frame,subframe,harq_pid);
+      //      printf("UL frame %d/subframe %d, harq_pid %d\n",UE->frame,subframe,harq_pid);
       if (input_fdUL == NULL) {
 
 
@@ -904,33 +900,33 @@ int main(int argc, char **argv)
 
       avg_iter = 0;
       iter_trials=0;
-      reset_meas(&PHY_vars_UE->phy_proc_tx);
-      reset_meas(&PHY_vars_UE->ofdm_mod_stats);
-      reset_meas(&PHY_vars_UE->ulsch_modulation_stats);
-      reset_meas(&PHY_vars_UE->ulsch_encoding_stats);
-      reset_meas(&PHY_vars_UE->ulsch_interleaving_stats);
-      reset_meas(&PHY_vars_UE->ulsch_rate_matching_stats);
-      reset_meas(&PHY_vars_UE->ulsch_turbo_encoding_stats);
-      reset_meas(&PHY_vars_UE->ulsch_segmentation_stats);
-      reset_meas(&PHY_vars_UE->ulsch_multiplexing_stats);
-
-      reset_meas(&PHY_vars_eNB->phy_proc_rx);
-      reset_meas(&PHY_vars_eNB->ofdm_demod_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_channel_estimation_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_freq_offset_estimation_stats);
-      reset_meas(&PHY_vars_eNB->rx_dft_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_decoding_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_turbo_decoding_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_deinterleaving_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_demultiplexing_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_rate_unmatching_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_tc_init_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_tc_alpha_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_tc_beta_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_tc_gamma_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_tc_ext_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_tc_intl1_stats);
-      reset_meas(&PHY_vars_eNB->ulsch_tc_intl2_stats);
+      reset_meas(&UE->phy_proc_tx);
+      reset_meas(&UE->ofdm_mod_stats);
+      reset_meas(&UE->ulsch_modulation_stats);
+      reset_meas(&UE->ulsch_encoding_stats);
+      reset_meas(&UE->ulsch_interleaving_stats);
+      reset_meas(&UE->ulsch_rate_matching_stats);
+      reset_meas(&UE->ulsch_turbo_encoding_stats);
+      reset_meas(&UE->ulsch_segmentation_stats);
+      reset_meas(&UE->ulsch_multiplexing_stats);
+
+      reset_meas(&eNB->phy_proc_rx);
+      reset_meas(&eNB->ofdm_demod_stats);
+      reset_meas(&eNB->ulsch_channel_estimation_stats);
+      reset_meas(&eNB->ulsch_freq_offset_estimation_stats);
+      reset_meas(&eNB->rx_dft_stats);
+      reset_meas(&eNB->ulsch_decoding_stats);
+      reset_meas(&eNB->ulsch_turbo_decoding_stats);
+      reset_meas(&eNB->ulsch_deinterleaving_stats);
+      reset_meas(&eNB->ulsch_demultiplexing_stats);
+      reset_meas(&eNB->ulsch_rate_unmatching_stats);
+      reset_meas(&eNB->ulsch_tc_init_stats);
+      reset_meas(&eNB->ulsch_tc_alpha_stats);
+      reset_meas(&eNB->ulsch_tc_beta_stats);
+      reset_meas(&eNB->ulsch_tc_gamma_stats);
+      reset_meas(&eNB->ulsch_tc_ext_stats);
+      reset_meas(&eNB->ulsch_tc_intl1_stats);
+      reset_meas(&eNB->ulsch_tc_intl2_stats);
 
       // initialization
       struct list time_vector_tx;
@@ -953,28 +949,28 @@ int main(int argc, char **argv)
 
       for (trials = 0; trials<n_frames; trials++) {
         //      printf("*");
-        //        PHY_vars_UE->frame++;
-        //        PHY_vars_eNB->frame++;
+        //        UE->frame++;
+        //        eNB->frame++;
 
         fflush(stdout);
         round=0;
 
         while (round < 4) {
-          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->round=round;
-          PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->round=round;
+          eNB->ulsch[0]->harq_processes[harq_pid]->round=round;
+          UE->ulsch[0]->harq_processes[harq_pid]->round=round;
           //  printf("Trial %d : Round %d ",trials,round);
           round_trials[round]++;
 
           if (round == 0) {
-            //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 1;
-            PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1;
-            //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 1;
-            PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1;
+            //eNB->ulsch[0]->harq_processes[harq_pid]->Ndi = 1;
+            eNB->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1;
+            //UE->ulsch[0]->harq_processes[harq_pid]->Ndi = 1;
+            UE->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1;
           } else {
-            //PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Ndi = 0;
-            PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->rvidx = round>>1;
-            //PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->Ndi = 0;
-            PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->rvidx = round>>1;
+            //eNB->ulsch[0]->harq_processes[harq_pid]->Ndi = 0;
+            eNB->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1;
+            //UE->ulsch[0]->harq_processes[harq_pid]->Ndi = 0;
+            UE->ulsch[0]->harq_processes[harq_pid]->rvidx = round>>1;
           }
 
 
@@ -996,39 +992,39 @@ int main(int argc, char **argv)
 
           if (input_fdUL == NULL) {
 
-            start_meas(&PHY_vars_UE->phy_proc_tx);
+            start_meas(&UE->phy_proc_tx);
 
 #ifdef OFDMA_ULSCH
 
             if (srs_flag)
-              generate_srs_tx(PHY_vars_UE,0,AMP,subframe);
+              generate_srs_tx(UE,0,AMP,subframe);
 
-            generate_drs_pusch(PHY_vars_UE,0,AMP,subframe,first_rb,nb_rb,0);
+            generate_drs_pusch(UE,0,AMP,subframe,first_rb,nb_rb,0);
 
 #else
 
             if (srs_flag)
-              generate_srs_tx(PHY_vars_UE,0,AMP,subframe);
+              generate_srs_tx(UE,0,AMP,subframe);
 
-            generate_drs_pusch(PHY_vars_UE,0,
+            generate_drs_pusch(UE,0,
                                AMP,subframe,
-                               PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->first_rb,
-                               PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->nb_rb,
+                               UE->ulsch[0]->harq_processes[harq_pid]->first_rb,
+                               UE->ulsch[0]->harq_processes[harq_pid]->nb_rb,
                                0);
 #endif
 
             if ((cqi_flag == 1) && (n_frames == 1) ) {
-              printf("CQI information (O %d) %d %d\n",PHY_vars_UE->ulsch_ue[0]->O,
-                     PHY_vars_UE->ulsch_ue[0]->o[0],PHY_vars_UE->ulsch_ue[0]->o[1]);
-              print_CQI(PHY_vars_UE->ulsch_ue[0]->o,PHY_vars_UE->ulsch_ue[0]->uci_format,PHY_vars_UE->lte_frame_parms.N_RB_DL,0);
+              printf("CQI information (O %d) %d %d\n",UE->ulsch[0]->O,
+                     UE->ulsch[0]->o[0],UE->ulsch[0]->o[1]);
+              print_CQI(UE->ulsch[0]->o,UE->ulsch[0]->uci_format,UE->frame_parms.N_RB_DL,0);
             }
 
-            PHY_vars_UE->ulsch_ue[0]->o_ACK[0] = taus()&1;
+            UE->ulsch[0]->o_ACK[0] = taus()&1;
 
-            start_meas(&PHY_vars_UE->ulsch_encoding_stats);
+            start_meas(&UE->ulsch_encoding_stats);
 
             if (ulsch_encoding(input_buffer,
-                               PHY_vars_UE,
+                               UE,
                                harq_pid,
                                eNB_id,
                                2, // transmission mode
@@ -1039,52 +1035,52 @@ int main(int argc, char **argv)
               exit(-1);
             }
 
-            stop_meas(&PHY_vars_UE->ulsch_encoding_stats);
+            stop_meas(&UE->ulsch_encoding_stats);
 
-            start_meas(&PHY_vars_UE->ulsch_modulation_stats);
+            start_meas(&UE->ulsch_modulation_stats);
 #ifdef OFDMA_ULSCH
-            ulsch_modulation(PHY_vars_UE->lte_ue_common_vars.txdataF,AMP,
-                             PHY_vars_UE->frame_tx,subframe,&PHY_vars_UE->lte_frame_parms,PHY_vars_UE->ulsch_ue[0]);
+            ulsch_modulation(UE->common_vars.txdataF,AMP,
+                             UE->frame_tx,subframe,&UE->frame_parms,UE->ulsch[0]);
 #else
             //    printf("Generating PUSCH in subframe %d with amp %d, nb_rb %d\n",subframe,AMP,nb_rb);
-            ulsch_modulation(PHY_vars_UE->lte_ue_common_vars.txdataF,AMP,
-                             PHY_vars_UE->frame_tx,subframe,&PHY_vars_UE->lte_frame_parms,
-                             PHY_vars_UE->ulsch_ue[0]);
+            ulsch_modulation(UE->common_vars.txdataF,AMP,
+                             UE->frame_tx,subframe,&UE->frame_parms,
+                             UE->ulsch[0]);
 #endif
-            stop_meas(&PHY_vars_UE->ulsch_modulation_stats);
+            stop_meas(&UE->ulsch_modulation_stats);
 
             if (n_frames==1) {
-              write_output("txsigF0UL.m","txsF0", &PHY_vars_UE->lte_ue_common_vars.txdataF[0][PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb*subframe],PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size*nsymb,1,
+              write_output("txsigF0UL.m","txsF0", &UE->common_vars.txdataF[0][eNB->frame_parms.ofdm_symbol_size*nsymb*subframe],eNB->frame_parms.ofdm_symbol_size*nsymb,1,
                            1);
-              //write_output("txsigF1.m","txsF1", PHY_vars_UE->lte_ue_common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
+              //write_output("txsigF1.m","txsF1", UE->common_vars.txdataF[0],FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX,1,1);
             }
 
             tx_lev=0;
-            start_meas(&PHY_vars_UE->ofdm_mod_stats);
+            start_meas(&UE->ofdm_mod_stats);
 
             for (aa=0; aa<1; aa++) {
               if (frame_parms->Ncp == EXTENDED)
-                PHY_ofdm_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],        // input
-                             &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],         // output
-                             PHY_vars_UE->lte_frame_parms.ofdm_symbol_size,
+                PHY_ofdm_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],        // input
+                             &txdata[aa][eNB->frame_parms.samples_per_tti*subframe],         // output
+                             UE->frame_parms.ofdm_symbol_size,
                              nsymb,                 // number of symbols
-                             PHY_vars_UE->lte_frame_parms.nb_prefix_samples,               // number of prefix samples
+                             UE->frame_parms.nb_prefix_samples,               // number of prefix samples
                              CYCLIC_PREFIX);
               else
-                normal_prefix_mod(&PHY_vars_UE->lte_ue_common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],
-                                  &txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],
+                normal_prefix_mod(&UE->common_vars.txdataF[aa][subframe*nsymb*OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES_NO_PREFIX],
+                                  &txdata[aa][eNB->frame_parms.samples_per_tti*subframe],
                                   nsymb,
                                   frame_parms);
 
 #ifndef OFDMA_ULSCH
-              apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],subframe<<1);
-              apply_7_5_kHz(PHY_vars_UE,PHY_vars_UE->lte_ue_common_vars.txdata[aa],1+(subframe<<1));
+              apply_7_5_kHz(UE,UE->common_vars.txdata[aa],subframe<<1);
+              apply_7_5_kHz(UE,UE->common_vars.txdata[aa],1+(subframe<<1));
 #endif
 
-              stop_meas(&PHY_vars_UE->ofdm_mod_stats);
-              stop_meas(&PHY_vars_UE->phy_proc_tx);
-              tx_lev += signal_energy(&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],
-                                      PHY_vars_eNB->lte_frame_parms.samples_per_tti);
+              stop_meas(&UE->ofdm_mod_stats);
+              stop_meas(&UE->phy_proc_tx);
+              tx_lev += signal_energy(&txdata[aa][eNB->frame_parms.samples_per_tti*subframe],
+                                      eNB->frame_parms.samples_per_tti);
 
             }
           }  // input_fd == NULL
@@ -1093,17 +1089,17 @@ int main(int argc, char **argv)
           tx_lev_dB = (unsigned int) dB_fixed_times10(tx_lev);
 
           if (n_frames==1) {
-            write_output("txsig0UL.m","txs0", &txdata[0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1);
-            //        write_output("txsig1UL.m","txs1", &txdata[1][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1);
+            write_output("txsig0UL.m","txs0", &txdata[0][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1);
+            //        write_output("txsig1UL.m","txs1", &txdata[1][eNB->frame_parms.samples_per_tti*subframe],2*frame_parms->samples_per_tti,1,1);
           }
 
           //AWGN
           //Set target wideband RX noise level to N0
-          sigma2_dB = N0;//10*log10((double)tx_lev)  +10*log10(PHY_vars_UE->lte_frame_parms.ofdm_symbol_size/(PHY_vars_UE->lte_frame_parms.N_RB_DL*12)) - SNR;
+          sigma2_dB = N0;//10*log10((double)tx_lev)  +10*log10(UE->frame_parms.ofdm_symbol_size/(UE->frame_parms.N_RB_DL*12)) - SNR;
           sigma2 = pow(10,sigma2_dB/10);
 
           // compute tx_gain to achieve target SNR (per resource element!)
-          tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)PHY_vars_UE->lte_frame_parms.ofdm_symbol_size)/(double)tx_lev);
+          tx_gain = sqrt(pow(10.0,.1*(N0+SNR))*(nb_rb*12/(double)UE->frame_parms.ofdm_symbol_size)/(double)tx_lev);
 
           if (n_frames==1)
             printf("tx_lev = %d (%d.%d dB,%f), gain %f\n",tx_lev,tx_lev_dB/10,tx_lev_dB,10*log10((double)tx_lev),10*log10(tx_gain));
@@ -1111,29 +1107,29 @@ int main(int argc, char **argv)
 
           // fill measurement symbol (19) with noise
           for (i=0; i<OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES; i++) {
-            for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
+            for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
 
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+              ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
+              ((short*) &eNB->common_vars.rxdata[0][aa][(frame_parms->samples_per_tti<<1) -frame_parms->ofdm_symbol_size])[2*i+1] = (short) ((sqrt(sigma2/2)*gaussdouble(0.0,1.0)));
             }
           }
 
           // multipath channel
 
-          for (i=0; i<PHY_vars_eNB->lte_frame_parms.samples_per_tti; i++) {
+          for (i=0; i<eNB->frame_parms.samples_per_tti; i++) {
             for (aa=0; aa<1; aa++) {
-              s_re[aa][i] = ((double)(((short *)&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe]))[(i<<1)]);
-              s_im[aa][i] = ((double)(((short *)&txdata[aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe]))[(i<<1)+1]);
+              s_re[aa][i] = ((double)(((short *)&txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)]);
+              s_im[aa][i] = ((double)(((short *)&txdata[aa][eNB->frame_parms.samples_per_tti*subframe]))[(i<<1)+1]);
             }
           }
 
           if (awgn_flag == 0) {
             if (UE2eNB->max_Doppler == 0) {
               multipath_channel(UE2eNB,s_re,s_im,r_re,r_im,
-                                PHY_vars_eNB->lte_frame_parms.samples_per_tti,hold_channel);
+                                eNB->frame_parms.samples_per_tti,hold_channel);
             } else {
               multipath_tv_channel(UE2eNB,s_re,s_im,r_re,r_im,
-                                   2*PHY_vars_eNB->lte_frame_parms.samples_per_tti,hold_channel);
+                                   2*eNB->frame_parms.samples_per_tti,hold_channel);
             }
           }
 
@@ -1169,61 +1165,61 @@ int main(int argc, char **argv)
           if (n_frames==1)
             printf("Sigma2 %f (sigma2_dB %f), tx_gain %f (%f dB)\n",sigma2,sigma2_dB,tx_gain,20*log10(tx_gain));
 
-          for (i=0; i<PHY_vars_eNB->lte_frame_parms.samples_per_tti; i++) {
-            for (aa=0; aa<PHY_vars_eNB->lte_frame_parms.nb_antennas_rx; aa++) {
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe])[2*i] = (short) ((tx_gain*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
-              ((short*) &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][aa][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe])[2*i+1] = (short) ((tx_gain*r_im[aa][i]) + (iqim*tx_gain*r_re[aa][i]) + sqrt(
+          for (i=0; i<eNB->frame_parms.samples_per_tti; i++) {
+            for (aa=0; aa<eNB->frame_parms.nb_antennas_rx; aa++) {
+              ((short*) &eNB->common_vars.rxdata[0][aa][eNB->frame_parms.samples_per_tti*subframe])[2*i] = (short) ((tx_gain*r_re[aa][i]) + sqrt(sigma2/2)*gaussdouble(0.0,1.0));
+              ((short*) &eNB->common_vars.rxdata[0][aa][eNB->frame_parms.samples_per_tti*subframe])[2*i+1] = (short) ((tx_gain*r_im[aa][i]) + (iqim*tx_gain*r_re[aa][i]) + sqrt(
                     sigma2/2)*gaussdouble(0.0,1.0));
             }
           }
 
           if (n_frames==1) {
             printf("rx_level Null symbol %f\n",10*log10((double)signal_energy((int*)
-                   &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][(PHY_vars_eNB->lte_frame_parms.samples_per_tti<<1) -PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
-            printf("rx_level data symbol %f\n",10*log10(signal_energy((int*)&PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][160+(PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe)],
+                   &eNB->common_vars.rxdata[0][0][(eNB->frame_parms.samples_per_tti<<1) -eNB->frame_parms.ofdm_symbol_size],OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
+            printf("rx_level data symbol %f\n",10*log10(signal_energy((int*)&eNB->common_vars.rxdata[0][0][160+(eNB->frame_parms.samples_per_tti*subframe)],
                    OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)));
           }
 
-          SNRmeas = 10*log10(((double)signal_energy((int*)&PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][160+(PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe)],
+          SNRmeas = 10*log10(((double)signal_energy((int*)&eNB->common_vars.rxdata[0][0][160+(eNB->frame_parms.samples_per_tti*subframe)],
                               OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2))/((double)signal_energy((int*)
-                                  &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][(PHY_vars_eNB->lte_frame_parms.samples_per_tti<<1) -PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],
-                                  OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)) - 1)+10*log10(PHY_vars_eNB->lte_frame_parms.N_RB_UL/nb_rb);
+                                  &eNB->common_vars.rxdata[0][0][(eNB->frame_parms.samples_per_tti<<1) -eNB->frame_parms.ofdm_symbol_size],
+                                  OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES/2)) - 1)+10*log10(eNB->frame_parms.N_RB_UL/nb_rb);
 
           if (n_frames==1) {
             printf("SNRmeas %f\n",SNRmeas);
 
-            //    write_output("rxsig0UL.m","rxs0", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1);
-            //write_output("rxsig1UL.m","rxs1", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1);
+            //    write_output("rxsig0UL.m","rxs0", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
+            //write_output("rxsig1UL.m","rxs1", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
           }
 
 #ifndef OFDMA_ULSCH
-          remove_7_5_kHz(PHY_vars_eNB,subframe<<1);
-          remove_7_5_kHz(PHY_vars_eNB,1+(subframe<<1));
-          //  write_output("rxsig0_75.m","rxs0_75", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1);
-          //  write_output("rxsig1_75.m","rxs1_75", &PHY_vars_eNB->lte_eNB_common_vars.rxdata[0][0][PHY_vars_eNB->lte_frame_parms.samples_per_tti*subframe],PHY_vars_eNB->lte_frame_parms.samples_per_tti,1,1);
+          remove_7_5_kHz(eNB,subframe<<1);
+          remove_7_5_kHz(eNB,1+(subframe<<1));
+          //  write_output("rxsig0_75.m","rxs0_75", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
+          //  write_output("rxsig1_75.m","rxs1_75", &eNB->common_vars.rxdata[0][0][eNB->frame_parms.samples_per_tti*subframe],eNB->frame_parms.samples_per_tti,1,1);
 
 #endif
 
-          start_meas(&PHY_vars_eNB->phy_proc_rx);
-          start_meas(&PHY_vars_eNB->ofdm_demod_stats);
-          lte_eNB_I0_measurements(PHY_vars_eNB,
+          start_meas(&eNB->phy_proc_rx);
+          start_meas(&eNB->ofdm_demod_stats);
+          lte_eNB_I0_measurements(eNB,
 				  subframe,
                                   0,
                                   1);
 
-          for (l=subframe*PHY_vars_UE->lte_frame_parms.symbols_per_tti; l<((1+subframe)*PHY_vars_UE->lte_frame_parms.symbols_per_tti); l++) {
+          for (l=subframe*UE->frame_parms.symbols_per_tti; l<((1+subframe)*UE->frame_parms.symbols_per_tti); l++) {
 
-            slot_fep_ul(&PHY_vars_eNB->lte_frame_parms,
-                        &PHY_vars_eNB->lte_eNB_common_vars,
-                        l%(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2),
-                        l/(PHY_vars_eNB->lte_frame_parms.symbols_per_tti/2),
+            slot_fep_ul(&eNB->frame_parms,
+                        &eNB->common_vars,
+                        l%(eNB->frame_parms.symbols_per_tti/2),
+                        l/(eNB->frame_parms.symbols_per_tti/2),
                         0,
                         0);
           }
 
-          stop_meas(&PHY_vars_eNB->ofdm_demod_stats);
+          stop_meas(&eNB->ofdm_demod_stats);
 
-          PHY_vars_eNB->ulsch_eNB[0]->cyclicShift = cyclic_shift;// cyclic shift for DMRS
+          eNB->ulsch[0]->cyclicShift = cyclic_shift;// cyclic shift for DMRS
 
 	  /*
           if(abstx) {
@@ -1233,14 +1229,13 @@ int main(int argc, char **argv)
           }
 	  */
 
-          start_meas(&PHY_vars_eNB->ulsch_demodulation_stats);
-          rx_ulsch(PHY_vars_eNB,
-                   subframe,
+          start_meas(&eNB->ulsch_demodulation_stats);
+          rx_ulsch(eNB,
                    0,  // this is the effective sector id
                    0,  // this is the UE_id
-                   PHY_vars_eNB->ulsch_eNB,
+                   eNB->ulsch,
                    cooperation_flag);
-          stop_meas(&PHY_vars_eNB->ulsch_demodulation_stats);
+          stop_meas(&eNB->ulsch_demodulation_stats);
 
 	  /*
           if(abstx) {
@@ -1249,31 +1244,30 @@ int main(int argc, char **argv)
             if(trials==0 && round==0 && SNR==snr0) {
               char* namepointer ;
               namepointer = &fperen_name;
-              write_output(namepointer, "xxx" ,PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300,1,10);
+              write_output(namepointer, "xxx" ,eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300,1,10);
               namepointer = NULL ;
               // flagMag = 1;
             }
           }
 	  */
 
-          start_meas(&PHY_vars_eNB->ulsch_decoding_stats);
+          start_meas(&eNB->ulsch_decoding_stats);
 
-          ret= ulsch_decoding(PHY_vars_eNB,
+          ret= ulsch_decoding(eNB,
                               0, // UE_id
-                              subframe,
                               control_only_flag,
                               1,  // Nbundled
                               llr8_flag);
-          stop_meas(&PHY_vars_eNB->ulsch_decoding_stats);
-          stop_meas(&PHY_vars_eNB->phy_proc_rx);
+          stop_meas(&eNB->ulsch_decoding_stats);
+          stop_meas(&eNB->phy_proc_rx);
 
           if (cqi_flag > 0) {
             cqi_error = 0;
 
-            if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Or1 < 32) {
+            if (eNB->ulsch[0]->harq_processes[harq_pid]->Or1 < 32) {
               for (i=2; i<4; i++) {
-                //                printf("cqi %d : %d (%d)\n",i,PHY_vars_eNB->ulsch_eNB[0]->o[i],PHY_vars_UE->ulsch_ue[0]->o[i]);
-                if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o[i] != PHY_vars_UE->ulsch_ue[0]->o[i])
+                //                printf("cqi %d : %d (%d)\n",i,eNB->ulsch[0]->o[i],UE->ulsch[0]->o[i]);
+                if (eNB->ulsch[0]->harq_processes[harq_pid]->o[i] != UE->ulsch[0]->o[i])
                   cqi_error = 1;
               }
             } else {
@@ -1283,33 +1277,33 @@ int main(int argc, char **argv)
             if (cqi_error == 1) {
               cqi_errors++;
 
-              if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status == 1)
+              if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status == 1)
                 cqi_crc_falsepositives++;
             } else {
-              if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status == 0)
+              if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status == 0)
                 cqi_crc_falsenegatives++;
             }
           }
 
-          if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0] != PHY_vars_UE->ulsch_ue[0]->o_ACK[0])
+          if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] != UE->ulsch[0]->o_ACK[0])
             ack_errors++;
 
           //    printf("ulsch_coding: O[%d] %d\n",i,o_flip[i]);
 
 
-          if (ret <= PHY_vars_eNB->ulsch_eNB[0]->max_turbo_iterations) {
+          if (ret <= eNB->ulsch[0]->max_turbo_iterations) {
 
             avg_iter += ret;
             iter_trials++;
 
             if (n_frames==1) {
-              printf("No ULSCH errors found, o_ACK[0]= %d, cqi_crc_status=%d\n",PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0],PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status);
+              printf("No ULSCH errors found, o_ACK[0]= %d, cqi_crc_status=%d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0],eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status);
 
-              if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->cqi_crc_status==1)
-                print_CQI(PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o,
-                          PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->uci_format,0,PHY_vars_eNB->lte_frame_parms.N_RB_DL);
+              if (eNB->ulsch[0]->harq_processes[harq_pid]->cqi_crc_status==1)
+                print_CQI(eNB->ulsch[0]->harq_processes[harq_pid]->o,
+                          eNB->ulsch[0]->harq_processes[harq_pid]->uci_format,0,eNB->frame_parms.N_RB_DL);
 
-              dump_ulsch(PHY_vars_eNB,subframe,0);
+              dump_ulsch(eNB,0);
               exit(-1);
             }
 
@@ -1321,24 +1315,24 @@ int main(int argc, char **argv)
             errs[round]++;
 
             if (n_frames==1) {
-              printf("ULSCH errors found o_ACK[0]= %d\n",PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0]);
+              printf("ULSCH errors found o_ACK[0]= %d\n",eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0]);
 
-              for (s=0; s<PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->C; s++) {
-                if (s<PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Cminus)
-                  Kr = PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kminus;
+              for (s=0; s<eNB->ulsch[0]->harq_processes[harq_pid]->C; s++) {
+                if (s<eNB->ulsch[0]->harq_processes[harq_pid]->Cminus)
+                  Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kminus;
                 else
-                  Kr = PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kplus;
+                  Kr = eNB->ulsch[0]->harq_processes[harq_pid]->Kplus;
 
                 Kr_bytes = Kr>>3;
 
                 printf("Decoded_output (Segment %d):\n",s);
 
                 for (i=0; i<Kr_bytes; i++)
-                  printf("%d : %x (%x)\n",i,PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->c[s][i],
-                         PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->c[s][i]^PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->c[s][i]);
+                  printf("%d : %x (%x)\n",i,eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i],
+                         eNB->ulsch[0]->harq_processes[harq_pid]->c[s][i]^UE->ulsch[0]->harq_processes[harq_pid]->c[s][i]);
               }
 
-              dump_ulsch(PHY_vars_eNB,subframe,0);
+              dump_ulsch(eNB,0);
               exit(-1);
             }
 
@@ -1356,20 +1350,20 @@ int main(int argc, char **argv)
           break;
 
 	if (xforms==1)
-	  phy_scope_eNB(form_enb,PHY_vars_eNB,0);
+	  phy_scope_eNB(form_enb,eNB,0);
 
         /*calculate the total processing time for each packet, get the max, min, and number of packets that exceed t>3000us*/
 
-        double t_tx = (double)PHY_vars_UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
-        double t_tx_ifft = (double)PHY_vars_UE->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_tx_mod = (double)PHY_vars_UE->ulsch_modulation_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_tx_enc = (double)PHY_vars_UE->ulsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_tx = (double)UE->phy_proc_tx.p_time/cpu_freq_GHz/1000.0;
+        double t_tx_ifft = (double)UE->ofdm_mod_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_tx_mod = (double)UE->ulsch_modulation_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_tx_enc = (double)UE->ulsch_encoding_stats.p_time/cpu_freq_GHz/1000.0;
 
 
-        double t_rx = (double)PHY_vars_eNB->phy_proc_rx.p_time/cpu_freq_GHz/1000.0;
-        double t_rx_fft = (double)PHY_vars_eNB->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_rx_demod = (double)PHY_vars_eNB->ulsch_demodulation_stats.p_time/cpu_freq_GHz/1000.0;
-        double t_rx_dec = (double)PHY_vars_eNB->ulsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_rx = (double)eNB->phy_proc_rx.p_time/cpu_freq_GHz/1000.0;
+        double t_rx_fft = (double)eNB->ofdm_demod_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_rx_demod = (double)eNB->ulsch_demodulation_stats.p_time/cpu_freq_GHz/1000.0;
+        double t_rx_dec = (double)eNB->ulsch_decoding_stats.p_time/cpu_freq_GHz/1000.0;
 
         if (t_tx > t_tx_max)
           t_tx_max = t_tx;
@@ -1492,12 +1486,12 @@ int main(int argc, char **argv)
              tx_lev_dB,
              20*log10(tx_gain),
              (double)N0,
-             PHY_vars_eNB->PHY_measurements_eNB[0].n0_power_tot_dB,
-             get_hundred_times_delta_IF(PHY_vars_UE,eNB_id,harq_pid) ,
-             dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0]),
-             dB_fixed(PHY_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[1]),
-             PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-             PHY_vars_eNB->PHY_measurements_eNB->n0_power_dB[1]);
+             eNB->measurements[0].n0_power_tot_dB,
+             get_hundred_times_delta_IF(UE,eNB_id,harq_pid) ,
+             dB_fixed(eNB->pusch_vars[0]->ulsch_power[0]),
+             dB_fixed(eNB->pusch_vars[0]->ulsch_power[1]),
+             eNB->measurements->n0_power_dB[0],
+             eNB->measurements->n0_power_dB[1]);
 
       effective_rate = ((double)(round_trials[0])/((double)round_trials[0] + round_trials[1] + round_trials[2] + round_trials[3]));
 
@@ -1519,7 +1513,7 @@ int main(int argc, char **argv)
              rate,
              rate*get_Qm_ul(mcs),
              (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/
-             (double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
+             (double)eNB->ulsch[0]->harq_processes[harq_pid]->TBS,
              (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
 
       if (cqi_flag >0) {
@@ -1529,7 +1523,7 @@ int main(int argc, char **argv)
                cqi_crc_falsenegatives,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]);
       }
 
-      if (PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->o_ACK[0] > 0)
+      if (eNB->ulsch[0]->harq_processes[harq_pid]->o_ACK[0] > 0)
         printf("ACK/NAK errors %d/%d\n",ack_errors,round_trials[0]+round_trials[1]+round_trials[2]+round_trials[3]);
 
 
@@ -1537,7 +1531,7 @@ int main(int argc, char **argv)
               SNR,
               mcs,
               nb_rb,
-              PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
+              eNB->ulsch[0]->harq_processes[harq_pid]->TBS,
               rate,
               errs[0],
               round_trials[0],
@@ -1551,101 +1545,101 @@ int main(int argc, char **argv)
 
       if (dump_perf==1) {
         printf("UE TX function statistics (per 1ms subframe)\n\n");
-        std_phy_proc_tx = sqrt((double)PHY_vars_UE->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                               2)/PHY_vars_UE->phy_proc_tx.trials - pow((double)PHY_vars_UE->phy_proc_tx.diff/PHY_vars_UE->phy_proc_tx.trials/cpu_freq_GHz/1000,2));
-        printf("Total PHY proc tx                 :%f us (%d trials)\n",(double)PHY_vars_UE->phy_proc_tx.diff/PHY_vars_UE->phy_proc_tx.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->phy_proc_tx.trials);
+        std_phy_proc_tx = sqrt((double)UE->phy_proc_tx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                               2)/UE->phy_proc_tx.trials - pow((double)UE->phy_proc_tx.diff/UE->phy_proc_tx.trials/cpu_freq_GHz/1000,2));
+        printf("Total PHY proc tx                 :%f us (%d trials)\n",(double)UE->phy_proc_tx.diff/UE->phy_proc_tx.trials/cpu_freq_GHz/1000.0,UE->phy_proc_tx.trials);
         printf("|__ Statistics                         std: %f us max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n",std_phy_proc_tx, t_tx_max, t_tx_min, tx_median, tx_q1, tx_q3,
                n_tx_dropped);
-        std_phy_proc_tx_ifft = sqrt((double)PHY_vars_UE->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                    2)/PHY_vars_UE->ofdm_mod_stats.trials - pow((double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2));
-        printf("OFDM_mod time                     :%f us (%d trials)\n",(double)PHY_vars_UE->ofdm_mod_stats.diff/PHY_vars_UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ofdm_mod_stats.trials);
+        std_phy_proc_tx_ifft = sqrt((double)UE->ofdm_mod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                    2)/UE->ofdm_mod_stats.trials - pow((double)UE->ofdm_mod_stats.diff/UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000,2));
+        printf("OFDM_mod time                     :%f us (%d trials)\n",(double)UE->ofdm_mod_stats.diff/UE->ofdm_mod_stats.trials/cpu_freq_GHz/1000.0,UE->ofdm_mod_stats.trials);
         printf("|__ Statistics                         std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_ifft, tx_ifft_median, tx_ifft_q1, tx_ifft_q3);
-        std_phy_proc_tx_mod = sqrt((double)PHY_vars_UE->ulsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_UE->ulsch_modulation_stats.trials - pow((double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000,2));
-        printf("ULSCH modulation time             :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_modulation_stats.diff/PHY_vars_UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->ulsch_modulation_stats.trials);
+        std_phy_proc_tx_mod = sqrt((double)UE->ulsch_modulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/UE->ulsch_modulation_stats.trials - pow((double)UE->ulsch_modulation_stats.diff/UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000,2));
+        printf("ULSCH modulation time             :%f us (%d trials)\n",(double)UE->ulsch_modulation_stats.diff/UE->ulsch_modulation_stats.trials/cpu_freq_GHz/1000.0,
+               UE->ulsch_modulation_stats.trials);
         printf("|__ Statistics                         std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_mod, tx_mod_median, tx_mod_q1, tx_mod_q3);
-        std_phy_proc_tx_enc = sqrt((double)PHY_vars_UE->ulsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_UE->ulsch_encoding_stats.trials - pow((double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000,2));
-        printf("ULSCH encoding time               :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_encoding_stats.diff/PHY_vars_UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->ulsch_encoding_stats.trials);
+        std_phy_proc_tx_enc = sqrt((double)UE->ulsch_encoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/UE->ulsch_encoding_stats.trials - pow((double)UE->ulsch_encoding_stats.diff/UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000,2));
+        printf("ULSCH encoding time               :%f us (%d trials)\n",(double)UE->ulsch_encoding_stats.diff/UE->ulsch_encoding_stats.trials/cpu_freq_GHz/1000.0,
+               UE->ulsch_encoding_stats.trials);
         printf("|__ Statistics                         std: %f us median %fus q1 %fus q3 %fus \n",std_phy_proc_tx_enc, tx_enc_median, tx_enc_q1, tx_enc_q3);
-        printf("|__ ULSCH segmentation time           :%f us (%d trials)\n",(double)PHY_vars_UE->ulsch_segmentation_stats.diff/PHY_vars_UE->ulsch_segmentation_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_UE->ulsch_segmentation_stats.trials);
+        printf("|__ ULSCH segmentation time           :%f us (%d trials)\n",(double)UE->ulsch_segmentation_stats.diff/UE->ulsch_segmentation_stats.trials/cpu_freq_GHz/1000.0,
+               UE->ulsch_segmentation_stats.trials);
         printf("|__ ULSCH turbo encoding time         :%f us (%d trials)\n",
-               ((double)PHY_vars_UE->ulsch_turbo_encoding_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double)
-               PHY_vars_UE->ulsch_turbo_encoding_stats.diff/PHY_vars_UE->ulsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_turbo_encoding_stats.trials);
+               ((double)UE->ulsch_turbo_encoding_stats.trials/UE->ulsch_encoding_stats.trials)*(double)
+               UE->ulsch_turbo_encoding_stats.diff/UE->ulsch_turbo_encoding_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_turbo_encoding_stats.trials);
         printf("|__ ULSCH rate-matching time          :%f us (%d trials)\n",
-               ((double)PHY_vars_UE->ulsch_rate_matching_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double)
-               PHY_vars_UE->ulsch_rate_matching_stats.diff/PHY_vars_UE->ulsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_rate_matching_stats.trials);
+               ((double)UE->ulsch_rate_matching_stats.trials/UE->ulsch_encoding_stats.trials)*(double)
+               UE->ulsch_rate_matching_stats.diff/UE->ulsch_rate_matching_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_rate_matching_stats.trials);
         printf("|__ ULSCH sub-block interleaving time :%f us (%d trials)\n",
-               ((double)PHY_vars_UE->ulsch_interleaving_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double)
-               PHY_vars_UE->ulsch_interleaving_stats.diff/PHY_vars_UE->ulsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_interleaving_stats.trials);
+               ((double)UE->ulsch_interleaving_stats.trials/UE->ulsch_encoding_stats.trials)*(double)
+               UE->ulsch_interleaving_stats.diff/UE->ulsch_interleaving_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_interleaving_stats.trials);
         printf("|__ ULSCH multiplexing time           :%f us (%d trials)\n",
-               ((double)PHY_vars_UE->ulsch_multiplexing_stats.trials/PHY_vars_UE->ulsch_encoding_stats.trials)*(double)
-               PHY_vars_UE->ulsch_multiplexing_stats.diff/PHY_vars_UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_UE->ulsch_multiplexing_stats.trials);
+               ((double)UE->ulsch_multiplexing_stats.trials/UE->ulsch_encoding_stats.trials)*(double)
+               UE->ulsch_multiplexing_stats.diff/UE->ulsch_multiplexing_stats.trials/cpu_freq_GHz/1000.0,UE->ulsch_multiplexing_stats.trials);
 
         printf("\n\neNB RX function statistics (per 1ms subframe)\n\n");
-        std_phy_proc_rx = sqrt((double)PHY_vars_eNB->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                               2)/PHY_vars_eNB->phy_proc_rx.trials - pow((double)PHY_vars_eNB->phy_proc_rx.diff/PHY_vars_eNB->phy_proc_rx.trials/cpu_freq_GHz/1000,2));
-        printf("Total PHY proc rx                  :%f us (%d trials)\n",(double)PHY_vars_eNB->phy_proc_rx.diff/PHY_vars_eNB->phy_proc_rx.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->phy_proc_rx.trials);
+        std_phy_proc_rx = sqrt((double)eNB->phy_proc_rx.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                               2)/eNB->phy_proc_rx.trials - pow((double)eNB->phy_proc_rx.diff/eNB->phy_proc_rx.trials/cpu_freq_GHz/1000,2));
+        printf("Total PHY proc rx                  :%f us (%d trials)\n",(double)eNB->phy_proc_rx.diff/eNB->phy_proc_rx.trials/cpu_freq_GHz/1000.0,eNB->phy_proc_rx.trials);
         printf("|__ Statistcs                           std: %fus max: %fus min: %fus median %fus q1 %fus q3 %fus n_dropped: %d packet \n", std_phy_proc_rx, t_rx_max, t_rx_min, rx_median, rx_q1, rx_q3,
                n_rx_dropped);
-        std_phy_proc_rx_fft = sqrt((double)PHY_vars_eNB->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_eNB->ofdm_demod_stats.trials - pow((double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2));
-        printf("OFDM_demod time                   :%f us (%d trials)\n",(double)PHY_vars_eNB->ofdm_demod_stats.diff/PHY_vars_eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_eNB->ofdm_demod_stats.trials);
+        std_phy_proc_rx_fft = sqrt((double)eNB->ofdm_demod_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/eNB->ofdm_demod_stats.trials - pow((double)eNB->ofdm_demod_stats.diff/eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000,2));
+        printf("OFDM_demod time                   :%f us (%d trials)\n",(double)eNB->ofdm_demod_stats.diff/eNB->ofdm_demod_stats.trials/cpu_freq_GHz/1000.0,
+               eNB->ofdm_demod_stats.trials);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_fft, rx_fft_median, rx_fft_q1, rx_fft_q3);
-        std_phy_proc_rx_demod = sqrt((double)PHY_vars_eNB->ulsch_demodulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                     2)/PHY_vars_eNB->ulsch_demodulation_stats.trials - pow((double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000,2));
-        printf("ULSCH demodulation time           :%f us (%d trials)\n",(double)PHY_vars_eNB->ulsch_demodulation_stats.diff/PHY_vars_eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0,
-               PHY_vars_eNB->ulsch_demodulation_stats.trials);
+        std_phy_proc_rx_demod = sqrt((double)eNB->ulsch_demodulation_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                     2)/eNB->ulsch_demodulation_stats.trials - pow((double)eNB->ulsch_demodulation_stats.diff/eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000,2));
+        printf("ULSCH demodulation time           :%f us (%d trials)\n",(double)eNB->ulsch_demodulation_stats.diff/eNB->ulsch_demodulation_stats.trials/cpu_freq_GHz/1000.0,
+               eNB->ulsch_demodulation_stats.trials);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_demod, rx_demod_median, rx_demod_q1, rx_demod_q3);
-        std_phy_proc_rx_dec = sqrt((double)PHY_vars_eNB->ulsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
-                                   2)/PHY_vars_eNB->ulsch_decoding_stats.trials - pow((double)PHY_vars_eNB->ulsch_decoding_stats.diff/PHY_vars_eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000,2));
+        std_phy_proc_rx_dec = sqrt((double)eNB->ulsch_decoding_stats.diff_square/pow(cpu_freq_GHz,2)/pow(1000,
+                                   2)/eNB->ulsch_decoding_stats.trials - pow((double)eNB->ulsch_decoding_stats.diff/eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000,2));
         printf("ULSCH Decoding time (%.2f Mbit/s, avg iter %f)      :%f us (%d trials, max %f)\n",
-               PHY_vars_UE->ulsch_ue[0]->harq_processes[harq_pid]->TBS/1000.0,(double)avg_iter/iter_trials,
-               (double)PHY_vars_eNB->ulsch_decoding_stats.diff/PHY_vars_eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_decoding_stats.trials,
-               (double)PHY_vars_eNB->ulsch_decoding_stats.max/cpu_freq_GHz/1000.0);
+               UE->ulsch[0]->harq_processes[harq_pid]->TBS/1000.0,(double)avg_iter/iter_trials,
+               (double)eNB->ulsch_decoding_stats.diff/eNB->ulsch_decoding_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_decoding_stats.trials,
+               (double)eNB->ulsch_decoding_stats.max/cpu_freq_GHz/1000.0);
         printf("|__ Statistcs                           std: %fus median %fus q1 %fus q3 %fus \n", std_phy_proc_rx_dec, rx_dec_median, rx_dec_q1, rx_dec_q3);
         printf("|__ sub-block interleaving                          %f us (%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_deinterleaving_stats.diff/PHY_vars_eNB->ulsch_deinterleaving_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_deinterleaving_stats.trials);
+               (double)eNB->ulsch_deinterleaving_stats.diff/eNB->ulsch_deinterleaving_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_deinterleaving_stats.trials);
         printf("|__ demultiplexing                                  %f us (%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_demultiplexing_stats.diff/PHY_vars_eNB->ulsch_demultiplexing_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_demultiplexing_stats.trials);
+               (double)eNB->ulsch_demultiplexing_stats.diff/eNB->ulsch_demultiplexing_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_demultiplexing_stats.trials);
         printf("|__ rate-matching                                   %f us (%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_rate_unmatching_stats.diff/PHY_vars_eNB->ulsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,PHY_vars_eNB->ulsch_rate_unmatching_stats.trials);
+               (double)eNB->ulsch_rate_unmatching_stats.diff/eNB->ulsch_rate_unmatching_stats.trials/cpu_freq_GHz/1000.0,eNB->ulsch_rate_unmatching_stats.trials);
         printf("|__ turbo_decoder(%d bits)                              %f us (%d cycles, %d trials)\n",
-               PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Cminus ? PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kminus : PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->Kplus,
-               (double)PHY_vars_eNB->ulsch_turbo_decoding_stats.diff/PHY_vars_eNB->ulsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,
-               (int)((double)PHY_vars_eNB->ulsch_turbo_decoding_stats.diff/PHY_vars_eNB->ulsch_turbo_decoding_stats.trials),PHY_vars_eNB->ulsch_turbo_decoding_stats.trials);
+               eNB->ulsch[0]->harq_processes[harq_pid]->Cminus ? eNB->ulsch[0]->harq_processes[harq_pid]->Kminus : eNB->ulsch[0]->harq_processes[harq_pid]->Kplus,
+               (double)eNB->ulsch_turbo_decoding_stats.diff/eNB->ulsch_turbo_decoding_stats.trials/cpu_freq_GHz/1000.0,
+               (int)((double)eNB->ulsch_turbo_decoding_stats.diff/eNB->ulsch_turbo_decoding_stats.trials),eNB->ulsch_turbo_decoding_stats.trials);
         printf("    |__ init                                            %f us (cycles/iter %f, %d trials)\n",
-               (double)PHY_vars_eNB->ulsch_tc_init_stats.diff/PHY_vars_eNB->ulsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_eNB->ulsch_tc_init_stats.diff/PHY_vars_eNB->ulsch_tc_init_stats.trials/((double)avg_iter/iter_trials),
-               PHY_vars_eNB->ulsch_tc_init_stats.trials);
+               (double)eNB->ulsch_tc_init_stats.diff/eNB->ulsch_tc_init_stats.trials/cpu_freq_GHz/1000.0,
+               (double)eNB->ulsch_tc_init_stats.diff/eNB->ulsch_tc_init_stats.trials/((double)avg_iter/iter_trials),
+               eNB->ulsch_tc_init_stats.trials);
         printf("    |__ alpha                                           %f us (cycles/iter %f, %d trials)\n",
-               (double)PHY_vars_eNB->ulsch_tc_alpha_stats.diff/PHY_vars_eNB->ulsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_eNB->ulsch_tc_alpha_stats.diff/PHY_vars_eNB->ulsch_tc_alpha_stats.trials*2,
-               PHY_vars_eNB->ulsch_tc_alpha_stats.trials);
+               (double)eNB->ulsch_tc_alpha_stats.diff/eNB->ulsch_tc_alpha_stats.trials/cpu_freq_GHz/1000.0,
+               (double)eNB->ulsch_tc_alpha_stats.diff/eNB->ulsch_tc_alpha_stats.trials*2,
+               eNB->ulsch_tc_alpha_stats.trials);
         printf("    |__ beta                                            %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_tc_beta_stats.diff/PHY_vars_eNB->ulsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_eNB->ulsch_tc_beta_stats.diff/PHY_vars_eNB->ulsch_tc_beta_stats.trials*2,
-               PHY_vars_eNB->ulsch_tc_beta_stats.trials);
+               (double)eNB->ulsch_tc_beta_stats.diff/eNB->ulsch_tc_beta_stats.trials/cpu_freq_GHz/1000.0,
+               (double)eNB->ulsch_tc_beta_stats.diff/eNB->ulsch_tc_beta_stats.trials*2,
+               eNB->ulsch_tc_beta_stats.trials);
         printf("    |__ gamma                                           %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_tc_gamma_stats.diff/PHY_vars_eNB->ulsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_eNB->ulsch_tc_gamma_stats.diff/PHY_vars_eNB->ulsch_tc_gamma_stats.trials*2,
-               PHY_vars_eNB->ulsch_tc_gamma_stats.trials);
+               (double)eNB->ulsch_tc_gamma_stats.diff/eNB->ulsch_tc_gamma_stats.trials/cpu_freq_GHz/1000.0,
+               (double)eNB->ulsch_tc_gamma_stats.diff/eNB->ulsch_tc_gamma_stats.trials*2,
+               eNB->ulsch_tc_gamma_stats.trials);
         printf("    |__ ext                                             %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_tc_ext_stats.diff/PHY_vars_eNB->ulsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_eNB->ulsch_tc_ext_stats.diff/PHY_vars_eNB->ulsch_tc_ext_stats.trials*2,
-               PHY_vars_eNB->ulsch_tc_ext_stats.trials);
+               (double)eNB->ulsch_tc_ext_stats.diff/eNB->ulsch_tc_ext_stats.trials/cpu_freq_GHz/1000.0,
+               (double)eNB->ulsch_tc_ext_stats.diff/eNB->ulsch_tc_ext_stats.trials*2,
+               eNB->ulsch_tc_ext_stats.trials);
         printf("    |__ intl1                                           %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_tc_intl1_stats.diff/PHY_vars_eNB->ulsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_eNB->ulsch_tc_intl1_stats.diff/PHY_vars_eNB->ulsch_tc_intl1_stats.trials,
-               PHY_vars_eNB->ulsch_tc_intl1_stats.trials);
+               (double)eNB->ulsch_tc_intl1_stats.diff/eNB->ulsch_tc_intl1_stats.trials/cpu_freq_GHz/1000.0,
+               (double)eNB->ulsch_tc_intl1_stats.diff/eNB->ulsch_tc_intl1_stats.trials,
+               eNB->ulsch_tc_intl1_stats.trials);
         printf("    |__ intl2+HD+CRC                                    %f us (cycles/iter %f,%d trials)\n",
-               (double)PHY_vars_eNB->ulsch_tc_intl2_stats.diff/PHY_vars_eNB->ulsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0,
-               (double)PHY_vars_eNB->ulsch_tc_intl2_stats.diff/PHY_vars_eNB->ulsch_tc_intl2_stats.trials,
-               PHY_vars_eNB->ulsch_tc_intl2_stats.trials);
+               (double)eNB->ulsch_tc_intl2_stats.diff/eNB->ulsch_tc_intl2_stats.trials/cpu_freq_GHz/1000.0,
+               (double)eNB->ulsch_tc_intl2_stats.diff/eNB->ulsch_tc_intl2_stats.trials,
+               eNB->ulsch_tc_intl2_stats.trials);
       }
 
       if(abstx) { //ABSTRACTION
@@ -1673,7 +1667,7 @@ int main(int argc, char **argv)
         fprintf(time_meas_fd,"%f;%d;%d;%f;%d;%d;%d;%d;%d;%d;%d;%d;",
                 SNR,
                 mcs,
-                PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
+                eNB->ulsch[0]->harq_processes[harq_pid]->TBS,
                 rate,
                 errs[0],
                 round_trials[0],
@@ -1688,7 +1682,7 @@ int main(int argc, char **argv)
         fprintf(time_meas_fd,"%f;%d;%d;%f;%2.1f;%f;%d;%d;%d;%d;%d;%d;%d;%d;%e;%e;%e;%e;%f;%f;",
                 SNR,
                 mcs,
-                PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
+                eNB->ulsch[0]->harq_processes[harq_pid]->TBS,
                 rate*effective_rate,
                 100*effective_rate,
                 rate,
@@ -1705,29 +1699,29 @@ int main(int argc, char **argv)
                 (double)errs[2]/(round_trials[0]),
                 (double)errs[3]/(round_trials[0]),
                 (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0])/
-                (double)PHY_vars_eNB->ulsch_eNB[0]->harq_processes[harq_pid]->TBS,
+                (double)eNB->ulsch[0]->harq_processes[harq_pid]->TBS,
                 (1.0*(round_trials[0]-errs[0])+2.0*(round_trials[1]-errs[1])+3.0*(round_trials[2]-errs[2])+4.0*(round_trials[3]-errs[3]))/((double)round_trials[0]));
 
         //fprintf(time_meas_fd,"UE_PROC_TX(%d); OFDM_MOD(%d); UL_MOD(%d); UL_ENC(%d); eNB_PROC_RX(%d); OFDM_DEMOD(%d); UL_DEMOD(%d); UL_DECOD(%d);\n",
         fprintf(time_meas_fd,"%d; %d; %d; %d; %d; %d; %d; %d;",
-                PHY_vars_UE->phy_proc_tx.trials,
-                PHY_vars_UE->ofdm_mod_stats.trials,
-                PHY_vars_UE->ulsch_modulation_stats.trials,
-                PHY_vars_UE->ulsch_encoding_stats.trials,
-                PHY_vars_eNB->phy_proc_rx.trials,
-                PHY_vars_eNB->ofdm_demod_stats.trials,
-                PHY_vars_eNB->ulsch_demodulation_stats.trials,
-                PHY_vars_eNB->ulsch_decoding_stats.trials
+                UE->phy_proc_tx.trials,
+                UE->ofdm_mod_stats.trials,
+                UE->ulsch_modulation_stats.trials,
+                UE->ulsch_encoding_stats.trials,
+                eNB->phy_proc_rx.trials,
+                eNB->ofdm_demod_stats.trials,
+                eNB->ulsch_demodulation_stats.trials,
+                eNB->ulsch_decoding_stats.trials
                );
         fprintf(time_meas_fd,"%f;%f;%f;%f;%f;%f;%f;%f;",
-                get_time_meas_us(&PHY_vars_UE->phy_proc_tx),
-                get_time_meas_us(&PHY_vars_UE->ofdm_mod_stats),
-                get_time_meas_us(&PHY_vars_UE->ulsch_modulation_stats),
-                get_time_meas_us(&PHY_vars_UE->ulsch_encoding_stats),
-                get_time_meas_us(&PHY_vars_eNB->phy_proc_rx),
-                get_time_meas_us(&PHY_vars_eNB->ofdm_demod_stats),
-                get_time_meas_us(&PHY_vars_eNB->ulsch_demodulation_stats),
-                get_time_meas_us(&PHY_vars_eNB->ulsch_decoding_stats)
+                get_time_meas_us(&UE->phy_proc_tx),
+                get_time_meas_us(&UE->ofdm_mod_stats),
+                get_time_meas_us(&UE->ulsch_modulation_stats),
+                get_time_meas_us(&UE->ulsch_encoding_stats),
+                get_time_meas_us(&eNB->phy_proc_rx),
+                get_time_meas_us(&eNB->ofdm_demod_stats),
+                get_time_meas_us(&eNB->ulsch_demodulation_stats),
+                get_time_meas_us(&eNB->ulsch_decoding_stats)
                );
 
         //fprintf(time_meas_fd,"UE_PROC_TX_STD;UE_PROC_TX_MAX;UE_PROC_TX_MIN;UE_PROC_TX_MED;UE_PROC_TX_Q1;UE_PROC_TX_Q3;UE_PROC_TX_DROPPED;\n");
@@ -1769,8 +1763,8 @@ int main(int argc, char **argv)
     //
 
 
-    //write_output("chestim_f.m","chestf",PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates[0][0],300*12,2,1);
-    // write_output("chestim_t.m","chestt",PHY_vars_eNB->lte_eNB_pusch_vars[0]->drs_ch_estimates_time[0][0], (frame_parms->ofdm_symbol_size)*2,2,1);
+    //write_output("chestim_f.m","chestf",eNB->pusch_vars[0]->drs_ch_estimates[0][0],300*12,2,1);
+    // write_output("chestim_t.m","chestt",eNB->pusch_vars[0]->drs_ch_estimates_time[0][0], (frame_parms->ofdm_symbol_size)*2,2,1);
 
   }//ch realization
 
diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h
index 9a0f60167d12f47356e9364f231d665394ae00de..7a2a747741f1d46bffc186997f36768731c4d40b 100644
--- a/openair2/LAYER2/MAC/proto.h
+++ b/openair2/LAYER2/MAC/proto.h
@@ -786,7 +786,7 @@ rrc_get_estimated_ue_distance(
   const int         CC_idP,
   const uint8_t     loc_typeP);
 
-void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_eNB);
+void fill_dci(DCI_PDU *DCI_pdu, PHY_VARS_eNB *phy_vars_eNB);
 
 #endif
 /** @}*/
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index 1f7d08c13debd194d633d43e06f8d66ebd34bf4b..a8444edfc90dddd0a8cbee44ed151e4c80ad29d1 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -139,8 +139,8 @@ extern int sync_var;
 
 time_stats_t softmodem_stats_mt; // main thread
 time_stats_t softmodem_stats_hw; //  hw acquisition
-time_stats_t softmodem_stats_tx_sf[10]; // total tx time
-time_stats_t softmodem_stats_rx_sf[10]; // total rx time
+time_stats_t softmodem_stats_tx_sf; // total tx time
+time_stats_t softmodem_stats_rx_sf; // total rx time
 int32_t **rxdata;
 int32_t **txdata;
 
@@ -154,7 +154,7 @@ static struct {
   pthread_mutex_t  mutex_phy_proc_tx;
   pthread_cond_t   cond_phy_proc_tx;
   volatile uint8_t phy_proc_CC_id;
-} sync_phy_proc[NUM_ENB_THREADS];
+} sync_phy_proc;
 
 
 void exit_fun(const char* s);
@@ -271,7 +271,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
  */
 static void* eNB_thread_tx( void* param )
 {
-  static int eNB_thread_tx_status[NUM_ENB_THREADS];
+  static int eNB_thread_tx_status;
 
   eNB_proc_t *proc = (eNB_proc_t*)param;
   FILE  *tx_time_file = NULL;
@@ -279,11 +279,11 @@ static void* eNB_thread_tx( void* param )
   void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; 
 
   if (opp_enabled == 1) {
-    snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->thread_index);
+    snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf", "eNB");
     tx_time_file = fopen(tx_time_name,"w");
   }
   // set default return value
-  eNB_thread_tx_status[proc->thread_index] = 0;
+  eNB_thread_tx_status = 0;
 
   MSC_START_USE();
 
@@ -306,10 +306,10 @@ static void* eNB_thread_tx( void* param )
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
     perror("[SCHED] eNB tx thread: sched_setattr failed\n");
-    return &eNB_thread_tx_status[proc->thread_index];
+    return &eNB_thread_tx_status;
   }
 
-  LOG_I( HW, "[SCHED] eNB TX deadline thread %d(TID %ld) started on CPU %d\n", proc->thread_index, gettid(), sched_getcpu() );
+  LOG_I( HW, "[SCHED] eNB TX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() );
 
 #else //LOW_LATENCY
   int policy, s, j;
@@ -372,7 +372,7 @@ static void* eNB_thread_tx( void* param )
 
    }
 
- LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n", proc->thread_index, sched_getcpu(),gettid(),
+ LOG_I( HW, "[SCHED][eNB] TX thread %d started on CPU %d TID %ld, sched_policy = %s , priority = %d, CPU Affinity=%s \n",sched_getcpu(),gettid(),
                    (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
                    (policy == SCHED_RR)    ? "SCHED_RR" :
                    (policy == SCHED_OTHER) ? "SCHED_OTHER" :
@@ -388,10 +388,10 @@ static void* eNB_thread_tx( void* param )
 
   while (!oai_exit) {
 
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 0 );
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 0 );
 
     if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
-      LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->thread_index );
+      LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX\n");
       exit_fun("nothing to add");
       break;
     }
@@ -403,13 +403,13 @@ static void* eNB_thread_tx( void* param )
     }
 
     if (pthread_mutex_unlock(&proc->mutex_tx) != 0) {
-      LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->thread_index);
+      LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX\n");
       exit_fun("nothing to add");
       break;
     }
 
-    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 1 );
-    start_meas( &softmodem_stats_tx_sf[proc->thread_index] );
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 1 );
+    start_meas( &softmodem_stats_tx_sf );
   
     if (oai_exit) break;
 
@@ -420,19 +420,19 @@ static void* eNB_thread_tx( void* param )
       /* run PHY TX procedures the one after the other for all CCs to avoid race conditions
        * (may be relaxed in the future for performance reasons)
        */
-      if (pthread_mutex_lock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) {
-        LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->thread_index);
+      if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) {
+        LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX\n");
         exit_fun("nothing to add");
         break;
       }
       /* wait for our turn or oai_exit */
-      while (sync_phy_proc[proc->thread_index].phy_proc_CC_id != proc->CC_id && !oai_exit) {
-        pthread_cond_wait(&sync_phy_proc[proc->thread_index].cond_phy_proc_tx,
-                          &sync_phy_proc[proc->thread_index].mutex_phy_proc_tx);
+      while (sync_phy_proc.phy_proc_CC_id != proc->CC_id && !oai_exit) {
+        pthread_cond_wait(&sync_phy_proc.cond_phy_proc_tx,
+                          &sync_phy_proc.mutex_phy_proc_tx);
       }
 
-      if (pthread_mutex_unlock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) {
-        LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->thread_index);
+      if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) {
+        LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX\n");
         exit_fun("nothing to add");
       }
 
@@ -442,19 +442,19 @@ static void* eNB_thread_tx( void* param )
       if (oai_exit)
         break;
       if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { 
-	phy_procedures_eNB_TX( proc->thread_index, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL );
+	phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay, NULL );
 	
 	/* we're done, let the next one proceed */
-	if (pthread_mutex_lock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) {
-	  LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc %d\n", proc->thread_index);
+	if (pthread_mutex_lock(&sync_phy_proc.mutex_phy_proc_tx) != 0) {
+	  LOG_E(PHY, "[SCHED][eNB] error locking PHY proc mutex for eNB TX proc\n");
 	  exit_fun("nothing to add");
 	  break;
 	}
-	sync_phy_proc[proc->thread_index].phy_proc_CC_id++;
-	sync_phy_proc[proc->thread_index].phy_proc_CC_id %= MAX_NUM_CCs;
-	pthread_cond_broadcast(&sync_phy_proc[proc->thread_index].cond_phy_proc_tx);
-	if (pthread_mutex_unlock(&sync_phy_proc[proc->thread_index].mutex_phy_proc_tx) != 0) {
-	  LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc %d\n", proc->thread_index);
+	sync_phy_proc.phy_proc_CC_id++;
+	sync_phy_proc.phy_proc_CC_id %= MAX_NUM_CCs;
+	pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx);
+	if (pthread_mutex_unlock(&sync_phy_proc.mutex_phy_proc_tx) != 0) {
+	  LOG_E(PHY, "[SCHED][eNB] error unlocking PHY proc mutex for eNB TX proc\n");
 	  exit_fun("nothing to add");
 	  break;
 	}
@@ -503,7 +503,7 @@ static void* eNB_thread_tx( void* param )
     }
 
     if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
-      LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->thread_index );
+      LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc\n");
       exit_fun("nothing to add");
       break;
     }
@@ -511,55 +511,55 @@ static void* eNB_thread_tx( void* param )
     proc->instance_cnt_tx--;
 
     if (pthread_mutex_unlock(&proc->mutex_tx) != 0) {
-      LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n", proc->thread_index );
+      LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB TX proc\n");
       exit_fun("nothing to add");
       break;
     }
 
-    stop_meas( &softmodem_stats_tx_sf[proc->thread_index] );
+    stop_meas( &softmodem_stats_tx_sf );
 #ifdef LOWLATENCY
     if (opp_enabled){
-      if(softmodem_stats_tx_sf[proc->thread_index].diff_now/(cpuf) > attr.sched_runtime){
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf[proc->thread_index].diff_now/cpuf - attr.sched_runtime)/1000000.0);
+      if(softmodem_stats_tx_sf.diff_now/(cpuf) > attr.sched_runtime){
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_TX_ENB, (softmodem_stats_tx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0);
       }
     }
 #endif 
-    print_meas_now(&softmodem_stats_tx_sf[proc->thread_index],"eNB_TX_SF",proc->thread_index, tx_time_file);
+    print_meas_now(&softmodem_stats_tx_sf,"eNB_TX_SF",tx_time_file);
 
   }
 
 
 
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->thread_index), 0 );
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0, 0 );
 
 #ifdef DEBUG_THREADS
-  printf( "Exiting eNB thread TX %d\n", proc->thread_index );
+  printf( "Exiting eNB thread TX\n");
 #endif
 
-  eNB_thread_tx_status[proc->thread_index] = 0;
-  return &eNB_thread_tx_status[proc->thread_index];
+  eNB_thread_tx_status = 0;
+  return &eNB_thread_tx_status;
 }
 
 #if defined(ENABLE_ITTI)
 static void wait_system_ready (char *message, volatile int *start_flag)
-{
-  /* Wait for eNB application initialization to be complete (eNB registration to MME) */
-  {
-    static char *indicator[] = {".    ", "..   ", "...  ", ".... ", ".....",
-                                " ....", "  ...", "   ..", "    .", "     "
-                               };
-    int i = 0;
-
-    while ((!oai_exit) && (*start_flag == 0)) {
-      LOG_N(EMU, message, indicator[i]);
-      fflush(stdout);
-      i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0]));
-      usleep(200000);
-    }
 
-    LOG_D(EMU,"\n");
+  /* Wait for eNB application initialization to be complete (eNB registration to MME) */
+{
+  static char *indicator[] = {".    ", "..   ", "...  ", ".... ", ".....",
+			      " ....", "  ...", "   ..", "    .", "     "
+  };
+  int i = 0;
+  
+  while ((!oai_exit) && (*start_flag == 0)) {
+    LOG_N(EMU, message, indicator[i]);
+    fflush(stdout);
+    i = (i + 1) % (sizeof(indicator) / sizeof(indicator[0]));
+    usleep(200000);
   }
+  
+  LOG_D(EMU,"\n");
 }
+
 #endif
 
 /*!
@@ -570,7 +570,7 @@ static void wait_system_ready (char *message, volatile int *start_flag)
  */
 static void* eNB_thread_rx( void* param )
 {
-  static int eNB_thread_rx_status[NUM_ENB_THREADS];
+  static int eNB_thread_rx_status;
 
   eNB_proc_t *proc = (eNB_proc_t*)param;
   PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id];
@@ -581,11 +581,11 @@ static void* eNB_thread_rx( void* param )
   //int i;
 
   if (opp_enabled == 1){
-    snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf_%d", "eNB", proc->thread_index);
+    snprintf(rx_time_name, 100,"/tmp/%s_rx_time_thread_sf", "eNB");
     rx_time_file = fopen(rx_time_name,"w");
   }
   // set default return value
-  eNB_thread_rx_status[proc->thread_index] = 0;
+  eNB_thread_rx_status = 0;
 
   MSC_START_USE();
 
@@ -608,10 +608,10 @@ static void* eNB_thread_rx( void* param )
 
   if (sched_setattr(0, &attr, flags) < 0 ) {
     perror("[SCHED] eNB RX sched_setattr failed\n");
-    return &eNB_thread_rx_status[proc->thread_index];
+    return &eNB_thread_rx_status;
   }
 
-  LOG_I( HW, "[SCHED] eNB RX deadline thread %d(TID %ld) started on CPU %d\n", proc->thread_index, gettid(), sched_getcpu() );
+  LOG_I( HW, "[SCHED] eNB RX deadline thread (TID %ld) started on CPU %d\n", gettid(), sched_getcpu() );
 #else // LOW_LATENCY
   int policy, s, j;
   struct sched_param sparam;
@@ -678,7 +678,7 @@ static void* eNB_thread_rx( void* param )
    }
 
 
-  LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->thread_index, sched_getcpu(),gettid(),
+  LOG_I( HW, "[SCHED][eNB] RX thread started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(),
 	 (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
 	 (policy == SCHED_RR)    ? "SCHED_RR" :
 	 (policy == SCHED_OTHER) ? "SCHED_OTHER" :
@@ -692,7 +692,7 @@ static void* eNB_thread_rx( void* param )
 
 
  // wait for top-level synchronization and do one acquisition to get timestamp for setting frame/subframe of TX and RX threads
- printf( "waiting for sync (eNB_thread_rx %d)\n",proc->thread_index);
+ printf( "waiting for sync (eNB_thread_rx)\n");
  pthread_mutex_lock( &sync_mutex );
 
  while (sync_var<0)
@@ -710,9 +710,9 @@ static void* eNB_thread_rx( void* param )
  while (!oai_exit) {
    
    
-   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 );
+   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 );
    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 );
-   start_meas( &softmodem_stats_rx_sf[proc->thread_index] );
+   start_meas( &softmodem_stats_rx_sf );
    
    if (oai_exit) break;
    
@@ -720,44 +720,44 @@ static void* eNB_thread_rx( void* param )
 	(fp->frame_type == FDD))) {
      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 1 );
      // this spawns the prach and TX threads inside and updates the frame and subframe counters
-     phy_procedures_eNB_common_RX(proc->thread_index, eNB, 0);
+     phy_procedures_eNB_common_RX(eNB, 0);
      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_COMMON, 0 );
      if (eNB->node_function != NGFI_RRU_IF4) {
        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 );
        // this is the ue-specific processing for the subframe and can be multi-threaded later
-       phy_procedures_eNB_uespec_RX(proc->thread_index, eNB, 0, no_relay );
+       phy_procedures_eNB_uespec_RX(eNB, 0, no_relay );
        VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 0 );
      }
    }
    
    if ((subframe_select(fp,proc->subframe_rx) == SF_S)) {
-     phy_procedures_eNB_S_RX(proc->thread_index, PHY_vars_eNB_g[0][proc->CC_id], 0, no_relay );
+     phy_procedures_eNB_S_RX(eNB, 0, no_relay );
    }
    
-   stop_meas( &softmodem_stats_rx_sf[proc->thread_index] );
+   stop_meas( &softmodem_stats_rx_sf );
 #ifdef LOWLATENCY
    if (opp_enabled){
-     if(softmodem_stats_rx_sf[proc->thread_index].diff_now/(cpuf) > attr.sched_runtime){
-       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf[proc->thread_index].diff_now/cpuf - attr.sched_runtime)/1000000.0);
+     if(softmodem_stats_rx_sf.diff_now/(cpuf) > attr.sched_runtime){
+       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RUNTIME_RX_ENB, (softmodem_stats_rx_sf.diff_now/cpuf - attr.sched_runtime)/1000000.0);
      }
    }
 #endif // LOWLATENCY  
-   print_meas_now(&softmodem_stats_rx_sf[proc->thread_index],"eNB_RX_SF",proc->thread_index, rx_time_file);
-   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 );
+   print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file);
+   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 );
    
 
  }
 
   //stop_meas( &softmodem_stats_rx_sf[proc->thread_index] );
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0+(2*proc->thread_index), 0 );
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RX0, 0 );
 
 
 #ifdef DEBUG_THREADS
-  printf( "Exiting eNB thread RX %d\n", proc->thread_index );
+  printf( "Exiting eNB thread RX\n");
 #endif
 
-  eNB_thread_rx_status[proc->thread_index] = 0;
-  return &eNB_thread_rx_status[proc->thread_index];
+  eNB_thread_rx_status = 0;
+  return &eNB_thread_rx_status;
 }
 
 
@@ -778,7 +778,6 @@ static void* eNB_thread_prach( void* param )
 
   MSC_START_USE();
 
-  AssertFatal(proc->thread_index==0,"Invalid thread index %d for PRACH thread\n",proc->thread_index);
     
 #ifdef LOWLATENCY
   struct sched_attr attr;
@@ -869,7 +868,7 @@ static void* eNB_thread_prach( void* param )
    }
 
 
-  LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", proc->thread_index, sched_getcpu(),gettid(),
+  LOG_I( HW, "[SCHED][eNB] RX thread %d started on CPU %d TID %ld, sched_policy = %s, priority = %d, CPU Affinity = %s\n", sched_getcpu(),gettid(),
 	 (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
 	 (policy == SCHED_RR)    ? "SCHED_RR" :
 	 (policy == SCHED_OTHER) ? "SCHED_OTHER" :
@@ -888,7 +887,7 @@ static void* eNB_thread_prach( void* param )
    if (oai_exit) break;
         
    if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
-     LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n", proc->thread_index );
+     LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n");
      exit_fun( "error locking mutex" );
      break;
    }
@@ -900,17 +899,17 @@ static void* eNB_thread_prach( void* param )
    }
 
    if (pthread_mutex_unlock(&proc->mutex_prach) != 0) {
-     LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH proc %d\n", proc->thread_index );
+     LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB PRACH\n");
      exit_fun( "error unlocking mutex" );
      break;
    }
    
    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
-   prach_procedures(eNB,proc->thread_index,0);
+   prach_procedures(eNB,0);
    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
     
    if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
-     LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n", proc->thread_index );
+     LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n");
      exit_fun( "error locking mutex" );
      break;
    }
@@ -918,7 +917,7 @@ static void* eNB_thread_prach( void* param )
    proc->instance_cnt_prach--;
    
    if (pthread_mutex_unlock(&proc->mutex_prach) != 0) {
-     LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n", proc->thread_index );
+     LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for eNB RX proc %d\n");
      exit_fun( "error unlocking mutex" );
      break;
    }
@@ -945,67 +944,64 @@ void init_eNB_proc(void)
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
     eNB = PHY_vars_eNB_g[0][CC_id];
 
-    for (i=0; i<NUM_ENB_THREADS; i++) {
-      proc = &eNB->proc[i];
-      // set the stack size
-     
+    
+    proc = &eNB->proc;
 
 #ifndef LOWLATENCY 
-      /*  
-       pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] );
-       if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0)
+    /*  
+	pthread_attr_init( &attr_eNB_proc_tx[CC_id][i] );
+	if (pthread_attr_setstacksize( &attr_eNB_proc_tx[CC_id][i], 64 *PTHREAD_STACK_MIN ) != 0)
         perror("[ENB_PROC_TX] setting thread stack size failed\n");
-      
-      pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] );
-      if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0)
+	
+	pthread_attr_init( &attr_eNB_proc_rx[CC_id][i] );
+	if (pthread_attr_setstacksize( &attr_eNB_proc_rx[CC_id][i], 64 * PTHREAD_STACK_MIN ) != 0)
         perror("[ENB_PROC_RX] setting thread stack size failed\n");
-      */
-      // set the kernel scheduling policy and priority
-      proc->sched_param_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
-      pthread_attr_setschedparam  (&proc->attr_tx, &proc->sched_param_tx);
-      pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO);
-
-      proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
-      pthread_attr_setschedparam  (&proc->attr_rx, &proc->sched_param_rx);
-      pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO);
-
-      proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
-      pthread_attr_setschedparam  (&proc->attr_prach, &proc->sched_param_prach);
-      pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO);
-
-      printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i);
+    */
+    // set the kernel scheduling policy and priority
+    proc->sched_param_tx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
+    pthread_attr_setschedparam  (&proc->attr_tx, &proc->sched_param_tx);
+    pthread_attr_setschedpolicy (&proc->attr_tx, SCHED_FIFO);
+    
+    proc->sched_param_rx.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
+    pthread_attr_setschedparam  (&proc->attr_rx, &proc->sched_param_rx);
+    pthread_attr_setschedpolicy (&proc->attr_rx, SCHED_FIFO);
+    
+    proc->sched_param_prach.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; //OPENAIR_THREAD_PRIORITY;
+    pthread_attr_setschedparam  (&proc->attr_prach, &proc->sched_param_prach);
+    pthread_attr_setschedpolicy (&proc->attr_prach, SCHED_FIFO);
+    
+    printf("Setting OS scheduler to SCHED_FIFO for eNB [cc%d][thread%d] \n",CC_id, i);
 #endif
-      proc->instance_cnt_tx = -1;
-      proc->instance_cnt_prach = -1;
-      proc->CC_id = CC_id;
-      pthread_mutex_init( &proc->mutex_tx, NULL);
-      pthread_cond_init( &proc->cond_tx, NULL);
-      pthread_cond_init( &proc->cond_prach, NULL);
+    proc->instance_cnt_tx = -1;
+    proc->instance_cnt_prach = -1;
+    proc->CC_id = CC_id;
+    pthread_mutex_init( &proc->mutex_tx, NULL);
+    pthread_cond_init( &proc->cond_tx, NULL);
+    pthread_cond_init( &proc->cond_prach, NULL);
 #ifndef LOWLATENCY
-      pthread_create( &proc->pthread_tx, &proc->attr_tx, eNB_thread_tx, &eNB->proc[i] );
-      pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx, &eNB->proc[i] );
-      pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc[i] );
+    pthread_create( &proc->pthread_tx, &proc->attr_tx, eNB_thread_tx, &eNB->proc );
+    pthread_create( &proc->pthread_rx, &proc->attr_rx, eNB_thread_rx, &eNB->proc );
+    pthread_create( &proc->pthread_prach, &proc->attr_prach, eNB_thread_prach, &eNB->proc );
 #else 
-      pthread_create( &proc->pthread_tx, NULL, eNB_thread_tx, &eNB->proc[i] );
-      pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx, &eNB->proc[i] );
-      pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc[i] );
+    pthread_create( &proc->pthread_tx, NULL, eNB_thread_tx, &eNB->proc );
+    pthread_create( &proc->pthread_rx, NULL, eNB_thread_rx, &eNB->proc );
+    pthread_create( &proc->pthread_prach, NULL, eNB_thread_prach, &eNB->proc );
 #endif
-      char name[16];
-      snprintf( name, sizeof(name), "TX %d", i );
-      pthread_setname_np( proc->pthread_tx, name );
-      snprintf( name, sizeof(name), "RX %d", i );
-      pthread_setname_np( proc->pthread_rx, name );
-    }
+    char name[16];
+    snprintf( name, sizeof(name), "TX %d", i );
+    pthread_setname_np( proc->pthread_tx, name );
+    snprintf( name, sizeof(name), "RX %d", i );
+    pthread_setname_np( proc->pthread_rx, name );
   }
-
+  
+  
   /* setup PHY proc TX sync mechanism */
-  for (i=0; i<NUM_ENB_THREADS; i++) {
-    pthread_mutex_init(&sync_phy_proc[i].mutex_phy_proc_tx, NULL);
-    pthread_cond_init(&sync_phy_proc[i].cond_phy_proc_tx, NULL);
-    sync_phy_proc[i].phy_proc_CC_id = 0;
-  }
+  pthread_mutex_init(&sync_phy_proc.mutex_phy_proc_tx, NULL);
+  pthread_cond_init(&sync_phy_proc.cond_phy_proc_tx, NULL);
+  sync_phy_proc.phy_proc_CC_id = 0;
 }
 
+
 /*!
  * \brief Terminate eNB TX and RX threads.
  */
@@ -1016,69 +1012,69 @@ void kill_eNB_proc(void)
   eNB_proc_t *proc;
   for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
     eNB=PHY_vars_eNB_g[0][CC_id];
-    for (int i=0; i<NUM_ENB_THREADS; i++) {
-      proc = &eNB->proc[i];
-      
+    
+    proc = &eNB->proc;
+    
 #ifdef DEBUG_THREADS
-      printf( "Killing TX CC_id %d thread %d\n", CC_id, i );
+    printf( "Killing TX CC_id %d thread %d\n", CC_id, i );
 #endif
-
-      proc->instance_cnt_tx = 0; // FIXME data race!
-      pthread_cond_signal( &proc->cond_tx );
-      pthread_cond_broadcast(&sync_phy_proc[i].cond_phy_proc_tx);
-
+    
+    proc->instance_cnt_tx = 0; // FIXME data race!
+    pthread_cond_signal( &proc->cond_tx );
+    pthread_cond_broadcast(&sync_phy_proc.cond_phy_proc_tx);
+    
 #ifdef DEBUG_THREADS
-      printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i );
+    printf( "Joining eNB TX CC_id %d thread %d...\n", CC_id, i );
 #endif
-      int result = pthread_join( proc->pthread_tx, (void**)&status );
-
+    int result = pthread_join( proc->pthread_tx, (void**)&status );
+    
 #ifdef DEBUG_THREADS
-
-      if (result != 0) {
-        printf( "Error joining thread.\n" );
+    
+    if (result != 0) {
+      printf( "Error joining thread.\n" );
+    } else {
+      if (status) {
+	printf( "status %d\n", *status );
       } else {
-        if (status) {
-          printf( "status %d\n", *status );
-        } else {
-          printf( "The thread was killed. No status available.\n" );
-        }
+	printf( "The thread was killed. No status available.\n" );
       }
-
+    }
+    
 #else
-      UNUSED(result)
+    UNUSED(result)
 #endif
-
+      
 #ifdef DEBUG_THREADS
       printf( "Killing RX CC_id %d thread %d\n", CC_id, i );
 #endif
-
+    
 #ifdef DEBUG_THREADS
-      printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i );
+    printf( "Joining eNB RX CC_id %d thread %d...\n", CC_id, i );
 #endif
-      result = pthread_join( proc->pthread_rx, (void**)&status );
-
+    result = pthread_join( proc->pthread_rx, (void**)&status );
+    
 #ifdef DEBUG_THREADS
-
-      if (result != 0) {
-        printf( "Error joining thread.\n" );
+    
+    if (result != 0) {
+      printf( "Error joining thread.\n" );
+    } else {
+      if (status) {
+	printf( "status %d\n", *status );
       } else {
-        if (status) {
-          printf( "status %d\n", *status );
-        } else {
-          printf( "The thread was killed. No status available.\n" );
-        }
+	printf( "The thread was killed. No status available.\n" );
       }
-
+    }
+    
 #else
-      UNUSED(result)
+    UNUSED(result);
 #endif
-
-      pthread_mutex_destroy( &proc->mutex_tx );
-      pthread_cond_destroy( &proc->cond_tx );
-    }
+            
+    pthread_mutex_destroy( &proc->mutex_tx );
+    pthread_cond_destroy( &proc->cond_tx );
   }
 }
 
+
 /* this function maps the phy_vars_eNB tx and rx buffers to the available rf chains.
    Each rf chain is is addressed by the card number and the chain on the card. The
    rf_map specifies for each CC, on which rf chain the mapping should start. Multiple
@@ -1197,381 +1193,14 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c
 
 
 
-/*!
- * \brief This is the main eNB thread.
- * \param arg unused
- * \returns a pointer to an int. The storage is not on the heap and must not be freed.
- */
-/*
-static void* eNB_thread( void* arg )
-{
-  UNUSED(arg);
-  static int eNB_thread_status;
-
-  unsigned char slot;
-  // the USRP implementation operates on subframes, not slots
-  // one subframe consists of one even and one odd slot
-
-  slot = 1;
-  int spp;
-  int tx_launched = 0;
-  int card=0;
-
-  void *rxp[2]; // FIXME hard coded array size; indexed by frame_parms.nb_antennas_rx
-  void *txp[2]; // FIXME hard coded array size; indexed by frame_parms.nb_antennas_tx
-
-  int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9
-  
-  unsigned int rx_pos = 0;
-  unsigned int tx_pos = 0;
-
-  int CC_id=0;	
-  struct timespec trx_time0, trx_time1, trx_time2;
-
-  //avoid gcc warnings
-  (void)trx_time0;
-  (void)trx_time1;
-  (void)trx_time2;
-
-#ifdef LOWLATENCY
-  struct sched_attr attr;
-  unsigned int flags = 0;
-
-  attr.size = sizeof(attr);
-  attr.sched_flags = 0;
-  attr.sched_nice = 0;
-  attr.sched_priority = 0;
-
-  //This creates a .2 ms  reservation
-  attr.sched_policy = SCHED_DEADLINE;
-  attr.sched_runtime  = (0.3 * 100) * 10000;
-  attr.sched_deadline = (0.9 * 100) * 10000;
-  attr.sched_period   = 1 * 1000000;
-
-  if (sched_setattr(0, &attr, flags) < 0 ) {
-    perror("[SCHED] main eNB thread: sched_setattr failed\n");
-    exit_fun("Nothing to add");
-  } else {
-    LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n",
-          gettid(),sched_getcpu());
-  }
-
-#else
-
-  int policy, s, j;
-  struct sched_param sparam;
-  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
-  CPU_ZERO(&cpuset);
-#ifdef CPU_AFFINITY
-  if (get_nprocs() >2)
-  {
-    for (j = 1; j < get_nprocs(); j++)
-      CPU_SET(j, &cpuset);
-
-    s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
-    if (s != 0)
-    {
-      perror( "pthread_setaffinity_np");
-      exit_fun("Error setting processor affinity");
-    }
-  }
-#endif // CPU_AFFINITY
-
-  //Check the actual affinity mask assigned to the thread
-
-  s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
-  if (s != 0)
-  {
-    perror( "pthread_getaffinity_np");
-    exit_fun("Error getting processor affinity ");
-  }
-  memset(cpu_affinity, 0 , sizeof(cpu_affinity));
-  for (j = 0; j < CPU_SETSIZE; j++)
-  if (CPU_ISSET(j, &cpuset))
-  {  
-     char temp[1024];
-     sprintf(temp, " CPU_%d ", j);    
-     strcat(cpu_affinity, temp);
-  }
-
-  memset(&sparam, 0 , sizeof (sparam));
-  sparam.sched_priority = sched_get_priority_max(SCHED_FIFO);
-  policy = SCHED_FIFO ; 
-  
-  s = pthread_setschedparam(pthread_self(), policy, &sparam);
-  if (s != 0)
-     {
-     perror("pthread_setschedparam : ");
-     exit_fun("Error setting thread priority");
-     }
-  s = pthread_getschedparam(pthread_self(), &policy, &sparam);
-  if (s != 0)
-   {
-     perror("pthread_getschedparam : ");
-     exit_fun("Error getting thread priority");
-
-   }
-
-
-  LOG_I( HW, "[SCHED][eNB] Started eNB main thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(),
-                   (policy == SCHED_FIFO)  ? "SCHED_FIFO" :
-                   (policy == SCHED_RR)    ? "SCHED_RR" :
-                   (policy == SCHED_OTHER) ? "SCHED_OTHER" :
-                   "???",
-                   (int) sparam.sched_priority, cpu_affinity);
-
-
-#endif //LOWLATENCY
-
-
-  // stop early, if an exit is requested
-  // FIXME really neccessary?
-  if (oai_exit)
-    goto eNB_thread_cleanup;
-
-  printf("eNB_thread: mlockall in ...\n");
-  mlockall(MCL_CURRENT | MCL_FUTURE);
-  printf("eNB_thread: mlockall out ...\n");
-
-  timing_info.time_min = 100000000ULL;
-  timing_info.time_max = 0;
-  timing_info.time_avg = 0;
-  timing_info.n_samples = 0;
-
-  printf( "waiting for sync (eNB_thread)\n" );
-  pthread_mutex_lock( &sync_mutex );
-
-  while (sync_var<0)
-    pthread_cond_wait( &sync_cond, &sync_mutex );
-
-  pthread_mutex_unlock(&sync_mutex);
-
-  printf( "got sync (eNB_thread)\n" );
-
-  int frame = 0;
-
-
-  spp        = openair0_cfg[0].samples_per_packet;
-  tx_pos     = openair0_cfg[0].tx_scheduling_advance;
-
-#if defined(ENABLE_ITTI)
-  wait_system_ready ("Waiting for eNB application to be ready %s\r", &start_eNB);
-#endif 
-
-  while (!oai_exit) {
-    start_meas( &softmodem_stats_mt );
-
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe );
-    VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame );
-    tx_launched = 0;
-
-    while (rx_pos < ((1+hw_subframe)*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti)) {
-
-      unsigned int rxs;
-#ifndef USRP_DEBUG
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TXCNT, tx_pos );
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, rx_pos );
-
-      clock_gettime( CLOCK_MONOTONIC, &trx_time0 );
-
-      start_meas( &softmodem_stats_hw );
-
-      openair0_timestamp timestamp;
-      int i=0;
-      // prepare rx buffer pointers
-      for (i=0; i<PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx; i++)
-        rxp[i] = (void*)&rxdata[i][rx_pos];
-	// check if nsymb_read == spp
-	// map antenna port i to the cc_id. Now use the 1:1 mapping
-	rxs = openair0.trx_read_func(&openair0,
-				     &timestamp,
-				     rxp,
-				     spp,
-				     PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_rx);
-      
-      stop_meas( &softmodem_stats_hw );
-      if (frame > 50) { 
-	  clock_gettime( CLOCK_MONOTONIC, &trx_time1 );
-      }
-
-      if (frame > 20){ 
-	if (rxs != spp)
-	  exit_fun( "problem receiving samples" );
-      }
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
-
-      // Transmit TX buffer based on timestamp from RX
-    
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
-      // prepare tx buffer pointers
-      for (i=0; i<PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx; i++)
-	txp[i] = (void*)&txdata[i][tx_pos];
-      // if symb_written < spp ==> error 
-      if (frame > 50) {
-	openair0.trx_write_func(&openair0,
-				(timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance),
-				txp,
-				spp,
-				PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx,
-				1);
-      }
-      
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff );
-      VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance)&0xffffffff );
-
-      stop_meas( &softmodem_stats_mt );
-      if (frame > 50) { 
-	  clock_gettime( CLOCK_MONOTONIC, &trx_time2 );
-	  //update_difftimes(trx_time1, trx_time2);
-      }
-
-
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0);
-#else
-      // USRP_DEBUG is active
-      rt_sleep_ns(1000000);
-#endif
-
-      if ( (frame>50) && (tx_launched == 0) &&
-	   ((openair0_cfg[card].txlaunch_wait == 0) ||
-	    ((openair0_cfg[card].txlaunch_wait == 1) &&
-	     (rx_pos >= (((2*hw_subframe)+openair0_cfg[card].txlaunch_wait_slotcount)*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti>>1))))) { 
-	
-        tx_launched = 1;
-
-        for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-          if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].mutex_tx) != 0) {
-            LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n", hw_subframe, PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx );
-            exit_fun( "error locking mutex_tx" );
-            break;
-          }
-
-          int cnt_tx = ++PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].instance_cnt_tx;
-
-          pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].mutex_tx );
-
-          if (cnt_tx == 0) {
-            // the thread was presumably waiting where it should and can now be woken up
-            if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].cond_tx) != 0) {
-              LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n", hw_subframe );
-              exit_fun( "ERROR pthread_cond_signal" );
-              break;
-            }
-          } else {
-            LOG_W( PHY,"[eNB] Frame %d, eNB TX thread %d busy!! (rx_cnt %u, cnt_tx %i)\n", PHY_vars_eNB_g[0][CC_id]->proc[hw_subframe].frame_tx, hw_subframe, rx_pos, cnt_tx );
-            exit_fun( "TX thread busy" );
-            break;
-          }
-        }
-      }
-
-      rx_pos += spp;
-      tx_pos += spp;
-
-      if (tx_pos >= openair0_cfg[card].samples_per_frame)
-        tx_pos -= openair0_cfg[card].samples_per_frame;
-    }
-
-    if (rx_pos >= openair0_cfg[card].samples_per_frame)
-      rx_pos -= openair0_cfg[card].samples_per_frame;
-
-
-
-    if (oai_exit) break;
-
-    timing_info.time_last = timing_info.time_now;
-    timing_info.time_now = rt_get_time_ns();
-
-    if (timing_info.n_samples>0) {
-      RTIME time_diff = timing_info.time_now - timing_info.time_last;
-
-      if (time_diff < timing_info.time_min)
-        timing_info.time_min = time_diff;
-
-      if (time_diff > timing_info.time_max)
-        timing_info.time_max = time_diff;
-
-      timing_info.time_avg += time_diff;
-    }
-
-    timing_info.n_samples++;
-
-    if ((slot&1) == 1) {
-      // odd slot
-      int sf = hw_subframe;
-      if (frame>50) {
-	for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-	  if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx) != 0) {
-	    LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n", sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx );
-	    exit_fun( "error locking mutex_rx" );
-	    break;
-	  }
-	 
-	  int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx;
-	  
-	  pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx );
-	  
-	  if (cnt_rx == 0) {
-	    // the thread was presumably waiting where it should and can now be woken up
-	    if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) {
-	      LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf );
-	      exit_fun( "ERROR pthread_cond_signal" );
-	      break;
-	    }
-	  } else {
-	    LOG_W( PHY, "[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n", PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx, sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx, CC_id );
-	    exit_fun( "RX thread busy" );
-	    break;
-	  }
-	}
-      }
-    }
-
-    hw_subframe++;
-    slot += 2;
-
-    if (hw_subframe == NUM_ENB_THREADS) {
-      // the radio frame is complete, start over
-      hw_subframe = 0;
-      frame++;
-      slot = 1;
-    }
-
-#if defined(ENABLE_ITTI)
-    itti_update_lte_time( frame, slot );
-#endif
-  }
-
-eNB_thread_cleanup:
-#ifdef DEBUG_THREADS
-  printf( "eNB_thread: finished, ran %d times.\n", frame );
-#endif
-
-#ifdef DEBUG_THREADS
-  printf( "Exiting eNB_thread ..." );
-#endif
-
-  eNB_thread_status = 0;
-
-  // print_difftimes();
-
-  return &eNB_thread_status;
-}
-*/
-
 void reset_opp_meas(void) {
   int sfn;
   reset_meas(&softmodem_stats_mt);
   reset_meas(&softmodem_stats_hw);
   
   for (sfn=0; sfn < 10; sfn++) {
-    reset_meas(&softmodem_stats_tx_sf[sfn]);
-    reset_meas(&softmodem_stats_rx_sf[sfn]);
+    reset_meas(&softmodem_stats_tx_sf);
+    reset_meas(&softmodem_stats_rx_sf);
   }
 }
 
@@ -1582,8 +1211,8 @@ void print_opp_meas(void) {
   print_meas(&softmodem_stats_hw, "HW Acquisation", NULL, NULL);
   
   for (sfn=0; sfn < 10; sfn++) {
-    print_meas(&softmodem_stats_tx_sf[sfn],"[eNB][total_phy_proc_tx]",NULL, NULL);
-    print_meas(&softmodem_stats_rx_sf[sfn],"[eNB][total_phy_proc_rx]",NULL,NULL);
+    print_meas(&softmodem_stats_tx_sf,"[eNB][total_phy_proc_tx]",NULL, NULL);
+    print_meas(&softmodem_stats_rx_sf,"[eNB][total_phy_proc_rx]",NULL,NULL);
   }
 }