diff --git a/code/controllers/subsystem/pai.dm b/code/controllers/subsystem/pai.dm
index dd9848e465..8a6ded4865 100644
--- a/code/controllers/subsystem/pai.dm
+++ b/code/controllers/subsystem/pai.dm
@@ -1,12 +1,18 @@
SUBSYSTEM_DEF(pai)
name = "pAI"
- flags = SS_NO_INIT|SS_NO_FIRE
+ flags = SS_NO_FIRE
var/list/candidates = list()
var/ghost_spam = FALSE
var/spam_delay = 100
var/list/pai_card_list = list()
+ var/list/restricted_areas = list()
+
+/datum/controller/subsystem/pai/Initialize(var/time_of_day)
+ restricted_areas += typesof(/area/command/heads_quarters, /area/ai_monitored) // heads quarters and AI monitored places (like the armory)
+ initialized = TRUE
+ return ..()
/datum/controller/subsystem/pai/Topic(href, href_list)
if(href_list["download"])
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index ffe88705e4..d18014f4d6 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -322,6 +322,30 @@
else
to_chat(user, "Encryption Key ports not configured.")
+/obj/item/paicard/attack_ghost(mob/dead/observer/user)
+ if(pai)
+ to_chat(user, "This pAI is already in use!")
+ return
+
+ var/area/A = get_area(get_turf(src))
+ if(A.type in SSpai.restricted_areas) // set in subsystem/pai.dm on initialize of the subsystem
+ to_chat(user, "You can't download yourself into a restricted area!")
+ return
+
+ var/pai_name = reject_bad_name(stripped_input(usr, "Enter a name for your pAI", "pAI Name", user.name, MAX_NAME_LEN), TRUE)
+ if(!pai_name)
+ to_chat(user, "Entered name is not valid.")
+ return
+
+ var/mob/living/silicon/pai/new_pai = new(src)
+ new_pai.name = pai_name
+ new_pai.real_name = new_pai.name
+ new_pai.key = user.key
+
+ setPersonality(new_pai)
+
+ SSticker.mode.update_cult_icons_removed(pai.mind)
+
/obj/item/paicard/emag_act(mob/user) // Emag to wipe the master DNA and supplemental directive
. = ..()
if(!pai)