diff -ur -X excl.list libwnck.hp1/libwnck/pager.c libwnck/libwnck/pager.c
--- libwnck.hp1/libwnck/pager.c	2003-04-02 18:22:07.000000000 +0200
+++ libwnck/libwnck/pager.c	2003-04-02 22:02:01.000000000 +0200
@@ -1078,7 +1078,11 @@
               wnck_workspace_activate (space);
 
               /* EWMH only lets us move the viewport for the active workspace */
+	      /* Yes, but space is the active one by the time the viewport hint
+	       * hits the WM. It should be possible to change the desktop *and*
+	       * the viewport in one mouse click.
               if (space == wnck_screen_get_active_workspace (pager->priv->screen))
+	       */
                 wnck_screen_move_viewport (pager->priv->screen,
                                            viewport_x, viewport_y);
               
diff -ur -X excl.list libwnck.hp1/libwnck/screen.c libwnck/libwnck/screen.c
--- libwnck.hp1/libwnck/screen.c	2003-04-02 18:22:07.000000000 +0200
+++ libwnck/libwnck/screen.c	2003-04-02 23:50:46.000000000 +0200
@@ -1419,6 +1419,17 @@
       screen->priv->update_handler = 0;
     }
 
+  /* if number of workspaces changes, we have to
+   * update the per-workspace information as well
+   * in case the WM changed the per-workspace info
+   * first and number of spaces second.
+   */
+  if (screen->priv->need_update_workspace_list)
+  {
+	  screen->priv->need_update_viewport_settings = TRUE;
+	  screen->priv->need_update_workspace_names = TRUE;
+  }
+
   /* First get our big-picture state in order */
   update_workspace_list (screen);
   update_client_list (screen);
diff -ur -X excl.list libwnck.hp1/libwnck/tasklist.c libwnck/libwnck/tasklist.c
--- libwnck.hp1/libwnck/tasklist.c	2003-04-02 18:22:07.000000000 +0200
+++ libwnck/libwnck/tasklist.c	2003-04-03 00:20:16.000000000 +0200
@@ -64,7 +64,7 @@
 
 #define TIMEOUT_ACTIVATE 1000
 
-#define N_SCREEN_CONNECTIONS 4
+#define N_SCREEN_CONNECTIONS 5
 
 typedef enum
 {
@@ -217,6 +217,8 @@
 							WnckTasklist *tasklist);
 static void     wnck_tasklist_active_workspace_changed (WnckScreen   *screen,
 							WnckTasklist *tasklist);
+static void     wnck_tasklist_viewports_changed        (WnckScreen   *screen,
+							WnckTasklist *tasklist);
 static void     wnck_tasklist_window_added             (WnckScreen   *screen,
 							WnckWindow   *win,
 							WnckTasklist *tasklist);
@@ -1243,6 +1245,9 @@
   c [i++] = g_signal_connect_object (G_OBJECT (screen), "active_workspace_changed",
                                      G_CALLBACK (wnck_tasklist_active_workspace_changed),
                                      tasklist, 0);
+  c [i++] = g_signal_connect_object (G_OBJECT (screen), "viewports_changed",
+                                     G_CALLBACK (wnck_tasklist_viewports_changed),
+                                     tasklist, 0);
   c [i++] = g_signal_connect_object (G_OBJECT (screen), "window_opened",
                                      G_CALLBACK (wnck_tasklist_window_added),
                                      tasklist, 0);
@@ -1542,6 +1547,14 @@
 }
 
 static void
+wnck_tasklist_viewports_changed (WnckScreen   *screen,
+				 WnckTasklist *tasklist)
+{
+  wnck_tasklist_update_lists (tasklist);
+  gtk_widget_queue_resize (GTK_WIDGET (tasklist));
+}
+
+static void
 wnck_tasklist_window_changed_workspace (WnckWindow   *window,
 					WnckTasklist *tasklist)
 {
diff -ur -X excl.list libwnck.hp1/libwnck/window.c libwnck/libwnck/window.c
--- libwnck.hp1/libwnck/window.c	2003-04-02 18:22:07.000000000 +0200
+++ libwnck/libwnck/window.c	2003-04-03 00:02:02.000000000 +0200
@@ -1310,13 +1310,13 @@
       !wnck_window_is_pinned (window))
     return FALSE;
 
-  viewport_rect.x = wnck_workspace_get_viewport_x (workspace);
-  viewport_rect.y = wnck_workspace_get_viewport_y (workspace);
+  viewport_rect.x = 0;
+  viewport_rect.y = 0;
   viewport_rect.width = wnck_screen_get_width (window->priv->screen);
   viewport_rect.height = wnck_screen_get_height (window->priv->screen);
 
-  window_rect.x = window->priv->x + viewport_rect.x;
-  window_rect.y = window->priv->y + viewport_rect.y;
+  window_rect.x = window->priv->x;
+  window_rect.y = window->priv->y;
   window_rect.width = window->priv->width;
   window_rect.height = window->priv->height;
 
