diff --git a/OpenDreamClient/Rendering/DreamViewOverlay.cs b/OpenDreamClient/Rendering/DreamViewOverlay.cs
index 8dc7eec585..55c37569cb 100644
--- a/OpenDreamClient/Rendering/DreamViewOverlay.cs
+++ b/OpenDreamClient/Rendering/DreamViewOverlay.cs
@@ -285,7 +285,11 @@ private void ProcessIconComponents(DreamIcon icon, Vector2 position, EntityUid u
 
             tieBreaker++;
 
-            if (!keepTogether || (underlay.Appearance.AppearanceFlags & AppearanceFlags.KeepApart) != 0) { //KEEP_TOGETHER wasn't set on our parent, or KEEP_APART
+            // KEEP_APART flag or on a different plane than the parent atom (implicitly treated as KEEP_APART)
+            var keepApart = underlay.Appearance.Plane != icon.Appearance.Plane ||
+                            (underlay.Appearance.AppearanceFlags & AppearanceFlags.KeepApart) != 0;
+
+            if (!keepTogether || keepApart) { //KEEP_TOGETHER wasn't set on our parent, or KEEP_APART
                 ProcessIconComponents(underlay, current.Position, uid, isScreen, ref tieBreaker, result, seeVis, current);
             } else {
                 current.KeepTogetherGroup ??= new();
@@ -303,7 +307,11 @@ private void ProcessIconComponents(DreamIcon icon, Vector2 position, EntityUid u
 
             tieBreaker++;
 
-            if (!keepTogether || (overlay.Appearance.AppearanceFlags & AppearanceFlags.KeepApart) != 0) { //KEEP_TOGETHER wasn't set on our parent, or KEEP_APART
+            // KEEP_APART flag or on a different plane than the parent atom (implicitly treated as KEEP_APART)
+            var keepApart = overlay.Appearance.Plane != icon.Appearance.Plane ||
+                            (overlay.Appearance.AppearanceFlags & AppearanceFlags.KeepApart) != 0;
+
+            if (!keepTogether || keepApart) { //KEEP_TOGETHER wasn't set on our parent, or KEEP_APART
                 ProcessIconComponents(overlay, current.Position, uid, isScreen, ref tieBreaker, result, seeVis, current);
             } else {
                 current.KeepTogetherGroup ??= new();