Index: /applications/editors/josm/plugins/piclayer/.classpath
===================================================================
--- /applications/editors/josm/plugins/piclayer/.classpath	(revision 35000)
+++ /applications/editors/josm/plugins/piclayer/.classpath	(revision 35001)
@@ -1,7 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
+	<classpathentry exported="true" kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/JOSM"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
 	<classpathentry kind="output" path="build"/>
 </classpath>
Index: /applications/editors/josm/plugins/piclayer/.project
===================================================================
--- /applications/editors/josm/plugins/piclayer/.project	(revision 35000)
+++ /applications/editors/josm/plugins/piclayer/.project	(revision 35001)
@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>JOSM-piclayer</name>
+	<name>piclayer</name>
 	<comment></comment>
 	<projects>
+		<project>JOSM</project>
+		<project>JOSM-indoorhelper</project>
 	</projects>
 	<buildSpec>
@@ -11,18 +13,7 @@
 			</arguments>
 		</buildCommand>
-		<buildCommand>
-			<name>org.sonarlint.eclipse.core.sonarlintBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
 	</natures>
 </projectDescription>
Index: /applications/editors/josm/plugins/piclayer/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /applications/editors/josm/plugins/piclayer/.settings/org.eclipse.jdt.core.prefs	(revision 35000)
+++ /applications/editors/josm/plugins/piclayer/.settings/org.eclipse.jdt.core.prefs	(revision 35001)
@@ -10,6 +10,11 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
 org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.doc.comment.support=enabled
 org.eclipse.jdt.core.compiler.problem.APILeak=warning
@@ -118,3 +123,4 @@
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=disabled
 org.eclipse.jdt.core.compiler.source=1.8
Index: /applications/editors/josm/plugins/piclayer/build.xml
===================================================================
--- /applications/editors/josm/plugins/piclayer/build.xml	(revision 35000)
+++ /applications/editors/josm/plugins/piclayer/build.xml	(revision 35001)
@@ -1,20 +1,39 @@
 <?xml version="1.0" encoding="utf-8"?>
+
 <project name="PicLayer" default="dist" basedir=".">
+
     <property name="commit.message" value="[josm/PicLayer] - #12045 add ability to localize dialog titles"/>
+
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="14153"/>
-	
+
+    <property name="plugin.main.version" value="11713"/>
+
+
+
     <!-- Configure these properties (replace "..." accordingly).
+
          See https://josm.openstreetmap.de/wiki/DevelopersGuide/DevelopingPlugins
+
     -->
-    <property name="plugin.author" value="Tomasz Stelmach"/>
+
+    <property name="plugin.author" value="Tomasz Stelmach, Rebecca Schmidt"/>
+
     <property name="plugin.class" value="org.openstreetmap.josm.plugins.piclayer.PicLayerPlugin"/>
+
     <property name="plugin.description" value="This plugin allows to display any picture as a background in the editor and align it with the map."/>
+
     <property name="plugin.icon" value="images/layericon.png"/>
+
     <property name="plugin.link" value="https://josm.openstreetmap.de/wiki/Help/Plugin/PicLayer"/>
+
     <property name="plugin.canloadatruntime" value="true"/>
 
+
+
     <!-- ** include targets that all plugins have in common ** -->
+
     <import file="../build-common.xml"/>
 
+
+
 </project>
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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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 35000)
+++ /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();
+    }
 }
