From d3d423f51ebbe94affbb3999aa30313781c839d3 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Sun, 15 May 2016 14:10:04 -0700
Subject: [PATCH] split phy_procedures_eNB_TX into sub-modules for better
 understanding. No functional differences.

---
 openair1/PHY/LTE_TRANSPORT/defs.h         |    4 +-
 openair1/PHY/LTE_TRANSPORT/prach.c        |    2 +-
 openair1/PHY/LTE_TRANSPORT/print_stats.c  |    4 +-
 openair1/PHY/TOOLS/lte_phy_scope.c        |    4 +-
 openair1/PHY/TOOLS/lte_phy_scope.h        |    1 -
 openair1/PHY/defs.h                       |   14 +
 openair1/SCHED/defs.h                     |    3 +-
 openair1/SCHED/extern.h                   |    1 -
 openair1/SCHED/phy_mac_stub.c             |   66 +-
 openair1/SCHED/phy_procedures_lte_eNb.c   | 2667 ++++++++++-----------
 openair1/SCHED/phy_procedures_lte_ue.c    |   71 +-
 openair1/SCHED/vars.h                     |    1 -
 openair2/LAYER2/MAC/eNB_scheduler_dlsch.c |   10 +-
 openair2/LAYER2/MAC/eNB_scheduler_ulsch.c |    8 +-
 openair2/LAYER2/MAC/pre_processor.c       |    2 +-
 targets/RT/USER/lte-softmodem.c           |   49 +-
 targets/RT/USER/lte-ue.c                  |    4 +-
 targets/SIMU/USER/oaisim.c                |    2 +-
 targets/SIMU/USER/oaisim_functions.c      |   21 +-
 19 files changed, 1402 insertions(+), 1532 deletions(-)

diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
index 43bc7e3515..a8ebb99c8a 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -726,7 +726,9 @@ typedef enum {format0,
               format2B,
               format2C,
               format2D,
-              format3
+              format3,
+	      format3A,
+	      format4
              } DCI_format_t;
 
 typedef enum {
diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c
index b93519d393..5e58b13737 100644
--- a/openair1/PHY/LTE_TRANSPORT/prach.c
+++ b/openair1/PHY/LTE_TRANSPORT/prach.c
@@ -638,7 +638,7 @@ int32_t generate_prach( PHY_VARS_UE *phy_vars_ue, uint8_t eNB_id, uint8_t subfra
   prach_start = ((subframe*phy_vars_ue->lte_frame_parms.samples_per_tti)<<1)-phy_vars_ue->N_TA_offset;
 #else
 #if defined(EXMIMO) || defined(OAI_USRP)
-  prach_start =  (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-openair_daq_vars.timing_advance-phy_vars_ue->N_TA_offset);
+  prach_start =  (phy_vars_ue->rx_offset+subframe*phy_vars_ue->lte_frame_parms.samples_per_tti-phy_vars_ue->hw_timing_advance-phy_vars_ue->N_TA_offset);
 
   if (prach_start<0)
     prach_start+=(phy_vars_ue->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME);
diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c
index 7445fca40f..16cc75b290 100644
--- a/openair1/PHY/LTE_TRANSPORT/print_stats.c
+++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c
@@ -102,7 +102,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
     len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB);
 #endif
 #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)
-    len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset);
+    len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz, estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset);
 #endif
     len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]);
     len += sprintf(&buffer[len], "[UE PROC] timing_advance = %d\n",phy_vars_ue->timing_advance);
@@ -529,7 +529,7 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
 #endif
       len += sprintf(&buffer[len], "[UE PROC] DLSCH Bitrate %dkbps\n",(phy_vars_ue->bitrate[0]/1000));
       len += sprintf(&buffer[len], "[UE PROC] Total Received Bits %dkbits\n",(phy_vars_ue->total_received_bits[0]/1000));
-      len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",openair_daq_vars.use_ia_receiver);
+      len += sprintf(&buffer[len], "[UE PROC] IA receiver %d\n",phy_vars_ue->use_ia_receiver);
 
     }
 
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.c b/openair1/PHY/TOOLS/lte_phy_scope.c
index 4b623fb9dc..468aae8052 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.c
+++ b/openair1/PHY/TOOLS/lte_phy_scope.c
@@ -47,11 +47,11 @@ static void ia_receiver_on_off( FL_OBJECT *button, long arg)
 
   if (fl_get_button(button)) {
     fl_set_object_label(button, "IA Receiver ON");
-    openair_daq_vars.use_ia_receiver = 1;
+    //    PHY_vars_UE_g[0][0]->use_ia_receiver = 1;
     fl_set_object_color(button, FL_GREEN, FL_GREEN);
   } else {
     fl_set_object_label(button, "IA Receiver OFF");
-    openair_daq_vars.use_ia_receiver = 0;
+    //    PHY_vars_UE_g[0][0]->use_ia_receiver = 0;
     fl_set_object_color(button, FL_RED, FL_RED);
   }
 }
diff --git a/openair1/PHY/TOOLS/lte_phy_scope.h b/openair1/PHY/TOOLS/lte_phy_scope.h
index 877934fc7a..814e340808 100644
--- a/openair1/PHY/TOOLS/lte_phy_scope.h
+++ b/openair1/PHY/TOOLS/lte_phy_scope.h
@@ -37,7 +37,6 @@
 #include "../defs.h"
 #include "../../SCHED/defs.h" // for OPENAIR_DAQ_VARS
 
-extern OPENAIR_DAQ_VARS openair_daq_vars;
 
 /* Forms and Objects */
 typedef struct {
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index 26239b024c..b72c5f648a 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -330,6 +330,15 @@ typedef struct PHY_VARS_eNB_s {
   MU_MIMO_mode mu_mimo_mode[NUMBER_OF_UE_MAX];
 
 
+  /// target_ue_dl_mcs : only for debug purposes
+  uint32_t target_ue_dl_mcs;
+  /// target_ue_ul_mcs : only for debug purposes
+  uint32_t target_ue_ul_mcs;
+  /// target_ue_dl_rballoc : only for debug purposes
+  uint32_t ue_dl_rb_alloc;
+  /// target ul PRBs : only for debug
+  uint32_t ue_ul_nb_rb;
+
   ///check for Total Transmissions
   uint32_t check_for_total_transmissions;
 
@@ -347,6 +356,8 @@ typedef struct PHY_VARS_eNB_s {
   uint32_t total_transmitted_bits;
   uint32_t total_system_throughput;
 
+  int              hw_timing_advance;
+
   time_stats_t phy_proc;
   time_stats_t phy_proc_tx;
   time_stats_t phy_proc_rx;
@@ -577,6 +588,7 @@ typedef struct {
   //  uint8_t               prach_timer;
   int              rx_offset; /// Timing offset
   int              timing_advance; ///timing advance signalled from eNB
+  int              hw_timing_advance;
   int              N_TA_offset; ///timing offset used in TDD
   /// Flag to tell if UE is secondary user (cognitive mode)
   unsigned char    is_secondary_ue;
@@ -645,6 +657,8 @@ typedef struct {
   time_stats_t phy_proc_tx;
   time_stats_t phy_proc_rx;
 
+  uint32_t use_ia_receiver;
+
   time_stats_t ofdm_mod_stats;
   time_stats_t ulsch_encoding_stats;
   time_stats_t ulsch_modulation_stats;
diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h
index af6acca880..23e44d6692 100644
--- a/openair1/SCHED/defs.h
+++ b/openair1/SCHED/defs.h
@@ -86,7 +86,7 @@ enum openair_SYNCH_STATUS {
 #define DAQ_AGC_OFF 0
 
 
-
+/*
 typedef struct {
   boolean_t  is_eNB;
   uint8_t    mode;
@@ -133,6 +133,7 @@ typedef struct {
   uint32_t   get_frame_done;
   uint32_t   use_ia_receiver;
 } OPENAIR_DAQ_VARS;
+*/
 
 #ifndef USER_MODE
 int32_t openair_sched_init(void);
diff --git a/openair1/SCHED/extern.h b/openair1/SCHED/extern.h
index dd3892a290..657037b823 100644
--- a/openair1/SCHED/extern.h
+++ b/openair1/SCHED/extern.h
@@ -75,7 +75,6 @@ extern int openair_sched_status;
 
 extern int synch_wait_cnt;
 
-extern OPENAIR_DAQ_VARS openair_daq_vars;
 
 extern int16_t hundred_times_delta_TF[100];
 extern uint16_t hundred_times_log10_NPRB[100];
diff --git a/openair1/SCHED/phy_mac_stub.c b/openair1/SCHED/phy_mac_stub.c
index 286b11b4ad..ea6e45e739 100644
--- a/openair1/SCHED/phy_mac_stub.c
+++ b/openair1/SCHED/phy_mac_stub.c
@@ -234,7 +234,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc          = rballoc;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC              = 0;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
-          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
@@ -253,7 +253,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid         = 1;
           //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
-          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = 1;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
@@ -265,7 +265,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->TPC              = 0;
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
-          ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           //((DCI1_5MHz_TDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
           ((DCI1_5MHz_TDD_t *)&dlsch_pdu)->rv               = 0;
@@ -284,7 +284,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid         = 1;
           //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
-          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = 1;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
@@ -301,7 +301,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rballoc          = rballoc;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->TPC              = 0;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
-          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
@@ -320,7 +320,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid         = 1;
           //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
-          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi              = 1;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
@@ -332,7 +332,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->TPC              = 0;
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
-          ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           //((DCI1_10MHz_TDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
           ((DCI1_10MHz_TDD_t *)&dlsch_pdu)->rv               = 0;
@@ -351,7 +351,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->harq_pid         = 1;
           //((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
-          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->ndi              = 1;
           ((DCI1_10MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_10MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_10MHz_TDD_t));
@@ -367,7 +367,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rballoc          = rballoc;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->TPC              = 0;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
-          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
@@ -386,7 +386,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->harq_pid         = 1;
           //((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
-          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->ndi              = 1;
           ((DCI1_5MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_5MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
@@ -398,7 +398,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->TPC              = 0;
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
-          ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           //((DCI1_20MHz_TDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
           ((DCI1_20MHz_TDD_t *)&dlsch_pdu)->rv               = 0;
@@ -417,7 +417,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
           ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->dai              = 0;
           ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->harq_pid         = 1;
           //((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs              = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
-          ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs              = openair_daq_vars.target_ue_dl_mcs;
+          ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->mcs              = phy_vars_eNB->target_ue_dl_mcs;
           ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->ndi              = 1;
           ((DCI1_20MHz_FDD_t *)&dlsch_pdu)->rv               = 0;
           memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&((DCI1_20MHz_FDD_t *)&dlsch_pdu)->,sizeof(DCI1_5MHz_TDD_t));
@@ -438,14 +438,14 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
       ((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     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
-      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1     = openair_daq_vars.target_ue_dl_mcs;
+      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs1     = phy_vars_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     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
-      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2     = openair_daq_vars.target_ue_dl_mcs;
+      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->mcs2     = phy_vars_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];
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->TPC      = 0;
-      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc  = openair_daq_vars.ue_dl_rb_alloc;
+      ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rballoc  = phy_vars_eNB->ue_dl_rb_alloc;
       ((DCI2_5MHz_2A_FDD_t*) (&DCI_pdu->dci_alloc[0].dci_pdu))->rah      = 0;
 
     } else if (transmission_mode==5) {
@@ -462,13 +462,13 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
       DLSCH_alloc_pdu1E.ndi              = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
       //DLSCH_alloc_pdu1E.mcs            = cqi_to_mcs[phy_vars_eNB->eNB_UE_stats->DL_cqi[0]];
       //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
-      DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      DLSCH_alloc_pdu1E.mcs              = phy_vars_eNB->target_ue_dl_mcs;
       //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->proc[subframe].frame%1024)%28);
       phy_vars_eNB->eNB_UE_stats[0].dlsch_mcs1 = DLSCH_alloc_pdu1E.mcs;
       DLSCH_alloc_pdu1E.harq_pid         =   DLSCH_ptr->harq_pid_freelist[DLSCH_ptr->head_freelist];
       DLSCH_alloc_pdu1E.dai              = 0;
       DLSCH_alloc_pdu1E.TPC              = 0;
-      DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
+      DLSCH_alloc_pdu1E.rballoc          = phy_vars_eNB->ue_dl_rb_alloc;
       DLSCH_alloc_pdu1E.rah              = 0;
       DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
       memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
@@ -479,7 +479,7 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
       DCI_pdu->dci_alloc[1].rnti       = 0x1236;
       DCI_pdu->dci_alloc[1].format     = format1E_2A_M10PRB;
       DCI_pdu->dci_alloc[1].ra_flag    = 0;
-      //DLSCH_alloc_pdu1E.mcs            = openair_daq_vars.target_ue_dl_mcs;
+      //DLSCH_alloc_pdu1E.mcs            = phy_vars_eNB->target_ue_dl_mcs;
       //DLSCH_alloc_pdu1E.mcs            = (unsigned char) (taus()%28);
       //DLSCH_alloc_pdu1E.mcs            = (unsigned char) ((phy_vars_eNB->frame%1024)%28);
       DLSCH_alloc_pdu1E.mcs            = (unsigned char) (((phy_vars_eNB->proc[sched_subframe].frame_tx%1024)/3)%28);
@@ -531,8 +531,8 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
 
     UL_alloc_pdu.type    = 0;
     UL_alloc_pdu.hopping = 0;
-    UL_alloc_pdu.rballoc = computeRIV(25,2,openair_daq_vars.ue_ul_nb_rb);
-    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
+    UL_alloc_pdu.rballoc = computeRIV(25,2,phy_vars_eNB->ue_ul_nb_rb);
+    UL_alloc_pdu.mcs     = phy_vars_eNB->target_ue_ul_mcs;
     UL_alloc_pdu.ndi     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
     UL_alloc_pdu.TPC     = 0;
     UL_alloc_pdu.cshift  = 0;
@@ -551,10 +551,10 @@ void fill_dci(DCI_PDU *DCI_pdu, uint8_t sched_subframe, PHY_VARS_eNB *phy_vars_e
     UL_alloc_pdu.type    = 0;
     UL_alloc_pdu.hopping = 0;
     if (cooperation_flag==0)
-      UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
+      UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb);
     else
-      UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
-    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
+      UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb);
+    UL_alloc_pdu.mcs     = phy_vars_eNB->target_ue_ul_mcs;
     UL_alloc_pdu.ndi     = phy_vars_eNB->proc[sched_subframe].frame_tx&1;
     UL_alloc_pdu.TPC     = 0;
     if ((cooperation_flag==0) || (cooperation_flag==1))
@@ -611,11 +611,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN
       DCI_pdu->dci_alloc[0].format     = format1;
       DCI_pdu->dci_alloc[0].ra_flag    = 0;
 
-      DLSCH_alloc_pdu.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
+      DLSCH_alloc_pdu.rballoc          = phy_vars_eNB->ue_dl_rb_alloc;
       DLSCH_alloc_pdu.TPC              = 0;
       DLSCH_alloc_pdu.dai              = 0;
       DLSCH_alloc_pdu.harq_pid         = 1;
-      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      DLSCH_alloc_pdu.mcs              = phy_vars_eNB->target_ue_dl_mcs;
       DLSCH_alloc_pdu.ndi              = 1;
       DLSCH_alloc_pdu.rv               = 0;
       memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
@@ -632,7 +632,7 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN
       DLSCH_alloc_pdu.TPC              = 0;
       DLSCH_alloc_pdu.dai              = 0;
       DLSCH_alloc_pdu.harq_pid         = 1;
-      DLSCH_alloc_pdu.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      DLSCH_alloc_pdu.mcs              = phy_vars_eNB->target_ue_dl_mcs;
       DLSCH_alloc_pdu.ndi              = 1;
       DLSCH_alloc_pdu.rv               = 0;
       memcpy((void*)&DCI_pdu->dci_alloc[1].dci_pdu[0],(void *)&DLSCH_alloc_pdu,sizeof(DCI1_5MHz_TDD_t));
@@ -649,11 +649,11 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN
       DLSCH_alloc_pdu1E.tpmi             = 5; //5=use feedback
       DLSCH_alloc_pdu1E.rv               = 0;
       DLSCH_alloc_pdu1E.ndi              = 1;
-      DLSCH_alloc_pdu1E.mcs              = openair_daq_vars.target_ue_dl_mcs;
+      DLSCH_alloc_pdu1E.mcs              = phy_vars_eNB->target_ue_dl_mcs;
       DLSCH_alloc_pdu1E.harq_pid         = 1;
       DLSCH_alloc_pdu1E.dai              = 0;
       DLSCH_alloc_pdu1E.TPC              = 0;
-      DLSCH_alloc_pdu1E.rballoc          = openair_daq_vars.ue_dl_rb_alloc;
+      DLSCH_alloc_pdu1E.rballoc          = phy_vars_eNB->ue_dl_rb_alloc;
       DLSCH_alloc_pdu1E.rah              = 0;
       DLSCH_alloc_pdu1E.dl_power_off     = 0; //0=second user present
       memcpy((void*)&DCI_pdu->dci_alloc[0].dci_pdu[0],(void *)&DLSCH_alloc_pdu1E,sizeof(DCI1E_5MHz_2A_M10PRB_TDD_t));
@@ -705,8 +705,8 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN
 
     UL_alloc_pdu.type    = 0;
     UL_alloc_pdu.hopping = 0;
-    UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
-    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
+    UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb);
+    UL_alloc_pdu.mcs     = phy_vars_eNB->target_ue_ul_mcs;
     UL_alloc_pdu.ndi     = 1;
     UL_alloc_pdu.TPC     = 0;
     UL_alloc_pdu.cshift  = 0;
@@ -725,10 +725,10 @@ void fill_dci_emos(DCI_PDU *DCI_pdu, uint8_t subframe, PHY_VARS_eNB *phy_vars_eN
     UL_alloc_pdu.type    = 0;
     UL_alloc_pdu.hopping = 0;
     if (cooperation_flag==0)
-    UL_alloc_pdu.rballoc = computeRIV(25,2+openair_daq_vars.ue_ul_nb_rb,openair_daq_vars.ue_ul_nb_rb);
+    UL_alloc_pdu.rballoc = computeRIV(25,2+phy_vars_eNB->ue_ul_nb_rb,phy_vars_eNB->ue_ul_nb_rb);
     else
-    UL_alloc_pdu.rballoc = computeRIV(25,0,openair_daq_vars.ue_ul_nb_rb);
-    UL_alloc_pdu.mcs     = openair_daq_vars.target_ue_ul_mcs;
+    UL_alloc_pdu.rballoc = computeRIV(25,0,phy_vars_eNB->ue_ul_nb_rb);
+    UL_alloc_pdu.mcs     = phy_vars_eNB->target_ue_ul_mcs;
     UL_alloc_pdu.ndi     = 1;
     UL_alloc_pdu.TPC     = 0;
     if ((cooperation_flag==0) || (cooperation_flag==1))
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 6a785ebf33..b0a94b8f59 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -90,7 +90,7 @@ int max_sync_pos;
 fifo_dump_emos_eNB emos_dump_eNB;
 #endif
 
-#if defined(SMBV) && !defined(EXMIMO)
+#if defined(SMBV) 
 extern const char smbv_fname[];
 extern unsigned short config_frames[4];
 extern uint8_t smbv_frame_cnt;
@@ -211,7 +211,7 @@ int mac_phy_remove_ue(module_id_t Mod_idP,rnti_t rntiP) {
 #ifdef DEBUG_PHY_PROC
 	  LOG_I(PHY,"eNB %d removing UE %d with rnti %x\n",phy_vars_eNB->Mod_id,i,rnti);
 #endif
-	  //msg("[PHY] UE_id %d\n",i);
+	  //LOG_D(PHY,("[PHY] UE_id %d\n",i);
 	  clean_eNb_dlsch(phy_vars_eNB->dlsch_eNB[i][0]);
 	  clean_eNb_ulsch(phy_vars_eNB->ulsch_eNB[i]);
 	  //phy_vars_eNB->eNB_UE_stats[i].crnti = 0;
@@ -562,640 +562,846 @@ void phy_eNB_lte_check_measurement_thresholds(instance_t instanceP, ral_threshol
 
 unsigned int taus(void);
 
-void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,uint8_t abstraction_flag,
-                           relaying_type_t r_type,PHY_VARS_RN *phy_vars_rn)
-{
-  UNUSED(phy_vars_rn);
-  uint8_t *pbch_pdu=&phy_vars_eNB->pbch_pdu[0];
-  uint16_t input_buffer_length, re_allocated=0;
-  uint32_t i,aa;
-  uint8_t harq_pid;
-  DCI_PDU *DCI_pdu;
-  uint8_t *DLSCH_pdu=NULL;
-  DCI_PDU DCI_pdu_tmp;
-  uint8_t DLSCH_pdu_tmp[768*8];
-  int8_t UE_id;
-  uint8_t num_pdcch_symbols=0;
-  uint8_t ul_subframe;
-  uint32_t ul_frame;
+void pmch_procedures(PHY_VARS_eNB *eNB,PHY_VARS_RN *rn, int subframe,int sched_subframe,int abstraction_flag,relaying_type_t r_type) {
+
 #ifdef Rel10
   MCH_PDU *mch_pduP;
   MCH_PDU  mch_pdu;
   //  uint8_t sync_area=255;
 #endif
-#if defined(SMBV) && !defined(EXMIMO)
-  // counts number of allocations in subframe
-  // there is at least one allocation for PDCCH
-  uint8_t smbv_alloc_cnt = 1;
-#endif
-  int frame = phy_vars_eNB->proc[sched_subframe].frame_tx;
-  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_tx;
-
-  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
-  start_meas(&phy_vars_eNB->phy_proc_tx);
-
-  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
-    // If we've dropped the UE, go back to PRACH mode for this UE
-
-    if (phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) {
-      LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n",
-            phy_vars_eNB->Mod_id,phy_vars_eNB->CC_id,frame,subframe, i, phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors);
-      phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
-      mac_xface->UL_failure_indication(phy_vars_eNB->Mod_id,
-				       phy_vars_eNB->CC_id,
-				       frame,
-				       phy_vars_eNB->eNB_UE_stats[i].crnti,
-				       subframe);
-				       
-    }
-	
-
-  }
-
-
-  // Get scheduling info for next subframe
-  if (phy_vars_eNB->mac_enabled==1) {
-    if (phy_vars_eNB->CC_id == 0) {
-      mac_xface->eNB_dlsch_ulsch_scheduler(phy_vars_eNB->Mod_id,0,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);//,1);
-    }
-  }
 
   if (abstraction_flag==0) {
-    // clear the transmit data array for the current subframe
-    for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx_eNB; aa++) {
-
-      memset(&phy_vars_eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)],
-             0,phy_vars_eNB->lte_frame_parms.ofdm_symbol_size*(phy_vars_eNB->lte_frame_parms.symbols_per_tti)*sizeof(int32_t));
-    }
+    // This is DL-Cell spec pilots in Control region
+    generate_pilots_slot(eNB,
+			 eNB->lte_eNB_common_vars.txdataF[0],
+			 AMP,
+			 subframe<<1,1);
   }
-
-
-  if (is_pmch_subframe(phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,&phy_vars_eNB->lte_frame_parms)) {
-
-    if (abstraction_flag==0) {
-      // This is DL-Cell spec pilots in Control region
-      generate_pilots_slot(phy_vars_eNB,
-                           phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                           AMP,
-                           subframe<<1,1);
-    }
-
+  
 #ifdef Rel10
-    // if mcch is active, send regardless of the node type: eNB or RN
-    // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing
-    mch_pduP = mac_xface->get_mch_sdu(phy_vars_eNB->Mod_id,
-                                      phy_vars_eNB->CC_id,
-                                      phy_vars_eNB->proc[sched_subframe].frame_tx,
-                                      subframe);
-
-    switch (r_type) {
-    case no_relay:
-      if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
-        LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n",
-              phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs,
-              phy_vars_eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
-      else {
-        LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n",
-              phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->sync_area,
-              (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment");
-        mch_pduP = NULL;
-      }
-
-      break;
-
-    case multicast_relay:
-      if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) {
-        LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN  sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
-              phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,
-              mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);
-      } else if (phy_vars_rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8
-        mch_pduP= &mch_pdu;
-        memcpy(&mch_pduP->payload, // could be a simple copy
-               phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b,
-               phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
-        mch_pduP->Pdu_size = (uint16_t) (phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
-        mch_pduP->mcs = phy_vars_rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs;
-        LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
-              phy_vars_rn->Mod_id,phy_vars_rn->frame, subframe,subframe%5,
-              phy_vars_rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size);
-      } else {
-        mch_pduP=NULL;
-      }
-
-      phy_vars_rn->mch_avtive[subframe]=0;
-      break;
-
-    default:
-      LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n",
-            phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,r_type);
-      mch_pduP=NULL;
-      break;
-    }// switch
-
-    if (mch_pduP) {
-      fill_eNB_dlsch_MCH(phy_vars_eNB,mch_pduP->mcs,1,0, abstraction_flag);
-      // Generate PMCH
-      generate_mch(phy_vars_eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag);
-#ifdef DEBUG_PHY
-
-      for (i=0; i<mch_pduP->Pdu_size; i++)
-        msg("%2"PRIx8".",(uint8_t)mch_pduP->payload[i]);
-
-      msg("\n");
-#endif
+  // if mcch is active, send regardless of the node type: eNB or RN
+  // when mcch is active, MAC sched does not allow MCCH and MTCH multiplexing
+  mch_pduP = mac_xface->get_mch_sdu(eNB->Mod_id,
+				    eNB->CC_id,
+				    eNB->proc[sched_subframe].frame_tx,
+				    subframe);
+  
+  switch (r_type) {
+  case no_relay:
+    if ((mch_pduP->Pdu_size > 0) && (mch_pduP->sync_area == 0)) // TEST: only transmit mcch for sync area 0
+      LOG_I(PHY,"[eNB%"PRIu8"] Frame %d subframe %d : Got MCH pdu for MBSFN (MCS %"PRIu8", TBS %d) \n",
+	    eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->mcs,
+	    eNB->dlsch_eNB_MCH->harq_processes[0]->TBS>>3);
+    else {
+      LOG_D(PHY,"[DeNB %"PRIu8"] Frame %d subframe %d : Do not transmit MCH pdu for MBSFN sync area %"PRIu8" (%s)\n",
+	    eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,mch_pduP->sync_area,
+	    (mch_pduP->Pdu_size == 0)? "Empty MCH PDU":"Let RN transmit for the moment");
+      mch_pduP = NULL;
+    }
+    
+    break;
+    
+  case multicast_relay:
+    if ((mch_pduP->Pdu_size > 0) && ((mch_pduP->mcch_active == 1) || mch_pduP->msi_active==1)) {
+      LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Got the MCH PDU for MBSFN  sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
+	    rn->Mod_id,rn->frame, subframe,
+	    mch_pduP->sync_area,mch_pduP->mcs,mch_pduP->Pdu_size);
+    } else if (rn->mch_avtive[subframe%5] == 1) { // SF2 -> SF7, SF3 -> SF8
+      mch_pduP= &mch_pdu;
+      memcpy(&mch_pduP->payload, // could be a simple copy
+	     rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->b,
+	     rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
+      mch_pduP->Pdu_size = (uint16_t) (rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->TBS>>3);
+      mch_pduP->mcs = rn->dlsch_rn_MCH[subframe%5]->harq_processes[0]->mcs;
+      LOG_I(PHY,"[RN %"PRIu8"] Frame %d subframe %d: Forward the MCH PDU for MBSFN received on SF %d sync area %"PRIu8" (MCS %"PRIu8", TBS %"PRIu16")\n",
+	    rn->Mod_id,rn->frame, subframe,subframe%5,
+	    rn->sync_area[subframe%5],mch_pduP->mcs,mch_pduP->Pdu_size);
     } else {
-      LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
+      mch_pduP=NULL;
     }
-
-#endif
+    
+    rn->mch_avtive[subframe]=0;
+    break;
+    
+  default:
+    LOG_W(PHY,"[eNB %"PRIu8"] Frame %d subframe %d: unknown relaying type %d \n",
+	  eNB->Mod_id,eNB->proc[sched_subframe].frame_tx,subframe,r_type);
+    mch_pduP=NULL;
+    break;
+  }// switch
+  
+  if (mch_pduP) {
+    fill_eNB_dlsch_MCH(eNB,mch_pduP->mcs,1,0, abstraction_flag);
+    // Generate PMCH
+    generate_mch(eNB,sched_subframe,(uint8_t*)mch_pduP->payload,abstraction_flag);
+  } else {
+    LOG_D(PHY,"[eNB/RN] Frame %d subframe %d: MCH not generated \n",eNB->proc[sched_subframe].frame_tx,subframe);
   }
+  
+#endif
+}
 
-  else {
-    // this is not a pmch subframe
+void common_signal_procedures (int subframe,int sched_subframe,PHY_VARS_eNB *eNB,int abstraction_flag) {
 
-    if (abstraction_flag==0) {
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
-      generate_pilots_slot(phy_vars_eNB,
-                           phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                           AMP,
-                           subframe<<1,0);
-      if (subframe_select(&phy_vars_eNB->lte_frame_parms,subframe) == SF_DL)
-	generate_pilots_slot(phy_vars_eNB,
-			     phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-			     AMP,
-			     (subframe<<1)+1,0);
-
-      VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0);
-
-      // First half of PSS/SSS (FDD)
-      if (subframe == 0) {
-        if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
-          generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                       AMP,
-                       &phy_vars_eNB->lte_frame_parms,
-                       (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
-                       0);
-          generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                       AMP,
-                       &phy_vars_eNB->lte_frame_parms,
-                       (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4,
-                       0);
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
+  int **txdataF = eNB->lte_eNB_common_vars.txdataF[0];
+  uint8_t *pbch_pdu=&eNB->pbch_pdu[0];
 
-        }
-      }
-    }
-  }
+  // generate Cell-Specific Reference Signals for both slots
+  if (abstraction_flag==0) {
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
+    generate_pilots_slot(eNB,
+			 txdataF,
+			 AMP,
+			 subframe<<1,0);
+    // check that 2nd slot is for DL
+    if (subframe_select(fp,subframe) == SF_DL)
+      generate_pilots_slot(eNB,
+			   txdataF,
+			   AMP,
+			   (subframe<<1)+1,0);
+    
+    VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,0);
+  }    
 
+  // First half of PSS/SSS (FDD, slot 0)
   if (subframe == 0) {
+    if ((fp->frame_type == FDD) &&
+	(abstraction_flag==0)) {
+      generate_pss(txdataF,
+		   AMP,
+		   fp,
+		   (fp->Ncp==NORMAL) ? 6 : 5,
+		   0);
+      generate_sss(txdataF,
+		   AMP,
+		   fp,
+		   (fp->Ncp==NORMAL) ? 5 : 4,
+		   0);
+      
+    }
+    
     // generate PBCH (Physical Broadcast CHannel) info
-    if ((phy_vars_eNB->proc[sched_subframe].frame_tx&3) == 0) {
+    if ((eNB->proc[sched_subframe].frame_tx&3) == 0) {
       pbch_pdu[2] = 0;
-
+      
       // FIXME setting pbch_pdu[2] to zero makes the switch statement easier: remove all the or-operators
-      switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
+      switch (fp->N_RB_DL) {
       case 6:
-        pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (0<<5);
+	break;
+	
       case 15:
-        pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (1<<5);
+	break;
+	
       case 25:
-        pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5);
+	break;
+	
       case 50:
-        pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (3<<5);
+	break;
+	
       case 75:
-        pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (4<<5);
+	break;
+	
       case 100:
-        pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (5<<5);
+	break;
+	
       default:
-        // FIXME if we get here, this should be flagged as an error, right?
-        pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5);
-        break;
+	// FIXME if we get here, this should be flagged as an error, right?
+	pbch_pdu[2] = (pbch_pdu[2]&0x1f) | (2<<5);
+	break;
       }
-
+      
       pbch_pdu[2] = (pbch_pdu[2]&0xef) |
-                    ((phy_vars_eNB->lte_frame_parms.phich_config_common.phich_duration << 4)&0x10);
-
-      switch (phy_vars_eNB->lte_frame_parms.phich_config_common.phich_resource) {
+	((fp->phich_config_common.phich_duration << 4)&0x10);
+      
+      switch (fp->phich_config_common.phich_resource) {
       case oneSixth:
-        pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (0<<2);
+	break;
+	
       case half:
-        pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (1<<2);
+	break;
+	
       case one:
-        pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (2<<2);
+	break;
+	
       case two:
-        pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2);
-        break;
-
+	pbch_pdu[2] = (pbch_pdu[2]&0xf3) | (3<<2);
+	break;
+	
       default:
-        // unreachable
-        break;
+	// unreachable
+	break;
       }
-
-      pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((phy_vars_eNB->proc[sched_subframe].frame_tx>>8)&0x3);
-      pbch_pdu[1] = phy_vars_eNB->proc[sched_subframe].frame_tx&0xfc;
+      
+      pbch_pdu[2] = (pbch_pdu[2]&0xfc) | ((eNB->proc[sched_subframe].frame_tx>>8)&0x3);
+      pbch_pdu[1] = eNB->proc[sched_subframe].frame_tx&0xfc;
       pbch_pdu[0] = 0;
     }
+      
+    /// First half of SSS (TDD, slot 1)
+    
+    if ((fp->frame_type == TDD)&&
+	(abstraction_flag==0)){
+      generate_sss(txdataF,
+		   AMP,
+		   fp,
+		   (fp->Ncp==NORMAL) ? 6 : 5,
+		   1);
+    }
 
-    /// First half of SSS (TDD)
+    /// generate PBCH
     if (abstraction_flag==0) {
+      generate_pbch(&eNB->lte_eNB_pbch,
+                    txdataF,
+                    AMP,
+                    fp,
+                    pbch_pdu,
+                    eNB->proc[sched_subframe].frame_tx&3);
+    }
+#ifdef PHY_ABSTRACTION
+    else {
+      generate_pbch_emul(eNB,pbch_pdu);
+    }
+#endif
 
-      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-        generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
+  }
+  else if ((subframe == 1) &&
+	   (fp->frame_type == TDD)&&
+	   (abstraction_flag==0)) {
+    generate_pss(txdataF,
+		 AMP,
+		 fp,
+		 2,
+		 2);
+  }
+  
+  // Second half of PSS/SSS (FDD, slot 10)
+  else if ((subframe == 5) && 
+	   (fp->frame_type == FDD) &&
+	   (abstraction_flag==0)) {
+        generate_pss(txdataF,
                      AMP,
-                     &phy_vars_eNB->lte_frame_parms,
-                     (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
-                     1);
+                     &eNB->lte_frame_parms,
+                     (fp->Ncp==NORMAL) ? 6 : 5,
+                     10);
+        generate_sss(txdataF,
+                     AMP,
+                     &eNB->lte_frame_parms,
+                     (fp->Ncp==NORMAL) ? 5 : 4,
+                     10);
+
+  }
+
+  //  Second-half of SSS (TDD, slot 11)
+  else if ((subframe == 5) &&
+	   (fp->frame_type == TDD) &&
+	   (abstraction_flag==0)) {
+    generate_sss(txdataF,
+		 AMP,
+		 fp,
+		 (fp->Ncp==NORMAL) ? 6 : 5,
+		 11);
+  }
+
+  // Second half of PSS (TDD, slot 12)
+  else if ((subframe == 6) &&
+	   (fp->frame_type == TDD) &&
+	   (abstraction_flag==0)) {
+    generate_pss(txdataF,
+		 AMP,
+		 fp,
+		 2,
+		 12);
+  }
+
+}
+
+void generate_eNB_dlsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) {
+
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
+
+  // if we have SI_RNTI, configure dlsch parameters and CCE index
+  if (dci_alloc->rnti == SI_RNTI) {
+    LOG_D(PHY,"Generating dlsch params for SI_RNTI\n");
+    generate_eNB_dlsch_params_from_dci(frame,
+				       subframe,
+				       &dci_alloc->dci_pdu[0],
+				       dci_alloc->rnti,
+				       dci_alloc->format,
+				       &eNB->dlsch_eNB_SI,
+				       fp,
+				       eNB->pdsch_config_dedicated,
+				       SI_RNTI,
+				       0,
+				       P_RNTI,
+				       eNB->eNB_UE_stats[0].DL_pmi_single);
+    
+    
+    eNB->dlsch_eNB_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,eNB->proc[sched_subframe].frame_tx,subframe,
+	  eNB->dlsch_eNB_SI->nCCE[subframe]);
+    
+#if defined(SMBV) 
+    
+    // configure SI DCI
+    if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i);
+      smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", dci_alloc, i);
+    }
+    
+#endif
+    
+    
+  } else if (dci_alloc->ra_flag == 1) {  // This is format 1A allocation for RA
+    // configure dlsch parameters and CCE index
+    LOG_D(PHY,"Generating dlsch params for RA_RNTI\n");    
+    generate_eNB_dlsch_params_from_dci(frame,
+				       subframe,
+				       &dci_alloc->dci_pdu[0],
+				       dci_alloc->rnti,
+				       dci_alloc->format,
+				       &eNB->dlsch_eNB_ra,
+				       fp,
+				       eNB->pdsch_config_dedicated,
+				       SI_RNTI,
+				       dci_alloc->rnti,
+				       P_RNTI,
+				       eNB->eNB_UE_stats[0].DL_pmi_single);
+    
+    
+    eNB->dlsch_eNB_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,eNB->proc[sched_subframe].frame_tx,subframe,
+	  eNB->dlsch_eNB_ra->nCCE[subframe]);
+#if defined(SMBV) 
+    
+    // configure RA DCI
+    if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i);
+      smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", dci_alloc, i);
+    }
+    
+#endif
+    
+  }
+  
+  else if ((dci_alloc->format != format0)&&
+	   (dci_alloc->format != format3)&&
+	   (dci_alloc->format != format3A)&&
+	   (dci_alloc->format != format4)){ // this is a normal DLSCH allocation
+    
+
+    
+    if (UE_id>=0) {
+#if defined(SMBV) 
+      // Configure this user
+      if (smbv_is_config_frame(eNB->proc[sched_subframe].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",eNB->proc[sched_subframe].frame_tx,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);
+      }
+      
+#endif
+
+      LOG_D(PHY,"Generating dlsch params for RNTI %x\n",dci_alloc->rnti);      
+      generate_eNB_dlsch_params_from_dci(frame,
+					 subframe,
+					 &dci_alloc->dci_pdu[0],
+					 dci_alloc->rnti,
+					 dci_alloc->format,
+					 eNB->dlsch_eNB[(uint8_t)UE_id],
+					 fp,
+					 eNB->pdsch_config_dedicated,
+					 SI_RNTI,
+					 0,
+					 P_RNTI,
+					 eNB->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_eNB[(uint8_t)UE_id][0]->current_harq_pid,eNB->proc[sched_subframe].frame_tx,subframe);
+      
+      
+      eNB->dlsch_eNB[(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,eNB->proc[sched_subframe].frame_tx,subframe,
+	    dci_alloc->rnti,eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe]);
+      
+#if defined(SMBV) 
+      
+      // configure UE-spec DCI
+      if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+	LOG_D(PHY,"[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i);
+	smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1,dci_alloc, i);
       }
+      
+#endif
+      
+      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,
+	    eNB->proc[sched_subframe].frame_tx, 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,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti);
     }
