diff --git a/openair1/PHY/LTE_TRANSPORT/defs.h b/openair1/PHY/LTE_TRANSPORT/defs.h
index ff137b7f16656f4efaf079edfe6130e1057776b8..f22f127b8603d34930ecf87b6abf7cb78efff07a 100644
--- a/openair1/PHY/LTE_TRANSPORT/defs.h
+++ b/openair1/PHY/LTE_TRANSPORT/defs.h
@@ -42,6 +42,7 @@
 #include "PHY/defs.h"
 #include "dci.h"
 #include "uci.h"
+#include "UTIL/LISTS/list.h"
 
 #define MOD_TABLE_QPSK_OFFSET 1
 #define MOD_TABLE_16QAM_OFFSET 5
@@ -470,6 +471,14 @@ typedef struct {
   uint8_t num_active_cba_groups;
   /// allocated CBA RNTI for this ulsch
   uint16_t cba_rnti[4];//NUM_MAX_CBA_GROUP];
+#ifdef LOCALIZATION
+  /// epoch timestamp in millisecond
+  int32_t reference_timestamp_ms;
+  /// aggregate physical states every n millisecond
+  int32_t aggregation_period_ms; 
+  /// a set of lists used for localization
+  struct list loc_rss_list, loc_rssi_list, loc_subcarrier_rss_list, loc_timing_advance_list, loc_timing_update_list;
+#endif 
 } LTE_eNB_ULSCH_t;
 
 typedef struct {
@@ -531,6 +540,12 @@ typedef struct {
   uint8_t dl_power_off;
 } LTE_DL_UE_HARQ_t;
 
+typedef struct {
+    /// time-based localization, relying on TA and TOA
+    double time_based;
+    /// power-based localization, relying on RSS and RSSI
+    double power_based;
+} eNB_UE_estimated_distances;
 
 typedef struct {
   /// UL RSSI per receive antenna
@@ -555,7 +570,7 @@ typedef struct {
   UE_MODE_t mode;
   /// Current sector where UE is attached
   uint8_t sector;
-
+  
   /// dlsch l2 errors
   uint32_t dlsch_l2_errors[8];
   /// dlsch trials per harq and round 
@@ -595,6 +610,10 @@ typedef struct {
   /// Bitrate on the PDSCH [bps]
   unsigned int dlsch_bitrate;
   //  unsigned int total_transmitted_bits;
+#ifdef LOCALIZATION
+  eNB_UE_estimated_distances distance;
+  int32_t *subcarrier_rssi;
+#endif
 } LTE_eNB_UE_stats;
 
 typedef struct {
diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
index ff4bf70d8bc4e6d3b6b0ce9f10a123361650465a..112b1ee494884e92244a53413b6f21996bc840ea 100644
--- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
+++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c
@@ -1326,14 +1326,20 @@ void rx_ulsch(PHY_VARS_eNB *phy_vars_eNB,
 	  eNB_pusch_vars->ulsch_power_0[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_0[eNB_id][i],
 						ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
 	  eNB_pusch_vars->ulsch_power_1[i] = signal_energy(eNB_pusch_vars->drs_ch_estimates_1[eNB_id][i],
-						ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
+						ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;  
 	}
       }
     else
       {
-	for (i=0;i<frame_parms->nb_antennas_rx;i++)
+	for (i=0;i<frame_parms->nb_antennas_rx;i++) {
 	  eNB_pusch_vars->ulsch_power[i] = signal_energy_nodc(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
 					      ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12)*rx_power_correction;
+#ifdef LOCALIZATION
+          eNB_pusch_vars->subcarrier_power = (int32_t *)malloc(ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12*sizeof(int32_t));
+          eNB_pusch_vars->active_subcarrier = subcarrier_energy(eNB_pusch_vars->drs_ch_estimates[eNB_id][i],
+					      ulsch[UE_id]->harq_processes[harq_pid]->nb_rb*12, eNB_pusch_vars->subcarrier_power, rx_power_correction);
+#endif
+        }
       }
   
     //write_output("rxdataF_ext.m","rxF_ext",eNB_pusch_vars->rxdataF_ext[eNB_id][0],300*(frame_parms->symbols_per_tti-ulsch[UE_id]->srs_active),1,1);
diff --git a/openair1/PHY/TOOLS/defs.h b/openair1/PHY/TOOLS/defs.h
index 5f0f4e14aeb963632679da97e50639acc34f8f7c..3e0bf404a0a31e50b5f7a2f9de6b93c1d2d40e8a 100644
--- a/openair1/PHY/TOOLS/defs.h
+++ b/openair1/PHY/TOOLS/defs.h
@@ -486,6 +486,13 @@ void mmxcopy(void *dest,void *src,int size);
 */
 int32_t signal_energy(int32_t *,uint32_t);
 
+#ifdef LOCALIZATION
+/*!\fn int32_t signal_energy(int *,uint32_t);
+\brief Computes the signal energy per subcarrier
+*/
+int32_t subcarrier_energy(int32_t *,uint32_t, int32_t* subcarrier_energy, uint16_t rx_power_correction);
+#endif
+
 /*!\fn int32_t signal_energy_nodc(int32_t *,uint32_t);
 \brief Computes the signal energy per subcarrier, without DC removal
 */
diff --git a/openair1/PHY/TOOLS/signal_energy.c b/openair1/PHY/TOOLS/signal_energy.c
index 774e69d50822c8b5dfb2ade2771ccf94ddf55565..79dd0ee1f9575edb1867bb7abb05f9c7d3112b28 100755
--- a/openair1/PHY/TOOLS/signal_energy.c
+++ b/openair1/PHY/TOOLS/signal_energy.c
@@ -41,6 +41,36 @@
 
 
 #ifndef EXPRESSMIMO_TARGET
+#ifdef LOCALIZATION
+int32_t subcarrier_energy(int32_t *input,uint32_t length, int32_t *subcarrier_energy, uint16_t rx_power_correction) {
+
+  int32_t i, subcarrier_pwr;
+  register __m64 mm0,mm1, subcarrier;
+  subcarrier = _m_pxor(subcarrier,subcarrier);
+  __m64 *in = (__m64 *)input;
+
+#ifdef MAIN
+  int16_t *printb;
+#endif
+
+  mm0 = _m_pxor(mm0,mm0);
+
+  for (i=0;i<length>>1;i++) {
+    
+    mm1 = in[i]; 
+    mm1 = _m_pmaddwd(mm1,mm1);
+    mm1 = _m_psradi(mm1,shift);// shift any 32 bits blocs of the word by the value shift
+    subcarrier = mm1;
+    subcarrier = _m_psrlqi(subcarrier,32);
+    subcarrier = _m_paddd(subcarrier,mm1);
+    subcarrier_pwr = _m_to_int(subcarrier);
+    subcarrier_pwr<<=shift;
+    subcarrier_pwr = (unsigned short) dB_fixed(subcarrier_pwr);
+    subcarrier_energy[i] = subcarrier_pwr*rx_power_correction;
+  }
+  return i;
+}
+#endif
 int32_t signal_energy(int32_t *input,uint32_t length) {
 
   int32_t i;
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index dc98c0ff72709441d959fb61d23f03dc5c0d6c55..685739a4b21ddff71e38c048373ea786fdb2dfdf 100755
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -336,6 +336,11 @@ typedef struct PHY_VARS_eNB_s{
   time_stats_t ulsch_tc_intl1_stats;
   time_stats_t ulsch_tc_intl2_stats;
   
+#ifdef LOCALIZATION
+  /// time state for localization
+  time_stats_t localization_stats;
+#endif 
+  
 #if defined(ENABLE_RAL)
   hash_table_t    *ral_thresholds_timed;
   SLIST_HEAD(ral_thresholds_gen_poll_enb_s, ral_threshold_phy_t) ral_thresholds_gen_polled[RAL_LINK_PARAM_GEN_MAX];
diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h
index a9ebbe0518d4766e7aac8126bab780dd70ef1b2b..25c8159bfb32419b907a170ec97135325f6bf761 100644
--- a/openair1/PHY/impl_defs_lte.h
+++ b/openair1/PHY/impl_defs_lte.h
@@ -602,6 +602,12 @@ typedef struct{
   int ulsch_power_1[2];
   /// llr values
   int16_t *llr;
+#ifdef LOCALIZATION
+  /// number of active subcarrier for a specific UE
+  int32_t active_subcarrier;
+  /// subcarrier power in dBm
+  int32_t *subcarrier_power;
+#endif
 } LTE_eNB_PUSCH;
 
 typedef struct {
diff --git a/openair1/SCHED/defs.h b/openair1/SCHED/defs.h
index 41507a5151bccf83b0b7d50fc7df4c6fe288fb70..3fded06fceb0917cb0613126d697fe3d241d65ca 100644
--- a/openair1/SCHED/defs.h
+++ b/openair1/SCHED/defs.h
@@ -519,6 +519,17 @@ void pusch_power_cntl(PHY_VARS_UE *phy_vars_ue,uint8_t subframe,uint8_t eNB_id,u
 
 int8_t get_PHR(uint8_t Mod_id, uint8_t CC_id, uint8_t eNB_index);
 
+#ifdef LOCALIZATION
+/** \brief This function collects eNB_UE stats and aggregate them in lists for localization
+    @param phy_vars_ue PHY variables
+    @param UE_id Index of UE
+    @param frame Index of frame
+    @param subframe Index of subframe
+    @param UE_tx_power_dB estimated UE Tx power
+    @returns -1 if updated list, 0 if calculated median
+ */
+double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE_id, frame_t frameP, sub_frame_t subframeP, int32_t UE_tx_power_dB);
+#endif
 LTE_eNB_UE_stats* get_eNB_UE_stats(uint8_t Mod_id, uint8_t CC_id,uint16_t rnti);
 
 LTE_DL_FRAME_PARMS *get_lte_frame_parms(module_id_t Mod_id, uint8_t CC_id);
@@ -527,7 +538,7 @@ MU_MIMO_mode* get_mu_mimo_mode (module_id_t Mod_id, uint8_t CC_id, rnti_t rnti);
 
 int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t harq_pid);
 
-int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t harq_pid);
+int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor);
 
 int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rnti_t rnti, uint8_t harq_pid);
 
diff --git a/openair1/SCHED/phy_procedures_lte_common.c b/openair1/SCHED/phy_procedures_lte_common.c
index 6c6b328ae596f6918ae2f5b468c802c0eb882db0..b40926dc99bd2ca09fe645a6dfa063a3134dfa84 100755
--- a/openair1/SCHED/phy_procedures_lte_common.c
+++ b/openair1/SCHED/phy_procedures_lte_common.c
@@ -44,6 +44,9 @@
 #include "SCHED/defs.h"
 #include "SCHED/extern.h"
 
+#ifdef LOCALIZATION 
+#include <sys/time.h>
+#endif 
 
 void get_Msg3_alloc(LTE_DL_FRAME_PARMS *frame_parms,
 		    unsigned char current_subframe, 
@@ -548,6 +551,148 @@ unsigned int is_phich_subframe(LTE_DL_FRAME_PARMS *frame_parms,unsigned char sub
 }
 
 
+#ifdef LOCALIZATION
+double aggregate_eNB_UE_localization_stats(PHY_VARS_eNB *phy_vars_eNB, int8_t UE_id, frame_t frame, sub_frame_t subframe, int32_t UE_tx_power_dB){
+    // parameters declaration
+    int8_t Mod_id, CC_id;
+    int32_t harq_pid, avg_power, avg_rssi, median_power, median_rssi, median_subcarrier_rss, median_TA, median_TA_update, ref_timestamp_ms, current_timestamp_ms;
+    char cqis[100], sub_powers[2048];
+    int len = 0, i;
+    struct timeval ts;
+    double sys_bw = 0;
+    uint8_t N_RB_DL;
+    LTE_DL_FRAME_PARMS *frame_parms = &phy_vars_eNB->lte_frame_parms;
+
+    Mod_id = phy_vars_eNB->Mod_id;
+    CC_id = phy_vars_eNB->CC_id;
+    ref_timestamp_ms = phy_vars_eNB->ulsch_eNB[UE_id+1]->reference_timestamp_ms;
+    
+    for (i=0;i<13;i++) {
+        len += sprintf(&cqis[len]," %d ", phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_subband_cqi[0][i]);
+    }
+    len = 0;
+    for (i=0;i<phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier;i++) {
+      len += sprintf(&sub_powers[len]," %d ", phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]);
+    } 
+    
+    gettimeofday(&ts, NULL);
+    current_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000;
+  
+    
+      LOG_F(LOCALIZE, "PHY: [UE %x/%d -> eNB %d], timestamp %d, "
+          "frame %d, subframe %d"
+          "UE Tx power %d dBm, "
+          "RSSI ant1 %d dBm, "
+          "RSSI ant2 %d dBm, "
+          "pwr ant1 %d dBm, "
+          "pwr ant2 %d dBm, "
+          "Rx gain %d dBm, "
+          "TA %d, "
+          "TA update %d, "
+          "DL_CQI (%d,%d), "
+          "Wideband CQI (%d,%d), "
+          "DL Subband CQI[13] %s \n"
+          "timestamp %d, (%d active subcarrier) %s \n"
+          ,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms,
+          frame,subframe,
+          UE_tx_power_dB,
+          phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[0],
+          phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[1],
+          dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]),
+          dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]),
+          phy_vars_eNB->rx_total_gain_eNB_dB,
+          phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset, // raw timing advance 1/sampling rate
+          phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update,
+          phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_cqi[0],phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].DL_cqi[1],
+          phy_vars_eNB->PHY_measurements_eNB[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][0],
+          phy_vars_eNB->PHY_measurements_eNB[Mod_id].wideband_cqi_dB[(uint32_t)UE_id][1],
+          cqis,
+          current_timestamp_ms,
+          phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier, 
+          sub_powers);
+  
+      N_RB_DL = frame_parms->N_RB_DL;
+      switch (N_RB_DL) 
+        {
+        case 6:
+          sys_bw = 1.92;
+          break;
+        case 25:
+          sys_bw = 7.68;
+          break;
+        case 50:
+          sys_bw = 15.36;
+          break;
+        case 100:
+          sys_bw = 30.72;
+          break;
+       }  
+
+      if ((current_timestamp_ms - ref_timestamp_ms > phy_vars_eNB->ulsch_eNB[UE_id+1]->aggregation_period_ms) && 
+              (phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list.size != 0)) {
+          // check the size of one list to be sure there was a message transmitted during the defined aggregation period
+          median_power = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list);
+          del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list);
+          median_rssi = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list);
+          del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list);
+          median_subcarrier_rss = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list);
+          del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list);
+          median_TA = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list);
+          del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list);       
+          median_TA_update = calculate_median(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list);
+          del(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list);   
+
+          double alpha = 2, power_distance, time_distance;
+          power_distance = pow(10, ((UE_tx_power_dB - (median_subcarrier_rss - phy_vars_eNB->rx_total_gain_eNB_dB))/(20.0*alpha)));
+          time_distance = (double) 299792458*(phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset)/(sys_bw*1000000);
+
+          phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].distance.time_based = time_distance;
+          phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].distance.power_based = power_distance;
+
+          LOG_D(LOCALIZE, " PHY [UE %x/%d -> eNB %d], timestamp %d, "
+            "frame %d, subframe %d "
+            "UE Tx power %d dBm, "
+            "median RSSI %d dBm, "
+            "median Power %d dBm, "
+            "Rx gain %d dBm, "
+            "power estimated r = %0.3f, "
+            " TA %d, update %d "
+            "TA estimated r = %0.3f\n"
+            ,phy_vars_eNB->dlsch_eNB[(uint32_t)UE_id][0]->rnti, UE_id, Mod_id, current_timestamp_ms, 
+            frame, subframe, 
+            UE_tx_power_dB,
+            median_rssi,
+            median_power,
+            phy_vars_eNB->rx_total_gain_eNB_dB,
+            power_distance,
+            phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset, median_TA_update, 
+            time_distance); 
+
+            initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list);
+            initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list);        
+            initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list);
+            initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list);
+            initialize(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list);
+            
+            // make the reference timestamp == current timestamp
+            phy_vars_eNB->ulsch_eNB[UE_id+1]->reference_timestamp_ms = current_timestamp_ms;
+            return 0;
+      }
+      else {
+          avg_power = (dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[0]) + dB_fixed(phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->ulsch_power[1]))/2;
+          avg_rssi = (phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[0] + phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UL_rssi[1])/2;
+
+          push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rss_list,avg_power);
+          push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_rssi_list,avg_rssi);
+          for (i=0;i<phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->active_subcarrier;i++) {
+              push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_subcarrier_rss_list, phy_vars_eNB->lte_eNB_pusch_vars[(uint32_t)UE_id]->subcarrier_power[i]);
+          }       
+          push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_advance_list, phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].UE_timing_offset);
+          push_front(&phy_vars_eNB->ulsch_eNB[UE_id+1]->loc_timing_update_list, phy_vars_eNB->eNB_UE_stats[(uint32_t)UE_id].timing_advance_update);
+          return -1;
+      }      
+}
+#endif
 LTE_eNB_UE_stats* get_eNB_UE_stats(uint8_t Mod_id, uint8_t  CC_id,uint16_t rnti) {
   int8_t UE_id;
   if ((PHY_vars_eNB_g == NULL) || (PHY_vars_eNB_g[Mod_id] == NULL) || (PHY_vars_eNB_g[Mod_id][CC_id]==NULL)) {
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 7f6003788237e35143faebec2faa772f1f6ec3f0..a9ea37c7f91671677446878e8b312675a8579b49 100755
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -2974,7 +2974,7 @@ void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 
       //compute the expected ULSCH RX power (for the stats)
       phy_vars_eNB->ulsch_eNB[(uint32_t)i]->harq_processes[harq_pid]->delta_TF =
-	get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid);
+	get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0); // 0 means bw_factor is not considered
 
       //dump_ulsch(phy_vars_eNB, sched_subframe, i);
     
