diff --git a/src/api/call.h b/src/api/call.h
index 99d3bbc3d3848eb5bf2c471673925bc12c52b2ed..a8e51ca1b8b2301d0a8214165573ba8c0164c4d4 100644
--- a/src/api/call.h
+++ b/src/api/call.h
@@ -161,6 +161,29 @@ canSendSIPMessage(const Info& call) {
     }
 }
 
+static inline bool
+isTerminating(const Status& status) {
+    switch(status)
+    {
+    case call::Status::INVALID:
+    case call::Status::INACTIVE:
+    case call::Status::ENDED:
+    case call::Status::PEER_BUSY:
+    case call::Status::TIMEOUT:
+    case call::Status::TERMINATING:
+        return true;
+    case call::Status::PAUSED:
+    case call::Status::IN_PROGRESS:
+    case call::Status::INCOMING_RINGING:
+    case call::Status::OUTGOING_RINGING:
+    case call::Status::CONNECTED:
+    case call::Status::CONNECTING:
+    case call::Status::SEARCHING:
+    default:
+        return false;
+    }
+}
+
 } // namespace call
 } // namespace api
 } // namespace lrc
diff --git a/src/newcallmodel.cpp b/src/newcallmodel.cpp
index af9af13f240f10580148157aced68c4e1d90cce4..d37f91d564cee4dfd42c79d1f3438cf2af39ede0 100644
--- a/src/newcallmodel.cpp
+++ b/src/newcallmodel.cpp
@@ -492,6 +492,13 @@ NewCallModelPimpl::slotCallStateChanged(const std::string& callId, const std::st
 
     auto status = call::to_status(state);
     auto& call = calls[callId];
+
+    if (status == call::Status::ENDED && !call::isTerminating(call->status)) {
+        call->status = call::Status::TERMINATING;
+        emit linked.callStatusChanged(callId);
+    }
+
+    // proper state transition
     auto previousStatus = call->status;
     call->status = status;