diff --git a/maplestation.dme b/maplestation.dme
index dde1d478c94b..025854638738 100644
--- a/maplestation.dme
+++ b/maplestation.dme
@@ -6567,6 +6567,7 @@
#include "maplestation_modules\code\modules\clothing\under\jobs\security.dm"
#include "maplestation_modules\code\modules\events\resource_drift.dm"
#include "maplestation_modules\code\modules\events\resource_pods.dm"
+#include "maplestation_modules\code\modules\events\secretsanta.dm"
#include "maplestation_modules\code\modules\events\solar_flare.dm"
#include "maplestation_modules\code\modules\flavor_text\flavor_examine.dm"
#include "maplestation_modules\code\modules\flavor_text\flavor_helpers.dm"
diff --git a/maplestation_modules/code/modules/events/secretsanta.dm b/maplestation_modules/code/modules/events/secretsanta.dm
new file mode 100644
index 000000000000..16b682e0563d
--- /dev/null
+++ b/maplestation_modules/code/modules/events/secretsanta.dm
@@ -0,0 +1,109 @@
+/datum/round_event_control/secretsanta
+ name = "Secret Santa"
+ holidayID = FESTIVE_SEASON
+ typepath = /datum/round_event/secretsanta
+ weight = -1 //forces it to be called, regardless of weight
+ max_occurrences = 1
+ earliest_start = 5 MINUTES
+ category = EVENT_CATEGORY_HOLIDAY
+ description = "Gives everyone a secret santa to gift something to! \
+ You can execute this multiple times per round to include latejoiners."
+ min_players = 3
+
+/datum/round_event/secretsanta
+ fakeable = FALSE
+ /// Only announce once
+ var/static/announced = FALSE
+
+/datum/round_event/secretsanta/start()
+ var/list/mob/living/candidates = list()
+ for(var/mob/living/candidate as anything in GLOB.mob_living_list)
+ if(is_candidate(candidate))
+ candidates += candidate
+
+ if(length(candidates) < 2)
+ return // shouldn't happen due to players_amt, but just in case
+
+ var/mob/living/first_gifter = pick_n_take(candidates)
+ var/mob/living/last_gifter = first_gifter
+
+ while(length(candidates))
+ var/mob/living/next_gifter = pick_n_take(candidates)
+ assign_secret_santa(next_gifter, last_gifter)
+ last_gifter = next_gifter
+
+ assign_secret_santa(first_gifter, last_gifter)
+
+/datum/round_event/secretsanta/proc/is_candidate(mob/living/some_mob)
+ if(isnull(some_mob.mind))
+ return FALSE
+ if(some_mob.mind.has_antag_datum(/datum/antagonist/secret_santa))
+ return FALSE
+ var/turf/some_turf = get_turf(some_mob)
+ // admin characters need not apply, you can spawn whatever you want for christmas
+ if(is_centcom_level(some_turf.z))
+ return FALSE
+ // crew secret santa
+ if(some_mob.mind.assigned_role.job_flags & JOB_CREW_MEMBER)
+ return TRUE
+ // sure, we can include silicons in on this. just don't grab ones in deep space i guess
+ if(issilicon(some_mob) && (is_station_level(some_turf.z) || is_mining_level(some_turf.z)))
+ return TRUE
+ return FALSE
+
+/datum/round_event/secretsanta/proc/assign_secret_santa(mob/living/gifter, mob/living/recipient)
+ var/datum/antagonist/secret_santa/secret = gifter.mind.add_antag_datum(__IMPLIED_TYPE__)
+ secret.recipient = recipient.mind
+ to_chat(gifter, examine_block(span_green("[span_big("You are [secret.recipient.name]'s Secret Santa!")]
\
+ Come up with an appropriate gift and wait for the festivities to begin!
\
+ (If you need help coming up with an idea, try asking their co-workers and friends, or even pray for inspiration!)")))
+
+/datum/round_event/secretsanta/announce(fake)
+ if(fake || announced)
+ return
+
+ announced = TRUE
+ priority_announce("Ho ho ho! The annual Nanotrasen™ Secret Santa is starting! Everyone has been assigned a Secret Santa of another crew member.
\
+ When and where you decide to exchange gifts is up to you all to decide - just remember to keep your assignment a secret!
Happy holidays!", encode_text = FALSE)
+
+/datum/antagonist/secret_santa
+ name = "\improper Secret Santa"
+ roundend_category = "secret santa"
+ show_in_antagpanel = FALSE
+ prevent_roundtype_conversion = FALSE
+ ui_name = null
+ silent = TRUE
+ /// Keep track who we're giving a gift to
+ var/datum/mind/recipient
+
+/datum/antagonist/secret_santa/roundend_report()
+ return "• [owner.name] had [recipient.name] as [owner.p_their()] Secret Santa recipient."
+
+/datum/antagonist/secret_santa/apply_innate_effects(mob/living/mob_override)
+ var/mob/living/target = mob_override || owner.current
+ var/datum/action/secret_santa_reminder/reminder = new(src)
+ reminder.Grant(target)
+
+/datum/antagonist/secret_santa/remove_innate_effects(mob/living/mob_override)
+ var/mob/living/target = mob_override || owner.current
+ for(var/datum/action/secret_santa_reminder/reminder in target.actions)
+ qdel(reminder)
+
+/datum/action/secret_santa_reminder
+ name = "Secret Santa Reminder"
+ desc = "Reminds you of who your Secret Santa recipient is."
+ button_icon_state = "round_end"
+ show_to_observers = FALSE
+
+/datum/action/secret_santa_reminder/Trigger(trigger_flags)
+ . = ..()
+ if(!.)
+ return
+
+ var/datum/antagonist/secret_santa/secret = target
+ if(!istype(secret))
+ return
+
+ to_chat(usr, examine_block(span_green("[span_big("You are [secret.recipient.name]'s Secret Santa!")]
\
+ Come up with an appropriate gift and wait for the festivities to begin!
\
+ (If you need help coming up with an idea, try asking their co-workers and friends, or even pray for inspiration!)")))