diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm
new file mode 100644
index 00000000000..af82cf97946
--- /dev/null
+++ b/code/game/objects/structures/artstuff.dm
@@ -0,0 +1,128 @@
+
+///////////
+// EASEL //
+///////////
+
+/obj/structure/easel
+ name = "easel"
+ desc = "only for the finest of art!"
+ icon = 'icons/obj/artstuff.dmi'
+ icon_state = "easel"
+ density = 1
+ var/obj/item/weapon/canvas/painting = null
+
+
+//Adding canvases
+/obj/structure/easel/attackby(var/obj/item/I, var/mob/user, params)
+ if(istype(I, /obj/item/weapon/canvas))
+ var/obj/item/weapon/canvas/C = I
+ user.unEquip(C)
+ painting = C
+ C.loc = get_turf(src)
+ C.layer = layer+0.1
+ user.visible_message("[user] puts \the [C] on \the [src].","You place \the [C] on \the [src].")
+ return
+
+ ..()
+
+
+//Stick to the easel like glue
+/obj/structure/easel/Move()
+ var/turf/T = get_turf(src)
+ ..()
+ if(painting && painting.loc == T) //Only move if it's near us.
+ painting.loc = get_turf(src)
+ else
+ painting = null
+
+
+//////////////
+// CANVASES //
+//////////////
+
+#define AMT_OF_CANVASES 4 //Keep this up to date or shit will break.
+
+//To safe memory on making /icons we cache the blanks..
+var/global/list/globalBlankCanvases[AMT_OF_CANVASES]
+
+/obj/item/weapon/canvas
+ name = "canvas"
+ desc = "draw out your soul on this canvas!"
+ icon = 'icons/obj/artstuff.dmi'
+ icon_state = "11x11"
+ var/whichGlobalBackup = 1 //List index
+ var/icon/selfBackup = null //Used so we can still see it in our hands.
+
+/obj/item/weapon/canvas/nineteenXnineteen
+ icon_state = "19x19"
+ whichGlobalBackup = 2
+
+/obj/item/weapon/canvas/twentythreeXnineteen
+ icon_state = "23x19"
+ whichGlobalBackup = 3
+
+/obj/item/weapon/canvas/twentythreeXtwentythree
+ icon_state = "23x23"
+ whichGlobalBackup = 4
+
+
+//Find the right size blank canvas
+/obj/item/weapon/canvas/proc/getGlobalBackup()
+ . = null
+ if(globalBlankCanvases[whichGlobalBackup])
+ . = globalBlankCanvases[whichGlobalBackup]
+ else
+ var/icon/I = icon(initial(icon),initial(icon_state))
+ globalBlankCanvases[whichGlobalBackup] = I
+ . = I
+
+
+
+//One pixel increments
+/obj/item/weapon/canvas/attackby(var/obj/item/I, var/mob/user, params)
+ //Click info
+ var/list/click_params = params2list(params)
+ var/pixX = text2num(click_params["icon-x"])
+ var/pixY = text2num(click_params["icon-y"])
+
+ //Should always be true, otherwise you didn't click the object, but let's check because SS13~
+ if(!click_params || !click_params["icon-x"] || !click_params["icon-y"])
+ return
+
+ //Cleaning one pixel with a soap or rag
+ if(istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag))
+ //Pixel info created only when needed
+ var/icon/masterpiece = icon(icon,icon_state)
+ var/thePix = masterpiece.GetPixel(pixX,pixY)
+ var/icon/Ico = getGlobalBackup()
+ if(!Ico)
+ qdel(masterpiece)
+ return
+
+ var/theOriginalPix = Ico.GetPixel(pixX,pixY)
+ if(thePix != theOriginalPix) //colour changed
+ DrawPixelOn(theOriginalPix,pixX,pixY)
+ qdel(masterpiece)
+ return
+
+ //Drawing one pixel with a crayon
+ if(istype(I, /obj/item/toy/crayon))
+ var/obj/item/toy/crayon/C = I
+ DrawPixelOn(C.colour, pixX, pixY)
+ return
+
+ ..()
+
+//Clean the whole canvas
+/obj/item/weapon/canvas/attack_self(var/mob/user)
+ if(!user)
+ return
+ var/icon/blank = getGlobalBackup()
+ if(blank)
+ //it's basically a giant etch-a-sketch
+ icon = blank
+ user.visible_message("[user] cleans the canvas.","You clean the canvas.")
+
+
+
+#undef AMT_OF_CANVASES
\ No newline at end of file
diff --git a/icons/obj/artstuff.dmi b/icons/obj/artstuff.dmi
new file mode 100644
index 00000000000..a11d1a81d0e
Binary files /dev/null and b/icons/obj/artstuff.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 940664d4864..519a549f74e 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -683,6 +683,7 @@
#include "code\game\objects\items\weapons\tanks\tank_types.dm"
#include "code\game\objects\items\weapons\tanks\tanks.dm"
#include "code\game\objects\items\weapons\tanks\watertank.dm"
+#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
#include "code\game\objects\structures\displaycase.dm"