Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/PicLayerPlugin.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/PicLayerPlugin.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/PicLayerPlugin.java	(revision 35001)
@@ -36,4 +36,5 @@
 import org.openstreetmap.josm.plugins.piclayer.actions.transform.affine.RemovePointAction;
 import org.openstreetmap.josm.plugins.piclayer.actions.transform.affine.TransformPointAction;
+import org.openstreetmap.josm.plugins.piclayer.actions.transform.autocalibrate.AutoCalibratePictureAction;
 import org.openstreetmap.josm.plugins.piclayer.layer.PicLayerAbstract;
 
@@ -84,4 +85,6 @@
             ScaleYPictureAction scaleYPictureAction = new ScaleYPictureAction();
             ShearPictureAction shearPictureAction = new ShearPictureAction();
+            AutoCalibratePictureAction autoCalibratePictureAction = new AutoCalibratePictureAction();
+
             // Create plugin buttons and add them to the toolbar
 
@@ -96,4 +99,5 @@
             buttonList.add(picLayerActionButtonFactory(scaleYPictureAction));
             buttonList.add(picLayerActionButtonFactory(shearPictureAction));
+            buttonList.add(picLayerActionButtonFactory(autoCalibratePictureAction));
 
             for (IconToggleButton btn : buttonList) {
@@ -120,9 +124,9 @@
 
         if (oldPic) {
-            ((PicLayerAbstract) oldLayer).setDrawPoints(false);
+            ((PicLayerAbstract) oldLayer).setDrawOriginPoints(false);
         }
 
         if (newPic) {
-            ((PicLayerAbstract) newLayer).setDrawPoints(true);
+            ((PicLayerAbstract) newLayer).setDrawOriginPoints(true);
         }
     }
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/GenericPicTransformAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/GenericPicTransformAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/GenericPicTransformAction.java	(revision 35001)
@@ -103,5 +103,5 @@
         Layer active = MainApplication.getLayerManager().getActiveLayer();
         if (active instanceof PicLayerAbstract) {
-            ((PicLayerAbstract) active).setDrawPoints(value);
+            ((PicLayerAbstract) active).setDrawOriginPoints(value);
             active.invalidate();
         }
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromClipboardAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromClipboardAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromClipboardAction.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromFileAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromFileAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/newlayer/NewLayerFromFileAction.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/MovePictureAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/MovePictureAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/MovePictureAction.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/RotatePictureAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/RotatePictureAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/RotatePictureAction.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleXPictureAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleXPictureAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleXPictureAction.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleXYPictureAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleXYPictureAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleXYPictureAction.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleYPictureAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleYPictureAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/ScaleYPictureAction.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/MovePointAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/MovePointAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/MovePointAction.java	(revision 35001)
@@ -8,7 +8,12 @@
 import java.awt.geom.Point2D;
 
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.coor.conversion.CoordinateFormatManager;
+import org.openstreetmap.josm.data.coor.conversion.ICoordinateFormat;
+import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.plugins.piclayer.actions.GenericPicTransformAction;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
+
 
 /**
@@ -41,4 +46,6 @@
 
         try {
+        	setLatLonOriginPoints(e.getPoint());	// collect lat/lon data points for auto calibration
+
             Point2D pressed = currentLayer.transformPoint(e.getPoint());
             if (selectedPoint == null)
@@ -62,3 +69,17 @@
         updateDrawPoints(false);
     }
+
+    /**
+     * Method to collect raw data points for additional auto calibration and transforms them into LatLon.
+     * Transformed points will be stored into {@code PictureTransform } attribute to make them accessible for actions.
+     * @param point to collect
+     */
+    private void setLatLonOriginPoints(Point2D point) {
+    	LatLon latLonPoint = MainApplication.getMap().mapView.getLatLon(point.getX(), point.getY());
+        ICoordinateFormat mCoord = CoordinateFormatManager.getDefaultFormat();
+        double latY = Double.parseDouble(mCoord.latToString(latLonPoint));
+        double lonX = Double.parseDouble(mCoord.lonToString(latLonPoint));
+        currentLayer.getTransformer().addLatLonOriginPoint(new Point2D.Double(lonX, latY));
+    }
+
 }
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/RemovePointAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/RemovePointAction.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/RemovePointAction.java	(revision 35001)
@@ -25,4 +25,5 @@
 
         if (selectedPoint != null) {
+          	currentLayer.getTransformer().removeLatLonOriginPoint(selectedPoint);
             currentLayer.getTransformer().removeOriginPoint(selectedPoint);
             selectedPoint = null;
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/CalibrationFileFilter.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/CalibrationFileFilter.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/CalibrationFileFilter.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerAbstract.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerAbstract.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerAbstract.java	(revision 35001)
@@ -4,4 +4,6 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+
+import java.awt.BasicStroke;
 import java.awt.Color;
 import java.awt.Graphics2D;
@@ -19,4 +21,6 @@
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Properties;
 
@@ -58,4 +62,5 @@
     // Tiles of pin images
     private static Image pinTiledImage;
+    private static Image pinTiledImageOrange;
 
     // Initial position of the image in the real world
@@ -68,11 +73,38 @@
     protected double initialImageScale = 1.0;
 
-    // Layer icon
+    // Layer icon / lines
     private Icon layerIcon = null;
 
-    private boolean drawMarkers = true;
-
-    public void setDrawPoints(boolean value) {
-        drawMarkers = value;
+    private boolean drawOriginMarkers = true;
+
+    private boolean drawRefMarkers = false;
+
+    private boolean drawFirstLine = false;
+
+    private boolean drawSecLine = false;
+
+    public void setDrawOriginPoints(boolean value) {
+        drawOriginMarkers = value;
+    }
+
+    private List<Point2D> refPointsBuffer = new ArrayList<>(3);	// only for buffering
+
+    public void setDrawReferencePoints(boolean value, Point2D pointToDraw) {
+        drawRefMarkers = value;
+        if(this.refPointsBuffer == null)	refPointsBuffer = new ArrayList<>(3);
+        if(pointToDraw != null)				this.refPointsBuffer.add(pointToDraw);
+    }
+
+    public void clearDrawReferencePoints() {
+    	drawRefMarkers = false;
+    	this.refPointsBuffer = null;
+    }
+
+    public void setDrawFirstLine(boolean value) {
+    	drawFirstLine = value;
+    }
+
+    public void setDrawSecLine(boolean value) {
+    	drawSecLine = value;
     }
 
@@ -126,4 +158,5 @@
             // allow system to load the image and use it in future
             pinTiledImage = new ImageIcon(Toolkit.getDefaultToolkit().createImage(getClass().getResource("/images/v6_64.png"))).getImage();
+            pinTiledImageOrange = new ImageIcon(Toolkit.getDefaultToolkit().createImage(getClass().getResource("/images/v6_64o.png"))).getImage();
         }
 
@@ -139,5 +172,5 @@
         // First, we initialize the calibration, so that createImage() can rely on it
 
-        transformer = new PictureTransform();
+    	  if(transformer == null)		transformer = new PictureTransform();
 
         // If the map does not exist - we're screwed. We should not get into this situation in the first place!
@@ -181,4 +214,8 @@
      */
     public abstract String getPicLayerName();
+
+    public Image getImage() {
+    	return this.image;
+    }
 
     @Override
@@ -270,5 +307,5 @@
                 );
             }
