diff --git a/code/game/objects/items/weapons/RMS_vr.dm b/code/game/objects/items/weapons/RMS_vr.dm
index 60b314f97a..4ec4996bdd 100644
--- a/code/game/objects/items/weapons/RMS_vr.dm
+++ b/code/game/objects/items/weapons/RMS_vr.dm
@@ -214,7 +214,7 @@
/obj/item/weapon/rms/attack_self(mob/user)
var/list/choices = list(
"Steel" = radial_image_steel,
- MAT_GLASS = radial_image_glass,
+ "Glass" = radial_image_glass,
"Cloth" = radial_image_cloth,
"Plastic" = radial_image_plastic,
"Stone" = radial_image_stone,
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recycling.dm b/code/game/objects/items/weapons/circuitboards/machinery/recycling.dm
new file mode 100644
index 0000000000..f0375d346b
--- /dev/null
+++ b/code/game/objects/items/weapons/circuitboards/machinery/recycling.dm
@@ -0,0 +1,41 @@
+#ifndef T_BOARD
+#error T_BOARD macro is not defined but we need it!
+#endif
+
+/obj/item/weapon/circuitboard/recycler_crusher
+ name = T_BOARD("recycler - crusher")
+ build_path = /obj/machinery/recycling/crusher
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_MATERIAL = 2)
+ matter = list(MAT_STEEL = 50, MAT_GLASS = 50)
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/gear = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1
+ )
+
+/obj/item/weapon/circuitboard/recycler_sorter
+ name = T_BOARD("recycler - sorter")
+ build_path = /obj/machinery/recycling/sorter
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_MATERIAL = 2)
+ matter = list(MAT_STEEL = 50, MAT_GLASS = 50)
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/gear = 3
+ )
+
+/obj/item/weapon/circuitboard/recycler_stamper
+ name = T_BOARD("recycler - stamper")
+ build_path = /obj/machinery/recycling/stamper
+ board_type = new /datum/frame/frame_types/machine
+ origin_tech = list(TECH_MATERIAL = 2)
+ matter = list(MAT_STEEL = 50, MAT_GLASS = 50)
+ req_components = list(
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/gear = 2,
+ /obj/item/weapon/stock_parts/motor = 2
+ )
diff --git a/code/modules/recycling/recycling.dm b/code/modules/recycling/recycling.dm
new file mode 100644
index 0000000000..26eab561e2
--- /dev/null
+++ b/code/modules/recycling/recycling.dm
@@ -0,0 +1,220 @@
+/obj/machinery/recycling
+ idle_power_usage = 5
+ active_power_usage = 500
+ density = TRUE
+ anchored = TRUE
+
+ var/working = FALSE
+
+/obj/machinery/recycling/process()
+ return PROCESS_KILL // these are all stateful
+
+/obj/machinery/recycling/update_icon()
+ . = ..()
+ cut_overlays()
+ if(panel_open)
+ add_overlay("[initial(icon_state)]-panel")
+
+/**
+ * Generic procs common to all
+ */
+/obj/machinery/recycling/attackby(obj/item/O, mob/user)
+ if(!isliving(user) || !Adjacent(user))
+ return
+
+ if(working)
+ to_chat("\The [src] is busy! Wait until it's idle.")
+ return
+
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(default_part_replacement(user, O))
+ return
+
+ var/mob/living/M = user
+ if(can_accept_item(O))
+ M.drop_from_inventory(O)
+ take_item(O)
+ M.visible_message("[M] inserts [O] into [src].", "You insert [O] into [src].")
+ else
+ to_chat(user, "\The [src] can't accept [O] for recycling.")
+
+// Conveyors etc
+/obj/machinery/recycling/Bumped(atom/A)
+ if(isitem(A) && can_accept_item(A))
+ take_item(A)
+
+/obj/machinery/recycling/proc/can_accept_item(obj/item/O)
+ if(stat & (NOPOWER|BROKEN))
+ return FALSE
+ if(panel_open)
+ return FALSE
+ return !working
+
+/obj/machinery/recycling/proc/take_item(obj/item/O)
+ O.forceMove(src)
+
+/**
+ * This machine takes items and turns them into heaps of junk.
+ */
+/obj/machinery/recycling/crusher
+ name = "recycling crusher"
+ desc = "This machine is designed to break things into their constituient parts via the application of directed kinetic force. A.K.A. it crushes things into bits."
+ description_info = "This machine is the first step in turning things back into their materials. There's a bit of loss, depending on how upgraded it is. The output of this machine goes into the sorter."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "crusher"
+ circuit = /obj/item/weapon/circuitboard/recycler_crusher
+
+ working = FALSE
+ var/effic_factor = 0.5
+
+/obj/machinery/recycling/crusher/RefreshParts()
+ . = ..()
+ var/total_rating = 0
+ for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts)
+ total_rating += M.rating
+ for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts)
+ total_rating += M.rating
+
+ total_rating *= 0.1
+
+ effic_factor = CLAMP01(initial(effic_factor)+total_rating)
+
+/obj/machinery/recycling/crusher/can_accept_item(obj/item/O)
+ if(LAZYLEN(O.matter))
+ return ..()
+ return FALSE
+
+/obj/machinery/recycling/crusher/take_item(obj/item/O)
+ . = ..()
+ working = TRUE
+ icon_state = "crusher-process"
+ update_use_power(USE_POWER_ACTIVE)
+ sleep(5 SECONDS)
+ var/list/modified_mats = list()
+ for(var/mat in O.matter)
+ modified_mats[mat] = O.matter[mat]*effic_factor
+ new /obj/item/debris_pack(get_step(src, dir), modified_mats)
+ update_use_power(USE_POWER_IDLE)
+ icon_state = "crusher"
+ qdel(O)
+ working = FALSE
+
+/**
+ * This machine takes heaps of junk and holds onto them until it has enough of one material to make a sheet.
+ */
+/obj/machinery/recycling/sorter
+ name = "debris sorter"
+ desc = "A machine for retaining debris and sorting it until enough of a similar material have accumulated to warrant conversion into sheets or ingots."
+ description_info = "The output of the recycling crusher should go into this machine, and it will output material dust, which can go into the sheet stamper to make sheets."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "sorter"
+ circuit = /obj/item/weapon/circuitboard/recycler_sorter
+
+ var/list/materials = list()
+ working = FALSE
+
+/obj/machinery/recycling/sorter/can_accept_item(obj/item/O)
+ if(istype(O, /obj/item/debris_pack))
+ return ..()
+ return FALSE
+
+/obj/machinery/recycling/sorter/take_item(obj/item/O)
+ . = ..()
+ working = TRUE
+ icon_state = "sorter-process"
+ update_use_power(USE_POWER_ACTIVE)
+ sleep(5 SECONDS)
+ sort_item(O)
+ dispense_if_possible()
+ update_use_power(USE_POWER_IDLE)
+ icon_state = "sorter"
+ working = FALSE
+
+/obj/machinery/recycling/sorter/proc/sort_item(obj/item/O)
+ for(var/mat in O.matter)
+ if(mat in materials)
+ materials[mat] += O.matter[mat]
+ else
+ materials[mat] = O.matter[mat]
+ qdel(O)
+
+/obj/machinery/recycling/sorter/proc/dispense_if_possible()
+ for(var/mat in materials)
+ while(materials[mat] >= SHEET_MATERIAL_AMOUNT)
+ materials[mat] -= SHEET_MATERIAL_AMOUNT
+ new /obj/item/material_dust(get_step(src, dir), mat)
+ sleep(2 SECONDS)
+
+/**
+ * This machine makes sheets after being provided with material dust from a sorter.
+ */
+/obj/machinery/recycling/stamper
+ name = "sheet stamper"
+ desc = "A machine to press homogenous material particulate into more solid portable units of production. A.K.A. it compacts dust into sheets."
+ description_info = "This machine is the last step in the recycling process. The output of a debris sorter should be fed into this machine and it will produce material sheets."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "stamper"
+ circuit = /obj/item/weapon/circuitboard/recycler_stamper
+
+/obj/machinery/recycling/stamper/can_accept_item(obj/item/O)
+ if(istype(O, /obj/item/material_dust))
+ return ..()
+ return FALSE
+
+/obj/machinery/recycling/stamper/take_item(obj/item/O)
+ . = ..()
+ working = TRUE
+ icon_state = "stamper-process"
+ update_use_power(USE_POWER_ACTIVE)
+ sleep(64)
+ dust_to_sheet(O)
+ icon_state = "stamper"
+ update_use_power(USE_POWER_IDLE)
+ working = FALSE
+
+/obj/machinery/recycling/stamper/proc/dust_to_sheet(obj/item/material_dust/D)
+ if(!istype(D))
+ return
+ var/datum/material/M = get_material_by_name(D.material_name)
+ if(!M)
+ D.forceMove(get_step(src, dir))
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ warning("Dust in [src] had material_name [D.material_name], which can't be made into stacks")
+ return
+
+ var/stacktype = M.stack_type
+ var/turf/T = get_step(src, dir)
+ var/obj/item/stack/S = locate(stacktype) in T
+ if(S)
+ S.amount++
+ else
+ new stacktype(T)
+
+/obj/item/debris_pack
+ name = "debris"
+ desc = "Some ground-up parts of ... something. Might be useful for recycling."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "debris"
+ w_class = ITEMSIZE_NORMAL
+
+/obj/item/debris_pack/New(newloc, list/matter)
+ ..()
+ src.matter = matter.Copy()
+
+/obj/item/material_dust
+ name = "dust"
+ desc = "A homogenous powder of some material or another. Might be useful for recycling."
+ icon = 'icons/obj/recycling.dmi'
+ icon_state = "matdust"
+ w_class = ITEMSIZE_SMALL
+ var/material_name
+
+/obj/item/material_dust/New(loc, mat)
+ ..()
+ material_name = mat
+ name = "[material_name] [initial(name)]"
+ var/datum/material/M = get_material_by_name(material_name)
+ color = M?.icon_colour
\ No newline at end of file
diff --git a/code/modules/research/designs/circuits/circuits.dm b/code/modules/research/designs/circuits/circuits.dm
index 4ec925ecac..5c77c19e60 100644
--- a/code/modules/research/designs/circuits/circuits.dm
+++ b/code/modules/research/designs/circuits/circuits.dm
@@ -689,3 +689,24 @@ CIRCUITS BELOW
req_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_COMBAT = 2)
build_path = /obj/item/weapon/circuitboard/pointdefense_control
sort_string = "OAABB"
+
+/datum/design/circuit/recycler_crusher
+ name = "recycler - crusher"
+ id = "recycler_crusher"
+ req_tech = list(TECH_MATERIAL = 2)
+ build_path = /obj/item/weapon/circuitboard/recycler_crusher
+ sort_string = "OAABC"
+
+/datum/design/circuit/recycler_sorter
+ name = "recycler - sorter"
+ id = "recycler_sorter"
+ req_tech = list(TECH_MATERIAL = 2)
+ build_path = /obj/item/weapon/circuitboard/recycler_sorter
+ sort_string = "OAABD"
+
+/datum/design/circuit/recycler_stamper
+ name = "recycler - stamper"
+ id = "recycler_stamper"
+ req_tech = list(TECH_MATERIAL = 2)
+ build_path = /obj/item/weapon/circuitboard/recycler_stamper
+ sort_string = "OAABE"
diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi
index eea7e7aaff..4252532f88 100644
Binary files a/icons/obj/recycling.dmi and b/icons/obj/recycling.dmi differ
diff --git a/icons/obj/structures/decor.dmi b/icons/obj/structures/decor.dmi
index 96d6afb6b8..fb79f4a39f 100644
Binary files a/icons/obj/structures/decor.dmi and b/icons/obj/structures/decor.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index cc2c048af0..1fb64ee8c8 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1384,6 +1384,7 @@
#include "code\game\objects\items\weapons\circuitboards\machinery\papershredder.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\power.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\recharge_station.dm"
+#include "code\game\objects\items\weapons\circuitboards\machinery\recycling.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\research.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\shieldgen.dm"
#include "code\game\objects\items\weapons\circuitboards\machinery\ships.dm"
@@ -3893,6 +3894,7 @@
#include "code\modules\recycling\conveyor2.dm"
#include "code\modules\recycling\disposal-construction.dm"
#include "code\modules\recycling\disposal.dm"
+#include "code\modules\recycling\recycling.dm"
#include "code\modules\recycling\sortingmachinery.dm"
#include "code\modules\research\circuitprinter.dm"
#include "code\modules\research\designs.dm"