diff --git a/src/calladapter.cpp b/src/calladapter.cpp
index 58f33f78080d1162cb2c8de70b4b9ef80f71f49f..c57c3e5e6702453196edf14f67885304348cb257 100644
--- a/src/calladapter.cpp
+++ b/src/calladapter.cpp
@@ -739,16 +739,18 @@ CallAdapter::maximizeParticipant(const QString& uri)
     if (confId.isEmpty())
         confId = convInfo.callId;
     try {
+        const auto call = callModel->getCall(confId);
         auto participants = getConferencesInfos();
         for (auto part : participants) {
             auto participant = part.toJsonObject();
             if (participant["uri"].toString() == uri) {
-                participant["active"] = !participant["active"].toBool();
-                if (participant["active"].toBool()) {
+                auto active = participant["active"].toBool();
+                // Else, continue.
+                if (!active) {
                     callModel->setActiveParticipant(confId, uri);
                     callModel->setConferenceLayout(confId, lrc::api::call::Layout::ONE_WITH_SMALL);
-                } else {
-                    callModel->setConferenceLayout(confId, lrc::api::call::Layout::GRID);
+                } else if (call.layout == lrc::api::call::Layout::ONE_WITH_SMALL) {
+                    callModel->setConferenceLayout(confId, lrc::api::call::Layout::ONE);
                 }
                 return;
             }
@@ -768,13 +770,19 @@ CallAdapter::minimizeParticipant(const QString& uri)
     if (confId.isEmpty())
         confId = convInfo.callId;
     try {
+        const auto call = callModel->getCall(confId);
         auto participants = getConferencesInfos();
         for (auto& part : participants) {
             auto participant = part.toJsonObject();
             if (participant["uri"].toString() == uri) {
-                if (participant["active"].toBool()) {
-                    participant["active"] = !participant["active"].toBool();
-                    callModel->setConferenceLayout(confId, lrc::api::call::Layout::GRID);
+                auto active = participant["active"].toBool();
+                if (active) {
+                    if (call.layout == lrc::api::call::Layout::ONE) {
+                        callModel->setConferenceLayout(confId,
+                                                       lrc::api::call::Layout::ONE_WITH_SMALL);
+                    } else {
+                        callModel->setConferenceLayout(confId, lrc::api::call::Layout::GRID);
+                    }
                 }
                 return;
             }
diff --git a/src/mainview/components/ParticipantOverlay.qml b/src/mainview/components/ParticipantOverlay.qml
index 62b9bbe388ba9f1a720a72eb183be5972c38c448..4067630039c38050081ba173903cf12b9820ef28 100644
--- a/src/mainview/components/ParticipantOverlay.qml
+++ b/src/mainview/components/ParticipantOverlay.qml
@@ -46,6 +46,9 @@ Item {
     property string bestName: ""
     property string sinkId: ""
     property bool participantIsActive: false
+    property bool canMaximize: root.meModerator &&
+                                    (!root.participantIsActive
+                                    || CallParticipantsModel.conferenceLayout === CallParticipantsModel.ONE_WITH_SMALL)
     property bool participantIsHost: CallAdapter.participantIsHost(uri)
     property bool participantIsModerator: false
     property bool participantIsMuted: isLocalMuted || participantIsModeratorMuted
@@ -166,7 +169,7 @@ Item {
                     showUnsetModerator: root.meHost && !root.isMe && root.participantIsModerator
                     showModeratorMute: root.meModerator && !root.participantIsModeratorMuted
                     showModeratorUnmute: (root.meModerator || root.isMe) && root.participantIsModeratorMuted
-                    showMaximize: root.meModerator && !root.participantIsActive
+                    showMaximize: root.canMaximize
                     showMinimize: root.meModerator && root.participantIsActive
                     showHangup: root.meModerator && !root.isMe && !root.participantIsHost
                 }