diff --git a/src/media/video/video_device_monitor.cpp b/src/media/video/video_device_monitor.cpp
index 7218eb116db1c5cf7775332269ff215ee220bb88..af5892822f18081bc1ac1a8b5d54f1e3d09fce78 100644
--- a/src/media/video/video_device_monitor.cpp
+++ b/src/media/video/video_device_monitor.cpp
@@ -42,25 +42,25 @@ constexpr const char * const VideoDeviceMonitor::CONFIG_LABEL;
 
 using std::map;
 using std::string;
-using std::stringstream;;
+using std::stringstream;
 using std::vector;
 
 vector<string>
 VideoDeviceMonitor::getDeviceList() const
 {
+    std::lock_guard<std::mutex> l(lock_);
     vector<string> names;
-
+    names.reserve(devices_.size());
     for (const auto& dev : devices_)
-       names.push_back(dev.name);
-
+       names.emplace_back(dev.name);
     return names;
 }
 
 DRing::VideoCapabilities
 VideoDeviceMonitor::getCapabilities(const string& name) const
 {
+    std::lock_guard<std::mutex> l(lock_);
     const auto iter = findDeviceByName(name);
-
     if (iter == devices_.end())
         return DRing::VideoCapabilities();
 
@@ -70,6 +70,7 @@ VideoDeviceMonitor::getCapabilities(const string& name) const
 VideoSettings
 VideoDeviceMonitor::getSettings(const string& name)
 {
+    std::lock_guard<std::mutex> l(lock_);
     const auto itd = findPreferencesByName(name);
 
     if (itd == preferences_.end())
@@ -81,6 +82,7 @@ VideoDeviceMonitor::getSettings(const string& name)
 void
 VideoDeviceMonitor::applySettings(const string& name, VideoSettings settings)
 {
+    std::lock_guard<std::mutex> l(lock_);
     const auto iter = findDeviceByName(name);
 
     if (iter == devices_.end())
@@ -93,12 +95,14 @@ VideoDeviceMonitor::applySettings(const string& name, VideoSettings settings)
 string
 VideoDeviceMonitor::getDefaultDevice() const
 {
+    std::lock_guard<std::mutex> l(lock_);
     return defaultDevice_;
 }
 
 std::string
 VideoDeviceMonitor::getMRLForDefaultDevice() const
 {
+    std::lock_guard<std::mutex> l(lock_);
     const auto it = findDeviceByName(defaultDevice_);
     if(it == std::end(devices_))
         return {};
@@ -109,6 +113,7 @@ VideoDeviceMonitor::getMRLForDefaultDevice() const
 void
 VideoDeviceMonitor::setDefaultDevice(const std::string& name)
 {
+    std::lock_guard<std::mutex> l(lock_);
     const auto itDev = findDeviceByName(name);
     if (itDev != devices_.end()) {
         defaultDevice_ = itDev->name;
@@ -128,6 +133,7 @@ VideoDeviceMonitor::setDefaultDevice(const std::string& name)
 DeviceParams
 VideoDeviceMonitor::getDeviceParams(const std::string& name) const
 {
+    std::lock_guard<std::mutex> l(lock_);
     const auto itd = findDeviceByName(name);
     if (itd == devices_.cend())
         return DeviceParams();
@@ -188,6 +194,7 @@ notify()
 void
 VideoDeviceMonitor::addDevice(const string& node, const std::vector<std::map<std::string, std::string>>* devInfo)
 {
+    std::unique_lock<std::mutex> l(lock_);
     if (findDeviceByNode(node) != devices_.end())
         return;
 
@@ -214,8 +221,9 @@ VideoDeviceMonitor::addDevice(const string& node, const std::vector<std::map<std
             defaultDevice_ = dev.name;
 
         devices_.emplace_back(std::move(dev));
-        notify();
 
+        lock_.unlock();
+        notify();
     } catch (const std::exception& e) {
         RING_ERR("Failed to add device %s: %s", node.c_str(), e.what());
         return;
@@ -225,64 +233,54 @@ VideoDeviceMonitor::addDevice(const string& node, const std::vector<std::map<std
 void
 VideoDeviceMonitor::removeDevice(const string& node)
 {
-    const auto it = findDeviceByNode(node);
-
-    if (it == devices_.end())
-        return;
+    {
+        std::lock_guard<std::mutex> l(lock_);
+        const auto it = findDeviceByNode(node);
+        if (it == devices_.end())
+            return;
 
-    if (defaultDevice_ == it->name)
-        defaultDevice_.clear();
+        if (defaultDevice_ == it->name)
+            defaultDevice_.clear();
 
-    devices_.erase(it);
+        devices_.erase(it);
+    }
     notify();
 }
 
 vector<VideoDevice>::iterator
 VideoDeviceMonitor::findDeviceByName(const string& name)
 {
-    vector<VideoDevice>::iterator it;
-
-    for (it = devices_.begin(); it != devices_.end(); ++it)
+    for (auto it = devices_.begin(); it != devices_.end(); ++it)
         if (it->name == name)
-            break;
-
-    return it;
+            return it;
+    return devices_.end();
 }
 
 vector<VideoDevice>::const_iterator
 VideoDeviceMonitor::findDeviceByName(const string& name) const
 {
-    vector<VideoDevice>::const_iterator it;
-
-    for (it = devices_.cbegin(); it != devices_.cend(); ++it)
+    for (auto it = devices_.cbegin(); it != devices_.cend(); ++it)
         if (it->name == name)
-            break;
-
-    return it;
+            return it;
+    return devices_.cend();
 }
 
 vector<VideoDevice>::iterator
 VideoDeviceMonitor::findDeviceByNode(const string& node)
 {
-    vector<VideoDevice>::iterator it;
-
-    for (it = devices_.begin(); it != devices_.end(); ++it)
+    for (auto it = devices_.begin(); it != devices_.end(); ++it)
         if (it->getNode() == node)
-            break;
-
-    return it;
+            return it;
+    return devices_.end();
 }
 
 vector<VideoDevice>::const_iterator
 VideoDeviceMonitor::findDeviceByNode(const string& node) const
 {
-    vector<VideoDevice>::const_iterator it;
-
-    for (it = devices_.cbegin(); it != devices_.cend(); ++it)
+    for (auto it = devices_.cbegin(); it != devices_.cend(); ++it)
         if (it->getNode() == node)
-            break;
-
-    return it;
+            return it;
+    return devices_.end();
 }
 
 vector<VideoSettings>::iterator
@@ -305,12 +303,14 @@ VideoDeviceMonitor::overwritePreferences(VideoSettings settings)
 void
 VideoDeviceMonitor::serialize(YAML::Emitter &out)
 {
+    std::lock_guard<std::mutex> l(lock_);
     out << YAML::Key << "devices" << YAML::Value << preferences_;
 }
 
 void
 VideoDeviceMonitor::unserialize(const YAML::Node &in)
 {
+    std::lock_guard<std::mutex> l(lock_);
     const auto &node = in[CONFIG_LABEL];
 
     /* load the device list from the "video" YAML section */
diff --git a/src/media/video/video_device_monitor.h b/src/media/video/video_device_monitor.h
index 1b671f305f72125cf10b3a41593fb7aa2534ba76..a1f039460d33218dd3e0146789aa84b11e5d7e16 100644
--- a/src/media/video/video_device_monitor.h
+++ b/src/media/video/video_device_monitor.h
@@ -95,6 +95,7 @@ class VideoDeviceMonitor : public Serializable
         std::vector<VideoDevice>::const_iterator findDeviceByNode(const std::string& node) const;
 
         std::unique_ptr<VideoDeviceMonitorImpl> monitorImpl_;
+        mutable std::mutex lock_;
 
         constexpr static const char *CONFIG_LABEL = "video";
 };