From a7721ae24e547368acf62f5065cc7031f5c1d543 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Mon, 11 Aug 2014 14:16:45 +0000
Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5700
 818b1a75-f10b-46b9-bf7c-635c3b92a50f

---
 targets/SIMU/USER/Makefile           |   1 +
 targets/SIMU/USER/channel_sim.c      | 141 ++++-----
 targets/SIMU/USER/event_handler.c    | 241 ++++++++--------
 targets/SIMU/USER/init_lte.c         |  20 +-
 targets/SIMU/USER/oaisim.c           | 410 ++++++++++++++-------------
 targets/SIMU/USER/oaisim.h           |   4 +-
 targets/SIMU/USER/oaisim_functions.c | 181 ++++++------
 7 files changed, 524 insertions(+), 474 deletions(-)

diff --git a/targets/SIMU/USER/Makefile b/targets/SIMU/USER/Makefile
index 48f42facab..7ab2896643 100644
--- a/targets/SIMU/USER/Makefile
+++ b/targets/SIMU/USER/Makefile
@@ -191,6 +191,7 @@ endif
 endif
 endif
 
+CFLAGS += -DMAX_NUM_CCs=1
 include $(OPENAIR1_DIR)/PHY/Makefile.inc
 include $(OPENAIR1_DIR)/SCHED/Makefile.inc
 include $(OPENAIR2_DIR)/RRC/LITE/MESSAGES/Makefile.inc
diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c
index b7e21fb4de..8e72486819 100644
--- a/targets/SIMU/USER/channel_sim.c
+++ b/targets/SIMU/USER/channel_sim.c
@@ -111,11 +111,12 @@ void do_OFDM_mod(mod_sym_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t
 void do_DL_sig(double **r_re0,double **r_im0,
                double **r_re,double **r_im,
                double **s_re,double **s_im,
-               channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],
+               channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],
                node_desc_t *enb_data[NUMBER_OF_eNB_MAX],
                node_desc_t *ue_data[NUMBER_OF_UE_MAX],
                uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,
