diff --git a/lib/c/2006/Makefile b/lib/c/2006/Makefile
index 194b0bc056854bc8cea137a3113b31943ab503a9..6ad51a63180dac3d6e07c3d6a6a71c4cd8101b5b 100644
--- a/lib/c/2006/Makefile
+++ b/lib/c/2006/Makefile
@@ -24,7 +24,7 @@ OBJS=labcomm$(VERSION).o \
      labcomm$(VERSION)_pthread_scheduler.o 
 
 LABCOMM_JAR=../../../compiler/labcomm$(LIBVERSION)_compiler.jar
-LABCOMM=java -jar $(LABCOMM_JAR) 
+LABCOMM=java -jar $(LABCOMM_JAR)
 
 TESTS=test_labcomm_basic_type_encoding \
       test_labcomm_generated_encoding \
@@ -96,6 +96,7 @@ $(TEST_DIR)/gen/%.o: $(TEST_DIR)/%.c | $(TEST_DIR)/gen
 .PRECIOUS: $(TEST_DIR)/gen/%.h
 $(TEST_DIR)/gen/%.c $(TEST_DIR)/gen/%.h: $(TEST_DIR)/%.lc | $(TEST_DIR)/gen
 	$(LABCOMM) \
+		--ver=$(VERSION) \
 		--c=$(TEST_DIR)/gen/$*.c \
 		--h=$(TEST_DIR)/gen/$*.h \
 		$<
diff --git a/lib/c/2014/test/test_labcomm.c b/lib/c/2014/test/test_labcomm.c
index e37950e612d3ffb38c08bdec4b31c0325cb851a7..1ca14a9181bacd6d627c5d31214fc32aae19dc07 100644
--- a/lib/c/2014/test/test_labcomm.c
+++ b/lib/c/2014/test/test_labcomm.c
@@ -30,6 +30,44 @@
 #include "labcomm_default_scheduler.h"
 #include "test/gen/test_sample.h"
 
