diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm
index 766107a0a994..fa820d1c242d 100644
--- a/code/modules/surgery/amputation.dm
+++ b/code/modules/surgery/amputation.dm
@@ -6,6 +6,23 @@
possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD)
requires_bodypart_type = 0
+/datum/surgery/amputation/mechanic
+ name = "Detach mechanical limb"
+ self_operable = TRUE
+ requires_bodypart_type = BODYPART_ROBOTIC
+ possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ target_mobtypes = list(/mob/living/carbon/human)
+ lying_required = FALSE
+ steps = list(
+ /datum/surgery_step/mechanic_open,
+ /datum/surgery_step/open_hatch,
+ /datum/surgery_step/mechanic_unwrench,
+ /datum/surgery_step/prepare_electronics,
+ /datum/surgery_step/sever_limb/mechanic
+ )
+
+/datum/surgery/amputation/mechanic/can_start(mob/user, mob/living/carbon/target)
+ return ispreternis(target)
/datum/surgery_step/sever_limb
name = "sever limb"
@@ -27,3 +44,23 @@
target_limb.drop_limb()
return 1
+
+/datum/surgery_step/sever_limb/mechanic
+ name = "uninstall limb"
+ accept_hand = TRUE
+
+/datum/surgery_step/sever_limb/mechanic/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ display_results(user, target, "You begin to detach [target]'s [parse_zone(target_zone)]...",
+ "[user] begins to detach [target]'s [parse_zone(target_zone)]!",
+ "[user] begins to detach [target]'s [parse_zone(target_zone)]!")
+
+/datum/surgery_step/sever_limb/mechanic/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
+ var/mob/living/carbon/human/L = target
+ display_results(user, target, "You detached [L]'s [parse_zone(target_zone)].",
+ "[user] detached [L]'s [parse_zone(target_zone)]!",
+ "[user] detached [L]'s [parse_zone(target_zone)]!")
+ if(surgery.operated_bodypart)
+ var/obj/item/bodypart/target_limb = surgery.operated_bodypart
+ target_limb.drop_limb()
+
+ return 1
diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm
index 8bb4528c165c..1fdc2226675a 100644
--- a/code/modules/surgery/prosthetic_replacement.dm
+++ b/code/modules/surgery/prosthetic_replacement.dm
@@ -13,7 +13,23 @@
if(!C.get_bodypart(user.zone_selected)) //can only start if limb is missing
return 1
+/datum/surgery/prosthetic_replacement/mechanic_limb
+ name = "Attach mechanical limb"
+ self_operable = TRUE
+ possible_locs = list(BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ target_mobtypes = list(/mob/living/carbon/human)
+ lying_required = FALSE
+ steps = list(
+ /datum/surgery_step/prepare_electronics,
+ /datum/surgery_step/add_prosthetic
+ )
+/datum/surgery/prosthetic_replacement/mechanic_limb/can_start(mob/user, mob/living/carbon/target)
+ if(!ispreternis(target))
+ return FALSE
+
+ var/mob/living/carbon/C = target
+ return !C.get_bodypart(user.zone_selected) //can only start if limb is missing
/datum/surgery_step/add_prosthetic
name = "add prosthetic"
@@ -94,4 +110,3 @@
var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE)
target_zone == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm)
return 1
-