-               uint8_t UE_id) {
+               uint8_t UE_id,
+	       int CC_id) {
 
   int32_t att_eNB_id=-1;
   int32_t **txdata,**rxdata;
@@ -129,8 +130,8 @@ void do_DL_sig(double **r_re0,double **r_im0,
   double min_path_loss=-200;
   uint8_t hold_channel=0;
   //  uint8_t aatx,aarx;
-  uint8_t nb_antennas_rx = eNB2UE[0][0]->nb_rx; // number of rx antennas at UE
-  uint8_t nb_antennas_tx = eNB2UE[0][0]->nb_tx; // number of tx antennas at eNB
+  uint8_t nb_antennas_rx = eNB2UE[0][0][CC_id]->nb_rx; // number of rx antennas at UE
+  uint8_t nb_antennas_tx = eNB2UE[0][0][CC_id]->nb_tx; // number of tx antennas at eNB
 
   int subframe_sched = ((next_slot>>1) == 0) ? 9 : ((next_slot>>1)-1);
 
@@ -146,17 +147,17 @@ void do_DL_sig(double **r_re0,double **r_im0,
     if (!hold_channel) {
       // calculate the random channel from each eNB
       for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
-        random_channel(eNB2UE[eNB_id][UE_id],abstraction_flag);
+        random_channel(eNB2UE[eNB_id][UE_id][CC_id],abstraction_flag);
         /*
 	for (i=0;i<eNB2UE[eNB_id][UE_id]->nb_taps;i++)
 	  printf("eNB2UE[%d][%d]->a[0][%d] = (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->a[0][i].x,eNB2UE[eNB_id][UE_id]->a[0][i].y);
 	*/
-        freq_channel(eNB2UE[eNB_id][UE_id], frame_parms->N_RB_DL,frame_parms->N_RB_DL*12+1);
+        freq_channel(eNB2UE[eNB_id][UE_id][CC_id], frame_parms->N_RB_DL,frame_parms->N_RB_DL*12+1);
       }
 
       // find out which eNB the UE is attached to
       for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
-        if (find_ue(PHY_vars_UE_g[UE_id]->lte_ue_pdcch_vars[0]->crnti,PHY_vars_eNB_g[eNB_id])>=0) {
+        if (find_ue(PHY_vars_UE_g[UE_id][CC_id]->lte_ue_pdcch_vars[0]->crnti,PHY_vars_eNB_g[eNB_id][CC_id])>=0) {
           // UE with UE_id is connected to eNb with eNB_id
           att_eNB_id=eNB_id;
           LOG_D(OCM,"A: UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id);
@@ -166,8 +167,8 @@ void do_DL_sig(double **r_re0,double **r_im0,
       // if UE is not attached yet, find assume its the eNB with the smallest pathloss
       if (att_eNB_id<0) {
         for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
-          if (min_path_loss<eNB2UE[eNB_id][UE_id]->path_loss_dB) {
-            min_path_loss = eNB2UE[eNB_id][UE_id]->path_loss_dB;
+          if (min_path_loss<eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB) {
+            min_path_loss = eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB;
             att_eNB_id=eNB_id;
             LOG_D(OCM,"B: UE attached to eNB (UE%d->eNB%d)\n",UE_id,eNB_id);
           }
@@ -180,20 +181,20 @@ void do_DL_sig(double **r_re0,double **r_im0,
       }
       
 #ifdef DEBUG_SIM
-      rx_pwr = signal_energy_fp2(eNB2UE[att_eNB_id][UE_id]->ch[0],
-                                 eNB2UE[att_eNB_id][UE_id]->channel_length)*eNB2UE[att_eNB_id][UE_id]->channel_length;
-      LOG_D(OCM,"Channel eNB %d => UE %d : tx_power %d dBm, path_loss %f dB\n",
-            att_eNB_id,UE_id,
-            PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,
-            eNB2UE[att_eNB_id][UE_id]->path_loss_dB);
+      rx_pwr = signal_energy_fp2(eNB2UE[att_eNB_id][UE_id][CC_id]->ch[0],
+                                 eNB2UE[att_eNB_id][UE_id][CC_id]->channel_length)*eNB2UE[att_eNB_id][UE_id][CC_id]->channel_length;
+      LOG_D(OCM,"Channel (CCid %d) eNB %d => UE %d : tx_power %d dBm, path_loss %f dB\n",
+            CC_id,att_eNB_id,UE_id,
+            PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,
+            eNB2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB);
 #endif
 
       //dlsch_abstraction(PHY_vars_UE_g[UE_id]->sinr_dB, rb_alloc, 8);
       // fill in perfect channel estimates
-      channel_desc_t *desc1 = eNB2UE[att_eNB_id][UE_id];
-      int32_t **dl_channel_est = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.dl_ch_estimates[0];
+      channel_desc_t *desc1 = eNB2UE[att_eNB_id][UE_id][CC_id];
+      int32_t **dl_channel_est = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.dl_ch_estimates[0];
       //      double scale = pow(10.0,(enb_data[att_eNB_id]->tx_power_dBm + eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0);
-      double scale = pow(10.0,(PHY_vars_eNB_g[att_eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id]->rx_total_gain_dB)/20.0);
+      double scale = pow(10.0,(PHY_vars_eNB_g[att_eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower+eNB2UE[att_eNB_id][UE_id][CC_id]->path_loss_dB + (double) PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB)/20.0);
       //this factor is not really needed (it was actually wrong in the non abstraction mode)
       //scale = scale * sqrt(512.0/300.0); //TODO: make this variable for all BWs
       LOG_D(OCM,"scale =%lf (%d dB)\n",scale,(int) (20*log10(scale)));
@@ -231,12 +232,12 @@ void do_DL_sig(double **r_re0,double **r_im0,
       */		      
       
       // calculate the SNR for the attached eNB (this assumes eNB always uses PMI stored in eNB_UE_stats; to be improved)
-      init_snr(eNB2UE[att_eNB_id][UE_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB, &PHY_vars_UE_g[UE_id]->N0, PHY_vars_UE_g[UE_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id]->eNB_UE_stats[UE_id].DL_pmi_single,PHY_vars_eNB_g[att_eNB_id]->mu_mimo_mode[UE_id].dl_pow_off);
+      init_snr(eNB2UE[att_eNB_id][UE_id][CC_id], enb_data[att_eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB, &PHY_vars_UE_g[UE_id][CC_id]->N0, PHY_vars_UE_g[UE_id][CC_id]->transmission_mode[att_eNB_id], PHY_vars_eNB_g[att_eNB_id][CC_id]->eNB_UE_stats[UE_id].DL_pmi_single,PHY_vars_eNB_g[att_eNB_id][CC_id]->mu_mimo_mode[UE_id].dl_pow_off);
 
       // calculate sinr here
       for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
         if (att_eNB_id != eNB_id) {
-          calculate_sinr(eNB2UE[eNB_id][UE_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id]->sinr_dB);
+          calculate_sinr(eNB2UE[eNB_id][UE_id][CC_id], enb_data[eNB_id], ue_data[UE_id], PHY_vars_UE_g[UE_id][CC_id]->sinr_dB);
         }
       }
     } // hold channel
@@ -248,12 +249,12 @@ void do_DL_sig(double **r_re0,double **r_im0,
     */
    
     for (eNB_id=0;eNB_id<NB_eNB_INST;eNB_id++) {
-      start_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats);
-      do_OFDM_mod(PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdataF[0],
-		  PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0],
-		  PHY_vars_eNB_g[eNB_id]->proc[subframe_sched].frame_tx,next_slot,
-		  &PHY_vars_eNB_g[eNB_id]->lte_frame_parms);
-      stop_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats);
+      start_meas(&PHY_vars_eNB_g[eNB_id][CC_id]->ofdm_mod_stats);
+      do_OFDM_mod(PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.txdataF[0],
+		  PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.txdata[0],
+		  PHY_vars_eNB_g[eNB_id][CC_id]->proc[subframe_sched].frame_tx,next_slot,
+		  &PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms);
+      stop_meas(&PHY_vars_eNB_g[eNB_id][CC_id]->ofdm_mod_stats);
     }
    
     //for (UE_id=0;UE_id<NB_UE_INST;UE_id++) {
@@ -279,8 +280,8 @@ void do_DL_sig(double **r_re0,double **r_im0,
         //	if (((double)PHY_vars_UE_g[UE_id]->tx_power_dBm +
         //	     eNB2UE[eNB_id][UE_id]->path_loss_dB) <= -107.0)
         //	  break;
-        frame_parms = &PHY_vars_eNB_g[eNB_id]->lte_frame_parms;
-        txdata = PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.txdata[0];
+        frame_parms = &PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms;
+        txdata = PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.txdata[0];
         slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
         slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1));
         tx_pwr = dac_fixed_gain(s_re,
@@ -293,48 +294,48 @@ void do_DL_sig(double **r_re0,double **r_im0,
                                 frame_parms->ofdm_symbol_size,
                                 14,
                                 //				enb_data[eNB_id]->tx_power_dBm);
-                                PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower);
+                                PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower);
 
 #ifdef DEBUG_SIM
-        LOG_D(OCM,"[SIM][DL] eNB %d: tx_pwr %f dBm, for slot %d (subframe %d)\n",
-              eNB_id,
+        LOG_D(OCM,"[SIM][DL] eNB %d (CCid %d): tx_pwr %f dBm, for slot %d (subframe %d)\n",
+              eNB_id,CC_id,
               10*log10(tx_pwr),
               next_slot,
               next_slot>>1);
 #endif
         //eNB2UE[eNB_id][UE_id]->path_loss_dB = 0;
-        multipath_channel(eNB2UE[eNB_id][UE_id],s_re,s_im,r_re0,r_im0,
+        multipath_channel(eNB2UE[eNB_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0,
                           frame_parms->samples_per_tti>>1,hold_channel);
 #ifdef DEBUG_SIM	  
-        rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id]->ch[0],
-                                   eNB2UE[eNB_id][UE_id]->channel_length)*eNB2UE[eNB_id][UE_id]->channel_length;
-        LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d : Channel gain %f dB (%f)\n",eNB_id,UE_id,10*log10(rx_pwr),rx_pwr);
+        rx_pwr = signal_energy_fp2(eNB2UE[eNB_id][UE_id][CC_id]->ch[0],
+                                   eNB2UE[eNB_id][UE_id][CC_id]->channel_length)*eNB2UE[eNB_id][UE_id][CC_id]->channel_length;
+        LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d (CCid %d): Channel gain %f dB (%f)\n",eNB_id,UE_id,CC_id,10*log10(rx_pwr),rx_pwr);
 #endif
 
 
 #ifdef DEBUG_SIM
-        for (i=0;i<eNB2UE[eNB_id][UE_id]->channel_length;i++)
-          printf("ch(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id]->ch[0][i].x,eNB2UE[eNB_id][UE_id]->ch[0][i].y);
+        for (i=0;i<eNB2UE[eNB_id][UE_id][CC_id]->channel_length;i++)
+          printf("ch(%d,%d)[%d] : (%f,%f)\n",eNB_id,UE_id,i,eNB2UE[eNB_id][UE_id][CC_id]->ch[0][i].x,eNB2UE[eNB_id][UE_id][CC_id]->ch[0][i].y);
 #endif
 
-        LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d : tx_power %f dBm, path_loss %f dB\n",
-              eNB_id,UE_id,
-              (double)PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,
+        LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d (CCid %d): tx_power %f dBm, path_loss %f dB\n",
+              eNB_id,UE_id,CC_id,
+              (double)PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower,
               //	       enb_data[eNB_id]->tx_power_dBm,
-              eNB2UE[eNB_id][UE_id]->path_loss_dB);
+              eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB);
 
 #ifdef DEBUG_SIM      
         rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,512,0)*512.0/300.0;
         LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);
 #endif      
 
-        if (eNB2UE[eNB_id][UE_id]->first_run == 1)
-          eNB2UE[eNB_id][UE_id]->first_run = 0;
+        if (eNB2UE[eNB_id][UE_id][CC_id]->first_run == 1)
+          eNB2UE[eNB_id][UE_id][CC_id]->first_run = 0;
 
 
         // RF model
 #ifdef DEBUG_SIM
-        LOG_D(OCM,"[SIM][DL] UE %d : rx_gain %d dB for slot %d (subframe %d)\n",UE_id,PHY_vars_UE_g[UE_id]->rx_total_gain_dB,next_slot,next_slot>>1);
+        LOG_D(OCM,"[SIM][DL] UE %d (CCid %d): rx_gain %d dB for slot %d (subframe %d)\n",UE_id,CC_id,PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB,next_slot,next_slot>>1);
 #endif
         /*
 	rf_rx(r_re0,
@@ -361,8 +362,8 @@ void do_DL_sig(double **r_re0,double **r_im0,
                      r_im0,
                      nb_antennas_rx,
                      frame_parms->samples_per_tti>>1,
-                     1e3/eNB2UE[eNB_id][UE_id]->BW,  // sampling time (ns)
-                     (double)PHY_vars_UE_g[UE_id]->rx_total_gain_dB - 66.227);   // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
+                     1e3/eNB2UE[eNB_id][UE_id][CC_id]->BW,  // sampling time (ns)
+                     (double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227);   // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
 
 #ifdef DEBUG_SIM    
         rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->ofdm_symbol_size,0)*512.0/300;
@@ -383,7 +384,7 @@ void do_DL_sig(double **r_re0,double **r_im0,
       LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dB for slot %d (subframe %d)\n",UE_id,10*log10(rx_pwr),next_slot,next_slot>>1);  
 #endif    
 
-      rxdata = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.rxdata;
+      rxdata = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.rxdata;
       slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
       
       adc(r_re,
@@ -409,7 +410,7 @@ void do_DL_sig(double **r_re0,double **r_im0,
 }
 
 
-void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame) {
+void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t frame,uint8_t CC_id) {
 
   int32_t **txdata,**rxdata;
 #ifdef PHY_ABSTRACTION_UL
@@ -417,8 +418,8 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
 #endif
   uint8_t eNB_id=0,UE_id=0;
 
-  uint8_t nb_antennas_rx = UE2eNB[0][0]->nb_rx; // number of rx antennas at eNB
-  uint8_t nb_antennas_tx = UE2eNB[0][0]->nb_tx; // number of tx antennas at UE
+  uint8_t nb_antennas_rx = UE2eNB[0][0][CC_id]->nb_rx; // number of rx antennas at eNB
+  uint8_t nb_antennas_tx = UE2eNB[0][0][CC_id]->nb_tx; // number of tx antennas at UE
 
   double tx_pwr, rx_pwr;
   int32_t rx_pwr2;
@@ -451,27 +452,27 @@ void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double
       for (UE_id=0;UE_id<NB_UE_INST;UE_id++) 
       {
 	if (!hold_channel) {
-	  random_channel(UE2eNB[UE_id][eNB_id],abstraction_flag);
-	  freq_channel(UE2eNB[UE_id][eNB_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
+	  random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);
+	  freq_channel(UE2eNB[UE_id][eNB_id][CC_id], frame_parms->N_RB_UL,frame_parms->N_RB_UL*12+1);
 	  
 	  // REceived power at the eNB
-	  rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id]->ch[0],
-				     UE2eNB[UE_id][eNB_id]->channel_length)*UE2eNB[UE_id][att_eNB_id]->channel_length; // calculate the rx power at the eNB
+	  rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0],
+				     UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][att_eNB_id][CC_id]->channel_length; // calculate the rx power at the eNB
 	}
 
 	//  write_output("SINRch.m","SINRch",PHY_vars_eNB_g[att_eNB_id]->sinr_dB_eNB,frame_parms->N_RB_UL*12+1,1,1);
 	if(subframe>1 && subframe <5)
           {
             harq_pid = subframe2harq_pid(frame_parms,frame,subframe);
-            ul_nb_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb;
-            ul_fr_rb = PHY_vars_eNB_g[att_eNB_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb;
+            ul_nb_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->nb_rb;
+            ul_fr_rb = PHY_vars_eNB_g[att_eNB_id][CC_id]->ulsch_eNB[(uint8_t)UE_id]->harq_processes[harq_pid]->first_rb;
           }
 	
 	if(ul_nb_rb>1 && (ul_fr_rb < 25 && ul_fr_rb > -1))
           {
             number_rb_ul = ul_nb_rb;
             first_rbUL = ul_fr_rb;
-            init_snr_up(UE2eNB[UE_id][att_eNB_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id]->N0,ul_nb_rb,ul_fr_rb);
+            init_snr_up(UE2eNB[UE_id][att_eNB_id][CC_id],enb_data[att_eNB_id], ue_data[UE_id],PHY_vars_eNB_g[att_eNB_id][CC_id]->sinr_dB,&PHY_vars_UE_g[att_eNB_id][CC_id]->N0,ul_nb_rb,ul_fr_rb);
 	    
           }
       } //UE_id
@@ -510,13 +511,13 @@ if (abstraction_flag!=0) {
       // Compute RX signal for eNB = eNB_id
       for (UE_id=0;UE_id<NB_UE_INST;UE_id++){
 
-        txdata = PHY_vars_UE_g[UE_id]->lte_ue_common_vars.txdata;
-        frame_parms = &PHY_vars_UE_g[UE_id]->lte_frame_parms;
+        txdata = PHY_vars_UE_g[UE_id][CC_id]->lte_ue_common_vars.txdata;
+        frame_parms = &PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms;
         slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
         slot_offset_meas = ((next_slot&1)==0) ? slot_offset : (slot_offset-(frame_parms->samples_per_tti>>1));
 
-        if (((double)PHY_vars_UE_g[UE_id]->tx_power_dBm +
-             UE2eNB[UE_id][eNB_id]->path_loss_dB) <= -125.0) {
+        if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm +
+             UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB) <= -125.0) {
 
           // don't simulate a UE that is too weak
         }
@@ -531,18 +532,18 @@ if (abstraction_flag!=0) {
                                   slot_offset_meas,
                                   frame_parms->ofdm_symbol_size,
                                   14,
-                                  PHY_vars_UE_g[UE_id]->tx_power_dBm);
+                                  PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm);
           //ue_data[UE_id]->tx_power_dBm);
 #ifdef DEBUG_SIM
 	  LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm) for slot %d (subframe %d, slot_offset %d, slot_offset_meas %d)\n",UE_id,10*log10(tx_pwr),PHY_vars_UE_g[UE_id]->tx_power_dBm,next_slot,next_slot>>1,slot_offset,slot_offset_meas);
 #endif
 	  
-	  multipath_channel(UE2eNB[UE_id][eNB_id],s_re,s_im,r_re0,r_im0,
+	  multipath_channel(UE2eNB[UE_id][eNB_id][CC_id],s_re,s_im,r_re0,r_im0,
 			    frame_parms->samples_per_tti>>1,hold_channel);
 
 #ifdef DEBUG_SIM	  
-          rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id]->ch[0],
-                                     UE2eNB[UE_id][eNB_id]->channel_length)*UE2eNB[UE_id][eNB_id]->channel_length;
+          rx_pwr = signal_energy_fp2(UE2eNB[UE_id][eNB_id][CC_id]->ch[0],
+                                     UE2eNB[UE_id][eNB_id][CC_id]->channel_length)*UE2eNB[UE_id][eNB_id][CC_id]->channel_length;
           LOG_D(OCM,"[SIM][UL] slot %d Channel UE %d => eNB %d : %f dB (hold %d)\n",next_slot,UE_id,eNB_id,10*log10(rx_pwr),hold_channel);
 #endif
 
@@ -553,8 +554,8 @@ if (abstraction_flag!=0) {
 #endif
 
 
-          if (UE2eNB[UE_id][eNB_id]->first_run == 1)
-            UE2eNB[UE_id][eNB_id]->first_run = 0;
+          if (UE2eNB[UE_id][eNB_id][CC_id]->first_run == 1)
+            UE2eNB[UE_id][eNB_id][CC_id]->first_run = 0;
 
 
 
@@ -593,15 +594,15 @@ if (abstraction_flag!=0) {
                    r_im,
                    nb_antennas_rx,
                    frame_parms->samples_per_tti>>1,
-                   1e3/UE2eNB[0][eNB_id]->BW,  // sampling time (ns)
-                   (double)PHY_vars_eNB_g[eNB_id]->rx_total_gain_eNB_dB - 66.227);   // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
+                   1e3/UE2eNB[0][eNB_id][CC_id]->BW,  // sampling time (ns)
+                   (double)PHY_vars_eNB_g[eNB_id][CC_id]->rx_total_gain_eNB_dB - 66.227);   // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later)
 
 #ifdef DEBUG_SIM    
       rx_pwr = signal_energy_fp(r_re,r_im,nb_antennas_rx,frame_parms->samples_per_tti>>1,0);
       LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for slot %d (subframe %d)\n",10*log10(rx_pwr),next_slot,next_slot>>1);  
 #endif
       
-      rxdata = PHY_vars_eNB_g[eNB_id]->lte_eNB_common_vars.rxdata[0];
+      rxdata = PHY_vars_eNB_g[eNB_id][CC_id]->lte_eNB_common_vars.rxdata[0];
       slot_offset = (next_slot)*(frame_parms->samples_per_tti>>1);
       
       adc(r_re,
diff --git a/targets/SIMU/USER/event_handler.c b/targets/SIMU/USER/event_handler.c
index c67b36f3bd..dfe1e00b4d 100644
--- a/targets/SIMU/USER/event_handler.c
+++ b/targets/SIMU/USER/event_handler.c
@@ -334,7 +334,7 @@ void execute_events(frame_t frame){
 void update_mac(Event_t event) {
 	LOG_I(EMU,"A NEW MAC MODEL\n");
 	int i = 0;
-
+	UE_list_t *UE_list;
 	if(event.optype == READ)
 	{
 		
@@ -456,23 +456,24 @@ void update_mac(Event_t event) {
 				LOG_I(EMU,"update complete mac params \n");
 				if(event.ue == -1 && event.lcid == -1)
 				{
-					for(i=0;i<NUMBER_OF_UE_MAX;i++)	
+				        UE_list = &eNB_mac_inst->UE_list;
+					for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 					{
 						if(&mac_config[i].DCI_aggregation_min)
 						{
 							LOG_I(EMU,"update dci aggregation min\n");
 							oai_emulation->mac_config[i].DCI_aggregation_min= mac_config[i].DCI_aggregation_min;		
 
-							eNB_mac_inst->UE_template[i].DCI_aggregation_min = oai_emulation->mac_config[i].DCI_aggregation_min;
+							UE_list->UE_template[0][i].DCI_aggregation_min = oai_emulation->mac_config[i].DCI_aggregation_min;
 							LOG_I(EMU,"DCI_aggregation_min UE %d: \n",i);
-							LOG_I(EMU,"%" PRIu8,eNB_mac_inst->UE_template[i].DCI_aggregation_min);		
+							LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DCI_aggregation_min);		
 						}
 						if(&mac_config[i].DLSCH_dci_size_bits !=NULL)
 						{					
 							oai_emulation->mac_config[i].DLSCH_dci_size_bits= mac_config[i].DLSCH_dci_size_bits;
-							eNB_mac_inst->UE_template[i].DLSCH_dci_size_bits = oai_emulation->mac_config[i].DLSCH_dci_size_bits;
+							UE_list->UE_template[0][i].DLSCH_dci_size_bits = oai_emulation->mac_config[i].DLSCH_dci_size_bits;
 							LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n",i);					
-							LOG_I(EMU,"%" PRIu8,eNB_mac_inst->UE_template[i].DLSCH_dci_size_bits);
+							LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DLSCH_dci_size_bits);
 						}
 						if(mac_config[i].priority !=NULL)
 						{
@@ -484,9 +485,9 @@ void update_mac(Event_t event) {
 								if(&mac_config[i].priority[j]!=NULL)
 								{								
 									oai_emulation->mac_config[i].priority[j]= mac_config[i].priority[j];
-									eNB_mac_inst->UE_sched_ctrl[i].priority[j] = oai_emulation->mac_config[i].priority[j];
+									UE_list->UE_sched_ctrl[i].priority[j] = oai_emulation->mac_config[i].priority[j];
 									LOG_I(EMU,"priority UE %d LCID %d:",i,j);					
-									LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].priority[j]);
+									LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].priority[j]);
 								}
 							}
 						}
@@ -498,9 +499,9 @@ void update_mac(Event_t event) {
 							{
 											
 								oai_emulation->mac_config[i].ul_bandwidth[j]= mac_config[i].ul_bandwidth[j];
-								eNB_mac_inst->UE_sched_ctrl[i].ul_bandwidth[j] = oai_emulation->mac_config[i].ul_bandwidth[j];
+								UE_list->UE_sched_ctrl[i].ul_bandwidth[j] = oai_emulation->mac_config[i].ul_bandwidth[j];
 								LOG_I(EMU,"ul_bandwidth UE %d LCID %d:", i, j);					
-								LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].ul_bandwidth[j]);
+								LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].ul_bandwidth[j]);
 							}
 						}
 						if(&mac_config[i].dl_bandwidth !=NULL)
@@ -510,38 +511,38 @@ void update_mac(Event_t event) {
 							{
 											
 								oai_emulation->mac_config[i].dl_bandwidth[j]= mac_config[i].dl_bandwidth[j];
-								eNB_mac_inst->UE_sched_ctrl[i].dl_bandwidth[j] = oai_emulation->mac_config[i].dl_bandwidth[j];
+								UE_list->UE_sched_ctrl[i].dl_bandwidth[j] = oai_emulation->mac_config[i].dl_bandwidth[j];
 								LOG_I(EMU,"ul_bandwidth UE %d LCID %d:", i, j);					
-								LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].dl_bandwidth[j]);
+								LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].dl_bandwidth[j]);
 							}
 						}
 						if(&mac_config[i].ue_AggregatedMaximumBitrateDL !=NULL)
 						{
 							oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL= mac_config[i].ue_AggregatedMaximumBitrateDL;
-							eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL;
+							UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL;
 							LOG_I(EMU,"ue_AggregatedMaximumBitrateDL UE %d:",i );					
-							LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL);
+							LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL);
 						}
 						if(&mac_config[i].ue_AggregatedMaximumBitrateUL !=NULL)
 						{
 							oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL= mac_config[i].ue_AggregatedMaximumBitrateUL;
-							eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL;
+							UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL;
 							LOG_I(EMU,"ue_AggregatedMaximumBitrateUL UE %d:",i);					
-							LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL);
+							LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL);
 						}
 						if(&mac_config[i].cqiSchedInterval !=NULL)
 						{
 							oai_emulation->mac_config[i].cqiSchedInterval= mac_config[i].cqiSchedInterval;
-							eNB_mac_inst->UE_sched_ctrl[i].cqiSchedInterval = oai_emulation->mac_config[i].cqiSchedInterval;
+							UE_list->UE_sched_ctrl[i].cqiSchedInterval = oai_emulation->mac_config[i].cqiSchedInterval;
 							LOG_I(EMU,"cqiSchedInterval UE %d:",i);					
-							LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[i].cqiSchedInterval);
+							LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].cqiSchedInterval);
 						}					
 						if(&mac_config[i].mac_ContentionResolutionTimer !=NULL)
 						{
 							oai_emulation->mac_config[i].mac_ContentionResolutionTimer= mac_config[i].mac_ContentionResolutionTimer;
-							eNB_mac_inst->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer;
+							UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer;
 							LOG_I(EMU,"mac_ContentionResolutionTimer UE %:", i);					
-							LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].mac_ContentionResolutionTimer);
+							LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer);
 						}										
 						if(mac_config->max_allowed_rbs !=NULL)
 						{
@@ -549,9 +550,9 @@ void update_mac(Event_t event) {
 							for(j=0;j<MAX_NUM_LCID;j++)
 							{							
 								oai_emulation->mac_config[i].max_allowed_rbs[j]= mac_config[i].max_allowed_rbs[j];
-								eNB_mac_inst->UE_sched_ctrl[i].max_allowed_rbs[j] = oai_emulation->mac_config[i].max_allowed_rbs[j];
+								UE_list->UE_sched_ctrl[i].max_allowed_rbs[j] = oai_emulation->mac_config[i].max_allowed_rbs[j];
 								LOG_I(EMU,"max_allowed_rbs UE %d LCID %d:",i,j);					
-								LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[i].max_allowed_rbs[j]);
+								LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].max_allowed_rbs[j]);
 							}
 						}			
 						if(mac_config[i].max_mcs !=NULL)
@@ -560,9 +561,9 @@ void update_mac(Event_t event) {
 							for(j=0;j<MAX_NUM_LCID;j++)
 							{							
 								oai_emulation->mac_config[i].max_mcs[j]= mac_config[i].max_mcs[j];
-								eNB_mac_inst->UE_sched_ctrl[i].max_mcs[j] = oai_emulation->mac_config[i].max_mcs[j];
+								UE_list->UE_sched_ctrl[i].max_mcs[j] = oai_emulation->mac_config[i].max_mcs[j];
 								LOG_I(EMU,"max_mcs UE %d LCID %d:",i,j);					
-								LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].max_mcs[j]);
+								LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].max_mcs[j]);
 							}
 					
 						}	
@@ -581,16 +582,16 @@ void update_mac(Event_t event) {
 								LOG_I(EMU,"update dci aggregation min\n");
 								oai_emulation->mac_config[i].DCI_aggregation_min= mac_config[i].DCI_aggregation_min;		
 								// duplication dans le ue template, vérifier la validité avant		
-								eNB_mac_inst->UE_template[i].DCI_aggregation_min = oai_emulation->mac_config[i].DCI_aggregation_min;
+								UE_list->UE_template[0][i].DCI_aggregation_min = oai_emulation->mac_config[i].DCI_aggregation_min;
 								LOG_I(EMU,"DCI_aggregation_min UE %d: \n",i);
-								LOG_I(EMU,"%" PRIu8,eNB_mac_inst->UE_template[i].DCI_aggregation_min);		
+								LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DCI_aggregation_min);		
 							}
 							if(&mac_config[i].DLSCH_dci_size_bits !=NULL)
 							{					
 								oai_emulation->mac_config[i].DLSCH_dci_size_bits= mac_config[i].DLSCH_dci_size_bits;
-								eNB_mac_inst->UE_template[i].DLSCH_dci_size_bits = oai_emulation->mac_config[i].DLSCH_dci_size_bits;
+								UE_list->UE_template[0][i].DLSCH_dci_size_bits = oai_emulation->mac_config[i].DLSCH_dci_size_bits;
 								LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n",i);					
-								LOG_I(EMU,"%" PRIu8,eNB_mac_inst->UE_template[i].DLSCH_dci_size_bits);
+								LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DLSCH_dci_size_bits);
 							}
 							if(mac_config[i].priority !=NULL)
 							{
@@ -600,9 +601,9 @@ void update_mac(Event_t event) {
 									if(&mac_config[i].priority[j]!=NULL)
 									{								
 										oai_emulation->mac_config[i].priority[j]= mac_config[i].priority[j];
-										eNB_mac_inst->UE_sched_ctrl[i].priority[j] = oai_emulation->mac_config[i].priority[j];
+										UE_list->UE_sched_ctrl[i].priority[j] = oai_emulation->mac_config[i].priority[j];
 										LOG_I(EMU,"priority UE %d LCID %d:",i,j);					
-										LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].priority[j]);
+										LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].priority[j]);
 									}
 						
 							}
@@ -613,79 +614,79 @@ void update_mac(Event_t event) {
 						
 									
 									oai_emulation->mac_config[i].ul_bandwidth[j]= mac_config[i].ul_bandwidth[j];
-									eNB_mac_inst->UE_sched_ctrl[i].ul_bandwidth[j] = oai_emulation->mac_config[i].ul_bandwidth[j];
+									UE_list->UE_sched_ctrl[i].ul_bandwidth[j] = oai_emulation->mac_config[i].ul_bandwidth[j];
 									LOG_I(EMU,"ul_bandwidth UE %d LCID %d:", i, j);					
-									LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].ul_bandwidth[j]);
+									LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].ul_bandwidth[j]);
 						
 							}
 							if(&mac_config[i].dl_bandwidth !=NULL)
 							{
 								oai_emulation->mac_config[i].dl_bandwidth[j]= mac_config[i].dl_bandwidth[j];
-									eNB_mac_inst->UE_sched_ctrl[i].dl_bandwidth[j] = oai_emulation->mac_config[i].dl_bandwidth[j];
+									UE_list->UE_sched_ctrl[i].dl_bandwidth[j] = oai_emulation->mac_config[i].dl_bandwidth[j];
 									LOG_I(EMU,"ul_bandwidth UE %d LCID %d:", i, j);					
-									LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].dl_bandwidth[j]);
+									LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].dl_bandwidth[j]);
 						
 							}
 							if(&mac_config[i].min_ul_bandwidth !=NULL)
 							{
 								// faire boucle par ue puis par lcid
 									oai_emulation->mac_config[i].min_ul_bandwidth[j]= mac_config[i].min_ul_bandwidth[j];
-									eNB_mac_inst->UE_sched_ctrl[i].min_ul_bandwidth[j] = oai_emulation->mac_config[i].min_ul_bandwidth[j];
+									UE_list->UE_sched_ctrl[i].min_ul_bandwidth[j] = oai_emulation->mac_config[i].min_ul_bandwidth[j];
 									LOG_I(EMU,"min_ul_bandwidth UE %d LCID %d:", i, j);					
-									LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].min_ul_bandwidth[j]);
+									LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].min_ul_bandwidth[j]);
 						
 							}
 							if(&mac_config[i].min_dl_bandwidth !=NULL)
 							{
 									oai_emulation->mac_config[i].min_dl_bandwidth[j]= mac_config[i].min_dl_bandwidth[j];
-									eNB_mac_inst->UE_sched_ctrl[i].min_dl_bandwidth[j] = oai_emulation->mac_config[i].min_dl_bandwidth[j];
+									UE_list->UE_sched_ctrl[i].min_dl_bandwidth[j] = oai_emulation->mac_config[i].min_dl_bandwidth[j];
 									LOG_I(EMU,"min_dl_bandwidth UE %d LCID %d:", i, j);					
-									LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].min_dl_bandwidth[j]);
+									LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].min_dl_bandwidth[j]);
 						
 							}
 							if(&mac_config[i].ue_AggregatedMaximumBitrateDL !=NULL)
 							{
 								oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL= mac_config[i].ue_AggregatedMaximumBitrateDL;
-								eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL;
+								UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL;
 								LOG_I(EMU,"ue_AggregatedMaximumBitrateDL UE %d:",i );					
-								LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL);
+								LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL);
 							}
 							if(&mac_config[i].ue_AggregatedMaximumBitrateUL !=NULL)
 							{
 								oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL= mac_config[i].ue_AggregatedMaximumBitrateUL;
-								eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL;
+								UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL;
 								LOG_I(EMU,"ue_AggregatedMaximumBitrateUL UE %d:",i);					
-								LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL);
+								LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL);
 							}
 							if(&mac_config[i].cqiSchedInterval !=NULL)
 							{
 								oai_emulation->mac_config[i].cqiSchedInterval= mac_config[i].cqiSchedInterval;
-								eNB_mac_inst->UE_sched_ctrl[i].cqiSchedInterval = oai_emulation->mac_config[i].cqiSchedInterval;
+								UE_list->UE_sched_ctrl[i].cqiSchedInterval = oai_emulation->mac_config[i].cqiSchedInterval;
 								LOG_I(EMU,"cqiSchedInterval UE %d:",i);					
-								LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[i].cqiSchedInterval);
+								LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].cqiSchedInterval);
 							}					
 							if(&mac_config[i].mac_ContentionResolutionTimer !=NULL)
 							{
 								oai_emulation->mac_config[i].mac_ContentionResolutionTimer= mac_config[i].mac_ContentionResolutionTimer;
-								eNB_mac_inst->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer;
+								UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer;
 								LOG_I(EMU,"mac_ContentionResolutionTimer UE %:", i);					
-								LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].mac_ContentionResolutionTimer);
+								LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer);
 							}										
 							if(mac_config->max_allowed_rbs !=NULL)
 							{
 											
 									oai_emulation->mac_config[i].max_allowed_rbs[j]= mac_config[i].max_allowed_rbs[j];
-									eNB_mac_inst->UE_sched_ctrl[i].max_allowed_rbs[j] = oai_emulation->mac_config[i].max_allowed_rbs[j];
+									UE_list->UE_sched_ctrl[i].max_allowed_rbs[j] = oai_emulation->mac_config[i].max_allowed_rbs[j];
 									LOG_I(EMU,"max_allowed_rbs UE %d LCID %d:",i,j);					
-									LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[i].max_allowed_rbs[j]);
+									LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].max_allowed_rbs[j]);
 		
 							}			
 							if(mac_config[i].max_mcs !=NULL)
 							{
 								oai_emulation->mac_config[i].max_mcs[j]= mac_config[i].max_mcs[j];
-								eNB_mac_inst->UE_sched_ctrl[i].max_mcs[j] = oai_emulation->mac_config[i].max_mcs[j];
+								UE_list->UE_sched_ctrl[i].max_mcs[j] = oai_emulation->mac_config[i].max_mcs[j];
 								LOG_I(EMU,"max_mcs UE %d LCID %d:",i,j);					
-								LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].max_mcs[j]);
+								LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].max_mcs[j]);
 
 							}					
 				}
@@ -707,9 +708,9 @@ void update_mac(Event_t event) {
 						if(&mac_config[i].priority[j]!=NULL)
 						{								
 							oai_emulation->mac_config[i].priority[j]= mac_config[i].priority[j];
-							eNB_mac_inst->UE_sched_ctrl[i].priority[j] = oai_emulation->mac_config[i].priority[j];
+							UE_list->UE_sched_ctrl[i].priority[j] = oai_emulation->mac_config[i].priority[j];
 							LOG_I(EMU,"priority UE %d LCID %d:",i,j);					
-							LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].priority[j]);
+							LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].priority[j]);
 						}
 					}
 				}
@@ -717,9 +718,9 @@ void update_mac(Event_t event) {
 			else
 			{
 				oai_emulation->mac_config[event.ue].priority[event.lcid]= mac_config[event.ue].priority[event.lcid];
-				eNB_mac_inst->UE_sched_ctrl[event.ue].priority[event.lcid] = oai_emulation->mac_config[event.ue].priority[event.lcid];
+				UE_list->UE_sched_ctrl[event.ue].priority[event.lcid] = oai_emulation->mac_config[event.ue].priority[event.lcid];
 				LOG_I(EMU,"priority UE %d LCID %d:",i,j);					
-				LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].priority[event.lcid]);
+				LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[event.ue].priority[event.lcid]);
 			}
 		}
 		else if(!strcmp((char *) event.key, "DCI_aggregation_min") && event.value!=NULL && validate_mac(event))
@@ -730,20 +731,21 @@ void update_mac(Event_t event) {
 				LOG_I(EMU,"DCI_aggregation_min update \n");	
 				if(event.ue == -1)
 				{
-					for(i=0;i<NUMBER_OF_UE_MAX;i++)
+				        UE_list = &eNB_mac_inst->UE_list;
+					for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 					{			
 						oai_emulation->mac_config[i].DCI_aggregation_min=mac_config[i].DCI_aggregation_min;
-						eNB_mac_inst->UE_template[i].DCI_aggregation_min = oai_emulation->mac_config[i].DCI_aggregation_min;
+						UE_list->UE_template[0][i].DCI_aggregation_min = oai_emulation->mac_config[i].DCI_aggregation_min;
 						LOG_I(EMU,"DCI_aggregation_min UE %d : \n", i);
-						LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_template[i].DCI_aggregation_min);
+						LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_template[0][i].DCI_aggregation_min);
 					}
 				}
 				else
 				{
 					oai_emulation->mac_config[event.ue].DCI_aggregation_min=mac_config[event.ue].DCI_aggregation_min;	
-					eNB_mac_inst->UE_template[event.ue].DCI_aggregation_min = oai_emulation->mac_config[event.ue].DCI_aggregation_min;
+					UE_list->UE_template[0][event.ue].DCI_aggregation_min = oai_emulation->mac_config[event.ue].DCI_aggregation_min;
 					LOG_I(EMU,"DCI_aggregation_min UE %d : \n", event.ue);
-					LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_template[event.ue].DCI_aggregation_min);
+					LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_template[0][event.ue].DCI_aggregation_min);
 				}				
 		}
 		else if(!strcmp((char *) event.key, "DLSCH_dci_size_bits") && event.value!=NULL && validate_mac(event))
@@ -755,20 +757,21 @@ void update_mac(Event_t event) {
 				LOG_I(EMU,"DLSCH_dci_size_bits update \n");					
 				if(event.ue == -1)
 				{
-					for(i=0;i<NUMBER_OF_UE_MAX;i++)
+				        UE_list = &eNB_mac_inst->UE_list;
+					for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 					{							
 						oai_emulation->mac_config[i].DLSCH_dci_size_bits=mac_config[i].DLSCH_dci_size_bits;
-						eNB_mac_inst->UE_template[i].DLSCH_dci_size_bits = oai_emulation->mac_config[i].DLSCH_dci_size_bits;
+						UE_list->UE_template[0][i].DLSCH_dci_size_bits = oai_emulation->mac_config[i].DLSCH_dci_size_bits;
 						LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n", i);				
-						LOG_I(EMU,"%" PRIu8,eNB_mac_inst->UE_template[i].DLSCH_dci_size_bits);
+						LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][i].DLSCH_dci_size_bits);
 					}
 				}
 				else
 				{
 					oai_emulation->mac_config[event.ue].DLSCH_dci_size_bits=mac_config[event.ue].DLSCH_dci_size_bits;
-					eNB_mac_inst->UE_template[event.ue].DLSCH_dci_size_bits = oai_emulation->mac_config[event.ue].DLSCH_dci_size_bits;
+					UE_list->UE_template[0][event.ue].DLSCH_dci_size_bits = oai_emulation->mac_config[event.ue].DLSCH_dci_size_bits;
 					LOG_I(EMU,"DLSCH_dci_size_bits UE %d: \n", event.ue);				
-					LOG_I(EMU,"%" PRIu8,eNB_mac_inst->UE_template[event.ue].DLSCH_dci_size_bits);
+					LOG_I(EMU,"%" PRIu8,UE_list->UE_template[0][event.ue].DLSCH_dci_size_bits);
 				}
 				
 		}
@@ -781,7 +784,8 @@ void update_mac(Event_t event) {
 					int j=0;
 					if(event.ue == -1 && event.lcid == -1)
 					{
-						for(i=0;i<NUMBER_OF_UE_MAX;i++)
+					        UE_list = &eNB_mac_inst->UE_list;
+					        for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 						{
 											
 								
@@ -791,9 +795,9 @@ void update_mac(Event_t event) {
 									if(&mac_config[i].ul_bandwidth[j]!=NULL)
 									{								
 										oai_emulation->mac_config[i].ul_bandwidth[j]= mac_config[i].ul_bandwidth[j];
-										eNB_mac_inst->UE_sched_ctrl[i].ul_bandwidth[j] = oai_emulation->mac_config[i].ul_bandwidth[j];
+										UE_list->UE_sched_ctrl[i].ul_bandwidth[j] = oai_emulation->mac_config[i].ul_bandwidth[j];
 										LOG_I(EMU,"ul_bandwidth UE %d LCID %d:",i,j);					
-										LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].ul_bandwidth[j]);
+										LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].ul_bandwidth[j]);
 									}
 								}
 						
@@ -802,9 +806,9 @@ void update_mac(Event_t event) {
 					else
 					{
 						oai_emulation->mac_config[event.ue].ul_bandwidth[event.lcid]= mac_config[event.ue].ul_bandwidth[event.lcid];
-						eNB_mac_inst->UE_sched_ctrl[event.ue].ul_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].ul_bandwidth[event.lcid];
+						UE_list->UE_sched_ctrl[event.ue].ul_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].ul_bandwidth[event.lcid];
 						LOG_I(EMU,"ul_bandwidth UE %d LCID %d:",event.ue, event.lcid);					
-						LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].ul_bandwidth[event.lcid]);
+						LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[event.ue].ul_bandwidth[event.lcid]);
 					}				
 				
 		}
@@ -816,7 +820,8 @@ void update_mac(Event_t event) {
 					int j=0;
 					if(event.ue == -1 && event.lcid == -1)
 					{
-						for(i=0;i<NUMBER_OF_UE_MAX;i++)
+					        UE_list = &eNB_mac_inst->UE_list;
+					        for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 						{
 							if(event.value + i !=NULL)
 							{						
@@ -827,9 +832,9 @@ void update_mac(Event_t event) {
 									if(&mac_config[i].dl_bandwidth[j]!=NULL)
 									{								
 										oai_emulation->mac_config[i].dl_bandwidth[j]= mac_config[i].dl_bandwidth[j];
-										eNB_mac_inst->UE_sched_ctrl[i].dl_bandwidth[j] = oai_emulation->mac_config[i].dl_bandwidth[j];
+										UE_list->UE_sched_ctrl[i].dl_bandwidth[j] = oai_emulation->mac_config[i].dl_bandwidth[j];
 										LOG_I(EMU,"dl_bandwidth UE %d LCID %d:",i,j);					
-										LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].dl_bandwidth[j]);
+										LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].dl_bandwidth[j]);
 									}
 								}
 							}
@@ -838,9 +843,9 @@ void update_mac(Event_t event) {
 					else
 					{
 						oai_emulation->mac_config[event.ue].dl_bandwidth[event.lcid]= mac_config[event.ue].dl_bandwidth[event.lcid];
-						eNB_mac_inst->UE_sched_ctrl[event.ue].dl_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].dl_bandwidth[event.lcid];
+						UE_list->UE_sched_ctrl[event.ue].dl_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].dl_bandwidth[event.lcid];
 						LOG_I(EMU,"dl_bandwidth UE %d LCID %d:",event.ue, event.lcid);					
-						LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].dl_bandwidth[event.lcid]);
+						LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[event.ue].dl_bandwidth[event.lcid]);
 					}	
 		}
 		else if(!strcmp((char *) event.key, "min_ul_bandwidth") && event.value!=NULL)
@@ -852,7 +857,8 @@ void update_mac(Event_t event) {
 					int j=0;
 					if(event.ue == -1 && event.lcid == -1)
 					{
-						for(i=0;i<NUMBER_OF_UE_MAX;i++)
+						UE_list = &eNB_mac_inst->UE_list;
+					        for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 						{
 											
 								
@@ -862,9 +868,9 @@ void update_mac(Event_t event) {
 									if(&mac_config[i].min_ul_bandwidth[j]!=NULL)
 									{								
 										oai_emulation->mac_config[i].min_ul_bandwidth[j]= mac_config[i].min_ul_bandwidth[j];
-										eNB_mac_inst->UE_sched_ctrl[i].min_ul_bandwidth[j] = oai_emulation->mac_config[i].min_ul_bandwidth[j];
+										UE_list->UE_sched_ctrl[i].min_ul_bandwidth[j] = oai_emulation->mac_config[i].min_ul_bandwidth[j];
 										LOG_I(EMU,"min_ul_bandwidth UE %d LCID %d:",i,j);					
-										LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].min_ul_bandwidth[j]);
+										LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].min_ul_bandwidth[j]);
 									}
 								}
 						
@@ -873,9 +879,9 @@ void update_mac(Event_t event) {
 					else
 					{
 						oai_emulation->mac_config[event.ue].min_ul_bandwidth[event.lcid]= mac_config[event.ue].min_ul_bandwidth[event.lcid];
-						eNB_mac_inst->UE_sched_ctrl[event.ue].min_ul_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].min_ul_bandwidth[event.lcid];
+						UE_list->UE_sched_ctrl[event.ue].min_ul_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].min_ul_bandwidth[event.lcid];
 						LOG_I(EMU,"min_ul_bandwidth UE %d LCID %d:",event.ue, event.lcid);					
-						LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].min_ul_bandwidth[event.lcid]);
+						LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[event.ue].min_ul_bandwidth[event.lcid]);
 					}				
 				
 		}
@@ -887,7 +893,8 @@ void update_mac(Event_t event) {
 					int j=0;
 					if(event.ue == -1 && event.lcid == -1)
 					{
-						for(i=0;i<NUMBER_OF_UE_MAX;i++)
+						UE_list = &eNB_mac_inst->UE_list;
+					        for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 						{
 							if(event.value + i !=NULL)
 							{						
@@ -898,9 +905,9 @@ void update_mac(Event_t event) {
 									if(&mac_config[i].min_dl_bandwidth[j]!=NULL)
 									{								
 										oai_emulation->mac_config[i].min_dl_bandwidth[j]= mac_config[i].min_dl_bandwidth[j];
-										eNB_mac_inst->UE_sched_ctrl[i].min_dl_bandwidth[j] = oai_emulation->mac_config[i].min_dl_bandwidth[j];
+										UE_list->UE_sched_ctrl[i].min_dl_bandwidth[j] = oai_emulation->mac_config[i].min_dl_bandwidth[j];
 										LOG_I(EMU,"dl_bandwidth UE %d LCID %d:",i,j);					
-										LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].min_dl_bandwidth[j]);
+										LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].min_dl_bandwidth[j]);
 									}
 								}
 							}
@@ -909,9 +916,9 @@ void update_mac(Event_t event) {
 					else
 					{
 						oai_emulation->mac_config[event.ue].min_dl_bandwidth[event.lcid]= mac_config[event.ue].min_dl_bandwidth[event.lcid];
-						eNB_mac_inst->UE_sched_ctrl[event.ue].min_dl_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].min_dl_bandwidth[event.lcid];
+						UE_list->UE_sched_ctrl[event.ue].min_dl_bandwidth[event.lcid] = oai_emulation->mac_config[event.ue].min_dl_bandwidth[event.lcid];
 						LOG_I(EMU,"min_dl_bandwidth UE %d LCID %d:",event.ue, event.lcid);					
-						LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].min_dl_bandwidth[event.lcid]);
+						LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[event.ue].min_dl_bandwidth[event.lcid]);
 					}	
 		}
 		else if(!strcmp((char *) event.key, "ue_AggregatedMaximumBitrateDL") && event.value!=NULL && validate_mac(event))
@@ -922,20 +929,21 @@ void update_mac(Event_t event) {
 				LOG_I(EMU,"ue_AggregatedMaximumBitrateDL update \n");					
 				if(event.ue == -1)
 				{				
-					for(i=0;i<NUMBER_OF_UE_MAX;i++)
+				        UE_list = &eNB_mac_inst->UE_list;
+					for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 					{				
 						oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL= mac_config[i].ue_AggregatedMaximumBitrateDL;
-						eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL;
+						UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateDL;
 						LOG_I(EMU,"ue_AggregatedMaximumBitrateDL UE %d:\n",event.ue);					
-						LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL);
+						LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateDL);
 					}
 				}
 				else
 				{
 					oai_emulation->mac_config[event.ue].ue_AggregatedMaximumBitrateDL= mac_config[event.ue].ue_AggregatedMaximumBitrateDL;
-					eNB_mac_inst->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[event.ue].ue_AggregatedMaximumBitrateDL;
+					UE_list->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateDL = oai_emulation->mac_config[event.ue].ue_AggregatedMaximumBitrateDL;
 					LOG_I(EMU,"ue_AggregatedMaximumBitrateDL UE %d:\n",event.ue);					
-					LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateDL);
+					LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateDL);
 				}
 				
 		}
@@ -948,20 +956,21 @@ void update_mac(Event_t event) {
 				LOG_I(EMU,"ue_AggregatedMaximumBitrateUL update \n");					
 				if(event.ue == -1)
 				{					
-					for(i=0;i<NUMBER_OF_UE_MAX;i++)
+					UE_list = &eNB_mac_inst->UE_list;
+					for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 					{				
 						oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL= mac_config[i].ue_AggregatedMaximumBitrateUL;
-						eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL;
+						UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[i].ue_AggregatedMaximumBitrateUL;
 						LOG_I(EMU,"ue_AggregatedMaximumBitrateUL UE %d:\n",i);					
-						LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL);
+						LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[i].ue_AggregatedMaximumBitrateUL);
 					}
 				}
 				else
 				{
 					oai_emulation->mac_config[event.ue].ue_AggregatedMaximumBitrateUL= mac_config[event.ue].ue_AggregatedMaximumBitrateUL;
-					eNB_mac_inst->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[event.ue].ue_AggregatedMaximumBitrateUL;
+					UE_list->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateUL = oai_emulation->mac_config[event.ue].ue_AggregatedMaximumBitrateUL;
 					LOG_I(EMU,"ue_AggregatedMaximumBitrateUL UE %d:\n",event.ue);					
-					LOG_I(EMU,"%" PRIu64 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateUL);
+					LOG_I(EMU,"%" PRIu64 "\n",UE_list->UE_sched_ctrl[event.ue].ue_AggregatedMaximumBitrateUL);
 				}
 				
 		}
@@ -973,20 +982,21 @@ void update_mac(Event_t event) {
 				LOG_I(EMU,"cqiSchedInterval update \n");					
 				if(event.ue == -1)
 				{					
-					for(i=0;i<NUMBER_OF_UE_MAX;i++)
+					UE_list = &eNB_mac_inst->UE_list;
+					for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 					{							
 						oai_emulation->mac_config[i].cqiSchedInterval= mac_config[i].cqiSchedInterval;
-						eNB_mac_inst->UE_sched_ctrl[i].cqiSchedInterval = oai_emulation->mac_config[i].cqiSchedInterval;
+						UE_list->UE_sched_ctrl[i].cqiSchedInterval = oai_emulation->mac_config[i].cqiSchedInterval;
 						LOG_I(EMU,"cqiSchedInterval UE :\n", i);					
-						LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[i].cqiSchedInterval);
+						LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].cqiSchedInterval);
 					}
 				}
 				else
 				{
 					oai_emulation->mac_config[event.ue].cqiSchedInterval= mac_config[event.ue].cqiSchedInterval;
-					eNB_mac_inst->UE_sched_ctrl[event.ue].cqiSchedInterval = oai_emulation->mac_config[event.ue].cqiSchedInterval;
+					UE_list->UE_sched_ctrl[event.ue].cqiSchedInterval = oai_emulation->mac_config[event.ue].cqiSchedInterval;
 					LOG_I(EMU,"cqiSchedInterval UE :\n", event.ue);					
-					LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].cqiSchedInterval);
+					LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[event.ue].cqiSchedInterval);
 				}	
 		}
 		else if(!strcmp((char *) event.key, "mac_ContentionResolutionTimer") && event.value!=NULL && validate_mac(event))
@@ -996,20 +1006,21 @@ void update_mac(Event_t event) {
 				LOG_I(EMU,"mac_ContentionResolutionTimer update \n");					
 				if(event.ue == -1)
 				{
-					for(i=0;i<NUMBER_OF_UE_MAX;i++)
+					UE_list = &eNB_mac_inst->UE_list;
+					for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 					{		
 						oai_emulation->mac_config[i].mac_ContentionResolutionTimer= mac_config[i].mac_ContentionResolutionTimer;
-						eNB_mac_inst->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer;
+						UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer = oai_emulation->mac_config[i].mac_ContentionResolutionTimer;
 						LOG_I(EMU,"mac_ContentionResolutionTimer UE :\n", i);					
-						LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[i].mac_ContentionResolutionTimer);
+						LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[i].mac_ContentionResolutionTimer);
 					}
 				}
 				else
 				{
 					oai_emulation->mac_config[event.ue].mac_ContentionResolutionTimer= mac_config[event.ue].mac_ContentionResolutionTimer;
-					eNB_mac_inst->UE_sched_ctrl[event.ue].mac_ContentionResolutionTimer = oai_emulation->mac_config[event.ue].mac_ContentionResolutionTimer;
+					UE_list->UE_sched_ctrl[event.ue].mac_ContentionResolutionTimer = oai_emulation->mac_config[event.ue].mac_ContentionResolutionTimer;
 					LOG_I(EMU,"mac_ContentionResolutionTimer UE :\n", event.ue);					
-					LOG_I(EMU,"%" PRIu8 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].mac_ContentionResolutionTimer);
+					LOG_I(EMU,"%" PRIu8 "\n",UE_list->UE_sched_ctrl[event.ue].mac_ContentionResolutionTimer);
 				}
 		}
 		else if(!strcmp((char *) event.key, "max_allowed_rbs") && event.value!=NULL && validate_mac(event))
@@ -1021,7 +1032,8 @@ void update_mac(Event_t event) {
 					int j=0;
 					if(event.ue == -1 && event.lcid == -1)
 					{
-						for(i=0;i<NUMBER_OF_UE_MAX;i++)
+						UE_list = &eNB_mac_inst->UE_list;
+						for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 						{
 							if(event.value + i !=NULL)
 							{						
@@ -1032,9 +1044,9 @@ void update_mac(Event_t event) {
 									if(&mac_config[i].max_allowed_rbs[j]!=NULL)
 									{								
 										oai_emulation->mac_config[i].max_allowed_rbs[j]= mac_config[i].max_allowed_rbs[j];
-										eNB_mac_inst->UE_sched_ctrl[i].max_allowed_rbs[j] = oai_emulation->mac_config[i].max_allowed_rbs[j];
+										UE_list->UE_sched_ctrl[i].max_allowed_rbs[j] = oai_emulation->mac_config[i].max_allowed_rbs[j];
 										LOG_I(EMU,"max_allowed_rbs UE %d LCID %d:",i,j);					
-										LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[i].max_allowed_rbs[j]);
+										LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].max_allowed_rbs[j]);
 									}
 								}
 							}
@@ -1043,9 +1055,9 @@ void update_mac(Event_t event) {
 					else
 					{
 						oai_emulation->mac_config[event.ue].max_allowed_rbs[event.lcid]= mac_config[event.ue].max_allowed_rbs[event.lcid];
-						eNB_mac_inst->UE_sched_ctrl[event.ue].max_allowed_rbs[event.lcid] = oai_emulation->mac_config[event.ue].max_allowed_rbs[event.lcid];
+						UE_list->UE_sched_ctrl[event.ue].max_allowed_rbs[event.lcid] = oai_emulation->mac_config[event.ue].max_allowed_rbs[event.lcid];
 						LOG_I(EMU,"max_allowed_rbs UE %d LCID %d:",event.ue,event.lcid);					
-						LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].max_allowed_rbs[event.lcid]);
+						LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[event.ue].max_allowed_rbs[event.lcid]);
 					}	
 				
 		}
@@ -1059,7 +1071,8 @@ void update_mac(Event_t event) {
 					int j=0;
 					if(event.ue == -1 && event.lcid == -1)
 					{
-						for(i=0;i<NUMBER_OF_UE_MAX;i++)
+						UE_list = &eNB_mac_inst->UE_list;
+						for(i=UE_list->head;i>=0;i=UE_list->next[i])	
 						{
 													
 								for(j=0;j<MAX_NUM_LCID;j++)
@@ -1068,9 +1081,9 @@ void update_mac(Event_t event) {
 									if(&mac_config[i].max_mcs[j]!=NULL)
 									{								
 										oai_emulation->mac_config[i].max_mcs[j]= mac_config[i].max_mcs[j];
-										eNB_mac_inst->UE_sched_ctrl[i].max_mcs[j] = oai_emulation->mac_config[i].max_mcs[j];
+										UE_list->UE_sched_ctrl[i].max_mcs[j] = oai_emulation->mac_config[i].max_mcs[j];
 										LOG_I(EMU,"max_mcs UE %d LCID %d:",i,j);					
-										LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[i].max_mcs[j]);
+										LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[i].max_mcs[j]);
 									}
 								}
 							
@@ -1079,9 +1092,9 @@ void update_mac(Event_t event) {
 					else
 					{
 						oai_emulation->mac_config[event.ue].max_mcs[event.lcid]= mac_config[event.ue].max_mcs[event.lcid];
-						eNB_mac_inst->UE_sched_ctrl[event.ue].max_mcs[event.lcid] = oai_emulation->mac_config[event.ue].max_mcs[event.lcid];
+						UE_list->UE_sched_ctrl[event.ue].max_mcs[event.lcid] = oai_emulation->mac_config[event.ue].max_mcs[event.lcid];
 						LOG_I(EMU,"max_mcs UE %d LCID %d:",event.ue,event.lcid);					
-						LOG_I(EMU,"%" PRIu16 "\n",eNB_mac_inst->UE_sched_ctrl[event.ue].max_mcs[event.lcid]);
+						LOG_I(EMU,"%" PRIu16 "\n",UE_list->UE_sched_ctrl[event.ue].max_mcs[event.lcid]);
 					}	
 		}
 	}
diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c
index 422f4c331d..b39b9d8f84 100644
--- a/targets/SIMU/USER/init_lte.c
+++ b/targets/SIMU/USER/init_lte.c
@@ -169,7 +169,7 @@ void init_lte_vars(LTE_DL_FRAME_PARMS **frame_parms,
 		   uint8_t cooperation_flag,uint8_t transmission_mode,uint8_t abstraction_flag,
 		   int nb_antennas_rx, uint8_t eMBMS_active_state) {
 
-  uint8_t eNB_id,UE_id,RN_id;
+  uint8_t eNB_id,UE_id,RN_id,CC_id;
 
   mac_xface = malloc(sizeof(MAC_xface));
 
@@ -205,17 +205,27 @@ void init_lte_vars(LTE_DL_FRAME_PARMS **frame_parms,
 
   phy_init_lte_top(*frame_parms);
 
-  PHY_vars_eNB_g = malloc(NB_eNB_INST*sizeof(PHY_VARS_eNB*));
+  PHY_vars_eNB_g = (PHY_VARS_eNB***)malloc(NB_eNB_INST*sizeof(PHY_VARS_eNB**));
   for (eNB_id=0; eNB_id<NB_eNB_INST;eNB_id++){ 
-    PHY_vars_eNB_g[eNB_id] = init_lte_eNB(*frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
+    PHY_vars_eNB_g[eNB_id] = (PHY_VARS_eNB**) malloc(MAX_NUM_CCs*sizeof(PHY_VARS_eNB*));
+    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+      PHY_vars_eNB_g[eNB_id][CC_id] = init_lte_eNB(*frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
+      PHY_vars_eNB_g[eNB_id][CC_id]->Mod_id=eNB_id;
+      PHY_vars_eNB_g[eNB_id][CC_id]->CC_id=CC_id;
+    }
   }
 
   (*frame_parms)->nb_antennas_tx     = 1;
   (*frame_parms)->nb_antennas_rx     = nb_antennas_rx;
 
-  PHY_vars_UE_g = malloc(NB_UE_INST*sizeof(PHY_VARS_UE*));
+  PHY_vars_UE_g = (PHY_VARS_UE***)malloc(NB_UE_INST*sizeof(PHY_VARS_UE**));
   for (UE_id=0; UE_id<NB_UE_INST;UE_id++){
-    PHY_vars_UE_g[UE_id] = init_lte_UE(*frame_parms, UE_id,abstraction_flag,transmission_mode);
+    PHY_vars_UE_g[UE_id] = (PHY_VARS_UE**) malloc(MAX_NUM_CCs*sizeof(PHY_VARS_UE*));
+    for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
+      PHY_vars_UE_g[UE_id][CC_id] = init_lte_UE(*frame_parms, UE_id,abstraction_flag,transmission_mode);
+      PHY_vars_UE_g[UE_id][CC_id]->Mod_id=UE_id;
+      PHY_vars_UE_g[UE_id][CC_id]->CC_id=CC_id;
+    }
   }
 
   if (NB_RN_INST > 0) {
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index 97d472680f..8aaae67eaa 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -133,8 +133,8 @@ char           smbv_ip[16];
 
 frame_t                frame = 0;
 char                   stats_buffer[16384];
-channel_desc_t        *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
-channel_desc_t        *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX];
+channel_desc_t        *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs];
+channel_desc_t        *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs];
 //Added for PHY abstraction
 node_desc_t           *enb_data[NUMBER_OF_eNB_MAX];
 node_desc_t           *ue_data[NUMBER_OF_UE_MAX];
@@ -413,6 +413,7 @@ l2l1_task_state_t     l2l1_state = L2L1_WAITTING;
 void *l2l1_task(void *args_p) {
   
   clock_t               t;
+  int CC_id;
 
   // Framing variables
   int32_t                   slot, last_slot, next_slot;
@@ -450,16 +451,17 @@ void *l2l1_task(void *args_p) {
   char                  eNB_stats_th_filename[255];
 #endif
 
-  for (eNB_inst=0;eNB_inst<NB_eNB_INST;eNB_inst++) {
-    for (sf=0;sf<10;sf++) {
-      PHY_vars_eNB_g[eNB_inst]->proc[sf].frame_tx = 0;
-      PHY_vars_eNB_g[eNB_inst]->proc[sf].frame_rx = 0;
-      PHY_vars_eNB_g[eNB_inst]->proc[sf].subframe_tx = (sf+1)%10;
-      PHY_vars_eNB_g[eNB_inst]->proc[sf].subframe_rx = (sf+9)%10;
+  for (CC_id = 0;CC_id<MAX_NUM_CCs;CC_id++)
+    for (eNB_inst=0;eNB_inst<NB_eNB_INST;eNB_inst++) {
+      for (sf=0;sf<10;sf++) {
+	PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].frame_tx = 0;
+	PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].frame_rx = 0;
+	PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].subframe_tx = (sf+1)%10;
+	PHY_vars_eNB_g[eNB_inst][CC_id]->proc[sf].subframe_rx = (sf+9)%10;
+      }
+      PHY_vars_eNB_g[eNB_inst][CC_id]->proc[0].frame_rx = 1023;
+      PHY_vars_eNB_g[eNB_inst][CC_id]->proc[9].frame_tx = 1;
     }
-    PHY_vars_eNB_g[eNB_inst]->proc[0].frame_rx = 1023;
-    PHY_vars_eNB_g[eNB_inst]->proc[9].frame_tx = 1;
-  }
 #ifdef XFORMS
   xargv[0] = xname;
   fl_initialize (&xargc, xargv, NULL, 0, 0);
@@ -691,18 +693,18 @@ void *l2l1_task(void *args_p) {
                 clear_eNB_transport_info (oai_emulation.info.nb_enb_local);
 
               for (eNB_inst = oai_emulation.info.first_enb_local; (eNB_inst < (oai_emulation.info.first_enb_local + oai_emulation.info.nb_enb_local)); eNB_inst++) {
-                  if (oai_emulation.info.cli_start_enb[eNB_inst] != 0) {
-                      LOG_D(
-                          EMU,
-                          "PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d) TDD %d/%d Nid_cell %d\n",
-                          eNB_inst,
-                          frame,
-                          slot,
-                          next_slot >> 1,
-                          last_slot>>1,
-                          PHY_vars_eNB_g[eNB_inst]->lte_frame_parms.frame_type,
-                          PHY_vars_eNB_g[eNB_inst]->lte_frame_parms.tdd_config,
-                          PHY_vars_eNB_g[eNB_inst]->lte_frame_parms.Nid_cell);
+		if (oai_emulation.info.cli_start_enb[eNB_inst] != 0) {
+		  LOG_D(
+			EMU,
+			"PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d) TDD %d/%d Nid_cell %d\n",
+			eNB_inst,
+			frame,
+			slot,
+			next_slot >> 1,
+			last_slot>>1,
+			PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.frame_type,
+			PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.tdd_config,
+			PHY_vars_eNB_g[eNB_inst][0]->lte_frame_parms.Nid_cell);
 
 #ifdef OPENAIR2
                       //Appliation: traffic gen
@@ -719,9 +721,9 @@ void *l2l1_task(void *args_p) {
 #ifdef PRINT_STATS
                       if(last_slot==9 && frame%10==0)
                         if(eNB_avg_thr)
-                          fprintf(eNB_avg_thr,"%d %d\n",PHY_vars_eNB_g[eNB_inst]->frame,(PHY_vars_eNB_g[eNB_inst]->total_system_throughput)/((PHY_vars_eNB_g[eNB_inst]->frame+1)*10));
+                          fprintf(eNB_avg_thr,"%d %d\n",PHY_vars_eNB_g[eNB_inst][0]->frame,(PHY_vars_eNB_g[eNB_inst][0]->total_system_throughput)/((PHY_vars_eNB_g[eNB_inst][0]->frame+1)*10));
                       if (eNB_stats[eNB_inst]) {
-                          len = dump_eNB_stats(PHY_vars_eNB_g[eNB_inst], stats_buffer, 0);
+                          len = dump_eNB_stats(PHY_vars_eNB_g[eNB_inst][0], stats_buffer, 0);
                           rewind (eNB_stats[eNB_inst]);
                           fwrite (stats_buffer, 1, len, eNB_stats[eNB_inst]);
                           fflush(eNB_stats[eNB_inst]);
@@ -735,8 +737,9 @@ void *l2l1_task(void *args_p) {
                       }
 #endif
 #endif
-                  }
-              }
+		}
+	      }
+	    	    
               // Call ETHERNET emulation here
               //emu_transport (frame, last_slot, next_slot, direction, oai_emulation.info.frame_type, ethernet_flag);
 
@@ -747,8 +750,8 @@ void *l2l1_task(void *args_p) {
               if ((next_slot % 2) == 0)
                 clear_UE_transport_info (oai_emulation.info.nb_ue_local);
               for (UE_inst = oai_emulation.info.first_ue_local;
-                  (UE_inst < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local)); UE_inst++) {
-                  if (oai_emulation.info.cli_start_ue[UE_inst] != 0) {
+                  (UE_inst < (oai_emulation.info.first_ue_local + oai_emulation.info.nb_ue_local)); UE_inst++) 
+		if (oai_emulation.info.cli_start_ue[UE_inst] != 0) {
 #if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
 
 #else
@@ -762,9 +765,9 @@ void *l2l1_task(void *args_p) {
                               next_slot >> 1,
                               last_slot>>1);
 
-                          if (PHY_vars_UE_g[UE_inst]->UE_mode[0] != NOT_SYNCHED) {
+                          if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) {
                               if (frame > 0) {
-                                  PHY_vars_UE_g[UE_inst]->frame = frame;
+                                  PHY_vars_UE_g[UE_inst][0]->frame = frame;
 
 #ifdef OPENAIR2
                                   //Application
@@ -773,21 +776,22 @@ void *l2l1_task(void *args_p) {
                                   //Access layer
                                   pdcp_run (frame, 0, UE_inst, 0);
 #endif
-
-                                  phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_inst], 0, abstraction_flag, normal_txrx,
-                                      no_relay, NULL);
-                                  ue_data[UE_inst]->tx_power_dBm = PHY_vars_UE_g[UE_inst]->tx_power_dBm;
+				  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+				    phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_inst][CC_id], 0, abstraction_flag, normal_txrx,
+							   no_relay, NULL);
+				  }
+                                  ue_data[UE_inst]->tx_power_dBm = PHY_vars_UE_g[UE_inst][0]->tx_power_dBm;
                               }
                           }
                           else {
                               if (abstraction_flag == 1) {
                                   LOG_E(
                                       EMU,
-                                      "sync not supported in abstraction mode (UE%d,mode%d)\n", UE_inst, PHY_vars_UE_g[UE_inst]->UE_mode[0]);
+                                      "sync not supported in abstraction mode (UE%d,mode%d)\n", UE_inst, PHY_vars_UE_g[UE_inst][0]->UE_mode[0]);
                                   exit (-1);
                               }
                               if ((frame > 0) && (last_slot == (LTE_SLOTS_PER_FRAME - 2))) {
-                                  initial_sync (PHY_vars_UE_g[UE_inst], normal_txrx);
+                                  initial_sync (PHY_vars_UE_g[UE_inst][0], normal_txrx);
 
                                   /*
                    write_output("dlchan00.m","dlch00",&(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),(6*(PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)),1,1);
@@ -807,11 +811,11 @@ void *l2l1_task(void *args_p) {
 #ifdef PRINT_STATS
                           if(last_slot==2 && frame%10==0) {
                               if (UE_stats_th[UE_inst]) {
-                                  fprintf(UE_stats_th[UE_inst],"%d %d\n",frame, PHY_vars_UE_g[UE_inst]->bitrate[0]/1000);
+                                  fprintf(UE_stats_th[UE_inst],"%d %d\n",frame, PHY_vars_UE_g[UE_inst][0]->bitrate[0]/1000);
                               }
                           }
                           if (UE_stats[UE_inst]) {
-                              len = dump_ue_stats (PHY_vars_UE_g[UE_inst], stats_buffer, 0, normal_txrx, 0);
+                              len = dump_ue_stats (PHY_vars_UE_g[UE_inst][0], stats_buffer, 0, normal_txrx, 0);
                               rewind (UE_stats[UE_inst]);
                               fwrite (stats_buffer, 1, len, UE_stats[UE_inst]);
                               fflush(UE_stats[UE_inst]);
@@ -840,21 +844,21 @@ void *l2l1_task(void *args_p) {
                   if ( oai_emulation.info.frame_type == 0) {
                       // RN == UE
                       if (frame>0) {
-                          if (PHY_vars_UE_g[UE_inst]->UE_mode[0] != NOT_SYNCHED) {
+                          if (PHY_vars_UE_g[UE_inst][0]->UE_mode[0] != NOT_SYNCHED) {
                               LOG_D(EMU,"[RN %d] PHY procedures UE %d for frame %d, slot %d (subframe TX %d, RX %d)\n",
                                   RN_id, UE_inst, frame, slot, next_slot >> 1,last_slot>>1);
-                              PHY_vars_UE_g[UE_inst]->frame = frame;
-                              phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_inst], 0, abstraction_flag,normal_txrx,
+                              PHY_vars_UE_g[UE_inst][0]->frame = frame;
+                              phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[UE_inst][0], 0, abstraction_flag,normal_txrx,
                                   r_type, PHY_vars_RN_g[RN_id]);
                           }
                           else if (last_slot == (LTE_SLOTS_PER_FRAME-2)) {
-                              initial_sync(PHY_vars_UE_g[UE_inst],normal_txrx);
+                              initial_sync(PHY_vars_UE_g[UE_inst][0],normal_txrx);
                           }
                       }
                       // RN == eNB
                       LOG_D(EMU,"[RN %d] PHY procedures eNB %d for frame %d, slot %d (subframe TX %d, RX %d)\n",
                           RN_id, eNB_inst, frame, slot, next_slot >> 1,last_slot>>1);
-                      phy_procedures_eNB_lte(slot>>1, PHY_vars_eNB_g[eNB_inst], abstraction_flag,
+                      phy_procedures_eNB_lte(slot>>1, PHY_vars_eNB_g[eNB_inst][0], abstraction_flag,
                           r_type, PHY_vars_RN_g[RN_id]);
                   }
                   else {
@@ -875,14 +879,17 @@ void *l2l1_task(void *args_p) {
            }
            }*/
                   start_meas(&dl_chan_stats);
-		  for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) {
-                      do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst);
-                  }
+		  for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) 
+		    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+		      do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst,CC_id);
+		    }
 		  stop_meas(&dl_chan_stats);
               }
               if ((direction == SF_UL) || (frame_parms->frame_type == 0)) { //if ((subframe<2) || (subframe>4))
                    start_meas(&ul_chan_stats);
-		   do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame); 
+		   for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+		     do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame,CC_id); 
+		   }
 		   stop_meas(&ul_chan_stats);
                   /*
            int ccc;
@@ -905,9 +912,10 @@ void *l2l1_task(void *args_p) {
              }
              }*/ 
 		    start_meas(&dl_chan_stats);
