diff --git a/Sources/Integration/Session/Session+Chat.swift b/Sources/Integration/Session/Session+Chat.swift
index 97c2b8ed51d8993df873ddd624c1d04672d4d093..b8d6e02d45f0cb6681fe206a31c117d7807a70c5 100644
--- a/Sources/Integration/Session/Session+Chat.swift
+++ b/Sources/Integration/Session/Session+Chat.swift
@@ -252,16 +252,16 @@ extension Session {
             }
 
             if completed {
-                guard let rawFile = try? manager.downloadFileFromTransfer(with: transfer.id) else { return }
-                _ = try! FileManager.store(data: rawFile, name: transfer.name, type: transfer.type)
-
-                var transfer = transfer
-                transfer.data = rawFile
-                transfer.progress = 1.0
-                _ = try? self.dbManager.saveFileTransfer(transfer)
-
-                message.status = .received
-                _ = try? self.dbManager.saveMessage(message)
+                if let data = try? manager.downloadFileFromTransfer(with: transfer.id),
+                   let _ = try? FileManager.store(data: data, name: transfer.name, type: transfer.type) {
+                    var transfer = transfer
+                    transfer.data = data
+                    transfer.progress = 1.0
+                    message.status = .received
+
+                    _ = try? self.dbManager.saveFileTransfer(transfer)
+                    _ = try? self.dbManager.saveMessage(message)
+                }
             } else {
                 self.progressTransferWith(tid: transfer.id, arrived: Float(arrived), total: Float(total))
             }
diff --git a/Sources/Integration/Session/Session.swift b/Sources/Integration/Session/Session.swift
index d449c95dc91d2810f841b59bf214fbdb856a0179..ae01b853ac2ac24d7e8427f3a868dcb18b34dcde 100644
--- a/Sources/Integration/Session/Session.swift
+++ b/Sources/Integration/Session/Session.swift
@@ -261,10 +261,16 @@ public final class Session: SessionType {
             var transfer = transfer
 
             do {
-                try client.transferManager?.listenDownloadFromTransfer(with: transfer.id) { completed, received, total, error in
+                try client.transferManager?.listenDownloadFromTransfer(with: transfer.id) { [weak self] completed, received, total, error in
+                    guard let self = self else { return }
                     if completed {
                         transfer.progress = 1.0
                         message.status = .received
+
+                        if let data = try? self.client.transferManager?.downloadFileFromTransfer(with: transfer.id),
+                           let _ = try? FileManager.store(data: data, name: transfer.name, type: transfer.type) {
+                            transfer.data = data
+                        }
                     } else {
                         if error != nil {
                             message.status = .receivingFailed
@@ -304,10 +310,14 @@ public final class Session: SessionType {
             var transfer = transfer
 
             do {
-                try client.transferManager?.listenUploadFromTransfer(with: transfer.id) { completed, sent, arrived, total, error in
+                try client.transferManager?.listenUploadFromTransfer(with: transfer.id) { [weak self] completed, sent, arrived, total, error in
+                    guard let self = self else { return }
+
                     if completed {
                         transfer.progress = 1.0
                         message.status = .sent
+
+                        try? self.client.transferManager?.endTransferUpload(with: transfer.id)
                     } else {
                         if error != nil {
                             message.status = .sendingFailed