diff --git a/src/upnp/protocol/natpmp/nat_pmp.cpp b/src/upnp/protocol/natpmp/nat_pmp.cpp
index 20c93280e80ca152f2e1a5df461e12b0a52786f1..84baace80a8340387b8bdd314c0d68d5f6e75845 100644
--- a/src/upnp/protocol/natpmp/nat_pmp.cpp
+++ b/src/upnp/protocol/natpmp/nat_pmp.cpp
@@ -67,11 +67,8 @@ NatPmp::NatPmp()
                     or restart_;
             });
             if (not pmpRun_ or not pmpIGD_) break;
-            auto now = clock::now();
-
-            // If the restart flag is set, wait for 1 second to have passed by to try and reinitialize natpmp.
-            if (restart_ and (now - restartTimer_ >= std::chrono::seconds(1))) {
-                std::lock_guard<std::mutex> lk(natpmpMutex_);
+            if (restart_) {
+                std::lock_guard<std::mutex> lkNat(natpmpMutex_);
                 clearNatPmpHdl(natpmpHdl_);
                 int err = 0;
                 char localHostBuf[INET_ADDRSTRLEN];
@@ -87,7 +84,10 @@ NatPmp::NatPmp()
                 }
                 if (err < 0) {
                     JAMI_ERR("NAT-PMP: Can't initialize libnatpmp -> %s", getNatPmpErrorStr(err).c_str());
-                    restartTimer_ = clock::now();
+                    // Retry to re-init nat pmp in 10 seconds
+                    if (pmpRun_)
+                        pmpCv_.wait_for(lk, std::chrono::seconds(10));
+                    continue;
                 } else {
                     char addrbuf[INET_ADDRSTRLEN];
                     inet_ntop(AF_INET, &natpmpHdl_.gateway, addrbuf, sizeof(addrbuf));
@@ -98,6 +98,7 @@ NatPmp::NatPmp()
             }
 
             // Check if we need to update IGD.
+            auto now = clock::now();
             if (pmpIGD_->renewal_ < now) {
                 lk.unlock();
                 searchForPmpIgd();
@@ -172,7 +173,6 @@ NatPmp::clearIgds()
     std::lock_guard<std::mutex> lk(validIgdMutex_);
     pmpIGD_.reset(new PMPIGD());
     restart_ = true;
-    restartTimer_ = clock::now();
 }
 
 void
diff --git a/src/upnp/protocol/natpmp/nat_pmp.h b/src/upnp/protocol/natpmp/nat_pmp.h
index 9370215dd1bf8a66e4b25ffc8bd4f765e4f1365f..030546b486d1c1577d5a67b2cf41ed93df839332 100644
--- a/src/upnp/protocol/natpmp/nat_pmp.h
+++ b/src/upnp/protocol/natpmp/nat_pmp.h
@@ -95,7 +95,6 @@ private:
     std::thread pmpThread_ {};                          // NatPmp thread.
 
     std::atomic_bool restart_ {false};          // Variable to indicate we need to restart natpmp after a connectivity change.
-    time_point restartTimer_ {clock::now()};    // Keeps track of time elapsed since restart was triggered.
     unsigned int restartSearchRetry_ {0};       // Keeps track of number of times we try to find an IGD after a connectivity change.
 
     std::shared_ptr<PMPIGD> pmpIGD_ {};                 // IGD discovered by NatPmp.