diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm
new file mode 100644
index 00000000..4917f823
--- /dev/null
+++ b/hyperstation/code/obj/fleshlight.dm
@@ -0,0 +1,73 @@
+//Hyperstation 13 fleshlight
+//dont forget to credit us!
+
+/obj/item/fleshlight
+ name = "fleshlight"
+ desc = "A sex toy disguised as a flashlight, used to stimulate someones penis, complete with colour changing sleeve."
+ icon = 'hyperstation/icons/obj/fleshlight.dmi'
+ icon_state = "fleshlight_base"
+ item_state = "fleshlight"
+ w_class = WEIGHT_CLASS_SMALL
+ var/sleevecolor = "#ffcbd4" //pink
+ price = 12
+ var/mutable_appearance/sleeve
+ var/inuse = 0
+
+/obj/item/fleshlight/examine(mob/user)
+ . = ..()
+ . += "Alt-Click \the [src.name] to customize it."
+
+/obj/item/fleshlight/Initialize()
+ . = ..()
+ sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "vagina")
+ sleeve.color = sleevecolor
+ add_overlay(sleeve)
+
+/obj/item/fleshlight/AltClick(mob/user)
+ . = ..()
+ var/style = input(usr, "Choose style", "Customize Fleshlight", "vagina") in list("vagina", "anus")
+ var/new_color = input(user, "Choose color.", "Customize Fleshlight", sleevecolor) as color|null
+ if(new_color)
+ cut_overlays()
+ sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', style)
+ sleevecolor = new_color
+ sleeve.color = new_color
+ add_overlay(sleeve)
+ return TRUE
+
+/obj/item/fleshlight/attack(mob/living/carbon/C, mob/living/user)
+ var/obj/item/organ/genital/penis/P = C.getorganslot("penis")
+ if(inuse == 1) //just to stop stacking and causing people to cum instantly
+ return
+ if(P&&P.is_exposed())
+ inuse = 1
+ if(!(C == user)) //if we are targeting someone else.
+ C.visible_message("[user] is trying to use [src] on [C]'s penis.", "[user] is trying to use [src] on your penis.")
+
+ if(!do_mob(user, C, 3 SECONDS)) //3 second delay
+ inuse = 0
+ return
+
+ //checked if not used on yourself, if not, carry on.
+ playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound
+ inuse = 0
+ if(!(C == user)) //lewd flavour text
+ C.visible_message("[user] pumps [src] on [C]'s penis.", "[user] pumps [src] up and down on your penis.")
+ else
+ user.visible_message("[user] pumps [src] on their penis.", "You pump the fleshlight on your penis.")
+
+ if(prob(30)) //30% chance to make them moan.
+ C.emote("moan")
+
+ C.do_jitter_animation()
+ C.adjustArousalLoss(20) //make the target more aroused.
+ if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
+ C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge.
+
+ return
+
+ else
+ to_chat(user, "You don't see anywhere to use this on.")
+
+ inuse = 0
+ ..()
\ No newline at end of file
diff --git a/hyperstation/icons/obj/fleshlight.dmi b/hyperstation/icons/obj/fleshlight.dmi
new file mode 100644
index 00000000..a02bb49a
Binary files /dev/null and b/hyperstation/icons/obj/fleshlight.dmi differ
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index b65088a8..bc7a3439 100644
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -65,6 +65,7 @@
/obj/item/clothing/under/jabroni = 3,
/obj/item/electropack/vibrator/small = 2,
/obj/item/electropack/vibrator = 2,
+ /obj/item/fleshlight = 2,
)
contraband = list(
/obj/item/clothing/under/gear_harness = 3,
diff --git a/sound/lewd/slaps.ogg b/sound/lewd/slaps.ogg
new file mode 100644
index 00000000..78cf4eca
Binary files /dev/null and b/sound/lewd/slaps.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 652cffdd..ecd1b05a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3089,6 +3089,7 @@
#include "hyperstation\code\obj\condom.dm"
#include "hyperstation\code\obj\decal.dm"
#include "hyperstation\code\obj\economy.dm"
+#include "hyperstation\code\obj\fleshlight.dm"
#include "hyperstation\code\obj\fluff.dm"
#include "hyperstation\code\obj\kinkyclothes.dm"
#include "hyperstation\code\obj\leash.dm"