diff --git a/src/encryption/Olm.cpp b/src/encryption/Olm.cpp
index 01a16ba7cd2ad02a207c7a4aa0b062064e70c787..0931b4e30e93761e20df930a3709c4efe8011fd7 100644
--- a/src/encryption/Olm.cpp
+++ b/src/encryption/Olm.cpp
@@ -17,6 +17,7 @@
 #include "Cache_p.h"
 #include "ChatPage.h"
 #include "DeviceVerificationFlow.h"
+#include "EventAccessors.h"
 #include "Logging.h"
 #include "MatrixClient.h"
 #include "UserSettingsPage.h"
@@ -1124,8 +1125,6 @@ decryptEvent(const MegolmSessionIndex &index,
         return {DecryptionErrorCode::DbError, e.what(), std::nullopt};
     }
 
-    // TODO: Lookup index,event_id,origin_server_ts tuple for replay attack errors
-
     std::string msg_str;
     try {
         auto session = cache::client()->getInboundMegolmSession(index);
@@ -1165,12 +1164,12 @@ decryptEvent(const MegolmSessionIndex &index,
         body["origin_server_ts"] = event.origin_server_ts;
         body["unsigned"]         = event.unsigned_data;
 
-        // relations are unencrypted in content...
-        mtx::common::add_relations(body["content"], event.content.relations);
-
         mtx::events::collections::TimelineEvent te;
         mtx::events::collections::from_json(body, te);
 
+        // relations are unencrypted in content...
+        mtx::accessors::set_relations(te.data, std::move(event.content.relations));
+
         return {DecryptionErrorCode::NoError, std::nullopt, std::move(te.data)};
     } catch (std::exception &e) {
         return {DecryptionErrorCode::ParsingFailed, e.what(), std::nullopt};