diff --git a/briar-api/src/org/briarproject/api/event/ShutdownEvent.java b/briar-api/src/org/briarproject/api/event/ShutdownEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..b4d65fbb69e2765ed712063e18829598a1bb0401
--- /dev/null
+++ b/briar-api/src/org/briarproject/api/event/ShutdownEvent.java
@@ -0,0 +1,6 @@
+package org.briarproject.api.event;
+
+/** An event that is broadcast when the app is shutting down. */
+public class ShutdownEvent extends Event {
+
+}
diff --git a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
index e6ff2c9780cb1ed18666dbb6f1f9e81ff6895324..6c68745f9cc221467c056a8c67a409fdab691ce6 100644
--- a/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
+++ b/briar-core/src/org/briarproject/lifecycle/LifecycleManagerImpl.java
@@ -19,6 +19,8 @@ import javax.inject.Inject;
 
 import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.event.EventBus;
+import org.briarproject.api.event.ShutdownEvent;
 import org.briarproject.api.lifecycle.LifecycleManager;
 import org.briarproject.api.lifecycle.Service;
 import org.briarproject.api.system.Clock;
@@ -30,6 +32,7 @@ class LifecycleManagerImpl implements LifecycleManager {
 
 	private final Clock clock;
 	private final DatabaseComponent db;
+	private final EventBus eventBus;
 	private final Collection<Service> services;
 	private final Collection<ExecutorService> executors;
 	private final Semaphore startStopSemaphore = new Semaphore(1);
@@ -38,9 +41,10 @@ class LifecycleManagerImpl implements LifecycleManager {
 	private final CountDownLatch shutdownLatch = new CountDownLatch(1);
 
 	@Inject
-	LifecycleManagerImpl(Clock clock, DatabaseComponent db) {
+	LifecycleManagerImpl(Clock clock, DatabaseComponent db, EventBus eventBus) {
 		this.clock = clock;
 		this.db = db;
+		this.eventBus = eventBus;
 		services = new CopyOnWriteArrayList<Service>();
 		executors = new CopyOnWriteArrayList<ExecutorService>();
 	}
@@ -111,6 +115,7 @@ class LifecycleManagerImpl implements LifecycleManager {
 		}
 		try {
 			LOG.info("Stopping services");
+			eventBus.broadcast(new ShutdownEvent());
 			for(Service s : services) {
 				boolean stopped = s.stop();
 				if(LOG.isLoggable(INFO)) {
diff --git a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java b/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
index ae8265cd6e316f500f025644251e8d2f7ec9ff1c..d2eeab7a9ad34964f432a519a2406ae66ca5738b 100644
--- a/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
+++ b/briar-core/src/org/briarproject/messaging/DuplexOutgoingSession.java
@@ -30,6 +30,7 @@ import org.briarproject.api.event.MessageToRequestEvent;
 import org.briarproject.api.event.RemoteRetentionTimeUpdatedEvent;
 import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
 import org.briarproject.api.event.RemoteTransportsUpdatedEvent;
+import org.briarproject.api.event.ShutdownEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
 import org.briarproject.api.messaging.Ack;
 import org.briarproject.api.messaging.MessagingSession;
@@ -169,6 +170,8 @@ class DuplexOutgoingSession implements MessagingSession, EventListener {
 					(RemoteTransportsUpdatedEvent) e;
 			if(r.getContactId().equals(contactId))
 				dbExecutor.execute(new GenerateTransportAcks());
+		} else if(e instanceof ShutdownEvent) {
+			interrupt();
 		} else if(e instanceof TransportRemovedEvent) {
 			TransportRemovedEvent t = (TransportRemovedEvent) e;
 			if(t.getTransportId().equals(transportId)) interrupt();
diff --git a/briar-core/src/org/briarproject/messaging/IncomingSession.java b/briar-core/src/org/briarproject/messaging/IncomingSession.java
index ff5c7e9b1589b962ed31146afa2c209d56415ef2..bdb3a96c30bb6c670716a1c7bc16eed138ac22a1 100644
--- a/briar-core/src/org/briarproject/messaging/IncomingSession.java
+++ b/briar-core/src/org/briarproject/messaging/IncomingSession.java
@@ -17,6 +17,7 @@ import org.briarproject.api.event.ContactRemovedEvent;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
+import org.briarproject.api.event.ShutdownEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
 import org.briarproject.api.messaging.Ack;
 import org.briarproject.api.messaging.Message;
@@ -108,8 +109,7 @@ class IncomingSession implements MessagingSession, EventListener {
 	}
 
 	public void interrupt() {
-		// This won't interrupt a blocking read, but the read will throw an
-		// exception when the transport connection is closed
+		// FIXME: This won't interrupt a blocking read
 		interrupted = true;
 	}
 
@@ -117,6 +117,8 @@ class IncomingSession implements MessagingSession, EventListener {
 		if(e instanceof ContactRemovedEvent) {
 			ContactRemovedEvent c = (ContactRemovedEvent) e;
 			if(c.getContactId().equals(contactId)) interrupt();
+		} else if(e instanceof ShutdownEvent) {
+			interrupt();
 		} else if(e instanceof TransportRemovedEvent) {
 			TransportRemovedEvent t = (TransportRemovedEvent) e;
 			if(t.getTransportId().equals(transportId)) interrupt();
diff --git a/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java b/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java
index 4f4d0acd91d91fc504832ce4bc821ee3c44bb797..32a197f5a6b3f73817e7028f00eae7cca38e076d 100644
--- a/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java
+++ b/briar-core/src/org/briarproject/messaging/SimplexOutgoingSession.java
@@ -21,6 +21,7 @@ import org.briarproject.api.event.ContactRemovedEvent;
 import org.briarproject.api.event.Event;
 import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
+import org.briarproject.api.event.ShutdownEvent;
 import org.briarproject.api.event.TransportRemovedEvent;
 import org.briarproject.api.messaging.Ack;
 import org.briarproject.api.messaging.MessagingSession;
@@ -121,6 +122,8 @@ class SimplexOutgoingSession implements MessagingSession, EventListener {
 		if(e instanceof ContactRemovedEvent) {
 			ContactRemovedEvent c = (ContactRemovedEvent) e;
 			if(c.getContactId().equals(contactId)) interrupt();
+		} else if(e instanceof ShutdownEvent) {
+			interrupt();
 		} else if(e instanceof TransportRemovedEvent) {
 			TransportRemovedEvent t = (TransportRemovedEvent) e;
 			if(t.getTransportId().equals(transportId)) interrupt();