diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3ca7e5c880ac8c4d0be79c7e7fb5a1d1817d333b..026e3c4bcdc8ee3b26961a9c236f19f8c3f1c662 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -581,7 +581,7 @@ if(USE_BUNDLED_MTXCLIENT)
 	FetchContent_Declare(
 		MatrixClient
 		GIT_REPOSITORY https://github.com/Nheko-Reborn/mtxclient.git
-		GIT_TAG        6f908f379c6d7afb6117baee3a59c6f5e3adfdda
+		GIT_TAG        c2824dae5050882872a6c3f5677f3309a60511be
 		)
 	set(BUILD_LIB_EXAMPLES OFF CACHE INTERNAL "")
 	set(BUILD_LIB_TESTS OFF CACHE INTERNAL "")
diff --git a/io.github.NhekoReborn.Nheko.yaml b/io.github.NhekoReborn.Nheko.yaml
index 25dc4e943b891a6710983d7fd919a0c300f2ef2f..879043b26593120bac76bd1702834852b0aa2ab5 100644
--- a/io.github.NhekoReborn.Nheko.yaml
+++ b/io.github.NhekoReborn.Nheko.yaml
@@ -203,7 +203,7 @@ modules:
     buildsystem: cmake-ninja
     name: mtxclient
     sources:
-      - commit: 6f908f379c6d7afb6117baee3a59c6f5e3adfdda
+      - commit: c2824dae5050882872a6c3f5677f3309a60511be
         #tag: v0.7.0
         type: git
         url: https://github.com/Nheko-Reborn/mtxclient.git
diff --git a/src/Cache.cpp b/src/Cache.cpp
index c9baaf5ef640bd5f47b56b29bd08094e2befd615..79a5ea0485078fbeda48bf1b2768dc063f21c8ac 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -1639,18 +1639,18 @@ isMessage(const mtx::events::EncryptedEvent<T> &)
 }
 
 auto
-isMessage(const mtx::events::RoomEvent<mtx::events::msg::CallInvite> &)
+isMessage(const mtx::events::RoomEvent<mtx::events::voip::CallInvite> &)
 {
     return true;
 }
 
 auto
-isMessage(const mtx::events::RoomEvent<mtx::events::msg::CallAnswer> &)
+isMessage(const mtx::events::RoomEvent<mtx::events::voip::CallAnswer> &)
 {
     return true;
 }
 auto
-isMessage(const mtx::events::RoomEvent<mtx::events::msg::CallHangUp> &)
+isMessage(const mtx::events::RoomEvent<mtx::events::voip::CallHangUp> &)
 {
     return true;
 }
diff --git a/src/ChatPage.cpp b/src/ChatPage.cpp
index 56be64602bee5a870d1d404e8b93cb5ce7cb7c95..baab28d1f8db464970e422ebec1cd00e53d20d84 100644
--- a/src/ChatPage.cpp
+++ b/src/ChatPage.cpp
@@ -247,10 +247,10 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QObject *parent)
       },
       Qt::QueuedConnection);
 
-    connectCallMessage<mtx::events::msg::CallInvite>();
-    connectCallMessage<mtx::events::msg::CallCandidates>();
-    connectCallMessage<mtx::events::msg::CallAnswer>();
-    connectCallMessage<mtx::events::msg::CallHangUp>();
+    connectCallMessage<mtx::events::voip::CallInvite>();
+    connectCallMessage<mtx::events::voip::CallCandidates>();
+    connectCallMessage<mtx::events::voip::CallAnswer>();
+    connectCallMessage<mtx::events::voip::CallHangUp>();
 }
 
 void
