diff --git a/Makefile b/Makefile
index 07c4765287f6c539daa52e7ab1a424c0f0ee7678..10bc7d42093bdb59a4744b31834600e68df31b08 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,7 @@
 SUBDIRS=compiler lib test examples packaging
 export LABCOMM_JAR=$(shell pwd)/compiler/labcomm2014_compiler.jar
 export LABCOMM=java -jar $(LABCOMM_JAR) 
+export VALGRIND=valgrind --leak-check=full --error-exitcode=1
 
 UNAME_S=$(shell uname -s)
 
diff --git a/lib/c/2014/Makefile b/lib/c/2014/Makefile
index 81c0244deaa0578339cb541395c263c012b4a0e2..741f5e33c52de9ba86e09c7ba8b43b56ccd98a4b 100644
--- a/lib/c/2014/Makefile
+++ b/lib/c/2014/Makefile
@@ -108,7 +108,7 @@ endif
 # rules invoked by 'test'
 .PHONY: run-test-%
 run-test-%: $(TEST_DIR)/gen/% | $(TEST_DIR)/gen
-	$<
+	$(VALGRIND) $<
 
 .PRECIOUS: $(TEST_DIR)/gen/%
 
diff --git a/lib/c/2014/labcomm2014_decoder.c b/lib/c/2014/labcomm2014_decoder.c
index f8222881b7ff2f4aaaabae738ca5ff2b7f94f134..9ed6329ecd566b54423db6ba261ba63119251383 100644
--- a/lib/c/2014/labcomm2014_decoder.c
+++ b/lib/c/2014/labcomm2014_decoder.c
@@ -160,7 +160,7 @@ static int decode_sample_def_or_ref(struct labcomm2014_decoder *d, int kind)
   signature.name = labcomm2014_read_string(d->reader);
   if (d->reader->error < 0) {
     result = d->reader->error;
-    goto out;
+    goto free_signature_name;
   }
   signature.size = labcomm2014_read_packed32(d->reader);
   if (d->reader->error < 0) {
@@ -198,7 +198,9 @@ static int decode_sample_def_or_ref(struct labcomm2014_decoder *d, int kind)
 free_signature_signature:
   labcomm2014_memory_free(d->memory, 1,  signature.signature);
 free_signature_name:
-  labcomm2014_memory_free(d->memory, 0, signature.name);
+  if (signature.name) {
+    labcomm2014_memory_free(d->memory, 0, signature.name);
+  }
 out:
   return result;
 }
@@ -337,15 +339,16 @@ static int do_decode_one(struct labcomm2014_decoder *d)
     char *version = labcomm2014_read_string(d->reader);
     if (d->reader->error < 0) {
       result = d->reader->error;
-      goto out;
-    }
-    if (strcmp(version, CURRENT_VERSION) == 0) {
+    } else if (strcmp(version, CURRENT_VERSION) == 0) {
       result = LABCOMM_VERSION;
       d->version_ok = 1;
     } else {
       result = -ECONNRESET;
     }  
     labcomm2014_memory_free(d->memory, 1,  version);
+    if (result < 0) {
+      goto out;
+    }
   } else if (! d->version_ok) {
     DEBUG_FPRINTF(stderr, "No VERSION %d %d\n", remote_index, length);
     result = -ECONNRESET;
diff --git a/lib/c/2014/test/test_labcomm.c b/lib/c/2014/test/test_labcomm.c
index de36a7f4a34905a20360c272bf8f27c0d703593e..0b0fbf36fe0caa3c663654ba9a75bb5509b562f7 100644
--- a/lib/c/2014/test/test_labcomm.c
+++ b/lib/c/2014/test/test_labcomm.c
@@ -171,7 +171,9 @@ static test_sample_test_var decoder_var = {
 
 void handle_test_var(test_sample_test_var *v, void *ctx)
 {
-  decoder_var.a[0] = v->a[0];  
+  if (v->n_0 * v->n_2 > 0) {
+    decoder_var.a[0] = v->a[0];
+  }
 }
 
 int test_decode_one(struct labcomm2014_decoder *decoder)
@@ -229,7 +231,7 @@ static void test_encode_decode(struct labcomm2014_encoder *encoder,
   }
 }
 
-int main(void)
+static int do_test(int argc, char *argv[])
 {
   int i;
   struct labcomm2014_decoder *decoder = labcomm2014_decoder_new(
@@ -273,5 +275,13 @@ int main(void)
     test_encode_decode(encoder, decoder, 4+i, 0, (1<<(7*i)));
   }
   test_encode_decode(encoder, decoder, 8, 0, 4294967295);
+
+  labcomm2014_encoder_free(encoder);
+  labcomm2014_decoder_free(decoder);
   return 0;
 }
+
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/lib/c/2014/test/test_labcomm_basic_type_encoding.c b/lib/c/2014/test/test_labcomm_basic_type_encoding.c
index 29079df684b8f919a2ee15e8ca1992672d3db0f6..b7cf2b1bee28186b996350a92793524d484c34c8 100644
--- a/lib/c/2014/test/test_labcomm_basic_type_encoding.c
+++ b/lib/c/2014/test/test_labcomm_basic_type_encoding.c
@@ -91,7 +91,7 @@ static void writer_assert(char *type,
   }
 }
 
