diff --git a/briar-core/src/org/briarproject/forum/ForumModule.java b/briar-core/src/org/briarproject/forum/ForumModule.java
index fc24c6c00cf1835bf0e23521b9084e007ed5c58f..caa066d344da3d9b8d4b60005c9af7e862bbc553 100644
--- a/briar-core/src/org/briarproject/forum/ForumModule.java
+++ b/briar-core/src/org/briarproject/forum/ForumModule.java
@@ -9,7 +9,6 @@ import org.briarproject.api.data.BdfReaderFactory;
 import org.briarproject.api.data.BdfWriterFactory;
 import org.briarproject.api.data.MetadataEncoder;
 import org.briarproject.api.data.ObjectReader;
-import org.briarproject.api.event.EventBus;
 import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.forum.ForumPostFactory;
 import org.briarproject.api.forum.ForumSharingManager;
@@ -56,10 +55,11 @@ public class ForumModule extends AbstractModule {
 
 	@Provides @Singleton
 	ForumSharingManager getForumSharingManager(ContactManager contactManager,
-			EventBus eventBus, ForumSharingManagerImpl forumSharingManager) {
+			ValidationManager validationManager,
+			ForumSharingManagerImpl forumSharingManager) {
 		contactManager.registerAddContactHook(forumSharingManager);
 		contactManager.registerRemoveContactHook(forumSharingManager);
-		eventBus.addListener(forumSharingManager);
+		validationManager.registerValidationHook(forumSharingManager);
 		return forumSharingManager;
 	}
 }
diff --git a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
index f415051a1c7c5445f5174a2138bd62071000fcd1..5218e5388ac8dff27fd39f37621b7dffe0a11b10 100644
--- a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
+++ b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
@@ -16,12 +16,8 @@ import org.briarproject.api.data.BdfWriterFactory;
 import org.briarproject.api.data.MetadataEncoder;
 import org.briarproject.api.data.MetadataParser;
 import org.briarproject.api.db.DatabaseComponent;
-import org.briarproject.api.db.DatabaseExecutor;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.Metadata;
-import org.briarproject.api.event.Event;
-import org.briarproject.api.event.EventListener;
-import org.briarproject.api.event.MessageValidatedEvent;
 import org.briarproject.api.forum.Forum;
 import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.forum.ForumSharingManager;
@@ -33,6 +29,7 @@ import org.briarproject.api.sync.Message;
 import org.briarproject.api.sync.MessageFactory;
 import org.briarproject.api.sync.MessageId;
 import org.briarproject.api.sync.PrivateGroupFactory;
+import org.briarproject.api.sync.ValidationManager.ValidationHook;
 import org.briarproject.api.system.Clock;
 import org.briarproject.util.StringUtils;
 
@@ -48,7 +45,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
-import java.util.concurrent.Executor;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.logging.Logger;
 
@@ -58,7 +54,7 @@ import static org.briarproject.api.forum.ForumConstants.MAX_FORUM_NAME_LENGTH;
 import static org.briarproject.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
 
 class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
