diff --git a/src/call.cpp b/src/call.cpp
index 5ffb2a685aebe9a0ab4bbb7f5c7a9ecf8cbfdda1..bfb98328f5f72275f4558ed772502e63c2b9f166 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -46,7 +46,10 @@ Call::Call(Account& account, const std::string& id, Call::CallType type)
 {
     addStateListener([this](UNUSED Call::CallState call_state,
                             UNUSED Call::ConnectionState cnx_state,
-                            UNUSED int code) { checkPendingIM(); });
+                            UNUSED int code) {
+        checkPendingIM();
+        checkAudio();
+    });
 
     time(&timestamp_start_);
     account_.attachCall(id_);
@@ -499,4 +502,20 @@ Call::checkPendingIM()
     }
 }
 
+/**
+ * Handle tones for RINGING and BUSY calls
+ */
+void
+Call::checkAudio()
+{
+    using namespace DRing::Call;
+
+    auto state = getStateStr();
+    if (state == StateEvent::RINGING) {
+        Manager::instance().peerRingingCall(*this);
+    } else if (state == StateEvent::BUSY) {
+        Manager::instance().callBusy(*this);
+    }
+}
+
 } // namespace ring
diff --git a/src/call.h b/src/call.h
index b9da627dc11c47a1d6319b90103f122cb8bba1b6..fa8ad569691e63c7c1be06d1f6310a2b84b2b997 100644
--- a/src/call.h
+++ b/src/call.h
@@ -371,6 +371,8 @@ class Call : public Recordable, public std::enable_shared_from_this<Call> {
 
         void checkPendingIM();
 
+        void checkAudio();
+
         /** Protect every attribute that can be changed by two threads */
         mutable std::recursive_mutex callMutex_ {};
 
diff --git a/src/sip/sipcall.cpp b/src/sip/sipcall.cpp
index 7bec8a9e922b37701f6c14751e9a1a6042c9c5b7..440d7808cecd515d70d6065c5796690d6b807de6 100644
--- a/src/sip/sipcall.cpp
+++ b/src/sip/sipcall.cpp
@@ -721,7 +721,6 @@ void
 SIPCall::onPeerRinging()
 {
     setState(ConnectionState::RINGING);
-    Manager::instance().peerRingingCall(*this);
 }
 
 void