+static struct labcomm_writer writer;
+
+static struct expect {
+  char *description;
+  int result;
+  int (*trampoline)(struct labcomm_decoder *context);
+  struct labcomm_decoder *context;
+} *expect;
+
+static void check_expect()
+{
+  struct expect *p = expect;
+
+  {
+    int i;
+    for (i = 0 ; i < writer.pos ; i++) {
+      fprintf(stderr, "%02x ", writer.data[i]);
+    }
+    fprintf(stderr, "\n");
+  }
+  if (p && p->trampoline) {
+    int err;
+    
+    expect = p + 1;
+    fprintf(stderr, "Checking '%s' expected=%d ", p->description, p->result);
+    err = p->trampoline(p->context);
+    fprintf(stderr, "actual=%d\n", err);
+    if (p->result >= 0 && p->result != err) {
+      fprintf(stderr, "FAILED\n");
+      exit(1);
+    } else if (err == 0) {
+      fprintf(stderr, "FAILED (unexpected 0)\n");
+      exit(1);
+    }
+    writer.pos = 0;
+  }
+}
+
 static unsigned char buffer[512];
 
 static int writer_alloc(struct labcomm_writer *w, 
@@ -41,6 +79,7 @@ static int writer_alloc(struct labcomm_writer *w,
   
   return 0;
 }
+
 static int writer_start(struct labcomm_writer *w, 
 			 struct labcomm_writer_action_context *action_context,
 			 int index, const struct labcomm_signature *signature,
@@ -48,15 +87,27 @@ static int writer_start(struct labcomm_writer *w,
 {
   return 0;
 }
+
+static int buf_writer_end(
+  struct labcomm_writer *w, 
+  struct labcomm_writer_action_context *action_context)
+{
+  check_expect();
+  return 0;
+}
+
 const struct labcomm_writer_action writer_action = {
   .alloc = writer_alloc,
   .start = writer_start,
+  .end = buf_writer_end,
 };
+
 static struct labcomm_writer_action_context writer_action_context = {
   .next = NULL,
   .action = &writer_action,
   .context = NULL
 }; 
+
 static struct labcomm_writer writer =  {
   .action_context = &writer_action_context,
   .data = buffer,
@@ -76,21 +127,25 @@ static int reader_alloc(struct labcomm_reader *r,
   
   return 0;
 }
+
 static int reader_fill(struct labcomm_reader *r, 
 		       struct labcomm_reader_action_context *action_context)
 {
   r->error = -ENOMEM;
   return r->error;
 }
+
 const struct labcomm_reader_action reader_action = {
   .alloc = reader_alloc,
   .fill = reader_fill,
 };
+
 static struct labcomm_reader_action_context reader_action_context = {
   .next = NULL,
   .action = &reader_action,
   .context = NULL
 }; 
+
 static struct labcomm_reader reader =  {
   .action_context = &reader_action_context,
   .data = buffer,
@@ -106,6 +161,7 @@ static test_sample_test_var encoder_var = {
   .n_2 = 1,
   .a = encoder_data,
 };
+
 static int32_t decoder_data[256];
 static test_sample_test_var decoder_var = {
   .n_0 = 1,
@@ -127,8 +183,9 @@ int test_decode_one(struct labcomm_decoder *decoder)
     reader.pos = 0;
     result = labcomm_decoder_decode_one(decoder); 
     if (result >= 0 ) {
-      fprintf(stderr, "Got result from buffer with bogus length (%d)\n",
-	      result);
+      fprintf(stderr,
+              "Got result from buffer with bogus length (%d, %d != %d)\n",
+	      result, reader.count, writer.pos);
       exit(1);
     }
   }
@@ -137,7 +194,7 @@ int test_decode_one(struct labcomm_decoder *decoder)
   reader.count = writer.pos;
   result = labcomm_decoder_decode_one(decoder);
   if (result < 0) {
-    fprintf(stderr, "Got result from buffer with correct length (%d)\n",
+    fprintf(stderr, "Got no result from buffer with correct length (%d)\n",
 	    result);
     exit(1);
   }
@@ -175,22 +232,31 @@ static void test_encode_decode(struct labcomm_encoder *encoder,
 int main(void)
 {
   int err, i;
-  struct labcomm_encoder *encoder = labcomm_encoder_new(
-    &writer, 
+  struct labcomm_decoder *decoder = labcomm_decoder_new(
+    &reader,
     labcomm_default_error_handler,
     labcomm_default_memory,
     labcomm_default_scheduler);
-  struct labcomm_decoder *decoder = labcomm_decoder_new(
-    &reader,
+  struct expect expect_version[] = {
+    { "Version", 1, test_decode_one, decoder },
+    { 0, 0, 0 }
+  };
+  expect = expect_version;
+  struct labcomm_encoder *encoder = labcomm_encoder_new(
+    &writer, 
     labcomm_default_error_handler,
     labcomm_default_memory,
     labcomm_default_scheduler);
-  err = test_decode_one(decoder);
-  fprintf(stderr, "decode of version -> index %d\n", err);
-  writer.pos = 0;
   labcomm_decoder_register_test_sample_test_var(decoder,
 						handle_test_var, 
 						NULL);
+  struct expect expect_registration[] = {
+    { "Sampledef", -1, test_decode_one, decoder },
+    { "Typedef", -1, test_decode_one, decoder },
+    { "Binding", -1, test_decode_one, decoder },
+    { 0, 0, 0 }
+  };
+  expect = expect_registration;
   labcomm_encoder_register_test_sample_test_var(encoder);
   err = test_decode_one(decoder);
   fprintf(stderr, "decode of register -> index %d\n", err);
diff --git a/lib/c/Makefile b/lib/c/Makefile
index de73c0473010a4d81e80cb18f356bb08561afb6d..c2b23ee9f9373497e4e1ae612a99ed1ee903110a 100644
--- a/lib/c/Makefile
+++ b/lib/c/Makefile
@@ -8,6 +8,6 @@ all:
 
 .PHONY: distclean
 distclean: 
-	rm *.o *.so *.so.1 *.a
-	for v in $(VERSIONS) ; do $(MAKE) -C $${v} distclean ; done
+	for v in $(VERSIONS) ; do $(MAKE) -C $${v} $@ || exit 1 ; done
+	rm -f *.o *.so *.so.1 *.a