diff --git a/src/net/sf/briar/plugins/modem/ModemImpl.java b/src/net/sf/briar/plugins/modem/ModemImpl.java
index e9135831325704bd4f09f538610a465665660550..5ca78fee18a998a714b89190971c9dd69b8b19e4 100644
--- a/src/net/sf/briar/plugins/modem/ModemImpl.java
+++ b/src/net/sf/briar/plugins/modem/ModemImpl.java
@@ -38,7 +38,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
 
 	private int lineLen = 0;
 
-	private volatile ReliabilityLayer reliabilityLayer = null;
+	private volatile ReliabilityLayer reliabilityLayer;
 
 	ModemImpl(Executor executor, Callback callback, String portName) {
 		this.executor = executor;
@@ -48,6 +48,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
 		offHook = new Semaphore(1);
 		connected = new AtomicBoolean(false);
 		line = new byte[MAX_LINE_LENGTH];
+		reliabilityLayer = new ReliabilityLayer(this);
 	}
 
 	public void init() throws IOException {
@@ -129,6 +130,7 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
 			throw new IOException(e.toString());
 		}
 		reliabilityLayer.invalidate();
+		reliabilityLayer = new ReliabilityLayer(this);
 		connected.set(false);
 		offHook.release();
 	}
@@ -176,7 +178,6 @@ class ModemImpl implements Modem, WriteHandler, SerialPortEventListener {
 				lineLen = 0;
 				if(LOG.isLoggable(INFO)) LOG.info("Modem status: " + s);
 				if(s.startsWith("CONNECT")) {
-					reliabilityLayer = new ReliabilityLayer(this);
 					synchronized(connected) {
 						if(connected.getAndSet(true))
 							throw new IOException("Connected twice");
diff --git a/src/net/sf/briar/plugins/modem/ReliabilityLayer.java b/src/net/sf/briar/plugins/modem/ReliabilityLayer.java
index 3c965b37e8c073e255e2824cfb7bdecd10b5f665..bc97a5e2ed46303ecbbac4faa19366219e1742f9 100644
--- a/src/net/sf/briar/plugins/modem/ReliabilityLayer.java
+++ b/src/net/sf/briar/plugins/modem/ReliabilityLayer.java
@@ -6,26 +6,21 @@ import java.io.OutputStream;
 
 class ReliabilityLayer implements ReadHandler, WriteHandler {
 
-	// Write side
 	private final WriteHandler writeHandler;
-	private final SlipEncoder encoder;
-	private final Sender sender;
-	private final SenderOutputStream outputStream;
-	// Read side
 	private final SlipDecoder decoder;
-	private final Receiver receiver;
 	private final ReceiverInputStream inputStream;
+	private final SenderOutputStream outputStream;
 
 	private volatile boolean valid = true;
 
 	ReliabilityLayer(WriteHandler writeHandler) {
 		this.writeHandler = writeHandler;
-		encoder = new SlipEncoder(this);
-		sender = new Sender(encoder);
-		outputStream = new SenderOutputStream(sender);
-		receiver = new Receiver(sender);
+		SlipEncoder encoder = new SlipEncoder(this);
+		Sender sender = new Sender(encoder);
+		Receiver receiver = new Receiver(sender);
 		decoder = new SlipDecoder(receiver);
 		inputStream = new ReceiverInputStream(receiver);
+		outputStream = new SenderOutputStream(sender);
 	}
 
 	InputStream getInputStream() {
@@ -40,11 +35,13 @@ class ReliabilityLayer implements ReadHandler, WriteHandler {
 		valid = false;
 	}
 
+	// The modem calls this method to pass data up to the SLIP decoder
 	public void handleRead(byte[] b, int length) throws IOException {
 		if(!valid) throw new IOException("Connection closed");
 		decoder.handleRead(b, length);
 	}
 
+	// The SLIP encoder calls this method to pass data down to the modem
 	public void handleWrite(byte[] b, int length) throws IOException {
 		if(!valid) throw new IOException("Connection closed");
 		writeHandler.handleWrite(b, length);