diff --git a/src/stacking.c b/src/stacking.c
index b7d201bb8c7a79faee8373560e147b67ec411bf9..195c63798aaaa7f86ae3b606c7b4bef7b2a365e4 100644
--- a/src/stacking.c
+++ b/src/stacking.c
@@ -156,7 +156,8 @@ gboolean
 clientIsTopMost (Client *c)
 {
     ScreenInfo *screen_info;
-    GList *index;
+    GList *index, *index2;
+    Client *c2;
 
     g_return_val_if_fail (c != NULL, FALSE);
     TRACE ("entering clientIsTopMost");
@@ -166,18 +167,18 @@ clientIsTopMost (Client *c)
     index = g_list_find (screen_info->windows_stack, (gconstpointer) c);
     if (index)
     {
-        GList *index2 = g_list_next (index);
-        if (index2)
-        {
-            Client *c2 = (Client *) index2->data;
-            return (c2->win_layer > c->win_layer);
-        }
-        else
+        index2 = g_list_next (index);
+        while (index2)
         {
-            return TRUE;
+            c2 = (Client *) index2->data;
+            if (FLAG_TEST (c2->xfwm_flags, XFWM_FLAG_VISIBLE) && (c2->win_layer == c->win_layer))
+            {
+                return FALSE;
+            }
+            index2 = g_list_next (index2);
         }
     }
-    return FALSE;
+    return TRUE;
 }
 
 Client *
diff --git a/src/workspaces.c b/src/workspaces.c
index 910223118dc89080988faaece370cbedf519e523..3668e2528ab2b8b7a645b49bc7dfe88bf4b7b3a4 100644
--- a/src/workspaces.c
+++ b/src/workspaces.c
@@ -385,7 +385,7 @@ workspaceSwitch (ScreenInfo *screen_info, int new_ws, Client * c2, gboolean upda
         {
             if ((screen_info->params->click_to_focus) && (screen_info->params->raise_on_click))
             {
-                if (!clientIsTopMost (new_focus))
+                if (!(screen_info->params->raise_on_focus) && !clientIsTopMost (new_focus))
                 {
                     clientRaise (new_focus, None);
                 }