diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 30e6c784a8b..98f6023e7d5 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -282,12 +282,15 @@
/atom/proc/AltClick(var/mob/user)
var/turf/T = get_turf(src)
if(T && user.TurfAdjacent(T))
- if(user.listed_turf == T)
- user.listed_turf = null
- else
- user.listed_turf = T
- user.client.statpanel = "Turf"
+ user.ToggleTurfTab(T)
return 1
+
+/mob/proc/ToggleTurfTab(var/turf/T)
+ if(listed_turf == T)
+ listed_turf = null
+ else
+ listed_turf = T
+ client.statpanel = "Turf"
/mob/proc/TurfAdjacent(var/turf/T)
return T.AdjacentQuick(src)
diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm
index 485df1de418..c2a8a62ea8d 100644
--- a/code/_onclick/observer.dm
+++ b/code/_onclick/observer.dm
@@ -33,6 +33,15 @@
return
if(!checkClickCooldown()) return
setClickCooldown(4)
+ var/list/modifiers = params2list(params)
+ if(modifiers["shift"])
+ examinate(A)
+ return
+ if(modifiers["alt"]) // alt and alt-gr (rightalt)
+ var/turf/T = get_turf(A)
+ if(T && TurfAdjacent(T))
+ ToggleTurfTab(T)
+ return
// You are responsible for checking config.ghost_interaction when you override this function
// Not all of them require checking, see below
A.attack_ghost(src)
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index fcc85f2a2fb..13f794176d0 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -24,6 +24,7 @@
//Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot.
var/has_enabled_antagHUD = 0
var/medHUD = 0
+ var/secHUD = 0
var/antagHUD = 0
universal_speak = 1
var/atom/movable/following = null
@@ -296,6 +297,19 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
plane_holder.set_vis(VIS_CH_STATUS_OOC, medHUD)
to_chat(src, "Medical HUD [medHUD ? "Enabled" : "Disabled"]")
+/mob/observer/dead/verb/toggle_secHUD()
+ set category = "Ghost"
+ set name = "Toggle Security HUD"
+ set desc = "Toggles Security HUD allowing you to see people's displayed ID's job, wanted status, etc"
+
+ secHUD = !secHUD
+ plane_holder.set_vis(VIS_CH_ID, secHUD)
+ plane_holder.set_vis(VIS_CH_WANTED, secHUD)
+ plane_holder.set_vis(VIS_CH_IMPTRACK, secHUD)
+ plane_holder.set_vis(VIS_CH_IMPLOYAL, secHUD)
+ plane_holder.set_vis(VIS_CH_IMPCHEM, secHUD)
+ to_chat(src, "Security HUD [secHUD ? "Enabled" : "Disabled"]")
+
/mob/observer/dead/verb/toggle_antagHUD()
set category = "Ghost"
set name = "Toggle AntagHUD"
diff --git a/html/changelogs/Meghan Rossi - ghostqol.yml b/html/changelogs/Meghan Rossi - ghostqol.yml
new file mode 100644
index 00000000000..314f46bea5c
--- /dev/null
+++ b/html/changelogs/Meghan Rossi - ghostqol.yml
@@ -0,0 +1,6 @@
+author: Meghan Rossi
+delete-after: True
+changes:
+ - rscadd: "Ghosts now have a toggleable security HUD. Use the "Toggle Security HUD" verb in the ghost tab to enable it"
+ - rscadd: "Ghosts can now shift-click things to examine them."
+ - rscadd: "Ghosts can now alt-click adjacent things to open the turf tab."
\ No newline at end of file