-int main(void)
+static int do_test(int argc, char *argv[])
 {
   TEST_WRITE_READ(packed32, packed32, "%d", 0x0, 1, "\x00");
   TEST_WRITE_READ(packed32, packed32, "%d", 0x7f, 1, "\x7f");
@@ -141,3 +141,7 @@ int main(void)
   return 0;
 }
 
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/lib/c/2014/test/test_labcomm_copy.c b/lib/c/2014/test/test_labcomm_copy.c
index 173f152ab52db12b1d24aa417bd9c25f77526d10..fc4bbfe2ac43373305643f0f80ac8d3b1853df99 100644
--- a/lib/c/2014/test/test_labcomm_copy.c
+++ b/lib/c/2014/test/test_labcomm_copy.c
@@ -70,7 +70,7 @@ static void handle_as(more_types_AS *v, void *context)
   labcomm2014_copy_more_types_AS(labcomm2014_default_memory, context, v);
 }
 
-int main(int argc, char **argv)
+int do_test(int argc, char **argv)
 {
   struct labcomm2014_encoder *encoder;
   struct labcomm2014_decoder *decoder;
@@ -284,4 +284,15 @@ int main(int argc, char **argv)
   puts("NS deallocated ok");
   labcomm2014_copy_free_more_types_AS(labcomm2014_default_memory, &cache_as);
   puts("AS deallocated ok");
+
+  labcomm2014_copy_free_generated_encoding_R(labcomm2014_default_memory,
+                                             &cache_r);
+  puts("R deallocated ok");
+
+  return 0;
+}
+
+int main(int argc, char **argv)
+{
+  return do_test(argc, argv);
 }
diff --git a/lib/c/2014/test/test_labcomm_pthread_scheduler.c b/lib/c/2014/test/test_labcomm_pthread_scheduler.c
index aa7c5f0e08a77ccdf46717418ed06a4d4d64f3bf..c801308c5d8d408f1ece64f3061ef3f9a746b8a7 100644
--- a/lib/c/2014/test/test_labcomm_pthread_scheduler.c
+++ b/lib/c/2014/test/test_labcomm_pthread_scheduler.c
@@ -40,6 +40,7 @@ static void func(void *arg)
   if (func_arg->i == 999) {
     labcomm2014_scheduler_wakeup(func_arg->scheduler);
   }
+  free(func_arg);
 }
 
 void enqueue(struct labcomm2014_scheduler *scheduler, 
@@ -56,7 +57,7 @@ void enqueue(struct labcomm2014_scheduler *scheduler,
   }
 }
 
-int main(int argc, char *argv[])
+static int do_test(int argc, char *argv[])
 {
   struct labcomm2014_scheduler *scheduler;
   struct labcomm2014_time *time;
@@ -78,5 +79,12 @@ int main(int argc, char *argv[])
   labcomm2014_scheduler_sleep(scheduler, NULL);
   labcomm2014_scheduler_sleep(scheduler, time);
 
+  labcomm2014_time_free(time);
+  labcomm2014_scheduler_free(scheduler);
   return 0;
 }
