diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 9180c3471967d329f657d9e8fa1935b765efc774..8397e330f47ff06823721ebe428d877a078c2ba4 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -1,6 +1,10 @@
 <component name="InspectionProjectProfileManager">
   <profile version="1.0">
     <option name="myName" value="Project Default" />
+    <inspection_tool class="MissingOverrideAnnotation" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ignoreObjectMethods" value="true" />
+      <option name="ignoreAnonymousClassMethods" value="false" />
+    </inspection_tool>
     <inspection_tool class="WeakerAccess" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="SUGGEST_PACKAGE_LOCAL_FOR_MEMBERS" value="true" />
       <option name="SUGGEST_PACKAGE_LOCAL_FOR_TOP_CLASSES" value="true" />
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/identity/Author.java b/bramble-api/src/main/java/org/briarproject/bramble/api/identity/Author.java
index ca7598e4919b51f9f96c081515736554e3e5cb74..d6643c252c88e98f56c887fdb09abb68c6be0ad1 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/identity/Author.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/identity/Author.java
@@ -57,6 +57,7 @@ public class Author implements Nameable {
 	/**
 	 * Returns the author's name.
 	 */
+	@Override
 	public String getName() {
 		return name;
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java b/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java
index 4fd4d167c965914049466084a50876834e2de7a4..f4a88af20bd99da20c5123b5b6d7204bc277e074 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/account/PowerView.java
@@ -146,10 +146,12 @@ abstract class PowerView extends ConstraintLayout {
 
 		static final Parcelable.Creator<SavedState> CREATOR
 				= new Parcelable.Creator<SavedState>() {
+			@Override
 			public SavedState createFromParcel(Parcel in) {
 				return new SavedState(in);
 			}
 
+			@Override
 			public SavedState[] newArray(int size) {
 				return new SavedState[size];
 			}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/account/UnlockActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/account/UnlockActivity.java
index c0e91495c36ce04b418cab5d822ee5d17e010a25..052864d2cac7d182df59590eb4f70a4a052660be 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/account/UnlockActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/account/UnlockActivity.java
@@ -51,6 +51,7 @@ public class UnlockActivity extends BaseActivity {
 		component.inject(this);
 	}
 
+	@Override
 	public void onCreate(@Nullable Bundle state) {
 		super.onCreate(state);
 		overridePendingTransition(0, 0);
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java
index f8e0184e387d88503b283e88f59b32b2aab8958c..9fa4c3cc7107ca7cf16c37f36c8357719b595747 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListViewModel.java
@@ -19,23 +19,15 @@ import org.briarproject.briar.api.conversation.ConversationManager;
 import org.briarproject.briar.api.identity.AuthorManager;
 
 import java.util.concurrent.Executor;
-import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
-import static java.util.logging.Level.WARNING;
-import static java.util.logging.Logger.getLogger;
-import static org.briarproject.bramble.util.LogUtils.logException;
-
 @NotNullByDefault
 class ContactListViewModel extends ContactsViewModel {
 
-	private static final Logger LOG =
-			getLogger(ContactListViewModel.class.getName());
-
 	private final AndroidNotificationManager notificationManager;
 
 	private final MutableLiveData<Boolean> hasPendingContacts =
@@ -76,7 +68,7 @@ class ContactListViewModel extends ContactsViewModel {
 						!contactManager.getPendingContacts().isEmpty();
 				hasPendingContacts.postValue(hasPending);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java
index e6e4254cddae05d4092827c08f5a577a319c91c6..a57c4e35e41c7b89d9ef0fb3ee0405d7612daae0 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/AddContactViewModel.java
@@ -70,7 +70,7 @@ public class AddContactViewModel extends DbViewModel {
 			try {
 				handshakeLink.postValue(contactManager.getHandshakeLink());
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 				// the UI should stay disabled in this case,
 				// leaving the user unable to proceed
 			}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java
index 8317214c135c0ca513223be7c4d5e863b3268d7d..dfcc379993b356afc965203e3427ce039d637e5d 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/add/remote/PendingContactListViewModel.java
@@ -26,25 +26,18 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.Executor;
-import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
-import static java.util.logging.Level.WARNING;
-import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.api.contact.PendingContactState.OFFLINE;
-import static org.briarproject.bramble.util.LogUtils.logException;
 
 @NotNullByDefault
 public class PendingContactListViewModel extends DbViewModel
 		implements EventListener {
 
-	private final Logger LOG =
-			getLogger(PendingContactListViewModel.class.getName());
-
 	private final ContactManager contactManager;
 	private final RendezvousPoller rendezvousPoller;
 	private final EventBus eventBus;
@@ -106,7 +99,7 @@ public class PendingContactListViewModel extends DbViewModel
 				pendingContacts.postValue(items);
 				hasInternetConnection.postValue(online);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -120,7 +113,7 @@ public class PendingContactListViewModel extends DbViewModel
 			try {
 				contactManager.removePendingContact(id);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java
index 1d477da11072a30cd6e83b306d428e69af0ee742..dcc42e49c90d07f75f6039def1389a4aaaf1ceb8 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java
@@ -237,7 +237,7 @@ public class ConversationViewModel extends DbViewModel
 			} catch (NoSuchContactException e) {
 				contactDeleted.postValue(true);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -249,7 +249,7 @@ public class ConversationViewModel extends DbViewModel
 				conversationManager.setReadFlag(g, m, true);
 				logDuration(LOG, "Marking read", start);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -261,7 +261,7 @@ public class ConversationViewModel extends DbViewModel
 						alias.isEmpty() ? null : alias);
 				loadContact(contactId);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -402,7 +402,7 @@ public class ConversationViewModel extends DbViewModel
 						autoDeleteManager.setAutoDeleteTimer(txn, c, timer));
 				autoDeleteTimer.postValue(timer);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -453,7 +453,7 @@ public class ConversationViewModel extends DbViewModel
 			try {
 				checkFeaturesAndOnboarding(contactId);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java
index 06eea08c97e1f545f144db62a8a2355f648e15f9..76e56be51531c0e3ce6cd0c5fdbfe72ab09f33bf 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumListViewModel.java
@@ -40,10 +40,8 @@ import androidx.annotation.UiThread;
 import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
-import static java.util.logging.Level.WARNING;
 import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.util.LogUtils.logDuration;
-import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.bramble.util.LogUtils.now;
 import static org.briarproject.briar.api.forum.ForumManager.CLIENT_ID;
 
@@ -126,7 +124,7 @@ class ForumListViewModel extends DbViewModel implements EventListener {
 		}
 	}
 
-	public void loadForums() {
+	void loadForums() {
 		loadFromDb(this::loadForums, forumItems::setValue);
 	}
 
@@ -169,7 +167,7 @@ class ForumListViewModel extends DbViewModel implements EventListener {
 				logDuration(LOG, "Loading available", start);
 				numInvitations.postValue(available);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java
index 4b91860929c110cf1235e3fe659ae04cc3da36e2..91c7a5613a15b80aa37e32bc2aea3711f7a4a762 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumViewModel.java
@@ -50,10 +50,8 @@ import androidx.lifecycle.MutableLiveData;
 
 import static android.widget.Toast.LENGTH_SHORT;
 import static java.lang.Math.max;
-import static java.util.logging.Level.WARNING;
 import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.util.LogUtils.logDuration;
-import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.bramble.util.LogUtils.now;
 
 @MethodsNotNullByDefault
@@ -116,6 +114,7 @@ class ForumViewModel extends ThreadListViewModel<ForumPostItem> {
 		}
 	}
 
+	@Override
 	protected void clearNotifications() {
 		notificationManager.clearForumPostNotification(groupId);
 	}
@@ -127,7 +126,7 @@ class ForumViewModel extends ThreadListViewModel<ForumPostItem> {
 				Forum f = forumManager.getForum(groupId);
 				forum.postValue(f);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 		return forum;
@@ -167,7 +166,7 @@ class ForumViewModel extends ThreadListViewModel<ForumPostItem> {
 						clock.currentTimeMillis());
 				createMessage(text, timestamp, parentId, author);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -191,7 +190,7 @@ class ForumViewModel extends ThreadListViewModel<ForumPostItem> {
 				ForumPostItem item = new ForumPostItem(header, text);
 				addItem(item, true);
 			});
-		}, e -> logException(LOG, WARNING, e));
+		}, this::handleException);
 	}
 
 	@Override
@@ -200,11 +199,12 @@ class ForumViewModel extends ThreadListViewModel<ForumPostItem> {
 			try {
 				forumManager.setReadFlag(groupId, item.getId(), true);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
 
+	@Override
 	public void loadSharingContacts() {
 		runOnDbThread(true, txn -> {
 			Collection<Contact> contacts =
@@ -212,7 +212,7 @@ class ForumViewModel extends ThreadListViewModel<ForumPostItem> {
 			Collection<ContactId> contactIds = new ArrayList<>(contacts.size());
 			for (Contact c : contacts) contactIds.add(c.getId());
 			txn.attach(() -> sharingController.addAll(contactIds));
-		}, e -> logException(LOG, WARNING, e));
+		}, this::handleException);
 	}
 
 	void deleteForum() {
@@ -220,12 +220,13 @@ class ForumViewModel extends ThreadListViewModel<ForumPostItem> {
 			try {
 				Forum f = forumManager.getForum(groupId);
 				forumManager.removeForum(f);
+				androidExecutor.runOnUiThread(() -> Toast
+						.makeText(getApplication(), R.string.forum_left_toast,
+								LENGTH_SHORT).show());
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
-		Toast.makeText(getApplication(), R.string.forum_left_toast,
-				LENGTH_SHORT).show();
 	}
 
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionViewModel.java
index 399c4f64d9d947a4cd8d4ed4cbb7febfb97752a7..77a898500bc0973df8dc9c3e62e64bb09f01498f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/introduction/IntroductionViewModel.java
@@ -154,7 +154,7 @@ class IntroductionViewModel extends ContactsViewModel {
 				introductionInfo.postValue(
 						new IntroductionInfo(c1, c2, possible));
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java
index 783922c6054c8860b06012ea06825a6ef28b13a5..670c3eb0b4bdbb600a9e6a92457e4307efd3b232 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/NavDrawerViewModel.java
@@ -94,7 +94,7 @@ public class NavDrawerViewModel extends DbViewModel {
 					}
 				}
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -109,7 +109,7 @@ public class NavDrawerViewModel extends DbViewModel {
 				settings.putInt(EXPIRY_DATE_WARNING, date);
 				settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -156,7 +156,7 @@ public class NavDrawerViewModel extends DbViewModel {
 						settings.getBoolean(SHOW_TRANSPORTS_ONBOARDING, true);
 				showTransportsOnboarding.postValue(show);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -170,7 +170,7 @@ public class NavDrawerViewModel extends DbViewModel {
 				settings.putBoolean(SHOW_TRANSPORTS_ONBOARDING, false);
 				settingsManager.mergeSettings(settings, SETTINGS_NAMESPACE);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java
index 1de04c570c1245bc082250e7de3e573bccc49994..f3a7e0810ea1d0536428c8744e47a046e5099c07 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/navdrawer/PluginViewModel.java
@@ -45,12 +45,10 @@ import static android.bluetooth.BluetoothAdapter.ACTION_STATE_CHANGED;
 import static android.bluetooth.BluetoothAdapter.EXTRA_STATE;
 import static android.bluetooth.BluetoothAdapter.STATE_ON;
 import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
 import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.api.plugin.Plugin.PREF_PLUGIN_ENABLE;
 import static org.briarproject.bramble.api.plugin.Plugin.State.STARTING_STOPPING;
 import static org.briarproject.bramble.util.LogUtils.logDuration;
-import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.bramble.util.LogUtils.now;
 
 @NotNullByDefault
@@ -197,7 +195,7 @@ public class PluginViewModel extends DbViewModel implements EventListener {
 						BluetoothConstants.DEFAULT_PREF_PLUGIN_ENABLE);
 				btEnabledSetting.postValue(bt);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -228,7 +226,7 @@ public class PluginViewModel extends DbViewModel implements EventListener {
 				settingsManager.mergeSettings(s, namespace);
 				logDuration(LOG, "Merging settings", start);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java
index 9780cc12c9cd5a074eceb3716e17d496b112a5d3..5a6281f9741c2c434e6f98c3968d007a7fd27314 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupViewModel.java
@@ -51,10 +51,8 @@ import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
 import static java.lang.Math.max;
-import static java.util.logging.Level.WARNING;
 import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.util.LogUtils.logDuration;
-import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.bramble.util.LogUtils.now;
 
 @MethodsNotNullByDefault
@@ -140,6 +138,7 @@ class GroupViewModel extends ThreadListViewModel<GroupMessageItem> {
 		loadPrivateGroup(groupId);
 	}
 
+	@Override
 	protected void clearNotifications() {
 		notificationManager.clearGroupMessageNotification(groupId);
 	}
@@ -152,7 +151,7 @@ class GroupViewModel extends ThreadListViewModel<GroupMessageItem> {
 				Author author = identityManager.getLocalAuthor();
 				isCreator.postValue(g.getCreator().equals(author));
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -210,7 +209,7 @@ class GroupViewModel extends ThreadListViewModel<GroupMessageItem> {
 				timestamp = max(clock.currentTimeMillis(), timestamp + 1);
 				createMessage(text, timestamp, parentId, author, previousMsgId);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -235,7 +234,7 @@ class GroupViewModel extends ThreadListViewModel<GroupMessageItem> {
 			txn.attach(() ->
 					addItem(buildItem(header, text), true)
 			);
-		}, e -> logException(LOG, WARNING, e));
+		}, this::handleException);
 	}
 
 	@Override
@@ -244,11 +243,12 @@ class GroupViewModel extends ThreadListViewModel<GroupMessageItem> {
 			try {
 				privateGroupManager.setReadFlag(groupId, item.getId(), true);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
 
+	@Override
 	public void loadSharingContacts() {
 		runOnDbThread(true, txn -> {
 			Collection<GroupMember> members =
@@ -259,7 +259,7 @@ class GroupViewModel extends ThreadListViewModel<GroupMessageItem> {
 					contactIds.add(m.getContactId());
 			}
 			txn.attach(() -> sharingController.addAll(contactIds));
-		}, e -> logException(LOG, WARNING, e));
+		}, this::handleException);
 	}
 
 	void deletePrivateGroup() {
@@ -267,7 +267,7 @@ class GroupViewModel extends ThreadListViewModel<GroupMessageItem> {
 			try {
 				privateGroupManager.removePrivateGroup(groupId);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java
index edd3012fca06cbb9b2f197dd227dba9ff55a563f..35f6ada3e29bef3dabad2e89aec3ab860149cb7f 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/list/GroupListViewModel.java
@@ -48,10 +48,8 @@ import androidx.lifecycle.LiveData;
 import androidx.lifecycle.MutableLiveData;
 
 import static java.util.Objects.requireNonNull;
-import static java.util.logging.Level.WARNING;
 import static java.util.logging.Logger.getLogger;
 import static org.briarproject.bramble.util.LogUtils.logDuration;
-import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.bramble.util.LogUtils.now;
 import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID;
 
@@ -202,7 +200,7 @@ class GroupListViewModel extends DbViewModel implements EventListener {
 				groupManager.removePrivateGroup(g);
 				logDuration(LOG, "Removing group", start);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -213,7 +211,7 @@ class GroupListViewModel extends DbViewModel implements EventListener {
 				int i = groupInvitationManager.getInvitations().size();
 				numInvitations.postValue(i);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java
index 9d08c290533e3a02e2c805745dd65f55f6eb1c62..ba92042f0b64998b9661d9b8e52d660cb971d6dd 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/settings/SettingsViewModel.java
@@ -152,7 +152,7 @@ class SettingsViewModel extends DbViewModel implements EventListener {
 						settingsManager.getSettings(TOR_NAMESPACE));
 				logDuration(LOG, "Loading settings", start);
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -169,7 +169,7 @@ class SettingsViewModel extends DbViewModel implements EventListener {
 				ownIdentityInfo.postValue(
 						new OwnIdentityInfo(localAuthor, authorInfo));
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java
index 5ea8f0f43161527f0461ac60e8013b025b24df47..b48063f3947e6fff69241ad62ee42f0c62e1a891 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListViewModel.java
@@ -41,9 +41,7 @@ import androidx.lifecycle.MutableLiveData;
 
 import static java.util.Objects.requireNonNull;
 import static java.util.logging.Level.INFO;
-import static java.util.logging.Level.WARNING;
 import static java.util.logging.Logger.getLogger;
-import static org.briarproject.bramble.util.LogUtils.logException;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
@@ -160,7 +158,7 @@ public abstract class ThreadListViewModel<I extends ThreadItem>
 							storedMessageId);
 				}
 			} catch (DbException e) {
-				logException(LOG, WARNING, e);
+				handleException(e);
 			}
 		});
 	}
@@ -223,7 +221,7 @@ public abstract class ThreadListViewModel<I extends ThreadItem>
 				try {
 					messageTracker.storeMessageId(groupId, messageId);
 				} catch (DbException e) {
-					logException(LOG, WARNING, e);
+					handleException(e);
 				}
 			});
 		}
diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerSession.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerSession.java
index 3c50621eb77e284fd1c4b50f4433eb292e9e4f56..70fd6c0ac9bbd4b3dbd12ef10d84f97bbbd3ce40 100644
--- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerSession.java
+++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroducerSession.java
@@ -84,6 +84,7 @@ class IntroducerSession extends Session<IntroducerState> {
 			this(sessionId, groupId, author, -1, null, null);
 		}
 
+		@Override
 		public SessionId getSessionId() {
 			return sessionId;
 		}