diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp
index 093e9a431c1aeb3451311e5082a03e2150e56832..914b756806d07da7d8fb6f5e6d9782fca7a16dd3 100644
--- a/src/ice_transport.cpp
+++ b/src/ice_transport.cpp
@@ -800,6 +800,7 @@ IceTransport::Impl::requestUpnpMappings()
             }
         } else {
             JAMI_ERR("[ice:%p]: UPNP mapping request failed!", this);
+            upnp_->releaseMapping(requestedMap);
         }
     }
 }
diff --git a/src/upnp/upnp_context.cpp b/src/upnp/upnp_context.cpp
index 70024ddae66e35d83a84d8a93d52a0ce5dcdbf58..7c881616240c5f70d184134ab916749ace6ee064 100644
--- a/src/upnp/upnp_context.cpp
+++ b/src/upnp/upnp_context.cpp
@@ -115,9 +115,7 @@ UPnPContext::StopUpnp()
     for (auto const& map : toRemoveList) {
         map->cancelTimeoutTimer();
         updateMappingState(map, MappingState::FAILED);
-        if (map->isAvailable()) {
-            unregisterMapping(map);
-        }
+        unregisterMapping(map);
     }
 
     for (auto const& [_, protocol] : protocolList_) {
@@ -529,6 +527,18 @@ UPnPContext::updateMappingList(bool async)
                  status.inProgressCount_,
                  status.failedCount_);
 
+        if (status.failedCount_ > 0) {
+            std::lock_guard<std::mutex> lock(mappingMutex_);
+            auto const& mappingList = getMappingList(type);
+            for (auto const& [_, map] : mappingList) {
+                if (map->getState() == MappingState::FAILED) {
+                    JAMI_DBG("Mapping status [%s] - Available [%s]",
+                             map->toString(true).c_str(),
+                             map->isAvailable() ? "YES" : "NO");
+                }
+            }
+        }
+
         int toRequestCount = (int) minOpenPortLimit_[idx]
                              - (int) (status.readyCount_ + status.inProgressCount_
                                       + status.pendingCount_);
@@ -626,10 +636,7 @@ UPnPContext::pruneUnMatchedMappings(const std::shared_ptr<IGD>& igd,
 
         for (auto const& map : toRemoveList) {
             updateMappingState(map, MappingState::FAILED);
-            // Remove if not used.
-            if (map->isAvailable()) {
-                unregisterMapping(map);
-            }
+            unregisterMapping(map);
         }
     }
 }
@@ -695,9 +702,7 @@ UPnPContext::pruneMappingsWithInvalidIgds(const std::shared_ptr<IGD>& igd)
                  igd->getProtocolName());
         map->cancelTimeoutTimer();
         updateMappingState(map, MappingState::FAILED);
-        if (map->isAvailable()) {
-            unregisterMapping(map);
-        }
+        unregisterMapping(map);
     }
 }
 
@@ -922,10 +927,7 @@ UPnPContext::onMappingAdded(const std::shared_ptr<IGD>& igd, const Mapping& mapR
                  map->toString().c_str(),
                  igd->getLocalIp().toString().c_str());
         updateMappingState(map, MappingState::FAILED);
-        // Remove if not used.
-        if (map->isAvailable()) {
-            unregisterMapping(map);
-        }
+        unregisterMapping(map);
     }
 
     // We have a response, so cancel the time-out.
@@ -1195,11 +1197,7 @@ UPnPContext::onRequestTimeOut(const std::shared_ptr<IGD>& igd, const Mapping::sh
 
     // Considere time-out as failure.
     updateMappingState(map, MappingState::FAILED);
-
-    // Remove it if not used.
-    if (map->isAvailable()) {
-        unregisterMapping(map);
-    }
+    unregisterMapping(map);
 }
 
 void