diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index 6c71e63207..c3fa1701fd 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -202,6 +202,12 @@
frame_class = FRAME_CLASS_MACHINE
frame_size = 3
+/datum/frame/frame_types/injector_maker
+ name = "Ready-to-Use Medicine 3000"
+ frame_class = FRAME_CLASS_MACHINE
+ circuit = /obj/machinery/atmospheric_field_generator
+ frame_size = 3
+
//////////////////////////////
// Frame Object (Structure)
//////////////////////////////
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index 7ef7c4bfef..000cd011f6 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -264,4 +264,17 @@
/obj/item/weapon/stock_parts/micro_laser/high = 2, //field emitters
/obj/item/weapon/stock_parts/scanning_module = 1, //atmosphere sensor
/obj/item/weapon/stock_parts/capacitor/adv = 1, //for the JUICE
- /obj/item/stack/cable_coil = 10)
\ No newline at end of file
+ /obj/item/stack/cable_coil = 10)
+
+
+/obj/item/weapon/circuitboard/injector_maker
+ name = T_BOARD("Ready-to-Use Medicine 3000")
+ build_path = /obj/machinery/injector_maker
+ board_type = new /datum/frame/frame_types/injector_maker
+ origin_tech = list(TECH_BIO = 3, TECH_ENGINEERING = 2, TECH_MATERIAL = 2)
+ req_components = list(
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1
+ )
diff --git a/code/modules/reagents/machinery/injector_maker.dm b/code/modules/reagents/machinery/injector_maker.dm
new file mode 100644
index 0000000000..0aa79fa88c
--- /dev/null
+++ b/code/modules/reagents/machinery/injector_maker.dm
@@ -0,0 +1,181 @@
+/obj/machinery/injector_maker
+ name = "Ready-to-Use Medicine 3000"
+ desc = "Molds plastic into autoinjectors and fills them with chemicals. \n Add a beaker or a bottle filled with chemicals and a sheet of plastic to use!"
+ icon = 'icons/obj/chemical_vr.dmi' //placeholder for testing
+ icon_state = "injector"
+ use_power = USE_POWER_IDLE
+ anchored = FALSE
+ density = FALSE
+ clicksound = "button"
+ clickvol = 30
+ idle_power_usage = 5
+ active_power_usage = 100
+ circuit = /obj/item/weapon/circuitboard/injector_maker
+ var/obj/item/weapon/reagent_containers/beaker = null
+ var/plastic_amount = 0
+ var/max_plastic = 10000
+ var/stack_value = 2000
+ var/material_per_sheet = 2000
+ var/plastic_cost_small = 10
+ var/plastic_cost_large = 500
+ var/list/beaker_reagents_list = list()
+
+
+/obj/machinery/injector_maker/Initialize()
+ . = ..()
+ default_apply_parts()
+
+obj/machinery/injector_maker/update_icon()
+ if(!plastic_amount && !beaker)
+ icon_state = "injector"
+ else if(!plastic_amount && beaker != null)
+ icon_state = "injector_b"
+ else if(!beaker && plastic_amount > 0)
+ icon_state = "injector_p"
+ else if(beaker != null && plastic_amount > 0)
+ icon_state = "injector_pb"
+
+
+/obj/machinery/injector_maker/attackby(var/obj/item/O as obj, var/mob/user as mob)
+
+ if (istype(O, /obj/item/device/multitool))
+ return ..()
+
+ if(istype(O,/obj/item/weapon/reagent_containers/glass) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/drinks/glass2) || \
+ istype(O,/obj/item/weapon/reagent_containers/food/drinks/shaker))
+
+ if (beaker)
+ return 1
+ else
+ src.beaker = O
+ user.drop_item()
+ O.loc = src
+ update_icon()
+ src.updateUsrDialog()
+ return 0
+
+ if(istype(O,/obj/item/stack/material))
+ if(O.get_material_name() == MAT_PLASTIC)
+ var/obj/item/stack/S = O
+ var/input_amount = tgui_input_number(user, "How many sheets would you like to add?", "Add plastic", 0, S.get_amount(), 0, 0, TRUE)
+ if(input_amount == 0)
+ return
+ var/plastic_input = input_amount * stack_value
+ var/free_space = max_plastic - src.plastic_amount
+ if(plastic_input > free_space)
+ to_chat(user, SPAN_WARNING("Storage is full! There is only [free_space] units worth of space left!"))
+ else
+ S.use(input_amount)
+ src.plastic_amount = plastic_input
+ update_icon()
+
+/obj/machinery/injector_maker/AltClick(mob/user)
+ . = ..()
+ if(beaker)
+ if(!user.incapacitated() && Adjacent(user))
+ user.put_in_hands(beaker)
+ else
+ beaker.forceMove(drop_location())
+ beaker = null
+ update_icon()
+
+/obj/machinery/injector_maker/examine(mob/user)
+ . = ..()
+ if(!in_range(user, src) && !issilicon(user) && !isobserver(user))
+ . += "You're too far away to examine [src]'s contents and display!"
+ return
+
+ if(beaker)
+ . += "\The [src] contains:"
+ if(beaker)
+ . += "- \A [beaker]."
+
+ . += "\The [src] contains [plastic_amount] units of plastic.\n It can hold up to [max_plastic] units! 1 sheet gives [stack_value] units."
+
+ if(!(stat & (NOPOWER|BROKEN)))
+ . += "The status display reads:\n"
+ if(beaker)
+ for(var/datum/reagent/R in beaker.reagents.reagent_list)
+ . += "- [R.volume] units of [R.name]."
+
+/obj/machinery/injector_maker/attack_hand(mob/user as mob)
+ interact(user)
+
+/obj/machinery/injector_maker/interact(mob/user as mob)
+ if(user.incapacitated() || !beaker)
+ return
+
+ var/choice = tgui_input_list(user, "There is [plastic_amount] units of plastic left", "Choose what to do", list("large injector", "small injector", "eject", "cancel"))
+
+ switch(choice)
+ if("cancel")
+ return
+ if("eject")
+ if(!user.incapacitated() && Adjacent(user))
+ user.put_in_hands(beaker)
+ else
+ beaker.forceMove(drop_location())
+ beaker = null
+ update_icon()
+ if("small injector")
+ if(!beaker.reagents.total_volume)
+ to_chat(user, SPAN_WARNING("Chemical storage is empty!"))
+ return
+ if(!plastic_amount)
+ to_chat(user, SPAN_WARNING("No plastic in storage! Add at least 1 sheet of plastic."))
+ return
+ var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE)
+ if(injector_amount > 0)
+ var/plastic_needed = injector_amount * plastic_cost_small
+ if(src.plastic_amount < plastic_needed )
+ to_chat(user, SPAN_WARNING("Not enough plastic! You only have enough plastic for [src.plastic_amount / plastic_cost_small] small injectors!"))
+ return
+ var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0)
+ make_injector("large injector", injector_amount, name)
+ update_icon()
+ if("large injector")
+ if(!beaker.reagents.total_volume)
+ to_chat(user, SPAN_WARNING("Chemical storage is empty!"))
+ return
+ if(!plastic_amount)
+ to_chat(user, SPAN_WARNING("No plastic in storage! Add at least 1 sheet of plastic."))
+ return
+ var/injector_amount = tgui_input_number(user, "How many injectors would you like?", "Make small injectors", 0, 100, 0, 0, TRUE)
+ if(injector_amount > 0)
+ var/plastic_needed = injector_amount * plastic_cost_small
+ if(src.plastic_amount < plastic_needed)
+ to_chat(user, SPAN_WARNING("Not enough plastic! You only have enough plastic for [src.plastic_amount / plastic_cost_large] large injectors!"))
+ return
+ var/name = sanitize(tgui_input_text(user, "Name Injector", "Naming", null, 32, 0, 0, 0, 0),MAX_MESSAGE_LEN,0,0,0)
+ make_injector("large injector", injector_amount, name)
+ update_icon()
+
+/obj/machinery/injector_maker/proc/make_injector(var/size, var/amount, var/new_name)
+ if(!beaker)
+ return
+ for(var/i, i <= amount, i++)
+ switch(size)
+ if("small injector")
+ to_world("Making [size], checking if we got enough.")
+ var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15)
+ if(!amount_per_injector || (plastic_cost_small > src.plastic_amount))
+ return
+ to_world("Enough")
+ var/obj/item/weapon/reagent_containers/hypospray/autoinjector/empty/P = new(loc)
+ beaker.reagents.trans_to_obj(P, amount_per_injector)
+ P.update_icon()
+ if(new_name)
+ P.name = new_name
+ src.plastic_amount = src.plastic_amount - plastic_cost_small
+
+ if("large injector")
+ var/amount_per_injector = CLAMP(beaker.reagents.total_volume / amount, 0, 15)
+ if(!amount_per_injector || (plastic_cost_large > src.plastic_amount))
+ return
+ var/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/empty/P = new(loc)
+ beaker.reagents.trans_to_obj(P, amount_per_injector)
+ P.update_icon()
+ if(new_name)
+ P.name = new_name
+ src.plastic_amount = src.plastic_amount - plastic_cost_large
diff --git a/icons/obj/chemical_vr.dmi b/icons/obj/chemical_vr.dmi
index a08a052c90..224dbe1867 100644
Binary files a/icons/obj/chemical_vr.dmi and b/icons/obj/chemical_vr.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 507ac515b8..53dbec9aa5 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3680,6 +3680,7 @@
#include "code\modules\reagents\machinery\chemalyzer.dm"
#include "code\modules\reagents\machinery\distillery.dm"
#include "code\modules\reagents\machinery\grinder.dm"
+#include "code\modules\reagents\machinery\injector_maker.dm"
#include "code\modules\reagents\machinery\pump.dm"
#include "code\modules\reagents\machinery\dispenser\_defines.dm"
#include "code\modules\reagents\machinery\dispenser\cartridge.dm"