diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index e8f43f316f..28e1e1294f 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -655,9 +655,10 @@ GENETICS SCANNER
amount += inaccurate
return DisplayTimeText(max(1,amount))
-/proc/atmosanalyzer_scan(mixture, mob/living/user, atom/target = src)
+/proc/atmosanalyzer_scan(mixture, mob/living/user, atom/target = src, visible = TRUE)
var/icon = target
- user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].")
+ if(visible)
+ user.visible_message("[user] has used the analyzer on [icon2html(icon, viewers(user))] [target].", "You use the analyzer on [icon2html(icon, user)] [target].")
to_chat(user, "Results of analysis of [icon2html(icon, user)] [target].")
var/list/airs = islist(mixture) ? mixture : list(mixture)
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index 95712f386a..00fbc41516 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -153,6 +153,10 @@
return (BRUTELOSS)
+/obj/item/tank/attack_ghost(mob/dead/observer/O)
+ . = ..()
+ atmosanalyzer_scan(air_contents, O, src, FALSE)
+
/obj/item/tank/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
if(istype(W, /obj/item/assembly_holder))
diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm
index c229a4ba27..33fd160b1a 100644
--- a/code/modules/atmospherics/machinery/components/components_base.dm
+++ b/code/modules/atmospherics/machinery/components/components_base.dm
@@ -162,6 +162,9 @@
to_chat(user, "Access denied.")
return UI_CLOSE
+/obj/machinery/atmospherics/components/attack_ghost(mob/dead/observer/O)
+ . = ..()
+ atmosanalyzer_scan(airs, O, src, FALSE)
// Tool acts
diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm
index c466a422b2..4a6170c251 100644
--- a/code/modules/atmospherics/machinery/pipes/pipes.dm
+++ b/code/modules/atmospherics/machinery/pipes/pipes.dm
@@ -111,3 +111,10 @@
pipe_color = paint_color
update_node_icon()
return TRUE
+
+/obj/machinery/atmospherics/pipe/attack_ghost(mob/dead/observer/O)
+ . = ..()
+ if(parent)
+ atmosanalyzer_scan(parent.air, O, src, FALSE)
+ else
+ to_chat(O, "[src] doesn't have a pipenet, which is probably a bug.")
diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
index 8bf0554070..f3b65c5724 100644
--- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
+++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm
@@ -154,3 +154,7 @@
investigate_log("was smacked with \a [I] by [key_name(user)].", INVESTIGATE_ATMOS)
add_fingerprint(user)
..()
+
+/obj/machinery/portable_atmospherics/attack_ghost(mob/dead/observer/O)
+ . = ..()
+ atmosanalyzer_scan(air_contents, O, src, FALSE)