Index: applications/editors/josm/plugins/slippy_map_chooser/src/OsmMapControl.java
===================================================================
--- applications/editors/josm/plugins/slippy_map_chooser/src/OsmMapControl.java	(revision 7342)
+++ applications/editors/josm/plugins/slippy_map_chooser/src/OsmMapControl.java	(revision 7343)
@@ -166,6 +166,6 @@
 				}
 				else if(e.getClickCount() == 2){
+					iSlippyMapChooser.zoomIn(e.getPoint());
 					iSlippyMapChooser.centerOnScreenPoint(e.getPoint());
-					iSlippyMapChooser.zoomIn();
 				}		
 			}
@@ -209,9 +209,9 @@
 		//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());
 		}
 	}
Index: applications/editors/josm/plugins/slippy_map_chooser/src/OsmTile.java
===================================================================
--- applications/editors/josm/plugins/slippy_map_chooser/src/OsmTile.java	(revision 7342)
+++ applications/editors/josm/plugins/slippy_map_chooser/src/OsmTile.java	(revision 7343)
@@ -1,7 +1,11 @@
 // License: GPL. Copyright 2007 by Tim Haussmann
 
+import java.awt.geom.AffineTransform;
 import java.awt.image.BufferedImage;
 import java.awt.Color;
 import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.RenderingHints;
+import java.awt.Shape;
 
 /**
@@ -48,5 +52,5 @@
 	}
 	
-	public void paint(Graphics g){
+	public void paint(Graphics g,TileDB db){
 		
 		if(iMapImage != null && ! isInvalid){
@@ -57,8 +61,29 @@
 		}
 		else{
-			g.setColor(Color.RED);
-			g.drawLine(iX, iY, iX+WIDTH-1, iY+HEIGHT-1);
-			g.drawLine(iX, iY+HEIGHT-1, iX+WIDTH-1, iY);
-			g.drawRect(iX, iY, WIDTH-1, HEIGHT-1);
+			// first try to interpolate tile from parent			
+			OsmTile parent = getParent(db);
+			if (parent!=null){
+				Graphics2D g2d = (Graphics2D) g;
+				AffineTransform oldTr = g2d.getTransform();
+				Shape oldClip = g2d.getClip();
+				g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
+				
+				// since the parent will paint 4 tiles in the 
+				// current zoom level we have to clip the drawing
+				// region to the current tile
+				g2d.clipRect(iX, iY, WIDTH, HEIGHT);
+				g2d.scale(2, 2);				
+				parent.paint(g,db);
+				
+				g2d.setTransform(oldTr);
+				g2d.setClip(oldClip);
+			}
+			else{
+				// otherwise draw placeholder
+				g.setColor(Color.RED);
+				g.drawLine(iX, iY, iX+WIDTH-1, iY+HEIGHT-1);
+				g.drawLine(iX, iY+HEIGHT-1, iX+WIDTH-1, iY);
+				g.drawRect(iX, iY, WIDTH-1, HEIGHT-1);
+			}
 		}
 	} 
@@ -93,3 +118,10 @@
 	}
 	
+	public OsmTile getParent(TileDB db){
+		return iZoomLevel == 0 ? null : db.get(parentKey());
+	}
+
+	public String parentKey() {
+		return key(iZoomLevel - 1,iIndexX/2,iIndexY/2);
+	}
 }
Index: applications/editors/josm/plugins/slippy_map_chooser/src/SlippyMapChooser.java
===================================================================
--- applications/editors/josm/plugins/slippy_map_chooser/src/SlippyMapChooser.java	(revision 7342)
+++ applications/editors/josm/plugins/slippy_map_chooser/src/SlippyMapChooser.java	(revision 7343)
@@ -185,5 +185,5 @@
 				OsmTile t = iTileDB.get(OsmTile.key(iZoomlevel,  (-iOffsetX + x*OsmTile.WIDTH)/OsmTile.WIDTH, ((-iOffsetY+ y*OsmTile.HEIGHT)/OsmTile.HEIGHT)));
 				if(t != null){
-					t.paint(g);						
+					t.paint(g,iTileDB);						
 				}
 			} 
@@ -204,4 +204,13 @@
 		
 		iSizeButton.paint(g);
+		
+		
+		if(SlippyMapChooserPlugin.DEBUG_MODE){
+			g.setColor(Color.black);
+			g.drawString("Free Memory: " + Runtime.getRuntime().freeMemory()/1024 + "/" + Runtime.getRuntime().totalMemory()/1024 + "kB" , 5, 50);
+			g.drawString("Tiles in DB: " + iTileDB.getCachedTilesSize(), 5, 65);
+			g.drawString("Loading Queue Size: " + iTileDB.getLoadingQueueSize(), 5, 80);
+			
+		}
 	}
 
@@ -356,8 +365,8 @@
 	 * 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;
@@ -374,6 +383,5 @@
 		}
 					
-		//center on cached location
-		centerOnLatLon(l);
+		setLatLonAtPoint(l, curPos);
 		
 		//restore selection 
@@ -394,7 +402,7 @@
 	 * 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;
@@ -411,6 +419,5 @@
 		}
 		
-		//center on cached location
-		centerOnLatLon(l);
+		setLatLonAtPoint(l, curPos);
 		
 		//restore selection 
@@ -485,9 +492,19 @@
 	 * @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();
 	}
Index: applications/editors/josm/plugins/slippy_map_chooser/src/SlippyMapChooserPlugin.java
===================================================================
--- applications/editors/josm/plugins/slippy_map_chooser/src/SlippyMapChooserPlugin.java	(revision 7342)
+++ applications/editors/josm/plugins/slippy_map_chooser/src/SlippyMapChooserPlugin.java	(revision 7343)
@@ -18,7 +18,9 @@
 	private static final String KEY_MAX_TILES_IN_DB = "slippy_map_chooser.max_tiles";
 	private static final String KEY_MAX_TILES_REDUCE_BY = "slippy_map_chooser.max_tiles_reduce_by";
+	public static boolean DEBUG_MODE = false;
 	
-	static int MAX_TILES_IN_DB = 1000;
-	static int MAX_TILES_REDUCE_BY = 100;
+	
+	static int MAX_TILES_IN_DB = 200;
+	static int MAX_TILES_REDUCE_BY = 40;
 	
 	public SlippyMapChooserPlugin(){
@@ -74,6 +76,3 @@
 	}
 	
-	
-	
-	
 }
