diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm
new file mode 100644
index 00000000000..e146f3235d9
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/oregrub.dm
@@ -0,0 +1,184 @@
+/datum/category_item/catalogue/fauna/oregrub
+ name = "Oregrub"
+ desc = "Some form of mutated space larva, they seem to feed on minerals. This makes them the natural enemy of miners. \
+ To make matters worse, these creatures will flee when threatened. More than a few foolhardy miners have met their end chasing down oregrubs after some other hostile creature attacked them. \
+ Their guts tend to contain undigested minerals, so miners who are quick (and not afraid to get their hands dirty) can reap some rewards from these leathery lithovores."
+ value = CATALOGUER_REWARD_EASY
+
+/datum/category_item/catalogue/fauna/lavagrub
+ name = "Lavagrub"
+ desc = "Some form of mutated space larva, they seem to feed on minerals. This makes them the natural enemy of miners. \
+ To make matters worse, these creatures will flee when threatened. More than a few foolhardy miners have met their end chasing down oregrubs after some other hostile creature attacked them. \
+ This particular variant seems to be even tougher and faster than its common brown kin, and its hide is laced with silicates that make it more durable. \
+ On the plus side, it's sure to contain even more valuable minerals within its bowels, if you can catch up with it to crack it open..."
+ value = CATALOGUER_REWARD_MEDIUM
+
+/datum/ai_holder/simple_mob/oregrub
+ hostile = FALSE //docile, unless you hit them
+ retaliate = TRUE //they *may* bite you...
+ can_flee = TRUE //but they'd rather run away
+ dying_threshold = 1 //and ideally, we flee as soon as possible
+ flee_when_outmatched = TRUE //especially when outmatched
+ outmatched_threshold = 25 //and we're outmatched by... basically everything!
+
+/*
+ var/run_if_this_close = 3 //oregrubs will try to book it if you get too close
+
+/datum/ai_holder/simple_mob/oregrub/on_engagement(atom/A)
+ if(get_dist(holder, A) < run_if_this_close)
+ holder.IMove(get_step_away(holder, A, run_if_this_close))
+*/
+
+/datum/ai_holder/simple_mob/oregrub/lava
+ hostile = FALSE
+ retaliate = TRUE
+ can_flee = TRUE
+ dying_threshold = 1
+ flee_when_outmatched = TRUE //lavagrubs will flee more readily than oregrubs
+ outmatched_threshold = 15
+// run_if_this_close = 4
+
+/mob/living/simple_mob/vore/oregrub
+ name = "juvenile oregrub"
+ desc = "A young, leathery oregrub."
+ catalogue_data = list(/datum/category_item/catalogue/fauna/oregrub)
+ icon = 'icons/mob/vore.dmi' //all of these are placeholders
+ icon_state = "oregrub"
+ icon_living = "oregrub"
+ icon_dead = "oregrub-dead"
+
+ faction = "grubs"
+ maxHealth = 50 //oregrubs are quite hardy
+ health = 50
+
+ melee_damage_lower = 1
+ melee_damage_upper = 3 //low damage, they prefer to flee
+
+ movement_cooldown = 8
+
+ meat_type = /obj/item/weapon/ore/coal
+
+ response_help = "pokes"
+ response_disarm = "pushes"
+ response_harm = "roughly pushes"
+
+ ai_holder_type = /datum/ai_holder/simple_mob/oregrub
+ say_list_type = /datum/say_list/oregrub
+
+ var/poison_per_bite = 2.5
+ var/poison_type = "thermite_v" //burn baby burn
+ var/poison_chance = 50
+
+ var/min_ore = 4
+ var/max_ore = 7
+
+ vore_bump_chance = 50
+ vore_bump_emote = "applies minimal effort to try and slurp up"
+ vore_active = 1
+ vore_capacity = 1
+ vore_pounce_chance = 0 //grubs only eat incapacitated targets
+ vore_default_mode = DM_DIGEST
+
+ 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 = 1000
+ poison_resist = 1.0
+
+ //these things are resilient, on account of being infused with all the minerals they eat
+ armor = list(
+ "melee" = 25,
+ "bullet" = 15,
+ "laser" = 15,
+ "energy" = 0,
+ "bomb" = 25,
+ "bio" = 100,
+ "rad" = 100
+ )
+
+/mob/living/simple_mob/vore/oregrub/lava
+ name = "mature lavagrub"
+ desc = "A mature, rocky lavagrub"
+ catalogue_data = list(/datum/category_item/catalogue/fauna/lavagrub)
+ icon_state = "lavagrub"
+ icon_living = "lavagrub"
+ icon_dead = "lavagrub-dead"
+
+ movement_cooldown = 5
+ maxHealth = 75 //lavagrubs are really hardy
+ health = 75
+ ai_holder_type = /datum/ai_holder/simple_mob/oregrub/lava
+ //lavagrubs have even more armor than oregrubs
+ armor = list(
+ "melee" = 50,
+ "bullet" = 25,
+ "laser" = 25,
+ "energy" = 0,
+ "bomb" = 50,
+ "bio" = 100,
+ "rad" = 100
+ )
+
+ var/lava_min_ore = 8
+ var/lava_max_ore = 12
+
+ poison_per_bite = 5
+ poison_chance = 66
+
+/datum/say_list/oregrub
+ emote_see = list("burbles", "chitters", "snuffles around for fresh ore")
+
+/mob/living/simple_mob/vore/oregrub/apply_melee_effects(var/atom/A)
+ if(isliving(A))
+ var/mob/living/L = A
+ var/target_zone = pick(BP_TORSO,BP_TORSO,BP_TORSO,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_HEAD)
+ if(L.can_inject(src, null, target_zone))
+ inject_poison(L, target_zone)
+
+/mob/living/simple_mob/vore/oregrub/death()
+ visible_message("\The [src] shudders and collapses, expelling the ores it had devoured!")
+ var/i = rand(min_ore,max_ore)
+ while(i>1)
+ var/ore = pick(/obj/item/weapon/ore/glass,/obj/item/weapon/ore/coal,/obj/item/weapon/ore/iron,/obj/item/weapon/ore/lead,/obj/item/weapon/ore/marble,/obj/item/weapon/ore/phoron,/obj/item/weapon/ore/silver,/obj/item/weapon/ore/gold)
+ new ore(src.loc)
+ i--
+ ..()
+
+/mob/living/simple_mob/vore/oregrub/lava/death()
+ set_light(0)
+ var/p = rand(lava_min_ore,lava_max_ore)
+ while(p>1)
+ var/ore = pick(/obj/item/weapon/ore/osmium,/obj/item/weapon/ore/uranium,/obj/item/weapon/ore/hydrogen,/obj/item/weapon/ore/diamond,/obj/item/weapon/ore/verdantium)
+ new ore(src.loc)
+ p--
+ ..()
+
+// Does actual poison injection, after all checks passed.
+/mob/living/simple_mob/vore/oregrub/proc/inject_poison(mob/living/L, target_zone)
+ if(prob(poison_chance))
+ to_chat(L, "You feel fire running through your veins!")
+ L.reagents.add_reagent(poison_type, poison_per_bite)
+
+/mob/living/simple_mob/vore/oregrub/init_vore()
+ ..()
+ var/obj/belly/B = vore_selected
+ B.name = "stomach"
+ B.desc = "PLACEHOLDER!"
+
+ B.emote_lists[DM_HOLD] = list(
+ "PLACEHOLDER!")
+
+ B.emote_lists[DM_DIGEST] = list(
+ "PLACEHOLDER!")
+
+/mob/living/simple_mob/vore/oregrub/lava/handle_light()
+ . = ..()
+ if(. == 0 && !is_dead())
+ set_light(2.5, 1, COLOR_ORANGE)
+ return 1
\ No newline at end of file
diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi
index 396c6ef362b..9fad9d332de 100644
Binary files a/icons/mob/vore.dmi and b/icons/mob/vore.dmi differ
diff --git a/maps/expedition_vr/aerostat/_aerostat.dm b/maps/expedition_vr/aerostat/_aerostat.dm
index c4c321de1b1..031cc07f495 100644
--- a/maps/expedition_vr/aerostat/_aerostat.dm
+++ b/maps/expedition_vr/aerostat/_aerostat.dm
@@ -58,9 +58,11 @@
prob_fall = 30
//guard = 20
mobs_to_pick_from = list(
- /mob/living/simple_mob/animal/space/jelly = 1,
- /mob/living/simple_mob/mechanical/viscerator = 1,
- /mob/living/simple_mob/vore/aggressive/corrupthound = 1
+ /mob/living/simple_mob/animal/space/jelly = 2,
+ /mob/living/simple_mob/mechanical/viscerator = 2,
+ /mob/living/simple_mob/vore/aggressive/corrupthound = 1,
+ /mob/living/simple_mob/vore/oregrub = 2,
+ /mob/living/simple_mob/vore/oregrub/lava = 1
)
/obj/structure/old_roboprinter
diff --git a/maps/expedition_vr/beach/_beach.dm b/maps/expedition_vr/beach/_beach.dm
index 95903a35a9d..57a2b176587 100644
--- a/maps/expedition_vr/beach/_beach.dm
+++ b/maps/expedition_vr/beach/_beach.dm
@@ -104,7 +104,9 @@
/mob/living/simple_mob/vore/aggressive/deathclaw = 1, //these deathclaws are, with these values,
/mob/living/simple_mob/animal/giant_spider = 2,
/mob/living/simple_mob/vore/aggressive/giant_snake = 1,
- /mob/living/simple_mob/animal/giant_spider/webslinger = 1
+ /mob/living/simple_mob/animal/giant_spider/webslinger = 1,
+ /mob/living/simple_mob/vore/oregrub = 2,
+ /mob/living/simple_mob/vore/oregrub/lava = 1
)
// These are step-teleporters, for map edge transitions
diff --git a/maps/tether/submaps/underdark_pois/underdark_things.dm b/maps/tether/submaps/underdark_pois/underdark_things.dm
index e16151fbf13..35da3c549c3 100644
--- a/maps/tether/submaps/underdark_pois/underdark_things.dm
+++ b/maps/tether/submaps/underdark_pois/underdark_things.dm
@@ -54,6 +54,7 @@
/mob/living/simple_mob/animal/giant_spider/hunter = 1,
/mob/living/simple_mob/animal/giant_spider/phorogenic/weak = 1,
/mob/living/simple_mob/animal/giant_spider/tunneler = 1,
+ /mob/living/simple_mob/vore/oregrub = 1,
)
/obj/tether_away_spawner/underdark_hard
@@ -65,7 +66,8 @@
//guard = 20
mobs_to_pick_from = list(
/mob/living/simple_mob/vore/aggressive/corrupthound = 1,
- /mob/living/simple_mob/vore/aggressive/rat/phoron = 2
+ /mob/living/simple_mob/vore/aggressive/rat/phoron = 2,
+ /mob/living/simple_mob/vore/oregrub/lava = 1,
)
/obj/tether_away_spawner/underdark_boss
diff --git a/vorestation.dme b/vorestation.dme
index 39a9dcf488b..af48314ea27 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2865,6 +2865,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\horse.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\panther.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\rabbit.dm"