diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index f92e8d762f2d..7bbe9fb1de72 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -326,7 +326,7 @@
if(!key)
msg += "[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.\n"
else if(!client)
- msg += "[t_He] appears to be suffering from SSD - Space Sleep Disorder. [t_He] may snap out of it at any time! Or maybe never. It's best to leave [t_him] be.\n"
+ msg += "[t_He] [t_has] been suffering from SSD - Space Sleep Disorder - for [trunc(((world.time - lastclienttime) / (1 MINUTES)))] minutes. [t_He] may snap out of it at any time! Or maybe never. It's best to leave [t_him] be.\n"
if (length(msg))
. += "[msg.Join("")]"
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index d1ebd095dc26..081e8dc8b21e 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -25,9 +25,12 @@
if(.) //not dead
handle_blood()
- if(isLivingSSD())//if you're disconnected, you're going to sleep
- if(AmountSleeping() < 20)
- AdjustSleeping(20)//adjust every 10 seconds
+ if(isLivingSSD()) // If you're disconnected, you're going to sleep
+ if(trunc((world.time - lastclienttime) / (3 MINUTES)) > 0) // After a three minute grace period, your character will fall asleep
+ if(AmountSleeping() < 20)
+ AdjustSleeping(20) // Adjust every 10 seconds
+ if(ssd_indicator)
+ cut_overlay(GLOB.ssd_indicator_overlay) // Prevents chronically SSD players from breaking immersion
if(stat != DEAD)
var/bprv = handle_bodyparts()
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 0f9d4344ab6a..fe81c25797a4 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1410,6 +1410,32 @@
if(player_logged && stat != DEAD)
return TRUE
+// The above code is kept to prevent old SSD behavior from breaking, while the code below is dedicated to the SSD Indicator
+
+GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('icons/mob/ssd_indicator.dmi', "default0", RUNECHAT_PLANE))
+
+/mob/living
+ var/ssd_indicator = FALSE
+ var/lastclienttime = 0
+
+/mob/living/proc/set_ssd_indicator(state)
+ if(state == ssd_indicator)
+ return
+ ssd_indicator = state
+ if(ssd_indicator && stat != DEAD)
+ add_overlay(GLOB.ssd_indicator_overlay)
+ else
+ cut_overlay(GLOB.ssd_indicator_overlay)
+
+/mob/living/Login()
+ . = ..()
+ set_ssd_indicator(FALSE)
+
+/mob/living/Logout()
+ . = ..()
+ lastclienttime = world.time
+ set_ssd_indicator(TRUE)
+
/mob/living/vv_get_header()
. = ..()
var/refid = REF(src)
diff --git a/icons/mob/ssd_indicator.dmi b/icons/mob/ssd_indicator.dmi
new file mode 100644
index 000000000000..3f7d100b6c67
Binary files /dev/null and b/icons/mob/ssd_indicator.dmi differ