diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm
index 593bd0be7b..1bd0a22a52 100644
--- a/code/game/objects/items/devices/translator.dm
+++ b/code/game/objects/items/devices/translator.dm
@@ -88,3 +88,146 @@
slot_flags = SLOT_EARS
visual = 0
audio = 1
+
+//////////////Single language translators
+
+
+/obj/item/universal_translator/limited
+ name = "handheld translator (galcom)"
+ desc = "This handy device appears to translate specific languages that it hears into onscreen text for a user."
+ var/list/known_languages = list(LANGUAGE_GALCOM)
+ icon_state = "translator_small"
+
+/obj/item/universal_translator/limited/hear_talk(mob/M, list/message_pieces, verb)
+ if(!listening || !istype(M))
+ return
+
+ //Handheld or pocket only.
+ if(!isliving(loc))
+ return
+
+ var/mob/living/L = loc
+ if(visual && ((L.sdisabilities & BLIND) || L.eye_blind))
+ return
+ if(audio && ((L.sdisabilities & DEAF) || L.ear_deaf))
+ return
+
+ // Using two for loops kinda sucks, but I think it's more efficient
+ // to shortcut past string building if we're just going to discard the string
+ // anyways.
+ if(user_understands(M, L, message_pieces))
+ return
+
+ var/new_message = ""
+ var/confirm = 0
+
+ for(var/datum/multilingual_say_piece/S in message_pieces)
+ if(S.speaking.name in known_languages)
+ confirm = 1
+ new_message += (S.message + " ")
+
+ if(!L.say_understands(null, langset))
+ new_message = langset.scramble(new_message)
+
+ //Show the "I heard something" animation, only if it's an appropriate language!
+ if(mult_icons && confirm)
+ flick("[initial(icon_state)]2",src)
+
+ if(confirm) //Don't show a message at all if there's no recognised language, that'd just be annoying.
+ to_chat(L, span_filter_say("[src] translates, \"[new_message]\""))
+
+/obj/item/universal_translator/limited/sol
+ name = "handheld translator (solcom)"
+ known_languages = list(LANGUAGE_SOL_COMMON)
+
+/obj/item/universal_translator/limited/terminus
+ name = "handheld translator (terminus)"
+ known_languages = list(LANGUAGE_TERMINUS)
+
+/obj/item/universal_translator/limited/tradeband
+ name = "handheld translator (tradeband)"
+ known_languages = list(LANGUAGE_TRADEBAND)
+
+/obj/item/universal_translator/limited/gutterband
+ name = "handheld translator (gutterband)"
+ known_languages = list(LANGUAGE_GUTTER)
+
+/obj/item/universal_translator/limited/skrellian
+ name = "handheld translator (skrellian)"
+ known_languages = list(LANGUAGE_SKRELLIAN)
+
+/obj/item/universal_translator/limited/unathi
+ name = "handheld translator (sinta'unathi)"
+ known_languages = list(LANGUAGE_UNATHI)
+
+/obj/item/universal_translator/limited/siik
+ name = "handheld translator (siik)"
+ known_languages = list(LANGUAGE_SIIK)
+
+/obj/item/universal_translator/limited/schechi
+ name = "handheld translator (schechi)"
+ known_languages = list(LANGUAGE_SCHECHI)
+
+/obj/item/universal_translator/limited/vedaqh
+ name = "handheld translator (vedaqh)"
+ known_languages = list(LANGUAGE_ZADDAT)
+
+/obj/item/universal_translator/limited/birdsong
+ name = "handheld translator (birdsong)"
+ known_languages = list(LANGUAGE_BIRDSONG)
+
+/obj/item/universal_translator/limited/sagaru
+ name = "handheld translator (sagaru)"
+ known_languages = list(LANGUAGE_SAGARU)
+
+/obj/item/universal_translator/limited/canilunzt
+ name = "handheld translator (canilunzt)"
+ known_languages = list(LANGUAGE_CANILUNZT)
+
+/obj/item/universal_translator/limited/ecureuilian
+ name = "handheld translator (ecureuilian)"
+ known_languages = list(LANGUAGE_ECUREUILIAN)
+
+/obj/item/universal_translator/limited/daemon
+ name = "handheld translator (daemon)"
+ known_languages = list(LANGUAGE_DAEMON)
+
+/obj/item/universal_translator/limited/enochian
+ name = "handheld translator (enochian)"
+ known_languages = list(LANGUAGE_ENOCHIAN)
+
+/obj/item/universal_translator/limited/vespinae
+ name = "handheld translator (vespinae)"
+ known_languages = list(LANGUAGE_VESPINAE)
+
+/obj/item/universal_translator/limited/dragon
+ name = "handheld translator (d'rudak'ar)"
+ known_languages = list(LANGUAGE_DRUDAKAR)
+
+/obj/item/universal_translator/limited/spacer
+ name = "handheld translator (spacer)"
+ known_languages = list(LANGUAGE_SPACER)
+
+/obj/item/universal_translator/limited/tavan
+ name = "handheld translator (tavan)"
+ known_languages = list(LANGUAGE_TAVAN)
+
+/obj/item/universal_translator/limited/echosong
+ name = "handheld translator (echo song)"
+ known_languages = list(LANGUAGE_ECHOSONG)
+
+/obj/item/universal_translator/limited/akhani
+ name = "handheld translator (akhani)"
+ known_languages = list(LANGUAGE_AKHANI)
+
+/obj/item/universal_translator/limited/alai
+ name = "handheld translator (alai)"
+ known_languages = list(LANGUAGE_ALAI)
+
+/obj/item/universal_translator/limited/glamour //Admin spawn only, just here for utility
+ name = "handheld translator (glamourspeak)"
+ known_languages = list(LANGUAGE_LLEILL)
+
+/obj/item/universal_translator/limited/teppi //Admin spawn only, just here for utility
+ name = "handheld translator (teppi)"
+ known_languages = list(LANGUAGE_TEPPI)
diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm
index f6f0f9ce1b..4580f94691 100644
--- a/code/game/objects/random/maintenance.dm
+++ b/code/game/objects/random/maintenance.dm
@@ -118,7 +118,8 @@ something, make sure it's not in one of the other lists.*/
prob(5);/obj/item/material/fishing_net/butterfly_net,
prob(2);/obj/item/cracker,
prob(5);/obj/random/mega_nukies,
- prob(1);/obj/random/potion_ingredient/plus
+ prob(1);/obj/random/potion_ingredient/plus,
+ prob(2);/obj/random/translator
/* VOREStation Edit End */
)
diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm
index f912f07f43..457445833c 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -1165,3 +1165,34 @@
prob(1);/obj/item/cracker/vore,
prob(1);/obj/item/cracker/money
)
+
+/obj/random/translator
+ name = "Random language translator"
+ desc = "This is a random single language translator."
+ icon = 'icons/obj/device.dmi'
+ icon_state = "translator_small"
+
+/obj/random/translator/item_to_spawn()
+ return pick(/obj/item/universal_translator/limited,
+ /obj/item/universal_translator/limited/sol,
+ /obj/item/universal_translator/limited/terminus,
+ /obj/item/universal_translator/limited/tradeband,
+ /obj/item/universal_translator/limited/gutterband,
+ /obj/item/universal_translator/limited/skrellian,
+ /obj/item/universal_translator/limited/unathi,
+ /obj/item/universal_translator/limited/siik,
+ /obj/item/universal_translator/limited/schechi,
+ /obj/item/universal_translator/limited/vedaqh,
+ /obj/item/universal_translator/limited/birdsong,
+ /obj/item/universal_translator/limited/sagaru,
+ /obj/item/universal_translator/limited/canilunzt,
+ /obj/item/universal_translator/limited/ecureuilian,
+ /obj/item/universal_translator/limited/daemon,
+ /obj/item/universal_translator/limited/enochian,
+ /obj/item/universal_translator/limited/vespinae,
+ /obj/item/universal_translator/limited/dragon,
+ /obj/item/universal_translator/limited/spacer,
+ /obj/item/universal_translator/limited/tavan,
+ /obj/item/universal_translator/limited/echosong,
+ /obj/item/universal_translator/limited/akhani,
+ /obj/item/universal_translator/limited/alai)
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index fdc8488587..2ebbe0c5f5 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -194,3 +194,39 @@ modular computers
/datum/gear/utility/customlaptop/New()
..()
gear_tweaks += new /datum/gear_tweak/laptop()
+
+//////////Language Translators
+
+/datum/gear/utility/translator
+ display_name = "handheld translator (selection)"
+ path = /obj/item/universal_translator/limited
+ cost = 4
+
+/datum/gear/utility/translator/New()
+ ..()
+ var/list/translators = list(
+ "galcom" = /obj/item/universal_translator/limited,
+ "solcom" = /obj/item/universal_translator/limited/sol,
+ "terminus" = /obj/item/universal_translator/limited/terminus,
+ "tradeband" = /obj/item/universal_translator/limited/tradeband,
+ "gutterband" = /obj/item/universal_translator/limited/gutterband,
+ "skrellian" = /obj/item/universal_translator/limited/skrellian,
+ "sinta'unathi" = /obj/item/universal_translator/limited/unathi,
+ "siik" = /obj/item/universal_translator/limited/siik,
+ "schechi" = /obj/item/universal_translator/limited/schechi,
+ "vedaqh" = /obj/item/universal_translator/limited/vedaqh,
+ "birdsong" = /obj/item/universal_translator/limited/birdsong,
+ "sagaru" = /obj/item/universal_translator/limited/sagaru,
+ "canilunzt" = /obj/item/universal_translator/limited/canilunzt,
+ "ecureuilian" = /obj/item/universal_translator/limited/ecureuilian,
+ "daemon" = /obj/item/universal_translator/limited/daemon,
+ "enochian" = /obj/item/universal_translator/limited/enochian,
+ "vespinae" = /obj/item/universal_translator/limited/vespinae,
+ "d'rudak'ar" = /obj/item/universal_translator/limited/dragon,
+ "spacer" = /obj/item/universal_translator/limited/spacer,
+ "tavan" = /obj/item/universal_translator/limited/tavan,
+ "echo song" = /obj/item/universal_translator/limited/echosong,
+ "akhani" = /obj/item/universal_translator/limited/akhani,
+ "alai" = /obj/item/universal_translator/limited/alai
+ )
+ gear_tweaks += new/datum/gear_tweak/path(translators)
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 6e3cd24503..a538ec2b60 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