Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/GetImageryOffsetAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/GetImageryOffsetAction.java	(revision 29398)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/GetImageryOffsetAction.java	(revision 29399)
@@ -26,5 +26,5 @@
  * @license WTFPL
  */
-public class GetImageryOffsetAction extends JosmAction {
+public class GetImageryOffsetAction extends JosmAction implements ImageryOffsetWatcher.OffsetStateListener {
     private Icon iconOffsetOk;
     private Icon iconOffsetBad;
@@ -39,5 +39,5 @@
                 KeyEvent.VK_I, Shortcut.ALT_CTRL), true);
         iconOffsetOk = ImageProvider.get("getoffset");
-        iconOffsetBad = ImageProvider.get("getoffsetnow"); // todo: create icon
+        iconOffsetBad = ImageProvider.get("getoffsetnow");
         ImageryOffsetWatcher.getInstance().register(this);
     }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetWatcher.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetWatcher.java	(revision 29398)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetWatcher.java	(revision 29399)
@@ -12,18 +12,22 @@
  * for the current layer.
  *
- * @author zverik
+ * @author Zverik
+ * @license WTFPL
  */
 public class ImageryOffsetWatcher implements MapView.ZoomChangeListener, MapView.LayerChangeListener {
     private static final double THRESHOLD = 1e-8;
-    private static final double MAX_DISTANCE = Main.pref.getDouble("iodb.offset.radius", 15) * 1000;
+    private static ImageryOffsetWatcher instance;
     private Map<Integer, ImageryLayerData> layers = new TreeMap<Integer, ImageryLayerData>();
-    private List<GetImageryOffsetAction> listeners = new ArrayList<GetImageryOffsetAction>();
+    private List<OffsetStateListener> listeners = new ArrayList<OffsetStateListener>();
     private Timer time;
-    private static ImageryOffsetWatcher instance;
-    private boolean offsetGood;
+    private double maxDistance;
+    private boolean offsetGood = true;
 
+    /**
+     * Create an instance and register it as a listener to MapView.
+     * Also starts a timer task.
+     */
     private ImageryOffsetWatcher() {
-        if( MAX_DISTANCE <= 0 )
-            return;
+        maxDistance = Main.pref.getDouble("iodb.offset.radius", 15);
         MapView.addZoomChangeListener(this);
         MapView.addLayerChangeListener(this);
@@ -42,4 +46,8 @@
     }
 
+    /**
+     * This class is a singleton, this method returns the instance,
+     * creating it if neccessary.
+     */
     public static ImageryOffsetWatcher getInstance() {
         if( instance == null ) {
@@ -49,16 +57,25 @@
     }
 
-    public void register( GetImageryOffsetAction listener ) {
+    /**
+     * Register an offset state listener.
+     */
+    public void register( OffsetStateListener listener ) {
         listeners.add(listener);
         listener.offsetStateChanged(offsetGood);
     }
 
-    public void unregister( GetImageryOffsetAction listener ) {
+    /**
+     * Unregister an offset state listener.
+     */
+    public void unregister( OffsetStateListener listener ) {
         listeners.remove(listener);
     }
 
+    /**
+     * Change stored offset state, notify listeners if needed.
+     */
     private void setOffsetGood( boolean good ) {
         if( good != offsetGood ) {
-            for( GetImageryOffsetAction listener : listeners )
+            for( OffsetStateListener listener : listeners )
                 listener.offsetStateChanged(good);
         }
@@ -66,5 +83,12 @@
     }
 
+    /**
+     * Check if the offset state has been changed.
+     */
     private void checkOffset() {
+        if( maxDistance <= 0 ) {
+            setOffsetGood(true);
+            return;
+        }
         ImageryLayer layer = ImageryOffsetTools.getTopImageryLayer();
         if( layer == null ) {
@@ -96,9 +120,13 @@
                 setOffsetGood(true);
             } else {
-                setOffsetGood(data.lastChecked != null && center.greatCircleDistance(data.lastChecked) <= MAX_DISTANCE);
+                setOffsetGood(data.lastChecked != null && center.greatCircleDistance(data.lastChecked) <= maxDistance * 1000);
             }
         }
     }
 
+    /**
+     * This class stores an offset and last location for a single imagery layer.
+     * All fields are public, because this is not enterprise.
+     */
     private static class ImageryLayerData {
         public double lastDx = 0.0;
@@ -123,9 +151,23 @@
     }
 
+    /**
+     * This task is run every 1-2 seconds.
+     */
     private class IntervalOffsetChecker extends TimerTask {
+        /**
+         * Reread max radius setting and update offset state.
+         */
         @Override
         public void run() {
+            maxDistance = Main.pref.getDouble("iodb.offset.radius", 15);
             checkOffset();
         }
     }
+
+    /**
+     * The interface for offset listeners.
+     */
+    public interface OffsetStateListener {
+        void offsetStateChanged( boolean isOffsetGood );
+    }
 }
