diff --git a/code/game/objects/structures/fitness.dm b/code/game/objects/structures/fitness.dm
new file mode 100644
index 00000000000..3bb158a576b
--- /dev/null
+++ b/code/game/objects/structures/fitness.dm
@@ -0,0 +1,65 @@
+/obj/structure/fitness
+ icon = 'icons/obj/stationobjs.dmi'
+ anchored = 1
+ var/being_used = 0
+
+/obj/structure/fitness/punchingbag
+ name = "punching bag"
+ desc = "A punching bag."
+ icon_state = "punchingbag"
+ density = 1
+ var/list/hit_message = list("hit", "punch", "kick", "robust")
+
+/obj/structure/fitness/punchingbag/attack_hand(var/mob/living/carbon/human/user)
+ if(!istype(user))
+ ..()
+ return
+ if(user.nutrition < 20)
+ to_chat(user, "You need more energy to use the punching bag. Go eat something.")
+ else
+ if(user.a_intent == I_HURT)
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ flick("[icon_state]_hit", src)
+ playsound(src.loc, 'sound/effects/woodhit.ogg', 25, 1, -1)
+ user.do_attack_animation(src)
+ user.nutrition = user.nutrition - 5
+ to_chat(user, "You [pick(hit_message)] \the [src].")
+
+/obj/structure/fitness/weightlifter
+ name = "weightlifting machine"
+ desc = "A machine used to lift weights."
+ icon_state = "weightlifter"
+ var/weight = 1
+ var/list/qualifiers = list("with ease", "without any trouble", "with great effort")
+
+/obj/structure/fitness/weightlifter/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/wrench))
+ playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
+ weight = ((weight) % qualifiers.len) + 1
+ to_chat(user, "You set the machine's weight level to [weight].")
+
+/obj/structure/fitness/weightlifter/attack_hand(var/mob/living/carbon/human/user)
+ if(!istype(user))
+ return
+ if(user.loc != src.loc)
+ to_chat(user, "You must be on the weight machine to use it.")
+ return
+ if(user.nutrition < 50)
+ to_chat(user, "You need more energy to lift weights. Go eat something.")
+ return
+ if(being_used)
+ to_chat(user, "The weight machine is already in use by somebody else.")
+ return
+ else
+ being_used = 1
+ playsound(src.loc, 'sound/effects/weightlifter.ogg', 50, 1)
+ user.set_dir(SOUTH)
+ flick("[icon_state]_[weight]", src)
+ if(do_after(user, 20 + (weight * 10)))
+ playsound(src.loc, 'sound/effects/weightdrop.ogg', 25, 1)
+ user.nutrition -= weight * 10
+ to_chat(user, "You lift the weights [qualifiers[weight]].")
+ being_used = 0
+ else
+ to_chat(user, "Against your previous judgement, perhaps working out is not for you.")
+ being_used = 0
diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi
index 6d114f1b05e..f8bfcf621a9 100644
Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ
diff --git a/polaris.dme b/polaris.dme
index 590bf35b9e9..46ed0fab3da 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -995,6 +995,7 @@
#include "code\game\objects\structures\door_assembly.dm"
#include "code\game\objects\structures\electricchair.dm"
#include "code\game\objects\structures\extinguisher.dm"
+#include "code\game\objects\structures\fitness.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\girders.dm"
#include "code\game\objects\structures\gravemarker.dm"
diff --git a/sound/effects/weightdrop.ogg b/sound/effects/weightdrop.ogg
new file mode 100644
index 00000000000..07945daaf86
Binary files /dev/null and b/sound/effects/weightdrop.ogg differ
diff --git a/sound/effects/weightlifter.ogg b/sound/effects/weightlifter.ogg
new file mode 100644
index 00000000000..51a0d497854
Binary files /dev/null and b/sound/effects/weightlifter.ogg differ