diff --git a/src/callparticipantsmodel.cpp b/src/callparticipantsmodel.cpp
index 3cf22439c835684d8b45efe43ac360e1783fd19a..6bdd2ca06b45b08e5945bc3b24ffa91c7ee7d2ab 100644
--- a/src/callparticipantsmodel.cpp
+++ b/src/callparticipantsmodel.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 by Savoir-faire Linux
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  * Author: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -37,6 +37,7 @@ CallParticipantsModel::rowCount(const QModelIndex& parent) const
 {
     if (parent.isValid())
         return 0;
+    // Internal call, so no need to protect participants_ as locked higher
     return participants_.size();
 }
 
@@ -47,6 +48,7 @@ CallParticipantsModel::data(const QModelIndex& index, int role) const
         return QVariant();
 
     using namespace CallParticipant;
+    // Internal call, so no need to protect participants_ as locked higher
     auto participant = participants_.at(index.row());
 
     switch (role) {
@@ -96,6 +98,7 @@ CallParticipantsModel::roleNames() const
 void
 CallParticipantsModel::addParticipant(int index, const QVariant& infos)
 {
+    std::lock_guard<std::mutex> lk(participantsMtx_);
     if (index > participants_.size())
         return;
     beginInsertRows(QModelIndex(), index, index);
@@ -111,18 +114,22 @@ CallParticipantsModel::addParticipant(int index, const QVariant& infos)
 void
 CallParticipantsModel::updateParticipant(int index, const QVariant& infos)
 {
-    if (participants_.size() <= index)
-        return;
-    auto it = participants_.begin() + index;
-    (*it) = CallParticipant::Item {infos.toJsonObject()};
-
-    callId_ = participants_[index].item["callId"].toString();
+    {
+        std::lock_guard<std::mutex> lk(participantsMtx_);
+        if (participants_.size() <= index)
+            return;
+        auto it = participants_.begin() + index;
+        (*it) = CallParticipant::Item {infos.toJsonObject()};
+
+        callId_ = participants_[index].item["callId"].toString();
+    }
     Q_EMIT dataChanged(createIndex(index, 0), createIndex(index, 0));
 }
 
 void
 CallParticipantsModel::removeParticipant(int index)
 {
+    std::lock_guard<std::mutex> lk(participantsMtx_);
     if (participants_.size() <= index)
         return;
     callId_ = participants_[index].item["callId"].toString();
@@ -140,13 +147,17 @@ CallParticipantsModel::setParticipants(const QString& callId, const QVariantList
 {
     callId_ = callId;
 
+    std::lock_guard<std::mutex> lk(participantsMtx_);
     participants_.clear();
     reset();
 
     if (!participants.isEmpty()) {
         int idx = 0;
         for (const auto& participant : participants) {
-            addParticipant(idx, participant);
+            beginInsertRows(QModelIndex(), idx, idx);
+            auto it = participants_.begin() + idx;
+            participants_.insert(it, CallParticipant::Item {participant.toJsonObject()});
+            endInsertRows();
             idx++;
         }
     }
diff --git a/src/callparticipantsmodel.h b/src/callparticipantsmodel.h
index 0273bfb19786cc5c8fdfa16128f543476cefa321..b02d4cbc8a4b447e2c636db58c741c4fcd7aaacd 100644
--- a/src/callparticipantsmodel.h
+++ b/src/callparticipantsmodel.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 by Savoir-faire Linux
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  * Author: Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -178,6 +178,7 @@ Q_SIGNALS:
 private:
     LRCInstance* lrcInstance_ {nullptr};
 
+    std::mutex participantsMtx_;
     QList<CallParticipant::Item> participants_ {};
     QString callId_;
     LayoutType layout_;
diff --git a/src/commoncomponents/ContactMessageDelegate.qml b/src/commoncomponents/ContactMessageDelegate.qml
index 8c8c07776b191f8edfb9ae6b4adbe80eb185f401..700dbef180c2f14c231974f8614dee4fdc120206 100644
--- a/src/commoncomponents/ContactMessageDelegate.qml
+++ b/src/commoncomponents/ContactMessageDelegate.qml
@@ -42,7 +42,7 @@ Column {
 
         anchors.horizontalCenter: parent.horizontalCenter
 
-        width: childrenRect.width + 12
+        width: childrenRect.width
         height: JamiTheme.contactMessageAvatarSize + 12
         radius: JamiTheme.contactMessageAvatarSize / 2 + 6
 
@@ -51,11 +51,11 @@ Column {
         border.color: CurrentConversation.isCoreDialog ? JamiTheme.messageInBgColor : CurrentConversation.color
 
         RowLayout {
-
             anchors.verticalCenter: parent.verticalCenter
-            anchors.horizontalCenter: parent.horizontalCenter
 
             Avatar {
+                Layout.leftMargin: 6
+
                 width: JamiTheme.contactMessageAvatarSize
                 height: JamiTheme.contactMessageAvatarSize
                 visible: ActionUri !== ""
@@ -66,6 +66,8 @@ Column {
             }
 
             Label {
+                Layout.rightMargin: 6
+
                 id: textLabel
                 width: parent.width
                 text: Body
diff --git a/src/commoncomponents/EditableLineEdit.qml b/src/commoncomponents/EditableLineEdit.qml
index 0473d49a56a24bfc4dd0e576d745e83798dbba33..f097fe9ad74319a553db36239875c73fc0a68100 100644
--- a/src/commoncomponents/EditableLineEdit.qml
+++ b/src/commoncomponents/EditableLineEdit.qml
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 by Savoir-faire Linux
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  * Author: Sébastien blin <sebastien.blin@savoirfairelinux.com>
  * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
  *
diff --git a/src/currentconversation.cpp b/src/currentconversation.cpp
index 7a07fb8aff828916c7ca5bcf58af78e61d9783e4..dfa7176b8d4d757302022414e2c5301942cbb314 100644
--- a/src/currentconversation.cpp
+++ b/src/currentconversation.cpp
@@ -77,15 +77,16 @@ CurrentConversation::updateData()
             // It can be used to display add contact/conversation UI and
             // is consistently determined by the peer's uri being equal to
             // the conversation id.
-            set_isTemporary(isCoreDialog_ ? convId == uris_.at(0) : false);
+            auto members = accInfo.conversationModel->peersForConversation(convId);
+            set_isTemporary(isCoreDialog_ ? convId == members.at(0) : false);
 
             auto isContact {false};
             if (isCoreDialog_)
                 try {
-                    auto& contact = accInfo.contactModel->getContact(uris_.at(0));
+                    auto& contact = accInfo.contactModel->getContact(members.at(0));
                     isContact = contact.profileInfo.type != profile::Type::TEMPORARY;
-                } catch (...) {
-                    qInfo() << "Contact not found";
+                } catch (const std::exception& e) {
+                    qInfo() << "Contact not found: " << e.what();
                 }
             set_isContact(isContact);
         }
diff --git a/src/mainapplication.cpp b/src/mainapplication.cpp
index 66318d4bfde91e2c0eb5d26a876601bd716bd198..d031de734bd9558a3df116bb5289d879dbf01cf8 100644
--- a/src/mainapplication.cpp
+++ b/src/mainapplication.cpp
@@ -217,7 +217,7 @@ MainApplication::handleUriAction(const QString& arg)
     if (arg.isEmpty() && !runOptions_[Option::StartUri].isNull()) {
         uri = runOptions_[Option::StartUri].toString();
         qDebug() << "URI action invoked by run option" << uri;
-    } else {
+    } else if (!arg.isEmpty()) {
         uri = arg;
         qDebug() << "URI action invoked by secondary instance" << uri;
     }
diff --git a/src/mainview/components/AccountComboBox.qml b/src/mainview/components/AccountComboBox.qml
index 7dba72f5d3624e3c536c3ef5c8df23b9c3630314..3ced4196523b263ece9f4ff65c0c391685448739 100644
--- a/src/mainview/components/AccountComboBox.qml
+++ b/src/mainview/components/AccountComboBox.qml
@@ -61,9 +61,8 @@ Label {
 
     background: Rectangle {
         id: background
+        anchors.fill: parent
 
-        implicitWidth: root.width
-        implicitHeight: root.height
         color: root.popup.opened ?
                    Qt.lighter(JamiTheme.hoverColor, 1.0) :
                    mouseArea.containsMouse ?
diff --git a/src/mainview/components/AddMemberPanel.qml b/src/mainview/components/AddMemberPanel.qml
index 95cb7db6f9729c34ebefb88832d3b432e38a2914..b6bfbc86cf4b843daa24560c0bee05c2d84f9392 100644
--- a/src/mainview/components/AddMemberPanel.qml
+++ b/src/mainview/components/AddMemberPanel.qml
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2022 by Savoir-faire Linux
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  * Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -69,7 +69,7 @@ Rectangle {
                 enabled: visible
                 target: CurrentConversation
 
-                onUrisChanged: {
+                function onUrisChanged(uris) {
                     model = ContactAdapter.getContactSelectableModel(type)
                 }
             }
diff --git a/src/mainview/components/CallActionBar.qml b/src/mainview/components/CallActionBar.qml
index 939c8ea96a9eed050a0d85bb104b9a5d2d2829a7..e1d9ced4624db3969236f3aaba31358256df713a 100644
--- a/src/mainview/components/CallActionBar.qml
+++ b/src/mainview/components/CallActionBar.qml
@@ -169,11 +169,11 @@ Control {
                 var muteState = CallAdapter.getMuteState(CurrentAccount.uri)
                 var modMuted = muteState === CallAdapter.MODERATOR_MUTED
                     || muteState === CallAdapter.BOTH_MUTED
-                if (isAudioMuted && modMuted) {
+                if (muteAudioAction.checked && modMuted) {
                     muteAlertActive = true
                     muteAlertMessage = JamiStrings.participantModIsStillMuted
                 }
-                CallAdapter.muteThisCallToggle(!isAudioMuted)
+                CallAdapter.muteThisCallToggle(!muteAudioAction.checked)
             }
             checkable: true
             icon.source: checked ?
diff --git a/src/mainview/components/ChatView.qml b/src/mainview/components/ChatView.qml
index c9b34bfb0f6aa8da51328ce26097d38cb28b4617..3b038bb38756790117d8dbaf7cbe7d2532818bcb 100644
--- a/src/mainview/components/ChatView.qml
+++ b/src/mainview/components/ChatView.qml
@@ -86,8 +86,8 @@ Rectangle {
             Connections {
                 target: CurrentConversation
 
-                onUrisChanged: {
-                    if (CurrentConversation.uris.length >= 8 && addMemberPanel.visible) {
+                function onUrisChanged(uris) {
+                    if (uris && uris.length >= 8 && addMemberPanel.visible) {
                         swarmDetailsPanel.visible = false
                         addMemberPanel.visible = !addMemberPanel.visible
                     }
diff --git a/src/mainview/components/NewSwarmPage.qml b/src/mainview/components/NewSwarmPage.qml
index 10def09f99fb870fc337f29814081be63c73bafb..e28a629cf78680aadafbff9a04895a3700562be4 100644
--- a/src/mainview/components/NewSwarmPage.qml
+++ b/src/mainview/components/NewSwarmPage.qml
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2021 by Savoir-faire Linux
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  * Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
  *
  * This program is free software; you can redistribute it and/or modify
diff --git a/src/mainview/components/ParticipantControlLayout.qml b/src/mainview/components/ParticipantControlLayout.qml
index a6af7576580f81d7b7a21eaf36422a23af67cfef..b80bc6c4d9080c5bdd54350841ea53b05771bf4c 100644
--- a/src/mainview/components/ParticipantControlLayout.qml
+++ b/src/mainview/components/ParticipantControlLayout.qml
@@ -32,6 +32,8 @@ RowLayout {
                                  + minimizeParticipant.visible
                                  + hangupParticipant.visible
 
+    spacing: 8
+
     ParticipantOverlayButton {
         id: toggleModerator
 
@@ -39,6 +41,7 @@ RowLayout {
         preferredSize: iconButtonPreferredSize
         Layout.preferredHeight: buttonPreferredSize
         Layout.preferredWidth: buttonPreferredSize
+        Layout.alignment: Qt.AlignVCenter
         source: JamiResources.moderator_svg
         onClicked: CallAdapter.setModerator(uri, showSetModerator)
         toolTipText: showSetModerator? JamiStrings.setModerator
@@ -52,6 +55,7 @@ RowLayout {
         preferredSize: iconButtonPreferredSize
         Layout.preferredHeight: buttonPreferredSize
         Layout.preferredWidth: buttonPreferredSize
+        Layout.alignment: Qt.AlignVCenter
         source: showModeratorMute ?
                     JamiResources.micro_black_24dp_svg :
                     JamiResources.micro_off_black_24dp_svg
@@ -83,6 +87,7 @@ RowLayout {
         preferredSize: iconButtonPreferredSize
         Layout.preferredHeight: buttonPreferredSize
         Layout.preferredWidth: buttonPreferredSize
+        Layout.alignment: Qt.AlignVCenter
         source: JamiResources.open_in_full_24dp_svg
         onClicked: CallAdapter.maximizeParticipant(uri)
         toolTipText: JamiStrings.maximizeParticipant
@@ -95,6 +100,7 @@ RowLayout {
         preferredSize: iconButtonPreferredSize
         Layout.preferredHeight: buttonPreferredSize
         Layout.preferredWidth: buttonPreferredSize
+        Layout.alignment: Qt.AlignVCenter
         source: JamiResources.close_fullscreen_24dp_svg
         onClicked: CallAdapter.minimizeParticipant(uri)
         toolTipText: JamiStrings.minimizeParticipant
@@ -107,6 +113,7 @@ RowLayout {
         preferredSize: iconButtonPreferredSize
         Layout.preferredHeight: buttonPreferredSize
         Layout.preferredWidth: buttonPreferredSize
+        Layout.alignment: Qt.AlignVCenter
         source: JamiResources.ic_hangup_participant_24dp_svg
         onClicked: CallAdapter.hangupParticipant(uri)
         toolTipText: JamiStrings.hangupParticipant
diff --git a/src/mainview/components/ParticipantOverlay.qml b/src/mainview/components/ParticipantOverlay.qml
index 012a3268b5ef3f0fb991c4d4e96a6908c3cc90c7..2c7b4f720fdb059f1b5076f5448a18b6b12f8d23 100644
--- a/src/mainview/components/ParticipantOverlay.qml
+++ b/src/mainview/components/ParticipantOverlay.qml
@@ -93,7 +93,7 @@ Item {
         id: mediaDistRender
         anchors.fill: parent
         rendererId: root.sinkId
-        crop: true
+        crop: !participantIsActive
 
         underlayItems: Avatar {
             property real componentSize: Math.min(mediaDistRender.contentRect.width / 2, mediaDistRender.contentRect.height / 2)
diff --git a/src/mainview/components/ParticipantOverlayMenu.qml b/src/mainview/components/ParticipantOverlayMenu.qml
index 114257c8baf9329e37e27f1dd261564a13f5cccc..0b85b59068b1597ec74219f25d8aaaec13ddc1f3 100644
--- a/src/mainview/components/ParticipantOverlayMenu.qml
+++ b/src/mainview/components/ParticipantOverlayMenu.qml
@@ -85,7 +85,7 @@ Item {
         id: barComponent
 
         Control {
-            width: barButtons.implicitWidth
+            width: barButtons.implicitWidth + 16
             height: shapeHeight
             hoverEnabled: false
 
@@ -104,6 +104,9 @@ Item {
 
             ParticipantControlLayout {
                 id: barButtons
+                anchors.fill: parent
+                anchors.leftMargin: 8
+                anchors.rightMargin: 8
             }
         }
     }
diff --git a/src/mainview/components/ParticipantsLayer.qml b/src/mainview/components/ParticipantsLayer.qml
index 454cfaf6952ec8ebf7b65e77b31a3374eb8faf10..31e45d862e4f39f727d808101f659faa2ccc1a38 100644
--- a/src/mainview/components/ParticipantsLayer.qml
+++ b/src/mainview/components/ParticipantsLayer.qml
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020-2022 by Savoir-faire Linux
+ * Copyright (C) 2020-2022 Savoir-faire Linux Inc.
  * Authors: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
  *          Aline Gondim Santos <aline.gondimsantos@savoirfairelinux.com>
  *
@@ -141,9 +141,95 @@ Item {
                         radius: JamiTheme.primaryRadius
                     }
                 }
+
                 Item {
                     Layout.fillHeight: true
                     Layout.fillWidth: true
+                    Layout.margins: 4
+
+                    // GENERIC
+                    Flow {
+                        id: commonParticipantsFlow
+                        anchors.fill: parent
+
+                        anchors.leftMargin: {
+                            if (!inLine)
+                                return 0
+                            var showed = Math.min(genericParticipantsRect.showable, columns)
+                            return Math.max(0, Math.ceil((parent.width - componentWidth * showed) / 2))
+                        }
+
+                        spacing: 4
+                        property int columns: {
+                            if (inLine)
+                                return commonParticipants.count
+                            var ratio = Math.floor(root.width / root.height)
+                            // If ratio is 2 we can have 2 times more elements on each columns
+                            var wantedCol = Math.max(1, Math.round(Math.sqrt(commonParticipants.count) * ratio))
+                            var cols =  Math.min(commonParticipants.count, wantedCol)
+                            // Optimize with the rows (eg 7 with ratio 2 should have 4 and 3 items, not 6 and 1)
+                            var rows = Math.max(1, Math.ceil(commonParticipants.count/cols))
+                            return Math.min(Math.ceil(commonParticipants.count / rows), cols)
+                        }
+                        property int rows: Math.max(1, Math.ceil(commonParticipants.count/columns))
+                        property int componentWidth: {
+                            if (inLine)
+                                return height
+                            var totalSpacing = commonParticipantsFlow.spacing * commonParticipantsFlow.columns
+                            return Math.floor((commonParticipantsFlow.width - totalSpacing)/ commonParticipantsFlow.columns)
+                        }
+
+                        Repeater {
+                            id: commonParticipants
+
+                            model: GenericParticipantsFilterModel
+                            delegate: Loader {
+                                sourceComponent: callVideoMedia
+                                active: root.visible
+                                asynchronous: true
+                                visible: {
+                                    if (status !== Loader.Ready)
+                                        return false
+                                    if (inLine)
+                                        return index >= genericParticipantsRect.currentPos
+                                                && index < genericParticipantsRect.currentPos + genericParticipantsRect.showable
+                                    return true
+                                }
+                                width: commonParticipantsFlow.componentWidth + leftMargin_
+                                height: {
+                                    if (inLine || commonParticipantsFlow.rows === 1)
+                                        return genericParticipantsRect.height
+                                    var totalSpacing = commonParticipantsFlow.spacing * commonParticipantsFlow.rows
+                                    return Math.floor((genericParticipantsRect.height - totalSpacing)/ commonParticipantsFlow.rows)
+                                }
+
+                                property int leftMargin_: {
+                                    if (inLine || commonParticipantsFlow.rows === 1)
+                                        return 0
+                                    var lastParticipants = (commonParticipants.count % commonParticipantsFlow.columns)
+                                    if (lastParticipants !== 0 && index === commonParticipants.count - lastParticipants) {
+                                        var compW = commonParticipantsFlow.componentWidth + commonParticipantsFlow.spacing
+                                        var lastLineW = lastParticipants * compW
+                                        return Math.floor((commonParticipantsFlow.width - lastLineW) / 2)
+                                    }
+                                    return 0
+                                }
+
+                                property string uri_: Uri
+                                property string bestName_: BestName
+                                property string avatar_: Avatar ? Avatar : ""
+                                property string sinkId_: SinkId ? SinkId : ""
+                                property bool isLocal_: IsLocal
+                                property bool active_: Active
+                                property bool videoMuted_: VideoMuted
+                                property bool isContact_: IsContact
+                                property bool isModerator_: IsModerator
+                                property bool audioLocalMuted_: AudioLocalMuted
+                                property bool audioModeratorMuted_: AudioModeratorMuted
+                                property bool isHandRaised_: HandRaised
+                            }
+                        }
+                    }
                 }
 
                 RoundButton {
@@ -164,93 +250,6 @@ Item {
                     }
                 }
             }
-
-            Rectangle {
-                z:0
-                anchors.fill: parent
-                color: "transparent"
-
-                // GENERIC
-                Flow {
-                    id: commonParticipantsFlow
-                    anchors.left: parent.left
-                    anchors.right: parent.right
-                    anchors.top: Math.ceil((parent.height - commonParticipants.height) / 2)
-                    anchors.leftMargin: {
-                        if (!inLine)
-                            return 0
-                        var showed = Math.min(genericParticipantsRect.showable, columns)
-                        return Math.max(0, (parent.width - componentWidth * showed) / 2)
-                    }
-
-                    spacing: 3
-                    property int columns: {
-                        if (inLine)
-                            return commonParticipants.count
-                        var ratio = Math.floor(root.width / root.height)
-                        var sqrt = Math.max(1, Math.ceil(Math.sqrt(commonParticipants.count)))
-                        var wantedCol = Math.max(1, Math.round(sqrt * ratio))
-                        return Math.min(commonParticipants.count, wantedCol)
-                    }
-                    property int rows: Math.max(1, Math.ceil(commonParticipants.count/columns))
-                    property int componentWidth: {
-                        if (inLine)
-                            return height
-                        var totalSpacing = commonParticipantsFlow.spacing * commonParticipantsFlow.columns
-                        return Math.floor((genericParticipantsRect.width - totalSpacing)/ commonParticipantsFlow.columns)
-                    }
-
-                    Repeater {
-                        id: commonParticipants
-
-                        model: GenericParticipantsFilterModel
-                        delegate: Loader {
-                            sourceComponent: callVideoMedia
-                            active: root.visible
-                            asynchronous: true
-                            visible: {
-                                if (status !== Loader.Ready)
-                                    return false
-                                if (inLine)
-                                    return index >= genericParticipantsRect.currentPos
-                                            && index < genericParticipantsRect.currentPos + genericParticipantsRect.showable
-                                return true
-                            }
-                            width: commonParticipantsFlow.componentWidth + leftMargin_
-                            height: {
-                                if (inLine || commonParticipantsFlow.rows === 1)
-                                    return genericParticipantsRect.height
-                                var totalSpacing = commonParticipantsFlow.spacing * commonParticipantsFlow.rows
-                                return Math.floor((genericParticipantsRect.height - totalSpacing)/ commonParticipantsFlow.rows)
-                            }
-
-                            property int leftMargin_: {
-                                if (inLine || commonParticipantsFlow.rows === 1)
-                                    return 0
-                                if (index === commonParticipants.count - commonParticipantsFlow.columns + 1) {
-                                    var compW = commonParticipantsFlow.componentWidth + commonParticipantsFlow.spacing
-                                    var lastLineW = (commonParticipants.count % commonParticipantsFlow.columns) * compW
-                                    return (genericParticipantsRect.width - lastLineW) / 2
-                                }
-                                return 0
-                            }
-
-                            property string uri_: Uri
-                            property string bestName_: BestName
-                            property string avatar_: Avatar ? Avatar : ""
-                            property string sinkId_: SinkId ? SinkId : ""
-                            property bool isLocal_: IsLocal
-                            property bool active_: Active
-                            property bool videoMuted_: VideoMuted
-                            property bool isContact_: IsContact
-                            property bool isModerator_: IsModerator
-                            property bool audioLocalMuted_: AudioLocalMuted
-                            property bool audioModeratorMuted_: AudioModeratorMuted
-                            property bool isHandRaised_: HandRaised
-                        }
-                    }
-                }
-            }
         }
 
         // ACTIVE
diff --git a/src/mainview/components/SwarmDetailsPanel.qml b/src/mainview/components/SwarmDetailsPanel.qml
index d32b1dfc3bdb5332405f9a48f05591dde4339d2f..5ea44f1bc010032c4e012cf9e29f7cbe424edcb5 100644
--- a/src/mainview/components/SwarmDetailsPanel.qml
+++ b/src/mainview/components/SwarmDetailsPanel.qml
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2022 by Savoir-faire Linux
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  * Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
  *
  * This program is free software; you can redistribute it and/or modify
@@ -67,7 +67,7 @@ Rectangle {
 
                 text: CurrentConversation.title
                 placeholderText: JamiStrings.editTitle
-                placeholderTextColor: UtilsAdapter.luma(backgroundColor) ? JamiTheme.placeholderTextColorWhite : JamiTheme.placeholderTextColor
+                placeholderTextColor: UtilsAdapter.luma(root.color) ? JamiTheme.placeholderTextColorWhite : JamiTheme.placeholderTextColor
                 tooltipText: JamiStrings.editTitle
                 backgroundColor: root.color
                 color: UtilsAdapter.luma(backgroundColor) ?
@@ -93,7 +93,7 @@ Rectangle {
 
                 text: CurrentConversation.description
                 placeholderText: JamiStrings.editDescription
-                placeholderTextColor: UtilsAdapter.luma(backgroundColor) ? JamiTheme.placeholderTextColorWhite : JamiTheme.placeholderTextColor
+                placeholderTextColor: UtilsAdapter.luma(root.color) ? JamiTheme.placeholderTextColorWhite : JamiTheme.placeholderTextColor
                 tooltipText: JamiStrings.editDescription
                 backgroundColor: root.color
                 color: UtilsAdapter.luma(backgroundColor) ?
diff --git a/src/mainview/components/SwarmParticipantContextMenu.qml b/src/mainview/components/SwarmParticipantContextMenu.qml
index d162b737178de48d0e606b5135b6e98fe2405e5b..dff489e8bff1fc5945f4cc2f0b8a354ea2e20ae3 100644
--- a/src/mainview/components/SwarmParticipantContextMenu.qml
+++ b/src/mainview/components/SwarmParticipantContextMenu.qml
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2022 by Savoir-faire Linux
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
  * Author: Sébastien Blin <sebastien.blin@savoirfairelinux.com>
  *
  * This program is free software; you can redistribute it and/or modify
diff --git a/src/utils.cpp b/src/utils.cpp
index 3720d54ac354429bdd43ea01d7a505c9b0871adc..88465ed306202ea803ca29920a1066cb1abe0732 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -435,6 +435,8 @@ Utils::tempConversationAvatar(const QSize& size)
 QImage
 Utils::imageFromBase64String(const QString& str, bool circleCrop)
 {
+    if (str.isEmpty())
+        return {};
     return imageFromBase64Data(Utils::base64StringToByteArray(str), circleCrop);
 }
 
diff --git a/src/utilsadapter.cpp b/src/utilsadapter.cpp
index 0eaaacb4717df7971e6e8421ee4b164ccdfd4052..356e92bd9739de07712327e584d5ace607998827 100644
--- a/src/utilsadapter.cpp
+++ b/src/utilsadapter.cpp
@@ -511,10 +511,12 @@ void
 UtilsAdapter::setSwarmCreationImageFromImage(const QImage& image, const QString& imageId)
 {
     // Compress the image before saving
-    auto img = Utils::scaleAndFrame(image, QSize(256, 256));
     QByteArray ba;
     QBuffer bu(&ba);
-    img.save(&bu, "PNG");
+    if (!image.isNull()) {
+        auto img = Utils::scaleAndFrame(image, QSize(256, 256));
+        img.save(&bu, "PNG");
+    }
     // Save the image
     if (imageId == "temp") {
         QFile file(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)
diff --git a/src/wizardview/components/ProfilePage.qml b/src/wizardview/components/ProfilePage.qml
index fa6c61658caaea0546eb433f2772699ee15efa1e..cba86402d98518e19d376a929b7874a18ecfd607 100644
--- a/src/wizardview/components/ProfilePage.qml
+++ b/src/wizardview/components/ProfilePage.qml
@@ -32,13 +32,12 @@ Rectangle {
     id: root
 
     // trigger a default avatar prior to account generation
-    property string createdAccountId: "dummy"
+    property string createdAccountId
     property int preferredHeight: profilePageColumnLayout.implicitHeight
 
     signal showThisPage
 
     function initializeOnShowUp() {
-        createdAccountId = "dummy"
         clearAllTextFields()
         saveProfileBtn.spinnerTriggered = true
     }