diff --git a/code/modules/projectiles/guns/launcher/bows.dm b/code/modules/projectiles/guns/launcher/bows.dm
new file mode 100644
index 00000000000..3df5d1de498
--- /dev/null
+++ b/code/modules/projectiles/guns/launcher/bows.dm
@@ -0,0 +1,123 @@
+/obj/item/weapon/arrow/standard
+ name = "arrow"
+ desc = "It's got a tip for you - get the point?"
+ icon = 'icons/obj/guns/projectile/bows.dmi'
+ icon_state = "arrow"
+ item_state = "bolt"
+ throwforce = 8
+ w_class = ITEMSIZE_NORMAL
+ sharp = 1
+ edge = 0
+
+/obj/item/weapon/arrow/energy
+ name = "hardlight arrow"
+ desc = "An arrow made out of energy! Classic?"
+ icon = 'icons/obj/guns/projectile/bows.dmi'
+ icon_state = "hardlight"
+ item_state = "bolt"
+ throwforce = 10
+ w_class = ITEMSIZE_NORMAL
+ sharp = 0
+ edge = 1
+
+/obj/item/weapon/arrow/energy/throw_impact(atom/hit_atom)
+ . = ..()
+ qdel(src)
+
+/obj/item/weapon/gun/launcher/crossbow/bow
+ name = "shortbow"
+ desc = "A common shortbow, capable of firing arrows at high speed towards a target. Useful for hunting while keeping quiet."
+ icon = 'icons/obj/guns/projectile/bows.dmi'
+ icon_override = 'icons/obj/guns/projectile/bows.dmi'
+ icon_state = "bow"
+ item_state = "bow"
+ fire_sound = 'sound/weapons/punchmiss.ogg' // TODO: Decent THWOK noise.
+ fire_sound_text = "a solid thunk"
+ fire_delay = 25
+ slot_flags = SLOT_BACK
+ tension = 3
+ var/drawn = FALSE
+
+/obj/item/weapon/gun/launcher/crossbow/bow/proc/unload(mob/user)
+ var/obj/item/weapon/arrow/A = bolt
+ bolt = null
+ drawn = FALSE
+ A.forceMove(get_turf(user))
+ user.put_in_hands(A)
+
+/obj/item/weapon/gun/launcher/crossbow/bow/consume_next_projectile(mob/user)
+ if(!drawn)
+ to_chat(user, "\The [src] is not drawn back!")
+ return null
+ return bolt
+
+/obj/item/weapon/gun/launcher/crossbow/bow/handle_post_fire(mob/user, atom/target)
+ bolt = null
+ drawn = FALSE
+ update_icon()
+ ..()
+
+/obj/item/weapon/gun/launcher/crossbow/bow/attack_self(mob/living/user)
+ if(bolt)
+ user.visible_message("[user] relaxes the tension on [src]'s string and removes [bolt].","You relax the tension on [src]'s string and remove [bolt].")
+ unload(user)
+ update_icon()
+ else
+ draw(user)
+
+/obj/item/weapon/gun/launcher/crossbow/bow/draw(var/mob/user)
+ if(!bolt)
+ to_chat(user, "You don't have anything nocked to [src].")
+ return
+
+ if(user.restrained())
+ return
+
+ current_user = user
+ user.visible_message("[user] begins to draw back the string of [src].","You begin to draw back the string of [src].")
+
+ if(do_after(user, 25, src, exclusive = TASK_ALL_EXCLUSIVE))
+ drawn = TRUE
+ user.visible_message("[user] draws the string on [src] back fully!", "You draw the string on [src] back fully!")
+ else
+ user.visible_message("[user] stops drawing and relaxes the string of [src].","You stop drawing back and relax the string of [src].")
+ drawn = FALSE
+ update_icon()
+
+/obj/item/weapon/gun/launcher/crossbow/bow/attackby(obj/item/W as obj, mob/user)
+ if(!bolt && istype(W,/obj/item/weapon/arrow/standard))
+ user.drop_from_inventory(W, src)
+ bolt = W
+ user.visible_message("[user] slides [bolt] into [src].","You slide [bolt] into [src].")
+ update_icon()
+
+/obj/item/weapon/gun/launcher/crossbow/bow/update_icon()
+ if(drawn)
+ icon_state = "[initial(icon_state)]_firing"
+ else if(bolt)
+ icon_state = "[initial(icon_state)]_loaded"
+ else
+ icon_state = "[initial(icon_state)]"
+
+
+
+/obj/item/weapon/gun/launcher/crossbow/bow/hardlight
+ name = "hardlight bow"
+ icon_state = "bow_hardlight"
+ item_state = "bow_hardlight"
+ desc = "An energy bow, capable of producing arrows from an internal power supply."
+
+/obj/item/weapon/gun/launcher/crossbow/bow/hardlight/unload(mob/user)
+ qdel_null(bolt)
+
+/obj/item/weapon/gun/launcher/crossbow/bow/hardlight/attack_self(mob/living/user)
+ if(drawn)
+ user.visible_message("[user] relaxes the tension on [src]'s string.","You relax the tension on [src]'s string.")
+ drawn = FALSE
+ update_icon()
+ else if(!bolt)
+ user.visible_message("[user] fabricates a new hardlight projectile with [src].","You fabricate a new hardlight projectile with [src].")
+ bolt = new /obj/item/weapon/arrow/energy(src)
+ update_icon()
+ else
+ draw(user)
diff --git a/icons/obj/guns/projectile/bows.dmi b/icons/obj/guns/projectile/bows.dmi
new file mode 100644
index 00000000000..3d3494bfd26
Binary files /dev/null and b/icons/obj/guns/projectile/bows.dmi differ