diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 80b3a7c113..b27fd85607 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -56,7 +56,7 @@
"Devices and Tools" = list(
new/datum/uplink_item(/obj/item/weapon/card/emag, 3, "Cryptographic Sequencer", "EC"),
new/datum/uplink_item(/obj/item/weapon/storage/toolbox/syndicate, 1, "Fully Loaded Toolbox", "ST"),
- new/datum/uplink_item(/obj/item/weapon/stamp/chameleon, 3, "Morphic Chameleon Stmap", "CS"),
+ new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/clerical, 3, "Morphic Clerical Kit", "CK"),
new/datum/uplink_item(/obj/item/weapon/storage/box/syndie_kit/space, 3, "Space Suit", "SS"),
new/datum/uplink_item(/obj/item/clothing/glasses/thermal/syndi, 3, "Thermal Imaging Glasses", "TM"),
new/datum/uplink_item(/obj/item/device/encryptionkey/binary, 3, "Binary Translator Key", "BT"),
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index d28586b0a2..8e78bfcf9d 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -125,7 +125,7 @@
/obj/item/weapon/storage/box/syndie_kit/chameleon
name = "Chameleon Kit"
- desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold seperately."
+ desc = "Comes with all the clothes you need to impersonate most people. Acting lessons sold separately."
storage_slots = 10
/obj/item/weapon/storage/box/syndie_kit/chameleon/New()
@@ -139,4 +139,13 @@
new /obj/item/clothing/mask/chameleon(src)
new /obj/item/clothing/glasses/chameleon(src)
new /obj/item/weapon/gun/projectile/chameleon(src)
- new /obj/item/ammo_magazine/chameleon(src)
\ No newline at end of file
+ new /obj/item/ammo_magazine/chameleon(src)
+
+/obj/item/weapon/storage/box/syndie_kit/clerical
+ name = "Clerical Kit"
+ desc = "Comes with all you need to fake paperwork. Assumes you have passed basic writing lessons."
+
+/obj/item/weapon/storage/box/syndie_kit/clerical/New()
+ ..()
+ new /obj/item/weapon/stamp/chameleon(src)
+ new /obj/item/weapon/pen/chameleon(src)
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 72f827f7ed..440d48aca1 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -193,6 +193,10 @@
updateinfolinks()
update_icon()
+/obj/item/weapon/paper/proc/get_signature(var/obj/item/weapon/pen/P, mob/user as mob)
+ if(P)
+ return P.get_signature(user)
+ return (user && user.real_name) ? user.real_name : "Anonymous"
/obj/item/weapon/paper/proc/parsepencode(var/t, var/obj/item/weapon/pen/P, mob/user as mob, var/iscrayon = 0)
// t = copytext(sanitize(t),1,MAX_MESSAGE_LEN)
@@ -208,7 +212,7 @@
t = replacetext(t, "\[/u\]", "")
t = replacetext(t, "\[large\]", "")
t = replacetext(t, "\[/large\]", "")
- t = replacetext(t, "\[sign\]", "[user ? user.real_name : "Anonymous"]")
+ t = replacetext(t, "\[sign\]", "[get_signature(P, user)]")
t = replacetext(t, "\[field\]", "")
t = replacetext(t, "\[h1\]", "
")
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index 6197956587..dd60029382 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -1,114 +1,140 @@
-/* Pens!
- * Contains:
- * Pens
- * Sleepy Pens
- * Parapens
- */
-
-
-/*
- * Pens
- */
-/obj/item/weapon/pen
- desc = "It's a normal black ink pen."
- name = "pen"
- icon = 'icons/obj/bureaucracy.dmi'
- icon_state = "pen"
- item_state = "pen"
- flags = FPRINT | TABLEPASS
- slot_flags = SLOT_BELT | SLOT_EARS
- throwforce = 0
- w_class = 1.0
- throw_speed = 7
- throw_range = 15
- matter = list("metal" = 10)
- var/colour = "black" //what colour the ink is!
- pressure_resistance = 2
-
-
-/obj/item/weapon/pen/blue
- desc = "It's a normal blue ink pen."
- icon_state = "pen_blue"
- colour = "blue"
-
-/obj/item/weapon/pen/red
- desc = "It's a normal red ink pen."
- icon_state = "pen_red"
- colour = "red"
-
-/obj/item/weapon/pen/invisible
- desc = "It's an invisble pen marker."
- icon_state = "pen"
- colour = "white"
-
-
-/obj/item/weapon/pen/attack(mob/M as mob, mob/user as mob)
- if(!ismob(M))
- return
- user << "You stab [M] with the pen."
-// M << "\red You feel a tiny prick!" //That's a whole lot of meta!
- M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [name] by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used the [name] to stab [M.name] ([M.ckey])")
- msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)")
- return
-
-
-/*
- * Sleepy Pens
- */
-/obj/item/weapon/pen/sleepypen
- desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\""
- flags = FPRINT | TABLEPASS | OPENCONTAINER
- slot_flags = SLOT_BELT
- origin_tech = "materials=2;syndicate=5"
-
-
-/obj/item/weapon/pen/sleepypen/New()
- var/datum/reagents/R = new/datum/reagents(30) //Used to be 300
- reagents = R
- R.my_atom = src
- R.add_reagent("chloralhydrate", 22) //Used to be 100 sleep toxin//30 Chloral seems to be fatal, reducing it to 22./N
- ..()
- return
-
-
-/obj/item/weapon/pen/sleepypen/attack(mob/M as mob, mob/user as mob)
- if(!(istype(M,/mob)))
- return
- ..()
- if(reagents.total_volume)
- if(M.reagents) reagents.trans_to(M, 50) //used to be 150
- return
-
-
-/*
- * Parapens
- */
- /obj/item/weapon/pen/paralysis
- flags = FPRINT | TABLEPASS | OPENCONTAINER
- slot_flags = SLOT_BELT
- origin_tech = "materials=2;syndicate=5"
-
-
-/obj/item/weapon/pen/paralysis/attack(mob/living/M as mob, mob/user as mob)
-
- if(!(istype(M,/mob)))
- return
-
- ..()
-
-
- if(M.can_inject(user,1))
- if(reagents.total_volume)
- if(M.reagents) reagents.trans_to(M, 50)
- return
-
-
-/obj/item/weapon/pen/paralysis/New()
- var/datum/reagents/R = new/datum/reagents(50)
- reagents = R
- R.my_atom = src
- R.add_reagent("zombiepowder", 10)
- R.add_reagent("cryptobiolin", 15)
- ..()
- return
+/* Pens!
+ * Contains:
+ * Pens
+ * Sleepy Pens
+ * Parapens
+ */
+
+
+/*
+ * Pens
+ */
+/obj/item/weapon/pen
+ desc = "It's a normal black ink pen."
+ name = "pen"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "pen"
+ item_state = "pen"
+ flags = FPRINT | TABLEPASS
+ slot_flags = SLOT_BELT | SLOT_EARS
+ throwforce = 0
+ w_class = 1.0
+ throw_speed = 7
+ throw_range = 15
+ matter = list("metal" = 10)
+ var/colour = "black" //what colour the ink is!
+ pressure_resistance = 2
+
+
+/obj/item/weapon/pen/blue
+ desc = "It's a normal blue ink pen."
+ icon_state = "pen_blue"
+ colour = "blue"
+
+/obj/item/weapon/pen/red
+ desc = "It's a normal red ink pen."
+ icon_state = "pen_red"
+ colour = "red"
+
+/obj/item/weapon/pen/invisible
+ desc = "It's an invisble pen marker."
+ icon_state = "pen"
+ colour = "white"
+
+
+/obj/item/weapon/pen/attack(mob/M as mob, mob/user as mob)
+ if(!ismob(M))
+ return
+ user << "You stab [M] with the pen."
+// M << "\red You feel a tiny prick!" //That's a whole lot of meta!
+ M.attack_log += text("\[[time_stamp()]\] Has been stabbed with [name] by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used the [name] to stab [M.name] ([M.ckey])")
+ msg_admin_attack("[user.name] ([user.ckey]) Used the [name] to stab [M.name] ([M.ckey]) (JMP)")
+ return
+
+
+/*
+ * Sleepy Pens
+ */
+/obj/item/weapon/pen/sleepypen
+ desc = "It's a black ink pen with a sharp point and a carefully engraved \"Waffle Co.\""
+ flags = FPRINT | TABLEPASS | OPENCONTAINER
+ slot_flags = SLOT_BELT
+ origin_tech = "materials=2;syndicate=5"
+
+
+/obj/item/weapon/pen/sleepypen/New()
+ var/datum/reagents/R = new/datum/reagents(30) //Used to be 300
+ reagents = R
+ R.my_atom = src
+ R.add_reagent("chloralhydrate", 22) //Used to be 100 sleep toxin//30 Chloral seems to be fatal, reducing it to 22./N
+ ..()
+ return
+
+
+/obj/item/weapon/pen/sleepypen/attack(mob/M as mob, mob/user as mob)
+ if(!(istype(M,/mob)))
+ return
+ ..()
+ if(reagents.total_volume)
+ if(M.reagents) reagents.trans_to(M, 50) //used to be 150
+ return
+
+
+/*
+ * Parapens
+ */
+ /obj/item/weapon/pen/paralysis
+ flags = FPRINT | TABLEPASS | OPENCONTAINER
+ slot_flags = SLOT_BELT
+ origin_tech = "materials=2;syndicate=5"
+
+
+/obj/item/weapon/pen/paralysis/attack(mob/living/M as mob, mob/user as mob)
+
+ if(!(istype(M,/mob)))
+ return
+
+ ..()
+
+
+ if(M.can_inject(user,1))
+ if(reagents.total_volume)
+ if(M.reagents) reagents.trans_to(M, 50)
+ return
+
+
+/obj/item/weapon/pen/paralysis/New()
+ var/datum/reagents/R = new/datum/reagents(50)
+ reagents = R
+ R.my_atom = src
+ R.add_reagent("zombiepowder", 10)
+ R.add_reagent("cryptobiolin", 15)
+ ..()
+ return
+
+/*
+ * Chameleon pen
+ */
+/obj/item/weapon/pen/chameleon
+ var/signature = ""
+
+/obj/item/weapon/pen/chameleon/attack_self(mob/user as mob)
+ /*
+ // Limit signatures to official crew members
+ var/personnel_list[] = list()
+ for(var/datum/data/record/t in data_core.locked) //Look in data core locked.
+ personnel_list.Add(t.fields["name"])
+ personnel_list.Add("Anonymous")
+
+ var/new_signature = input("Enter new signature pattern.", "New Signature") as null|anything in personnel_list
+ if(new_signature)
+ signature = new_signature
+ */
+ signature = trim_strip_html_properly(input("Enter new signature. Leave blank for 'Anonymous'", "New Signature", signature))
+
+/obj/item/weapon/pen/proc/get_signature(var/mob/user)
+ return (user && user.real_name) ? user.real_name : "Anonymous"
+
+/obj/item/weapon/pen/chameleon/get_signature(var/mob/user)
+ return signature ? signature : "Anonymous"