diff --git a/src/media/audio/audio_rtp_session.cpp b/src/media/audio/audio_rtp_session.cpp
index cbb063064e34e6d3fd8bba5ae47878f947e1a200..afe335846da68bbf59e53c57b10dd9b3d7f69a62 100644
--- a/src/media/audio/audio_rtp_session.cpp
+++ b/src/media/audio/audio_rtp_session.cpp
@@ -382,7 +382,14 @@ AudioRtpSession::startSender()
     if (sender_)
         RING_WARN("Restarting audio sender");
 
+
+    // be sure to not send any packets before saving last RTP seq value
+    socketPair_->stopSendOp();
+    if (sender_)
+        initSeqVal_ = sender_->getLastSeqValue() + 1;
     try {
+        sender_.reset();
+        socketPair_->stopSendOp(false);
         sender_.reset(new AudioSender(callID_, getRemoteRtpUri(), send_,
                                       *socketPair_, initSeqVal_));
     } catch (const MediaEncoderException &e) {
@@ -395,9 +402,6 @@ void
 AudioRtpSession::restartSender()
 {
     std::lock_guard<std::recursive_mutex> lock(mutex_);
-
-    // continue on last sequence number
-    initSeqVal_ = sender_->getLastSeqValue() + 1;
     startSender();
 }
 
diff --git a/src/media/socket_pair.cpp b/src/media/socket_pair.cpp
index 9873a247ee0a6b7f9ae518fd323089e1dcf7a522..cadd00102bb0da63996747be561b3154b41ac03f 100644
--- a/src/media/socket_pair.cpp
+++ b/src/media/socket_pair.cpp
@@ -260,6 +260,12 @@ SocketPair::interrupt()
     cv_.notify_all();
 }
 
+void
+SocketPair::stopSendOp(bool state)
+{
+    noWrite_ = state;
+}
+
 void
 SocketPair::closeSockets()
 {
@@ -463,10 +469,15 @@ SocketPair::writeData(uint8_t* buf, int buf_size)
         if (ret < 0)
             return ret;
 
+        if (noWrite_)
+            return buf_size;
         return sendto(fd, reinterpret_cast<const char*>(buf), buf_size, 0,
                       reinterpret_cast<sockaddr*>(&dest_addr), dest_addr_len);
     }
 
+    if (noWrite_)
+        return buf_size;
+
     // IceSocket
     if (isRTCP)
         return rtcp_sock_->send(buf, buf_size);
diff --git a/src/media/socket_pair.h b/src/media/socket_pair.h
index bdada9d644a0e999651b5d137a8911ba769e9782..f5992e6312718d8c4d05502ddd74a1fb618ef994 100644
--- a/src/media/socket_pair.h
+++ b/src/media/socket_pair.h
@@ -93,6 +93,8 @@ class SocketPair {
         void createSRTP(const char* out_suite, const char* out_params,
                         const char* in_suite, const char* in_params);
 
+        void stopSendOp(bool state = true);
+
     private:
         NON_COPYABLE(SocketPair);
 
@@ -119,6 +121,7 @@ class SocketPair {
         sockaddr_storage rtcpDestAddr_;
         socklen_t rtcpDestAddrLen_;
         std::atomic_bool interrupted_ {false};
+        std::atomic_bool noWrite_ {false};
         std::unique_ptr<SRTPProtoContext> srtpContext_;
 };
 
diff --git a/src/media/video/video_rtp_session.cpp b/src/media/video/video_rtp_session.cpp
index 05808c468161ded38dfa0446e9dfc3963d939840..01b7fecc0d68972b617f1d1b4c927afd188b6069 100644
--- a/src/media/video/video_rtp_session.cpp
+++ b/src/media/video/video_rtp_session.cpp
@@ -89,11 +89,16 @@ void VideoRtpSession::startSender()
             }
         }
 
+
+        // be sure to not send any packets before saving last RTP seq value
+        socketPair_->stopSendOp();
+        if (sender_)
+            initSeqVal_ = sender_->getLastSeqValue() + 1;
         try {
-            sender_.reset(
-                new VideoSender(getRemoteRtpUri(), localVideoParams_,
-                    send_, *socketPair_, initSeqVal_)
-            );
+            sender_.reset();
+            socketPair_->stopSendOp(false);
+            sender_.reset(new VideoSender(getRemoteRtpUri(), localVideoParams_,
+                                          send_, *socketPair_, initSeqVal_));
         } catch (const MediaEncoderException &e) {
             RING_ERR("%s", e.what());
             send_.enabled = false;
@@ -106,8 +111,6 @@ VideoRtpSession::restartSender()
 {
     std::lock_guard<std::recursive_mutex> lock(mutex_);
 
-    // continue on last sequence number
-    initSeqVal_ = sender_->getLastSeqValue() + 1;
     startSender();
 
     if (sender_) {