diff --git a/src/transients.c b/src/transients.c
index 82946a1de52b7223d6dab06d927f9e34c24156c8..8dab4c0a7c7b4211c97060da8bc48bc4bbd6c9f1 100644
--- a/src/transients.c
+++ b/src/transients.c
@@ -46,6 +46,26 @@ clientGetTransient (Client * c)
     return NULL;
 }
 
+gboolean
+clientIsDirectTransient (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return ((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window));
+}
+
+gboolean
+clientIsTransientForGroup (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None) && (c->group_leader != c->window));
+}
+
 gboolean
 clientIsTransient (Client * c)
 {
@@ -53,8 +73,7 @@ clientIsTransient (Client * c)
 
     TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
 
-    return (((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window)) ||
-            ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None) && (c->group_leader != c->window)));
+    return (clientIsDirectTransient(c) || clientIsTransientForGroup (c));
 }
 
 gboolean
@@ -68,8 +87,28 @@ clientIsModal (Client * c)
        if WM_TRANSIENT_FOR is not set or set to the root window the dialog is modal for its window group.
      */
     return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) &&
-            (((c->transient_for != c->screen_info->xroot) && (c->transient_for != None) && (c->transient_for != c->window)) ||
-             ((c->group_leader != None) && (c->group_leader != c->window))));
+            clientIsTransient (c));
+}
+
+gboolean
+clientIsModalForGroup (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) &&
+            !clientIsTransient(c) && (c->group_leader != None));
+}
+
+gboolean
+clientIsTransientOrModalForGroup (Client * c)
+{
+    g_return_val_if_fail (c != NULL, FALSE);
+
+    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
+
+    return (clientIsTransientForGroup(c) || clientIsModalForGroup(c));
 }
 
 gboolean
@@ -191,37 +230,6 @@ clientIsTransientOrModalFor (Client * c1, Client * c2)
     return (clientIsTransientFor(c1, c2) || clientIsModalFor(c1, c2));
 }
 
-gboolean
-clientIsTransientForGroup (Client * c)
-{
-    g_return_val_if_fail (c != NULL, FALSE);
-
-    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
-
-    return ((c->transient_for == c->screen_info->xroot) && (c->group_leader != None));
-}
-
-gboolean
-clientIsModalForGroup (Client * c)
-{
-    g_return_val_if_fail (c != NULL, FALSE);
-
-    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
-
-    return (FLAG_TEST (c->flags, CLIENT_FLAG_STATE_MODAL) && (c->type & WINDOW_REGULAR_FOCUSABLE) &&
-            !clientIsTransient(c) && (c->group_leader != None));
-}
-
-gboolean
-clientIsTransientOrModalForGroup (Client * c)
-{
-    g_return_val_if_fail (c != NULL, FALSE);
-
-    TRACE ("client \"%s\" (0x%lx)", c->name, c->window);
-
-    return (clientIsTransientForGroup(c) || clientIsModalForGroup(c));
-}
-
 gboolean
 clientIsValidTransientOrModal (Client * c)
 {
@@ -315,7 +323,7 @@ clientGetModalFor (Client * c)
     return NULL;
 }
 
-/* Find the deepest parent of that window */
+/* Find the deepest direct parent of that window */
 Client *
 clientGetTransientFor (Client * c)
 {
@@ -339,7 +347,7 @@ clientGetTransientFor (Client * c)
             continue;
         }
 
-        if (clientIsTransientFor (c, c2))
+        if (clientIsDirectTransient (c) && clientIsTransientFor (c, c2))
         {
             parents = g_list_append (parents, c2);
             first_parent = c2;
@@ -349,7 +357,7 @@ clientGetTransientFor (Client * c)
             for (l2 = parents; l2; l2 = g_list_next (l2))
             {
                 Client *c3 = (Client *) l2->data;
-                if ((c3 != c2) && clientIsTransientFor (c3, c2))
+                if ((c3 != c2) && clientIsDirectTransient (c3) && clientIsTransientFor (c3, c2))
                 {
                     parents = g_list_append (parents, c2);
                     first_parent = c2;
diff --git a/src/transients.h b/src/transients.h
index 029e25dcb3ca8c1962f9f05622d9a01480f57ad0..57029e37f3331bb85c8a1129597465013761950f 100644
--- a/src/transients.h
+++ b/src/transients.h
@@ -31,8 +31,11 @@
 #include "client.h"
 
 Client                  *clientGetTransient                     (Client *);
+gboolean                 clientIsDirectTransient                (Client *);
+gboolean                 clientIsTransientForGroup              (Client *);
 gboolean                 clientIsTransient                      (Client *);
 gboolean                 clientIsModal                          (Client *);
+gboolean                 clientIsModalForGroup                  (Client *);
 gboolean                 clientIsTransientOrModal               (Client *);
 gboolean                 clientIsValidTransientOrModal          (Client *);
 gboolean                 clientSameGroup                        (Client *,
@@ -49,8 +52,6 @@ gboolean                 clientIsModalFor                       (Client *,
                                                                  Client *);
 gboolean                 clientIsTransientOrModalFor            (Client *,
                                                                  Client *);
-gboolean                 clientIsTransientForGroup              (Client *);
-gboolean                 clientIsModalForGroup                  (Client *);
 gboolean                 clientIsTransientOrModalForGroup       (Client *);
 gboolean                 clientTransientOrModalHasAncestor      (Client *,
                                                                  guint);