diff --git a/include/mtx/events_impl.hpp b/include/mtx/events_impl.hpp
index 9ba6bf0612cf71181749c752dcb12788b4e1d8ad..5d0672daf26959199da4439198f08098c8261f06 100644
--- a/include/mtx/events_impl.hpp
+++ b/include/mtx/events_impl.hpp
@@ -5,6 +5,7 @@
 #include "mtx/events/unknown.hpp"
 
 namespace mtx::events {
+
 template<class Content>
 [[gnu::used, llvm::used]] void
 to_json(json &obj, const Event<Content> &event)
@@ -21,9 +22,20 @@ template<class Content>
 [[gnu::used, llvm::used]] void
 from_json(const json &obj, Event<Content> &event)
 {
-        event.content = obj.at("content").get<Content>();
-        event.type    = getEventType(obj.at("type").get<std::string>());
-        event.sender  = obj.value("sender", "");
+        if (obj.at("content").contains("m.new_content")) {
+                auto new_content = obj.at("content");
+                for (const auto &e : obj["content"]["m.new_content"].items()) {
+                        if (e.key() != "m.relates_to" &&
+                            e.key() != "im.nheko.relations.v1.relations")
+                                new_content[e.key()] = e.value();
+                }
+                event.content = new_content.get<Content>();
+        } else {
+                event.content = obj.at("content").get<Content>();
+        }
+
+        event.type   = getEventType(obj.at("type").get<std::string>());
+        event.sender = obj.value("sender", "");
 
         if constexpr (std::is_same_v<Unknown, Content>)
                 event.content.type = obj.at("type").get<std::string>();