diff --git a/compiler/2014/C_CodeGen.jrag b/compiler/2014/C_CodeGen.jrag
index b4709aab962612e4c2826a46f50925f7ba900d60..bc9d7626628554a1826c98e8a383f36dad4deadc 100644
--- a/compiler/2014/C_CodeGen.jrag
+++ b/compiler/2014/C_CodeGen.jrag
@@ -1140,15 +1140,20 @@ aspect C_Encoder {
     env.println("{");
     env.indent();
     env.println("//TODO: add error handling for dependencies");
-    C_emitUserTypeDeps(env, null, true); //XXX HERE BE DRAGONS
-                                          //currently set to false to turn off
-                                          //outputting of code
-    env.println("return labcomm"+env.verStr+"_internal_encoder_type_register(");
-    env.indent();
-    env.println("e,");
-    env.println("&signature_" + env.prefix + getName() + "");
-    env.unindent();
-    env.println(");");
+
+    C_emitUserTypeDeps(env, null, true); 
+
+    if(!isSampleDecl() || hasDependencies()) {
+      env.println("return labcomm"+env.verStr+"_internal_encoder_type_register(");
+      env.indent();
+      env.println("e,");
+      env.println("&signature_" + env.prefix + getName() + "");
+      env.unindent();
+      env.println(");");
+    } else {
+      env.println("// the type has no dependencies, do nothing");
+      env.println("return 0;");
+    }
     env.unindent();
     env.println("}");
   }
