diff --git a/sources/Chat/Events/ChatAPI_OnVoiceMessage_Signal.uc b/sources/Chat/Events/ChatAPI_OnVoiceMessage_Signal.uc
new file mode 100644
index 0000000..d754d10
--- /dev/null
+++ b/sources/Chat/Events/ChatAPI_OnVoiceMessage_Signal.uc
@@ -0,0 +1,39 @@
+/**
+ * Author: dkanus
+ * Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore
+ * License: GPL
+ * Copyright 2023 Anton Tarasenko
+ *------------------------------------------------------------------------------
+ * This file is part of Acedia.
+ *
+ * Acedia is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Acedia is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Acedia. If not, see .
+ */
+class ChatAPI_OnVoiceMessage_Signal extends Signal
+ dependsOn(ChatApi);
+
+public final function Emit(EPlayer sender, ChatApi.BuiltInVoiceMessage message) {
+ local Slot nextSlot;
+
+ StartIterating();
+ nextSlot = GetNextSlot();
+ while (nextSlot != none) {
+ ChatAPI_OnVoiceMessage_Slot(nextSlot).connect(sender, message);
+ nextSlot = GetNextSlot();
+ }
+ CleanEmptySlots();
+}
+
+defaultproperties {
+ relatedSlotClass = class'ChatAPI_OnVoiceMessage_Slot'
+}
\ No newline at end of file
diff --git a/sources/Chat/Events/ChatAPI_OnVoiceMessage_Slot.uc b/sources/Chat/Events/ChatAPI_OnVoiceMessage_Slot.uc
new file mode 100644
index 0000000..790cec9
--- /dev/null
+++ b/sources/Chat/Events/ChatAPI_OnVoiceMessage_Slot.uc
@@ -0,0 +1,41 @@
+/**
+ * Author: dkanus
+ * Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore
+ * License: GPL
+ * Copyright 2023 Anton Tarasenko
+ *------------------------------------------------------------------------------
+ * This file is part of Acedia.
+ *
+ * Acedia is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Acedia is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Acedia. If not, see .
+ */
+class ChatAPI_OnVoiceMessage_Slot extends Slot;
+
+delegate connect(
+ EPlayer sender,
+ ChatApi.BuiltInVoiceMessage message
+) {
+ DummyCall();
+}
+
+protected function Constructor() {
+ connect = none;
+}
+
+protected function Finalizer() {
+ super.Finalizer();
+ connect = none;
+}
+
+defaultproperties {
+}
\ No newline at end of file
diff --git a/sources/Chat/Unflect/Unflect_ChatApi_Controller.uc b/sources/Chat/Unflect/Unflect_ChatApi_Controller.uc
new file mode 100644
index 0000000..4051748
--- /dev/null
+++ b/sources/Chat/Unflect/Unflect_ChatApi_Controller.uc
@@ -0,0 +1,59 @@
+/**
+ * Author: dkanus
+ * Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore
+ * License: GPL
+ * Copyright 2023 Anton Tarasenko
+ *------------------------------------------------------------------------------
+ * This file is part of Acedia.
+ *
+ * Acedia is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Acedia is distributed in the hope that it will be useful,,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Acedia. If not, see .
+ */
+class Unflect_ChatApi_Controller extends KFPlayerController
+ dependsOn(ChatAPI);
+
+function SendVoiceMessage(
+ PlayerReplicationInfo sender,
+ PlayerReplicationInfo statedRecipient,
+ name messageType,
+ byte messageID,
+ name broadcastType,
+ optional Pawn soundSender,
+ optional vector senderLocation
+) {
+ local Controller recepient;
+ local KFPlayerController kfPlayerRecepient;
+
+ // Don't allow dead people to talk
+ if (pawn == none) return;
+ if (!AllowVoiceMessage(messageType)) return;
+
+ class'Global'.static.GetInstance().chat._EmitOnVoiceMessage(self, messageType, messageID);
+ recepient = level.controllerList;
+ while (recepient != none) {
+ kfPlayerRecepient = KFPlayerController(recepient);
+ if (kfPlayerRecepient != none) {
+ kfPlayerRecepient.ClientLocationalVoiceMessage(
+ sender,
+ statedRecipient,
+ messagetype,
+ messageID,
+ soundSender,
+ senderLocation);
+ }
+ recepient = recepient.nextController;
+ }
+}
+
+defaultproperties {
+}
\ No newline at end of file