diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 1cf08abebd0..1aa65685d5e 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -922,6 +922,15 @@ var/list/uplink_items = list()
cost = 2
surplus = 30
+/datum/uplink_item/stealthy_tools/cutouts
+ name = "Adaptive Cardboard Cutouts"
+ desc = "These cardboard cutouts are coated with a thin material that prevents discoloration and makes the images on them appear more lifelike. This pack contains three as well as a \
+ spraycan for changing their appearances."
+ reference = "ADCC"
+ item = /obj/item/weapon/storage/box/syndie_kit/cutouts
+ cost = 1
+ surplus = 20
+
// DEVICE AND TOOLS
/datum/uplink_item/device_tools
diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm
new file mode 100644
index 00000000000..d815e8c262f
--- /dev/null
+++ b/code/game/objects/items/cardboard_cutouts.dm
@@ -0,0 +1,188 @@
+//Cardboard cutouts! They're man-shaped and can be colored with a crayon to look like a human in a certain outfit, although it's limited, discolored, and obvious to more than a cursory glance.
+/obj/item/cardboard_cutout
+ name = "cardboard cutout"
+ desc = "A vaguely humanoid cardboard cutout. It's completely blank."
+ icon = 'icons/obj/cardboard_cutout.dmi'
+ icon_state = "cutout_basic"
+ burn_state = FLAMMABLE
+ w_class = WEIGHT_CLASS_BULKY
+ var/list/possible_appearances = list("Assistant", "Clown", "Mime",
+ "Traitor", "Nuke Op", "Cultist", "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Swarmer",
+ "Deathsquad Officer", "Ian", "Slaughter Demon",
+ "Laughter Demon", "Xenomorph Maid", "Security Officer", "Terror Spider")
+ var/pushed_over = FALSE //If the cutout is pushed over and has to be righted
+ var/deceptive = FALSE //If the cutout actually appears as what it portray and not a discolored version
+ var/lastattacker = null
+
+/obj/item/cardboard_cutout/attack_hand(mob/living/user)
+ if(user.a_intent == I_HELP || pushed_over)
+ return ..()
+ user.visible_message("[user] pushes over [src]!", "You push over [src]!")
+ playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
+ push_over()
+
+/obj/item/cardboard_cutout/proc/push_over()
+ name = initial(name)
+ desc = "[initial(desc)] It's been pushed over."
+ icon = initial(icon)
+ icon_state = "cutout_pushed_over"
+ color = initial(color)
+ alpha = initial(alpha)
+ pushed_over = TRUE
+
+/obj/item/cardboard_cutout/attack_self(mob/living/user)
+ if(!pushed_over)
+ return
+ to_chat(user, "You right [src].")
+ desc = initial(desc)
+ icon = initial(icon)
+ icon_state = initial(icon_state) //This resets a cutout to its blank state - this is intentional to allow for resetting
+ pushed_over = FALSE
+
+/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params)
+ if(istype(I, /obj/item/toy/crayon))
+ change_appearance(I, user)
+ return
+ // Why yes, this does closely resemble mob and object attack code.
+ if(I.flags & NOBLUDGEON)
+ return
+ if(!I.force)
+ playsound(loc, 'sound/weapons/tap.ogg', 20, 1, -1)
+ else if(I.hitsound)
+ playsound(loc, I.hitsound, 20, 1, -1)
+
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.do_attack_animation(src)
+
+ if(I.force)
+ user.visible_message("[user] has hit \
+ [src] with [I]!", "You hit [src] \
+ with [I]!")
+
+ if(prob(I.force))
+ push_over()
+
+/obj/item/cardboard_cutout/bullet_act(obj/item/projectile/P)
+ visible_message("[src] has been hit by [P]!")
+ playsound(src, 'sound/weapons/slice.ogg', 50, 1)
+ if(prob(P.damage))
+ push_over()
+
+/obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user)
+ if(!crayon || !user)
+ return
+ if(istype(crayon, /obj/item/toy/crayon/spraycan))
+ var/obj/item/toy/crayon/spraycan/can = crayon
+ if(can.capped)
+ to_chat(user, "The cap is on [src] remove it first!")
+ return
+ if(pushed_over)
+ to_chat(user, "Right [src] first!")
+ return
+ var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances
+ if(!new_appearance || !crayon)
+ return
+ if(!do_after(user, 10, FALSE, src, TRUE))
+ return
+ user.visible_message("[user] gives [src] a new look.", "Voila! You give [src] a new look.")
+ alpha = 255
+ icon = initial(icon)
+ if(!deceptive)
+ color = "#FFD7A7"
+ switch(new_appearance)
+ if("Assistant")
+ name = "[pick(first_names_male)] [pick(last_names)]"
+ desc = "A cardboard cutout of an assistant."
+ icon_state = "cutout_greytide"
+ if("Clown")
+ name = pick(clown_names)
+ desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner."
+ icon_state = "cutout_clown"
+ if("Mime")
+ name = pick(mime_names)
+ desc = "...(A cardboard cutout of a mime.)"
+ icon_state = "cutout_mime"
+ if("Traitor")
+ name = "[pick("Unknown", "Captain")]"
+ desc = "A cardboard cutout of a traitor."
+ icon_state = "cutout_traitor"
+ if("Nuke Op")
+ name = "[pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic", "Gonk op")]"
+ desc = "A cardboard cutout of a nuclear operative."
+ icon_state = "cutout_fluke"
+ if("Cultist")
+ name = "Unknown"
+ desc = "A cardboard cutout of a cultist."
+ icon_state = "cutout_cultist"
+ //if("Clockwork Cultist")
+ // name = "[random_name(pick(MALE,FEMALE))]"
+ // desc = "A cardboard cutout of a servant of Ratvar."
+ // icon_state = "cutout_servant"
+ if("Revolutionary")
+ name = "Unknown"
+ desc = "A cardboard cutout of a revolutionary."
+ icon_state = "cutout_viva"
+ if("Wizard")
+ name = "[pick(wizard_first)], [pick(wizard_second)]"
+ desc = "A cardboard cutout of a wizard."
+ icon_state = "cutout_wizard"
+ if("Shadowling")
+ name = "Unknown"
+ desc = "A cardboard cutout of a shadowling."
+ icon_state = "cutout_shadowling"
+ if("Xenomorph")
+ name = "alien hunter ([rand(1, 999)])"
+ desc = "A cardboard cutout of a xenomorph."
+ icon_state = "cutout_fukken_xeno"
+ if(prob(10))
+ alpha = 75 //Spooky sneaking!
+ if("Swarmer")
+ name = "Swarmer ([rand(1, 999)])"
+ desc = "A cardboard cutout of a swarmer."
+ icon_state = "cutout_swarmer"
+ //if("Ash Walker")
+ // name = random_name(pick(MALE,FEMALE),"Unathi")
+ // desc = "A cardboard cutout of an ash walker."
+ // icon_state = "cutout_free_antag"
+ if("Deathsquad Officer")
+ name = pick(commando_names)
+ desc = "A cardboard cutout of a death commando."
+ icon_state = "cutout_deathsquad"
+ if("Ian")
+ name = "Ian"
+ desc = "A cardboard cutout of the HoP's beloved corgi."
+ icon_state = "cutout_ian"
+ if("Slaughter Demon")
+ name = "slaughter demon"
+ desc = "A cardboard cutout of a slaughter demon."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "daemon"
+ dir = "SOUTH"
+ if("Laughter Demon")
+ name = "laughter demon"
+ desc = "A cardboard cutout of a laughter demon."
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "bowmon"
+ dir = "SOUTH"
+ if("Xenomorph Maid")
+ name = "lusty xenomorph maid ([rand(1, 999)])"
+ desc = "A cardboard cutout of a xenomorph maid."
+ icon_state = "cutout_lusty"
+ if("Security Officer")
+ name = "Private Security Officer"
+ desc = "A cardboard cutout of a private security officer."
+ icon_state = "cutout_ntsec"
+ if("Terror Spider")
+ name = "Gray Terror Spider"
+ desc = "A cardboard cutout of a terror spider."
+ icon = 'icons/mob/terrorspider.dmi'
+ icon_state = "terror_gray"
+ dir = "SOUTH"
+
+ return 1
+
+/obj/item/cardboard_cutout/setDir()
+ dir = SOUTH
+
+/obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed
+ deceptive = TRUE
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 858365f6d29..67755655fe3 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -237,6 +237,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
new /datum/stack_recipe("folder", /obj/item/weapon/folder),
new /datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube),
new /datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4),
+ new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5),
)
/obj/item/stack/sheet/cardboard //BubbleWrap
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index d721cb46271..9efc5f625a6 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -216,3 +216,13 @@
B.deity_name = "Success"
B.icon_state = "greentext"
B.item_state = "greentext"
+
+
+/obj/item/weapon/storage/box/syndie_kit/cutouts
+ name = "Fortified Artistic Box"
+
+/obj/item/weapon/storage/box/syndie_kit/cutouts/New()
+ ..()
+ for(var/i in 1 to 3)
+ new/obj/item/cardboard_cutout/adaptive(src)
+ new/obj/item/toy/crayon/spraycan(src)
\ No newline at end of file
diff --git a/icons/obj/cardboard_cutout.dmi b/icons/obj/cardboard_cutout.dmi
new file mode 100644
index 00000000000..da5f58d7f7c
Binary files /dev/null and b/icons/obj/cardboard_cutout.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 869bffe601b..3b4107b4f57 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -709,6 +709,7 @@
#include "code\game\objects\items\blueprints.dm"
#include "code\game\objects\items\bodybag.dm"
#include "code\game\objects\items\candle.dm"
+#include "code\game\objects\items\cardboard_cutouts.dm"
#include "code\game\objects\items\changestone.dm"
#include "code\game\objects\items\contraband.dm"
#include "code\game\objects\items\control_wand.dm"