diff --git a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
index 30df4b035c7d56da41d455333a7e34643abd225b..816ed7b90534a308f9687d8eb45c797ab52b4b12 100644
--- a/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/AvailableForumsActivity.java
@@ -12,7 +12,6 @@ import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.ListLoadingProgressBar;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
-import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
 import org.briarproject.api.event.Event;
@@ -21,6 +20,7 @@ import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
 import org.briarproject.api.event.SubscriptionAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
+import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 
@@ -46,7 +46,7 @@ implements EventListener, OnItemClickListener {
 	private ListLoadingProgressBar loading = null;
 
 	// Fields that are accessed from background threads must be volatile
-	@Inject private volatile DatabaseComponent db;
+	@Inject private volatile ForumManager forumManager;
 	@Inject private volatile EventBus eventBus;
 
 	@Override
@@ -78,10 +78,11 @@ implements EventListener, OnItemClickListener {
 					Collection<ForumContacts> available =
 							new ArrayList<ForumContacts>();
 					long now = System.currentTimeMillis();
-					for (Group g : db.getAvailableGroups()) {
+					for (Group g : forumManager.getAvailableGroups()) {
 						try {
 							GroupId id = g.getId();
-							Collection<Contact> c = db.getSubscribers(id);
+							Collection<Contact> c =
+									forumManager.getSubscribers(id);
 							available.add(new ForumContacts(g, c));
 						} catch (NoSuchSubscriptionException e) {
 							// Continue
@@ -151,8 +152,8 @@ implements EventListener, OnItemClickListener {
 		runOnDbThread(new Runnable() {
 			public void run() {
 				try {
-					db.addGroup(g);
-					db.setVisibility(g.getId(), visible);
+					forumManager.addGroup(g);
+					forumManager.setVisibility(g.getId(), visible);
 				} catch (DbException e) {
 					if (LOG.isLoggable(WARNING))
 						LOG.log(WARNING, e.toString(), e);
diff --git a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java
index d422684bb6d56043b8f3eb594837c7119fd2b2c4..76dc444147a632a845903a091a04ca6f34c0404a 100644
--- a/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/CreateForumActivity.java
@@ -16,8 +16,8 @@ import android.widget.Toast;
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupFactory;
 import org.briarproject.util.StringUtils;
@@ -53,7 +53,7 @@ implements OnEditorActionListener, OnClickListener {
 
 	// Fields that are accessed from background threads must be volatile
 	@Inject private volatile GroupFactory groupFactory;
-	@Inject private volatile DatabaseComponent db;
+	@Inject private volatile ForumManager forumManager;
 
 	@Override
 	public void onCreate(Bundle state) {
@@ -140,7 +140,7 @@ implements OnEditorActionListener, OnClickListener {
 				try {
 					Group g = groupFactory.createGroup(name);
 					long now = System.currentTimeMillis();
-					db.addGroup(g);
+					forumManager.addGroup(g);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Storing forum took " + duration + " ms");
diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
index aa2d71504db3a49a048b5e596a48b8bb1ab9c51d..ee14bad2912b68bbaa3d48c016e99e04be9be476 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
@@ -18,7 +18,6 @@ import org.briarproject.android.util.ElasticHorizontalSpace;
 import org.briarproject.android.util.HorizontalBorder;
 import org.briarproject.android.util.ListLoadingProgressBar;
 import org.briarproject.api.android.AndroidNotificationManager;
-import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchMessageException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
@@ -27,6 +26,7 @@ import org.briarproject.api.event.EventBus;
 import org.briarproject.api.event.EventListener;
 import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
+import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
@@ -71,7 +71,7 @@ OnClickListener, OnItemClickListener {
 	private ImageButton composeButton = null, shareButton = null;
 
 	// Fields that are accessed from background threads must be volatile
-	@Inject private volatile DatabaseComponent db;
+	@Inject private volatile ForumManager forumManager;
 	@Inject private volatile EventBus eventBus;
 	private volatile GroupId groupId = null;
 	private volatile Group group = null;
@@ -152,7 +152,7 @@ OnClickListener, OnItemClickListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					group = db.getGroup(groupId);
+					group = forumManager.getGroup(groupId);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Loading group " + duration + " ms");
@@ -181,7 +181,7 @@ OnClickListener, OnItemClickListener {
 				try {
 					long now = System.currentTimeMillis();
 					Collection<MessageHeader> headers =
-							db.getMessageHeaders(groupId);
+							forumManager.getMessageHeaders(groupId);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Load took " + duration + " ms");
@@ -228,7 +228,7 @@ OnClickListener, OnItemClickListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					byte[] body = db.getMessageBody(h.getId());
+					byte[] body = forumManager.getMessageBody(h.getId());
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Loading message took " + duration + " ms");
@@ -298,7 +298,8 @@ OnClickListener, OnItemClickListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					for (MessageId m : unread) db.setReadFlag(m, true);
+					for (MessageId m : unread)
+						forumManager.setReadFlag(m, true);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Marking read took " + duration + " ms");
diff --git a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
index e00e4ab2ce6a86eb2293ae55d34eb9d428b63ad0..c602aefc06b1ee5d2922b5066e3edd3f7af7ef6e 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumListActivity.java
@@ -23,7 +23,6 @@ import org.briarproject.android.BriarActivity;
 import org.briarproject.android.util.HorizontalBorder;
 import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.android.util.ListLoadingProgressBar;
-import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchSubscriptionException;
 import org.briarproject.api.event.Event;
@@ -33,6 +32,7 @@ import org.briarproject.api.event.MessageAddedEvent;
 import org.briarproject.api.event.RemoteSubscriptionsUpdatedEvent;
 import org.briarproject.api.event.SubscriptionAddedEvent;
 import org.briarproject.api.event.SubscriptionRemovedEvent;
+import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageHeader;
@@ -77,7 +77,7 @@ OnCreateContextMenuListener {
 	private ImageButton newForumButton = null;
 
 	// Fields that are accessed from background threads must be volatile
-	@Inject private volatile DatabaseComponent db;
+	@Inject private volatile ForumManager forumManager;
 	@Inject private volatile EventBus eventBus;
 
 	@Override
@@ -153,14 +153,16 @@ OnCreateContextMenuListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					for (Group g : db.getGroups()) {
+					for (Group g : forumManager.getGroups()) {
 						try {
-							displayHeaders(g, db.getMessageHeaders(g.getId()));
+							Collection<MessageHeader> headers =
+									forumManager.getMessageHeaders(g.getId());
+							displayHeaders(g, headers);
 						} catch (NoSuchSubscriptionException e) {
 							// Continue
 						}
 					}
-					int available = db.getAvailableGroups().size();
+					int available = forumManager.getAvailableGroups().size();
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Full load took " + duration + " ms");
@@ -279,7 +281,7 @@ OnCreateContextMenuListener {
 				try {
 					long now = System.currentTimeMillis();
 					Collection<MessageHeader> headers =
-							db.getMessageHeaders(g.getId());
+							forumManager.getMessageHeaders(g.getId());
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Partial load took " + duration + " ms");
@@ -318,7 +320,7 @@ OnCreateContextMenuListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					int available = db.getAvailableGroups().size();
+					int available = forumManager.getAvailableGroups().size();
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Loading available took " + duration + " ms");
@@ -373,7 +375,7 @@ OnCreateContextMenuListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					db.removeGroup(g);
+					forumManager.removeGroup(g);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Removing group took " + duration + " ms");
diff --git a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
index e41a8b97095955b2075a10d6e658e35d0f5f37ea..3c3c7dac6c1de2f7b5742a42e7ac2852713d335f 100644
--- a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
@@ -17,9 +17,9 @@ import org.briarproject.android.util.AuthorView;
 import org.briarproject.android.util.ElasticHorizontalSpace;
 import org.briarproject.android.util.HorizontalBorder;
 import org.briarproject.android.util.LayoutUtils;
-import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.NoSuchMessageException;
+import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
@@ -57,7 +57,7 @@ implements OnClickListener {
 	private int position = -1;
 
 	// Fields that are accessed from background threads must be volatile
-	@Inject private volatile DatabaseComponent db;
+	@Inject private volatile ForumManager forumManager;
 	private volatile MessageId messageId = null;
 
 	@Override
@@ -169,7 +169,7 @@ implements OnClickListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					db.setReadFlag(messageId, true);
+					forumManager.setReadFlag(messageId, true);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Marking read took " + duration + " ms");
@@ -186,7 +186,7 @@ implements OnClickListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					byte[] body = db.getMessageBody(messageId);
+					byte[] body = forumManager.getMessageBody(messageId);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Loading message took " + duration + " ms");
diff --git a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
index ae7115a38ce891d7ef08a2de9aada68558694b7d..2b95559df059930f6c812a2a121f7e8ce7a7762b 100644
--- a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java
@@ -17,8 +17,9 @@ import org.briarproject.android.invitation.AddContactActivity;
 import org.briarproject.android.util.LayoutUtils;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
-import org.briarproject.api.db.DatabaseComponent;
+import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.sync.GroupId;
 
 import java.util.Collection;
@@ -50,7 +51,8 @@ SelectContactsDialog.Listener {
 	private boolean changed = false;
 
 	// Fields that are accessed from background threads must be volatile
-	@Inject private volatile DatabaseComponent db;
+	@Inject private volatile ContactManager contactManager;
+	@Inject private volatile ForumManager forumManager;
 	private volatile GroupId groupId = null;
 	private volatile Collection<Contact> contacts = null;
 	private volatile Collection<ContactId> selected = null;
@@ -136,8 +138,8 @@ SelectContactsDialog.Listener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					contacts = db.getContacts();
-					selected = db.getVisibility(groupId);
+					contacts = contactManager.getContacts();
+					selected = forumManager.getVisibility(groupId);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Load took " + duration + " ms");
@@ -173,8 +175,8 @@ SelectContactsDialog.Listener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					db.setVisibleToAll(groupId, all);
-					if (!all) db.setVisibility(groupId, selected);
+					forumManager.setVisibleToAll(groupId, all);
+					if (!all) forumManager.setVisibility(groupId, selected);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Update took " + duration + " ms");
diff --git a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
index 2ce94975864cf4a7e2aaf7552743759a5eac0a55..16d2e41ca93c019021a98461a4795b3d9f50ed69 100644
--- a/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/WriteForumPostActivity.java
@@ -27,9 +27,10 @@ import org.briarproject.api.crypto.CryptoComponent;
 import org.briarproject.api.crypto.CryptoExecutor;
 import org.briarproject.api.crypto.KeyParser;
 import org.briarproject.api.crypto.PrivateKey;
-import org.briarproject.api.db.DatabaseComponent;
 import org.briarproject.api.db.DbException;
+import org.briarproject.api.forum.ForumManager;
 import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.Group;
 import org.briarproject.api.sync.GroupId;
@@ -75,7 +76,8 @@ implements OnItemSelectedListener, OnClickListener {
 	private GroupId groupId = null;
 
 	// Fields that are accessed from background threads must be volatile
-	@Inject private volatile DatabaseComponent db;
+	@Inject private volatile IdentityManager identityManager;
+	@Inject private volatile ForumManager forumManager;
 	@Inject private volatile CryptoComponent crypto;
 	@Inject private volatile MessageFactory messageFactory;
 	private volatile MessageId parentId = null;
@@ -166,8 +168,9 @@ implements OnItemSelectedListener, OnClickListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					Collection<LocalAuthor> localAuthors = db.getLocalAuthors();
-					group = db.getGroup(groupId);
+					Collection<LocalAuthor> localAuthors =
+							identityManager.getLocalAuthors();
+					group = forumManager.getGroup(groupId);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Load took " + duration + " ms");
@@ -292,7 +295,7 @@ implements OnItemSelectedListener, OnClickListener {
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
-					db.addLocalMessage(m);
+					forumManager.addLocalMessage(m);
 					long duration = System.currentTimeMillis() - now;
 					if (LOG.isLoggable(INFO))
 						LOG.info("Storing message took " + duration + " ms");