diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSession.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSession.java
similarity index 87%
rename from bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSession.java
rename to bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSession.java
index 82ba19178510f19be201e05321c2614108cf5442..d114467fd250ed7f7b71bc7d95b2aa093713edb1 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSession.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxSession.java
@@ -1,4 +1,4 @@
-package org.briarproject.bramble.mailbox;
+package org.briarproject.bramble.api.mailbox;
 
 import java.io.IOException;
 
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorage.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorage.java
new file mode 100644
index 0000000000000000000000000000000000000000..ea197b405f98b22b5fe590ebe36371361ca3bb0a
--- /dev/null
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorage.java
@@ -0,0 +1,17 @@
+package org.briarproject.bramble.api.mailbox;
+
+import org.briarproject.bramble.api.contact.ContactId;
+
+import javax.annotation.Nullable;
+
+public interface MailboxStorage {
+	void storeStream(ContactId contactId, byte[] encryptedStream,
+			boolean forOwner);
+
+	@Nullable
+	MailboxStorageStream getStream(ContactId contactId, boolean forOwner);
+
+	MailboxStorageStream getStreamForOwner();
+
+	void deleteStream(MailboxStorageStream stream);
+}
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorageStream.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorageStream.java
new file mode 100644
index 0000000000000000000000000000000000000000..feccc4fd3baa5c9f9e8fb0f4a49316fccdd4731f
--- /dev/null
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxStorageStream.java
@@ -0,0 +1,15 @@
+package org.briarproject.bramble.api.mailbox;
+
+import org.briarproject.bramble.api.contact.ContactId;
+
+public interface MailboxStorageStream {
+	byte[] getStream();
+
+	boolean isPending();
+
+	void setPending(boolean pending);
+
+	boolean isForOwner();
+
+	ContactId getContactId();
+}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java
index 16166e5badce36aee11064a516679f02a1c325f8..23df67adcee6e706e3be4df35c921509035348d7 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/AbstractMailboxSession.java
@@ -5,6 +5,7 @@ import org.briarproject.bramble.api.db.DatabaseComponent;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.db.Transaction;
 import org.briarproject.bramble.api.mailbox.MailboxConstants;
+import org.briarproject.bramble.api.mailbox.MailboxSession;
 import org.briarproject.bramble.api.sync.SyncSession;
 import org.briarproject.bramble.api.sync.SyncSessionFactory;
 import org.briarproject.bramble.api.transport.KeyManager;
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java
index ed5ba0050617752c5f791f456f711e92b1f3952e..115f318ee0869b3acac0abce27435acf1da94696 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxContactSession.java
@@ -2,6 +2,8 @@ package org.briarproject.bramble.mailbox;
 
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DatabaseComponent;
+import org.briarproject.bramble.api.mailbox.MailboxStorage;
+import org.briarproject.bramble.api.mailbox.MailboxStorageStream;
 import org.briarproject.bramble.api.sync.SyncSessionFactory;
 import org.briarproject.bramble.api.transport.KeyManager;
 import org.briarproject.bramble.api.transport.StreamReaderFactory;