-		RemoveContactHook, EventListener {
+		RemoveContactHook, ValidationHook {
 
 	static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString(
 			"cd11a5d04dccd9e2931d6fc3df456313"
@@ -70,7 +66,6 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
 			Logger.getLogger(ForumSharingManagerImpl.class.getName());
 
 	private final DatabaseComponent db;
-	private final Executor dbExecutor;
 	private final ContactManager contactManager;
 	private final ForumManager forumManager;
 	private final GroupFactory groupFactory;
@@ -89,14 +84,12 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
 
 	@Inject
 	ForumSharingManagerImpl(DatabaseComponent db,
-			@DatabaseExecutor Executor dbExecutor,
 			ContactManager contactManager, ForumManager forumManager,
 			GroupFactory groupFactory, PrivateGroupFactory privateGroupFactory,
 			MessageFactory messageFactory, BdfReaderFactory bdfReaderFactory,
 			BdfWriterFactory bdfWriterFactory, MetadataEncoder metadataEncoder,
 			MetadataParser metadataParser, SecureRandom random, Clock clock) {
 		this.db = db;
-		this.dbExecutor = dbExecutor;
 		this.contactManager = contactManager;
 		this.forumManager = forumManager;
 		this.groupFactory = groupFactory;
@@ -150,12 +143,21 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
 	}
 
 	@Override
-	public void eventOccurred(Event e) {
-		if (e instanceof MessageValidatedEvent) {
-			MessageValidatedEvent m = (MessageValidatedEvent) e;
-			ClientId c = m.getClientId();
-			if (m.isValid() && !m.isLocal() && c.equals(CLIENT_ID))
-				remoteForumsUpdated(m.getMessage().getGroupId());
+	public void validatingMessage(Message m, ClientId c, Metadata meta) {
+		if (c.equals(CLIENT_ID)) {
+			lock.writeLock().lock();
+			try {
+				ContactId contactId = getContactId(m.getGroupId());
+				setForumVisibility(contactId, getVisibleForums(m));
+			} catch (DbException e) {
+				if (LOG.isLoggable(WARNING))
+					LOG.log(WARNING, e.toString(), e);
+			} catch (FormatException e) {
+				if (LOG.isLoggable(WARNING))
+					LOG.log(WARNING, e.toString(), e);
+			} finally {
+				lock.writeLock().unlock();
+			}
 		}
 	}
 
@@ -416,47 +418,25 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
 		return out.toByteArray();
 	}
 
-	private void remoteForumsUpdated(final GroupId g) {
-		dbExecutor.execute(new Runnable() {
-			public void run() {
-				lock.writeLock().lock();
-				try {
-					setForumVisibility(getContactId(g), getVisibleForums(g));
-				} catch (DbException e) {
-					if (LOG.isLoggable(WARNING))
-						LOG.log(WARNING, e.toString(), e);
-				} catch (FormatException e) {
-					if (LOG.isLoggable(WARNING))
-						LOG.log(WARNING, e.toString(), e);
-				} finally {
-					lock.writeLock().unlock();
-				}
-			}
-		});
-	}
-
 	// Locking: lock.readLock
 	private ContactId getContactId(GroupId contactGroupId) throws DbException,
 			FormatException {
 		Metadata meta = db.getGroupMetadata(contactGroupId);
 		BdfDictionary d = metadataParser.parse(meta);
-		int id = d.getInteger("contactId").intValue();
-		return new ContactId(id);
+		return new ContactId(d.getInteger("contactId").intValue());
 	}
 
 	// Locking: lock.readLock
-	private Set<GroupId> getVisibleForums(GroupId contactGroupId)
+	private Set<GroupId> getVisibleForums(Message remoteUpdate)
 			throws DbException, FormatException {
-		// Get the latest local and remote updates
-		LatestUpdate local = findLatest(contactGroupId, true);
-		LatestUpdate remote = findLatest(contactGroupId, false);
-		// If there's no local and/or remote update, no forums are visible
-		if (local == null || remote == null) return Collections.emptySet();
+		// Get the latest local update
+		LatestUpdate local = findLatest(remoteUpdate.getGroupId(), true);
+		// If there's no local update, no forums are visible
+		if (local == null) return Collections.emptySet();
 		// Intersect the sets of shared forums
 		byte[] localRaw = db.getRawMessage(local.messageId);
 		Set<Forum> shared = new HashSet<Forum>(parseForumList(localRaw));
-		byte[] remoteRaw = db.getRawMessage(remote.messageId);
-		shared.retainAll(parseForumList(remoteRaw));
+		shared.retainAll(parseForumList(remoteUpdate.getRaw()));
 		// Forums in the intersection should be visible
 		Set<GroupId> visible = new HashSet<GroupId>(shared.size());
 		for (Forum f : shared) visible.add(f.getId());