diff --git a/src/manager.cpp b/src/manager.cpp
index 134983f2f9344a9c3c439f1535fb460240f727e8..4ba8b2320fa98650ec8b1e38fc82e3a40bd1b3ba 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -1681,7 +1681,7 @@ Manager::addAudio(Call& call)
             return;
         }
         pimpl_->audiodriver_->flushUrgent();
-        pimpl_->audiodriver_->flushMain();
+        getRingBufferPool().flushAllBuffers();
     }
     startAudioDriverStream();
 }
@@ -1992,7 +1992,7 @@ Manager::peerAnsweredCall(Call& call)
 
     if (pimpl_->audiodriver_) {
         std::lock_guard<std::mutex> lock(pimpl_->audioLayerMutex_);
-        pimpl_->audiodriver_->flushMain();
+        getRingBufferPool().flushAllBuffers();
         pimpl_->audiodriver_->flushUrgent();
     }
 
@@ -2209,6 +2209,7 @@ Manager::setAudioPlugin(const std::string& audioPlugin)
     bool wasStarted = pimpl_->audiodriver_->isStarted();
 
     // Recreate audio driver with new settings
+    pimpl_->audiodriver_.reset();
     pimpl_->audiodriver_.reset(audioPreference.createAudioLayer());
 
     if (pimpl_->audiodriver_ and wasStarted)
diff --git a/src/media/audio/audiolayer.cpp b/src/media/audio/audiolayer.cpp
index a9eede4a158b917d41039c090f12c1be216cd1f5..a2c4e55320de7fd82fc62b34b4e14456c4e30eb5 100644
--- a/src/media/audio/audiolayer.cpp
+++ b/src/media/audio/audiolayer.cpp
@@ -53,7 +53,6 @@ AudioLayer::~AudioLayer()
 
 void AudioLayer::hardwareFormatAvailable(AudioFormat playback)
 {
-    std::lock_guard<std::mutex> lock(mutex_);
     JAMI_DBG("Hardware audio format available : %s", playback.toString().c_str());
     audioFormat_ = Manager::instance().hardwareAudioFormatChanged(playback);
     urgentRingBuffer_.setFormat(audioFormat_);
@@ -72,7 +71,6 @@ void AudioLayer::devicesChanged()
 void AudioLayer::flushMain()
 {
     std::lock_guard<std::mutex> lock(mutex_);
-    // should pass call id
     Manager::instance().getRingBufferPool().flushAllBuffers();
 }
 
@@ -82,6 +80,12 @@ void AudioLayer::flushUrgent()
     urgentRingBuffer_.flushAll();
 }
 
+void AudioLayer::flush()
+{
+    Manager::instance().getRingBufferPool().flushAllBuffers();
+    urgentRingBuffer_.flushAll();
+}
+
 void AudioLayer::putUrgent(AudioBuffer& buffer)
 {
     std::lock_guard<std::mutex> lock(mutex_);
diff --git a/src/media/audio/audiolayer.h b/src/media/audio/audiolayer.h
index 2821555d01ea2fe7bdb8b6dc10c25cd7e0b0db28..1e42a1fb303f592cf24702a7f6d9b88ab4c77a51 100644
--- a/src/media/audio/audiolayer.h
+++ b/src/media/audio/audiolayer.h
@@ -239,6 +239,8 @@ class AudioLayer {
             return ringBuff ? ringBuff : playBuff;
         }
 
+        void flush();
+
         /**
          * True if capture is not to be used
          */
diff --git a/src/media/audio/opensl/opensllayer.cpp b/src/media/audio/opensl/opensllayer.cpp
index 3ebe3814af56e943aa27da11ae2db69fefc76dbd..12b5b74d7b13eef4ce578ca6df9a030f0e5347a0 100644
--- a/src/media/audio/opensl/opensllayer.cpp
+++ b/src/media/audio/opensl/opensllayer.cpp
@@ -64,23 +64,17 @@ OpenSLLayer::init()
     initAudioPlayback();
     initAudioCapture();
 
-    flushMain();
-    flushUrgent();
+    flush();
 }
 
 void
 OpenSLLayer::startStream()
 {
-    dcblocker_.reset();
-
-    {
-        std::lock_guard<std::mutex> lock(mutex_);
-        if (status_ != Status::Idle)
-            return;
-        status_ = Status::Starting;
-    }
-
-    JAMI_DBG("Start OpenSL audio layer");
+    std::lock_guard<std::mutex> lock(mutex_);
+    if (status_ != Status::Idle)
+        return;
+    status_ = Status::Starting;
+    JAMI_WARN("Start OpenSL audio layer");
 
     std::vector<int32_t> hw_infos;
     hw_infos.reserve(4);
@@ -89,7 +83,7 @@ OpenSLLayer::startStream()
     hardwareBuffSize_ = hw_infos[1];
     hardwareFormatAvailable(hardwareFormat_);
 
-    std::thread launcher([this](){
+    startThread_ = std::thread([this](){
         init();
         startAudioPlayback();
         startAudioCapture();
@@ -100,26 +94,23 @@ OpenSLLayer::startStream()
         }
         startedCv_.notify_all();
     });
-    launcher.detach();
 }
 
 void
 OpenSLLayer::stopStream()
 {
-    {
-        std::lock_guard<std::mutex> lock(mutex_);
-        if (status_ != Status::Started)
-            return;
-        status_ = Status::Idle;
+    std::lock_guard<std::mutex> lock(mutex_);
+    if (startThread_.joinable()) {
+        startThread_.join();
     }
-
-    JAMI_WARN("Stop OpenSL audio layer");
+    if (status_ != Status::Started)
+        return;
+    status_ = Status::Idle;
+    JAMI_WARN("Stopping OpenSL audio layer");
 
     stopAudioPlayback();
     stopAudioCapture();
-
-    flushMain();
-    flushUrgent();
+    flush();
 
     if (engineObject_ != nullptr) {
         (*engineObject_)->Destroy(engineObject_);
@@ -134,6 +125,7 @@ OpenSLLayer::stopStream()
     freeRecBufQueue_.clear();
     recBufQueue_.clear();
     bufs_.clear();
+    dcblocker_.reset();
 }
 
 std::vector<sample_buf>
diff --git a/src/media/audio/opensl/opensllayer.h b/src/media/audio/opensl/opensllayer.h
index c06d40d7718c755271ffee8d199021bceb3a46d5..4799da808a0a52bb955bccdee149eb08dd3af1e6 100644
--- a/src/media/audio/opensl/opensllayer.h
+++ b/src/media/audio/opensl/opensllayer.h
@@ -190,6 +190,7 @@ class OpenSLLayer : public AudioLayer {
         size_t hardwareBuffSize_ {BUFFER_SIZE};
 
         std::shared_ptr<RingBuffer> mainRingBuffer_;
+        std::thread startThread_;
 };
 
 }