diff -rup mutter-3.2.2/src/core/constraints.h p_mutter-3.2.2/src/core/constraints.h
--- mutter-3.2.2/src/core/constraints.h	2011-08-25 22:08:00.000000000 +0200
+++ p_mutter-3.2.2/src/core/constraints.h	2012-01-22 03:35:22.343468731 +0100
@@ -35,7 +35,8 @@ typedef enum
   META_DO_GRAVITY_ADJUST    = 1 << 1,
   META_IS_USER_ACTION       = 1 << 2,
   META_IS_MOVE_ACTION       = 1 << 3,
-  META_IS_RESIZE_ACTION     = 1 << 4
+  META_IS_RESIZE_ACTION     = 1 << 4,
+  META_EXPLICIT_SAVE_REQUEST = 1 << 5
 } MetaMoveResizeFlags;
 
 void meta_window_constrain (MetaWindow          *window,
diff -rup mutter-3.2.2/src/core/keybindings.c p_mutter-3.2.2/src/core/keybindings.c
--- mutter-3.2.2/src/core/keybindings.c	2012-01-17 22:24:48.000000000 +0100
+++ p_mutter-3.2.2/src/core/keybindings.c	2012-01-22 03:58:04.280145868 +0100
@@ -1628,6 +1628,7 @@ process_mouse_move_resize_grab (MetaDisp
       else
         meta_window_move_resize (display->grab_window,
                                  TRUE,
+                                 FALSE,
                                  display->grab_initial_window_pos.x,
                                  display->grab_initial_window_pos.y,
                                  display->grab_initial_window_pos.width,
@@ -1690,6 +1691,7 @@ process_keyboard_move_grab (MetaDisplay
       else
         meta_window_move_resize (display->grab_window,
                                  TRUE,
+                                 FALSE,
                                  display->grab_initial_window_pos.x,
                                  display->grab_initial_window_pos.y,
                                  display->grab_initial_window_pos.width,
@@ -1913,6 +1915,7 @@ process_keyboard_resize_grab (MetaDispla
       /* End resize and restore to original state. */
       meta_window_move_resize (display->grab_window,
                                TRUE,
+                               FALSE,
                                display->grab_initial_window_pos.x,
                                display->grab_initial_window_pos.y,
                                display->grab_initial_window_pos.width,
@@ -2710,6 +2713,7 @@ handle_move_to_corner_backend (MetaDispl
 
   meta_window_move_resize (window,
           FALSE,
+          TRUE,
           new_x,
           new_y,
           window->rect.width,
@@ -2825,6 +2829,7 @@ handle_move_to_center  (MetaDisplay    *
   frame_height = (window->frame ? window->frame->child_y : 0);
 
   meta_window_move_resize (window,
+          FALSE,
           TRUE,
           work_area.x + (work_area.width +frame_width -outer.width )/2,
           work_area.y + (work_area.height+frame_height-outer.height)/2,
diff -rup mutter-3.2.2/src/core/window.c p_mutter-3.2.2/src/core/window.c
--- mutter-3.2.2/src/core/window.c	2012-01-17 22:24:48.000000000 +0100
+++ p_mutter-3.2.2/src/core/window.c	2012-01-22 03:57:53.760145788 +0100
@@ -3637,6 +3637,7 @@ unmaximize_window_before_freeing (MetaWi
        * before closing it. */
       meta_window_move_resize (window,
                                FALSE,
+                               FALSE,
                                window->saved_rect.x,
                                window->saved_rect.y,
                                window->saved_rect.width,
@@ -3914,6 +3915,7 @@ meta_window_unmake_fullscreen (MetaWindo
 
       meta_window_move_resize (window,
                                FALSE,
+                               FALSE,
                                target_rect.x,
                                target_rect.y,
                                target_rect.width,
@@ -4838,7 +4840,7 @@ meta_window_move_resize_internal (MetaWi
 
   if (!window->placed && window->force_save_user_rect && !window->fullscreen)
     force_save_user_window_placement (window);
-  else if (is_user_action)
+  else if (is_user_action || (flags & META_EXPLICIT_SAVE_REQUEST))
     save_user_window_placement (window);
 
   if (need_move_frame || need_resize_frame ||
@@ -4989,7 +4991,7 @@ meta_window_move_between_rects (MetaWind
   window->saved_rect.x = window->user_rect.x;
   window->saved_rect.y = window->user_rect.y;
 
-  meta_window_move_resize (window, FALSE,
+  meta_window_move_resize (window, FALSE, FALSE,
                            window->user_rect.x,
                            window->user_rect.y,
                            window->user_rect.width,
@@ -5029,6 +5031,7 @@ meta_window_move_to_monitor (MetaWindow
 void
 meta_window_move_resize (MetaWindow  *window,
                          gboolean     user_op,
+                         gboolean     explicit_save,
                          int          root_x_nw,
                          int          root_y_nw,
                          int          w,
@@ -5039,6 +5042,7 @@ meta_window_move_resize (MetaWindow  *wi
   g_return_if_fail (!window->override_redirect);
 
   flags = (user_op ? META_IS_USER_ACTION : 0) |
+    (explicit_save ? META_EXPLICIT_SAVE_REQUEST : 0) |
     META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
   meta_window_move_resize_internal (window,
                                     flags,
@@ -5073,7 +5077,7 @@ meta_window_move_resize_now (MetaWindow
    * the user had the window.  We use user_rect for this reason.  See
    * also bug 426519 comment 3.
    */
-  meta_window_move_resize (window, FALSE,
+  meta_window_move_resize (window, FALSE, FALSE,
                            window->user_rect.x,
                            window->user_rect.y,
                            window->user_rect.width,
@@ -8235,6 +8239,7 @@ meta_window_shove_titlebar_onscreen (Met
   newy = outer_rect.y + window->frame->child_y;
   meta_window_move_resize (window,
                            FALSE,
+                           FALSE,
                            newx,
                            newy,
                            window->rect.width,
diff -rup mutter-3.2.2/src/core/window-private.h p_mutter-3.2.2/src/core/window-private.h
--- mutter-3.2.2/src/core/window-private.h	2012-01-17 22:24:48.000000000 +0100
+++ p_mutter-3.2.2/src/core/window-private.h	2012-01-22 03:43:14.390139025 +0100
@@ -489,6 +489,7 @@ void        meta_window_resize
                                             int          h);
 void        meta_window_move_resize        (MetaWindow  *window,
                                             gboolean     user_op,
+                                            gboolean     explicit_save,
                                             int          root_x_nw,
                                             int          root_y_nw,
                                             int          w,
