Index: applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/DrawnPolyLine.java
===================================================================
--- applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/DrawnPolyLine.java	(revision 26303)
+++ applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/DrawnPolyLine.java	(revision 26309)
@@ -109,13 +109,14 @@
      * Increase epsilon to fit points count in maxPKM point per 1 km
      */
-    double autoSimplify(double initEpsilon,double ekf,double maxPKM) {
+    double autoSimplify(double initEpsilon,double ekf,int k,double maxPKM) {
         double e=initEpsilon;
         if (e<1e-3) e=1e-3;
         if (ekf<1+1e-2) ekf=1.01;
-        do {
+        simplify(e);
+        while (getNodesPerKm(k)>maxPKM && e<1e3) {
              e=e*ekf;
              simplify(e);
              //System.out.printf("eps=%f n=%d\n", e,simplePoints.size());
-        } while (getNodesPerKm()>maxPKM && e<1e3);
+        }
         return e;
     }
@@ -318,14 +319,23 @@
          }
     }
-    public double getNodesPerKm() {
-        if (points.size()<2) return 0;
-        Point p1, p2;
+        
+    /**
+     * Returns maximum number of simplified line points divided by line segment length
+     * max((k-1) / (L(i,i+1)+L(i+1,i+2)+...+L(i+k-1,i+k))) [ i=1..n-k ]
+     * @param k - window size (number of points to average points per km
+     */
+    public double getNodesPerKm(int k) {
+        List<LatLon> pts = simplePoints;
+        if (!wasSimplified()) pts=points;
+        int n=pts.size();
+        if (n<2) return 0;
+        if (k<2) k=2;
+        if (k>n) k=n;
+        
         LatLon pp1, pp2=null;
         Iterator<LatLon> it1,it2;
-        
-        it1=points.listIterator(0);
-        it2=points.listIterator(1);
-        int n=points.size();
-        double len=0;
+        it1=pts.listIterator(0);
+        it2=pts.listIterator(1);
+        double lens[]=new double[n];
         for (int i = 0; i < n-1; i++) {
                 pp1 = it1.next();
@@ -333,10 +343,20 @@
                 pp2 = it2.next();
                 //p2 = getPoint(pp2);
-                len+=pp1.greatCircleDistance(pp2);
-            }
-        if (isClosed()) len+=pp2.greatCircleDistance(points.get(0));
-        return Math.round((wasSimplified()?simplePoints.size():points.size())
-                /len*1000);
-        
+                lens[i]=pp1.greatCircleDistance(pp2);
+            }
+        double pkm=0,maxpkm=0;
+        double len=0;
+        for (int i = 1; i < n; i++) {
+                len+=lens[i-1]; // add next next point
+                // remove old segment
+                if (i>k) len-=lens[i-k-1]; 
+                if (i>=k) {
+                    // len is length of points[i-windowSize] .. points[i]
+                    if (len>0) pkm = k / len * 1000;
+                    //System.out.println("i="+i+" pkm="+len+" pkm="+pkm);
+                    if (pkm > maxpkm) maxpkm=pkm;
+                }
+            }
+        return Math.round(maxpkm);
             
     }
Index: applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FDSettings.java
===================================================================
--- applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FDSettings.java	(revision 26303)
+++ applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FDSettings.java	(revision 26309)
@@ -22,4 +22,5 @@
     /// Maximum number of points per 1 km of way
     public double maxPointsPerKm;
+    public int pkmBlockSize;
     
     public void loadPrefs() {
@@ -34,5 +35,6 @@
         minPixelsBetweenPoints = Main.pref.getDouble("fastdraw.mindelta", 20);
         startingEps = Main.pref.getDouble("fastdraw.startingEps", 20);
-        maxPointsPerKm = Main.pref.getDouble("fastdraw.maxpkm", 200);
+        maxPointsPerKm = Main.pref.getDouble("fastdraw.maxpkm", 20);
+        pkmBlockSize = Main.pref.getInteger("fastdraw.pkmblocksize", 10);
     }
 
@@ -49,4 +51,5 @@
          Main.pref.putDouble("fastdraw.startingEps",startingEps);
          Main.pref.putDouble("fastdraw.maxpkm",maxPointsPerKm);
+         Main.pref.putInteger("fastdraw.pkmblocksize",pkmBlockSize);
          try {Main.pref.save();} catch (IOException e) {
              System.err.println(tr("Can not save preferences"));
Index: applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingMode.java
===================================================================
--- applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingMode.java	(revision 26303)
+++ applications/editors/josm/plugins/FastDraw/src/org/openstreetmap/josm/plugins/fastdraw/FastDrawingMode.java	(revision 26309)
@@ -365,5 +365,6 @@
             if (!line.wasSimplified()) {
                 //line.simplify(eps);
-                eps = line.autoSimplify(settings.startingEps, settings.epsilonMult, settings.maxPointsPerKm);
+                eps = line.autoSimplify(settings.startingEps, settings.epsilonMult, 
+                        settings.pkmBlockSize, settings.maxPointsPerKm);
                 repaint();
                 showSimplifyHint();
@@ -391,5 +392,5 @@
                 Toolkit.getDefaultToolkit().removeAWTEventListener(this);
                 new FastDrawConfigDialog(settings);
-                eps = line.autoSimplify(settings.startingEps, settings.epsilonMult, settings.maxPointsPerKm);
+                eps = line.autoSimplify(settings.startingEps, settings.epsilonMult, settings.pkmBlockSize,settings.maxPointsPerKm);
                 //System.out.println("final eps="+eps);
                 Toolkit.getDefaultToolkit().addAWTEventListener(this,
@@ -544,5 +545,5 @@
     private void showSimplifyHint() {
             setStatusLine(tr("Eps={0}, {1} points, {2} p/km", 
-                eps, line.getSimplePointsCount(),line.getNodesPerKm())+" "
+                eps, line.getSimplePointsCount(),line.getNodesPerKm(settings.pkmBlockSize))+" "
             +SIMPLIFYMODE_MESSAGE);
     }
