diff --git a/src/sip/sipvoiplink.cpp b/src/sip/sipvoiplink.cpp
index b15477e94283880558afec82d2e735d5e508f348..c530074b8c460d02e22031013fe7bb5618b1ae65 100644
--- a/src/sip/sipvoiplink.cpp
+++ b/src/sip/sipvoiplink.cpp
@@ -84,13 +84,6 @@ namespace ring {
 
 /**************** EXTERN VARIABLES AND FUNCTIONS (callbacks) **************************/
 
-/**
- * Set audio and video (SDP) configuration for a call
- * localport, localip, localexternalport
- * @param call a SIPCall valid pointer
- */
-static pj_caching_pool pool_cache;
-static pj_pool_t *pool_;
 static pjsip_endpoint *endpt_;
 static pjsip_module mod_ua_;
 
@@ -101,8 +94,6 @@ static void invite_session_state_changed_cb(pjsip_inv_session *inv, pjsip_event
 static void outgoing_request_forked_cb(pjsip_inv_session *inv, pjsip_event *e);
 static void transaction_state_changed_cb(pjsip_inv_session *inv, pjsip_transaction *tsx, pjsip_event *e);
 
-pj_caching_pool* SIPVoIPLink::cp_ = &pool_cache;
-
 decltype(getGlobalInstance<SIPVoIPLink>)& getSIPVoIPLink = getGlobalInstance<SIPVoIPLink, 1>;
 
 /**
@@ -490,24 +481,31 @@ pjsip_module * SIPVoIPLink::getMod()
     return &mod_ua_;
 }
 
-pj_pool_t* SIPVoIPLink::getPool() const
+pj_pool_t*
+SIPVoIPLink::getPool() noexcept
+{
+    return pool_.get();
+}
+
+pj_caching_pool*
+SIPVoIPLink::getCachingPool() noexcept
 {
-    return pool_;
+    return &cp_;
 }
 
-SIPVoIPLink::SIPVoIPLink()
+SIPVoIPLink::SIPVoIPLink() : pool_(nullptr, pj_pool_release)
 {
 #define TRY(ret) do { \
     if (ret != PJ_SUCCESS) \
     throw VoipLinkException(#ret " failed"); \
 } while (0)
 
-    pj_caching_pool_init(cp_, &pj_pool_factory_default_policy, 0);
-    pool_ = pj_pool_create(&cp_->factory, PACKAGE, 4096, 4096, nullptr);
+    pj_caching_pool_init(&cp_, &pj_pool_factory_default_policy, 0);
+    pool_.reset(pj_pool_create(&cp_.factory, PACKAGE, 4096, 4096, nullptr));
     if (!pool_)
         throw VoipLinkException("UserAgent: Could not initialize memory pool");
 
-    TRY(pjsip_endpt_create(&cp_->factory, pj_gethostname()->ptr, &endpt_));
+    TRY(pjsip_endpt_create(&cp_.factory, pj_gethostname()->ptr, &endpt_));
 
     auto ns = ip_utils::getLocalNameservers();
     if (not ns.empty()) {
@@ -516,7 +514,7 @@ SIPVoIPLink::SIPVoIPLink()
             char hbuf[NI_MAXHOST];
             getnameinfo((sockaddr*)&ns[i], ns[i].getLength(), hbuf, sizeof(hbuf), nullptr, 0, NI_NUMERICHOST);
             RING_DBG("Using SIP nameserver: %s", hbuf);
-            pj_strdup2(pool_, &dns_nameservers[i], hbuf);
+            pj_strdup2(pool_.get(), &dns_nameservers[i], hbuf);
         }
         pj_dns_resolver* resv;
         TRY(pjsip_endpt_create_resolver(endpt_, &resv));
@@ -524,7 +522,7 @@ SIPVoIPLink::SIPVoIPLink()
         TRY(pjsip_endpt_set_resolver(endpt_, resv));
     }
 
-    sipTransportBroker.reset(new SipTransportBroker(endpt_, *cp_, *pool_));
+    sipTransportBroker.reset(new SipTransportBroker(endpt_, cp_, *pool_));
 
     auto status = pjsip_tpmgr_set_state_cb(pjsip_endpt_get_tpmgr(endpt_),
                                            tp_state_callback);
@@ -625,8 +623,8 @@ SIPVoIPLink::~SIPVoIPLink()
     sipTransportBroker.reset();
 
     pjsip_endpt_destroy(endpt_);
-    pj_pool_release(pool_);
-    pj_caching_pool_destroy(cp_);
+    pool_.reset();
+    pj_caching_pool_destroy(&cp_);
 
     RING_DBG("destroying SIPVoIPLink@%p", this);
 }
@@ -663,7 +661,7 @@ SIPVoIPLink::guessAccount(const std::string& userName,
     for (const auto& account : Manager::instance().getAllAccounts<SIPAccount>()) {
         if (!account)
             continue;
-        const MatchRank match(account->matches(userName, server, endpt_, pool_));
+        const MatchRank match(account->matches(userName, server, endpt_, pool_.get()));
 
         // return right away if this is a full match
         if (match == MatchRank::FULL) {
@@ -1306,7 +1304,7 @@ SIPVoIPLink::resolveSrvName(const std::string &name, pjsip_transport_type_e type
             }
         });
 
-    pjsip_endpt_resolve(endpt_, pool_, &host_info, (void*)token, resolver_callback);
+    pjsip_endpt_resolve(endpt_, pool_.get(), &host_info, (void*)token, resolver_callback);
 }
 
 #define RETURN_IF_NULL(A, M, ...) \
@@ -1346,7 +1344,7 @@ SIPVoIPLink::findLocalAddressFromTransport(pjsip_transport* transport,
     auto tp_sel = getTransportSelector(transport);
     pjsip_tpmgr_fla2_param param = { transportType, &tp_sel, pjstring, PJ_FALSE,
                                      {nullptr, 0}, 0, nullptr };
-    if (pjsip_tpmgr_find_local_addr2(tpmgr, pool_, &param) != PJ_SUCCESS) {
+    if (pjsip_tpmgr_find_local_addr2(tpmgr, pool_.get(), &param) != PJ_SUCCESS) {
         RING_WARN("Could not retrieve local address and port from transport, using %s :%d",
                   addr.c_str(), port);
         return;
@@ -1393,7 +1391,7 @@ SIPVoIPLink::findLocalAddressFromSTUN(pjsip_transport* transport,
     pj_sock_t sipSocket = pjsip_udp_transport_get_socket(transport);
     const pjstun_setting stunOpt = {PJ_TRUE, *stunServerName, stunPort,
                                     *stunServerName, stunPort};
-    const pj_status_t stunStatus = pjstun_get_mapped_addr2(&cp_->factory,
+    const pj_status_t stunStatus = pjstun_get_mapped_addr2(&cp_.factory,
                                                            &stunOpt, 1,
                                                            &sipSocket,
                                                            &mapped_addr);
diff --git a/src/sip/sipvoiplink.h b/src/sip/sipvoiplink.h
index 7492c0423301c05b173b6161f1059b988230c2d2..8b32933e22bd694c1523e371591898870f516bf7 100644
--- a/src/sip/sipvoiplink.h
+++ b/src/sip/sipvoiplink.h
@@ -142,11 +142,8 @@ class SIPVoIPLink {
         pjsip_endpoint * getEndpoint();
         pjsip_module * getMod();
 
-        pj_caching_pool* getCachingPool() const {
-           return cp_;
-        }
-
-        pj_pool_t* getPool() const;
+        pj_caching_pool* getCachingPool() noexcept;
+        pj_pool_t* getPool() noexcept;
 
         /**
          * Get the correct address to use (ie advertised) from
@@ -180,7 +177,8 @@ class SIPVoIPLink {
     private:
         NON_COPYABLE(SIPVoIPLink);
 
-        static pj_caching_pool* cp_;
+        mutable pj_caching_pool cp_;
+        std::unique_ptr<pj_pool_t, decltype(pj_pool_release)&> pool_;
 
 #ifdef RING_VIDEO
         void dequeKeyframeRequests();