diff --git a/briar-api/src/org/briarproject/api/contact/ContactManager.java b/briar-api/src/org/briarproject/api/contact/ContactManager.java
index 08c9dc46a1509fa5efca37571502e49898af6830..3b311d66d58146de84e2d7dc9932d7047483c6aa 100644
--- a/briar-api/src/org/briarproject/api/contact/ContactManager.java
+++ b/briar-api/src/org/briarproject/api/contact/ContactManager.java
@@ -30,10 +30,10 @@ public interface ContactManager {
 	void removeContact(ContactId c) throws DbException;
 
 	interface AddContactHook {
-		void addingContact(ContactId c);
+		void addingContact(Contact c);
 	}
 
 	interface RemoveContactHook {
-		void removingContact(ContactId c);
+		void removingContact(Contact c);
 	}
 }
diff --git a/briar-api/src/org/briarproject/api/identity/IdentityManager.java b/briar-api/src/org/briarproject/api/identity/IdentityManager.java
index 9a5a030abdeab1d485ee7a22fd6f8d3a78ac1ea5..e872d845edbfb7ce3b21397791ff13bf74fa5c02 100644
--- a/briar-api/src/org/briarproject/api/identity/IdentityManager.java
+++ b/briar-api/src/org/briarproject/api/identity/IdentityManager.java
@@ -25,10 +25,10 @@ public interface IdentityManager {
 	void removeLocalAuthor(AuthorId a) throws DbException;
 
 	interface AddIdentityHook {
-		void addingIdentity(AuthorId a);
+		void addingIdentity(LocalAuthor a);
 	}
 
 	interface RemoveIdentityHook {
-		void removingIdentity(AuthorId a);
+		void removingIdentity(LocalAuthor a);
 	}
 }
diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
index fa1c096219f35df6889f892839273b8806af4b94..b8f9553c84e62362acbfcec5b59f370015769c54 100644
--- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
+++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
@@ -14,6 +14,7 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.AuthorId;
 import org.briarproject.api.identity.IdentityManager.RemoveIdentityHook;
+import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.lifecycle.Service;
 
 import java.util.ArrayList;
