diff --git a/src/client.c b/src/client.c
index 803b3aa5c99d062ba2c969b9a554161304a4b675..838f64caaf06d88b14ccbdcab2745fe3160f3f85 100644
--- a/src/client.c
+++ b/src/client.c
@@ -1221,12 +1221,19 @@ clientWindowType (Client * c)
     {
         Client *c2;
 
-        TRACE ("Window is a transient or a modal");
+        TRACE ("Window \"%s\" is a transient or a modal", c->name);
 
         c2 = clientGetHighestTransientOrModalFor (c);
         if (c2)
         {
-            c->initial_layer = c2->win_layer;
+            if (clientIsTransient (c));
+            {
+                c->initial_layer = c2->win_layer;
+            }
+            else if (c->initial_layer < c2->win_layer) /* clientIsModal (c) */
+            {
+                c->initial_layer = c2->win_layer;
+            }
             TRACE ("Applied layer is %i", c->initial_layer);
         }
         FLAG_UNSET (c->flags,
diff --git a/src/events.c b/src/events.c
index 615a31993a5bb916896c0784b5b3169d5cddc320..7825cfe09e43edf6c7cb2e2cb5fea5a09df03d9d 100644
--- a/src/events.c
+++ b/src/events.c
@@ -1548,7 +1548,7 @@ handleClientMessage (XClientMessageEvent * ev)
             TRACE
                 ("client \"%s\" (0x%lx) has received a net_active_window event",
                 c->name, c->window);
-            workspaceSwitch (c->win_workspace, NULL);
+            clientSetWorkspace (c, workspace, TRUE);
             clientShow (c, TRUE);
             clientRaise (c);
             clientSetFocus (c, FOCUS_SORT);