diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index e7893c3f84e..66cdff69b3f 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -409,6 +409,15 @@
limit = 3
category = "Assistance"
+/datum/spellbook_entry/item/oozebottle
+ name = "Bottle of Ooze"
+ desc = "A bottle of magically infused ooze, which will awake an all-consuming Morph, capable of cunningly disguising itself as any object it comes in contact with. Be careful though, as Morph diet includes Wizards."
+ item_path = /obj/item/antag_spawner/morph
+ cost = 1
+ log_name = "BO"
+ limit = 3
+ category = "Assistance"
+
/datum/spellbook_entry/item/tarotdeck
name = "Tarot Deck"
desc = "A deck of guardian tarot cards, capable of binding a personal guardian to your body. There are multiple types of guardian available, but all of them will transfer some amount of damage to you. \
diff --git a/code/modules/antagonists/_common/antag_spawner.dm b/code/modules/antagonists/_common/antag_spawner.dm
index 937c831dfbf..c1155bee0d3 100644
--- a/code/modules/antagonists/_common/antag_spawner.dm
+++ b/code/modules/antagonists/_common/antag_spawner.dm
@@ -10,7 +10,6 @@
/obj/item/antag_spawner/proc/equip_antag(mob/target)
return
-
/obj/item/antag_spawner/borg_tele
name = "syndicate cyborg teleporter"
desc = "A single-use teleporter used to deploy a Syndicate Cyborg on the field."
@@ -149,7 +148,6 @@
to_chat(S, "Objective #[1]: [KillDaWiz.explanation_text]")
to_chat(S, "Objective #[2]: [KillDaCrew.explanation_text]")
-
/obj/item/antag_spawner/slaughter_demon/laughter
name = "vial of tickles"
desc = "A magically infused bottle of clown love, distilled from \
@@ -160,3 +158,60 @@
lurking just beyond the veil..."
objective_verb = "Hug and Tickle"
demon_type = /mob/living/simple_animal/slaughter/laughter
+
+/obj/item/antag_spawner/morph
+ name = "vial of ooze"
+ desc = "A magically infused bottle of ooze, distilled by methods rather not be spoken of."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "vialooze"
+ var/shatter_msg = "You shatter the bottle, no \
+ turning back now!"
+ var/veil_msg = "The sludge is awake and seeps \
+ away..."
+ var/objective_verb = "Eat"
+ var/mob/living/morph_type = /mob/living/simple_animal/hostile/morph
+
+/obj/item/antag_spawner/morph/attack_self(mob/user)
+ if(level_blocks_magic(user.z))//this is to make sure the wizard does NOT summon a morph from the Den..
+ to_chat(user, "You should probably wait until you reach the station.")
+ return
+
+ if(used)
+ to_chat(user, "This bottle already has a broken seal.")
+ return
+ used = TRUE
+ to_chat(user, "You break the seal on the bottle, calling upon the dire sludge to awaken...")
+
+ var/list/candidates = pollCandidates("Do you want to play as a Morph awakened by [user.real_name]?", ROLE_MORPH, 1, 100)
+
+ if(candidates.len > 0)
+ var/mob/C = pick(candidates)
+ spawn_antag(C, get_turf(src.loc), initial(morph_type.name), user)
+ to_chat(user, "[shatter_msg]")
+ to_chat(user, "[veil_msg]")
+ playsound(user.loc, 'sound/effects/glassbr1.ogg', 100, 1)
+ qdel(src)
+ else
+ used = FALSE
+ to_chat(user, "The sludge does not respond to your attempt to awake it. Perhaps you should try again later.")
+
+/obj/item/antag_spawner/morph/spawn_antag(client/C, turf/T, type = "", mob/user)
+ var/mob/living/simple_animal/hostile/morph/M = new /mob/living/simple_animal/hostile/morph(pick(xeno_spawn))
+ M.key = C.key
+ M.mind.assigned_role = SPECIAL_ROLE_MORPH
+ M.mind.special_role = SPECIAL_ROLE_MORPH
+ to_chat(M, M.playstyle_string)
+ ticker.mode.traitors += M.mind
+ var/datum/objective/assassinate/KillDaWiz = new /datum/objective/assassinate
+ KillDaWiz.owner = M.mind
+ KillDaWiz.target = user.mind
+ KillDaWiz.explanation_text = "[objective_verb] [user.real_name], the one who was foolish enough to awake you."
+ M.mind.objectives += KillDaWiz
+ var/datum/objective/KillDaCrew = new /datum/objective
+ KillDaCrew.owner = M.mind
+ KillDaCrew.explanation_text = "[objective_verb] everyone and everything else while you're at it."
+ M.mind.objectives += KillDaCrew
+ M.mind.objectives += KillDaCrew
+ to_chat(M, "Objective #[1]: [KillDaWiz.explanation_text]")
+ to_chat(M, "Objective #[2]: [KillDaCrew.explanation_text]")
+ M << 'sound/magic/mutate.ogg'
\ No newline at end of file
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index 108e5603b25..07c8be38ed9 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