@@ -40,8 +42,10 @@ public class MailboxContactSession extends AbstractMailboxSession {
 			StreamWriterFactory streamWriterFactory,
 			StreamReaderFactory streamReaderFactory,
 			MailboxProtocol mailboxProtocol, int transportMaxLatency,
-			int transportMaxIdleTime, MailboxStorage mailboxStorage, DatabaseComponent db) {
-		super(ioExecutor, db, keyManager, syncSessionFactory, streamWriterFactory,
+			int transportMaxIdleTime, MailboxStorage mailboxStorage,
+			DatabaseComponent db) {
+		super(ioExecutor, db, keyManager, syncSessionFactory,
+				streamWriterFactory,
 				streamReaderFactory, mailboxProtocol, transportMaxLatency,
 				transportMaxIdleTime, contactId);
 		this.mailboxProtocol = mailboxProtocol;
@@ -76,13 +80,13 @@ public class MailboxContactSession extends AbstractMailboxSession {
 
 	void sendStoredStreams() throws IOException, InterruptedException {
 		// Get stored sync stream if available
-		MailboxStorage.MailboxStorageStream nextStream =
+		MailboxStorageStream nextStream =
 				mailboxStorage.getStream(contactId, false);
 
 		while (nextStream != null) {
 			// Send TAKE request and delete stream if request was successfull
 			MailboxRequestTake req =
-					new MailboxRequestTake(nextStream.getEncryptedStream());
+					new MailboxRequestTake(nextStream.getStream());
 			mailboxProtocol.writeRequest(req);
 
 			if (req.awaitAndGetResponse())
@@ -110,7 +114,8 @@ public class MailboxContactSession extends AbstractMailboxSession {
 						"Contact Id is implicit for contact to mailbox STORE requests");
 
 			mailboxStorage
-					.storeStream(contactId, storeReq.getEncryptedSyncStream(), true);
+					.storeStream(contactId, storeReq.getEncryptedSyncStream(),
+							true);
 		}
 
 		@Override
@@ -119,6 +124,7 @@ public class MailboxContactSession extends AbstractMailboxSession {
 		}
 
 		@Override
-		public void protocolFinished() {}
+		public void protocolFinished() {
+		}
 	}
 }
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java
index c6257d41841a73cb76629b0911b0cacfb9540ff3..3a9283316a046e56e6aa3b80cbb81dd8dc093327 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxManagerImpl.java
@@ -11,6 +11,7 @@ import org.briarproject.bramble.api.lifecycle.IoExecutor;
 import org.briarproject.bramble.api.mailbox.MailboxConstants;
 import org.briarproject.bramble.api.mailbox.MailboxInfo;
 import org.briarproject.bramble.api.mailbox.MailboxManager;
+import org.briarproject.bramble.api.mailbox.MailboxSession;
 import org.briarproject.bramble.api.plugin.ConnectionRegistry;
 import org.briarproject.bramble.api.plugin.TransportConnectionReader;
 import org.briarproject.bramble.api.plugin.TransportConnectionWriter;
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java
index 58977cffa79debeb0cfd8a91d3d3a931419c3278..0e313cf3717f0268d30dd09e0c7661926dc036c2 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxOwnerSession.java
@@ -2,7 +2,8 @@ package org.briarproject.bramble.mailbox;
 
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DatabaseComponent;
-import org.briarproject.bramble.api.mailbox.MailboxConstants;
+import org.briarproject.bramble.api.mailbox.MailboxStorage;
+import org.briarproject.bramble.api.mailbox.MailboxStorageStream;
 import org.briarproject.bramble.api.sync.SyncSessionFactory;
 import org.briarproject.bramble.api.transport.KeyManager;
 import org.briarproject.bramble.api.transport.StreamReaderFactory;
@@ -39,9 +40,11 @@ public class MailboxOwnerSession extends AbstractMailboxSession {
 			StreamWriterFactory streamWriterFactory,
 			StreamReaderFactory streamReaderFactory,
 			MailboxProtocol mailboxProtocol, int transportMaxLatency,
-			int transportMaxIdleTime, MailboxStorage mailboxStorage, DatabaseComponent db) {
+			int transportMaxIdleTime, MailboxStorage mailboxStorage,
+			DatabaseComponent db) {
 
-		super(ioExecutor, db, keyManager, syncSessionFactory, streamWriterFactory,
+		super(ioExecutor, db, keyManager, syncSessionFactory,
+				streamWriterFactory,
 				streamReaderFactory, mailboxProtocol, transportMaxLatency,
 				transportMaxIdleTime, contactId);
 		this.mailboxProtocol = mailboxProtocol;
@@ -67,7 +70,7 @@ public class MailboxOwnerSession extends AbstractMailboxSession {
 
 	void sendStoredStreams() throws IOException, InterruptedException {
 		// Get stored sync stream if available
-		MailboxStorage.MailboxStorageStream nextStream =
+		MailboxStorageStream nextStream =
 				mailboxStorage.getStreamForOwner();
 
 		// FIXME: If there are no more streams to send at this time, we should
@@ -75,7 +78,7 @@ public class MailboxOwnerSession extends AbstractMailboxSession {
 		while (nextStream != null) {
 			// Send TAKE request and delete stream if request was successfull
 			MailboxRequestTake req =
-					new MailboxRequestTake(nextStream.getEncryptedStream());
+					new MailboxRequestTake(nextStream.getStream());
 			mailboxProtocol.writeRequest(req);
 
 			if (req.awaitAndGetResponse())
@@ -111,6 +114,7 @@ public class MailboxOwnerSession extends AbstractMailboxSession {
 		}
 
 		@Override
-		public void protocolFinished() {}
+		public void protocolFinished() {
+		}
 	}
 }
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java
index 33fc3f44d45e89740b06428a38f026d2cbcd260a..70331ff9b940f8ea7b08b37b149ccdb793a7d77a 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactory.java
@@ -2,6 +2,7 @@ package org.briarproject.bramble.mailbox;
 
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactType;
+import org.briarproject.bramble.api.mailbox.MailboxSession;
 import org.briarproject.bramble.mailbox.protocol.MailboxProtocol;
 
 public interface MailboxSessionFactory {
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java
index 65e39e385b90abca80fba55dc595a45649362bb7..9dd424c5706d5dcc5196a16e95ff7f5867672ae2 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxSessionFactoryImpl.java
@@ -4,11 +4,13 @@ import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.db.DatabaseComponent;
 import org.briarproject.bramble.api.lifecycle.IoExecutor;
+import org.briarproject.bramble.api.mailbox.MailboxStorage;
 import org.briarproject.bramble.api.sync.SyncSessionFactory;
 import org.briarproject.bramble.api.transport.KeyManager;
 import org.briarproject.bramble.api.transport.StreamReaderFactory;
 import org.briarproject.bramble.api.transport.StreamWriterFactory;
 import org.briarproject.bramble.mailbox.protocol.MailboxProtocol;
+import org.briarproject.bramble.mailbox.storage.MailboxStorageImpl;
 
 import java.util.concurrent.Executor;
 
@@ -16,7 +18,7 @@ import javax.inject.Inject;
 
 public class MailboxSessionFactoryImpl implements MailboxSessionFactory {
 
-	private final MailboxStorage mailboxStorage;
+	private MailboxStorage mailboxStorage = null;
 	private Executor ioExecutor;
 	private final KeyManager keyManager;
 	private final SyncSessionFactory syncSessionFactory;
@@ -36,9 +38,6 @@ public class MailboxSessionFactoryImpl implements MailboxSessionFactory {
 		this.streamWriterFactory = streamWriterFactory;
 		this.streamReaderFactory = streamReaderFactory;
 		this.db = db;
-
-		// FIXME: using temporary storage for now
-		this.mailboxStorage = new MailboxStorage();
 	}
 
 	@Override
@@ -62,15 +61,21 @@ public class MailboxSessionFactoryImpl implements MailboxSessionFactory {
 						streamReaderFactory, mailboxProtocol,
 						transportMaxLatency, transportMaxIdleTime, db);
 			case MAILBOX_OWNER:
+				if (mailboxStorage == null) {
+					// FIXME: using temporary storage for now
+					mailboxStorage = new MailboxStorageImpl();
+				}
 				return new MailboxOwnerSession(contactId, ioExecutor,
 						keyManager, syncSessionFactory, streamWriterFactory,
 						streamReaderFactory, mailboxProtocol,
-						transportMaxLatency, transportMaxIdleTime, mailboxStorage, db);
+						transportMaxLatency, transportMaxIdleTime,
+						mailboxStorage, db);
 			case MAILBOX_CONTACT:
 				return new MailboxContactSession(contactId, ioExecutor,
 						keyManager, syncSessionFactory, streamWriterFactory,
 						streamReaderFactory, mailboxProtocol,
-						transportMaxLatency, transportMaxIdleTime, mailboxStorage, db);
+						transportMaxLatency, transportMaxIdleTime,
+						mailboxStorage, db);
 		}
 		return null;
 	}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxStorage.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxStorage.java
deleted file mode 100644
index 5e61a7e66d0f6b4a0c3eadf8b6731bb8f2c5dc95..0000000000000000000000000000000000000000
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxStorage.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package org.briarproject.bramble.mailbox;
-
-import org.briarproject.bramble.api.contact.ContactId;
-
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.logging.Logger;
-
-import javax.annotation.Nullable;
-
-class MailboxStorage {
-	private static final Logger LOG = Logger.getLogger(MailboxStorage.class.getName());
-	static volatile AtomicLong streamCounter = new AtomicLong();
-
-	// Dummy implementation with a hashmap for now
-	LinkedHashMap<ContactId, LinkedList<MailboxStorageStream>> contactStreams =
-			new LinkedHashMap();
-	private boolean isClosed;
-
-	synchronized void storeStream(ContactId contactId, byte[] encryptedStream,
-			boolean forOwner) {
-		LOG.info("Storing STREAM");
-
-		MailboxStorageStream stream =
-				new MailboxStorageStream(contactId, encryptedStream, forOwner);
-
-		if (!contactStreams.containsKey(contactId))
-			contactStreams.put(contactId, new LinkedList<>());
-
-		contactStreams.get(contactId).add(stream);
-
-		if(forOwner)
-			this.notifyAll();
-
-	}
-
-	@Nullable
-	synchronized MailboxStorageStream getStream(ContactId contactId,
-			boolean forOwner) {
-		if (contactStreams.get(contactId) == null)
-			return null;
-
-		for (MailboxStorageStream s : contactStreams.get(contactId)) {
-			if (!s.pending && (s.forOwner == forOwner)) {
-				s.pending = true;
-				return s;
-			}
-		}
-		return null;
-	}
-
-	public MailboxStorageStream getStreamForOwner() {
-		for (LinkedList<MailboxStorageStream> streams : contactStreams
-				.values()) {
-			for (MailboxStorageStream s : streams)
-				if (!s.pending && s.forOwner) {
-					s.pending = true;
-					return s;
-				}
-		}
-		return null;
-	}
-
-
-	synchronized void deleteStream(MailboxStorageStream stream) {
-		for (MailboxStorageStream s : contactStreams.get(stream.contactId)) {
-			if (s.id == stream.id) {
-				contactStreams.get(stream.contactId).remove(s);
-			}
-		}
-	}
-
-
-	protected class MailboxStorageStream {
-		private final Long id;
-		private final byte[] encryptedStream;
-		private final ContactId contactId;
-		private final boolean forOwner;
-
-		private boolean pending = false;
-
-		protected MailboxStorageStream(
-				ContactId contactId,
-				byte[] encryptedStream, boolean forOwner) {
-			this.contactId = contactId;
-			this.id = streamCounter.getAndIncrement();
-			this.encryptedStream = encryptedStream;
-			this.forOwner = forOwner;
-		}
-
-		byte[] getEncryptedStream() {
-			return encryptedStream;
-		}
-
-	}
-}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..3db14a23be7a39a86f251e6e17d13606dc447911
--- /dev/null
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageImpl.java
@@ -0,0 +1,76 @@
+package org.briarproject.bramble.mailbox.storage;
+
+import org.briarproject.bramble.api.contact.ContactId;
+import org.briarproject.bramble.api.mailbox.MailboxStorage;
+import org.briarproject.bramble.api.mailbox.MailboxStorageStream;
+
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.logging.Logger;
+
+import javax.annotation.Nullable;
+
+public class MailboxStorageImpl implements MailboxStorage {
+	private static final Logger LOG =
+			Logger.getLogger(MailboxStorageImpl.class.getName());
+	static volatile AtomicLong streamCounter = new AtomicLong();
+
+	// Dummy implementation with a hashmap for now
+	LinkedHashMap<ContactId, LinkedList<MailboxStorageStream>> contactStreams =
+			new LinkedHashMap();
+
+	public 	synchronized void storeStream(ContactId contactId, byte[] encryptedStream,
+			boolean forOwner) {
+
+		LOG.info("Storing STREAM");
+		MailboxStorageStream stream =
+				new MailboxStorageStreamImpl(contactId, encryptedStream,
+						streamCounter.incrementAndGet(), forOwner);
+
+		if (!contactStreams.containsKey(contactId))
+			contactStreams.put(contactId, new LinkedList<>());
+
+		contactStreams.get(contactId).add(stream);
+
+		if (forOwner)
+			this.notifyAll();
+
+	}
+
+	@Nullable
+	public synchronized MailboxStorageStream getStream(ContactId contactId,
+			boolean forOwner) {
+		if (contactStreams.get(contactId) == null)
+			return null;
+
+		for (MailboxStorageStream s : contactStreams.get(contactId)) {
+			if (!s.isPending() && (s.isForOwner() == forOwner)) {
+				s.setPending(true);
+				return s;
+			}
+		}
+		return null;
+	}
+
+	public MailboxStorageStream getStreamForOwner() {
+		for (LinkedList<MailboxStorageStream> streams : contactStreams
+				.values()) {
+			for (MailboxStorageStream s : streams)
+				if (!s.isPending() && s.isForOwner()) {
+					s.setPending(true);
+					return s;
+				}
+		}
+		return null;
+	}
+
+	public synchronized void deleteStream(MailboxStorageStream stream) {
+		for (MailboxStorageStream s : contactStreams
+				.get(stream.getContactId())) {
+			if (s.getContactId() == stream.getContactId()) {
+				contactStreams.get(stream.getContactId()).remove(s);
+			}
+		}
+	}
+}
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageStreamImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageStreamImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d72a366a7f80fd88f9f4184e9aa503b10707c52
--- /dev/null
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/storage/MailboxStorageStreamImpl.java
@@ -0,0 +1,41 @@
+package org.briarproject.bramble.mailbox.storage;
+
+import org.briarproject.bramble.api.contact.ContactId;
+import org.briarproject.bramble.api.mailbox.MailboxStorageStream;
+
+public class MailboxStorageStreamImpl implements MailboxStorageStream {
+	private final Long id;
+	private final byte[] encryptedStream;
+	private final ContactId contactId;
+	private final boolean forOwner;
+
+	private boolean pending = false;
+
+	public MailboxStorageStreamImpl(ContactId contactId,
+			byte[] encryptedStream, Long id, boolean forOwner) {
+		this.contactId = contactId;
+		this.id = id;
+		this.encryptedStream = encryptedStream;
+		this.forOwner = forOwner;
+	}
+
+	public byte[] getStream() {
+		return encryptedStream;
+	}
+
+	public boolean isPending() {
+		return pending;
+	}
+
+	public void setPending(boolean pending) {
+		this.pending = pending;
+	}
+
+	public boolean isForOwner() {
+		return forOwner;
+	}
+
+	public ContactId getContactId() {
+		return contactId;
+	}
+}