diff --git a/code/game/objects/effects/spider_vr.dm b/code/game/objects/effects/spider_vr.dm
new file mode 100644
index 00000000000..d40f08aa9fb
--- /dev/null
+++ b/code/game/objects/effects/spider_vr.dm
@@ -0,0 +1,13 @@
+/obj/effect/spider/spiderling/grub
+ name = "grub larva"
+ desc = "It never stays still for long."
+ //M.icon = 'grub_vr.dmi'
+ icon_state = "spiderling"
+
+obj/effect/spider/spiderling/grub/process()
+ if(amount_grown >= 100)
+ var/spawn_type = /mob/living/simple_animal/retaliate/solargrub
+ new spawn_type(src.loc, src)
+ qdel(src)
+ else
+ ..()
\ No newline at end of file
diff --git a/code/game/objects/structures/crates_lockers/largecrate_vr.dm b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
index 964022061ab..8182106ecaf 100644
--- a/code/game/objects/structures/crates_lockers/largecrate_vr.dm
+++ b/code/game/objects/structures/crates_lockers/largecrate_vr.dm
@@ -53,7 +53,8 @@
/mob/living/simple_animal/hostile/bear;0.5,
/mob/living/simple_animal/hostile/bear/brown;0.5,
/mob/living/simple_animal/hostile/carp,
- /mob/living/simple_animal/hostile/mimic)
+ /mob/living/simple_animal/hostile/mimic,
+ /mob/living/simple_animal/retaliate/solargrub)
..()
@@ -94,4 +95,4 @@
icon_state = "otiecrate"
taped = 0
..()
-*/
\ No newline at end of file
+*/
diff --git a/code/modules/events/event_container_vr.dm b/code/modules/events/event_container_vr.dm
index 5a54e974cfe..62c297b5e8f 100644
--- a/code/modules/events/event_container_vr.dm
+++ b/code/modules/events/event_container_vr.dm
@@ -74,6 +74,8 @@
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Solar Storm", /datum/event/solar_storm, 30, list(ASSIGNMENT_ENGINEER = 40, ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grub Infestation", /datum/event/grub_infestation, 75, list(ASSIGNMENT_SECURITY = 50, ASSIGNMENT_ENGINEER = 50), 1),
+ //Evil grubs that drain station power slightly
)
add_disabled_events(list(
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 30), 1),
diff --git a/code/modules/events/grubinfestation_vr.dm b/code/modules/events/grubinfestation_vr.dm
new file mode 100644
index 00000000000..5f1161c441e
--- /dev/null
+++ b/code/modules/events/grubinfestation_vr.dm
@@ -0,0 +1,26 @@
+/datum/event/grub_infestation
+ announceWhen = 90
+ var/spawncount = 1
+
+
+/datum/event/grub_infestation/setup()
+ announceWhen = rand(announceWhen, announceWhen + 60)
+ spawncount = rand(4 * severity, 6 * severity) //grub larva only have a 50% chance to grow big and strong
+ sent_spiders_to_station = 0
+
+/datum/event/grub_infestation/announce()
+ command_announcement.Announce("Unidentified lifesigns detected coming aboard [station_name()]. Secure any exterior access, including ducting and ventilation.", "Lifesign Alert", new_sound = 'sound/AI/aliens.ogg')
+
+
+/datum/event/grub_infestation/start()
+ var/list/vents = list()
+ for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in world)
+ if(!temp_vent.welded && temp_vent.network && temp_vent.loc.z in using_map.station_levels)
+ if(temp_vent.network.normal_members.len > 50)
+ vents += temp_vent
+
+ while((spawncount >= 1) && vents.len)
+ var/obj/vent = pick(vents)
+ new /obj/effect/spider/spiderling/grub(vent.loc)
+ vents -= vent
+ spawncount--
diff --git a/code/modules/mob/living/simple_animal/vore/solargrub.dm b/code/modules/mob/living/simple_animal/vore/solargrub.dm
new file mode 100644
index 00000000000..b6fb9d36740
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/vore/solargrub.dm
@@ -0,0 +1,107 @@
+/*
+A work in progress, lore will go here later.
+List of things solar grubs should be able to do:
+
+1. cool foods? (grubrings)
+2. have three stages of growth depending on time. (Or energy drained altho that seems like a hard one to code)
+3. be capable of eating people that get knocked out. (also be able to shock attackers that don’t wear insulated gloves.)
+5. ((potentially use digested people to reproduce))
+6. add glow?
+*/
+
+#define SINK_POWER 1
+
+/mob/living/simple_animal/retaliate/solargrub
+ name = "juvenile solargrub"
+ desc = "A young sparkling solargrub"
+ icon = 'icons/mob/vore.dmi' //all of these are placeholders
+ icon_state = "solargrub"
+ icon_living = "solargrub"
+ icon_dead = "solargrub-dead"
+
+ faction = "grubs"
+ maxHealth = 250 //grubs can take a lot of harm
+ health = 250
+ move_to_delay = 5
+
+ melee_damage_lower = 1
+ melee_damage_upper = 5
+
+ speak_chance = 1
+ emote_see = list("squelches", "squishes")
+
+ speed = 2
+
+ meat_type = /obj/item/weapon/reagent_containers/food/snacks/grubmeat
+
+ response_help = "pokes"
+ response_disarm = "pushes"
+ response_harm = "roughly pushes"
+
+ // solar grubs are not affected by atmos
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+
+ resistances = list(
+ HALLOSS = 0,
+ BRUTE = 1,
+ BURN = 0.1,
+ TOX = 0,
+ OXY = 0,
+ CLONE = 0
+ )
+
+ var/poison_per_bite = 5 //grubs cause a shock when they bite someone
+ var/poison_type = "shockchem"
+ var/poison_chance = 100
+ var/datum/powernet/PN // Our powernet
+ var/obj/structure/cable/attached // the attached cable
+
+/mob/living/simple_animal/retaliate/solargrub/Life()
+ . = ..()
+ if(!. || ai_inactive) return
+
+ if(stance == STANCE_IDLE)
+ //first, check for potential cables nearby to powersink
+ var/turf/S = loc
+ attached = locate() in S
+ if(attached)
+ if(prob(2))
+ src.visible_message("\The [src] begins to sink power from the net.")
+ anchored = 1
+ PN = attached.powernet
+ PN.draw_power(150000)
+ var/apc_drain_rate = 4000 //5000 seems a bit high, knocking it down to 4000
+ for(var/obj/machinery/power/terminal/T in PN.nodes)
+ if(istype(T.master, /obj/machinery/power/apc))
+ var/obj/machinery/power/apc/A = T.master
+ if(A.operating && A.cell)
+ var/cur_charge = A.cell.charge / CELLRATE
+ var/drain_val = min(apc_drain_rate, cur_charge)
+ A.cell.use(drain_val * CELLRATE)
+ else if(!attached && anchored)
+ anchored = 0
+ PN = null
+
+/mob/living/simple_animal/retaliate/solargrub //active noms
+ vore_active = 1
+ vore_capacity = 1
+ vore_pounce_chance = 0 //grubs only eat incapacitated targets
+
+/mob/living/simple_animal/retaliate/solargrub/PunchTarget()
+ . = ..()
+ if(isliving(.))
+ var/mob/living/L = .
+ if(L.reagents)
+ L.reagents.add_reagent(poison_type, poison_per_bite)
+ if(prob(poison_chance))
+ L << "You feel a shock rushing through your veins."
+ L.reagents.add_reagent(poison_type, poison_per_bite)
+
+
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm
index bebbb913250..d680656be8b 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine_vr.dm
@@ -29,3 +29,19 @@
/datum/reagent/numbing_enzyme/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
M.add_chemical_effect(CE_PAINKILLER, 200)
+
+/datum/reagent/vermicetol
+ name = "Vermicetol"
+ id = "vermicetol"
+ description = "A potent chemical that treats burn damage at an exceptional rate and lasts a while."
+ taste_description = "sparkles"
+ reagent_state = SOLID
+ color = "#964e06"
+ overdose = 10
+ scannable = 1
+ metabolism = 0.02
+ mrate_static = TRUE
+
+/datum/reagent/vermicetol/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien != IS_DIONA)
+ M.heal_organ_damage(0, 21 * removed) //more potent than keloderm
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm
index ff6f713b670..9788c70cc6a 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Vore_vr.dm
@@ -124,3 +124,17 @@
P.absorbed = 0
M.visible_message("Something spills into [M]'s [lowertext(B.name)]!")
return
+
+//Special toxins for solargrubs
+
+/datum/reagent/grubshock
+ name = "200 V" //in other words a painful shock
+ id = "shockchem"
+ description = "A liquid that quickly dissapates to deliver a painful shock."
+ reagent_state = LIQUID
+ color = "#E4EC2F"
+ metabolism = 2.50
+ var/power = 11
+
+/datum/reagent/grubshock/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.take_organ_damage(0, removed * power * 0.2)
diff --git a/code/modules/reagents/Chemistry-Recipes_vr.dm b/code/modules/reagents/Chemistry-Recipes_vr.dm
index de7f707ac56..28dbbacd245 100644
--- a/code/modules/reagents/Chemistry-Recipes_vr.dm
+++ b/code/modules/reagents/Chemistry-Recipes_vr.dm
@@ -73,6 +73,14 @@
required_reagents = list("milk" = 2, "hydrogen" = 1, "potassium" = 1)
result_amount = 3
+/datum/chemical_reaction/vermicetol
+ name = "Vermicetol"
+ id = "vermicetol"
+ result = "vermicetol"
+ required_reagents = list("kelotane" = 1, "dermaline" = 1, "shockchem" = 1, "phoron" = 0.1)
+ catalysts = list("phoron" = 5)
+ result_amount = 3
+
///////////////////////////////
//SLIME CORES BELOW HERE///////
///////////////////////////////
diff --git a/code/modules/reagents/reagent_containers/food/snacks_vr.dm b/code/modules/reagents/reagent_containers/food/snacks_vr.dm
index 721b9742c91..9c73156385c 100644
--- a/code/modules/reagents/reagent_containers/food/snacks_vr.dm
+++ b/code/modules/reagents/reagent_containers/food/snacks_vr.dm
@@ -190,6 +190,19 @@
reagents.add_reagent("protein", 4)
bitesize = 2
+/obj/item/weapon/reagent_containers/food/snacks/grubmeat
+ name = "grubmeat"
+ desc = "A slab of grub meat, it gives a gentle shock if you touch it"
+ icon = 'icons/obj/food_vr.dmi'
+ icon_state = "grubmeat"
+ center_of_mass = list("x"=16, "y"=10)
+
+/obj/item/weapon/reagent_containers/food/snacks/grubmeat/New()
+ ..()
+ reagents.add_reagent("protein", 6)
+ reagents.add_reagent("shockchem", 6)
+ bitesize = 6
+
/obj/item/weapon/reagent_containers/food/snacks/monkeycube/sobakacube
name = "sobaka cube"
monkey_type = "Sobaka"
diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi
index 34b51493abe..e34a68f2e8c 100644
Binary files a/icons/mob/vore.dmi and b/icons/mob/vore.dmi differ
diff --git a/icons/obj/food_vr.dmi b/icons/obj/food_vr.dmi
index f79a37f3ae1..b541e7ebd2e 100644
Binary files a/icons/obj/food_vr.dmi and b/icons/obj/food_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index f5838a99280..6bbd0117191 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -802,6 +802,7 @@
#include "code\game\objects\effects\overlays.dm"
#include "code\game\objects\effects\portals.dm"
#include "code\game\objects\effects\spiders.dm"
+#include "code\game\objects\effects\spider_vr.dm"
#include "code\game\objects\effects\step_triggers.dm"
#include "code\game\objects\effects\zone_divider.dm"
#include "code\game\objects\effects\chem\chemsmoke.dm"
@@ -1488,6 +1489,7 @@
#include "code\modules\events\event_manager.dm"
#include "code\modules\events\gravity.dm"
#include "code\modules\events\grid_check.dm"
+#include "code\modules\events\grubinfestation_vr.dm"
#include "code\modules\events\ian_storm_vr.dm"
#include "code\modules\events\infestation.dm"
#include "code\modules\events\ion_storm.dm"
@@ -1979,6 +1981,7 @@
#include "code\modules\mob\living\simple_animal\vore\horse.dm"
#include "code\modules\mob\living\simple_animal\vore\panther.dm"
#include "code\modules\mob\living\simple_animal\vore\snake.dm"
+#include "code\modules\mob\living\simple_animal\vore\solargrub.dm"
#include "code\modules\mob\living\simple_animal\vore\wah.dm"
#include "code\modules\mob\living\simple_animal\vore\wolf.dm"
#include "code\modules\mob\living\simple_animal\vore\zz_vore_overrides.dm"