-		    for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) {
-		      do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst);
-		    }
+		    for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) 
+		      for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+			do_DL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, eNB2UE, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, UE_inst,CC_id);
+		      }
 		    stop_meas(&dl_chan_stats);
                       /*
              for (aarx=0;aarx<UE2eNB[1][0]->nb_rx;aarx++)
@@ -918,8 +926,10 @@ void *l2l1_task(void *args_p) {
                   }
                   else { // UL part
 		    start_meas(&ul_chan_stats);
-                      do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame);
-		      stop_meas(&ul_chan_stats);
+		    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+                      do_UL_sig (r_re0, r_im0, r_re, r_im, s_re, s_im, UE2eNB, enb_data, ue_data, next_slot, abstraction_flag,frame_parms, frame,CC_id);
+		    }
+		    stop_meas(&ul_chan_stats);
 
                       /*        int ccc;
              fprintf(SINRpost,"SINRdb For eNB New Subframe : \n ");
@@ -933,15 +943,15 @@ void *l2l1_task(void *args_p) {
               }
               if ((last_slot == 1) && (frame == 0) && (abstraction_flag == 0) && (oai_emulation.info.n_frames == 1)) {
 
-                  write_output ("dlchan0.m", "dlch0", &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),
-                      (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1);
-                  write_output ("dlchan1.m", "dlch1", &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]),
-                      (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1);
-                  write_output ("dlchan2.m", "dlch2", &(PHY_vars_UE_g[0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]),
-                      (6 * (PHY_vars_UE_g[0]->lte_frame_parms.ofdm_symbol_size)), 1, 1);
-                  write_output ("pbch_rxF_comp0.m", "pbch_comp0", PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],
+                  write_output ("dlchan0.m", "dlch0", &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[0][0][0]),
+                      (6 * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), 1, 1);
+                  write_output ("dlchan1.m", "dlch1", &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[1][0][0]),
+                      (6 * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), 1, 1);
+                  write_output ("dlchan2.m", "dlch2", &(PHY_vars_UE_g[0][0]->lte_ue_common_vars.dl_ch_estimates[2][0][0]),
+                      (6 * (PHY_vars_UE_g[0][0]->lte_frame_parms.ofdm_symbol_size)), 1, 1);
+                  write_output ("pbch_rxF_comp0.m", "pbch_comp0", PHY_vars_UE_g[0][0]->lte_ue_pbch_vars[0]->rxdataF_comp[0],
                       6 * 12 * 4, 1, 1);
-                  write_output ("pbch_rxF_llr.m", "pbch_llr", PHY_vars_UE_g[0]->lte_ue_pbch_vars[0]->llr,
+                  write_output ("pbch_rxF_llr.m", "pbch_llr", PHY_vars_UE_g[0][0]->lte_ue_pbch_vars[0]->llr,
                       (frame_parms->Ncp == 0) ? 1920 : 1728, 1, 4);
               }
               /*
@@ -959,20 +969,20 @@ void *l2l1_task(void *args_p) {
           &&(Channel_Flag==0)
 #endif
       ) {
-          write_output ("UEtxsig0.m", "txs0", PHY_vars_UE_g[0]->lte_ue_common_vars.txdata[0], FRAME_LENGTH_COMPLEX_SAMPLES,
+          write_output ("UEtxsig0.m", "txs0", PHY_vars_UE_g[0][0]->lte_ue_common_vars.txdata[0], FRAME_LENGTH_COMPLEX_SAMPLES,
               1, 1);
           sprintf (fname, "eNBtxsig%d.m", frame);
           sprintf (vname, "txs%d", frame);
-          write_output (fname, vname, PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES, 1,
+          write_output (fname, vname, PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdata[0][0], FRAME_LENGTH_COMPLEX_SAMPLES, 1,
               1);
           write_output (
-              "eNBtxsigF0.m", "txsF0", PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdataF[0][0],
-              PHY_vars_eNB_g[0]->lte_frame_parms.symbols_per_tti * PHY_vars_eNB_g[0]->lte_frame_parms.ofdm_symbol_size, 1,
+              "eNBtxsigF0.m", "txsF0", PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.txdataF[0][0],
+              PHY_vars_eNB_g[0][0]->lte_frame_parms.symbols_per_tti * PHY_vars_eNB_g[0][0]->lte_frame_parms.ofdm_symbol_size, 1,
               1);
 
-          write_output ("UErxsig0.m", "rxs0", PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[0], FRAME_LENGTH_COMPLEX_SAMPLES,
+          write_output ("UErxsig0.m", "rxs0", PHY_vars_UE_g[0][0]->lte_ue_common_vars.rxdata[0], FRAME_LENGTH_COMPLEX_SAMPLES,
               1, 1);
-          write_output ("eNBrxsig0.m", "rxs0", PHY_vars_eNB_g[0]->lte_eNB_common_vars.rxdata[0][0],
+          write_output ("eNBrxsig0.m", "rxs0", PHY_vars_eNB_g[0][0]->lte_eNB_common_vars.rxdata[0][0],
               FRAME_LENGTH_COMPLEX_SAMPLES, 1, 1);
       }
 
@@ -980,13 +990,13 @@ void *l2l1_task(void *args_p) {
       eNB_inst = 0;
       for (UE_inst = 0; UE_inst < NB_UE_INST; UE_inst++) {
           phy_scope_UE(form_ue[UE_inst],
-              PHY_vars_UE_g[UE_inst],
+              PHY_vars_UE_g[UE_inst][0],
               eNB_inst,
               UE_inst,
               7);
 
           phy_scope_eNB(form_enb[UE_inst],
-              PHY_vars_eNB_g[eNB_inst],
+              PHY_vars_eNB_g[eNB_inst][0],
               UE_inst);
 
       }
@@ -998,7 +1008,7 @@ void *l2l1_task(void *args_p) {
       }
 #endif
       stop_meas(&oaisim_stats_f);
-  } //end of frame
+      //end of frame
 
   stop_meas(&oaisim_stats);
 
@@ -1126,7 +1136,7 @@ int main(int argc, char **argv) {
 
 #ifdef SMBV
   smbv_init_config(smbv_fname, smbv_nframes);
-  smbv_write_config_from_frame_parms(smbv_fname, &PHY_vars_eNB_g[0]->lte_frame_parms);
+  smbv_write_config_from_frame_parms(smbv_fname, &PHY_vars_eNB_g[0][0]->lte_frame_parms);
 #endif
   // add events to future event list: Currently not used
 	//oai_emulation.info.oeh_enabled = 1;
@@ -1182,39 +1192,39 @@ void reset_opp_meas(void){
   reset_meas(&ul_chan_stats);
   
   for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
-    reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc);
-    reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc_rx);
-    reset_meas(&PHY_vars_UE_g[UE_id]->phy_proc_tx);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->phy_proc);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->phy_proc_rx);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->phy_proc_tx);
     
-    reset_meas(&PHY_vars_UE_g[UE_id]->ofdm_demod_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->rx_dft_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_channel_estimation_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_freq_offset_estimation_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_decoding_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_rate_unmatching_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_turbo_decoding_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_deinterleaving_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_llr_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_unscrambling_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ofdm_demod_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->rx_dft_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_channel_estimation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_freq_offset_estimation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_rate_unmatching_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_turbo_decoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_deinterleaving_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_llr_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_unscrambling_stats);
     
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_init_stats);    
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_alpha_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_beta_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_gamma_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_ext_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl1_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl2_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_init_stats);    
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_alpha_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_beta_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_gamma_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_ext_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_intl1_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_intl2_stats);
     
-    reset_meas(&PHY_vars_UE_g[UE_id]->tx_prach);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->tx_prach);
     
-    reset_meas(&PHY_vars_UE_g[UE_id]->ofdm_mod_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_encoding_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_modulation_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_segmentation_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_rate_matching_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_turbo_encoding_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_interleaving_stats);
-    reset_meas(&PHY_vars_UE_g[UE_id]->ulsch_multiplexing_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ofdm_mod_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_encoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_modulation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_segmentation_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_rate_matching_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_turbo_encoding_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_interleaving_stats);
+    reset_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_multiplexing_stats);
     /*
      * L2 functions
      */ 
