diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
index 32c32094087..fea17a38cc5 100644
--- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
+++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
@@ -392,6 +392,10 @@
"bV" = (
/obj/structure/rack,
/obj/item/circuitboard/machine/circuit_imprinter,
+/obj/item/aiModule/core/full/drone{
+ pixel_x = -4;
+ pixel_y = -2
+ },
/turf/open/floor/plasteel,
/area/ruin/space/derelict/bridge/ai_upload)
"bW" = (
@@ -1259,7 +1263,7 @@
/turf/open/floor/plasteel/airless,
/area/ruin/space/derelict/bridge/access)
"fw" = (
-/obj/effect/mob_spawn/drone/dusty,
+/obj/effect/mob_spawn/drone/derelict,
/turf/open/floor/plasteel/airless,
/area/ruin/space/derelict/bridge/access)
"fx" = (
@@ -1980,7 +1984,7 @@
/turf/open/floor/plating/airless,
/area/ruin/space/derelict/singularity_engine)
"in" = (
-/obj/effect/mob_spawn/drone/dusty,
+/obj/effect/mob_spawn/drone/derelict,
/turf/open/floor/plating/airless,
/area/ruin/space/derelict/singularity_engine)
"io" = (
@@ -3424,7 +3428,7 @@
dir = 1
},
/obj/structure/cable,
-/obj/effect/mob_spawn/drone/dusty,
+/obj/effect/mob_spawn/drone/derelict,
/turf/open/floor/plasteel/airless,
/area/ruin/space/derelict/se_solar)
"nV" = (
@@ -3673,6 +3677,10 @@
/obj/structure/lattice,
/turf/template_noop,
/area/ruin/unpowered/no_grav)
+"GP" = (
+/obj/structure/cable,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/derelict/bridge/ai_upload)
"Ih" = (
/turf/open/floor/plasteel/airless{
icon_state = "damaged3"
@@ -3725,6 +3733,10 @@
"KN" = (
/turf/closed/wall,
/area/ruin/space/derelict/hallway/primary/port)
+"KP" = (
+/obj/item/dronespeak_manual,
+/turf/open/floor/plasteel/airless,
+/area/ruin/space/derelict/bridge/ai_upload)
"KS" = (
/obj/item/storage/box/lights/mixed,
/turf/open/floor/plasteel/airless,
@@ -3837,6 +3849,13 @@
"Uz" = (
/turf/open/floor/plating/airless,
/area/space/nearstation)
+"UG" = (
+/obj/structure/cable,
+/obj/machinery/power/terminal{
+ dir = 1
+ },
+/turf/closed/wall/r_wall,
+/area/ruin/space/derelict/bridge/ai_upload)
"Vt" = (
/obj/structure/cable,
/turf/closed/indestructible/riveted{
@@ -3884,17 +3903,14 @@
},
/turf/open/floor/plasteel/airless,
/area/ruin/space/derelict/bridge/ai_upload)
-"ZA" = (
-/obj/machinery/power/terminal{
- dir = 1
- },
-/obj/structure/cable,
-/turf/closed/wall/r_wall,
-/area/ruin/space/derelict/bridge/ai_upload)
"ZB" = (
/obj/structure/lattice,
/turf/template_noop,
/area/space/nearstation)
+"ZM" = (
+/obj/machinery/droneDispenser/derelict,
+/turf/open/floor/plasteel,
+/area/ruin/space/derelict/bridge/access)
(1,1,1) = {"
aa
@@ -10359,10 +10375,10 @@ bj
ax
bG
Ob
-bO
-bz
-bO
-ax
+xr
+GP
+YQ
+ce
aa
aa
aa
@@ -10475,7 +10491,7 @@ bE
bO
bO
bO
-ax
+ce
aa
aa
aa
@@ -10588,7 +10604,7 @@ Lr
xr
YQ
LX
-ZA
+UG
ce
ce
ce
@@ -10706,7 +10722,7 @@ bj
bj
bj
cs
-cx
+ZM
cF
cx
cT
@@ -11151,7 +11167,7 @@ bW
Zu
bz
rC
-bz
+KP
vo
bW
bj
diff --git a/code/game/machinery/droneDispenser.dm b/code/game/machinery/droneDispenser.dm
index 82381d85f8e..e50cb91c7f3 100644
--- a/code/game/machinery/droneDispenser.dm
+++ b/code/game/machinery/droneDispenser.dm
@@ -85,6 +85,17 @@
power_used = 2000
starting_amount = 10000
+// If the derelict gets lonely, make more friends.
+/obj/machinery/droneDispenser/derelict
+ name = "derelict drone shell dispenser"
+ desc = "A rusty machine that, when supplied with metal and glass, will periodically create a derelict drone shell. Does not need to be manually operated."
+ dispense_type = /obj/effect/mob_spawn/drone/derelict
+ end_create_message = "dispenses a derelict drone shell."
+ metal_cost = 10000
+ glass_cost = 5000
+ starting_amount = 0
+ cooldownTime = 600
+
// An example of a custom drone dispenser.
// This one requires no materials and creates basic hivebots
/obj/machinery/droneDispenser/hivebot
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
index 780fadc2107..9e01e8e8b7a 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm
@@ -96,7 +96,7 @@
icon_living = icon_state
icon_dead = "[visualAppearence]_dead"
-/obj/effect/mob_spawn/drone/dusty
+/obj/effect/mob_spawn/drone/derelict
name = "derelict drone shell"
desc = "A long-forgotten drone shell. It seems kind of... Space Russian."
icon = 'icons/mob/drone.dmi'
diff --git a/code/modules/ruins/spaceruin_code/TheDerelict.dm b/code/modules/ruins/spaceruin_code/TheDerelict.dm
index 6a4f0017cbe..5c6b0622523 100644
--- a/code/modules/ruins/spaceruin_code/TheDerelict.dm
+++ b/code/modules/ruins/spaceruin_code/TheDerelict.dm
@@ -164,3 +164,42 @@
if(C.tool_behaviour == TOOL_SCREWDRIVER)
return
..()
+
+
+// So drones can teach borgs and AI dronespeak. For best effect, combine with mother drone lawset.
+/obj/item/dronespeak_manual
+ name = "dronespeak manual"
+ desc = "The book's cover reads: \"Understanding Dronespeak - An exercise in futility.\""
+ icon = 'icons/obj/library.dmi'
+ icon_state = "book2"
+
+/obj/item/dronespeak_manual/attack_self(mob/living/user)
+ ..()
+ if(isdrone(user) || issilicon(user))
+ if(user.has_language(/datum/language/drone))
+ to_chat(user, "You start skimming through [src], but you already know dronespeak.")
+ else
+ to_chat(user, "You start skimming through [src], and suddenly the drone chittering makes sense.")
+ user.grant_language(/datum/language/drone)
+ return
+
+ if(user.has_language(/datum/language/drone))
+ to_chat(user, "You start skimming through [src], but you already know dronespeak.")
+ else
+ to_chat(user, "You start skimming through [src], but you can't make any sense of the contents.")
+
+/obj/item/dronespeak_manual/attack(mob/living/M, mob/living/user)
+ if(!istype(M) || !istype(user))
+ return
+ if(M == user)
+ attack_self(user)
+ return
+
+ playsound(loc, "punch", 25, TRUE, -1)
+ if(isdrone(M) || issilicon(M))
+ if(M.has_language(/datum/language/drone))
+ M.visible_message("[user] beats [M] over the head with [src]!", "[user] beats you over the head with [src]!", "You hear smacking.")
+ else
+ M.visible_message("[user] teaches [M] by beating [M.p_them()] over the head with [src]!", "As [user] hits you with [src], chitters resonate in your mind.", "You hear smacking.")
+ M.grant_language(/datum/language/drone)
+ return