===================================================================
--- lib/OpenLayers/Layer/Image.js    (revision 8489)
+++ lib/OpenLayers/Layer/Image.js    (working copy)
@@ -47,13 +47,6 @@
     tile: null,
 
     /**
-     * Property: aspectRatio
-     * {Float} The ratio of height/width represented by a single pixel in the
-     * graphic
-     */
-    aspectRatio: null,
-
-    /**
      * Constructor: OpenLayers.Layer.Image
      * Create a new image layer
      *
@@ -69,9 +62,6 @@
         this.extent = extent;
         this.size = size;
         OpenLayers.Layer.prototype.initialize.apply(this, [name, options]);
-
-        this.aspectRatio = (this.extent.getHeight() / this.size.h) /
-                           (this.extent.getWidth() / this.size.w);
     },   
 
     /**
@@ -128,9 +118,9 @@
          * image will be stretched in one dimension only.
          */
         if( this.options.maxResolution == null ) {
-            this.options.maxResolution = this.aspectRatio *
-                                         this.extent.getWidth() /
-                                         this.size.w;
+            var wRes = this.extent.getWidth() / this.size.w;
+            var hRes = this.extent.getHeight() / this.size.h;
+            this.options.maxResolution = Math.min(wRes, hRes);
         }
         OpenLayers.Layer.prototype.setMap.apply(this, arguments);
     },
@@ -155,8 +145,10 @@
             this.setTileSize();
 
             //determine new position (upper left corner of new bounds)
-            var ul = new OpenLayers.LonLat(this.extent.left, this.extent.top);
-            var ulPx = this.map.getLayerPxFromLonLat(ul);
+            var center = this.extent.getCenterLonLat();
+            var centerPx = this.map.getLayerPxFromLonLat(center);
+            var ulPx = new OpenLayers.Pixel(centerPx.x - (this.tileSize.w / 2),
+                     centerPx.y - (this.tileSize.h / 2));
 
             if(firstRendering) {
                 //create the new tile
@@ -175,10 +167,23 @@
      * Set the tile size based on the map size.
      */
     setTileSize: function() {
-        var tileWidth = this.extent.getWidth() / this.map.getResolution();
-        var tileHeight = this.extent.getHeight() / this.map.getResolution();
-        this.tileSize = new OpenLayers.Size(tileWidth, tileHeight);
+        var w = this.extent.getWidth() / this.map.getResolution();
+        var h = this.extent.getHeight() / this.map.getResolution();
+       
+        this.tileSize = this.getLockedSize(w, h);
     },
+   
+    getLockedSize: function(w, h) {
+        var tileWidth = w;
+        var tileHeight = h;
+        if(this.size.h > this.size.w) {
+            tileHeight = Math.floor(this.size.h * (w / this.size.w));
+        } else {
+            tileWidth = Math.floor(this.size.w * (h / this.size.h));
+        }
+       
+        return new OpenLayers.Size(tileWidth, tileHeight);
+    },
 
     /**
      * APIMethod: setUrl