Index: applications/editors/josm/plugins/piclayer/build.xml
===================================================================
--- applications/editors/josm/plugins/piclayer/build.xml	(revision 27650)
+++ applications/editors/josm/plugins/piclayer/build.xml	(revision 27662)
@@ -22,5 +22,5 @@
 -->
 <project name="PicLayer" default="dist" basedir=".">
-    <property name="commit.message" value="PicLayer - fix #7319"/>
+    <property name="commit.message" value="PicLayer - added possibility to edit transformation with 1 or 2 points (move or rect transformation)"/>
     <property name="plugin.main.version" value="4669"/>
     <!--
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 27650)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/PicLayerPlugin.java	(revision 27662)
@@ -52,4 +52,5 @@
 import org.openstreetmap.josm.plugins.piclayer.actions.transform.ShearPictureAction;
 import org.openstreetmap.josm.plugins.piclayer.actions.transform.affine.MovePointAction;
+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.layer.PicLayerAbstract;
@@ -97,4 +98,5 @@
             MovePointAction movePointAction = new MovePointAction(newFrame);
             TransformPointAction transformPointAction = new TransformPointAction(newFrame);
+            RemovePointAction removePointAction = new RemovePointAction(newFrame);
 
             RotatePictureAction rotatePictureAction = new RotatePictureAction(newFrame);
@@ -109,4 +111,5 @@
             buttonList.add(picLayerActionButtonFactory(movePointAction));
             buttonList.add(picLayerActionButtonFactory(transformPointAction));
+            buttonList.add(picLayerActionButtonFactory(removePointAction));
             buttonList.add(picLayerActionButtonFactory(rotatePictureAction));
             buttonList.add(picLayerActionButtonFactory(scaleXYPictureAction));
@@ -120,5 +123,5 @@
         }
     }
-    
+
     private IconToggleButton picLayerActionButtonFactory(MapMode action) {
     	IconToggleButton button = new IconToggleButton(action);
@@ -134,8 +137,9 @@
         boolean oldPic = oldLayer instanceof PicLayerAbstract;
         boolean newPic = newLayer instanceof PicLayerAbstract;
-        // actually that should be not enough - JOSM should hide all buttons that are disabled for current layer!
-        if (oldPic) { // leave picture layer            if (oldLayer != null)
+
+        if (oldPic) {
             ((PicLayerAbstract)oldLayer).setDrawPoints(false);
         }
+
         if (newPic) {
         	((PicLayerAbstract)newLayer).setDrawPoints(true);
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 27662)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/RemovePointAction.java	(revision 27662)
@@ -0,0 +1,48 @@
+package org.openstreetmap.josm.plugins.piclayer.actions.transform.affine;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.MouseEvent;
+
+import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.plugins.piclayer.actions.GenericPicTransformAction;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+@SuppressWarnings("serial")
+public class RemovePointAction extends GenericPicTransformAction {
+
+    public RemovePointAction(MapFrame frame) {
+        super(tr("PicLayer Remove point"), tr("Point removed"), "removepoint", tr("Remove point on the picture"), frame, ImageProvider.getCursor("crosshair", null));
+    }
+
+    @Override
+    public void mouseClicked(MouseEvent e) {
+        if (currentLayer == null)
+            return;
+
+        if (selectedPoint != null) {
+            currentLayer.getTransformer().removeOriginPoint(selectedPoint);
+            selectedPoint = null;
+        }
+
+        currentCommand.addIfChanged();
+    }
+
+    @Override
+    protected void doAction(MouseEvent e) {
+    }
+
+    @Override
+    public void enterMode() {
+        super.enterMode();
+        updateDrawPoints(true);
+    }
+
+    @Override
+    public void exitMode() {
+        super.exitMode();
+        updateDrawPoints(false);
+    }
+
+
+}
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/TransformPointAction.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/TransformPointAction.java	(revision 27650)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/actions/transform/affine/TransformPointAction.java	(revision 27662)
@@ -6,6 +6,4 @@
 import java.awt.geom.NoninvertibleTransformException;
 import java.awt.geom.Point2D;
-
-import javax.swing.JOptionPane;
 
 import org.openstreetmap.josm.gui.MapFrame;
@@ -25,8 +23,10 @@
 			Point2D pressed = currentLayer.transformPoint(e.getPoint());
 			if (selectedPoint != null) {
-			    if (currentLayer.getTransformer().getOriginPoints().size() < 3)
+			    /*if (currentLayer.getTransformer().getOriginPoints().size() < 3)
 			        JOptionPane.showMessageDialog(null, tr("You should have 3 checkpoints to transform the image!"), tr("PicLayer"), JOptionPane.ERROR_MESSAGE, null);
-			    else
+			    else*/
+			    {
 			        currentLayer.getTransformer().updatePair(selectedPoint, pressed);
+			    }
 			}
 
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/command/TransformCommand.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/command/TransformCommand.java	(revision 27650)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/command/TransformCommand.java	(revision 27662)
@@ -50,4 +50,5 @@
         layer.getTransformer().setTransform(transform.getTransform());
         layer.getTransformer().setOriginPoints(transform.getOriginPoints());
+        layer.getTransformer().setImagePosition(transform.getImagePosition());
     }
 
@@ -56,4 +57,5 @@
         transform.setOriginPoints(layer.getTransformer().getOriginPoints());
         transform.setTransform(layer.getTransformer().getTransform());
+        transform.setImagePosition(layer.getTransformer().getImagePosition());
         return transform;
     }
