Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetPlugin.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetPlugin.java	(revision 29381)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetPlugin.java	(revision 29382)
@@ -26,7 +26,4 @@
         offsetMenu.add(getAction);
         offsetMenu.add(storeAction);
-
-        // todo: add a button on toolbar
-        // todo: make MapMode for viewing and updating imagery offsets (is it needed?)
     }
 }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java	(revision 29381)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java	(revision 29382)
@@ -176,9 +176,9 @@
         Projection proj = Main.getProjection();
         EastNorth pos = proj.latlon2eastNorth(offset.getPosition());
-        LatLon correctedCenterLL = proj.eastNorth2latlon(pos.add(dx, dy));
+        LatLon correctedCenterLL = proj.eastNorth2latlon(pos.add(-dx, -dy));
         double length = correctedCenterLL.greatCircleDistance(offset.getImageryPos());
         double direction = length < 1e-2 ? 0.0 : correctedCenterLL.heading(offset.getImageryPos());
         // todo: north vs south. Meanwhile, let's fix this dirty:
-        direction = Math.PI - direction;
+//        direction = Math.PI - direction;
         if( direction < 0 )
             direction += Math.PI * 2;
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 29381)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 29382)
@@ -11,7 +11,10 @@
 import javax.swing.border.EmptyBorder;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.gui.JosmUserIdentityManager;
+import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.MapViewPaintable;
 import static org.openstreetmap.josm.tools.I18n.tr;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -23,5 +26,5 @@
  * @author zverik
  */
-public class OffsetDialog extends JDialog implements ActionListener, NavigatableComponent.ZoomChangeListener {
+public class OffsetDialog extends JDialog implements ActionListener, NavigatableComponent.ZoomChangeListener, MapViewPaintable {
     protected static final String PREF_CALIBRATION = "iodb.show.calibration";
     protected static final String PREF_DEPRECATED = "iodb.show.deprecated";
@@ -106,4 +109,5 @@
         }
         pack();
+        Main.map.mapView.repaint();
     }
 
@@ -131,8 +135,29 @@
         }
     }
+
+    public void paint( Graphics2D g, MapView mv, Bounds bbox ) {
+        if( offsets == null )
+            return;
+
+        Graphics2D g2 = (Graphics2D)g.create();
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.setStroke(new BasicStroke(2));
+        for( ImageryOffsetBase offset : filterOffsets() ) {
+            Point p = mv.getPoint(offset.getPosition());
+            g2.setColor(Color.BLACK);
+            g2.fillOval(p.x - 2, p.y - 2, 5, 5);
+            g2.setColor(Color.WHITE);
+            g2.drawOval(p.x - 3, p.y - 3, 7, 7);
+        }
+    }
     
     public ImageryOffsetBase showDialog() {
+        // todo: add a temporary layer showing all offsets
         selectedOffset = null;
         prepareDialog();
+        if( !MODAL ) {
+            Main.map.mapView.addTemporaryLayer(this);
+            Main.map.mapView.repaint();
+        }
         setVisible(true);
         return selectedOffset;
@@ -173,6 +198,10 @@
         NavigatableComponent.removeZoomChangeListener(this);
         setVisible(false);
-        if( !MODAL && selectedOffset != null )
-            applyOffset();
+        if( !MODAL ) {
+            Main.map.mapView.removeTemporaryLayer(this);
+            Main.map.mapView.repaint();
+            if( selectedOffset != null )
+                applyOffset();
+        }
     }
 
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 29381)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 29382)
@@ -1,7 +1,5 @@
 package iodb;
 
-import java.awt.Component;
-import java.awt.Dimension;
-import java.awt.Graphics;
+import java.awt.*;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
@@ -25,6 +23,6 @@
         super();
         this.offset = offset;
-        setMinimumSize(new Dimension(500, 10));
-        setMaximumSize(new Dimension(500, 150));
+//        setMinimumSize(new Dimension(500, 10));
+//        setMaximumSize(new Dimension(500, 150));
         setRelevantText();
         setIcon(new OffsetIcon(offset));
@@ -32,4 +30,12 @@
         offsetLength = offset instanceof ImageryOffset ? getLengthAndDirection((ImageryOffset)offset)[0] : 0.0;
         // todo: layout, info, map distance and direction
+        // http://stackoverflow.com/questions/1048224/get-height-of-multi-line-text-with-fixed-width-to-make-dialog-resize-properly
+        // http://docs.oracle.com/javase/tutorial/uiswing/layout/box.html#size
+        // http://stackoverflow.com/questions/8012646/setting-size-of-jbutton-inside-jpanel-with-boxlayout-doesnt-work-as-expected
+        // http://blog.nobel-joergensen.com/2009/01/18/changing-preferred-size-of-a-html-jlabel/
+        // http://thebadprogrammer.com/swing-layout-manager-sizing/
+        // http://stackoverflow.com/questions/3692987/why-will-boxlayout-not-allow-me-to-change-the-width-of-a-jbutton-but-let-me-chan
+
+        // http://stackoverflow.com/questions/2158/creating-a-custom-button-in-java
     }
 
@@ -38,7 +44,7 @@
      */
     public void setRelevantText() {
-        setText("<html>"
+        setText("<html><div style=\"width: 400px;\">"
                 + ImageryOffsetTools.formatDistance(offset.getPosition().greatCircleDistance(ImageryOffsetTools.getMapCenter()))
-                + ": " + offset.getDescription() + "</html>");
+                + ": " + offset.getDescription() + "</div></html>");
     }
 