+  }
+  
+}
 
+void generate_eNB_ulsch_params(const int frame,const int subframe,int sched_subframe,PHY_VARS_eNB *eNB,DCI_ALLOC_t *dci_alloc,const int UE_id) {
 
+  int harq_pid;
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
+  
+  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,eNB->proc[sched_subframe].frame_tx,subframe),
+			  pdcch_alloc2ul_subframe(fp,subframe)),
+	eNB->proc[sched_subframe].frame_tx,
+	subframe,
+	pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,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],
+				     dci_alloc->rnti,
+				     sched_subframe,
+				     format0,
+				     UE_id,
+				     eNB,
+				     SI_RNTI,
+				     0,
+				     P_RNTI,
+				     CBA_RNTI,
+				     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,eNB->proc[sched_subframe].frame_tx,subframe,dci_alloc->rnti,
+	dci_alloc->firstCCE);
+  
+#if defined(SMBV) 
+  
+  // configure UE-spec DCI for UL Grant
+  if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+    LOG_D(PHY,"[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",eNB->proc[sched_subframe].frame_tx,subframe,i);
+    smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i);
+  }
+  
+#endif
+  
+  
+  // get the hard_pid for this subframe 
+  harq_pid = subframe2harq_pid(fp,
+			       pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,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,eNB->proc[sched_subframe].frame_tx);
+    mac_xface->macphy_exit("FATAL\n"); 
+  }
+  
+  if ((dci_alloc->rnti  >= CBA_RNTI) && (dci_alloc->rnti < P_RNTI))
+    eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1;
+  else
+    eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
+  
+}
 
+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 sched_subframe,int num_pdcch_symbols,int abstraction_flag) {
 
-    if (abstraction_flag==0) {
+  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;
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
+  uint8_t *DLSCH_pdu=NULL;
+  uint8_t DLSCH_pdu_tmp[768*8];
+  uint8_t DLSCH_pdu_rar[256];
+  int i;
+
+  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,
+	eNB->proc[sched_subframe].frame_tx, 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,eNB->proc[sched_subframe].frame_tx,subframe),
+	dlsch_harq->nb_rb,
+	dlsch_harq->mcs,
+	pmi2hex_2Ar1(dlsch_harq->pmi_alloc),
+	dlsch_harq->rvidx,
+	dlsch_harq->round);
 
-      generate_pbch(&phy_vars_eNB->lte_eNB_pbch,
-                    phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                    AMP,
-                    &phy_vars_eNB->lte_frame_parms,
-                    pbch_pdu,
-                    phy_vars_eNB->proc[sched_subframe].frame_tx&3);
+#if defined(MESSAGE_CHART_GENERATOR_PHY)
+      MSC_LOG_TX_MESSAGE(
+        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")",
+        eNB->proc[sched_subframe].frame_tx, 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,eNB->proc[sched_subframe].frame_tx,subframe),
+        dlsch_harq->nb_rb,
+        dlsch_harq->mcs,
+        pmi2hex_2Ar1(dlsch_harq->pmi_alloc),
+        dlsch_harq->rvidx,
+        dlsch_harq->round);
+#endif
+
+      if (ue_stats) ue_stats->dlsch_sliding_cnt++;
+
+      if (dlsch_harq->round == 0) {
+
+	if (ue_stats)
+	  ue_stats->dlsch_trials[harq_pid][0]++;
+
+	if (eNB->mac_enabled==1) {
+	  if (ra_flag == 0) {
+	    DLSCH_pdu = mac_xface->get_dlsch_sdu(eNB->Mod_id,
+						 eNB->CC_id,
+						 eNB->proc[sched_subframe].frame_tx,
+						 dlsch->rnti,
+						 0);
+	  }
+	  else {
+	    int16_t crnti = mac_xface->fill_rar(eNB->Mod_id,
+						eNB->CC_id,
+						eNB->proc[sched_subframe].frame_tx,
+						DLSCH_pdu_rar,
+						fp->N_RB_UL,
+						input_buffer_length);
+	    DLSCH_pdu = DLSCH_pdu_rar;
+
+	    int UE_id;
+
+	    if (crnti!=0) 
+	      UE_id = add_ue(crnti,eNB);
+	    else 
+	      UE_id = -1;
+	    
+	    if (UE_id==-1) {
+	      LOG_W(PHY,"[eNB] Max user count reached.\n");
+	      mac_xface->cancel_ra_proc(eNB->Mod_id,
+					eNB->CC_id,
+					eNB->proc[sched_subframe].frame_tx,
+					crnti);
+	    } else {
+	      eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE;
+	      // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged)
+	      eNB->first_sr[(uint32_t)UE_id] = 1;
+	      
+	      generate_eNB_ulsch_params_from_rar(DLSCH_pdu,
+						 eNB->proc[sched_subframe].frame_tx,
+						 (subframe),
+						 eNB->ulsch_eNB[(uint32_t)UE_id],
+						 fp);
+	      
+	      eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1;
+	      
+	      get_Msg3_alloc(fp,
+			     subframe,
+			     eNB->proc[sched_subframe].frame_tx,
+			     &eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
+			     &eNB->ulsch_eNB[(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",
+		    eNB->proc[sched_subframe].frame_tx,
+		    subframe,
+		    UE_id,
+		    eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
+		    eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
+	    }
+	    if (ue_stats) ue_stats->total_TBS_MAC += dlsch_harq->TBS;
+	  }
+	}
+	else {
+	  DLSCH_pdu = DLSCH_pdu_tmp;
+	  
+	  for (i=0; i<input_buffer_length; i++)
+	    DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
+	}
+	
+#if defined(SMBV) 
 
-    }
+        // Configures the data source of allocation (allocation is configured by DCI)
+        if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+          LOG_D(PHY,"[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(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);
+        }
 
-#ifdef PHY_ABSTRACTION
-    else {
-      generate_pbch_emul(phy_vars_eNB,pbch_pdu);
-    }
+#endif
 
+
+#ifdef DEBUG_PHY_PROC
+#ifdef DEBUG_DLSCH
+        LOG_T(PHY,"eNB DLSCH SDU: \n");
+
+        for (i=0; i<dlsch_harq->TBS>>3; i++)
+          LOG_T(PHY,"%"PRIx8".",DLSCH_pdu[i]);
+
+        LOG_T(PHY,"\n");
 #endif
+#endif
+      } else {
+        ue_stats->dlsch_trials[harq_pid][dlsch_harq->round]++;
+#ifdef DEBUG_PHY_PROC
+#ifdef DEBUG_DLSCH
+        LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n");
+#endif
+#endif
+      }
 
+      if (abstraction_flag==0) {
 
-  }
+	LOG_D(PHY,"Generating DLSCH/PDSCH %d\n",ra_flag);
+        // 36-212
+        start_meas(&eNB->dlsch_encoding_stats);
+        dlsch_encoding(DLSCH_pdu,
+                       fp,
+                       num_pdcch_symbols,
+                       dlsch,
+                       eNB->proc[sched_subframe].frame_tx,subframe,
+                       &eNB->dlsch_rate_matching_stats,
+                       &eNB->dlsch_turbo_encoding_stats,
+                       &eNB->dlsch_interleaving_stats);
+        stop_meas(&eNB->dlsch_encoding_stats);
+        // 36-211
+        start_meas(&eNB->dlsch_scrambling_stats);
+        dlsch_scrambling(fp,
+                         0,
+                         dlsch,
+                         get_G(fp,
+                               dlsch_harq->nb_rb,
+                               dlsch_harq->rb_alloc,
+                               get_Qm(dlsch_harq->mcs),
+                               dlsch_harq->Nl,
+                               num_pdcch_symbols,eNB->proc[sched_subframe].frame_tx,subframe),
+                         0,
+                         subframe<<1);
+        stop_meas(&eNB->dlsch_scrambling_stats);
+        start_meas(&eNB->dlsch_modulation_stats);
 
-  if (subframe == 1) {
 
-    if (abstraction_flag==0) {
+        dlsch_modulation(eNB->lte_eNB_common_vars.txdataF[0],
+			 AMP,
+			 subframe,
+			 fp,
+			 num_pdcch_symbols,
+			 dlsch,
+			 dlsch1);
+	
+        stop_meas(&eNB->dlsch_modulation_stats);
+      }
 
-      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-        generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                     AMP,
-                     &phy_vars_eNB->lte_frame_parms,
-                     2,
-                     2);
+#ifdef PHY_ABSTRACTION
+      else {
+        start_meas(&eNB->dlsch_encoding_stats);
+        dlsch_encoding_emul(eNB,
+                            DLSCH_pdu,
+                            dlsch);
+        stop_meas(&eNB->dlsch_encoding_stats);
       }
-    }
-  }
 
