diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm
index 13d08dd5..69e4e65f 100644
--- a/code/modules/cargo/packs.dm
+++ b/code/modules/cargo/packs.dm
@@ -1003,6 +1003,15 @@
contains = list(/obj/item/circuitboard/computer/sat_control)
crate_name= "shield control board crate"
+/datum/supply_pack/engine/energy_harvester
+ name = "Energy Harvesting Module"
+ desc = "A Device which upon connection to a node, will harvest the energy and send it to engineerless stations in return for credits, derived from a syndicate powersink model."
+ cost = 7500
+ access = ACCESS_CE
+ contains = list(/obj/item/energy_harvester)
+ crate_name = "energy harvesting module crate"
+ crate_type = /obj/structure/closet/crate/secure/engineering
+
//////////////////////////////////////////////////////////////////////////////
//////////////////////// Engine Construction /////////////////////////////////
//////////////////////////////////////////////////////////////////////////////
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 6c051a0e..2a3170f0 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -106,5 +106,24 @@
obj_damage = 70
melee_damage_lower = 15
melee_damage_upper = 18
+ var/held_icon = "carp"
+
+/mob/living/simple_animal/hostile/carp/cayenne/ComponentInitialize()
+ . = ..()
+ AddElement(/datum/element/wuv, "bloops happily!", EMOTE_AUDIBLE, /datum/mood_event/pet_animal, "gnashes!", EMOTE_AUDIBLE)
+ AddElement(/datum/element/mob_holder, held_icon)
+
+/mob/living/simple_animal/hostile/carp/cayenne/lia
+ name = "Lia"
+ real_name = "Lia"
+ desc = "A failed experiment of Nanotrasen to create weaponised carp technology, now acquired by Kinaris. This less than intimidating carp now serves as the Head of Security's pet."
+ faction = list("neutral", "carp")
+ health = 200
+ icon_dead = "magicarp_dead"
+ icon_gib = "magicarp_gib"
+ icon_living = "magicarp"
+ icon_state = "magicarp"
+ maxHealth = 200
+ held_icon = "magicarp"
#undef REGENERATION_DELAY
diff --git a/tgstation.dme b/tgstation.dme
index a3faaffe..47b06f80 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3214,4 +3214,5 @@
#include "modular_citadel\code\modules\vore\eating\voreitems.dm"
#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm"
#include "modular_citadel\interface\skin.dmf"
+#include "yogstation\code\modules\power\energyharvester.dm"
// END_INCLUDE
diff --git a/yogstation/code/modules/power/energyharvester.dm b/yogstation/code/modules/power/energyharvester.dm
new file mode 100644
index 00000000..cffffa9b
--- /dev/null
+++ b/yogstation/code/modules/power/energyharvester.dm
@@ -0,0 +1,88 @@
+/obj/item/energy_harvester
+ desc = "A Device which upon connection to a node, will harvest the energy and send it to engineerless stations in return for credits, derived from a syndicate powersink model."
+ name = "Energy Harvesting Module"
+ icon_state = "powersink0"
+ icon = 'icons/obj/device.dmi'
+ item_state = "electronic"
+ lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
+ w_class= WEIGHT_CLASS_BULKY
+ flags_1 = CONDUCT_1
+ throwforce = 1
+ throw_speed = 1
+ throw_range = 1
+ materials = list(MAT_METAL=750)
+ var/drain_rate = 100000000
+ var/power_drained = 0
+ var/obj/structure/cable/attached
+ var/datum/looping_sound/generator/soundloop
+ var/active = 0
+ var/lastprocessed = 0
+
+
+/obj/item/energy_harvester/attackby(obj/item/I, mob/user, params)
+ if(I.tool_behaviour == TOOL_SCREWDRIVER)
+ if(!anchored)
+ var/turf/T = loc
+ if(isturf(T) && !T.intact)
+ attached = locate() in T
+ if(!attached)
+ to_chat(user, "This device must be placed over an exposed, powered cable node!")
+ else
+ I.play_tool_sound(src)
+ START_PROCESSING(SSobj, src)
+ anchored = 1
+ density = 1
+ user.visible_message( \
+ "[user] attaches \the [src] to the cable.", \
+ "You attach \the [src] to the cable.",
+ "You hear some wires being connected to something.")
+ else
+ to_chat(user, "This device must be placed over an exposed, powered cable node!")
+ else
+ I.play_tool_sound(src)
+ STOP_PROCESSING(SSobj, src)
+ anchored = 0
+ density = 0
+ user.visible_message( \
+ "[user] detaches \the [src] from the cable.", \
+ "You detach \the [src] from the cable.",
+ "You hear some wires being disconnected from something.")
+
+/obj/item/energy_harvester/process()
+ if(!attached || !anchored)
+ return PROCESS_KILL
+
+ var/datum/powernet/PN = attached.powernet
+ if(PN)
+ set_light(1,1,LIGHT_COLOR_ORANGE)
+ var/power_avaliable = PN.netexcess
+ if(power_avaliable <= 0)
+ soundloop.stop()
+ active = 0
+ return
+ soundloop.start()
+ active = 1
+ power_avaliable = min(power_avaliable, drain_rate)
+ attached.add_delayedload(power_avaliable)
+ lastprocessed = (power_avaliable * 0.00001)
+ SSshuttle.points += lastprocessed
+
+/obj/item/energy_harvester/Initialize()
+ . = ..()
+ new /obj/item/gps/internal/energy_harvester(src)
+ soundloop = new(list(src), FALSE)
+
+/obj/item/energy_harvester/Destroy()
+ QDEL_NULL(soundloop)
+ return ..()
+
+/obj/item/energy_harvester/examine(mob/user)
+ . = ..()
+ if(active)
+ . += "The [src]'s display states that it is processing approximately [lastprocessed*60] credits per minute."
+ else
+ . += "The [src]'s display is currently offline."
+
+/obj/item/gps/internal/energy_harvester
+ gpstag = "Energy Harvester"