@@ -78,5 +80,6 @@
 
         boolean changed = !(beforeTransform.getTransform().equals(afterTransform.getTransform())) ||
-            !(beforeTransform.getOriginPoints().equals(afterTransform.getOriginPoints()));
+            !(beforeTransform.getOriginPoints().equals(afterTransform.getOriginPoints())) ||
+            !(beforeTransform.getImagePosition().equals(afterTransform.getImagePosition()));
         if (changed && !alreadyAdded) {
             Main.main.undoRedo.add(this);
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 27650)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerAbstract.java	(revision 27662)
@@ -72,8 +72,8 @@
 
     // Initial position of the image in the real world
-    protected EastNorth initialImagePosition;
+//    protected EastNorth initialImagePosition;
 
     // Position of the image in the real world
-    protected EastNorth imagePosition;
+    //protected EastNorth imagePosition;
 
     // The scale that was set on the map during image creation
@@ -96,6 +96,4 @@
 
     // Keys for loading from old/new Properties
-    private static final String INITIAL_POS_X = "INITIAL_POS_X";
-    private static final String INITIAL_POS_Y = "INITIAL_POS_y";
     private static final String POSITION_X = "POSITION_X";
     private static final String POSITION_Y = "POSITION_Y";
@@ -148,4 +146,6 @@
         // First, we initialize the calibration, so that createImage() can rely on it
 
