diff --git a/src/calladapter.cpp b/src/calladapter.cpp
index c3b27152a24ddad58c12cfc2a8e3d5fa6e2fa901..9acffcc29c14a8620f7d0a6de10fc6a1585fecca 100644
--- a/src/calladapter.cpp
+++ b/src/calladapter.cpp
@@ -469,6 +469,29 @@ CallAdapter::connectCallModel(const QString& accountId)
 
             emit LRCInstance::instance().updateSmartList();
         });
+
+    remoteRecordingChangedConnection_ = QObject::connect(
+        accInfo.callModel.get(),
+        &lrc::api::NewCallModel::remoteRecordingChanged,
+        [this](const QString& callId, const QSet<QString>& peerRec, bool state) {
+            const auto currentCallId =
+                    LRCInstance::getCallIdForConversationUid(convUid_, accountId_);
+            if (callId == currentCallId) {
+                const auto& accInfo = LRCInstance::getCurrentAccountInfo();
+                QStringList peers {};
+                for (const auto& uri: peerRec) {
+                    auto bestName = accInfo.contactModel->bestNameForContact(uri);
+                    if (!bestName.isEmpty()) {
+                        peers.append(bestName);
+                    }
+                }
+                if (!peers.isEmpty()) {
+                    emit remoteRecordingChanged(peers, true);
+                } else if (!state) {
+                    emit remoteRecordingChanged(peers, false);
+                }
+            }
+    });
 }
 
 void
diff --git a/src/calladapter.h b/src/calladapter.h
index f8767b721472f94d801062d3b7dfd5377e65e10a..6d16168494db18a8101c2122a4ee151dd1e4cbfa 100644
--- a/src/calladapter.h
+++ b/src/calladapter.h
@@ -96,6 +96,7 @@ signals:
                        bool isSIP,
                        bool isConferenceCall,
                        const QString& bestName);
