diff --git a/components/net/sf/briar/transport/batch/IncomingBatchConnection.java b/components/net/sf/briar/transport/batch/IncomingBatchConnection.java
index cf8e00d04e7213623a0c25ceb4d6a74a9aa43b43..e1a5082f062dc65e9eabd35e20209d6b20542844 100644
--- a/components/net/sf/briar/transport/batch/IncomingBatchConnection.java
+++ b/components/net/sf/briar/transport/batch/IncomingBatchConnection.java
@@ -72,8 +72,9 @@ class IncomingBatchConnection {
 							} catch(DbException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else if(proto.hasBatch()) {
@@ -90,8 +91,9 @@ class IncomingBatchConnection {
 							} catch(GeneralSecurityException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else if(proto.hasSubscriptionUpdate()) {
@@ -105,8 +107,9 @@ class IncomingBatchConnection {
 							} catch(DbException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else if(proto.hasTransportUpdate()) {
@@ -120,8 +123,9 @@ class IncomingBatchConnection {
 							} catch(DbException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else {
diff --git a/components/net/sf/briar/transport/stream/StreamConnection.java b/components/net/sf/briar/transport/stream/StreamConnection.java
index 17839b393b199e84cbc899781a6caab12933e997..8e1cf6730c63ae9f02416af02374783e6e525171 100644
--- a/components/net/sf/briar/transport/stream/StreamConnection.java
+++ b/components/net/sf/briar/transport/stream/StreamConnection.java
@@ -140,8 +140,9 @@ abstract class StreamConnection implements DatabaseListener {
 							} catch(DbException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else if(proto.hasBatch()) {
@@ -158,8 +159,9 @@ abstract class StreamConnection implements DatabaseListener {
 							} catch(GeneralSecurityException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else if(proto.hasOffer()) {
@@ -200,8 +202,9 @@ abstract class StreamConnection implements DatabaseListener {
 							} catch(DbException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 					// Store the requested message IDs and notify the writer
@@ -223,8 +226,9 @@ abstract class StreamConnection implements DatabaseListener {
 							} catch(DbException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else if(proto.hasTransportUpdate()) {
@@ -238,8 +242,9 @@ abstract class StreamConnection implements DatabaseListener {
 							} catch(DbException e) {
 								if(LOG.isLoggable(Level.WARNING))
 									LOG.warning(e.getMessage());
+							} finally {
+								semaphore.release();
 							}
-							semaphore.release();
 						}
 					});
 				} else {