@@ -3125,7 +3125,7 @@ void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 		     phy_vars_eNB->lte_frame_parms.ofdm_symbol_size) -
 	    phy_vars_eNB->rx_total_gain_eNB_dB -
 	    hundred_times_log10_NPRB[phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->nb_rb-1]/100 -
-	    get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid)/100;
+	    get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 0)/100;
 
 	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_active = 1;
 	phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->phich_ACK = 1;
@@ -3226,6 +3226,16 @@ void phy_procedures_eNB_RX(unsigned char sched_subframe,PHY_VARS_eNB *phy_vars_e
 	    LOG_D(PHY,"[eNB][Auto-Calibration] Frame %d, Subframe %d : ULSCH PDU (RX) %d bytes\n",phy_vars_eNB->proc[sched_subframe].frame_tx,subframe,phy_vars_eNB->ulsch_eNB[i]->harq_processes[harq_pid]->TBS>>3);	    
 	    }
 	  */
+#ifdef LOCALIZATION
+          start_meas(&phy_vars_eNB->localization_stats);
+          aggregate_eNB_UE_localization_stats(phy_vars_eNB, 
+                                              i, 
+                                              frame, 
+                                              subframe, 
+                                              get_hundred_times_delta_IF_eNB(phy_vars_eNB,i,harq_pid, 1)/100);
+          stop_meas(&phy_vars_eNB->localization_stats);
+#endif 
+          
 #endif
 	}
 
diff --git a/openair1/SCHED/pusch_pc.c b/openair1/SCHED/pusch_pc.c
index 46b53ee80727a600ed1412e3772025c1e0e430ee..50d9f3957cc2e3828952cdbdf87cf54c2f374137 100644
--- a/openair1/SCHED/pusch_pc.c
+++ b/openair1/SCHED/pusch_pc.c
@@ -45,8 +45,9 @@
 
 // This is the formula from Section 5.1.1.1 in 36.213 100*10*log10((2^(MPR*Ks)-1)), where MPR is in the range [0,6] and Ks=1.25
 int16_t hundred_times_delta_TF[100] = {-32768,-1268,-956,-768,-631,-523,-431,-352,-282,-219,-161,-107,-57,-9,36,79,120,159,197,234,269,304,337,370,402,434,465,495,525,555,583,612,640,668,696,723,750,777,803,829,856,881,907,933,958,983,1008,1033,1058,1083,1108,1132,1157,1181,1205,1229,1254,1278,1302,1325,1349,1373,1397,1421,1444,1468,1491,1515,1538,1562,1585,1609,1632,1655,1679,1702,1725,1748,1772,1795,1818,1841,1864,1887,1910,1933,1956,1980,2003,2026,2049,2072,2095,2118,2141,2164,2186,2209,2232,2255};
+uint16_t hundred_times_log10_NPRB[100] = {0,301,477,602,698,778,845,903,954,1000,1041,1079,1113,1146,1176,1204,1230,1255,1278,1301,1322,1342,1361,1380,1397,1414,1431,1447,1462,1477,1491,1505,1518,1531,1544,1556,1568,1579,1591,1602,1612,1623,1633,1643,1653,1662,1672,1681,1690,1698,1707,1716,1724,1732,1740,1748,1755,1763,1770,1778,1785,1792,1799,1806,1812,1819,1826,1832,1838,1845,1851,1857,1863,1869,1875,1880,1886,1892,1897,1903,1908,1913,1919,1924,1929,1934,1939,1944,1949,1954,1959,1963,1968,1973,1977,1982,1986,1991,1995,2000}; 
 
-int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t harq_pid) {
+int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,uint8_t harq_pid, uint8_t bw_factor) {
  
   uint32_t Nre,sumKr,MPR_x100,Kr,r;
   uint16_t beta_offset_pusch;
@@ -75,7 +76,12 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,
 
   if (phy_vars_eNB->ul_power_control_dedicated[UE_id].deltaMCS_Enabled == 1) {
     // This is the formula from Section 5.1.1.1 in 36.213 10*log10(deltaIF_PUSCH = (2^(MPR*Ks)-1)*beta_offset_pusch)
-    return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3));
+    if (bw_factor == 1) {
+        uint8_t nb_rb = phy_vars_eNB->ulsch_eNB[UE_id]->harq_processes[harq_pid]->nb_rb;
+        return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3)) + hundred_times_log10_NPRB[nb_rb-1];
+    }
+    else
+        return(hundred_times_delta_TF[MPR_x100/6]+10*dB_fixed_times10((beta_offset_pusch)>>3));
   }
   else {
     return(0);
@@ -83,7 +89,7 @@ int16_t get_hundred_times_delta_IF_eNB(PHY_VARS_eNB *phy_vars_eNB,uint8_t UE_id,
 }
 
 int16_t get_hundred_times_delta_IF_mac(module_id_t module_idP, uint8_t CC_id, rnti_t rnti, uint8_t harq_pid) {
-  return get_hundred_times_delta_IF_eNB(PHY_vars_eNB_g[module_idP][CC_id],find_ue(rnti,PHY_vars_eNB_g[module_idP][CC_id]),harq_pid); 
+  return get_hundred_times_delta_IF_eNB(PHY_vars_eNB_g[module_idP][CC_id],find_ue(rnti,PHY_vars_eNB_g[module_idP][CC_id]),harq_pid, 0); 
 }
 
 int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8_t harq_pid) {
@@ -110,7 +116,6 @@ int16_t get_hundred_times_delta_IF(PHY_VARS_UE *phy_vars_ue,uint8_t eNB_id,uint8
   }
 }
 
-uint16_t hundred_times_log10_NPRB[100] = {0,301,477,602,698,778,845,903,954,1000,1041,1079,1113,1146,1176,1204,1230,1255,1278,1301,1322,1342,1361,1380,1397,1414,1431,1447,1462,1477,1491,1505,1518,1531,1544,1556,1568,1579,1591,1602,1612,1623,1633,1643,1653,1662,1672,1681,1690,1698,1707,1716,1724,1732,1740,1748,1755,1763,1770,1778,1785,1792,1799,1806,1812,1819,1826,1832,1838,1845,1851,1857,1863,1869,1875,1880,1886,1892,1897,1903,1908,1913,1919,1924,1929,1934,1939,1944,1949,1954,1959,1963,1968,1973,1977,1982,1986,1991,1995,2000}; 
 
 
 uint8_t alpha_lut[8] = {0,40,50,60,70,80,90,100};
diff --git a/openair2/COMMON/mac_rrc_primitives.h b/openair2/COMMON/mac_rrc_primitives.h
index 3375533380ec8ee88635e27dc0a1acf690133588..60c6ce1f3b6f8f6fb63df845c90fa81a925381f5 100644
--- a/openair2/COMMON/mac_rrc_primitives.h
+++ b/openair2/COMMON/mac_rrc_primitives.h
@@ -362,6 +362,7 @@ typedef struct{   //RRC_INTERFACE_FUNCTIONS
   void (*rrc_data_indP)  (module_id_t , rb_id_t , sdu_size_t , char*);
   void (*fn_rrc)  (void);
   uint8_t (*get_rrc_status)(uint8_t Mod_id,uint8_t eNB_flag,uint8_t eNB_index);
+  double (*rrc_get_estimated_ue_distance) (module_id_t Mod_id, uint8_t UE_id, uint8_t CC_id, uint8_t loc_type);
 }RRC_XFACE;
 
 
diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c
index f3ff6c28a7e4887c78db9047a45dfd5aead906b3..0c02aa49adf7f5fc5e7ad04d70767c82df198c57 100644
--- a/openair2/LAYER2/MAC/config.c
+++ b/openair2/LAYER2/MAC/config.c
@@ -468,3 +468,36 @@ int rrc_mac_config_req(module_id_t Mod_id, eNB_flag_t eNB_flagP,uint8_t UE_id,ui
 
   return(0);
 }