+
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/lib/c/2014/test/test_labcomm_renaming_decoder.c b/lib/c/2014/test/test_labcomm_renaming_decoder.c
index 9cafa7ca5881d0d8a1d73cb4fb8bc656da83e569..b0c4bd5aaefd8ee517f162bbb8e56150e9a8bf4d 100644
--- a/lib/c/2014/test/test_labcomm_renaming_decoder.c
+++ b/lib/c/2014/test/test_labcomm_renaming_decoder.c
@@ -169,7 +169,10 @@ int main(int argc, char **argv)
          labcomm2014_decoder_get_sample_ref(
            suffix_decoder, labcomm2014_signature_generated_encoding_R));
 
+  labcomm2014_decoder_free(suffix_decoder);
+  labcomm2014_decoder_free(prefix_decoder);
   labcomm2014_decoder_free(decoder);
+
   close(fd);
   unlink(DATA_FILE);
 }
diff --git a/lib/c/2014/test/test_labcomm_renaming_encoder.c b/lib/c/2014/test/test_labcomm_renaming_encoder.c
index 227574be861e9ef940b0254174e3af25fe8fbab6..ece917bd080c9da69174f5adc07105b0603a19da 100644
--- a/lib/c/2014/test/test_labcomm_renaming_encoder.c
+++ b/lib/c/2014/test/test_labcomm_renaming_encoder.c
@@ -26,7 +26,7 @@
 #include "labcomm2014_private.h"
 #include "labcomm2014_default_error_handler.h"
 #include "labcomm2014_default_memory.h"
-#include "labcomm2014_pthread_scheduler.h"
+#include "labcomm2014_default_scheduler.h"
 #include "labcomm2014_renaming.h"
 #include "labcomm2014_renaming_encoder.h"
 #include "test/gen/generated_encoding.h"
@@ -193,7 +193,7 @@ void dump_encoder(struct labcomm2014_encoder *encoder)
   printf("\n");
 }
 
-int main(void)
+static int do_test(int argc, char *argv[])
 {
   struct labcomm2014_encoder *encoder, *prefix, *suffix;
   int i;
@@ -206,7 +206,7 @@ int main(void)
     &buffer_writer, 
     labcomm2014_default_error_handler,
     labcomm2014_default_memory,
-    labcomm2014_pthread_scheduler_new(labcomm2014_default_memory));
+    labcomm2014_default_scheduler);
   prefix = labcomm2014_renaming_encoder_new(encoder,
                                             labcomm2014_renaming_prefix,
                                             "p.");
@@ -277,6 +277,14 @@ int main(void)
   labcomm2014_encode_generated_encoding_V(suffix);
   EXPECT({VARIABLE(5), 0x00 });
 
+  labcomm2014_encoder_free(suffix);
+  labcomm2014_encoder_free(prefix);
+  labcomm2014_encoder_free(encoder);
+
   return 0;
 }
 
+int main(int argc, char *argv[])
+{
+  return do_test(argc, argv);
+}
diff --git a/test/Makefile b/test/Makefile
index dc3b8b735b9a24606719e8be46ee2f1960601421..dab650b114538759844b3f57b8c7bea2acd427d8 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -26,7 +26,8 @@ test_%: gen/%/signatures.py \
 		./test_encoder_decoder.py \
 		--signatures=gen/$*/signatures.py \
 		--test tee gen/$*/testdata \
-		--test gen/$*/c_relay /dev/stdin /dev/stdout \
+		--test $(shell echo $(VALGRIND) | sed -e 's/[-][-]/\\\\--/g') \
+		       gen/$*/c_relay /dev/stdin /dev/stdout \
 		--test mono gen/$*/cs_relay.exe /dev/stdin /dev/stdout \
 		--test java \\-cp gen/$*:../lib/java/labcomm2014.jar java_relay \
 			    /dev/stdin /dev/stdout
diff --git a/test/relay_gen_c.py b/test/relay_gen_c.py
index 4d050640d0ec5b9091ff0c19d464ffd52361b5ba..2706d34ba0d723687fb9237d6e3ccb1a3ed4c00a 100755
--- a/test/relay_gen_c.py
+++ b/test/relay_gen_c.py
@@ -74,6 +74,8 @@ if __name__ == '__main__':
        """ % { 'func': func, 'arg': arg }))
     result.extend(split_match('^[^|]*\|(.*)$', """
       |  labcomm2014_decoder_run(d);
+      |  labcomm2014_decoder_free(d);
+      |  labcomm2014_encoder_free(e);
       |  return 0;
       |}
     """))