diff --git a/compiler/2014/Java_CodeGen.jrag b/compiler/2014/Java_CodeGen.jrag
index 3d33a3bdc48bb1b2849359373d8492f8c2d37a82..3dd853eddaccffdbedce61828e0a08070c0adf61 100644
--- a/compiler/2014/Java_CodeGen.jrag
+++ b/compiler/2014/Java_CodeGen.jrag
@@ -499,7 +499,7 @@ aspect Java_Class {
   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();");
+    env.println("public static final Dispatcher dispatcher = new Dispatcher();");
     env.println();
     env.println("public SampleDispatcher getDispatcher() {");
     env.indent();
diff --git a/examples/user_types/Decoder.java b/examples/user_types/Decoder.java
index a0e7521a08bfd41867e4371bf6651657bca0303c..36d9aa46c3da19eae2bda68bb5d04eba3d206954 100644
--- a/examples/user_types/Decoder.java
+++ b/examples/user_types/Decoder.java
@@ -4,15 +4,9 @@ import java.io.InputStream;
 import java.io.IOException;
 
 import se.lth.control.labcomm2014.DecoderChannel;
-import se.lth.control.labcomm2014.TypeDef;
-import se.lth.control.labcomm2014.TypeDefParser;
-//import se.lth.control.labcomm2014.TypeBinding;
 
 public class Decoder
   implements twoLines.Handler,
-//             TypeDef.Handler,
-//             TypeBinding.Handler,
-             TypeDefParser.TypeDefListener,
              twoInts.Handler,
              theFirstInt.Handler,
              theSecondInt.Handler,
@@ -21,7 +15,6 @@ public class Decoder
 {
 
   private DecoderChannel decoder;
-  private TypeDefParser tdp;
 
   public Decoder(InputStream in) 
     throws Exception 
@@ -34,13 +27,7 @@ public class Decoder
     theSecondInt.register(decoder, this);
     intAndRef.register(decoder, this);
     doavoid.registerSampleRef(decoder);
-    this.tdp = TypeDefParser.registerTypeDefParser(decoder); 
- //   TypeDef.register(decoder, this);
- //   TypeBinding.register(decoder, this);
 
-        
-    tdp.addListener(this);
-    
     try {
       System.out.println("Running decoder.");
       decoder.run();
@@ -57,27 +44,6 @@ public class Decoder
     return "Line from "+genPoint(l.start)+" to "+genPoint(l.end);
   }
 
-//  public void handle_TypeDef(TypeDef d) throws java.io.IOException {
-//    System.out.println("Got TypeDef: "+d.getName()+"("+d.getIndex()+")");
-//  }
-//
-//  public void handle_TypeBinding(TypeBinding d) throws java.io.IOException {
-//    System.out.println("Got TypeBinding: "+d.getSampleIndex()+" --> "+d.getTypeIndex()+"");
-//  }
-
-  public void onTypeDef(TypeDefParser.ParsedTypeDef d) {
-    System.out.println("ontype_def: ");
-    System.out.print((d.isSampleDef()?"sample ":"typedef ")+d);
-    System.out.println(" "+d.getName()+";");
-    //for(byte b: d.getSignature()) {
-    //   System.out.print(Integer.toHexString(b)+" ");
-    //}
-    //System.out.println(); 
-    //try {
-    //   tdp.parseSignature(d.getIndex());
-    //} catch(IOException ex) { ex.printStackTrace();}   
-  }
-
   public void handle_doavoid() throws java.io.IOException {
     System.out.println("Got a void.");
   }
@@ -105,7 +71,6 @@ public class Decoder
     System.out.println("              Line l2: "+genLine(d.l2));
   }
 
-
   public static void main(String[] arg) throws Exception {
     Decoder example = new Decoder(
       new FileInputStream(new File(arg[0]))
diff --git a/examples/user_types/Encoder.java b/examples/user_types/Encoder.java
index 58f6cd0a8e57191f9337a3e2771a89b05bb1e31d..9c66661fe778654ea1127fa3cff1443d884ce19e 100644
--- a/examples/user_types/Encoder.java
+++ b/examples/user_types/Encoder.java
@@ -31,7 +31,7 @@ public class Encoder
       
     intAndRef iar = new intAndRef();
     iar.x = 17;
-    iar.reference = doavoid.class;
+    iar.reference = doavoid.dispatcher;
 
     System.out.println("Encoding intAndRef");
     intAndRef.encode(encoder, iar);
diff --git a/examples/user_types/Makefile b/examples/user_types/Makefile
index 4c2c91b0de76841511bc60b2257d491d5d4557ed..311095088322b1e62c91c683a0f41d91942fa5e6 100644
--- a/examples/user_types/Makefile
+++ b/examples/user_types/Makefile
@@ -3,7 +3,7 @@ LCCJAR=${LCDIR}/compiler/labcomm2014_compiler.jar# the LabComm compiler
 LCLJAR=${LCDIR}/lib/java/labcomm2014.jar# the LabComm library
 
 EXECUTABLES=example_encoder example_decoder \
-	    Encoder.class Decoder.class TDDecoder.class \
+	    Encoder.class Decoder.class \
 	    ExampleEncoder.exe ExampleDecoder.exe
 
 include ${LCDIR}/lib/c/os_compat.mk
@@ -50,7 +50,6 @@ build :
 	java -jar ${LCDIR}/compiler/labcomm2014_compiler.jar --java=${GENDIR} --c=${GENDIR}/test.c --h=${GENDIR}/test.h  --python=${GENDIR}/test.py --cs=${GENDIR}/test.cs test.lc 
 
 	javac -cp ${LCDIR}/lib/java/labcomm2014.jar:. ${GENDIR}/*.java Encoder.java Decoder.java
-	javac -cp ${LCDIR}/lib/java/labcomm2014.jar:${LCCJAR}:${GENDIR}:. TDDecoder.java
 
 	${CC} ${CFLAGS} ${LDFLAGS} -Wall -Werror -Wno-unused-function \
 	    -I. -I${LCDIR}/lib/c/2014 -L${LCDIR}/lib/c \
@@ -79,7 +78,7 @@ run:
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_decoder encoded_data_j
 
 	@echo "************ running python decoder (from wiki_example):"
-	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_j LabComm2014
+	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_j LabComm2014.v1
 
 	@echo "************ running C encoder: *****************"
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_encoder encoded_data_c
@@ -91,10 +90,10 @@ run:
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_decoder encoded_data_c
 
 	@echo "************ running python decoder (from wiki_example):"
-	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_c LabComm2014
+	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_c LabComm2014.v1
 
 	@echo "************ running python encoder: *****************"
-	@PYTHONPATH=${LCDIR}/lib/python:${GENDIR} ./example_encoder.py encoded_data_p LabComm2014
+	@PYTHONPATH=${LCDIR}/lib/python:${GENDIR} ./example_encoder.py encoded_data_p LabComm2014.v1
 
 	@echo "************ running Java  decoder: *****************"
 	@java -cp .:${LCDIR}/lib/java/labcomm2014.jar:${GENDIR} Decoder encoded_data_p
@@ -103,7 +102,7 @@ run:
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_decoder encoded_data_p
 
 	@echo "************ running python decoder (from wiki_example):"
-	PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_p LabComm2014
+	PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_p LabComm2014.v1
 
 runwcs: build ExampleEncoder.exe ExampleDecoder.exe
 	@echo
@@ -121,7 +120,7 @@ runwcs: build ExampleEncoder.exe ExampleDecoder.exe
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_decoder encoded_data_j
 
 	@echo "************ running python decoder (from wiki_example):"
-	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_j LabComm2014
+	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_j LabComm2014.v1
 
 	@echo "************ running C# decoder: *****************"
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ mono ./ExampleDecoder.exe encoded_data_j
@@ -136,13 +135,13 @@ runwcs: build ExampleEncoder.exe ExampleDecoder.exe
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_decoder encoded_data_c
 
 	@echo "************ running python decoder (from wiki_example):"
-	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_c LabComm2014
+	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_c LabComm2014.v1
 
 	@echo "************ running C# decoder: *****************"
 	@mono ./ExampleDecoder.exe encoded_data_c
 
 	@echo "************ running python encoder: *****************"
-	@PYTHONPATH=${LCDIR}/lib/python:${GENDIR} ./example_encoder.py encoded_data_p LabComm2014
+	@PYTHONPATH=${LCDIR}/lib/python:${GENDIR} ./example_encoder.py encoded_data_p LabComm2014.v1
 
 	@echo "************ running Java  decoder: *****************"
 	@java -cp .:${LCDIR}/lib/java/labcomm2014.jar:${GENDIR} Decoder encoded_data_p
@@ -151,7 +150,7 @@ runwcs: build ExampleEncoder.exe ExampleDecoder.exe
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_decoder encoded_data_p
 
 	@echo "************ running python decoder (from wiki_example):"
-	PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_p LabComm2014
+	PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_p LabComm2014.v1
 
 	@echo "************ running C# decoder: *****************"
 	@mono ./ExampleDecoder.exe encoded_data_p
@@ -166,24 +165,11 @@ runwcs: build ExampleEncoder.exe ExampleDecoder.exe
 	@LD_LIBRARY_PATH=${LCDIR}/lib/c/ ./example_decoder encoded_data_cs
 
 	@echo "************ running python decoder (from wiki_example):"
-	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_cs LabComm2014
+	@PYTHONPATH=${LCDIR}/lib/python ../wiki_example/example_decoder.py encoded_data_cs LabComm2014.v1
 
 	@echo "************ running C# decoder: *****************"
 	@mono ./ExampleDecoder.exe encoded_data_cs
 
-runjastadd: cleanbuild
-	@echo
-	@echo "********************************************"
-	@echo "***   ************ running example with JastAdd unparsing  ***"
-	@echo "********************************************"
-	@echo
-
-	@java -cp .:${LCDIR}/lib/java/labcomm2014.jar:${GENDIR} Encoder encoded_data_j
-
-	@echo "************ running Java  TypeDefdecoder: *****************"
-	java -cp .:${LCDIR}/lib/java/labcomm2014.jar:${LCCJAR}:${GENDIR} TDDecoder encoded_data_j
-
-
 clean:
 	rm -rf ${GENDIR}
 
diff --git a/examples/user_types/TDDecoder.java b/examples/user_types/TDDecoder.java
deleted file mode 100644
index 52b3eb967d6d796338ddb1859d006ed389586538..0000000000000000000000000000000000000000
--- a/examples/user_types/TDDecoder.java
+++ /dev/null
@@ -1,139 +0,0 @@
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.io.IOException;
-
-import se.lth.control.labcomm2014.DecoderChannel;
-import se.lth.control.labcomm2014.TypeDef;
-import se.lth.control.labcomm2014.TypeDefParser;
-import se.lth.control.labcomm2014.ASTbuilder;
-//import se.lth.control.labcomm2014.TypeBinding;
-
-import se.lth.control.labcomm2014.compiler.Specification;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
-
-import java.util.Vector;
-import java.util.LinkedList;
-import java.util.Iterator;
-
-
-public class TDDecoder
-  implements twoLines.Handler,
-//             TypeDef.Handler,
-//             TypeBinding.Handler,
-             TypeDefParser.TypeDefListener,
-             twoInts.Handler,
-             theFirstInt.Handler,
-             theSecondInt.Handler,
-             doavoid.Handler,
-             intAndRef.Handler
-{
-
-  private DecoderChannel decoder;
-  private TypeDefParser tdp;
-
-  public TDDecoder(InputStream in) 
-    throws Exception 
-  {
-    decoder = new DecoderChannel(in);
-    twoInts.register(decoder, this);
-    twoLines.register(decoder, this);
-    theFirstInt.register(decoder, this);
-    theSecondInt.register(decoder, this);
-    doavoid.register(decoder, this);
-    intAndRef.register(decoder, this);
-    doavoid.registerSampleRef(decoder);
-    this.tdp = TypeDefParser.registerTypeDefParser(decoder); 
- //   TypeDef.register(decoder, this);
- //   TypeBinding.register(decoder, this);
-
-        
-    tdp.addListener(this);
-    
-    try {
-      System.out.println("Running decoder.");
-      decoder.run();
-    } catch (java.io.EOFException e) {
-	System.out.println("Decoder reached end of file.");
-    }
-  }
-
-  private String genPoint(point p) {
-    return "("+p.x.val+", "+p.y.val+")";
-  }
-
-  private String genLine(line l) {
-    return "Line from "+genPoint(l.start)+" to "+genPoint(l.end);
-  }
-
-//  public void handle_TypeDef(TypeDef d) throws java.io.IOException {
-//    System.out.println("Got TypeDef: "+d.getName()+"("+d.getIndex()+")");
-//  }
-//
-//  public void handle_TypeBinding(TypeBinding d) throws java.io.IOException {
-//    System.out.println("Got TypeBinding: "+d.getSampleIndex()+" --> "+d.getTypeIndex()+"");
-//  }
-
-  public void onTypeDef(TypeDefParser.ParsedTypeDef d) {
-    if(d.isSampleDef()){
-        System.out.println("onTypeDef (sample): ");
-        ASTbuilder v = new ASTbuilder();
-        Specification p = v.makeSpecification((TypeDefParser.ParsedSampleDef) d);
-        try {
-                //FileOutputStream f = new FileOutputStream("/tmp/foopp"+d.getName()+".txt");
-                //PrintStream out = new PrintStream(f);
-                p.pp(System.out);
-                //p.C_genC(System.out, new Vector(), "lcname", "prefix", 2014);
-                //p.J_gen(out, "testpackage", 2014);
-                //out.close();
-        } catch (Throwable e) {
-                System.err.println("Exception: " + e);
-                e.printStackTrace();
-        }
-    }
-    //System.out.println(" "+d.getName()+";");
-    //for(byte b: d.getSignature()) {
-    //   System.out.print(Integer.toHexString(b)+" ");
-    //}
-    //System.out.println(); 
-    //try {
-    //   tdp.parseSignature(d.getIndex());
-    //} catch(IOException ex) { ex.printStackTrace();}   
-  }
-
-  public void handle_twoInts(twoInts d) throws java.io.IOException {
-    System.out.print("Got twoInts: ");
-    System.out.println(d.a +", "+d.b);
-  }
-
-  public void handle_theFirstInt(int d) throws java.io.IOException {
-    System.out.println("Got theFirstInt: "+d);
-  }
-
-  public void handle_theSecondInt(int d) throws java.io.IOException {
-    System.out.println("Got theSecondInt: "+d);
-  }
-
-  public void handle_doavoid() throws java.io.IOException {
-    System.out.println("Got a void.");
-  }
-
-  public void handle_intAndRef(intAndRef d) throws java.io.IOException {
-    System.out.println("Got intAndRef: "+d.x+", "+d.reference);
-  }
-
-  public void handle_twoLines(twoLines d) throws java.io.IOException {
-    System.out.print("Got twoLines: ");
-    System.out.println("Line l1: "+genLine(d.l1));
-    System.out.println("              Line l2: "+genLine(d.l2));
-  }
-
-
-  public static void main(String[] arg) throws Exception {
-    TDDecoder example = new TDDecoder(
-      new FileInputStream(new File(arg[0]))
-    );
-  }
-}
-
diff --git a/test/relay_gen_java.py b/test/relay_gen_java.py
index 314b6673e17534a569888e1ce8e874c4cbccf5ad..04aefa9d4c0fd7ae56c891df20874a76fe13385b 100755
--- a/test/relay_gen_java.py
+++ b/test/relay_gen_java.py
@@ -85,9 +85,9 @@ if __name__ == '__main__':
         result.extend(split_match('^[^|]*\|(.*)$', """
         |    RenamingRegistry registry = new RenamingRegistry();
         |    decoder = new RenamingDecoder(
-        |        decoder, registry, s -> "prefix:" + s + ":suffix");
+        |        decoder, registry, new RenamingDecoder.Rename() {public String rename(String s){return "prefix:" + s + ":suffix";}});
         |    encoder = new RenamingEncoder(
-        |        encoder, registry, s -> "prefix:" + s + ":suffix");
+        |        encoder, registry, new RenamingEncoder.Rename() {public String rename(String s){return "prefix:" + s + ":suffix";}});
         """))
     for func,arg in shuffle(sample):
         result.append('    %s.register(decoder, this);' % func)