diff --git a/code/game/objects/structures/railings.dm b/code/game/objects/structures/railings.dm
new file mode 100644
index 0000000000..21cf97ba70
--- /dev/null
+++ b/code/game/objects/structures/railings.dm
@@ -0,0 +1,107 @@
+/obj/structure/railing
+ name = "railing"
+ desc = "Basic railing meant to protect idiots like you from falling."
+ icon = 'icons/obj/fluff.dmi'
+ icon_state = "railing"
+ density = TRUE
+ anchored = TRUE
+ climbable = TRUE
+ ///Initial direction of the railing.
+ var/ini_dir
+
+/obj/structure/railing/corner //aesthetic corner sharp edges hurt oof ouch
+ icon_state = "railing_corner"
+ density = FALSE
+ climbable = FALSE
+
+/obj/structure/railing/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE | ROTATION_COUNTERCLOCKWISE | ROTATION_VERBS ,null,CALLBACK(src, .proc/can_be_rotated),CALLBACK(src,.proc/after_rotation))
+
+/obj/structure/railing/Initialize()
+ . = ..()
+ ini_dir = dir
+
+/obj/structure/railing/attackby(obj/item/I, mob/living/user, params)
+ ..()
+ add_fingerprint(user)
+ if(I.tool_behaviour == TOOL_WELDER && user.a_intent == INTENT_HELP)
+ if(obj_integrity < max_integrity)
+ if(!I.tool_start_check(user, amount=0))
+ return
+ to_chat(user, "You begin repairing [src]...")
+ if(I.use_tool(src, user, 40, volume=50))
+ obj_integrity = max_integrity
+ to_chat(user, "You repair [src].")
+ else
+ to_chat(user, "[src] is already in good condition!")
+ return
+
+/obj/structure/railing/wirecutter_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(!anchored)
+ to_chat(user, "You cut apart the railing.")
+ I.play_tool_sound(src, 100)
+ deconstruct()
+ return TRUE
+
+/obj/structure/railing/deconstruct(disassembled)
+ . = ..()
+ if(!loc) //quick check if it's qdeleted already.
+ return
+ if(!(flags_1 & NODECONSTRUCT_1))
+ var/obj/item/stack/rods/rod = new /obj/item/stack/rods(drop_location(), 3)
+ transfer_fingerprints_to(rod)
+ qdel(src)
+///Implements behaviour that makes it possible to unanchor the railing.
+/obj/structure/railing/wrench_act(mob/living/user, obj/item/I)
+ . = ..()
+ if(flags_1&NODECONSTRUCT_1)
+ return
+ to_chat(user, "You begin to [anchored ? "unfasten the railing from":"fasten the railing to"] the floor...")
+ if(I.use_tool(src, user, volume = 75, extra_checks = CALLBACK(src, .proc/check_anchored, anchored)))
+ setAnchored(!anchored)
+ to_chat(user, "You [anchored ? "fasten the railing to":"unfasten the railing from"] the floor.")
+ return TRUE
+
+/obj/structure/railing/CanPass(atom/movable/mover, turf/target)
+ . = ..()
+ if(get_dir(loc, target) & dir)
+ var/checking = FLYING | FLOATING
+ return . || mover.throwing || mover.movement_type & checking
+ return TRUE
+
+/obj/structure/railing/corner/CanPass()
+ ..()
+ return TRUE
+
+/obj/structure/railing/CheckExit(atom/movable/mover, turf/target)
+ ..()
+ if(get_dir(loc, target) & dir)
+ var/checking = UNSTOPPABLE | FLYING | FLOATING
+ return !density || mover.throwing || mover.movement_type & checking || mover.move_force >= MOVE_FORCE_EXTREMELY_STRONG
+ return TRUE
+
+/obj/structure/railing/corner/CheckExit()
+ return TRUE
+
+/obj/structure/railing/proc/can_be_rotated(mob/user,rotation_type)
+ if(anchored)
+ to_chat(user, "[src] cannot be rotated while it is fastened to the floor!")
+ return FALSE
+
+ var/target_dir = turn(dir, rotation_type == ROTATION_CLOCKWISE ? -90 : 90)
+
+ if(!valid_window_location(loc, target_dir)) //Expanded to include rails, as well!
+ to_chat(user, "[src] cannot be rotated in that direction!")
+ return FALSE
+ return TRUE
+
+/obj/structure/railing/proc/check_anchored(checked_anchored)
+ if(anchored == checked_anchored)
+ return TRUE
+
+/obj/structure/railing/proc/after_rotation(mob/user,rotation_type)
+ air_update_turf(1)
+ ini_dir = dir
+ add_fingerprint(user)
diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm
index 1358b2e296..8472926679 100644
--- a/code/game/objects/structures/stairs.dm
+++ b/code/game/objects/structures/stairs.dm
@@ -16,6 +16,18 @@
var/terminator_mode = STAIR_TERMINATOR_AUTOMATIC
var/turf/listeningTo
+/obj/structure/stairs/north
+ dir = NORTH
+
+/obj/structure/stairs/south
+ dir = SOUTH
+
+/obj/structure/stairs/east
+ dir = EAST
+
+/obj/structure/stairs/west
+ dir = WEST
+
/obj/structure/stairs/Initialize(mapload)
if(force_open_above)
force_open_above()
@@ -105,6 +117,9 @@
T.ChangeTurf(/turf/open/transparent/openspace, flags = CHANGETURF_INHERIT_AIR)
/obj/structure/stairs/proc/on_multiz_new(turf/source, dir)
+ //SIGNAL_HANDLER
+ SHOULD_NOT_SLEEP(TRUE) //the same thing.
+
if(dir == UP)
var/turf/open/transparent/openspace/T = get_step_multiz(get_turf(src), UP)
if(T && !istype(T))
diff --git a/tgstation.dme b/tgstation.dme
index 143f66a656..44394e0673 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -808,8 +808,6 @@
#include "code\game\machinery\mass_driver.dm"
#include "code\game\machinery\navbeacon.dm"
#include "code\game\machinery\PDApainter.dm"
-#include "code\game\machinery\poweredfans\fan_assembly.dm"
-#include "code\game\machinery\poweredfans\poweredfans.dm"
#include "code\game\machinery\quantum_pad.dm"
#include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm"
@@ -887,6 +885,8 @@
#include "code\game\machinery\porta_turret\portable_turret.dm"
#include "code\game\machinery\porta_turret\portable_turret_construct.dm"
#include "code\game\machinery\porta_turret\portable_turret_cover.dm"
+#include "code\game\machinery\poweredfans\fan_assembly.dm"
+#include "code\game\machinery\poweredfans\poweredfans.dm"
#include "code\game\machinery\shuttle\custom_shuttle.dm"
#include "code\game\machinery\shuttle\shuttle_engine.dm"
#include "code\game\machinery\shuttle\shuttle_heater.dm"
@@ -1253,6 +1253,7 @@
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\petrified_statue.dm"
#include "code\game\objects\structures\plasticflaps.dm"
+#include "code\game\objects\structures\railings.dm"
#include "code\game\objects\structures\reflector.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\showcase.dm"