Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java	(revision 29378)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetTools.java	(revision 29379)
@@ -1,5 +1,4 @@
 package iodb;
 
-import java.text.SimpleDateFormat;
 import java.util.*;
 import org.openstreetmap.josm.Main;
@@ -40,5 +39,5 @@
     public static LatLon getLayerOffset( ImageryLayer layer, LatLon center ) {
         Projection proj = Main.getProjection();
-        EastNorth offsetCenter = proj.latlon2eastNorth(center);
+        EastNorth offsetCenter = Main.map.mapView.getCenter();
         EastNorth centerOffset = offsetCenter.add(-layer.getDx(), -layer.getDy());
         LatLon offsetLL = proj.eastNorth2latlon(centerOffset);
@@ -79,5 +78,5 @@
         boolean isWMS = layer.getInfo().getImageryType().equals(ImageryInfo.ImageryType.WMS);
 
-        System.out.println(url);
+//        System.out.println(url);
 
         // Remove protocol
@@ -94,4 +93,7 @@
 
         // Parse query parameters into a sorted map
+        final Set<String> removeWMSParams = new TreeSet<String>(Arrays.asList(new String[] {
+            "srs", "width", "height", "bbox", "service", "request", "version", "format", "styles", "transparent"
+        }));
         Map<String, String> qparams = new TreeMap<String, String>();
         String[] qparamsStr = query.length() > 1 ? query.substring(1).split("&") : new String[0];
@@ -100,5 +102,5 @@
             kv[0] = kv[0].toLowerCase();
             // WMS: if this is WMS, remove all parameters except map and layers
-            if( isWMS && !(kv[0].equals("map") || kv[0].equals("layers")) )
+            if( isWMS && removeWMSParams.contains(kv[0]) )
                 continue;
             // TMS: skip parameters with variable values
@@ -128,5 +130,5 @@
             url = url.substring(1);
 
-        System.out.println("-> " + url + query);
+//        System.out.println("-> " + url + query);
         return url + query;
     }
@@ -166,4 +168,31 @@
     }
 
+    public static double[] getLengthAndDirection( ImageryOffset offset ) {
+        return getLengthAndDirection(offset, 0.0, 0.0);
+    }
+
+    public static double[] getLengthAndDirection( ImageryOffset offset, double dx, double dy ) {
+        Projection proj = Main.getProjection();
+        EastNorth pos = proj.latlon2eastNorth(offset.getPosition());
+        LatLon correctedCenterLL = proj.eastNorth2latlon(pos.add(dx, dy));
+        double length = correctedCenterLL.greatCircleDistance(offset.getImageryPos());
+        double direction = length < 1e-3 ? 0.0 : correctedCenterLL.heading(offset.getImageryPos());
+        // todo: north vs south. Meanwhile, let's fix this dirty:
+        direction = Math.PI - direction;
+        if( direction < 0 )
+            direction += Math.PI * 2;
+        return new double[] {length, direction};
+    }
+
+    public static String formatDistance( double d ) {
+        if( d < 0.0095 ) return tr("{0,number,0} mm", d * 1000);
+        if( d < 0.095 ) return tr("{0,number,0.0} cm", d * 100);
+        if( d < 0.95) return tr("{0,number,0} cm", d * 100);
+        if( d < 9.5 ) return tr("{0,number,0.0} m", d);
+        if( d < 950 ) return tr("{0,number,0} m", d);
+        if( d < 9500 ) return tr("{0,number,0.0} km", d / 1000);
+        return tr("{0,number,0} km", d / 1000);
+    }
+
     public static String getServerURL() {
         return Main.pref.get("iodb.server.url", "http://offsets.textual.ru/");
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 29378)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 29379)
@@ -1,15 +1,15 @@
 package iodb;
 
-import java.awt.FlowLayout;
-import java.awt.GridLayout;
-import java.awt.Insets;
+import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.awt.event.KeyEvent;
 import java.util.*;
+import java.util.List;
 import javax.swing.*;
 import javax.swing.border.CompoundBorder;
 import javax.swing.border.EmptyBorder;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.tools.GBC;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -31,5 +31,5 @@
         super(JOptionPane.getFrameForComponent(Main.parent), ImageryOffsetTools.DIALOG_TITLE, ModalityType.DOCUMENT_MODAL);
         setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
-        setResizable(false);
+//        setResizable(false);
         this.offsets = offsets;
 
@@ -41,5 +41,4 @@
     
     private void prepareDialog() {
-        Box dialog = new Box(BoxLayout.Y_AXIS);
         updateButtonPanel();
         final JCheckBox calibrationBox = new JCheckBox(tr("Calibration geometries"));
@@ -66,4 +65,5 @@
         cancelButton.setAlignmentX(CENTER_ALIGNMENT);
 
+        Box dialog = new Box(BoxLayout.Y_AXIS);
         dialog.add(buttonPanel);
         dialog.add(checkBoxPanel);
@@ -92,5 +92,4 @@
             buttonPanel.add(button);
         }
-//        buttonPanel.setMinimumSize(buttonPanel.getPreferredSize());
         pack();
     }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 29378)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 29379)
