Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/IODBReader.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/IODBReader.java	(revision 29387)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/IODBReader.java	(revision 29388)
@@ -100,4 +100,6 @@
                     fields.position = parseLatLon(attributes);
                     fields.id = Integer.parseInt(attributes.getValue("id"));
+                    if( attributes.getValue("flagged") != null && attributes.getValue("flagged").equals("yes") )
+                        fields.flagged = true;
                 }
             } else {
@@ -183,4 +185,5 @@
         public String imagery;
         public int minZoom, maxZoom;
+        public boolean flagged;
         public List<LatLon> geometry;
 
@@ -208,4 +211,5 @@
             minZoom = -1;
             maxZoom = -1;
+            flagged = false;
             geometry = new ArrayList<LatLon>();
         }
@@ -234,4 +238,6 @@
             result.setBasicInfo(position, author, description, date);
             result.setDeprecated(abandonDate, abandonAuthor, abandonReason);
+            if( flagged )
+                result.setFlagged(flagged);
             return result;
         }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetBase.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetBase.java	(revision 29387)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/ImageryOffsetBase.java	(revision 29388)
@@ -23,4 +23,5 @@
     protected String abandonAuthor;
     protected String abandonReason;
+    protected boolean flagged;
     
     /**
@@ -34,4 +35,5 @@
         this.date = date;
         this.abandonDate = null;
+        this.flagged = false;
     }
 
@@ -52,4 +54,12 @@
         this.abandonAuthor = author;
         this.abandonReason = reason;
+    }
+
+    public boolean isFlagged() {
+        return flagged;
+    }
+
+    public void setFlagged( boolean flagged ) {
+        this.flagged = flagged;
     }
 
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 29387)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialog.java	(revision 29388)
@@ -214,11 +214,21 @@
         } else
             selectedOffset = null;
-        NavigatableComponent.removeZoomChangeListener(this);
-        setVisible(false);
+        boolean closeDialog = MODAL || selectedOffset == null
+                || selectedOffset instanceof CalibrationObject
+                || Main.pref.getBoolean("iodb.close.on.select", true);
+        if( closeDialog ) {
+            NavigatableComponent.removeZoomChangeListener(this);
+            setVisible(false);
+        }
         if( !MODAL ) {
-            Main.map.mapView.removeTemporaryLayer(this);
-            Main.map.mapView.repaint();
-            if( selectedOffset != null )
+            if( closeDialog ) {
+                Main.map.mapView.removeTemporaryLayer(this);
+                Main.map.mapView.repaint();
+            }
+            if( selectedOffset != null ) {
                 applyOffset();
+                if( !closeDialog )
+                    updateButtonPanel();
+            }
         }
     }
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 29387)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetDialogButton.java	(revision 29388)
@@ -72,5 +72,8 @@
 
         String description = offset.isDeprecated() ? offset.getAbandonReason() : offset.getDescription();
+        description = description.replace("<", "&lt;").replace(">", "&gt;");
         JLabel descriptionLabel = new JLabel("<html><div style=\"width: 300px;\">"+description+"</div></html>");
+        Font descriptionFont = new Font(descriptionLabel.getFont().getName(), Font.BOLD, descriptionLabel.getFont().getSize() - 2);
+        descriptionLabel.setFont(descriptionFont);
 
         double offsetDistance = offset instanceof ImageryOffset
Index: /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java
===================================================================
--- /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java	(revision 29387)
+++ /applications/editors/josm/plugins/imagery_offset_db/src/iodb/OffsetInfoAction.java	(revision 29388)
@@ -2,4 +2,6 @@
 
 import java.awt.event.ActionEvent;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import javax.swing.AbstractAction;
@@ -18,5 +20,5 @@
     public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("dd MMMM yyyy");
 
-    private Object info;
+    ImageryOffsetBase offset;
     
     /**
@@ -27,14 +29,38 @@
         super(tr("Offset Information"));
         putValue(SMALL_ICON, ImageProvider.get("info"));
-        if( offset != null )
-            this.info = getInformationObject(offset);
+        this.offset = offset;
         setEnabled(offset != null);
     }
 
     /**
-     * Shows a dialog with the pre-constructed message.
+     * Shows a dialog with the pre-constructed message. Allows a user
+     * to report the given offset.
      */
     public void actionPerformed(ActionEvent e) {
-        JOptionPane.showMessageDialog(Main.parent, info, ImageryOffsetTools.DIALOG_TITLE, JOptionPane.PLAIN_MESSAGE);
+        Object info = offset == null ? null : getInformationObject(offset);
+        if( offset.isFlagged() )
+            JOptionPane.showMessageDialog(Main.parent, info, ImageryOffsetTools.DIALOG_TITLE, JOptionPane.PLAIN_MESSAGE);
+        else {
+            int result = JOptionPane.showOptionDialog(Main.parent, info, ImageryOffsetTools.DIALOG_TITLE,
+                    JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE, null,
+                    new String[] { "OK", tr("Report this offset") }, null);
+            if( result == 1 ) {
+                // ask for a reason
+                Object reason = JOptionPane.showInputDialog(Main.parent,
+                        tr("You are to notify moderators of this offset. Why they should look into this case?"),
+                        ImageryOffsetTools.DIALOG_TITLE, JOptionPane.PLAIN_MESSAGE);
+                if( reason != null && reason.toString().length() > 0 ) {
+                    try {
+                        String query = "report?id=" + offset.getId()
+                                + "&reason=" + URLEncoder.encode(reason.toString(), "UTF8");
+                        SimpleOffsetQueryTask reportTask =
+                                new SimpleOffsetQueryTask(query, tr("Reporting the offset..."));
+                        Main.worker.submit(reportTask);
+                    } catch( UnsupportedEncodingException ex ) {
+                        // WTF
+                    }
+                }
+            }
+        }
     }
 
@@ -57,15 +83,20 @@
                 ImageryOffsetTools.formatDistance(dist)));
         
-        sb.append('\n').append('\n');
-        sb.append(tr("Created by {0} on {1}\n", offset.getAuthor(),
+        sb.append("\n\n");
+        sb.append(tr("Created by {0} on {1}", offset.getAuthor(),
                 DATE_FORMAT.format(offset.getDate()))).append('\n');
         sb.append(tr("Description")).append(": ").append(offset.getDescription());
         
         if( offset.isDeprecated() ) {
-            sb.append('\n').append('\n');
-            sb.append(tr("Deprecated by {0} on {1}\n",offset.getAbandonAuthor(),
+            sb.append("\n\n");
+            sb.append(tr("Deprecated by {0} on {1}",offset.getAbandonAuthor(),
                     DATE_FORMAT.format(offset.getAbandonDate()))).append('\n');
             sb.append(tr("Reason")).append(": ").append(offset.getAbandonReason());
         }
+
+        if( offset.isFlagged() ) {
+            sb.append("\n\n").append(tr("This entry has been reported."));
+        }
+
         return sb.toString();
     }
