diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile
index 3da4aa13a17528cc1396f5eedc2e40eee91c2cb1..792c2a407c1ce1233ad8930396a86996020c2001 100644
--- a/common/utils/T/tracer/Makefile
+++ b/common/utils/T/tracer/Makefile
@@ -60,6 +60,11 @@ macpdu2wireshark: macpdu2wireshark.o database.o utils.o handler.o event.o \
 multi: multi.o utils.o database.o config.o
 	$(CC) $(CFLAGS) -o multi $^ $(LIBS)
 
+multi.o: ../T_IDs.h
+
+../T_IDs.h:
+	cd .. && $(MAKE)
+
 .PHONY: all gui/gui.a view/view.a logger/logger.a filter/filter.a
 
 gui/gui.a:
diff --git a/common/utils/T/tracer/extract.c b/common/utils/T/tracer/extract.c
index 2aec38831fe2c528cd12cbaa3814e75813eb3bfe..d66e8a3bb8517a82c985af61aebc46af012825d0 100644
--- a/common/utils/T/tracer/extract.c
+++ b/common/utils/T/tracer/extract.c
@@ -16,6 +16,8 @@ void usage(void)
 "    -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"
+"    -after <raw time> <nsec>  'event' time has to be greater than this\n"
+"    -count <n>                dump 'n' matching events (less if EOF reached)\n"
   );
   exit(1);
 }
@@ -51,6 +53,10 @@ int main(int n, char **v)
   int filter_count = 0;
   int buffer_arg;
   int found;
+  int count = 1;
+  int check_time = 0;
+  time_t sec;
+  long nsec;
 
   for (i = 1; i < n; i++) {
     if (!strcmp(v[i], "-h") || !strcmp(v[i], "--help")) usage();
@@ -63,6 +69,14 @@ int main(int n, char **v)
       filter_value[filter_count++] = atoi(v[++i]);
       continue;
     }
+    if (!strcmp(v[i], "-after")) { if (i>n-3) usage();
+      check_time = 1;
+      sec        = atoll(v[++i]);
+      nsec       = atol(v[++i]);
+      continue;
+    }
+    if (!strcmp(v[i], "-count"))
+      { if (i > n-2) usage(); 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; }
@@ -111,13 +125,20 @@ int main(int n, char **v)
         break;
     if (i != filter_count)
       continue;
+    if (check_time &&
+        !(e.sending_time.tv_sec > sec ||
+         (e.sending_time.tv_sec == sec && e.sending_time.tv_nsec >= nsec)))
+      continue;
     if (fwrite(e.e[buffer_arg].b, e.e[buffer_arg].bsize, 1, out) != 1)
       { perror(output_file); exit(1); }
-    found = 1;
-    break;
+    found++;
+    if (found == count)
+      break;
   }
 
   if (found == 0) printf("ERROR: event not found\n");
+  if (found != count)
+    printf("WARNING: dumped %d events (wanted %d)\n", found, count);
 
   fclose(out);
 
diff --git a/common/utils/T/tracer/logger/logger.h b/common/utils/T/tracer/logger/logger.h
index 434cf5a90fee02a4c97d33ddcab26e5f484b193c..7c019b4797244b5edc4a8120cc551392f52b09fb 100644
--- a/common/utils/T/tracer/logger/logger.h
+++ b/common/utils/T/tracer/logger/logger.h
@@ -30,6 +30,7 @@ void framelog_set_skip(logger *_this, int skip_delay);
 void framelog_set_update_only_at_sf9(logger *_this, int update_only_at_sf9);
 
 void textlog_dump_buffer(logger *_this, int dump_buffer);
+void textlog_raw_time(logger *_this, int raw_time);
 
 #include "view/view.h"
 