-  // Second half of PSS/SSS (FDD)
-  if (subframe == 5) {
+#endif
+      dlsch->active = 0;
+}
 
-    if (abstraction_flag==0) {
+void phy_procedures_eNB_TX(unsigned char sched_subframe,
+			   PHY_VARS_eNB *eNB,
+			   uint8_t abstraction_flag,
+                           relaying_type_t r_type,
+			   PHY_VARS_RN *rn)
+{
+  UNUSED(rn);
+  uint16_t input_buffer_length;
+  uint32_t i,aa;
+  uint8_t harq_pid;
+  DCI_PDU *DCI_pdu;
+  DCI_PDU DCI_pdu_tmp;
+  int8_t UE_id;
+  uint8_t num_pdcch_symbols=0;
+  uint8_t ul_subframe;
+  uint32_t ul_frame;
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
+  DCI_ALLOC_t *dci_alloc=(DCI_ALLOC_t *)NULL;
 
-      if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) {
-        generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                     AMP,
-                     &phy_vars_eNB->lte_frame_parms,
-                     (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
-                     10);
-        generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                     AMP,
-                     &phy_vars_eNB->lte_frame_parms,
-                     (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 5 : 4,
-                     10);
+#if defined(SMBV) 
+  // counts number of allocations in subframe
+  // there is at least one allocation for PDCCH
+  uint8_t smbv_alloc_cnt = 1;
+#endif
+  int frame = eNB->proc[sched_subframe].frame_tx;
+  int subframe = eNB->proc[sched_subframe].subframe_tx;
 
-      }
-    }
-  }
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,1);
+  start_meas(&eNB->phy_proc_tx);
 
-  //  Second-half of SSS (TDD)
-  if (subframe == 5) {
-    if (abstraction_flag==0) {
+  for (i=0; i<NUMBER_OF_UE_MAX; i++) {
+    // If we've dropped the UE, go back to PRACH mode for this UE
 
-      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-        generate_sss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                     AMP,
-                     &phy_vars_eNB->lte_frame_parms,
-                     (phy_vars_eNB->lte_frame_parms.Ncp==NORMAL) ? 6 : 5,
-                     11);
-      }
+    if (eNB->eNB_UE_stats[i].ulsch_consecutive_errors == ULSCH_max_consecutive_errors) {
+      LOG_W(PHY,"[eNB %d, CC %d] frame %d, subframe %d, UE %d: ULSCH consecutive error count reached %u, triggering UL Failure\n",
+            eNB->Mod_id,eNB->CC_id,frame,subframe, i, eNB->eNB_UE_stats[i].ulsch_consecutive_errors);
+      eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
+      mac_xface->UL_failure_indication(eNB->Mod_id,
+				       eNB->CC_id,
+				       frame,
+				       eNB->eNB_UE_stats[i].crnti,
+				       subframe);
+				       
     }
-  }
+	
 
-  // Second half of PSS (TDD)
-  if (subframe == 6) {
+  }
 
-    if (abstraction_flag==0) {
 
-      if (phy_vars_eNB->lte_frame_parms.frame_type == TDD) {
-        generate_pss(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                     AMP,
-                     &phy_vars_eNB->lte_frame_parms,
-                     2,
-                     12);
-      }
+// Get scheduling info for next subframe
+// 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,eNB->proc[sched_subframe].frame_tx,subframe);//,1);
     }
   }
 
+// clear the transmit data array for the current subframe
+  if (abstraction_flag==0) {
+    for (aa=0; aa<fp->nb_antennas_tx_eNB; aa++) {      
+      memset(&eNB->lte_eNB_common_vars.txdataF[0][aa][subframe*fp->ofdm_symbol_size*(fp->symbols_per_tti)],
+             0,fp->ofdm_symbol_size*(fp->symbols_per_tti)*sizeof(int32_t));
+    }
+  }
 
+  if (is_pmch_subframe(eNB->proc[sched_subframe].frame_tx,subframe,fp)) {
+    pmch_procedures(eNB,rn,subframe,sched_subframe,abstraction_flag,r_type);
+  }
+  else {
+    // this is not a pmch subframe, so generate PSS/SSS/PBCH
+    common_signal_procedures(subframe,sched_subframe,eNB,abstraction_flag);
+  }
 
-#if defined(SMBV) && !defined(EXMIMO)
+#if defined(SMBV) 
 
   // PBCH takes one allocation
-  if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+  if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
     if (subframe==0)
       smbv_alloc_cnt++;
   }
 
 #endif
 
-  if (phy_vars_eNB->mac_enabled==1) {
+  if (eNB->mac_enabled==1) {
     // Parse DCI received from MAC
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX,1);
-    DCI_pdu = mac_xface->get_dci_sdu(phy_vars_eNB->Mod_id,
-				     phy_vars_eNB->CC_id,
-				     phy_vars_eNB->proc[sched_subframe].frame_tx,
+    DCI_pdu = mac_xface->get_dci_sdu(eNB->Mod_id,
+				     eNB->CC_id,
+				     eNB->proc[sched_subframe].frame_tx,
 				     subframe);
   }
   else {
     DCI_pdu = &DCI_pdu_tmp;
 #ifdef EMOS_CHANNEL
-    fill_dci_emos(DCI_pdu,sched_subframe,phy_vars_eNB);
+    fill_dci_emos(DCI_pdu,sched_subframe,eNB);
 #else
-    fill_dci(DCI_pdu,sched_subframe,phy_vars_eNB);
+    fill_dci(DCI_pdu,sched_subframe,eNB);
 #endif
   }
 
   // clear existing ulsch dci allocations before applying info from MAC  (this is table
-  ul_subframe = pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe);
-  ul_frame = pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
+  ul_subframe = pdcch_alloc2ul_subframe(fp,subframe);
+  ul_frame = pdcch_alloc2ul_frame(fp,eNB->proc[sched_subframe].frame_tx,subframe);
 
-  if ((subframe_select(&phy_vars_eNB->lte_frame_parms,ul_subframe)==SF_UL) ||
-      (phy_vars_eNB->lte_frame_parms.frame_type == FDD)) {
-    harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,ul_frame,ul_subframe);
+  if ((subframe_select(fp,ul_subframe)==SF_UL) ||
+      (fp->frame_type == FDD)) {
+    harq_pid = subframe2harq_pid(fp,ul_frame,ul_subframe);
 
+    // clear DCI allocation maps for new subframe
     for (i=0; i<NUMBER_OF_UE_MAX; i++)
-      if (phy_vars_eNB->ulsch_eNB[i]) {
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0;
+      if (eNB->ulsch_eNB[i]) {
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc=0;
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc=0;
       }
   }
 
   // clear previous allocation information for all UEs
   for (i=0; i<NUMBER_OF_UE_MAX; i++) {
-    phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[subframe] = 0;
+    eNB->dlsch_eNB[i][0]->subframe_tx[subframe] = 0;
   }
 
 
   num_pdcch_symbols = DCI_pdu->num_pdcch_symbols;
-
-  LOG_D(PHY,"num_pdcch_symbols %"PRIu8", nCCE %u (dci commond %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols,DCI_pdu->nCCE,
+  LOG_D(PHY,"num_pdcch_symbols %"PRIu8", (dci commond %"PRIu8", dci uespec %"PRIu8"\n",num_pdcch_symbols,
         DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
 
-#if defined(SMBV) && !defined(EXMIMO)
-
+#if defined(SMBV) 
   // Sets up PDCCH and DCI table
-  if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4) && ((DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci)>0)) {
-    msg("[SMBV] Frame %3d, SF %d PDCCH, number of DCIs %d\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci);
-    dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[0]);
+  if (smbv_is_config_frame(eNB->proc[sched_subframe].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",eNB->proc[sched_subframe].frame_tx,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);
   }
-
 #endif
 
-
-
   VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->num_pdcch_symbols);
 
+  // loop over all DCIs for this subframe to generate DLSCH allocations
   for (i=0; i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
     LOG_D(PHY,"[eNB] Subframe %d: DCI %d/%d : rnti %x, CCEind %d\n",subframe,i,DCI_pdu->Num_common_dci+DCI_pdu->Num_ue_spec_dci,DCI_pdu->dci_alloc[i].rnti,DCI_pdu->dci_alloc[i].firstCCE);
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].rnti);
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].format);
     VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,DCI_pdu->dci_alloc[i].firstCCE);
+    dci_alloc = &DCI_pdu->dci_alloc[i];
 
-    if (DCI_pdu->dci_alloc[i].rnti == SI_RNTI) {
-
-      generate_eNB_dlsch_params_from_dci(frame,
-					 subframe,
-                                         &DCI_pdu->dci_alloc[i].dci_pdu[0],
-                                         DCI_pdu->dci_alloc[i].rnti,
-                                         DCI_pdu->dci_alloc[i].format,
-                                         &phy_vars_eNB->dlsch_eNB_SI,
-                                         &phy_vars_eNB->lte_frame_parms,
-                                         phy_vars_eNB->pdsch_config_dedicated,
-                                         SI_RNTI,
-                                         0,
-                                         P_RNTI,
-                                         phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
-
-
-      phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
-
-      LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI)  => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-	    phy_vars_eNB->dlsch_eNB_SI->nCCE[subframe],DCI_pdu->nCCE);
-      
-#if defined(SMBV) && !defined(EXMIMO)
-
-      // configure SI DCI
-      if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-	msg("[SMBV] Frame %3d, SI in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
-	smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "SI", &DCI_pdu->dci_alloc[i], i);
-      }
-      
-#endif
-      
-
-    } else if (DCI_pdu->dci_alloc[i].ra_flag == 1) {
-
-      generate_eNB_dlsch_params_from_dci(frame,
-					 subframe,
-                                         &DCI_pdu->dci_alloc[i].dci_pdu[0],
-                                         DCI_pdu->dci_alloc[i].rnti,
-                                         DCI_pdu->dci_alloc[i].format,
-                                         &phy_vars_eNB->dlsch_eNB_ra,
-                                         &phy_vars_eNB->lte_frame_parms,
-                                         phy_vars_eNB->pdsch_config_dedicated,
-                                         SI_RNTI,
-                                         DCI_pdu->dci_alloc[i].rnti,
-                                         P_RNTI,
-                                         phy_vars_eNB->eNB_UE_stats[0].DL_pmi_single);
-
-
-      phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
-
-      LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (RA)  => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-	    phy_vars_eNB->dlsch_eNB_ra->nCCE[subframe],DCI_pdu->nCCE);
-#if defined(SMBV) && !defined(EXMIMO)
-
-      // configure RA DCI
-      if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-	msg("[SMBV] Frame %3d, RA in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
-	smbv_configure_common_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), "RA", &DCI_pdu->dci_alloc[i], i);
-      }
-
-#endif
-
-    }
-
-    else if (DCI_pdu->dci_alloc[i].format != format0) { // this is a normal DLSCH allocation
-
-      if (phy_vars_eNB->mac_enabled==1)
-	UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
+    if ((dci_alloc->rnti<= P_RNTI) && 
+	(dci_alloc->ra_flag!=1)) {
+      if (eNB->mac_enabled==1)
+	UE_id = find_ue((int16_t)dci_alloc->rnti,eNB);
       else
 	UE_id = i;
-
-      if (UE_id>=0) {
-	if ((frame%100)==0) {
-	  LOG_D(PHY,"Frame %3d, SF %d \n",frame,subframe); 
-	  dump_dci(&phy_vars_eNB->lte_frame_parms,&DCI_pdu->dci_alloc[i]);
-	}
-#if defined(SMBV) && !defined(EXMIMO)
-        // Configure this user
-        if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-          msg("[SMBV] Frame %3d, SF %d (SMBV SF %d) Configuring user %d with RNTI %"PRIu16" in TM%"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,(smbv_frame_cnt*10) + (subframe),UE_id+1,
-              DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->transmission_mode[(uint8_t)UE_id]);
-          smbv_configure_user(smbv_fname,UE_id+1,phy_vars_eNB->transmission_mode[(uint8_t)UE_id],DCI_pdu->dci_alloc[i].rnti);
-        }
-
-#endif
-
-        generate_eNB_dlsch_params_from_dci(frame,
-					   subframe,
-                                           &DCI_pdu->dci_alloc[i].dci_pdu[0],
-                                           DCI_pdu->dci_alloc[i].rnti,
-                                           DCI_pdu->dci_alloc[i].format,
-                                           phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id],
-                                           &phy_vars_eNB->lte_frame_parms,
-                                           phy_vars_eNB->pdsch_config_dedicated,
-                                           SI_RNTI,
-                                           0,
-                                           P_RNTI,
-                                           phy_vars_eNB->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",
-              phy_vars_eNB->Mod_id,DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
-
-
-        phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe] = DCI_pdu->dci_alloc[i].firstCCE;
-
-	LOG_D(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for ue DCI (PDSCH %"PRIx16")  => %"PRIu8"/%u\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-	      DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->nCCE[subframe],DCI_pdu->nCCE);
-
-#if defined(SMBV) && !defined(EXMIMO)
-	
-	// configure UE-spec DCI
-	if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-	  msg("[SMBV] Frame %3d, PDSCH in SF %d DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
-	  smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], i);
-	}
-
-#endif
-
-        LOG_D(PHY,"[eNB %"PRIu8"][DCI][PDSCH %"PRIx16"] Frame %d subframe %d UE_id %"PRId8" Generated DCI format %d, aggregation %d\n",
-              phy_vars_eNB->Mod_id, DCI_pdu->dci_alloc[i].rnti,
-              phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,UE_id,
-              DCI_pdu->dci_alloc[i].format,
-              1<<DCI_pdu->dci_alloc[i].L);
-      } else {
-        LOG_D(PHY,"[eNB %"PRIu8"][PDSCH] Frame %d : No UE_id with corresponding rnti %"PRIx16", dropping DLSCH\n",
-              phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti);
-      }
     }
+    else UE_id=0;
+    
+    generate_eNB_dlsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id);
 
   }
 
   VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_DCI_INFO,(frame*10)+subframe);
 
   // Apply physicalConfigDedicated if needed
-  phy_config_dedicated_eNB_step2(phy_vars_eNB);
-
+  // This is for UEs that have received this IE, which changes these DL and UL configuration, we apply after a delay for the eNodeB UL parameters
+  phy_config_dedicated_eNB_step2(eNB);
+  
+  // Now loop again over the DCIs for UL configuration
   for (i=0; i<DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci ; i++) {
-    if (DCI_pdu->dci_alloc[i].format == format0) {  // this is a ULSCH allocation
-
-      harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
-                                   pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-                                   pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe));
-
-      if (harq_pid==255) {
-        LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Bad harq_pid for ULSCH allocation\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx);
-        return; 
-      }
-
-      if (phy_vars_eNB->mac_enabled==1)
-	UE_id = find_ue((int16_t)DCI_pdu->dci_alloc[i].rnti,phy_vars_eNB);
+    if (dci_alloc->format == format0) {  // this is a ULSCH allocation
+      if (eNB->mac_enabled==1)
+	UE_id = find_ue((int16_t)dci_alloc->rnti,eNB);
       else
 	UE_id = i;
-
-      if (UE_id<0) {
-        LOG_E(PHY,"[eNB %"PRIu8"] Frame %d: Unknown UE_id for rnti %"PRIx16"\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,DCI_pdu->dci_alloc[i].rnti);
-        mac_exit_wrapper("Invalid UE id (< 0) detected");
-        return; // not reached
-      }
-
-      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") (DCI pos %"PRIu32"/%d), aggregation %d\n",
-            phy_vars_eNB->Mod_id,
-            subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
-                              pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-                              pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe)),
-            phy_vars_eNB->proc[sched_subframe].frame_tx,
-            subframe,
-            pdcch_alloc2ul_frame(&phy_vars_eNB->lte_frame_parms,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-            pdcch_alloc2ul_subframe(&phy_vars_eNB->lte_frame_parms,subframe),
-            DCI_pdu->dci_alloc[i].rnti,
-            DCI_pdu->dci_alloc[i].dci_pdu[0],
-            i,
-            DCI_pdu->Num_common_dci + DCI_pdu->Num_ue_spec_dci,
-            1<<DCI_pdu->dci_alloc[i].L);
-
-      generate_eNB_ulsch_params_from_dci(&DCI_pdu->dci_alloc[i].dci_pdu[0],
-                                         DCI_pdu->dci_alloc[i].rnti,
-                                         sched_subframe,
-                                         format0,
-                                         UE_id,
-                                         phy_vars_eNB,
-                                         SI_RNTI,
-                                         0,
-                                         P_RNTI,
-                                         CBA_RNTI,
-                                         0);  // do_srs
-
-      LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d/%u\n",
-	    phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,DCI_pdu->dci_alloc[i].rnti,
-	    DCI_pdu->dci_alloc[i].firstCCE,DCI_pdu->nCCE);
       
-#if defined(SMBV) && !defined(EXMIMO)
-
-        // configure UE-spec DCI for UL Grant
-      if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-	msg("[SMBV] Frame %3d, SF %d UL DCI %"PRIu32"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,i);
-	smbv_configure_ue_spec_dci(smbv_fname,(smbv_frame_cnt*10) + (subframe), UE_id+1, &DCI_pdu->dci_alloc[i], 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,eNB->proc[sched_subframe].frame_tx,dci_alloc->rnti);
+	mac_xface->macphy_exit("FATAL\n"); 
       }
-      
-#endif
-
-      
-
-      if ((DCI_pdu->dci_alloc[i].rnti  >= CBA_RNTI) && (DCI_pdu->dci_alloc[i].rnti < P_RNTI))
-        phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag = 1;
-      else
-        phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag = 1;
-
+      generate_eNB_ulsch_params(frame,subframe,sched_subframe,eNB,dci_alloc,UE_id);
     }
   }
 
@@ -1208,14 +1414,14 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
 
   } else { // for emulation!!
-    phy_vars_eNB->num_ue_spec_dci[(subframe)&1]=0;
-    phy_vars_eNB->num_common_dci[(subframe)&1]=0;
+    eNB->num_ue_spec_dci[(subframe)&1]=0;
+    eNB->num_common_dci[(subframe)&1]=0;
   }
 
   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",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].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,eNB->proc[sched_subframe].frame_tx, subframe,
             DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
 
 
@@ -1224,16 +1430,16 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
                                          DCI_pdu->dci_alloc,
                                          0,
                                          AMP,
-                                         &phy_vars_eNB->lte_frame_parms,
-                                         phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
+                                         fp,
+                                         eNB->lte_eNB_common_vars.txdataF[0],
                                          subframe);
 
   }
 
 #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious
   else {
-    LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top_emul\n",phy_vars_eNB->Mod_id,phy_vars_eNB->proc[sched_subframe].frame_tx, subframe);
-    num_pdcch_symbols = generate_dci_top_emul(phy_vars_eNB,DCI_pdu->Num_ue_spec_dci,DCI_pdu->Num_common_dci,DCI_pdu->dci_alloc,subframe);
+    LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_to_emul\n",eNB->Mod_id,eNB->proc[sched_subframe].frame_tx, 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);
   }
 
 #endif
@@ -1242,361 +1448,65 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
   // Check for SI activity
 
-  if (phy_vars_eNB->dlsch_eNB_SI->active == 1) {
-    input_buffer_length = phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->TBS/8;
-
+  if (eNB->dlsch_eNB_SI->active == 1) {
 
-    if (phy_vars_eNB->mac_enabled==1) {
-      DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
-					   phy_vars_eNB->CC_id,
-					   phy_vars_eNB->proc[sched_subframe].frame_tx,
-					   SI_RNTI,
-					   0);
-    }
-    else {
-      DLSCH_pdu = DLSCH_pdu_tmp;
-
-      for (i=0; i<input_buffer_length; i++)
-	DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
-    }
+    pdsch_procedures(eNB,eNB->dlsch_eNB_SI,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag);
 
-#if defined(SMBV) && !defined(EXMIMO)
+#if defined(SMBV) 
 
     // Configures the data source of allocation (allocation is configured by DCI)
-    if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-      msg("[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
+    if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, Configuring SI payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(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);
     }
 
 #endif
-
-    if (abstraction_flag == 0) {
-
-      start_meas(&phy_vars_eNB->dlsch_encoding_stats);
-      dlsch_encoding(DLSCH_pdu,
-                     &phy_vars_eNB->lte_frame_parms,
-                     num_pdcch_symbols,
-                     phy_vars_eNB->dlsch_eNB_SI,
-                     phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-                     &phy_vars_eNB->dlsch_rate_matching_stats,
-                     &phy_vars_eNB->dlsch_turbo_encoding_stats,
-                     &phy_vars_eNB->dlsch_interleaving_stats);
-      stop_meas(&phy_vars_eNB->dlsch_encoding_stats);
-
-      start_meas(&phy_vars_eNB->dlsch_scrambling_stats);
-      dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
-                       0,
-                       phy_vars_eNB->dlsch_eNB_SI,
-                       get_G(&phy_vars_eNB->lte_frame_parms,
-                             phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->nb_rb,
-                             phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->rb_alloc,
-                             get_Qm(phy_vars_eNB->dlsch_eNB_SI->harq_processes[0]->mcs),
-                             1,
-                             num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-                       0,
-                       subframe<<1);
-
-      stop_meas(&phy_vars_eNB->dlsch_scrambling_stats);
-
-      start_meas(&phy_vars_eNB->dlsch_modulation_stats);
-
-      re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                                      AMP,
-                                      subframe,
-                                      &phy_vars_eNB->lte_frame_parms,
-                                      num_pdcch_symbols,
-                                      phy_vars_eNB->dlsch_eNB_SI,
-                                      (LTE_eNB_DLSCH_t *)NULL);
-      stop_meas(&phy_vars_eNB->dlsch_modulation_stats);
-    }
-
-#ifdef PHY_ABSTRACTION
-    else {
-      start_meas(&phy_vars_eNB->dlsch_encoding_stats);
-      dlsch_encoding_emul(phy_vars_eNB,
-                          DLSCH_pdu,
-                          phy_vars_eNB->dlsch_eNB_SI);
-      stop_meas(&phy_vars_eNB->dlsch_encoding_stats);
-    }
-
-#endif
-    phy_vars_eNB->dlsch_eNB_SI->active = 0;
-
   }
 
   // Check for RA activity
