diff --git a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java
index 35321f390a96ee09c356de2b294552cc812d9696..7519b46ab2c9d6b304085003d91a93d01cf4ebaf 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java
@@ -21,7 +21,6 @@ import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
 import java.util.Collection;
-import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
@@ -38,8 +37,6 @@ public class BlogActivity extends BriarActivity implements BlogPostListener,
 	static final String IS_NEW_BLOG = "briar.IS_NEW_BLOG";
 
 	private static final String BLOG_PAGER_ADAPTER = "briar.BLOG_PAGER_ADAPTER";
-	private static final Logger LOG =
-			Logger.getLogger(BlogActivity.class.getName());
 
 	private ProgressBar progressBar;
 	private ViewPager pager;
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogController.java b/briar-android/src/org/briarproject/android/blogs/BlogController.java
index b681c2710fd4bdb6333de478e53c83d2a67cf7aa..532d2dd2505dbb0cd75498f308522df0026e669f 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogController.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogController.java
@@ -7,14 +7,14 @@ import org.briarproject.android.controller.handler.ResultHandler;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
 
-import java.util.TreeSet;
+import java.util.SortedSet;
 
 public interface BlogController extends ActivityLifecycleController {
 
-	void loadBlog(final GroupId groupId, final boolean reload,
-			final ResultHandler<Boolean> resultHandler);
+	void loadBlog(GroupId groupId, boolean reload,
+			ResultHandler<Boolean> resultHandler);
 
-	TreeSet<BlogPostItem> getBlogPosts();
+	SortedSet<BlogPostItem> getBlogPosts();
 
 	@Nullable
 	BlogPostItem getBlogPost(MessageId postId);
@@ -22,10 +22,10 @@ public interface BlogController extends ActivityLifecycleController {
 	@Nullable
 	MessageId getBlogPostId(int position);
 
-	void deleteBlog(final ResultHandler<Boolean> resultHandler);
+	void deleteBlog(ResultHandler<Boolean> resultHandler);
 
 	interface BlogPostListener {
-		void onBlogPostAdded(final BlogPostItem post, final boolean local);
+		void onBlogPostAdded(BlogPostItem post, boolean local);
 	}
 
 }
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java
index 6bb11f312a21245593d2f4151f355fa0c48cd212..f34e63469e100c88d33d796faa766681d46b9444 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogControllerImpl.java
@@ -19,6 +19,7 @@ import org.briarproject.api.sync.MessageId;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.SortedSet;
 import java.util.TreeSet;
 import java.util.logging.Logger;
 
@@ -42,6 +43,7 @@ public class BlogControllerImpl extends DbControllerImpl
 
 	private volatile BlogPostListener listener;
 	private volatile GroupId groupId = null;
+	// FIXME: This collection isn't thread-safe, isn't updated atomically
 	private volatile TreeSet<BlogPostItem> posts = null;
 
 	@Inject
@@ -81,9 +83,11 @@ public class BlogControllerImpl extends DbControllerImpl
 				LOG.info("New blog post added");
 				if (posts == null) {
 					LOG.info("Posts have not loaded, yet");
+					// FIXME: Race condition, new post may not get loaded
 					return;
 				}
 				final BlogPostHeader header = m.getHeader();
+				// FIXME: Don't make blocking calls in event handlers
 				try {
 					final byte[] body = blogManager.getPostBody(header.getId());
 					final BlogPostItem post = new BlogPostItem(header, body);
@@ -112,7 +116,6 @@ public class BlogControllerImpl extends DbControllerImpl
 	public void loadBlog(final GroupId g, final boolean reload,
 			final ResultHandler<Boolean> resultHandler) {
 
-		LOG.info("Loading blog...");
 		runOnDbThread(new Runnable() {
 			@Override
 			public void run() {
@@ -132,8 +135,7 @@ public class BlogControllerImpl extends DbControllerImpl
 						posts.addAll(newPosts);
 						long duration = System.currentTimeMillis() - now;
 						if (LOG.isLoggable(INFO))
-							LOG.info("Post header load took " + duration +
-									" ms");
+							LOG.info("Loading blog took " + duration + " ms");
 					}
 					resultHandler.onResult(true);
 				} catch (DbException e) {
@@ -147,7 +149,7 @@ public class BlogControllerImpl extends DbControllerImpl
 
 	@Override
 	@Nullable
-	public TreeSet<BlogPostItem> getBlogPosts() {
+	public SortedSet<BlogPostItem> getBlogPosts() {
 		return posts;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/forum/ForumController.java b/briar-android/src/org/briarproject/android/forum/ForumController.java
index be8b427919a4e0150281f6f7224c13360473c86a..b492627e41e07a5ba18e7bd971484cc21cea91d1 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumController.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumController.java
@@ -4,7 +4,6 @@ import android.support.annotation.Nullable;
 
 import org.briarproject.android.controller.ActivityLifecycleController;
 import org.briarproject.android.controller.handler.ResultHandler;
-import org.briarproject.android.controller.handler.UiResultHandler;
 import org.briarproject.api.forum.Forum;
 import org.briarproject.api.sync.GroupId;
 import org.briarproject.api.sync.MessageId;
@@ -15,17 +14,25 @@ import java.util.List;
 public interface ForumController extends ActivityLifecycleController {
 
 	void loadForum(GroupId groupId, ResultHandler<Boolean> resultHandler);
+
 	@Nullable
 	Forum getForum();
+
 	List<ForumEntry> getForumEntries();
-	void unsubscribe(UiResultHandler<Boolean> resultHandler);
+
+	void unsubscribe(ResultHandler<Boolean> resultHandler);
+
 	void entryRead(ForumEntry forumEntry);
+
 	void entriesRead(Collection<ForumEntry> messageIds);
+
 	void createPost(byte[] body);
+
 	void createPost(byte[] body, MessageId parentId);
 
 	interface ForumPostListener {
 		void addLocalEntry(int index, ForumEntry entry);
+
 		void addForeignEntry(int index, ForumEntry entry);
 	}
 
diff --git a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java
index 54ff74de204ec58c7c5a65616422a44bcaecc768..638074ca13753aa13438866160f96bbfe343144b 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumControllerImpl.java
@@ -5,7 +5,6 @@ import android.support.annotation.Nullable;
 
 import org.briarproject.android.controller.DbControllerImpl;
 import org.briarproject.android.controller.handler.ResultHandler;
-import org.briarproject.android.controller.handler.UiResultHandler;
 import org.briarproject.api.FormatException;
 import org.briarproject.api.clients.MessageTree;
 import org.briarproject.api.crypto.CryptoComponent;
@@ -34,10 +33,10 @@ import java.security.GeneralSecurityException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Stack;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
@@ -69,11 +68,12 @@ public class ForumControllerImpl extends DbControllerImpl
 	@Inject
 	protected volatile IdentityManager identityManager;
 
-	private volatile MessageTree<ForumPostHeader> tree =
-			new MessageTreeImpl<>();
-	private volatile Map<MessageId, byte[]> bodyCache = new HashMap<>();
+	private final Map<MessageId, byte[]> bodyCache = new ConcurrentHashMap<>();
+	private final MessageTree<ForumPostHeader> tree = new MessageTreeImpl<>();
+
 	private volatile LocalAuthor localAuthor = null;
 	private volatile Forum forum = null;
+	// FIXME: This collection isn't thread-safe, isn't updated atomically
 	private volatile List<ForumEntry> forumEntries = null;
 
 	private ForumPostListener listener;
@@ -116,6 +116,7 @@ public class ForumControllerImpl extends DbControllerImpl
 			ForumPostReceivedEvent pe = (ForumPostReceivedEvent) e;
 			if (pe.getGroupId().equals(forum.getId())) {
 				LOG.info("Forum Post received, adding...");
+				// FIXME: Don't make blocking calls in event handlers
 				addNewPost(pe.getForumPostHeader());
 			}
 		} else if (e instanceof GroupRemovedEvent) {
@@ -272,9 +273,10 @@ public class ForumControllerImpl extends DbControllerImpl
 	}
 
 	@Override
-	public void unsubscribe(final UiResultHandler<Boolean> resultHandler) {
+	public void unsubscribe(final ResultHandler<Boolean> resultHandler) {
 		if (forum == null) return;
 		runOnDbThread(new Runnable() {
+			@Override
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
@@ -300,6 +302,7 @@ public class ForumControllerImpl extends DbControllerImpl
 	@Override
 	public void entriesRead(final Collection<ForumEntry> forumEntries) {
 		runOnDbThread(new Runnable() {
+			@Override
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();
@@ -325,6 +328,7 @@ public class ForumControllerImpl extends DbControllerImpl
 	@Override
 	public void createPost(final byte[] body, final MessageId parentId) {
 		cryptoExecutor.execute(new Runnable() {
+			@Override
 			public void run() {
 				long timestamp = System.currentTimeMillis();
 				long newestTimeStamp = 0;
@@ -353,6 +357,7 @@ public class ForumControllerImpl extends DbControllerImpl
 				}
 				bodyCache.put(p.getMessage().getId(), body);
 				storePost(p);
+				// FIXME: Don't make DB calls on the crypto executor
 				addNewPost(p);
 			}
 		});
@@ -378,6 +383,7 @@ public class ForumControllerImpl extends DbControllerImpl
 
 	private void storePost(final ForumPost p) {
 		runOnDbThread(new Runnable() {
+			@Override
 			public void run() {
 				try {
 					long now = System.currentTimeMillis();