diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java b/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java
index 39ba6ea9e48d263ec32e1c52336efabd7cf0a1b5..c74dccac815faed84ebddfdc85a7fe7074303c9c 100644
--- a/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java
+++ b/briar-core/src/net/sf/briar/plugins/modem/ModemImpl.java
@@ -170,7 +170,8 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
 			return false;
 		}
 		try {
-			ReliabilityLayer reliabilityLayer = new ReliabilityLayer(this);
+			ReliabilityLayer reliabilityLayer =
+					new ReliabilityLayer(executor, this);
 			synchronized(this) {
 				if(!initialised) {
 					if(LOG.isLoggable(INFO))
@@ -348,7 +349,8 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
 			return;
 		}
 		try {
-			ReliabilityLayer reliabilityLayer = new ReliabilityLayer(this);
+			ReliabilityLayer reliabilityLayer =
+					new ReliabilityLayer(executor, this);
 			synchronized(this) {
 				if(!initialised) {
 					if(LOG.isLoggable(INFO))
diff --git a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayer.java b/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayer.java
index d033aa678aeeb8f68d48faa1027c7684784b68e3..b86b1b123680337eb7630a689c8697e3473c7ec6 100644
--- a/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayer.java
+++ b/briar-core/src/net/sf/briar/plugins/modem/ReliabilityLayer.java
@@ -7,6 +7,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.Executor;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.logging.Logger;
 
@@ -17,6 +18,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
 	private static final Logger LOG =
 			Logger.getLogger(ReliabilityLayer.class.getName());
 
+	private final Executor executor;
 	private final WriteHandler writeHandler;
 	private final BlockingQueue<byte[]> writes;
 
@@ -24,10 +26,10 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
 	private volatile SlipDecoder decoder = null;
 	private volatile ReceiverInputStream inputStream = null;
 	private volatile SenderOutputStream outputStream = null;
-	private volatile Thread writer = null;
 	private volatile boolean running = false;
 
-	ReliabilityLayer(WriteHandler writeHandler) {
+	ReliabilityLayer(Executor executor, WriteHandler writeHandler) {
+		this.executor = executor;
 		this.writeHandler = writeHandler;
 		writes = new LinkedBlockingQueue<byte[]>();
 	}
@@ -39,8 +41,8 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
 		decoder = new SlipDecoder(receiver);
 		inputStream = new ReceiverInputStream(receiver);
 		outputStream = new SenderOutputStream(sender);
-		writer = new Thread("ReliabilityLayer") {
-			@Override
+		running = true;
+		executor.execute(new Runnable() {
 			public void run() {
 				long now = System.currentTimeMillis();
 				long next = now + TICK_INTERVAL;
@@ -61,7 +63,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
 					}
 				} catch(InterruptedException e) {
 					if(LOG.isLoggable(WARNING))
-						LOG.warning("Interrupted while writing");
+						LOG.warning("Interrupted while waiting to write");
 					Thread.currentThread().interrupt();
 					running = false;
 				} catch(IOException e) {
@@ -70,9 +72,7 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
 					running = false;
 				}
 			}
-		};
-		running = true;
-		writer.start();
+		});
 	}
 
 	InputStream getInputStream() {