diff --git a/src/upnp/protocol/natpmp/nat_pmp.cpp b/src/upnp/protocol/natpmp/nat_pmp.cpp
index 21f11ee..68dfee0 100644
--- a/src/upnp/protocol/natpmp/nat_pmp.cpp
+++ b/src/upnp/protocol/natpmp/nat_pmp.cpp
@@ -28,7 +28,7 @@
 
 NatPmp::NatPmp()
 {
-    JAMI_DBG("NAT-PMP: Instance [%p] created", this);
+    // JAMI_DBG("NAT-PMP: Instance [%p] created", this);
     runOnNatPmpQueue([this] {
         threadId_ = getCurrentThread();
         igd_ = std::make_shared<PMPIGD>();
@@ -37,7 +37,7 @@
 
 NatPmp::~NatPmp()
 {
-    JAMI_DBG("NAT-PMP: Instance [%p] destroyed", this);
+    // JAMI_DBG("NAT-PMP: Instance [%p] destroyed", this);
 }
 
 void
@@ -61,7 +61,7 @@
 
     // Local address must be valid.
     if (not getHostAddress() or getHostAddress().isLoopback()) {
-        JAMI_WARN("NAT-PMP: Does not have a valid local address!");
+        // JAMI_WARN("NAT-PMP: Does not have a valid local address!");
         return;
     }
 
@@ -75,18 +75,18 @@
     igd_->setPublicIp(IpAddr());
     igd_->setUID("");
 
-    JAMI_DBG("NAT-PMP: Trying to initialize IGD");
+    // JAMI_DBG("NAT-PMP: Trying to initialize IGD");
 
     int err = initnatpmp(&natpmpHdl_, 0, 0);
 
     if (err < 0) {
-        JAMI_WARN("NAT-PMP: Initializing IGD using default gateway failed!");
+        // JAMI_WARN("NAT-PMP: Initializing IGD using default gateway failed!");
         const auto& localGw = ip_utils::getLocalGateway();
         if (not localGw) {
-            JAMI_WARN("NAT-PMP: Couldn't find valid gateway on local host");
+            // JAMI_WARN("NAT-PMP: Couldn't find valid gateway on local host");
             err = NATPMP_ERR_CANNOTGETGATEWAY;
         } else {
-            JAMI_WARN("NAT-PMP: Trying to initialize using detected gateway %s",
+            // JAMI_WARN("NAT-PMP: Trying to initialize using detected gateway %s",
                       localGw.toString().c_str());
 
             struct in_addr inaddr;
@@ -96,14 +96,14 @@
     }
 
     if (err < 0) {
-        JAMI_ERR("NAT-PMP: Can't initialize libnatpmp -> %s", getNatPmpErrorStr(err));
+        // JAMI_ERR("NAT-PMP: Can't initialize libnatpmp -> %s", getNatPmpErrorStr(err));
         return;
     }
 
     char addrbuf[INET_ADDRSTRLEN];
     inet_ntop(AF_INET, &natpmpHdl_.gateway, addrbuf, sizeof(addrbuf));
     IpAddr igdAddr(addrbuf);
-    JAMI_DBG("NAT-PMP: Initialized on gateway %s", igdAddr.toString().c_str());
+    // JAMI_DBG("NAT-PMP: Initialized on gateway %s", igdAddr.toString().c_str());
 
     // Set the local (gateway) address.
     igd_->setLocalIp(igdAddr);
@@ -133,7 +133,7 @@
         return;
     }
 
-    JAMI_DBG("NAT-PMP: Setting observer to %p", obs);
+    // JAMI_DBG("NAT-PMP: Setting observer to %p", obs);
 
     observer_ = obs;
 }
@@ -164,9 +164,9 @@
     });
 
     if (cv.wait_for(lk, std::chrono::seconds(10), [this] { return shutdownComplete_; })) {
-        JAMI_DBG("NAT-PMP: Shutdown completed");
+        // JAMI_DBG("NAT-PMP: Shutdown completed");
     } else {
-        JAMI_ERR("NAT-PMP: Shutdown timed-out");
+        // JAMI_ERR("NAT-PMP: Shutdown timed-out");
     }
 }
 
@@ -229,7 +229,7 @@
     // Schedule a retry in case init failed.
     if (not initialized_) {
         if (igdSearchCounter_++ < MAX_RESTART_SEARCH_RETRIES) {
-            JAMI_DBG("NAT-PMP: Start search for IGDs. Attempt %i", igdSearchCounter_);
+            // JAMI_DBG("NAT-PMP: Start search for IGDs. Attempt %i", igdSearchCounter_);
 
             // Cancel the current timer (if any) and re-schedule.
             if (searchForIgdTimer_)
@@ -239,8 +239,8 @@
                                                                   NATPMP_SEARCH_RETRY_UNIT
                                                                       * igdSearchCounter_);
         } else {
-            JAMI_WARN("NAT-PMP: Setup failed after %u trials. NAT-PMP will be disabled!",
-                      MAX_RESTART_SEARCH_RETRIES);
+            // JAMI_WARN("NAT-PMP: Setup failed after %u trials. NAT-PMP will be disabled!",
+            //           MAX_RESTART_SEARCH_RETRIES);
         }
     }
 }
