diff --git a/src/app/avatarimageprovider.h b/src/app/avatarimageprovider.h
index 7d72776e8f25ca991223484370909283517e52d8..277134a9016091bcdc1e5138161268e21f6261b1 100644
--- a/src/app/avatarimageprovider.h
+++ b/src/app/avatarimageprovider.h
@@ -53,21 +53,21 @@ public:
             return {};
         }
 
-        auto imageId = idInfo.at(1);
+        const auto& imageId = idInfo.at(1);
         if (!imageId.size()) {
             qWarning() << Q_FUNC_INFO << "Missing id in the image url";
             return {};
         }
 
-        auto type = idInfo.at(0);
+        const auto& type = idInfo.at(0);
         if (type == "conversation") {
             if (imageId == "temp")
                 return Utils::tempConversationAvatar(requestedSize);
-
             return Utils::conversationAvatar(lrcInstance_, imageId, requestedSize);
-        } else if (type == "account")
+        }
+        if (type == "account")
             return Utils::accountPhoto(lrcInstance_, imageId, requestedSize);
-        else if (type == "contact")
+        if (type == "contact")
             return Utils::contactPhoto(lrcInstance_, imageId, requestedSize);
 
         qWarning() << Q_FUNC_INFO << "Missing valid prefix in the image url";