-  if (phy_vars_eNB->dlsch_eNB_ra->active == 1) {
-
-    input_buffer_length = phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->TBS/8;
-
-    int16_t crnti = mac_xface->fill_rar(phy_vars_eNB->Mod_id,
-                                        phy_vars_eNB->CC_id,
-                                        phy_vars_eNB->proc[sched_subframe].frame_tx,
-                                        dlsch_input_buffer,
-                                        phy_vars_eNB->lte_frame_parms.N_RB_UL,
-                                        input_buffer_length);
-    if (crnti!=0) 
-      UE_id = add_ue(crnti,phy_vars_eNB);
-    else 
-      UE_id = -1;
-
-    if (UE_id==-1) {
-      LOG_W(PHY,"[eNB] Max user count reached.\n");
-      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-                                phy_vars_eNB->CC_id,
-                                phy_vars_eNB->proc[sched_subframe].frame_tx,
-                                crnti);
-    } else {
-      phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].mode = RA_RESPONSE;
-      // Initialize indicator for first SR (to be cleared after ConnectionSetup is acknowledged)
-      phy_vars_eNB->first_sr[(uint32_t)UE_id] = 1;
-
-      generate_eNB_ulsch_params_from_rar(dlsch_input_buffer,
-                                         phy_vars_eNB->proc[sched_subframe].frame_tx,
-                                         (subframe),
-                                         phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id],
-                                         &phy_vars_eNB->lte_frame_parms);
-
-      phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 1;
-
-      get_Msg3_alloc(&phy_vars_eNB->lte_frame_parms,
-                     subframe,
-                     phy_vars_eNB->proc[sched_subframe].frame_tx,
-                     &phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
-                     &phy_vars_eNB->ulsch_eNB[(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",
-            phy_vars_eNB->proc[sched_subframe].frame_tx,
-            subframe,
-            UE_id,
-            phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
-            phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
-
-#if defined(SMBV) && !defined(EXMIMO)
-
-      // Configures the data source of allocation (allocation is configured by DCI)
-      if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-        msg("[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(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);
-      }
-
-#endif
-
-
-      LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n",
-            phy_vars_eNB->Mod_id,
-            phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length,
-            phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
-            phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
-
-
-      if (abstraction_flag == 0) {
-
-        dlsch_encoding(dlsch_input_buffer,
-                       &phy_vars_eNB->lte_frame_parms,
-                       num_pdcch_symbols,
-                       phy_vars_eNB->dlsch_eNB_ra,
-                       phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-                       &phy_vars_eNB->dlsch_rate_matching_stats,
-                       &phy_vars_eNB->dlsch_turbo_encoding_stats,
-                       &phy_vars_eNB->dlsch_interleaving_stats);
-
-        //  phy_vars_eNB->dlsch_eNB_ra->rnti = RA_RNTI;
-        dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
-                         0,
-                         phy_vars_eNB->dlsch_eNB_ra,
-                         get_G(&phy_vars_eNB->lte_frame_parms,
-                               phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->nb_rb,
-                               phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->rb_alloc,
-                               get_Qm(phy_vars_eNB->dlsch_eNB_ra->harq_processes[0]->mcs),
-                               1,
-                               num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-                         0,
-                         subframe<<1);
-
-        re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                                        AMP,
-                                        subframe,
-                                        &phy_vars_eNB->lte_frame_parms,
-                                        num_pdcch_symbols,
-                                        phy_vars_eNB->dlsch_eNB_ra,
-                                        (LTE_eNB_DLSCH_t *)NULL);
-      }
+  if (eNB->dlsch_eNB_ra->active == 1) {
 
-#ifdef PHY_ABSTRACTION
-      else {
-        dlsch_encoding_emul(phy_vars_eNB,
-                            dlsch_input_buffer,
-                            phy_vars_eNB->dlsch_eNB_ra);
-      }
+#if defined(SMBV) 
 
+    // Configures the data source of allocation (allocation is configured by DCI)
+    if (smbv_is_config_frame(eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
+      LOG_D(PHY,"[SMBV] Frame %3d, Configuring RA payload in SF %d alloc %"PRIu8"\n",eNB->proc[sched_subframe].frame_tx,(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);
+    }
+    
 #endif
-      LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d subframe %d Deactivating DLSCH RA\n",phy_vars_eNB->Mod_id,
-            phy_vars_eNB->proc[sched_subframe].frame_tx,subframe);
-
-    } //max user count
-
-    phy_vars_eNB->dlsch_eNB_ra->active = 0;
+    
+    
+    LOG_D(PHY,"[eNB %"PRIu8"][RAPROC] Frame %d, subframe %d: Calling generate_dlsch (RA) with input size = %"PRIu16",Msg3 frame %"PRIu32", Msg3 subframe %"PRIu8"\n",
+	  eNB->Mod_id,
+	  eNB->proc[sched_subframe].frame_tx, subframe,input_buffer_length,
+	  eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame,
+	  eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe);
+    
+    pdsch_procedures(eNB,eNB->dlsch_eNB_ra,(LTE_eNB_DLSCH_t*)NULL,(LTE_eNB_UE_stats*)NULL,1,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag);
+    
+    
+    eNB->dlsch_eNB_ra->active = 0;
   }
-
+  
   // Now scan UE specific DLSCH
   for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++)
   {
-    if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&&
-        (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&&
-        (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) {
-      harq_pid = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->current_harq_pid;
-      input_buffer_length = phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS/8;
-
-
-
-      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",
-            phy_vars_eNB->Mod_id, phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,harq_pid,
-            phy_vars_eNB->proc[sched_subframe].frame_tx, subframe, input_buffer_length,
-            get_G(&phy_vars_eNB->lte_frame_parms,
-                  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
-                  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc,
-                  get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs),
-                  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl,
-                  num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-            phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
-            phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs,
-            pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc),
-            phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx,
-            phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round);
-
-#if defined(MESSAGE_CHART_GENERATOR_PHY)
-      MSC_LOG_TX_MESSAGE(
-        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")",
-        phy_vars_eNB->proc[sched_subframe].frame_tx, subframe,
-        input_buffer_length,
-        get_G(&phy_vars_eNB->lte_frame_parms,
-        		phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
-        		phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc,
-        		get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs),
-        		phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl,
-        		num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-        phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
-        phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs,
-        pmi2hex_2Ar1(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->pmi_alloc),
-        phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rvidx,
-        phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round);
-#endif
-
-      phy_vars_eNB->eNB_UE_stats[(uint8_t)UE_id].dlsch_sliding_cnt++;
-
-      if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->harq_processes[harq_pid]->round == 0) {
-
-        phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][0]++;
-
-	if (phy_vars_eNB->mac_enabled==1) {
-	  DLSCH_pdu = mac_xface->get_dlsch_sdu(phy_vars_eNB->Mod_id,
-					       phy_vars_eNB->CC_id,
-					       phy_vars_eNB->proc[sched_subframe].frame_tx,
-					       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti,
-					       0);
-	  phy_vars_eNB->eNB_UE_stats[UE_id].total_TBS_MAC += phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS;
-	}
-	else {
-	  DLSCH_pdu = DLSCH_pdu_tmp;
-	  
-	  for (i=0; i<input_buffer_length; i++)
-	    DLSCH_pdu[i] = (unsigned char)(taus()&0xff);
-	}
-	
-#if defined(SMBV) && !defined(EXMIMO)
-
-        // Configures the data source of allocation (allocation is configured by DCI)
-        if (smbv_is_config_frame(phy_vars_eNB->proc[sched_subframe].frame_tx) && (smbv_frame_cnt < 4)) {
-          msg("[SMBV] Frame %3d, Configuring PDSCH payload in SF %d alloc %"PRIu8"\n",phy_vars_eNB->proc[sched_subframe].frame_tx,(smbv_frame_cnt*10) + (subframe),smbv_alloc_cnt);
-          smbv_configure_datalist_for_user(smbv_fname, UE_id+1, DLSCH_pdu, input_buffer_length);
-        }
-
-#endif
-
-
-#ifdef DEBUG_PHY_PROC
-#ifdef DEBUG_DLSCH
-        LOG_T(PHY,"eNB DLSCH SDU: \n");
-
-        for (i=0; i<phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->TBS>>3; i++)
-          LOG_T(PHY,"%"PRIx8".",DLSCH_pdu[i]);
-
-        LOG_T(PHY,"\n");
-#endif
-#endif
-      } else {
-        phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].dlsch_trials[harq_pid][phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->round]++;
-#ifdef DEBUG_PHY_PROC
-#ifdef DEBUG_DLSCH
-        LOG_D(PHY,"[eNB] This DLSCH is a retransmission\n");
-#endif
-#endif
-      }
-
-      if (abstraction_flag==0) {
-
-        // 36-212
-        start_meas(&phy_vars_eNB->dlsch_encoding_stats);
-        dlsch_encoding(DLSCH_pdu,
-                       &phy_vars_eNB->lte_frame_parms,
-                       num_pdcch_symbols,
-                       phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
-                       phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,
-                       &phy_vars_eNB->dlsch_rate_matching_stats,
-                       &phy_vars_eNB->dlsch_turbo_encoding_stats,
-                       &phy_vars_eNB->dlsch_interleaving_stats);
-        stop_meas(&phy_vars_eNB->dlsch_encoding_stats);
-        // 36-211
-        start_meas(&phy_vars_eNB->dlsch_scrambling_stats);
-        dlsch_scrambling(&phy_vars_eNB->lte_frame_parms,
-                         0,
-                         phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
-                         get_G(&phy_vars_eNB->lte_frame_parms,
-                               phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->nb_rb,
-                               phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->rb_alloc,
-                               get_Qm(phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->mcs),
-                               phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[harq_pid]->Nl,
-                               num_pdcch_symbols,phy_vars_eNB->proc[sched_subframe].frame_tx,subframe),
-                         0,
-                         subframe<<1);
-        stop_meas(&phy_vars_eNB->dlsch_scrambling_stats);
-        start_meas(&phy_vars_eNB->dlsch_modulation_stats);
-
-
-        re_allocated = dlsch_modulation(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                                        AMP,
-                                        subframe,
-                                        &phy_vars_eNB->lte_frame_parms,
-                                        num_pdcch_symbols,
-                                        phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0],
-                                        phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][1]);
+    if ((eNB->dlsch_eNB[(uint8_t)UE_id][0])&&
+        (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&&
+        (eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 1)) {
 
-        stop_meas(&phy_vars_eNB->dlsch_modulation_stats);
-      }
-
-#ifdef PHY_ABSTRACTION
-      else {
-        start_meas(&phy_vars_eNB->dlsch_encoding_stats);
-        dlsch_encoding_emul(phy_vars_eNB,
-                            DLSCH_pdu,
-                            phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]);
-        stop_meas(&phy_vars_eNB->dlsch_encoding_stats);
-      }
+      pdsch_procedures(eNB,eNB->dlsch_eNB[(uint8_t)UE_id][0],eNB->dlsch_eNB[(uint8_t)UE_id][1],&eNB->eNB_UE_stats[(uint32_t)UE_id],0,subframe,sched_subframe,num_pdcch_symbols,abstraction_flag);
 
-#endif
-      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active = 0;
 
     }
 
-    else if ((phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0])&&
-             (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&&
-             (phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) {
+    else if ((eNB->dlsch_eNB[(uint8_t)UE_id][0])&&
+             (eNB->dlsch_eNB[(uint8_t)UE_id][0]->rnti>0)&&
+             (eNB->dlsch_eNB[(uint8_t)UE_id][0]->active == 0)) {
 
       // clear subframe TX flag since UE is not scheduled for PDSCH in this subframe (so that we don't look for PUCCH later)
-      phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0;
+      eNB->dlsch_eNB[(uint8_t)UE_id][0]->subframe_tx[subframe]=0;
     }
   }
 
@@ -1604,9 +1514,9 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
   // if we have PHICH to generate
 
-  if (is_phich_subframe(&phy_vars_eNB->lte_frame_parms,subframe))
+  if (is_phich_subframe(fp,subframe))
   {
-    generate_phich_top(phy_vars_eNB,
+    generate_phich_top(eNB,
                        sched_subframe,
                        AMP,
                        0,
@@ -1616,60 +1526,59 @@ void phy_procedures_eNB_TX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
 
 #ifdef EMOS
-  phy_procedures_emos_eNB_TX(subframe, phy_vars_eNB);
+  phy_procedures_emos_eNB_TX(subframe, eNB);
 #endif
 
 #if !(defined(EXMIMO) || defined(OAI_USRP) || defined (CPRIGW))
 
   if (abstraction_flag==0)
   {
-    start_meas(&phy_vars_eNB->ofdm_mod_stats);
-    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                phy_vars_eNB->lte_eNB_common_vars.txdata[0],
-                phy_vars_eNB->proc[sched_subframe].frame_tx,subframe<<1,
-                &phy_vars_eNB->lte_frame_parms);
-    do_OFDM_mod(phy_vars_eNB->lte_eNB_common_vars.txdataF[0],
-                phy_vars_eNB->lte_eNB_common_vars.txdata[0],
-                phy_vars_eNB->proc[sched_subframe].frame_tx,1+(subframe<<1),
-                &phy_vars_eNB->lte_frame_parms);
-    stop_meas(&phy_vars_eNB->ofdm_mod_stats);
+    start_meas(&eNB->ofdm_mod_stats);
+    do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0],
+                eNB->lte_eNB_common_vars.txdata[0],
+                eNB->proc[sched_subframe].frame_tx,subframe<<1,
+                fp);
+    do_OFDM_mod(eNB->lte_eNB_common_vars.txdataF[0],
+                eNB->lte_eNB_common_vars.txdata[0],
+                eNB->proc[sched_subframe].frame_tx,1+(subframe<<1),
+                fp);
+    stop_meas(&eNB->ofdm_mod_stats);
   }
 
 #endif
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX,0);
-  stop_meas(&phy_vars_eNB->phy_proc_tx);
+  stop_meas(&eNB->phy_proc_tx);
 
 
-  (void)re_allocated; /* remove gcc warning "set but not used" */
 }
 
-void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid)
+void process_Msg3(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t UE_id, uint8_t harq_pid)
 {
   // this prepares the demodulation of the first PUSCH of a new user, containing Msg3
 
-  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
-  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
+  int subframe = eNB->proc[sched_subframe].subframe_rx;
+  int frame = eNB->proc[sched_subframe].frame_rx;
 
   LOG_D(PHY,"[eNB %d][RAPROC] frame %d : subframe %d : process_Msg3 UE_id %d (active %d, subframe %d, frame %d)\n",
-        phy_vars_eNB->Mod_id,
+        eNB->Mod_id,
         frame,subframe,
-        UE_id,phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active,
-        phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe,
-        phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame);
-  phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0;
+        UE_id,eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active,
+        eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe,
+        eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame);
+  eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 0;
 
-  if ((phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) &&
-      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) &&
-      (phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame))   {
+  if ((eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active == 1) &&
+      (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_subframe == subframe) &&
+      (eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_frame == (uint32_t)frame))   {
 
     //    harq_pid = 0;
 
-    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0;
-    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1;
-    phy_vars_eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1;
+    eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_active = 0;
+    eNB->ulsch_eNB[(uint32_t)UE_id]->Msg3_flag = 1;
+    eNB->ulsch_eNB[(uint32_t)UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag=1;
     LOG_D(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Setting subframe_scheduling_flag (Msg3) for UE %d\n",
-          phy_vars_eNB->Mod_id,
+          eNB->Mod_id,
           frame,subframe,UE_id);
   }
 }
@@ -1682,39 +1591,41 @@ void process_Msg3(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t UE_i
 
 void process_HARQ_feedback(uint8_t UE_id,
                            uint8_t sched_subframe,
-                           PHY_VARS_eNB *phy_vars_eNB,
+                           PHY_VARS_eNB *eNB,
                            uint8_t pusch_flag,
                            uint8_t *pucch_payload,
                            uint8_t pucch_sel,
                            uint8_t SR_payload)
 {
 
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
   uint8_t dl_harq_pid[8],dlsch_ACK[8],dl_subframe;
-  LTE_eNB_DLSCH_t *dlsch             =  phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0];
-  LTE_eNB_UE_stats *ue_stats         =  &phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id];
+  LTE_eNB_DLSCH_t *dlsch             =  eNB->dlsch_eNB[(uint32_t)UE_id][0];
+  LTE_eNB_UE_stats *ue_stats         =  &eNB->eNB_UE_stats[(uint32_t)UE_id];
   LTE_DL_eNB_HARQ_t *dlsch_harq_proc;
   uint8_t subframe_m4,M,m;
   int mp;
   int all_ACKed=1,nb_alloc=0,nb_ACK=0;
-  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
-  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
-  int harq_pid = subframe2harq_pid( &phy_vars_eNB->lte_frame_parms,frame,subframe);
+  int frame = eNB->proc[sched_subframe].frame_rx;
+  int subframe = eNB->proc[sched_subframe].subframe_rx;
+  int harq_pid = subframe2harq_pid( fp,frame,subframe);
 
-  if (phy_vars_eNB->lte_frame_parms.frame_type == FDD) { //FDD
+
+  if (fp->frame_type == FDD) { //FDD
     subframe_m4 = (subframe<4) ? subframe+6 : subframe-4;
 
     dl_harq_pid[0] = dlsch->harq_ids[subframe_m4];
     M=1;
 
     if (pusch_flag == 1) {
-      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
+      dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
       if (dlsch->subframe_tx[subframe_m4]==1)
-      LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",phy_vars_eNB->Mod_id,
+      LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUSCH for subframe %d\n",eNB->Mod_id,
 	    frame,dlsch_ACK[0],subframe_m4);
     }
     else {
       dlsch_ACK[0] = pucch_payload[0];
-      LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",phy_vars_eNB->Mod_id,
+      LOG_D(PHY,"[eNB %d] Frame %d: Received ACK/NAK %d on PUCCH for subframe %d\n",eNB->Mod_id,
 	    frame,dlsch_ACK[0],subframe_m4);
       /*
       if (dlsch_ACK[0]==0)
@@ -1738,7 +1649,7 @@ void process_HARQ_feedback(uint8_t UE_id,
 #endif
   } else { // TDD Handle M=1,2 cases only
 
-    M=ul_ACK_subframe2_M(&phy_vars_eNB->lte_frame_parms,
+    M=ul_ACK_subframe2_M(fp,
                          subframe);
 
     // Now derive ACK information for TDD
@@ -1749,10 +1660,9 @@ void process_HARQ_feedback(uint8_t UE_id,
       //    otherwise, it depends on how many of the PDSCH in the set are scheduled, we can leave it like this,
       //    but we have to adapt the code below.  For example, if only one out of 2 are scheduled, only 1 bit o_ACK is used
 
-      dlsch_ACK[0] = phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
-      dlsch_ACK[1] = (phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling)
-                     ?phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:phy_vars_eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1];
-      //      printf("UE %d: ACK %d,%d\n",UE_id,dlsch_ACK[0],dlsch_ACK[1]);
+      dlsch_ACK[0] = eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0];
+      dlsch_ACK[1] = (eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode == bundling)
+                     ?eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[0]:eNB->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->o_ACK[1];
     }
 
     else {  // PUCCH ACK/NAK
@@ -1773,7 +1683,6 @@ void process_HARQ_feedback(uint8_t UE_id,
             nb_ACK = 3;
         }
       } else if (pucch_sel == 2) { // bundling or M=1
-        //  printf("*** (%d,%d)\n",pucch_payload[0],pucch_payload[1]);
         dlsch_ACK[0] = pucch_payload[0];
         dlsch_ACK[1] = pucch_payload[0];
       } else { // multiplexing with no SR, this is table 10.1
@@ -1801,7 +1710,7 @@ void process_HARQ_feedback(uint8_t UE_id,
     nb_alloc = 0;
 
     for (m=0; m<M; m++) {
-      dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
+      dl_subframe = ul_ACK_subframe2_dl_subframe(fp,
                     subframe,
                     m);
 
@@ -1813,14 +1722,12 @@ void process_HARQ_feedback(uint8_t UE_id,
       all_ACKed = 1;
     else
       all_ACKed = 0;
-
-    //    printf("nb_alloc %d, all_ACKed %d\n",nb_alloc,all_ACKed);
   }
 
 
   for (m=0,mp=-1; m<M; m++) {
 
-    dl_subframe = ul_ACK_subframe2_dl_subframe(&phy_vars_eNB->lte_frame_parms,
+    dl_subframe = ul_ACK_subframe2_dl_subframe(fp,
                   subframe,
                   m);
 
@@ -1842,7 +1749,7 @@ void process_HARQ_feedback(uint8_t UE_id,
       if (dl_harq_pid[m]<dlsch->Mdlharq) {
         dlsch_harq_proc = dlsch->harq_processes[dl_harq_pid[m]];
 #ifdef DEBUG_PHY_PROC
-        LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",phy_vars_eNB->Mod_id,
+        LOG_D(PHY,"[eNB %d][PDSCH %x/%d] subframe %d, status %d, round %d (mcs %d, rv %d, TBS %d)\n",eNB->Mod_id,
               dlsch->rnti,dl_harq_pid[m],dl_subframe,
               dlsch_harq_proc->status,dlsch_harq_proc->round,
               dlsch->harq_processes[dl_harq_pid[m]]->mcs,
@@ -1858,11 +1765,10 @@ void process_HARQ_feedback(uint8_t UE_id,
             (dlsch_harq_proc->status == ACTIVE)) {
           // dl_harq_pid of DLSCH is still active
 
-          //    msg("[PHY] eNB %d Process %d is active (%d)\n",phy_vars_eNB->Mod_id,dl_harq_pid[m],dlsch_ACK[m]);
           if ( dlsch_ACK[mp]==0) {
             // Received NAK
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",phy_vars_eNB->Mod_id,
+            LOG_D(PHY,"[eNB %d][PDSCH %x/%d] M = %d, m= %d, mp=%d NAK Received in round %d, requesting retransmission\n",eNB->Mod_id,
                   dlsch->rnti,dl_harq_pid[m],M,m,mp,dlsch_harq_proc->round);
 #endif
 
@@ -1879,7 +1785,7 @@ void process_HARQ_feedback(uint8_t UE_id,
             if (dlsch_harq_proc->round == dlsch->Mlimit) {
               // This was the last round for DLSCH so reset round and increment l2_error counter
 #ifdef DEBUG_PHY_PROC
-              LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",phy_vars_eNB->Mod_id,
+              LOG_W(PHY,"[eNB %d][PDSCH %x/%d] DLSCH retransmissions exhausted, dropping packet\n",eNB->Mod_id,
                     dlsch->rnti,dl_harq_pid[m]);
 #endif
 #if defined(MESSAGE_CHART_GENERATOR_PHY)
@@ -1896,7 +1802,7 @@ void process_HARQ_feedback(uint8_t UE_id,
             }
           } else {
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",phy_vars_eNB->Mod_id,
+            LOG_D(PHY,"[eNB %d][PDSCH %x/%d] ACK Received in round %d, resetting process\n",eNB->Mod_id,
                   dlsch->rnti,dl_harq_pid[m],dlsch_harq_proc->round);
 #endif
             ue_stats->dlsch_ACK[dl_harq_pid[m]][dlsch_harq_proc->round]++;
@@ -1908,10 +1814,10 @@ void process_HARQ_feedback(uint8_t UE_id,
             dlsch->harq_ids[dl_subframe] = dlsch->Mdlharq;
 
             ue_stats->total_TBS = ue_stats->total_TBS +
-                                  phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
+                                  eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
             /*
               ue_stats->total_transmitted_bits = ue_stats->total_transmitted_bits +
-              phy_vars_eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
+              eNB->dlsch_eNB[(uint8_t)UE_id][0]->harq_processes[dl_harq_pid[m]]->TBS;
             */
           }
 
@@ -1954,7 +1860,7 @@ void process_HARQ_feedback(uint8_t UE_id,
   }
 }
 
-void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
+void get_n1_pucch_eNB(PHY_VARS_eNB *eNB,
                       uint8_t UE_id,
                       uint8_t sched_subframe,
                       int16_t *n1_pucch0,
@@ -1963,18 +1869,17 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
                       int16_t *n1_pucch3)
 {
 
-  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
+  LTE_DL_FRAME_PARMS *frame_parms=&eNB->lte_frame_parms;
   uint8_t nCCE0,nCCE1;
   int sf;
-  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
-  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
+  int frame = eNB->proc[sched_subframe].frame_rx;
+  int subframe = eNB->proc[sched_subframe].subframe_rx;
 
   if (frame_parms->frame_type == FDD ) {
     sf = (subframe<4) ? (subframe+6) : (subframe-4);
-    //    printf("n1_pucch_eNB: subframe %d, nCCE %d\n",sf,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf]);
 
-    if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) {
-      *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf];
+    if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[sf]>0) {
+      *n1_pucch0 = frame_parms->pucch_config_common.n1PUCCH_AN + eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[sf];
       *n1_pucch1 = -1;
     } else {
       *n1_pucch0 = -1;
@@ -1985,15 +1890,15 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
     switch (frame_parms->tdd_config) {
     case 1:  // DL:S:UL:UL:DL:DL:S:UL:UL:DL
       if (subframe == 2) {  // ACK subframes 5 and 6
-        /*  if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
-          nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6];
+        /*  if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
+          nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6];
           *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
           }
           else
           *n1_pucch1 = -1;*/
 
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
-          nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
+          nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5];
           *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch0 = -1;
@@ -2001,8 +1906,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
         *n1_pucch1 = -1;
       } else if (subframe == 3) { // ACK subframe 9
 
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
-          nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
+          nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9];
           *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch0 = -1;
@@ -2012,8 +1917,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
       } else if (subframe == 7) { // ACK subframes 0 and 1
         //harq_ack[0].nCCE;
         //harq_ack[1].nCCE;
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
-          nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
+          nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0];
           *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch0 = -1;
@@ -2021,8 +1926,8 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
         *n1_pucch1 = -1;
       } else if (subframe == 8) { // ACK subframes 4
         //harq_ack[4].nCCE;
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) {
-          nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[4]>0) {
+          nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[4];
           *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 + frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch0 = -1;
@@ -2030,7 +1935,7 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
         *n1_pucch1 = -1;
       } else {
         LOG_D(PHY,"[eNB %d] frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
-              phy_vars_eNB->Mod_id,
+              eNB->Mod_id,
               frame,
               subframe,frame_parms->tdd_config);
         return;
@@ -2040,49 +1945,49 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
 
     case 3:  // DL:S:UL:UL:UL:DL:DL:DL:DL:DL
       if (subframe == 2) {  // ACK subframes 5,6 and 1 (S in frame-2), forget about n-11 for the moment (S-subframe)
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
-          nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[6]>0) {
+          nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[6];
           *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch1 = -1;
 
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
-          nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[5]>0) {
+          nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[5];
           *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0+ frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch0 = -1;
       } else if (subframe == 3) { // ACK subframes 7 and 8
         LOG_D(PHY,"get_n1_pucch_eNB : subframe 3, subframe_tx[7] %d, subframe_tx[8] %d\n",
-              phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]);
+              eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7],eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]);
 
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) {
-          nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[8]>0) {
+          nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[8];
           *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
           LOG_D(PHY,"nCCE1 %d, n1_pucch1 %d\n",nCCE1,*n1_pucch1);
         } else
           *n1_pucch1 = -1;
 
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) {
-          nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[7]>0) {
+          nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[7];
           *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
           LOG_D(PHY,"nCCE0 %d, n1_pucch0 %d\n",nCCE0,*n1_pucch0);
         } else
           *n1_pucch0 = -1;
       } else if (subframe == 4) { // ACK subframes 9 and 0
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
-          nCCE1 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[0]>0) {
+          nCCE1 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[0];
           *n1_pucch1 = get_Np(frame_parms->N_RB_DL,nCCE1,1) + nCCE1 + frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch1 = -1;
 
-        if (phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
-          nCCE0 = phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9];
+        if (eNB->dlsch_eNB[(uint32_t)UE_id][0]->subframe_tx[9]>0) {
+          nCCE0 = eNB->dlsch_eNB[(uint32_t)UE_id][0]->nCCE[9];
           *n1_pucch0 = get_Np(frame_parms->N_RB_DL,nCCE0,0) + nCCE0 +frame_parms->pucch_config_common.n1PUCCH_AN;
         } else
           *n1_pucch0 = -1;
       } else {
         LOG_D(PHY,"[eNB %d] Frame %d: phy_procedures_lte.c: get_n1pucch, illegal subframe %d for tdd_config %d\n",
-              phy_vars_eNB->Mod_id,frame,subframe,frame_parms->tdd_config);
+              eNB->Mod_id,frame,subframe,frame_parms->tdd_config);
         return;
       }
 
