Index: /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerAction.java
===================================================================
--- /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerAction.java	(revision 12185)
+++ /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerAction.java	(revision 12186)
@@ -9,12 +9,11 @@
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
-import java.io.BufferedReader;
 import java.io.File;
-import java.io.InputStreamReader;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Vector;
 
 import javax.swing.JOptionPane;
@@ -22,17 +21,14 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.command.AddCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.tools.ImageProvider;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.command.AddCommand;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.tools.Shortcut;
-
 import org.xml.sax.SAXException;
 
@@ -53,4 +49,10 @@
   protected Collection<Command> commands = new LinkedList<Command>();
   protected Collection<Way> ways = new ArrayList<Way>();
+
+  /** maximum size in bytes for the sum of all tiles in a WMS-layer cache directory. */
+  private static final long MAXCACHESIZE = 20*1024*1024*1024;
+
+  /** maximum age in ms since epoch for tiles in a WMS-layer cache directory. */
+  private static final long MAXCACHEAGE = 3650*24*60*60*1000;
   
   public LakewalkerAction(String name) {
@@ -91,4 +93,55 @@
   }
 
+   
+  
+  /**
+   * check for presence of cache folder and trim cache to specified size.
+   * size/age limit is on a per folder basis.
+   */
+  private void cleanupCache() {
+
+	  for (String wmsFolder : LakewalkerPreferences.WMSLAYERS) {
+		  String wmsCacheDirName = Main.pref.getPreferencesDir()+"plugins/Lakewalker/"+wmsFolder;
+		  File wmsCacheDir = new File(wmsCacheDirName);
+
+		  if (wmsCacheDir.exists() && wmsCacheDir.isDirectory()) {
+			  File wmsCache[] = wmsCacheDir.listFiles();
+
+			  // sort files by date (most recent first)
+			  Arrays.sort(wmsCache, new Comparator<File>() {
+				  public int compare(File f1, File f2) {
+					  return (int)(f2.lastModified()-f1.lastModified());
+				  }
+			  });
+			  
+			  // delete aged or oversized, keep newest. Once size/age limit was reached delete all older files
+			  long folderSize = 0;
+			  long timeDefiningOverage = System.currentTimeMillis()-MAXCACHEAGE;
+			  boolean quickdelete = false;
+			  for (File cacheEntry : wmsCache) {
+				  if (!cacheEntry.isFile()) continue;
+				  if (!quickdelete) {
+					  folderSize += cacheEntry.length();
+					  if (folderSize > MAXCACHESIZE) {
+						  quickdelete = true;
+					  } else if (cacheEntry.lastModified() < timeDefiningOverage) {
+						  quickdelete = true;
+					  }
+				  }
+					  
+				  if (quickdelete) {
+					  cacheEntry.delete();
+				  }
+			  }
+			  
+		  } else {
+			  // create cache directory
+			  if (!wmsCacheDir.mkdirs()) {
+				  JOptionPane.showMessageDialog(Main.parent, tr("Error creating cache directory: {0}", wmsCacheDirName));
+			  }
+		  }
+	  }
+  }
+  
   protected void lakewalk(Point clickPoint){
 	/**
@@ -120,4 +173,6 @@
         PleaseWaitRunnable lakewalkerTask = new PleaseWaitRunnable(tr("Tracing")){
           @Override protected void realRun() throws SAXException {
+        	  setStatus(tr("checking cache..."));
+        	  cleanupCache();
         	  processnodelist(pos, topLeft, botRight, waylen,maxnode,threshold,epsilon,resolution,tilesize,startdir,wmslayer,working_dir);
           }
@@ -192,10 +247,8 @@
 	Way way = new Way();
 	Node n = null;
-	Node tn = null;
 	Node fn = null;
 	
 	double eastOffset = Main.pref.getDouble(LakewalkerPreferences.PREF_EAST_OFFSET, 0.0);
 	double northOffset = Main.pref.getDouble(LakewalkerPreferences.PREF_NORTH_OFFSET, 0.0);
-	char option = ' ';
 	
 	int nodesinway = 0;
