diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm
index 472b098738e..36ae14fbfb1 100644
--- a/code/datums/components/crafting/recipes.dm
+++ b/code/datums/components/crafting/recipes.dm
@@ -1077,6 +1077,28 @@
)
category = CAT_MISC
+/datum/crafting_recipe/shutters
+ name = "Shutters"
+ reqs = list(/obj/item/stack/sheet/plasteel = 10,
+ /obj/item/stack/cable_coil = 10,
+ /obj/item/electronics/airlock = 1
+ )
+ result = /obj/machinery/door/poddoor/shutters/preopen
+ tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER)
+ time = 15 SECONDS
+ category = CAT_MISC
+
+/datum/crafting_recipe/blast_doors
+ name = "Blast Door"
+ reqs = list(/obj/item/stack/sheet/plasteel = 15,
+ /obj/item/stack/cable_coil = 15,
+ /obj/item/electronics/airlock = 1
+ )
+ result = /obj/machinery/door/poddoor/preopen
+ tools = list(TOOL_SCREWDRIVER, TOOL_MULTITOOL, TOOL_WIRECUTTER, TOOL_WELDER)
+ time = 30 SECONDS
+ category = CAT_MISC
+
/datum/crafting_recipe/aquarium
name = "Aquarium"
result = /obj/structure/aquarium
diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm
index bf28d7d0f54..222516cb74e 100644
--- a/code/game/machinery/doors/poddoor.dm
+++ b/code/game/machinery/doors/poddoor.dm
@@ -15,6 +15,53 @@
resistance_flags = FIRE_PROOF
damage_deflection = 70
poddoor = TRUE
+ var/ertblast = FALSE //If this is true the blast door cannot be deconstructed
+ var/deconstruction = INTACT //For the deconstruction steps
+
+/obj/machinery/door/poddoor/attackby(obj/item/W, mob/user, params)
+ . = ..()
+ if(ertblast && W.tool_behaviour == TOOL_SCREWDRIVER) // This makes it so ERT members cannot cheese by opening their blast doors.
+ to_chat(user, "This shutter has a different kind of screw, you cannot unscrew the panel open.")
+ return
+
+ if(W.tool_behaviour == TOOL_SCREWDRIVER)
+ if(density)
+ to_chat(user, "You need to open [src] before opening its maintenance panel.")
+ return
+ else if(default_deconstruction_screwdriver(user, icon_state, icon_state, W))
+ to_chat(user, "You [panel_open ? "open" : "close"] the maintenance hatch of [src].")
+ return TRUE
+
+ if(panel_open)
+ if(W.tool_behaviour == TOOL_MULTITOOL)
+ var/change_id = input("Set the shutters/blast door/blast door controllers ID. It must be a number between 1 and 100.", "ID", id) as num|null
+ if(change_id)
+ id = clamp(round(change_id, 1), 1, 100)
+ to_chat(user, "You change the ID to [id].")
+
+ if(W.tool_behaviour == TOOL_CROWBAR && deconstruction == INTACT)
+ to_chat(user, "You start to remove the airlock electronics.")
+ if(do_after(user, 10 SECONDS, target = src))
+ new /obj/item/electronics/airlock(loc)
+ id = null
+ deconstruction = FALSE
+
+ if(W.tool_behaviour == TOOL_WIRECUTTER && deconstruction == FALSE)
+ to_chat(user, "You start to remove the internal cables.")
+ if(do_after(user, 10 SECONDS, target = src))
+ deconstruction = TRUE
+
+ if(W.tool_behaviour == TOOL_WELDER && deconstruction == TRUE)
+ to_chat(user, "You start tearing apart the [src].")
+ playsound(src.loc, 'sound/items/welder.ogg', 50, 1)
+ if(do_after(user, 15 SECONDS, target = src))
+ new /obj/item/stack/sheet/plasteel(loc, 5)
+ qdel(src)
+
+/obj/machinery/door/poddoor/examine(mob/user)
+ . = ..()
+ if(panel_open)
+ . += "The maintenance panel is [panel_open ? "opened" : "closed"]."
/obj/machinery/door/poddoor/connect_to_shuttle(obj/docking_port/mobile/port, obj/docking_port/stationary/dock)
id = "[port.id]_[id]"
@@ -27,10 +74,12 @@
/obj/machinery/door/poddoor/ert
name = "hardened blast door"
desc = "A heavy duty blast door that only opens for dire emergencies."
+ ertblast = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
//special poddoors that open when emergency shuttle docks at centcom
/obj/machinery/door/poddoor/shuttledock
+ ertblast = TRUE
var/checkdir = 4 //door won't open if turf in this dir is `turftype`
var/turftype = /turf/open/space
diff --git a/code/game/machinery/doors/shutters.dm b/code/game/machinery/doors/shutters.dm
index 72d38710e1b..efbd42a7a12 100644
--- a/code/game/machinery/doors/shutters.dm
+++ b/code/game/machinery/doors/shutters.dm
@@ -16,6 +16,7 @@
/obj/machinery/door/poddoor/shutters/indestructible
name = "hardened shutters"
+ ertblast = TRUE
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
/obj/machinery/door/poddoor/shutters/radiation
diff --git a/code/modules/assembly/doorcontrol.dm b/code/modules/assembly/doorcontrol.dm
index 35cc75c4f21..c13613935e6 100644
--- a/code/modules/assembly/doorcontrol.dm
+++ b/code/modules/assembly/doorcontrol.dm
@@ -13,6 +13,12 @@
if(id)
. += "Its channel ID is '[id]'."
+/obj/item/assembly/control/multitool_act(mob/living/user)
+ var/change_id = input("Set the shutters/blast door/blast door controllers ID. It must be a number between 1 and 100.", "ID", id) as num|null
+ if(change_id)
+ id = clamp(round(change_id, 1), 1, 100)
+ to_chat(user, "You change the ID to [id].")
+
/obj/item/assembly/control/activate()
var/openclose
if(cooldown)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index ac83358fdda..60c22cc0a6a 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -1203,3 +1203,11 @@
materials = list(/datum/material/iron = 75)
build_path = /obj/item/chisel
category = list("initial","Tools")
+
+/datum/design/control
+ name = "Blast Door Controller"
+ id = "blast"
+ build_type = AUTOLATHE
+ materials = list(/datum/material/iron = 100, /datum/material/glass = 50)
+ build_path = /obj/item/assembly/control
+ category = list("initial","Misc")