diff --git a/code/modules/mob/living/bot/SLed209bot.dm b/code/modules/mob/living/bot/SLed209bot.dm
new file mode 100644
index 00000000000..989c2e708d1
--- /dev/null
+++ b/code/modules/mob/living/bot/SLed209bot.dm
@@ -0,0 +1,173 @@
+/mob/living/bot/secbot/ed209/slime
+ name = "SL-ED-209 Security Robot"
+ desc = "A security robot. He looks less than thrilled."
+ icon = 'icons/obj/aibots.dmi'
+ icon_state = "sled2090"
+ density = 1
+ health = 200
+ maxHealth = 200
+
+ is_ranged = 1
+ preparing_arrest_sounds = new()
+
+ a_intent = I_HURT
+ mob_bump_flag = HEAVY
+ mob_swap_flags = ~HEAVY
+ mob_push_flags = HEAVY
+
+ used_weapon = /obj/item/weapon/gun/energy/taser/xeno
+
+ stun_strength = 10
+ xeno_harm_strength = 9
+ req_one_access = list(access_research, access_robotics)
+ botcard_access = list(access_research, access_robotics, access_xenobiology, access_xenoarch, access_tox, access_tox_storage, access_maint_tunnels)
+ used_weapon = /obj/item/weapon/melee/baton/slime
+ var/xeno_stun_strength = 6
+
+/mob/living/bot/secbot/ed209/slime/update_icons()
+ if(on && busy)
+ icon_state = "sled209-c"
+ else
+ icon_state = "sled209[on]"
+
+/mob/living/bot/secbot/ed209/slime/RangedAttack(var/atom/A)
+ if(last_shot + shot_delay > world.time)
+ to_chat(src, "You are not ready to fire yet!")
+ return
+
+ last_shot = world.time
+
+ var/projectile = /obj/item/projectile/beam/stun/xeno
+ if(emagged)
+ projectile = /obj/item/projectile/beam/shock
+
+ playsound(loc, emagged ? 'sound/weapons/laser3.ogg' : 'sound/weapons/Taser.ogg', 50, 1)
+ var/obj/item/projectile/P = new projectile(loc)
+
+ P.firer = src
+ P.old_style_target(A)
+ P.fire()
+
+/mob/living/bot/secbot/ed209/slime/UnarmedAttack(var/mob/living/L, var/proximity)
+ ..()
+
+ if(istype(L, /mob/living/simple_mob/slime/xenobio))
+ var/mob/living/simple_mob/slime/xenobio/S = L
+ S.slimebatoned(src, xeno_stun_strength)
+
+// Assembly
+
+/obj/item/weapon/secbot_assembly/ed209_assembly/slime
+ name = "SL-ED-209 assembly"
+ desc = "Some sort of bizarre assembly."
+ icon = 'icons/obj/aibots.dmi'
+ icon_state = "ed209_frame"
+ item_state = "buildpipe"
+ created_name = "SL-ED-209 Security Robot"
+
+/obj/item/weapon/secbot_assembly/ed209_assembly/slime/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) // Here in the event it's added into a PoI or some such. Standard construction relies on the standard ED up until taser.
+ if(istype(W, /obj/item/weapon/pen))
+ var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN)
+ if(!t)
+ return
+ if(!in_range(src, usr) && src.loc != usr)
+ return
+ created_name = t
+ return
+
+ switch(build_step)
+ if(0, 1)
+ if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg) || (istype(W, /obj/item/organ/external/leg) && ((W.name == "robotic right leg") || (W.name == "robotic left leg"))))
+ user.drop_item()
+ qdel(W)
+ build_step++
+ to_chat(user, "You add the robot leg to [src].")
+ name = "legs/frame assembly"
+ if(build_step == 1)
+ icon_state = "ed209_leg"
+ else
+ icon_state = "ed209_legs"
+
+ if(2)
+ if(istype(W, /obj/item/clothing/suit/storage/vest))
+ user.drop_item()
+ qdel(W)
+ build_step++
+ to_chat(user, "You add the armor to [src].")
+ name = "vest/legs/frame assembly"
+ item_state = "ed209_shell"
+ icon_state = "ed209_shell"
+
+ if(3)
+ if(istype(W, /obj/item/weapon/weldingtool))
+ var/obj/item/weapon/weldingtool/WT = W
+ if(WT.remove_fuel(0, user))
+ build_step++
+ name = "shielded frame assembly"
+ to_chat(user, "You welded the vest to [src].")
+ if(4)
+ if(istype(W, /obj/item/clothing/head/helmet))
+ user.drop_item()
+ qdel(W)
+ build_step++
+ to_chat(user, "You add the helmet to [src].")
+ name = "covered and shielded frame assembly"
+ item_state = "ed209_hat"
+ icon_state = "ed209_hat"
+
+ if(5)
+ if(isprox(W))
+ user.drop_item()
+ qdel(W)
+ build_step++
+ to_chat(user, "You add the prox sensor to [src].")
+ name = "covered, shielded and sensored frame assembly"
+ item_state = "ed209_prox"
+ icon_state = "ed209_prox"
+
+ if(6)
+ if(istype(W, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/C = W
+ if (C.get_amount() < 1)
+ to_chat(user, "You need one coil of wire to wire [src].")
+ return
+ to_chat(user, "You start to wire [src].")
+ if(do_after(user, 40) && build_step == 6)
+ if(C.use(1))
+ build_step++
+ to_chat(user, "You wire the ED-209 assembly.")
+ name = "wired ED-209 assembly"
+ return
+
+ if(7)
+ if(istype(W, /obj/item/weapon/gun/energy/taser/xeno))
+ name = "xenotaser SL-ED-209 assembly"
+ item_state = "sled209_taser"
+ icon_state = "sled209_taser"
+ build_step++
+ to_chat(user, "You add [W] to [src].")
+ user.drop_item()
+ qdel(W)
+
+ if(8)
+ if(W.is_screwdriver())
+ playsound(src, W.usesound, 100, 1)
+ var/turf/T = get_turf(user)
+ to_chat(user, "Now attaching the gun to the frame...")
+ sleep(40)
+ if(get_turf(user) == T && build_step == 8)
+ build_step++
+ name = "armed [name]"
+ to_chat(user, "Taser gun attached.")
+
+ if(9)
+ if(istype(W, /obj/item/weapon/cell))
+ build_step++
+ to_chat(user, "You complete the ED-209.")
+ var/turf/T = get_turf(src)
+ new /mob/living/bot/secbot/ed209/slime(T,created_name,lasercolor)
+ user.drop_item()
+ qdel(W)
+ user.drop_from_inventory(src)
+ qdel(src)
+
diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm
index b8f1c854855..4db5978d0dd 100644
--- a/code/modules/mob/living/bot/ed209bot.dm
+++ b/code/modules/mob/living/bot/ed209bot.dm
@@ -160,12 +160,30 @@
return
if(7)
- if(istype(W, /obj/item/weapon/gun/energy/taser))
- name = "taser ED-209 assembly"
+ if(istype(W, /obj/item/weapon/gun/energy/taser/xeno))
+ name = "xenotaser SL-ED-209 assembly"
+ item_state = "sled209_taser"
+ icon_state = "sled209_taser"
build_step++
to_chat(user, "You add [W] to [src].")
+ user.drop_item()
+ qdel(W)
+ var/turf/T = get_turf(src)
+ var/obj/item/weapon/secbot_assembly/ed209_assembly/slime/S = new /obj/item/weapon/secbot_assembly/ed209_assembly/slime(T)
+ S.name = name
+ S.item_state = item_state
+ S.icon_state = icon_state
+ S.build_step = build_step
+ S.created_name = created_name
+ user.drop_from_inventory(src)
+ qdel(src)
+
+ else if(istype(W, /obj/item/weapon/gun/energy/taser))
+ name = "taser ED-209 assembly"
item_state = "ed209_taser"
icon_state = "ed209_taser"
+ build_step++
+ to_chat(user, "You add [W] to [src].")
user.drop_item()
qdel(W)
diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm
index 2372def546d..5af7e945825 100644
--- a/code/modules/mob/living/bot/secbot.dm
+++ b/code/modules/mob/living/bot/secbot.dm
@@ -289,8 +289,6 @@
var/mob/living/simple_mob/slime/xenobio/S = L
S.slimebatoned(src, xeno_stun_strength)
-
-
/mob/living/bot/secbot/explode()
visible_message("[src] blows apart!")
var/turf/Tsec = get_turf(src)
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index c892175c9a1..f1a1f28e6cc 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -222,4 +222,17 @@
/obj/item/projectile/beam/stun/med
name = "stun beam"
icon_state = "stun"
- agony = 30
\ No newline at end of file
+ agony = 30
+
+/obj/item/projectile/beam/shock
+ name = "shock beam"
+ icon_state = "lightning"
+ damage_type = ELECTROCUTE
+
+ muzzle_type = /obj/effect/projectile/muzzle/lightning
+ tracer_type = /obj/effect/projectile/tracer/lightning
+ impact_type = /obj/effect/projectile/impact/lightning
+
+ damage = 30
+ agony = 15
+ eyeblur = 2
diff --git a/html/changelogs/Mechoid - SLED.yml b/html/changelogs/Mechoid - SLED.yml
new file mode 100644
index 00000000000..d018aff60fa
--- /dev/null
+++ b/html/changelogs/Mechoid - SLED.yml
@@ -0,0 +1,36 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Mechoid
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added a Xenobio-compatible ED-209."
diff --git a/icons/obj/aibots.dmi b/icons/obj/aibots.dmi
index d6332e0d299..87f78139699 100644
Binary files a/icons/obj/aibots.dmi and b/icons/obj/aibots.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 943cc3f5154..f789b1b8a82 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2133,6 +2133,7 @@
#include "code\modules\mob\living\bot\medbot.dm"
#include "code\modules\mob\living\bot\mulebot.dm"
#include "code\modules\mob\living\bot\secbot.dm"
+#include "code\modules\mob\living\bot\SLed209bot.dm"
#include "code\modules\mob\living\carbon\breathe.dm"
#include "code\modules\mob\living\carbon\carbon.dm"
#include "code\modules\mob\living\carbon\carbon_defense.dm"