diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm
new file mode 100644
index 00000000000..7fa9759e330
--- /dev/null
+++ b/code/game/objects/items/devices/floor_painter.dm
@@ -0,0 +1,98 @@
+// Floor painter
+
+/obj/item/device/floor_painter
+ name = "floor painter"
+ icon_state = "floor_painter"
+
+ var/floor_icon
+ var/floor_state = "floor"
+ var/floor_dir = SOUTH
+
+ w_class = 1
+ item_state = "electronic"
+ flags = CONDUCT
+ slot_flags = SLOT_BELT
+
+ var/static/list/allowed_states = list("arrival", "arrivalcorner", "bar", "barber", "blackcorner", "blue", "bluecorner",
+ "bluefull", "bluered", "blueyellow", "blueyellowfull", "bot", "brown", "browncorner", "browncornerold", "brownold",
+ "cafeteria", "caution", "cautioncorner", "chapel", "cmo", "dark", "delivery", "escape", "escapecorner", "floor",
+ "freezerfloor", "green", "greenblue", "greenbluefull", "greencorner", "greenfull", "greenyellow",
+ "greenyellowfull", "grimy", "loadingarea", "neutral", "neutralcorner", "neutralfull", "orange", "orangecorner",
+ "orangefull", "purple", "purplecorner", "purplefull", "rampbottom", "ramptop", "red", "redblue", "redbluefull",
+ "redcorner", "redfull", "redgreen", "redgreenfull", "redyellow", "redyellowfull", "warning", "warningcorner", "warnwhite",
+ "warnwhitecorner", "white", "whiteblue", "whitebluecorner", "whitebluefull", "whitebot", "whitecorner", "whitedelivery",
+ "whitegreen", "whitegreencorner", "whitegreenfull", "whitehall", "whitepurple", "whitepurplecorner", "whitepurplefull",
+ "whitered", "whiteredcorner", "whiteredfull", "whiteyellow", "whiteyellowcorner", "whiteyellowfull", "yellow",
+ "yellowcorner", "yellowcornersiding", "yellowsiding")
+
+/obj/item/device/floor_painter/afterattack(var/atom/A, var/mob/user, proximity, params)
+ if(!proximity)
+ return
+
+ var/turf/simulated/floor/plasteel/F = A
+ if(!istype(F))
+ to_chat(user, "\The [src] can only be used on station flooring.")
+ return
+
+ F.icon_state = floor_state
+ F.icon_regular_floor = floor_state
+ F.dir = floor_dir
+
+/obj/item/device/floor_painter/attack_self(var/mob/user)
+ if(!user)
+ return 0
+ user.set_machine(src)
+ interact(user)
+ return 1
+
+/obj/item/device/floor_painter/interact(mob/user as mob)
+ if(!floor_icon)
+ floor_icon = icon('icons/turf/floors.dmi', floor_state, floor_dir)
+ user << browse_rsc(floor_icon, "floor.png")
+ var/dat = {"
+
+ <-
+
+ ->
+
+ Choose Style
+ Style: [floor_state]
+ Choose Direction
+ Direction: [dir2text(floor_dir)]
+ "}
+
+ var/datum/browser/popup = new(user, "floor_painter", name, 225, 300)
+ popup.set_content(dat)
+ popup.open()
+
+/obj/item/device/floor_painter/Topic(href, href_list)
+ if(..())
+ return
+
+ if(href_list["choose_state"])
+ var/state = input("Please select a style", "[src]") as null|anything in allowed_states
+ if(state)
+ floor_state = state
+ floor_dir = SOUTH // Reset dir, because some icon_states might not have that dir.
+ if(href_list["choose_dir"])
+ var/seldir = input("Please select a direction", "[src]") as null|anything in list("north", "south", "east", "west", "northeast", "northwest", "southeast", "southwest")
+ if(seldir)
+ floor_dir = text2dir(seldir)
+ if(href_list["cycleleft"])
+ var/index = allowed_states.Find(floor_state)
+ index--
+ if(index < 1)
+ index = allowed_states.len
+ floor_state = allowed_states[index]
+ floor_dir = SOUTH
+ if(href_list["cycleright"])
+ var/index = allowed_states.Find(floor_state)
+ index++
+ if(index > allowed_states.len)
+ index = 1
+ floor_state = allowed_states[index]
+ floor_dir = SOUTH
+
+ floor_icon = icon('icons/turf/floors.dmi', floor_state, floor_dir)
+ if(usr)
+ attack_self(usr)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index b5d44579d07..8337e0ffaf7 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -688,6 +688,14 @@
build_path = /obj/item/weapon/hand_labeler
category = list("initial", "Electronics")
+/datum/design/floorpainter
+ name = "Floor painter"
+ id = "floor_painter"
+ build_type = AUTOLATHE
+ materials = list(MAT_METAL = 150, MAT_GLASS = 125)
+ build_path = /obj/item/device/floor_painter
+ category = list("initial", "Electronics")
+
/datum/design/logic_board
name = "Logic Circuit"
id = "logic_board"
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 46a4a974316..338b56148ee 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 2aa4f486887..17dddc8065d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -723,6 +723,7 @@
#include "code\game\objects\items\devices\debugger.dm"
#include "code\game\objects\items\devices\flash.dm"
#include "code\game\objects\items\devices\flashlight.dm"
+#include "code\game\objects\items\devices\floor_painter.dm"
#include "code\game\objects\items\devices\guitar.dm"
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"