diff --git a/common/utils/T/tracer/Makefile b/common/utils/T/tracer/Makefile
index 4345db1f7078c97e847615885c3a21b662041eee..ee289aae59636c629934de82eddbedf0932d832d 100644
--- a/common/utils/T/tracer/Makefile
+++ b/common/utils/T/tracer/Makefile
@@ -55,3 +55,4 @@ clean:
 	cd view && make clean
 	cd logger && make clean
 	cd filter && make clean
+	cd hacks && make clean
diff --git a/common/utils/T/tracer/hacks/Makefile b/common/utils/T/tracer/hacks/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..ab10305c0b356c7085695c9099d1fc93492330e9
--- /dev/null
+++ b/common/utils/T/tracer/hacks/Makefile
@@ -0,0 +1,18 @@
+CC=gcc
+CFLAGS=-Wall -g -pthread -DT_TRACER -I. -I..
+
+LIBS=-lX11 -lm -lpng -lXft
+
+all: dump_nack_signal
+
+dump_nack_signal: ../utils.o ../database.o ../config.o ../event.o \
+                  dump_nack_signal.o
+	$(CC) $(CFLAGS) -o dump_nack_signal $^ $(LIBS)
+
+.PHONY: all
+
+%.o: %.c
+	$(CC) $(CFLAGS) -c -o $@ $<
+
+clean:
+	rm -f *.o core dump_nack_signal
diff --git a/common/utils/T/tracer/hacks/dump_nack_signal.c b/common/utils/T/tracer/hacks/dump_nack_signal.c
new file mode 100644
index 0000000000000000000000000000000000000000..1627bdd14e925ad68797d16614be9e57bc23447e
--- /dev/null
+++ b/common/utils/T/tracer/hacks/dump_nack_signal.c
@@ -0,0 +1,115 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "utils.h"
+#include "event.h"
+#include "database.h"
+#include "config.h"
+#include "../T_defs.h"
+
+void usage(void)
+{
+  printf(
+"options:\n"
+"    -d <database file>        this option is mandatory\n"
+"    -ip <host>                connect to given IP address (default %s)\n"
+"    -p <port>                 connect to given port (default %d)\n",
+  DEFAULT_REMOTE_IP,
+  DEFAULT_REMOTE_PORT
+  );
+  exit(1);
+}
+
+int main(int n, char **v)
+{
+  char *database_filename = NULL;
+  void *database;
+  char *ip = DEFAULT_REMOTE_IP;
+  int port = DEFAULT_REMOTE_PORT;
+  int i;
+  char t;
+  int number_of_events;
+  int socket;
+  int *is_on;
+  int ev_input, ev_nack;
+  int ev_ack;
+
+  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], "-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; }
+    usage();
+  }
+
+  if (database_filename == NULL) {
+    printf("ERROR: provide a database file (-d)\n");
+    exit(1);
+  }
+
+  database = parse_database(database_filename);
+
+  load_config_file(database_filename);
+
+  number_of_events = number_of_ids(database);
+  is_on = calloc(number_of_events, sizeof(int));
+  if (is_on == NULL) abort();
+
+  on_off(database, "ENB_PHY_INPUT_SIGNAL", is_on, 1);
+  on_off(database, "ENB_PHY_ULSCH_UE_NACK", is_on, 1);
+  on_off(database, "ENB_PHY_ULSCH_UE_ACK", is_on, 1);
+
+  ev_input = event_id_from_name(database, "ENB_PHY_INPUT_SIGNAL");
+  ev_nack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_NACK");
+  ev_ack = event_id_from_name(database, "ENB_PHY_ULSCH_UE_ACK");
+
+  socket = connect_to(ip, port);
+
+  t = 1;
+  if (socket_send(socket, &t, 1) == -1 ||
+      socket_send(socket, &number_of_events, sizeof(int)) == -1 ||
+      socket_send(socket, is_on, number_of_events * sizeof(int)) == -1)
+    abort();
+
+  char dump[10][T_BUFFER_MAX];
+  event dump_ev[10];
+FILE *z = fopen("/tmp/dd", "w"); if (z == NULL) abort();
+  while (1) {
+    char v[T_BUFFER_MAX];
+    event e;
+    e = get_event(socket, v, database);
+    if (e.type == -1) break;
+    if (e.type == ev_input) {
+      int sf = e.e[2].i;
+      memcpy(dump[sf], v, T_BUFFER_MAX);
+      dump_ev[sf] = e;
+      printf("input %d/%d\n", e.e[1].i, sf);
+if (fwrite(dump_ev[sf].e[4].b, dump_ev[sf].e[4].bsize, 1, z) != 1) abort();
+fflush(z);
+    }
+    if (e.type == ev_nack) {
+      int sf = e.e[2].i;
+      printf("nack %d/%d\n", e.e[1].i, sf);
+      FILE *f = fopen("/tmp/dump.raw", "w"); if (f == NULL) abort();
+      if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v),
+          dump_ev[sf].e[4].bsize, 1, f) != 1) abort();
+      if (fclose(f)) abort();
+      printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v));
+//      getchar();
+    }
+    if (e.type == ev_ack) {
+      int sf = e.e[2].i;
+      printf("ack %d/%d\n", e.e[1].i, sf);
+      FILE *f = fopen("/tmp/dump.raw", "w"); if (f == NULL) abort();
+      if (fwrite(dump[sf] + ((char *)dump_ev[sf].e[4].b - v),
+          dump_ev[sf].e[4].bsize, 1, f) != 1) abort();
+      if (fclose(f)) abort();
+      printf("dumped... press enter (delta %d)\n", (int)((char *)dump_ev[sf].e[4].b - v));
+//      getchar();
+    }
+  }
+
+  return 0;
+}