@@ -47,5 +53,5 @@
     }
 
-    @Override
+/*    @Override
     public Dimension getPreferredSize() {
         Dimension size = super.getPreferredSize();
@@ -53,5 +59,5 @@
         size.height = 70;
         return size;
-    }
+    }*/
 
     /**
@@ -72,5 +78,5 @@
         private boolean isDeprecated;
         private boolean isCalibration;
-        private double direction;
+        private double direction = -1.0;
         private double length;
         private ImageIcon background;
@@ -91,8 +97,41 @@
         }
 
-        public void paintIcon( Component c, Graphics g, int x, int y ) {
-            background.paintIcon(c, g, x, y);
-            // todo: draw an arrow
-            // todo: apply deprecation
+        public void paintIcon( Component comp, Graphics g, int x, int y ) {
+            background.paintIcon(comp, g, x, y);
+
+            Graphics2D g2 = (Graphics2D)g.create();
+            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+            if( direction >= 0 ) {
+                g2.setColor(Color.black);
+                Point c = new Point(x + getIconWidth() / 2, y + getIconHeight() / 2);
+                if( length < 1e-2 ) {
+                    // no offset
+                    g2.fillOval(c.x - 3, c.y - 3, 7, 7);
+                } else {
+                    // draw an arrow
+                    double arrowLength = length < 5 ? getIconWidth() / 2 - 1 : getIconWidth() - 4;
+                    g2.setStroke(new BasicStroke(2));
+                    int dx = (int)Math.round(Math.sin(direction) * arrowLength / 2);
+                    int dy = (int)Math.round(Math.cos(direction) * arrowLength / 2);
+                    g2.drawLine(c.x - dx, c.y - dy, c.x + dx, c.y + dy);
+                    double wingLength = arrowLength / 3;
+                    double d1 = direction - Math.PI / 6;
+                    int dx1 = (int)Math.round(Math.sin(d1) * wingLength);
+                    int dy1 = (int)Math.round(Math.cos(d1) * wingLength);
+                    g2.drawLine(c.x + dx, c.y + dy, c.x + dx - dx1, c.y + dy - dy1);
+                    double d2 = direction + Math.PI / 6;
+                    int dx2 = (int)Math.round(Math.sin(d2) * wingLength);
+                    int dy2 = (int)Math.round(Math.cos(d2) * wingLength);
+                    g2.drawLine(c.x + dx, c.y + dy, c.x + dx - dx2, c.y + dy - dy2);
+                }
+            }
+            if( isDeprecated ) {
+                // big red X
+                g2.setColor(Color.red);
+                g2.setStroke(new BasicStroke(5, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+                g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f));
+                g2.drawLine(x + 2, y + 2, x + getIconWidth() - 2, y + getIconHeight() - 2);
+                g2.drawLine(x + 2, y + getIconHeight() - 2, x + getIconWidth() - 2, y + 2);
+            }
         }
 
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java	(revision 29381)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java	(revision 29382)
@@ -34,7 +34,7 @@
         StringBuilder sb = new StringBuilder();
         if( offset instanceof ImageryOffset ) {
-            double[] ld = ImageryOffsetTools.getLengthAndDirection((ImageryOffset)offset);
-            sb.append(ld[0] < 1e-2 ? tr("An imagery offset of 0 mm") : tr("An imagery offset of {0} to {1}",
-                    ImageryOffsetTools.formatDistance(ld[0]), explainDirection(ld[1]))).append('\n');
+            double odist = ((ImageryOffset)offset).getImageryPos().greatCircleDistance(offset.getPosition());
+            sb.append(odist < 1e-2 ? tr("An imagery offset of 0 mm") : tr("An imagery offset of {0}",
+                    ImageryOffsetTools.formatDistance(odist))).append('\n');
             sb.append("Imagery ID: ").append(((ImageryOffset)offset).getImagery()).append('\n');
         } else {
@@ -43,7 +43,6 @@
         
         double dist = ImageryOffsetTools.getMapCenter().greatCircleDistance(offset.getPosition());
-        double heading = dist < 10 ? 0.0 : ImageryOffsetTools.getMapCenter().heading(offset.getPosition());
-        sb.append(dist < 50 ? tr("Determined right here") : tr("Determined at a point {0} to the {1}",
-                ImageryOffsetTools.formatDistance(dist), explainDirection(heading)));
+        sb.append(dist < 50 ? tr("Determined right here") : tr("Determined at a point {0} away",
+                ImageryOffsetTools.formatDistance(dist)));
         
         sb.append('\n').append('\n');
@@ -75,16 +74,3 @@
             return "geometry";
     }
-
-    public static String explainDirection( double dir ) {
-        dir = dir * 8 / Math.PI;
-        if( dir < 1 || dir >= 15 ) return tr("north");
-        if( dir < 3 ) return tr("northeast");
-        if( dir < 5 ) return tr("east");
-        if( dir < 7 ) return tr("southeast");
-        if( dir < 9 ) return tr("south");
-        if( dir < 11 ) return tr("southwest");
-        if( dir < 13 ) return tr("west");
-        if( dir < 15 ) return tr("northwest");
-        return "nowhere";
-    }
 }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/StoreImageryOffsetAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/StoreImageryOffsetAction.java	(revision 29381)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/StoreImageryOffsetAction.java	(revision 29382)
@@ -40,4 +40,6 @@
             return;
         }
+        if( userName.indexOf('@') > 0 )
+            userName = userName.replace('@', ',');
             
         // check if an object suitable for calibration is selected
