diff --git a/common/utils/T/.gitignore b/common/utils/T/.gitignore
index 85ff166c1ab4a1c217d22a0d1038f9a9955092da..817780592428b38fd48b57f26be6b3a73868ae63 100644
--- a/common/utils/T/.gitignore
+++ b/common/utils/T/.gitignore
@@ -14,4 +14,5 @@ tracer/ue
 tracer/to_vcd
 tracer/extract_input_subframe
 tracer/extract_output_subframe
+tracer/extract
 tracee/tracee
diff --git a/common/utils/T/T_defs.h b/common/utils/T/T_defs.h
index 65f2430265574103ceaccd47970f84307f6bfaa6..24845b6b9eafb2241ad62e7cc9e9ad643f0ecbbb 100644
--- a/common/utils/T/T_defs.h
+++ b/common/utils/T/T_defs.h
@@ -29,10 +29,10 @@ typedef struct {
 #define T_SHM_FILENAME "/T_shm_segment"
 
 /* number of VCD functions (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_FUNCTIONS 172
+#define VCD_NUM_FUNCTIONS 178
 
 /* number of VCD variables (to be kept up to date! see in T_messages.txt) */
-#define VCD_NUM_VARIABLES 118
+#define VCD_NUM_VARIABLES 128
 
 /* first VCD function (to be kept up to date! see in T_messages.txt) */
 #define VCD_FIRST_FUNCTION    ((uintptr_t)T_VCD_FUNCTION_RT_SLEEP)
diff --git a/common/utils/T/T_messages.txt b/common/utils/T/T_messages.txt
index 0eef56505a1e8484f24134d8779f0cfe8c96d19a..3e37b5ea150c7913d5c596001c03d364db13f828 100644
--- a/common/utils/T/T_messages.txt
+++ b/common/utils/T/T_messages.txt
@@ -958,6 +958,38 @@ ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_ENB
     DESC = VCD variable SUBFRAME_NUMBER_RX1_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+ID = VCD_VARIABLE_FRAME_NUMBER_TX0_RU
+    DESC = VCD variable FRAME_NUMBER_TX0_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_FRAME_NUMBER_TX1_RU
+    DESC = VCD variable FRAME_NUMBER_TX1_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_FRAME_NUMBER_RX0_RU
+    DESC = VCD variable FRAME_NUMBER_RX0_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_FRAME_NUMBER_RX1_RU
+    DESC = VCD variable FRAME_NUMBER_RX1_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX0_RU
+    DESC = VCD variable SUBFRAME_NUMBER_TX0_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_SUBFRAME_NUMBER_TX1_RU
+    DESC = VCD variable SUBFRAME_NUMBER_TX1_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX0_RU
+    DESC = VCD variable SUBFRAME_NUMBER_RX0_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_SUBFRAME_NUMBER_RX1_RU
+    DESC = VCD variable SUBFRAME_NUMBER_RX1_RU
+    GROUP = ALL:VCD:ENB:VCD_VARIABLE
+    FORMAT = ulong,value
 ID = VCD_VARIABLE_RUNTIME_TX_ENB
     DESC = VCD variable RUNTIME_TX_ENB
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
@@ -1050,6 +1082,14 @@ ID = VCD_VARIABLE_TRX_TST
     DESC = VCD variable TRX_TST
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
     FORMAT = ulong,value
+ID = VCD_VARIABLE_TRX_TS_UE
+    DESC = VCD variable TRX_TS_UE
+    GROUP = ALL:VCD:UE:VCD_VARIABLE
+    FORMAT = ulong,value
+ID = VCD_VARIABLE_TRX_TST_UE
+    DESC = VCD variable TRX_TST_UE
+    GROUP = ALL:VCD:UE:VCD_VARIABLE
+    FORMAT = ulong,value
 ID = VCD_VARIABLE_TRX_WRITE_FLAGS
     DESC = VCD variable TRX_WRITE_FLAGS
     GROUP = ALL:VCD:ENB:VCD_VARIABLE
@@ -1413,6 +1453,14 @@ ID = VCD_FUNCTION_TRX_WRITE
     DESC = VCD function TRX_WRITE
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+ID = VCD_FUNCTION_TRX_READ_UE
+    DESC = VCD function TRX_READ_UE
+    GROUP = ALL:VCD:UE:VCD_FUNCTION
+    FORMAT = int,value
+ID = VCD_FUNCTION_TRX_WRITE_UE
+    DESC = VCD function TRX_WRITE_UE
+    GROUP = ALL:VCD:UE:VCD_FUNCTION
+    FORMAT = int,value
 ID = VCD_FUNCTION_TRX_READ_IF
     DESC = VCD function TRX_READ_IF
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
@@ -1565,12 +1613,28 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_TX1
     DESC = VCD function PHY_PROCEDURES_ENB_TX1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
-ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_COMMON
-    DESC = VCD function PHY_PROCEDURES_ENB_RX_COMMON
+ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX
+    DESC = VCD function PHY_PROCEDURES_RU_FEPRX
+    GROUP = ALL:VCD:ENB:VCD_FUNCTION
+    FORMAT = int,value
+ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPRX1
+    DESC = VCD function PHY_PROCEDURES_RU_FEPRX1
+    GROUP = ALL:VCD:ENB:VCD_FUNCTION
+    FORMAT = int,value
+ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM
+    DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM
+    GROUP = ALL:VCD:ENB:VCD_FUNCTION
+    FORMAT = int,value
+ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_OFDM1
+    DESC = VCD function PHY_PROCEDURES_RU_FEPTX_OFDM1
+    GROUP = ALL:VCD:ENB:VCD_FUNCTION
+    FORMAT = int,value
+ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC
+    DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
-ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_COMMON1
-    DESC = VCD function PHY_PROCEDURES_ENB_RX_COMMON1
+ID = VCD_FUNCTION_PHY_PROCEDURES_RU_FEPTX_PREC1
+    DESC = VCD function PHY_PROCEDURES_RU_FEPTX_PREC1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
 ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC
@@ -1581,10 +1645,6 @@ ID = VCD_FUNCTION_PHY_PROCEDURES_ENB_RX_UESPEC1
     DESC = VCD function PHY_PROCEDURES_ENB_RX_UESPEC1
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
-ID = VCD_FUNCTION_ENB_SLOT_FEP
-    DESC = VCD function ENB_SLOT_FEP
-    GROUP = ALL:VCD:ENB:VCD_FUNCTION
-    FORMAT = int,value
 ID = VCD_FUNCTION_PHY_PROCEDURES_UE_TX
     DESC = VCD function PHY_PROCEDURES_UE_TX
     GROUP = ALL:VCD:UE:VCD_FUNCTION
@@ -1781,6 +1841,10 @@ ID = VCD_FUNCTION_PHY_ENB_PRACH_RX
     DESC = VCD function PHY_ENB_PRACH_RX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
     FORMAT = int,value
+ID = VCD_FUNCTION_PHY_RU_PRACH_RX
+    DESC = VCD function PHY_RU_PRACH_RX
+    GROUP = ALL:VCD:ENB:VCD_FUNCTION
+    FORMAT = int,value
 ID = VCD_FUNCTION_PHY_ENB_PDCCH_TX
     DESC = VCD function PHY_ENB_PDCCH_TX
     GROUP = ALL:VCD:ENB:VCD_FUNCTION
diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile
index c1b0c682a0601f65172269459d10edde32f10661..1c4a77587c3916c9140a9ef71465b08e8a9313aa 100644
--- a/common/utils/T/tracer/Makefile
+++ b/common/utils/T/tracer/Makefile
@@ -7,7 +7,7 @@ LIBS=-lm
 XLIBS=-lX11 -lpng -lXft
 
 all: record replay extract_config textlog enb ue vcd macpdu2wireshark \
-     extract_input_subframe extract_output_subframe to_vcd
+     extract_input_subframe extract_output_subframe to_vcd extract
 
 record: utils.o record.o database.o config.o
 	$(CC) $(CFLAGS) -o record $^ $(LIBS)
@@ -26,6 +26,9 @@ extract_output_subframe: extract_output_subframe.o database.o event.o utils.o \
     config.o
 	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
 
+extract: extract.o database.o event.o utils.o config.o
+	$(CC) $(CFLAGS) -o $@ $^ $(LIBS)
+
 textlog: utils.o textlog.o database.o event.o handler.o config.o \
          event_selector.o view/view.a gui/gui.a logger/logger.a \
          filter/filter.a
@@ -74,7 +77,7 @@ filter/filter.a:
 clean:
 	rm -f *.o core tracer_remote textlog enb ue vcd record replay
 	rm -f extract_config macpdu2wireshark extract_input_subframe
-	rm -f extract_output_subframe to_vcd
+	rm -f extract_output_subframe to_vcd extract
 	cd gui && make clean
 	cd view && make clean
 	cd logger && make clean
diff --git a/common/utils/T/tracer/extract.c b/common/utils/T/tracer/extract.c
new file mode 100644
index 0000000000000000000000000000000000000000..b9fca959eddf6a8428aee25b5aabf37cd51419b5
--- /dev/null
+++ b/common/utils/T/tracer/extract.c
@@ -0,0 +1,124 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include "database.h"
+#include "event.h"
+#include "config.h"
+
+void usage(void)
+{
+  printf(
+"usage: [options] <file> <event> <buffer name>\n"
+"options:\n"
+"    -d <database file>        this option is mandatory\n"
+"    -o <output file>          this option is mandatory\n"
+"    -f <name> <value>         field 'name' of 'event' has to match 'value'\n"
+"                              type of 'name' must be int\n"
+"                              (you can use several -f options)\n"
+  );
+  exit(1);
+}
+
+int get_filter_arg(database_event_format *f, char *field, char *type)
+{
+  int i;
+  for (i = 0; i < f->count; i++)
+    if (!strcmp(f->name[i], field)) {
+      if (strcmp(f->type[i], type)) break;
+      return i;
+    }
+  printf("bad field %s, check that it exists and has type '%s'\n",field,type);
+  exit(1);
+}
+
+int main(int n, char **v)
+{
+  char *database_filename = NULL;
+  void *database;
+  int i;
+  int input_event_id;
+  database_event_format f;
+  char *file = NULL;
+  char *output_file = NULL;
+  FILE *out;
+  int fd;
+  char *event_name = NULL;
+  char *buffer_name = NULL;
+  char *filter[n];
+  int filter_arg[n];
+  int filter_value[n];
+  int filter_count = 0;
+  int buffer_arg;
+  int found;
+
+  for (i = 1; i < n; i++) {
+    if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
+    if (!strcmp(v[i], "-d"))
+      { if (i > n-2) usage(); database_filename = v[++i]; continue; }
+    if (!strcmp(v[i], "-o"))
+      { if (i > n-2) usage(); output_file = v[++i]; continue; }
+    if (!strcmp(v[i], "-f")) { if (i>n-3) usage();
+      filter[filter_count]         = v[++i];
+      filter_value[filter_count++] = atoi(v[++i]);
+      continue;
+    }
+    if (file == NULL) { file = v[i]; continue; }
+    if (event_name == NULL) { event_name = v[i]; continue; }
+    if (buffer_name == NULL) { buffer_name = v[i]; continue; }
+    usage();
+  }
+  if (file == NULL || event_name == NULL || buffer_name == NULL) usage();
+
+  if (database_filename == NULL) {
+    printf("ERROR: provide a database file (-d)\n");
+    exit(1);
+  }
+
+  if (output_file == NULL) {
+    printf("gimme -o <output file>, thanks\n");
+    exit(1);
+  }
+
+  out = fopen(output_file, "w"); if(out==NULL){perror(output_file);exit(1);}
+
+  database = parse_database(database_filename);
+
+  load_config_file(database_filename);
+
+  input_event_id = event_id_from_name(database, event_name);
+  f = get_format(database, input_event_id);
+
+  buffer_arg = get_filter_arg(&f, buffer_name, "buffer");
+
+  for (i = 0; i < filter_count; i++)
+    filter_arg[i] = get_filter_arg(&f, filter[i], "int");
+
+  fd = open(file, O_RDONLY);
+  if (fd == -1) { perror(file); exit(1); }
+
+  found = 0;
+
+  while (1) {
+    char v[T_BUFFER_MAX];
+    event e;
+    e = get_event(fd, v, database);
+    if (e.type == -1) break;
+    if (e.type != input_event_id) continue;
+    for (i = 0; i < filter_count; i++)
+      if (filter_value[i] != e.e[filter_arg[i]].i)
+        break;
+    if (i != filter_count)
+      continue;
+    if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1)
+      { perror(output_file); exit(1); }
+    found = 1;
+    break;
+  }
+
+  if (found == 0) printf("ERROR: event not found\n");
+
+  fclose(out);
+
+  return 0;
+}
diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
index 30538d8298bc0d9f17146a757e9bea36053e1dd1..cd032e688fab2ed984f6fc3e8415cb0699dab498 100644
--- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
+++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c
@@ -227,11 +227,8 @@ int lte_est_timing_advance(LTE_DL_FRAME_PARMS *frame_parms,
 
 int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id)
 {
-  static int first_run=1;
-  static int max_pos_fil2=0;
   int temp, i, aa, max_pos=0, max_val=0;
-  short Re,Im,coef=24576;
-  short ncoef = 32768 - coef;
+  short Re,Im;
 
   LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms;
   LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id];
