diff --git a/resources/qml/TimelineRow.qml b/resources/qml/TimelineRow.qml
index c5c3fde0e8f70f577ed39fbd9b8bc82d58906460..8f9090e3fab5dff5855e84ff3816ec91bcb33060 100644
--- a/resources/qml/TimelineRow.qml
+++ b/resources/qml/TimelineRow.qml
@@ -14,12 +14,23 @@ RowLayout {
 	anchors.left: parent.left
 	anchors.right: parent.right
 
-	implicitHeight: contentItem.childrenRect.height
+	implicitHeight: contentItem.height
 
-	MessageDelegate {
+	Column {
 		Layout.fillWidth: true
 		Layout.alignment: Qt.AlignTop
 		id: contentItem
+
+		//property var replyTo: model.replyTo
+
+		//Text {
+		//	property int idx: timelineManager.timeline.idToIndex(replyTo)
+		//	text: "" + (idx != -1 ? timelineManager.timeline.data(timelineManager.timeline.index(idx, 0), 2) : "nothing")
+		//}
+		MessageDelegate {
+			width: parent.width
+			height: childrenRect.height
+		}
 	}
 
 	StatusIndicator {
diff --git a/src/Utils.cpp b/src/Utils.cpp
index e27bc99520226774b2c0c87f2f1dae03b953303e..8f9e06431912fc612212762e5189f68486da2ac4 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -366,7 +366,7 @@ utils::getFormattedQuoteBody(const RelatedInfo &related, const QString &html)
 {
         return QString("<mx-reply><blockquote><a "
                        "href=\"https://matrix.to/#/%1/%2\">In reply "
-                       "to</a>* <a href=\"https://matrix.to/#/%3\">%4</a><br "
+                       "to</a> <a href=\"https://matrix.to/#/%3\">%4</a><br"
                        "/>%5</blockquote></mx-reply>")
                  .arg(related.room,
                       QString::fromStdString(related.related_event),
@@ -382,9 +382,6 @@ utils::getQuoteBody(const RelatedInfo &related)
         using MsgType = mtx::events::MessageType;
 
         switch (related.type) {
-        case MsgType::Text: {
-                return markdownToHtml(related.quoted_body);
-        }
         case MsgType::File: {
                 return QString(QCoreApplication::translate("utils", "sent a file."));
         }
diff --git a/src/timeline2/TimelineModel.cpp b/src/timeline2/TimelineModel.cpp
index bdb3ea6f57b4c47a24f04257ece541f267016266..b2b6f80329224fa7a61c288f96c18bc664b47829 100644
--- a/src/timeline2/TimelineModel.cpp
+++ b/src/timeline2/TimelineModel.cpp
@@ -13,6 +13,8 @@
 #include "Utils.h"
 #include "dialogs/RawMessage.h"
 
+Q_DECLARE_METATYPE(QModelIndex)
+
 namespace {
 template<class T>
 QString
@@ -80,12 +82,6 @@ eventFormattedBody(const mtx::events::RoomEvent<T> &e)
 {
         auto temp = e.content.formatted_body;
         if (!temp.empty()) {
-                auto pos = temp.find("<mx-reply>");
-                if (pos != std::string::npos)
-                        temp.erase(pos, std::string("<mx-reply>").size());
-                pos = temp.find("</mx-reply>");
-                if (pos != std::string::npos)
-                        temp.erase(pos, std::string("</mx-reply>").size());
                 return QString::fromStdString(temp);
         } else {
                 return QString::fromStdString(e.content.body).toHtmlEscaped().replace("\n", "<br>");
@@ -182,6 +178,21 @@ eventMimeType(const mtx::events::RoomEvent<T> &e)
         return QString::fromStdString(e.content.info.mimetype);
 }
 
+template<class T>
+QString
+eventRelatesTo(const mtx::events::Event<T> &)
+{
+        return QString();
+}
+template<class T>
+auto
+eventRelatesTo(const mtx::events::RoomEvent<T> &e) -> std::enable_if_t<
+  std::is_same<decltype(e.content.relates_to.in_reply_to.event_id), std::string>::value,
+  QString>
+{
+        return QString::fromStdString(e.content.relates_to.in_reply_to.event_id);
+}
+
 template<class T>
 qml_mtx_events::EventType
 toRoomEventType(const mtx::events::Event<T> &e)
@@ -383,6 +394,7 @@ TimelineModel::roleNames() const
           {Id, "id"},
           {State, "state"},
           {IsEncrypted, "isEncrypted"},
+          {ReplyTo, "replyTo"},
         };
 }
 int
@@ -450,8 +462,12 @@ TimelineModel::data(const QModelIndex &index, int role) const
                 return QVariant(utils::replaceEmoji(boost::apply_visitor(
                   [](const auto &e) -> QString { return eventBody(e); }, event)));
         case FormattedBody:
-                return QVariant(utils::replaceEmoji(boost::apply_visitor(
-                  [](const auto &e) -> QString { return eventFormattedBody(e); }, event)));
+                return QVariant(
+                  utils::replaceEmoji(
+                    boost::apply_visitor(
+                      [](const auto &e) -> QString { return eventFormattedBody(e); }, event))
+                    .remove("<mx-reply>")
+                    .remove("</mx-reply>"));
         case Url:
                 return QVariant(boost::apply_visitor(
                   [](const auto &e) -> QString { return eventUrl(e); }, event));
@@ -501,6 +517,11 @@ TimelineModel::data(const QModelIndex &index, int role) const
                 return boost::get<mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>>(
                          &tempEvent) != nullptr;
         }
+        case ReplyTo: {
+                QString evId = boost::apply_visitor(
+                  [](const auto &e) -> QString { return eventRelatesTo(e); }, event);
+                return QVariant(evId);
+        }
         default:
                 return QVariant();
         }
@@ -825,8 +846,11 @@ TimelineModel::replyAction(QString id)
           event);
         related.type = mtx::events::getMessageType(boost::apply_visitor(
           [](const auto &e) -> std::string { return eventMsgType(e); }, event));
-        related.quoted_body =
-          boost::apply_visitor([](const auto &e) -> QString { return eventBody(e); }, event);
+        related.quoted_body = boost::apply_visitor(
+          [](const auto &e) -> QString { return eventFormattedBody(e); }, event);
+        related.quoted_body.remove(QRegularExpression(
+          "<mx-reply>.*</mx-reply>", QRegularExpression::DotMatchesEverythingOption));
+        nhlog::ui()->debug("after replacement: {}", related.quoted_body.toStdString());
         related.room = room_id_;
 
         if (related.quoted_body.isEmpty())
diff --git a/src/timeline2/TimelineModel.h b/src/timeline2/TimelineModel.h
index 1ed6e72c6afb776a85cae8c6e41754ec8d0c0596..31e4131582cf9c819fd8c48f64e1d64ef0661b3e 100644
--- a/src/timeline2/TimelineModel.h
+++ b/src/timeline2/TimelineModel.h
@@ -139,6 +139,7 @@ public:
                 Id,
                 State,
                 IsEncrypted,
+                ReplyTo,
         };
 
         QHash<int, QByteArray> roleNames() const override;