diff --git a/CHANGELOG.md b/CHANGELOG.md
index af8b9e5db044efebd9a125c47535212e8bdfbf92..f20d747e659b3a198416d274c1d0a6620a6e8c13 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,183 @@
 # Changelog
 
+## [0.9.0] -- Unreleased
+
+### Highlights
+
+- Somewhat stable end to end encryption
+  - Show the room verification status
+  - Configure Nheko to only send to verified users
+  - Store the encryption keys securely in the OS-provided secrets service.
+  - Support online keybackup as well as sharing historical session keys.
+- Crosssigning bootstrapping
+  - Crosssigning is used to simplify the verification process. In this release
+     Nheko can setup crosssigning on a new account without having to use a
+     different client.
+  - Nheko now also prompts you, if there are any unverified devices and asks you to verify them.
+- Room directory (Manu)
+  - Search for rooms on your server and other servers. (Prezu)
+  - If their topic interests you and it has the right amount of members, join
+      the room and the discussion!
+- Custom sticker packs
+  - Add a custom sticker picker, that allows you to send stickers from MSC2545.
+  - Support creating new sticker (and emote) packs.
+  - You can share packs in a room and enable them globally or just for that
+      room.
+- Token authenticated registration (Callum)
+  - Sign up with a token to servers, that have otherwise disabled registration.
+  - This was done as part of GSoC and makes it easier to run private servers for
+      your family and friends!
+
+### Features
+
+- Support email in registration (required on matrix.org for example)
+- Warn, if an @room would mention the whole room, because some people don't like that.
+- Support device removal as well as renaming. (Thulinma)
+- Show your devices without encryption support, when showing your profile.
+    (Thulinma)
+- Move to the next room with unread messages by pressing `Alt-A`. (Symphorien)
+- Support jdenticons as a placeholder for rooms or users without avatars.
+    (LorenDB)
+  - You will need to install https://github.com/Nheko-Reborn/qt-jdenticon
+- Properly sign macOS builds.
+- Support animated images like GIF and WebP.
+  - Optionally just play them on hover.
+- Support accepting knocks in the timeline.
+- Close a room when clicking it again. (LorenDB)
+- Close image overlay with escape.
+- Support .well-known discovery during registration.
+- Limited spaces support.
+  - No nice display of nested spaces.
+  - No previews of unjoined rooms.
+  - No way to edit a space.
+- Render room avatar changes in the timeline. (BShipman)
+- Support pulling out the sidebar to make it wider.
+- Allow editing pending messages instead of blocking until they are sent.
+    (balsoft)
+- Support mnemonics in the context menus. (AppAraat)
+- Support TOFU for encryption. (Trust on first use)
+- Right click -> copy address location.
+- Forward messages. (Jedi18)
+- Alt-F to forward messages.
+
+### Improvements
+
+- Tranlation updates:
+  - French by MayeulC, ISSOtm, Glandos, Carl Schwan
+  - Dutch by Thulinma, Bas van Rossem, Glael, Thijs
+  - Esperanto by Tirifto, Colin
+  - Estonian by Priit
+  - Indonesian by Linerly
+  - German by 123, Konstantin, fnetX, Mr. X, CryptKid
+  - Portuguese (Portugal) by Tnpod, Xenovox, Gabriel R
+  - Portuguese (Brazil) by Terry, zerowhy
+  - Finnish by sdrrespudro, Priit
+  - Polish by Prezu, AXD, stabor
+  - Malayalam by vachan-maker
+  - Italian by Daniele, Lorenzo
+  - Spanish by lluise
+  - Russian by kirillpt
+  - Various wording improvements throughout.
+- Verification status and identity keys should now update properly after login.
+- Clicking the user in a read receipt opens their profile. (LorenDB)
+- Invites should now work properly on mobile.
+- Use the modern notifications on macOS.
+- Decode blurhashes faster.
+- Port various dialogs to Qml. (LorenDB)
+- Improve paste support on Windows, when mimetype detection fails and pasting
+    SVGs (Thulinma)
+- --help and --version now work, even if Nheko is already running somewhere.
+- Update emoji support to version 14.
+- Properly navigate to linked to events. (Thulinma)
+- Lots of smaller bugfixes and refactorings. (LorenDB)
+- Scroll entire profile page and properly trim contents. (Thulinma)
+- Make it easy to switch between global and room specific profiles. (Thulinma)
+- Deduplicate messages sent by the server. (Thulinma)
+- Decrease the margin of blockquotes. (tastytea)
+- Alerts now work, if the homeserver does not implement the notifications
+    endpoint. (Thulinma)
+- Right click menu now works on replies.
+- Decrypt encrypted media only in memory.
+- Don't use CC-BY in the appstream license to not confuse Gnome Software.
+- Document how to sync the repo on Gentoo. (alfasi)
+- Support online key backup.
+- Improve FAQ. (harmathy)
+- Support Backtab/Shift-Tab for moving backwards in completer selections.
+- Clear cache to support the new features.
+- Improve the emoji completer (less jitter and fix places where it didn't open). (Thomaps Karpiniec)
+- Cleanup @room escape logic.
+- Improve performance of timeline rendering.
+- Add fallback for sent stickers, so that they show on iOS.
+- Load rooms somewhat lazily.
+- Properly scale avatars to DPI.
+- Round avatars once in the backend instead of on every render.
+- Request keys of all members, when opening a room the first time.
+- Timeout TCP connections, if heartbeat can't be heard.
+- Change secrets name. You might need to rerequest your secrets after upgrading!
+- Protect against replay attacks where megolm sessions are reused.
+- Add "request keys" button to undecryptable messages.
+- Remove superfluous permissions in Flatpak.
+- Properly set window parents on Wayland.
+- Properly show users and allow opening their profiles in the members and read
+    receipt dialogs. (LorenDB)
+- Use Qt5.15 Connections syntax in Qml.
+- Remove "respond to keyrequests option". We now reply to the right requests
+    automatically and securely.
+- Show confirmation prompt when leaving a room.
+- Add trailing newline to session export for gomuks compatibility.
+- Use a fancy Nheko logo as the loading indicator.
+- Improve how the invite dialog handles users. (LorenDB)
+- Store more data about megolm sessions.
+- Speed up database queries by caching transactions.
+- Use curl for network requests.
+  - This removes the boost dependency.
+  - Proxies now work using the usual curl variables.
+  - Fixes a myriad of crashes.
+  - Faster.
+  - Less CPU load.
+  - Less bandwidth usage.
+- Cleanup user color generation.
+- Show borders around tables.
+- Improve wording of a few menu entries. (absorber)
+- Highlight navigated to message.
+
+### Bugfixes
+
+- Redaction of edited messages should now actually show those messages as removed.
+- Bootstrap after registration should run properly now.
+- Getting logged out after registration should not happen anymore.
+- Removed edgecases where identity keys could get uploaded twice.
+- Fix the event loop when fetching secrets breaking random things like scrolling.
+- Don't crash when clearing an empty timeline.
+- Opening an invite in your browser or a matrix: URI should not crash Nheko anymore or do nothing.
+- When clicking on an item in the roomlist, you don't have to move your mouse anymore, before being able to click again.
+- Don't hide space childs when viewing that specific space and its children are hidden.
+- Only allow specific URI schemes to be followed automatically.
+- Properly hide day change indicator, when loading older messages.
+- Rotate session properly when 'verified only' is set.
+- Handle missing keys in key queries properly.
+- Properly show the window title for Qml dialogs on windows.
+- Don't show decryption errors in replies.
+- Don't crash when storing secrets.
+- Don't send megolm messages to ourselves, if possible.
+- Fix SSSS without a password.
+- Fix a few edge cases with OTK upload.
+- Cache more media properly (i.e. in the Goose Chooser).
+- Inline images in messages now load properly.
+- Don't show verification requests after startup.
+- Emoji picker now follows the theme.
+- Send less newlines in the reply fallback.
+- Fix tags going missing when joining spaces.
+- Handle inline images with single quotes. (Cadair)
+- Delay key requests until a room is opened.
+- Fix rooms not showing, when groups endpoint is missing.
+- Don't use deprecated parameters in /login.
+- Fix encoding issues when translating matrix.to to matrix: URIs.
+
+### Packaging changes
+
+- Removed the AppImage
+
 ## [0.8.2] -- 2021-04-23
 
 ### Highlights
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d033d00f69ec89a0204129b0e39ae5015929be8b..0c43721f7df2e5bb2b5d43fa358677d073a6b825 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -388,7 +388,7 @@ if(USE_BUNDLED_MTXCLIENT)
 	FetchContent_Declare(
 		MatrixClient
 		GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
-		GIT_TAG        fc5d01c775bde656b6d69954189522d138efe022
+		GIT_TAG        bacb7e524ff0f38591b88b248d8d8409b7fd49a0
 		)
 	set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
 	set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
diff --git a/io.github.NhekoReborn.Nheko.yaml b/io.github.NhekoReborn.Nheko.yaml
index fdd22ea6f2cfcf706e10e5489fcb98416cb14651..af010422d66e8ac535e28449f8a9303cfaffebfe 100644
--- a/io.github.NhekoReborn.Nheko.yaml
+++ b/io.github.NhekoReborn.Nheko.yaml
@@ -163,7 +163,7 @@ modules:
     buildsystem: cmake-ninja
     name: mtxclient
     sources:
-      - commit: fc5d01c775bde656b6d69954189522d138efe022
+      - commit: bacb7e524ff0f38591b88b248d8d8409b7fd49a0
         type: git
         url: https://github.com/Nheko-Reborn/mtxclient.git
   - config-opts:
diff --git a/resources/qml/dialogs/LogoutDialog.qml b/resources/qml/dialogs/LogoutDialog.qml
index c571a89e242b7fc6e394d8f989fb6e7674794287..6098a289f85f7059a37c27ef87d12492d7149160 100644
--- a/resources/qml/dialogs/LogoutDialog.qml
+++ b/resources/qml/dialogs/LogoutDialog.qml
@@ -2,18 +2,18 @@
 //
 // SPDX-License-Identifier: GPL-3.0-or-later
 
-import Qt.labs.platform 1.1
+import Qt.labs.platform 1.1 as P
 import QtQuick 2.15
 import QtQuick.Controls 2.15
 import im.nheko 1.0
 
-MessageDialog {
+P.MessageDialog {
     id: logoutRoot
 
     title: qsTr("Log out")
     text: CallManager.isOnCall ? qsTr("A call is in progress. Log out?") : qsTr("Are you sure you want to log out?")
     modality: Qt.WindowModal
     flags: Qt.Tool | Qt.WindowStaysOnTopHint | Qt.WindowCloseButtonHint | Qt.WindowTitleHint
-    buttons: MessageDialog.Ok | MessageDialog.Cancel
+    buttons: P.MessageDialog.Ok | P.MessageDialog.Cancel
     onAccepted: Nheko.logout()
 }
diff --git a/resources/qml/dialogs/ReadReceipts.qml b/resources/qml/dialogs/ReadReceipts.qml
index 2e2b54861e61c8e6ae340cb19563b7b88da511fc..f551bae9d3a7262bf3f81ef028293b434b9e53bf 100644
--- a/resources/qml/dialogs/ReadReceipts.qml
+++ b/resources/qml/dialogs/ReadReceipts.qml
@@ -81,6 +81,7 @@ ApplicationWindow {
                             userid: model.mxid
                             url: model.avatarUrl.replace("mxc://", "image://MxcImage/")
                             displayName: model.displayName
+                            enabled: false
                         }
 
                         ColumnLayout {
diff --git a/src/Cache_p.h b/src/Cache_p.h
index a529bc374d746d84fdc69886d806addb4c33b95e..b995eed1045755767bfe5070e2ae0d478a3659ba 100644
--- a/src/Cache_p.h
+++ b/src/Cache_p.h
@@ -29,6 +29,7 @@
 
 #include "CacheCryptoStructs.h"
 #include "CacheStructs.h"
+#include "Logging.h"
 
 class Cache : public QObject
 {
@@ -518,8 +519,12 @@ private:
                 while (cursor.get(typeStrV, data, first ? MDB_FIRST_DUP : MDB_NEXT_DUP)) {
                     first = false;
 
-                    if (eventsDb.get(txn, json::parse(data)["id"].get<std::string>(), value))
-                        events.push_back(json::parse(value).get<mtx::events::StateEvent<T>>());
+                    try {
+                        if (eventsDb.get(txn, json::parse(data)["id"].get<std::string>(), value))
+                            events.push_back(json::parse(value).get<mtx::events::StateEvent<T>>());
+                    } catch (std::exception &e) {
+                        nhlog::db()->warn("Failed to parse state event: {}", e.what());
+                    }
                 }
             }
         }