diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
index d93aa05635427f167ec9ea3806f4611594a0473e..35b57773e69fd9609e9f4b4ddb6e3041f3c94f7b 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java
@@ -47,7 +47,7 @@ import static org.briarproject.android.blogs.BlogActivity.REQUEST_WRITE_POST;
 public class BlogFragment extends BaseFragment implements
 		OnBlogPostAddedListener {
 
-	public final static String TAG = BlogFragment.class.getName();
+	private final static String TAG = BlogFragment.class.getName();
 
 	@Inject
 	BlogController blogController;
@@ -178,7 +178,7 @@ public class BlogFragment extends BaseFragment implements
 	public void onBlogPostAdded(BlogPostHeader header, final boolean local) {
 		blogController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						adapter.add(post);
@@ -201,10 +201,10 @@ public class BlogFragment extends BaseFragment implements
 		);
 	}
 
-	void loadBlogPosts(final boolean reload) {
+	private void loadBlogPosts(final boolean reload) {
 		blogController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						if (posts.isEmpty()) {
@@ -225,7 +225,7 @@ public class BlogFragment extends BaseFragment implements
 
 	private void loadBlog() {
 		blogController.loadBlog(
-				new UiResultExceptionHandler<BlogItem, DbException>(listener) {
+				new UiResultExceptionHandler<BlogItem, DbException>(this) {
 					@Override
 					public void onResultUi(BlogItem blog) {
 						setToolbarTitle(blog.getBlog().getAuthor());
@@ -299,7 +299,7 @@ public class BlogFragment extends BaseFragment implements
 
 	private void deleteBlog() {
 		blogController.deleteBlog(
-				new UiResultExceptionHandler<Void, DbException>(listener) {
+				new UiResultExceptionHandler<Void, DbException>(this) {
 					@Override
 					public void onResultUi(Void result) {
 						Toast.makeText(getActivity(),
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
index ac7b4d504e440bafdf8254703239bd079bfca530..78b82874fc6e01a664bac2ad229ee2579344c9d0 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostFragment.java
@@ -62,7 +62,7 @@ public class BlogPostFragment extends BasePostFragment {
 		super.onStart();
 		blogController.loadBlogPost(postId,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						onBlogPostLoaded(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
index 3db8c4d084baf1c5766165191ea6d28aeeebbc2d..7c63d5c7d84a6ced24217e2a310ae8ff4eb49954 100644
--- a/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/BlogPostPagerFragment.java
@@ -45,7 +45,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPosts(final MessageId select) {
 		blogController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						onBlogPostsLoaded(select, posts);
@@ -62,7 +62,7 @@ public class BlogPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPost(BlogPostHeader header) {
 		blogController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						addPost(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
index 5c7bd39494eb2fdfef82b1a86289385a53a17d1d..60d8ed7c3ec21827da5ad541edb918d0db8bdc57 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedFragment.java
@@ -114,7 +114,7 @@ public class FeedFragment extends BaseFragment implements
 
 	private void loadPersonalBlog() {
 		feedController.loadPersonalBlog(
-				new UiResultExceptionHandler<Blog, DbException>(listener) {
+				new UiResultExceptionHandler<Blog, DbException>(this) {
 					@Override
 					public void onResultUi(Blog b) {
 						personalBlog = b;
@@ -131,7 +131,7 @@ public class FeedFragment extends BaseFragment implements
 		final int revision = adapter.getRevision();
 		feedController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						if (revision == adapter.getRevision()) {
@@ -194,7 +194,7 @@ public class FeedFragment extends BaseFragment implements
 	public void onBlogPostAdded(BlogPostHeader header, final boolean local) {
 		feedController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						adapter.incrementRevision();
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
index 442a85ef9877a91c9ee3f94e557b1e76f182e289..002f69586d875c18c32c08aa584a464bab305a1c 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedPostFragment.java
@@ -65,7 +65,7 @@ public class FeedPostFragment extends BasePostFragment {
 		super.onStart();
 		feedController.loadBlogPost(blogId, postId,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						onBlogPostLoaded(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
index b37d99eefe7de372dc663bb957616a314ba0e860..381bb5e9b011c05276c82d77f5f0bb1270546f0f 100644
--- a/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/FeedPostPagerFragment.java
@@ -44,7 +44,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPosts(final MessageId select) {
 		feedController.loadBlogPosts(
 				new UiResultExceptionHandler<Collection<BlogPostItem>, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(Collection<BlogPostItem> posts) {
 						onBlogPostsLoaded(select, posts);
@@ -61,7 +61,7 @@ public class FeedPostPagerFragment extends BasePostPagerFragment {
 	void loadBlogPost(BlogPostHeader header) {
 		feedController.loadBlogPost(header,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(BlogPostItem post) {
 						addPost(post);
diff --git a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java
index 479fecaadaff9cfaeea1b394f8faa64983ed07b2..a69e9ce96bea51d6b5c1e2693f50ae8606730cb1 100644
--- a/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java
+++ b/briar-android/src/org/briarproject/android/blogs/ReblogFragment.java
@@ -93,7 +93,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
 		// TODO: Load blog post when fragment is created. #631
 		feedController.loadBlogPost(blogId, postId,
 				new UiResultExceptionHandler<BlogPostItem, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(BlogPostItem result) {
 						item = result;
@@ -130,7 +130,7 @@ public class ReblogFragment extends BaseFragment implements TextInputListener {
 	public void onSendClick(String text) {
 		String comment = getComment();
 		feedController.repeatPost(item, comment,
-				new UiResultExceptionHandler<Void, DbException>(listener) {
+				new UiResultExceptionHandler<Void, DbException>(this) {
 					@Override
 					public void onResultUi(Void result) {
 						// do nothing, this fragment is gone already
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
index bd8f9467af7292edc56e0adf96d40b1f24f240c9..a14bbc0d574fd6ca56d85892fa2ae7c5df99b4de 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
@@ -223,7 +223,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 
 	private void displayContacts(final int revision,
 			final List<ContactListItem> contacts) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				if (revision == adapter.getRevision()) {
@@ -289,7 +289,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 	}
 
 	private void updateItem(final ContactId c, final BaseMessageHeader h) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				adapter.incrementRevision();
@@ -305,7 +305,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 	}
 
 	private void removeItem(final ContactId c) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				adapter.incrementRevision();
@@ -317,7 +317,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 	}
 
 	private void setConnected(final ContactId c, final boolean connected) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				adapter.incrementRevision();
diff --git a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java
index bb5d1eee0a231c2983aaa4c093c0ae0ac923519f..2afce83162282ceba6787edbe82ddb17d963b1d3 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumListFragment.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumListFragment.java
@@ -178,7 +178,7 @@ public class ForumListFragment extends BaseEventFragment implements
 
 	private void displayForums(final int revision,
 			final Collection<ForumListItem> forums) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				if (revision == adapter.getRevision()) {
@@ -214,7 +214,7 @@ public class ForumListFragment extends BaseEventFragment implements
 	}
 
 	private void displayAvailableForums(final int availableCount) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				if (availableCount == 0) {
@@ -257,7 +257,7 @@ public class ForumListFragment extends BaseEventFragment implements
 	}
 
 	private void updateItem(final GroupId g, final ForumPostHeader m) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				adapter.incrementRevision();
@@ -272,7 +272,7 @@ public class ForumListFragment extends BaseEventFragment implements
 	}
 
 	private void removeForum(final GroupId g) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				adapter.incrementRevision();
diff --git a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java
index 223c01367e28fb25a7a49b9e204941cca5c8f61e..594cd841fc205249fd1472b1fb196685d635b25b 100644
--- a/briar-android/src/org/briarproject/android/fragment/BaseFragment.java
+++ b/briar-android/src/org/briarproject/android/fragment/BaseFragment.java
@@ -1,7 +1,9 @@
 package org.briarproject.android.fragment;
 
+import android.app.Activity;
 import android.content.Context;
 import android.os.Bundle;
+import android.support.annotation.CallSuper;
 import android.support.annotation.Nullable;
 import android.support.annotation.UiThread;
 import android.support.v4.app.Fragment;
@@ -33,7 +35,6 @@ public abstract class BaseFragment extends Fragment
 		setHasOptionsMenu(true);
 	}
 
-
 	@Override
 	public void onActivityCreated(@Nullable Bundle savedInstanceState) {
 		super.onActivityCreated(savedInstanceState);
@@ -54,10 +55,11 @@ public abstract class BaseFragment extends Fragment
 
 	@UiThread
 	protected void finish() {
-		getActivity().supportFinishAfterTransition();
+		if (!isDetached())
+			getActivity().supportFinishAfterTransition();
 	}
 
-	public interface BaseFragmentListener extends DestroyableContext {
+	public interface BaseFragmentListener {
 
 		@Deprecated
 		void runOnDbThread(Runnable runnable);
@@ -72,8 +74,21 @@ public abstract class BaseFragment extends Fragment
 		void onFragmentCreated(String tag);
 	}
 
+	@CallSuper
 	@Override
-	public void runOnUiThreadUnlessDestroyed(Runnable r) {
-		listener.runOnUiThreadUnlessDestroyed(r);
+	public void runOnUiThreadUnlessDestroyed(final Runnable r) {
+		final Activity activity = getActivity();
+		if (activity != null) {
+			activity.runOnUiThread(new Runnable() {
+				@Override
+				public void run() {
+					// Note that we don't have to check if the activity has
+					// been destroyed as the Fragment has not been detached yet
+					if (!isDetached() && !activity.isFinishing()) {
+						r.run();
+					}
+				}
+			});
+		}
 	}
 }
diff --git a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java
index 0f4704ca9c20e04a93e3989056ae62b19101095f..6e67eb867ae034672ceea7fc4ba28f0bc245e60d 100644
--- a/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java
+++ b/briar-android/src/org/briarproject/android/keyagreement/ShowQrCodeFragment.java
@@ -272,7 +272,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 			KeyAgreementAbortedEvent event = (KeyAgreementAbortedEvent) e;
 			keyAgreementAborted(event.didRemoteAbort());
 		} else if (e instanceof KeyAgreementFinishedEvent) {
-			listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+			runOnUiThreadUnlessDestroyed(new Runnable() {
 				@Override
 				public void run() {
 					mainProgressContainer.setVisibility(VISIBLE);
@@ -313,7 +313,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 	}
 
 	private void setQrCode(final Payload localPayload) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				generateBitmapQR(localPayload);
@@ -322,7 +322,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 	}
 
 	private void keyAgreementFailed() {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				reset();
@@ -334,7 +334,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 	}
 
 	private void keyAgreementWaiting() {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				status.setText(R.string.waiting_for_contact_to_scan);
@@ -343,7 +343,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 	}
 
 	private void keyAgreementStarted() {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				mainProgressContainer.setVisibility(VISIBLE);
@@ -353,7 +353,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 	}
 
 	private void keyAgreementAborted(final boolean remoteAborted) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				reset();
@@ -370,7 +370,7 @@ public class ShowQrCodeFragment extends BaseEventFragment
 
 	@Override
 	public void handleResult(final Result result) {
-		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
+		runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				LOG.info("Got result from decoder");
diff --git a/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java b/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java
index 64727401dc37727b4b04e227267afaa6277924d0..ec9f94b9f446b6b156de50696ab569efaaefbb4f 100644
--- a/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java
+++ b/briar-android/src/org/briarproject/android/privategroup/list/GroupListFragment.java
@@ -126,7 +126,7 @@ public class GroupListFragment extends BaseFragment implements
 	@Override
 	public void onGroupRemoveClick(GroupItem item) {
 		controller.removeGroup(item.getId(),
-				new UiResultExceptionHandler<Void, DbException>(listener) {
+				new UiResultExceptionHandler<Void, DbException>(this) {
 					@Override
 					public void onResultUi(Void result) {
 						// handled by GroupRemovedEvent and onGroupRemoved()
@@ -173,7 +173,7 @@ public class GroupListFragment extends BaseFragment implements
 		final int revision = adapter.getRevision();
 		controller.loadGroups(
 				new UiResultExceptionHandler<Collection<GroupItem>, DbException>(
-						listener) {
+						this) {
 					@Override
 					public void onResultUi(Collection<GroupItem> groups) {
 						if (revision == adapter.getRevision()) {