@@ -2095,26 +2000,27 @@ void get_n1_pucch_eNB(PHY_VARS_eNB *phy_vars_eNB,
   }
 }
 
-void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t abstraction_flag)
+void prach_procedures(PHY_VARS_eNB *eNB,uint8_t sched_subframe,uint8_t abstraction_flag)
 {
 
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
   uint16_t preamble_energy_list[64],preamble_delay_list[64];
   uint16_t preamble_max,preamble_energy_max;
   uint16_t i;
   int8_t UE_id;
-  int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
-  int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
-  uint8_t CC_id = phy_vars_eNB->CC_id;
+  int subframe = eNB->proc[sched_subframe].subframe_rx;
+  int frame = eNB->proc[sched_subframe].frame_rx;
+  uint8_t CC_id = eNB->CC_id;
 
   memset(&preamble_energy_list[0],0,64*sizeof(uint16_t));
   memset(&preamble_delay_list[0],0,64*sizeof(uint16_t));
 
   if (abstraction_flag == 0) {
-    LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",phy_vars_eNB->Mod_id, 
-          frame,subframe,dB_fixed(signal_energy(&phy_vars_eNB->lte_eNB_common_vars.rxdata[0][0][subframe*phy_vars_eNB->lte_frame_parms.samples_per_tti],512)) - phy_vars_eNB->rx_total_gain_eNB_dB);
+    LOG_D(PHY,"[eNB %d][RAPROC] Frame %d, Subframe %d : PRACH RX Signal Power : %d dBm\n",eNB->Mod_id, 
+          frame,subframe,dB_fixed(signal_energy(&eNB->lte_eNB_common_vars.rxdata[0][0][subframe*fp->samples_per_tti],512)) - eNB->rx_total_gain_eNB_dB);
 
 
-    rx_prach(phy_vars_eNB,
+    rx_prach(eNB,
              subframe,
              preamble_energy_list,
              preamble_delay_list,
@@ -2126,12 +2032,12 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
       LOG_D(PHY,"[RAPROC] UE_id %d (%p), generate_prach %d, UE RSI %d, eNB RSI %d preamble index %d\n",
             UE_id,PHY_vars_UE_g[UE_id][CC_id],PHY_vars_UE_g[UE_id][CC_id]->generate_prach,
             PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex,
-            phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex,
+            fp->prach_config_common.rootSequenceIndex,
             PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex);
 
       if ((PHY_vars_UE_g[UE_id][CC_id]->generate_prach==1) &&
           (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.prach_config_common.rootSequenceIndex ==
-           phy_vars_eNB->lte_frame_parms.prach_config_common.rootSequenceIndex) ) {
+           fp->prach_config_common.rootSequenceIndex) ) {
         preamble_energy_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 800;
         preamble_delay_list[PHY_vars_UE_g[UE_id][CC_id]->prach_PreambleIndex] = 5;
 
@@ -2158,15 +2064,15 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
 
   if (preamble_energy_list[preamble_max] > 580) {
 
-    UE_id = find_next_ue_index(phy_vars_eNB);
+    UE_id = find_next_ue_index(eNB);
  
     if (UE_id>=0) {
-      phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits
+      eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset = preamble_delay_list[preamble_max]&0x1FFF; //limit to 13 (=11+2) bits
 
-      phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0;
+      eNB->eNB_UE_stats[(uint32_t)UE_id].sector = 0;
       LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure (UE_id %d) with preamble %d, energy %d.%d dB, delay %d\n",
-            phy_vars_eNB->Mod_id,
-            phy_vars_eNB->CC_id,
+            eNB->Mod_id,
+            eNB->CC_id,
             frame,
             subframe,
 	    UE_id,
@@ -2175,10 +2081,10 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
             preamble_energy_max%10,
             preamble_delay_list[preamble_max]);
 
-      if (phy_vars_eNB->mac_enabled==1) {
+      if (eNB->mac_enabled==1) {
         uint8_t update_TA=4;
 
-        switch (phy_vars_eNB->lte_frame_parms.N_RB_DL) {
+        switch (fp->N_RB_DL) {
         case 6:
           update_TA = 16;
           break;
@@ -2196,8 +2102,8 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
           break;
         }
 
-      mac_xface->initiate_ra_proc(phy_vars_eNB->Mod_id,
-                                  phy_vars_eNB->CC_id,
+      mac_xface->initiate_ra_proc(eNB->Mod_id,
+                                  eNB->CC_id,
                                   frame,
                                   preamble_max,
                                   preamble_delay_list[preamble_max]*update_TA,
@@ -2207,24 +2113,24 @@ void prach_procedures(PHY_VARS_eNB *phy_vars_eNB,uint8_t sched_subframe,uint8_t
     } else {
       MSC_LOG_EVENT(MSC_PHY_ENB, "0 RA Failed add user, too many");
       LOG_I(PHY,"[eNB %d][RAPROC] frame %d, subframe %d: Unable to add user, max user count reached\n",
-            phy_vars_eNB->Mod_id,frame, subframe);
+            eNB->Mod_id,frame, subframe);
     }
   }
 }
 
-void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *phy_vars_eNB, unsigned char abstraction_flag)
+void ulsch_decoding_procedures(unsigned char subframe, unsigned int i, PHY_VARS_eNB *eNB, unsigned char abstraction_flag)
 {
   UNUSED(subframe);
   UNUSED(i);
-  UNUSED(phy_vars_eNB);
+  UNUSED(eNB);
   UNUSED(abstraction_flag);
   LOG_D(PHY,"ulsch_decoding_procedures not yet implemented. should not be called");
 }
 
 
-void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
+void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
 
-  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
   uint8_t SR_payload = 0,*pucch_payload=NULL,pucch_payload0[2]= {0,0},pucch_payload1[2]= {0,0};
   int16_t n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3;
   uint8_t do_SR = 0;
@@ -2233,20 +2139,20 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
   ANFBmode_t bundling_flag;
   PUCCH_FMT_t format;
 
-  const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
-  const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
+  const int subframe = eNB->proc[sched_subframe].subframe_rx;
+  const int frame = eNB->proc[sched_subframe].frame_rx;
 
-  if ((phy_vars_eNB->dlsch_eNB[UE_id][0]) &&
-      (phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti>0) &&
-      (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { 
+  if ((eNB->dlsch_eNB[UE_id][0]) &&
+      (eNB->dlsch_eNB[UE_id][0]->rnti>0) &&
+      (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_scheduling_flag==0)) { 
 
       // check SR availability
-      do_SR = is_SR_subframe(phy_vars_eNB,UE_id,sched_subframe);
+      do_SR = is_SR_subframe(eNB,UE_id,sched_subframe);
       //      do_SR = 0;
 
       // Now ACK/NAK
       // First check subframe_tx flag for earlier subframes
-      get_n1_pucch_eNB(phy_vars_eNB,
+      get_n1_pucch_eNB(eNB,
                        UE_id,
                        sched_subframe,
                        &n1_pucch0,
@@ -2255,7 +2161,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
                        &n1_pucch3);
 
       LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d, subframe %d Checking for PUCCH (%d,%d,%d,%d) SR %d\n",
-            phy_vars_eNB->Mod_id,phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+            eNB->Mod_id,eNB->dlsch_eNB[UE_id][0]->rnti,
             frame,subframe,
             n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,do_SR);
 
@@ -2264,41 +2170,41 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
         // otherwise we have some PUCCH detection to do
 
 	// Null out PUCCH PRBs for noise measurement
-	switch(phy_vars_eNB->lte_frame_parms.N_RB_UL) {
+	switch(fp->N_RB_UL) {
 	case 6:
-	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5
+	  eNB->rb_mask_ul[0] |= (0x1 | (1<<5)); //position 5
 	  break;
 	case 15:
-	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14
+	  eNB->rb_mask_ul[0] |= (0x1 | (1<<14)); // position 14
 	  break;
 	case 25:
-	  phy_vars_eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24
+	  eNB->rb_mask_ul[0] |= (0x1 | (1<<24)); // position 24
 	  break;
 	case 50:
-	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
-	  phy_vars_eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32)
+	  eNB->rb_mask_ul[0] |= 0x1;
+	  eNB->rb_mask_ul[1] |= (1<<17); // position 49 (49-32)
 	  break;
 	case 75:
-	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
-	  phy_vars_eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64)
+	  eNB->rb_mask_ul[0] |= 0x1;
+	  eNB->rb_mask_ul[2] |= (1<<10); // position 74 (74-64)
 	  break;
 	case 100:
-	  phy_vars_eNB->rb_mask_ul[0] |= 0x1;
-	  phy_vars_eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96)
+	  eNB->rb_mask_ul[0] |= 0x1;
+	  eNB->rb_mask_ul[3] |= (1<<3); // position 99 (99-96)
 	  break;
 	default:
-	  LOG_E(PHY,"Unknown number for N_RB_UL %d\n",phy_vars_eNB->lte_frame_parms.N_RB_UL);
+	  LOG_E(PHY,"Unknown number for N_RB_UL %d\n",fp->N_RB_UL);
 	  break;
 	}
 
         if (do_SR == 1) {
-          phy_vars_eNB->eNB_UE_stats[UE_id].sr_total++;
+          eNB->eNB_UE_stats[UE_id].sr_total++;
 
           if (abstraction_flag == 0)
-            metric0_SR = rx_pucch(phy_vars_eNB,
+            metric0_SR = rx_pucch(eNB,
 				  pucch_format1,
 				  UE_id,
-				  phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
+				  eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
 				  0, // n2_pucch
 				  0, // shortened format, should be use_srs flag, later
 				  &SR_payload,
@@ -2307,56 +2213,56 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
 
 #ifdef PHY_ABSTRACTION
           else {
-            metric0_SR = rx_pucch_emul(phy_vars_eNB,
+            metric0_SR = rx_pucch_emul(eNB,
 				       UE_id,
 				       pucch_format1,
 				       0,
 				       &SR_payload,
 				       sched_subframe);
-            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex);
+            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Checking SR (UE SR %d/%d)\n",eNB->Mod_id,
+                  eNB->ulsch_eNB[UE_id]->rnti,frame,subframe,SR_payload,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex);
           }
 
 #endif
 
           if (SR_payload == 1) {
-            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe);
-            phy_vars_eNB->eNB_UE_stats[UE_id].sr_received++;
+            LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d Got SR for PUSCH, transmitting to MAC\n",eNB->Mod_id,
+                  eNB->ulsch_eNB[UE_id]->rnti,frame,subframe);
+            eNB->eNB_UE_stats[UE_id].sr_received++;
 
-            if (phy_vars_eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
+            if (eNB->first_sr[UE_id] == 1) { // this is the first request for uplink after Connection Setup, so clear HARQ process 0 use for Msg4
               /* is this test necessary? */
-              if (phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE)
-                put_harq_pid_in_freelist(phy_vars_eNB->dlsch_eNB[UE_id][0], 0);
-              phy_vars_eNB->first_sr[UE_id] = 0;
-              phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0;
-              phy_vars_eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE;
+              if (eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status != SCH_IDLE)
+                put_harq_pid_in_freelist(eNB->dlsch_eNB[UE_id][0], 0);
+              eNB->first_sr[UE_id] = 0;
+              eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->round=0;
+              eNB->dlsch_eNB[UE_id][0]->harq_processes[0]->status=SCH_IDLE;
               LOG_D(PHY,"[eNB %d][SR %x] Frame %d subframe %d First SR\n",
-                    phy_vars_eNB->Mod_id,
-                    phy_vars_eNB->ulsch_eNB[UE_id]->rnti,frame,subframe);
+                    eNB->Mod_id,
+                    eNB->ulsch_eNB[UE_id]->rnti,frame,subframe);
             }
 
-	    if (phy_vars_eNB->mac_enabled==1) {
-	      mac_xface->SR_indication(phy_vars_eNB->Mod_id,
-				       phy_vars_eNB->CC_id,
+	    if (eNB->mac_enabled==1) {
+	      mac_xface->SR_indication(eNB->Mod_id,
+				       eNB->CC_id,
 				       frame,
-				       phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe);
+				       eNB->dlsch_eNB[UE_id][0]->rnti,subframe);
 	    }
           }
         }// do_SR==1
 
         if ((n1_pucch0==-1) && (n1_pucch1==-1)) { // just check for SR
-        } else if (phy_vars_eNB->lte_frame_parms.frame_type==FDD) { // FDD
+        } else if (fp->frame_type==FDD) { // FDD
           // if SR was detected, use the n1_pucch from SR, else use n1_pucch0
-	  //          n1_pucch0 = (SR_payload==1) ? phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
+	  //          n1_pucch0 = (SR_payload==1) ? eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex:n1_pucch0;
 
-	  LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload);
+	  LOG_D(PHY,"Demodulating PUCCH for ACK/NAK: n1_pucch0 %d (%d), SR_payload %d\n",n1_pucch0,eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,SR_payload);
 
           if (abstraction_flag == 0) {
 
 
 
-            metric0 = rx_pucch(phy_vars_eNB,
+            metric0 = rx_pucch(eNB,
                                pucch_format1a,
                                UE_id,
                                (uint16_t)n1_pucch0,
@@ -2367,10 +2273,10 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
                                PUCCH1a_THRES);
 
             if (metric0 < metric0_SR)
-	      metric0=rx_pucch(phy_vars_eNB,
+	      metric0=rx_pucch(eNB,
 			       pucch_format1a,
 			       UE_id,
-			       phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
+			       eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
 			       0, //n2_pucch
 			       0, // shortened format
 			       pucch_payload0,
@@ -2379,7 +2285,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
 	  }
           else {
 #ifdef PHY_ABSTRACTION
-            metric0 = rx_pucch_emul(phy_vars_eNB,UE_id,
+            metric0 = rx_pucch_emul(eNB,UE_id,
                                     pucch_format1a,
                                     0,
                                     pucch_payload0,
@@ -2389,13 +2295,13 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
 
 #ifdef DEBUG_PHY_PROC
           LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d pucch1a (FDD) payload %d (metric %d)\n",
-                phy_vars_eNB->Mod_id,
-                phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+                eNB->Mod_id,
+                eNB->dlsch_eNB[UE_id][0]->rnti,
                 frame,subframe,
                 pucch_payload0[0],metric0);
 #endif
 
-          process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB,
+          process_HARQ_feedback(UE_id,sched_subframe,eNB,
                                 0,// pusch_flag
                                 pucch_payload0,
                                 2,
@@ -2404,34 +2310,32 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
         } // FDD
         else {  //TDD
 
-          bundling_flag = phy_vars_eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
+          bundling_flag = eNB->pucch_config_dedicated[UE_id].tdd_AckNackFeedbackMode;
 
           // fix later for 2 TB case and format1b
 
-          if ((frame_parms->frame_type==FDD) ||
+          if ((fp->frame_type==FDD) ||
               (bundling_flag==bundling)    ||
-              ((frame_parms->frame_type==TDD)&&(frame_parms->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
+              ((fp->frame_type==TDD)&&(fp->tdd_config==1)&&((subframe!=2)||(subframe!=7)))) {
             format = pucch_format1a;
-            //      msg("PUCCH 1a\n");
-          } else {
+	  } else {
             format = pucch_format1b;
-            //      msg("PUCCH 1b\n");
-          }
+	  }
 
           // if SR was detected, use the n1_pucch from SR
           if (SR_payload==1) {
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d with SR\n",eNB->Mod_id,
+                  eNB->dlsch_eNB[UE_id][0]->rnti,
                   frame,subframe,
                   n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
 #endif
 
             if (abstraction_flag == 0)
-              metric0_SR = rx_pucch(phy_vars_eNB,
+              metric0_SR = rx_pucch(eNB,
 				    format,
 				    UE_id,
-				    phy_vars_eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
+				    eNB->scheduling_request_config[UE_id].sr_PUCCH_ResourceIndex,
 				    0, //n2_pucch
 				    0, // shortened format
 				    pucch_payload0,
@@ -2439,7 +2343,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
 				    PUCCH1a_THRES);
             else {
 #ifdef PHY_ABSTRACTION
-              metric0 = rx_pucch_emul(phy_vars_eNB,UE_id,
+              metric0 = rx_pucch_emul(eNB,UE_id,
                                       format,
                                       0,
                                       pucch_payload0,
@@ -2448,8 +2352,8 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
             }
           } else { //using n1_pucch0/n1_pucch1 resources
 #ifdef DEBUG_PHY_PROC
-            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",phy_vars_eNB->Mod_id,
-                  phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+            LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d Checking ACK/NAK (%d,%d,%d,%d) format %d\n",eNB->Mod_id,
+                  eNB->dlsch_eNB[UE_id][0]->rnti,
                   frame,subframe,
                   n1_pucch0,n1_pucch1,n1_pucch2,n1_pucch3,format);
 #endif
@@ -2459,7 +2363,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
             // Check n1_pucch0 metric
             if (n1_pucch0 != -1) {
               if (abstraction_flag == 0)
-                metric0 = rx_pucch(phy_vars_eNB,
+                metric0 = rx_pucch(eNB,
                                    format,
                                    UE_id,
                                    (uint16_t)n1_pucch0,
@@ -2470,7 +2374,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
                                    PUCCH1a_THRES);
               else {
 #ifdef PHY_ABSTRACTION
-                metric0 = rx_pucch_emul(phy_vars_eNB,UE_id,
+                metric0 = rx_pucch_emul(eNB,UE_id,
                                         format,
                                         0,
                                         pucch_payload0,
@@ -2482,7 +2386,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
             // Check n1_pucch1 metric
             if (n1_pucch1 != -1) {
               if (abstraction_flag == 0)
-                metric1 = rx_pucch(phy_vars_eNB,
+                metric1 = rx_pucch(eNB,
                                    format,
                                    UE_id,
                                    (uint16_t)n1_pucch1,
@@ -2493,7 +2397,7 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
                                    PUCCH1a_THRES);
               else {
 #ifdef PHY_ABSTRACTION
-                metric1 = rx_pucch_emul(phy_vars_eNB,UE_id,
+                metric1 = rx_pucch_emul(eNB,UE_id,
                                         format,
                                         1,
                                         pucch_payload1,
@@ -2523,12 +2427,12 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
           }
 
 #ifdef DEBUG_PHY_PROC
-          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",phy_vars_eNB->Mod_id,
-                phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,
+          LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d ACK/NAK metric 0 %d, metric 1 %d, sel %d, (%d,%d)\n",eNB->Mod_id,
+                eNB->dlsch_eNB[UE_id][0]->rnti,
                 frame,subframe,
                 metric0,metric1,pucch_sel,pucch_payload[0],pucch_payload[1]);
 #endif
-          process_HARQ_feedback(UE_id,sched_subframe,phy_vars_eNB,
+          process_HARQ_feedback(UE_id,sched_subframe,eNB,
                                 0,// pusch_flag
                                 pucch_payload,
                                 pucch_sel,
@@ -2539,61 +2443,62 @@ void pucch_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_
     }
 }
 
-void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
+void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,int UE_id,int harq_pid,const uint8_t abstraction_flag) {
 
   uint8_t access_mode;
   int num_active_cba_groups;
-  const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
-  const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
+  const int subframe = eNB->proc[sched_subframe].subframe_rx;
+  const int frame = eNB->proc[sched_subframe].frame_rx;
   uint16_t rnti=0;
   int ret=0;
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
 
-  num_active_cba_groups = phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups;
+  num_active_cba_groups = eNB->ulsch_eNB[UE_id]->num_active_cba_groups;
   
-  if ((phy_vars_eNB->ulsch_eNB[UE_id]) &&
+  if ((eNB->ulsch_eNB[UE_id]) &&
       (num_active_cba_groups > 0) &&
-      (phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) &&
-      (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) {
+      (eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]>0) &&
+      (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag==1)) {
     rnti=0;
     
 #ifdef DEBUG_PHY_PROC
     LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Checking PUSCH/ULSCH CBA Reception for UE %d with cba rnti %x mode %s\n",
-	  phy_vars_eNB->Mod_id,harq_pid,
+	  eNB->Mod_id,harq_pid,
 	  frame,subframe,
-	  UE_id, (uint16_t)phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[phy_vars_eNB->eNB_UE_stats[UE_id].mode]);
+	  UE_id, (uint16_t)eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups],mode_string[eNB->eNB_UE_stats[UE_id].mode]);
 #endif
     
     if (abstraction_flag==0) {
-      rx_ulsch(phy_vars_eNB,
+      rx_ulsch(eNB,
 	       sched_subframe,
-	       phy_vars_eNB->eNB_UE_stats[UE_id].sector,  // this is the effective sector id
+	       eNB->eNB_UE_stats[UE_id].sector,  // this is the effective sector id
 	       UE_id,
-	       phy_vars_eNB->ulsch_eNB,
+	       eNB->ulsch_eNB,
 	       0);
     }
     
 #ifdef PHY_ABSTRACTION
     else {
-      rx_ulsch_emul(phy_vars_eNB,
+      rx_ulsch_emul(eNB,
 		    subframe,
-		    phy_vars_eNB->eNB_UE_stats[UE_id].sector,  // this is the effective sector id
+		    eNB->eNB_UE_stats[UE_id].sector,  // this is the effective sector id
 		    UE_id);
     }
     
 #endif
     
     if (abstraction_flag == 0) {
-      ret = ulsch_decoding(phy_vars_eNB,
+      ret = ulsch_decoding(eNB,
 			   UE_id,
 			   sched_subframe,
 			   0, // control_only_flag
-			   phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI,
-			   phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
+			   eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->V_UL_DAI,
+			   eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
     }
     
 #ifdef PHY_ABSTRACTION
     else {
-      ret = ulsch_decoding_emul(phy_vars_eNB,
+      ret = ulsch_decoding_emul(eNB,
 				sched_subframe,
 				UE_id,
 				&rnti);
@@ -2601,60 +2506,60 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN
     
 #endif
     
-    if (phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) {
+    if (eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->cqi_crc_status == 1) {
 #ifdef DEBUG_PHY_PROC
       
-      print_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
+      print_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL);
 #endif
       access_mode = UNKNOWN_ACCESS;
-      extract_CQI(phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,
-		  phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,
-		  &phy_vars_eNB->eNB_UE_stats[UE_id],
-		  phy_vars_eNB->lte_frame_parms.N_RB_DL,
+      extract_CQI(eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o,
+		  eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->uci_format,
+		  &eNB->eNB_UE_stats[UE_id],
+		  fp->N_RB_DL,
 		  &rnti, &access_mode);
-      phy_vars_eNB->eNB_UE_stats[UE_id].rank = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0];
+      eNB->eNB_UE_stats[UE_id].rank = eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->o_RI[0];
     }
     
-      phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0;
-      phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE;
+      eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=0;
+      eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->status= SCH_IDLE;
       
       if ((num_active_cba_groups > 0) &&
           (UE_id + num_active_cba_groups < NUMBER_OF_UE_MAX) &&
-          (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) &&
-          (phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) {
+          (eNB->ulsch_eNB[UE_id+num_active_cba_groups]->cba_rnti[UE_id%num_active_cba_groups] > 0 ) &&
+          (eNB->ulsch_eNB[UE_id+num_active_cba_groups]->num_active_cba_groups> 0)) {
 #ifdef DEBUG_PHY_PROC
         LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d harq_pid %d resetting the subframe_scheduling_flag for Ue %d cba groups %d members\n",
-              phy_vars_eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid,
-              UE_id+num_active_cba_groups, UE_id%phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups);
+              eNB->Mod_id,harq_pid,frame,subframe,UE_id,harq_pid,
+              UE_id+num_active_cba_groups, UE_id%eNB->ulsch_eNB[UE_id]->num_active_cba_groups);
 #endif
-        phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1;
-        phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE;
-        phy_vars_eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS;
+        eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->subframe_cba_scheduling_flag=1;
+        eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->status= CBA_ACTIVE;
+        eNB->ulsch_eNB[UE_id+num_active_cba_groups]->harq_processes[harq_pid]->TBS=eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS;
       }
 
       if (ret == (1+MAX_TURBO_ITERATIONS)) {
-        phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++;
-        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0;
-        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++;
+        eNB->eNB_UE_stats[UE_id].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round]++;
+        eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1;
+        eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 0;
+        eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round++;
       } // ulsch in error
       else {
         LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
-              phy_vars_eNB->Mod_id,harq_pid,
+              eNB->Mod_id,harq_pid,
               frame,subframe);
 
-        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1;
-        phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0;
-        phy_vars_eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0;
+        eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_active = 1;
+        eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->phich_ACK = 1;
+        eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->round = 0;
+        eNB->eNB_UE_stats[UE_id].ulsch_consecutive_errors = 0;
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_ULSCH
         LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",
               frame,subframe,
-              harq_pid,phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3);
+              harq_pid,eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3);
 
-        for (j=0; j<phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++)
-          LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]);
+        for (j=0; j<eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3; j++)
+          LOG_T(PHY,"%x.",eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b[j]);
 
         LOG_T(PHY,"\n");
 #endif
@@ -2662,37 +2567,37 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN
 
         if (access_mode > UNKNOWN_ACCESS) {
           LOG_D(PHY,"[eNB %d] Frame %d, Subframe %d : received ULSCH SDU from CBA transmission, UE (%d,%x), CBA (group %d, rnti %x)\n",
-                phy_vars_eNB->Mod_id, frame,subframe,
-                UE_id, phy_vars_eNB->ulsch_eNB[UE_id]->rnti,
-                UE_id % phy_vars_eNB->ulsch_eNB[UE_id]->num_active_cba_groups, phy_vars_eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]);
+                eNB->Mod_id, frame,subframe,
+                UE_id, eNB->ulsch_eNB[UE_id]->rnti,
+                UE_id % eNB->ulsch_eNB[UE_id]->num_active_cba_groups, eNB->ulsch_eNB[UE_id]->cba_rnti[UE_id%num_active_cba_groups]);
 
           // detect if there is a CBA collision
-          if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) {
-            mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-                              phy_vars_eNB->CC_id,
+          if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 0 ) {
+            mac_xface->rx_sdu(eNB->Mod_id,
+                              eNB->CC_id,
                               frame,subframe,
-                              phy_vars_eNB->ulsch_eNB[UE_id]->rnti,
-                              phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b,
-                              phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3,
+                              eNB->ulsch_eNB[UE_id]->rnti,
+                              eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->b,
+                              eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->TBS>>3,
                               harq_pid,
                               NULL);
 
-            phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe);
+            eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;//(subframe);
           } else {
-            if (phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 )
+            if (eNB->cba_last_reception[UE_id%num_active_cba_groups] == 1 )
               LOG_N(PHY,"[eNB%d] Frame %d subframe %d : first CBA collision detected \n ",
-                    phy_vars_eNB->Mod_id,frame,subframe);
+                    eNB->Mod_id,frame,subframe);
 
             LOG_N(PHY,"[eNB%d] Frame %d subframe %d : CBA collision set SR for UE %d in group %d \n ",
-                  phy_vars_eNB->Mod_id,frame,subframe,
-                  phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups );
+                  eNB->Mod_id,frame,subframe,
+                  eNB->cba_last_reception[UE_id%num_active_cba_groups],UE_id%num_active_cba_groups );
 
-            phy_vars_eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;
+            eNB->cba_last_reception[UE_id%num_active_cba_groups]+=1;
 
-            mac_xface->SR_indication(phy_vars_eNB->Mod_id,
-                                     phy_vars_eNB->CC_id,
+            mac_xface->SR_indication(eNB->Mod_id,
+                                     eNB->CC_id,
                                      frame,
-                                     phy_vars_eNB->dlsch_eNB[UE_id][0]->rnti,subframe);
+                                     eNB->dlsch_eNB[UE_id][0]->rnti,subframe);
           }
         } // UNKNOWN_ACCESS
       } // ULSCH CBA not in error
@@ -2700,61 +2605,61 @@ void cba_procedures(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eN
 
 }
 
-void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_eNB,const uint8_t abstraction_flag,const relaying_type_t r_type)
+void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *eNB,const uint8_t abstraction_flag,const relaying_type_t r_type)
 {
   //RX processing
   UNUSED(r_type);
   uint32_t l, ret=0,i,j,k;
   uint32_t harq_pid, harq_idx, round;
   uint8_t nPRS;
-  LTE_DL_FRAME_PARMS *frame_parms=&phy_vars_eNB->lte_frame_parms;
   int sync_pos;
   uint16_t rnti=0;
   uint8_t access_mode;
+  LTE_DL_FRAME_PARMS *fp=&eNB->lte_frame_parms;
 
-  const int subframe = phy_vars_eNB->proc[sched_subframe].subframe_rx;
-  const int frame = phy_vars_eNB->proc[sched_subframe].frame_rx;
+  const int subframe = eNB->proc[sched_subframe].subframe_rx;
+  const int frame = eNB->proc[sched_subframe].frame_rx;
 
   AssertFatal(sched_subframe < NUM_ENB_THREADS, "Bad sched_subframe %d", sched_subframe);
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,1);
-  start_meas(&phy_vars_eNB->phy_proc_rx);
+  start_meas(&eNB->phy_proc_rx);
 #ifdef DEBUG_PHY_PROC
-  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",phy_vars_eNB->Mod_id,frame, subframe);
+  LOG_D(PHY,"[eNB %d] Frame %d: Doing phy_procedures_eNB_RX(%d)\n",eNB->Mod_id,frame, subframe);
 #endif
 
 
-  phy_vars_eNB->rb_mask_ul[0]=0;
-  phy_vars_eNB->rb_mask_ul[1]=0;
-  phy_vars_eNB->rb_mask_ul[2]=0;
-  phy_vars_eNB->rb_mask_ul[3]=0;
+  eNB->rb_mask_ul[0]=0;
+  eNB->rb_mask_ul[1]=0;
+  eNB->rb_mask_ul[2]=0;
+  eNB->rb_mask_ul[3]=0;
 
   if (abstraction_flag == 0) {
-    remove_7_5_kHz(phy_vars_eNB,subframe<<1);
-    remove_7_5_kHz(phy_vars_eNB,(subframe<<1)+1);
+    remove_7_5_kHz(eNB,subframe<<1);
+    remove_7_5_kHz(eNB,(subframe<<1)+1);
   }
 
   // check if we have to detect PRACH first
-  if (is_prach_subframe(&phy_vars_eNB->lte_frame_parms,frame,subframe)>0) {
+  if (is_prach_subframe(fp,frame,subframe)>0) {
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,1);
-    prach_procedures(phy_vars_eNB,sched_subframe,abstraction_flag);
+    prach_procedures(eNB,sched_subframe,abstraction_flag);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
   }
 
   if (abstraction_flag == 0) {
-    start_meas(&phy_vars_eNB->ofdm_demod_stats);
+    start_meas(&eNB->ofdm_demod_stats);
 
-    for (l=0; l<phy_vars_eNB->lte_frame_parms.symbols_per_tti/2; l++) {
+    for (l=0; l<fp->symbols_per_tti/2; l++) {
 
-      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
-                  &phy_vars_eNB->lte_eNB_common_vars,
+      slot_fep_ul(fp,
+                  &eNB->lte_eNB_common_vars,
                   l,
                   subframe<<1,
                   0,
                   0
                  );
-      slot_fep_ul(&phy_vars_eNB->lte_frame_parms,
-                  &phy_vars_eNB->lte_eNB_common_vars,
+      slot_fep_ul(fp,
+                  &eNB->lte_eNB_common_vars,
                   l,
                   (subframe<<1)+1,
                   0,
@@ -2762,265 +2667,265 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
                  );
     }
 
-    stop_meas(&phy_vars_eNB->ofdm_demod_stats);
+    stop_meas(&eNB->ofdm_demod_stats);
   }
 
   // Check for active processes in current subframe
-  harq_pid = subframe2harq_pid(&phy_vars_eNB->lte_frame_parms,
+  harq_pid = subframe2harq_pid(fp,
                                frame,subframe);
 
   // reset the cba flag used for collision detection
   for (i=0; i < NUM_MAX_CBA_GROUP; i++) {
-    phy_vars_eNB->cba_last_reception[i]=0;
+    eNB->cba_last_reception[i]=0;
   }
 
   // Do PUCCH processing first
 
   for (i=0; i<NUMBER_OF_UE_MAX; i++) {
-    pucch_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag);
+    pucch_procedures(sched_subframe,eNB,i,harq_pid,abstraction_flag);
   }
 
   for (i=0; i<NUMBER_OF_UE_MAX; i++) {
 
     // check for Msg3
-    if (phy_vars_eNB->mac_enabled==1) {
-      if (phy_vars_eNB->eNB_UE_stats[i].mode == RA_RESPONSE) {
-	process_Msg3(phy_vars_eNB,sched_subframe,i,harq_pid);
+    if (eNB->mac_enabled==1) {
+      if (eNB->eNB_UE_stats[i].mode == RA_RESPONSE) {
+	process_Msg3(eNB,sched_subframe,i,harq_pid);
       }
     }
 
 
-    phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63;
-    phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = 0;
-    phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63;
+    eNB->pusch_stats_rb[i][(frame*10)+subframe] = -63;
+    eNB->pusch_stats_round[i][(frame*10)+subframe] = 0;
+    eNB->pusch_stats_mcs[i][(frame*10)+subframe] = -63;
 
-    if ((phy_vars_eNB->ulsch_eNB[i]) &&
-        (phy_vars_eNB->ulsch_eNB[i]->rnti>0) &&
-        (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) {
+    if ((eNB->ulsch_eNB[i]) &&
+        (eNB->ulsch_eNB[i]->rnti>0) &&
+        (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag==1)) {
       // UE is has ULSCH scheduling
-      round = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
+      round = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
 
       for (int rb=0;
-           rb<=phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
+           rb<=eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
 	   rb++) {
-	int rb2 = rb+phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb;
-	phy_vars_eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
+	int rb2 = rb+eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb;
+	eNB->rb_mask_ul[rb2>>5] |= (1<<(rb2&31));
       }
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d Scheduling PUSCH/ULSCH Reception for rnti %x (UE_id %d)\n",
-            phy_vars_eNB->Mod_id,harq_pid,
-            frame,subframe,phy_vars_eNB->ulsch_eNB[i]->rnti,i);
+            eNB->Mod_id,harq_pid,
+            frame,subframe,eNB->ulsch_eNB[i]->rnti,i);
 #endif
 
-      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+      if (eNB->ulsch_eNB[i]->Msg3_flag == 1) {
         LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for Msg3 in Sector %d\n",
-              phy_vars_eNB->Mod_id,
+              eNB->Mod_id,
               frame,
               subframe,
-              phy_vars_eNB->eNB_UE_stats[i].sector);
+              eNB->eNB_UE_stats[i].sector);
 	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,1);
       } else {
         LOG_D(PHY,"[eNB %d] frame %d, subframe %d: Scheduling ULSCH Reception for UE %d Mode %s\n",
-              phy_vars_eNB->Mod_id,
+              eNB->Mod_id,
               frame,
               subframe,
               i,
-              mode_string[phy_vars_eNB->eNB_UE_stats[i].mode]);
+              mode_string[eNB->eNB_UE_stats[i].mode]);
       }
 
 
-      nPRS = phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1];
+      nPRS = fp->pusch_config_common.ul_ReferenceSignalsPUSCH.nPRS[subframe<<1];
 
-      phy_vars_eNB->ulsch_eNB[i]->cyclicShift = (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
+      eNB->ulsch_eNB[i]->cyclicShift = (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2 + fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift +
           nPRS)%12;
 
-      if (frame_parms->frame_type == FDD ) {
+      if (fp->frame_type == FDD ) {
         int sf = (subframe<4) ? (subframe+6) : (subframe-4);
 
-        if (phy_vars_eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission
-          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1;
+        if (eNB->dlsch_eNB[i][0]->subframe_tx[sf]>0) { // we have downlink transmission
+          eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 1;
         } else {
-          phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0;
+          eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK = 0;
         }
       }
 
       LOG_D(PHY,
             "[eNB %d][PUSCH %d] Frame %d Subframe %d Demodulating PUSCH: dci_alloc %d, rar_alloc %d, round %d, first_rb %d, nb_rb %d, mcs %d, TBS %d, rv %d, cyclic_shift %d (n_DMRS2 %d, cyclicShift_common %d, nprs %d), O_ACK %d \n",
-            phy_vars_eNB->Mod_id,harq_pid,frame,subframe,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx,
-            phy_vars_eNB->ulsch_eNB[i]->cyclicShift,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2,
-            phy_vars_eNB->lte_frame_parms.pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
+            eNB->Mod_id,harq_pid,frame,subframe,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->dci_alloc,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rar_alloc,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->first_rb,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->rvidx,
+            eNB->ulsch_eNB[i]->cyclicShift,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->n_DMRS2,
+            fp->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift,
             nPRS,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK);
-      phy_vars_eNB->pusch_stats_rb[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
-      phy_vars_eNB->pusch_stats_round[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
-      phy_vars_eNB->pusch_stats_mcs[i][(frame*10)+subframe] = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs;
-      start_meas(&phy_vars_eNB->ulsch_demodulation_stats);
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->O_ACK);
+      eNB->pusch_stats_rb[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb;
+      eNB->pusch_stats_round[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round;
+      eNB->pusch_stats_mcs[i][(frame*10)+subframe] = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->mcs;
+      start_meas(&eNB->ulsch_demodulation_stats);
 
       if (abstraction_flag==0) {
-        rx_ulsch(phy_vars_eNB,
+        rx_ulsch(eNB,
                  sched_subframe,
-                 phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+                 eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
                  i,
-                 phy_vars_eNB->ulsch_eNB,
+                 eNB->ulsch_eNB,
                  0);
       }
 
 #ifdef PHY_ABSTRACTION
       else {
-        rx_ulsch_emul(phy_vars_eNB,
+        rx_ulsch_emul(eNB,
                       subframe,
-                      phy_vars_eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
+                      eNB->eNB_UE_stats[i].sector,  // this is the effective sector id
                       i);
       }
 
 #endif
-      stop_meas(&phy_vars_eNB->ulsch_demodulation_stats);
+      stop_meas(&eNB->ulsch_demodulation_stats);
 
 
-      start_meas(&phy_vars_eNB->ulsch_decoding_stats);
+      start_meas(&eNB->ulsch_decoding_stats);
 
       if (abstraction_flag == 0) {
-        ret = ulsch_decoding(phy_vars_eNB,
+        ret = ulsch_decoding(eNB,
                              i,
                              sched_subframe,
                              0, // control_only_flag
-                             phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI,
-			     phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
+                             eNB->ulsch_eNB[i]->harq_processes[harq_pid]->V_UL_DAI,
+			     eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb>20 ? 1 : 0);
       }
 
 #ifdef PHY_ABSTRACTION
       else {
-        ret = ulsch_decoding_emul(phy_vars_eNB,
+        ret = ulsch_decoding_emul(eNB,
                                   sched_subframe,
                                   i,
                                   &rnti);
       }
 
 #endif
-      stop_meas(&phy_vars_eNB->ulsch_decoding_stats);
+      stop_meas(&eNB->ulsch_decoding_stats);
 
       LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
-            phy_vars_eNB->Mod_id,harq_pid,
+            eNB->Mod_id,harq_pid,
             frame,subframe,
-            phy_vars_eNB->ulsch_eNB[i]->rnti,
-            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
-            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
-            phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
-            phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-            phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+            eNB->ulsch_eNB[i]->rnti,
+            dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+            dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
+            eNB->eNB_UE_stats[i].UL_rssi[0],
+            eNB->eNB_UE_stats[i].UL_rssi[1],
+            eNB->PHY_measurements_eNB->n0_power_dB[0],
+            eNB->PHY_measurements_eNB->n0_power_dB[1],
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
             ret);
 
 
       //compute the expected ULSCH RX power (for the stats)
-      phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF =
-        get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered
+      eNB->ulsch_eNB[(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(phy_vars_eNB, sched_subframe, i);
+      //dump_ulsch(eNB, sched_subframe, i);
 
-      phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
+      eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][eNB->ulsch_eNB[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",
-            phy_vars_eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid);
+            eNB->Mod_id,harq_pid,frame,subframe,i,harq_pid);
 #endif
-      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
+      eNB->ulsch_eNB[i]->harq_processes[harq_pid]->subframe_scheduling_flag=0;
 
-      if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
+      if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status == 1) {
 #ifdef DEBUG_PHY_PROC
-        //if (((phy_vars_eNB->proc[sched_subframe].frame_tx%10) == 0) || (phy_vars_eNB->proc[sched_subframe].frame_tx < 50))
-        print_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,phy_vars_eNB->lte_frame_parms.N_RB_DL);
+        //if (((eNB->proc[sched_subframe].frame_tx%10) == 0) || (eNB->proc[sched_subframe].frame_tx < 50))
+        print_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,0,fp->N_RB_DL);
 #endif
-        extract_CQI(phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,
-                    phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,
-                    &phy_vars_eNB->eNB_UE_stats[i],
-                    phy_vars_eNB->lte_frame_parms.N_RB_DL,
+        extract_CQI(eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o,
+                    eNB->ulsch_eNB[i]->harq_processes[harq_pid]->uci_format,
+                    &eNB->eNB_UE_stats[i],
+                    fp->N_RB_DL,
                     &rnti, &access_mode);
-        phy_vars_eNB->eNB_UE_stats[i].rank = phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0];
+        eNB->eNB_UE_stats[i].rank = eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_RI[0];
 
       }
 
-      if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1)
+      if (eNB->ulsch_eNB[i]->Msg3_flag == 1)
 	VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_MSG3,0);
 
       if (ret == (1+MAX_TURBO_ITERATIONS)) {
 
-        phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
+        eNB->eNB_UE_stats[i].ulsch_round_errors[harq_pid][eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round]++;
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 0;
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round++;
 
-        LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
+        LOG_D(PHY,"[eNB][PUSCH %d] Increasing to round %d\n",harq_pid,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round);
 
-        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+        if (eNB->ulsch_eNB[i]->Msg3_flag == 1) {
           LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n",
-                phy_vars_eNB->Mod_id,
-                phy_vars_eNB->CC_id,
+                eNB->Mod_id,
+                eNB->CC_id,
                 frame,subframe, i,
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
-                phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx-1);
+                eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
+                fp->maxHARQ_Msg3Tx-1);
 
 	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
-		phy_vars_eNB->Mod_id,harq_pid,
+		eNB->Mod_id,harq_pid,
 		frame,subframe,
-		phy_vars_eNB->ulsch_eNB[i]->rnti,
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+		eNB->ulsch_eNB[i]->rnti,
+		dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+		dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
+		eNB->eNB_UE_stats[i].UL_rssi[0],
+		eNB->eNB_UE_stats[i].UL_rssi[1],
+		eNB->PHY_measurements_eNB->n0_power_dB[0],
+		eNB->PHY_measurements_eNB->n0_power_dB[1],
+		eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+		eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
 		ret);
 
-          if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round ==
-              phy_vars_eNB->lte_frame_parms.maxHARQ_Msg3Tx) {
+          if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round ==
+              fp->maxHARQ_Msg3Tx) {
             LOG_D(PHY,"[eNB %d][RAPROC] maxHARQ_Msg3Tx reached, abandoning RA procedure for UE %d\n",
-                  phy_vars_eNB->Mod_id, i);
-            phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
-	    if (phy_vars_eNB->mac_enabled==1) {
-	      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-					phy_vars_eNB->CC_id,
+                  eNB->Mod_id, i);
+            eNB->eNB_UE_stats[i].mode = PRACH;
+	    if (eNB->mac_enabled==1) {
+	      mac_xface->cancel_ra_proc(eNB->Mod_id,
+					eNB->CC_id,
 					frame,
-					phy_vars_eNB->eNB_UE_stats[i].crnti);
+					eNB->eNB_UE_stats[i].crnti);
 	    }
-            mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti);
+            mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti);
 
-            phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
-            //phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;
+            eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
+            //eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 0;
 
           } else {
             // activate retransmission for Msg3 (signalled to UE PHY by PHICH (not MAC/DCI)
-            phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1;
+            eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 1;
 
-            get_Msg3_alloc_ret(&phy_vars_eNB->lte_frame_parms,
+            get_Msg3_alloc_ret(fp,
                                subframe,
                                frame,
-                               &phy_vars_eNB->ulsch_eNB[i]->Msg3_frame,
-                               &phy_vars_eNB->ulsch_eNB[i]->Msg3_subframe);
+                               &eNB->ulsch_eNB[i]->Msg3_frame,
+                               &eNB->ulsch_eNB[i]->Msg3_subframe);
           }
           LOG_D(PHY,"[eNB] Frame %d, Subframe %d: Msg3 in error, i = %d \n", frame,subframe,i);
         } // This is Msg3 error
 
         else { //normal ULSCH
           LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d Error receiving ULSCH, round %d/%d (ACK %d,%d)\n",
-                phy_vars_eNB->Mod_id,harq_pid,
+                eNB->Mod_id,harq_pid,
                 frame,subframe, i,
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
-                phy_vars_eNB->ulsch_eNB[i]->Mlimit,
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-                phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]);
+                eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1,
+                eNB->ulsch_eNB[i]->Mlimit,
+                eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+                eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1]);
 
 #if defined(MESSAGE_CHART_GENERATOR_PHY)
           MSC_LOG_RX_DISCARDED_MESSAGE(
@@ -3028,51 +2933,51 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
             NULL,0,
             "%05u:%02u ULSCH received rnti %x harq id %u round %d",
             frame,subframe,
-            phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1
+            eNB->ulsch_eNB[i]->rnti,harq_pid,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round-1
             );
 #endif
 
-          if (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== phy_vars_eNB->ulsch_eNB[i]->Mlimit) {
+          if (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round== eNB->ulsch_eNB[i]->Mlimit) {
             LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d UE %d ULSCH Mlimit %d reached\n",
-                  phy_vars_eNB->Mod_id,harq_pid,
+                  eNB->Mod_id,harq_pid,
                   frame,subframe, i,
-                  phy_vars_eNB->ulsch_eNB[i]->Mlimit);
+                  eNB->ulsch_eNB[i]->Mlimit);
 
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0;
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors++;
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round=0;
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active=0;
+            eNB->eNB_UE_stats[i].ulsch_errors[harq_pid]++;
+            eNB->eNB_UE_stats[i].ulsch_consecutive_errors++;
 
 	    // indicate error to MAC
-	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-			      phy_vars_eNB->CC_id,
+	    mac_xface->rx_sdu(eNB->Mod_id,
+			      eNB->CC_id,
 			      frame,subframe,
-			      phy_vars_eNB->ulsch_eNB[i]->rnti,
+			      eNB->ulsch_eNB[i]->rnti,
 			      NULL,
 			      0,
 			      harq_pid,
-			      &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag);
+			      &eNB->ulsch_eNB[i]->Msg3_flag);
           }
         }
       }  // ulsch in error
       else {
-        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+        if (eNB->ulsch_eNB[i]->Msg3_flag == 1) {
 	  LOG_D(PHY,"[eNB %d][PUSCH %d] Frame %d subframe %d ULSCH received, setting round to 0, PHICH ACK\n",
-		phy_vars_eNB->Mod_id,harq_pid,
+		eNB->Mod_id,harq_pid,
 		frame,subframe);
 	  LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n",
-		phy_vars_eNB->Mod_id,harq_pid,
+		eNB->Mod_id,harq_pid,
 		frame,subframe,
-		phy_vars_eNB->ulsch_eNB[i]->rnti,
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
-		dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[0],
-		phy_vars_eNB->eNB_UE_stats[i].UL_rssi[1],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[0],
-		phy_vars_eNB->PHY_measurements_eNB->n0_power_dB[1],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-		phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+		eNB->ulsch_eNB[i]->rnti,
+		dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[0]),
+		dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[1]),
+		eNB->eNB_UE_stats[i].UL_rssi[0],
+		eNB->eNB_UE_stats[i].UL_rssi[1],
+		eNB->PHY_measurements_eNB->n0_power_dB[0],
+		eNB->PHY_measurements_eNB->n0_power_dB[1],
+		eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+		eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
 		ret);
 	}
 #if defined(MESSAGE_CHART_GENERATOR_PHY)
@@ -3081,115 +2986,115 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
           NULL,0,
           "%05u:%02u ULSCH received rnti %x harq id %u",
           frame,subframe,
-          phy_vars_eNB->ulsch_eNB[i]->rnti,harq_pid
+          eNB->ulsch_eNB[i]->rnti,harq_pid
           );
 #endif
-        for (j=0; j<phy_vars_eNB->lte_frame_parms.nb_antennas_rx; j++)
+        for (j=0; j<fp->nb_antennas_rx; j++)
           //this is the RSSI per RB
-          phy_vars_eNB->eNB_UE_stats[i].UL_rssi[j] =
+          eNB->eNB_UE_stats[i].UL_rssi[j] =
 	    
-            dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*
-                     (phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/
-                     phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) -
-            phy_vars_eNB->rx_total_gain_eNB_dB -
-            hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
-            get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;
+            dB_fixed(eNB->lte_eNB_pusch_vars[i]->ulsch_power[j]*
+                     (eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb*12)/
+                     fp->ofdm_symbol_size) -
+            eNB->rx_total_gain_eNB_dB -
+            hundred_times_log10_NPRB[eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
+            get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 0)/100;
 	    
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
-        phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
-        phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
+        eNB->ulsch_eNB[i]->harq_processes[harq_pid]->round = 0;
+        eNB->eNB_UE_stats[i].ulsch_consecutive_errors = 0;
 
-        if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 1) {
-	  if (phy_vars_eNB->mac_enabled==1) {
+        if (eNB->ulsch_eNB[i]->Msg3_flag == 1) {
+	  if (eNB->mac_enabled==1) {
 
 	    LOG_I(PHY,"[eNB %d][RAPROC] Frame %d Terminating ra_proc for harq %d, UE %d\n",
-		  phy_vars_eNB->Mod_id,
+		  eNB->Mod_id,
 		  frame,harq_pid,i);
 	    
-	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-			      phy_vars_eNB->CC_id,
+	    mac_xface->rx_sdu(eNB->Mod_id,
+			      eNB->CC_id,
 			      frame,subframe,
-			      phy_vars_eNB->ulsch_eNB[i]->rnti,
-			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
+			      eNB->ulsch_eNB[i]->rnti,
+			      eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
+			      eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
 			      harq_pid,
-			      &phy_vars_eNB->ulsch_eNB[i]->Msg3_flag);
+			      &eNB->ulsch_eNB[i]->Msg3_flag);
 	    
 	    // one-shot msg3 detection by MAC: empty PDU (e.g. CRNTI)
-	    if (phy_vars_eNB->ulsch_eNB[i]->Msg3_flag == 0 ) {
-	      phy_vars_eNB->eNB_UE_stats[i].mode = PRACH;
-	      mac_xface->cancel_ra_proc(phy_vars_eNB->Mod_id,
-					phy_vars_eNB->CC_id,
+	    if (eNB->ulsch_eNB[i]->Msg3_flag == 0 ) {
+	      eNB->eNB_UE_stats[i].mode = PRACH;
+	      mac_xface->cancel_ra_proc(eNB->Mod_id,
+					eNB->CC_id,
 					frame,
-					phy_vars_eNB->eNB_UE_stats[i].crnti);
-	      mac_phy_remove_ue(phy_vars_eNB->Mod_id,phy_vars_eNB->eNB_UE_stats[i].crnti);
-	      phy_vars_eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
+					eNB->eNB_UE_stats[i].crnti);
+	      mac_phy_remove_ue(eNB->Mod_id,eNB->eNB_UE_stats[i].crnti);
+	      eNB->ulsch_eNB[(uint32_t)i]->Msg3_active = 0;
 	    } // Msg3_flag == 0
 	    
 	  } // mac_enabled==1
 
-          phy_vars_eNB->eNB_UE_stats[i].mode = PUSCH;
-          phy_vars_eNB->ulsch_eNB[i]->Msg3_flag = 0;
+          eNB->eNB_UE_stats[i].mode = PUSCH;
+          eNB->ulsch_eNB[i]->Msg3_flag = 0;
 
-	  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",phy_vars_eNB->Mod_id,frame,subframe,i);
+	  LOG_D(PHY,"[eNB %d][RAPROC] Frame %d : RX Subframe %d Setting UE %d mode to PUSCH\n",eNB->Mod_id,frame,subframe,i);
 
           for (k=0; k<8; k++) { //harq_processes
-            for (j=0; j<phy_vars_eNB->dlsch_eNB[i][0]->Mlimit; j++) {
-              phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0;
+            for (j=0; j<eNB->dlsch_eNB[i][0]->Mlimit; j++) {
+              eNB->eNB_UE_stats[i].dlsch_NAK[k][j]=0;
+              eNB->eNB_UE_stats[i].dlsch_ACK[k][j]=0;
+              eNB->eNB_UE_stats[i].dlsch_trials[k][j]=0;
             }
 
-            phy_vars_eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[k]=0;
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
+            eNB->eNB_UE_stats[i].dlsch_l2_errors[k]=0;
+            eNB->eNB_UE_stats[i].ulsch_errors[k]=0;
+            eNB->eNB_UE_stats[i].ulsch_consecutive_errors=0;
 
-            for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->Mlimit; j++) {
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0;
-              phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0;
+            for (j=0; j<eNB->ulsch_eNB[i]->Mlimit; j++) {
+              eNB->eNB_UE_stats[i].ulsch_decoding_attempts[k][j]=0;
+              eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[k][j]=0;
+              eNB->eNB_UE_stats[i].ulsch_round_errors[k][j]=0;
+              eNB->eNB_UE_stats[i].ulsch_round_fer[k][j]=0;
             }
           }
 
-          phy_vars_eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
-          phy_vars_eNB->eNB_UE_stats[i].dlsch_NAK_round0=0;
-          phy_vars_eNB->eNB_UE_stats[i].dlsch_mcs_offset=0;
+          eNB->eNB_UE_stats[i].dlsch_sliding_cnt=0;
+          eNB->eNB_UE_stats[i].dlsch_NAK_round0=0;
+          eNB->eNB_UE_stats[i].dlsch_mcs_offset=0;
         } // Msg3_flag==1
 	else {  // Msg3_flag == 0
 
 #ifdef DEBUG_PHY_PROC
 #ifdef DEBUG_ULSCH
           LOG_D(PHY,"[eNB] Frame %d, Subframe %d : ULSCH SDU (RX harq_pid %d) %d bytes:",frame,subframe,
-                harq_pid,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
+                harq_pid,eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);
 
-          for (j=0; j<phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++)
-            LOG_T(PHY,"%x.",phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
+          for (j=0; j<eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3; j++)
+            LOG_T(PHY,"%x.",eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b[j]);
 
           LOG_T(PHY,"\n");
 #endif
 #endif
 
-	  if (phy_vars_eNB->mac_enabled==1) {
+	  if (eNB->mac_enabled==1) {
 
-	    mac_xface->rx_sdu(phy_vars_eNB->Mod_id,
-			      phy_vars_eNB->CC_id,
+	    mac_xface->rx_sdu(eNB->Mod_id,
+			      eNB->CC_id,
 			      frame,subframe,
-			      phy_vars_eNB->ulsch_eNB[i]->rnti,
-			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
-			      phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
+			      eNB->ulsch_eNB[i]->rnti,
+			      eNB->ulsch_eNB[i]->harq_processes[harq_pid]->b,
+			      eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3,
 			      harq_pid,
 			      NULL);
 
 #ifdef LOCALIZATION
-	    start_meas(&phy_vars_eNB->localization_stats);
-	    aggregate_eNB_UE_localization_stats(phy_vars_eNB,
+	    start_meas(&eNB->localization_stats);
+	    aggregate_eNB_UE_localization_stats(eNB,
 						i,
 						frame,
 						subframe,
-						get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100);
-	    stop_meas(&phy_vars_eNB->localization_stats);
+						get_hundred_times_delta_IF_eNB(eNB,i,harq_pid, 1)/100);
+	    stop_meas(&eNB->localization_stats);
 #endif
 	    
 	  } // mac_enabled==1
@@ -3197,16 +3102,16 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
 
         // estimate timing advance for MAC
         if (abstraction_flag == 0) {
-          sync_pos = lte_est_timing_advance_pusch(phy_vars_eNB,i,sched_subframe);
-          phy_vars_eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - phy_vars_eNB->lte_frame_parms.nb_prefix_samples/4; //to check
+          sync_pos = lte_est_timing_advance_pusch(eNB,i,sched_subframe);
+          eNB->eNB_UE_stats[i].timing_advance_update = sync_pos - fp->nb_prefix_samples/4; //to check
         }
 
 #ifdef DEBUG_PHY_PROC
         LOG_D(PHY,"[eNB %d] frame %d, subframe %d: user %d: timing advance = %d\n",
-              phy_vars_eNB->Mod_id,
+              eNB->Mod_id,
               frame, subframe,
               i,
-              phy_vars_eNB->eNB_UE_stats[i].timing_advance_update);
+              eNB->eNB_UE_stats[i].timing_advance_update);
 #endif
 
 
@@ -3214,14 +3119,14 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
 
       // process HARQ feedback
 #ifdef DEBUG_PHY_PROC
-      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",phy_vars_eNB->Mod_id,
-            phy_vars_eNB->dlsch_eNB[i][0]->rnti,
+      LOG_D(PHY,"[eNB %d][PDSCH %x] Frame %d subframe %d, Processing HARQ feedback for UE %d (after PUSCH)\n",eNB->Mod_id,
+            eNB->dlsch_eNB[i][0]->rnti,
             frame,subframe,
             i);
 #endif
       process_HARQ_feedback(i,
                             sched_subframe,
-                            phy_vars_eNB,
+                            eNB,
                             1, // pusch_flag
                             0,
                             0,
@@ -3229,24 +3134,24 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
 
 #ifdef DEBUG_PHY_PROC
       LOG_D(PHY,"[eNB %d] Frame %d subframe %d, sect %d: received ULSCH harq_pid %d for UE %d, ret = %d, CQI CRC Status %d, ACK %d,%d, ulsch_errors %d/%d\n",
-            phy_vars_eNB->Mod_id,frame,subframe,
-            phy_vars_eNB->eNB_UE_stats[i].sector,
+            eNB->Mod_id,frame,subframe,
+            eNB->eNB_UE_stats[i].sector,
             harq_pid,
             i,
             ret,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status,
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
-            phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->cqi_crc_status,
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[0],
+            eNB->ulsch_eNB[i]->harq_processes[harq_pid]->o_ACK[1],
+            eNB->eNB_UE_stats[i].ulsch_errors[harq_pid],
+            eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_pid][0]);
 #endif
       
       // dump stats to VCD
       if (i==0) {
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,phy_vars_eNB->pusch_stats_mcs[0][(frame*10)+subframe]);
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,phy_vars_eNB->pusch_stats_rb[0][(frame*10)+subframe]);
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,phy_vars_eNB->pusch_stats_round[0][(frame*10)+subframe]);
-	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[0]->ulsch_power[0]));
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_MCS0+harq_pid,eNB->pusch_stats_mcs[0][(frame*10)+subframe]);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RB0+harq_pid,eNB->pusch_stats_rb[0][(frame*10)+subframe]);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_ROUND0+harq_pid,eNB->pusch_stats_round[0][(frame*10)+subframe]);
+	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RSSI0+harq_pid,dB_fixed(eNB->lte_eNB_pusch_vars[0]->ulsch_power[0]));
 	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_RES0+harq_pid,ret);
 	VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE0_SFN0+harq_pid,(frame*10)+subframe);
       }
