diff --git a/code/game/gamemodes/steal_items.dm b/code/game/gamemodes/steal_items.dm
index 44e722abfca..d3f29734815 100644
--- a/code/game/gamemodes/steal_items.dm
+++ b/code/game/gamemodes/steal_items.dm
@@ -118,7 +118,7 @@ datum/theft_objective/ai/check_special_completion(var/obj/item/aicard/C)
typepath = /obj/item/documents //Any set of secret documents. Doesn't have to be NT's
/datum/theft_objective/hypospray
- name = "a hypospray"
+ name = "the Chief Medical Officer's hypospray"
typepath = /obj/item/reagent_containers/hypospray/CMO
protected_jobs = list("Chief Medical Officer")
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index 7fe19960100..42eeafd338c 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -1027,7 +1027,7 @@
req_access_txt = "5"
products = list(/obj/item/reagent_containers/glass/bottle/charcoal = 4,/obj/item/reagent_containers/glass/bottle/morphine = 4,/obj/item/reagent_containers/glass/bottle/ether = 4,/obj/item/reagent_containers/glass/bottle/epinephrine = 4,
/obj/item/reagent_containers/glass/bottle/toxin = 4,/obj/item/reagent_containers/syringe/antiviral = 6,/obj/item/reagent_containers/syringe/insulin = 4,
- /obj/item/reagent_containers/syringe = 12,/obj/item/healthanalyzer = 5,/obj/item/healthupgrade = 5,/obj/item/reagent_containers/glass/beaker = 4,
+ /obj/item/reagent_containers/syringe = 12,/obj/item/healthanalyzer = 5,/obj/item/healthupgrade = 5,/obj/item/reagent_containers/glass/beaker = 4, /obj/item/reagent_containers/hypospray/safety = 2,
/obj/item/reagent_containers/dropper = 2,/obj/item/stack/medical/bruise_pack/advanced = 3, /obj/item/stack/medical/ointment/advanced = 3,
/obj/item/stack/medical/bruise_pack = 3,/obj/item/stack/medical/splint = 4, /obj/item/sensor_device = 2, /obj/item/reagent_containers/hypospray/autoinjector = 4,
/obj/item/pinpointer/crew = 2)
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index feee1bab8b4..771d627b421 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -13,7 +13,9 @@
possible_transfer_amounts = list(1,2,3,4,5,10,15,20,25,30)
flags = OPENCONTAINER
slot_flags = SLOT_BELT
- var/ignore_flags = 0
+ var/ignore_flags = FALSE
+ var/emagged = FALSE
+ var/safety_hypo = FALSE
/obj/item/reagent_containers/hypospray/attack(mob/living/M, mob/user)
if(!reagents.total_volume)
@@ -31,8 +33,13 @@
for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
+ var/primary_reagent_name = reagents.get_master_reagent_name()
var/trans = reagents.trans_to(M, amount_per_transfer_from_this)
+ if(safety_hypo)
+ visible_message("[user] injects [M] with [trans] units of [primary_reagent_name].")
+ playsound(loc, 'sound/goonstation/items/hypo.ogg', 80, 0)
+
to_chat(user, "[trans] unit\s injected. [reagents.total_volume] unit\s remaining in [src].")
var/contained = english_list(injected)
@@ -41,6 +48,31 @@
return TRUE
+/obj/item/reagent_containers/hypospray/on_reagent_change()
+ if(safety_hypo && !emagged)
+ var/found_forbidden_reagent = FALSE
+ for(var/datum/reagent/R in reagents.reagent_list)
+ if(!safe_chem_list.Find(R.id))
+ reagents.del_reagent(R.id)
+ found_forbidden_reagent = TRUE
+ if(found_forbidden_reagent)
+ if(ismob(loc))
+ to_chat(loc, "[src] identifies and removes a harmful substance.")
+ else
+ visible_message("[src] identifies and removes a harmful substance.")
+
+/obj/item/reagent_containers/hypospray/emag_act(mob/user)
+ if(safety_hypo && !emagged)
+ emagged = TRUE
+ ignore_flags = TRUE
+ to_chat(user, "You short out the safeties on [src].")
+
+/obj/item/reagent_containers/hypospray/safety
+ name = "medical hypospray"
+ desc = "A modified hypospray for quickly injecting safe medicinal chemicals."
+ icon_state = "combat_hypo"
+ safety_hypo = TRUE
+
/obj/item/reagent_containers/hypospray/CMO
list_reagents = list("omnizine" = 30)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 5cb51863851..bba85a5ff00 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -591,6 +591,14 @@
build_path = /obj/item/reagent_containers/syringe
category = list("initial", "Medical")
+/datum/design/safety_hypo
+ name = "Medical Hypospray"
+ id = "safetyhypo"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 500)
+ build_path = /obj/item/reagent_containers/hypospray/safety
+ category = list("initial", "Medical")
+
/datum/design/prox_sensor
name = "Proximity Sensor"
id = "prox_sensor"
diff --git a/sound/goonstation/items/hypo.ogg b/sound/goonstation/items/hypo.ogg
new file mode 100644
index 00000000000..8525a1b43c7
Binary files /dev/null and b/sound/goonstation/items/hypo.ogg differ