diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm
index 5f40397a284..fde725234fc 100644
--- a/code/datums/uplink_items/uplink_general.dm
+++ b/code/datums/uplink_items/uplink_general.dm
@@ -457,6 +457,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION))
cost *= 3
+/datum/uplink_item/explosives/targrenade
+ name = "Sticky Tar Grenade"
+ desc = "A grenade filled with aerosols and sticky tar. \
+ Will release a plume of smoke that applies tar to a wide area, severely slowing down movement. Makes for the ultimate getaway!"
+ reference = "TARG"
+ item = /obj/item/grenade/chem_grenade/tar
+ cost = 7
+
////////////////////////////////////////
// MARK: STEALTHY TOOLS
////////////////////////////////////////
@@ -639,6 +647,14 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/organ_extractor
cost = 20
+/datum/uplink_item/device_tools/tar_spray
+ name = "Sticky Tar Applicator"
+ desc = "A spray bottle containing an extremely viscous fluid that will leave behind tar whenever it is sprayed, greatly slowing down anyone who tries to walk over it. \
+ Comes with 10 uses worth of fluid and cannot be refilled."
+ reference = "TAR"
+ item = /obj/item/reagent_containers/spray/sticky_tar
+ cost = 10
+
/datum/uplink_item/device_tools/binary
name = "Binary Translator Key"
desc = "A key, that when inserted into a radio headset, allows you to listen to and talk with artificial intelligences and cybernetic organisms in binary. To talk on the binary channel, type :+ before your radio message."
diff --git a/code/game/objects/effects/decals/Cleanable/tar.dm b/code/game/objects/effects/decals/Cleanable/tar.dm
new file mode 100644
index 00000000000..3b6092c7a01
--- /dev/null
+++ b/code/game/objects/effects/decals/Cleanable/tar.dm
@@ -0,0 +1,43 @@
+/obj/effect/decal/cleanable/tar
+ gender = PLURAL
+ name = "tar"
+ desc = "A sticky substance."
+ icon_state = "tar2"
+ /// The turf that the tar is sitting on
+ var/turf/simulated/target
+
+/obj/effect/decal/cleanable/tar/Initialize(mapload)
+ . = ..()
+ if(issimulatedturf(loc)) // Ensure the location is a simulated turf
+ target = loc
+ target.slowdown += 10 // Apply the slowdown effect to the turf
+ if(prob(50))
+ icon_state = "tar3"
+
+/obj/effect/decal/cleanable/tar/Destroy()
+ if(target)
+ target.slowdown -= 10
+ return ..()
+
+/obj/effect/decal/cleanable/tar/Moved(atom/OldLoc, Dir, Forced)
+ . = ..()
+ target.slowdown -= 10
+ target = loc
+ target.slowdown += 10
+ if(!issimulatedturf(target)) // We remove slowdown in Destroy(), so we run this check after adding the slowdown.
+ qdel(src)
+
+/obj/effect/decal/cleanable/tar/Crossed(atom/movable/movable_atom)
+ if(isliving(movable_atom))
+ var/mob/living/L = movable_atom
+ playsound(L, 'sound/effects/attackblob.ogg', 50, TRUE)
+ to_chat(L, "[src] sticks to you!")
+
+/obj/effect/decal/cleanable/tar/attackby(obj/item/welder, mob/living/user, params)
+ if(!welder.get_heat() || !Adjacent(user))
+ return
+ playsound(welder, 'sound/items/welder.ogg', 50, TRUE)
+ if(do_after(user, 3 SECONDS, FALSE, user))
+ if(welder.get_heat() && Adjacent(user))
+ user.visible_message("[user] burns away [src] with [welder]!", "You burn away [src]!")
+ qdel(src)
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index 247102435c2..c45251ed875 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -168,6 +168,7 @@
/obj/item/clothing/suit/jacket/bomber/syndicate = 5,
/obj/item/clothing/suit/storage/iaa/blackjacket/armored = 2, // More armored than bomber and has pockets, so it is rarer
/obj/item/melee/knuckleduster/syndie = 2,
+ /obj/item/reagent_containers/spray/sticky_tar = 1,
"" = 61 // This should be a decently high number for chances where no loot will spawn
)
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 445546f20a1..26388307a7d 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -592,6 +592,24 @@
beakers += B2
update_icon(UPDATE_ICON_STATE)
+/obj/item/grenade/chem_grenade/tar
+ payload_name = "sticky tar"
+ desc = "For spreading sticky tar. Become the anti-janitor!"
+ stage = READY
+
+/obj/item/grenade/chem_grenade/tar/Initialize(mapload)
+ . = ..()
+ var/obj/item/reagent_containers/glass/beaker/beaker_1 = new(src)
+ var/obj/item/reagent_containers/glass/beaker/beaker_2 = new(src)
+
+ beaker_1.reagents.add_reagent("sticky_tar", 15)
+ beaker_1.reagents.add_reagent("potassium", 10)
+ beaker_2.reagents.add_reagent("phosphorus", 10)
+ beaker_2.reagents.add_reagent("sugar", 10)
+ beakers += beaker_1
+ beakers += beaker_2
+ update_icon(UPDATE_ICON_STATE)
+
#undef EMPTY
#undef WIRED
#undef READY
diff --git a/code/game/objects/items/weapons/grenades/clusterbuster.dm b/code/game/objects/items/weapons/grenades/clusterbuster.dm
index a03f07be8b0..6ca1d16e3fd 100644
--- a/code/game/objects/items/weapons/grenades/clusterbuster.dm
+++ b/code/game/objects/items/weapons/grenades/clusterbuster.dm
@@ -232,6 +232,11 @@
desc = "For when you need to do something between everything and nothing."
payload = /obj/item/grenade/iedcasing
+/obj/item/grenade/clusterbuster/tar
+ name = "\improper Sticky Tar Cluster Grenade"
+ desc = "Speed limit enforced by goop."
+ payload = /obj/item/grenade/chem_grenade/tar
+
////////////Clusterbuster of Clusterbusters////////////
//As a note: be extrodinarily careful about make the payload clusterbusters as it can quickly destroy the MC/Server
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index 26901273263..1988a1a8e19 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -461,3 +461,20 @@
reagent_state = LIQUID
color = "#29262b"
taste_description = "burnt dirt"
+
+/datum/reagent/tar_compound
+ name = "Sticky tar"
+ id = "sticky_tar"
+ description = "A sticky compound that creates tar on contact with surfaces."
+ reagent_state = LIQUID
+ color = "#4B4B4B"
+ harmless = FALSE
+ taste_description = "processed sludge"
+
+/datum/reagent/tar_compound/reaction_turf(turf/simulated/T, volume)
+ if(volume < 1 || !issimulatedturf(T))
+ return
+ var/obj/effect/decal/cleanable/tar/C = locate() in T
+ if(C) // We don't want the slowdown to stack
+ return
+ new /obj/effect/decal/cleanable/tar(T)
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index be196f847af..0c276897980 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -37,6 +37,10 @@
to_chat(user, "[src] is full.")
return
+ if(!is_open_container())
+ to_chat(user, "[src] cannot be refilled.")
+ return
+
var/trans = A.reagents.trans_to(src, 50) //This is a static amount, otherwise, it'll take forever to fill.
to_chat(user, "You fill [src] with [trans] units of the contents of [A].")
return
@@ -281,3 +285,18 @@
belt_icon = null
volume = 100
list_reagents = list("glyphosate" = 100)
+
+/// Sticky tar spray
+/obj/item/reagent_containers/spray/sticky_tar
+ name = "sticky tar applicator"
+ desc = "A suspicious looking spraycan filled with an extremely viscous and sticky fluid."
+ lefthand_file = 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+ icon_state = "syndie_spraycan"
+ item_state = "syndie_spraycan"
+ container_type = AMOUNT_VISIBLE
+ spray_maxrange = 2
+ spray_currentrange = 2
+ amount_per_transfer_from_this = 10
+ list_reagents = list("sticky_tar" = 100)
+
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 1581440b4fe..3bfa99bbd58 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_lefthand.dmi b/icons/mob/inhands/equipment/custodial_lefthand.dmi
index c4f2e189a21..848a3471f8c 100644
Binary files a/icons/mob/inhands/equipment/custodial_lefthand.dmi and b/icons/mob/inhands/equipment/custodial_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/custodial_righthand.dmi b/icons/mob/inhands/equipment/custodial_righthand.dmi
index 4db565e94ba..3295fd2f7f3 100644
Binary files a/icons/mob/inhands/equipment/custodial_righthand.dmi and b/icons/mob/inhands/equipment/custodial_righthand.dmi differ
diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi
index 2c77473d2d5..45378aedb65 100644
Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ
diff --git a/paradise.dme b/paradise.dme
index f79ae27cc6f..c5aa5234cd7 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -970,6 +970,7 @@
#include "code\game\objects\effects\decals\Cleanable\humans.dm"
#include "code\game\objects\effects\decals\Cleanable\misc_cleanables.dm"
#include "code\game\objects\effects\decals\Cleanable\robots.dm"
+#include "code\game\objects\effects\decals\Cleanable\tar.dm"
#include "code\game\objects\effects\decals\Cleanable\tracks.dm"
#include "code\game\objects\effects\decals\turfdecals\dirt.dm"
#include "code\game\objects\effects\decals\turfdecals\markings.dm"