@@ -259,7 +259,7 @@
 NatPmp::isReady() const
 {
     if (observer_ == nullptr) {
-        JAMI_ERR("NAT-PMP: the observer is not set!");
+        // JAMI_ERR("NAT-PMP: the observer is not set!");
         return false;
     }
 
@@ -286,7 +286,7 @@
         // Disable this IGD.
         igd_->setValid(false);
         // Notify the listener.
-        JAMI_WARN("NAT-PMP: No more valid IGD!");
+        // JAMI_WARN("NAT-PMP: No more valid IGD!");
 
         processIgdUpdate(UpnpIgdEvent::INVALID_STATE);
     }
@@ -309,11 +309,11 @@
     assert(map.getIgd());
     auto err = addPortMapping(map);
     if (err < 0) {
-        JAMI_WARN("NAT-PMP: Request for mapping %s on %s failed with error %i: %s",
-                  map.toString().c_str(),
-                  igd_->toString().c_str(),
-                  err,
-                  getNatPmpErrorStr(err));
+        // JAMI_WARN("NAT-PMP: Request for mapping %s on %s failed with error %i: %s",
+        //           map.toString().c_str(),
+        //           igd_->toString().c_str(),
+        //           err,
+        //           getNatPmpErrorStr(err));
 
         if (isErrorFatal(err)) {
             // Fatal error, increment the counter.
@@ -322,9 +322,9 @@
         // Notify the listener.
         processMappingRequestFailed(std::move(map));
     } else {
-        JAMI_DBG("NAT-PMP: Request for mapping %s on %s succeeded",
-                 map.toString().c_str(),
-                 igd_->toString().c_str());
+        // JAMI_DBG("NAT-PMP: Request for mapping %s on %s succeeded",
+        //          map.toString().c_str(),
+        //          igd_->toString().c_str());
         // Notify the listener.
         processMappingAdded(std::move(map));
     }
@@ -346,11 +346,11 @@
     Mapping map(mapping);
     auto err = addPortMapping(map);
     if (err < 0) {
-        JAMI_WARN("NAT-PMP: Renewal request for mapping %s on %s failed with error %i: %s",
-                  map.toString().c_str(),
-                  igd_->toString().c_str(),
-                  err,
-                  getNatPmpErrorStr(err));
+        // JAMI_WARN("NAT-PMP: Renewal request for mapping %s on %s failed with error %i: %s",
+        //           map.toString().c_str(),
+        //           igd_->toString().c_str(),
+        //           err,
+        //           getNatPmpErrorStr(err));
         // Notify the listener.
         processMappingRequestFailed(std::move(map));
 
@@ -359,9 +359,9 @@
             incrementErrorsCounter(igd_);
         }
     } else {
-        JAMI_DBG("NAT-PMP: Renewal request for mapping %s on %s succeeded",
-                 map.toString().c_str(),
-                 igd_->toString().c_str());
+        // JAMI_DBG("NAT-PMP: Renewal request for mapping %s on %s succeeded",
+        //          map.toString().c_str(),
+        //          igd_->toString().c_str());
         // Notify the listener.
         processMappingRenewed(map);
     }
@@ -416,9 +416,9 @@
                                         lifetime);
 
     if (err < 0) {
-        JAMI_ERR("NAT-PMP: Send mapping request failed with error %s %i",
-                 getNatPmpErrorStr(err),
-                 errno);
+        // JAMI_ERR("NAT-PMP: Send mapping request failed with error %s %i",
+                //  getNatPmpErrorStr(err),
+                //  errno);
         return err;
     }
 
@@ -430,15 +430,15 @@
         err = readResponse(natpmpHdl_, response);
 
         if (err < 0) {
-            JAMI_WARN("NAT-PMP: Read response on IGD %s failed with error %s",
-                      igd_->toString().c_str(),
-                      getNatPmpErrorStr(err));
+            // JAMI_WARN("NAT-PMP: Read response on IGD %s failed with error %s",
+            //           igd_->toString().c_str(),
+            //           getNatPmpErrorStr(err));
         } else if (response.type != NATPMP_RESPTYPE_TCPPORTMAPPING
                    and response.type != NATPMP_RESPTYPE_UDPPORTMAPPING) {
-            JAMI_ERR("NAT-PMP: Unexpected response type (%i) for mapping %s from IGD %s.",
-                     response.type,
-                     mapping.toString().c_str(),
-                     igd_->toString().c_str());
+            // JAMI_ERR("NAT-PMP: Unexpected response type (%i) for mapping %s from IGD %s.",
+            //          response.type,
+            //          mapping.toString().c_str(),
+            //          igd_->toString().c_str());
             // Try to read again.
             continue;
         }
@@ -515,8 +515,8 @@
 
     if (err < 0) {
         // Nothing to do if the request fails, just log the error.
-        JAMI_WARN("NAT-PMP: Send remove request failed with error %s. Ignoring",
-                  getNatPmpErrorStr(err));
+        // JAMI_WARN("NAT-PMP: Send remove request failed with error %s. Ignoring",
+        //           getNatPmpErrorStr(err));
     }
 
     // Update and notify the listener.