+    void remoteRecordingChanged(const QStringList& peers, bool state);
 
 public slots:
     void slotShowIncomingCallView(const QString& accountId,
@@ -117,6 +118,7 @@ private:
     QMetaObject::Connection onParticipantsChangedConnection_;
     QMetaObject::Connection closeIncomingCallPageConnection_;
     QMetaObject::Connection appStateChangedConnection_;
+    QMetaObject::Connection remoteRecordingChangedConnection_;
 
     /*
      * For Call Overlay
diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml
index af29f73b6e8c017e6d0eee7a8e9fec727e6f7ee7..dbb213c0d9c6793d2bcfdfad42cc58e8c67f8ec6 100644
--- a/src/constant/JamiStrings.qml
+++ b/src/constant/JamiStrings.qml
@@ -174,6 +174,11 @@ Item {
     property string name: qsTr("name")
     property string identifier: qsTr("Identifier")
 
+    // CallOverlay
+    property string isRecording: qsTr("is recording")
+    property string areRecording: qsTr("are recording")
+    property string peerStoppedRecording: qsTr("Peer stopped recording")
+
     // CallOverlayButtonGroup
     property string mute: qsTr("Mute")
     property string unmute: qsTr("Unmute")
diff --git a/src/mainview/components/CallOverlay.qml b/src/mainview/components/CallOverlay.qml
index c2956a4d06d24a9493d34ab2661a08a1752b0ea2..84dc5bd9f24b34721aa21777770f9c774b5ceccf 100644
--- a/src/mainview/components/CallOverlay.qml
+++ b/src/mainview/components/CallOverlay.qml
@@ -36,15 +36,17 @@ Rectangle {
     id: callOverlayRect
 
     property string timeText: "00:00"
-
-    signal overlayChatButtonClicked
+    property string remoteRecordingLabel: ""
 
     property var participantOverlays: []
     property var participantComponent: Qt.createComponent("ParticipantOverlay.qml")
 
-    function setRecording(isRecording) {
-        callViewContextMenu.isRecording = isRecording
-        recordingRect.visible = isRecording
+    signal overlayChatButtonClicked
+
+    function setRecording(localIsRecording) {
+        callViewContextMenu.localIsRecording = localIsRecording
+        recordingRect.visible = localIsRecording
+                || callViewContextMenu.peerIsRecording
     }
 
     function updateButtonStatus(isPaused, isAudioOnly, isAudioMuted, isVideoMuted,
@@ -52,12 +54,11 @@ Rectangle {
         callViewContextMenu.isSIP = isSIP
         callViewContextMenu.isPaused = isPaused
         callViewContextMenu.isAudioOnly = isAudioOnly
-        callViewContextMenu.isRecording = isRecording
+        callViewContextMenu.localIsRecording = isRecording
         recordingRect.visible = isRecording
         callOverlayButtonGroup.setButtonStatus(isPaused, isAudioOnly,
                                                isAudioMuted, isVideoMuted,
-                                               isRecording, isSIP,
-                                               isConferenceCall)
+                                               isSIP, isConferenceCall)
     }
 
     function updateMenu() {
@@ -91,7 +92,6 @@ Rectangle {
                 && pW >= distantRenderer.width - distantRenderer.getXOffset() * 2 - 1)
     }
 
-
     function handleParticipantsInfo(infos) {
         // TODO: in the future the conference layout should be entirely managed by the client
         videoCallOverlay.updateMenu()
@@ -185,7 +185,6 @@ Rectangle {
                 }
             }
         }
-
     }
 
     // x, y position does not need to be translated
@@ -196,6 +195,27 @@ Rectangle {
         callViewContextMenu.openMenu()
     }
 
+    function showRemoteRecording(peers, state) {
+        var label = ""
+        var i = 0
+        if (state) {
+            for (var p in peers) {
+                label += peers[p]
+                if (i !== (peers.length - 1))
+                    label += ", "
+                i += 1
+            }
+            label += " " + ((peers.length > 1)? JamiStrings.areRecording
+                                              : JamiStrings.isRecording)
+        }
+
+        remoteRecordingLabel = state? label : JamiStrings.peerStoppedRecording
+        callViewContextMenu.peerIsRecording = state
+        recordingRect.visible = callViewContextMenu.localIsRecording
+                || callViewContextMenu.peerIsRecording
+        callOverlayRectMouseArea.entered()
+    }
+
     anchors.fill: parent
 
     SipInputPanel {
@@ -212,13 +232,26 @@ Rectangle {
         onTriggered: {
             if (overlayUpperPartRect.state !== 'freezed') {
                 overlayUpperPartRect.state = 'freezed'
+                resetRecordingLabelTimer.restart()
             }
             if (callOverlayButtonGroup.state !== 'freezed') {
                 callOverlayButtonGroup.state = 'freezed'
+                resetRecordingLabelTimer.restart()
             }
         }
     }
 
+    // Timer to reset recording label text
+    Timer {
+        id: resetRecordingLabelTimer
+        interval: 1000
+        onTriggered: {
+            if (callOverlayButtonGroup.state === 'freezed'
+                    && !callViewContextMenu.peerIsRecording)
+                remoteRecordingLabel = ""
+        }
+    }
+
     Rectangle {
         id: overlayUpperPartRect
 
@@ -287,8 +320,13 @@ Rectangle {
                     id: textMetricsjamiBestNameText
                     font: jamiBestNameText.font
                     text: {
-                        if (videoCallPageRect)
-                            return videoCallPageRect.bestName
+                        if (videoCallPageRect) {
+                            if (remoteRecordingLabel === "") {
+                                return videoCallPageRect.bestName
+                            } else {
+                                return remoteRecordingLabel
+                            }
+                        }
                         return ""
                     }
                     elideWidth: overlayUpperPartRect.width / 3
@@ -299,8 +337,11 @@ Rectangle {
             Text {
                 id: callTimerText
                 Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
-                Layout.preferredWidth: overlayUpperPartRect.width / 3
+                Layout.preferredWidth: 64
+                Layout.minimumWidth: 64
                 Layout.preferredHeight: 48
+                Layout.rightMargin: recordingRect.visible?
+                                        0 : JamiTheme.preferredMarginSize
                 font.pointSize: JamiTheme.textFontSize
                 horizontalAlignment: Text.AlignRight
                 verticalAlignment: Text.AlignVCenter
@@ -310,7 +351,7 @@ Rectangle {
                     id: textMetricscallTimerText
                     font: callTimerText.font
                     text: timeText
-                    elideWidth: overlayUpperPartRect.width / 3
+                    elideWidth: overlayUpperPartRect.width / 4
                     elide: Qt.ElideRight
                 }
             }
@@ -318,6 +359,7 @@ Rectangle {
             Rectangle {
                 id: recordingRect
                 Layout.alignment: Qt.AlignVCenter | Qt.AlignRight
+                Layout.rightMargin: JamiTheme.preferredMarginSize
                 height: 16
                 width: 16
                 radius: height / 2
@@ -330,10 +372,6 @@ Rectangle {
                     ColorAnimation { from: "transparent"; to: "red"; duration: 500 }
                 }
             }
-
-            Item {
-                width: 8
-            }
         }
 
         color: "transparent"
diff --git a/src/mainview/components/CallOverlayButtonGroup.qml b/src/mainview/components/CallOverlayButtonGroup.qml
index 6d66301b40da291f3472d52f95d4487ba47c5443..b7fce991ccdcb6e0ca7ff3ec620660c40d9a9578 100644
--- a/src/mainview/components/CallOverlayButtonGroup.qml
+++ b/src/mainview/components/CallOverlayButtonGroup.qml
@@ -45,7 +45,7 @@ Rectangle {
     }
 
     function setButtonStatus(isPaused, isAudioOnly, isAudioMuted, isVideoMuted,
-                             isRecording, isSIP, isConferenceCall) {
+                             isSIP, isConferenceCall) {
         root.isModerator = CallAdapter.isCurrentModerator()
         root.isSip = isSIP
         noVideoButton.visible = !isAudioOnly
diff --git a/src/mainview/components/CallViewContextMenu.qml b/src/mainview/components/CallViewContextMenu.qml
index 9667aaf12ff22f73fc023b46a6dfc738281a495d..75919c5cdf91aac898e0fee6bd96f5ec52410e3e 100644
--- a/src/mainview/components/CallViewContextMenu.qml
+++ b/src/mainview/components/CallViewContextMenu.qml
@@ -37,7 +37,8 @@ Item {
     property bool isSIP: false
     property bool isPaused: false
     property bool isAudioOnly: false
-    property bool isRecording: false
+    property bool localIsRecording: false
+    property bool peerIsRecording: false
 
     signal pluginItemClicked
     signal transferCallButtonClicked
@@ -67,7 +68,7 @@ Item {
             ContextMenuGenerator.addMenuSeparator()
         }
 
-        ContextMenuGenerator.addMenuItem(isRecording ? JamiStrings.stopRec :
+        ContextMenuGenerator.addMenuItem(localIsRecording ? JamiStrings.stopRec :
                                                        JamiStrings.startRec,
                                          "qrc:/images/icons/av_icons/fiber_manual_record-24px.svg",
                                          function (){
diff --git a/src/mainview/components/VideoCallPage.qml b/src/mainview/components/VideoCallPage.qml
index a7897d3f02bc2ddf760ab5ea1f814d86ffbb2220..52e879d5b6e7d3cd30dfe447f486148cb7adb7e4 100644
--- a/src/mainview/components/VideoCallPage.qml
+++ b/src/mainview/components/VideoCallPage.qml
@@ -197,6 +197,10 @@ Rectangle {
                         function onShowOnHoldLabel(isPaused) {
                             videoCallOverlay.showOnHoldImage(isPaused)
                         }
+
+                        function onRemoteRecordingChanged(label, state) {
+                            videoCallOverlay.showRemoteRecording(label, state)
+                        }
                     }
 
                     onOverlayChatButtonClicked: {