Index: applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/CadastrePlugin.java
===================================================================
--- applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/CadastrePlugin.java	(revision 18224)
+++ applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/CadastrePlugin.java	(revision 18256)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.gui.IconToggleButton;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.plugins.Plugin;
@@ -216,5 +217,4 @@
 
     private static void setEnabledAll(boolean isEnabled) {
-        boolean isLambertCC9Zones = Main.proj instanceof LambertCC9Zones;
         for (int i = 0; i < cadastreJMenu.getItemCount(); i++) {
             JMenuItem item = cadastreJMenu.getItem(i);
@@ -236,6 +236,6 @@
             if (oldFrame == null && newFrame != null) {
                 setEnabledAll(true);
-                /*Main.map.addMapMode(new IconToggleButton
-                        (new WMSAdjustAction(Main.map)));*/
+                Main.map.addMapMode(new IconToggleButton
+                        (new WMSAdjustAction(Main.map)));
             } else if (oldFrame != null && newFrame == null) {
                 setEnabledAll(false);
Index: applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/CadastrePreferenceSetting.java
===================================================================
--- applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/CadastrePreferenceSetting.java	(revision 18224)
+++ applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/CadastrePreferenceSetting.java	(revision 18256)
@@ -44,4 +44,10 @@
 
     private JRadioButton grabMultiplier4 = new JRadioButton("", true);
+    
+    private JRadioButton crosspiece1 = new JRadioButton("off");
+    
+    private JRadioButton crosspiece2 = new JRadioButton("50m");
+
+    private JRadioButton crosspiece3 = new JRadioButton("100m");
 
     static final int DEFAULT_SQUARE_SIZE = 100;
@@ -57,4 +63,6 @@
     private JTextField rasterDivider = new JTextField(10);
 
+    static final int DEFAULT_CROSSPIECES = 0;
+    
     public void addGui(final PreferenceDialog gui) {
 
@@ -115,5 +123,5 @@
         JLabel jLabelScale = new JLabel(tr("Vector images grab multiplier:"));
         cadastrewms.add(jLabelScale, GBC.std().insets(0, 5, 10, 0));
-        ButtonGroup bg = new ButtonGroup();
+        ButtonGroup bgGrabMultiplier = new ButtonGroup();
         ActionListener multiplierActionListener = new ActionListener() {
             public void actionPerformed(ActionEvent actionEvent) {
@@ -137,8 +145,8 @@
         grabMultiplier4.addActionListener( multiplierActionListener);
         grabMultiplier4.setToolTipText(tr("Fixed size square (default is 100m)"));
-        bg.add(grabMultiplier1);
-        bg.add(grabMultiplier2);
-        bg.add(grabMultiplier3);
-        bg.add(grabMultiplier4);
+        bgGrabMultiplier.add(grabMultiplier1);
+        bgGrabMultiplier.add(grabMultiplier2);
+        bgGrabMultiplier.add(grabMultiplier3);
+        bgGrabMultiplier.add(grabMultiplier4);
         String currentScale = Main.pref.get("cadastrewms.scale", "1");
         if (currentScale.equals(Scale.X1.value))
@@ -173,5 +181,19 @@
         disableImageCropping.setSelected(Main.pref.getBoolean("cadastrewms.noImageCropping", false));
         disableImageCropping.setToolTipText(tr("Disable image cropping during georeferencing."));
-        cadastrewms.add(disableImageCropping, GBC.eop().insets(0, 0, 0, 5));
+        cadastrewms.add(disableImageCropping, GBC.eop().insets(0, 0, 0, 0));
+        // the crosspiece display
+        JLabel jLabelCrosspieces = new JLabel(tr("Display crosspieces:"));
+        cadastrewms.add(jLabelCrosspieces, GBC.std().insets(0, 0, 10, 0));
+        ButtonGroup bgCrosspieces = new ButtonGroup();
+        int crosspieces = getNumber("cadastrewms.crosspieces", DEFAULT_CROSSPIECES);
+        if (crosspieces == 0) crosspiece1.setSelected(true);
+        if (crosspieces == 1) crosspiece2.setSelected(true);
+        if (crosspieces == 2) crosspiece3.setSelected(true);
+        bgCrosspieces.add(crosspiece1);
+        bgCrosspieces.add(crosspiece2);
+        bgCrosspieces.add(crosspiece3);
+        cadastrewms.add(crosspiece1, GBC.std().insets(5, 0, 5, 0));
+        cadastrewms.add(crosspiece2, GBC.std().insets(5, 0, 5, 0));
+        cadastrewms.add(crosspiece3, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 0, 5));
 
         // separator
@@ -230,4 +252,7 @@
         }
         Main.pref.put("cadastrewms.noImageCropping", disableImageCropping.isSelected());
+        if (crosspiece1.isSelected()) Main.pref.put("cadastrewms.crosspieces", "0");
+        else if (crosspiece2.isSelected()) Main.pref.put("cadastrewms.crosspieces", "1");
+        else if (crosspiece3.isSelected()) Main.pref.put("cadastrewms.crosspieces", "2");
         Main.pref.put("cadastrewms.enableCaching", enableCache.isSelected());
 
Index: applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/WMSAdjustAction.java
===================================================================
--- applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/WMSAdjustAction.java	(revision 18256)
+++ applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/WMSAdjustAction.java	(revision 18256)
@@ -0,0 +1,145 @@
+package cadastre_fr;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Cursor;
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.awt.event.MouseMotionListener;
+import java.util.ArrayList;
+
+import javax.swing.JOptionPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.MapFrame;
+import org.openstreetmap.josm.actions.mapmode.MapMode;
+import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.gui.layer.Layer;
+
+public class WMSAdjustAction extends MapMode implements
+        MouseListener, MouseMotionListener{
+
+    private static final long serialVersionUID = 1L;
+    private ArrayList<WMSLayer> modifiedLayers = new ArrayList<WMSLayer>();
+    WMSLayer selectedLayer;
+    private boolean rasterMoved;
+    private EastNorth prevEastNorth;
+    enum Mode { moveXY, moveZ, rotate}
+    private Mode mode = null;
+
+    public WMSAdjustAction(MapFrame mapFrame) {
+        super(tr("Adjust WMS"), "adjustxywms",
+                        tr("Adjust the position of the WMS layer (raster images only)"), mapFrame,
+                        ImageProvider.getCursor("normal", "move"));
+    }
+
+    @Override public void enterMode() {
+        if (Main.map != null) {
+            Layer activeLayer = Main.map.mapView.getActiveLayer();
+            if (activeLayer instanceof WMSLayer && ((WMSLayer)activeLayer).isRaster()) {
+                super.enterMode();
+                Main.map.mapView.addMouseListener(this);
+                Main.map.mapView.addMouseMotionListener(this);
+                rasterMoved = false;
+                selectedLayer = (WMSLayer)activeLayer;
+            } else {
+                JOptionPane.showMessageDialog(Main.parent,tr("This mode works only if active layer is\n"
+                        +"a cadastre \"plan image\" (raster image)"));
+            }
+        }
+    }
+
+    @Override public void exitMode() {
+        super.exitMode();
+        Main.map.mapView.removeMouseListener(this);
+        Main.map.mapView.removeMouseMotionListener(this);
+        if (rasterMoved && CacheControl.cacheEnabled) {
+            int reply = JOptionPane.showConfirmDialog(null,
+                    "Save the changes in cache ?",
+                    "Update cache",
+                    JOptionPane.YES_NO_OPTION);
+            if (reply == JOptionPane.OK_OPTION) {
+                saveModifiedLayers();
+            }
+        }
+        modifiedLayers.clear();
+        selectedLayer = null;
+    }
+
+    @Override
+    public void mousePressed(MouseEvent e) {
+        if (e.getButton() != MouseEvent.BUTTON1)
+            return;
+        boolean ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
+        // boolean alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;
+        boolean shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
+        if (shift)
+            mode = Mode.moveZ;
+        else if (ctrl)
+            mode = Mode.rotate;
+        else
+            mode = Mode.moveXY;
+        rasterMoved = true;
+        prevEastNorth = Main.map.mapView.getEastNorth(e.getX(), e.getY());
+        Main.map.mapView.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+    }
+
+    @Override public void mouseDragged(MouseEvent e) {
+        EastNorth newEastNorth = Main.map.mapView.getEastNorth(e.getX(),e.getY());
+        if (mode == Mode.moveXY) {
+            displace(prevEastNorth, newEastNorth);
+        } else if (mode == Mode.moveZ) {
+            resize(newEastNorth);
+        } else if (mode == Mode.rotate) {
+            rotate(prevEastNorth, newEastNorth);
+        }
+        if (!modifiedLayers.contains(selectedLayer))
+            modifiedLayers.add(selectedLayer);
+        Main.map.mapView.repaint();
+        prevEastNorth = newEastNorth;
+    }
+
+    private void displace(EastNorth start, EastNorth end) {
+        selectedLayer.displace(end.east()-start.east(), end.north()-start.north());
+    }
+
+    private void resize(EastNorth newEastNorth) {
+        EastNorth center = selectedLayer.getRasterCenter();
+        double dPrev = prevEastNorth.distance(center.east(), center.north());
+        double dNew = newEastNorth.distance(center.east(), center.north());
+        selectedLayer.resize(center, dNew/dPrev);
+    }
+
+    private void rotate(EastNorth start, EastNorth end) {
+        EastNorth pivot = selectedLayer.getRasterCenter();
+        double startAngle = Math.atan2(start.east()-pivot.east(), start.north()-pivot.north());
+        double endAngle = Math.atan2(end.east()-pivot.east(), end.north()-pivot.north());
+        double rotationAngle = endAngle - startAngle;
+        selectedLayer.rotate(pivot, rotationAngle);
+    }
+
+    @Override public void mouseReleased(MouseEvent e) {
+        //Main.map.mapView.repaint();
+        Main.map.mapView.setCursor(Cursor.getDefaultCursor());
+        prevEastNorth = null;
+        mode = null;
+    }
+
+    public void mouseEntered(MouseEvent e) {
+    }
+    public void mouseExited(MouseEvent e) {
+    }
+    public void mouseMoved(MouseEvent e) {
+    }
+
+    @Override public void mouseClicked(MouseEvent e) {
+    }
+
+    private void saveModifiedLayers() {
+        for (WMSLayer wmsLayer : modifiedLayers) {
+            wmsLayer.saveNewCache();
+        }
+    }
+}
Index: applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/WMSLayer.java
===================================================================
--- applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/WMSLayer.java	(revision 18224)
+++ applications/editors/josm/plugins/cadastre-fr/src/cadastre_fr/WMSLayer.java	(revision 18256)
@@ -3,8 +3,10 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Color;
 import java.awt.Component;
 import java.awt.Graphics;
 import java.awt.Graphics2D;
 import java.awt.Image;
+import java.awt.Point;
 import java.awt.Toolkit;
 import java.awt.image.BufferedImage;
@@ -19,5 +21,4 @@
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
-import javax.swing.JDialog;
 import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
@@ -25,5 +26,4 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
-import org.openstreetmap.josm.data.projection.Lambert;
 import org.openstreetmap.josm.data.projection.LambertCC9Zones;
 import org.openstreetmap.josm.data.Bounds;
@@ -203,4 +203,7 @@
                 img.paint((Graphics2D) g, mv, CadastrePlugin.backgroundTransparent,
                         CadastrePlugin.transparency, CadastrePlugin.drawBoundaries);
+        }
+        if (this.isRaster) {
+            paintCrosspieces(g, mv);
         }
     }
@@ -527,3 +530,49 @@
     }
 
+    public EastNorth getRasterCenter() {
+        return new EastNorth((images.get(0).max.east()+images.get(0).min.east())/2,
+                (images.get(0).max.north()+images.get(0).min.north())/2);
+    }
+    
+    public void displace(double dx, double dy) {
+        this.rasterMin = new EastNorth(rasterMin.east() + dx, rasterMin.north() + dy);
+        images.get(0).shear(dx, dy);
+    }
+
+    public void resize(EastNorth rasterCenter, double proportion) {
+        this.rasterMin = rasterMin.interpolate(rasterCenter, proportion);
+        images.get(0).scale(rasterCenter, proportion);
+    }
+
+    public void rotate(EastNorth rasterCenter, double angle) {
+        this.rasterMin = rasterMin.rotate(rasterCenter, angle);
+        images.get(0).rotate(rasterCenter, angle);
+    }
+
+    private void paintCrosspieces(Graphics g, MapView mv) {
+        String crosspieces = Main.pref.get("cadastrewms.crosspieces", "0");
+        if (!crosspieces.equals("0")) {
+            int modulo = 50;
+            if (crosspieces.equals("2")) modulo = 100; 
+            EastNorthBound currentView = new EastNorthBound(mv.getEastNorth(0, mv.getHeight()),
+                    mv.getEastNorth(mv.getWidth(), 0));
+            int minX = ((int)currentView.min.east()/modulo+1)*modulo;
+            int minY = ((int)currentView.min.north()/modulo+1)*modulo;
+            int maxX = ((int)currentView.max.east()/modulo)*modulo;
+            int maxY = ((int)currentView.max.north()/modulo)*modulo;
+            int size=(maxX-minX)/modulo;
+            if (size<20) {
+                int px= size > 10 ? 2 : Math.abs(12-size);
+                g.setColor(Color.green);
+                for (int x=minX; x<=maxX; x+=modulo) {
+                    for (int y=minY; y<=maxY; y+=modulo) {
+                        Point p = mv.getPoint(new EastNorth(x,y));
+                        g.drawLine(p.x-px, p.y, p.x+px, p.y);
+                        g.drawLine(p.x, p.y-px, p.x, p.y+px);
+                    }
+                }
+            }
+        }
+    }
+    
 }
