diff --git a/src/hints.c b/src/hints.c
index f82f9f7bae6635085c27b011ade2852b03562dc1..e05c9d10adf4b14d1b42a9ea7f431eb6610213b1 100644
--- a/src/hints.c
+++ b/src/hints.c
@@ -564,7 +564,7 @@ void getTransientFor(Display * dpy, Window w, Window * transient_for)
 {
     DBG("entering getTransientFor\n");
 
-    if(!XGetTransientForHint(dpy, w, transient_for))
+    if(!XGetTransientForHint(dpy, w, transient_for) || (*transient_for == w))
     {
         *transient_for = None;
     }
diff --git a/src/workspaces.c b/src/workspaces.c
index 3bb4f2f507a55227ba96c3bee13c3fb7fd228339..49a577d013ff1548fcc419e8aec43b4c1341a15d 100644
--- a/src/workspaces.c
+++ b/src/workspaces.c
@@ -89,7 +89,7 @@ void workspaceSwitch(int new_ws, Client * c2)
     for(last = clients, i = 0; i < client_count; last = last->next, i++);
     for(c = last, i = 0; i < client_count; c = c->prev, i++)
     {
-        if((c->visible) && !(c->sticky) && ((c->win_workspace != new_ws)))
+        if((c->visible) && !(c->sticky) && !(c->transient_for) && ((c->win_workspace != new_ws)))
         {
             clientHide(c, False);
         }
@@ -103,7 +103,7 @@ void workspaceSwitch(int new_ws, Client * c2)
         }
         else
         {
-            if((c->win_workspace == new_ws) && !(c->hidden))
+            if((c->win_workspace == new_ws) && !(c->transient_for) && !(c->hidden))
             {
                 clientShow(c, False);
                 if(c->focus)