@@ -1236,46 +1246,46 @@ void reset_opp_meas(void){
     reset_meas(&UE_pdcp_stats[UE_id].ip_pdcp);
     
     for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_rx);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_tx);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->rx_prach);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->phy_proc);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->phy_proc_rx);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->phy_proc_tx);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->rx_prach);
     
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_encoding_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_modulation_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_scrambling_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_rate_matching_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_turbo_encoding_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_interleaving_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ofdm_mod_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_encoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_modulation_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_scrambling_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_rate_matching_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_turbo_encoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_interleaving_stats);
     
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_demod_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ofdm_demod_stats);
       //reset_meas(&PHY_vars_eNB_g[eNB_id]->rx_dft_stats);
       //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_channel_estimation_stats);
       //reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_freq_offset_estimation_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_decoding_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demodulation_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_rate_unmatching_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_turbo_decoding_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_deinterleaving_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demultiplexing_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_llr_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_init_stats);    
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_alpha_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_beta_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_gamma_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_ext_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl1_stats);
-      reset_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl2_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_decoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_demodulation_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_rate_unmatching_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_turbo_decoding_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_deinterleaving_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_demultiplexing_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_llr_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_init_stats);    
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_alpha_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_beta_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_gamma_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_ext_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl1_stats);
+      reset_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl2_stats);
     
