diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp
index 72b7f97e1c2eb461859df3eadf519be3eed7c20a..852850eca2aac5ccf6f1b1ab4e7ec5ff20504989 100644
--- a/src/media/video/video_rtp_session.cpp
+++ b/src/media/video/video_rtp_session.cpp
@@ -55,6 +55,9 @@ VideoRtpSession::VideoRtpSession(const string &callID,
     , rtcpCheckerThread_(std::bind(&VideoRtpSession::setupRtcpChecker, this),
             std::bind(&VideoRtpSession::processRtcpChecker, this),
             std::bind(&VideoRtpSession::cleanupRtcpChecker, this))
+    , receiverRestartThread_([]{ return true; },
+            [this]{ processReceiverRestart(); },
+            []{})
 {}
 
 VideoRtpSession::~VideoRtpSession()
@@ -141,10 +144,12 @@ void VideoRtpSession::startReceiver()
          * we decided so to disable them for the moment
         receiveThread_->setRequestKeyFrameCallback(&SIPVoIPLink::enqueueKeyframeRequest);
         */
+        receiverRestartThread_.start();
         receiveThread_->addIOContext(*socketPair_);
         receiveThread_->startLoop();
     } else {
         RING_DBG("Video receiving disabled");
+        receiverRestartThread_.join();
         if (receiveThread_)
             receiveThread_->detach(videoMixer_.get());
         receiveThread_.reset();
@@ -200,6 +205,7 @@ void VideoRtpSession::stop()
 {
     std::lock_guard<std::recursive_mutex> lock(mutex_);
     rtcpCheckerThread_.join();
+    receiverRestartThread_.join();
 
     if (videoLocal_)
         videoLocal_->detach(sender_.get());
@@ -558,7 +564,6 @@ VideoRtpSession::checkReceiver()
 void
 VideoRtpSession::processRtcpChecker()
 {
-    checkReceiver();
     adaptQualityAndBitrate();
     rtcpCheckerThread_.wait_for(std::chrono::seconds(RTCP_CHECKING_INTERVAL));
 }
@@ -567,4 +572,11 @@ void
 VideoRtpSession::cleanupRtcpChecker()
 {}
 
+void
+VideoRtpSession::processReceiverRestart()
+{
+    checkReceiver();
+    receiverRestartThread_.wait_for(std::chrono::seconds(RECEIVER_RESTART_INTERVAL));
+}
+
 }} // namespace ring::video
diff --git a/src/media/video/video_rtp_session.h b/src/media/video/video_rtp_session.h
index 407b5da78cc340cbe0262a15a72066ac13d1b9c0..fb4681cb5ed5ea4b6a8f6c31c6596d03a7ceadad 100644
--- a/src/media/video/video_rtp_session.h
+++ b/src/media/video/video_rtp_session.h
@@ -118,6 +118,8 @@ private:
     // max size of quality and bitrate historic
     static constexpr unsigned MAX_SIZE_HISTO_QUALITY_ {30};
     static constexpr unsigned MAX_SIZE_HISTO_BITRATE_ {100};
+    // how long (in seconds) to wait before rechecking if the receiver needs to restart
+    const unsigned RECEIVER_RESTART_INTERVAL {4};
 
     // 5 tries in a row
     static constexpr unsigned  MAX_ADAPTATIVE_BITRATE_ITERATION {5};
@@ -129,6 +131,9 @@ private:
     bool setupRtcpChecker();
     void processRtcpChecker();
     void cleanupRtcpChecker();
+
+    InterruptedThreadLoop receiverRestartThread_;
+    void processReceiverRestart();
 };
 
 }} // namespace ring::video