diff --git a/briar-tests/src/org/briarproject/db/DatabaseCleanerImplTest.java b/briar-tests/src/org/briarproject/db/DatabaseCleanerImplTest.java
index 28b35b54bc58f284f35d1d26c7e1b7d1e07486b2..222ec47dbdf7800b2ab227f8b17ec3433af621d1 100644
--- a/briar-tests/src/org/briarproject/db/DatabaseCleanerImplTest.java
+++ b/briar-tests/src/org/briarproject/db/DatabaseCleanerImplTest.java
@@ -1,67 +1,49 @@
 package org.briarproject.db;
 
-import static java.util.concurrent.TimeUnit.SECONDS;
-
-import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.briarproject.BriarTestCase;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.system.Timer;
 import org.briarproject.db.DatabaseCleaner.Callback;
-import org.briarproject.system.SystemTimer;
-
+import org.jmock.Expectations;
+import org.jmock.Mockery;
 import org.junit.Test;
 
-// FIXME: Use a mock timer
 public class DatabaseCleanerImplTest extends BriarTestCase {
 
 	@Test
 	public void testCleanerRunsPeriodically() throws Exception {
-		final CountDownLatch latch = new CountDownLatch(5);
+		final AtomicInteger cleans = new AtomicInteger(0);
 		Callback callback = new Callback() {
 
-			public void checkFreeSpaceAndClean() throws DbException {
-				latch.countDown();
-			}
-
-			public boolean shouldCheckFreeSpace() {
-				return true;
-			}
-		};
-		Timer timer = new SystemTimer();
-		DatabaseCleanerImpl cleaner = new DatabaseCleanerImpl(timer);
-		// Start the cleaner
-		cleaner.startCleaning(callback, 10);
-		// The database should be cleaned five times (allow 5s for system load)
-		assertTrue(latch.await(5, SECONDS));
-		// Stop the cleaner
-		cleaner.stopCleaning();
-	}
-
-	@Test
-	public void testStoppingCleanerWakesItUp() throws Exception {
-		final CountDownLatch latch = new CountDownLatch(1);
-		Callback callback = new Callback() {
+			boolean check = true;
 
 			public void checkFreeSpaceAndClean() throws DbException {
-				latch.countDown();
+				cleans.incrementAndGet();
 			}
 
 			public boolean shouldCheckFreeSpace() {
-				return true;
+				// Alternate between true and false
+				check = !check;
+				return !check;
 			}
 		};
-		Timer timer = new SystemTimer();
-		DatabaseCleanerImpl cleaner = new DatabaseCleanerImpl(timer);
-		long start = System.currentTimeMillis();
-		// Start the cleaner
-		cleaner.startCleaning(callback, 10 * 1000);
-		// The database should be cleaned once at startup
-		assertTrue(latch.await(5, SECONDS));
-		// Stop the cleaner (it should be waiting between sweeps)
+		Mockery context = new Mockery();
+		final Timer timer = context.mock(Timer.class);
+		final DatabaseCleanerImpl cleaner = new DatabaseCleanerImpl(timer);
+		context.checking(new Expectations() {{
+			oneOf(timer).scheduleAtFixedRate(cleaner, 0, 10);
+			oneOf(timer).cancel();
+		}});
+		// Start the cleaner - it should schedule itself with the timer
+		cleaner.startCleaning(callback, 10);
+		// Call the cleaner's run method six times
+		for(int i = 0; i < 6; i++) cleaner.run();
+		// Stop the cleaner - it should cancel the timer
 		cleaner.stopCleaning();
-		long end = System.currentTimeMillis();
-		// Check that much less than 10 seconds expired
-		assertTrue(end - start < 10 * 1000);
+		// The database should have been cleaned three times
+		assertEquals(3, cleans.get());
+		context.assertIsSatisfied();
 	}
 }