diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm
index a7ecf241e68..c4c0845d2b4 100644
--- a/code/game/objects/items/devices/traitordevices.dm
+++ b/code/game/objects/items/devices/traitordevices.dm
@@ -143,4 +143,62 @@ effective or pretty fucking useless.
attack_self(usr)
add_fingerprint(usr)
- return
\ No newline at end of file
+ return
+
+/obj/item/device/shadowcloak
+ name = "cloaker belt"
+ desc = "Makes you invisible for short periods of time. Recharges in darkness."
+ icon = 'icons/obj/clothing/belts.dmi'
+ icon_state = "utilitybelt"
+ item_state = "utility"
+ slot_flags = SLOT_BELT
+ attack_verb = list("whipped", "lashed", "disciplined")
+
+ var/mob/living/carbon/human/user = null
+ var/charge = 300
+ var/max_charge = 300
+ var/on = 0
+ var/old_alpha = 0
+ action_button_name = "Toggle Cloaker"
+
+/obj/item/device/shadowcloak/ui_action_click()
+ if(usr.get_item_by_slot(slot_belt) == src)
+ if(!on)
+ Activate(usr)
+ else
+ Deactivate()
+ return
+
+/obj/item/device/shadowcloak/proc/Activate(mob/living/carbon/human/user)
+ if(!user)
+ return
+ user << "You activate [src]."
+ src.user = user
+ SSobj.processing |= src
+ old_alpha = user.alpha
+ on = 1
+
+/obj/item/device/shadowcloak/proc/Deactivate()
+ user << "You deactivate [src]."
+ SSobj.processing.Remove(src)
+ if(user)
+ user.alpha = old_alpha
+ on = 0
+ user = null
+
+/obj/item/device/shadowcloak/dropped(mob/user)
+ if(user && user.get_item_by_slot(slot_belt) != src)
+ Deactivate()
+
+/obj/item/device/shadowcloak/process()
+ if(user.get_item_by_slot(slot_belt) != src)
+ Deactivate()
+ return
+ var/turf/simulated/T = get_turf(src)
+ if(on)
+ var/lumcount = T.get_lumcount()
+ if(lumcount > 3)
+ charge = max(0,charge - 25)//Quick decrease in light
+ else
+ charge = min(max_charge,charge + 50) //Charge in the dark
+ animate(user,alpha = Clamp(255 - charge,0,255),time = 10)