@@ -3256,48 +3161,48 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
     // update ULSCH statistics for tracing
     if ((frame % 100 == 0) && (subframe == 4)) {
       for (harq_idx=0; harq_idx<8; harq_idx++) {
-        for (round=0; round<phy_vars_eNB->ulsch_eNB[i]->Mlimit; round++) {
-          if ((phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] -
-               phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) {
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] =
-              (100*(phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] -
-                    phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/
-              (phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] -
-               phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]);
+        for (round=0; round<eNB->ulsch_eNB[i]->Mlimit; round++) {
+          if ((eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] -
+               eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]) != 0) {
+            eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] =
+              (100*(eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round] -
+                    eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round]))/
+              (eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round] -
+               eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round]);
           } else {
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0;
+            eNB->eNB_UE_stats[i].ulsch_round_fer[harq_idx][round] = 0;
           }
 
-          phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] =
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round];
-          phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] =
-            phy_vars_eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round];
+          eNB->eNB_UE_stats[i].ulsch_decoding_attempts_last[harq_idx][round] =
+            eNB->eNB_UE_stats[i].ulsch_decoding_attempts[harq_idx][round];
+          eNB->eNB_UE_stats[i].ulsch_round_errors_last[harq_idx][round] =
+            eNB->eNB_UE_stats[i].ulsch_round_errors[harq_idx][round];
         }
       }
     }
 
     if ((frame % 100 == 0) && (subframe==4)) {
-      phy_vars_eNB->eNB_UE_stats[i].dlsch_bitrate = (phy_vars_eNB->eNB_UE_stats[i].total_TBS -
-          phy_vars_eNB->eNB_UE_stats[i].total_TBS_last);
+      eNB->eNB_UE_stats[i].dlsch_bitrate = (eNB->eNB_UE_stats[i].total_TBS -
+          eNB->eNB_UE_stats[i].total_TBS_last);
 
-      phy_vars_eNB->eNB_UE_stats[i].total_TBS_last = phy_vars_eNB->eNB_UE_stats[i].total_TBS;
+      eNB->eNB_UE_stats[i].total_TBS_last = eNB->eNB_UE_stats[i].total_TBS;
     }
 
     // CBA (non-LTE)