-      reset_meas(&eNB2UE[eNB_id][UE_id]->random_channel);
-      reset_meas(&eNB2UE[eNB_id][UE_id]->interp_time);
-      reset_meas(&eNB2UE[eNB_id][UE_id]->interp_freq);
-      reset_meas(&eNB2UE[eNB_id][UE_id]->convolution);
-      reset_meas(&UE2eNB[UE_id][eNB_id]->random_channel);
-      reset_meas(&UE2eNB[UE_id][eNB_id]->interp_time);
-      reset_meas(&UE2eNB[UE_id][eNB_id]->interp_freq);
-      reset_meas(&UE2eNB[UE_id][eNB_id]->convolution);
+      reset_meas(&eNB2UE[eNB_id][UE_id][0]->random_channel);
+      reset_meas(&eNB2UE[eNB_id][UE_id][0]->interp_time);
+      reset_meas(&eNB2UE[eNB_id][UE_id][0]->interp_freq);
+      reset_meas(&eNB2UE[eNB_id][UE_id][0]->convolution);
+      reset_meas(&UE2eNB[UE_id][eNB_id][0]->random_channel);
+      reset_meas(&UE2eNB[UE_id][eNB_id][0]->interp_time);
+      reset_meas(&UE2eNB[UE_id][eNB_id][0]->interp_freq);
+      reset_meas(&UE2eNB[UE_id][eNB_id][0]->convolution);
       /* 
        * L2 functions 
        */
