diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 02f3f03b91..95adf12875 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -434,6 +434,15 @@
constructionStep = CONSTRUCTION_GUTTED
update_icon()
return
+ if(istype(C, /obj/item/device/electroadaptive_pseudocircuit))
+ var/obj/item/device/electroadaptive_pseudocircuit/P = C
+ if(!P.adapt_circuit(user, 30))
+ return
+ user.visible_message("[user] fabricates a circuit and places it into [src].", \
+ "You adapt a firelock circuit and slot it into the assembly.")
+ constructionStep = CONSTRUCTION_GUTTED
+ update_icon()
+ return
return ..()
/obj/structure/firelock_frame/heavy
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 518cd8ab09..ebbeb1bee2 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -220,6 +220,16 @@
update_icon()
return
+ else if(istype(W, /obj/item/device/electroadaptive_pseudocircuit))
+ var/obj/item/device/electroadaptive_pseudocircuit/P = W
+ if(!P.adapt_circuit(user, 15))
+ return
+ user.visible_message("[user] fabricates a circuit and places it into [src].", \
+ "You adapt a fire alarm circuit and slot it into the assembly.")
+ buildstage = 1
+ update_icon()
+ return
+
else if(istype(W, /obj/item/wrench))
user.visible_message("[user] removes the fire alarm assembly from the wall.", \
"You remove the fire alarm assembly from the wall.")
diff --git a/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
new file mode 100644
index 0000000000..204a1f81d9
--- /dev/null
+++ b/code/game/objects/items/devices/electroadaptive_pseudocircuit.dm
@@ -0,0 +1,65 @@
+//Used by engineering cyborgs in place of generic circuits.
+/obj/item/device/electroadaptive_pseudocircuit
+ name = "electroadaptive pseudocircuit"
+ desc = "An all-in-one circuit imprinter, designer, synthesizer, outfitter, creator, and chef. It can be used in place of any generic circuit board during construction."
+ icon = 'icons/obj/module.dmi'
+ icon_state = "boris"
+ w_class = WEIGHT_CLASS_TINY
+ materials = list(MAT_METAL = 50, MAT_GLASS = 300)
+ origin_tech = "engineering=4"
+ var/recharging = FALSE
+ var/circuits = 5 //How many circuits the pseudocircuit has left
+ var/static/recycleable_circuits = typecacheof(list(/obj/item/electronics/firelock, /obj/item/electronics/airalarm, /obj/item/electronics/firealarm, \
+ /obj/item/electronics/apc))//A typecache of circuits consumable for material
+
+/obj/item/device/electroadaptive_pseudocircuit/Initialize()
+ . = ..()
+ maptext = "[circuits]"
+
+/obj/item/device/electroadaptive_pseudocircuit/examine(mob/user)
+ ..()
+ if(iscyborg(user))
+ to_chat(user, "It has material for [circuits] circuit[circuits == 1 ? "" : "s"]. Use the pseudocircuit on existing circuits to gain material.")
+ to_chat(user, "Serves as a substitute for fire/air alarm, firelock, and APC electronics.")
+ to_chat(user, "It can also be used on an APC with no power cell to fabricate a low-capacity cell at a high power cost.")
+
+/obj/item/device/electroadaptive_pseudocircuit/proc/adapt_circuit(mob/living/silicon/robot/R, circuit_cost = 0)
+ if(QDELETED(R) || !istype(R))
+ return
+ if(!R.cell)
+ to_chat(R, "You need a power cell installed for that.")
+ return
+ if(!R.cell.use(circuit_cost))
+ to_chat(R, "You don't have the power for that (you need [DisplayPower(circuit_cost)].)")
+ return
+ if(recharging)
+ to_chat(R, "[src] needs some time to recharge first.")
+ return
+ if(!circuits)
+ to_chat(R, "You need more material. Use [src] on existing simple circuits to break them down.")
+ return
+ playsound(R, 'sound/items/rped.ogg', 50, TRUE)
+ recharging = TRUE
+ circuits--
+ maptext = "[circuits]"
+ icon_state = "[initial(icon_state)]_recharging"
+ var/recharge_time = min(600, circuit_cost * 5) //40W of cost for one fabrication = 20 seconds of recharge time; this is to prevent spamming
+ addtimer(CALLBACK(src, .proc/recharge), recharge_time)
+ return TRUE //The actual circuit magic itself is done on a per-object basis
+
+/obj/item/device/electroadaptive_pseudocircuit/afterattack(atom/target, mob/living/user, proximity)
+ if(!proximity)
+ return
+ if(!is_type_in_typecache(target, recycleable_circuits))
+ return
+ circuits++
+ maptext = "[circuits]"
+ user.visible_message("User breaks down [target] with [src].", \
+ "You recycle [target] into [src]. It now has material for [circuits] circuits.")
+ playsound(user, 'sound/items/deconstruct.ogg', 50, TRUE)
+ qdel(target)
+
+/obj/item/device/electroadaptive_pseudocircuit/proc/recharge()
+ playsound(src, 'sound/machines/chime.ogg', 25, TRUE)
+ recharging = FALSE
+ icon_state = initial(icon_state)
diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm
index 9807fed513..6de564da6d 100644
--- a/code/modules/atmospherics/machinery/airalarm.dm
+++ b/code/modules/atmospherics/machinery/airalarm.dm
@@ -708,6 +708,16 @@
qdel(W)
return
+ if(istype(W, /obj/item/device/electroadaptive_pseudocircuit))
+ var/obj/item/device/electroadaptive_pseudocircuit/P = W
+ if(!P.adapt_circuit(user, 25))
+ return
+ user.visible_message("[user] fabricates a circuit and places it into [src].", \
+ "You adapt an air alarm circuit and slot it into the assembly.")
+ buildstage = 1
+ update_icon()
+ return
+
if(istype(W, /obj/item/wrench))
to_chat(user, "You detach \the [src] from the wall.")
playsound(src.loc, W.usesound, 50, 1)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index af6f3daf92..0024772274 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -307,6 +307,7 @@
/obj/item/device/analyzer,
/obj/item/device/assembly/signaler/cyborg,
/obj/item/areaeditor/blueprints/cyborg,
+ /obj/item/device/electroadaptive_pseudocircuit,
/obj/item/stack/sheet/metal/cyborg,
/obj/item/stack/sheet/glass/cyborg,
/obj/item/stack/sheet/rglass/cyborg,
@@ -679,4 +680,4 @@
/datum/robot_energy_storage/beacon
max_energy = 30
recharge_rate = 1
- name = "Marker Beacon Storage"
+ name = "Marker Beacon Storage"
\ No newline at end of file
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 1545bfd452..4d9fc45b1a 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -546,6 +546,35 @@
to_chat(user, "You place the power control board inside the frame.")
qdel(W)
+ else if(istype(W, /obj/item/device/electroadaptive_pseudocircuit) && opened)
+ var/obj/item/device/electroadaptive_pseudocircuit/P = W
+ if(!has_electronics)
+ if(stat & BROKEN)
+ to_chat(user, "[src]'s frame is too damaged to support a circuit.")
+ return
+ if(!P.adapt_circuit(user, 50))
+ return
+ user.visible_message("[user] fabricates a circuit and places it into [src].", \
+ "You adapt a power control board and click it into place in [src]'s guts.")
+ has_electronics = TRUE
+ locked = TRUE
+ else if(!cell)
+ if(stat & MAINT)
+ to_chat(user, "There's no connector for a power cell.")
+ return
+ if(!P.adapt_circuit(user, 500))
+ return
+ var/obj/item/stock_parts/cell/crap/empty/C = new(src)
+ C.forceMove(src)
+ cell = C
+ chargecount = 0
+ user.visible_message("[user] fabricates a weak power cell and places it into [src].", \
+ "Your [P.name] whirrs with strain as you create a weak power cell and place it into [src]!")
+ update_icon()
+ else
+ to_chat(user, "[src] has both electronics and a cell.")
+ return
+
else if (istype(W, /obj/item/weldingtool) && opened && has_electronics==0 && !terminal)
var/obj/item/weldingtool/WT = W
if (WT.get_fuel() < 3)
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index d2d93afac0..c24f7c4c16 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 83ae47d2a5..0710f192df 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -831,6 +831,7 @@
#include "code\game\objects\items\devices\camera_bug.dm"
#include "code\game\objects\items\devices\chameleonproj.dm"
#include "code\game\objects\items\devices\doorCharge.dm"
+#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm"
#include "code\game\objects\items\devices\flashlight.dm"
#include "code\game\objects\items\devices\forcefieldprojector.dm"
#include "code\game\objects\items\devices\geiger_counter.dm"