-    cba_procedures(sched_subframe,phy_vars_eNB,i,harq_pid,abstraction_flag);
+    cba_procedures(sched_subframe,eNB,i,harq_pid,abstraction_flag);
   } // loop i=0 ... NUMBER_OF_UE_MAX-1
 
   if (abstraction_flag == 0) {
-    lte_eNB_I0_measurements(phy_vars_eNB,
+    lte_eNB_I0_measurements(eNB,
 			    subframe,
 			    0,
-			    phy_vars_eNB->first_run_I0_measurements);
-    phy_vars_eNB->first_run_I0_measurements = 0;
+			    eNB->first_run_I0_measurements);
+    eNB->first_run_I0_measurements = 0;
   }
 
 #ifdef PHY_ABSTRACTION
     else {
-      lte_eNB_I0_measurements_emul(phy_vars_eNB,
+      lte_eNB_I0_measurements_emul(eNB,
                                    0);
     }
 
@@ -3307,11 +3212,11 @@ void phy_procedures_eNB_RX(const unsigned char sched_subframe,PHY_VARS_eNB *phy_
     //}
 
 #ifdef EMOS
-  phy_procedures_emos_eNB_RX(subframe,phy_vars_eNB);
+  phy_procedures_emos_eNB_RX(subframe,eNB);
 #endif
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX,0);
-  stop_meas(&phy_vars_eNB->phy_proc_rx);
+  stop_meas(&eNB->phy_proc_rx);
 
 }
 
@@ -3345,8 +3250,8 @@ int phy_procedures_RN_eNB_TX(unsigned char last_slot, unsigned char next_slot, r
   return do_proc;
 }
 #endif
-void phy_procedures_eNB_lte(unsigned char subframe,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_lte(unsigned char subframe,PHY_VARS_eNB **eNB,uint8_t abstraction_flag,
+                            relaying_type_t r_type, PHY_VARS_RN *rn)
 {
 #if defined(ENABLE_ITTI)
   MessageDef   *msg_p;
@@ -3360,12 +3265,12 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,u
   int CC_id=0;
 
   /*
-    if (phy_vars_eNB->proc[sched_subframe].frame_tx >= 1000)
+    if (eNB->proc[sched_subframe].frame_tx >= 1000)
     mac_xface->macphy_exit("Exiting after 1000 Frames\n");
   */
-  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, phy_vars_eNB[0]->proc[subframe].frame_tx);
+  VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX_ENB, eNB[0]->proc[subframe].frame_tx);
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,1);
-  start_meas(&phy_vars_eNB[0]->phy_proc);
+  start_meas(&eNB[0]->phy_proc);
 
 #if defined(ENABLE_ITTI)
 
