diff --git a/briar-api/src/org/briarproject/api/sync/ValidationManager.java b/briar-api/src/org/briarproject/api/sync/ValidationManager.java
index 88be9d4c82de2b427fce92f1f55264785f5c0841..ff1e854c33447f06a4826d2f03fe82a0cdc691ae 100644
--- a/briar-api/src/org/briarproject/api/sync/ValidationManager.java
+++ b/briar-api/src/org/briarproject/api/sync/ValidationManager.java
@@ -1,5 +1,7 @@
 package org.briarproject.api.sync;
 
+import org.briarproject.api.db.Metadata;
+
 /**
  * Responsible for managing message validators and passing them messages to
  * validate.
@@ -28,4 +30,11 @@ public interface ValidationManager {
 
 	/** Sets the message validator for the given client. */
 	void registerMessageValidator(ClientId c, MessageValidator v);
+
+	/** Registers a hook to be called whenever a message is validated. */
+	void registerValidationHook(ValidationHook hook);
+
+	interface ValidationHook {
+		void validatingMessage(Message m, ClientId c, Metadata meta);
+	}
 }
diff --git a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java
index 3dcd616e047e03324f8be610a36e411330c3f33b..7a5202c293ed6c98ce04068f4204f41d4401a7f9 100644
--- a/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java
+++ b/briar-core/src/org/briarproject/sync/ValidationManagerImpl.java
@@ -22,8 +22,10 @@ import org.briarproject.api.sync.MessageValidator;
 import org.briarproject.api.sync.ValidationManager;
 import org.briarproject.util.ByteUtils;
 
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
@@ -40,6 +42,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
 	private final Executor dbExecutor;
 	private final Executor cryptoExecutor;
 	private final Map<ClientId, MessageValidator> validators;
+	private final List<ValidationHook> hooks;
 
 	@Inject
 	ValidationManagerImpl(DatabaseComponent db,
@@ -49,6 +52,7 @@ class ValidationManagerImpl implements ValidationManager, Service,
 		this.dbExecutor = dbExecutor;
 		this.cryptoExecutor = cryptoExecutor;
 		validators = new ConcurrentHashMap<ClientId, MessageValidator>();
+		hooks = new CopyOnWriteArrayList<ValidationHook>();
 	}
 
 	@Override
@@ -67,6 +71,11 @@ class ValidationManagerImpl implements ValidationManager, Service,
 		validators.put(c, v);
 	}
 
+	@Override
+	public void registerValidationHook(ValidationHook hook) {
+		hooks.add(hook);
+	}
+
 	private void getMessagesToValidate(final ClientId c) {
 		dbExecutor.execute(new Runnable() {
 			public void run() {
@@ -119,6 +128,8 @@ class ValidationManagerImpl implements ValidationManager, Service,
 					if (meta == null) {
 						db.setMessageValid(m, c, false);
 					} else {
+						for (ValidationHook hook : hooks)
+							hook.validatingMessage(m, c, meta);
 						db.mergeMessageMetadata(m.getId(), meta);
 						db.setMessageValid(m, c, true);
 					}
diff --git a/briar-tests/src/org/briarproject/sync/ValidationManagerImplTest.java b/briar-tests/src/org/briarproject/sync/ValidationManagerImplTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4863c85c9abe5ab41d2ec08226c2a417e1e88b9c
--- /dev/null
+++ b/briar-tests/src/org/briarproject/sync/ValidationManagerImplTest.java
@@ -0,0 +1,14 @@
+package org.briarproject.sync;
+
+import org.briarproject.BriarTestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+public class ValidationManagerImplTest extends BriarTestCase {
+
+	@Test
+	public void testUnitTestsExist() {
+		fail(); // FIXME: Write tests
+	}
+}