diff --git a/src/ChatPage.h b/src/ChatPage.h
index 6337f800ecba4231e67d9729f25fd8944953accd..a7fb31a8add11d399edf54286a8809554b4c44d8 100644
--- a/src/ChatPage.h
+++ b/src/ChatPage.h
@@ -23,6 +23,7 @@
 
 #include <mtx/common.hpp>
 #include <mtx/responses.hpp>
+#include <mtxclient/http/errors.hpp>
 
 #include <QFrame>
 #include <QHBoxLayout>
@@ -34,7 +35,6 @@
 
 #include "CacheStructs.h"
 #include "CommunitiesList.h"
-#include "MatrixClient.h"
 #include "Utils.h"
 #include "notifications/Manager.h"
 #include "popups/UserMentions.h"
@@ -56,6 +56,10 @@ constexpr int CONSENSUS_TIMEOUT      = 1000;
 constexpr int SHOW_CONTENT_TIMEOUT   = 3000;
 constexpr int TYPING_REFRESH_TIMEOUT = 10000;
 
+namespace mtx::http {
+using RequestErr = const std::optional<mtx::http::ClientError> &;
+}
+
 class ChatPage : public QWidget
 {
         Q_OBJECT
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index d3d1ad34e0822d8cdf3f73ba3222c58e1a0cc19d..ce238d946d8fdcdcc6c197ab023c6bc8e820455d 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -11,6 +11,7 @@
 #include "ChatPage.h"
 #include "Logging.h"
 #include "MainWindow.h"
+#include "MatrixClient.h"
 #include "MxcImageProvider.h"
 #include "Olm.h"
 #include "TimelineViewManager.h"
@@ -1400,6 +1401,15 @@ TimelineModel::processOnePendingMessage()
 void
 TimelineModel::addPendingMessage(mtx::events::collections::TimelineEvents event)
 {
+        std::visit(
+          [](auto &msg) {
+                  msg.type             = mtx::events::EventType::RoomMessage;
+                  msg.event_id         = http::client()->generate_txn_id();
+                  msg.sender           = http::client()->user_id().to_string();
+                  msg.origin_server_ts = QDateTime::currentMSecsSinceEpoch();
+          },
+          event);
+
         internalAddEvents({event});
 
         QString txn_id_qstr =
diff --git a/src/timeline/TimelineModel.h b/src/timeline/TimelineModel.h
index 5391c7c10e4cd7886061d6af10e28b826ec1d7e9..7ff80c4532f5d4ee3bc10befa8c5420da137fa3b 100644
--- a/src/timeline/TimelineModel.h
+++ b/src/timeline/TimelineModel.h
@@ -8,10 +8,14 @@
 
 #include <mtx/common.hpp>
 #include <mtx/responses.hpp>
+#include <mtxclient/http/errors.hpp>
 
 #include "CacheCryptoStructs.h"
 #include "Logging.h"
-#include "MatrixClient.h"
+
+namespace mtx::http {
+using RequestErr = const std::optional<mtx::http::ClientError> &;
+}
 
 namespace qml_mtx_events {
 Q_NAMESPACE
@@ -232,13 +236,7 @@ template<class T>
 void
 TimelineModel::sendMessage(const T &msg)
 {
-        auto txn_id                       = http::client()->generate_txn_id();
         mtx::events::RoomEvent<T> msgCopy = {};
         msgCopy.content                   = msg;
-        msgCopy.type                      = mtx::events::EventType::RoomMessage;
-        msgCopy.event_id                  = txn_id;
-        msgCopy.sender                    = http::client()->user_id().to_string();
-        msgCopy.origin_server_ts          = QDateTime::currentMSecsSinceEpoch();
-
         emit newMessageToSend(msgCopy);
 }