@@ -260,16 +257,9 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id)
   if (max_pos>frame_parms->ofdm_symbol_size/2)
     max_pos = max_pos-frame_parms->ofdm_symbol_size;
 
-  // filter position to reduce jitter
-  if (first_run == 1) {
-    first_run=0;
-    max_pos_fil2 = max_pos;
-  } else
-    max_pos_fil2 = ((max_pos_fil2 * coef) + (max_pos * ncoef)) >> 15;
-
   //#ifdef DEBUG_PHY
-  LOG_D(PHY,"frame %d: max_pos = %d, max_pos_fil = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,max_pos_fil2,sync_pos);
+  LOG_D(PHY,"frame %d: max_pos = %d, sync_pos=%d\n",eNB->proc.frame_rx,max_pos,sync_pos);
   //#endif //DEBUG_PHY
 
-  return(max_pos_fil2-sync_pos);
+  return max_pos - sync_pos;
 }
diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c
index 5f315725133351fba190106d8fdadfe85b77fc8e..c99776e7e59da87f137106c746c436450c6b8bc2 100644
--- a/openair1/SCHED/phy_procedures_lte_eNb.c
+++ b/openair1/SCHED/phy_procedures_lte_eNb.c
@@ -663,7 +663,7 @@ void prach_procedures(PHY_VARS_eNB *eNB,
 
     {
       if ((eNB->prach_energy_counter == 100) && 
-          (max_preamble_energy[0] > eNB->measurements.prach_I0+200)) {
+          (max_preamble_energy[0] > eNB->measurements.prach_I0+100)) {
 
 	LOG_D(PHY,"[eNB %d/%d][RAPROC] Frame %d, subframe %d Initiating RA procedure with preamble %d, energy %d.%d dB, delay %d\n",
 	      eNB->Mod_id,
@@ -1524,7 +1524,7 @@ void fill_rx_indication(PHY_VARS_eNB *eNB,int UE_id,int frame,int subframe)
   pdu->data                              = eNB->ulsch[UE_id]->harq_processes[harq_pid]->b;
   // estimate timing advance for MAC
   sync_pos                               = lte_est_timing_advance_pusch(eNB,UE_id);
-  timing_advance_update                  = sync_pos - eNB->frame_parms.nb_prefix_samples/4; //to check
+  timing_advance_update                  = sync_pos; // - eNB->frame_parms.nb_prefix_samples/4; //to check
 
   //  if (timing_advance_update > 10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);}
   //  if (timing_advance_update < -10) { dump_ulsch(eNB,frame,subframe,UE_id); exit(-1);}
diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
index 96ffc8a76154350ad4aa7001f5ac458e03d2e610..1fcd07c1d3f889d80827c4da6a0afb4ada035dad 100644
--- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
+++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c
@@ -113,9 +113,13 @@ void rx_sdu(const module_id_t enb_mod_idP,
        UE_list->UE_sched_ctrl[UE_id].ul_inactivity_timer   = 0;
        UE_list->UE_sched_ctrl[UE_id].ul_failure_timer      = 0;
        UE_list->UE_sched_ctrl[UE_id].ul_scheduled         &= (~(1<<harq_pid));
-       /* don't take into account TA if timer is running */
-       if (UE_list->UE_sched_ctrl[UE_id].ta_timer == 0)
-         UE_list->UE_sched_ctrl[UE_id].ta_update             = timing_advance;
+       /* Update with smoothing: 3/4 of old value and 1/4 of new.
+        * This is the logic that was done in the function
+        * lte_est_timing_advance_pusch, maybe it's not necessary?
+        * maybe it's even not correct at all?
+        */
+       UE_list->UE_sched_ctrl[UE_id].ta_update             =
+           (UE_list->UE_sched_ctrl[UE_id].ta_update * 3 + timing_advance)/4;
        UE_list->UE_sched_ctrl[UE_id].pusch_snr[CC_idP]       = ul_cqi;
        UE_list->UE_sched_ctrl[UE_id].ul_consecutive_errors = 0;
        first_rb =  UE_list->UE_template[CC_idP][UE_id].first_rb_ul[harq_pid];
diff --git a/openair2/PHY_INTERFACE/IF_Module.c b/openair2/PHY_INTERFACE/IF_Module.c
index b1014e8bde4305bbda989435bd456e0bec63daeb..ab6551f61c1cfc4801883a43d963e77ce819877d 100644
--- a/openair2/PHY_INTERFACE/IF_Module.c
+++ b/openair2/PHY_INTERFACE/IF_Module.c
@@ -156,6 +156,9 @@ void handle_ulsch(UL_IND_t *UL_info) {
 #define C do { size = 0; put(0); } while (0)
 #define A(...) do { char t[4096]; sprintf(t, __VA_ARGS__); append_string(t); } while (0)
 
+#if 0
+
+/* eats lots of ms at startup, disrupts realtime */
 static char *s;
 static int size;
 static int maxsize;
@@ -169,6 +172,22 @@ static void put(char x)
   s[size++] = x;
 }
 
+#else
+
+/* eats nothing at startup, but fixed size */
+#define SMAX 65536
+static char s[SMAX];
+static int size;
+static int maxsize = SMAX;
+
+static void put(char x)
+{
+  if (size == maxsize) { printf("incrase SMAX\n"); exit(1); }
+  s[size++] = x;
+}
+
+#endif
+
 static void append_string(char *t)
 {
   size--;