diff --git a/src/call.cpp b/src/call.cpp
index 01b2ed5df0c5b919764df2adca357bfa919ce4c4..27a88efbd98faa264876428439fed576bcadfbad 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -134,6 +134,8 @@ Call::Call(const std::shared_ptr<Account>& account,
         // kill pending subcalls at disconnect
         if (call_state == CallState::OVER)
             hangupCalls(safePopSubcalls(), 0);
+
+        return true;
     });
 
     time(&timestamp_start_);
@@ -265,8 +267,12 @@ Call::setState(CallState call_state, ConnectionState cnx_state, signed code)
     connectionState_ = cnx_state;
     auto new_client_state = getStateStr();
 
-    for (auto& l : stateChangedListeners_)
-        l(callState_, connectionState_, code);
+    for (auto it = stateChangedListeners_.begin(); it != stateChangedListeners_.end(); ) {
+        if ((*it)(callState_, connectionState_, code))
+            ++it;
+        else
+            it = stateChangedListeners_.erase(it);
+    }
 
     if (old_client_state != new_client_state) {
         if (not parent_) {
@@ -481,6 +487,7 @@ Call::addSubCall(Call& subcall)
                     }
                 }
             });
+            return true;
         });
 }
 
diff --git a/src/call.h b/src/call.h
index 972860cd69d401fa99a09087754888125ad77e59..8e4e930c30a4ed1529c8502d722ddebfd4fd47f4 100644
--- a/src/call.h
+++ b/src/call.h
@@ -109,7 +109,7 @@ public:
 
     using SubcallSet = std::set<std::shared_ptr<Call>, std::owner_less<std::shared_ptr<Call>>>;
     using OnReadyCb = std::function<void(bool)>;
-    using StateListenerCb = std::function<void(CallState, ConnectionState, int)>;
+    using StateListenerCb = std::function<bool(CallState, ConnectionState, int)>;
 
     /**
      * This determines if the call originated from the local user (OUTGOING)
diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index 5fbf2411b8a63d33da178c9ba42b5ae0a5533c5c..542cf42f24bd85c3021b9860dc601428f45dd9f2 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -604,7 +604,9 @@ JamiAccount::startOutgoingCall(const std::shared_ptr<SIPCall>& call, const std::
                         and state != Call::ConnectionState::TRYING) {
                         if (auto shared = w.lock())
                             shared->callConnectionClosed(deviceId, true);
+                        return false;
                     }
+                    return true;
                 });
             call->addSubCall(*dev_call);
             dev_call->setIceMedia(call->getIceMedia());
@@ -665,7 +667,9 @@ JamiAccount::startOutgoingCall(const std::shared_ptr<SIPCall>& call, const std::
                     and state != Call::ConnectionState::TRYING) {
                     if (auto shared = w.lock())
                         shared->callConnectionClosed(deviceId, true);
+                    return false;
                 }
+                return true;
             });
 
         auto remote_address = ice->getRemoteAddress(ICE_COMP_ID_SIP_TRANSPORT);