@@ -1313,85 +1323,85 @@ void print_opp_meas(void){
   
   for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
     for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
-      print_meas(&eNB2UE[eNB_id][UE_id]->random_channel,"[DL][random_channel]",&oaisim_stats,&oaisim_stats_f);
-      print_meas(&eNB2UE[eNB_id][UE_id]->interp_time,"[DL][interp_time]",&oaisim_stats,&oaisim_stats_f);
-      print_meas(&eNB2UE[eNB_id][UE_id]->interp_freq,"[DL][interp_freq]",&oaisim_stats,&oaisim_stats_f);
-      print_meas(&eNB2UE[eNB_id][UE_id]->convolution,"[DL][convolution]",&oaisim_stats,&oaisim_stats_f);
-
-      print_meas(&UE2eNB[UE_id][eNB_id]->random_channel,"[UL][random_channel]",&oaisim_stats,&oaisim_stats_f);
-      print_meas(&UE2eNB[UE_id][eNB_id]->interp_time,"[UL][interp_time]",&oaisim_stats,&oaisim_stats_f);
-      print_meas(&UE2eNB[UE_id][eNB_id]->interp_freq,"[UL][interp_freq]",&oaisim_stats,&oaisim_stats_f);
-      print_meas(&UE2eNB[UE_id][eNB_id]->convolution,"[UL][convolution]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&eNB2UE[eNB_id][UE_id][0]->random_channel,"[DL][random_channel]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&eNB2UE[eNB_id][UE_id][0]->interp_time,"[DL][interp_time]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&eNB2UE[eNB_id][UE_id][0]->interp_freq,"[DL][interp_freq]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&eNB2UE[eNB_id][UE_id][0]->convolution,"[DL][convolution]",&oaisim_stats,&oaisim_stats_f);
+
+      print_meas(&UE2eNB[UE_id][eNB_id][0]->random_channel,"[UL][random_channel]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&UE2eNB[UE_id][eNB_id][0]->interp_time,"[UL][interp_time]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&UE2eNB[UE_id][eNB_id][0]->interp_freq,"[UL][interp_freq]",&oaisim_stats,&oaisim_stats_f);
+      print_meas(&UE2eNB[UE_id][eNB_id][0]->convolution,"[UL][convolution]",&oaisim_stats,&oaisim_stats_f);
     }
   }
 
   for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