+#ifdef LOCALIZATION
+double
+rrc_get_estimated_ue_distance(module_id_t Mod_id, const frame_t frameP,  uint8_t UE_id, int CC_id, uint8_t loc_type){
+    // localization types:
+    // 0: power based
+    // 1: time based
+    LTE_eNB_UE_stats     *eNB_UE_stats     = NULL;
+    UE_list_t            *UE_list = &eNB_mac_inst[Mod_id].UE_list;
+    int                   pCCid;
+    
+    uint16_t rnti;
+    
+  //for (UE_id=UE_list->head;UE_id>=0;UE_id=UE_list->next[UE_id]) {
+    pCCid = UE_PCCID(Mod_id,UE_id);
+    rnti = UE_list->UE_template[pCCid][UE_id].rnti;
+    if(rnti == 0)
+        return -1;
+    eNB_UE_stats = mac_xface->get_eNB_UE_stats(Mod_id,pCCid,rnti);
+    switch (loc_type) {
+      case 0:
+        return eNB_UE_stats->distance.power_based;
+        break;
+      case 1:
+        return eNB_UE_stats->distance.time_based;
+        break;
+     default: 
+       return  eNB_UE_stats->distance.power_based;
+    }
+//    LOG_D(LOCALIZE, "DEBUG ME, dist = %d\n", &eNB_mac_inst[Mod_id].UE_list.UE_template[CC_id][UE_id].distance.power_based);      
+  
+}
+
+#endif 
diff --git a/openair2/LAYER2/MAC/defs.h b/openair2/LAYER2/MAC/defs.h
index 2cd256185d6cc726bdd731e2ff388c4274003de1..56e932e224834f57f340a954055eabf230b541e9 100644
--- a/openair2/LAYER2/MAC/defs.h
+++ b/openair2/LAYER2/MAC/defs.h
@@ -567,6 +567,12 @@ typedef struct{
 
   uint32_t ul_buffer_info[MAX_NUM_LCGID];
 
+  /// UE tx power
+  int32_t ue_tx_power;
+
+#ifdef LOCALIZATION
+  eNB_UE_estimated_distances distance;
+#endif
 } UE_TEMPLATE;
 
 typedef struct{
@@ -919,91 +925,7 @@ typedef struct {
   uint8_t n_adj_cells;
 } neigh_cell_id_t;
 
-
-/* \brief Generate header for DL-SCH.  This function parses the desired control elements and sdus and generates the header as described
-in 36-321 MAC layer specifications.  It returns the number of bytes used for the header to be used as an offset for the payload 
-in the DLSCH buffer.
-@param mac_header Pointer to the first byte of the MAC header (DL-SCH buffer)
-@param num_sdus Number of SDUs in the payload
-@param sdu_lengths Pointer to array of SDU lengths
-@param sdu_lcids Pointer to array of LCIDs (the order must be the same as the SDU length array)
-@param drx_cmd dicontinous reception command 
-@param timing_advancd_cmd timing advanced command
-@param ue_cont_res_id Pointer to contention resolution identifier (NULL means not present in payload)
-@param short_padding Number of bytes for short padding (0,1,2)
-@param post_padding number of bytes for padding at the end of MAC PDU 
-@returns Number of bytes used for header
-*/
-unsigned char generate_dlsch_header(unsigned char *mac_header,
-				    unsigned char num_sdus,
-				    unsigned short *sdu_lengths,
-				    unsigned char *sdu_lcids,
-				    unsigned char drx_cmd,
-				    short timing_advance_cmd,
-				    unsigned char *ue_cont_res_id,
-				    unsigned char short_padding,
-				    unsigned short post_padding);
-
-/** \brief RRC Configuration primitive for PHY/MAC.  Allows configuration of PHY/MAC resources based on System Information (SI), RRCConnectionSetup and RRCConnectionReconfiguration messages.
-@param Mod_id Instance ID of eNB
-@param eNB_flag Indicates if this is a eNB or UE configuration
-@param UE_id Index of UE if this is an eNB configuration
-@param eNB_id Index of eNB if this is a UE configuration
-@param radioResourceConfigCommon Structure from SIB2 for common radio parameters (if NULL keep existing configuration)
-@param physcialConfigDedicated Structure from RRCConnectionSetup or RRCConnectionReconfiguration for dedicated PHY parameters (if NULL keep existing configuration)
-@param measObj Structure from RRCConnectionReconfiguration for UE measurement procedures
-@param mac_MainConfig Structure from RRCConnectionSetup or RRCConnectionReconfiguration for dedicated MAC parameters (if NULL keep existing configuration)
-@param logicalChannelIdentity Logical channel identity index of corresponding logical channel config 
-@param logicalChannelConfig Pointer to logical channel configuration
-@param measGapConfig Measurement Gap configuration for MAC (if NULL keep existing configuration)
-@param tdd_Config TDD Configuration from SIB1 (if NULL keep existing configuration)
-@param mobilityControlInfo mobility control info received for Handover
-@param SIwindowsize SI Windowsize from SIB1 (if NULL keep existing configuration)
-@param SIperiod SI Period from SIB1 (if NULL keep existing configuration)
-@param MBMS_Flag indicates MBMS transmission
-@param mbsfn_SubframeConfigList pointer to mbsfn subframe configuration list from SIB2
-@param mbsfn_AreaInfoList pointer to MBSFN Area Info list from SIB13
-@param pmch_InfoList pointer to PMCH_InfoList from MBSFNAreaConfiguration Message (MCCH Message)
-*/
-int rrc_mac_config_req(module_id_t     module_idP,
-                       eNB_flag_t eNB_flag,
-                       uint8_t         UE_id,
-                       uint8_t         eNB_index,
-                       RadioResourceConfigCommonSIB_t *radioResourceConfigCommon,
-                       struct PhysicalConfigDedicated *physicalConfigDedicated,
-#ifdef Rel10
-		       SCellToAddMod_r10_t *sCellToAddMod_r10,
-		       //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
-#endif
-                       MeasObjectToAddMod_t **measObj,
-                       MAC_MainConfig_t *mac_MainConfig,
-                       long logicalChannelIdentity,
-                       LogicalChannelConfig_t *logicalChannelConfig,
-                       MeasGapConfig_t *measGapConfig,
-                       TDD_Config_t *tdd_Config,
-                       MobilityControlInfo_t *mobilityControlInfo,
-                       uint8_t *SIwindowsize,
-                       uint16_t *SIperiod,
-                       ARFCN_ValueEUTRA_t *ul_CarrierFreq,
-                       long *ul_Bandwidth,
-                       AdditionalSpectrumEmission_t *additionalSpectrumEmission,
-                       struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList
-#ifdef Rel10
-                       ,
-                       uint8_t MBMS_Flag,
-                       MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList,
-                       PMCH_InfoList_r9_t *pmch_InfoList
-
-#endif
-#ifdef CBA
-                       ,
-                       uint8_t num_active_cba_groups,
-                       uint16_t cba_rnti
-#endif
-		       );
-
-
-
+#include "proto.h"
 /*@}*/
 #endif /*__LAYER2_MAC_DEFS_H__ */ 
 
diff --git a/openair2/LAYER2/MAC/eNB_scheduler.c b/openair2/LAYER2/MAC/eNB_scheduler.c
index f2467f7eb943f7693ef3d8d690dcc2bac64b1d2c..057f33501ac1c11d24d8bcd12d67457970a689fd 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler.c
@@ -188,7 +188,8 @@ void eNB_dlsch_ulsch_scheduler(module_id_t module_idP,uint8_t cooperation_flag,
   rrc_rx_tx(module_idP,
 	    frameP,
 	    1,
-	    module_idP);
+	    module_idP,
+            CC_id);
 
 #ifdef Rel10
   for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
index 8ae6b957dc089e99b43159d162b96a911f0e72f6..42ab173c93f3246f40cb87b1ece09d2c640d333a 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_dlsch.c
@@ -392,7 +392,7 @@ void schedule_ue_spec(module_id_t   module_idP,
   uint8_t               dl_pow_off[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
   unsigned char         rballoc_sub_UE[MAX_NUM_CCs][NUMBER_OF_UE_MAX][N_RBG_MAX];
   uint16_t              pre_nb_available_rbs[MAX_NUM_CCs][NUMBER_OF_UE_MAX];
-  int                   mcs,mcs2;
+  int                   mcs;
   uint16_t              min_rb_unit[MAX_NUM_CCs];
   short                 ta_update        = 0;
   eNB_MAC_INST         *eNB      = &eNB_mac_inst[module_idP];
@@ -708,7 +708,24 @@ void schedule_ue_spec(module_id_t   module_idP,
 	// check first for RLC data on DCCH
 	// add the length for  all the control elements (timing adv, drx, etc) : header + payload
 #ifndef EXMIMO_IOT
-	ta_len = ((eNB_UE_stats->timing_advance_update/4)!=0) ? 2 : 0;
+        // to be checked by RK, NN, FK
+        uint8_t update_TA;
+        switch (frame_parms[CC_id]->N_RB_DL) 
+        {
+        case 6:
+          update_TA = 1;
+          break;
+        case 25:
+          update_TA = 4;
+          break;
+        case 50:
+          update_TA = 8;
+          break;
+        case 100:
+          update_TA = 16;
+          break;
+       }        
+	ta_len = ((eNB_UE_stats->timing_advance_update/update_TA)!=0) ? 2 : 0;
 #else
 	ta_len = 0;
 #endif
@@ -936,7 +953,7 @@ void schedule_ue_spec(module_id_t   module_idP,
 	    post_padding = TBS - sdu_length_total - header_len_dcch - header_len_dtch - ta_len ; // 1 is for the postpadding header
 	  }
 #ifndef EXMIMO_IOT
-	  ta_update = eNB_UE_stats->timing_advance_update/4;
+	  ta_update = eNB_UE_stats->timing_advance_update/update_TA;
 #else
 	  ta_update = 0;
 #endif
diff --git a/openair2/LAYER2/MAC/pre_processor.c b/openair2/LAYER2/MAC/pre_processor.c
index 7cb62e4c570cda07daad44c163b15bc8fcfb5ef2..c652128da77492a176be347b6a9c90984cd75555 100644
--- a/openair2/LAYER2/MAC/pre_processor.c
+++ b/openair2/LAYER2/MAC/pre_processor.c
@@ -961,6 +961,9 @@ void assign_max_mcs_min_rb(module_id_t module_idP,int frameP, sub_frame_t subfra
 	  tbs = mac_xface->get_TBS_UL(mcs,rb_table[rb_table_index]);
 	  tx_power = mac_xface->estimate_ue_tx_power(tbs,rb_table[rb_table_index],0,frame_parms->Ncp,0);
 	}
+        
+        UE_template->ue_tx_power = tx_power;
+        
 	if (rb_table[rb_table_index]>(frame_parms->N_RB_UL-first_rb[CC_id]-1)) {
 	  rb_table_index--;
 	}
diff --git a/openair2/LAYER2/MAC/proto.h b/openair2/LAYER2/MAC/proto.h
index 362bb543c4602ecbb8c6e115bc0869a7f1d1e6d0..916c938958bf9b8dc39d4a70bc1eec1abbf749d9 100644
--- a/openair2/LAYER2/MAC/proto.h
+++ b/openair2/LAYER2/MAC/proto.h
@@ -498,7 +498,7 @@ void adjust_bsr_info(int buffer_occupancy, uint16_t TBS, UE_TEMPLATE *UE_templat
 \param[in] eNB_index  instance of eNB
 @returns L2 state (CONNETION_OK or CONNECTION_LOST or PHY_RESYNCH)
 */
-UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframe, lte_subframe_t direction,uint8_t eNB_index);
+UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframe, lte_subframe_t direction,uint8_t eNB_index,int CC_id);
 
 /*! \fn  int use_cba_access(module_id_t module_idP,frame_t frameP,sub_frame_t subframe, uint8_t eNB_index);
 \brief determine whether to use cba resource to transmit or not
@@ -656,5 +656,101 @@ void update_ul_dci(module_id_t module_idP,uint8_t CC_id,rnti_t rnti,uint8_t dai)
 
 int get_min_rb_unit(module_id_t module_idP, uint8_t CC_id);
 
+/* \brief Generate header for DL-SCH.  This function parses the desired control elements and sdus and generates the header as described
+in 36-321 MAC layer specifications.  It returns the number of bytes used for the header to be used as an offset for the payload 
+in the DLSCH buffer.
+@param mac_header Pointer to the first byte of the MAC header (DL-SCH buffer)
+@param num_sdus Number of SDUs in the payload
+@param sdu_lengths Pointer to array of SDU lengths
+@param sdu_lcids Pointer to array of LCIDs (the order must be the same as the SDU length array)
+@param drx_cmd dicontinous reception command 
+@param timing_advancd_cmd timing advanced command
+@param ue_cont_res_id Pointer to contention resolution identifier (NULL means not present in payload)
+@param short_padding Number of bytes for short padding (0,1,2)
+@param post_padding number of bytes for padding at the end of MAC PDU 
+@returns Number of bytes used for header
+*/
+unsigned char generate_dlsch_header(unsigned char *mac_header,
+				    unsigned char num_sdus,
+				    unsigned short *sdu_lengths,
+				    unsigned char *sdu_lcids,
+				    unsigned char drx_cmd,
+				    short timing_advance_cmd,
+				    unsigned char *ue_cont_res_id,
+				    unsigned char short_padding,
+				    unsigned short post_padding);
+
+/** \brief RRC Configuration primitive for PHY/MAC.  Allows configuration of PHY/MAC resources based on System Information (SI), RRCConnectionSetup and RRCConnectionReconfiguration messages.
+@param Mod_id Instance ID of eNB
+@param eNB_flag Indicates if this is a eNB or UE configuration
+@param UE_id Index of UE if this is an eNB configuration
+@param eNB_id Index of eNB if this is a UE configuration
+@param radioResourceConfigCommon Structure from SIB2 for common radio parameters (if NULL keep existing configuration)
+@param physcialConfigDedicated Structure from RRCConnectionSetup or RRCConnectionReconfiguration for dedicated PHY parameters (if NULL keep existing configuration)
+@param measObj Structure from RRCConnectionReconfiguration for UE measurement procedures
+@param mac_MainConfig Structure from RRCConnectionSetup or RRCConnectionReconfiguration for dedicated MAC parameters (if NULL keep existing configuration)
+@param logicalChannelIdentity Logical channel identity index of corresponding logical channel config 
+@param logicalChannelConfig Pointer to logical channel configuration
+@param measGapConfig Measurement Gap configuration for MAC (if NULL keep existing configuration)
+@param tdd_Config TDD Configuration from SIB1 (if NULL keep existing configuration)
+@param mobilityControlInfo mobility control info received for Handover
+@param SIwindowsize SI Windowsize from SIB1 (if NULL keep existing configuration)
+@param SIperiod SI Period from SIB1 (if NULL keep existing configuration)
+@param MBMS_Flag indicates MBMS transmission
+@param mbsfn_SubframeConfigList pointer to mbsfn subframe configuration list from SIB2
+@param mbsfn_AreaInfoList pointer to MBSFN Area Info list from SIB13
+@param pmch_InfoList pointer to PMCH_InfoList from MBSFNAreaConfiguration Message (MCCH Message)
+*/
+int rrc_mac_config_req(module_id_t     module_idP,
+                       eNB_flag_t eNB_flag,
+                       uint8_t         UE_id,
+                       uint8_t         eNB_index,
+                       RadioResourceConfigCommonSIB_t *radioResourceConfigCommon,
+                       struct PhysicalConfigDedicated *physicalConfigDedicated,
+#ifdef Rel10
+		       SCellToAddMod_r10_t *sCellToAddMod_r10,
+		       //struct PhysicalConfigDedicatedSCell_r10 *physicalConfigDedicatedSCell_r10,
+#endif
+                       MeasObjectToAddMod_t **measObj,
+                       MAC_MainConfig_t *mac_MainConfig,
+                       long logicalChannelIdentity,
+                       LogicalChannelConfig_t *logicalChannelConfig,
+                       MeasGapConfig_t *measGapConfig,
+                       TDD_Config_t *tdd_Config,
+                       MobilityControlInfo_t *mobilityControlInfo,
+                       uint8_t *SIwindowsize,
+                       uint16_t *SIperiod,
+                       ARFCN_ValueEUTRA_t *ul_CarrierFreq,
+                       long *ul_Bandwidth,
+                       AdditionalSpectrumEmission_t *additionalSpectrumEmission,
+                       struct MBSFN_SubframeConfigList *mbsfn_SubframeConfigList
+#ifdef Rel10
+                       ,
+                       uint8_t MBMS_Flag,
+                       MBSFN_AreaInfoList_r9_t *mbsfn_AreaInfoList,
+                       PMCH_InfoList_r9_t *pmch_InfoList
+
+#endif
+#ifdef CBA
+                       ,
+                       uint8_t num_active_cba_groups,
+                       uint16_t cba_rnti
+#endif
+		       );
+
+/** \brief get the estimated UE distance from the PHY->MAC layer.
+@param Mod_id Instance ID of eNB
+@param UE_id Index of UE if this is an eNB configuration
+@param CC_id Component Carrier Index
+@param loc_type localization type: time-based or power-based
+@return the estimated distance in meters
+ */
+double 
+rrc_get_estimated_ue_distance(module_id_t Mod_id, 
+                              const frame_t frameP,  
+                              uint8_t UE_id, 
+                              int CC_id, 
+                              uint8_t loc_type);
+
 
 #endif
diff --git a/openair2/LAYER2/MAC/ue_procedures.c b/openair2/LAYER2/MAC/ue_procedures.c
index a75512cebb50bd18be42fc80029b5afdc657cd3c..8d1bf3b254f0a50e75d0360e9796f21348813b9b 100644
--- a/openair2/LAYER2/MAC/ue_procedures.c
+++ b/openair2/LAYER2/MAC/ue_procedures.c
@@ -1311,7 +1311,7 @@ void ue_get_sdu(module_id_t module_idP,int CC_id,frame_t frameP,sub_frame_t subf
 // 3. Perform SR/BSR procedures for scheduling feedback
 // 4. Perform PHR procedures
 
-UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP, lte_subframe_t directionP,uint8_t eNB_indexP) {
+UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t subframeP, lte_subframe_t directionP,uint8_t eNB_indexP,int CC_id) {
 
   int lcid; // lcid index
   int TTI= 1;
@@ -1377,7 +1377,8 @@ UE_L2_STATE_t ue_scheduler(module_id_t module_idP,frame_t frameP, sub_frame_t su
   switch (rrc_rx_tx(module_idP,
       frameP,
       0,
-      eNB_indexP)) {
+      eNB_indexP,
+      CC_id)) {
   case RRC_OK:
     break;
   case RRC_ConnSetup_failed:
diff --git a/openair2/RRC/LITE/defs.h b/openair2/RRC/LITE/defs.h
index b79431d7a0f56a32b89923842cb1a55fb819e46f..dedf3d9b1da431225215e4aac5d17a5fd423de12 100644
--- a/openair2/RRC/LITE/defs.h
+++ b/openair2/RRC/LITE/defs.h
@@ -366,6 +366,16 @@ typedef struct eNB_RRC_INST_s {
   /* Used integrity/ciphering algorithms */
   e_SecurityAlgorithmConfig__cipheringAlgorithm     ciphering_algorithm[NUMBER_OF_UE_MAX];
   e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm[NUMBER_OF_UE_MAX];
+#ifdef LOCALIZATION
+  /// localization type, 0: power based, 1: time based
+  uint8_t loc_type;
+  /// epoch timestamp in millisecond, RRC
+  int32_t reference_timestamp_ms;
+  /// aggregate physical states every n millisecond
+  int32_t aggregation_period_ms; 
+  /// localization list for aggregated measurements from PHY
+  struct list loc_list;
+#endif 
 } eNB_RRC_INST;
 
 #define MAX_UE_CAPABILITY_SIZE 255
@@ -458,237 +468,7 @@ typedef struct UE_RRC_INST_s {
   e_SecurityAlgorithmConfig__integrityProtAlgorithm integrity_algorithm;
 } UE_RRC_INST;
 
-//main.c
-int rrc_init_global_param(void);
-int L3_xface_init(void);
-void openair_rrc_top_init(int eMBMS_active, uint8_t cba_group_active,uint8_t HO_enabled);
-char openair_rrc_lite_eNB_init(module_id_t module_idP);
-char openair_rrc_lite_ue_init(module_id_t module_idP,uint8_t CH_IDX);
-void rrc_config_buffer(SRB_INFO *srb_info, uint8_t Lchan_type, uint8_t Role);
-void openair_rrc_on(module_id_t module_idP, eNB_flag_t eNB_flagP);
-void rrc_top_cleanup(void);
-
-/** \brief Function to update timers every subframe.  For UE it updates T300,T304 and T310.
-@param module_idP Instance of UE/eNB
-@param frame Frame index
-@param eNB_flag Flag to indicate if this instance is and eNB or UE
-@param index Index of corresponding eNB (for UE)
-*/
-RRC_status_t rrc_rx_tx(module_id_t module_idP,frame_t frameP, eNB_flag_t eNB_flagP,uint8_t index);
-
-// UE RRC Procedures
-
-/** \brief Decodes DL-CCCH message and invokes appropriate routine to handle the message
-    \param module_idP Instance ID of UE
-    \param Srb_info Pointer to SRB_INFO structure (SRB0)
-    \param eNB_index Index of corresponding eNB/CH*/
-int rrc_ue_decode_ccch(module_id_t module_idP, frame_t frameP, SRB_INFO *Srb_info,uint8_t eNB_index);
-
-/** \brief Decodes a DL-DCCH message and invokes appropriate routine to handle the message
-    \param module_idP Instance ID of UE
-    \param frame Frame index
-    \param Srb_id Index of Srb (1,2)
-    \param buffer_pP Pointer to received SDU
-    \param eNB_index Index of corresponding CH/eNB*/
-void rrc_ue_decode_dcch(module_id_t module_idP, frame_t frameP, uint8_t Srb_id, uint8_t* buffer_pP,uint8_t eNB_index);
-
-/** \brief Generate/Encodes RRCConnnectionRequest message at UE 
-    \param module_idP Instance ID of UE
-    \param frame Frame index
-    \param Srb_id Index of Srb (1,2)
-    \param eNB_index Index of corresponding eNB/CH*/
-void rrc_ue_generate_RRCConnectionRequest(module_id_t module_idP, frame_t frameP, uint8_t eNB_index);
-
-/** \brief Generates/Encodes RRCConnnectionSetupComplete message at UE 
-    \param module_idP Instance ID of UE
-    \param frame Frame index
-    \param eNB_index Index of corresponding eNB/CH*/
-void rrc_ue_generate_RRCConnectionSetupComplete(module_id_t module_idP,frame_t frameP,uint8_t eNB_index, uint8_t Transaction_id);
-
-/** \brief process the received rrcConnectionReconfiguration message at UE 
-    \param module_idP Instance ID of UE
-    \param frame Frame index
-    \param *rrcConnectionReconfiguration pointer to the sturcture
-    \param eNB_index Index of corresponding eNB/CH*/
-void rrc_ue_process_rrcConnectionReconfiguration(module_id_t module_idP, frame_t frameP,RRCConnectionReconfiguration_t *rrcConnectionReconfiguration,uint8_t eNB_index);
-
-/** \brief Generates/Encodes RRCConnectionReconfigurationComplete  message at UE 
-    \param module_idP Instance ID of UE
-    \param frame Frame index
-    \param eNB_index Index of corresponding eNB/CH*/
-void rrc_ue_generate_RRCConnectionReconfigurationComplete(module_id_t module_idP, frame_t frameP, uint8_t eNB_index, uint8_t Transaction_id);
-
-/** \brief Establish SRB1 based on configuration in SRB_ToAddMod structure.  Configures RLC/PDCP accordingly
-    \param module_idP Instance ID of UE
-    \param frame Frame index
-    \param eNB_index Index of corresponding eNB/CH
-    \param SRB_config Pointer to SRB_ToAddMod IE from configuration
-    @returns 0 on success*/
-int32_t  rrc_ue_establish_srb1(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,struct SRB_ToAddMod *SRB_config);
-
-/** \brief Establish SRB2 based on configuration in SRB_ToAddMod structure.  Configures RLC/PDCP accordingly
-    \param module_idP Instance ID of UE
-    \param frame Frame index
-    \param eNB_index Index of corresponding eNB/CH
-    \param SRB_config Pointer to SRB_ToAddMod IE from configuration
-    @returns 0 on success*/
-int32_t  rrc_ue_establish_srb2(module_id_t module_idP,frame_t frameP, uint8_t eNB_index,struct SRB_ToAddMod *SRB_config);
-
-/** \brief Establish a DRB according to DRB_ToAddMod structure
-    \param module_idP Instance ID of UE
-    \param eNB_index Index of corresponding CH/eNB
-    \param DRB_config Pointer to DRB_ToAddMod IE from configuration
-    @returns 0 on success */
-int32_t  rrc_ue_establish_drb(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,struct DRB_ToAddMod *DRB_config);
-
-/** \brief Process MobilityControlInfo Message to proceed with handover and configure PHY/MAC
-    \param module_idP Instance of UE on which to act
-    \param frame frame time interval
-    \param eNB_index Index of corresponding CH/eNB
-    \param mobilityControlInfo Pointer to mobilityControlInfo
-*/
-void rrc_ue_process_mobilityControlInfo(module_id_t enb_module_idP, module_id_t ue_module_idP, frame_t frameP, struct MobilityControlInfo *mobilityControlInfo);
-
-/** \brief Process a measConfig Message and configure PHY/MAC
-    \param module_idP Instance of UE on which to act
-    \param frame frame time interval
-    \param eNB_index Index of corresponding CH/eNB
-    \param  measConfig Pointer to MeasConfig  IE from configuration*/
-void rrc_ue_process_measConfig(module_id_t module_idP,frame_t frameP, uint8_t eNB_index,MeasConfig_t *measConfig);
-
-/** \brief Process a RadioResourceConfigDedicated Message and configure PHY/MAC
-    \param module_idP Instance of UE on which to act
-    \param eNB_index Index of corresponding CH/eNB
-    \param radioResourceConfigDedicated Pointer to RadioResourceConfigDedicated IE from configuration*/
-void rrc_ue_process_radioResourceConfigDedicated(module_id_t module_idP,frame_t frameP, uint8_t eNB_index,
-						 RadioResourceConfigDedicated_t *radioResourceConfigDedicated);
-
-// eNB/CH RRC Procedures
-
-/**\brief Function to get the next transaction identifier.
-   \param module_idP Instance ID for CH/eNB
-   \return a transaction identifier*/
-uint8_t rrc_eNB_get_next_transaction_identifier(module_id_t module_idP);
-
-/**\brief Entry routine to decode a UL-CCCH-Message.  Invokes PER decoder and parses message.
-   \param module_idP Instance ID for CH/eNB
-   \param frame  Frame index
-   \param Srb_info Pointer to SRB0 information structure (buffer, etc.)*/
-int rrc_eNB_decode_ccch(module_id_t module_idP, frame_t frameP, SRB_INFO *Srb_info);
-
-/**\brief Entry routine to decode a UL-DCCH-Message.  Invokes PER decoder and parses message.
-   \param module_idP Instance ID for CH/eNB
-   \param frame Frame index
-   \param ue_module_idP Index of UE sending the message
-   \param Rx_sdu Pointer Received Message
-   \param sdu_size Size of incoming SDU*/
-int rrc_eNB_decode_dcch(module_id_t module_idP, frame_t frameP, uint8_t Srb_id, module_id_t ue_module_idP, uint8_t *Rx_sdu, sdu_size_t sdu_size);
-
-/**\brief Generate the RRCConnectionSetup based on information coming from RRM
-   \param module_idP Instance ID for eNB/CH
-   \param frame Frame index
-   \param ue_module_idP Index of UE receiving the message*/
-void rrc_eNB_generate_RRCConnectionSetup(module_id_t module_idP,frame_t frameP, module_id_t ue_module_idP);
-
-/**\brief Process the RRCConnectionSetupComplete based on information coming from UE
-   \param module_idP Instance ID for eNB/CH
-   \param frame Frame index
-   \param ue_module_idP Index of UE transmitting the message
-   \param rrcConnectionSetupComplete Pointer to RRCConnectionSetupComplete message*/
-void rrc_eNB_process_RRCConnectionSetupComplete(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP,
-    RRCConnectionSetupComplete_r8_IEs_t *rrcConnectionSetupComplete);
-
-/**\brief Process the RRCConnectionReconfigurationComplete based on information coming from UE
-   \param module_idP Instance ID for eNB/CH
-   \param ue_module_idP Index of UE transmitting the messages
-   \param rrcConnectionReconfigurationComplete Pointer to RRCConnectionReconfigurationComplete message*/
-void rrc_eNB_process_RRCConnectionReconfigurationComplete(module_id_t module_idP,frame_t frameP,module_id_t ue_module_idP,RRCConnectionReconfigurationComplete_r8_IEs_t *rrcConnectionReconfigurationComplete);
-
-/**\brief Generate the RRCConnectionRelease 
-   \param module_idP Instance ID for eNB
-   \param frame Frame index
-   \param ue_module_idP Index of UE receiving the message*/
-void rrc_eNB_generate_RRCConnectionRelease(module_id_t module_idP,frame_t frameP, ue_id_t ue_idP);
-
-#if defined(ENABLE_ITTI)
-/**\brief RRC eNB task.
-   \param void *args_p Pointer on arguments to start the task. */
-void *rrc_enb_task(void *args_p);
-
-/**\brief RRC UE task.
-   \param void *args_p Pointer on arguments to start the task. */
-void *rrc_ue_task(void *args_p);
-#endif
-
-/**\brief Generate/decode the handover RRCConnectionReconfiguration at eNB
-   \param module_idP Instance ID for eNB/CH
-   \param frame Frame index
-   \param ue_module_idP Index of UE transmitting the messages*/
-void rrc_eNB_generate_RRCConnectionReconfiguration_handover(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP, uint8_t *nas_pdu, uint32_t nas_length);
-
-//L2_interface.c
-int8_t mac_rrc_lite_data_req( module_id_t module_idP, frame_t frameP, rb_id_t Srb_id, uint8_t Nb_tb, uint8_t *buffer_pP,eNB_flag_t eNB_flagP, uint8_t eNB_index, uint8_t mbsfn_sync_area);
-
-int8_t mac_rrc_lite_data_ind( module_id_t module_idP,  frame_t frameP, rb_id_t Srb_id, uint8_t *Sdu, sdu_size_t Sdu_len,eNB_flag_t eNB_flagP,uint8_t eNB_index, uint8_t mbsfn_sync_area);
-
-void mac_sync_ind( module_id_t Mod_instP, uint8_t status);
-
-uint8_t rrc_lite_data_req(module_id_t enb_mod_idP,
-                     module_id_t      ue_mod_idP,
-                     frame_t          frameP,
-                     eNB_flag_t       eNB_flagP,
-                     rb_id_t          rb_idP,
-                     mui_t            muiP,
-                     confirm_t        confirmP,
-                     sdu_size_t       sdu_sizeP,
-                     uint8_t         *Buffer_pP,
-                     pdcp_transmission_mode_t   modeP);
-
-void rrc_lite_data_ind(module_id_t eNB_id, module_id_t UE_id, frame_t frameP, eNB_flag_t eNB_flagP, rb_id_t Rb_id, sdu_size_t sdu_size,uint8_t *buffer_pP);
-
-void rrc_lite_in_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index);
-
-void rrc_lite_out_of_sync_ind(module_id_t module_idP, frame_t frameP, unsigned short eNB_index);
-
-int decode_MCCH_Message(module_id_t module_idP, frame_t frameP, uint8_t eNB_index, uint8_t *Sdu, uint8_t Sdu_len,uint8_t mbsfn_sync_area);
-
-void decode_MBSFNAreaConfiguration(module_id_t module_idP, uint8_t eNB_index, frame_t frameP,uint8_t mbsfn_sync_area);
-
-int decode_BCCH_DLSCH_Message(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,uint8_t *Sdu,uint8_t Sdu_len, uint8_t rsrq, uint8_t rsrp);
-
-int decode_SIB1(module_id_t module_idP,uint8_t eNB_index, uint8_t rsrq, uint8_t rsrp);
-
-int decode_SI(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,uint8_t si_window);
-
-void ue_meas_filtering(module_id_t module_idP,frame_t frameP,uint8_t eNB_index);
-
-void ue_measurement_report_triggering(module_id_t module_idP, frame_t frameP,uint8_t eNB_index);
-
-int mac_get_rrc_lite_status(module_id_t module_idP,eNB_flag_t eNB_flagP,uint8_t index);
-
-void rrc_eNB_generate_UECapabilityEnquiry(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP);
-
-void rrc_eNB_generate_SecurityModeCommand(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP);
-
-void rrc_eNB_process_MeasurementReport(uint8_t module_idP,frame_t frameP, module_id_t ue_module_idP,MeasResults_t *measResults2) ;
-
-void rrc_ue_generate_MeasurementReport(module_id_t eNB_id, module_id_t UE_id, frame_t frameP);
-
-void rrc_eNB_generate_HandoverPreparationInformation (uint8_t module_idP, frame_t frameP, module_id_t ue_module_idP, PhysCellId_t targetPhyId) ;
-
-void check_handovers(uint8_t module_idP, frame_t frameP);
-
-uint8_t check_trigger_meas_event(uint8_t module_idP,frame_t frameP, uint8_t eNB_index, uint8_t ue_cnx_index, uint8_t meas_index,
-			    Q_OffsetRange_t ofn, Q_OffsetRange_t ocn, Hysteresis_t hys, 
-			    Q_OffsetRange_t ofs, Q_OffsetRange_t ocs, long a3_offset, TimeToTrigger_t ttt);
-
-//void rrc_ue_process_ueCapabilityEnquiry(uint8_t module_idP,uint32_t frame,UECapabilityEnquiry_t *UECapabilityEnquiry,uint8_t eNB_index);
-//void rrc_ue_process_securityModeCommand(uint8_t module_idP,uint32_t frame,SecurityModeCommand_t *securityModeCommand,uint8_t eNB_index);
-
-void rrc_eNB_free_UE_index (module_id_t enb_mod_idP, module_id_t ue_mod_idP);
-
-long binary_search_int(int elements[], long numElem, int value);
+#include "proto.h"
 
-long binary_search_float(float elements[], long numElem, float value);
 #endif
 /** @ */
diff --git a/openair2/RRC/LITE/proto.h b/openair2/RRC/LITE/proto.h
new file mode 100644
index 0000000000000000000000000000000000000000..8bf332eeb83aa44ff15185bd843e8f3e48c9c9c7
--- /dev/null
+++ b/openair2/RRC/LITE/proto.h
@@ -0,0 +1,271 @@
+/*******************************************************************************
+    OpenAirInterface
+    Copyright(c) 1999 - 2014 Eurecom
+
+    OpenAirInterface is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+
+    OpenAirInterface is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenAirInterface.The full GNU General Public License is
+    included in this distribution in the file called "COPYING". If not,
+    see <http://www.gnu.org/licenses/>.
+
+  Contact Information
+  OpenAirInterface Admin: openair_admin@eurecom.fr
+  OpenAirInterface Tech : openair_tech@eurecom.fr
+  OpenAirInterface Dev  : openair4g-devel@eurecom.fr
+
+  Address      : Eurecom, Campus SophiaTech, 450 Route des Chappes, CS 50193 - 06904 Biot Sophia Antipolis cedex, FRANCE
+
+*******************************************************************************/
+/*! \file proto.h
+ * \brief RRC functions prototypes for eNB and UE
+ * \author Navid Nikaein and Raymond Knopp
+ * \date 2010 - 2014 
+ * \email navid.nikaein@eurecom.fr
+ * \version 1.0
+ * @ingroup _rrc
+
+ */
+
+//main.c
+int rrc_init_global_param(void);
+int L3_xface_init(void);
+void openair_rrc_top_init(int eMBMS_active, uint8_t cba_group_active,uint8_t HO_enabled);
+char openair_rrc_lite_eNB_init(module_id_t module_idP);
+char openair_rrc_lite_ue_init(module_id_t module_idP,uint8_t CH_IDX);
+void rrc_config_buffer(SRB_INFO *srb_info, uint8_t Lchan_type, uint8_t Role);
+void openair_rrc_on(module_id_t module_idP, eNB_flag_t eNB_flagP);
+void rrc_top_cleanup(void);
+
+/** \brief Function to update timers every subframe.  For UE it updates T300,T304 and T310.
+@param module_idP Instance of UE/eNB
+@param frame Frame index
+@param eNB_flag Flag to indicate if this instance is and eNB or UE
+@param index Index of corresponding eNB (for UE)
+*/
+RRC_status_t rrc_rx_tx(module_id_t module_idP,frame_t frameP, eNB_flag_t eNB_flagP,uint8_t index,int CC_id);
+
+// UE RRC Procedures
+
+/** \brief Decodes DL-CCCH message and invokes appropriate routine to handle the message
+    \param module_idP Instance ID of UE
+    \param Srb_info Pointer to SRB_INFO structure (SRB0)
+    \param eNB_index Index of corresponding eNB/CH*/
+int rrc_ue_decode_ccch(module_id_t module_idP, frame_t frameP, SRB_INFO *Srb_info,uint8_t eNB_index);
+
+/** \brief Decodes a DL-DCCH message and invokes appropriate routine to handle the message
+    \param module_idP Instance ID of UE
+    \param frame Frame index
+    \param Srb_id Index of Srb (1,2)
+    \param buffer_pP Pointer to received SDU
+    \param eNB_index Index of corresponding CH/eNB*/
+void rrc_ue_decode_dcch(module_id_t module_idP, frame_t frameP, uint8_t Srb_id, uint8_t* buffer_pP,uint8_t eNB_index);
+
+/** \brief Generate/Encodes RRCConnnectionRequest message at UE 
+    \param module_idP Instance ID of UE
+    \param frame Frame index
+    \param Srb_id Index of Srb (1,2)
+    \param eNB_index Index of corresponding eNB/CH*/
+void rrc_ue_generate_RRCConnectionRequest(module_id_t module_idP, frame_t frameP, uint8_t eNB_index);
+
+/** \brief Generates/Encodes RRCConnnectionSetupComplete message at UE 
+    \param module_idP Instance ID of UE
+    \param frame Frame index
+    \param eNB_index Index of corresponding eNB/CH*/
+void rrc_ue_generate_RRCConnectionSetupComplete(module_id_t module_idP,frame_t frameP,uint8_t eNB_index, uint8_t Transaction_id);
+
+/** \brief process the received rrcConnectionReconfiguration message at UE 
+    \param module_idP Instance ID of UE
+    \param frame Frame index
+    \param *rrcConnectionReconfiguration pointer to the sturcture
+    \param eNB_index Index of corresponding eNB/CH*/
+void rrc_ue_process_rrcConnectionReconfiguration(module_id_t module_idP, frame_t frameP,RRCConnectionReconfiguration_t *rrcConnectionReconfiguration,uint8_t eNB_index);
+
+/** \brief Generates/Encodes RRCConnectionReconfigurationComplete  message at UE 
+    \param module_idP Instance ID of UE
+    \param frame Frame index
+    \param eNB_index Index of corresponding eNB/CH*/
+void rrc_ue_generate_RRCConnectionReconfigurationComplete(module_id_t module_idP, frame_t frameP, uint8_t eNB_index, uint8_t Transaction_id);
+
+/** \brief Establish SRB1 based on configuration in SRB_ToAddMod structure.  Configures RLC/PDCP accordingly
+    \param module_idP Instance ID of UE
+    \param frame Frame index
+    \param eNB_index Index of corresponding eNB/CH
+    \param SRB_config Pointer to SRB_ToAddMod IE from configuration
+    @returns 0 on success*/
+int32_t  rrc_ue_establish_srb1(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,struct SRB_ToAddMod *SRB_config);
+
+/** \brief Establish SRB2 based on configuration in SRB_ToAddMod structure.  Configures RLC/PDCP accordingly
+    \param module_idP Instance ID of UE
+    \param frame Frame index
+    \param eNB_index Index of corresponding eNB/CH
+    \param SRB_config Pointer to SRB_ToAddMod IE from configuration
+    @returns 0 on success*/
+int32_t  rrc_ue_establish_srb2(module_id_t module_idP,frame_t frameP, uint8_t eNB_index,struct SRB_ToAddMod *SRB_config);
+
+/** \brief Establish a DRB according to DRB_ToAddMod structure
+    \param module_idP Instance ID of UE
+    \param eNB_index Index of corresponding CH/eNB
+    \param DRB_config Pointer to DRB_ToAddMod IE from configuration
+    @returns 0 on success */
+int32_t  rrc_ue_establish_drb(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,struct DRB_ToAddMod *DRB_config);
+
+/** \brief Process MobilityControlInfo Message to proceed with handover and configure PHY/MAC
+    \param module_idP Instance of UE on which to act
+    \param frame frame time interval
+    \param eNB_index Index of corresponding CH/eNB
+    \param mobilityControlInfo Pointer to mobilityControlInfo
+*/
+void rrc_ue_process_mobilityControlInfo(module_id_t enb_module_idP, module_id_t ue_module_idP, frame_t frameP, struct MobilityControlInfo *mobilityControlInfo);
+
+/** \brief Process a measConfig Message and configure PHY/MAC
+    \param module_idP Instance of UE on which to act
+    \param frame frame time interval
+    \param eNB_index Index of corresponding CH/eNB
+    \param  measConfig Pointer to MeasConfig  IE from configuration*/
+void rrc_ue_process_measConfig(module_id_t module_idP,frame_t frameP, uint8_t eNB_index,MeasConfig_t *measConfig);
+
+/** \brief Process a RadioResourceConfigDedicated Message and configure PHY/MAC
+    \param module_idP Instance of UE on which to act
+    \param eNB_index Index of corresponding CH/eNB
+    \param radioResourceConfigDedicated Pointer to RadioResourceConfigDedicated IE from configuration*/
+void rrc_ue_process_radioResourceConfigDedicated(module_id_t module_idP,frame_t frameP, uint8_t eNB_index,
+						 RadioResourceConfigDedicated_t *radioResourceConfigDedicated);
+
+// eNB/CH RRC Procedures
+
+/**\brief Function to get the next transaction identifier.
+   \param module_idP Instance ID for CH/eNB
+   \return a transaction identifier*/
+uint8_t rrc_eNB_get_next_transaction_identifier(module_id_t module_idP);
+
+/**\brief Entry routine to decode a UL-CCCH-Message.  Invokes PER decoder and parses message.
+   \param module_idP Instance ID for CH/eNB
+   \param frame  Frame index
+   \param Srb_info Pointer to SRB0 information structure (buffer, etc.)*/
+int rrc_eNB_decode_ccch(module_id_t module_idP, frame_t frameP, SRB_INFO *Srb_info);
+
+/**\brief Entry routine to decode a UL-DCCH-Message.  Invokes PER decoder and parses message.
+   \param module_idP Instance ID for CH/eNB
+   \param frame Frame index
+   \param ue_module_idP Index of UE sending the message
+   \param Rx_sdu Pointer Received Message
+   \param sdu_size Size of incoming SDU*/
+int rrc_eNB_decode_dcch(module_id_t module_idP, frame_t frameP, uint8_t Srb_id, module_id_t ue_module_idP, uint8_t *Rx_sdu, sdu_size_t sdu_size);
+
+/**\brief Generate the RRCConnectionSetup based on information coming from RRM
+   \param module_idP Instance ID for eNB/CH
+   \param frame Frame index
+   \param ue_module_idP Index of UE receiving the message*/
+void rrc_eNB_generate_RRCConnectionSetup(module_id_t module_idP,frame_t frameP, module_id_t ue_module_idP);
+
+/**\brief Process the RRCConnectionSetupComplete based on information coming from UE
+   \param module_idP Instance ID for eNB/CH
+   \param frame Frame index
+   \param ue_module_idP Index of UE transmitting the message
+   \param rrcConnectionSetupComplete Pointer to RRCConnectionSetupComplete message*/
+void rrc_eNB_process_RRCConnectionSetupComplete(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP,
+    RRCConnectionSetupComplete_r8_IEs_t *rrcConnectionSetupComplete);
+
+/**\brief Process the RRCConnectionReconfigurationComplete based on information coming from UE
+   \param module_idP Instance ID for eNB/CH
+   \param ue_module_idP Index of UE transmitting the messages
+   \param rrcConnectionReconfigurationComplete Pointer to RRCConnectionReconfigurationComplete message*/
+void rrc_eNB_process_RRCConnectionReconfigurationComplete(module_id_t module_idP,frame_t frameP,module_id_t ue_module_idP,RRCConnectionReconfigurationComplete_r8_IEs_t *rrcConnectionReconfigurationComplete);
+
+/**\brief Generate the RRCConnectionRelease 
+   \param module_idP Instance ID for eNB
+   \param frame Frame index
+   \param ue_module_idP Index of UE receiving the message*/
+void rrc_eNB_generate_RRCConnectionRelease(module_id_t module_idP,frame_t frameP, ue_id_t ue_idP);
+
+#if defined(ENABLE_ITTI)
+/**\brief RRC eNB task.
+   \param void *args_p Pointer on arguments to start the task. */
+void *rrc_enb_task(void *args_p);
+
+/**\brief RRC UE task.
+   \param void *args_p Pointer on arguments to start the task. */
+void *rrc_ue_task(void *args_p);
+#endif
+
+/**\brief Generate/decode the handover RRCConnectionReconfiguration at eNB
+   \param module_idP Instance ID for eNB/CH
+   \param frame Frame index
+   \param ue_module_idP Index of UE transmitting the messages*/
+void rrc_eNB_generate_RRCConnectionReconfiguration_handover(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP, uint8_t *nas_pdu, uint32_t nas_length);
+
+//L2_interface.c
+int8_t mac_rrc_lite_data_req( module_id_t module_idP, frame_t frameP, rb_id_t Srb_id, uint8_t Nb_tb, uint8_t *buffer_pP,eNB_flag_t eNB_flagP, uint8_t eNB_index, uint8_t mbsfn_sync_area);
+
+int8_t mac_rrc_lite_data_ind( module_id_t module_idP,  frame_t frameP, rb_id_t Srb_id, uint8_t *Sdu, sdu_size_t Sdu_len,eNB_flag_t eNB_flagP,uint8_t eNB_index, uint8_t mbsfn_sync_area);
+
+void mac_sync_ind( module_id_t Mod_instP, uint8_t status);
+
+uint8_t rrc_lite_data_req(module_id_t enb_mod_idP,
+                     module_id_t      ue_mod_idP,
+                     frame_t          frameP,
+                     eNB_flag_t       eNB_flagP,
+                     rb_id_t          rb_idP,
+                     mui_t            muiP,
+                     confirm_t        confirmP,
+                     sdu_size_t       sdu_sizeP,
+                     uint8_t         *Buffer_pP,
+                     pdcp_transmission_mode_t   modeP);
+
+void rrc_lite_data_ind(module_id_t eNB_id, module_id_t UE_id, frame_t frameP, eNB_flag_t eNB_flagP, rb_id_t Rb_id, sdu_size_t sdu_size,uint8_t *buffer_pP);
+
+void rrc_lite_in_sync_ind(module_id_t module_idP, frame_t frameP, uint16_t eNB_index);
+
+void rrc_lite_out_of_sync_ind(module_id_t module_idP, frame_t frameP, unsigned short eNB_index);
+
+int decode_MCCH_Message(module_id_t module_idP, frame_t frameP, uint8_t eNB_index, uint8_t *Sdu, uint8_t Sdu_len,uint8_t mbsfn_sync_area);
+
+void decode_MBSFNAreaConfiguration(module_id_t module_idP, uint8_t eNB_index, frame_t frameP,uint8_t mbsfn_sync_area);
+
+int decode_BCCH_DLSCH_Message(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,uint8_t *Sdu,uint8_t Sdu_len, uint8_t rsrq, uint8_t rsrp);
+
+int decode_SIB1(module_id_t module_idP,uint8_t eNB_index, uint8_t rsrq, uint8_t rsrp);
+
+int decode_SI(module_id_t module_idP,frame_t frameP,uint8_t eNB_index,uint8_t si_window);
+
+void ue_meas_filtering(module_id_t module_idP,frame_t frameP,uint8_t eNB_index);
+
+void ue_measurement_report_triggering(module_id_t module_idP, frame_t frameP,uint8_t eNB_index);
+
+int mac_get_rrc_lite_status(module_id_t module_idP,eNB_flag_t eNB_flagP,uint8_t index);
+
+void rrc_eNB_generate_UECapabilityEnquiry(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP);
+
+void rrc_eNB_generate_SecurityModeCommand(module_id_t module_idP, frame_t frameP, module_id_t ue_module_idP);
+
+void rrc_eNB_process_MeasurementReport(uint8_t module_idP,frame_t frameP, module_id_t ue_module_idP,MeasResults_t *measResults2) ;
+
+void rrc_ue_generate_MeasurementReport(module_id_t eNB_id, module_id_t UE_id, frame_t frameP);
+
+void rrc_eNB_generate_HandoverPreparationInformation (uint8_t module_idP, frame_t frameP, module_id_t ue_module_idP, PhysCellId_t targetPhyId) ;
+
+void check_handovers(uint8_t module_idP, frame_t frameP);
+
+uint8_t check_trigger_meas_event(uint8_t module_idP,frame_t frameP, uint8_t eNB_index, uint8_t ue_cnx_index, uint8_t meas_index,
+			    Q_OffsetRange_t ofn, Q_OffsetRange_t ocn, Hysteresis_t hys, 
+			    Q_OffsetRange_t ofs, Q_OffsetRange_t ocs, long a3_offset, TimeToTrigger_t ttt);
+
+//void rrc_ue_process_ueCapabilityEnquiry(uint8_t module_idP,uint32_t frame,UECapabilityEnquiry_t *UECapabilityEnquiry,uint8_t eNB_index);
+//void rrc_ue_process_securityModeCommand(uint8_t module_idP,uint32_t frame,SecurityModeCommand_t *securityModeCommand,uint8_t eNB_index);
+
+void rrc_eNB_free_UE_index (module_id_t enb_mod_idP, module_id_t ue_mod_idP);
+
+long binary_search_int(int elements[], long numElem, int value);
+
+long binary_search_float(float elements[], long numElem, float value);
+
diff --git a/openair2/RRC/LITE/rrc_common.c b/openair2/RRC/LITE/rrc_common.c
index 957364a791e4faba56cec8a414c1275add588e46..91366248f8cfaf720ac2b036282ac5aae47c6e4d 100644
--- a/openair2/RRC/LITE/rrc_common.c
+++ b/openair2/RRC/LITE/rrc_common.c
@@ -258,6 +258,17 @@ void openair_rrc_top_init(int eMBMS_active, uint8_t cba_group_active,uint8_t HO_
     for (module_id=0;module_id<NB_eNB_INST;module_id++) {
       eNB_rrc_inst[module_id].num_active_cba_groups = cba_group_active;
     }
+#endif
+#ifdef LOCALIZATION
+    /* later set this from xml or enb.config file*/
+    struct timeval ts; // time struct
+    gettimeofday(&ts, NULL); // get the current epoch timestamp
+    for (module_id=0;module_id<NB_eNB_INST;module_id++) {  
+        eNB_rrc_inst[module_id].reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000;  
+        initialize(&eNB_rrc_inst[module_id].loc_list);
+        eNB_rrc_inst[module_id].loc_type=0;      
+        eNB_rrc_inst[module_id].aggregation_period_ms = 5000;
+    }
 #endif
     LOG_D(RRC,
           "ALLOCATE %d Bytes for eNB_RRC_INST @ %p\n", (unsigned int)(NB_eNB_INST*sizeof(eNB_RRC_INST)), eNB_rrc_inst);
@@ -318,8 +329,12 @@ void rrc_t310_expiration(const frame_t frameP, uint8_t Mod_id, uint8_t eNB_index
   }
 }
 
-RRC_status_t rrc_rx_tx(uint8_t Mod_id, const frame_t frameP, const eNB_flag_t eNB_flagP,uint8_t index){
+RRC_status_t rrc_rx_tx(uint8_t Mod_id, const frame_t frameP, const eNB_flag_t eNB_flagP,uint8_t index,int CC_id){
   
+  uint8_t UE_id;
+  int32_t current_timestamp_ms, ref_timestamp_ms;
+  struct timeval ts;
+          
   if(eNB_flagP == 0) {
     // check timers
 
@@ -393,8 +408,34 @@ RRC_status_t rrc_rx_tx(uint8_t Mod_id, const frame_t frameP, const eNB_flag_t eN
     }
 
   }
-  else {
+  else { // eNB
     check_handovers(Mod_id,frameP);
+    // counetr, and get the value and aggregate
+#ifdef LOCALIZATION
+    /* for the localization, only primary CC_id might be relevant*/
+    gettimeofday(&ts, NULL);
+    current_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000;
+    
+    ref_timestamp_ms = eNB_rrc_inst[Mod_id].reference_timestamp_ms;
+    
+    
+    for  (UE_id=0; UE_id < NUMBER_OF_UE_MAX; UE_id++) {
+
+        if ((current_timestamp_ms - ref_timestamp_ms > eNB_rrc_inst[Mod_id].aggregation_period_ms) &&
+                rrc_get_estimated_ue_distance(Mod_id,frameP,UE_id, CC_id,eNB_rrc_inst[Mod_id].loc_type) != -1) {
+            LOG_D(LOCALIZE, " RRC [UE/id %d -> eNB/id %d] timestamp %d frame %d estimated r = %f\n", 
+                    UE_id, 
+                    Mod_id, 
+                    current_timestamp_ms,
+                    frameP,
+                    rrc_get_estimated_ue_distance(Mod_id,frameP,UE_id, CC_id,eNB_rrc_inst[Mod_id].loc_type));
+            LOG_D(LOCALIZE, " RRC status %d\n", eNB_rrc_inst[Mod_id].Info.UE[UE_id].Status);
+            push_front(&eNB_rrc_inst[Mod_id].loc_list,
+                       rrc_get_estimated_ue_distance(Mod_id,frameP,UE_id, CC_id,eNB_rrc_inst[Mod_id].loc_type));
+            eNB_rrc_inst[Mod_id].reference_timestamp_ms = current_timestamp_ms;
+        }
+    }
+#endif
   }
   
   return (RRC_OK);
diff --git a/openair2/UTIL/LOG/log.c b/openair2/UTIL/LOG/log.c
index 627e375f672097ac5a2c2150fa985163e13c5fad..8c27285798fe316e0807a6f559de910262d202d2 100755
--- a/openair2/UTIL/LOG/log.c
+++ b/openair2/UTIL/LOG/log.c
@@ -142,7 +142,7 @@ int logInit (void)
     g_log->log_component[PHY].filelog_name = "/tmp/phy.log";
 
     g_log->log_component[MAC].name = "MAC";
-    g_log->log_component[MAC].level = LOG_DEBUG;
+    g_log->log_component[MAC].level = LOG_EMERG;
     g_log->log_component[MAC].flag =  LOG_MED;
     g_log->log_component[MAC].interval =  1;
     g_log->log_component[MAC].fd = 0;
@@ -158,7 +158,7 @@ int logInit (void)
     g_log->log_component[OPT].filelog_name = "";
 
     g_log->log_component[RLC].name = "RLC";
-    g_log->log_component[RLC].level = LOG_DEBUG;
+    g_log->log_component[RLC].level = LOG_INFO;
     g_log->log_component[RLC].flag = LOG_MED;
     g_log->log_component[RLC].interval =  1;
     g_log->log_component[RLC].fd = 0;
@@ -166,7 +166,7 @@ int logInit (void)
     g_log->log_component[RLC].filelog_name = "/tmp/rlc.log";
 
     g_log->log_component[PDCP].name = "PDCP";
-    g_log->log_component[PDCP].level = LOG_DEBUG;
+    g_log->log_component[PDCP].level = LOG_INFO;
     g_log->log_component[PDCP].flag = LOG_MED;
     g_log->log_component[PDCP].interval =  1;
     g_log->log_component[PDCP].fd = 0;
@@ -212,7 +212,7 @@ int logInit (void)
     g_log->log_component[OTG].fd = 0;
     g_log->log_component[OTG].filelog = 0;
     g_log->log_component[OTG].filelog_name = "/tmp/otg.log";
-
+    
     g_log->log_component[OTG_LATENCY].name = "OTG_LATENCY";
     g_log->log_component[OTG_LATENCY].level = LOG_EMERG;
     g_log->log_component[OTG_LATENCY].flag =  LOG_MED;
@@ -380,7 +380,16 @@ int logInit (void)
     g_log->log_component[TMR].fd = 0;
     g_log->log_component[TMR].filelog = 0;
     g_log->log_component[TMR].filelog_name = "";
-
+    
+/* following log component are used for the localization*/    
+    g_log->log_component[LOCALIZE].name = "LOCALIZE";
+    g_log->log_component[LOCALIZE].level = LOG_EMERG;
+    g_log->log_component[LOCALIZE].flag =  LOG_MED;
+    g_log->log_component[LOCALIZE].interval =  1;
+    g_log->log_component[LOCALIZE].fd = 0;
+    g_log->log_component[LOCALIZE].filelog = 1;
+    g_log->log_component[LOCALIZE].filelog_name = "/tmp/localize.log";
+    
     g_log->level2string[LOG_EMERG]         = "G"; //EMERG
     g_log->level2string[LOG_ALERT]         = "A"; // ALERT
     g_log->level2string[LOG_CRIT]          = "C"; // CRITIC
diff --git a/openair2/UTIL/LOG/log.h b/openair2/UTIL/LOG/log.h
index 04f1b30d73d593951e61ea63eefe8800f9dae652..a30b51ff47210418c54eefeaa246491d8d376262 100755
--- a/openair2/UTIL/LOG/log.h
+++ b/openair2/UTIL/LOG/log.h
@@ -265,6 +265,7 @@ typedef enum {
     RAL_UE,
     ENB_APP,
     TMR,
+    LOCALIZE,
     MAX_LOG_COMPONENTS,
 } comp_name_t;
 
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf
new file mode 100644
index 0000000000000000000000000000000000000000..db5a61e66ec02a38ece16b2857b3577160af565d
--- /dev/null
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf
@@ -0,0 +1,163 @@
+Active_eNBs = ( "eNB_Eurecom_LTEBox");
+# Asn1_verbosity, choice in: none, info, annoying
+Asn1_verbosity = "none";
+
+eNBs =
+(
+ {
+    # real_time choice in {hard, rt-preempt, no}
+    real_time       =  "no";
+    ////////// Identification parameters:
+    eNB_ID    =  0xe00;
+    
+    cell_type =  "CELL_MACRO_ENB";
+    
+    eNB_name  =  "eNB_Eurecom_LTEBox";
+    
+    // Tracking area code, 0x0000 and 0xfffe are reserved values
+    tracking_area_code  =  "1";
+    
+    mobile_country_code =  "208";
+    
+    mobile_network_code =  "92";
+    
+       ////////// Physical parameters:
+  
+    component_carriers = (
+    		       	 {
+  			   frame_type					      = "FDD";	
+                           tdd_config 					      = 3;
+                           tdd_config_s            			      = 0;
+ 			   prefix_type             			      = "NORMAL";
+  			   eutra_band              			      = 7;
+                           downlink_frequency      			      = 2680000000L;
+                           uplink_frequency_offset 			      = -120000000;
+  			   Nid_cell					      = 0;
+                           N_RB_DL                 			      = 25;
+                           Nid_cell_mbsfn          			      = 0;
+                           nb_antennas_tx          			      = 1;
+                           nb_antennas_rx          			      = 1; 
+			   tx_gain                                            = 25;
+			   rx_gain                                            = 20;
+                           prach_root              			      = 0;
+                           prach_config_index      			      = 0;
+                           prach_high_speed        			      = "DISABLE";
+  	                   prach_zero_correlation  			      = 1;
+                           prach_freq_offset       			      = 2;
+			   pucch_delta_shift       			      = 1;
+                           pucch_nRB_CQI           			      = 1;
+                           pucch_nCS_AN            			      = 0;
+                           pucch_n1_AN             			      = 32;
+                           pdsch_referenceSignalPower 			      = 0;
+                           pdsch_p_b                  			      = 0;
+                           pusch_n_SB                 			      = 1; 
+                           pusch_enable64QAM          			      = "DISABLE";
+			   pusch_hoppingMode                                  = "interSubFrame";
+			   pusch_hoppingOffset                                = 0;
+     	                   pusch_groupHoppingEnabled  			      = "ENABLE";
+	                   pusch_groupAssignment      			      = 0;
+	                   pusch_sequenceHoppingEnabled		   	      = "DISABLE";
+	                   pusch_nDMRS1                                       = 0;
+	                   phich_duration                                     = "NORMAL";
+	                   phich_resource                                     = "ONESIXTH";
+	                   srs_enable                                         = "DISABLE";
+	               /*  srs_BandwidthConfig                                =;
+	                   srs_SubframeConfig                                 =;
+	                   srs_ackNackST                                      =;
+	                   srs_MaxUpPts                                       =;*/  
+
+	                   pusch_p0_Nominal                                   = -108; 
+	                   pusch_alpha                                        = "AL1";
+	                   pucch_p0_Nominal                                   = -108;
+	                   msg3_delta_Preamble                                = 6;
+	                   pucch_deltaF_Format1                               = "deltaF2";
+	                   pucch_deltaF_Format1b                              = "deltaF3";
+	                   pucch_deltaF_Format2                               = "deltaF0";
+	                   pucch_deltaF_Format2a                              = "deltaF0";
+  	                   pucch_deltaF_Format2b		    	      = "deltaF0";
+	
+                           rach_numberOfRA_Preambles                          = 64;
+                           rach_preamblesGroupAConfig                         = "DISABLE";
+/*
+                           rach_sizeOfRA_PreamblesGroupA                      = ;
+                           rach_messageSizeGroupA                             = ;
+                           rach_messagePowerOffsetGroupB                      = ; 
+*/
+                           rach_powerRampingStep                              = 2;
+	                   rach_preambleInitialReceivedTargetPower            = -100;
+                           rach_preambleTransMax                              = 10;
+	                   rach_raResponseWindowSize                          = 10;
+	                   rach_macContentionResolutionTimer                  = 48;
+	                   rach_maxHARQ_Msg3Tx                                = 4;
+
+			   pcch_default_PagingCycle                           = 128;
+			   pcch_nB                                            = "oneT";
+			   bcch_modificationPeriodCoeff			      = 2;
+			   ue_TimersAndConstants_t300			      = 1000;
+			   ue_TimersAndConstants_t301			      = 1000;
+			   ue_TimersAndConstants_t310			      = 1000;
+			   ue_TimersAndConstants_t311			      = 10000;
+			   ue_TimersAndConstants_n310			      = 20;
+			   ue_TimersAndConstants_n311			      = 1;
+
+			 }
+			 );
+    
+    ////////// MME parameters:
+    mme_ip_address      = ( { ipv4       = "192.168.13.11";
+                              ipv6       = "192:168:30::17";
+                              active     = "yes";
+                              preference = "ipv4";
+                            }
+                          );
+
+    NETWORK_INTERFACES : 
+    {
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.13.10/24";
+
+        ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.13.10/24";
+        ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
+    };
+ /*
+    otg_config = (
+    	         {	      	
+    	      	 ue_id				=1;
+	     	 app_type			="scbr";
+	      	 bg_traffic			="disable";
+	      	 },
+	      	 {	      	
+    	      	 ue_id				=2;
+	      	 app_type			="bcbr";
+	      	 bg_traffic			="enable";
+	      	 }
+	      );
+*/
+    log_config : 
+    {
+	global_log_level                      ="info"; 
+    	global_log_verbosity                  ="medium";
+	hw_log_level                          ="debug"; 
+    	hw_log_verbosity                      ="medium";
+	phy_log_level                         ="info"; 
+    	phy_log_verbosity                     ="medium";
+	mac_log_level                         ="info"; 
+    	mac_log_verbosity                     ="high";
+	rlc_log_level                         ="info"; 
+    	rlc_log_verbosity                     ="medium";
+	pdcp_log_level                        ="info"; 
+    	pdcp_log_verbosity                    ="medium";
+	rrc_log_level                         ="debug"; 
+    	rrc_log_verbosity                     ="medium";
+	gtpu_log_level                         ="error"; 
+    	gtpu_log_verbosity                     ="medium";
+	udp_log_level                         ="error"; 
+    	udp_log_verbosity                     ="medium";
+	osa_log_level                         ="warn"; 
+    	osa_log_verbosity                     ="low";
+
+   };	
+   
+  }
+);
diff --git a/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml b/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml
index ddf1deb7581b2dbf055e3ea2c364d716c9134552..0cadccd97680f527617114ff8cde863dbba3b3ff 100755
--- a/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml
+++ b/targets/SIMU/EXAMPLES/OSD/WEBXML/template_26.xml
@@ -3,11 +3,14 @@
     <FADING>
       <FREE_SPACE_MODEL_PARAMETERS>
 	<PATHLOSS_EXPONENT>2.0</PATHLOSS_EXPONENT>
+	<PATHLOSS_0_dB>-100</PATHLOSS_0_dB><!--pathloss at 1km -->
       </FREE_SPACE_MODEL_PARAMETERS>
       <SMALL_SCALE>AWGN</SMALL_SCALE>
     </FADING>
-    <SYSTEM_FREQUENCY_GHz>1.9</SYSTEM_FREQUENCY_GHz>
-  </ENVIRONMENT_SYSTEM_CONFIG>
+    <SYSTEM_FREQUENCY_GHz>1.9</SYSTEM_FREQUENCY_GHz>  
+    <TRANSMISSION_MODE>1</TRANSMISSION_MODE> <!-- validavalue: 1, 2, 5, 6 -->
+  
+ </ENVIRONMENT_SYSTEM_CONFIG>
 
   <TOPOLOGY_CONFIG>	
     <AREA>			
@@ -77,8 +80,8 @@
      <OWD_RADIO_ACCESS>enable</OWD_RADIO_ACCESS>  <!-- option: enable, disable. If enable owd curve shows the one way radio access delay, else it shows end to end owd -->
    </PERFORMANCE_METRICS>
    <LOG>  <!-- set the global log level -->
-     <LEVEL>debug</LEVEL>
-     <VERBOSITY>medium</VERBOSITY>
+     <LEVEL>info</LEVEL>
+     <VERBOSITY>low</VERBOSITY>
      <INTERVAL>1</INTERVAL>
    </LOG>		
    <SEED_VALUE>0</SEED_VALUE>	 <!-- value 0 means randomly generated by OAI -->
diff --git a/targets/SIMU/USER/Makefile b/targets/SIMU/USER/Makefile
index 04ad7ddfc04244dbac01be540bc7893766b0f4b1..fcb02176614d02059202b887872147b7552ae666 100644
--- a/targets/SIMU/USER/Makefile
+++ b/targets/SIMU/USER/Makefile
@@ -52,6 +52,14 @@ ifdef EMOS
 CFLAGS+=-DEMOS
 endif
 
+ifeq ($(LOCALIZATION), 1)
+CFLAGS += -DLOCALIZATION
+endif
+
+ifeq ($(LINUX_LIST), 1)
+CFLAGS += -DLINUX_LIST
+endif
+
 ifdef TRAFFIC_TM5
 CFLAGS += -DRLC_UM_TEST_TRAFFIC=1 #-DFULL_BUFFER=1
 endif
diff --git a/targets/SIMU/USER/init_lte.c b/targets/SIMU/USER/init_lte.c
index 7d285ea97a1dc95b8b8ad923893846a2e383c535..76ecb01be005351263d4c14459ba34b8c1769c9a 100644
--- a/targets/SIMU/USER/init_lte.c
+++ b/targets/SIMU/USER/init_lte.c
@@ -93,7 +93,17 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms,
         // this is the transmission mode for the signalling channels
     // this will be overwritten with the real transmission mode by the RRC once the UE is connected
     PHY_vars_eNB->transmission_mode[i] = transmission_mode;
-    
+#ifdef LOCALIZATION
+    PHY_vars_eNB->ulsch_eNB[1+i]->aggregation_period_ms = 5000; // 5000 milliseconds // could be given as an argument (TBD))
+    struct timeval ts;
+    gettimeofday(&ts, NULL);
+    PHY_vars_eNB->ulsch_eNB[1+i]->reference_timestamp_ms = ts.tv_sec * 1000 + ts.tv_usec / 1000;
+    initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_rss_list);
+    initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_rssi_list);
+    initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_subcarrier_rss_list);
+    initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_timing_advance_list);    
+    initialize(&PHY_vars_eNB->ulsch_eNB[1+i]->loc_timing_update_list);    
+#endif    
   }
   
   // ULSCH for RA
@@ -125,7 +135,7 @@ PHY_VARS_eNB* init_lte_eNB(LTE_DL_FRAME_PARMS *frame_parms,
   PHY_vars_eNB->check_for_SUMIMO_transmissions = 0;
 
   PHY_vars_eNB->lte_frame_parms.pucch_config_common.deltaPUCCH_Shift = 1;
-
+     
   return (PHY_vars_eNB);
 }
 
diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c
index 1b20386c2700ebe400126bd491da208456ff1002..cfb6d237a6bae8b4d3ed70be16401c57783ad7b6 100644
--- a/targets/SIMU/USER/oaisim.c
+++ b/targets/SIMU/USER/oaisim.c
@@ -565,7 +565,7 @@ void *l2l1_task(void *args_p) {
   start_meas(&oaisim_stats);
   for (frame = 0; (l2l1_state != L2L1_TERMINATED) && (frame < oai_emulation.info.n_frames); frame++) {
 
- 
+
 #if defined(ENABLE_ITTI)
     do {
       // Checks if a message has been sent to L2L1 task
@@ -661,7 +661,7 @@ void *l2l1_task(void *args_p) {
     for (slot = 0; slot < 20; slot++) {
       if (slot%2==0)
 	start_meas(&oaisim_stats_f);
-
+	
       wait_for_slot_isr ();
 
 #if defined(ENABLE_ITTI)
@@ -1272,7 +1272,7 @@ void *l2l1_task(void *args_p) {
     
       
     }
-    for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
+      for (eNB_id=0; eNB_id<NB_eNB_INST; eNB_id++) {
       
       for (UE_id=0; UE_id<NB_UE_INST; UE_id++) {
 	  reset_meas(&eNB2UE[eNB_id][UE_id][0]->random_channel);
@@ -1285,66 +1285,69 @@ void *l2l1_task(void *args_p) {
 	  reset_meas(&UE2eNB[UE_id][eNB_id][0]->convolution);
       }
 
-      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][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][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][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);
-      
-      /* 
-       * L2 functions 
-       */
-      // eNB MAC
-      reset_meas(&eNB_mac_inst[eNB_id].eNB_scheduler); // total 
-      reset_meas(&eNB_mac_inst[eNB_id].schedule_si); // only schedule + tx
-      reset_meas(&eNB_mac_inst[eNB_id].schedule_ra); // only ra
-      reset_meas(&eNB_mac_inst[eNB_id].schedule_ulsch); // onlu ulsch
-      reset_meas(&eNB_mac_inst[eNB_id].fill_DLSCH_dci);// only dci
-      reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor); // include rlc_data_req + MAC header gen
-      reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch); // include rlc_data_req + MAC header gen + pre-processor
-      reset_meas(&eNB_mac_inst[eNB_id].schedule_mch); // only embms 
-      reset_meas(&eNB_mac_inst[eNB_id].rx_ulsch_sdu); // include rlc_data_ind + mac header parser
-      
-      reset_meas(&eNB_pdcp_stats[eNB_id].pdcp_run);
-      reset_meas(&eNB_pdcp_stats[eNB_id].data_req);
-      reset_meas(&eNB_pdcp_stats[eNB_id].data_ind);
-      reset_meas(&eNB_pdcp_stats[eNB_id].apply_security);
-      reset_meas(&eNB_pdcp_stats[eNB_id].validate_security);
-      reset_meas(&eNB_pdcp_stats[eNB_id].pdcp_ip);
-      reset_meas(&eNB_pdcp_stats[eNB_id].ip_pdcp);
+	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][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][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][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);
+#ifdef LOCALIZATION
+        reset_meas(&PHY_vars_eNB_g[eNB_id][0]->localization_stats);
+#endif  
+        
+	/* 
+	 * L2 functions 
+	 */
+	// eNB MAC
+	reset_meas(&eNB_mac_inst[eNB_id].eNB_scheduler); // total 
+	reset_meas(&eNB_mac_inst[eNB_id].schedule_si); // only schedule + tx
+	reset_meas(&eNB_mac_inst[eNB_id].schedule_ra); // only ra
+	reset_meas(&eNB_mac_inst[eNB_id].schedule_ulsch); // onlu ulsch
+	reset_meas(&eNB_mac_inst[eNB_id].fill_DLSCH_dci);// only dci
+	reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch_preprocessor); // include rlc_data_req + MAC header gen
+	reset_meas(&eNB_mac_inst[eNB_id].schedule_dlsch); // include rlc_data_req + MAC header gen + pre-processor
+	reset_meas(&eNB_mac_inst[eNB_id].schedule_mch); // only embms 
+	reset_meas(&eNB_mac_inst[eNB_id].rx_ulsch_sdu); // include rlc_data_ind + mac header parser
+     
+	reset_meas(&eNB_pdcp_stats[eNB_id].pdcp_run);
+	reset_meas(&eNB_pdcp_stats[eNB_id].data_req);
+	reset_meas(&eNB_pdcp_stats[eNB_id].data_ind);
+	reset_meas(&eNB_pdcp_stats[eNB_id].apply_security);
+	reset_meas(&eNB_pdcp_stats[eNB_id].validate_security);
+	reset_meas(&eNB_pdcp_stats[eNB_id].pdcp_ip);
+	reset_meas(&eNB_pdcp_stats[eNB_id].ip_pdcp);
       
+      }
     }
-  }
 
-void print_opp_meas(void){
+  void print_opp_meas(void){
   
-  uint8_t eNB_id=0,UE_id=0;
+    uint8_t eNB_id=0,UE_id=0;
 
     print_meas(&oaisim_stats,"[OAI][total_exec_time]", &oaisim_stats,&oaisim_stats);
     print_meas(&oaisim_stats_f,"[OAI][SF_exec_time]", &oaisim_stats,&oaisim_stats_f);
@@ -1433,7 +1436,10 @@ void print_opp_meas(void){
       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][0]->rx_prach,"[eNB][rx_prach]",&oaisim_stats,&oaisim_stats_f);
-
+      
+#ifdef LOCALIZATION
+      print_meas(&PHY_vars_eNB_g[eNB_id][0]->localization_stats, "[eNB][LOCALIZATION]",&oaisim_stats,&oaisim_stats_f);
+#endif  
     }
 
     for (UE_id=0; UE_id<NB_UE_INST;UE_id++) {
diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c
index 8a75cf749900cf011c3b00d18d05262ddf577717..ea9472773f5e5dc8a54e9d7c6666aa9a95320784 100644
--- a/targets/SIMU/USER/oaisim_functions.c
+++ b/targets/SIMU/USER/oaisim_functions.c
@@ -51,6 +51,7 @@
 #include "RRC/LITE/extern.h"
 #include "RRC/L2_INTERFACE/openair_rrc_L2_interface.h"
 #include "PHY_INTERFACE/extern.h"
+//#include "ARCH/CBMIMO1/DEVICE_DRIVER/extern.h"
 #include "SCHED/extern.h"
 #include "SIMULATION/ETH_TRANSPORT/proto.h"
 #include "UTIL/OCG/OCG_extern.h"
@@ -811,18 +812,7 @@ void init_openair1(void) {
 #endif
   // change the nb_connected_eNB
   for (CC_id=0;CC_id<MAX_NUM_CCs;CC_id++) {
-    init_lte_vars (&frame_parms[CC_id], 
-		   oai_emulation.info.frame_type[CC_id], 
-		   oai_emulation.info.tdd_config[CC_id], 
-		   oai_emulation.info.tdd_config_S[CC_id],
-		   oai_emulation.info.extended_prefix_flag[CC_id],
-		   oai_emulation.info.N_RB_DL[CC_id], 
-		   Nid_cell, 
-		   cooperation_flag, 
-		   oai_emulation.info.transmission_mode[CC_id], 
-		   abstraction_flag,
-		   nb_antennas_rx, 
-		   oai_emulation.info.eMBMS_active_state);
+    init_lte_vars (&frame_parms[CC_id], oai_emulation.info.frame_type[CC_id], oai_emulation.info.tdd_config[CC_id], oai_emulation.info.tdd_config_S[CC_id],oai_emulation.info.extended_prefix_flag[CC_id],oai_emulation.info.N_RB_DL[CC_id], Nid_cell, cooperation_flag, oai_emulation.info.transmission_mode[CC_id], abstraction_flag,nb_antennas_rx, oai_emulation.info.eMBMS_active_state);
   }
 
   for (eNB_id=0; eNB_id<NB_eNB_INST;eNB_id++){
@@ -844,8 +834,8 @@ void init_openair1(void) {
    printf ("AFTER init: MAX_NUM_CCs %d, Nid_cell %d frame_type %d,tdd_config %d\n",
 	  MAX_NUM_CCs,
 	  PHY_vars_eNB_g[0][0]->lte_frame_parms.Nid_cell,
-	  PHY_vars_eNB_g[0][0]->lte_frame_parms.frame_type,
-	  PHY_vars_eNB_g[0][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;
 
@@ -1120,6 +1110,14 @@ void update_ocm() {
 	  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);
+          double dx, dy, distance;
+          dx = enb_data[eNB_id]->x - ue_data[UE_id]->x;
+          dy = enb_data[eNB_id]->y - ue_data[UE_id]->y;
+          distance = sqrt(dx * dx + dy * dy);
+          /*LOG_D(LOCALIZE, " OCM distance between eNB %d at (%f,%f) and UE %d at (%f,%f) is %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,
+                  distance);*/
 	}
       }
     }
diff --git a/targets/TEST/OAI/case02.py b/targets/TEST/OAI/case02.py
index fcd36a4655679216ec96b533bb5277574766590d..274a23596ae93e38cf5a87aaf7cb77367858355d 100644
--- a/targets/TEST/OAI/case02.py
+++ b/targets/TEST/OAI/case02.py
@@ -170,13 +170,13 @@ def execute(oai, user, pw, host, logfile,logdir,debug):
     try:
         test = '06'
         name = 'Run oai.rel8.itti.abs.rrc'
-        diag = 'RRC procedure is not finished completely, check the eNB config file (default is enb.sfr.sud.conf), in addition to the execution logs and trace BCCH, CCCH, and DCCH channels'
+        diag = 'RRC procedure is not finished completely, check the eNB config file (default is enb.band7.generic.conf), in addition to the execution logs and trace BCCH, CCCH, and DCCH channels'
         for i in range(NUM_UE) :
             for j in range(NUM_eNB) :
                 log_name = logdir + '/log_' + host + case + test + '_' + str(i) + str(j)
                 itti_name = log_name + '.log'
                 trace_name = log_name + '.txt'
-                conf = '-a -l7 -A AWGN --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.exmimo2.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name
+                conf = '-a -l7 -A AWGN --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name
                 tee = ' 2>&1 | tee -a ' + trace_name
                 command = './oaisim.rel8.itti.' + host + ' ' + conf
                 oai.send('echo ' + command + ' > ' + trace_name + ';')
diff --git a/targets/TEST/OAI/case03.py b/targets/TEST/OAI/case03.py
index 16287b03200efe23b762f21e8ce0276bbe26f55b..296bb488cadf1e22210173ceace60225cc906bb9 100644
--- a/targets/TEST/OAI/case03.py
+++ b/targets/TEST/OAI/case03.py
@@ -189,13 +189,13 @@ def execute(oai, user, pw, host, logfile,logdir,debug):
 #    try:
 #        test = '09'
 #        name = 'Run oai.rel10.itti.phy.eMBMS.MCCH'
-#        diag = 'eMBMS procedure is not finished completely, check the eNB config file (enb.sfr.sud.conf), and make sure that the SIB13/MCCH have been correclty received by UEs'
+#        diag = 'eMBMS procedure is not finished completely, check the eNB config file (enb.band7.generic.conf), and make sure that the SIB13/MCCH have been correclty received by UEs'
 #        for i in range(NUM_UE) :
 #            for j in range(NUM_eNB) :
 #                log_name = logdir + '/log_' + host + case + test + '_' + str(i) + str(j)
 #                itti_name = log_name + '.log'
 #                trace_name = log_name + '.txt'
-#                conf = '-A AWGN -l7 -x 1 -Q3 --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.sfr.sud.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name
+#                conf = '-A AWGN -l7 -x 1 -Q3 --enb-conf ../../PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.generic.conf -n' + str((i+1+j) * 50) + ' -u' + str(i+1) +' -b'+ str(j+1) + ' -K' + itti_name
 #                tee = ' 2>&1 | tee -a ' + trace_name
 #                command = './oaisim.rel10.itti.' + host + ' ' + conf
 #                oai.send('echo ' + command + ' > ' + trace_name + ';')
diff --git a/targets/TEST/OAI/openair.py b/targets/TEST/OAI/openair.py
index 4d9787141bbbb5554b5fb4654d4247a83400912b..94d42611a4ecb1ebb64f18d108925f7f74927846 100644
--- a/targets/TEST/OAI/openair.py
+++ b/targets/TEST/OAI/openair.py
@@ -101,7 +101,39 @@ class openair(core):
         except Error, val :
                 print "Error: can't connect to"+username+"@"+self.address
                 
+    def connect2(self, username, password, prompt='$'):
+        self.prompt1 = prompt
+        self.prompt2 = prompt
+                   
+        while 1:
+            try:
+                if  not username:
+                    username = root 
+                if  not password:
+                    password = username 
                     
+                self.oai = pexpect.spawn('ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" -o "ConnectionAttempts=1" ' \
+                                             + username + '@' + self.address)
+                
+                index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=40)
+                if index == 0 :
+                    return 'Ok'
+                else :
+                    index = self.oai.expect(['password:', pexpect.TIMEOUT], timeout=40)
+                    if index == 0 : 
+                        self.oai.sendline(password)
+                        index = self.oai.expect([re.escape(self.prompt1), re.escape(self.prompt2), pexpect.TIMEOUT], timeout=10)
+                        if index != 0:
+                            print 'ERROR! could not login with SSH.'
+                            print 'Expected ' + self.prompt1 + ', received >>>>' + self.oai.before + '<<<<'
+                            sys.exit(1) 
+                    return 'Ok'
+                        
+            except Exception, val:
+                time.sleep(5)
+                print "Error:", val
+ 
+                
     def disconnect(self):
         print 'disconnecting the ssh connection to ' + self.address + '\n'
         self.oai.send('exit')
diff --git a/targets/TEST/OAI/test01.py b/targets/TEST/OAI/test01.py
index ed952179f9b4e11cbc051fee2a3b1f1e615acaf2..0c77f57bbb579e375b91afa1a8ae66b8b9fea28d 100644
--- a/targets/TEST/OAI/test01.py
+++ b/targets/TEST/OAI/test01.py
@@ -111,7 +111,9 @@ try:
         print "username: " + user 
         #print "password: " + pw 
 
-    oai.connect(user,pw)
+       # issues in ubuntu 12.04
+    #  oai.connect(user,pw)
+    oai.connect2(user,pw) 
     #oai.get_shell()
 except :
     print 'Fail to connect to the local host'