diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 937e3909..8ea2009f 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -21,6 +21,7 @@ Buildable meters
level = 2
var/piping_layer = PIPING_LAYER_DEFAULT
var/RPD_type
+ var/disposable = TRUE
/obj/item/pipe/directional
RPD_type = PIPE_UNARY
@@ -232,3 +233,22 @@ Buildable meters
/obj/item/pipe_meter/proc/setAttachLayer(new_layer = PIPING_LAYER_DEFAULT)
piping_layer = new_layer
PIPING_LAYER_DOUBLE_SHIFT(src, piping_layer)
+
+/obj/item/pipe/bluespace
+ pipe_type = /obj/machinery/atmospherics/pipe/bluespace
+ var/bluespace_network_name = "default"
+ icon_state = "bluespace"
+ disposable = FALSE
+
+/obj/item/pipe/bluespace/attack_self(mob/user)
+ var/new_name = input(user, "Enter identifier for bluespace pipe network", "bluespace pipe", bluespace_network_name) as text|null
+ if(!isnull(new_name))
+ bluespace_network_name = new_name
+
+/obj/item/pipe/bluespace/make_from_existing(obj/machinery/atmospherics/pipe/bluespace/make_from)
+ bluespace_network_name = make_from.bluespace_network_name
+ return ..()
+
+/obj/item/pipe/bluespace/build_pipe(obj/machinery/atmospherics/pipe/bluespace/A)
+ A.bluespace_network_name = bluespace_network_name
+ return ..()
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index 51701f7c..499a304b 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -347,12 +347,14 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
. = FALSE
if((mode & DESTROY_MODE) && istype(A, /obj/item/pipe) || istype(A, /obj/structure/disposalconstruct) || istype(A, /obj/structure/c_transit_tube) || istype(A, /obj/structure/c_transit_tube_pod) || istype(A, /obj/item/pipe_meter))
- to_chat(user, "You start destroying a pipe...")
- playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, destroy_speed, target = A))
- activate()
- qdel(A)
- return
+ var/obj/item/pipe/P = A
+ if(!istype(P) || P.disposable)
+ to_chat(user, "You start destroying a pipe...")
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
+ if(do_after(user, destroy_speed, target = A))
+ activate()
+ qdel(A)
+ return
if((mode & PAINT_MODE))
if(istype(A, /obj/machinery/atmospherics/pipe) && !istype(A, /obj/machinery/atmospherics/pipe/layer_manifold))
diff --git a/code/modules/atmospherics/machinery/pipes/bluespace.dm b/code/modules/atmospherics/machinery/pipes/bluespace.dm
new file mode 100644
index 00000000..2735a381
--- /dev/null
+++ b/code/modules/atmospherics/machinery/pipes/bluespace.dm
@@ -0,0 +1,86 @@
+GLOBAL_LIST_EMPTY(bluespace_pipe_networks)
+/obj/machinery/atmospherics/pipe/bluespace
+ name = "bluespace pipe"
+ desc = "Transmits gas across large distances of space. Developed using bluespace technology."
+ icon = 'icons/obj/atmospherics/pipes/bluespace.dmi'
+ icon_state = "map"
+ pipe_state = "bluespace"
+ dir = SOUTH
+ initialize_directions = SOUTH
+ device_type = UNARY
+ can_buckle = FALSE
+ construction_type = /obj/item/pipe/bluespace
+ var/bluespace_network_name
+
+/obj/machinery/atmospherics/pipe/bluespace/New()
+ icon_state = "pipe"
+ if(bluespace_network_name) // in case someone maps one in for some reason
+ if(!GLOB.bluespace_pipe_networks[bluespace_network_name])
+ GLOB.bluespace_pipe_networks[bluespace_network_name] = list()
+ GLOB.bluespace_pipe_networks[bluespace_network_name] |= src
+ ..()
+
+/obj/machinery/atmospherics/pipe/bluespace/on_construction()
+ . = ..()
+ if(bluespace_network_name)
+ if(!GLOB.bluespace_pipe_networks[bluespace_network_name])
+ GLOB.bluespace_pipe_networks[bluespace_network_name] = list()
+ GLOB.bluespace_pipe_networks[bluespace_network_name] |= src
+
+/obj/machinery/atmospherics/pipe/bluespace/Destroy()
+ if(GLOB.bluespace_pipe_networks[bluespace_network_name])
+ GLOB.bluespace_pipe_networks[bluespace_network_name] -= src
+ for(var/p in GLOB.bluespace_pipe_networks[bluespace_network_name])
+ var/obj/machinery/atmospherics/pipe/bluespace/P = p
+ QDEL_NULL(P.parent)
+ P.build_network()
+ return ..()
+
+/obj/machinery/atmospherics/pipe/bluespace/examine(user)
+ . = ..()
+ . += "This one is connected to the \"[html_encode(bluespace_network_name)]\" network."
+
+/obj/machinery/atmospherics/pipe/bluespace/SetInitDirections()
+ initialize_directions = dir
+
+/obj/machinery/atmospherics/pipe/bluespace/pipeline_expansion()
+ return ..() + GLOB.bluespace_pipe_networks[bluespace_network_name] - src
+
+/obj/machinery/atmospherics/pipe/bluespace/hide()
+ update_icon()
+
+/obj/machinery/atmospherics/pipe/bluespace/update_icon(showpipe)
+ underlays.Cut()
+
+ var/turf/T = loc
+ if(level == 2 || !T.intact)
+ showpipe = TRUE
+ plane = GAME_PLANE
+ else
+ showpipe = FALSE
+ plane = FLOOR_PLANE
+
+ if(!showpipe)
+ return //no need to update the pipes if they aren't showing
+
+ var/connected = 0 //Direction bitset
+
+ for(var/i in 1 to device_type) //adds intact pieces
+ if(nodes[i])
+ var/obj/machinery/atmospherics/node = nodes[i]
+ var/image/img = get_pipe_underlay("pipe_intact", get_dir(src, node), node.pipe_color)
+ underlays += img
+ connected |= img.dir
+
+ for(var/direction in GLOB.cardinals)
+ if((initialize_directions & direction) && !(connected & direction))
+ underlays += get_pipe_underlay("pipe_exposed", direction)
+
+/obj/machinery/atmospherics/pipe/bluespace/paint()
+ return FALSE
+
+/obj/machinery/atmospherics/pipe/bluespace/proc/get_pipe_underlay(state, dir, color = null)
+ if(color)
+ . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir, color)
+ else
+ . = getpipeimage('icons/obj/atmospherics/components/binary_devices.dmi', state, dir)
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index ec4309b6..50418cff 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -1,86 +1,96 @@
-
-/////////////////////////////////////////
-//////////////Blue Space/////////////////
-/////////////////////////////////////////
-
-/datum/design/beacon
- name = "Tracking Beacon"
- desc = "A blue space tracking beacon."
- id = "beacon"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 150, MAT_GLASS = 100)
- build_path = /obj/item/beacon
- category = list("Bluespace Designs")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY
-
-/datum/design/bag_holding
- name = "Bag of Holding"
- desc = "A backpack that opens into a localized pocket of bluespace."
- id = "bag_holding"
- build_type = PROTOLATHE
- materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
- build_path = /obj/item/storage/backpack/holding
- category = list("Bluespace Designs")
- dangerous_construction = TRUE
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/satchel_holding
- name = "Satchel of Holding"
- desc = "A satchel that opens into a localized pocket of bluespace."
- id = "satchel_holding"
- build_type = PROTOLATHE
- materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
- build_path = /obj/item/storage/backpack/holding/satchel
- category = list("Bluespace Designs")
- dangerous_construction = TRUE
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/biobag_holding
- name = "Bio Bag of Holding"
- desc = "A chemical holding thingy. Mostly used for xenobiology."
- id = "biobag_holding"
- build_type = PROTOLATHE
- materials = list(MAT_GOLD = 1500, MAT_DIAMOND = 750, MAT_URANIUM = 250, MAT_BLUESPACE = 1000)
- build_path = /obj/item/storage/bag/bio/holding
- category = list("Bluespace Designs")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/bluespace_crystal
- name = "Artificial Bluespace Crystal"
- desc = "A small blue crystal with mystical properties."
- id = "bluespace_crystal"
- build_type = PROTOLATHE
- materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500)
- build_path = /obj/item/stack/ore/bluespace_crystal/artificial
- category = list("Bluespace Designs")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/telesci_gps
- name = "GPS Device"
- desc = "Little thingie that can track its position at all times."
- id = "telesci_gps"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 500, MAT_GLASS = 1000)
- build_path = /obj/item/gps
- category = list("Bluespace Designs")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
-
-/datum/design/desynchronizer
- name = "Desynchronizer"
- desc = "A device that can desynchronize the user from spacetime."
- id = "desynchronizer"
- build_type = PROTOLATHE
- materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_BLUESPACE = 1000)
- build_path = /obj/item/desynchronizer
- category = list("Bluespace Designs")
- departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
-
-/datum/design/miningsatchel_holding
- name = "Mining Satchel of Holding"
- desc = "A mining satchel that can hold an infinite amount of ores."
- id = "minerbag_holding"
- build_type = PROTOLATHE
- materials = list(MAT_GOLD = 250, MAT_URANIUM = 500) //quite cheap, for more convenience
- build_path = /obj/item/storage/bag/ore/holding
- category = list("Bluespace Designs")
- departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
+/////////////////////////////////////////
+//////////////Blue Space/////////////////
+/////////////////////////////////////////
+
+/datum/design/beacon
+ name = "Tracking Beacon"
+ desc = "A blue space tracking beacon."
+ id = "beacon"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 150, MAT_GLASS = 100)
+ build_path = /obj/item/beacon
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO | DEPARTMENTAL_FLAG_SECURITY
+
+/datum/design/bag_holding
+ name = "Bag of Holding"
+ desc = "A backpack that opens into a localized pocket of bluespace."
+ id = "bag_holding"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
+ build_path = /obj/item/storage/backpack/holding
+ category = list("Bluespace Designs")
+ dangerous_construction = TRUE
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/satchel_holding
+ name = "Satchel of Holding"
+ desc = "A satchel that opens into a localized pocket of bluespace."
+ id = "satchel_holding"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250, MAT_BLUESPACE = 2000)
+ build_path = /obj/item/storage/backpack/holding/satchel
+ category = list("Bluespace Designs")
+ dangerous_construction = TRUE
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/biobag_holding
+ name = "Bio Bag of Holding"
+ desc = "A chemical holding thingy. Mostly used for xenobiology."
+ id = "biobag_holding"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 1500, MAT_DIAMOND = 750, MAT_URANIUM = 250, MAT_BLUESPACE = 1000)
+ build_path = /obj/item/storage/bag/bio/holding
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/bluespace_crystal
+ name = "Artificial Bluespace Crystal"
+ desc = "A small blue crystal with mystical properties."
+ id = "bluespace_crystal"
+ build_type = PROTOLATHE
+ materials = list(MAT_DIAMOND = 1500, MAT_PLASMA = 1500)
+ build_path = /obj/item/stack/ore/bluespace_crystal/artificial
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/telesci_gps
+ name = "GPS Device"
+ desc = "Little thingie that can track its position at all times."
+ id = "telesci_gps"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 500, MAT_GLASS = 1000)
+ build_path = /obj/item/gps
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/desynchronizer
+ name = "Desynchronizer"
+ desc = "A device that can desynchronize the user from spacetime."
+ id = "desynchronizer"
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 1000, MAT_GLASS = 500, MAT_SILVER = 1500, MAT_BLUESPACE = 1000)
+ build_path = /obj/item/desynchronizer
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
+
+/datum/design/miningsatchel_holding
+ name = "Mining Satchel of Holding"
+ desc = "A mining satchel that can hold an infinite amount of ores."
+ id = "minerbag_holding"
+ build_type = PROTOLATHE
+ materials = list(MAT_GOLD = 250, MAT_URANIUM = 500) //quite cheap, for more convenience
+ build_path = /obj/item/storage/bag/ore/holding
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/bluespace_pipe
+ name = "Bluespace Pipe"
+ desc = "A pipe that teleports gases."
+ id = "bluespace_pipe"
+ build_type = PROTOLATHE
+ materials = list(/datum/material/gold = 1000, /datum/material/diamond = 750, /datum/material/uranium = 250, /datum/material/bluespace = 2000)
+ build_path = /obj/item/pipe/bluespace
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index cf21970f..ad936bc9 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -330,7 +330,7 @@
display_name = "Bluespace Travel"
description = "Application of Bluespace for static teleportation technology."
prereq_ids = list("adv_power", "adv_bluespace")
- design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick")
+ design_ids = list("tele_station", "tele_hub", "quantumpad", "quantum_keycard", "launchpad", "launchpad_console", "teleconsole", "roastingstick", "bluespace_pipe")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
diff --git a/icons/obj/atmospherics/pipes/bluespace.dmi b/icons/obj/atmospherics/pipes/bluespace.dmi
new file mode 100644
index 00000000..866e6f9b
Binary files /dev/null and b/icons/obj/atmospherics/pipes/bluespace.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 855cf5a3..0774cdc8 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1473,6 +1473,7 @@
#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm"
#include "code\modules\atmospherics\machinery\other\meter.dm"
#include "code\modules\atmospherics\machinery\other\miner.dm"
+#include "code\modules\atmospherics\machinery\pipes\bluespace.dm"
#include "code\modules\atmospherics\machinery\pipes\layermanifold.dm"
#include "code\modules\atmospherics\machinery\pipes\manifold.dm"
#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm"