diff --git a/wm.c b/wm.c
index b831e72..161187c 100644
--- a/wm.c
+++ b/wm.c
@@ -72,7 +72,7 @@ void wm_monitors_open_all(Wm *wm, Display *d)
 
             // TODO config
             snprintf(ws->name, WM_WS_NAME_LEN, "%d", j);
-            wm_treenode_init(&ws->tree, NODE_CLIENT, NULL);
+            ws->tree = wm_treenode_new(NODE_CLIENT, NULL);
         }
 
         //wm->monitors[i].clients = &wm->root;
@@ -150,6 +150,7 @@ NodeType wm_split_to_nodetype(SplitMode mode)
 
 void wm_ws_tree_insert_client(Wm *wm, Workspace *ws, Client *client)
 {
+    DEBUG_PRINT("%s\n", __func__);
     int dock_y = 0;
 
     if (wm->dock != -1) {
@@ -159,7 +160,7 @@ void wm_ws_tree_insert_client(Wm *wm, Workspace *ws, Client *client)
         dock_y = x.height;
     }
 
-    if (wm_treenode_is_empty(&ws->tree)) {
+    if (wm_treenode_is_empty(&ws->tree) && ws->tree.client == NULL) {
         ws->tree.type = NODE_CLIENT;
         ws->tree.client = client;
         ws->tree.pos = (Rect) {
@@ -171,12 +172,13 @@ void wm_ws_tree_insert_client(Wm *wm, Workspace *ws, Client *client)
     }
 
     TreeNode *focused_node = wm_treenode_ptr_find_focused_client_node(&ws->tree);
+    assert(focused_node);
+
     Client *old_client = ws->tree.client;
     focused_node->type = wm_split_to_nodetype(ws->split);
 
-    TreeNode child1, child2;
-    wm_treenode_init(&child1, NODE_CLIENT, focused_node);
-    wm_treenode_init(&child2, NODE_CLIENT, focused_node);
+    TreeNode child1 = wm_treenode_new(NODE_CLIENT, focused_node);
+    TreeNode child2 = wm_treenode_new(NODE_CLIENT, focused_node);
 
     wm_treenode_split_space(focused_node, &child1.pos, &child2.pos);
     child1.client = old_client;
@@ -271,7 +273,7 @@ void wm_mstack(Wm *wm, Monitor *m)
         c->y = sy;
         c->w = wm->smon->info.width-wm->cfg_border_width*2;
         c->h = (wm->smon->info.height-wm->cfg_border_width*2)-sy;
-        ch = wm_client_to_xwchanges(*c);
+        ch = wm_client_to_xwchanges(c);
         DEBUG_PRINT("mstack client: 0x%x\n", c);
         // XGetWMName(wm->display, c->window, &xt);
         DEBUG_PRINT("mstack window id: %d\n", c->window);
@@ -300,7 +302,7 @@ void wm_mstack(Wm *wm, Monitor *m)
                     c->h = ((m->info.height)/(cc_sws-1)-wm->cfg_border_width*2);
                 }
                 n++;
-                ch = wm_client_to_xwchanges(*c);
+                ch = wm_client_to_xwchanges(c);
 
                 // TODO store wm name when client is created
 
@@ -343,32 +345,37 @@ void wm_set_layout(Wm *wm, void(*f)(Wm *wm, Monitor*))
 void wm_layout(Wm *wm, Monitor *m)
 {
     RETURN_IF_NULL(m);
+    size_t i;
+
+    DEBUG_PRINT("%s\n", __func__);
 
     Workspace *ws = &m->workspaces[m->selws];
     PtrArray clients = wm_treenode_find_client_nodes_ptr(&ws->tree);
 
-    for (size_t i = 0; i < clients.size; i++) {
-        TreeNode *node = (TreeNode*) clients.ptrs[i];
-        assert(node->client);
+    for (i = 0; i < clients.size; i++) {
+        TreeNode *node = clients.ptrs[i];
+        Client *client = node->client;
+        assert(client);
 
-        node->client->x = node->pos.x;
-        node->client->y = node->pos.y;
-        node->client->w = node->pos.w;
-        node->client->h = node->pos.h;
+        client->x = node->pos.x;
+        client->y = node->pos.y;
+        client->w = node->pos.w;
+        client->h = node->pos.h;
 
         unsigned int value_mask = CWX | CWY | CWWidth | CWHeight;
-        XWindowChanges xwc = wm_client_to_xwchanges(*node->client);
-        XConfigureWindow(wm->display, node->client->window, value_mask, &xwc);
-
-        if (node->client->focused)
-            wm_client_focus(wm, node->client);
+        XWindowChanges xwc = wm_client_to_xwchanges((client));
+        XConfigureWindow(wm->display, client->window, value_mask, &xwc);
+        wm_client_show(wm, client);
     }
 
+    wm_client_focus(wm, clients.ptrs[i]);
+
     XEvent e;
     XSync(wm->display, False);
     while(XCheckMaskEvent(wm->display, EnterWindowMask, &e));
 
     wm_monitor_clients_border(wm, m);
+    wm_ptrarray_free(&clients);
 }
 
 Client *wm_get_last_client(Wm *wm, Monitor m)