diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp
index 9a348107a7948bcd622a6ce1ca80b46134128eae..6e6a196b3e6066e9f911486d9bd0a46399406da3 100644
--- a/src/sip/sipcall.cpp
+++ b/src/sip/sipcall.cpp
@@ -392,7 +392,10 @@ SIPCall::hangup(int reason)
     // Stop all RTP streams
     stopAllMedia();
     setState(Call::ConnectionState::DISCONNECTED, reason);
-    removeCall();
+    runOnMainThread([w = weak()] {
+        if (auto shared = w.lock())
+            shared->removeCall();
+    });
 }
 
 void
@@ -822,7 +825,10 @@ SIPCall::sendKeyframe()
 void
 SIPCall::onPeerRinging()
 {
-    setState(ConnectionState::RINGING);
+    runOnMainThread([w = weak()] {
+        if (auto shared = w.lock())
+            shared->setState(ConnectionState::RINGING);
+    });
 }
 
 void