diff --git a/include/Cache.h b/include/Cache.h
index f5a655cfd981f524a62336debe15710cf82fa9e7..3d906f02ab49b91e4dfcd71c5dcf9956b94e00a2 100644
--- a/include/Cache.h
+++ b/include/Cache.h
@@ -29,6 +29,8 @@
 #include <mtxclient/crypto/client.hpp>
 #include <mutex>
 
+#include "Logging.hpp"
+
 using mtx::events::state::JoinRule;
 
 struct RoomMember
@@ -345,7 +347,7 @@ public:
         bool isNotificationSent(const std::string &event_id);
 
         //! Mark a room that uses e2e encryption.
-        void setEncryptedRoom(const std::string &room_id);
+        void setEncryptedRoom(lmdb::txn &txn, const std::string &room_id);
         bool isRoomEncrypted(const std::string &room_id);
 
         //! Save the public keys for a device.
@@ -467,6 +469,9 @@ private:
                         }
                         }
 
+                        return;
+                } else if (mpark::holds_alternative<StateEvent<Encryption>>(event)) {
+                        setEncryptedRoom(txn, room_id);
                         return;
                 }
 
diff --git a/src/Cache.cc b/src/Cache.cc
index 397dd05f2c34a7fde485e637b420b709ba3c2680..ed4194eca4b9417b1ae1b24fb4698cc4e9f4c2df 100644
--- a/src/Cache.cc
+++ b/src/Cache.cc
@@ -183,14 +183,12 @@ Cache::setup()
 }
 
 void
-Cache::setEncryptedRoom(const std::string &room_id)
+Cache::setEncryptedRoom(lmdb::txn &txn, const std::string &room_id)
 {
         nhlog::db()->info("mark room {} as encrypted", room_id);
 
-        auto txn = lmdb::txn::begin(env_);
-        auto db  = lmdb::dbi::open(txn, ENCRYPTED_ROOMS_DB, MDB_CREATE);
+        auto db = lmdb::dbi::open(txn, ENCRYPTED_ROOMS_DB, MDB_CREATE);
         lmdb::dbi_put(txn, db, lmdb::val(room_id), lmdb::val("0"));
-        txn.commit();
 }
 
 bool
diff --git a/src/timeline/TimelineView.cc b/src/timeline/TimelineView.cc
index 270e1d9a8f27f1e0dd0a1cf803aa9ed756a32f05..d99b3a372b58c40f75ccf20eb20365de32c58282 100644
--- a/src/timeline/TimelineView.cc
+++ b/src/timeline/TimelineView.cc
@@ -284,13 +284,6 @@ TimelineView::parseMessageEvent(const mtx::events::collections::TimelineEvents &
                 auto decrypted =
                   parseEncryptedEvent(mpark::get<EncryptedEvent<msg::Encrypted>>(event));
                 return parseMessageEvent(decrypted, direction);
-        } else if (mpark::holds_alternative<StateEvent<state::Encryption>>(event)) {
-                try {
-                        cache::client()->setEncryptedRoom(room_id_.toStdString());
-                } catch (const lmdb::error &e) {
-                        nhlog::db()->critical("failed to save room {} as encrypted",
-                                              room_id_.toStdString());
-                }
         }
 
         return nullptr;