diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 4d41a591b9c..e62e54a3a78 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -396,9 +396,7 @@ Class Procs:
/obj/machinery/proc/default_deconstruction_crowbar(var/obj/item/weapon/crowbar/C, var/ignore_panel = 0)
if(istype(C) && (panel_open || ignore_panel))
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
- var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
- M.state = 2
- M.icon_state = "box_1"
+ spawn_frame()
for(var/obj/item/I in component_parts)
if(I.reliability != 100 && crit_fail)
I.crit_fail = 1
@@ -407,6 +405,12 @@ Class Procs:
return 1
return 0
+
+/obj/machinery/proc/spawn_frame()
+ var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc)
+ M.state = 2
+ M.icon_state = "box_1"
+
/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S)
if(istype(S))
playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index dfc16949222..9a1bec9ecbb 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -145,6 +145,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list(
new /datum/stack_recipe("wooden chair", /obj/structure/stool/bed/chair/wood/normal, 3, time = 10, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("wooden barricade", /obj/structure/barricade/wooden, 5, time = 50, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("bookcase", /obj/structure/bookcase, 5, time = 50, one_per_turf = 1, on_floor = 1),
+ new /datum/stack_recipe("drying rack", /obj/machinery/smartfridge/drying_rack, 10, time = 15, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("rifle stock", /obj/item/weaponcrafting/stock, 10, time = 40),
new /datum/stack_recipe("wooden door", /obj/structure/mineral_door/wood, 10, time = 20, one_per_turf = 1, on_floor = 1),
new /datum/stack_recipe("coffin", /obj/structure/closet/coffin, 5, time = 15, one_per_turf = 1, on_floor = 1),
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 60bce3b0724..aafc4fd3648 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -898,6 +898,12 @@
junkiness = 25
list_reagents = list("protein" = 1, "sugar" = 3)
+/obj/item/weapon/reagent_containers/food/snacks/sosjerky/healthy
+ name = "homemade beef jerky"
+ desc = "Homemade beef jerky made from the finest space cows."
+ list_reagents = list("nutriment" = 3, "vitamin" = 1)
+ junkiness = 0
+
/obj/item/weapon/reagent_containers/food/snacks/pistachios
name = "Pistachios"
icon_state = "pistachios"
@@ -916,6 +922,12 @@
junkiness = 25
list_reagents = list("plantmatter" = 2, "sugar" = 4)
+/obj/item/weapon/reagent_containers/food/snacks/no_raisin/healthy
+ name = "homemade raisins"
+ desc = "homemade raisins, the best in all of spess."
+ list_reagents = list("nutriment" = 3, "vitamin" = 2)
+ junkiness = 0
+
/obj/item/weapon/reagent_containers/food/snacks/spacetwinkie
name = "Space Twinkie"
icon_state = "space_twinkie"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index f31bdbd95fe..b1dd8870d3f 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -402,6 +402,127 @@
visible_message("[src] launches [throw_item.name] at [target.name]!")
return 1
+// ----------------------------
+// Drying Rack 'smartfridge'
+// ----------------------------
+/obj/machinery/smartfridge/drying_rack
+ name = "drying rack"
+ desc = "A wooden contraption, used to dry plant products, food and leather."
+ icon = 'icons/obj/hydroponics/equipment.dmi'
+ icon_state = "drying_rack_on"
+ use_power = 1
+ idle_power_usage = 5
+ active_power_usage = 200
+ icon_on = "drying_rack_on"
+ icon_off = "drying_rack"
+ var/drying = FALSE
+
+/obj/machinery/smartfridge/drying_rack/New()
+ ..()
+ if(component_parts && component_parts.len)
+ component_parts.Cut()
+ component_parts = null
+
+/obj/machinery/smartfridge/drying_rack/Destroy()
+ new /obj/item/stack/sheet/wood(loc, 10)
+ return ..()
+
+/obj/machinery/smartfridge/drying_rack/RefreshParts()
+ return
+
+/obj/machinery/smartfridge/drying_rack/default_deconstruction_screwdriver()
+ return
+
+/obj/machinery/smartfridge/drying_rack/exchange_parts()
+ return
+
+/obj/machinery/smartfridge/drying_rack/spawn_frame()
+ return
+
+/obj/machinery/smartfridge/drying_rack/default_deconstruction_crowbar(obj/item/weapon/crowbar/C, ignore_panel = 1)
+ ..()
+
+/obj/machinery/smartfridge/drying_rack/power_change()
+ if(powered() && anchored)
+ stat &= ~NOPOWER
+ else
+ stat |= NOPOWER
+ toggle_drying(TRUE)
+ update_icon()
+
+/obj/machinery/smartfridge/drying_rack/load() //For updating the filled overlay
+ ..()
+ update_icon()
+
+/obj/machinery/smartfridge/drying_rack/update_icon()
+ ..()
+ overlays.Cut()
+ if(drying)
+ overlays += "drying_rack_drying"
+ if(contents.len)
+ overlays += "drying_rack_filled"
+
+/obj/machinery/smartfridge/drying_rack/process()
+ ..()
+ if(drying)
+ if(rack_dry())//no need to update unless something got dried
+ update_icon()
+
+/obj/machinery/smartfridge/drying_rack/accept_check(obj/item/O)
+ if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/))
+ var/obj/item/weapon/reagent_containers/food/snacks/S = O
+ if(S.dried_type)
+ return TRUE
+ if(istype(O,/obj/item/stack/sheet/wetleather/))
+ return TRUE
+ return FALSE
+
+/obj/machinery/smartfridge/drying_rack/proc/toggle_drying(forceoff)
+ if(drying || forceoff)
+ drying = FALSE
+ use_power = 1
+ else
+ drying = TRUE
+ use_power = 2
+ update_icon()
+
+/obj/machinery/smartfridge/drying_rack/proc/rack_dry()
+ for(var/obj/item/weapon/reagent_containers/food/snacks/S in contents)
+ if(S.dried_type == S.type)//if the dried type is the same as the object's type, don't bother creating a whole new item...
+ S.color = "#ad7257"
+ S.dry = TRUE
+ S.forceMove(get_turf(src))
+ else
+ var/dried = S.dried_type
+ new dried(loc)
+ qdel(S)
+ return TRUE
+ for(var/obj/item/stack/sheet/wetleather/WL in contents)
+ var/obj/item/stack/sheet/leather/L = new(loc)
+ L.amount = WL.amount
+ qdel(WL)
+ return TRUE
+ return FALSE
+
+/obj/machinery/smartfridge/drying_rack/emp_act(severity)
+ ..()
+ atmos_spawn_air(SPAWN_HEAT)
+
+/obj/machinery/smartfridge/drying_rack/verb/adjust_drying()
+ set category = "Object"
+ set name = "Toggle Drying"
+ set src in view(1)
+
+ if(!iscarbon(usr))
+ to_chat(usr, "You can't do that!")
+ return
+
+ if(usr.incapacitated())
+ return
+
+ toggle_drying(FALSE)
+ update_icon()
+
/************************
* Secure SmartFridges
*************************/