diff --git a/src/account.cpp b/src/account.cpp
index 789d4ece987c49b9e8f640481ae970bcf9c89dae..f52a3365726f3f2b67cfa708109a6230e7aae327 100644
--- a/src/account.cpp
+++ b/src/account.cpp
@@ -157,14 +157,18 @@ Account::hangupCalls()
 }
 
 void
-Account::enableUpnp(bool state)
+Account::updateUpnpController()
 {
     std::lock_guard<std::mutex> lk {upnp_mtx};
 
-    if (state and !upnpCtrl_)
+    if (upnpEnabled_ and not upnpCtrl_) {
         upnpCtrl_.reset(new upnp::Controller());
-    else if (!state and upnpCtrl_)
+        if (not upnpCtrl_) {
+            throw std::runtime_error("Failed to create a UPNP Controller instance!");
+        }
+    } else if (not upnpEnabled_) {
         upnpCtrl_.reset();
+    }
 }
 
 void
@@ -287,7 +291,7 @@ Account::unserialize(const YAML::Node& node)
     }
 
     parseValue(node, UPNP_ENABLED_KEY, upnpEnabled_);
-    enableUpnp(upnpEnabled_ && isEnabled());
+    updateUpnpController();
 
     std::string defMod;
     parseValueOptional(node, DEFAULT_MODERATORS_KEY, defMod);
@@ -318,7 +322,8 @@ Account::setAccountDetails(const std::map<std::string, std::string>& details)
         parseString(details, Conf::CONFIG_ACCOUNT_USERAGENT, customUserAgent_);
 
     parseBool(details, Conf::CONFIG_UPNP_ENABLED, upnpEnabled_);
-    enableUpnp(upnpEnabled_ && isEnabled());
+    updateUpnpController();
+
     std::string defMod;
     parseString(details, Conf::CONFIG_DEFAULT_MODERATORS, defMod);
     defaultModerators_ = string_split_set(defMod);
diff --git a/src/account.h b/src/account.h
index 95058f21169fc40f94327d7444c3f3aba3294fee..efb68b723c88ca923a79bac0b6c23f305e0775ca 100644
--- a/src/account.h
+++ b/src/account.h
@@ -373,7 +373,7 @@ private:
     std::set<std::string> callIDSet_;
 
 protected:
-    virtual void enableUpnp(bool state);
+    void updateUpnpController();
 
     static void parseString(const std::map<std::string, std::string>& details,
                             const char* key,
diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index 24ee9c0e1a4b1b832373ce8b3708d5005106efd4..4d01aace0c7fc7f08154d549b64290f90f5d3659 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -2079,35 +2079,6 @@ JamiAccount::doRegister()
     cacheTurnServers(); // reset cache for TURN servers
 }
 
-void
-JamiAccount::enableUpnp(bool enable)
-{
-    std::lock_guard<std::mutex> lk {upnp_mtx};
-
-    if (enable) {
-        auto const& addr = getPublishedIpAddress();
-
-        if (upnpCtrl_ and upnpCtrl_->getExternalIP() == addr) {
-            JAMI_DBG(
-                "[Account %s] Already have a valid controller instance with external address [%s]",
-                getAccountID().c_str(),
-                upnpCtrl_->getExternalIP().toString().c_str());
-            return;
-        }
-
-        JAMI_DBG("[Account %s] Creating a new upnp controller instance", getAccountID().c_str());
-        // Need a known IPv4 address to validate the external address
-        // returned by the IGD.
-        if (addr and addr.getFamily() == AF_INET) {
-            upnpCtrl_.reset(new upnp::Controller(addr));
-        } else {
-            upnpCtrl_.reset(new upnp::Controller());
-        }
-    } else {
-        upnpCtrl_.reset();
-    }
-}
-
 std::vector<std::string>
 JamiAccount::loadBootstrap() const
 {
@@ -3741,9 +3712,9 @@ JamiAccount::storeActiveIpAddress()
                  getAccountID().c_str(),
                  publicAddr.toString().c_str());
 
-        // Check if we need to create a new UPNP controller instance.
-        if (upnpEnabled_ and (not upnpCtrl_ or not upnpCtrl_->isReady())) {
-            enableUpnp(true);
+        // Set the known public address in UPNP if enabled.
+        if (upnpCtrl_) {
+            upnpCtrl_->setPublicAddress(publicAddr);
         }
     }
 
diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h
index 4bbe027c557eb6e9abdc74f722d1cbc0a4703344..103bc2e64fb1e6de843aa7898dd0daade96a0221 100644
--- a/src/jamidht/jamiaccount.h
+++ b/src/jamidht/jamiaccount.h
@@ -221,7 +221,6 @@ public:
      */
     void doUnregister(std::function<void(bool)> cb = {}) override;
 
-    void enableUpnp(bool enable) override;
     /**
      * @return pj_str_t "From" uri based on account information.
      * From RFC3261: "The To header field first and foremost specifies the desired
diff --git a/src/upnp/upnp_control.cpp b/src/upnp/upnp_control.cpp
index 0aecf239423333f5074360a86acbb037db3ec9db..d6ab3badd4a91e032576291bf4bbcba473c80ed9 100644
--- a/src/upnp/upnp_control.cpp
+++ b/src/upnp/upnp_control.cpp
@@ -39,16 +39,6 @@ Controller::Controller()
     JAMI_DBG("Controller@%p: Created UPnP Controller session", this);
 }
 
-Controller::Controller(const IpAddr& addr)
-    : Controller()
-{
-    assert(upnpContext_);
-    assert(addr);
-    assert(addr.getFamily() == AF_INET);
-
-    upnpContext_->setPublicAddress(addr);
-}
-
 Controller::~Controller()
 {
     JAMI_DBG("Controller@%p: Destroying UPnP Controller session", this);
@@ -57,6 +47,16 @@ Controller::~Controller()
     upnpContext_->unregisterController(this);
 }
 
+void
+Controller::setPublicAddress(const IpAddr& addr)
+{
+    assert(upnpContext_);
+
+    if (addr and addr.getFamily() == AF_INET) {
+        upnpContext_->setPublicAddress(addr);
+    }
+}
+
 bool
 Controller::isReady() const
 {
diff --git a/src/upnp/upnp_control.h b/src/upnp/upnp_control.h
index d19ac8e4bd8f1b927e6810ac5a50b7ada8f84607..918c255d9a3df3b2920154d8a0988f68f31221a0 100644
--- a/src/upnp/upnp_control.h
+++ b/src/upnp/upnp_control.h
@@ -48,12 +48,12 @@ class Controller
 {
 public:
     Controller();
-    Controller(const IpAddr& addr);
     ~Controller();
 
+    // Set known public address
+    void setPublicAddress(const IpAddr& addr);
     // Checks if a valid IGD is available.
     bool isReady() const;
-
     // Gets the external ip of the first valid IGD in the list.
     IpAddr getExternalIP() const;