diff --git a/common/utils/T/tracer/macpdu2wireshark.c b/common/utils/T/tracer/macpdu2wireshark.c
index f65fdf34c328609487946693de81efb1a41fe104..d9bcb8b7f5f255cca66ba4a36ffa561687aa0baf 100644
--- a/common/utils/T/tracer/macpdu2wireshark.c
+++ b/common/utils/T/tracer/macpdu2wireshark.c
@@ -14,10 +14,10 @@
 #define DEFAULT_IP   "127.0.0.1"
 #define DEFAULT_PORT 9999
 
-#define NO_PREAMBLE -1
+#define DEFAULT_LIVE_IP   "127.0.0.1"
+#define DEFAULT_LIVE_PORT 2021
 
-int no_sib = 0;
-int no_mib = 0;
+#define NO_PREAMBLE -1
 
 typedef struct {
   int socket;
@@ -46,6 +46,15 @@ typedef struct {
   int rar_frame;
   int rar_subframe;
   int rar_data;
+  /* config */
+  int no_mib;
+  int no_sib;
+  int max_mib;
+  int max_sib;
+  int live;
+  /* runtime vars */
+  int cur_mib;
+  int cur_sib;
 } ev_data;
 
 void trace(ev_data *d, int direction, int rnti_type, int rnti,
@@ -104,7 +113,11 @@ void dl(void *_d, event e)
 {
   ev_data *d = _d;
 
-  if (e.e[d->dl_rnti].i == 0xffff && no_sib) return;
+  if (e.e[d->dl_rnti].i == 0xffff) {
+    if (d->no_sib) return;
+    if (d->max_sib && d->cur_sib == d->max_sib) return;
+    d->cur_sib++;
+  }
 
   trace(d, DIRECTION_DOWNLINK,
         e.e[d->dl_rnti].i != 0xffff ? C_RNTI : SI_RNTI, e.e[d->dl_rnti].i,
@@ -117,7 +130,9 @@ void mib(void *_d, event e)
 {
   ev_data *d = _d;
 
-  if (no_mib) return;
+  if (d->no_mib) return;
+  if (d->max_mib && d->cur_mib == d->max_mib) return;
+  d->cur_mib++;
 
   trace(d, DIRECTION_DOWNLINK, NO_RNTI, 0,
         e.e[d->mib_frame].i, e.e[d->mib_subframe].i,
@@ -269,9 +284,18 @@ void usage(void)
 "    -ip <IP address>          send packets to this IP address (default %s)\n"
 "    -p <port>                 send packets to this port (default %d)\n"
 "    -no-mib                   do not report MIB\n"
-"    -no-sib                   do not report SIBs\n",
+"    -no-sib                   do not report SIBs\n"
+"    -max-mib <n>              report at maximum n MIB\n"
+"    -max-sib <n>              report at maximum n SIBs\n"
+"    -live                     run live\n"
+"    -live-ip <IP address>     tracee's IP address (default %p)\n"
+"    -live-port <por>          tracee's port (default %d)\n"
+"-i and -live are mutually exclusive options. One of them must be provided\n"
+"but not both.\n",
   DEFAULT_IP,
-  DEFAULT_PORT
+  DEFAULT_PORT,
+  DEFAULT_LIVE_IP,
+  DEFAULT_LIVE_PORT
   );
   exit(1);
 }
@@ -288,6 +312,9 @@ int main(int n, char **v)
   ev_data d;
   char *ip = DEFAULT_IP;
   int port = DEFAULT_PORT;
+  char *live_ip = DEFAULT_LIVE_IP;
+  int live_port = DEFAULT_LIVE_PORT;
+  int live = 0;
 
   memset(&d, 0, sizeof(ev_data));
 
@@ -299,8 +326,17 @@ int main(int n, char **v)
       { if (i > n-2) usage(); input_filename = v[++i]; continue; }
     if (!strcmp(v[i], "-ip")) { if (i > n-2) usage(); ip = v[++i]; continue; }
     if (!strcmp(v[i], "-p")) {if(i>n-2)usage(); port=atoi(v[++i]); continue; }
-    if (!strcmp(v[i], "-no-mib")) { no_mib = 1; continue; }
-    if (!strcmp(v[i], "-no-sib")) { no_sib = 1; continue; }
+    if (!strcmp(v[i], "-no-mib")) { d.no_mib = 1; continue; }
+    if (!strcmp(v[i], "-no-sib")) { d.no_sib = 1; continue; }
+    if (!strcmp(v[i], "-max-mib"))
+      { if (i > n-2) usage(); d.max_mib = atoi(v[++i]); continue; }
+    if (!strcmp(v[i], "-max-sib"))
+      { if (i > n-2) usage(); d.max_sib = atoi(v[++i]); continue; }
+    if (!strcmp(v[i], "-live")) { live = 1; continue; }
+    if (!strcmp(v[i], "-live-ip"))
+      { if (i > n-2) usage(); live_ip = v[++i]; continue; }
+    if (!strcmp(v[i], "-live-port"))
+      { if (i > n-2) usage(); live_port = atoi(v[++i]); continue; }
     usage();
   }
 
@@ -309,19 +345,47 @@ int main(int n, char **v)
     exit(1);
   }
 
-  if (input_filename == NULL) {
-    printf("ERROR: provide an input file (-i)\n");
+  if (input_filename == NULL && live == 0) {
+    printf("ERROR: provide an input file (-i) or run live (-live)\n");
+    exit(1);
+  }
+
+  if (input_filename != NULL && live != 0) {
+    printf("ERROR: cannot use both -i and -live\n");
     exit(1);
   }
 
-  in = open(input_filename, O_RDONLY);
-  if (in == -1) { perror(input_filename); return 1; }
+  if (live == 0) {
+    in = open(input_filename, O_RDONLY);
+    if (in == -1) { perror(input_filename); return 1; }
+  } else
+    in = connect_to(live_ip, live_port);
 
   database = parse_database(database_filename);
   load_config_file(database_filename);
 
   h = new_handler(database);
 
+  if (live) {
+    char mt = 1;
+    int  number_of_events = number_of_ids(database);
+    int *is_on = calloc(number_of_events, sizeof(int));
+    if (is_on == NULL) { printf("ERROR: out of memory\n"); exit(1); }
+    on_off(database, "ENB_MAC_UE_UL_PDU_WITH_DATA", is_on, 1);
+    on_off(database, "ENB_MAC_UE_DL_PDU_WITH_DATA", is_on, 1);
+    on_off(database, "ENB_PHY_MIB", is_on, 1);
+    on_off(database, "ENB_PHY_INITIATE_RA_PROCEDURE", is_on, 1);
+    on_off(database, "ENB_MAC_UE_DL_RAR_PDU_WITH_DATA", is_on, 1);
+    /* activate selected traces */
+    if (socket_send(in, &mt, 1) == -1 ||
+        socket_send(in, &number_of_events, sizeof(int)) == -1 ||
+        socket_send(in, is_on, number_of_events * sizeof(int)) == -1) {
+      printf("ERROR: socket_send failed\n");
+      exit(1);
+    }
+    free(is_on);
+  }
+
   ul_id = event_id_from_name(database, "ENB_MAC_UE_UL_PDU_WITH_DATA");
   dl_id = event_id_from_name(database, "ENB_MAC_UE_DL_PDU_WITH_DATA");
   mib_id = event_id_from_name(database, "ENB_PHY_MIB");