diff --git a/src/OsmMapControl.java b/src/OsmMapControl.java
index 61865fe..39ddc99 100644
--- a/src/OsmMapControl.java
+++ b/src/OsmMapControl.java
@@ -165,8 +165,8 @@ public class OsmMapControl extends MouseAdapter implements MouseMotionListener,
 					iStartSelectionPoint = null;
 				}
 				else if(e.getClickCount() == 2){
+					iSlippyMapChooser.zoomIn(e.getPoint());
 					iSlippyMapChooser.centerOnScreenPoint(e.getPoint());
-					iSlippyMapChooser.zoomIn();
 				}		
 			}
 		}			
@@ -208,11 +208,11 @@ public class OsmMapControl extends MouseAdapter implements MouseMotionListener,
 		int rot = e.getWheelRotation();
 		//scroll wheel rotated away from user
 		if(rot < 0){
-			iSlippyMapChooser.zoomIn();
+			iSlippyMapChooser.zoomIn(e.getPoint());
 		}
 		//scroll wheel rotated towards the user
 		else if(rot > 0){
-			iSlippyMapChooser.zoomOut();
+			iSlippyMapChooser.zoomOut(e.getPoint());
 		}
 	}
 
diff --git a/src/SlippyMapChooser.java b/src/SlippyMapChooser.java
index 6ca7b76..14e52d8 100644
--- a/src/SlippyMapChooser.java
+++ b/src/SlippyMapChooser.java
@@ -355,10 +355,10 @@ public class SlippyMapChooser extends JComponent implements DownloadSelection{
 	 * Zoom in one level	
 	 * Callback for OsmMapControl. Zoom out one level		 
 	 */
-	void zoomIn(){	
+	void zoomIn(Point curPos){	
 		
 		//cache center of screen and the selection rectangle
-		LatLon l = getLatLonOfScreenPoint(new Point(getWidth()/2, getHeight()/2));
+		LatLon l = getLatLonOfScreenPoint(curPos);
 		LatLon selStart = null;
 		LatLon selEnd   = null;
 		if(iSelectionRectEnd != null && iSelectionRectStart != null){
@@ -373,8 +373,7 @@ public class SlippyMapChooser extends JComponent implements DownloadSelection{
 			return;
 		}
 					
-		//center on cached location
-		centerOnLatLon(l);
+		setLatLonAtPoint(l, curPos);
 		
 		//restore selection 
 		if(selStart != null && selEnd != null){
@@ -393,9 +392,9 @@ public class SlippyMapChooser extends JComponent implements DownloadSelection{
 	 * Zoom out one level.
 	 * Callback for OsmMapControl. 
 	 */
-	void zoomOut(){
+	void zoomOut(Point curPos){
 		//cache center of screen and the selction rect
-		LatLon l = getLatLonOfScreenPoint(new Point(getWidth()/2, getHeight()/2));
+		LatLon l = getLatLonOfScreenPoint(curPos);
 		LatLon selStart = null;
 		LatLon selEnd   = null;
 		if(iSelectionRectEnd != null && iSelectionRectStart != null){
@@ -410,8 +409,7 @@ public class SlippyMapChooser extends JComponent implements DownloadSelection{
 			return;
 		}
 		
-		//center on cached location
-		centerOnLatLon(l);
+		setLatLonAtPoint(l, curPos);
 		
 		//restore selection 
 		if(selStart != null && selEnd != null){
@@ -484,11 +482,21 @@ public class SlippyMapChooser extends JComponent implements DownloadSelection{
 	 * Centers the map on the location given by LatLon
 	 * @param aLatLon the location to center on
 	 */
-	private void centerOnLatLon(LatLon aLatLon){		
+	private void centerOnLatLon(LatLon aLatLon){
+		setLatLonAtPoint(aLatLon, new Point(getWidth()/2,getHeight()/2));
+	}
+
+	/**
+	 * Moves the map that the specified latLon is shown at the point on screen
+	 * given
+	 * @param aLatLon a position
+	 * @param p a point on the screen
+	 */
+	private void setLatLonAtPoint(LatLon aLatLon, Point p){
 		int x = OsmMercator.LonToX(aLatLon.lon(), iZoomlevel);
 		int y = OsmMercator.LatToY(aLatLon.lat(), iZoomlevel);
-		iOffsetX = -x +getWidth()/2;
-		iOffsetY = -y +getHeight()/2;
+		iOffsetX = - x + p.x;
+		iOffsetY = - y + p.y;
 		repaint();
 	}
 	
