Index: src/core/window.c
===================================================================
--- src/core/window.c	(revision 3925)
+++ src/core/window.c	(working copy)
@@ -480,6 +480,7 @@
     meta_topic (META_DEBUG_PLACEMENT,
                 "Not placing window 0x%lx since it's already mapped\n",
                 xwindow);
+  window->force_save_user_window_placement = TRUE;
   window->denied_focus_and_not_transient = FALSE;
   window->unmanaging = FALSE;
   window->is_in_queues = 0;
@@ -618,6 +619,7 @@
        * been iconic its whole life, we have no way of knowing.
        */
       window->placed = TRUE;
+      window->force_save_user_window_placement = FALSE;
     }
 
   /* Apply any window attributes such as initial workspace
@@ -939,6 +941,7 @@
       MetaMoveResizeFlags flags;
       
       window->placed = TRUE; /* don't do placement algorithms later */
+      window->force_save_user_window_placement = FALSE;
 
       x = info->rect.x;
       y = info->rect.y;
@@ -2132,6 +2135,7 @@
        * still get placed when they are ultimately shown.
        */
       window->placed = TRUE;
+      window->force_save_user_window_placement = FALSE;
 
       /* Don't want to accidentally reuse the fact that we had been denied
        * focus in any future constraints unless we're denied focus again.
@@ -2519,6 +2523,8 @@
     window->maximized_horizontally || maximize_horizontally;
   window->maximized_vertically = 
     window->maximized_vertically   || maximize_vertically;
+  if (maximize_horizontally || maximize_vertically)
+    window->force_save_user_window_placement = FALSE;
 
   /* Fix for #336850: If the frame shape isn't reapplied, it is
    * possible that the frame will retains its rounded corners. That
@@ -2621,6 +2627,7 @@
   gboolean unmaximize_horizontally, unmaximize_vertically;
   unmaximize_horizontally = directions & META_MAXIMIZE_HORIZONTAL;
   unmaximize_vertically   = directions & META_MAXIMIZE_VERTICAL;
+  guint save;
   g_assert (unmaximize_horizontally || unmaximize_vertically);
 
   /* Only do something if the window isn't already maximized in the
@@ -2674,12 +2681,15 @@
           window->display->grab_anchor_window_pos = target_rect;
         }
 
+      save = window->force_save_user_window_placement;
+      window->force_save_user_window_placement = TRUE;
       meta_window_move_resize (window,
                                FALSE,
                                target_rect.x,
                                target_rect.y,
                                target_rect.width,
                                target_rect.height);
+      window->force_save_user_window_placement = save;
 
       if (window->display->grab_wireframe_active)
         {
@@ -2730,6 +2740,7 @@
       meta_window_save_rect (window);
       
       window->fullscreen = TRUE;
+      window->force_save_user_window_placement = FALSE;
 
       meta_stack_freeze (window->screen->stack);
       meta_window_update_layer (window);
@@ -2760,6 +2771,7 @@
   if (window->fullscreen)
     {
       MetaRectangle target_rect;
+      guint save;
 
       meta_topic (META_DEBUG_WINDOW_OPS,
                   "Unfullscreening %s\n", window->desc);
@@ -2772,12 +2784,15 @@
        */
       ensure_size_hints_satisfied (&target_rect, &window->size_hints);
 
+      save = window->force_save_user_window_placement;
+      window->force_save_user_window_placement = TRUE;
       meta_window_move_resize (window,
                                FALSE,
                                target_rect.x,
                                target_rect.y,
                                target_rect.width,
                                target_rect.height);
+      window->force_save_user_window_placement = save;
 
       meta_window_update_layer (window);
       
@@ -3538,7 +3553,7 @@
   if (need_configure_notify)
     send_configure_notify (window);
 
-  if (!window->placed)
+  if (window->force_save_user_window_placement && !window->fullscreen)
     force_save_user_window_placement (window);
   else if (is_user_action)
     save_user_window_placement (window);
@@ -4514,6 +4529,7 @@
            * by the window manager.
            */
           window->placed = TRUE;
+          window->force_save_user_window_placement = FALSE;
         }
     }
   else
Index: src/core/window-private.h
===================================================================
--- src/core/window-private.h	(revision 3925)
+++ src/core/window-private.h	(working copy)
@@ -241,6 +241,9 @@
   /* Have we placed this window? */
   guint placed : 1;
 
+  /* Must we force_save_user_window_placement? */
+  guint force_save_user_window_placement : 1;
+
   /* Is this not a transient of the focus window which is being denied focus? */
   guint denied_focus_and_not_transient : 1;
 
