diff --git a/compiler/2014/Java_CodeGen.jrag b/compiler/2014/Java_CodeGen.jrag
index fbe1cddae30c7031905c167fb93e0b4c2060cec4..0faa6c852307c90eba8ce21dfd6ab31593aafbd1 100644
--- a/compiler/2014/Java_CodeGen.jrag
+++ b/compiler/2014/Java_CodeGen.jrag
@@ -167,6 +167,42 @@ aspect Java_Class {
 
   }
 
+  private void Decl.Java_declareUserTypeDeps(Java_env env) {
+    int numDeps = type_dependencies().size();
+    int i=0;
+    env.println("private Set<SampleDispatcher> typeDependencies = new HashSet<SampleDispatcher>();");
+
+    env.println("public Dispatcher(){");
+    env.indent();
+    Iterator<Decl> it = type_dependencies().iterator();
+    while(it.hasNext()) {
+        Decl t = it.next();
+        //env.println("deps["+(i++)+"] = "+t.getName()+";");
+        env.println("typeDependencies.add("+t.getName()+".dispatcher);");
+    }
+    env.unindent();
+    env.println("}");
+
+    env.println("public Iterator<SampleDispatcher> getDependencyIterator(){");
+    env.indent();
+    env.println("return typeDependencies.iterator();");
+    env.unindent();
+    env.println("}");
+
+    env.println("public void registerTypeDeps(Encoder e) throws IOException {");
+    env.indent();
+//    env.println("for (SampleDispatcher d : typeDependencies) {");
+    env.println("Iterator<SampleDispatcher> it = typeDependencies.iterator();");
+    env.println("while (it.hasNext()) {");
+    env.indent();
+    env.println("SampleDispatcher d = it.next();");
+    env.println("d.registerTypeDeps(e);");
+    env.println("e.register(d);");
+    env.unindent();
+    env.println("}");
+    env.unindent();
+    env.println("}");
+  }
   public void Decl.Java_emitUserTypeDeps(Java_env env, String via, boolean outputCode) {
   // XXX TODO will generate unnecessary recursion for types. fix this per commented out code
   // XXX      but ensure that types with references actually register themselves.. (i.e., add "nested" argument)
@@ -227,7 +263,8 @@ aspect Java_Class {
     env.println();
     env.println("public static void register(Encoder e, boolean sendMetaData) throws IOException {");
     env.indent();
-    Java_emitUserTypeDeps(env, null, true);
+//    Java_emitUserTypeDeps(env, null, true);
+    env.println("dispatcher.registerTypeDeps(e);");
     env.println("e.register(dispatcher);");
     env.unindent();
     env.println("}");
@@ -252,6 +289,9 @@ aspect Java_Class {
           env.println("import se.lth.control.labcomm"+env.verStr+".Encoder;");
           env.println("import se.lth.control.labcomm"+env.verStr+".SampleDispatcher;");
           env.println("import se.lth.control.labcomm"+env.verStr+".SampleHandler;");
+          env.println("import java.util.Set;");
+          env.println("import java.util.HashSet;");
+          env.println("import java.util.Iterator;");
 //          env.println();
 //      }
 //
@@ -300,6 +340,9 @@ aspect Java_Class {
     env.println("import se.lth.control.labcomm"+env.verStr+".Encoder;");
     env.println("import se.lth.control.labcomm"+env.verStr+".SampleHandler;");
     env.println("import se.lth.control.labcomm"+env.verStr+".Sample;");
+    env.println("import java.util.Set;");
+    env.println("import java.util.HashSet;");
+    env.println("import java.util.Iterator;");
     env.println();
     env.print("public class " + getName());
 //  TODO: ?
@@ -410,9 +453,9 @@ aspect Java_Class {
 
   //XXX TODO: refactor: split into a static class ("TypeDefSingleton"?)and a (smaller) dispatcher
   public void Decl.Java_emitDispatcher(Java_env env, boolean isSample) {
-    // String genericStr = ""; //env.versionHasMetaData()?"<"+getName()+">":""; 
-    String genericStr = "<"+getName()+">"; 
-    env.println("private static Dispatcher dispatcher = new Dispatcher();");
+    // String genericStr = ""; //env.versionHasMetaData()?"<"+getName()+">":"";
+    String genericStr = "<"+getName()+">";
+    env.println("static Dispatcher dispatcher = new Dispatcher();");
     env.println();
     getTypeInstance().Java_emitAnnotationComment(env);
     env.println("public SampleDispatcher getDispatcher() {");
@@ -421,9 +464,10 @@ aspect Java_Class {
     env.unindent();
     env.println("}");
     env.println();
-    env.println("private static class Dispatcher implements SampleDispatcher "+genericStr+"{");
+    env.println("static class Dispatcher implements SampleDispatcher "+genericStr+"{");
     env.indent();
     env.println();
+    Java_declareUserTypeDeps(env);
     env.println("public Class"+genericStr+" getSampleClass() {");
     env.indent();
     env.println("return " + getName() + ".class;");
diff --git a/lib/java/se/lth/control/labcomm2014/SampleDispatcher.java b/lib/java/se/lth/control/labcomm2014/SampleDispatcher.java
index c6784df4327bec250db528d83936a12ec5385222..c9f6fe777c702ab0abe2da9eba953d4aa0f44736 100644
--- a/lib/java/se/lth/control/labcomm2014/SampleDispatcher.java
+++ b/lib/java/se/lth/control/labcomm2014/SampleDispatcher.java
@@ -29,5 +29,7 @@ public interface SampleDispatcher <T extends SampleType>{
    *  applicable to both type and sample defs.
    */
   public byte getTypeDeclTag();
+
+  public void registerTypeDeps(Encoder e) throws IOException;
 }
 
diff --git a/lib/java/se/lth/control/labcomm2014/TypeBinding.java b/lib/java/se/lth/control/labcomm2014/TypeBinding.java
index 74ef1f38b546532f537ec943e305921bfe83344c..52f1e5b7e12e66de4e711c4db8b6b2e7e14a1f6c 100644
--- a/lib/java/se/lth/control/labcomm2014/TypeBinding.java
+++ b/lib/java/se/lth/control/labcomm2014/TypeBinding.java
@@ -89,6 +89,10 @@ public class TypeBinding implements BuiltinType {
       throw new Error("Should not be called");
     }
 
+    public void registerTypeDeps(Encoder e) throws IOException{
+      throw new Error("Should not be called");
+    }
+
     public void decodeAndHandle(Decoder d,
                                 SampleHandler h) throws Exception {
       ((Handler)h).handle_TypeBinding(TypeBinding.decode(d));
diff --git a/lib/java/se/lth/control/labcomm2014/TypeDef.java b/lib/java/se/lth/control/labcomm2014/TypeDef.java
index 78fbef9669e699f95265f6789eff5a8de0479748..f4a608c5ed0687bc1940cc2ff7a1d2a0bf4a3c32 100644
--- a/lib/java/se/lth/control/labcomm2014/TypeDef.java
+++ b/lib/java/se/lth/control/labcomm2014/TypeDef.java
@@ -97,6 +97,10 @@ public class TypeDef implements BuiltinType {
       throw new Error("Should not be called");
     }
 
+    public void registerTypeDeps(Encoder e) throws IOException{
+      throw new Error("Should not be called");
+    }
+
 //    public boolean canDecodeAndHandle() {
 //      return true;
 //    }