@@ -54,12 +55,12 @@ class ContactManagerImpl implements ContactManager, Service,
 			for (Contact c : db.getContacts()) {
 				if (c.getStatus().equals(ADDING)) {
 					for (AddContactHook hook : addHooks)
-						hook.addingContact(c.getId());
+						hook.addingContact(c);
 					db.setContactStatus(c.getId(), ACTIVE);
 					eventBus.broadcast(new ContactAddedEvent(c.getId()));
 				} else if (c.getStatus().equals(REMOVING)) {
 					for (RemoveContactHook hook : removeHooks)
-						hook.removingContact(c.getId());
+						hook.removingContact(c);
 					db.removeContact(c.getId());
 					eventBus.broadcast(new ContactRemovedEvent(c.getId()));
 				}
@@ -90,7 +91,8 @@ class ContactManagerImpl implements ContactManager, Service,
 	public ContactId addContact(Author remote, AuthorId local)
 			throws DbException {
 		ContactId c = db.addContact(remote, local);
-		for (AddContactHook hook : addHooks) hook.addingContact(c);
+		Contact contact = db.getContact(c);
+		for (AddContactHook hook : addHooks) hook.addingContact(contact);
 		db.setContactStatus(c, ACTIVE);
 		eventBus.broadcast(new ContactAddedEvent(c));
 		return c;
@@ -115,17 +117,19 @@ class ContactManagerImpl implements ContactManager, Service,
 
 	@Override
 	public void removeContact(ContactId c) throws DbException {
+		Contact contact = db.getContact(c);
 		db.setContactStatus(c, REMOVING);
-		for (RemoveContactHook hook : removeHooks) hook.removingContact(c);
+		for (RemoveContactHook hook : removeHooks)
+			hook.removingContact(contact);
 		db.removeContact(c);
 		eventBus.broadcast(new ContactRemovedEvent(c));
 	}
 
 	@Override
-	public void removingIdentity(AuthorId a) {
+	public void removingIdentity(LocalAuthor a) {
 		// Remove any contacts of the local pseudonym that's being removed
 		try {
-			for (ContactId c : db.getContacts(a)) removeContact(c);
+			for (ContactId c : db.getContacts(a.getId())) removeContact(c);
 		} catch (DbException e) {
 			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
 		}
diff --git a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java
index 0e2c581c84e293d97fbe61eb8f6ca947ad6cea18..6820afb47e92cac1958dfbf41dc00bae31e18459 100644
--- a/briar-core/src/org/briarproject/forum/ForumManagerImpl.java
+++ b/briar-core/src/org/briarproject/forum/ForumManagerImpl.java
@@ -19,6 +19,7 @@ import org.briarproject.api.forum.ForumPost;
 import org.briarproject.api.forum.ForumPostHeader;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.ClientId;
 import org.briarproject.api.sync.Group;
@@ -59,6 +60,7 @@ class ForumManagerImpl implements ForumManager {
 
 	private final DatabaseComponent db;
 	private final ContactManager contactManager;
+	private final IdentityManager identityManager;
 	private final BdfReaderFactory bdfReaderFactory;
 	private final MetadataEncoder metadataEncoder;
 	private final MetadataParser metadataParser;
@@ -68,10 +70,11 @@ class ForumManagerImpl implements ForumManager {
 
 	@Inject
 	ForumManagerImpl(DatabaseComponent db, ContactManager contactManager,
-			BdfReaderFactory bdfReaderFactory, MetadataEncoder metadataEncoder,
-			MetadataParser metadataParser) {
+			IdentityManager identityManager, BdfReaderFactory bdfReaderFactory,
+			MetadataEncoder metadataEncoder, MetadataParser metadataParser) {
 		this.db = db;
 		this.contactManager = contactManager;
+		this.identityManager = identityManager;
 		this.bdfReaderFactory = bdfReaderFactory;
 		this.metadataEncoder = metadataEncoder;
 		this.metadataParser = metadataParser;
@@ -173,7 +176,7 @@ class ForumManagerImpl implements ForumManager {
 		try {
 			// Load the IDs of the user's identities
 			Set<AuthorId> localAuthorIds = new HashSet<AuthorId>();
-			for (LocalAuthor a : db.getLocalAuthors())
+			for (LocalAuthor a : identityManager.getLocalAuthors())
 				localAuthorIds.add(a.getId());
 			// Load the IDs of contacts' identities
 			Set<AuthorId> contactAuthorIds = new HashSet<AuthorId>();
diff --git a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
index 5218e5388ac8dff27fd39f37621b7dffe0a11b10..abfb7f6c90f8108bce42242ece447e2db26658d9 100644
--- a/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
+++ b/briar-core/src/org/briarproject/forum/ForumSharingManagerImpl.java
@@ -106,17 +106,17 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
 	}
 
 	@Override
-	public void addingContact(ContactId c) {
+	public void addingContact(Contact c) {
 		lock.writeLock().lock();
 		try {
 			// Create a group to share with the contact
-			Group g = getContactGroup(db.getContact(c));
+			Group g = getContactGroup(c);
 			// Store the group and share it with the contact
 			db.addGroup(g);
-			db.setVisibility(g.getId(), Collections.singletonList(c));
+			db.setVisibility(g.getId(), Collections.singletonList(c.getId()));
 			// Attach the contact ID to the group
 			BdfDictionary d = new BdfDictionary();
-			d.put("contactId", c.getInt());
+			d.put("contactId", c.getId().getInt());
 			db.mergeGroupMetadata(g.getId(), metadataEncoder.encode(d));
 			// Share any forums that are shared with all contacts
 			List<Forum> shared = getForumsSharedWithAllContacts();
@@ -131,10 +131,10 @@ class ForumSharingManagerImpl implements ForumSharingManager, AddContactHook,
 	}
 
 	@Override
-	public void removingContact(ContactId c) {
+	public void removingContact(Contact c) {
 		lock.writeLock().lock();
 		try {
-			db.removeGroup(getContactGroup(db.getContact(c)));
+			db.removeGroup(getContactGroup(c));
 		} catch (DbException e) {
 			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
 		} finally {
diff --git a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
index a51ce023880530c5ffc915823a78d2209fe8271c..71b34eac925e31a79d413f9f228b51a43dd7e97a 100644
--- a/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
+++ b/briar-core/src/org/briarproject/identity/IdentityManagerImpl.java
@@ -50,12 +50,12 @@ class IdentityManagerImpl implements IdentityManager, Service {
 			for (LocalAuthor a : db.getLocalAuthors()) {
 				if (a.getStatus().equals(ADDING)) {
 					for (AddIdentityHook hook : addHooks)
-						hook.addingIdentity(a.getId());
+						hook.addingIdentity(a);
 					db.setLocalAuthorStatus(a.getId(), ACTIVE);
 					eventBus.broadcast(new LocalAuthorAddedEvent(a.getId()));
 				} else if (a.getStatus().equals(REMOVING)) {
 					for (RemoveIdentityHook hook : removeHooks)
-						hook.removingIdentity(a.getId());
+						hook.removingIdentity(a);
 					db.removeLocalAuthor(a.getId());
 					eventBus.broadcast(new LocalAuthorRemovedEvent(a.getId()));
 				}
@@ -83,11 +83,11 @@ class IdentityManagerImpl implements IdentityManager, Service {
 	}
 
 	@Override
-	public void addLocalAuthor(LocalAuthor a) throws DbException {
-		db.addLocalAuthor(a);
-		for (AddIdentityHook hook : addHooks) hook.addingIdentity(a.getId());
-		db.setLocalAuthorStatus(a.getId(), ACTIVE);
-		eventBus.broadcast(new LocalAuthorAddedEvent(a.getId()));
+	public void addLocalAuthor(LocalAuthor localAuthor) throws DbException {
+		db.addLocalAuthor(localAuthor);
+		for (AddIdentityHook hook : addHooks) hook.addingIdentity(localAuthor);
+		db.setLocalAuthorStatus(localAuthor.getId(), ACTIVE);
+		eventBus.broadcast(new LocalAuthorAddedEvent(localAuthor.getId()));
 	}
 
 	@Override
@@ -109,8 +109,10 @@ class IdentityManagerImpl implements IdentityManager, Service {
 
 	@Override
 	public void removeLocalAuthor(AuthorId a) throws DbException {
+		LocalAuthor localAuthor = db.getLocalAuthor(a);
 		db.setLocalAuthorStatus(a, REMOVING);
-		for (RemoveIdentityHook hook : removeHooks) hook.removingIdentity(a);
+		for (RemoveIdentityHook hook : removeHooks)
+			hook.removingIdentity(localAuthor);
 		db.removeLocalAuthor(a);
 		eventBus.broadcast(new LocalAuthorRemovedEvent(a));
 	}
diff --git a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java
index 65f0432893f5d5d54c9806719b8d2be007f92cb6..a5514fc04ae77bcb99e5369edcb8393cb707f0c5 100644
--- a/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java
+++ b/briar-core/src/org/briarproject/messaging/MessagingManagerImpl.java
@@ -71,16 +71,16 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook,
 	}
 
 	@Override
-	public void addingContact(ContactId c) {
+	public void addingContact(Contact c) {
 		try {
 			// Create a group to share with the contact
-			Group g = getContactGroup(db.getContact(c));
+			Group g = getContactGroup(c);
 			// Store the group and share it with the contact
 			db.addGroup(g);
-			db.setVisibility(g.getId(), Collections.singletonList(c));
+			db.setVisibility(g.getId(), Collections.singletonList(c.getId()));
 			// Attach the contact ID to the group
 			BdfDictionary d = new BdfDictionary();
-			d.put("contactId", c.getInt());
+			d.put("contactId", c.getId().getInt());
 			db.mergeGroupMetadata(g.getId(), metadataEncoder.encode(d));
 		} catch (DbException e) {
 			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
@@ -94,9 +94,9 @@ class MessagingManagerImpl implements MessagingManager, AddContactHook,
 	}
 
 	@Override
-	public void removingContact(ContactId c) {
+	public void removingContact(Contact c) {
 		try {
-			db.removeGroup(getContactGroup(db.getContact(c)));
+			db.removeGroup(getContactGroup(c));
 		} catch (DbException e) {
 			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
 		}
diff --git a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java
index bbc6cd57d16f68433e7debf2e87977ced7094c3e..e972093d7a03d2abb21edfe0c34140830526f900 100644
--- a/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java
+++ b/briar-core/src/org/briarproject/properties/TransportPropertyManagerImpl.java
@@ -95,14 +95,14 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 	}
 
 	@Override
-	public void addingContact(ContactId c) {
+	public void addingContact(Contact c) {
 		lock.writeLock().lock();
 		try {
 			// Create a group to share with the contact
-			Group g = getContactGroup(db.getContact(c));
+			Group g = getContactGroup(c);
 			// Store the group and share it with the contact
 			db.addGroup(g);
-			db.setVisibility(g.getId(), Collections.singletonList(c));
+			db.setVisibility(g.getId(), Collections.singletonList(c.getId()));
 			// Copy the latest local properties into the group
 			DeviceId dev = db.getDeviceId();
 			Map<TransportId, TransportProperties> local = getLocalProperties();
@@ -120,10 +120,10 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 	}
 
 	@Override
-	public void removingContact(ContactId c) {
+	public void removingContact(Contact c) {
 		lock.writeLock().lock();
 		try {
-			db.removeGroup(getContactGroup(db.getContact(c)));
+			db.removeGroup(getContactGroup(c));
 		} catch (DbException e) {
 			if (LOG.isLoggable(WARNING)) LOG.log(WARNING, e.toString(), e);
 		} finally {
@@ -136,7 +136,7 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 			Map<TransportId, TransportProperties> props) throws DbException {
 		lock.writeLock().lock();
 		try {
-			Group g = getContactGroup(db.getContact(c));
+			Group g = getContactGroup(contactManager.getContact(c));
 			for (Entry<TransportId, TransportProperties> e : props.entrySet()) {
 				storeMessage(g.getId(), dev, e.getKey(), e.getValue(), 0, false,
 						false);
diff --git a/briar-tests/src/org/briarproject/contact/ContactManagerImplTest.java b/briar-tests/src/org/briarproject/contact/ContactManagerImplTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..6cde435e38aa438ca360302eea9989c08b8c10fc
--- /dev/null
+++ b/briar-tests/src/org/briarproject/contact/ContactManagerImplTest.java
@@ -0,0 +1,14 @@
+package org.briarproject.contact;
+
+import org.briarproject.BriarTestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+public class ContactManagerImplTest extends BriarTestCase {
+
+	@Test
+	public void testUnitTestsExist() {
+		fail(); // FIXME: Write tests
+	}
+}
diff --git a/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java b/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c04567a0a41253fe1b91eb0bf76d41a50d8aed10
--- /dev/null
+++ b/briar-tests/src/org/briarproject/identity/IdentityManagerImplTest.java
@@ -0,0 +1,14 @@
+package org.briarproject.identity;
+
+import org.briarproject.BriarTestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+public class IdentityManagerImplTest extends BriarTestCase {
+
+	@Test
+	public void testUnitTestsExist() {
+		fail(); // FIXME: Write tests
+	}
+}