diff --git a/src/app/commoncomponents/Avatar.qml b/src/app/commoncomponents/Avatar.qml
index c495487d18f4e985c74445acb2a2cf60676b29f7..846ed3d678f1196da388aafcfbe2c9787dae6d5d 100644
--- a/src/app/commoncomponents/Avatar.qml
+++ b/src/app/commoncomponents/Avatar.qml
@@ -38,7 +38,7 @@ Item {
     property string imageId
 
     readonly property string divider: '_'
-    readonly property string baseProviderPrefix: 'image://avatarImage'
+    readonly property string baseProviderPrefix: 'image://avatarimage'
     property string typePrefix: {
         switch (mode) {
         case Avatar.Mode.Account:
diff --git a/src/app/commoncomponents/DataTransferMessageDelegate.qml b/src/app/commoncomponents/DataTransferMessageDelegate.qml
index 969d89957cd198a3609b722626d88619675cce7c..bbedbabc764c1e417af441982bacb71861f5ec69 100644
--- a/src/app/commoncomponents/DataTransferMessageDelegate.qml
+++ b/src/app/commoncomponents/DataTransferMessageDelegate.qml
@@ -88,8 +88,11 @@ Loader {
                         target: parent
                         enabled: canOpen
                         onHoveredChanged: {
-                            dataTransferItem.hoveredLink = enabled && hovered ?
-                                        ("file:///" + Body) : ""
+                            if (enabled && hovered) {
+                                dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body)
+                            } else {
+                                dataTransferItem.hoveredLink = ""
+                            }
                         }
                         cursorShape: enabled ?
                                          Qt.PointingHandCursor :
@@ -199,10 +202,12 @@ Loader {
                                                  Qt.PointingHandCursor :
                                                  Qt.ArrowCursor
                                 onClicked: function (mouse) {
-                                    dataTransferItem.hoveredLink = canOpen ?
-                                                ("file:///" + Body) : ""
-                                    if (dataTransferItem.hoveredLink)
+                                    if (canOpen) {
+                                        dataTransferItem.hoveredLink = UtilsAdapter.urlFromLocalPath(Body)
                                         Qt.openUrlExternally(new Url(dataTransferItem.hoveredLink))
+                                    } else {
+                                        dataTransferItem.hoveredLink = ""
+                                    }
                                 }
                             }
                         }
@@ -303,7 +308,7 @@ Loader {
                             antialiasing: true
                             autoTransform: true
                             asynchronous: true
-                            source: "file:///" + Body
+                            source: UtilsAdapter.urlFromLocalPath(Body)
                             property real aspectRatio: implicitWidth / implicitHeight
                             property real adjustedWidth: Math.min(maxSize,
                                                                   Math.max(minSize,
@@ -348,7 +353,7 @@ Loader {
                             antialiasing: true
                             autoTransform: true
                             asynchronous: true
-                            source: Body !== undefined ? "file:///" + Body : ''
+                            source: Body !== undefined ? UtilsAdapter.urlFromLocalPath(Body) : ''
 
                             // The sourceSize represents the maximum source dimensions.
                             // This should not be a dynamic binding, as property changes
diff --git a/src/app/imagedownloader.cpp b/src/app/imagedownloader.cpp
index 9eb0784d50d64877c558223795dedbbb285c98b1..d0b66611c08d533e64c39930ccc66786357d28a1 100644
--- a/src/app/imagedownloader.cpp
+++ b/src/app/imagedownloader.cpp
@@ -16,6 +16,7 @@
  */
 
 #include "imagedownloader.h"
+
 #include <QDir>
 #include <QLockFile>
 
@@ -38,29 +39,29 @@ ImageDownloader::downloadImage(const QUrl& url, const QString& localPath)
 void
 ImageDownloader::onDownloadImageFinished(const QByteArray& data, const QString& localPath)
 {
-    if (!data.isEmpty()) {
-        // Check if the parent folders exist create them if not
-        QString dirPath = localPath.left(localPath.lastIndexOf('/'));
-        QDir dir;
-        dir.mkpath(dirPath);
-
-        QLockFile lf(localPath + ".lock");
-        QFile file(localPath);
+    if (data.isEmpty()) {
+        Q_EMIT downloadImageFailed(localPath);
+        return;
+    }
 
-        if (!lf.lock()) {
-            qWarning().noquote() << "Can't lock file for writing: " << file.fileName();
-            return;
-        }
-        if (!file.open(QIODevice::WriteOnly)) {
-            qWarning().noquote() << "Can't open file for writing: " << file.fileName();
-            return;
-        }
+    // Make sure the parent folders exists.
+    const QString dirPath = localPath.left(localPath.lastIndexOf('/'));
+    const QDir dir;
+    if (!dir.mkpath(dirPath)) {
+        qWarning() << Q_FUNC_INFO << "Failed to create directory" << dirPath;
+        Q_EMIT downloadImageFailed(localPath);
+        return;
+    }
 
+    QLockFile lf(localPath + ".lock");
+    QFile file(localPath);
+    if (lf.lock() && file.open(QIODevice::WriteOnly)) {
         file.write(data);
         file.close();
-        qWarning() << Q_FUNC_INFO;
         Q_EMIT downloadImageSuccessful(localPath);
         return;
     }
+
+    qWarning() << Q_FUNC_INFO << "Failed to write image to" << localPath;
     Q_EMIT downloadImageFailed(localPath);
 }
diff --git a/src/app/mainview/components/CachedImage.qml b/src/app/mainview/components/CachedImage.qml
index 618277b165a8477a990f0b726ba6184c954e11c7..23f24f17e648430dd3950070cf0d84bf9e9b0031 100644
--- a/src/app/mainview/components/CachedImage.qml
+++ b/src/app/mainview/components/CachedImage.qml
@@ -42,7 +42,10 @@ Item {
         fillMode: imageFillMode
         smooth: true
         antialiasing: true
-        property bool isGif: getIsGif(this)
+        property bool isGif: {
+            // True only for local gifs.
+            UtilsAdapter.getMimeNameForUrl(source).startsWith("image/gif");
+        }
 
         source: defaultImage
         onStatusChanged: {
@@ -52,22 +55,11 @@ Item {
         }
     }
 
-    function getIsGif(img) {
-        if (img.source && img.source != "") {
-            var localPath = img.source.toString();
-            if (localPath.startsWith("file://")) {
-                localPath = localPath.substring(7);
-            }
-            return UtilsAdapter.getMimeName(localPath).startsWith("image/gif");
-        }
-        return false;
-    }
-
     Connections {
         target: ImageDownloader
         function onDownloadImageSuccessful(localPath) {
             if (localPath === cachedImage.localPath) {
-                image.source = "file://" + localPath;
+                image.source = UtilsAdapter.urlFromLocalPath(localPath);
             }
         }
     }
@@ -92,7 +84,7 @@ Item {
             if (!UtilsAdapter.fileExists(localPath)) {
                 ImageDownloader.downloadImage(downloadUrl, localPath);
             } else {
-                image.source = "file://" + localPath;
+                image.source = UtilsAdapter.urlFromLocalPath(localPath);
                 if (image.isGif) {
                     image.playing = true;
                 }
diff --git a/src/app/qmlregister.cpp b/src/app/qmlregister.cpp
index 6e2f3377b9121e5a23fde4e193777a10cc9c2f7a..7ebab391d79b46efbd0a7bb9d9921b3bcd4e8383 100644
--- a/src/app/qmlregister.cpp
+++ b/src/app/qmlregister.cpp
@@ -240,7 +240,7 @@ registerTypes(QQmlEngine* engine,
     QML_REGISTERUNCREATABLE(NS_ENUMS, VideoFormatFpsModel)
 
     engine->addImageProvider(QLatin1String("qrImage"), new QrImageProvider(lrcInstance));
-    engine->addImageProvider(QLatin1String("avatarImage"),
+    engine->addImageProvider(QLatin1String("avatarimage"),
                               new AvatarImageProvider(lrcInstance));
 
     engine->setObjectOwnership(&lrcInstance->avModel(), QQmlEngine::CppOwnership);
diff --git a/src/app/utils.cpp b/src/app/utils.cpp
index 5d664a85ed2e692ec29c823aa6d8deb97716e5c1..5a12bf33d49cdd0a9e3912d3fe3d81c0263df2fd 100644
--- a/src/app/utils.cpp
+++ b/src/app/utils.cpp
@@ -850,10 +850,9 @@ Utils::QByteArrayFromFile(const QString& filename)
     }
     if (file.open(QIODevice::ReadOnly)) {
         return file.readAll();
-    } else {
-        qDebug() << "QByteArrayFromFile: can't open file" << filename;
-        return QByteArray();
     }
+    qDebug() << "QByteArrayFromFile: can't open file" << filename;
+    return {};
 }
 
 QPixmap
@@ -938,4 +937,4 @@ QString
 Utils::getPlatformString()
 {
     return "desktop";
-}
\ No newline at end of file
+}
diff --git a/src/app/utilsadapter.cpp b/src/app/utilsadapter.cpp
index aee1138a569646737dcf0e71a7a26e9577a3c71d..386a09d80db893c6860d6488c3217a102dd8d58e 100644
--- a/src/app/utilsadapter.cpp
+++ b/src/app/utilsadapter.cpp
@@ -857,15 +857,21 @@ UtilsAdapter::getStandardTempLocation()
 }
 
 QString
-UtilsAdapter::getMimeName(const QString &filePath) const
+UtilsAdapter::getMimeNameForUrl(const QUrl& fileUrl) const
 {
     QMimeDatabase db;
-    QMimeType mime = db.mimeTypeForFile(filePath);
+    QMimeType mime = db.mimeTypeForUrl(fileUrl);
     return mime.name();
 }
 
+QUrl
+UtilsAdapter::urlFromLocalPath(const QString& filePath) const
+{
+    return QUrl::fromLocalFile(filePath);
+}
+
 #ifdef ENABLE_TESTS
-//Must only be used for testing purposes
+// Must only be used for testing purposes
 QString
 UtilsAdapter::createDummyImage() const
 {
diff --git a/src/app/utilsadapter.h b/src/app/utilsadapter.h
index 8aa5eea980e3db20c4995d6e62781778f979b9d2..6a01f510514dafc7e4a8d861196ba33440f205a2 100644
--- a/src/app/utilsadapter.h
+++ b/src/app/utilsadapter.h
@@ -156,7 +156,8 @@ public:
     Q_INVOKABLE QString base64Encode(const QString& input);
     Q_INVOKABLE bool fileExists(const QString& filePath);
     Q_INVOKABLE QString getStandardTempLocation();
-    Q_INVOKABLE QString getMimeName(const QString& filePath) const;
+    Q_INVOKABLE QString getMimeNameForUrl(const QUrl& fileUrl) const;
+    Q_INVOKABLE QUrl urlFromLocalPath(const QString& filePath) const;
 
 #ifdef ENABLE_TESTS
     Q_INVOKABLE QString createDummyImage() const;