diff --git a/compiler/build.xml b/compiler/build.xml
index ff8cf2aa16f4d392dba1f47d5e38e9faac95dbab..dd0e26953c4f324177e168e02100aa1c6b65eeaa 100644
--- a/compiler/build.xml
+++ b/compiler/build.xml
@@ -15,7 +15,7 @@
 <property name="tools" value="tools"/>
 	
 <!-- "test" is the directory where tests are located. -->
-<property name="test" value="test"/>
+<property name="test" value="../test"/>
 	
 <!-- "jflex" is an ant task class for the scanner generator in JFlex.jar -->
 <taskdef name="jflex" classname="JFlex.anttask.JFlexTask" classpath="tools/JFlex.jar"/>
@@ -66,7 +66,7 @@ classpath="tools/jastadd2.jar"/>
 <!-- compile sources -->
 <target name="test" depends="jar">
   <echo message = "Running tests"/>
-  <exec executable="./run" dir="test"> 
+  <exec executable="./run" dir="../test"> 
     <env key="PYTHONPATH" value="../lib/python"/>
     <!--arg value="hej"/-->
   </exec>
diff --git a/lib/c/labcomm_fd_reader_writer.h b/lib/c/labcomm_fd_reader_writer.h
index 538dccd3d1e66806d56b54c2bc8afb46c4b2633d..2d08cf179f0d0e8f8f17a56e16a8837ead939b6d 100644
--- a/lib/c/labcomm_fd_reader_writer.h
+++ b/lib/c/labcomm_fd_reader_writer.h
@@ -6,4 +6,5 @@ extern int labcomm_fd_reader(
 
 extern int labcomm_fd_writer(
   labcomm_writer_t *r, 
-  labcomm_writer_action_t action);
+  labcomm_writer_action_t action,
+  ...);
diff --git a/lib/java/se/lth/control/labcomm/LabCommEncoderChannel.java b/lib/java/se/lth/control/labcomm/LabCommEncoderChannel.java
index cbb4bd78311755119c78519ef27fe698105e9435..4154ca023d77ae676b6eeed91bede7f028806c5d 100644
--- a/lib/java/se/lth/control/labcomm/LabCommEncoderChannel.java
+++ b/lib/java/se/lth/control/labcomm/LabCommEncoderChannel.java
@@ -7,18 +7,22 @@ import java.io.OutputStream;
 
 public class LabCommEncoderChannel implements LabCommEncoder {
 
-  private OutputStream writer;
+  private LabCommWriter writer;
   private ByteArrayOutputStream bytes;
   private DataOutputStream data;
   private LabCommEncoderRegistry registry;
 
-  public LabCommEncoderChannel(OutputStream writer) {
+  public LabCommEncoderChannel(LabCommWriter writer) {
     this.writer = writer;
     bytes = new ByteArrayOutputStream();
     data = new DataOutputStream(bytes);
     registry = new LabCommEncoderRegistry();
   }
 
+  public LabCommEncoderChannel(OutputStream writer) {
+    this(new WriterWrapper(writer));
+  }
+
   public void register(LabCommDispatcher dispatcher) throws IOException {
     int index = registry.add(dispatcher);
     encodePacked32(LabComm.SAMPLE);
@@ -37,7 +41,9 @@ public class LabCommEncoderChannel implements LabCommEncoder {
 
   public void end(Class<? extends LabCommSample> c) throws IOException {
     data.flush();
-    bytes.writeTo(writer);
+    //XXX when writer was a stream, it was probably a bit more GC efficient:
+    //bytes.writeTo(writer);
+    writer.write(bytes.toByteArray());
     bytes.reset();
   }
 
diff --git a/lib/java/se/lth/control/labcomm/LabCommWriter.java b/lib/java/se/lth/control/labcomm/LabCommWriter.java
index b45cd57e4c0692e4301e6645f0930671c5dbe3ef..887c5471842bc8928d89bb469f463f111c835f69 100644
--- a/lib/java/se/lth/control/labcomm/LabCommWriter.java
+++ b/lib/java/se/lth/control/labcomm/LabCommWriter.java
@@ -1,7 +1,9 @@
 package se.lth.control.labcomm;
 
+import java.io.IOException;
+
 public interface LabCommWriter {
 
-  public void write(byte[] data);
+  public void write(byte[] data) throws IOException;
 
 }
diff --git a/lib/java/se/lth/control/labcomm/WriterWrapper.java b/lib/java/se/lth/control/labcomm/WriterWrapper.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f7d1922e16cd2ce18cbfc6a8a19b09462679bc4
--- /dev/null
+++ b/lib/java/se/lth/control/labcomm/WriterWrapper.java
@@ -0,0 +1,17 @@
+package se.lth.control.labcomm;
+
+import java.io.OutputStream;
+import java.io.IOException;
+
+class WriterWrapper implements LabCommWriter{
+
+  private OutputStream os;
+
+  public WriterWrapper(OutputStream os) {
+    this.os = os;
+  }
+
+  public void write(byte[] data) throws IOException {
+    os.write(data);
+  }
+}