diff --git a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java
index eb0ee7a6dab8b0e8607d1f7b9157b11a5395a56a..9597af9ca04fe35903eaf5dc5e7a48080fd55695 100644
--- a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java
+++ b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java
@@ -329,30 +329,14 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
 
 	public void eventOccurred(DatabaseEvent e) {
 		if(e instanceof ContactRemovedEvent) {
-			ContactId c = ((ContactRemovedEvent) e).getContactId();
-			connectionRecogniser.removeSecrets(c);
-			// FIXME: Listeners should not block
-			synchronized(this) {
-				removeAndEraseSecrets(c, oldSecrets);
-				removeAndEraseSecrets(c, currentSecrets);
-				removeAndEraseSecrets(c, newSecrets);
-			}
+			ContactRemovedEvent c = (ContactRemovedEvent) e;
+			timer.schedule(new ContactRemovedTask(c), 0);
 		} else if(e instanceof TransportAddedEvent) {
 			TransportAddedEvent t = (TransportAddedEvent) e;
-			// FIXME: Listeners should not block
-			synchronized(this) {
-				maxLatencies.put(t.getTransportId(), t.getMaxLatency());
-			}
+			timer.schedule(new TransportAddedTask(t), 0);
 		} else if(e instanceof TransportRemovedEvent) {
-			TransportId t = ((TransportRemovedEvent) e).getTransportId();
-			connectionRecogniser.removeSecrets(t);
-			// FIXME: Listeners should not block
-			synchronized(this) {
-				maxLatencies.remove(t);
-				removeAndEraseSecrets(t, oldSecrets);
-				removeAndEraseSecrets(t, currentSecrets);
-				removeAndEraseSecrets(t, newSecrets);
-			}
+			TransportRemovedEvent t = (TransportRemovedEvent) e;
+			timer.schedule(new TransportRemovedTask(t), 0);
 		}
 	}
 
@@ -410,4 +394,58 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
 			return false;
 		}
 	}
+
+	private class ContactRemovedTask extends TimerTask {
+
+		private final ContactRemovedEvent event;
+
+		private ContactRemovedTask(ContactRemovedEvent event) {
+			this.event = event;
+		}
+
+		public void run() {
+			ContactId c = event.getContactId();
+			connectionRecogniser.removeSecrets(c);
+			synchronized(KeyManagerImpl.this) {
+				removeAndEraseSecrets(c, oldSecrets);
+				removeAndEraseSecrets(c, currentSecrets);
+				removeAndEraseSecrets(c, newSecrets);
+			}
+		}
+	}
+
+	private class TransportAddedTask extends TimerTask {
+
+		private final TransportAddedEvent event;
+
+		private TransportAddedTask(TransportAddedEvent event) {
+			this.event = event;
+		}
+
+		public void run() {
+			synchronized(KeyManagerImpl.this) {
+				maxLatencies.put(event.getTransportId(), event.getMaxLatency());
+			}
+		}
+	}
+
+	private class TransportRemovedTask extends TimerTask {
+
+		private TransportRemovedEvent event;
+
+		private TransportRemovedTask(TransportRemovedEvent event) {
+			this.event = event;
+		}
+
+		public void run() {
+			TransportId t = event.getTransportId();
+			connectionRecogniser.removeSecrets(t);
+			synchronized(KeyManagerImpl.this) {
+				maxLatencies.remove(t);
+				removeAndEraseSecrets(t, oldSecrets);
+				removeAndEraseSecrets(t, currentSecrets);
+				removeAndEraseSecrets(t, newSecrets);
+			}
+		}
+	}
 }