diff --git a/src/app/appsettingsmanager.h b/src/app/appsettingsmanager.h
index 93298523601db6d4e8edfc00dfcb61dc4e06e024..074fb0cf85f76174fa27e4c0fc75304c361c8c8d 100644
--- a/src/app/appsettingsmanager.h
+++ b/src/app/appsettingsmanager.h
@@ -48,6 +48,7 @@ extern const QString defaultDownloadPath;
     X(BaseZoom, 1.0) \
     X(ParticipantsSide, false) \
     X(HideSelf, false) \
+    X(HideAudioOnly, false) \
     X(AutoUpdate, true) \
     X(StartMinimized, false) \
     X(ShowChatviewHorizontally, true) \
diff --git a/src/app/callparticipantsmodel.h b/src/app/callparticipantsmodel.h
index e1cc7cc0ce7adc97fe37443c6ffdb753c51afb0c..31e1597c8e5f4448e1e9a1390362af572045be70 100644
--- a/src/app/callparticipantsmodel.h
+++ b/src/app/callparticipantsmodel.h
@@ -76,6 +76,7 @@ class GenericParticipantsFilterModel final : public QSortFilterProxyModel
 {
     Q_OBJECT
     QML_PROPERTY(bool, hideSelf)
+    QML_PROPERTY(bool, hideAudioOnly)
 
 public:
     explicit GenericParticipantsFilterModel(LRCInstance* lrcInstance,
@@ -98,6 +99,11 @@ public:
             sourceModel()->rowCount() > 1 &&
             sourceModel()->data(index, CallParticipant::Role::IsLocal).toBool())
             acceptState = false;
+        if (acceptState &&
+            hideAudioOnly_ &&
+            sourceModel()->rowCount() > 1 &&
+            sourceModel()->data(index, CallParticipant::Role::VideoMuted).toBool())
+            acceptState = false;
 
         return acceptState;
     }
diff --git a/src/app/constant/JamiStrings.qml b/src/app/constant/JamiStrings.qml
index cfffa2478f9075025948f3cc6be08e295161e8e0..9d6ca31b3d85ae50424fc6b418b4a2fbbe742b4f 100644
--- a/src/app/constant/JamiStrings.qml
+++ b/src/app/constant/JamiStrings.qml
@@ -253,6 +253,7 @@ Item {
     property string participantsSide: qsTr("On the side")
     property string participantsTop: qsTr("On the top")
     property string hideSelf: qsTr("Hide self")
+    property string hideAudioOnly: qsTr("Hide participant without video")
 
     // LineEditContextMenu
     property string copy: qsTr("Copy")
diff --git a/src/app/mainview/components/CallActionBar.qml b/src/app/mainview/components/CallActionBar.qml
index f7d46453be33b649d943a7221b55be1e94539ec5..7f9e8fa5cee98c996e7eb4b9e0a8b25667699b67 100644
--- a/src/app/mainview/components/CallActionBar.qml
+++ b/src/app/mainview/components/CallActionBar.qml
@@ -176,19 +176,25 @@ Control {
                   case JamiStrings.hideSelf:
                         UtilsAdapter.setAppValue(Settings.HideSelf, !layoutModel.get(index).ActiveSetting)
                         GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf)
+                        GenericParticipantsFilterModel.hideAudioOnly = UtilsAdapter.getAppValue(Settings.HideAudioOnly)
+                        GenericParticipantsFilterModel.reset()
+                        break
+                  case JamiStrings.hideAudioOnly:
+                        UtilsAdapter.setAppValue(Settings.HideAudioOnly, !layoutModel.get(index).ActiveSetting)
+                        GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf)
+                        GenericParticipantsFilterModel.hideAudioOnly = UtilsAdapter.getAppValue(Settings.HideAudioOnly)
                         GenericParticipantsFilterModel.reset()
                         break
                 }
             }
             onTriggered: {
                 layoutModel.clear()
-                if (!isGrid && isConference) {
+                if (isConference) {
                     layoutModel.append({"Name": JamiStrings.mosaic,
                                         "IconSource": JamiResources.mosaic_black_24dp_svg,
                                         "ActiveSetting": isGrid})
                     layoutModel.append({})
-                }
-                if (isConference) {
+
                     var onTheSide = UtilsAdapter.getAppValue(Settings.ParticipantsSide)
                     layoutModel.append({"Name": onTheSide ? JamiStrings.participantsSide : JamiStrings.participantsTop,
                                         "IconSource": onTheSide ? JamiResources.ontheside_black_24dp_svg : JamiResources.onthetop_black_24dp_svg,
@@ -202,6 +208,12 @@ Control {
                 layoutModel.append({"Name": JamiStrings.viewFullScreen,
                                     "IconSource": JamiResources.open_in_full_24dp_svg,
                                     "ActiveSetting": layoutManager.isCallFullscreen})
+                if (isConference) {
+                    layoutModel.append({})
+                    layoutModel.append({"Name": JamiStrings.hideAudioOnly,
+                                        "IconSource": JamiResources.videocam_off_24dp_svg,
+                                        "ActiveSetting": UtilsAdapter.getAppValue(Settings.HideAudioOnly)})
+                }
             }
         },
         Action {
diff --git a/src/app/mainview/components/ParticipantsLayer.qml b/src/app/mainview/components/ParticipantsLayer.qml
index 87d22ae5839316221a7fb07fa676966b8ff52d61..c8a1b01f7ebb88eb497addb29f9a9d2de462762a 100644
--- a/src/app/mainview/components/ParticipantsLayer.qml
+++ b/src/app/mainview/components/ParticipantsLayer.qml
@@ -37,6 +37,7 @@ Item {
 
     onVisibleChanged: {
         GenericParticipantsFilterModel.hideSelf = UtilsAdapter.getAppValue(Settings.HideSelf)
+        GenericParticipantsFilterModel.hideAudioOnly = UtilsAdapter.getAppValue(Settings.HideAudioOnly)
     }
 
     Connections {
@@ -45,6 +46,9 @@ Item {
         function onHideSelfChanged() {
             GenericParticipantsFilterModel.reset()
         }
+        function onHideAudioOnlyChanged() {
+            GenericParticipantsFilterModel.reset()
+        }
     }
 
     Component {