diff --git a/briar-core/src/org/briarproject/db/Database.java b/briar-core/src/org/briarproject/db/Database.java
index 79ff4473b578a0ce5bc73d0eda879fd58532bf90..255a5af2ebeee5a4a8a95234ed57c44acfdfd6de 100644
--- a/briar-core/src/org/briarproject/db/Database.java
+++ b/briar-core/src/org/briarproject/db/Database.java
@@ -77,6 +77,15 @@ interface Database<T> {
 	 */
 	void commitTransaction(T txn) throws DbException;
 
+	/**
+	 * Returns the number of transactions started since the transaction count
+	 * was last reset.
+	 */
+	int getTransactionCount();
+
+	/**  Resets the transaction count. */
+	void resetTransactionCount();
+
 	/**
 	 * Stores a contact associated with the given local and remote pseudonyms,
 	 * and returns an ID for the contact.
diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index 0cd93423535b8ea24da14e4150774ff63cf02515..106e8cab018b516fd7106ab32ae9ae11ee89476c 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -4,9 +4,8 @@ import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.db.DatabaseConstants.BYTES_PER_SWEEP;
 import static org.briarproject.db.DatabaseConstants.CRITICAL_FREE_SPACE;
-import static org.briarproject.db.DatabaseConstants.MAX_BYTES_BETWEEN_SPACE_CHECKS;
-import static org.briarproject.db.DatabaseConstants.MAX_MS_BETWEEN_SPACE_CHECKS;
 import static org.briarproject.db.DatabaseConstants.MAX_OFFERED_MESSAGES;
+import static org.briarproject.db.DatabaseConstants.MAX_TRANSACTIONS_BETWEEN_SPACE_CHECKS;
 import static org.briarproject.db.DatabaseConstants.MIN_FREE_SPACE;
 
 import java.io.IOException;
@@ -120,10 +119,6 @@ DatabaseCleaner.Callback {
 	private final Collection<EventListener> listeners =
 			new CopyOnWriteArrayList<EventListener>();
 
-	private final Object spaceLock = new Object();
-	private long bytesStoredSinceLastCheck = 0; // Locking: spaceLock
-	private long timeOfLastCheck = 0; // Locking: spaceLock
-
 	private final Object openCloseLock = new Object();
 	private boolean open = false; // Locking: openCloseLock;
 	private int shutdownHandle = -1; // Locking: openCloseLock;
@@ -403,10 +398,6 @@ DatabaseCleaner.Callback {
 				db.addStatus(txn, c, m.getId(), false, false);
 			}
 		}
-		// Count the bytes stored
-		synchronized(spaceLock) {
-			bytesStoredSinceLastCheck += m.getSerialised().length;
-		}
 	}
 
 	public void addSecrets(Collection<TemporarySecret> secrets)
@@ -1975,14 +1966,9 @@ DatabaseCleaner.Callback {
 	}
 
 	public boolean shouldCheckFreeSpace() {
-		synchronized(spaceLock) {
-			long now = clock.currentTimeMillis();
-			if(bytesStoredSinceLastCheck > MAX_BYTES_BETWEEN_SPACE_CHECKS
-					|| now - timeOfLastCheck > MAX_MS_BETWEEN_SPACE_CHECKS) {
-				bytesStoredSinceLastCheck = 0;
-				timeOfLastCheck = now;
-				return true;
-			}
+		if(db.getTransactionCount() > MAX_TRANSACTIONS_BETWEEN_SPACE_CHECKS) {
+			db.resetTransactionCount();
+			return true;
 		}
 		return false;
 	}
diff --git a/briar-core/src/org/briarproject/db/DatabaseConstants.java b/briar-core/src/org/briarproject/db/DatabaseConstants.java
index f1c3f3f747f67ed2cf0302b5e966c56e1473db8c..25f325ff4d748b7be538cea3ea5a2fd58d26715a 100644
--- a/briar-core/src/org/briarproject/db/DatabaseConstants.java
+++ b/briar-core/src/org/briarproject/db/DatabaseConstants.java
@@ -26,16 +26,12 @@ interface DatabaseConstants {
 	long CRITICAL_FREE_SPACE = 10 * 1024 * 1024; // 10 MiB
 
 	/**
-	 * The amount of free space will be checked whenever this many bytes of
-	 * messages have been added to the database since the last check.
+	 * The amount of free space will be checked whenever this many transactions
+	 * have been started since the last check.
+	 * <p>
+	 * FIXME: Increase this after implementing BTPv2 (smaller packets)?
 	 */
-	int MAX_BYTES_BETWEEN_SPACE_CHECKS = 1024 * 1024; // 1 MiB
-
-	/**
-	 * The amount of free space will be checked whenever this many milliseconds
-	 * have passed since the last check.
-	 */
-	long MAX_MS_BETWEEN_SPACE_CHECKS = 60 * 1000; // 1 min
+	int MAX_TRANSACTIONS_BETWEEN_SPACE_CHECKS = 10;
 
 	/**
 	 * Up to this many bytes of messages will be expired from the database each
diff --git a/briar-core/src/org/briarproject/db/JdbcDatabase.java b/briar-core/src/org/briarproject/db/JdbcDatabase.java
index 24d97b435b8bb2fa93d3475a0ba735ef84f1f779..ce5f74aab9097a3c24b1dd440bcd9e6d9c65d306 100644
--- a/briar-core/src/org/briarproject/db/JdbcDatabase.java
+++ b/briar-core/src/org/briarproject/db/JdbcDatabase.java
@@ -22,6 +22,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.logging.Logger;
 
 import org.briarproject.api.Author;
@@ -339,6 +340,8 @@ abstract class JdbcDatabase implements Database<Connection> {
 	private final LinkedList<Connection> connections =
 			new LinkedList<Connection>(); // Locking: self
 
+	private final AtomicInteger transactionCount = new AtomicInteger(0);
+
 	private int openConnections = 0; // Locking: connections
 	private boolean closed = false; // Locking: connections
 
@@ -498,6 +501,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		} catch(SQLException e) {
 			throw new DbException(e);
 		}
+		transactionCount.incrementAndGet();
 		return txn;
 	}
 
@@ -541,6 +545,14 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
+	public int getTransactionCount() {
+		return transactionCount.get();
+	}
+
+	public void resetTransactionCount() {
+		transactionCount.set(0);
+	}
+
 	protected void closeAllConnections() throws SQLException {
 		boolean interrupted = false;
 		synchronized(connections) {