+        transformer = new PictureTransform();
+
         // If the map does not exist - we're screwed. We should not get into this situation in the first place!
         if ( Main.map != null && Main.map.mapView != null ) {
@@ -153,6 +153,7 @@
             EastNorth center = Main.map.mapView.getCenter();
 
-            imagePosition = new EastNorth(center.east(), center.north());
-            initialImagePosition = new EastNorth(imagePosition.east(), imagePosition.north());
+//            imagePosition = new EastNorth(center.east(), center.north());
+            transformer.setImagePosition(new EastNorth(center.east(), center.north()));
+//            initialImagePosition = new EastNorth(imagePosition.east(), imagePosition.north());
             // Initial scale at which the image was loaded
             initialImageScale = Main.map.mapView.getDist100Pixel();
@@ -168,6 +169,4 @@
         // Load image completely
         (new ImageIcon(image)).getImage();
-
-        transformer = new PictureTransform();
 
         lookForCalibration();
@@ -233,4 +232,5 @@
 
             //     This is now the offset in screen pixels
+            EastNorth imagePosition = transformer.getImagePosition();
             double pic_offset_x = (( imagePosition.east() - leftop.east() ) * pixel_per_en);
             double pic_offset_y = (( leftop.north() - imagePosition.north() ) * pixel_per_en);
@@ -348,5 +348,5 @@
             return;
 
-        EastNorth center = imagePosition;
+        EastNorth center = transformer.getImagePosition();
         double w = image.getWidth(null);
         double h = image.getHeight(null);
@@ -382,6 +382,6 @@
         props.put(MATRIXm02, Double.toString(matrix[4]));
         props.put(MATRIXm12, Double.toString(matrix[5]));
-        props.put(POSITION_X, Double.toString(imagePosition.getX()));
-        props.put(POSITION_Y, Double.toString(imagePosition.getY()));
+        props.put(POSITION_X, Double.toString(transformer.getImagePosition().getX()));
+        props.put(POSITION_Y, Double.toString(transformer.getImagePosition().getY()));
         props.put(INITIAL_SCALE, Double.toString(initialImageScale));
 
@@ -413,9 +413,11 @@
         double pos_y = Double.valueOf(props.getProperty(POSITION_Y, "0"));
 
-        imagePosition = new EastNorth(pos_x, pos_y);
+        EastNorth imagePosition = new EastNorth(pos_x, pos_y);
+        transformer.setImagePosition(imagePosition);
+
         initialImageScale = Double.valueOf(props.getProperty(INITIAL_SCALE, "1")); //in_scale
         if (props.containsKey(SCALEX)) {// old format
-            double in_pos_x = Double.valueOf(props.getProperty(INITIAL_POS_X, "0"));
-            double in_pos_y = Double.valueOf(props.getProperty(INITIAL_POS_Y, "0"));
+            //double in_pos_x = Double.valueOf(props.getProperty(INITIAL_POS_X, "0"));
+            //double in_pos_y = Double.valueOf(props.getProperty(INITIAL_POS_Y, "0"));
             double angle = Double.valueOf(props.getProperty(ANGLE, "0"));
             double scale_x = Double.valueOf(props.getProperty(SCALEX, "1"));
@@ -423,6 +425,4 @@
             double shear_x = Double.valueOf(props.getProperty(SHEARX, "0"));
             double shear_y = Double.valueOf(props.getProperty(SHEARY, "0"));
-
-            initialImagePosition.setLocation(in_pos_x, in_pos_y);
 
             // transform to matrix from these values - need testing
@@ -462,9 +462,9 @@
             int w = image.getWidth(null);
             int h = image.getHeight(null);
-            imagePosition.setLocation(
+            EastNorth imagePosition = new EastNorth(
                     dx + w/2*sx + h/2*rx,
                     dy + w/2*ry + h/2*sy
             );
-            initialImagePosition.setLocation(imagePosition);
+//            initialImagePosition.setLocation(imagePosition);
 //            m_angle = 0;
             double scalex = 100*sx*getMetersPerEasting(imagePosition);
@@ -473,4 +473,5 @@
             double sheary = ry / sy;
 
+            transformer.setImagePosition(imagePosition);
             transformer.resetCalibration();
             AffineTransform tr = transformer.getTransform();
@@ -494,12 +495,13 @@
         double pixel_per_en = ( Main.map.mapView.getWidth() / 2.0 ) / ( center.east() - leftop.east() );
 
+        EastNorth imageCenter = transformer.getImagePosition();
         //     This is now the offset in screen pixels
-        double pic_offset_x = (( imagePosition.east() - leftop.east() ) * pixel_per_en);
-        double pic_offset_y = (( leftop.north() - imagePosition.north() ) * pixel_per_en); // something bad...
+        double pic_offset_x = (( imageCenter.east() - leftop.east() ) * pixel_per_en);
+        double pic_offset_y = (( leftop.north() - imageCenter.north() ) * pixel_per_en); // something bad...
 
         AffineTransform pointTrans = AffineTransform.getTranslateInstance(pic_offset_x, pic_offset_y);
 
-        double scalex = initialImageScale * pixel_per_en / getMetersPerEasting(imagePosition) / 100;
-        double scaley = initialImageScale * pixel_per_en / getMetersPerNorthing(imagePosition) / 100;
+        double scalex = initialImageScale * pixel_per_en / getMetersPerEasting(imageCenter) / 100;
+        double scaley = initialImageScale * pixel_per_en / getMetersPerNorthing(imageCenter) / 100;
 
         pointTrans.scale(scalex, scaley); // ok here
@@ -515,6 +517,5 @@
      */
     public void movePictureBy(double x, double y) {
-        imagePosition = imagePosition.add(x, y);
-        transformer.setModified();
+        transformer.setImagePosition(transformer.getImagePosition().add(x, y));
     }
 
@@ -552,5 +553,4 @@
     public void resetCalibration() {
         transformer.resetCalibration();
-        imagePosition.setLocation(initialImagePosition);
     }
 
@@ -575,7 +575,3 @@
         return selected;
     }
-
-    public void saveTransformCommand() {
-
-    }
 }
Index: applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromKML.java
===================================================================
--- applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromKML.java	(revision 27650)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/layer/PicLayerFromKML.java	(revision 27662)
@@ -57,7 +57,8 @@
 
 
-        imagePosition.setLocation((en1.getX()+en2.getX())/2, (en1.getY()+en2.getY())/2);
+        EastNorth imagePosition = new EastNorth((en1.getX()+en2.getX())/2, (en1.getY()+en2.getY())/2);
+        transformer.setImagePosition(imagePosition);
+
         initialImageScale = 100*getMetersPerEasting(imagePosition);
-        initialImagePosition.setLocation(imagePosition);
 
         AffineTransform transform = AffineTransform.getScaleInstance((en1.getX()-en2.getX())/w, (en1.getY()-en2.getY())/h);
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 27650)
+++ applications/editors/josm/plugins/piclayer/src/org/openstreetmap/josm/plugins/piclayer/transform/PictureTransform.java	(revision 27662)
@@ -6,8 +6,20 @@
 import java.util.List;
 
