diff --git a/src/client.c b/src/client.c
index 6edf06b043b2de56dcbcdf6962081cd4704ff7d2..29b4a4511fabf9c31701e65194dfb64817addc56 100644
--- a/src/client.c
+++ b/src/client.c
@@ -600,7 +600,7 @@ static void clientWindowType (Client *c)
     }
     if ((old_type != c->type) || (layer != c->win_layer))
     {
-        DBG("setting state and layer %i\n", layer);
+        DBG("setting layer %i\n", layer);
 	clientSetNetState (c);
 	clientSetLayer(c, layer);
     }
diff --git a/src/hints.c b/src/hints.c
index 7cf6220ee14ee15c4bd901e920ba89200decf0a2..4c500a2f20411afb974a08ebf0af79bf611b4b19 100644
--- a/src/hints.c
+++ b/src/hints.c
@@ -404,19 +404,35 @@ int get_cardinal_list (Display *dpy, Window w, Atom xatom, unsigned long **cardi
     return True;
 }
 
-void set_net_workarea (Display * dpy, Window w, CARD32 *margins)
+void set_net_workarea (Display * dpy, Window w, int nb_workspaces, CARD32 *margins)
 {
-    unsigned long data[4];
-    data[0] = margins[MARGIN_LEFT];
-    data[1] = margins[MARGIN_TOP];
-    data[2] = XDisplayWidth(dpy, screen) - (margins[MARGIN_LEFT] + margins[MARGIN_RIGHT]);
-    data[3] = XDisplayHeight(dpy, screen) - (margins[MARGIN_TOP] + margins[MARGIN_BOTTOM]);
-    XChangeProperty (dpy, w, net_workarea, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 4);
+    unsigned long *data, *ptr;
+    int i, j;
+    
+    DBG("entering set_net_workarea\n");
+    j = (nb_workspaces ? nb_workspaces : 1);
+    data = (unsigned long *) malloc (sizeof (unsigned long) * j * 4);
+    if (!data)
+    {
+        gdk_beep();
+        return;
+    }
+    ptr = data;
+    for (i = 0; i < j; i++)
+    {
+	*ptr++ = margins[MARGIN_LEFT];
+	*ptr++ = margins[MARGIN_TOP];
+	*ptr++ = XDisplayWidth(dpy, screen) - (margins[MARGIN_LEFT] + margins[MARGIN_RIGHT]);
+	*ptr++ = XDisplayHeight(dpy, screen) - (margins[MARGIN_TOP] + margins[MARGIN_BOTTOM]);
+    }
+    XChangeProperty (dpy, w, net_workarea, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, j * 4);
+    free (data);
 }
 
 void init_net_desktop_params (Display * dpy, Window w, int workspace)
 {
     unsigned long data[2];
+    DBG("entering init_net_desktop_params\n");
     data[0] = XDisplayWidth(dpy, screen);
     data[1] = XDisplayHeight(dpy, screen);
     XChangeProperty (dpy, w, net_desktop_geometry, XA_CARDINAL, 32, PropModeReplace, (unsigned char *) data, 2);
@@ -431,6 +447,8 @@ void init_net_desktop_params (Display * dpy, Window w, int workspace)
 void
 set_utf8_string_hint (Display *dpy, Window w, Atom atom, const char *val)
 {
+    DBG("entering set_utf8_string_hint\n");
+
     XChangeProperty (dpy, w, atom, utf8_string,  8, PropModeReplace, (unsigned char *) val, strlen (val) + 1);
 }
 
diff --git a/src/hints.h b/src/hints.h
index e2a99c9f2267ecb8615b133ddf78ce270860c682..2326f5a029eacdc17b54f1204165021fe47be823 100644
--- a/src/hints.h
+++ b/src/hints.h
@@ -144,7 +144,7 @@ int getNetHint(Display *, Window, Atom, long *);
 void set_net_supported_hint (Display *, Window, Window);
 int get_atom_list (Display *, Window, Atom, Atom **, int *);
 int get_cardinal_list (Display *, Window, Atom, unsigned long **, int *);
-void set_net_workarea (Display *, Window, CARD32 *);
+void set_net_workarea (Display *, Window, int, CARD32 *);
 void init_net_desktop_params (Display *, Window, int);
 void set_utf8_string_hint (Display *, Window, Atom, const char *);
 void getTransientFor(Display * dpy, Window w, Window *transient_for);
diff --git a/src/main.c b/src/main.c
index 7d0fcf9c7f473ea6e876285916ee70d4d730d9c7..837927218d58cb58e030d55ee33134f248b68adf 100644
--- a/src/main.c
+++ b/src/main.c
@@ -174,6 +174,7 @@ void initialize(int argc, char **argv)
     init_net_desktop_params (dpy, root, workspace);
     initSettings();
     loadSettings();
+    set_net_workarea (dpy, root, workspace_count, margins);
     XSetInputFocus(dpy, gnome_win, RevertToNone, CurrentTime);
     initGtkCallbacks ();
     clientFrameAll();
diff --git a/src/workspaces.c b/src/workspaces.c
index 850ed63e542c04c673d110aecb5cf23839203c7c..a598c5b1d4bb413ee200d933f18c327aeda48c03 100644
--- a/src/workspaces.c
+++ b/src/workspaces.c
@@ -157,6 +157,7 @@ void workspaceSetCount(int count)
     {
         workspaceSwitch(count - 1, NULL);
     }
+    set_net_workarea (dpy, root, workspace_count, margins);
 }
 
 void workspaceUpdateArea(CARD32 *margins, CARD32 *gnome_margins)
@@ -188,6 +189,6 @@ void workspaceUpdateArea(CARD32 *margins, CARD32 *gnome_margins)
     if ((prev_top != margins[MARGIN_TOP]) || (prev_left != margins[MARGIN_LEFT]) || (prev_right != margins[MARGIN_RIGHT]) || (prev_bottom != margins[MARGIN_BOTTOM]))
     {
         DBG("Margins have changed, updating net_workarea\n");
-        set_net_workarea (dpy, root, margins);
+        set_net_workarea (dpy, root, workspace_count, margins);
     }
 }