diff --git a/code/modules/client/stored_item.dm b/code/modules/client/stored_item.dm
new file mode 100644
index 0000000000..0553dc8dd1
--- /dev/null
+++ b/code/modules/client/stored_item.dm
@@ -0,0 +1,217 @@
+/obj/machinery/item_bank
+ name = "electronic lockbox"
+ desc = "A place to store things you might want later!"
+ icon = 'icons/obj/stationobjs_vr.dmi'
+ icon_state = "item_bank"
+ idle_power_usage = 1
+ active_power_usage = 5
+ anchored = TRUE
+ density = FALSE
+ var/busy_bank = FALSE
+ var/static/list/item_takers = list()
+
+/obj/machinery/item_bank/proc/persist_item_savefile_path(mob/user)
+ return "data/player_saves/[copytext(user.ckey, 1, 2)]/[user.ckey]/persist_item.sav"
+
+/obj/machinery/item_bank/proc/persist_item_savefile_save(mob/user, obj/item/O)
+ if(IsGuestKey(user.key))
+ return 0
+
+ var/savefile/F = new /savefile(src.persist_item_savefile_path(user))
+
+ F["persist item"] << O.type
+ F["persist name"] << initial(O.name)
+
+ return 1
+
+// loads the savefile corresponding to the mob's ckey
+// if silent=true, report incompatible savefiles
+// returns 1 if loaded (or file was incompatible)
+// returns 0 if savefile did not exist
+
+/obj/machinery/item_bank/proc/persist_item_savefile_load(mob/user, thing)
+ if (IsGuestKey(user.key))
+ return 0
+
+ var/path = src.persist_item_savefile_path(user)
+
+ if (!fexists(path))
+ return 0
+
+ var/savefile/F = new /savefile(path)
+
+ if(!F) return 0
+
+ var/persist_item
+ F["persist item"] >> persist_item
+
+ if (isnull(persist_item) || !ispath(persist_item))
+ fdel(path)
+ tgui_alert_async(user, "An item could not be retrieved.")
+ return 0
+ if(thing == "type")
+ return persist_item
+ if(thing == "name")
+ var/persist_name
+ F["persist name"] >> persist_name
+ return persist_name
+
+
+/obj/machinery/item_bank/Initialize()
+ . = ..()
+
+/obj/machinery/item_bank/attack_hand(mob/living/user)
+ . = ..()
+ if(!ishuman(user))
+ return
+ if(istype(user) && Adjacent(user))
+ if(inoperable() || panel_open)
+ to_chat(user, "\The [src] seems to be nonfunctional...")
+ else
+ start_using(user)
+
+/obj/machinery/item_bank/proc/start_using(mob/living/user)
+ if(!ishuman(user))
+ return
+ if(busy_bank)
+ to_chat(user, "\The [src] is already in use.")
+ return
+ if(user.ckey in item_takers)
+ to_chat(user, "You have already taken something out of \the [src] this shift.")
+ return
+ busy_bank = TRUE
+ var/I = persist_item_savefile_load(user, "type")
+ var/Iname = persist_item_savefile_load(user, "name")
+ var/choice = tgui_alert(user, "What would you like to do [src]?", "[src]", list("Check contents", "Retrieve item", "Info", "Cancel"), timeout = 10 SECONDS)
+ if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
+ busy_bank = FALSE
+ return
+ else if(choice == "Check contents" && I)
+ to_chat(user, "\The [src] has \the [Iname] for you!")
+ busy_bank = FALSE
+ else if(choice == "Retrieve item" && I)
+ if(user.hands_are_full())
+ to_chat(user,"Your hands are full!")
+ busy_bank = FALSE
+ return
+ choice = tgui_alert(user, "If you remove this item from the bank, it will be unable to be stored again. Do you still want to remove it?", "[src]", list("No", "Yes"), timeout = 10 SECONDS)
+ icon_state = "item_bank_o"
+ if(!choice || choice == "Cancel" || !Adjacent(user) || inoperable() || panel_open)
+ busy_bank = FALSE
+ icon_state = "item_bank"
+ return
+ else if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
+ busy_bank = FALSE
+ icon_state = "item_bank"
+ return
+ var/obj/N = new I(get_turf(src))
+ visible_message("\The [src] dispenses the [N] to \the [user].")
+ user.put_in_hands(N)
+ N.persist_storable = FALSE
+ var/path = src.persist_item_savefile_path(user)
+ var/savefile/F = new /savefile(src.persist_item_savefile_path(user))
+ F["persist item"] << null
+ F["persist name"] << null
+ fdel(path)
+ item_takers += user.ckey
+ busy_bank = FALSE
+ icon_state = "item_bank"
+ else if(choice == "Info")
+ to_chat(user, "\The [src] can store a single item for you between shifts! Anything that has been retrieved from the bank cannot be stored again in the same shift. Anyone can withdraw from the bank one time per shift. Some items are not able to be accepted by the bank.")
+ busy_bank = FALSE
+ return
+ else if(!I)
+ to_chat(user, "\The [src] doesn't seem to have anything for you...")
+ busy_bank = FALSE
+
+/obj/machinery/item_bank/attackby(obj/item/O, mob/living/user)
+ if(!ishuman(user))
+ return
+ if(busy_bank)
+ to_chat(user, "\The [src] is already in use.")
+ return
+ busy_bank = TRUE
+ if(!istool(O) && O.persist_storable)
+ user.visible_message("\The [user] begins storing \the [O] in \the [src].","You begin storing \the [O] in \the [src].")
+ icon_state = "item_bank_o"
+ if(!do_after(user, 10 SECONDS, src, exclusive = TASK_ALL_EXCLUSIVE) || inoperable())
+ busy_bank = FALSE
+ icon_state = "item_bank"
+ return
+ src.persist_item_savefile_save(user, O)
+ user.visible_message("\The [user] stores \the [O] in \the [src].","You stored \the [O] in \the [src].")
+ log_admin("[key_name_admin(user)] stored [O] in the item bank.")
+ qdel(O)
+ busy_bank = FALSE
+ icon_state = "item_bank"
+ else
+ to_chat(user, "You cannot store \the [O]. \The [src] either does not accept that, or it has already been retrieved from storage this shift.")
+ busy_bank = FALSE
+
+/////STORABLE ITEMS AND ALL THAT JAZZ/////
+//I am only really intending this to be used for single items. Mostly stuff you got right now, but can't/don't want to use right now.
+//It is not at all intended to be a thing that just lets you hold on to stuff forever, but just until it's the right time to use it.
+
+/obj
+
+ var/persist_storable = TRUE //If this is true, this item can be stored in the item bank.
+ //This is automatically set to false when an item is removed from storage
+
+/////LIST OF STUFF WE DON'T WANT PEOPLE STORING/////
+
+/obj/item/device/pda
+ persist_storable = FALSE
+/obj/item/device/communicator
+ persist_storable = FALSE
+/obj/item/weapon/card
+ persist_storable = FALSE
+/obj/item/weapon/holder
+ persist_storable = FALSE
+/obj/item/device/radio
+ persist_storable = FALSE
+/obj/item/device/encryptionkey
+ persist_storable = FALSE
+/obj/item/weapon/storage //There are lots of things that have stuff that we may not want people to just have. And this is mostly intended for a single thing.
+ persist_storable = FALSE //And it would be annoying to go through and consider all of them, so default to disabled.
+/obj/item/weapon/storage/backpack //But we can enable some where it makes sense. Backpacks and their variants basically never start with anything in them, as an example.
+ persist_storable = TRUE
+/obj/item/weapon/reagent_containers/hypospray/vial
+ persist_storable = FALSE
+/obj/item/weapon/cmo_disk_holder
+ persist_storable = FALSE
+/obj/item/device/defib_kit/compact/combat
+ persist_storable = FALSE
+/obj/item/clothing/glasses/welding/superior
+ persist_storable = FALSE
+/obj/item/clothing/shoes/magboots/adv
+ persist_storable = FALSE
+/obj/item/weapon/rig
+ persist_storable = FALSE
+/obj/item/clothing/head/helmet/space/void
+ persist_storable = FALSE
+/obj/item/clothing/suit/space/void
+ persist_storable = FALSE
+/obj/item/weapon/grab
+ persist_storable = FALSE
+/obj/item/weapon/grenade
+ persist_storable = FALSE
+/obj/item/weapon/hand_tele
+ persist_storable = FALSE
+/obj/item/weapon/paper/dockingcodes
+ persist_storable = FALSE
+/obj/item/weapon/backup_implanter
+ persist_storable = FALSE
+/obj/item/weapon/disk/nuclear
+ persist_storable = FALSE
+/obj/item/weapon/gun/energy/locked //These are guns with security measures on them, so let's say the box won't let you put them in there.
+ persist_storable = FALSE //(otherwise explo will just put their locker/vendor guns into it every round)
+/obj/item/device/retail_scanner
+ persist_storable = FALSE
+/obj/item/weapon/telecube
+ persist_storable = FALSE
+/obj/item/weapon/reagent_containers/glass/bottle/adminordrazine
+ persist_storable = FALSE
+/obj/item/weapon/gun/energy/sizegun/admin
+ persist_storable = FALSE
+/obj/item/weapon/gun/energy/sizegun/abductor
+ persist_storable = FALSE
diff --git a/icons/obj/stationobjs_vr.dmi b/icons/obj/stationobjs_vr.dmi
index e3c9c446ac..aa6df06395 100644
Binary files a/icons/obj/stationobjs_vr.dmi and b/icons/obj/stationobjs_vr.dmi differ
diff --git a/maps/stellardelight/stellar_delight1.dmm b/maps/stellardelight/stellar_delight1.dmm
index 4e3ba7a5ff..5be491d41c 100644
--- a/maps/stellardelight/stellar_delight1.dmm
+++ b/maps/stellardelight/stellar_delight1.dmm
@@ -10108,6 +10108,16 @@
/obj/item/weapon/pen,
/turf/simulated/floor/tiled/dark,
/area/security/security_processing)
+"vt" = (
+/obj/structure/disposalpipe/segment,
+/obj/machinery/atmospherics/pipe/simple/hidden/supply,
+/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,
+/obj/machinery/item_bank{
+ dir = 4;
+ pixel_x = -29
+ },
+/turf/simulated/floor/tiled/techmaint,
+/area/stellardelight/deck1/starboard)
"vu" = (
/turf/simulated/wall/bay/r_wall/brown,
/area/stellardelight/deck1/dorms/dorm5)
@@ -35808,7 +35818,7 @@ Sj
Jb
Sj
mS
-Sj
+vt
Sj
Sj
pg
diff --git a/maps/stellardelight/stellar_delight2.dmm b/maps/stellardelight/stellar_delight2.dmm
index 4a76d1c62d..40257a3a9a 100644
--- a/maps/stellardelight/stellar_delight2.dmm
+++ b/maps/stellardelight/stellar_delight2.dmm
@@ -14024,6 +14024,9 @@
dir = 4
},
/obj/machinery/vending/nifsoft_shop,
+/obj/machinery/item_bank{
+ pixel_y = 28
+ },
/turf/simulated/floor/tiled,
/area/stellardelight/deck2/fore)
"FB" = (
diff --git a/maps/stellardelight/stellar_delight3.dmm b/maps/stellardelight/stellar_delight3.dmm
index 7c63099c4b..9688aec1ba 100644
--- a/maps/stellardelight/stellar_delight3.dmm
+++ b/maps/stellardelight/stellar_delight3.dmm
@@ -3655,12 +3655,13 @@
/turf/simulated/floor/carpet,
/area/crew_quarters/heads/hos)
"nL" = (
-/obj/structure/sign/poster{
- dir = 8
- },
/obj/effect/floor_decal/steeldecal/steel_decals5{
dir = 8
},
+/obj/machinery/item_bank{
+ dir = 4;
+ pixel_x = -26
+ },
/turf/simulated/floor/tiled,
/area/stellardelight/deck3/aft)
"nM" = (
diff --git a/vorestation.dme b/vorestation.dme
index fafd0417d9..178281d16a 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -1866,6 +1866,7 @@
#include "code\modules\client\preferences_toggle_procs.dm"
#include "code\modules\client\preferences_vr.dm"
#include "code\modules\client\spam_prevention.dm"
+#include "code\modules\client\stored_item.dm"
#include "code\modules\client\ui_style.dm"
#include "code\modules\client\preference_setup\_defines.dm"
#include "code\modules\client\preference_setup\preference_setup.dm"