-            if (drawMarkers) {
+            if (drawOriginMarkers) {
                 // draw markers for selection
                 Graphics2D gPoints = (Graphics2D) g2.create();
@@ -290,4 +327,43 @@
                            pinTileOffsetX[i], pinTileOffsetY[i], pinTileOffsetX[i]+pinWidth, pinTileOffsetY[i]+pinHeight, null);
                 }
+            }
+            if (drawRefMarkers) {
+                // draw markers for selection
+                Graphics2D gPoints = (Graphics2D) g2.create();
+
+                gPoints.translate(pic_offset_x, pic_offset_y);
+
+                gPoints.setColor(Color.RED); // red color for points output
+
+                AffineTransform tr = AffineTransform.getScaleInstance(scalex, scaley);
+                tr.concatenate(transformer.getTransform());
+
+                for (int i = 0; i < refPointsBuffer.size(); i++) {
+                   Point2D trP = tr.transform(refPointsBuffer.get(i), null);
+                   int x = (int) trP.getX(), y = (int) trP.getY();
+
+                   int dstx = x-pinAnchorX;
+                   int dsty = y-pinAnchorY;
+                   gPoints.drawImage(pinTiledImageOrange, dstx, dsty, dstx+pinWidth, dsty+pinHeight,
+                           pinTileOffsetX[i], pinTileOffsetY[i], pinTileOffsetX[i]+pinWidth, pinTileOffsetY[i]+pinHeight, null);
+                }
+            }
+            if (drawFirstLine) {
+            	// set line from point1 to point2
+            	List<Point2D> points = this.getTransformer().getOriginPoints();
+            	Point2D p1 = points.get(0);
+            	Point2D p2 = points.get(1);
+            	g.setColor(Color.green);
+            	g.setStroke(new BasicStroke(5));
+                g.drawLine((int)p1.getX(), (int)p1.getY(), (int)p2.getX(), (int)p2.getY());
+            }
+            if (drawSecLine) {
+            	// set line from point2 to point3
+            	List<Point2D> points = this.getTransformer().getOriginPoints();
+            	Point2D p2 = points.get(1);
+            	Point2D p3 = points.get(2);
+            	g.setColor(Color.green);
+            	g.setStroke(new BasicStroke(5));
+                g.drawLine((int)p2.getX(), (int)p2.getY(), (int)p3.getX(), (int)p3.getY());
             }
         } else {
@@ -523,5 +599,5 @@
     }
 
