diff --git a/daemon/src/ip_utils.cpp b/daemon/src/ip_utils.cpp
index 3d2a9783b76d97c18d9aa38f0a9c73b6bdbca451..7262686739a92f5e50dd051401b8d7660a62cdcf 100644
--- a/daemon/src/ip_utils.cpp
+++ b/daemon/src/ip_utils.cpp
@@ -70,6 +70,17 @@ ip_utils::getAddrList(const std::string &name)
     return ipList;
 }
 
+bool
+ip_utils::haveCommonAddr(const std::vector<pj_sockaddr>& a, const std::vector<pj_sockaddr>& b)
+{
+    for (const auto &i : a) {
+        for (const auto &j : b) {
+            if (pj_sockaddr_cmp(&i, &j) == 0) return true;
+        }
+    }
+    return false;
+}
+
 std::string
 ip_utils::addrToStr(const pj_sockaddr& ip, bool include_port, bool force_ipv6_brackets)
 {
diff --git a/daemon/src/ip_utils.h b/daemon/src/ip_utils.h
index e6410cf4f7efcc8e37c40067d5ae7b3c6f195dc4..cdae791fa403692e575ff749ae9b316137a61e67 100644
--- a/daemon/src/ip_utils.h
+++ b/daemon/src/ip_utils.h
@@ -56,15 +56,22 @@ namespace ip_utils {
      */
     pj_sockaddr strToAddr(const std::string& str);
 
+    pj_sockaddr getAnyHostAddr(pj_uint16_t family = pj_AF_UNSPEC());
+
     /**
      * Returns true if address is a valid IPv6.
      */
     bool isIPv6(const std::string &address);
+
+    /**
+     * Return true if address is a valid IP address of specified family (if provided) or of any kind (default).
+     */
     bool isValidAddr(const std::string &address, pj_uint16_t family = pj_AF_UNSPEC());
 
     std::vector<pj_sockaddr> getAddrList(const std::string &name);
 
-    pj_sockaddr getAnyHostAddr(pj_uint16_t family = pj_AF_UNSPEC());
+    bool haveCommonAddr(const std::vector<pj_sockaddr>& a, const std::vector<pj_sockaddr>& b);
+
 }
 
 #endif // IP_UTILS_H_
diff --git a/daemon/src/sip/sipaccount.cpp b/daemon/src/sip/sipaccount.cpp
index b9aabf928d37451d90db25550db10f85fff1bd58..6bcaed0b27dace89d8e5787cf17fb06200825325 100644
--- a/daemon/src/sip/sipaccount.cpp
+++ b/daemon/src/sip/sipaccount.cpp
@@ -1146,20 +1146,18 @@ bool SIPAccount::hostnameMatch(const std::string& hostname, pjsip_endpoint * /*e
 {
     if (hostname == hostname_)
         return true;
-
-    const std::vector<std::string> a(sip_utils::getIPList(hostname));
-    const std::vector<std::string> b(sip_utils::getIPList(hostname_));
-    return haveValueInCommon(a, b);
+    const auto a = ip_utils::getAddrList(hostname);
+    const auto b = ip_utils::getAddrList(hostname_);
+    return ip_utils::haveCommonAddr(a, b);
 }
 
 bool SIPAccount::proxyMatch(const std::string& hostname, pjsip_endpoint * /*endpt*/, pj_pool_t * /*pool*/) const
 {
     if (hostname == serviceRoute_)
         return true;
-
-    const std::vector<std::string> a(sip_utils::getIPList(hostname));
-    const std::vector<std::string> b(sip_utils::getIPList(serviceRoute_));
-    return haveValueInCommon(a, b);
+    const auto a = ip_utils::getAddrList(hostname);
+    const auto b = ip_utils::getAddrList(hostname_);
+    return ip_utils::haveCommonAddr(a, b);
 }
 
 std::string SIPAccount::getLoginName()