diff --git a/src/avmodel.cpp b/src/avmodel.cpp
index bbd26a6cc8cb2ebd99a288db2291472d55393315..51cf7824b76d6d8374ce5a381894dafa090cc122 100644
--- a/src/avmodel.cpp
+++ b/src/avmodel.cpp
@@ -294,12 +294,12 @@ AVModel::setDeviceSettings(video::Settings& settings)
 
     // If the preview is running, reload it
     // doing this during a call will cause re-invite, this is unwanted
-    if (pimpl_->renderers_[video::PREVIEW_RENDERER_ID]) {
-        if (pimpl_->renderers_[video::PREVIEW_RENDERER_ID]->isRendering()
-            && pimpl_->renderers_.size() == 1) {
-            stopPreview(video::PREVIEW_RENDERER_ID);
-            startPreview(video::PREVIEW_RENDERER_ID);
-        }
+    std::unique_lock<std::mutex> lk(pimpl_->renderers_mtx_);
+    auto it = pimpl_->renderers_.find(video::PREVIEW_RENDERER_ID);
+    if (it->second && it->second->isRendering() && pimpl_->renderers_.size() == 1) {
+        lk.unlock();
+        stopPreview(video::PREVIEW_RENDERER_ID);
+        startPreview(video::PREVIEW_RENDERER_ID);
     }
 }
 
@@ -516,6 +516,7 @@ void
 AVModel::useAVFrame(bool useAVFrame)
 {
     pimpl_->useAVFrame_ = useAVFrame;
+    std::lock_guard<std::mutex> lk(pimpl_->renderers_mtx_);
     for (auto it = pimpl_->renderers_.cbegin(); it != pimpl_->renderers_.cend(); ++it) {
         it->second->useAVFrame(pimpl_->useAVFrame_);
     }
@@ -538,10 +539,10 @@ AVModel::getRenderer(const QString& id) const
 {
     std::lock_guard<std::mutex> lk(pimpl_->renderers_mtx_);
     auto search = pimpl_->renderers_.find(id);
-    if (search == pimpl_->renderers_.end() || !pimpl_->renderers_[id]) {
+    if (search == pimpl_->renderers_.end() || !search->second) {
         throw std::out_of_range("Can't find renderer " + id.toStdString());
     }
-    return *pimpl_->renderers_[id];
+    return *search->second;
 }
 
 #if defined(Q_OS_UNIX) && !defined(__APPLE__)
@@ -869,28 +870,26 @@ AVModelPimpl::addRenderer(const QString& id, const video::Settings& settings, co
 void
 AVModelPimpl::removeRenderer(const QString& id)
 {
-    {
-        std::lock_guard<std::mutex> lk(renderers_mtx_);
-        auto search = renderers_.find(id);
-        if (search == renderers_.end()) {
-            qWarning() << "Cannot remove renderer. " << id << "not found";
-            return;
-        }
-        disconnect(search->second.get(),
-                   &video::Renderer::frameUpdated,
-                   this,
-                   &AVModelPimpl::slotFrameUpdated);
-        connect(
-            search->second.get(),
-            &video::Renderer::stopped,
-            this,
-            [this](const QString& id) {
-                renderers_.erase(id);
-                emit linked_.rendererStopped(id);
-            },
-            Qt::DirectConnection);
-        search->second.reset();
+    std::lock_guard<std::mutex> lk(renderers_mtx_);
+    auto search = renderers_.find(id);
+    if (search == renderers_.end()) {
+        qWarning() << "Cannot remove renderer. " << id << "not found";
+        return;
     }
+    disconnect(search->second.get(),
+                &video::Renderer::frameUpdated,
+                this,
+                &AVModelPimpl::slotFrameUpdated);
+    connect(
+        search->second.get(),
+        &video::Renderer::stopped,
+        this,
+        [this](const QString& id) {
+            renderers_.erase(id);
+            emit linked_.rendererStopped(id);
+        },
+        Qt::DirectConnection);
+    search->second.reset();
 }
 
 void