diff --git a/code/game/objects/ladders.dm b/code/game/objects/ladders.dm
new file mode 100644
index 00000000000..e59419caa82
--- /dev/null
+++ b/code/game/objects/ladders.dm
@@ -0,0 +1,69 @@
+/obj/structure/ladder
+ name = "ladder"
+ desc = "A sturdy metal ladder."
+ icon = 'structures.dmi'
+ icon_state = "ladder11"
+ var/id = null
+ var/height = 0 //the 'height' of the ladder. higher numbers are considered physically higher
+ var/obj/structure/ladder/down = null //the ladder below this one
+ var/obj/structure/ladder/up = null //the ladder above this one
+
+/obj/structure/ladder/New()
+ spawn(8)
+ for(var/obj/structure/ladder/L in world)
+ if(L.id == id)
+ if(L.height == (height - 1))
+ down = L
+ continue
+ if(L.height == (height + 1))
+ up = L
+ continue
+
+ if(up && down) //if both our connections are filled
+ break
+ update_icon()
+
+/obj/structure/ladder/update_icon()
+ if(up && down)
+ icon_state = "ladder11"
+
+ else if(up)
+ icon_state = "ladder10"
+
+ else if(down)
+ icon_state = "ladder01"
+
+ else //wtf make your ladders properly assholes
+ icon_state = "ladder00"
+
+/obj/structure/ladder/attack_hand(mob/user as mob)
+ if(up && down)
+ switch( alert("Go up or down the ladder?", "Ladder", "Up", "Down", "Cancel") )
+ if("Up")
+ user.visible_message("[user] climbs up \the [src]!")
+ user.loc = get_turf(up)
+ up.add_fingerprint(user)
+ if("Down")
+ user.visible_message("[user] climbs down \the [src]!")
+ user.loc = get_turf(down)
+ down.add_fingerprint(user)
+ if("Cancel")
+ return
+
+ else if(up)
+ user.visible_message("[user] climbs up \the [src]!")
+ user.loc = get_turf(up)
+ up.add_fingerprint(user)
+
+ else if(down)
+ user.visible_message("[user] climbs down \the [src]!")
+ user.loc = get_turf(down)
+ down.add_fingerprint(user)
+
+ add_fingerprint(user)
+
+/obj/structure/ladder/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+/obj/structure/ladder/attackby(obj/item/weapon/W, mob/user as mob)
+ return attack_hand(user)
\ No newline at end of file
diff --git a/icons/obj/structures.dmi b/icons/obj/structures.dmi
index 60275e75a4d..fa8bac4085a 100644
Binary files a/icons/obj/structures.dmi and b/icons/obj/structures.dmi differ