diff --git a/T.h b/T.h
index 884a9b6f89382ee36fc422748acce4754e501af0..ec7b1d2a0ca6001ed8ce743a7763c22c44bf5a4d 100644
--- a/T.h
+++ b/T.h
@@ -36,10 +36,12 @@
 
 #define T_PUT_buffer(argnum, val) \
   do { \
-    T_buffer T_PUT_var = (val); \
-    T_CHECK_SIZE(T_PUT_var.length, argnum); \
-    memcpy(T_LOCAL_buf + T_LOCAL_size, T_PUT_var.addr, T_PUT_var.length); \
-    T_LOCAL_size += T_PUT_var.length; \
+    T_buffer T_PUT_buffer_var = (val); \
+    T_PUT_int(argnum, T_PUT_buffer_var.length); \
+    T_CHECK_SIZE(T_PUT_buffer_var.length, argnum); \
+    memcpy(T_LOCAL_buf + T_LOCAL_size, T_PUT_buffer_var.addr, \
+           T_PUT_buffer_var.length); \
+    T_LOCAL_size += T_PUT_buffer_var.length; \
   } while (0)
 
 #define T_PUT_string(argnum, val) \
@@ -117,7 +119,7 @@ extern T_cache_t *T_cache;
   T_send(T_LOCAL_buf, T_LOCAL_size)
 
 #define T_CHECK_SIZE(len, argnum) \
-  if (T_LOCAL_size + len > T_BUFFER_MAX) { \
+  if (T_LOCAL_size + (len) > T_BUFFER_MAX) { \
     printf("%s:%d:%s: cannot put argument %d in T macro, not enough space" \
              ", consider increasing T_BUFFER_MAX (%d)\n", \
              __FILE__, __LINE__, __FUNCTION__, argnum, T_BUFFER_MAX); \
diff --git a/T_messages.txt b/T_messages.txt
index b0e6cb00ed24a54a88a7dacc34df15b71285f09f..8cca071ae890325473247f35f83a9483fb9991d0 100644
--- a/T_messages.txt
+++ b/T_messages.txt
@@ -138,3 +138,4 @@ ID = LEGACY_CLI_DEBUG
 ID = LEGACY_CLI_TRACE
 
 ID = first
+ID = buf_test
diff --git a/main.c b/main.c
index 50b1d9339cf7373627d7b0634fd09731a123700b..3552f19df52d0c16652e85afb49f0ffee4258bb5 100644
--- a/main.c
+++ b/main.c
@@ -10,8 +10,10 @@ int main(void)
   T_connect_to_tracer("127.0.0.1", 2020);
   printf("after connect\n");
   while (1) {
-    T(T_first, T_PRINTF("hello world %s!\n", "yo"));
-    //usleep(1);
+    char *buf = "hello world %s!\n";
+    //T(T_first, T_PRINTF("hello world %s!\n", "yo"));
+    T(T_buf_test, T_BUFFER("hello world %s!\n", strlen(buf)+1));
+    usleep(1);
   }
   while (1) pause();
 
diff --git a/tracer/main.c b/tracer/main.c
index fa19a6237ba3526f1bbd651ee446a51f4422473e..f9da2085bf78df9558fce9f61f9c183020eebb02 100644
--- a/tracer/main.c
+++ b/tracer/main.c
@@ -73,7 +73,7 @@ void get_string(int s, char *out)
 void get_message(int s)
 {
 #define S(x, y) do { \
-    char str[1024]; \
+    char str[T_BUFFER_MAX]; \
     get_string(s, str); \
     printf("["x"]["y"] %s", str); \
   } while (0)
@@ -85,7 +85,7 @@ void get_message(int s)
   if (GET(s, &m, sizeof(int)) != sizeof(int)) abort();
   switch (m) {
   case T_first: {
-    char str[1024];
+    char str[T_BUFFER_MAX];
     get_string(s, str);
     printf("%s", str);
     break;
@@ -195,6 +195,15 @@ void get_message(int s)
   case T_LEGACY_CLI_WARNING: S("CLI", "WARNING"); break;
   case T_LEGACY_CLI_DEBUG: S("CLI", "DEBUG"); break;
   case T_LEGACY_CLI_TRACE: S("CLI", "TRACE"); break;
+  case T_buf_test: {
+    unsigned char buf[T_BUFFER_MAX];
+    int size;
+    GET(s, &size, sizeof(int));
+    GET(s, buf, size);
+    printf("got buffer size %d %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x %2.2x\n",
+           size, buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9],buf[10],buf[11],buf[12],buf[13],buf[14],buf[15]);
+    break;
+  }
   default: printf("unkown message type %d\n", m); abort();
   }