diff --git a/src/app/mainview/components/ChatViewFooter.qml b/src/app/mainview/components/ChatViewFooter.qml
index e6b31331849a72072b452ce4d5368a8ea1b1a9b0..650b230fd12af4445b022abbb0c280a0c3a9c928 100644
--- a/src/app/mainview/components/ChatViewFooter.qml
+++ b/src/app/mainview/components/ChatViewFooter.qml
@@ -200,16 +200,6 @@ Rectangle {
             }
 
             onSendMessageButtonClicked: {
-                // Send text message
-                if (messageBar.text) {
-                    if (MessagesAdapter.editId !== "") {
-                        MessagesAdapter.editMessage(CurrentConversation.id, messageBar.text)
-                    } else {
-                        MessagesAdapter.sendMessage(messageBar.text)
-                    }
-                }
-                messageBar.textAreaObj.clearText()
-
                 // Send file messages
                 var fileCounts = dataTransferSendContainer.filesToSendListModel.rowCount()
                 for (var i = 0; i < fileCounts; i++) {
@@ -219,6 +209,16 @@ Rectangle {
                     MessagesAdapter.sendFile(filePath)
                 }
                 dataTransferSendContainer.filesToSendListModel.flush()
+                // Send text message
+                if (messageBar.text) {
+                    if (MessagesAdapter.editId !== "") {
+                        MessagesAdapter.editMessage(CurrentConversation.id, messageBar.text)
+                    } else {
+                        MessagesAdapter.sendMessage(messageBar.text)
+                    }
+                }
+                messageBar.textAreaObj.clearText()
+                MessagesAdapter.replyToId = ""
             }
             onVideoRecordMessageButtonClicked: {
                 JamiQmlUtils.updateMessageBarButtonsPoints()
diff --git a/src/app/mainview/components/RecordBox.qml b/src/app/mainview/components/RecordBox.qml
index e907cc1832fc7847ea4696825b850e34876dd26c..4614e183a86230a5aee1893d90b6eccd49a9d814 100644
--- a/src/app/mainview/components/RecordBox.qml
+++ b/src/app/mainview/components/RecordBox.qml
@@ -113,6 +113,7 @@ Popup {
     function sendRecord() {
         if (pathRecorder !== "") {
             MessagesAdapter.sendFile(pathRecorder)
+            MessagesAdapter.replyToId = ""
         }
     }
 
diff --git a/src/app/messagesadapter.cpp b/src/app/messagesadapter.cpp
index 1481996f5b9d296301b391cab17d568a3accc53f..800371779a05414754566c5bac8454e8168d151e 100644
--- a/src/app/messagesadapter.cpp
+++ b/src/app/messagesadapter.cpp
@@ -173,7 +173,6 @@ MessagesAdapter::sendMessage(const QString& message)
     try {
         const auto convUid = lrcInstance_->get_selectedConvUid();
         lrcInstance_->getCurrentConversationModel()->sendMessage(convUid, message, replyToId_);
-        set_replyToId("");
     } catch (...) {
         qDebug() << "Exception during sendMessage:" << message;
     }
@@ -229,19 +228,15 @@ MessagesAdapter::sendFile(const QString& message)
     QString fileName = fi.fileName();
     try {
         auto convUid = lrcInstance_->get_selectedConvUid();
-        lrcInstance_->getCurrentConversationModel()->sendFile(convUid, message, fileName);
+        lrcInstance_->getCurrentConversationModel()->sendFile(convUid,
+                                                              message,
+                                                              fileName,
+                                                              replyToId_);
     } catch (...) {
         qDebug() << "Exception during sendFile";
     }
 }
 
-void
-MessagesAdapter::retryInteraction(const QString& interactionId)
-{
-    lrcInstance_->getCurrentConversationModel()
-        ->retryInteraction(lrcInstance_->get_selectedConvUid(), interactionId);
-}
-
 void
 MessagesAdapter::joinCall(const QString& uri,
                           const QString& deviceId,
diff --git a/src/app/messagesadapter.h b/src/app/messagesadapter.h
index 992b3fc5edc9f21f7d03144b71d41b0a63315a8c..84fdd4d0d7a3683b980497de22882de3729c8b9a 100644
--- a/src/app/messagesadapter.h
+++ b/src/app/messagesadapter.h
@@ -109,7 +109,6 @@ protected:
     Q_INVOKABLE void cancelFile(const QString& arg);
     Q_INVOKABLE void openUrl(const QString& url);
     Q_INVOKABLE void openDirectory(const QString& arg);
-    Q_INVOKABLE void retryInteraction(const QString& interactionId);
     Q_INVOKABLE void deleteInteraction(const QString& interactionId);
     Q_INVOKABLE void joinCall(const QString& uri,
                               const QString& deviceId,
diff --git a/src/libclient/api/conversationmodel.h b/src/libclient/api/conversationmodel.h
index 980c23677cf89683f4c4ad83950faa7c865ae411..367ada7baa3aa46ebd0f1d271af627956e5fd542 100644
--- a/src/libclient/api/conversationmodel.h
+++ b/src/libclient/api/conversationmodel.h
@@ -284,12 +284,6 @@ public:
      * @param convId
      */
     void clearInteractionsCache(const QString& convId);
-    /**
-     * Retry to send a message. In fact, will delete the previous interaction and resend a new one.
-     * @param convId
-     * @param interactionId
-     */
-    void retryInteraction(const QString& convId, const QString& interactionId);
     /**
      * @param convId
      * @param interactionId
@@ -305,7 +299,10 @@ public:
      */
     void deleteObsoleteHistory(int date);
 
-    void sendFile(const QString& convUid, const QString& path, const QString& filename);
+    void sendFile(const QString& convUid,
+                  const QString& path,
+                  const QString& filename,
+                  const QString& parent);
 
     void acceptTransfer(const QString& convUid, const QString& interactionId);
 
diff --git a/src/libclient/api/datatransfermodel.h b/src/libclient/api/datatransfermodel.h
index 1abf8cc114884fdf2e7b58937479de23dc723100..b6769ab6e947113b8e6cfd40d79425b949809988 100644
--- a/src/libclient/api/datatransfermodel.h
+++ b/src/libclient/api/datatransfermodel.h
@@ -54,7 +54,8 @@ public:
     void sendFile(const QString& account_id,
                   const QString& conversationId,
                   const QString& file_path,
-                  const QString& display_name);
+                  const QString& display_name,
+                  const QString& parent);
 
     void fileTransferInfo(const QString& accountId,
                           const QString& conversationId,
diff --git a/src/libclient/conversationmodel.cpp b/src/libclient/conversationmodel.cpp
index 43a6d2fe8d94015de3615fa0f4dc8443f98cdd01..090f77bfda1af2c1666a7093330bcfa5f663ec8b 100644
--- a/src/libclient/conversationmodel.cpp
+++ b/src/libclient/conversationmodel.cpp
@@ -1285,8 +1285,13 @@ ConversationModel::sendMessage(const QString& uid, const QString& body, const QS
             }
 
             // Add interaction to database
-            interaction::Info
-                msg {owner.profileInfo.uri, body, std::time(nullptr), 0, interaction::Type::TEXT, status, true};
+            interaction::Info msg {owner.profileInfo.uri,
+                                   body,
+                                   std::time(nullptr),
+                                   0,
+                                   interaction::Type::TEXT,
+                                   status,
+                                   true};
             auto msgId = storage::addMessageToConversation(pimpl_->db, convId, msg);
 
             // Update conversation
@@ -1562,59 +1567,6 @@ ConversationModel::clearInteractionsCache(const QString& convId)
     }
 }
 
-void
-ConversationModel::retryInteraction(const QString& convId, const QString& interactionId)
-{
-    auto conversationIdx = pimpl_->indexOf(convId);
-    if (conversationIdx == -1)
-        return;
-
-    auto interactionType = interaction::Type::INVALID;
-    QString body = {};
-    {
-        std::lock_guard<std::mutex> lk(pimpl_->interactionsLocks[convId]);
-        try {
-            auto& conversation = pimpl_->conversations.at(conversationIdx);
-            if (conversation.isSwarm()) {
-                // WARNING: retry interaction is not implemented for swarm
-                return;
-            }
-
-            auto& interactions = conversation.interactions;
-            auto it = interactions->find(interactionId);
-            if (it == interactions->end())
-                return;
-
-            if (!interaction::isOutgoing(it->second))
-                return; // Do not retry non outgoing info
-
-            if (it->second.type == interaction::Type::TEXT
-                || (it->second.type == interaction::Type::DATA_TRANSFER
-                    && interaction::isOutgoing(it->second))) {
-                body = it->second.body;
-                interactionType = it->second.type;
-            } else
-                return;
-
-            storage::clearInteractionFromConversation(pimpl_->db, convId, interactionId);
-            conversation.interactions->erase(interactionId);
-        } catch (const std::out_of_range& e) {
-            qDebug() << "can't find interaction from conversation: " << e.what();
-            return;
-        }
-    }
-    Q_EMIT interactionRemoved(convId, interactionId);
-
-    // Send a new interaction like the previous one
-    if (interactionType == interaction::Type::TEXT) {
-        sendMessage(convId, body);
-    } else {
-        // send file
-        QFileInfo f(body);
-        sendFile(convId, body, f.fileName());
-    }
-}
-
 bool
 ConversationModel::isLastDisplayed(const QString& convId,
                                    const QString& interactionId,
@@ -3488,7 +3440,8 @@ ConversationModelPimpl::slotCallStatusChanged(const QString& callId, int code)
                     if (!conversation.callId.isEmpty()) {
                         // If outgoing and incoming happen at the same time, choose the current one.
                         auto call = linked.owner.callModel->getCall(conversation.callId);
-                        qWarning() << "Double call detected" << call::to_string(call.status) << " - " << conversation.callId;
+                        qWarning() << "Double call detected" << call::to_string(call.status)
+                                   << " - " << conversation.callId;
                         // Ignore new call in favor of existing one
                         if (call.status == call::Status::IN_PROGRESS)
                             return;
@@ -3950,12 +3903,15 @@ ConversationModel::setIsComposing(const QString& convUid, bool isComposing)
 }
 
 void
-ConversationModel::sendFile(const QString& convUid, const QString& path, const QString& filename)
+ConversationModel::sendFile(const QString& convUid,
+                            const QString& path,
+                            const QString& filename,
+                            const QString& parent)
 {
     try {
         auto& conversation = pimpl_->getConversationForUid(convUid, true).get();
         if (conversation.isSwarm()) {
-            owner.dataTransferModel->sendFile(owner.id, convUid, path, filename);
+            owner.dataTransferModel->sendFile(owner.id, convUid, path, filename, parent);
             return;
         }
         auto peers = pimpl_->peersForConversation(conversation);
@@ -3979,7 +3935,7 @@ ConversationModel::sendFile(const QString& convUid, const QString& path, const Q
 
         pimpl_->sendContactRequest(peerId);
 
-        auto cb = ([this, peerId, path, filename](QString conversationId) {
+        auto cb = ([this, peerId, path, filename, parent](QString conversationId) {
             try {
                 auto conversationOpt = getConversationForUid(conversationId);
                 if (!conversationOpt.has_value()) {
@@ -3991,7 +3947,7 @@ ConversationModel::sendFile(const QString& convUid, const QString& path, const Q
                     qDebug() << "ContactModel::sendFile: denied, contact is banned";
                     return;
                 }
-                owner.dataTransferModel->sendFile(owner.id, conversationId, path, filename);
+                owner.dataTransferModel->sendFile(owner.id, conversationId, path, filename, parent);
             } catch (...) {
             }
         });
diff --git a/src/libclient/datatransfermodel.cpp b/src/libclient/datatransfermodel.cpp
index 3e07d570e4ad892eecde3db234b76f9909689ea9..460b64578c209329633969ea21354b0fd093ca78 100644
--- a/src/libclient/datatransfermodel.cpp
+++ b/src/libclient/datatransfermodel.cpp
@@ -134,13 +134,14 @@ void
 DataTransferModel::sendFile(const QString& accountId,
                             const QString& conversationId,
                             const QString& filePath,
-                            const QString& displayName)
+                            const QString& displayName,
+                            const QString& parent)
 {
     ConfigurationManager::instance().sendFile(accountId,
                                               conversationId,
                                               filePath,
                                               displayName,
-                                              {} /* TODO parent */);
+                                              parent);
 }
 
 void