diff --git a/common/utils/T/tracer/logger/textlog.c b/common/utils/T/tracer/logger/textlog.c
index 9eb6fd02d8fbbec5d63702c4b89d80df2327fe92..76f920e1e2e96bb0b68971ce9826b78a7e441c3f 100644
--- a/common/utils/T/tracer/logger/textlog.c
+++ b/common/utils/T/tracer/logger/textlog.c
@@ -33,6 +33,7 @@ struct textlog {
   /* local output buffer */
   OBUF o;
   int dump_buffer;
+  int raw_time;
 };
 
 static void _event(void *p, event e)
@@ -51,9 +52,13 @@ static void _event(void *p, event e)
 
 #ifdef T_SEND_TIME
   t = localtime(&e.sending_time.tv_sec);
-  /* round tv_nsec to nearest millisecond */
-  sprintf(tt, "%2.2d:%2.2d:%2.2d.%9.9ld: ", t->tm_hour, t->tm_min, t->tm_sec,
-      e.sending_time.tv_nsec);
+  if (l->raw_time)
+    sprintf(tt, "%2.2d:%2.2d:%2.2d.%9.9ld [%ld]: ",
+        t->tm_hour, t->tm_min, t->tm_sec,
+        e.sending_time.tv_nsec, e.sending_time.tv_sec);
+  else
+    sprintf(tt, "%2.2d:%2.2d:%2.2d.%9.9ld: ", t->tm_hour, t->tm_min, t->tm_sec,
+        e.sending_time.tv_nsec);
   PUTS(&l->o, tt);
 #endif
 
@@ -215,3 +220,9 @@ void textlog_dump_buffer(logger *_this, int dump_buffer)
   struct textlog *l = _this;
   l->dump_buffer = dump_buffer;
 }
+
+void textlog_raw_time(logger *_this, int raw_time)
+{
+  struct textlog *l = _this;
+  l->raw_time = raw_time;
+}
diff --git a/common/utils/T/tracer/textlog.c b/common/utils/T/tracer/textlog.c
index bb773b42150b9fcc15b7378405818a4b14db0e42..a123bf9bf518b9104d224c5a3d849c5cc690e7af 100644
--- a/common/utils/T/tracer/textlog.c
+++ b/common/utils/T/tracer/textlog.c
@@ -52,6 +52,7 @@ void usage(void)
 "                                    they will be processed in order\n"
 "                                    by default, all is off\n"
 "    -full                     also dump buffers' content\n"
+"    -raw-time                 also prints 'raw time'\n"
 "    -ip <host>                connect to given IP address (default %s)\n"
 "    -p <port>                 connect to given port (default %d)\n"
 "    -x                        GUI output\n"
@@ -91,6 +92,7 @@ int main(int n, char **v)
   int gui_active = 1;
   textlog_data textlog_data;
   int full = 0;
+  int raw_time = 0;
 
   /* write on a socket fails if the other end is closed and we get SIGPIPE */
   if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) abort();
@@ -117,6 +119,7 @@ int main(int n, char **v)
     if (!strcmp(v[i], "-debug-gui")) { gui_logd = 1; continue; }
     if (!strcmp(v[i], "-no-gui")) { gui_active = 0; continue; }
     if (!strcmp(v[i], "-full")) { full = 1; continue; }
+    if (!strcmp(v[i], "-raw-time")) { raw_time = 1; continue; }
     usage();
   }
 
@@ -162,6 +165,7 @@ int main(int n, char **v)
 //        "ev: {} eNB_id [eNB_ID] frame [frame] subframe [subframe]");
     logger_add_view(textlog, out);
     if (full) textlog_dump_buffer(textlog, 1);
+    if (raw_time) textlog_raw_time(textlog, 1);
     free(name);
     free(desc);
   }
@@ -187,7 +191,7 @@ int main(int n, char **v)
   while (1) {
     event e;
     e = get_event(textlog_data.socket, &ebuf, database);
-    if (e.type == -1) abort();
+    if (e.type == -1) break;
     handle_event(h, e);
   }