-    print_meas(&PHY_vars_UE_g[UE_id]->phy_proc,"[UE][total_phy_proc]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->phy_proc,"[UE][total_phy_proc]",&oaisim_stats,&oaisim_stats_f);
     
-    print_meas(&PHY_vars_UE_g[UE_id]->phy_proc_rx,"[UE][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ofdm_demod_stats,"[UE][ofdm_demod]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->rx_dft_stats,"[UE][rx_dft]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_channel_estimation_stats,"[UE][channel_est]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_freq_offset_estimation_stats,"[UE][freq_offset]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_llr_stats,"[UE][llr]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_unscrambling_stats,"[UE][unscrambling]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_decoding_stats,"[UE][decoding]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_rate_unmatching_stats,"[UE][rate_unmatching]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_deinterleaving_stats,"[UE][deinterleaving]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_turbo_decoding_stats,"[UE][turbo_decoding]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_init_stats,"[UE][ |_tc_init]",&oaisim_stats,&oaisim_stats_f);    
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_alpha_stats,"[UE][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_beta_stats,"[UE][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_gamma_stats,"[UE][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_ext_stats,"[UE][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl1_stats,"[UE][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->dlsch_tc_intl2_stats,"[UE][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->phy_proc_rx,"[UE][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ofdm_demod_stats,"[UE][ofdm_demod]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->rx_dft_stats,"[UE][rx_dft]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_channel_estimation_stats,"[UE][channel_est]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_freq_offset_estimation_stats,"[UE][freq_offset]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_llr_stats,"[UE][llr]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_unscrambling_stats,"[UE][unscrambling]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_decoding_stats,"[UE][decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_rate_unmatching_stats,"[UE][rate_unmatching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_deinterleaving_stats,"[UE][deinterleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_turbo_decoding_stats,"[UE][turbo_decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_init_stats,"[UE][ |_tc_init]",&oaisim_stats,&oaisim_stats_f);    
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_alpha_stats,"[UE][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_beta_stats,"[UE][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_gamma_stats,"[UE][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_ext_stats,"[UE][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_intl1_stats,"[UE][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->dlsch_tc_intl2_stats,"[UE][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f);
     
-    print_meas(&PHY_vars_UE_g[UE_id]->phy_proc_tx,"[UE][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ofdm_mod_stats,"[UE][ofdm_mod]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_modulation_stats,"[UE][modulation]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_encoding_stats,"[UE][encoding]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_segmentation_stats,"[UE][segmentation]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_rate_matching_stats,"[UE][rate_matching]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_turbo_encoding_stats,"[UE][turbo_encoding]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_interleaving_stats,"[UE][interleaving]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_UE_g[UE_id]->ulsch_multiplexing_stats,"[UE][multiplexing]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->phy_proc_tx,"[UE][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ofdm_mod_stats,"[UE][ofdm_mod]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_modulation_stats,"[UE][modulation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_encoding_stats,"[UE][encoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_segmentation_stats,"[UE][segmentation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_rate_matching_stats,"[UE][rate_matching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_turbo_encoding_stats,"[UE][turbo_encoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_interleaving_stats,"[UE][interleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_UE_g[UE_id][0]->ulsch_multiplexing_stats,"[UE][multiplexing]",&oaisim_stats,&oaisim_stats_f);
 
   }
   
   for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
-    print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc,"[eNB][total_phy_proc]",&oaisim_stats,&oaisim_stats_f);
-
-    print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_tx,"[eNB][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_mod_stats,"[eNB][ofdm_mod]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_modulation_stats,"[eNB][modulation]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_scrambling_stats,"[eNB][scrambling]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_encoding_stats,"[eNB][encoding]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_interleaving_stats,"[eNB][|_interleaving]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_rate_matching_stats,"[eNB][|_rate_matching]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->dlsch_turbo_encoding_stats,"[eNB][|_turbo_encoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->phy_proc,"[eNB][total_phy_proc]",&oaisim_stats,&oaisim_stats_f);
+
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->phy_proc_tx,"[eNB][total_phy_proc_tx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ofdm_mod_stats,"[eNB][ofdm_mod]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_modulation_stats,"[eNB][modulation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_scrambling_stats,"[eNB][scrambling]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_encoding_stats,"[eNB][encoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_interleaving_stats,"[eNB][|_interleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_rate_matching_stats,"[eNB][|_rate_matching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->dlsch_turbo_encoding_stats,"[eNB][|_turbo_encoding]",&oaisim_stats,&oaisim_stats_f);
     
     
-    print_meas(&PHY_vars_eNB_g[eNB_id]->phy_proc_rx,"[eNB][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ofdm_demod_stats,"[eNB][ofdm_demod]",&oaisim_stats,&oaisim_stats_f);
-    //print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_channel_estimation_stats,"[eNB][channel_est]");
-    //print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_freq_offset_estimation_stats,"[eNB][freq_offset]");
-    //print_meas(&PHY_vars_eNB_g[eNB_id]->rx_dft_stats,"[eNB][rx_dft]");
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demodulation_stats,"[eNB][demodulation]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_decoding_stats,"[eNB][decoding]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_deinterleaving_stats,"[eNB][|_deinterleaving]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_demultiplexing_stats,"[eNB][|_demultiplexing]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_rate_unmatching_stats,"[eNB][|_rate_unmatching]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_turbo_decoding_stats,"[eNB][|_turbo_decoding]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_init_stats,"[eNB][ |_tc_init]",&oaisim_stats,&oaisim_stats_f);    
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_alpha_stats,"[eNB][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_beta_stats,"[eNB][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_gamma_stats,"[eNB][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_ext_stats,"[eNB][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl1_stats,"[eNB][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f);
-    print_meas(&PHY_vars_eNB_g[eNB_id]->ulsch_tc_intl2_stats,"[eNB][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->phy_proc_rx,"[eNB][total_phy_proc_rx]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ofdm_demod_stats,"[eNB][ofdm_demod]",&oaisim_stats,&oaisim_stats_f);
+    //print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_channel_estimation_stats,"[eNB][channel_est]");
+    //print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_freq_offset_estimation_stats,"[eNB][freq_offset]");
+    //print_meas(&PHY_vars_eNB_g[eNB_id][0]->rx_dft_stats,"[eNB][rx_dft]");
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_demodulation_stats,"[eNB][demodulation]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_decoding_stats,"[eNB][decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_deinterleaving_stats,"[eNB][|_deinterleaving]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_demultiplexing_stats,"[eNB][|_demultiplexing]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_rate_unmatching_stats,"[eNB][|_rate_unmatching]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_turbo_decoding_stats,"[eNB][|_turbo_decoding]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_init_stats,"[eNB][ |_tc_init]",&oaisim_stats,&oaisim_stats_f);    
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_alpha_stats,"[eNB][ |_tc_alpha]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_beta_stats,"[eNB][ |_tc_beta]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_gamma_stats,"[eNB][ |_tc_gamma]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_ext_stats,"[eNB][ |_tc_ext]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl1_stats,"[eNB][ |_tc_intl1]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->ulsch_tc_intl2_stats,"[eNB][ |_tc_intl2]",&oaisim_stats,&oaisim_stats_f);
     
-    print_meas(&PHY_vars_eNB_g[eNB_id]->rx_prach,"[eNB][rx_prach]",&oaisim_stats,&oaisim_stats_f);
+    print_meas(&PHY_vars_eNB_g[eNB_id][0]->rx_prach,"[eNB][rx_prach]",&oaisim_stats,&oaisim_stats_f);
 
   }
 
diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h
index cf3a6e78ef..d36ed7022d 100644
--- a/targets/SIMU/USER/oaisim.h
+++ b/targets/SIMU/USER/oaisim.h
@@ -21,9 +21,9 @@ eNB_MAC_INST* get_eNB_mac_inst(void);
 OAI_Emulation* get_OAI_emulation(void);
 void init_channel_vars(LTE_DL_FRAME_PARMS *frame_parms, double ***s_re,double ***s_im,double ***r_re,double ***r_im,double ***r_re0,double ***r_im0);
 
-void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t);
+void do_UL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms, uint32_t,uint8_t);
 
-void do_DL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id);
+void do_DL_sig(double **r_re0,double **r_im0,double **r_re,double **r_im,double **s_re,double **s_im,channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs],node_desc_t *enb_data[NUMBER_OF_eNB_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t next_slot,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id);
 
 void init_ue(node_desc_t  *ue_data, UE_Antenna ue_ant);//Abstraction changes
 void init_enb(node_desc_t  *enb_data, eNB_Antenna enb_ant);//Abstraction changes
diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c
index d75f87e80a..36583e067f 100644
--- a/targets/SIMU/USER/oaisim_functions.c
+++ b/targets/SIMU/USER/oaisim_functions.c
@@ -146,8 +146,8 @@ Packet_OTG_List_t *otg_pdcp_buffer = NULL;
 
 extern node_desc_t *enb_data[NUMBER_OF_eNB_MAX];
 extern node_desc_t *ue_data[NUMBER_OF_UE_MAX];
-extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX];
-extern channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX];
+extern channel_desc_t *eNB2UE[NUMBER_OF_eNB_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs];
+extern channel_desc_t *UE2eNB[NUMBER_OF_UE_MAX][NUMBER_OF_eNB_MAX][MAX_NUM_CCs];
 
 extern mapping small_scale_names[];
 #if defined(Rel10)
@@ -803,6 +803,7 @@ void init_seed(uint8_t set_seed) {
 
 void init_openair1(void) {
   module_id_t UE_id, eNB_id;
+  uint8_t CC_id;
 #if defined(ENABLE_RAL)
   int list_index;
 #endif
@@ -811,22 +812,23 @@ void init_openair1(void) {
 
   for (eNB_id=0; eNB_id<NB_eNB_INST;eNB_id++){
       for (UE_id=0; UE_id<NB_UE_INST;UE_id++){
-          PHY_vars_eNB_g[eNB_id]->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK;
-          PHY_vars_eNB_g[eNB_id]->pusch_config_dedicated[UE_id].betaOffset_RI_Index  = beta_RI;
-          PHY_vars_eNB_g[eNB_id]->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI;
-          PHY_vars_UE_g[UE_id]->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK;
-          PHY_vars_UE_g[UE_id]->pusch_config_dedicated[eNB_id].betaOffset_RI_Index  = beta_RI;
-          PHY_vars_UE_g[UE_id]->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI;
-          ((PHY_vars_UE_g[UE_id]->lte_frame_parms).pdsch_config_common).p_b = (frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
-          ((PHY_vars_eNB_g[eNB_id]->lte_frame_parms).pdsch_config_common).p_b = (frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
-
+	for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+          PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_ACK_Index = beta_ACK;
+          PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_RI_Index  = beta_RI;
+          PHY_vars_eNB_g[eNB_id][CC_id]->pusch_config_dedicated[UE_id].betaOffset_CQI_Index = beta_CQI;
+          ((PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms).pdsch_config_common).p_b = (frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
+	}
+	PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_ACK_Index = beta_ACK;
+	PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_RI_Index  = beta_RI;
+	PHY_vars_UE_g[UE_id][CC_id]->pusch_config_dedicated[eNB_id].betaOffset_CQI_Index = beta_CQI;
+	((PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms).pdsch_config_common).p_b = (frame_parms->nb_antennas_tx_eNB>1) ? 1 : 0; // rho_a = rhob
       }
   }
 
-  printf ("AFTER init: Nid_cell %d\n", PHY_vars_eNB_g[0]->lte_frame_parms.Nid_cell);
+  printf ("AFTER init: Nid_cell %d\n", PHY_vars_eNB_g[0][0]->lte_frame_parms.Nid_cell);
   printf ("AFTER init: frame_type %d,tdd_config %d\n",
-      PHY_vars_eNB_g[0]->lte_frame_parms.frame_type,
-      PHY_vars_eNB_g[0]->lte_frame_parms.tdd_config);
+      PHY_vars_eNB_g[0][0]->lte_frame_parms.frame_type,
+      PHY_vars_eNB_g[0][0]->lte_frame_parms.tdd_config);
 
   number_of_cards = 1;
 
@@ -844,26 +846,27 @@ void init_openair1(void) {
   openair_daq_vars.use_ia_receiver = 0;
 
   // init_ue_status();
-  for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
-      PHY_vars_UE_g[UE_id]->rx_total_gain_dB=130;
+  for (UE_id=0; UE_id<NB_UE_INST;UE_id++) 
+    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++){
+      PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB=130;
       // update UE_mode for each eNB_id not just 0
       if (abstraction_flag == 0)
-        PHY_vars_UE_g[UE_id]->UE_mode[0] = NOT_SYNCHED;
+        PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] = NOT_SYNCHED;
       else {
           // 0 is the index of the connected eNB
-          PHY_vars_UE_g[UE_id]->UE_mode[0] = PRACH;
+          PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] = PRACH;
       }
-      PHY_vars_UE_g[UE_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235 + UE_id;
-      PHY_vars_UE_g[UE_id]->current_dlsch_cqi[0] = 10;
+      PHY_vars_UE_g[UE_id][CC_id]->lte_ue_pdcch_vars[0]->crnti = 0x1235 + UE_id;
+      PHY_vars_UE_g[UE_id][CC_id]->current_dlsch_cqi[0] = 10;
 
-      LOG_I(EMU, "UE %d mode is initialized to %d\n", UE_id, PHY_vars_UE_g[UE_id]->UE_mode[0] );
+      LOG_I(EMU, "UE %d mode is initialized to %d\n", UE_id, PHY_vars_UE_g[UE_id][CC_id]->UE_mode[0] );
 #if defined(ENABLE_RAL)
-      PHY_vars_UE_g[UE_id]->ral_thresholds_timed = hashtable_create (64, NULL, NULL);
+      PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_timed = hashtable_create (64, NULL, NULL);
       for (list_index = 0; list_index < RAL_LINK_PARAM_GEN_MAX; list_index++) {
-          SLIST_INIT(&PHY_vars_UE_g[UE_id]->ral_thresholds_gen_polled[list_index]);
+          SLIST_INIT(&PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_gen_polled[list_index]);
       }
       for (list_index = 0; list_index < RAL_LINK_PARAM_LTE_MAX; list_index++) {
-          SLIST_INIT(&PHY_vars_UE_g[UE_id]->ral_thresholds_lte_polled[list_index]);
+          SLIST_INIT(&PHY_vars_UE_g[UE_id][CC_id]->ral_thresholds_lte_polled[list_index]);
       }
 #endif
 
@@ -874,12 +877,14 @@ void init_openair2(void) {
 #ifdef OPENAIR2
   module_id_t enb_id;
   module_id_t UE_id;
+  int CC_id;
 
-  l2_init (&PHY_vars_eNB_g[0]->lte_frame_parms,
-      oai_emulation.info.eMBMS_active_state,
-      oai_emulation.info.cba_group_active,
-      oai_emulation.info.handover_active);
-
+  for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++)
+    l2_init (&PHY_vars_eNB_g[0][CC_id]->lte_frame_parms,
+	     oai_emulation.info.eMBMS_active_state,
+	     oai_emulation.info.cba_group_active,
+	     oai_emulation.info.handover_active);
+  
   for (enb_id = 0; enb_id < NB_eNB_INST; enb_id++)
     mac_xface->mrbch_phy_sync_failure (enb_id, 0, enb_id);
 
@@ -895,6 +900,7 @@ void init_openair2(void) {
 
 void init_ocm(void) {
   module_id_t UE_id, eNB_id;
+  int CC_id;
   /* Added for PHY abstraction */
   LOG_I(OCM,"Running with frame_type %d, Nid_cell %d, N_RB_DL %d, EP %d, mode %d, target dl_mcs %d, rate adaptation %d, nframes %d, abstraction %d, channel %s\n", oai_emulation.info.frame_type, Nid_cell, oai_emulation.info.N_RB_DL, oai_emulation.info.extended_prefix_flag, oai_emulation.info.transmission_mode,target_dl_mcs,rate_adaptation_flag,oai_emulation.info.n_frames,abstraction_flag,oai_emulation.environment_system_config.fading.small_scale.selected_option);
 
@@ -940,9 +946,9 @@ void init_ocm(void) {
 
   // initialize channel descriptors
   for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
-      for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
-
-          LOG_D(OCM,"Initializing channel (%s, %d) from eNB %d to UE %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
+    for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
+      for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
+	LOG_D(OCM,"Initializing channel (%s, %d) from eNB %d to UE %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
               map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option), eNB_id, UE_id);
 
           /* if (oai_emulation.info.transmission_mode == 5)
@@ -957,29 +963,30 @@ void init_ocm(void) {
                 else
            */
 
-          eNB2UE[eNB_id][UE_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_tx,
-              PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_rx,
-              map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option),
-              oai_emulation.environment_system_config.system_bandwidth_MB,
-              forgetting_factor,
-              0,
-              0);
-          random_channel(eNB2UE[eNB_id][UE_id],abstraction_flag);
-          LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
+	eNB2UE[eNB_id][UE_id][CC_id] = new_channel_desc_scm(PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_tx,
+							    PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_rx,
+							    map_str_to_int(small_scale_names,oai_emulation.environment_system_config.fading.small_scale.selected_option),
+							    oai_emulation.environment_system_config.system_bandwidth_MB,
+							    forgetting_factor,
+							    0,
+							    0);
+	random_channel(eNB2UE[eNB_id][UE_id][CC_id],abstraction_flag);
+	LOG_D(OCM,"[SIM] Initializing channel (%s, %d) from UE %d to eNB %d\n", oai_emulation.environment_system_config.fading.small_scale.selected_option,
               map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),UE_id, eNB_id);
-
-          UE2eNB[UE_id][eNB_id] = new_channel_desc_scm(PHY_vars_UE_g[UE_id]->lte_frame_parms.nb_antennas_tx,
-              PHY_vars_eNB_g[eNB_id]->lte_frame_parms.nb_antennas_rx,
-              map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),
-              oai_emulation.environment_system_config.system_bandwidth_MB,
-              forgetting_factor,
-              0,
-              0);
-
-      random_channel(UE2eNB[UE_id][eNB_id],abstraction_flag);
+	
+	UE2eNB[UE_id][eNB_id][CC_id] = new_channel_desc_scm(PHY_vars_UE_g[UE_id][CC_id]->lte_frame_parms.nb_antennas_tx,
+							    PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.nb_antennas_rx,
+							    map_str_to_int(small_scale_names, oai_emulation.environment_system_config.fading.small_scale.selected_option),
+							    oai_emulation.environment_system_config.system_bandwidth_MB,
+							    forgetting_factor,
+							    0,
+							    0);
+	
+	random_channel(UE2eNB[UE_id][eNB_id][CC_id],abstraction_flag);
 
       // to make channel reciprocal uncomment following line instead of previous. However this only works for SISO at the moment. For MIMO the channel would need to be transposed.
       //UE2eNB[UE_id][eNB_id] = eNB2UE[eNB_id][UE_id];
+      }
     }
   }
 }
@@ -1031,10 +1038,13 @@ void update_omg_ocm() {
 
 void update_ocm() {
   module_id_t UE_id, eNB_id;
+  int CC_id;
+
   for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++)
-    enb_data[eNB_id]->tx_power_dBm = PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
+    enb_data[eNB_id]->tx_power_dBm = PHY_vars_eNB_g[eNB_id][0]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
   for (UE_id = 0; UE_id < NB_UE_INST; UE_id++)
-    ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id]->tx_power_dBm;
+    ue_data[UE_id]->tx_power_dBm = PHY_vars_UE_g[UE_id][0]->tx_power_dBm;
+  
 
   /* check if the openair channel model is activated used for PHY abstraction : path loss*/
   if ((oai_emulation.info.ocm_enabled == 1)&& (ethernet_flag == 0 )) {
@@ -1045,42 +1055,47 @@ void update_ocm() {
       //extract_position_fixed_enb(enb_data, NB_eNB_INST,frame);
       //LOG_D(OMG," extracting position of UE...\n");
       //      if (oai_emulation.info.omg_model_ue == TRACE)
-      extract_position(ue_node_list, ue_data, NB_UE_INST);
-
-      /* if (frame % 50 == 0)
-      LOG_N(OCM,"Path loss for TTI %d : \n", frame);
-       */
+    extract_position(ue_node_list, ue_data, NB_UE_INST);
+    
+    /* if (frame % 50 == 0)
+       LOG_N(OCM,"Path loss for TTI %d : \n", frame);
+    */
+    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
       for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
-          for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
-              calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id], oai_emulation.environment_system_config,ShaF);
-              //calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id], oai_emulation.environment_system_config,0);
-              UE2eNB[UE_id][eNB_id]->path_loss_dB = eNB2UE[eNB_id][UE_id]->path_loss_dB;
-              //    if (frame % 50 == 0)
-              LOG_I(OCM,"Path loss between eNB %d at (%f,%f) and UE %d at (%f,%f) is %f, angle %f\n",
-                  eNB_id,enb_data[eNB_id]->x,enb_data[eNB_id]->y,UE_id,ue_data[UE_id]->x,ue_data[UE_id]->y,
-                  eNB2UE[eNB_id][UE_id]->path_loss_dB, eNB2UE[eNB_id][UE_id]->aoa);
-          }
+	for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
+	  calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id][CC_id], oai_emulation.environment_system_config,ShaF);
+	  //calc_path_loss (enb_data[eNB_id], ue_data[UE_id], eNB2UE[eNB_id][UE_id], oai_emulation.environment_system_config,0);
+	  UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB;
+	  //    if (frame % 50 == 0)
+	  LOG_I(OCM,"Path loss (CCid %d) between eNB %d at (%f,%f) and UE %d at (%f,%f) is %f, angle %f\n",
+		CC_id,eNB_id,enb_data[eNB_id]->x,enb_data[eNB_id]->y,UE_id,ue_data[UE_id]->x,ue_data[UE_id]->y,
+		eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB, eNB2UE[eNB_id][UE_id][CC_id]->aoa);
+	}
       }
-  }
+    }
+  }  
 
   else {
+    for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
       for (eNB_id = 0; eNB_id < NB_eNB_INST; eNB_id++) {
-          for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
-
-              //UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB;
-              if (eNB_id == (UE_id % NB_eNB_INST)) {
-                  eNB2UE[eNB_id][UE_id]->path_loss_dB = -105 + snr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
-                  UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; //+20 to offset the difference in tx power of the UE wrt eNB
-              }
-              else {
-                  eNB2UE[eNB_id][UE_id]->path_loss_dB = -105 + sinr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
-                  UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + sinr_dB - PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
-              }
-              LOG_I(OCM,"Path loss from eNB %d to UE %d => %f dB (eNB TX %d)\n",eNB_id,UE_id,eNB2UE[eNB_id][UE_id]->path_loss_dB,
-                  PHY_vars_eNB_g[eNB_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower);
-              //      printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB);
-          }
+	for (UE_id = 0; UE_id < NB_UE_INST; UE_id++) {
+	  
+	  //UE2eNB[UE_id][eNB_id]->path_loss_dB = -105 + snr_dB;
+	  if (eNB_id == (UE_id % NB_eNB_INST)) {
+	    eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -105 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
+	    UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -105 + snr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower; //+20 to offset the difference in tx power of the UE wrt eNB
+	  }
+	  else {
+	    eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB = -105 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
+	    UE2eNB[UE_id][eNB_id][CC_id]->path_loss_dB = -105 + sinr_dB - PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower;
+	  }
+	  LOG_I(OCM,"Path loss from eNB %d to UE %d (CCid %d)=> %f dB (eNB TX %d)\n",eNB_id,UE_id,CC_id,
+		eNB2UE[eNB_id][UE_id][CC_id]->path_loss_dB,
+		PHY_vars_eNB_g[eNB_id][CC_id]->lte_frame_parms.pdsch_config_common.referenceSignalPower);
+	  //      printf("[SIM] Path loss from UE %d to eNB %d => %f dB\n",UE_id,eNB_id,UE2eNB[UE_id][eNB_id]->path_loss_dB);
+	}
       }
+    }
   }
 }
 
-- 
GitLab