diff --git a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm
index f8ab474c359..658c1acd35e 100644
--- a/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm
+++ b/code/datums/greyscale/config_types/greyscale_configs/greyscale_clothes.dm
@@ -743,6 +743,46 @@
name = "H.E.C.K. Helmet (Worn)"
icon_file = 'icons/mob/clothing/head/helmet.dmi'
+/datum/greyscale_config/hoodie_pullover
+ name = "Pullover Hoodie"
+ icon_file = 'icons/obj/clothing/suits/wintercoat.dmi'
+ json_config = 'code/datums/greyscale/json_configs/pullover.json'
+
+/datum/greyscale_config/hoodie_pullover/worn
+ name = "Pullover Hoodie (Worn)"
+ icon_file = 'icons/mob/clothing/suits/wintercoat.dmi'
+ json_config = 'code/datums/greyscale/json_configs/pullover_worn.json'
+
+/datum/greyscale_config/hoodie_pullover_hood
+ name = "Pullover Hood"
+ icon_file = 'icons/obj/clothing/head/winterhood.dmi'
+ json_config = 'code/datums/greyscale/json_configs/pullover_hood.json'
+
+/datum/greyscale_config/hoodie_pullover_hood/worn
+ name = "Pullover Hood (Worn)"
+ icon_file = 'icons/mob/clothing/head/winterhood.dmi'
+ json_config = 'code/datums/greyscale/json_configs/pullover_hood_worn.json'
+
+/datum/greyscale_config/hoodie_zipup
+ name = "Zipup Hoodie"
+ icon_file = 'icons/obj/clothing/suits/wintercoat.dmi'
+ json_config = 'code/datums/greyscale/json_configs/zipup.json'
+
+/datum/greyscale_config/hoodie_zipup/worn
+ name = "Zipup Hoodie (Worn)"
+ icon_file = 'icons/mob/clothing/suits/wintercoat.dmi'
+ json_config = 'code/datums/greyscale/json_configs/zipup_worn.json'
+
+/datum/greyscale_config/hoodie_zipup_hood
+ name = "Zipup Hood"
+ icon_file = 'icons/obj/clothing/head/winterhood.dmi'
+ json_config = 'code/datums/greyscale/json_configs/zipup_hood.json'
+
+/datum/greyscale_config/hoodie_zipup_hood/worn
+ name = "Zipup Hood (Worn)"
+ icon_file = 'icons/mob/clothing/head/winterhood.dmi'
+ json_config = 'code/datums/greyscale/json_configs/zipup_hood_worn.json'
+
//
// COSTUMES
// (It's better these stay paired together)
diff --git a/code/datums/greyscale/json_configs/pullover.json b/code/datums/greyscale/json_configs/pullover.json
new file mode 100644
index 00000000000..d03672af5c5
--- /dev/null
+++ b/code/datums/greyscale/json_configs/pullover.json
@@ -0,0 +1,18 @@
+{
+ "pullover": [
+ {
+ "type": "icon_state",
+ "icon_state": "pullover",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
+ "pullover_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "pullover_t",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/pullover_hood.json b/code/datums/greyscale/json_configs/pullover_hood.json
new file mode 100644
index 00000000000..8b3b4acd05a
--- /dev/null
+++ b/code/datums/greyscale/json_configs/pullover_hood.json
@@ -0,0 +1,10 @@
+{
+ "hood_pullover": [
+ {
+ "type": "icon_state",
+ "icon_state": "hood_pullover",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/pullover_hood_worn.json b/code/datums/greyscale/json_configs/pullover_hood_worn.json
new file mode 100644
index 00000000000..8b3b4acd05a
--- /dev/null
+++ b/code/datums/greyscale/json_configs/pullover_hood_worn.json
@@ -0,0 +1,10 @@
+{
+ "hood_pullover": [
+ {
+ "type": "icon_state",
+ "icon_state": "hood_pullover",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/pullover_worn.json b/code/datums/greyscale/json_configs/pullover_worn.json
new file mode 100644
index 00000000000..ff404d2538d
--- /dev/null
+++ b/code/datums/greyscale/json_configs/pullover_worn.json
@@ -0,0 +1,24 @@
+{
+ "pullover": [
+ {
+ "type": "icon_state",
+ "icon_state": "pullover",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ },
+ {
+ "type": "icon_state",
+ "icon_state": "pullover_hood",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
+ "pullover_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "pullover_t",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/zipup.json b/code/datums/greyscale/json_configs/zipup.json
new file mode 100644
index 00000000000..5d847ee13f5
--- /dev/null
+++ b/code/datums/greyscale/json_configs/zipup.json
@@ -0,0 +1,18 @@
+{
+ "zipup": [
+ {
+ "type": "icon_state",
+ "icon_state": "zipup",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
+ "zipup_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "zipup_t",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/zipup_hood.json b/code/datums/greyscale/json_configs/zipup_hood.json
new file mode 100644
index 00000000000..428b41471ae
--- /dev/null
+++ b/code/datums/greyscale/json_configs/zipup_hood.json
@@ -0,0 +1,10 @@
+{
+ "hood_zipup": [
+ {
+ "type": "icon_state",
+ "icon_state": "hood_zipup",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/zipup_hood_worn.json b/code/datums/greyscale/json_configs/zipup_hood_worn.json
new file mode 100644
index 00000000000..6bb6644f999
--- /dev/null
+++ b/code/datums/greyscale/json_configs/zipup_hood_worn.json
@@ -0,0 +1,18 @@
+{
+ "hood_zipup": [
+ {
+ "type": "icon_state",
+ "icon_state": "hood_zipup",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
+ "hood_zipup_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "hood_zipup_t",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/greyscale/json_configs/zipup_worn.json b/code/datums/greyscale/json_configs/zipup_worn.json
new file mode 100644
index 00000000000..cdcf0e2e986
--- /dev/null
+++ b/code/datums/greyscale/json_configs/zipup_worn.json
@@ -0,0 +1,34 @@
+{
+ "zipup": [
+ {
+ "type": "icon_state",
+ "icon_state": "zipup",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
+ "zipup_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "zipup_t",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
+ "zipup_hood": [
+ {
+ "type": "icon_state",
+ "icon_state": "zipup_hood",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ],
+ "zipup_hood_t": [
+ {
+ "type": "icon_state",
+ "icon_state": "zipup_hood_t",
+ "blend_mode": "overlay",
+ "color_ids": [1]
+ }
+ ]
+}
diff --git a/code/datums/sprite_accessories.dm b/code/datums/sprite_accessories.dm
index 02ef3786598..96c300d0eb6 100644
--- a/code/datums/sprite_accessories.dm
+++ b/code/datums/sprite_accessories.dm
@@ -75,6 +75,10 @@
icon_state = "hide_winterhood"
strict_coverage_zones = HAIR_APPENDAGE_TOP | HAIR_APPENDAGE_LEFT | HAIR_APPENDAGE_RIGHT | HAIR_APPENDAGE_REAR | HAIR_APPENDAGE_HANGING_REAR
+/datum/hair_mask/hoodie
+ icon_state = "hide_hoodie"
+ strict_coverage_zones = HAIR_APPENDAGE_TOP | HAIR_APPENDAGE_LEFT | HAIR_APPENDAGE_RIGHT | HAIR_APPENDAGE_REAR | HAIR_APPENDAGE_HANGING_REAR
+
//////////////////////
// Hair Definitions //
//////////////////////
diff --git a/code/modules/clothing/suits/wintercoats.dm b/code/modules/clothing/suits/wintercoats.dm
index 7a9640f5900..84121104e93 100644
--- a/code/modules/clothing/suits/wintercoats.dm
+++ b/code/modules/clothing/suits/wintercoats.dm
@@ -14,6 +14,8 @@
hood_down_overlay_suffix = "_hood"
/// How snug are we?
var/zipped = FALSE
+ /// Whether alt-clicking this coat zips/unzips it
+ var/can_altclick_zip = TRUE
/datum/armor/hooded_wintercoat
bio = 10
@@ -43,11 +45,13 @@
/obj/item/clothing/suit/hooded/wintercoat/examine(mob/user)
. = ..()
-
- . += span_notice("Alt-click to [zipped ? "un" : ""]zip.")
+ if(can_altclick_zip)
+ . += span_notice("Alt-click to [zipped ? "un" : ""]zip.")
/obj/item/clothing/suit/hooded/wintercoat/click_alt(mob/user)
+ if(!can_altclick_zip)
+ return CLICK_ACTION_BLOCKING
zipped = !zipped
playsound(src, 'sound/items/zip/zip_up.ogg', 30, TRUE, -3)
worn_icon_state = "[initial(post_init_icon_state) || initial(icon_state)][zipped ? "_t" : ""]"
@@ -694,3 +698,96 @@
desc = "A heavy jacket hood made from 'synthetic' animal furs, with custom colors."
greyscale_config = /datum/greyscale_config/winter_hoods
greyscale_config_worn = /datum/greyscale_config/winter_hoods/worn
+ flags_1 = NO_NEW_GAGS_PREVIEW_1
+
+/obj/item/clothing/suit/hooded/wintercoat/pullover
+ name = "pullover"
+ desc = "A colorable pullover hoodie."
+ icon = 'icons/map_icons/clothing/suit/_suit.dmi'
+ icon_state = "/obj/item/clothing/suit/hooded/wintercoat/pullover"
+ post_init_icon_state = "pullover"
+ greyscale_config = /datum/greyscale_config/hoodie_pullover
+ greyscale_config_worn = /datum/greyscale_config/hoodie_pullover/worn
+ greyscale_colors = "#5f5f5f"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/pullover
+ flags_1 = IS_PLAYER_COLORABLE_1
+ hood_down_overlay_suffix = ""
+ hood_up_affix = "_t"
+ can_altclick_zip = FALSE
+
+/obj/item/clothing/suit/hooded/wintercoat/pullover/on_hood_up(obj/item/clothing/head/hooded/hood)
+ return
+
+/obj/item/clothing/suit/hooded/wintercoat/pullover/on_hood_down(obj/item/clothing/head/hooded/hood)
+ return
+
+/obj/item/clothing/head/hooded/winterhood/pullover
+ name = "pullover hood"
+ desc = "A colorable pullover hoodie."
+ icon_state = "hood_pullover"
+ worn_icon_state = "hood_pullover"
+ hair_mask = /datum/hair_mask/hoodie
+ greyscale_config = /datum/greyscale_config/hoodie_pullover_hood
+ greyscale_config_worn = /datum/greyscale_config/hoodie_pullover_hood/worn
+ greyscale_colors = "#5f5f5f"
+ flags_1 = NO_NEW_GAGS_PREVIEW_1
+
+/obj/item/clothing/suit/hooded/wintercoat/pullover/set_greyscale(list/colors, new_config, new_worn_config, new_inhand_left, new_inhand_right)
+ . = ..()
+ if(!hood)
+ return
+ var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors)
+ hood.set_greyscale(coat_colors)
+ hood.update_slot_icon()
+
+/obj/item/clothing/suit/hooded/wintercoat/pullover/on_hood_created(obj/item/clothing/head/hooded/hood)
+ . = ..()
+ var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors)
+ hood.set_greyscale(coat_colors)
+
+/obj/item/clothing/suit/hooded/wintercoat/zipup
+ name = "zipup"
+ desc = "A colorable zipup hoodie."
+ icon = 'icons/map_icons/clothing/suit/_suit.dmi'
+ icon_state = "/obj/item/clothing/suit/hooded/wintercoat/zipup"
+ post_init_icon_state = "zipup"
+ greyscale_config = /datum/greyscale_config/hoodie_zipup
+ greyscale_config_worn = /datum/greyscale_config/hoodie_zipup/worn
+ greyscale_colors = "#5f5f5f"
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/zipup
+ flags_1 = IS_PLAYER_COLORABLE_1
+ hood_down_overlay_suffix = ""
+ hood_up_affix = "_t"
+
+/obj/item/clothing/suit/hooded/wintercoat/zipup/worn_overlays(mutable_appearance/standing, isinhands, icon_file)
+ . = ..()
+ if(isinhands || (hood && hood.loc != src))
+ return
+
+ var/suffix = (zipped ? "hood_t" : "hood")
+ var/state = "[initial(post_init_icon_state) || initial(icon_state)]_[suffix]"
+ . += mutable_appearance(icon_file, state, -SUIT_LAYER)
+
+/obj/item/clothing/head/hooded/winterhood/zipup
+ name = "zipup hood"
+ desc = "A colorable zipup hoodie."
+ icon_state = "hood_zipup"
+ worn_icon_state = "hood_zipup"
+ hair_mask = /datum/hair_mask/hoodie
+ greyscale_config = /datum/greyscale_config/hoodie_zipup_hood
+ greyscale_config_worn = /datum/greyscale_config/hoodie_zipup_hood/worn
+ greyscale_colors = "#5f5f5f"
+ flags_1 = NO_NEW_GAGS_PREVIEW_1
+
+/obj/item/clothing/suit/hooded/wintercoat/zipup/set_greyscale(list/colors, new_config, new_worn_config, new_inhand_left, new_inhand_right)
+ . = ..()
+ if(!hood)
+ return
+ var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors)
+ hood.set_greyscale(coat_colors)
+ hood.update_slot_icon()
+
+/obj/item/clothing/suit/hooded/wintercoat/zipup/on_hood_created(obj/item/clothing/head/hooded/hood)
+ . = ..()
+ var/list/coat_colors = SSgreyscale.ParseColorString(greyscale_colors)
+ hood.set_greyscale(coat_colors)
diff --git a/code/modules/loadout/categories/suits.dm b/code/modules/loadout/categories/suits.dm
index 0637671de37..c830aff2a12 100644
--- a/code/modules/loadout/categories/suits.dm
+++ b/code/modules/loadout/categories/suits.dm
@@ -40,3 +40,11 @@
/datum/job/paramedic = "#28324b",
/datum/job/prisoner = "#ff8b00",
)
+
+/datum/loadout_item/suit/hoodie_pullover
+ name = "pullover"
+ item_path = /obj/item/clothing/suit/hooded/wintercoat/pullover
+
+/datum/loadout_item/suit/hoodie_zipup
+ name = "zipup"
+ item_path = /obj/item/clothing/suit/hooded/wintercoat/zipup
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index f5669329cfd..18a673a61c2 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -102,6 +102,8 @@
/obj/item/clothing/suit/jacket/oversized = 4,
/obj/item/clothing/suit/jacket/fancy = 4,
/obj/item/clothing/suit/toggle/lawyer/greyscale = 4,
+ /obj/item/clothing/suit/hooded/wintercoat/pullover = 3,
+ /obj/item/clothing/suit/hooded/wintercoat/zipup = 3,
/obj/item/clothing/suit/hooded/wintercoat/custom = 3,
/obj/item/clothing/suit/hooded/wintercoat = 3,
/obj/item/clothing/under/suit/navy = 3,
diff --git a/icons/map_icons/clothing/suit/_suit.dmi b/icons/map_icons/clothing/suit/_suit.dmi
index 82feabad49e..cdbb28e990c 100644
Binary files a/icons/map_icons/clothing/suit/_suit.dmi and b/icons/map_icons/clothing/suit/_suit.dmi differ
diff --git a/icons/mob/clothing/head/winterhood.dmi b/icons/mob/clothing/head/winterhood.dmi
index 3b28fe1c0a5..64ab5132c8e 100644
Binary files a/icons/mob/clothing/head/winterhood.dmi and b/icons/mob/clothing/head/winterhood.dmi differ
diff --git a/icons/mob/clothing/suits/wintercoat.dmi b/icons/mob/clothing/suits/wintercoat.dmi
index ee3e3046d28..8a0a06fe06e 100644
Binary files a/icons/mob/clothing/suits/wintercoat.dmi and b/icons/mob/clothing/suits/wintercoat.dmi differ
diff --git a/icons/mob/human/hair_masks.dmi b/icons/mob/human/hair_masks.dmi
index dd54ce1e886..703c791cb2b 100644
Binary files a/icons/mob/human/hair_masks.dmi and b/icons/mob/human/hair_masks.dmi differ
diff --git a/icons/obj/clothing/head/winterhood.dmi b/icons/obj/clothing/head/winterhood.dmi
index 1ad9f6eca01..35e56fd3c0b 100644
Binary files a/icons/obj/clothing/head/winterhood.dmi and b/icons/obj/clothing/head/winterhood.dmi differ
diff --git a/icons/obj/clothing/suits/wintercoat.dmi b/icons/obj/clothing/suits/wintercoat.dmi
index 3f8e1bc3835..1e53f07dcfd 100644
Binary files a/icons/obj/clothing/suits/wintercoat.dmi and b/icons/obj/clothing/suits/wintercoat.dmi differ