diff --git a/baystation12.dme b/baystation12.dme
index ca633d5e16..99fb397579 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -631,8 +631,9 @@
#include "code\game\objects\items\weapons\swords_axes_etc.dm"
#include "code\game\objects\items\weapons\tape.dm"
#include "code\game\objects\items\weapons\teleportation.dm"
-#include "code\game\objects\items\weapons\tools.dm"
+#include "code\game\objects\items\weapons\tools.dm"
#include "code\game\objects\items\weapons\trays.dm"
+#include "code\game\objects\items\weapons\traps.dm"
#include "code\game\objects\items\weapons\weaponry.dm"
#include "code\game\objects\items\weapons\weldbackpack.dm"
#include "code\game\objects\items\weapons\wires.dm"
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index e230dfa6c9..8c1377b53a 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -175,93 +175,6 @@
origin_tech = "materials=1"
var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute
-/obj/item/weapon/beartrap
- name = "bear trap"
- throw_speed = 2
- throw_range = 1
- gender = PLURAL
- icon = 'icons/obj/items.dmi'
- icon_state = "beartrap0"
- desc = "A trap used to catch bears and other legged creatures."
- throwforce = 0
- w_class = 3.0
- origin_tech = "materials=1"
- var/deployed = 0
-
- suicide_act(mob/user)
- viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
- return (BRUTELOSS)
-
-/obj/item/weapon/beartrap/attack_self(mob/user as mob)
- ..()
- if(ishuman(user) && !user.stat && !user.restrained())
- if(deployed==0)
- user.visible_message("[user] is deploying \the [src]", "You are deploying \the [src]!")
- if (do_after(user, 60))
- user.visible_message("[user] has deployed \the [src]", "You have deployed \the [src]!")
- deployed = 1
- user.drop_from_inventory(src, user.loc)
- update_icon()
- anchored = 1
-
-/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
- if(ishuman(user) && !user.stat && !user.restrained())
- if(deployed==1)
- user.visible_message("[user] is disarming \the [src]", "You are disarming \the [src]!")
- if (do_after(user, 60))
- user.visible_message("[user] has disarmed \the [src]", "You have disarmed \the [src]!")
- deployed = 0
- anchored = 0
- update_icon()
-
- if(deployed==0)
- ..()
-
-/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
- if(deployed)
- if(ishuman(AM))
- if(isturf(src.loc))
- var/mob/living/carbon/human/H = AM
- if(H.m_intent == "run")
- deployed = 0
- update_icon()
- H << "You step on \the [src]!"
- for(var/mob/O in viewers(H, null))
- if(O == H)
- continue
- O.show_message("[H] steps on \the [src].", 1)
- if(H.lying)
- var/obj/item/organ/external/affecting = pick(H.organs)
- if(affecting.take_damage(30, 0))
- H.UpdateDamageIcon()
- affecting.embed(src)
- else
- var/list/potentialorgans = list()
- for(var/organ in list("l_leg", "r_leg", "l_foot", "r_foot"))
- var/obj/item/organ/external/R = H.get_organ(organ)
- if(R && !(R.status & ORGAN_DESTROYED))
- potentialorgans += R
- var/obj/item/organ/external/affecting = pick(potentialorgans)
- if(affecting.take_damage(30, 0))
- H.UpdateDamageIcon()
- affecting.embed(src)
-
-
- if(isanimal(AM) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
- deployed = 0
- var/mob/living/simple_animal/SA = AM
- SA.health -= 20
- ..()
-
-/obj/item/weapon/beartrap/update_icon()
- ..()
-
- if(deployed == 0)
- icon_state = "beartrap0"
- else
- icon_state = "beartrap1"
-
-
/obj/item/weapon/caution
desc = "Caution! Wet Floor!"
name = "wet floor sign"
diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm
new file mode 100644
index 0000000000..f6af73843c
--- /dev/null
+++ b/code/game/objects/items/weapons/traps.dm
@@ -0,0 +1,114 @@
+/obj/item/weapon/beartrap
+ name = "mechanical trap"
+ throw_speed = 2
+ throw_range = 1
+ gender = PLURAL
+ icon = 'icons/obj/items.dmi'
+ icon_state = "beartrap0"
+ desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off."
+ throwforce = 0
+ w_class = 3
+ origin_tech = "materials=1"
+ var/deployed = 0
+
+/obj/item/weapon/beartrap/suicide_act(mob/user)
+ viewers(user) << "[user] is putting the [src.name] on \his head! It looks like \he's trying to commit suicide."
+ return (BRUTELOSS)
+
+/obj/item/weapon/beartrap/proc/can_use(mob/user)
+ return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained())
+
+/obj/item/weapon/beartrap/attack_self(mob/user as mob)
+ ..()
+ if(deployed && can_use(user))
+ user.visible_message(
+ "[user] starts to deploy \the [src].",
+ "You begin deploying \the [src]!",
+ "You hear the slow creaking of a spring."
+ )
+
+ if (do_after(user, 60))
+ user.visible_message(
+ "[user] has deployed \the [src].",
+ "You have deployed \the [src]!",
+ "You hear a latch click loudly."
+ )
+
+ deployed = 1
+ user.drop_from_inventory(src)
+ update_icon()
+ anchored = 1
+
+/obj/item/weapon/beartrap/attack_hand(mob/user as mob)
+ if(buckled_mob && can_use(user))
+ user.visible_message(
+ "[user] begins freeing [buckled_mob] from \the [src].",
+ "You carefully begin to free [buckled_mob] from \the [src].",
+ )
+ if(do_after(user, 60))
+ user.visible_message("[buckled_mob] has been freed from \the [src] by [user].")
+ unbuckle_mob()
+ anchored = 0
+ else if(deployed && can_use(user))
+ user.visible_message(
+ "[user] starts to disarm \the [src].",
+ "You begin disarming \the [src]!",
+ "You hear a latch click followed by the slow creaking of a spring."
+ )
+ if(do_after(user, 60))
+ user.visible_message(
+ "[user] has disarmed \the [src].",
+ "You have disarmed \the [src]!"
+ )
+ deployed = 0
+ anchored = 0
+ update_icon()
+ else
+ ..()
+
+/obj/item/weapon/beartrap/proc/attack_mob(mob/living/L)
+
+ var/target_zone
+ if(L.lying)
+ target_zone = ran_zone()
+ else
+ target_zone = pick("l_foot", "r_foot", "l_leg", "r_leg")
+
+ //armour
+ var/blocked = L.run_armor_check(target_zone, "melee")
+
+ if(blocked >= 2)
+ return
+
+ if(!L.apply_damage(30, BRUTE, target_zone, blocked, used_weapon=src))
+ return 0
+
+ //trap the victim in place
+ if(!blocked)
+ set_dir(L.dir)
+ buckle_mob(L)
+ L << "The steel jaws of \the [src] bite into you, trapping you in place!"
+
+/obj/item/weapon/beartrap/Crossed(AM as mob|obj)
+ if(isliving(AM))
+ var/mob/living/L = AM
+ if(L.m_intent == "run")
+ L.visible_message(
+ "[L] steps on \the [src].",
+ "You step on \the [src]!",
+ "You hear a loud metallic snap!"
+ )
+ attack_mob(L)
+ if(!buckled_mob)
+ anchored = 0
+ deployed = 0
+ update_icon()
+ ..()
+
+/obj/item/weapon/beartrap/update_icon()
+ ..()
+
+ if(!deployed)
+ icon_state = "beartrap0"
+ else
+ icon_state = "beartrap1"