Index: /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/Lakewalker.java
===================================================================
--- /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/Lakewalker.java	(revision 6922)
+++ /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/Lakewalker.java	(revision 6923)
@@ -119,9 +119,5 @@
 			}
 			
-			v = wms.getPixel(xy[0], xy[1],0xFF00FF00);
-			if(v < 0){
-				return null;
-			}
-			
+			v = wms.getPixel(xy[0], xy[1]);
 			if(v > this.threshold){
 				break;
@@ -169,12 +165,9 @@
 				
 				if(!bbox.contains(geo[0], geo[1])){
-					/**
-					 * TODO: Handle this case
-					 */
 					System.out.println("Outside bbox");
 					break;
 				}
 				
-				v = wms.getPixel(test_x, test_y,0xFF0000FF);
+				v = wms.getPixel(test_x, test_y);
 				if(v > this.threshold){
 					break;
@@ -218,13 +211,48 @@
 			}			
 		}
-			
-		// DEBUG
-		File f = new File(this.workingdir,"temp.png");
-		wms.saveimage(f,wms.image2);	
-		
+
 		return nodelist;
 	}
 	
-	public ArrayList<double[]> vertex_reduce(ArrayList<double[]> nodes, double proximity){
+	/**
+	 * Remove duplicate nodes from the list
+	 * 
+	 * @param nodes
+	 * @return
+	 */
+	public ArrayList<double[]> duplicateNodeRemove(ArrayList<double[]> nodes){
+		
+		double lastnode[] = new double[] {nodes.get(0)[0], nodes.get(0)[1]};
+		
+		for(int i = 1; i < nodes.size(); i++){
+			double[] thisnode = new double[] {nodes.get(i)[0], nodes.get(i)[1]};
+			
+			if(thisnode[0] == lastnode[0] && thisnode[1] == lastnode[1]){
+				// Remove the node
+				nodes.remove(i);
+				
+				// Shift back one index 
+				i = i - 1;
+			}
+			lastnode = thisnode;
+		}
+		
+		return nodes;
+	}
+	
+	/**
+	 * Reduce the number of vertices based on their proximity to each other 
+	 * 
+	 * @param nodes
+	 * @param proximity
+	 * @return
+	 */
+	public ArrayList<double[]> vertexReduce(ArrayList<double[]> nodes, double proximity){
+		
+		// Check if node list is empty
+		if(nodes.size()==0){
+			return nodes;
+		}
+		
 		double[] test_v = nodes.get(0);
 		ArrayList<double[]> reducednodes = new ArrayList<double[]>();
@@ -242,5 +270,5 @@
 	}
 	
-	public double point_line_distance(double[] p1, double[] p2, double[] p3){
+	public double pointLineDistance(double[] p1, double[] p2, double[] p3){
 		
 		double x0 = p1[0]; 
@@ -258,5 +286,11 @@
 	}
 	
-	public ArrayList<double[]> douglas_peucker(ArrayList<double[]> nodes, double epsilon){
+	public ArrayList<double[]> douglasPeucker(ArrayList<double[]> nodes, double epsilon){
+		
+		// Check if node list is empty
+		if(nodes.size()==0){
+			return nodes;
+		}
+		
 		int farthest_node = -1;
 		double farthest_dist = 0;
@@ -269,5 +303,5 @@
 		
 		for(int i = 1; i < nodes.size(); i++){
-			d = point_line_distance(nodes.get(i),first,last);
+			d = pointLineDistance(nodes.get(i),first,last);
 			if(d>farthest_dist){
 				farthest_dist = d;
@@ -280,6 +314,6 @@
 		
 		if(farthest_dist > epsilon){
-			seg_a = douglas_peucker(sublist(nodes,0,farthest_node+1),epsilon);
-			seg_b = douglas_peucker(sublist(nodes,farthest_node,nodes.size()-1),epsilon);
+			seg_a = douglasPeucker(sublist(nodes,0,farthest_node+1),epsilon);
+			seg_b = douglasPeucker(sublist(nodes,farthest_node,nodes.size()-1),epsilon);
 				
 			new_nodes.addAll(seg_a);
@@ -353,6 +387,9 @@
 		
 		protected Boolean contains(double lat, double lon){
-		  if(lat > this.top || lat < this.bottom){
+		  if(lat >= this.top || lat <= this.bottom){
 		    return false;
+		  }
+		  if(lon >= this.right || lon <= this.left){
+			  return false;
 		  }
 		  if((this.right - this.left) % 360 == 0){
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 6922)
+++ /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerAction.java	(revision 6923)
@@ -152,5 +152,5 @@
 	setStatus("Running vertex reduction...");
 	
-	nodelist = lw.vertex_reduce(nodelist, epsilon);
+	nodelist = lw.vertexReduce(nodelist, epsilon);
 	
 	System.out.println("After vertex reduction "+nodelist.size()+" nodes remain.");
@@ -162,8 +162,19 @@
 	setStatus("Running Douglas-Peucker approximation...");
 	
-	nodelist = lw.douglas_peucker(nodelist, epsilon);
+	nodelist = lw.douglasPeucker(nodelist, epsilon);
 	
 	System.out.println("After Douglas-Peucker approximation "+nodelist.size()+" nodes remain.");
 	  
+	/**
+	 * And then through a duplicate node remover
+	 */
+	
+	setStatus("Removing duplicate nodes...");
+	
+	nodelist = lw.duplicateNodeRemove(nodelist);
+	
+	System.out.println("After removing duplicate nodes, "+nodelist.size()+" nodes remain.");
+	  
+	
 	/**
 	 * Turn the arraylist into osm nodes
@@ -225,5 +236,5 @@
 	}
 	
-	commands.add(new AddCommand(way));
+	
 	String waytype = Main.pref.get(LakewalkerPreferences.PREF_WAYTYPE, "water");
     
@@ -236,4 +247,5 @@
 	way.nodes.add(fn);
 	
+	commands.add(new AddCommand(way));
 	
 	if (!commands.isEmpty()) {
@@ -243,4 +255,8 @@
   	  System.out.println("Failed");
     }
+	
+	commands = new LinkedList<Command>();
+	ways = new ArrayList<Way>();
+	
   }
   
Index: /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerWMS.java
===================================================================
--- /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerWMS.java	(revision 6922)
+++ /applications/editors/josm/plugins/lakewalker/src/org/openstreetmap/josm/plugins/lakewalker/LakewalkerWMS.java	(revision 6923)
@@ -23,6 +23,4 @@
 	// Hashmap to hold the mapping of cached images 
 	private HashMap<String,Integer> imageindex = new HashMap<String,Integer>();
-	
-	public BufferedImage image2 = new BufferedImage(2000, 2000, BufferedImage.TYPE_INT_RGB);
 	
 	private int resolution;
@@ -152,5 +150,5 @@
 	}
 	
-	public int getPixel(int x, int y, int pixcol){
+	public int getPixel(int x, int y) throws LakewalkerException{
 		
 		BufferedImage image = null;
@@ -160,5 +158,5 @@
 		} catch(LakewalkerException e){
 			System.out.println(e.getError());
-			return -1;
+			throw new LakewalkerException(e.getMessage());			
 		}
 	
@@ -173,7 +171,4 @@
 		int rgb = image.getRGB(pixel_x,pixel_y);
 		
-		// DEBUG: set the pixels
-		this.image2.setRGB(pixel_x,pixel_y,pixcol);
-		
 		int pixel;
 		
@@ -182,24 +177,9 @@
         int b = (rgb >>  0) & 0xff;
 
-        //pixel = rgbToGrey(pixel); //(r+g+b)/3; //pixel & 0xff;
-        
-        int pixel2 = (int)((0.212671 * r) + (0.715160 * b) + (0.072169 * b));
-        
         pixel = (int)((0.30 * r) + (0.59 * b) + (0.11 * g));
                 
-		//System.out.println(pixel_y+","+pixel_x+"  "+r+","+g+","+b+"="+pixel+"("+pixel2+")");
-
 		return pixel; 
 	}
 	
-	private int rgbToGrey(int color) {
-		Color c = new Color(color);
-	    int red = c.getRed();
-	    int green = c.getGreen();
-	    int blue = c.getBlue();
-	    int tot = (red + green + blue) / 3;
-	    return tot;
-	}
-
 	public int floor(int num, int precision){
 		double dnum = num/(double)precision;
@@ -214,5 +194,5 @@
 		return val.doubleValue() ;
 	}
-
+	
 	public double[] xy_to_geo(int x, int y, double resolution){
 		double[] geo = new double[2];
