diff --git a/code/game/machinery/kitchen/icecream_vat.dm b/code/game/machinery/kitchen/icecream_vat.dm
new file mode 100644
index 00000000000..19092885a6d
--- /dev/null
+++ b/code/game/machinery/kitchen/icecream_vat.dm
@@ -0,0 +1,242 @@
+#define ICECREAM_VANILLA 1
+#define FLAVOUR_CHOCOLATE 2
+#define FLAVOUR_STRAWBERRY 3
+#define FLAVOUR_BLUE 4
+#define CONE_WAFFLE 5
+#define CONE_CHOC 6
+#define INGR_MILK 7
+#define INGR_FLOUR 8
+#define INGR_SUGAR 9
+#define INGR_ICE 10
+#define MUCK 11
+
+var/list/ingredients_source = list(
+"berryjuice" = FLAVOUR_STRAWBERRY,\
+"coco" = FLAVOUR_CHOCOLATE,\
+"singulo" = FLAVOUR_BLUE,\
+"milk" = INGR_MILK,\
+"soymilk" = INGR_MILK,\
+"ice" = INGR_ICE,\
+"flour" = INGR_FLOUR,\
+"sugar" = INGR_SUGAR,\
+)
+
+/proc/get_icecream_flavour_string(var/flavour_type)
+ switch(flavour_type)
+ if(FLAVOUR_CHOCOLATE)
+ return "chocolate"
+ if(FLAVOUR_STRAWBERRY)
+ return "strawberry"
+ if(FLAVOUR_BLUE)
+ return "blue"
+ if(CONE_WAFFLE)
+ return "waffle"
+ if(CONE_CHOC)
+ return "chocolate"
+ if(INGR_MILK)
+ return "milk"
+ if(INGR_FLOUR)
+ return "flour"
+ if(INGR_SUGAR)
+ return "sugar"
+ if(INGR_ICE)
+ return "ice"
+ if(MUCK)
+ return "muck"
+ else
+ return "vanilla"
+
+/obj/machinery/icecream_vat
+ name = "icecream vat"
+ desc = "Ding-aling ding dong. Get your Nanotrasen-approved ice cream!"
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "icecream_vat"
+ density = 1
+ anchored = 0
+ var/list/ingredients = list()
+ var/dispense_flavour = 0
+ var/obj/item/weapon/reagent_containers/glass/held_container
+
+/obj/machinery/icecream_vat/New()
+ ..()
+
+ while(ingredients.len < 11)
+ ingredients.Add(5)
+
+/obj/machinery/icecream_vat/attack_hand(mob/user as mob)
+ user.set_machine(src)
+ interact(user)
+
+/obj/machinery/icecream_vat/interact(mob/user as mob)
+ var/dat
+ dat += "Dispense vanilla icecream There is [ingredients[ICECREAM_VANILLA]] scoops of vanilla icecream left (made from milk and ice).
"
+ dat += "Dispense strawberry icecream There is [ingredients[FLAVOUR_STRAWBERRY]] dollops of strawberry flavouring left (obtained from berry juice.
"
+ dat += "Dispense chocolate icecream There is [ingredients[FLAVOUR_CHOCOLATE]] dollops of chocolate flavouring left (obtained from cocoa powder).
"
+ dat += "Dispense blue icecream There is [ingredients[FLAVOUR_BLUE]] dollops of blue flavouring left (obtained from bluespace tomato singulo).
"
+ dat += "
"
+ dat += "Dispense waffle cones There are [ingredients[CONE_WAFFLE]] waffle cones left.
"
+ dat += "Dispense chocolate cones There are [ingredients[CONE_CHOC]] chocolate cones left.
"
+ dat += "
"
+ dat += "Make waffle cones There is [ingredients[INGR_FLOUR]]/[ingredients[INGR_SUGAR]] of flour and sugar left.
"
+ dat += "Make chocolate cones There is [ingredients[FLAVOUR_CHOCOLATE]]/[ingredients[CONE_WAFFLE]] of chocolate flavouring and waffle cones left.
"
+ dat += "Make vanilla icecream There is [ingredients[INGR_MILK]]/[ingredients[INGR_ICE]] of milk and ice left.
"
+ dat += "
"
+ if(held_container)
+ dat += "Eject [held_container] "
+ else
+ dat += "No beaker inserted. "
+ dat += "Refresh Close"
+ user << browse(dat,"window=icecreamvat;size=600x400")
+
+/obj/machinery/icecream_vat/attackby(var/obj/item/O as obj, var/mob/user as mob)
+ if(istype(O, /obj/item/weapon/reagent_containers))
+ if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/icecream))
+ var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = O
+ if(!I.ice_creamed)
+ if(ingredients[ICECREAM_VANILLA] > 0)
+ var/flavour_name = get_icecream_flavour_string(dispense_flavour)
+ if(ingredients[dispense_flavour] > 0)
+ src.visible_message("\icon[src] [user] scoops delicious [flavour_name] flavoured icecream into [I].")
+ ingredients[dispense_flavour] -= 1
+ ingredients[ICECREAM_VANILLA] -= 1
+
+ I.add_ice_cream(dispense_flavour)
+ if(held_container)
+ held_container.reagents.trans_to(I, 2)
+ else
+ reagents.add_reagent("sugar", 1, 2)
+ else
+ user << "There is not enough [flavour_name] flavouring left! Insert more of the required ingredients."
+ else
+ user << "There is not enough icecream left! Insert more milk and ice."
+ else
+ user << "[O] already has icecream in it."
+ else if(istype(O, /obj/item/weapon/reagent_containers/glass))
+ if(held_container)
+ user << "You must remove [held_container] from [src] first."
+ else
+ user << "You insert [O] into [src]."
+ user.drop_item()
+ O.loc = src
+ held_container = O
+ else
+ var/obj/item/weapon/reagent_containers/R = O
+ if(R.reagents)
+ src.visible_message("[user] has emptied all of [R] into [src].")
+ for (var/datum/reagent/current_reagent in R.reagents.reagent_list)
+ if(ingredients_source[current_reagent.id])
+ add(ingredients_source[current_reagent.id], current_reagent.volume / 2)
+ else
+ add(MUCK, current_reagent.volume / 5)
+ R.reagents.clear_reagents()
+ return 1
+ else
+ ..()
+
+/obj/machinery/icecream_vat/proc/add(var/add_type, var/amount)
+ if(add_type <= ingredients.len)
+ ingredients[add_type] += amount
+ updateDialog()
+
+/obj/machinery/icecream_vat/proc/make(var/mob/user, var/make_type)
+ switch(make_type)
+ if(CONE_WAFFLE)
+ if(ingredients[INGR_FLOUR] > 0 && ingredients[INGR_SUGAR] > 0)
+ var/amount = max( min(ingredients[INGR_FLOUR], ingredients[INGR_SUGAR]), 5)
+ ingredients[INGR_FLOUR] -= amount
+ ingredients[INGR_SUGAR] -= amount
+ ingredients[CONE_WAFFLE] += amount
+ src.visible_message("[user] cooks up some waffle cones.")
+ else
+ user << "You require sugar and flour to make waffle cones."
+ if(CONE_CHOC)
+ if(ingredients[FLAVOUR_CHOCOLATE] > 0 && ingredients[CONE_WAFFLE] > 0)
+ var/amount = min(ingredients[CONE_WAFFLE], ingredients[FLAVOUR_CHOCOLATE])
+ ingredients[CONE_WAFFLE] -= amount
+ ingredients[FLAVOUR_CHOCOLATE] -= amount
+ ingredients[CONE_CHOC] += amount
+ src.visible_message("[user] cooks up some chocolate cones.")
+ else
+ user << "You require waffle cones and chocolate flavouring to make chocolate cones."
+ if(ICECREAM_VANILLA)
+ if(ingredients[INGR_ICE] > 0 && ingredients[INGR_MILK] > 0)
+ var/amount = min(ingredients[INGR_ICE], ingredients[INGR_MILK])
+ ingredients[INGR_ICE] -= amount
+ ingredients[INGR_MILK] -= amount
+ ingredients[ICECREAM_VANILLA] += amount
+ src.visible_message("[user] whips up some vanilla icecream.")
+ else
+ user << "You require milk and ice to make vanilla icecream."
+ updateDialog()
+
+/obj/machinery/icecream_vat/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["dispense"])
+ dispense_flavour = text2num(href_list["dispense"])
+ src.visible_message("\blue[usr] sets [src] to dispense [get_icecream_flavour_string(dispense_flavour)] flavoured icecream.")
+
+ if(href_list["cone"])
+ var/dispense_cone = text2num(href_list["cone"])
+ if(ingredients[dispense_cone] <= ingredients.len)
+ var/cone_name = get_icecream_flavour_string(dispense_cone)
+ if(ingredients[dispense_cone] >= 1)
+ ingredients[dispense_cone] -= 1
+ var/obj/item/weapon/reagent_containers/food/snacks/icecream/I = new(src.loc)
+ I.cone_type = cone_name
+ I.icon_state = "icecream_cone_[cone_name]"
+ I.desc = "Delicious [cone_name] cone, but no ice cream."
+ src.visible_message("[usr] dispenses a crunchy [cone_name] cone from [src].")
+ else
+ usr << "There are no [cone_name] cones left!"
+ updateDialog()
+
+ if(href_list["make"])
+ make( usr, text2num(href_list["make"]) )
+ updateDialog()
+
+ if(href_list["eject"])
+ if(held_container)
+ held_container.loc = src.loc
+ held_container = null
+ updateDialog()
+
+ if(href_list["refresh"])
+ updateDialog()
+
+ if(href_list["close"])
+ usr.unset_machine()
+ usr << browse(null,"window=icecreamvat")
+ return
+
+/obj/item/weapon/reagent_containers/food/snacks/icecream
+ name = "ice cream cone"
+ desc = "Delicious waffle cone, but no ice cream."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "icecream_cone"
+ layer = 3.1
+ var/ice_creamed = 0
+ var/cone_type
+
+/obj/item/weapon/reagent_containers/food/snacks/icecream/New()
+ create_reagents(5)
+ reagents.add_reagent("nutriment", 1, 1)
+
+/obj/item/weapon/reagent_containers/food/snacks/icecream/proc/add_ice_cream(var/flavour)
+ var/flavour_name = get_icecream_flavour_string(flavour)
+ name = "[flavour_name] icecream"
+ src.overlays += "icecream_[flavour_name]"
+ desc = "Delicious [cone_type] cone with a dollop of [flavour_name] ice cream."
+ ice_creamed = 1
+
+#undef ICECREAM_VANILLA
+#undef FLAVOUR_CHOCOLATE
+#undef FLAVOUR_STRAWBERRY
+#undef FLAVOUR_BLUE
+#undef CONE_WAFFLE
+#undef CONE_CHOC
+#undef INGR_MILK
+#undef INGR_FLOUR
+#undef INGR_SUGAR
+#undef INGR_ICE
+#undef MUCK
diff --git a/html/changelog.html b/html/changelog.html
index 01fd7e5b564..88568e4975b 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -52,6 +52,15 @@ should be listed in the changelog upon commit tho. Thanks. -->
+