diff --git a/lib/c/labcomm.c b/lib/c/labcomm.c
index dc6b4d834861b0431e8b8738b00aff2d7723e982..2a86b0e3a7a14097dbe800a420e2d81c4905fc7d 100644
--- a/lib/c/labcomm.c
+++ b/lib/c/labcomm.c
@@ -472,6 +472,22 @@ int labcomm_encoder_ioctl(struct labcomm_encoder *encoder,
   return result;
 }
 
+static int labcomm_writer_ioctl(struct labcomm_writer *writer,
+				int action,
+				...)
+{
+  int result = -ENOTSUP;
+  
+  if (writer->action.ioctl != NULL) {
+    va_list va;
+    
+    va_start(va, action);
+    result = writer->action.ioctl(writer, action, NULL, va);
+    va_end(va);
+  }
+  return result;
+}
+
 int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder, 
 				   int action,
 				   struct labcomm_signature *signature,
@@ -488,36 +504,36 @@ int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder,
 
 static void collect_flat_signature(
   struct labcomm_decoder *decoder,
-  struct labcomm_encoder *signature_writer)
+  struct labcomm_writer *writer)
 {
   int type = labcomm_read_packed32(&decoder->reader); 
   if (type >= LABCOMM_USER) {
     decoder->on_error(LABCOMM_ERROR_UNIMPLEMENTED_FUNC, 3,
 			"Implement %s ... (1) for type 0x%x\n", __FUNCTION__, type);
   } else {
-    labcomm_write_packed32(&signature_writer->writer, type); 
+    labcomm_write_packed32(writer, type); 
     switch (type) {
       case LABCOMM_ARRAY: {
 	int dimensions, i;
 
 	dimensions = labcomm_read_packed32(&decoder->reader);
-	labcomm_write_packed32(&signature_writer->writer, dimensions);
+	labcomm_write_packed32(writer, dimensions);
 	for (i = 0 ; i < dimensions ; i++) {
 	  int n = labcomm_read_packed32(&decoder->reader);
-	  labcomm_write_packed32(&signature_writer->writer, n);
+	  labcomm_write_packed32(writer, n);
 	}
-	collect_flat_signature(decoder, signature_writer);
+	collect_flat_signature(decoder, writer);
       } break;
       case LABCOMM_STRUCT: {
 	int fields, i;
 
 	fields = labcomm_read_packed32(&decoder->reader); 
-	labcomm_write_packed32(&signature_writer->writer, fields); 
+	labcomm_write_packed32(writer, fields); 
 	for (i = 0 ; i < fields ; i++) {
 	  char *name = labcomm_read_string(&decoder->reader);
-	  labcomm_write_string(&signature_writer->writer, name);
+	  labcomm_write_string(writer, name);
 	  free(name);
-	  collect_flat_signature(decoder, signature_writer);
+	  collect_flat_signature(decoder, writer);
 	}
       } break;
       case LABCOMM_BOOLEAN:
@@ -601,26 +617,37 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d)
       if (result == LABCOMM_TYPEDEF || result == LABCOMM_SAMPLE) {
 	/* TODO: should the labcomm_dynamic_buffer_writer be 
 	   a permanent part of labcomm_decoder? */
-	struct labcomm_encoder *e = labcomm_encoder_new(
-	  labcomm_dynamic_buffer_writer, NULL, NULL, NULL);
+	struct labcomm_writer writer = {
+	  .context = NULL,
+	  .data = NULL,
+	  .data_size = 0,
+	  .count = 0,
+	  .pos = 0,
+	  .error = 0,
+	  .action = labcomm_dynamic_buffer_writer,
+	  .on_error = NULL
+	};
 	struct labcomm_signature signature;
 	struct labcomm_sample_entry *entry = NULL;
 	int index, err;
 
+	writer.action.alloc(&writer, "");
+	writer.action.start(&writer, NULL, 0, NULL, NULL);
 	index = labcomm_read_packed32(&d->reader); //int
 	signature.name = labcomm_read_string(&d->reader);
 	signature.type = result;
-	e->writer.action.start(&e->writer, NULL, 0, NULL, NULL);
-	collect_flat_signature(d, e);
-	e->writer.action.end(&e->writer);
-	err = labcomm_encoder_ioctl(e, LABCOMM_IOCTL_WRITER_GET_BYTES_WRITTEN,
-				    &signature.size);
+	collect_flat_signature(d, &writer);
+	writer.action.end(&writer);
+	err = labcomm_writer_ioctl(&writer, 
+				   LABCOMM_IOCTL_WRITER_GET_BYTES_WRITTEN,
+				   &signature.size);
 	if (err < 0) {
 	  printf("Failed to get size: %s\n", strerror(-err));
 	  goto free_signature_name;
 	}
-	err = labcomm_encoder_ioctl(e, LABCOMM_IOCTL_WRITER_GET_BYTE_POINTER,
-				    &signature.signature);
+	err = labcomm_writer_ioctl(&writer, 
+				   LABCOMM_IOCTL_WRITER_GET_BYTE_POINTER,
+				   &signature.signature);
 	if (err < 0) {
 	  printf("Failed to get pointer: %s\n", strerror(-err));
 	  goto free_signature_name;
@@ -639,7 +666,7 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d)
 	}
       free_signature_name:
 	free(signature.name);
-	labcomm_encoder_free(e);
+	writer.action.free(&writer);
 	if (!entry) {
 	  // No handler for found type, bail out (after cleanup)
 	  result = -ENOENT;