diff --git a/examples/simple/example_encoder.c b/examples/simple/example_encoder.c
index 70a38c8756e91945d01e6543cf3ad7636e29116f..33b5c4c32e8b742212694e58bc38a772dfe6a87c 100644
--- a/examples/simple/example_encoder.c
+++ b/examples/simple/example_encoder.c
@@ -15,7 +15,6 @@ int main(int argc, char *argv[]) {
   encoder = labcomm_encoder_new(labcomm_fd_writer, &fd);
   labcomm_encoder_register_simple_TwoInts(encoder);
   labcomm_encoder_register_simple_IntString(encoder);
-  labcomm_encoder_register_simple_TwoArrays(encoder);
   simple_IntString is;
   is.x = 24;
   is.s = "Hello, LabComm!";
@@ -30,6 +29,8 @@ int main(int argc, char *argv[]) {
 
   int foo[20];
 
+  labcomm_encoder_register_simple_TwoArrays(encoder);
+
   simple_TwoArrays ta;
   ta.fixed.a[0] = 17;
   ta.fixed.a[1] = 42;
diff --git a/lib/c/labcomm.c b/lib/c/labcomm.c
index ac8cf561b5df02c2b9003b763d03ac5a36d805f8..2b982e6f852e2c0098980bd43cbba198119f7ee2 100644
--- a/lib/c/labcomm.c
+++ b/lib/c/labcomm.c
@@ -181,13 +181,30 @@ static int get_encoder_index(
   return result;
 }
 
+void labcomm_encode_signature(struct labcomm_encoder *e,
+                              labcomm_signature_t *signature) 
+{
+  int i;
+  e->writer.write(&e->writer, labcomm_writer_start);
+  labcomm_encode_packed32(e, signature->type);
+  labcomm_encode_type_index(e, signature);
+  labcomm_encode_string(e, signature->name);
+  for (i = 0 ; i < signature->size ; i++) {
+    if (e->writer.pos >= e->writer.count) {
+      e->writer.write(&e->writer, labcomm_writer_continue);
+    }
+    e->writer.data[e->writer.pos] = signature->signature[i];
+    e->writer.pos++;
+  }
+  e->writer.write(&e->writer, labcomm_writer_end);
+}
+
 static void do_encoder_register(struct labcomm_encoder *e,
 				labcomm_signature_t *signature,
 				labcomm_encode_typecast_t encode)
 {
   if (signature->type == LABCOMM_SAMPLE) {
     if (get_encoder_index(e, signature) == 0) {
-      int i;
       labcomm_encoder_context_t *context = e->context;
       labcomm_sample_entry_t *sample =
 	(labcomm_sample_entry_t*)malloc(sizeof(labcomm_sample_entry_t));
@@ -198,18 +215,11 @@ static void do_encoder_register(struct labcomm_encoder *e,
       context->index++;
       context->sample = sample;
 
-      e->writer.write(&e->writer, labcomm_writer_start);
-      labcomm_encode_packed32(e, signature->type);
-      labcomm_encode_type_index(e, signature);
-      labcomm_encode_string(e, signature->name);
-      for (i = 0 ; i < signature->size ; i++) {
-	if (e->writer.pos >= e->writer.count) {
-	  e->writer.write(&e->writer, labcomm_writer_continue);
-	}
-	e->writer.data[e->writer.pos] = signature->signature[i];
-	e->writer.pos++;
-      }
-      e->writer.write(&e->writer, labcomm_writer_end);
+#ifdef OLD_STUFF
+      labcomm_encode_signature(e, signature);
+#else
+      e->writer.write(&e->writer, labcomm_writer_send_signature, signature, e);
+#endif
     }
   }
 }
@@ -231,7 +241,7 @@ static void do_encode(
 }
 
 labcomm_encoder_t *labcomm_encoder_new(
-  int (*writer)(labcomm_writer_t *, labcomm_writer_action_t),
+  int (*writer)(labcomm_writer_t *, labcomm_writer_action_t, ...),
   void *writer_context)
 {
   labcomm_encoder_t *result = malloc(sizeof(labcomm_encoder_t));
@@ -314,7 +324,7 @@ void labcomm_encode_type_index(labcomm_encoder_t *e, labcomm_signature_t *s)
 
 static int signature_writer(
   labcomm_writer_t *w,
-  labcomm_writer_action_t action)
+  labcomm_writer_action_t action, ...)
 {
   switch (action) {
     case labcomm_writer_alloc: {
diff --git a/lib/c/labcomm.h b/lib/c/labcomm.h
index 5763b8d30975598e071b42a6429d35e6683081f5..6d67fb2e125adae13bf3180b7a7cab042f4c70ea 100644
--- a/lib/c/labcomm.h
+++ b/lib/c/labcomm.h
@@ -31,6 +31,9 @@ typedef struct {
   unsigned char *signature; 
 } labcomm_signature_t;
 
+//TODO: something along the lines of...
+void labcomm_encode_signature(struct labcomm_encoder*, labcomm_signature_t*);
+
 /*
  * Error handling.
  */
@@ -127,6 +130,7 @@ typedef enum {
   labcomm_writer_continue, 
   labcomm_writer_end, 
   labcomm_writer_available,
+  labcomm_writer_send_signature
 } labcomm_writer_action_t;
 
 typedef struct labcomm_writer {
@@ -135,12 +139,12 @@ typedef struct labcomm_writer {
   int data_size;
   int count;
   int pos;
-  int (*write)(struct labcomm_writer *, labcomm_writer_action_t);
+  int (*write)(struct labcomm_writer *, labcomm_writer_action_t, ...);
   labcomm_error_handler_callback on_error;
 } labcomm_writer_t;
 
 struct labcomm_encoder *labcomm_encoder_new(
-  int (*writer)(labcomm_writer_t *, labcomm_writer_action_t),
+  int (*writer)(labcomm_writer_t *, labcomm_writer_action_t, ...),
   void *writer_context);
 void labcomm_encoder_free(
   struct labcomm_encoder *encoder);
diff --git a/lib/c/labcomm_fd_reader_writer.c b/lib/c/labcomm_fd_reader_writer.c
index 2774b37a2fc1c8f3985cf707ac6ac676b150fe33..77b5273b754be4dceda3e8f2a5ca4e1a854ce5ef 100644
--- a/lib/c/labcomm_fd_reader_writer.c
+++ b/lib/c/labcomm_fd_reader_writer.c
@@ -59,8 +59,9 @@ int labcomm_fd_reader(
 
 int labcomm_fd_writer(
   labcomm_writer_t *w, 
-  labcomm_writer_action_t action)
+  labcomm_writer_action_t action, ...)
 {
+  va_list argp;
   int result = 0;
   int *fd = w->context;
 
@@ -99,6 +100,18 @@ int labcomm_fd_writer(
     case labcomm_writer_available: {
       result = w->count - w->pos; 
     } break;
+    case labcomm_writer_send_signature: {
+      //TODO: move to generic auxilliary writer functions file in lib?
+
+      va_start(argp, action);
+      labcomm_signature_t *signature = va_arg(argp, labcomm_signature_t*);
+      struct labcomm_encoder *e = va_arg(argp, struct labcomm_encoder*);
+      va_end(argp);
+
+      printf("Sending signature: %s\n", signature->name);
+      labcomm_encode_signature(e, signature);
+ 
+    } break;
   }
   return result;
 }
diff --git a/lib/c/labcomm_private.h b/lib/c/labcomm_private.h
index 637828c8d82dc1715209b2447b5edc55f9edab23..dffa349d670fa0df27c293ecb46b591debead02a 100644
--- a/lib/c/labcomm_private.h
+++ b/lib/c/labcomm_private.h
@@ -335,7 +335,7 @@ static inline void labcomm_encode_string(labcomm_encoder_t *e,
 void labcomm_encode_type_index(labcomm_encoder_t *e, labcomm_signature_t *s);
 
 static inline int labcomm_buffer_write(struct labcomm_writer *w, 
-                                       labcomm_writer_action_t action)
+                                       labcomm_writer_action_t action, ...)
 {
   // If this gets called, it is an error, 
   // so note error and let producer proceed