diff --git a/api/net/sf/briar/api/transport/ConnectionRecogniser.java b/api/net/sf/briar/api/transport/ConnectionRecogniser.java
index 4c7fa20fd822896efa3465eceb524befe4c57b04..83ac8e36abccc6a16f51b44fa7ce70e4af512ec4 100644
--- a/api/net/sf/briar/api/transport/ConnectionRecogniser.java
+++ b/api/net/sf/briar/api/transport/ConnectionRecogniser.java
@@ -18,7 +18,7 @@ public interface ConnectionRecogniser {
 	ConnectionContext acceptConnection(TransportId t, byte[] tag)
 			throws DbException;
 
-	void addSecret(TemporarySecret s) throws DbException;
+	void addSecret(TemporarySecret s);
 
 	void removeSecret(ContactId c, TransportId t, long period);
 
diff --git a/components/net/sf/briar/transport/ConnectionRecogniserImpl.java b/components/net/sf/briar/transport/ConnectionRecogniserImpl.java
index 7fb1c9b72291cefc15f7c9ca60a884602f22d8bc..8f39204ef29b86868a8278097a91daf9fa1e9b13 100644
--- a/components/net/sf/briar/transport/ConnectionRecogniserImpl.java
+++ b/components/net/sf/briar/transport/ConnectionRecogniserImpl.java
@@ -38,7 +38,7 @@ class ConnectionRecogniserImpl implements ConnectionRecogniser {
 		return r.acceptConnection(tag);
 	}
 
-	public void addSecret(TemporarySecret s) throws DbException {
+	public void addSecret(TemporarySecret s) {
 		TransportId t = s.getTransportId();
 		TransportConnectionRecogniser r;
 		synchronized(this) {
diff --git a/components/net/sf/briar/transport/KeyManagerImpl.java b/components/net/sf/briar/transport/KeyManagerImpl.java
index 03cfb58cdf56af6e2f5671b4c54c87b431dfb1d7..b6afd7d5b1d4a0783e6c0fc57101e66b64141c38 100644
--- a/components/net/sf/briar/transport/KeyManagerImpl.java
+++ b/components/net/sf/briar/transport/KeyManagerImpl.java
@@ -26,6 +26,8 @@ import net.sf.briar.util.ByteUtils;
 
 import com.google.inject.Inject;
 
+// FIXME: When a contact transport is added we need to load its secrets
+
 class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
 
 	private static final int MS_BETWEEN_CHECKS = 60 * 1000;
@@ -73,19 +75,18 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
 		Collection<TemporarySecret> dead = assignSecretsToMaps(now, secrets);
 		// Replace any dead secrets
 		Collection<TemporarySecret> created = replaceDeadSecrets(now, dead);
-		try {
+		if(!created.isEmpty()) {
 			// Store any secrets that have been created
-			if(!created.isEmpty()) db.addSecrets(created);
-			// Pass the current incoming secrets to the recogniser
-			// FIXME: This uses a separate database transaction per secret
-			for(TemporarySecret s : incomingOld.values())
-				recogniser.addSecret(s);
-			for(TemporarySecret s : incomingNew.values())
-				recogniser.addSecret(s);
-		} catch(DbException e) {
-			if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString());
-			return false;
+			try {
+				db.addSecrets(created);
+			} catch(DbException e) {
+				if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString());
+				return false;
+			}
 		}
+		// Pass the current incoming secrets to the recogniser
+		for(TemporarySecret s : incomingOld.values()) recogniser.addSecret(s);
+		for(TemporarySecret s : incomingNew.values()) recogniser.addSecret(s);
 		// Schedule periodic key rotation
 		timer.scheduleAtFixedRate(this, MS_BETWEEN_CHECKS, MS_BETWEEN_CHECKS);
 		running = true;
@@ -247,15 +248,14 @@ class KeyManagerImpl extends TimerTask implements KeyManager, DatabaseListener {
 		// Replace any dead secrets
 		Collection<TemporarySecret> created = replaceDeadSecrets(now, dead);
 		if(!created.isEmpty()) {
+			// Store any secrets that have been created
 			try {
-				// Store any secrets that have been created
 				db.addSecrets(created);
-				// Pass any secrets that have been created to the recogniser
-				// FIXME: This uses a separate database transaction per secret
-				for(TemporarySecret s : created) recogniser.addSecret(s);
 			} catch(DbException e) {
 				if(LOG.isLoggable(Level.WARNING)) LOG.warning(e.toString());
 			}
+			// Pass any secrets that have been created to the recogniser
+			for(TemporarySecret s : created) recogniser.addSecret(s);
 		}
 	}
 
diff --git a/components/net/sf/briar/transport/TransportConnectionRecogniser.java b/components/net/sf/briar/transport/TransportConnectionRecogniser.java
index 3ff70470ddd0b8c2c6db6fbedf9c3b94129860aa..fd588f95ac2eef5a573f6e6c7691187b3ca15c95 100644
--- a/components/net/sf/briar/transport/TransportConnectionRecogniser.java
+++ b/components/net/sf/briar/transport/TransportConnectionRecogniser.java
@@ -75,7 +75,7 @@ class TransportConnectionRecogniser {
 		return ctx;
 	}
 
-	synchronized void addSecret(TemporarySecret s) throws DbException {
+	synchronized void addSecret(TemporarySecret s) {
 		ContactId contactId = s.getContactId();
 		long period = s.getPeriod();
 		byte[] secret = s.getSecret();
@@ -95,9 +95,7 @@ class TransportConnectionRecogniser {
 			WindowContext old = tagMap.put(new Bytes(tag), wctx);
 			assert old == null;
 		}
-		// Store the new connection window in the DB
-		db.setConnectionWindow(contactId, transportId, period, centre, bitmap);
-		// Create a removal context to remove the window when the key expires
+		// Create a removal context to remove the window later
 		RemovalContext rctx = new RemovalContext(window, secret, alice);
 		removalMap.put(new RemovalKey(contactId, period), rctx);
 	}