diff --git a/test/Makefile b/test/Makefile
index f9882e91f4213e0f24596fbd2e3f29d705ef4356..4133a659abf9a2242086707d4cbfbd660638ffcf 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -11,17 +11,18 @@ clean:
 	rm -rf gen
 
 .PHONY: test_%
-test_%: gen/%/c_relay \
-	gen/%/cs_code.cs \
+test_%: gen/%/signatures.py \
+	gen/%/c_relay \
 	gen/%/cs_relay.exe \
-	gen/%/signatures.py \
+	gen/%/java_relay.class \
 	gen/%/java_code 
 	PYTHONPATH=../lib/python ./test_encoder_decoder.py \
 		--signatures=gen/$*/signatures.py \
 		--test /bin/tee gen/$*/testdata \
 		--test gen/$*/c_relay /dev/stdin /dev/stdout \
-		--test mono gen/$*/cs_relay.exe /dev/stdin /dev/stdout
-
+		--test mono gen/$*/cs_relay.exe /dev/stdin /dev/stdout \
+		--test java \\-cp gen/$*:../lib/java/labcomm.jar java_relay \
+			    /dev/stdin /dev/stdout
 .PRECIOUS: gen/%/
 gen/%/:
 	mkdir -p $@
@@ -77,3 +78,10 @@ gen/%/java_code: %.lc | gen/%/
 	mkdir -p $@
 	$(LABCOMM) --java=$@ $<
 
+.PRECIOUS: gen/%/java_relay.java
+gen/%/java_relay.java: gen/%/typeinfo relay_gen_java.py Makefile
+	./relay_gen_java.py $< > $@
+
+.PRECIOUS: gen/%/java_relay.class
+gen/%/java_relay.class: gen/%/java_relay.java gen/%/java_code Makefile
+	javac -d gen/$*  -cp ../lib/java/labcomm.jar:gen/$*/java_code $<
diff --git a/test/relay_gen_java.py b/test/relay_gen_java.py
new file mode 100755
index 0000000000000000000000000000000000000000..9c0869bbac9fcb143051897784603655be27c27f
--- /dev/null
+++ b/test/relay_gen_java.py
@@ -0,0 +1,84 @@
+#!/usr/bin/python
+
+import re
+import sys
+
+def split_match(pattern, multiline):
+    def match(s):
+        m = re.match(pattern, s)
+        if m:
+            return m.group(1)
+        pass
+    return filter(lambda s: s != None, map(match, multiline.split('\n')))
+   
+
+if __name__ == '__main__':
+    f = open(sys.argv[1])
+    sample = []
+    for l in map(lambda s: s.strip(), f):
+        lang,kind,func,arg = l[1:].split(l[0])
+        if lang == 'Java' and kind == 'sample':
+            sample.append((func, arg))
+            pass
+        pass
+    result = []
+    result.extend(split_match('^[^|]*\|(.*)$', """
+      |import java.io.FileInputStream;
+      |import java.io.FileOutputStream;
+      |import java.io.IOException;
+      |import se.lth.control.labcomm.LabCommDecoderChannel;
+      |import se.lth.control.labcomm.LabCommEncoderChannel;
+      |
+      |public class java_relay implements
+    """))
+    for func,arg in sample[0:-1]:
+        result.append('  %s.Handler,' % func)
+        pass
+    result.append('  %s.Handler' % sample[-1][0])
+    result.extend(split_match('^[^|]*\|(.*)$', """
+      |{
+      |  LabCommEncoderChannel encoder;
+    """))
+    for func,arg in sample:
+        if arg == 'void':
+            result.extend(split_match('^[^|]*\|(.*)$', """
+              |  public void handle_%(func)s() throws IOException {
+              |    %(func)s.encode(encoder);
+              |  }
+            """ % { 'func': func}))
+            pass
+        else:
+            result.extend(split_match('^[^|]*\|(.*)$', """
+              |  public void handle_%(func)s(%(arg)s data) throws IOException {
+              |    %(func)s.encode(encoder, data);
+              |  }
+            """ % { 'func': func, 'arg': arg}))
+            pass
+        pass
+    result.extend(split_match('^[^|]*\|(.*)$', """
+      |  public java_relay(String InName, String OutName) throws Exception {
+      |    FileInputStream InFile = new FileInputStream(InName);
+      |    LabCommDecoderChannel d = new LabCommDecoderChannel(InFile);
+      |    FileOutputStream OutFile = new FileOutputStream(OutName);
+      |    encoder = new LabCommEncoderChannel(OutFile);
+      |
+    """))
+    for func,arg in sample:
+        result.append('    %s.register(d, this);' % func)
+        pass
+    for func,arg in sample:
+        result.append('    %s.register(encoder);' % func)
+        pass
+    result.extend(split_match('^[^|]*\|(.*)$', """
+      |    try {
+      |      d.run();
+      |    } catch (java.io.EOFException e) {
+      |    }
+      |  }
+      |  public static void main(String[] arg) throws Exception {
+      |    new java_relay(arg[0], arg[1]);
+      |  }
+      |}
+    """))
+    print "\n".join(result)
+    pass