diff --git a/code/game/gamemodes/clock_cult/clock_mobs.dm b/code/game/gamemodes/clock_cult/clock_mobs.dm
index a5e7dee4cb..a86c00e4f6 100644
--- a/code/game/gamemodes/clock_cult/clock_mobs.dm
+++ b/code/game/gamemodes/clock_cult/clock_mobs.dm
@@ -13,6 +13,7 @@
speak_emote = list("clanks", "clinks", "clunks", "clangs")
verb_ask = "requests"
verb_exclaim = "proclaims"
+ verb_whisper = "imparts"
verb_yell = "harangues"
initial_languages = list(/datum/language/common, /datum/language/ratvar)
only_speaks_language = /datum/language/ratvar
diff --git a/code/game/machinery/hologram.dm.rej b/code/game/machinery/hologram.dm.rej
new file mode 100644
index 0000000000..c1334f9646
--- /dev/null
+++ b/code/game/machinery/hologram.dm.rej
@@ -0,0 +1,44 @@
+diff a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm (rejected hunks)
+@@ -152,7 +152,7 @@ GLOBAL_LIST_EMPTY(holopads)
+ var/datum/holocall/HC = I
+ if(HC.connected_holopad == src)
+ dat += "Disconnect call from [HC.user].
"
+-
++
+
+ var/datum/browser/popup = new(user, "holopad", name, 300, 130)
+ popup.set_content(dat)
+@@ -192,7 +192,7 @@ GLOBAL_LIST_EMPTY(holopads)
+ if(A)
+ LAZYADD(callnames[A], I)
+ callnames -= get_area(src)
+-
++
+ var/result = input(usr, "Choose an area to call", "Holocall") as null|anything in callnames
+ if(QDELETED(usr) || !result || outgoing_call)
+ return
+@@ -201,7 +201,7 @@ GLOBAL_LIST_EMPTY(holopads)
+ temp = "Dialing...
"
+ temp += "Main Menu"
+ new /datum/holocall(usr, src, callnames[result])
+-
++
+ else if(href_list["connectcall"])
+ var/datum/holocall/call_to_connect = locate(href_list["connectcall"])
+ if(!QDELETED(call_to_connect))
+@@ -315,12 +315,12 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
+ for(var/mob/living/silicon/ai/master in masters)
+ if(masters[master] && speaker != master)
+ master.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
+-
++
+ for(var/I in holo_calls)
+ var/datum/holocall/HC = I
+ if(HC.connected_holopad == src && speaker != HC.hologram)
+- HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans)
+-
++ HC.user.Hear(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
++
+ if(outgoing_call && speaker == outgoing_call.user)
+ outgoing_call.hologram.say(raw_message)
+
diff --git a/code/game/say.dm b/code/game/say.dm
index deab83ad10..4bcc289be1 100644
--- a/code/game/say.dm
+++ b/code/game/say.dm
@@ -35,10 +35,10 @@ GLOBAL_LIST_INIT(freqtospan, list(
return 1
/atom/movable/proc/send_speech(message, range = 7, obj/source = src, bubble_type, list/spans, datum/language/message_language = null, message_mode)
- var/rendered = compose_message(src, message_language, message, , spans)
+ var/rendered = compose_message(src, message_language, message, , spans, message_mode)
for(var/_AM in get_hearers_in_view(range, source))
var/atom/movable/AM = _AM
- AM.Hear(rendered, src, message_language, message, , spans)
+ AM.Hear(rendered, src, message_language, message, , spans, message_mode)
//To get robot span classes, stuff like that.
/atom/movable/proc/get_spans()
@@ -58,7 +58,7 @@ GLOBAL_LIST_INIT(freqtospan, list(
var/endspanpart = ""
//Message
- var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans)]"
+ var/messagepart = " [lang_treat(speaker, message_language, raw_message, spans, message_mode)]"
var/languageicon = ""
var/datum/language/D = get_language_instance(message_language)
diff --git a/code/modules/mob/dead/observer/say.dm b/code/modules/mob/dead/observer/say.dm
index 8675049cee..0e7f5fcc1e 100644
--- a/code/modules/mob/dead/observer/say.dm
+++ b/code/modules/mob/dead/observer/say.dm
@@ -20,6 +20,6 @@
to_follow = V.source
var/link = FOLLOW_LINK(src, to_follow)
// Recompose the message, because it's scrambled by default
- message = compose_message(speaker, message_language, raw_message, radio_freq, spans)
+ message = compose_message(speaker, message_language, raw_message, radio_freq, spans, message_mode)
to_chat(src, "[link] [message]")
diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm
index dce38bd664..2d9cf4ec6f 100644
--- a/code/modules/mob/living/silicon/ai/freelook/eye.dm
+++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm
@@ -106,4 +106,4 @@
/mob/camera/aiEye/Hear(message, atom/movable/speaker, datum/language/message_language, raw_message, radio_freq, list/spans, message_mode)
if(relay_speech && speaker && ai && !radio_freq && speaker != ai && near_camera(speaker))
- ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans)
+ ai.relay_speech(message, speaker, message_language, raw_message, radio_freq, spans, message_mode)
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 7cd6567ecb..1507c43912 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -108,6 +108,7 @@
speak_emote = list("clanks", "clinks", "clunks", "clangs")
verb_ask = "requests"
verb_exclaim = "proclaims"
+ verb_whisper = "imparts"
verb_yell = "harangues"
bubble_icon = "clock"
initial_languages = list(/datum/language/common, /datum/language/ratvar)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index d822a05886..ec76c2176f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -401,7 +401,7 @@ Difficulty: Very Hard
to_chat(user, observer_desc)
to_chat(user, "It is activated by [activation_method].")
-/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
+/obj/machinery/anomalous_crystal/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
..()
if(isliving(speaker))
ActivationReaction(speaker, ACTIVATE_SPEECH)
diff --git a/code/modules/mob/living/simple_animal/slime/say.dm b/code/modules/mob/living/simple_animal/slime/say.dm
index ae7c14068f..60a25f90b7 100644
--- a/code/modules/mob/living/simple_animal/slime/say.dm
+++ b/code/modules/mob/living/simple_animal/slime/say.dm
@@ -1,4 +1,4 @@
-/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans)
+/mob/living/simple_animal/slime/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
if(speaker != src && !radio_freq && !stat)
if (speaker in Friends)
speech_buffer = list()