diff --git a/code/game/objects/structures/femur_breaker.dm b/code/game/objects/structures/femur_breaker.dm
new file mode 100644
index 0000000000..077eb25688
--- /dev/null
+++ b/code/game/objects/structures/femur_breaker.dm
@@ -0,0 +1,174 @@
+#define BREAKER_ANIMATION_LENGTH 32
+#define BREAKER_SLAT_RAISED 1
+#define BREAKER_SLAT_MOVING 2
+#define BREAKER_SLAT_DROPPED 3
+#define BREAKER_ACTIVATE_DELAY 30
+#define BREAKER_WRENCH_DELAY 10
+#define BREAKER_ACTION_INUSE 5
+#define BREAKER_ACTION_WRENCH 6
+
+/obj/structure/femur_breaker
+ name = "femur breaker"
+ desc = "A large structure used to break the femurs of traitors and treasonists."
+ icon = 'icons/obj/femur_breaker.dmi'
+ icon_state = "breaker_raised"
+ can_buckle = TRUE
+ anchored = TRUE
+ density = TRUE
+ max_buckled_mobs = 1
+ buckle_lying = TRUE
+ buckle_prevents_pull = TRUE
+ layer = ABOVE_MOB_LAYER
+ var/slat_status = BREAKER_SLAT_RAISED
+ var/current_action = 0 // What's currently happening to the femur breaker
+
+/obj/structure/femur_breaker/examine(mob/user)
+ ..()
+
+ var/msg = ""
+
+ msg += "It is [anchored ? "secured to the floor." : "unsecured."]
"
+
+ if (slat_status == BREAKER_SLAT_RAISED)
+ msg += "The breaker slat is in a neutral position."
+ else
+ msg += "The breaker slat is lowered, and must be raised."
+
+ if (LAZYLEN(buckled_mobs))
+ msg += "
"
+ msg += "Someone appears to be strapped in. You can help them unbuckle, or activate the femur breaker."
+
+ to_chat(user, msg)
+
+ return msg
+
+/obj/structure/femur_breaker/attack_hand(mob/user)
+ add_fingerprint(user)
+
+ // Currently being used
+ if (current_action)
+ return
+
+ switch (slat_status)
+ if (BREAKER_SLAT_MOVING)
+ return
+ if (BREAKER_SLAT_DROPPED)
+ slat_status = BREAKER_SLAT_MOVING
+ icon_state = "breaker_raise"
+ addtimer(CALLBACK(src, .proc/raise_slat), BREAKER_ANIMATION_LENGTH)
+ return
+ if (BREAKER_SLAT_RAISED)
+ if (LAZYLEN(buckled_mobs))
+ if (user.a_intent == INTENT_HARM)
+ user.visible_message("[user] begins to pull the lever!",
+ "You begin to the pull the lever.")
+ current_action = BREAKER_ACTION_INUSE
+
+ if (do_after(user, BREAKER_ACTIVATE_DELAY, target = src) && slat_status == BREAKER_SLAT_RAISED)
+ current_action = 0
+ slat_status = BREAKER_SLAT_MOVING
+ icon_state = "breaker_drop"
+ drop_slat(user)
+ else
+ current_action = 0
+ else
+ var/mob/living/carbon/human/H = buckled_mobs[1]
+
+ if (H)
+ H.regenerate_icons()
+
+ unbuckle_all_mobs()
+ else //HERE
+ slat_status = BREAKER_SLAT_DROPPED
+ icon_state = "breaker_drop"
+
+/obj/structure/femur_breaker/proc/damage_leg(mob/living/carbon/human/H)
+ H.say("AAAAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHH!!", forced = "femur broken")
+ H.apply_damage(150, BRUTE, pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+
+/obj/structure/femur_breaker/proc/raise_slat()
+ slat_status = BREAKER_SLAT_RAISED
+ icon_state = "breaker_raised"
+
+/obj/structure/femur_breaker/proc/drop_slat(mob/user)
+ if (buckled_mobs.len)
+ var/mob/living/carbon/human/H = buckled_mobs[1]
+
+ if (!H)
+ return
+
+ playsound(src, 'sound/effects/femur_breaker.ogg', 100, FALSE)
+ H.Stun(BREAKER_ANIMATION_LENGTH)
+ addtimer(CALLBACK(src, .proc/damage_leg, H), BREAKER_ANIMATION_LENGTH, TIMER_UNIQUE)
+ log_combat(user, H, "femur broke", src)
+
+ slat_status = BREAKER_SLAT_DROPPED
+ icon_state = "breaker"
+
+/obj/structure/femur_breaker/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
+ if (!anchored)
+ to_chat(usr, "The [src] needs to be wrenched to the floor!")
+ return FALSE
+
+ if (!istype(M, /mob/living/carbon/human))
+ to_chat(usr, "It doesn't look like [M.p_they()] can fit into this properly!")
+ return FALSE
+
+ if (slat_status != BREAKER_SLAT_RAISED)
+ to_chat(usr, "The femur breaker must be in its neutral position before buckling someone in!")
+ return FALSE
+
+ return ..(M, force, FALSE)
+
+/obj/structure/femur_breaker/post_buckle_mob(mob/living/M)
+ if (!istype(M, /mob/living/carbon/human))
+ return
+
+ var/mob/living/carbon/human/H = M
+
+ if (H.dna)
+ if (H.dna.species)
+ var/datum/species/S = H.dna.species
+
+ if (!istype(S))
+ unbuckle_all_mobs()
+ else
+ unbuckle_all_mobs()
+ else
+ unbuckle_all_mobs()
+
+ ..()
+
+/obj/structure/femur_breaker/can_be_unfasten_wrench(mob/user, silent)
+ if (LAZYLEN(buckled_mobs))
+ if (!silent)
+ to_chat(user, "Can't unfasten, someone's strapped in!")
+ return FAILED_UNFASTEN
+
+ if (current_action)
+ return FAILED_UNFASTEN
+
+ return ..()
+
+/obj/structure/femur_breaker/wrench_act(mob/living/user, obj/item/I)
+ if (current_action)
+ return
+
+ current_action = BREAKER_ACTION_WRENCH
+
+ if (do_after(user, BREAKER_WRENCH_DELAY, target = src))
+ current_action = 0
+ default_unfasten_wrench(user, I, 0)
+ setDir(SOUTH)
+ return TRUE
+ else
+ current_action = 0
+
+#undef BREAKER_ANIMATION_LENGTH
+#undef BREAKER_SLAT_RAISED
+#undef BREAKER_SLAT_MOVING
+#undef BREAKER_SLAT_DROPPED
+#undef BREAKER_ACTIVATE_DELAY
+#undef BREAKER_WRENCH_DELAY
+#undef BREAKER_ACTION_INUSE
+#undef BREAKER_ACTION_WRENCH
\ No newline at end of file
diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm
index 3c614c6a9e..025b4af578 100644
--- a/code/modules/crafting/recipes.dm
+++ b/code/modules/crafting/recipes.dm
@@ -660,6 +660,15 @@
tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
category = CAT_MISC
+/datum/crafting_recipe/femur_breaker
+ name = "Femur Breaker"
+ result = /obj/structure/femur_breaker
+ time = 150
+ reqs = list(/obj/item/stack/sheet/metal = 20,
+ /obj/item/stack/cable_coil = 30)
+ tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER)
+ category = CAT_MISC
+
/datum/crafting_recipe/lizardhat
name = "Lizard Cloche Hat"
result = /obj/item/clothing/head/lizard
diff --git a/icons/obj/femur_breaker.dmi b/icons/obj/femur_breaker.dmi
new file mode 100644
index 0000000000..4b36f4b2b8
Binary files /dev/null and b/icons/obj/femur_breaker.dmi differ
diff --git a/sound/effects/femur_breaker.ogg b/sound/effects/femur_breaker.ogg
new file mode 100644
index 0000000000..140dc0477e
Binary files /dev/null and b/sound/effects/femur_breaker.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index e1d7bd9b24..3e5f86b8b9 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -970,6 +970,7 @@
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\false_walls.dm"
+#include "code\game\objects\structures\femur_breaker.dm"
#include "code\game\objects\structures\fence.dm"
#include "code\game\objects\structures\fireaxe.dm"
#include "code\game\objects\structures\fireplace.dm"