diff --git a/src/media/socket_pair.cpp b/src/media/socket_pair.cpp
index 0b7045aca93be2125c667c1501b8695a36ffa752..db6cf84102ad00c204bca5512de2f0b58b9866eb 100644
--- a/src/media/socket_pair.cpp
+++ b/src/media/socket_pair.cpp
@@ -148,7 +148,7 @@ udp_set_url(struct sockaddr_storage* addr, const char* hostname, int port)
 }
 
 static int
-udp_socket_create(sockaddr_storage* addr, socklen_t* addr_len, int local_port)
+udp_socket_create(sockaddr_storage* addr, socklen_t* addr_len, int local_port, int& family)
 {
     int udp_fd = -1;
     struct addrinfo* res0 = nullptr;
@@ -160,12 +160,14 @@ udp_socket_create(sockaddr_storage* addr, socklen_t* addr_len, int local_port)
     for (res = res0; res; res=res->ai_next) {
 #ifdef __APPLE__
         udp_fd = socket(res->ai_family, SOCK_DGRAM, 0);
-        if (udp_fd != -1 && fcntl(udp_fd, F_SETFL, O_NONBLOCK) != -1)
+        if (udp_fd != -1 && fcntl(udp_fd, F_SETFL, O_NONBLOCK) != -1) {
 #else
         udp_fd = socket(res->ai_family, SOCK_DGRAM | SOCK_NONBLOCK, 0);
-        if (udp_fd != -1)
+        if (udp_fd != -1) {
 #endif
-           break;
+            family = res->ai_family;
+            break;
+        }
 
         RING_ERR("socket error");
      }
@@ -317,8 +319,8 @@ SocketPair::openSockets(const char* uri, int local_rtp_port)
     socklen_t rtp_len, rtcp_len;
 
     // Open sockets and store addresses for sending
-    if ((rtpHandle_ = udp_socket_create(&rtp_addr, &rtp_len, local_rtp_port)) == -1 or
-        (rtcpHandle_ = udp_socket_create(&rtcp_addr, &rtcp_len, local_rtcp_port)) == -1 or
+    if ((rtpHandle_ = udp_socket_create(&rtp_addr, &rtp_len, local_rtp_port, rtpFamily_)) == -1 or
+        (rtcpHandle_ = udp_socket_create(&rtcp_addr, &rtcp_len, local_rtcp_port, rtcpFamily_)) == -1 or
         (rtpDestAddrLen_ = udp_set_url(&rtpDestAddr_, hostname, rtp_port)) == 0 or
         (rtcpDestAddrLen_ = udp_set_url(&rtcpDestAddr_, hostname, rtcp_port)) == 0) {
 
@@ -334,7 +336,13 @@ SocketPair::openSockets(const char* uri, int local_rtp_port)
 MediaIOHandle*
 SocketPair::createIOContext(const uint16_t mtu)
 {
-    auto ip_header_size = rtp_sock_->getTransportOverhead();
+    unsigned ip_header_size;
+    if (rtp_sock_)
+        ip_header_size = rtp_sock_->getTransportOverhead();
+    else if (rtpFamily_ == AF_INET6)
+        ip_header_size = 40;
+    else
+        ip_header_size = 20;
     return new MediaIOHandle( mtu - (srtpContext_ ? SRTP_OVERHEAD : 0) - UDP_HEADER_SIZE - ip_header_size,
                               true,
                              [](void* sp, uint8_t* buf, int len){ return static_cast<SocketPair*>(sp)->readCallback(buf, len); },
diff --git a/src/media/socket_pair.h b/src/media/socket_pair.h
index 95fc503473a72e7058179a6a4138a8fd1a4beada..022fb0dc7b0294ff21b5282ea0717b4e66a2b0ea 100644
--- a/src/media/socket_pair.h
+++ b/src/media/socket_pair.h
@@ -129,6 +129,8 @@ class SocketPair {
 
         int rtpHandle_ {-1};
         int rtcpHandle_ {-1};
+        int rtpFamily_ {0};
+        int rtcpFamily_ {0};
         sockaddr_storage rtpDestAddr_;
         socklen_t rtpDestAddrLen_;
         sockaddr_storage rtcpDestAddr_;
diff --git a/src/security/tls_session.cpp b/src/security/tls_session.cpp
index 526638a2854a2dd7471d1306bd78f04588e63b5d..a6fc829713eca3f2833a60b31d7648e53ad3dc82 100644
--- a/src/security/tls_session.cpp
+++ b/src/security/tls_session.cpp
@@ -44,8 +44,6 @@ namespace ring { namespace tls {
 
 static constexpr const char* TLS_CERT_PRIORITY_STRING {"SECURE192:-VERS-TLS-ALL:+VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION"};
 static constexpr const char* TLS_FULL_PRIORITY_STRING {"SECURE192:-KX-ALL:+ANON-ECDH:+ANON-DH:+SECURE192:-VERS-TLS-ALL:+VERS-DTLS-ALL:-RSA:%SERVER_PRECEDENCE:%SAFE_RENEGOTIATION"};
-static constexpr int DTLS_MTU {1232}; // (1280 from IPv6 minimum MTU - 40 IPv6 header - 8 UDP header)
-static constexpr uint16_t MIN_MTU {512};
 static constexpr uint16_t INPUT_BUFFER_SIZE {16*1024}; // to be coherent with the maximum size advised in path mtu discovery
 static constexpr std::size_t INPUT_MAX_SIZE {1000}; // Maximum packet to store before dropping (pkt size = DTLS_MTU)
 static constexpr ssize_t FLOOD_THRESHOLD {4*1024};
diff --git a/src/security/tls_session.h b/src/security/tls_session.h
index c66c903706bdffcbf9afcce178fe5873d6b343fc..b1854b6c9fd0ed8c1a3329f51a01999e076db78f 100644
--- a/src/security/tls_session.h
+++ b/src/security/tls_session.h
@@ -55,6 +55,8 @@ struct PrivateKey;
 namespace ring { namespace tls {
 
 static constexpr uint8_t MTUS_TO_TEST = 4; //number of mtus to test in path mtu discovery.
+static constexpr int DTLS_MTU {1232}; // (1280 from IPv6 minimum MTU - 40 IPv6 header - 8 UDP header)
+static constexpr uint16_t MIN_MTU {512};
 
 enum class TlsSessionState {
     SETUP,
diff --git a/src/sip/siptransport.cpp b/src/sip/siptransport.cpp
index ee54f1107737a90feb6b937ef72576f9a358702d..f293332219f03b1ae5c3ba21c3f0746bf941dc02 100644
--- a/src/sip/siptransport.cpp
+++ b/src/sip/siptransport.cpp
@@ -23,6 +23,7 @@
 #include "sip_utils.h"
 #include "ip_utils.h"
 #include "ice_transport.h"
+#include "security/tls_session.h"
 
 #include "ringdht/sip_transport_ice.h"
 #include "ringdht/sips_transport_ice.h"
@@ -174,9 +175,13 @@ SipTransport::removeStateListener(uintptr_t lid)
 }
 
 uint16_t
-SipTransport::getTlsMtu(){
-    auto tls_tr = reinterpret_cast<tls::SipsIceTransport::TransportData*>(transport_.get())->self;
-    return tls_tr->getTlsSessionMtu();
+SipTransport::getTlsMtu()
+{
+    if (isIceTransport_ && isSecure()) {
+        auto tls_tr = reinterpret_cast<tls::SipsIceTransport::TransportData*>(transport_.get())->self;
+        return tls_tr->getTlsSessionMtu();
+    }
+    return ring::tls::DTLS_MTU;
 }
 
 SipTransportBroker::SipTransportBroker(pjsip_endpoint *endpt,
@@ -431,6 +436,7 @@ SipTransportBroker::getIceTransport(const std::shared_ptr<IceTransport>& ice,
         new SipIceTransport(endpt_, pool_, ice_pj_transport_type_, ice, comp_id));
     auto tr = sip_ice_tr->getTransportBase();
     auto sip_tr = std::make_shared<SipTransport>(tr);
+    sip_tr->setIsIceTransport();
     sip_ice_tr.release(); // managed by PJSIP now
 
     {
@@ -453,6 +459,7 @@ SipTransportBroker::getTlsIceTransport(const std::shared_ptr<ring::IceTransport>
         new tls::SipsIceTransport(endpt_, type, params, ice, comp_id));
     auto tr = sip_ice_tr->getTransportBase();
     auto sip_tr = std::make_shared<SipTransport>(tr);
+    sip_tr->setIsIceTransport();
     sip_ice_tr.release(); // managed by PJSIP now
 
     {
diff --git a/src/sip/siptransport.h b/src/sip/siptransport.h
index 0e4919e16edaf50e35eb532e1a29d62f4955496c..ab4fbbf39d1f5196d255c210843efc20a72e20e6 100644
--- a/src/sip/siptransport.h
+++ b/src/sip/siptransport.h
@@ -138,6 +138,8 @@ class SipTransport
         /** Only makes sense for connection-oriented transports */
         bool isConnected() const noexcept { return connected_; }
 
+        void setIsIceTransport() { isIceTransport_ = true; }
+
         uint16_t getTlsMtu();
 
     private:
@@ -151,6 +153,7 @@ class SipTransport
         std::mutex stateListenersMutex_;
 
         bool connected_ {false};
+        bool isIceTransport_ {false};
         TlsInfos tlsInfos_;
 };