@@ -532,9 +532,9 @@
     // Set the public address for this IGD if it does not
     // have one already.
     if (igd_->getPublicIp()) {
-        JAMI_WARN("NAT-PMP: IGD %s already have a public address (%s)",
-                  igd_->toString().c_str(),
-                  igd_->getPublicIp().toString().c_str());
+        // JAMI_WARN("NAT-PMP: IGD %s already have a public address (%s)",
+        //           igd_->toString().c_str(),
+        //           igd_->getPublicIp().toString().c_str());
         return;
     }
     assert(igd_->getProtocol() == NatProtocolType::NAT_PMP);
@@ -542,9 +542,9 @@
     int err = sendpublicaddressrequest(&natpmpHdl_);
 
     if (err < 0) {
-        JAMI_ERR("NAT-PMP: send public address request on IGD %s failed with error: %s",
-                 igd_->toString().c_str(),
-                 getNatPmpErrorStr(err));
+        // JAMI_ERR("NAT-PMP: send public address request on IGD %s failed with error: %s",
+        //          igd_->toString().c_str(),
+        //          getNatPmpErrorStr(err));
 
         if (isErrorFatal(err)) {
             // Fatal error, increment the counter.
@@ -557,34 +557,34 @@
     err = readResponse(natpmpHdl_, response);
 
     if (err < 0) {
-        JAMI_WARN("NAT-PMP: Read response on IGD %s failed - %s",
-                  igd_->toString().c_str(),
-                  getNatPmpErrorStr(err));
+        // JAMI_WARN("NAT-PMP: Read response on IGD %s failed - %s",
+        //           igd_->toString().c_str(),
+        //           getNatPmpErrorStr(err));
         return;
     }
 
     if (response.type != NATPMP_RESPTYPE_PUBLICADDRESS) {
-        JAMI_ERR("NAT-PMP: Unexpected response type (%i) for public address request from IGD %s.",
-                 response.type,
-                 igd_->toString().c_str());
+        // JAMI_ERR("NAT-PMP: Unexpected response type (%i) for public address request from IGD %s.",
+        //          response.type,
+        //          igd_->toString().c_str());
         return;
     }
 
     IpAddr publicAddr(response.pnu.publicaddress.addr);
 
     if (not publicAddr) {
-        JAMI_ERR("NAT-PMP: IGD %s returned an invalid public address %s",
-                 igd_->toString().c_str(),
-                 publicAddr.toString().c_str());
+        // JAMI_ERR("NAT-PMP: IGD %s returned an invalid public address %s",
+        //          igd_->toString().c_str(),
+        //          publicAddr.toString().c_str());
     }
 
     // Update.
     igd_->setPublicIp(publicAddr);
     igd_->setValid(true);
 
-    JAMI_DBG("NAT-PMP: Setting IGD %s public address to %s",
-             igd_->toString().c_str(),
-             igd_->getPublicIp().toString().c_str());
+    // JAMI_DBG("NAT-PMP: Setting IGD %s public address to %s",
+    //          igd_->toString().c_str(),
+    //          igd_->getPublicIp().toString().c_str());
 }
 
 void
@@ -592,18 +592,18 @@
 {
     CHECK_VALID_THREAD();
 
-    JAMI_WARN("NAT-PMP: Send request to close all existing mappings to IGD %s",
-              igd_->toString().c_str());
+    // JAMI_WARN("NAT-PMP: Send request to close all existing mappings to IGD %s",
+    //           igd_->toString().c_str());
 
     int err = sendnewportmappingrequest(&natpmpHdl_, NATPMP_PROTOCOL_TCP, 0, 0, 0);
     if (err < 0) {
-        JAMI_WARN("NAT-PMP: Send close all TCP mappings request failed with error %s",
-                  getNatPmpErrorStr(err));
+        // JAMI_WARN("NAT-PMP: Send close all TCP mappings request failed with error %s",
+        //           getNatPmpErrorStr(err));
     }
     err = sendnewportmappingrequest(&natpmpHdl_, NATPMP_PROTOCOL_UDP, 0, 0, 0);
     if (err < 0) {
-        JAMI_WARN("NAT-PMP: Send close all UDP mappings request failed with error %s",
-                  getNatPmpErrorStr(err));
+        // JAMI_WARN("NAT-PMP: Send close all UDP mappings request failed with error %s",
+        //           getNatPmpErrorStr(err));
     }
 }
 
@@ -706,9 +706,9 @@
 NatPmp::validIgdInstance(const std::shared_ptr<IGD>& igdIn)
 {
     if (igd_.get() != igdIn.get()) {
-        JAMI_ERR("NAT-PMP: IGD (%s) does not match local instance (%s)",
-                 igdIn->toString().c_str(),
-                 igd_->toString().c_str());
+        // JAMI_ERR("NAT-PMP: IGD (%s) does not match local instance (%s)",
+        //          igdIn->toString().c_str(),
+        //          igd_->toString().c_str());
         return false;
     }
 
