diff --git a/src/upnp/upnp_context.cpp b/src/upnp/upnp_context.cpp
index ecfe88a664c69a2a06266da2340d6a5e7ee5bb09..3dade205a69b2fb5110d8b142c7ae56c20a43842 100644
--- a/src/upnp/upnp_context.cpp
+++ b/src/upnp/upnp_context.cpp
@@ -138,9 +138,13 @@ UPnPContext::UPnPContext()
                     pmp_igd->clearAll_ = false;
                     pmp_igd->toRemove_.clear();
                 } else if (not pmp_igd->toRemove_.empty()) {
-                    for (auto& m : pmp_igd->toRemove_)
-                        PMPaddPortMapping(*pmp_igd, natpmp, m, true);
+                    decltype(pmp_igd->toRemove_) removed = std::move(pmp_igd->toRemove_);
                     pmp_igd->toRemove_.clear();
+                    lk.unlock();
+                    for (auto& m : removed) {
+                        PMPaddPortMapping(*pmp_igd, natpmp, m, true);
+                    }
+                    lk.lock();
                 }
                 auto mapping = pmp_igd->getNextMappingToRenew();
                 if (mapping and mapping->renewal_ < now)