diff --git a/src/client.c b/src/client.c
index 3addde6a13927b3c9487ce589f83566dd1f57216..ea26f70cbdaf0db58a2c09df7387d5c6eafce1de 100644
--- a/src/client.c
+++ b/src/client.c
@@ -2325,6 +2325,12 @@ clientShowSingle (Client * c, gboolean deiconify)
 
     g_return_if_fail (c != NULL);
 
+    if (FLAG_TEST (c->xfwm_flags, XFWM_FLAG_VISIBLE))
+    {
+        /* Should we map the window if it is visible? */
+        return;
+    }
+
     screen_info = c->screen_info;
     display_info = screen_info->display_info;
 
@@ -2864,24 +2870,22 @@ clientStick (Client * c, gboolean include_transients)
         for (list = list_of_windows; list; list = g_list_next (list))
         {
             c2 = (Client *) list->data;
-            TRACE ("sticking client \"%s\" (0x%lx)", c2->name, c2->window);
             c2->win_state |= WIN_STATE_STICKY;
+            TRACE ("Sticking client \"%s\" (0x%lx)", c2->name, c2->window);
             FLAG_SET (c2->flags, CLIENT_FLAG_STICKY);
             setHint (display_info, c2->window, NET_WM_DESKTOP, (unsigned long) ALL_WORKSPACES);
-            clientSetNetState (c2);
             frameQueueDraw (c2, FALSE);
         }
-        clientSetWorkspace (c, screen_info->current_ws, TRUE);
         g_list_free (list_of_windows);
     }
     else
     {
-        TRACE ("sticking client \"%s\" (0x%lx)", c->name, c->window);
+        TRACE ("Sticking client \"%s\" (0x%lx)", c->name, c->window);
         c->win_state |= WIN_STATE_STICKY;
         FLAG_SET (c->flags, CLIENT_FLAG_STICKY);
         setHint (display_info, c->window, NET_WM_DESKTOP, (unsigned long) ALL_WORKSPACES);
-        clientSetWorkspace (c, screen_info->current_ws, TRUE);
     }
+    clientSetWorkspace (c, screen_info->current_ws, TRUE);
     clientSetNetState (c);
 }
 
@@ -2896,7 +2900,6 @@ clientUnstick (Client * c, gboolean include_transients)
 
     g_return_if_fail (c != NULL);
     TRACE ("entering clientUnstick");
-    TRACE ("unsticking client \"%s\" (0x%lx)", c->name, c->window);
 
     screen_info = c->screen_info;
     display_info = screen_info->display_info;
@@ -2908,21 +2911,21 @@ clientUnstick (Client * c, gboolean include_transients)
         {
             c2 = (Client *) list->data;
             c2->win_state &= ~WIN_STATE_STICKY;
+            TRACE ("Unsticking client \"%s\" (0x%lx)", c2->name, c2->window);
             FLAG_UNSET (c2->flags, CLIENT_FLAG_STICKY);
             setHint (display_info, c2->window, NET_WM_DESKTOP, (unsigned long) screen_info->current_ws);
-            clientSetNetState (c2);
             frameQueueDraw (c2, FALSE);
         }
-        clientSetWorkspace (c, screen_info->current_ws, TRUE);
         g_list_free (list_of_windows);
     }
     else
     {
+        TRACE ("Unsticking client \"%s\" (0x%lx)", c->name, c->window);
         c->win_state &= ~WIN_STATE_STICKY;
         FLAG_UNSET (c->flags, CLIENT_FLAG_STICKY);
         setHint (display_info, c->window, NET_WM_DESKTOP, (unsigned long) screen_info->current_ws);
-        clientSetWorkspace (c, screen_info->current_ws, TRUE);
     }
+    clientSetWorkspace (c, screen_info->current_ws, TRUE);
     clientSetNetState (c);
 }
 
diff --git a/src/focus.c b/src/focus.c
index a0daae50372bd11bd0a9449bb1a8dc738a18c04c..ae69237c8bc7ead65c046c25ed6182d05c95e2f4 100644
--- a/src/focus.c
+++ b/src/focus.c
@@ -526,11 +526,11 @@ clientUpdateFocus (ScreenInfo *screen_info, Client * c, unsigned short flags)
         {
             TRACE ("Un-setting WM_STATE_DEMANDS_ATTENTION flag on \"%s\" (0x%lx)", c->name, c->window);
             FLAG_UNSET (c->flags, CLIENT_FLAG_DEMANDS_ATTENTION);
+            clientSetNetState (c);
         }
         clientAdjustFullscreenLayer (c, TRUE);
         frameQueueDraw (c, FALSE);
         clientUpdateOpacity (c);
-        clientSetNetState (c);
     }
     if (c2)
     {