diff --git a/contrib/src/dhtnet/package.json b/contrib/src/dhtnet/package.json
index 7505f3aab7333e41aa0ec1ae9a49b9ba9faaaffa..1d461b1981c036deee28c46c768a71194bfdd762 100644
--- a/contrib/src/dhtnet/package.json
+++ b/contrib/src/dhtnet/package.json
@@ -1,6 +1,6 @@
 {
     "name": "dhtnet",
-    "version": "2f3539bc19cf770cd23912c7eebe63e8d2f80515",
+    "version": "4796de15ed32b41949489c328bc250d17c431c80",
     "url": "https://review.jami.net/plugins/gitiles/dhtnet/+archive/__VERSION__.tar.gz",
     "deps": [
         "opendht",
diff --git a/contrib/src/dhtnet/rules.mak b/contrib/src/dhtnet/rules.mak
index 3fe00d84876c06767dc56cd084e13fc64cb47051..bec1d14555677fa6e9b62d3082c8e3b8e4c4aee4 100644
--- a/contrib/src/dhtnet/rules.mak
+++ b/contrib/src/dhtnet/rules.mak
@@ -1,5 +1,5 @@
 # DHTNET
-DHTNET_VERSION := 2f3539bc19cf770cd23912c7eebe63e8d2f80515
+DHTNET_VERSION := 4796de15ed32b41949489c328bc250d17c431c80
 DHTNET_URL := https://review.jami.net/plugins/gitiles/dhtnet/+archive/$(DHTNET_VERSION).tar.gz
 
 PKGS += dhtnet
diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index 2c8469118ab1700b2a725824cd19ee1f44a1e0d6..689f2eee9d77180c91df493685ee58f0ac2632da 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -4192,7 +4192,7 @@ JamiAccount::initConnectionManager()
         auto connectionManagerConfig = std::make_shared<dhtnet::ConnectionManager::Config>();
         connectionManagerConfig->ioContext = Manager::instance().ioContext();
         connectionManagerConfig->dht = dht();
-        connectionManagerConfig->certStore = certStore_.get();
+        connectionManagerConfig->certStore = certStore_;
         connectionManagerConfig->id = identity();
         connectionManagerConfig->upnpCtrl = upnpCtrl_;
         connectionManagerConfig->turnServer = config().turnServer;
@@ -4203,7 +4203,7 @@ JamiAccount::initConnectionManager()
         connectionManagerConfig->turnEnabled = config().turnEnabled;
         connectionManagerConfig->cachePath = cachePath_;
         connectionManagerConfig->logger = Logger::dhtLogger();
-        connectionManagerConfig->factory = &Manager::instance().getIceTransportFactory();
+        connectionManagerConfig->factory = Manager::instance().getIceTransportFactory();
         connectionManagerConfig->turnCache = turnCache_;
         connectionManager_ = std::make_unique<dhtnet::ConnectionManager>(connectionManagerConfig);
         channelHandlers_[Uri::Scheme::SWARM]
diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h
index 2e55c2790284226f966821f89d88b3354665d938..34d6c42317dd9954ff35d59c9c62936409014bfd 100644
--- a/src/jamidht/jamiaccount.h
+++ b/src/jamidht/jamiaccount.h
@@ -707,7 +707,7 @@ private:
     std::string registeredName_;
 #endif
     std::shared_ptr<dht::Logger> logger_;
-    std::unique_ptr<dhtnet::tls::CertificateStore> certStore_;
+    std::shared_ptr<dhtnet::tls::CertificateStore> certStore_;
 
     std::shared_ptr<dht::DhtRunner> dht_ {};
     std::shared_ptr<AccountManager> accountManager_;
diff --git a/src/manager.cpp b/src/manager.cpp
index 05ab417268393a2988154996cec29bb59d68f639..ba9bced7c5baf56762e4435fd3dcba85a1f7e5c9 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -434,7 +434,7 @@ struct Manager::ManagerPimpl
     std::atomic_bool finished_ {false};
 
     /* ICE support */
-    std::unique_ptr<dhtnet::IceTransportFactory> ice_tf_;
+    std::shared_ptr<dhtnet::IceTransportFactory> ice_tf_;
 
     /* Sink ID mapping */
     std::map<std::string, std::weak_ptr<video::SinkClient>> sinkMap_;
@@ -814,7 +814,7 @@ Manager::init(const std::filesystem::path& config_file, libjami::InitFlag flags)
     check_rename(fileutils::get_config_dir(PACKAGE_OLD).string(),
                  fileutils::get_config_dir().string());
 
-    pimpl_->ice_tf_.reset(new dhtnet::IceTransportFactory(Logger::dhtLogger()));
+    pimpl_->ice_tf_ = std::make_shared<dhtnet::IceTransportFactory>(Logger::dhtLogger());
 
     pimpl_->path_ = config_file.empty() ? pimpl_->retrieveConfigPath() : config_file;
     JAMI_DBG("Configuration file path: %s", pimpl_->path_.c_str());
@@ -3187,10 +3187,10 @@ Manager::hasAccount(const std::string& accountID)
     return accountFactory.hasAccount(accountID);
 }
 
-dhtnet::IceTransportFactory&
+const std::shared_ptr<dhtnet::IceTransportFactory>&
 Manager::getIceTransportFactory()
 {
-    return *pimpl_->ice_tf_;
+    return pimpl_->ice_tf_;
 }
 
 VideoManager&
diff --git a/src/manager.h b/src/manager.h
index 1b660715ca460ac1e32c5499f9d668cff647c28b..9bed0fdebe1b6bed0799689442280c36a4ce5b00 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -789,7 +789,7 @@ public:
 
     CallFactory callFactory;
 
-    dhtnet::IceTransportFactory& getIceTransportFactory();
+    const std::shared_ptr<dhtnet::IceTransportFactory>& getIceTransportFactory();
 
     std::shared_ptr<asio::io_context> ioContext() const;
     std::shared_ptr<dhtnet::upnp::UPnPContext> upnpContext() const;
diff --git a/src/sip/sipaccountbase.cpp b/src/sip/sipaccountbase.cpp
index 0e10763372300086b8db03858311b8cd8de6f1ee..d0532d83f8a46c870818ea2d24962fb2fe36b303 100644
--- a/src/sip/sipaccountbase.cpp
+++ b/src/sip/sipaccountbase.cpp
@@ -249,7 +249,7 @@ SIPAccountBase::getIceOptions() const noexcept
 {
     dhtnet::IceTransportOptions opts;
     opts.upnpEnable = getUPnPActive();
-    opts.factory = (dhtnet::IceTransportFactory*)&Manager::instance().getIceTransportFactory();
+    opts.factory = Manager::instance().getIceTransportFactory();
 
     if (config().turnEnabled && turnCache_) {
         auto turnAddr = turnCache_->getResolvedTurn();
diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp
index 8dfc9847786c8b93e4f3fa101ab8e3b2341c3f3b..8477eb3aee9403f471e5baa6cc99c1289048f133 100644
--- a/src/sip/sipcall.cpp
+++ b/src/sip/sipcall.cpp
@@ -3318,9 +3318,7 @@ SIPCall::InvSessionDeleter::operator()(pjsip_inv_session* inv) const noexcept
 bool
 SIPCall::createIceMediaTransport(bool isReinvite)
 {
-    auto& iceTransportFactory = Manager::instance().getIceTransportFactory();
-
-    auto mediaTransport = iceTransportFactory.createTransport(getCallId());
+    auto mediaTransport = Manager::instance().getIceTransportFactory()->createTransport(getCallId());
     if (mediaTransport) {
         JAMI_DBG("[call:%s] Successfully created media ICE transport [ice:%p]",
                  getCallId().c_str(),
diff --git a/test/unitTest/ice/ice.cpp b/test/unitTest/ice/ice.cpp
index da0fad96321ca46c47051a79c82d9028b1940926..07d55df2383c06466f8df36873fa619edebb2424 100644
--- a/test/unitTest/ice/ice.cpp
+++ b/test/unitTest/ice/ice.cpp
@@ -140,9 +140,9 @@ IceTest::testRawIceConnection()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
+    ice_config.factory = Manager::instance().getIceTransportFactory();
 
-    ice_master = Manager::instance().getIceTransportFactory().createTransport("master ICE");
+    ice_master = Manager::instance().getIceTransportFactory()->createTransport("master ICE");
     ice_master->initIceInstance(ice_config);
     cv_create.notify_all();
     ice_config.onInitDone = [&](bool ok) {
@@ -176,9 +176,9 @@ IceTest::testRawIceConnection()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
+    ice_config.factory = Manager::instance().getIceTransportFactory();
 
-    ice_slave = Manager::instance().getIceTransportFactory().createTransport("slave ICE");
+    ice_slave = Manager::instance().getIceTransportFactory()->createTransport("slave ICE");
     ice_slave->initIceInstance(ice_config);
 
     cv_create.notify_all();
@@ -252,8 +252,8 @@ IceTest::testTurnMasterIceConnection()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
-    ice_master = Manager::instance().getIceTransportFactory().createTransport("master ICE");
+    ice_config.factory = Manager::instance().getIceTransportFactory();
+    ice_master = Manager::instance().getIceTransportFactory()->createTransport("master ICE");
     ice_master->initIceInstance(ice_config);
     cv_create.notify_all();
     ice_config.turnServers = {};
@@ -297,8 +297,8 @@ IceTest::testTurnMasterIceConnection()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
-    ice_slave = Manager::instance().getIceTransportFactory().createTransport("slave ICE");
+    ice_config.factory = Manager::instance().getIceTransportFactory();
+    ice_slave = Manager::instance().getIceTransportFactory()->createTransport("slave ICE");
     ice_slave->initIceInstance(ice_config);
 
     cv_create.notify_all();
@@ -367,8 +367,8 @@ IceTest::testTurnSlaveIceConnection()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
-    ice_master = Manager::instance().getIceTransportFactory().createTransport("master ICE");
+    ice_config.factory = Manager::instance().getIceTransportFactory();
+    ice_master = Manager::instance().getIceTransportFactory()->createTransport("master ICE");
     ice_master->initIceInstance(ice_config);
     cv_create.notify_all();
     ice_config.onInitDone = [&](bool ok) {
@@ -416,8 +416,8 @@ IceTest::testTurnSlaveIceConnection()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
-    ice_slave = Manager::instance().getIceTransportFactory().createTransport("slave ICE");
+    ice_config.factory = Manager::instance().getIceTransportFactory();
+    ice_slave = Manager::instance().getIceTransportFactory()->createTransport("slave ICE");
     ice_slave->initIceInstance(ice_config);
     cv_create.notify_all();
     CPPUNIT_ASSERT(
@@ -481,9 +481,9 @@ IceTest::testReceiveTooManyCandidates()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
+    ice_config.factory = Manager::instance().getIceTransportFactory();
 
-    ice_master = Manager::instance().getIceTransportFactory().createTransport("master ICE");
+    ice_master = Manager::instance().getIceTransportFactory()->createTransport("master ICE");
     ice_master->initIceInstance(ice_config);
     cv_create.notify_all();
     ice_config.onInitDone = [&](bool ok) {
@@ -525,9 +525,9 @@ IceTest::testReceiveTooManyCandidates()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
+    ice_config.factory = Manager::instance().getIceTransportFactory();
 
-    ice_slave = Manager::instance().getIceTransportFactory().createTransport("slave ICE");
+    ice_slave = Manager::instance().getIceTransportFactory()->createTransport("slave ICE");
     ice_slave->initIceInstance(ice_config);
     cv_create.notify_all();
     CPPUNIT_ASSERT(
@@ -594,8 +594,8 @@ IceTest::testCompleteOnFailure()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
-    ice_master = Manager::instance().getIceTransportFactory().createTransport("master ICE");
+    ice_config.factory = Manager::instance().getIceTransportFactory();
+    ice_master = Manager::instance().getIceTransportFactory()->createTransport("master ICE");
     ice_master->initIceInstance(ice_config);
     cv_create.notify_all();
     ice_config.onInitDone = [&](bool ok) {
@@ -643,8 +643,8 @@ IceTest::testCompleteOnFailure()
     ice_config.streamsCount = 1;
     ice_config.compCountPerStream = 1;
     ice_config.upnpContext = Manager::instance().upnpContext();
-    ice_config.factory = &Manager::instance().getIceTransportFactory();
-    ice_slave = Manager::instance().getIceTransportFactory().createTransport("slave ICE");
+    ice_config.factory = Manager::instance().getIceTransportFactory();
+    ice_slave = Manager::instance().getIceTransportFactory()->createTransport("slave ICE");
     ice_slave->initIceInstance(ice_config);
     cv_create.notify_all();
     // Check that nego failed and callback called