diff --git a/bin/jni/callmanager.i b/bin/jni/callmanager.i
index 0a38464a2a2f6ef2cd7ada4309c7880e70013a35..a66328afd5711cec57a97af621a046ade8375359 100644
--- a/bin/jni/callmanager.i
+++ b/bin/jni/callmanager.i
@@ -47,6 +47,7 @@ public:
     virtual void recordStateChange(const std::string& call_id, int state){}
     virtual void onRtcpReportReceived(const std::string& call_id, const std::map<std::string, int>& stats){}
     virtual void peerHold(const std::string& call_id, bool holding){}
+    virtual void connectionUpdate(const std::string& id, int state){}
 };
 
 
@@ -132,4 +133,5 @@ public:
     virtual void recordStateChange(const std::string& call_id, int state){}
     virtual void onRtcpReportReceived(const std::string& call_id, const std::map<std::string, int>& stats){}
     virtual void peerHold(const std::string& call_id, bool holding){}
+    virtual void connectionUpdate(const std::string& id, int state){}
 };
diff --git a/bin/jni/jni_interface.i b/bin/jni/jni_interface.i
index 463a8b4bd52cfd13fae2265af8d9627c94b7d74f..59007e6f2473263729a3baf339635c8f612e68b5 100644
--- a/bin/jni/jni_interface.i
+++ b/bin/jni/jni_interface.i
@@ -237,7 +237,8 @@ void init(ConfigurationCallback* confM, Callback* callM, PresenceCallback* presM
         exportable_callback<CallSignal::ConferenceRemoved>(bind(&Callback::conferenceRemoved, callM, _1)),
         exportable_callback<CallSignal::RecordingStateChanged>(bind(&Callback::recordingStateChanged, callM, _1, _2)),
         exportable_callback<CallSignal::RtcpReportReceived>(bind(&Callback::onRtcpReportReceived, callM, _1, _2)),
-        exportable_callback<CallSignal::PeerHold>(bind(&Callback::peerHold, callM, _1, _2))
+        exportable_callback<CallSignal::PeerHold>(bind(&Callback::peerHold, callM, _1, _2)),
+        exportable_callback<CallSignal::ConnectionUpdate>(bind(&Callback::connectionUpdate, callM, _1, _2))
     };
 
     // Configuration event handlers
diff --git a/src/client/ring_signal.cpp b/src/client/ring_signal.cpp
index 8e11d6c677724cfd58f2914fc877349a1f288fe4..7aa50b41844c916f56244a2f6dccff2d6bae2b50 100644
--- a/src/client/ring_signal.cpp
+++ b/src/client/ring_signal.cpp
@@ -47,6 +47,7 @@ getSignalHandlers()
         exported_callback<DRing::CallSignal::VideoMuted>(),
         exported_callback<DRing::CallSignal::AudioMuted>(),
         exported_callback<DRing::CallSignal::SmartInfo>(),
+        exported_callback<DRing::CallSignal::ConnectionUpdate>(),
 
         /* Configuration */
         exported_callback<DRing::ConfigurationSignal::VolumeChanged>(),
diff --git a/src/dring/callmanager_interface.h b/src/dring/callmanager_interface.h
index 19c1b5a54439fb5bfbf0289bb08e597afd7a4e49..dd60596032f4cddca64a99fe3f319e9068c286fe 100644
--- a/src/dring/callmanager_interface.h
+++ b/src/dring/callmanager_interface.h
@@ -185,6 +185,10 @@ struct DRING_PUBLIC CallSignal {
                 constexpr static const char* name = "SmartInfo";
                 using cb_type = void(const std::map<std::string, std::string>&);
         };
+        struct DRING_PUBLIC ConnectionUpdate {
+                constexpr static const char* name = "ConnectionUpdate";
+                using cb_type = void(const std::string&, int);
+        };
 };
 
 } // namespace DRing
diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp
index 0612bc3d0be399232e403c440a8c6ab188d3a519..2cbeaae473bcce88ce6672c314693aa46141141a 100644
--- a/src/ice_transport.cpp
+++ b/src/ice_transport.cpp
@@ -25,6 +25,7 @@
 #include "manager.h"
 #include "upnp/upnp_control.h"
 #include "transport/peer_channel.h"
+#include "dring/callmanager_interface.h"
 
 #include <pjlib.h>
 
@@ -387,6 +388,8 @@ IceTransport::Impl::~Impl()
 
     if (config_.stun_cfg.timer_heap)
         pj_timer_heap_destroy(config_.stun_cfg.timer_heap);
+
+    emitSignal<DRing::CallSignal::ConnectionUpdate>(std::to_string((uintptr_t)this), 2);
 }
 
 bool
@@ -919,6 +922,8 @@ IceTransport::start(const Attribute& rem_attrs, const std::vector<IceCandidate>&
         pimpl_->is_stopped_ = true;
         return false;
     }
+
+    emitSignal<DRing::CallSignal::ConnectionUpdate>(std::to_string((uintptr_t)pimpl_.get()), 0);
     return true;
 }
 
@@ -952,6 +957,8 @@ IceTransport::start(const SDP& sdp)
         pimpl_->is_stopped_ = true;
         return false;
     }
+
+    emitSignal<DRing::CallSignal::ConnectionUpdate>(std::to_string((uintptr_t)pimpl_.get()), 0);
     return true;
 }