+import org.openstreetmap.josm.data.coor.EastNorth;
+
 public class PictureTransform {
 
 	private AffineTransform cachedTransform;
-	private boolean modified = false;
+	private EastNorth imagePosition;
+
+	public EastNorth getImagePosition() {
+        return imagePosition;
+    }
+
+    public void setImagePosition(EastNorth imagePosition) {
+        this.imagePosition = imagePosition;
+    }
+
+    private boolean modified = false;
 
 	private List<Point2D> originPoints;
@@ -50,20 +62,62 @@
 	 */
 	public void updatePair(Point2D originPoint, Point2D desiredPoint) {
-		if (originPoints.size() < 3) // not enough information for creating transform - 3 points needed
-			return;
-
 		if (originPoint == null)
 			return;
 
-		List<Point2D> desiredPoints = new ArrayList<Point2D>(3);
+		switch (originPoints.size()) {
+		case 1: {
+		    cachedTransform.concatenate(AffineTransform.getTranslateInstance(desiredPoint.getX()-originPoint.getX(),
+		            desiredPoint.getY()-originPoint.getY()));
+		    break;
+		}
+		case 2: {
+		    // find triangle and move it
+		    List<Point2D> desiredPoints = new ArrayList<Point2D>(3);
+		    Point2D o1 = originPoints.get(0);
+		    Point2D o2 = originPoints.get(1);
+		    Point2D d1, d2;
+		    if (o2 == originPoint) {
+		        d2 = desiredPoint;
+		        d1 = (Point2D) o1.clone();
+		    } else {
+		        d1 = desiredPoint;
+		        d2 = (Point2D) o2.clone();
+		    }
+		    Point2D o3 = calculateTrianglePoint(o1, o2);
+		    Point2D d3 = calculateTrianglePoint(d1, d2);
+		    originPoints.add(o3);
+		    desiredPoints.add(d1); desiredPoints.add(d2); desiredPoints.add(d3);
+		    trySolve(desiredPoints);
+		    originPoints.remove(2);
+		    break;
+		}
+		case 3: {
+		    List<Point2D> desiredPoints = new ArrayList<Point2D>(3);
 
-		for (Point2D origin : originPoints) {
-			if (origin.equals(originPoint))
-				desiredPoints.add(desiredPoint);
-			else
-				desiredPoints.add(origin);
+	        for (Point2D origin : originPoints) {
+	            if (origin.equals(originPoint))
+	                desiredPoints.add(desiredPoint);
+	            else
+	                desiredPoints.add(origin);
+	        }
+	        trySolve(desiredPoints);
+	        break;
 		}
-		trySolve(desiredPoints);
+		default:
+
+		}
+
 	}
+
+    private Point2D calculateTrianglePoint(Point2D d1, Point2D d2) {
+        Point2D result;
+        if (d1 instanceof Point2D.Double) {
+            result = new Point2D.Double();
+        } else {
+            result = new Point2D.Float();
+        }
+        result.setLocation((d1.getX()+d2.getX()-d2.getY()+d1.getY())/2, (d1.getY()+d2.getY()+d2.getX()-d1.getX())/2);
+        return result;
+    }
 
     private void trySolve(List<Point2D> desiredPoints) {
@@ -92,8 +146,12 @@
 	public void concatenateTransformPoint(AffineTransform transform, Point2D trans) {
 
-        AffineTransform centered = AffineTransform.getTranslateInstance(trans.getX(), trans.getY());
-        centered.concatenate(transform);
-        centered.translate(-trans.getX(), -trans.getY());
-        cachedTransform.concatenate(centered);
+	    if (trans != null) {
+            AffineTransform centered = AffineTransform.getTranslateInstance(trans.getX(), trans.getY());
+            centered.concatenate(transform);
+            centered.translate(-trans.getX(), -trans.getY());
+            cachedTransform.concatenate(centered);
+	    } else {
+	        cachedTransform.concatenate(transform);
+	    }
 
 
@@ -129,3 +187,7 @@
         this.originPoints = new ArrayList<Point2D>(list);
     }
+
+    public void removeOriginPoint(Point2D selectedPoint) {
+        originPoints.remove(selectedPoint);
+    }
 }
