diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java
index 9e4bbe51e277e5c8097936b400377a9f28739ca1..0a36ac80ec301f1f1a56e900726267f9b40e1751 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadItemAdapter.java
@@ -66,31 +66,29 @@ public class ThreadItemAdapter<I extends ThreadItem>
 		revision++;
 	}
 
-	void setBottomItem(MessageId messageId) {
+	// Useful when the adapter has not calculated the dimension yet
+	void postSetItemWithIdVisible(@Nullable final MessageId messageId) {
+		new Handler().post(new Runnable() {
+			@Override
+			public void run() {
+				setItemWithIdVisible(messageId);
+			}
+		});
+	}
+
+	void setItemWithIdVisible(@Nullable MessageId messageId) {
 		if (messageId != null) {
 			int pos = 0;
 			for (I item : items) {
 				if (item.getId().equals(messageId)) {
-					scrollToPosition(pos);
+					layoutManager.scrollToPosition(pos);
 					break;
-
 				}
 				pos++;
 			}
 		}
 	}
 
-	private void scrollToPosition(final int pos) {
-		// Post call ensures that the list scrolls AFTER it has been propagated
-		// and the layout has been calculated.
-		handler.post(new Runnable() {
-			@Override
-			public void run() {
-				layoutManager.scrollToPosition(pos);
-			}
-		});
-	}
-
 	public void setItems(Collection<I> items) {
 		this.items.clear();
 		this.items.addAll(items);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java
index dc184365e56d727b2b8cf689707befc193c1572e..68cec97a2789860c3929939c17b6024747d8487a 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java
@@ -148,7 +148,8 @@ public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadI
 	}
 
 	@Override
-	public MessageId getBottomVisibleMessageId() {
+	@Nullable
+	public MessageId getLastVisibleMessageId() {
 		if (layoutManager != null && adapter != null) {
 			int position =
 					layoutManager.findLastCompletelyVisibleItemPosition();
@@ -190,7 +191,7 @@ public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadI
 								list.showData();
 							} else {
 								adapter.setItems(items);
-								adapter.setBottomItem(
+								adapter.postSetItemWithIdVisible(
 										items.getBottomVisibleItemId());
 								list.showData();
 								updateTextInput(replyId);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java
index a062c8322ec4773b41eb1d1e476d4c7286779e26..45aa69a0ac6a819ae2d56ba6015cae293fa2abd8 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java
@@ -42,7 +42,7 @@ public interface ThreadListController<G extends NamedGroup, I extends ThreadItem
 
 	void deleteNamedGroup(ExceptionHandler<DbException> handler);
 
-	interface ThreadListListener<H> extends DestroyableContext {
+	interface ThreadListListener<H> extends ThreadListDataSource {
 		@UiThread
 		void onHeaderReceived(H header);
 
@@ -53,10 +53,10 @@ public interface ThreadListController<G extends NamedGroup, I extends ThreadItem
 		void onInvitationAccepted(ContactId c);
 	}
 
-	interface ThreadListDataSource {
+	interface ThreadListDataSource extends DestroyableContext {
 
 		@UiThread @Nullable
-		MessageId getBottomVisibleMessageId();
+		MessageId getLastVisibleMessageId();
 	}
 
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListControllerImpl.java
index 94b880f9dcc058f1997f902282f5b9c54297269e..c61b354583269ff34cf44222a0cdfe6769fe6eac 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListControllerImpl.java
@@ -59,7 +59,6 @@ public abstract class ThreadListControllerImpl<G extends NamedGroup, I extends T
 	protected volatile L listener;
 	@Inject
 	MessageTracker messageTracker;
-	private ThreadListDataSource source;
 
 	protected ThreadListControllerImpl(@DatabaseExecutor Executor dbExecutor,
 			LifecycleManager lifecycleManager, IdentityManager identityManager,
@@ -83,13 +82,6 @@ public abstract class ThreadListControllerImpl<G extends NamedGroup, I extends T
 	@Override
 	public void onActivityCreate(Activity activity) {
 		listener = (L) activity;
-		if (activity instanceof ThreadListDataSource) {
-			source = (ThreadListDataSource) activity;
-		} else {
-			throw new ClassCastException(
-					"Activity " + activity.getClass().getSimpleName() +
-							" must implement ThreadListDataSource");
-		}
 	}
 
 	@CallSuper
@@ -111,9 +103,10 @@ public abstract class ThreadListControllerImpl<G extends NamedGroup, I extends T
 		try {
 			messageTracker
 					.storeMessageId(groupId,
-							source.getBottomVisibleMessageId());
+							listener.getLastVisibleMessageId());
 		} catch (DbException e) {
-			e.printStackTrace();
+			if (LOG.isLoggable(WARNING))
+				LOG.log(WARNING, e.toString(), e);
 		}
 	}
 
diff --git a/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java b/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java
index 716b1308eeb93c49fe6b81dc3627928882428a9f..18e034027c906507119141a3b5e99993f9f7429d 100644
--- a/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/client/MessageTrackerImpl.java
@@ -65,7 +65,7 @@ class MessageTrackerImpl implements MessageTracker {
 		try {
 			BdfDictionary d = clientHelper.getGroupMetadataAsDictionary(g);
 			byte[] msgBytes = d.getOptionalRaw(GROUP_KEY_STORED_MESSAGE_ID);
-			return msgBytes != null? new MessageId(msgBytes) : null;
+			return msgBytes != null ? new MessageId(msgBytes) : null;
 		} catch (FormatException e) {
 			throw new DbException(e);
 		}