@@ -3512,45 +3417,45 @@ void phy_procedures_eNB_lte(unsigned char subframe,PHY_VARS_eNB **phy_vars_eNB,u
 
 
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
-    if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD)&&
-          (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))||
-         (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) {
+    if ((((eNB[CC_id]->lte_frame_parms.frame_type == TDD)&&
+          (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_DL))||
+         (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) {
 #ifdef Rel10
 
-      if (phy_procedures_RN_eNB_TX(phy_vars_eNB[CC_id]->proc[subframe].subframe_rx, phy_vars_eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 )
+      if (phy_procedures_RN_eNB_TX(eNB[CC_id]->proc[subframe].subframe_rx, eNB[CC_id]->proc[subframe].subframe_tx, r_type) != 0 )
 #endif
-        phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn);
+        phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn);
     }
 
-    if ((((phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == TDD )&&
-          (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) ||
-         (phy_vars_eNB[CC_id]->lte_frame_parms.frame_type == FDD))) {
-      phy_procedures_eNB_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type);
+    if ((((eNB[CC_id]->lte_frame_parms.frame_type == TDD )&&
+          (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_UL)) ||
+         (eNB[CC_id]->lte_frame_parms.frame_type == FDD))) {
+      phy_procedures_eNB_RX(subframe,eNB[CC_id],abstraction_flag,r_type);
     }
 
-    if (subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) {
+    if (subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_tx)==SF_S) {
 #ifdef Rel10
 
       if (phy_procedures_RN_eNB_TX(subframe, subframe, r_type) != 0 )
 #endif
-        phy_procedures_eNB_TX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type,phy_vars_rn);
+        phy_procedures_eNB_TX(subframe,eNB[CC_id],abstraction_flag,r_type,rn);
     }
 
-    if ((subframe_select(&phy_vars_eNB[CC_id]->lte_frame_parms,phy_vars_eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) {
-      phy_procedures_eNB_S_RX(subframe,phy_vars_eNB[CC_id],abstraction_flag,r_type);
+    if ((subframe_select(&eNB[CC_id]->lte_frame_parms,eNB[CC_id]->proc[subframe].subframe_rx)==SF_S)) {
+      phy_procedures_eNB_S_RX(subframe,eNB[CC_id],abstraction_flag,r_type);
     }
 
-    phy_vars_eNB[CC_id]->proc[subframe].frame_tx++;
-    phy_vars_eNB[CC_id]->proc[subframe].frame_rx++;
+    eNB[CC_id]->proc[subframe].frame_tx++;
+    eNB[CC_id]->proc[subframe].frame_rx++;
 
-    if (phy_vars_eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h
-      phy_vars_eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER;
+    if (eNB[CC_id]->proc[subframe].frame_tx>=MAX_FRAME_NUMBER) // defined in impl_defs_top.h
+      eNB[CC_id]->proc[subframe].frame_tx-=MAX_FRAME_NUMBER;
 
-    if (phy_vars_eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER)
-      phy_vars_eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER;
+    if (eNB[CC_id]->proc[subframe].frame_rx>=MAX_FRAME_NUMBER)
+      eNB[CC_id]->proc[subframe].frame_rx-=MAX_FRAME_NUMBER;
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_LTE,0);
-  stop_meas(&phy_vars_eNB[0]->phy_proc);
+  stop_meas(&eNB[0]->phy_proc);
 }
 
diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c
index ac09ac77b3..084173248f 100755
--- a/openair1/SCHED/phy_procedures_lte_ue.c
+++ b/openair1/SCHED/phy_procedures_lte_ue.c
@@ -115,7 +115,7 @@ extern int rx_sig_fifo;
 extern uint32_t downlink_frequency[MAX_NUM_CCs][4];
 #endif
 
-#ifdef USER_MODE
+
 
 void dump_dlsch(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe,uint8_t harq_pid)
 {
@@ -286,7 +286,7 @@ void dump_dlsch_ra(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t subframe)
   write_output("dlsch_mag1.m","dlschmag1",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_mag0,300*nsymb,1,1);
   write_output("dlsch_mag2.m","dlschmag2",phy_vars_ue->lte_ue_pdsch_vars_ra[0]->dl_ch_magb0,300*nsymb,1,1);
 }
-#endif
+
 
 void phy_reset_ue(uint8_t Mod_id,uint8_t CC_id,uint8_t eNB_index)
 {
@@ -367,13 +367,11 @@ void process_timing_advance_rar(PHY_VARS_UE *phy_vars_ue,uint16_t timing_advance
     timing_advance = timing_advance - (1<<11);
   */
 
-  if (openair_daq_vars.manual_timing_advance == 0) {
-    phy_vars_ue->timing_advance = timing_advance*4;
+  phy_vars_ue->timing_advance = timing_advance*4;
 
-  }
 
 #ifdef DEBUG_PHY_PROC
-  LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance,openair_daq_vars.timing_advance);
+  LOG_I(PHY,"[UE %d] Frame %d, received (rar) timing_advance %d, HW timing advance %d\n",phy_vars_ue->Mod_id,phy_vars_ue->frame_rx, phy_vars_ue->timing_advance);
 #endif
 
 }
@@ -386,11 +384,8 @@ void process_timing_advance(uint8_t Mod_id,uint8_t CC_id,int16_t timing_advance)
   // timing advance has Q1.5 format
   timing_advance = timing_advance - 31;
 
-  if (openair_daq_vars.manual_timing_advance == 0) {
-    //if ( (frame % 100) == 0) {
-    //if ((timing_advance > 3) || (timing_advance < -3) )
-    PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!!
-  }
+  PHY_vars_UE_g[Mod_id][CC_id]->timing_advance = PHY_vars_UE_g[Mod_id][CC_id]->timing_advance+timing_advance*4; //this is for 25RB only!!!
+
 
   LOG_I(PHY,"[UE %d] Got timing advance %d from MAC, new value %d\n",Mod_id, timing_advance, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance);
 
@@ -1223,7 +1218,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 
 #if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR)//this is the EXPRESS MIMO case
         ulsch_start = (phy_vars_ue->rx_offset+subframe_tx*frame_parms->samples_per_tti-
-                       openair_daq_vars.timing_advance-
+                       phy_vars_ue->hw_timing_advance-
                        phy_vars_ue->timing_advance-
                        phy_vars_ue->N_TA_offset+5)%(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*frame_parms->samples_per_tti);
 #else //this is the normal case
@@ -1234,7 +1229,7 @@ void phy_procedures_UE_TX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstra
 		Mod_id,frame_tx,subframe_tx,
 		ulsch_start,
 		phy_vars_ue->rx_offset,
-		openair_daq_vars.timing_advance,
+		phy_vars_ue->hw_timing_advance,
 		phy_vars_ue->timing_advance,
 		phy_vars_ue->N_TA_offset);
  
@@ -1525,14 +1520,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
     // AGC
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_IN);
-#if defined EXMIMO
 
-    if ((openair_daq_vars.rx_gain_mode == DAQ_AGC_ON) &&
-        (mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) )
-      if  (phy_vars_ue->frame_rx%100==0)
-        gain_control_all(dB_fixed(phy_vars_ue->PHY_measurements.rssi),0);
-
-#else
 #ifndef OAI_USRP
 #ifndef OAI_BLADERF
 #ifndef OAI_LMSSDR
@@ -1540,7 +1528,7 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
 #endif
 #endif
 #endif
-#endif
+
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_IN);
     eNB_id = 0;
@@ -1554,29 +1542,6 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
 
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_ADJUST_SYNCH, VCD_FUNCTION_OUT);
 
-    /* if (openair_daq_vars.auto_freq_correction == 1) {
-      if (frame_rx % 100 == 0) {
-    if ((phy_vars_ue->lte_ue_common_vars.freq_offset>100) && (openair_daq_vars.freq_offset < 1000)) {
-    openair_daq_vars.freq_offset+=100;
-    #if defined(EXMIMO) && defined(DRIVER2013)
-    for (aa = 0; aa<4; aa++) {
-      p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
-      p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
-    }
-    #endif
-    }
-    else if ((phy_vars_ue->lte_ue_common_vars.freq_offset<-100) && (openair_daq_vars.freq_offset > -1000)) {
-    openair_daq_vars.freq_offset-=100;
-    #if defined(EXMIMO) && defined(DRIVER2013)
-    for (aa = 0; aa<4; aa++) {
-      p_exmimo_config->rf.rf_freq_rx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
-      p_exmimo_config->rf.rf_freq_tx[aa] = downlink_frequency[aa]+=openair_daq_vars.freq_offset;
-    }
-    #endif
-    }
-      }
-    }*/
-
   }
 
   VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_MEASUREMENT_PROCEDURES, VCD_FUNCTION_OUT);
@@ -1681,9 +1646,7 @@ void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_fla
   //   first_run = 1;
 
   if (abstraction_flag ==0 ) {
-    openair_daq_vars.mode = openair_NOT_SYNCHED;
     phy_vars_ue->UE_mode[eNB_id] = NOT_SYNCHED;
-    openair_daq_vars.sync_state=0;
   } else {
     phy_vars_ue->UE_mode[eNB_id] = PRACH;
     phy_vars_ue->prach_resources[eNB_id]=NULL;
@@ -1691,8 +1654,8 @@ void restart_phy(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstraction_fla
 
   phy_vars_ue->frame_rx = -1;
   phy_vars_ue->frame_tx = -1;
-  openair_daq_vars.synch_wait_cnt=0;
-  openair_daq_vars.sched_cnt=-1;
+  //  phy_vars_ue->synch_wait_cnt=0;
+  //  phy_vars_ue->sched_cnt=-1;
 
   phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors_conseq=0;
   phy_vars_ue->lte_ue_pbch_vars[eNB_id]->pdu_errors=0;
@@ -2564,7 +2527,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 
         if ((phy_vars_ue->transmission_mode[eNB_id] == 5) &&
             (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-            (openair_daq_vars.use_ia_receiver ==1)) {
+            (phy_vars_ue->use_ia_receiver ==1)) {
           dual_stream_UE = 1;
           eNB_id_i = phy_vars_ue->n_connected_eNB;
           i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm;
@@ -2975,9 +2938,9 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
         if (ret == (1+phy_vars_ue->dlsch_ue_ra[eNB_id]->max_turbo_iterations)) {
           phy_vars_ue->dlsch_ra_errors[eNB_id]++;
           LOG_D(PHY,"[UE  %d] Frame %d, subframe %d, received RA in error\n",phy_vars_ue->Mod_id,frame_rx,subframe_prev);
-#ifdef USER_MODE
-          //dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev);
-#endif
+
+	  //          dump_dlsch_ra(phy_vars_ue,eNB_id,subframe_prev); exit(-1);
+
           //    oai_exit=1;
           VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_FUNCTION_OUT);
           stop_meas(&phy_vars_ue->phy_proc_rx);
@@ -3107,7 +3070,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 
             if ((phy_vars_ue->transmission_mode[eNB_id] == 5) &&
                 (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-                (openair_daq_vars.use_ia_receiver ==1)) {
+                (phy_vars_ue->use_ia_receiver ==1)) {
               dual_stream_UE = 1;
               eNB_id_i = phy_vars_ue->n_connected_eNB;
               i_mod =  phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm;
@@ -3176,7 +3139,7 @@ int phy_procedures_UE_RX(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t abstrac
 
             if ((phy_vars_ue->transmission_mode[eNB_id] == 5) &&
                 (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->dl_power_off==0) &&
-                (openair_daq_vars.use_ia_receiver ==1)) {
+                (phy_vars_ue->use_ia_receiver ==1)) {
               dual_stream_UE = 1;
               eNB_id_i = phy_vars_ue->n_connected_eNB;
               i_mod = phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[harq_pid]->Qm;
diff --git a/openair1/SCHED/vars.h b/openair1/SCHED/vars.h
index 532251a2f0..2c4c93cfad 100644
--- a/openair1/SCHED/vars.h
+++ b/openair1/SCHED/vars.h
@@ -28,7 +28,6 @@
  *******************************************************************************/
 #include "defs.h"
 
-OPENAIR_DAQ_VARS openair_daq_vars;
 
 
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 4d8e32b63c..62422bf9ae 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -569,17 +569,9 @@ schedule_ue_spec(
       eNB_UE_stats->DL_cqi[0], MIN_CQI_VALUE, MAX_CQI_VALUE);
       */
       eNB_UE_stats->dlsch_mcs1 = cqi_to_mcs[eNB_UE_stats->DL_cqi[0]];
-      eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs);
+      eNB_UE_stats->dlsch_mcs1 = eNB_UE_stats->dlsch_mcs1;//cmin(eNB_UE_stats->dlsch_mcs1, openair_daq_vars.target_ue_dl_mcs);
 
 
-#ifdef EXMIMO
-
-      if (mac_xface->get_transmission_mode(module_idP,CC_id, rnti)==5) {
-        eNB_UE_stats->dlsch_mcs1 = cmin(eNB_UE_stats->dlsch_mcs1,16);
-      }
-
-#endif
-
       // store stats
       UE_list->eNB_UE_stats[CC_id][UE_id].dl_cqi= eNB_UE_stats->DL_cqi[0];
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 2973bedd00..e508e24eb5 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -826,14 +826,14 @@ void schedule_ulsch_rnti(module_id_t   module_idP,
 	    UE_list->eNB_UE_stats[CC_id][UE_id].normalized_rx_power=normalized_rx_power;
 	    UE_list->eNB_UE_stats[CC_id][UE_id].target_rx_power=target_rx_power;
 	    UE_list->eNB_UE_stats[CC_id][UE_id].ulsch_mcs1=UE_template->pre_assigned_mcs_ul;
-            mcs = cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
+            mcs = UE_template->pre_assigned_mcs_ul;//cmin (UE_template->pre_assigned_mcs_ul, openair_daq_vars.target_ue_ul_mcs); // adjust, based on user-defined MCS
 	    if ((cqi_req==1) && (mcs>19)) {
 		mcs=19;
 	    }
             if (UE_template->pre_allocated_rb_table_index_ul >=0) {
               rb_table_index=UE_template->pre_allocated_rb_table_index_ul;
             } else {
-	      mcs=cmin (10, openair_daq_vars.target_ue_ul_mcs);
+	      mcs=10;//cmin (10, openair_daq_vars.target_ue_ul_mcs);
               rb_table_index=5; // for PHR
 	    }
 
@@ -1171,7 +1171,7 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
     required_rbs[cba_group] = 0;
     num_cba_resources[cba_group]=0;
     active_UEs[cba_group]=0;
-    mcs[cba_group]=openair_daq_vars.target_ue_ul_mcs;
+    mcs[cba_group]=10;//openair_daq_vars.target_ue_ul_mcs;
   }
 
   //LOG_D(MAC, "[eNB ] CBA granted ues are %d\n",granted_UEs );
@@ -1219,7 +1219,7 @@ void schedule_ulsch_cba_rnti(module_id_t module_idP, unsigned char cooperation_f
           }
         }
 
-        mcs[cba_group]= cmin(mcs[cba_group],openair_daq_vars.target_ue_ul_mcs);
+        mcs[cba_group]= mcs[cba_group];//cmin(mcs[cba_group],openair_daq_vars.target_ue_ul_mcs);
 
         if (available_rbs < min_rb_unit )
           break;
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index fe8fe55d44..d28614699b 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -178,7 +178,7 @@ void assign_rbs_required (module_id_t Mod_id,
       */
       eNB_UE_stats[CC_id]->dlsch_mcs1=cqi_to_mcs[eNB_UE_stats[CC_id]->DL_cqi[0]];
 
-      eNB_UE_stats[CC_id]->dlsch_mcs1 = cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs);
+      eNB_UE_stats[CC_id]->dlsch_mcs1 = eNB_UE_stats[CC_id]->dlsch_mcs1;//cmin(eNB_UE_stats[CC_id]->dlsch_mcs1,openair_daq_vars.target_ue_dl_mcs);
 
     }
 
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 822409f302..e903fd0c9a 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -114,15 +114,14 @@ unsigned short config_frames[4] = {2,9,11,13};
 #endif
 
 // In lte-enb.c
-int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
-
+extern int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
 extern void init_eNB(void);
 extern void stop_eNB(void);
 extern void kill_eNB_proc(void);
 
 // In lte-ue.c
-int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
-void fill_ue_band_info(void);
+extern int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg, openair0_rf_map rf_map[MAX_NUM_CCs]);
+extern void fill_ue_band_info(void);
 extern void init_UE(void);
 
 #ifdef XFORMS
@@ -1139,6 +1138,7 @@ int main( int argc, char **argv )
   memset(tx_max_power,0,sizeof(int)*MAX_NUM_CCs);
   set_latency_target();
 
+  // det defaults
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
     frame_parms[CC_id] = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
     /* Set some default values that may be overwritten while reading options */
@@ -1342,7 +1342,7 @@ int main( int argc, char **argv )
       else 
 	UE[CC_id]->mac_enabled = 1;
 
-      if (UE[CC_id]->mac_enabled == 0) {
+      if (UE[CC_id]->mac_enabled == 0) {  //set default UL parameters for testing mode
 	for (i=0; i<NUMBER_OF_CONNECTED_eNB_MAX; i++) {
 	  UE[CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
 	  UE[CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
@@ -1373,13 +1373,6 @@ int main( int argc, char **argv )
 
     }
 
-    openair_daq_vars.manual_timing_advance = 0;
-    openair_daq_vars.rx_gain_mode = DAQ_AGC_ON;
-    openair_daq_vars.auto_freq_correction = 0;
-    openair_daq_vars.use_ia_receiver = 0;
-
-
-
     //  printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power));
   } else {
     //this is eNB
@@ -1390,12 +1383,10 @@ int main( int argc, char **argv )
       PHY_vars_eNB_g[0][CC_id] = init_lte_eNB(frame_parms[CC_id],0,frame_parms[CC_id]->Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
       PHY_vars_eNB_g[0][CC_id]->CC_id = CC_id;
 
-      if (phy_test==1)
-	PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0;
-      else 
-	PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1;
+      if (phy_test==1) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0;
+      else PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1;
 
-      if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) {
+      if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { //set default parameters for testing mode
 	for (i=0; i<NUMBER_OF_UE_MAX; i++) {
 	  PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
 	  PHY_vars_eNB_g[0][CC_id]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
@@ -1413,7 +1404,6 @@ int main( int argc, char **argv )
 
       PHY_vars_eNB_g[0][CC_id]->rx_total_gain_eNB_dB = (int)rx_gain[CC_id][0];
 
-      //already taken care of in lte-softmodem.c
       PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0;
 
     }
@@ -1422,11 +1412,6 @@ int main( int argc, char **argv )
     NB_eNB_INST=1;
     NB_INST=1;
 
-    openair_daq_vars.ue_dl_rb_alloc=0x1fff;
-    openair_daq_vars.target_ue_dl_mcs=target_dl_mcs;
-    openair_daq_vars.ue_ul_nb_rb=6;
-    openair_daq_vars.target_ue_ul_mcs=target_ul_mcs;
-
   }
 
   fill_modeled_runtime_table(runtime_phy_rx,runtime_phy_tx);
@@ -1644,11 +1629,16 @@ int main( int argc, char **argv )
 
   // connect the TX/RX buffers
   if (UE_flag==1) {
+
+    for (CC_id=0;CC_id<MAX_NUM_CCs; CC_id++) {
+
+    
 #ifdef OAI_USRP
-    openair_daq_vars.timing_advance = timing_advance;
+      UE[CC_id]->hw_timing_advance = timing_advance;
 #else
-    openair_daq_vars.timing_advance = 160;
+      UE[CC_id]->hw_timing_advance = 160;
 #endif
+    }
     if (setup_ue_buffers(UE,&openair0_cfg[0],rf_map)!=0) {
       printf("Error setting up eNB buffer\n");
       exit(-1);
@@ -1673,7 +1663,8 @@ int main( int argc, char **argv )
     }
     //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
   } else {
-    openair_daq_vars.timing_advance = 0;
+
+
 
     if (setup_eNB_buffers(PHY_vars_eNB_g[0],&openair0_cfg[0],rf_map)!=0) {
       printf("Error setting up eNB buffer\n");
@@ -1684,6 +1675,7 @@ int main( int argc, char **argv )
 
     // Set LSBs for antenna switch (ExpressMIMO)
     for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+      PHY_vars_eNB_g[0][CC_id]->hw_timing_advance = 0;
       for (i=0; i<frame_parms[CC_id]->samples_per_tti*10; i++)
         for (aa=0; aa<frame_parms[CC_id]->nb_antennas_tx; aa++)
           PHY_vars_eNB_g[0][CC_id]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001;
@@ -1730,13 +1722,16 @@ int main( int argc, char **argv )
       sprintf (title, "LTE DL SCOPE UE");
       fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
 
+      /*
       if (openair_daq_vars.use_ia_receiver) {
         fl_set_button(form_ue[UE_id]->button_0,1);
         fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON");
       } else {
         fl_set_button(form_ue[UE_id]->button_0,0);
         fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
-      }
+	}*/
+        fl_set_button(form_ue[UE_id]->button_0,0);
+        fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
     }
 
     ret = pthread_create(&forms_thread, NULL, scope_thread, NULL);
diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c
index 3049fd4e02..865f257135 100644
--- a/targets/RT/USER/lte-ue.c
+++ b/targets/RT/USER/lte-ue.c
@@ -1622,7 +1622,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg,
     return(-1);
   }
 
-
+  /*
   if (frame_parms->frame_type == TDD) {
     if (frame_parms->N_RB_DL == 100)
       N_TA_offset = 624;
@@ -1631,7 +1631,7 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg,
     else if (frame_parms->N_RB_DL == 25)
       N_TA_offset = 624/4;
   }
-  
+  */
 
     // replace RX signal buffers with mmaped HW versions
   rxdata = (int32_t**)malloc16( frame_parms->nb_antennas_rx*sizeof(int32_t*) );
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index 8a5d23afac..7c335fdd10 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -500,7 +500,7 @@ l2l1_task (void *args_p)
 	sprintf (title, "LTE DL SCOPE eNB %d to UE %d CC_id %d", eNB_inst, UE_inst, CC_id);
 	fl_show_form (form_ue[CC_id][UE_inst]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
 
-	if (openair_daq_vars.use_ia_receiver == 1) {
+	if (PHY_vars_UE_g[UE_inst][CC_id]->use_ia_receiver == 1) {
 	  fl_set_button(form_ue[CC_id][UE_inst]->button_0,1);
 	  fl_set_object_label(form_ue[CC_id][UE_inst]->button_0, "IA Receiver ON");
 	  fl_set_object_color(form_ue[CC_id][UE_inst]->button_0, FL_GREEN, FL_GREEN);
diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c
index b87142c3e5..ea9d298904 100644
--- a/targets/SIMU/USER/oaisim_functions.c
+++ b/targets/SIMU/USER/oaisim_functions.c
@@ -951,22 +951,23 @@ void init_openair1(void)
 
   number_of_cards = 1;
 
-  openair_daq_vars.rx_rf_mode = 1;
-  openair_daq_vars.tdd = 1;
-  openair_daq_vars.rx_gain_mode = DAQ_AGC_ON;
+//  openair_daq_vars.rx_rf_mode = 1;
+//  openair_daq_vars.tdd = 1;
+//  openair_daq_vars.rx_gain_mode = DAQ_AGC_ON;
 
-  openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0];
+//  openair_daq_vars.dlsch_transmission_mode = oai_emulation.info.transmission_mode[0];
 //#warning "NN->FK: OAI EMU channel abstraction does not work for MCS higher than"
-  openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16);
-  openair_daq_vars.target_ue_ul_mcs = target_ul_mcs;
-  openair_daq_vars.ue_dl_rb_alloc=0x1fff;
-  openair_daq_vars.ue_ul_nb_rb=6;
-  openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag;
-  openair_daq_vars.use_ia_receiver = 0;
+//  openair_daq_vars.target_ue_dl_mcs = cmin(target_dl_mcs,16);
+//  openair_daq_vars.target_ue_ul_mcs = target_ul_mcs;
+//  openair_daq_vars.ue_dl_rb_alloc=0x1fff;
+//  openair_daq_vars.ue_ul_nb_rb=6;
+//  openair_daq_vars.dlsch_rate_adaptation = rate_adaptation_flag;
 
   //N_TA_offset
   for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
     for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
+      PHY_vars_UE_g[UE_id][CC_id]->use_ia_receiver = 0;
+
       if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.frame_type == TDD) {
         if (PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.N_RB_DL == 100)
           PHY_vars_UE_g[UE_id][CC_id]->N_TA_offset = 624;
-- 
GitLab