=== modified file 'src/window-props.c'
--- src/window-props.c	
+++ src/window-props.c	
@@ -687,12 +687,31 @@
 reload_net_startup_id (MetaWindow    *window,
                        MetaPropValue *value)
 {
+  guint32 timestamp = window->net_wm_user_time;
+  MetaWorkspace *workspace = NULL;
+  
   g_free (window->startup_id);
   
   if (value->type != META_PROP_VALUE_INVALID)
     window->startup_id = g_strdup (value->v.str);
   else
     window->startup_id = NULL;
+    
+  /* Update timestamp and workspace on a running window */
+  if (!window->constructing)
+  {
+    window->initial_timestamp_set = 0;  
+    window->initial_workspace_set = 0;
+    
+    meta_screen_apply_startup_properties (window->screen, window);
+  
+    if (window->initial_timestamp_set)
+      timestamp = window->initial_timestamp;
+    if (window->initial_workspace_set)
+      workspace = meta_screen_get_workspace_by_index (window->screen, window->initial_workspace);
+    
+    meta_window_activate_with_workspace (window, timestamp, workspace);
+  }
   
   meta_verbose ("New _NET_STARTUP_ID \"%s\" for %s\n",
                 window->startup_id ? window->startup_id : "unset",

=== modified file 'src/window.c'
--- src/window.c	
+++ src/window.c	
@@ -2481,7 +2481,8 @@
 static void
 window_activate (MetaWindow     *window,
                  guint32         timestamp,
-                 MetaClientType  source_indication)
+                 MetaClientType  source_indication,
+                 MetaWorkspace  *workspace)
 {
   gboolean can_ignore_outdated_timestamps;
   meta_topic (META_DEBUG_FOCUS,
@@ -2521,11 +2522,11 @@
   /* disable show desktop mode unless we're a desktop component */
   maybe_leave_show_desktop_mode (window);
  
-  /* Get window on current workspace */
-  if (!meta_window_located_on_workspace (window,
-                                         window->screen->active_workspace))
-    meta_window_change_workspace (window,
-                                  window->screen->active_workspace);
+  /* Get window on current or given workspace */
+  if (workspace == NULL)
+    workspace = window->screen->active_workspace;
+  if (!meta_window_located_on_workspace (window, workspace))
+    meta_window_change_workspace (window, workspace);
   
   if (window->shaded)
     meta_window_unshade (window);
@@ -2554,7 +2555,19 @@
    * we were such.  If we change the pager behavior later, we could revisit
    * this and just add extra flags to window_activate.
    */
-  window_activate (window, timestamp, META_CLIENT_TYPE_PAGER);
+  window_activate (window, timestamp, META_CLIENT_TYPE_PAGER, NULL);
+}
+
+void
+meta_window_activate_with_workspace (MetaWindow     *window,
+                                     guint32         timestamp,
+                                     MetaWorkspace  *workspace)
+{
+  /* We're not really a pager, but the behavior we want is the same as if
+   * we were such.  If we change the pager behavior later, we could revisit
+   * this and just add extra flags to window_activate.
+   */
+  window_activate (window, timestamp, META_CLIENT_TYPE_APPLICATION, workspace);
 }
 
 /* Manually fix all the weirdness explained in the big comment at the
@@ -4735,7 +4748,7 @@
         /* Client using older EWMH _NET_ACTIVE_WINDOW without a timestamp */
         timestamp = meta_display_get_current_time (window->display);
 
-      window_activate (window, timestamp, source_indication);
+      window_activate (window, timestamp, source_indication, NULL);
       return TRUE;
     }
   

=== modified file 'src/window.h'
--- src/window.h	
+++ src/window.h	
@@ -401,6 +401,10 @@
 
 void        meta_window_activate           (MetaWindow  *window,
                                             guint32      current_time);
+void        meta_window_activate_with_workspace (MetaWindow *window,
+                                            guint32          current_time,
+                                            MetaWorkspace   *workspace);   
+                                                                                    
 void        meta_window_make_fullscreen    (MetaWindow  *window);
 void        meta_window_unmake_fullscreen  (MetaWindow  *window);
 