-    public Point2D transformPoint(Point p) throws NoninvertibleTransformException {
+    public Point2D transformPoint(Point2D p) throws NoninvertibleTransformException {
         // Position image at the right graphical place
 
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromClipboard.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromClipboard.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromClipboard.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromFile.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromFile.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromFile.java	(revision 35001)
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/transform/PictureTransform.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/transform/PictureTransform.java	(revision 34655)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/transform/PictureTransform.java	(revision 35001)
@@ -8,4 +8,5 @@
 
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.plugins.piclayer.actions.transform.autocalibrate.helper.ObservableArrayList;
 
 public class PictureTransform {
@@ -29,4 +30,5 @@
         cachedTransform = new AffineTransform();
         originPoints = new ArrayList<>(3);
+        latLonOriginPoints = new ObservableArrayList<>(3);
     }
 
@@ -186,5 +188,9 @@
 
     public void setOriginPoints(List<Point2D> list) {
-        this.originPoints = new ArrayList<>(list);
+    	if(originPoints == null)	originPoints = new ArrayList<>(list);
+    	else {
+    		originPoints.clear();
+    		originPoints.addAll(list);
+    	}
     }
 
@@ -192,3 +198,36 @@
         originPoints.remove(selectedPoint);
     }
+
+    public void clearOriginPoints() {
+    	originPoints.clear();
+    }
+
+    // similar to originPointList - points scaled in LatLon, list observable
+    private ObservableArrayList<Point2D> latLonOriginPoints = new ObservableArrayList<>(3);
+
+    public ObservableArrayList<Point2D> getLatLonOriginPoints() {
+    	return this.latLonOriginPoints;
+    }
+
+    public void addLatLonOriginPoint(Point2D p) {
+    	latLonOriginPoints.add(p);
+    }
+
+    public void removeLatLonOriginPoint(Point2D selectedPoint) {
+    	int index = originPoints.indexOf(selectedPoint);
+    	Point2D toDelete = this.latLonOriginPoints.get(index);
+    	this.latLonOriginPoints.remove(toDelete);
+    }
+
+    public void setLatLonOriginPoint(List<Point2D> list) {
+    	if(latLonOriginPoints == null)	latLonOriginPoints = new ObservableArrayList<>(list);
+    	else {
+    		latLonOriginPoints.clear();
+    		latLonOriginPoints.addAll(list);
+    	}
+    }
+
+    public void clearLatLonOriginPoints() {
+    	latLonOriginPoints.clear();
+    }
 }
