diff --git a/common/utils/T/T.c b/common/utils/T/T.c
index 786b3722ed21c98b2734a126b077ed42a3f2295c..b9e9b29326041d0262dbfd1720079799b2c3125f 100644
--- a/common/utils/T/T.c
+++ b/common/utils/T/T.c
@@ -1,5 +1,4 @@
 #include "T.h"
-#include "T_messages.txt.h"
 #include <string.h>
 #include <stdlib.h>
 #include <unistd.h>
@@ -113,8 +112,6 @@ void T_init(int remote_port, int wait_for_tracer)
   int socket_pair[2];
   int s;
   int T_shm_fd;
-  unsigned char *buf;
-  int len;
   int child1, child2;
 
   if (socketpair(AF_UNIX, SOCK_STREAM, 0, socket_pair))
@@ -153,29 +150,4 @@ void T_init(int remote_port, int wait_for_tracer)
   close(T_shm_fd);
 
   new_thread(T_receive_thread, NULL);
-
-  /* trace T_message.txt
-   * Send several messages -1 with content followed by message -2.
-   * We can't use the T macro directly, events -1 and -2 are special.
-   */
-  buf = T_messages_txt;
-  len = T_messages_txt_len;
-  while (len) {
-    int send_size = len;
-    if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int))
-      send_size = T_PAYLOAD_MAXSIZE - sizeof(int);
-    do {
-      T_LOCAL_DATA
-      T_HEADER(T_ID(-1));
-      T_PUT_buffer(1, ((T_buffer){addr:(buf), length:(len)}));
-      T_COMMIT();
-    } while (0);
-    buf += send_size;
-    len -= send_size;
-  }
-  do {
-    T_LOCAL_DATA
-    T_HEADER(T_ID(-2));
-    T_COMMIT();
-  } while (0);
 }
diff --git a/common/utils/T/local_tracer.c b/common/utils/T/local_tracer.c
index 1f4e4943469677d4143a9c4abd008409799eb262..68a937a6b56e80fe90d8a3ea27fc8cf3123af145 100644
--- a/common/utils/T/local_tracer.c
+++ b/common/utils/T/local_tracer.c
@@ -11,6 +11,8 @@
 #include <inttypes.h>
 #include <signal.h>
 
+#include "T.h"
+#include "T_messages.txt.h"
 #include "T_defs.h"
 #include "T_IDs.h"
 
@@ -85,6 +87,38 @@ static int get_connection(char *addr, int port)
   return t;
 }
 
+static void forward(void *_forwarder, char *buf, int size);
+
+void send_T_messages_txt(void *forwarder)
+{
+  char buf[T_BUFFER_MAX];
+  char *T_LOCAL_buf = buf;
+  int T_LOCAL_size;
+  unsigned char *src;
+  int src_len;
+
+  /* trace T_message.txt
+   * Send several messages -1 with content followed by message -2.
+   */
+  src = T_messages_txt;
+  src_len = T_messages_txt_len;
+  while (src_len) {
+    int send_size = src_len;
+    if (send_size > T_PAYLOAD_MAXSIZE - sizeof(int))
+      send_size = T_PAYLOAD_MAXSIZE - sizeof(int);
+    /* TODO: be careful, we use internal T stuff, to rewrite? */
+    T_LOCAL_size = 0;
+    T_HEADER(T_ID(-1));
+    T_PUT_buffer(1, ((T_buffer){addr:(src), length:(send_size)}));
+    forward(forwarder, buf, T_LOCAL_size);
+    src += send_size;
+    src_len -= send_size;
+  }
+  T_LOCAL_size = 0;
+  T_HEADER(T_ID(-2));
+  forward(forwarder, buf, T_LOCAL_size);
+}
+
 /****************************************************************************/
 /*                      forward functions                                   */
 /****************************************************************************/
@@ -213,6 +247,7 @@ dead:
 
   close(f->socket_remote);
   f->socket_remote = get_connection("0.0.0.0", f->remote_port);
+  send_T_messages_txt(f);
   goto again;
 
   return NULL;
@@ -237,6 +272,7 @@ static void *forwarder(int port, int s)
 
   f->remote_port = port;
   f->socket_remote = get_connection("0.0.0.0", port);
+  send_T_messages_txt(f);
 
   new_thread(data_sender, f);
   new_thread(forward_remote_messages, f);