@@ -1176,11 +1181,16 @@ aspect C_Encoder {
     env.println("(labcomm"+env.verStr+"_encoder_function)encode_" + env.prefix + getName());
     env.unindent();
     env.println(");");
+    env.println("if(result >= 0) {\n");
+    env.indent();
     env.println("labcomm"+env.verStr+"_encoder_type_register_" + env.prefix + getName()+"(e);");
     env.println("labcomm"+env.verStr+"_internal_encoder_type_bind(");
     env.indent();
     env.println("e,");
-    env.println("&signature_" + env.prefix + getName() + ");");
+    env.println("&signature_" + env.prefix + getName() + ",");
+    env.println( (hasDependencies() ? "1" : "0")  + ");");
+    env.unindent();
+    env.println("}");
     env.unindent();
     env.println("return result;");
     env.unindent();
diff --git a/examples/user_types/ExampleDecoder.cs b/examples/user_types/ExampleDecoder.cs
index 1b6bc0d2ae2e96e3e5213afaadddbbf10245f286..d33873b67d24ae325cb0fc5526e655025e642246 100644
--- a/examples/user_types/ExampleDecoder.cs
+++ b/examples/user_types/ExampleDecoder.cs
@@ -7,7 +7,7 @@ using se.lth.control.labcomm;
 
 namespace user_types
 {
-    class Decoder : twoLines.Handler 
+    class Decoder : twoLines.Handler, twoInts.Handler 
     {
         DecoderChannel dec;
 
@@ -15,6 +15,7 @@ namespace user_types
         {
             dec = new DecoderChannel(stream);
             twoLines.register(dec, this);
+            twoInts.register(dec, this);
             try
             {
                 Console.WriteLine("Running decoder.");
@@ -41,6 +42,13 @@ namespace user_types
             Console.WriteLine("Line l2: " + genLine(d.l2));
         }
 
+        public void handle(twoInts d)
+        {
+            Console.WriteLine("Got twoInts: ");
+            Console.WriteLine("a: "+d.a);
+            Console.WriteLine("b: "+d.b);
+        }
+
         static void Main(string[] args)
         {
             new Decoder(new FileStream(args[0], FileMode.Open));
diff --git a/lib/c/2014/labcomm_decoder.c b/lib/c/2014/labcomm_decoder.c
index aeb805f27cb8b6815a548f4283aecd3b3d32c3aa..2c3e5678f80aa8e734548c702f41c0cf2eaf41c4 100644
--- a/lib/c/2014/labcomm_decoder.c
+++ b/lib/c/2014/labcomm_decoder.c
@@ -197,7 +197,6 @@ static int decode_type_binding(struct labcomm_decoder *d, int kind)
   }
   printf("type_binding: 0x%x -> 0x%x\n", sample_index, typedef_index);
 out:
-  fprintf(stderr,"[type_binding: %d]", result);
   return result;
 } 
 static int decode_type_def(struct labcomm_decoder *d, int kind){
@@ -456,7 +455,6 @@ int labcomm_decoder_decode_one(struct labcomm_decoder *d)
     result = decode_and_handle(d, d, remote_index);
   }
 out:   
-  fprintf(stderr, "\n        decode_one returns %d\n", result);
   return result;
 }
 
diff --git a/lib/c/2014/labcomm_encoder.c b/lib/c/2014/labcomm_encoder.c
index 4f81294d03fef8694947d3525d1f05c36b7536cd..7abf032f939d46c46c47b64376e43da29b0991cb 100644
--- a/lib/c/2014/labcomm_encoder.c
+++ b/lib/c/2014/labcomm_encoder.c
@@ -65,11 +65,11 @@ static struct labcomm_encoder *internal_encoder_new(
     labcomm_writer_alloc(result->writer,
 			 result->writer->action_context);
     if(outputVer) {
-        labcomm_writer_start(result->writer, 
-                            result->writer->action_context, 
+        labcomm_writer_start(result->writer,
+                            result->writer->action_context,
                             LABCOMM_VERSION, NULL, CURRENT_VERSION);
         labcomm_write_packed32(result->writer, LABCOMM_VERSION);
-#ifdef LENGTH_INCL_TAG    
+#ifdef LENGTH_INCL_TAG
         length = (labcomm_size_packed32(LABCOMM_VERSION) +
                 labcomm_size_string(CURRENT_VERSION));
 #else
@@ -98,6 +98,7 @@ void labcomm_encoder_free(struct labcomm_encoder* e)
   labcomm_writer_free(e->writer, e->writer->action_context);
   LABCOMM_SIGNATURE_ARRAY_FREE(e->memory, e->registered, int);
   LABCOMM_SIGNATURE_ARRAY_FREE(e->memory, e->sample_ref, int);
+  LABCOMM_SIGNATURE_ARRAY_FREE(e->memory, e->typedefs, int);
   labcomm_memory_free(memory, 0, e);
 }
 //================
@@ -149,9 +150,9 @@ int wrapped_end(struct labcomm_encoder *e, int tag, struct labcomm_encoder* wrap
              &len);
   if (err < 0) {
 
-// HERE BE DRAGONS! 
+// HERE BE DRAGONS!
 // What is the difference between error_handler (where is it defined?)
-// and error_handler_callback. And why is the latter only in 
+// and error_handler_callback. And why is the latter only in
 // the decoder struct?
 //
 //    wrapped->on_error(LABCOMM_ERROR_BAD_WRITER, 2,
@@ -170,9 +171,9 @@ int wrapped_end(struct labcomm_encoder *e, int tag, struct labcomm_encoder* wrap
     err = -ENOENT;
     goto free_encoder;
   }
-  { 
+  {
       int i;
-      err = labcomm_writer_start(e->writer, e->writer->action_context, 
+      err = labcomm_writer_start(e->writer, e->writer->action_context,
 			     LABCOMM_TYPE_DEF, NULL, NULL);
       if(err < 0) {
           goto free_encoder;
@@ -186,7 +187,7 @@ int wrapped_end(struct labcomm_encoder *e, int tag, struct labcomm_encoder* wrap
       err = e->writer->error;
   }
 free_encoder:
-  //labcomm_memory_free(wrapped->memory, 1, ctx);  
+  //labcomm_memory_free(wrapped->memory, 1, ctx);
   labcomm_encoder_free(wrapped);
   return err;
 }
@@ -319,28 +320,29 @@ int labcomm_internal_encoder_type_register(
 #ifndef WITHOUT_TYPE_DEFS
   struct labcomm_encoder *w = wrapped_begin(e);
   internal_reg_type(w, signature, FALSE);
-  return wrapped_end(e, LABCOMM_TYPE_DEF, w);  
+  return wrapped_end(e, LABCOMM_TYPE_DEF, w);
 #else
    return 0;
 #endif
 }
 int labcomm_internal_encoder_type_bind(
   struct labcomm_encoder *e,
-  const struct labcomm_signature *signature)
+  const struct labcomm_signature *signature,
+  char has_deps)
 {
-#ifndef WITHOUT_TYPE_DEFS 
+#ifndef WITHOUT_TYPE_DEFS
   int result = -EINVAL;
   int err;
   int sindex = labcomm_get_local_index(signature);
-  int tindex = labcomm_get_local_type_index(signature);
+  int tindex = has_deps ? labcomm_get_local_type_index(signature) : LABCOMM_BIND_SELF;
   labcomm_scheduler_writer_lock(e->scheduler);
-  if(sindex <= 0 || tindex <= 0) {goto out;}
-  err = labcomm_writer_start(e->writer, e->writer->action_context, 
+  if(sindex <= 0 || (has_deps && tindex <= 0)) {goto out;}
+  err = labcomm_writer_start(e->writer, e->writer->action_context,
 			     LABCOMM_TYPE_BINDING, signature, NULL);
   if (err == -EALREADY) { result = 0; goto out; }
   if (err != 0) { result = err; goto out; }
   int length = (labcomm_size_packed32(sindex) +
-                labcomm_size_packed32(tindex)); 
+                labcomm_size_packed32(tindex));
   labcomm_write_packed32(e->writer, LABCOMM_TYPE_BINDING);
   labcomm_write_packed32(e->writer, length);
   labcomm_write_packed32(e->writer, sindex);
@@ -367,9 +369,10 @@ int labcomm_internal_encoder_register(
   labcomm_scheduler_writer_lock(e->scheduler);
   if (index <= 0) { goto out; }
   done = LABCOMM_SIGNATURE_ARRAY_REF(e->memory, e->registered, int, index);
-  if (*done) { goto out; }
-  *done = 1;	
-  err = labcomm_writer_start(e->writer, e->writer->action_context, 
+  if (*done) {
+      goto out; }
+  *done = 1;
+  err = labcomm_writer_start(e->writer, e->writer->action_context,
 			     index, signature, NULL);
   if (err == -EALREADY) { result = 0; goto out; }
   if (err != 0) { result = err; goto out; }
@@ -407,7 +410,7 @@ int labcomm_internal_encode(
   index = labcomm_get_local_index(signature);
   length = (signature->encoded_size(value));
   labcomm_scheduler_writer_lock(e->scheduler);
-  result = labcomm_writer_start(e->writer, e->writer->action_context, 
+  result = labcomm_writer_start(e->writer, e->writer->action_context,
 				index, signature, value);
   if (result == -EALREADY) { result = 0; goto no_end; }
   if (result != 0) { goto out; }
@@ -435,8 +438,8 @@ int labcomm_encoder_sample_ref_register(
 
   done = LABCOMM_SIGNATURE_ARRAY_REF(e->memory, e->sample_ref, int, index);
   if (*done) { goto out; }
-  *done = 1;	
-  err = labcomm_writer_start(e->writer, e->writer->action_context, 
+  *done = 1;
+  err = labcomm_writer_start(e->writer, e->writer->action_context,
 			     index, signature, NULL);
   if (err == -EALREADY) { result = 0; goto out; }
   if (err != 0) { result = err; goto out; }
@@ -463,20 +466,20 @@ out:
   return result;
 }
 
-int labcomm_encoder_ioctl(struct labcomm_encoder *encoder, 
+int labcomm_encoder_ioctl(struct labcomm_encoder *encoder,
 			  uint32_t action,
 			  ...)
 {
   int result;
   va_list va;
-  
+
   if (LABCOMM_IOC_SIG(action) != LABCOMM_IOC_NOSIG) {
     result = -EINVAL;
     goto out;
   }
-  
+
   va_start(va, action);
-  result = labcomm_writer_ioctl(encoder->writer, 
+  result = labcomm_writer_ioctl(encoder->writer,
 			       encoder->writer->action_context,
 			       0, NULL, action, va);
   va_end(va);
@@ -485,7 +488,7 @@ out:
   return result;
 }
 
-int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder, 
+int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder,
 				   const struct labcomm_signature *signature,
 				   uint32_t action, va_list va)
 {
@@ -493,8 +496,8 @@ int labcomm_internal_encoder_ioctl(struct labcomm_encoder *encoder,
   int index;
 
   index = labcomm_get_local_index(signature);
-  result = labcomm_writer_ioctl(encoder->writer, 
-				encoder->writer->action_context, 
+  result = labcomm_writer_ioctl(encoder->writer,
+				encoder->writer->action_context,
 				index, signature, action, va);
   return result;
 }
diff --git a/lib/c/2014/labcomm_private.h b/lib/c/2014/labcomm_private.h
index a1792d0877a12e45ba5abbc776474084b62995fa..5047d658a4b55c2ba0d89a44ee3de0fb0e636ebc 100644
--- a/lib/c/2014/labcomm_private.h
+++ b/lib/c/2014/labcomm_private.h
@@ -65,6 +65,11 @@
 #define LABCOMM_DOUBLE       0x26
 #define LABCOMM_STRING       0x27
 
+/* 
+ * other special values
+ */
+
+#define LABCOMM_BIND_SELF    0
 
 /*
  * Macro to automagically call constructors in modules compiled 
@@ -370,7 +375,8 @@ int labcomm_internal_encoder_type_register(
 
 int labcomm_internal_encoder_type_bind(
   struct labcomm_encoder *e,
-  const struct labcomm_signature *signature);
+  const struct labcomm_signature *signature,
+  char has_deps);
 
 int labcomm_internal_encoder_register(
   struct labcomm_encoder *encoder, 
diff --git a/lib/c/2014/test/test_labcomm.c b/lib/c/2014/test/test_labcomm.c
index 793ce8d7db77cf8513ae1f52699957230b25a452..c8526776e98ea640a92ac6305dd97d2e87c05f60 100644
--- a/lib/c/2014/test/test_labcomm.c
+++ b/lib/c/2014/test/test_labcomm.c
@@ -252,7 +252,9 @@ int main(void)
 						NULL);
   struct expect expect_registration[] = {
     { "Sampledef", -1, test_decode_one, decoder },
+#ifdef SHOULD_THIS_BE_REMOVED
     { "Typedef", -1, test_decode_one, decoder },
+#endif
     { "Binding", -1, test_decode_one, decoder },
     { 0, 0, 0 }
   };
diff --git a/lib/c/2014/test/test_labcomm_generated_encoding.c b/lib/c/2014/test/test_labcomm_generated_encoding.c
index a78cc99f3138c61a374bcc21b253d514cab53dd1..53bb86aeec5fa7ff9033bf0372d89dd49017c1c1 100644
--- a/lib/c/2014/test/test_labcomm_generated_encoding.c
+++ b/lib/c/2014/test/test_labcomm_generated_encoding.c
@@ -214,24 +214,21 @@ int main(void)
   labcomm_encoder_register_generated_encoding_V(encoder);
   labcomm_encoder_register_generated_encoding_V(encoder);
   EXPECT({ 0x02, 0x06, VARIABLE(0), 0x01, 'V', 0x02, 0x11, 0x00,
-           0x04, 0x06, VARIABLE(1), 0x01, 'V', 0x02, 0x11, 0x00,
-           0x05, 0x02, VARIABLE(0), VARIABLE(1) });
+           0x05, 0x02, VARIABLE(0), LABCOMM_BIND_SELF });
 
   labcomm_encoder_ioctl(encoder, IOCTL_WRITER_RESET);
   /* Register twice to make sure that only one registration gets encoded */
   labcomm_encoder_register_generated_encoding_B(encoder);
   labcomm_encoder_register_generated_encoding_B(encoder);
   EXPECT({ 0x02, 0x05, VARIABLE(2), 0x01, 'B', 0x01, 0x21,
-           0x04, 0x05, VARIABLE(3), 0x01, 'B', 0x01, 0x21,
-           0x05, 0x02, VARIABLE(2), VARIABLE(3) });
+           0x05, 0x02, VARIABLE(2), LABCOMM_BIND_SELF });
 
   labcomm_encoder_ioctl(encoder, IOCTL_WRITER_RESET);
   /* Register twice to make sure that only one registration gets encoded */
   labcomm_encoder_register_generated_encoding_R(encoder);
   labcomm_encoder_register_generated_encoding_R(encoder);
   EXPECT({ 0x02, 0x08, VARIABLE(4), 0x01, 'R', 0x04, 0x10, 0x01, 0x04, 0x28,
-           0x04, 0x08, VARIABLE(5), 0x01, 'R', 0x04, 0x10, 0x01, 0x04, 0x28,
-           0x05, 0x02, VARIABLE(4), VARIABLE(5) });
+           0x05, 0x02, VARIABLE(4), LABCOMM_BIND_SELF });
 
   labcomm_encoder_ioctl(encoder, IOCTL_WRITER_RESET);
   /* Register twice to make sure that only one registration gets encoded */