diff --git a/daemon/src/audio/audiolayer.cpp b/daemon/src/audio/audiolayer.cpp
index ca0342e2e88793582c59424faaa1b437179937fe..33b7bbdcc4c93ca9e13f710b5552fec1e72efa2a 100644
--- a/daemon/src/audio/audiolayer.cpp
+++ b/daemon/src/audio/audiolayer.cpp
@@ -86,7 +86,7 @@ void AudioLayer::applyGain(SFLDataFormat *src , int samples, int gain)
 // Notify (with a beep) an incoming call when there is already a call in progress
 void AudioLayer::notifyIncomingCall()
 {
-    if (!Manager::instance().incomingCallWaiting())
+    if (!Manager::instance().incomingCallsWaiting())
         return;
 
     time_t now = time(NULL);
diff --git a/daemon/src/managerimpl.cpp b/daemon/src/managerimpl.cpp
index 0b20dd318942de418582d63a742c68a2dea9176e..a7baefa4346cf4ca0d89df27e37ecf1339951f34 100644
--- a/daemon/src/managerimpl.cpp
+++ b/daemon/src/managerimpl.cpp
@@ -91,13 +91,13 @@ ManagerImpl::ManagerImpl() :
     hasTriedToRegister_(false), audioCodecFactory(), dbus_(), config_(),
     currentCallId_(), currentCallMutex_(), audiodriver_(0), dtmfKey_(),
     toneMutex_(), telephoneTone_(), audiofile_(), audioLayerMutex_(),
-    waitingCall_(), waitingCallMutex_(), nbIncomingWaitingCall_(0), path_(),
+    waitingCalls_(), waitingCallsMutex_(), path_(),
     IPToIPMap_(), mainBuffer_(), conferenceMap_(), history_(), finished_(false)
 {
     pthread_mutex_init(&currentCallMutex_, NULL);
     pthread_mutex_init(&toneMutex_, NULL);
     pthread_mutex_init(&audioLayerMutex_, NULL);
-    pthread_mutex_init(&waitingCallMutex_, NULL);
+    pthread_mutex_init(&waitingCallsMutex_, NULL);
     // initialize random generator for call id
     srand(time(NULL));
 }
@@ -105,7 +105,7 @@ ManagerImpl::ManagerImpl() :
 ManagerImpl::~ManagerImpl()
 {
     // destroy in reverse order of initialization
-    pthread_mutex_destroy(&waitingCallMutex_);
+    pthread_mutex_destroy(&waitingCallsMutex_);
     pthread_mutex_destroy(&audioLayerMutex_);
     pthread_mutex_destroy(&toneMutex_);
     pthread_mutex_destroy(&currentCallMutex_);
@@ -1440,24 +1440,22 @@ void ManagerImpl::playDtmf(char code)
 }
 
 // Multi-thread
-bool ManagerImpl::incomingCallWaiting() const
+bool ManagerImpl::incomingCallsWaiting()
 {
-    return nbIncomingWaitingCall_ > 0;
+    sfl::ScopedLock m(waitingCallsMutex_);
+    return not waitingCalls_.empty();
 }
 
 void ManagerImpl::addWaitingCall(const std::string& id)
 {
-    sfl::ScopedLock m(waitingCallMutex_);
-    waitingCall_.insert(id);
-    nbIncomingWaitingCall_++;
+    sfl::ScopedLock m(waitingCallsMutex_);
+    waitingCalls_.insert(id);
 }
 
 void ManagerImpl::removeWaitingCall(const std::string& id)
 {
-    sfl::ScopedLock m(waitingCallMutex_);
-
-    if (waitingCall_.erase(id))
-        nbIncomingWaitingCall_--;
+    sfl::ScopedLock m(waitingCallsMutex_);
+    waitingCalls_.erase(id);
 }
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -1685,6 +1683,9 @@ void ManagerImpl::peerHungupCall(const std::string& call_id)
     dbus_.getCallManager()->callStateChanged(call_id, "HUNGUP");
 
     removeWaitingCall(call_id);
+    if (not incomingCallsWaiting())
+        stopTone();
+
     checkAudio();
     removeStream(call_id);
 }
diff --git a/daemon/src/managerimpl.h b/daemon/src/managerimpl.h
index f06c6b3666603083b59e1adbbc40a7d16e54c627..28bacf5a7ef419d4bf40c5518085cae6d3b67430 100644
--- a/daemon/src/managerimpl.h
+++ b/daemon/src/managerimpl.h
@@ -754,7 +754,7 @@ class ManagerImpl {
          * @return true is there is one or many incoming call waiting
          * new call, not anwsered or refused
          */
-        bool incomingCallWaiting() const;
+        bool incomingCallsWaiting();
 
         /**
          * Return a new random callid that is not present in the list
@@ -871,17 +871,12 @@ class ManagerImpl {
         /**
          * Waiting Call Vectors
          */
-        CallIDSet waitingCall_;
+        CallIDSet waitingCalls_;
 
         /**
          * Protect waiting call list, access by many voip/audio threads
          */
-        pthread_mutex_t waitingCallMutex_;
-
-        /**
-         * Number of waiting call, synchronize with waitingcall callidvector
-         */
-        unsigned int nbIncomingWaitingCall_;
+        pthread_mutex_t waitingCallsMutex_;
 
         /**
          * Add incoming callid to the waiting list