Index: Headers/AppKit/NSView.h
===================================================================
--- Headers/AppKit/NSView.h	(revision 33252)
+++ Headers/AppKit/NSView.h	(working copy)
@@ -151,6 +151,7 @@
 
   unsigned int _autoresizingMask;
   NSFocusRingType _focusRingType;
+  NSRect _autoresizingFrameError;
 }
 
 /*
Index: Source/NSView.m
===================================================================
--- Source/NSView.m	(revision 33252)
+++ Source/NSView.m	(working copy)
@@ -600,7 +600,7 @@
       NSWarnMLog(@"given negative height", 0);
       frameRect.size.height = 0;
     }
-  _frame = frameRect;			// Set frame rectangle
+  [self _setFrame: frameRect];			// Set frame rectangle
   _bounds.origin = NSZeroPoint;		// Set bounds rectangle
   _bounds.size = _frame.size;
 
@@ -1197,6 +1197,12 @@
    [_boundsMatrix scaleTo: scale.width : scale.height];
 }
 
+- (void) _setFrame: (NSRect)frameRect
+{
+  _frame = frameRect;
+  _autoresizingFrameError = NSZeroRect;
+}
+
 - (void) setFrame: (NSRect)frameRect
 {
   BOOL	changedOrigin = NO;
@@ -1225,7 +1231,7 @@
   
   if (changedSize == YES || changedOrigin == YES)
     {
-      _frame = frameRect;
+      [self _setFrame: frameRect];
 
       if (changedSize == YES)
         {
@@ -1265,11 +1271,13 @@
 {
   if (NSEqualPoints(_frame.origin, newOrigin) == NO)
     {
+      NSRect newFrame = _frame;
+      newFrame.origin = newOrigin;
       if (_coordinates_valid)
         {
           (*invalidateImp)(self, invalidateSel);
         }
-      _frame.origin = newOrigin;
+      [self _setFrame: newFrame];
       [self resetCursorRects];
       if (_post_frame_changes)
         {
@@ -1281,6 +1289,7 @@
 
 - (void) setFrameSize: (NSSize)newSize
 {
+  NSRect newFrame = _frame;
   if (newSize.width < 0)
     {
       NSWarnMLog(@"given negative width", 0);
@@ -1307,7 +1316,8 @@
               float sx = _bounds.size.width  / _frame.size.width;
               float sy = _bounds.size.height / _frame.size.height;
               
-              _frame.size = newSize;
+              newFrame.size = newSize;
+	      [self _setFrame: newFrame];
               _bounds.size.width  = _frame.size.width  * sx;
               _bounds.size.height = _frame.size.height * sy;
             }
@@ -1316,7 +1326,9 @@
               NSAffineTransform *matrix;
               NSRect frame;
               
-              _frame.size = newSize;
+              newFrame.size = newSize;
+	      [self _setFrame: newFrame];
+
               frame = _frame;
               frame.origin = NSMakePoint(0, 0);
               matrix = [_boundsMatrix copy];
@@ -1327,7 +1339,8 @@
         }
       else
         {
-          _frame.size = _bounds.size = newSize;
+          newFrame.size = _bounds.size = newSize;
+	  [self _setFrame: newFrame];
         }
       [self resetCursorRects];
       [self resizeSubviewsWithOldSize: old_size];
@@ -1949,11 +1962,27 @@
 {
   int		options = 0;
   NSSize	superViewFrameSize;
-  NSRect        newFrame = _frame;
+  NSRect        newFrame;
 
   if (_autoresizingMask == NSViewNotSizable)
     return;
 
+  newFrame = _frame;
+  if (!NSEqualRects(NSZeroRect, _autoresizingFrameError))
+    {
+      newFrame.origin.x -= _autoresizingFrameError.origin.x;
+      newFrame.origin.y -= _autoresizingFrameError.origin.y;
+      newFrame.size.width -= _autoresizingFrameError.size.width;
+      newFrame.size.height -= _autoresizingFrameError.size.height;
+
+      NSLog(@"1. %@ adding previous autoresize frame error: %@, to frame: %@ = %@",
+	    self,
+	    NSStringFromRect(_autoresizingFrameError),
+	    NSStringFromRect(_frame),
+	    NSStringFromRect(newFrame));
+
+    }
+
   superViewFrameSize = NSMakeSize(0,0);
   if (_super_view)
     superViewFrameSize = [_super_view frame].size;
@@ -2032,7 +2061,36 @@
 	}
     }
 
-  [self setFrame: newFrame];
+
+  NSRect newFrameRounded = newFrame;
+  if ([self isRotatedOrScaledFromBase] && [self superview] != nil)
+    {
+      newFrameRounded = [[self superview] convertRectToBase: newFrameRounded];
+    }
+
+  newFrameRounded.origin.x = round(newFrameRounded.origin.x);
+  newFrameRounded.origin.y = round(newFrameRounded.origin.y);
+  newFrameRounded.size.width = round(newFrameRounded.size.width);
+  newFrameRounded.size.height = round(newFrameRounded.size.height);
+
+  if ([self isRotatedOrScaledFromBase] && [self superview] != nil)
+    {
+      newFrameRounded = [[self superview] convertRectFromBase: newFrameRounded];
+    }
+
+  [self setFrame: newFrameRounded];
+
+  NSLog(@"2. %@ requested %@ (rounded from %@), got %@", self, 
+	NSStringFromRect(newFrameRounded),
+	NSStringFromRect(newFrame),
+	NSStringFromRect([self frame]));
+
+  _autoresizingFrameError.origin.x = (newFrameRounded.origin.x - newFrame.origin.x);
+  _autoresizingFrameError.origin.y = (newFrameRounded.origin.y - newFrame.origin.y);
+  _autoresizingFrameError.size.width = (newFrameRounded.size.width - newFrame.size.width);
+  _autoresizingFrameError.size.height = (newFrameRounded.size.height - newFrame.size.height);
+
+  NSLog(@"3. %@ Setting autoresizing frame error to %@",self, NSStringFromRect(_autoresizingFrameError));
 }
 
 - (void) _lockFocusInContext: (NSGraphicsContext *)ctxt inRect: (NSRect)rect