diff --git a/src/EventAccessors.cpp b/src/EventAccessors.cpp
index e4dfe92ea891acbcd89030f29cd4f97981ec4797..659338a050198be1e92b4f92f9eeb593cf1ae362 100644
--- a/src/EventAccessors.cpp
+++ b/src/EventAccessors.cpp
@@ -75,9 +75,9 @@ struct CallType
     template<class T>
     std::string operator()(const T &e)
     {
-        if constexpr (std::is_same_v<mtx::events::RoomEvent<mtx::events::msg::CallInvite>, T>) {
+        if constexpr (std::is_same_v<mtx::events::RoomEvent<mtx::events::voip::CallInvite>, T>) {
             const char video[]     = "m=video";
-            const std::string &sdp = e.content.sdp;
+            const std::string &sdp = e.content.offer.sdp;
             return std::search(sdp.cbegin(),
                                sdp.cend(),
                                std::cbegin(video),
diff --git a/src/Utils.cpp b/src/Utils.cpp
index 0ac37d8e747e78a6f157aa4cd37dcab4ec01a61a..bdc1a4112402cffcb16aa8041e76aa8ff553b694 100644
--- a/src/Utils.cpp
+++ b/src/Utils.cpp
@@ -209,9 +209,9 @@ utils::getMessageDescription(const TimelineEvent &event,
     using Notice     = mtx::events::RoomEvent<mtx::events::msg::Notice>;
     using Text       = mtx::events::RoomEvent<mtx::events::msg::Text>;
     using Video      = mtx::events::RoomEvent<mtx::events::msg::Video>;
-    using CallInvite = mtx::events::RoomEvent<mtx::events::msg::CallInvite>;
-    using CallAnswer = mtx::events::RoomEvent<mtx::events::msg::CallAnswer>;
-    using CallHangUp = mtx::events::RoomEvent<mtx::events::msg::CallHangUp>;
+    using CallInvite = mtx::events::RoomEvent<mtx::events::voip::CallInvite>;
+    using CallAnswer = mtx::events::RoomEvent<mtx::events::voip::CallAnswer>;
+    using CallHangUp = mtx::events::RoomEvent<mtx::events::voip::CallHangUp>;
     using Encrypted  = mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>;
 
     if (std::holds_alternative<Audio>(event)) {
diff --git a/src/Utils.h b/src/Utils.h
index 0b6034acf54f034e1326152f5f40469463051ff1..96acd9931f3ab6f9f3364405263b2a3fda65c974 100644
--- a/src/Utils.h
+++ b/src/Utils.h
@@ -107,9 +107,9 @@ messageDescription(const QString &username = QString(),
     using Sticker    = mtx::events::Sticker;
     using Text       = mtx::events::RoomEvent<mtx::events::msg::Text>;
     using Video      = mtx::events::RoomEvent<mtx::events::msg::Video>;
-    using CallInvite = mtx::events::RoomEvent<mtx::events::msg::CallInvite>;
-    using CallAnswer = mtx::events::RoomEvent<mtx::events::msg::CallAnswer>;
-    using CallHangUp = mtx::events::RoomEvent<mtx::events::msg::CallHangUp>;
+    using CallInvite = mtx::events::RoomEvent<mtx::events::voip::CallInvite>;
+    using CallAnswer = mtx::events::RoomEvent<mtx::events::voip::CallAnswer>;
+    using CallHangUp = mtx::events::RoomEvent<mtx::events::voip::CallHangUp>;
     using Encrypted  = mtx::events::EncryptedEvent<mtx::events::msg::Encrypted>;
 
     if (std::is_same<T, Audio>::value) {
diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp
index 767fdaa2f550ca6270e496c1bd42f44a421475e6..9ada2afdf3cb521214d954a6857e8a3b7e5ae8fb 100644
--- a/src/timeline/TimelineModel.cpp
+++ b/src/timeline/TimelineModel.cpp
@@ -121,20 +121,20 @@ struct RoomEventType
     {
         return qml_mtx_events::EventType::Redacted;
     }
-    qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::msg::CallInvite> &)
+    qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::voip::CallInvite> &)
     {
         return qml_mtx_events::EventType::CallInvite;
     }
-    qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::msg::CallAnswer> &)
+    qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::voip::CallAnswer> &)
     {
         return qml_mtx_events::EventType::CallAnswer;
     }
-    qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::msg::CallHangUp> &)
+    qml_mtx_events::EventType operator()(const mtx::events::Event<mtx::events::voip::CallHangUp> &)
     {
         return qml_mtx_events::EventType::CallHangUp;
     }
     qml_mtx_events::EventType
-    operator()(const mtx::events::Event<mtx::events::msg::CallCandidates> &)
+    operator()(const mtx::events::Event<mtx::events::voip::CallCandidates> &)
     {
         return qml_mtx_events::EventType::CallCandidates;
     }
@@ -941,17 +941,17 @@ TimelineModel::addEvents(const mtx::responses::Timeline &timeline)
                 e = result.event.value();
         }
 
-        if (std::holds_alternative<RoomEvent<msg::CallCandidates>>(e) ||
-            std::holds_alternative<RoomEvent<msg::CallInvite>>(e) ||
-            std::holds_alternative<RoomEvent<msg::CallAnswer>>(e) ||
-            std::holds_alternative<RoomEvent<msg::CallHangUp>>(e))
+        if (std::holds_alternative<RoomEvent<voip::CallCandidates>>(e) ||
+            std::holds_alternative<RoomEvent<voip::CallInvite>>(e) ||
+            std::holds_alternative<RoomEvent<voip::CallAnswer>>(e) ||
+            std::holds_alternative<RoomEvent<voip::CallHangUp>>(e))
             std::visit(
               [this](auto &event) {
                   event.room_id = room_id_.toStdString();
                   if constexpr (std::is_same_v<std::decay_t<decltype(event)>,
-                                               RoomEvent<msg::CallAnswer>> ||
+                                               RoomEvent<voip::CallAnswer>> ||
                                 std::is_same_v<std::decay_t<decltype(event)>,
-                                               RoomEvent<msg::CallHangUp>>)
+                                               RoomEvent<voip::CallHangUp>>)
                       emit newCallEvent(event);
                   else {
                       if (event.sender != http::client()->user_id().to_string())
@@ -1007,18 +1007,18 @@ isMessage(const mtx::events::EncryptedEvent<T> &)
 }
 
 auto
-isMessage(const mtx::events::RoomEvent<mtx::events::msg::CallInvite> &)
+isMessage(const mtx::events::RoomEvent<mtx::events::voip::CallInvite> &)
 {
     return true;
 }
 
 auto
-isMessage(const mtx::events::RoomEvent<mtx::events::msg::CallAnswer> &)
+isMessage(const mtx::events::RoomEvent<mtx::events::voip::CallAnswer> &)
 {
     return true;
 }
 auto
-isMessage(const mtx::events::RoomEvent<mtx::events::msg::CallHangUp> &)
+isMessage(const mtx::events::RoomEvent<mtx::events::voip::CallHangUp> &)
 {
     return true;
 }
@@ -1460,25 +1460,25 @@ struct SendMessageVisitor
         emit model_->addPendingMessageToStore(msg);
     }
 
-    void operator()(const mtx::events::RoomEvent<mtx::events::msg::CallInvite> &event)
+    void operator()(const mtx::events::RoomEvent<mtx::events::voip::CallInvite> &event)
     {
-        sendRoomEvent<mtx::events::msg::CallInvite, mtx::events::EventType::CallInvite>(event);
+        sendRoomEvent<mtx::events::voip::CallInvite, mtx::events::EventType::CallInvite>(event);
     }
 
-    void operator()(const mtx::events::RoomEvent<mtx::events::msg::CallCandidates> &event)
+    void operator()(const mtx::events::RoomEvent<mtx::events::voip::CallCandidates> &event)
     {
-        sendRoomEvent<mtx::events::msg::CallCandidates, mtx::events::EventType::CallCandidates>(
+        sendRoomEvent<mtx::events::voip::CallCandidates, mtx::events::EventType::CallCandidates>(
           event);
     }
 
-    void operator()(const mtx::events::RoomEvent<mtx::events::msg::CallAnswer> &event)
+    void operator()(const mtx::events::RoomEvent<mtx::events::voip::CallAnswer> &event)
     {
-        sendRoomEvent<mtx::events::msg::CallAnswer, mtx::events::EventType::CallAnswer>(event);
+        sendRoomEvent<mtx::events::voip::CallAnswer, mtx::events::EventType::CallAnswer>(event);
     }
 
-    void operator()(const mtx::events::RoomEvent<mtx::events::msg::CallHangUp> &event)
+    void operator()(const mtx::events::RoomEvent<mtx::events::voip::CallHangUp> &event)
     {
-        sendRoomEvent<mtx::events::msg::CallHangUp, mtx::events::EventType::CallHangUp>(event);
+        sendRoomEvent<mtx::events::voip::CallHangUp, mtx::events::EventType::CallHangUp>(event);
     }
 
     void operator()(const mtx::events::RoomEvent<mtx::events::msg::KeyVerificationRequest> &msg)
diff --git a/src/timeline/TimelineViewManager.cpp b/src/timeline/TimelineViewManager.cpp
index a0f42d175def549630c59fa60c67940e64a63a7c..b705606a1ec6f6c0cf55c40523b5cdbdc33d52aa 100644
--- a/src/timeline/TimelineViewManager.cpp
+++ b/src/timeline/TimelineViewManager.cpp
@@ -347,7 +347,7 @@ TimelineViewManager::queueReply(const QString &roomid,
 
 void
 TimelineViewManager::queueCallMessage(const QString &roomid,
-                                      const mtx::events::msg::CallInvite &callInvite)
+                                      const mtx::events::voip::CallInvite &callInvite)
 {
     if (auto room = rooms_->getRoomById(roomid))
         room->sendMessageEvent(callInvite, mtx::events::EventType::CallInvite);
@@ -355,7 +355,7 @@ TimelineViewManager::queueCallMessage(const QString &roomid,
 
 void
 TimelineViewManager::queueCallMessage(const QString &roomid,
-                                      const mtx::events::msg::CallCandidates &callCandidates)
+                                      const mtx::events::voip::CallCandidates &callCandidates)
 {
     if (auto room = rooms_->getRoomById(roomid))
         room->sendMessageEvent(callCandidates, mtx::events::EventType::CallCandidates);
@@ -363,7 +363,7 @@ TimelineViewManager::queueCallMessage(const QString &roomid,
 
 void
 TimelineViewManager::queueCallMessage(const QString &roomid,
-                                      const mtx::events::msg::CallAnswer &callAnswer)
+                                      const mtx::events::voip::CallAnswer &callAnswer)
 {
     if (auto room = rooms_->getRoomById(roomid))
         room->sendMessageEvent(callAnswer, mtx::events::EventType::CallAnswer);
@@ -371,7 +371,7 @@ TimelineViewManager::queueCallMessage(const QString &roomid,
 
 void
 TimelineViewManager::queueCallMessage(const QString &roomid,
-                                      const mtx::events::msg::CallHangUp &callHangUp)
+                                      const mtx::events::voip::CallHangUp &callHangUp)
 {
     if (auto room = rooms_->getRoomById(roomid))
         room->sendMessageEvent(callHangUp, mtx::events::EventType::CallHangUp);
diff --git a/src/timeline/TimelineViewManager.h b/src/timeline/TimelineViewManager.h
index 970bf02c3662cc0cbd0d3a5c9d4030c0091ee14e..0ba732fedb546d8aa279efbc37d430cf11faa912 100644
--- a/src/timeline/TimelineViewManager.h
+++ b/src/timeline/TimelineViewManager.h
@@ -105,10 +105,10 @@ public slots:
 
     void updateColorPalette();
     void queueReply(const QString &roomid, const QString &repliedToEvent, const QString &replyBody);
-    void queueCallMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
-    void queueCallMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);
-    void queueCallMessage(const QString &roomid, const mtx::events::msg::CallAnswer &);
-    void queueCallMessage(const QString &roomid, const mtx::events::msg::CallHangUp &);
+    void queueCallMessage(const QString &roomid, const mtx::events::voip::CallInvite &);
+    void queueCallMessage(const QString &roomid, const mtx::events::voip::CallCandidates &);
+    void queueCallMessage(const QString &roomid, const mtx::events::voip::CallAnswer &);
+    void queueCallMessage(const QString &roomid, const mtx::events::voip::CallHangUp &);
 
     void setVideoCallItem();
 
diff --git a/src/voip/CallManager.cpp b/src/voip/CallManager.cpp
index 54d86620785b9ddb4cb6598f92c9e26aa8c3b819..14f3adf8d84479cb85139897aaa492c8d27a06f1 100644
--- a/src/voip/CallManager.cpp
+++ b/src/voip/CallManager.cpp
@@ -36,14 +36,16 @@ extern "C"
 }
 #endif
 
-Q_DECLARE_METATYPE(std::vector<mtx::events::msg::CallCandidates::Candidate>)
-Q_DECLARE_METATYPE(mtx::events::msg::CallCandidates::Candidate)
+Q_DECLARE_METATYPE(std::vector<mtx::events::voip::CallCandidates::Candidate>)
+Q_DECLARE_METATYPE(mtx::events::voip::CallCandidates::Candidate)
 Q_DECLARE_METATYPE(mtx::responses::TurnServer)
 
 using namespace mtx::events;
-using namespace mtx::events::msg;
+using namespace mtx::events::voip;
 
 using webrtc::CallType;
+//! Session Description Object
+typedef RTCSessionDescriptionInit SDO;
 
 namespace {
 std::vector<std::string>
@@ -55,8 +57,8 @@ CallManager::CallManager(QObject *parent)
   , session_(WebRTCSession::instance())
   , turnServerTimer_(this)
 {
-    qRegisterMetaType<std::vector<mtx::events::msg::CallCandidates::Candidate>>();
-    qRegisterMetaType<mtx::events::msg::CallCandidates::Candidate>();
+    qRegisterMetaType<std::vector<mtx::events::voip::CallCandidates::Candidate>>();
+    qRegisterMetaType<mtx::events::voip::CallCandidates::Candidate>();
     qRegisterMetaType<mtx::responses::TurnServer>();
 
     connect(
@@ -65,8 +67,10 @@ CallManager::CallManager(QObject *parent)
       this,
       [this](const std::string &sdp, const std::vector<CallCandidates::Candidate> &candidates) {
           nhlog::ui()->debug("WebRTC: call id: {} - sending offer", callid_);
-          emit newMessage(roomid_, CallInvite{callid_, sdp, "0", timeoutms_});
-          emit newMessage(roomid_, CallCandidates{callid_, candidates, "0"});
+          emit newMessage(
+            roomid_,
+            CallInvite{callid_, partyid_, SDO{sdp, SDO::Type::Offer}, "0", timeoutms_, invitee_});
+          emit newMessage(roomid_, CallCandidates{callid_, partyid_, candidates, "0"});
           std::string callid(callid_);
           QTimer::singleShot(timeoutms_, this, [this, callid]() {
               if (session_.state() == webrtc::State::OFFERSENT && callid == callid_) {
@@ -83,8 +87,8 @@ CallManager::CallManager(QObject *parent)
       this,
       [this](const std::string &sdp, const std::vector<CallCandidates::Candidate> &candidates) {
           nhlog::ui()->debug("WebRTC: call id: {} - sending answer", callid_);
-          emit newMessage(roomid_, CallAnswer{callid_, sdp, "0"});
-          emit newMessage(roomid_, CallCandidates{callid_, candidates, "0"});
+          emit newMessage(roomid_, CallAnswer{callid_, partyid_, "0", SDO{sdp, SDO::Type::Answer}});
+          emit newMessage(roomid_, CallCandidates{callid_, partyid_, candidates, "0"});
       });
 
     connect(&session_,
@@ -92,7 +96,7 @@ CallManager::CallManager(QObject *parent)
             this,
             [this](const CallCandidates::Candidate &candidate) {
                 nhlog::ui()->debug("WebRTC: call id: {} - sending ice candidate", callid_);
-                emit newMessage(roomid_, CallCandidates{callid_, {candidate}, "0"});
+                emit newMessage(roomid_, CallCandidates{callid_, partyid_, {candidate}, "0"});
             });
 
     connect(&turnServerTimer_, &QTimer::timeout, this, &CallManager::retrieveTurnServer);
@@ -223,6 +227,16 @@ callHangUpReasonString(CallHangUp::Reason reason)
         return "ICE failed";
     case CallHangUp::Reason::InviteTimeOut:
         return "Invite time out";
+    case CallHangUp::Reason::ICETimeOut:
+        return "ICE time out";
+    case CallHangUp::Reason::UserHangUp:
+        return "User hung up";
+    case CallHangUp::Reason::UserMediaFailed:
+        return "User media failed";
+    case CallHangUp::Reason::UserBusy:
+        return "User busy";
+    case CallHangUp::Reason::UnknownError:
+        return "Unknown error";
     default:
         return "User";
     }
@@ -235,7 +249,7 @@ CallManager::hangUp(CallHangUp::Reason reason)
     if (!callid_.empty()) {
         nhlog::ui()->debug(
           "WebRTC: call id: {} - hanging up ({})", callid_, callHangUpReasonString(reason));
-        emit newMessage(roomid_, CallHangUp{callid_, "0", reason});
+        emit newMessage(roomid_, CallHangUp{callid_, partyid_, "0", reason});
         endCall();
     }
 }
@@ -267,7 +281,7 @@ void
 CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent)
 {
     const char video[]     = "m=video";
-    const std::string &sdp = callInviteEvent.content.sdp;
+    const std::string &sdp = callInviteEvent.content.offer.sdp;
     bool isVideo           = std::search(sdp.cbegin(),
                                sdp.cend(),
                                std::cbegin(video),
@@ -288,7 +302,8 @@ CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent)
     if (isOnCall() || roomInfo.member_count != 2) {
         emit newMessage(
           QString::fromStdString(callInviteEvent.room_id),
-          CallHangUp{callInviteEvent.content.call_id, "0", CallHangUp::Reason::InviteTimeOut});
+          CallHangUp{
+            callInviteEvent.content.call_id, partyid_, "0", CallHangUp::Reason::InviteTimeOut});
         return;
     }
 
@@ -311,7 +326,7 @@ CallManager::handleEvent(const RoomEvent<CallInvite> &callInviteEvent)
 
     haveCallInvite_ = true;
     callType_       = isVideo ? CallType::VIDEO : CallType::VOICE;
-    inviteSDP_      = callInviteEvent.content.sdp;
+    inviteSDP_      = callInviteEvent.content.offer.sdp;
     emit newInviteState();
 }
 
@@ -385,7 +400,7 @@ CallManager::handleEvent(const RoomEvent<CallAnswer> &callAnswerEvent)
 
     if (isOnCall() && callid_ == callAnswerEvent.content.call_id) {
         stopRingtone();
-        if (!session_.acceptAnswer(callAnswerEvent.content.sdp)) {
+        if (!session_.acceptAnswer(callAnswerEvent.content.answer.sdp)) {
             emit ChatPage::instance()->showNotification(QStringLiteral("Problem setting up call."));
             hangUp();
         }
diff --git a/src/voip/CallManager.h b/src/voip/CallManager.h
index a505e99582bd7d918f515079cd8880c531262935..16bd9a3728f35b2517990467aa15ad6e9222fd9b 100644
--- a/src/voip/CallManager.h
+++ b/src/voip/CallManager.h
@@ -67,15 +67,16 @@ public slots:
     void toggleMicMute();
     void toggleLocalPiP() { session_.toggleLocalPiP(); }
     void acceptInvite();
-    void hangUp(mtx::events::msg::CallHangUp::Reason = mtx::events::msg::CallHangUp::Reason::User);
+    void
+      hangUp(mtx::events::voip::CallHangUp::Reason = mtx::events::voip::CallHangUp::Reason::User);
     QStringList windowList();
     void previewWindow(unsigned int windowIndex) const;
 
 signals:
-    void newMessage(const QString &roomid, const mtx::events::msg::CallInvite &);
-    void newMessage(const QString &roomid, const mtx::events::msg::CallCandidates &);
-    void newMessage(const QString &roomid, const mtx::events::msg::CallAnswer &);
-    void newMessage(const QString &roomid, const mtx::events::msg::CallHangUp &);
+    void newMessage(const QString &roomid, const mtx::events::voip::CallInvite &);
+    void newMessage(const QString &roomid, const mtx::events::voip::CallCandidates &);
+    void newMessage(const QString &roomid, const mtx::events::voip::CallAnswer &);
+    void newMessage(const QString &roomid, const mtx::events::voip::CallHangUp &);
     void newInviteState();
     void newCallState();
     void micMuteChanged();
@@ -92,11 +93,13 @@ private:
     QString callPartyDisplayName_;
     QString callPartyAvatarUrl_;
     std::string callid_;
+    std::string partyid_       = "";
+    std::string invitee_       = "";
     const uint32_t timeoutms_  = 120000;
     webrtc::CallType callType_ = webrtc::CallType::VOICE;
     bool haveCallInvite_       = false;
     std::string inviteSDP_;
-    std::vector<mtx::events::msg::CallCandidates::Candidate> remoteICECandidates_;
+    std::vector<mtx::events::voip::CallCandidates::Candidate> remoteICECandidates_;
     std::vector<std::string> turnURIs_;
     QTimer turnServerTimer_;
     QMediaPlayer player_;
@@ -104,11 +107,11 @@ private:
 
     template<typename T>
     bool handleEvent(const mtx::events::collections::TimelineEvents &event);
-    void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallInvite> &);
-    void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallCandidates> &);
-    void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallAnswer> &);
-    void handleEvent(const mtx::events::RoomEvent<mtx::events::msg::CallHangUp> &);
-    void answerInvite(const mtx::events::msg::CallInvite &, bool isVideo);
+    void handleEvent(const mtx::events::RoomEvent<mtx::events::voip::CallInvite> &);
+    void handleEvent(const mtx::events::RoomEvent<mtx::events::voip::CallCandidates> &);
+    void handleEvent(const mtx::events::RoomEvent<mtx::events::voip::CallAnswer> &);
+    void handleEvent(const mtx::events::RoomEvent<mtx::events::voip::CallHangUp> &);
+    void answerInvite(const mtx::events::voip::CallInvite &, bool isVideo);
     void generateCallID();
     QStringList devices(bool isVideo) const;
     void clear();
diff --git a/src/voip/WebRTCSession.cpp b/src/voip/WebRTCSession.cpp
index 31174500833fe9f976fc1e9a7bfcaa2a1d71b7a9..48e878e83ce36d955c5a119eb310e04edf12b18a 100644
--- a/src/voip/WebRTCSession.cpp
+++ b/src/voip/WebRTCSession.cpp
@@ -105,7 +105,7 @@ WebRTCSession::init(std::string *errorMessage)
 namespace {
 
 std::string localsdp_;
-std::vector<mtx::events::msg::CallCandidates::Candidate> localcandidates_;
+std::vector<mtx::events::voip::CallCandidates::Candidate> localcandidates_;
 bool haveAudioStream_     = false;
 bool haveVideoStream_     = false;
 GstPad *localPiPSinkPad_  = nullptr;
@@ -726,7 +726,7 @@ WebRTCSession::acceptAnswer(const std::string &sdp)
 
 void
 WebRTCSession::acceptICECandidates(
-  const std::vector<mtx::events::msg::CallCandidates::Candidate> &candidates)
+  const std::vector<mtx::events::voip::CallCandidates::Candidate> &candidates)
 {
     if (state_ >= State::INITIATED) {
         for (const auto &c : candidates) {
@@ -1151,7 +1151,8 @@ WebRTCSession::acceptAnswer(const std::string &)
 }
 
 void
-WebRTCSession::acceptICECandidates(const std::vector<mtx::events::msg::CallCandidates::Candidate> &)
+WebRTCSession::acceptICECandidates(
+  const std::vector<mtx::events::voip::CallCandidates::Candidate> &)
 {}
 
 bool
diff --git a/src/voip/WebRTCSession.h b/src/voip/WebRTCSession.h
index 04383679173f10ceb9612c490780d2131ad19468..ac1845c7f08710c7563332ae03f2e269d995bebb 100644
--- a/src/voip/WebRTCSession.h
+++ b/src/voip/WebRTCSession.h
@@ -64,7 +64,7 @@ public:
     bool createOffer(webrtc::CallType, uint32_t shareWindowId);
     bool acceptOffer(const std::string &sdp);
     bool acceptAnswer(const std::string &sdp);
-    void acceptICECandidates(const std::vector<mtx::events::msg::CallCandidates::Candidate> &);
+    void acceptICECandidates(const std::vector<mtx::events::voip::CallCandidates::Candidate> &);
 
     bool isMicMuted() const;
     bool toggleMicMute();
@@ -78,10 +78,10 @@ public:
 
 signals:
     void offerCreated(const std::string &sdp,
-                      const std::vector<mtx::events::msg::CallCandidates::Candidate> &);
+                      const std::vector<mtx::events::voip::CallCandidates::Candidate> &);
     void answerCreated(const std::string &sdp,
-                       const std::vector<mtx::events::msg::CallCandidates::Candidate> &);
-    void newICECandidate(const mtx::events::msg::CallCandidates::Candidate &);
+                       const std::vector<mtx::events::voip::CallCandidates::Candidate> &);
+    void newICECandidate(const mtx::events::voip::CallCandidates::Candidate &);
     void stateChanged(webrtc::State);
 
 private slots: