diff --git a/src/upnp/protocol/pupnp/pupnp.cpp b/src/upnp/protocol/pupnp/pupnp.cpp
index 184d9ef66bcc12acce510642fe0cd7b6b81a628f..7652c2e3cbd14622219267bd994f450c5345e62f 100644
--- a/src/upnp/protocol/pupnp/pupnp.cpp
+++ b/src/upnp/protocol/pupnp/pupnp.cpp
@@ -176,8 +176,8 @@ PUPnP::PUPnP()
                     // Handle successful downloads
                     for (auto& item : finished) {
                         auto result = item.get();
-                        if (not result.document or not validateIgd(result)) {
-                            cpDeviceList_.erase(result.location);
+                        if (not result->document or not validateIgd(*result)) {
+                            cpDeviceList_.erase(result->location);
                         }
                     }
                 }
@@ -449,7 +449,7 @@ PUPnP::handleCtrlPtUPnPEvents(Upnp_EventType event_type, const void* event)
 
         // Check if we already downloaded the xml doc based on the igd location string.
         std::string igdLocationUrl {UpnpDiscovery_get_Location_cstr(d_event)};
-        dwnldlXmlList_.emplace_back(dht::ThreadPool::io().get<IGDInfo>([this, location = std::move(igdLocationUrl)]{
+        dwnldlXmlList_.emplace_back(dht::ThreadPool::io().get<pIGDInfo>([this, location = std::move(igdLocationUrl)]{
             IXML_Document* doc_container_ptr = nullptr;
             XMLDocument doc_desc_ptr(nullptr, ixmlDocument_free);
             int upnp_err = UpnpDownloadXmlDoc(location.c_str(), &doc_container_ptr);
@@ -459,8 +459,8 @@ PUPnP::handleCtrlPtUPnPEvents(Upnp_EventType event_type, const void* event)
             if (upnp_err != UPNP_E_SUCCESS or not doc_desc_ptr)
                 JAMI_WARN("PUPnP: Error downloading device XML document -> %s", UpnpGetErrorMessage(upnp_err));
             else
-                return IGDInfo {std::move(location), std::move(doc_desc_ptr)};
-            return IGDInfo {std::move(location), XMLDocument(nullptr, ixmlDocument_free)};
+                return std::make_unique<IGDInfo>(IGDInfo{ std::move(location), std::move(doc_desc_ptr) });
+            return std::make_unique<IGDInfo>(IGDInfo{ std::move(location), XMLDocument(nullptr, ixmlDocument_free) });
         }));
 
         break;
@@ -925,4 +925,4 @@ PUPnP::actionAddPortMapping(const UPnPIGD& igd, const Mapping& mapping, UPnPProt
     return true;
 }
 
-}} // namespace jami::upnp
\ No newline at end of file
+}} // namespace jami::upnp
diff --git a/src/upnp/protocol/pupnp/pupnp.h b/src/upnp/protocol/pupnp/pupnp.h
index ca76786f22080b6fb0524bdec76cd8ac93db1830..2d2a95024bf1cb3d27edc77a7fcee5fc23d9f69d 100644
--- a/src/upnp/protocol/pupnp/pupnp.h
+++ b/src/upnp/protocol/pupnp/pupnp.h
@@ -79,6 +79,7 @@ public:
         std::string location;
         XMLDocument document;
     };
+    using pIGDInfo = std::unique_ptr<IGDInfo>;
 
     PUPnP();
     ~PUPnP();
@@ -146,7 +147,7 @@ private:
 
     std::map<std::string, std::shared_ptr<IGD>> validIgdList_;  // Map of valid IGDs with their UDN (universal Id).
     std::set<std::string> cpDeviceList_;                        // Control point device list containing the device ID and device subscription event url.
-    std::list<std::future<IGDInfo>> dwnldlXmlList_;      // List of shared_futures for blocking xml download function calls.
+    std::list<std::future<pIGDInfo>> dwnldlXmlList_;      // List of shared_futures for blocking xml download function calls.
 
     std::mutex ctrlptMutex_;                                    // Mutex for client handle protection.
     UpnpClient_Handle ctrlptHandle_ {-1};                       // Control point handle.