Index: src/core/constraints.c
===================================================================
--- src/core/constraints.c	(revision 4239)
+++ src/core/constraints.c	(working copy)
@@ -526,10 +526,11 @@
   if (window->placed || did_placement)
     {
       if (window->maximize_horizontally_after_placement ||
-          window->maximize_vertically_after_placement)
+          window->maximize_vertically_after_placement   ||
+          window->fullscreen_after_placement)
         {
-          /* define a sane saved_rect so that the user can unmaximize to
-           * something reasonable.
+          /* define a sane saved_rect so that the user can unmaximize or
+           * make unfullscreen to something reasonable.
            */
           if (info->current.width >= info->work_area_xinerama.width)
             {
@@ -556,6 +557,13 @@
           if (window->frame && !window->fullscreen)
             meta_frame_calc_geometry (window->frame, info->fgeom);
 
+          if (window->fullscreen_after_placement)
+            {
+              window->saved_rect = info->current;
+              window->fullscreen = TRUE;
+              window->fullscreen_after_placement = FALSE;
+            }
+
           window->maximize_horizontally_after_placement = FALSE;
           window->maximize_vertically_after_placement = FALSE;
         }
Index: src/core/window.c
===================================================================
--- src/core/window.c	(revision 4239)
+++ src/core/window.c	(working copy)
@@ -457,7 +457,7 @@
   window->maximize_horizontally_after_placement = FALSE;
   window->maximize_vertically_after_placement = FALSE;
   window->minimize_after_placement = FALSE;
-  window->fullscreen = FALSE;
+  window->fullscreen_after_placement = FALSE;
   window->fullscreen_monitors[0] = -1;
   window->require_fully_onscreen = TRUE;
   window->require_on_single_xinerama = TRUE;
@@ -478,6 +478,7 @@
     meta_topic (META_DEBUG_PLACEMENT,
                 "Not placing window 0x%lx since it's already mapped\n",
                 xwindow);
+  window->force_save_user_rect = TRUE;
   window->denied_focus_and_not_transient = FALSE;
   window->unmanaging = FALSE;
   window->is_in_queues = 0;
@@ -2548,6 +2549,8 @@
     window->maximized_horizontally || maximize_horizontally;
   window->maximized_vertically = 
     window->maximized_vertically   || maximize_vertically;
+  if (maximize_horizontally || maximize_vertically)
+    window->force_save_user_rect = FALSE;
 
   /* Fix for #336850: If the frame shape isn't reapplied, it is
    * possible that the frame will retains its rounded corners. That
@@ -2710,6 +2713,10 @@
                                target_rect.width,
                                target_rect.height);
 
+      /* Make sure user_rect is current.
+       */
+      force_save_user_window_placement (window);
+
       if (window->display->grab_wireframe_active)
         {
           window->display->grab_wireframe_rect = target_rect;
@@ -2759,6 +2766,7 @@
       meta_window_save_rect (window);
       
       window->fullscreen = TRUE;
+      window->force_save_user_rect = FALSE;
 
       meta_stack_freeze (window->screen->stack);
       meta_window_update_layer (window);
@@ -2808,6 +2816,10 @@
                                target_rect.width,
                                target_rect.height);
 
+      /* Make sure user_rect is current.
+       */
+      force_save_user_window_placement (window);
+
       meta_window_update_layer (window);
       
       recalc_window_features (window);
@@ -3610,7 +3622,7 @@
   if (need_configure_notify)
     send_configure_notify (window);
 
-  if (!window->placed)
+  if (!window->placed && window->force_save_user_rect && !window->fullscreen)
     force_save_user_window_placement (window);
   else if (is_user_action)
     save_user_window_placement (window);
Index: src/core/window-props.c
===================================================================
--- src/core/window-props.c	(revision 4239)
+++ src/core/window-props.c	(working copy)
@@ -624,6 +624,7 @@
   window->shaded = FALSE;
   window->maximized_horizontally = FALSE;
   window->maximized_vertically = FALSE;
+  window->fullscreen = FALSE;
   window->wm_state_modal = FALSE;
   window->wm_state_skip_taskbar = FALSE;
   window->wm_state_skip_pager = FALSE;
@@ -652,7 +653,7 @@
       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_SKIP_PAGER)
         window->wm_state_skip_pager = TRUE;
       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_FULLSCREEN)
-        window->fullscreen = TRUE;
+        window->fullscreen_after_placement = TRUE;
       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_ABOVE)
         window->wm_state_above = TRUE;
       else if (value->v.atom_list.atoms[i] == window->display->atom__NET_WM_STATE_BELOW)
Index: src/core/window-private.h
===================================================================
--- src/core/window-private.h	(revision 4239)
+++ src/core/window-private.h	(working copy)
@@ -144,6 +144,9 @@
   /* Whether we're fullscreen */
   guint fullscreen : 1;
 
+  /* Whether we have to fullscreen after placement */
+  guint fullscreen_after_placement : 1;
+
   /* Area to cover when in fullscreen mode.  If _NET_WM_FULLSCREEN_MONITORS has
    * been overridden (via a client message), the window will cover the union of
    * these monitors.  If not, this is the single monitor which the window's
@@ -247,6 +250,9 @@
   /* Have we placed this window? */
   guint placed : 1;
 
+  /* Must we force_save_user_window_placement? */
+  guint force_save_user_rect : 1;
+
   /* Is this not a transient of the focus window which is being denied focus? */
   guint denied_focus_and_not_transient : 1;
 
