diff --git a/src/upnp/protocol/pupnp/pupnp.cpp b/src/upnp/protocol/pupnp/pupnp.cpp
index 8db05170fb16201a73dbcc851d61c9026becf5cb..d07cc20768b431190385e2e56f0d9792a9950c31 100644
--- a/src/upnp/protocol/pupnp/pupnp.cpp
+++ b/src/upnp/protocol/pupnp/pupnp.cpp
@@ -194,6 +194,9 @@ PUPnP::terminate(std::condition_variable& cv)
 
     clientRegistered_ = false;
     observer_ = nullptr;
+    std::unique_lock<std::mutex> lk(ongoingOpsMtx_);
+    destroying_ = true;
+    cvOngoing_.wait(lk, [&]() { return ongoingOps_ == 0; });
 
     UpnpUnRegisterClient(ctrlptHandle_);
 
@@ -779,6 +782,12 @@ void
 PUPnP::downLoadIgdDescription(const std::string& locationUrl)
 {
     if(logger_) logger_->debug("PUPnP: downLoadIgdDescription {}", locationUrl);
+    {
+        std::lock_guard<std::mutex> lk(ongoingOpsMtx_);
+        if (destroying_)
+            return;
+        ongoingOps_++;
+    }
     IXML_Document* doc_container_ptr = nullptr;
     int upnp_err = UpnpDownloadXmlDoc(locationUrl.c_str(), &doc_container_ptr);
 
@@ -794,6 +803,9 @@ PUPnP::downLoadIgdDescription(const std::string& locationUrl)
             }
         });
     }
+    std::lock_guard<std::mutex> lk(ongoingOpsMtx_);
+    ongoingOps_--;
+    cvOngoing_.notify_one();
 }
 
 void
diff --git a/src/upnp/protocol/pupnp/pupnp.h b/src/upnp/protocol/pupnp/pupnp.h
index 4c0ea789d53c54ea29ed1fd8163e8d178d3667dc..7deb4fba43788627cc474271f96944ef3229eea7 100644
--- a/src/upnp/protocol/pupnp/pupnp.h
+++ b/src/upnp/protocol/pupnp/pupnp.h
@@ -243,6 +243,12 @@ private:
 
     // Shutdown synchronization
     bool shutdownComplete_ {false};
+
+    // Count ongoing operations
+    std::mutex ongoingOpsMtx_;
+    std::condition_variable cvOngoing_;
+    int ongoingOps_ {0};
+    bool destroying_ {false};
 };
 
 } // namespace upnp