diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index ff231bf30db..40c775d0e87 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -58,6 +58,7 @@ var/global/list/datum/stack_recipe/metal_recipes = list(
new /datum/stack_recipe("turret frame", /obj/machinery/porta_turret_construct, 5, time = 25, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("firelock frame", /obj/structure/firelock_frame, 3, time = 50, one_per_turf = 1, on_floor = 1), \
new /datum/stack_recipe("meatspike frame", /obj/structure/kitchenspike_frame, 5, time = 25, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("reflector frame", /obj/structure/reflector, 5, time = 25, one_per_turf = 1, on_floor = 1),
null,
new /datum/stack_recipe_list("airlock assemblies", list(
new /datum/stack_recipe("standard airlock assembly", /obj/structure/door_assembly, 4, time = 50, one_per_turf = 1, on_floor = 1),
diff --git a/code/game/objects/structures/reflector.dm b/code/game/objects/structures/reflector.dm
new file mode 100644
index 00000000000..9e50af57473
--- /dev/null
+++ b/code/game/objects/structures/reflector.dm
@@ -0,0 +1,180 @@
+/obj/structure/reflector
+ name = "reflector frame"
+ icon = 'icons/obj/stock_parts.dmi'
+ icon_state = "box_0"
+ desc = "A frame to create a reflector.\nUse 5 sheets of glass to create a 1 way reflector.\nUse 10 sheets of reinforced glass to create a 2 way reflector.\nUse 1 diamond to create a reflector cube."
+ anchored = 0
+ density = 1
+ layer = 3
+ var/finished = 0
+
+
+/obj/structure/reflector/bullet_act(obj/item/projectile/P)
+ var/turf/reflector_turf = get_turf(src)
+ var/turf/reflect_turf
+ var/new_dir = get_reflection(dir, P.dir)
+ if(!istype(P, /obj/item/projectile/beam))
+ return ..()
+ if(new_dir)
+ reflect_turf = get_step(reflect_turf, new_dir)
+ else
+ visible_message("[src] is hit by [P]!")
+ new_dir = 0
+ return ..() //Hits as normal, explodes or emps or whatever
+
+ visible_message("[P] bounces off of [src]")
+ reflect_turf = get_step(loc,new_dir)
+
+ P.original = reflect_turf
+ P.starting = reflector_turf
+ P.current = reflector_turf
+ P.yo = reflect_turf.y - reflector_turf.y
+ P.xo = reflect_turf.x - reflector_turf.x
+ new_dir = 0
+ return -1
+
+
+/obj/structure/reflector/attackby(obj/item/W, mob/user, params)
+ if(iswrench(W))
+ if(anchored)
+ to_chat(user, "Unweld [src] first!")
+ return
+ playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
+ to_chat(user, "You begin to dismantle [src].")
+ if(do_after(user, 80, target = src))
+ playsound(user, 'sound/items/Ratchet.ogg', 50, 1)
+ to_chat(user, "You dismantle [src].")
+ new /obj/item/stack/sheet/metal(src.loc, 5)
+ qdel(src)
+ if(istype(W, /obj/item/weldingtool))
+ var/obj/item/weldingtool/WT = W
+ if(!anchored)
+ if(WT.remove_fuel(0,user))
+ playsound(user, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user.name] starts to weld [src.name] to the floor.", \
+ "You start to weld [src] to the floor...", \
+ "You hear welding.")
+ if(do_after(user,20, target = src))
+ if(!src || !WT.isOn())
+ return
+ anchored = 1
+ to_chat(user, "You weld [src] to the floor.")
+ else
+ if(WT.remove_fuel(0,user))
+ playsound(user, 'sound/items/Welder2.ogg', 50, 1)
+ user.visible_message("[user] starts to cut [src] free from the floor.", \
+ "You start to cut [src] free from the floor...", \
+ "You hear welding.")
+ if(do_after(user,20, target = src))
+ if(!src || !WT.isOn())
+ return
+ anchored = 0
+ to_chat(user, "You cut [src] free from the floor.")
+ //Finishing the frame
+ if(istype(W,/obj/item/stack/sheet))
+ if(finished)
+ return
+ var/obj/item/stack/sheet/S = W
+ if(istype(W, /obj/item/stack/sheet/glass))
+ if(S.get_amount() < 5)
+ to_chat(user, "You need five sheets of glass to create a reflector!")
+ return
+ else
+ S.use(5)
+ new /obj/structure/reflector/single (src.loc)
+ qdel(src)
+ if(istype(W,/obj/item/stack/sheet/rglass))
+ if(S.get_amount() < 10)
+ to_chat(user, "You need ten sheets of reinforced glass to create a double reflector!")
+ return
+ else
+ S.use(10)
+ new /obj/structure/reflector/double (src.loc)
+ qdel(src)
+ if(istype(W, /obj/item/stack/sheet/mineral/diamond))
+ if(S.get_amount() >= 1)
+ S.use(1)
+ new /obj/structure/reflector/box (src.loc)
+ qdel(src)
+
+/obj/structure/reflector/proc/get_reflection(srcdir,pdir)
+ return 0
+
+
+/obj/structure/reflector/verb/rotate()
+ set name = "Rotate"
+ set category = "Object"
+ set src in oview(1)
+
+ if(usr.incapacitated())
+ return
+ if(anchored)
+ to_chat(usr, "It is fastened to the floor!")
+ return 0
+ dir = turn(dir, 270)
+ return 1
+
+
+/obj/structure/reflector/AltClick(mob/user)
+ ..()
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ else
+ rotate()
+
+
+//TYPES OF REFLECTORS, SINGLE, DOUBLE, BOX
+
+//SINGLE
+
+/obj/structure/reflector/single
+ name = "reflector"
+ icon = 'icons/obj/reflector.dmi'
+ icon_state = "reflector"
+ desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle."
+ finished = 1
+ var/static/list/rotations = list("[NORTH]" = list("[SOUTH]" = WEST, "[EAST]" = NORTH),
+"[EAST]" = list("[SOUTH]" = EAST, "[WEST]" = NORTH),
+"[SOUTH]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH),
+"[WEST]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH) )
+
+/obj/structure/reflector/single/get_reflection(srcdir,pdir)
+ var/new_dir = rotations["[srcdir]"]["[pdir]"]
+ return new_dir
+
+//DOUBLE
+
+/obj/structure/reflector/double
+ name = "double sided reflector"
+ icon = 'icons/obj/reflector.dmi'
+ icon_state = "reflector_double"
+ desc = "A double sided angled mirror for reflecting lasers. This one does so at a 90 degree angle."
+ finished = 1
+ var/static/list/double_rotations = list("[NORTH]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH, "[SOUTH]" = EAST, "[WEST]" = NORTH),
+"[EAST]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH, "[SOUTH]" = WEST, "[EAST]" = NORTH),
+"[SOUTH]" = list("[NORTH]" = EAST, "[WEST]" = SOUTH, "[SOUTH]" = WEST, "[EAST]" = NORTH),
+"[WEST]" = list("[NORTH]" = WEST, "[EAST]" = SOUTH, "[SOUTH]" = EAST, "[WEST]" = NORTH) )
+
+/obj/structure/reflector/double/get_reflection(srcdir,pdir)
+ var/new_dir = double_rotations["[srcdir]"]["[pdir]"]
+ return new_dir
+
+//BOX
+
+/obj/structure/reflector/box
+ name = "reflector box"
+ icon = 'icons/obj/reflector.dmi'
+ icon_state = "reflector_box"
+ desc = "A box with an internal set of mirrors that reflects all laser fire in a single direction."
+ finished = 1
+ var/static/list/box_rotations = list("[NORTH]" = list("[SOUTH]" = NORTH, "[EAST]" = NORTH, "[WEST]" = NORTH, "[NORTH]" = NORTH),
+"[EAST]" = list("[SOUTH]" = EAST, "[EAST]" = EAST, "[WEST]" = EAST, "[NORTH]" = EAST),
+"[SOUTH]" = list("[SOUTH]" = SOUTH, "[EAST]" = SOUTH, "[WEST]" = SOUTH, "[NORTH]" = SOUTH),
+"[WEST]" = list("[SOUTH]" = WEST, "[EAST]" = WEST, "[WEST]" = WEST, "[NORTH]" = WEST) )
+
+/obj/structure/reflector/box/get_reflection(srcdir,pdir)
+ var/new_dir = box_rotations["[srcdir]"]["[pdir]"]
+ return new_dir
\ No newline at end of file
diff --git a/icons/obj/reflector.dmi b/icons/obj/reflector.dmi
new file mode 100644
index 00000000000..1c6e71bdec4
Binary files /dev/null and b/icons/obj/reflector.dmi differ
diff --git a/paradise.dme b/paradise.dme
index f04d4909f96..dc78d020ad1 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1008,6 +1008,7 @@
#include "code\game\objects\structures\musician.dm"
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\plasticflaps.dm"
+#include "code\game\objects\structures\reflector.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\signs.dm"
#include "code\game\objects\structures\spirit_board.dm"
@@ -2348,4 +2349,4 @@
#include "goon\code\datums\browserOutput.dm"
#include "interface\interface.dm"
#include "interface\skin.dmf"
-// END_INCLUDE
+// END_INCLUDE
\ No newline at end of file