@@ -24,7 +24,6 @@
     public OffsetDialogButton( ImageryOffsetBase offset ) {
         super();
-        // todo: fix layout
-        setMinimumSize(new Dimension(500, 80));
-        setMaximumSize(new Dimension(500, 140));
+        setMinimumSize(new Dimension(500, 10));
+        setMaximumSize(new Dimension(500, 150));
         setText("<html>"
                 + Math.round(offset.getPosition().greatCircleDistance(ImageryOffsetTools.getMapCenter())) + " m: "
@@ -41,13 +40,16 @@
     }
 
-/*    @Override
+    @Override
     public Dimension getPreferredSize() {
-        return new Dimension(500, super.getPreferredSize().height);
-    }*/
+        Dimension size = super.getPreferredSize();
+        size.width = 500;
+        size.height = 70;
+        return size;
+    }
 
     private double[] getLengthAndDirection( ImageryOffset offset ) {
         ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
         double[] dxy = layer == null ? new double[] {0.0, 0.0} : new double[] {layer.getDx(), layer.getDy()};
-        return OffsetInfoAction.getLengthAndDirection((ImageryOffset)offset, dxy[0], dxy[1]);
+        return ImageryOffsetTools.getLengthAndDirection((ImageryOffset)offset, dxy[0], dxy[1]);
     }
 
@@ -66,5 +68,5 @@
                 ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
                 double[] dxy = layer == null ? new double[] {0.0, 0.0} : new double[] { layer.getDx(), layer.getDy() };
-                double[] ld = OffsetInfoAction.getLengthAndDirection((ImageryOffset)offset, dxy[0], dxy[1]);
+                double[] ld = ImageryOffsetTools.getLengthAndDirection((ImageryOffset)offset, dxy[0], dxy[1]);
                 length = ld[0];
                 direction = ld[1];
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java	(revision 29378)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java	(revision 29379)
@@ -35,16 +35,27 @@
         StringBuilder sb = new StringBuilder();
         if( offset instanceof ImageryOffset ) {
-            double[] ld = getLengthAndDirection((ImageryOffset)offset);
-            sb.append(tr("An imagery offset of {0} m to {1}", ld[0], explainDirection(ld[1]))).append('\n');
-            sb.append("Imagery ID: ").append(((ImageryOffset)offset).getImagery());
-        } else
-            sb.append(tr("A calibration {0}", getGeometryType((CalibrationObject)offset)));
-        sb.append("\n\nCreated by ").append(offset.getAuthor());
-        sb.append(" on ").append(DATE_FORMAT.format(offset.getDate())).append("\n");
+            double[] ld = ImageryOffsetTools.getLengthAndDirection((ImageryOffset)offset);
+            sb.append(ld[0] < 1e-3 ? tr("An imagery offset of 0 mm") : tr("An imagery offset of {0} to {1}",
+                    ImageryOffsetTools.formatDistance(ld[0]), explainDirection(ld[1]))).append('\n');
+            sb.append("Imagery ID: ").append(((ImageryOffset)offset).getImagery()).append('\n');
+        } else {
+            sb.append(tr("A calibration {0}", getGeometryType((CalibrationObject)offset))).append('\n');
+        }
+        
+        double dist = ImageryOffsetTools.getMapCenter().greatCircleDistance(offset.getPosition());
+        double heading = dist < 1 ? 0.0 : ImageryOffsetTools.getMapCenter().heading(offset.getPosition());
+        sb.append(dist < 10 ? tr("Determined right here") : tr("Determined at a point {0} to the {1}",
+                ImageryOffsetTools.formatDistance(dist), explainDirection(heading)));
+        
+        sb.append('\n').append('\n');
+        sb.append("Created by ").append(offset.getAuthor());
+        sb.append(" on ").append(DATE_FORMAT.format(offset.getDate())).append('\n');
         sb.append("Description: ").append(offset.getDescription());
+        
         if( offset.isDeprecated() ) {
-            sb.append("\n\nThis geometry was marked obsolete\n");
+            sb.append('\n').append('\n');
+            sb.append("This geometry was marked obsolete").append('\n');
             sb.append("by ").append(offset.getAbandonAuthor());
-            sb.append(" on ").append(DATE_FORMAT.format(offset.getAbandonDate())).append("\n");
+            sb.append(" on ").append(DATE_FORMAT.format(offset.getAbandonDate())).append('\n');
             sb.append("Reason: ").append(offset.getAbandonReason());
         }
@@ -66,17 +77,15 @@
     }
 
-    public static double[] getLengthAndDirection( ImageryOffset offset ) {
-        return getLengthAndDirection(offset, 0.0, 0.0);
-    }
-
-    public static double[] getLengthAndDirection( ImageryOffset offset, double dx, double dy ) {
-        double length = 0.0;
-        double direction = 0.0;
-        // todo: calculate length and angular direction
-        return new double[] { length, direction };
-    }
-
     public static String explainDirection( double dir ) {
-        return "nowhere"; // todo
+        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";
     }
 }
