diff --git a/code/datums/autolathe/arms_vr.dm b/code/datums/autolathe/arms_vr.dm
index 72f0b9d15a..546141457d 100644
--- a/code/datums/autolathe/arms_vr.dm
+++ b/code/datums/autolathe/arms_vr.dm
@@ -32,3 +32,21 @@
name = "magazine (.44 rubber)"
path =/obj/item/ammo_magazine/m44/rubber
hidden = 1
+
+/datum/category_item/autolathe/arms/classic_smg_9mm
+ name = "SMG magazine (9mm)"
+ path = /obj/item/ammo_magazine/m9mml
+ hidden = 1
+/* De-coded?
+/datum/category_item/autolathe/arms/classic_smg_9mmr
+ name = "SMG magazine (9mm rubber)"
+ path = /obj/item/ammo_magazine/m9mml/rubber
+
+/datum/category_item/autolathe/arms/classic_smg_9mmp
+ name = "SMG magazine (9mm practice)"
+ path = /obj/item/ammo_magazine/m9mml/practice
+
+/datum/category_item/autolathe/arms/classic_smg_9mmf
+ name = "SMG magazine (9mm flash)"
+ path = /obj/item/ammo_magazine/m9mml/flash
+*/
\ No newline at end of file
diff --git a/code/game/machinery/autolathe_vr.dm b/code/game/machinery/autolathe_vr.dm
deleted file mode 100644
index 489c97f2f5..0000000000
--- a/code/game/machinery/autolathe_vr.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-/datum/category_item/autolathe/arms/classic_smg_9mm
- name = "SMG magazine (9mm)"
- path = /obj/item/ammo_magazine/m9mml
- hidden = 1
-/* De-coded?
-/datum/category_item/autolathe/arms/classic_smg_9mmr
- name = "SMG magazine (9mm rubber)"
- path = /obj/item/ammo_magazine/m9mml/rubber
-
-/datum/category_item/autolathe/arms/classic_smg_9mmp
- name = "SMG magazine (9mm practice)"
- path = /obj/item/ammo_magazine/m9mml/practice
-
-/datum/category_item/autolathe/arms/classic_smg_9mmf
- name = "SMG magazine (9mm flash)"
- path = /obj/item/ammo_magazine/m9mml/flash
-*/
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm
new file mode 100644
index 0000000000..9557856f60
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/_defines.dm
@@ -0,0 +1,3 @@
+#define AB_SHIFT_NONE 0
+#define AB_SHIFT_PASSIVE 1
+#define AB_SHIFT_ACTIVE 2
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm
new file mode 100644
index 0000000000..b330e8fcb0
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon.dm
@@ -0,0 +1,86 @@
+/mob/living/simple_mob/vore/demon
+ name = "Rift Walker"
+ desc = "A large bipedal creature, body a mix of dark fur and scales. Marks on the creatures body pulse slowly with red light"
+
+ icon_state = "boxfox"
+ icon_living = "boxfox"
+ icon_dead = "boxfox_dead"
+ icon_rest = "boxfox_rest"
+ icon = 'icons/mob/demon_vr.dmi'
+
+ faction = "demon"
+ maxHealth = 30
+ health = 30
+ movement_cooldown = 0
+
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
+ maxbodytemp = INFINITY
+
+ response_help = "touches"
+ response_disarm = "pushes"
+ response_harm = "hits"
+
+ melee_damage_lower = 3
+ melee_damage_upper = 1
+ attacktext = list("clawed")
+
+ vore_active = TRUE
+ vore_icons = SA_ICON_LIVING
+
+ var/shifted_out = FALSE
+ var/shift_state = AB_SHIFT_NONE
+ var/last_shift = 0
+ var/is_shifting = FALSE
+
+/mob/living/simple_mob/vore/demon/init_vore()
+ ..()
+ var/obj/belly/B = vore_selected
+ B.name = "Stomach"
+ B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food."
+
+/mob/living/simple_mob/vore/demon/UnarmedAttack()
+ if(shifted_out)
+ return FALSE
+
+ . = ..()
+
+/mob/living/simple_mob/vore/demon/can_fall()
+ if(shifted_out)
+ return FALSE
+
+ return ..()
+
+/mob/living/simple_mob/vore/demon/zMove(direction)
+ if(shifted_out)
+ var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
+ if(destination)
+ forceMove(destination)
+ return TRUE
+
+ return ..()
+
+/mob/living/simple_mob/vore/demon/Life()
+ . = ..()
+ if(shifted_out)
+ density = FALSE
+
+/mob/living/simple_mob/vore/demon/handle_atmos()
+ if(shifted_out)
+ return
+ else
+ return .=..()
+
+/mob/living/simple_mob/vore/demon/update_canmove()
+ if(is_shifting)
+ canmove = FALSE
+ return canmove
+ else
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm
new file mode 100644
index 0000000000..c95dbded2c
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_abilities.dm
@@ -0,0 +1,214 @@
+/mob/living/simple_mob/vore/demon/verb/blood_crawl()
+ set name = "Bloodcrawl"
+ set desc = "Shift out of reality using blood as your gateway"
+ set category = "Abilities"
+
+ var/turf/T = get_turf(src)
+ if(!T.CanPass(src,T) || loc != T)
+ to_chat(src,"You can't use that here!")
+ return FALSE
+
+ if(shift_state && shift_state == AB_SHIFT_ACTIVE)
+ to_chat(src,"You can't do a shift while actively shifting!")
+ return FALSE
+
+ if(!(locate(/obj/effect/decal/cleanable/blood) in src.loc))
+ to_chat(src,"You need blood to shift between realities!")
+ return FALSE
+
+ forceMove(T)
+ var/original_canmove = canmove
+ SetStunned(0)
+ SetWeakened(0)
+ if(buckled)
+ buckled.unbuckle_mob()
+ if(pulledby)
+ pulledby.stop_pulling()
+ stop_pulling()
+ canmove = FALSE
+ is_shifting = TRUE
+
+ //Shifting in
+ if(shifted_out)
+ shifted_out = FALSE
+ name = real_name
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.escapable = initial(B.escapable)
+
+ overlays.Cut()
+ alpha = initial(alpha)
+ invisibility = initial(invisibility)
+ see_invisible = initial(see_invisible)
+ incorporeal_move = initial(incorporeal_move)
+ density = initial(density)
+ force_max_speed = initial(force_max_speed)
+
+ //Cosmetics mostly
+ flick("phasein",src)
+ custom_emote(1,"phases in!")
+ sleep(30) //The duration of the TP animation
+ is_shifting = FALSE
+ canmove = original_canmove
+
+ //Potential phase-in vore
+ if(can_be_drop_pred) //Toggleable in vore panel
+ var/list/potentials = living_mobs(0)
+ if(potentials.len)
+ var/mob/living/target = pick(potentials)
+ if(istype(target) && vore_selected)
+ target.forceMove(vore_selected)
+ to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!")
+
+ // Do this after the potential vore, so we get the belly
+ update_icon()
+
+ shift_state = AB_SHIFT_NONE
+
+ /*
+ //Affect nearby lights
+ var/destroy_lights = 0
+
+ for(var/obj/machinery/light/L in machines)
+ if(L.z != z || get_dist(src,L) > 10)
+ continue
+
+ if(prob(destroy_lights))
+ spawn(rand(5,25))
+ L.broken()
+ else
+ L.flicker(10)
+ */
+
+ //Shifting out
+ else
+ shifted_out = TRUE
+ shift_state = AB_SHIFT_PASSIVE
+ custom_emote(1,"phases out!")
+ real_name = name
+ name = "Something"
+ health = maxHealth //Fullheal
+
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.escapable = FALSE
+
+ overlays.Cut()
+ flick("phaseout",src)
+ sleep(30)
+ invisibility = INVISIBILITY_LEVEL_TWO
+ see_invisible = INVISIBILITY_LEVEL_TWO
+ update_icon()
+ alpha = 127
+
+ is_shifting = FALSE
+ canmove = original_canmove
+ incorporeal_move = TRUE
+ density = FALSE
+ force_max_speed = TRUE
+
+/mob/living/simple_mob/vore/demon/verb/phase_shift()
+ set name = "Phase Shift"
+ set desc = "Shift out of reality temporarily"
+ set category = "Abilities"
+
+
+ var/turf/T = get_turf(src)
+
+ if(shift_state && shift_state == AB_SHIFT_PASSIVE)
+ to_chat(src,"You can't do a shift while passively shifting!")
+ return FALSE
+
+ if(shifted_out)
+ to_chat(src,"You can't return to the physical world yet!")
+ return FALSE
+
+ if(world.time - last_shift < 600)
+ to_chat(src,"You can't temporarily shift so soon! You need to wait [round(((last_shift+600)-world.time)/10)] second\s!")
+ return FALSE
+
+ shift_state = AB_SHIFT_ACTIVE
+ forceMove(T)
+ var/original_canmove = canmove
+ SetStunned(0)
+ SetWeakened(0)
+ if(buckled)
+ buckled.unbuckle_mob()
+ if(pulledby)
+ pulledby.stop_pulling()
+ stop_pulling()
+ canmove = FALSE
+ is_shifting = TRUE
+
+ shifted_out = TRUE
+ custom_emote(1,"phases out!")
+ real_name = name
+ name = "Something"
+
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.escapable = FALSE
+
+ overlays.Cut()
+ flick("phaseout",src)
+ sleep(30)
+ invisibility = INVISIBILITY_LEVEL_TWO
+ see_invisible = INVISIBILITY_LEVEL_TWO
+ update_icon()
+ alpha = 127
+
+ is_shifting = FALSE
+ canmove = original_canmove
+ incorporeal_move = TRUE
+ density = FALSE
+ force_max_speed = TRUE
+
+ spawn(300)
+ shifted_out = FALSE
+ name = real_name
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.escapable = initial(B.escapable)
+
+ overlays.Cut()
+ alpha = initial(alpha)
+ invisibility = initial(invisibility)
+ see_invisible = initial(see_invisible)
+ incorporeal_move = initial(incorporeal_move)
+ density = initial(density)
+ force_max_speed = initial(force_max_speed)
+ original_canmove = canmove
+ canmove = FALSE
+ is_shifting = TRUE
+
+ //Cosmetics mostly
+ flick("phasein",src)
+ custom_emote(1,"phases in!")
+ sleep(30) //The duration of the TP animation
+ is_shifting = FALSE
+ canmove = original_canmove
+
+ var/turf/NT = get_turf(src)
+
+ if(!NT.CanPass(src,NT))
+ for(var/direction in list(1,2,4,8,5,6,9,10))
+ var/turf/L = get_step(NT, direction)
+ if(L)
+ if(L.CanPass(src,L))
+ forceMove(L)
+ break
+
+ //Potential phase-in vore
+ if(can_be_drop_pred) //Toggleable in vore panel
+ var/list/potentials = living_mobs(0)
+ if(potentials.len)
+ var/mob/living/target = pick(potentials)
+ if(istype(target) && vore_selected)
+ target.forceMove(vore_selected)
+ to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!")
+
+ // Do this after the potential vore, so we get the belly
+ update_icon()
+
+ shift_state = AB_SHIFT_NONE
+ last_shift = world.time
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm
new file mode 100644
index 0000000000..acd7cafd5e
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demon_subtypes.dm
@@ -0,0 +1,19 @@
+/mob/living/simple_mob/vore/demon/engorge
+ name = "Engorge"
+
+ icon_state = "engorge"
+ icon_living = "engorge"
+ icon_dead = "engorge_dead"
+ icon_rest = "engorge_rest"
+
+ vore_icons = null
+
+/mob/living/simple_mob/vore/demon/zellic
+ name = "Zellic"
+
+ icon_state = "zellic"
+ icon_living = "zellic"
+ icon_dead = "zellic_dead"
+ icon_rest = null
+
+ vore_icons = null
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm
new file mode 100644
index 0000000000..8aad13c3e3
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/~defines.dm
@@ -0,0 +1,3 @@
+#undef AB_SHIFT_NONE
+#undef AB_SHIFT_PASSIVE
+#undef AB_SHIFT_ACTIVE
\ No newline at end of file
diff --git a/icons/mob/demon_vr.dmi b/icons/mob/demon_vr.dmi
new file mode 100644
index 0000000000..5ad0c6e550
Binary files /dev/null and b/icons/mob/demon_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 01ae78f794..67327f3c2d 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -706,7 +706,6 @@
#include "code\game\machinery\alarm.dm"
#include "code\game\machinery\atmo_control.dm"
#include "code\game\machinery\autolathe.dm"
-#include "code\game\machinery\autolathe_vr.dm"
#include "code\game\machinery\Beacon.dm"
#include "code\game\machinery\biogenerator.dm"
#include "code\game\machinery\bioprinter.dm"
@@ -2536,6 +2535,11 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\wolf.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\wolfgirl.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\zz_vore_overrides.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\_defines.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_abilities.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\demon_subtypes.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\demon\~defines.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\morph\morph.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\_defines.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\shadekin\ability_objects.dm"