Index: trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 8468)
+++ trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 8469)
@@ -20,5 +20,5 @@
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.actionsupport.AlignImageryPanel;
+import org.openstreetmap.josm.gui.layer.AlignImageryPanel;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.preferences.imagery.WMSLayerTree;
Index: trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 8468)
+++ trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 8469)
@@ -36,5 +36,5 @@
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.DefaultNameFormatter;
-import org.openstreetmap.josm.gui.actionsupport.DeleteFromRelationConfirmationDialog;
+import org.openstreetmap.josm.gui.dialogs.DeleteFromRelationConfirmationDialog;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
Index: trunk/src/org/openstreetmap/josm/gui/bbox/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/bbox/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/bbox/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI classes for displaying a customizable and interactive bounding box.
+ */
+package org.openstreetmap.josm.gui.bbox;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 8469)
@@ -0,0 +1,360 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs;
+
+import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.FlowLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.AbstractAction;
+import javax.swing.JDialog;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTable;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
+import javax.swing.table.DefaultTableColumnModel;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableColumn;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.NameFormatter;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.RelationToChildReference;
+import org.openstreetmap.josm.gui.DefaultNameFormatter;
+import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
+import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.widgets.HtmlPanel;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.WindowGeometry;
+
+/**
+ * This dialog is used to get a user confirmation that a collection of primitives can be removed
+ * from their parent relations.
+ * @since 2308
+ */
+public class DeleteFromRelationConfirmationDialog extends JDialog implements TableModelListener {
+    /** the unique instance of this dialog */
+    private static DeleteFromRelationConfirmationDialog instance;
+
+    /**
+     * Replies the unique instance of this dialog
+     *
+     * @return The unique instance of this dialog
+     */
+    public static synchronized DeleteFromRelationConfirmationDialog getInstance() {
+        if (instance == null) {
+            instance = new DeleteFromRelationConfirmationDialog();
+        }
+        return instance;
+    }
+
+    /** the data model */
+    private RelationMemberTableModel model;
+    private HtmlPanel htmlPanel;
+    private boolean canceled;
+    private SideButton btnOK;
+
+    protected JPanel buildRelationMemberTablePanel() {
+        JTable table = new JTable(model, new RelationMemberTableColumnModel());
+        JPanel pnl = new JPanel();
+        pnl.setLayout(new BorderLayout());
+        pnl.add(new JScrollPane(table));
+        return pnl;
+    }
+
+    protected JPanel buildButtonPanel() {
+        JPanel pnl = new JPanel();
+        pnl.setLayout(new FlowLayout());
+        pnl.add(btnOK = new SideButton(new OKAction()));
+        btnOK.setFocusable(true);
+        pnl.add(new SideButton(new CancelAction()));
+        pnl.add(new SideButton(new ContextSensitiveHelpAction(ht("/Action/Delete#DeleteFromRelations"))));
+        return pnl;
+    }
+
+    protected final void build() {
+        model = new RelationMemberTableModel();
+        model.addTableModelListener(this);
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(htmlPanel = new HtmlPanel(), BorderLayout.NORTH);
+        getContentPane().add(buildRelationMemberTablePanel(), BorderLayout.CENTER);
+        getContentPane().add(buildButtonPanel(), BorderLayout.SOUTH);
+
+        HelpUtil.setHelpContext(this.getRootPane(), ht("/Action/Delete#DeleteFromRelations"));
+
+        addWindowListener(new WindowEventHandler());
+    }
+
+    protected void updateMessage() {
+        int numObjectsToDelete = model.getNumObjectsToDelete();
+        int numParentRelations = model.getNumParentRelations();
+        String msg;
+        if (numObjectsToDelete == 1 && numParentRelations == 1) {
+            msg = tr("<html>Please confirm to remove <strong>1 object</strong> from <strong>1 relation</strong>.</html>");
+        } else if (numObjectsToDelete == 1 && numParentRelations > 1) {
+            msg = tr("<html>Please confirm to remove <strong>1 object</strong> from <strong>{0} relations</strong>.</html>", numParentRelations);
+        } else if (numObjectsToDelete > 1 && numParentRelations == 1) {
+            msg = tr("<html>Please confirm to remove <strong>1 object</strong> from <strong>{0} relations</strong>.</html>", numParentRelations);
+        } else {
+            msg = tr("<html>Please confirm to remove <strong>{0} objects</strong> from <strong>{1} relations</strong>.</html>", numObjectsToDelete,numParentRelations);
+        }
+        htmlPanel.getEditorPane().setText(msg);
+        invalidate();
+    }
+
+    protected void updateTitle() {
+        int numObjectsToDelete = model.getNumObjectsToDelete();
+        if (numObjectsToDelete > 0) {
+            setTitle(trn("Deleting {0} object", "Deleting {0} objects", numObjectsToDelete, numObjectsToDelete));
+        } else {
+            setTitle(tr("Delete objects"));
+        }
+    }
+
+    /**
+     * Constructs a new {@code DeleteFromRelationConfirmationDialog}.
+     */
+    public DeleteFromRelationConfirmationDialog() {
+        super(JOptionPane.getFrameForComponent(Main.parent), "", ModalityType.DOCUMENT_MODAL);
+        build();
+    }
+
+    /**
+     * Replies the data model used in this dialog
+     *
+     * @return the data model
+     */
+    public RelationMemberTableModel getModel() {
+        return model;
+    }
+
+    /**
+     * Replies true if the dialog was canceled
+     *
+     * @return true if the dialog was canceled
+     */
+    public boolean isCanceled() {
+        return canceled;
+    }
+
+    protected void setCanceled(boolean canceled) {
+        this.canceled = canceled;
+    }
+
+    @Override
+    public void setVisible(boolean visible) {
+        if (visible) {
+            new WindowGeometry(
+                    getClass().getName()  + ".geometry",
+                    WindowGeometry.centerInWindow(
+                            Main.parent,
+                            new Dimension(400,200)
+                    )
+            ).applySafe(this);
+            setCanceled(false);
+        } else if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
+            new WindowGeometry(this).remember(getClass().getName() + ".geometry");
+        }
+        super.setVisible(visible);
+    }
+
+    @Override
+    public void tableChanged(TableModelEvent e) {
+        updateMessage();
+        updateTitle();
+    }
+
+    /**
+     * The table model which manages the list of relation-to-child references
+     *
+     */
+    public static class RelationMemberTableModel extends DefaultTableModel {
+        private transient List<RelationToChildReference> data;
+
+        /**
+         * Constructs a new {@code RelationMemberTableModel}.
+         */
+        public RelationMemberTableModel() {
+            data = new ArrayList<>();
+        }
+
+        @Override
+        public int getRowCount() {
+            if (data == null) return 0;
+            return data.size();
+        }
+
+        protected void sort() {
+            Collections.sort(
+                    data,
+                    new Comparator<RelationToChildReference>() {
+                        private NameFormatter nf = DefaultNameFormatter.getInstance();
+                        @Override
+                        public int compare(RelationToChildReference o1, RelationToChildReference o2) {
+                            int cmp = o1.getChild().getDisplayName(nf).compareTo(o2.getChild().getDisplayName(nf));
+                            if (cmp != 0) return cmp;
+                            cmp = o1.getParent().getDisplayName(nf).compareTo(o2.getParent().getDisplayName(nf));
+                            if (cmp != 0) return cmp;
+                            return Integer.compare(o1.getPosition(), o2.getPosition());
+                        }
+                    }
+            );
+        }
+
+        public void populate(Collection<RelationToChildReference> references) {
+            data.clear();
+            if (references != null) {
+                data.addAll(references);
+            }
+            sort();
+            fireTableDataChanged();
+        }
+
+        public Set<OsmPrimitive> getObjectsToDelete() {
+            Set<OsmPrimitive> ret = new HashSet<>();
+            for (RelationToChildReference ref: data) {
+                ret.add(ref.getChild());
+            }
+            return ret;
+        }
+
+        public int getNumObjectsToDelete() {
+            return getObjectsToDelete().size();
+        }
+
+        public Set<OsmPrimitive> getParentRelations() {
+            Set<OsmPrimitive> ret = new HashSet<>();
+            for (RelationToChildReference ref: data) {
+                ret.add(ref.getParent());
+            }
+            return ret;
+        }
+
+        public int getNumParentRelations() {
+            return getParentRelations().size();
+        }
+
+        @Override
+        public Object getValueAt(int rowIndex, int columnIndex) {
+            if (data == null) return null;
+            RelationToChildReference ref = data.get(rowIndex);
+            switch(columnIndex) {
+            case 0: return ref.getChild();
+            case 1: return ref.getParent();
+            case 2: return ref.getPosition()+1;
+            case 3: return ref.getRole();
+            default:
+                assert false: "Illegal column index";
+            }
+            return null;
+        }
+
+        @Override
+        public boolean isCellEditable(int row, int column) {
+            return false;
+        }
+    }
+
+    private static class RelationMemberTableColumnModel extends DefaultTableColumnModel{
+
+        protected final void createColumns() {
+            TableColumn col = null;
+
+            // column 0 - To Delete
+            col = new TableColumn(0);
+            col.setHeaderValue(tr("To delete"));
+            col.setResizable(true);
+            col.setWidth(100);
+            col.setPreferredWidth(100);
+            col.setCellRenderer(new OsmPrimitivRenderer());
+            addColumn(col);
+
+            // column 0 - From Relation
+            col = new TableColumn(1);
+            col.setHeaderValue(tr("From Relation"));
+            col.setResizable(true);
+            col.setWidth(100);
+            col.setPreferredWidth(100);
+            col.setCellRenderer(new OsmPrimitivRenderer());
+            addColumn(col);
+
+            // column 1 - Pos.
+            col = new TableColumn(2);
+            col.setHeaderValue(tr("Pos."));
+            col.setResizable(true);
+            col.setWidth(30);
+            col.setPreferredWidth(30);
+            addColumn(col);
+
+            // column 2 - Role
+            col = new TableColumn(3);
+            col.setHeaderValue(tr("Role"));
+            col.setResizable(true);
+            col.setWidth(50);
+            col.setPreferredWidth(50);
+            addColumn(col);
+        }
+
+        public RelationMemberTableColumnModel() {
+            createColumns();
+        }
+    }
+
+    class OKAction extends AbstractAction {
+        public OKAction() {
+            putValue(NAME, tr("OK"));
+            putValue(SMALL_ICON, ImageProvider.get("ok"));
+            putValue(SHORT_DESCRIPTION, tr("Click to close the dialog and remove the object from the relations"));
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            setCanceled(false);
+            setVisible(false);
+        }
+    }
+
+    class CancelAction extends AbstractAction {
+        public CancelAction() {
+            putValue(NAME, tr("Cancel"));
+            putValue(SMALL_ICON, ImageProvider.get("cancel"));
+            putValue(SHORT_DESCRIPTION, tr("Click to close the dialog and to abort deleting the objects"));
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            setCanceled(true);
+            setVisible(false);
+        }
+    }
+
+    class WindowEventHandler extends WindowAdapter {
+
+        @Override
+        public void windowClosing(WindowEvent e) {
+            setCanceled(true);
+        }
+
+        @Override
+        public void windowOpened(WindowEvent e) {
+            btnOK.requestFocusInWindow();
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/LogShowDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/LogShowDialog.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/LogShowDialog.java	(revision 8469)
@@ -0,0 +1,60 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.widgets.JosmEditorPane;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Generic dialog with message and scrolling area
+ * @author Alexei
+ * @since 5114
+ */
+public class LogShowDialog extends ExtendedDialog {
+
+    /**
+     * Constructs a new {@code LogShowDialog}.
+     * @param title The text that will be shown in the window titlebar
+     * @param msg Single-line Label
+     * @param log Multi-line log
+     */
+    public LogShowDialog(String title, String msg, String log) {
+        super(Main.parent, title, new String[] {tr("OK")});
+        setButtonIcons(new String[] {"ok.png"});
+        setContent(build(msg, log));
+    }
+
+    protected final JPanel build(String msg, String log) {
+        JPanel p = new JPanel(new GridBagLayout());
+        JLabel lbl = new JLabel(msg);
+
+        lbl.setFont(lbl.getFont().deriveFont(0, 14));
+
+        p.add(lbl, GBC.eol().insets(5,0,5,0));
+        JosmEditorPane txt = new JosmEditorPane();
+        txt.setContentType("text/html");
+        txt.setText(log);
+        txt.setEditable(false);
+        txt.setOpaque(false);
+
+        lbl.setLabelFor(txt);
+
+        JScrollPane sp = new JScrollPane(txt);
+        sp.setOpaque(false);
+        sp.setPreferredSize(new Dimension(600,300));
+
+        p.add(sp, GBC.eop().insets(5,15,0,0).fill(GBC.HORIZONTAL));
+
+        return p;
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Standalone dialog allowing to handle OSM changesets (query and display them).
+ */
+package org.openstreetmap.josm.gui.dialogs.changeset;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/query/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes allowing to query changesets to the OSM API.
+ */
+package org.openstreetmap.josm.gui.dialogs.changeset.query;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/package-info.java	(revision 8469)
@@ -0,0 +1,11 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides three kinds of dialogs:
+ * <ul>
+ * <li>Toggle dialogs on the right side of the GUI, that can be turned on, off, attached or detached from the GUI</li>
+ * <li>Changeset dialog based on a standalone implementation, dedicated to OSM changesets management</li>
+ * <li>Extended dialogs for everything else</li>
+ * </ul>
+ */
+package org.openstreetmap.josm.gui.dialogs;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Toggle dialog allowing to display/edit tags and relation memberships of currently selected OSM objects.
+ */
+package org.openstreetmap.josm.gui.dialogs.properties;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Toggle dialog allowing to display currently loaded relations and perform operations on them.
+ */
+package org.openstreetmap.josm.gui.dialogs.relation;
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/validator/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/validator/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/validator/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Toggle dialog allowing to launch data validation and display validation results (errors and warnings).
+ */
+package org.openstreetmap.josm.gui.dialogs.validator;
Index: trunk/src/org/openstreetmap/josm/gui/download/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/download/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI classes for the download dialog.
+ */
+package org.openstreetmap.josm.gui.download;
Index: trunk/src/org/openstreetmap/josm/gui/help/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/help/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Help system based on an embedded web browser fetching contents from JOSM wiki.
+ */
+package org.openstreetmap.josm.gui.help;
Index: trunk/src/org/openstreetmap/josm/gui/history/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/history/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI classes for handling history of OSM objects.
+ */
+package org.openstreetmap.josm.gui.history;
Index: trunk/src/org/openstreetmap/josm/gui/io/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/io/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI classes for handling input/output operations (download, upload, save).
+ */
+package org.openstreetmap.josm.gui.io;
Index: trunk/src/org/openstreetmap/josm/gui/layer/AlignImageryPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AlignImageryPanel.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AlignImageryPanel.java	(revision 8469)
@@ -0,0 +1,79 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.GridBagLayout;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.border.CompoundBorder;
+import javax.swing.border.EmptyBorder;
+import javax.swing.border.EtchedBorder;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.widgets.UrlLabel;
+import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+/**
+ * The panel to nag a user ONCE that he/she has to align imagery.
+ *
+ * @author zverik
+ */
+public class AlignImageryPanel extends JPanel {
+    private static final String PREF = "imagery.offsetnagging";
+
+    public AlignImageryPanel(boolean oneLine) {
+        Font font = getFont().deriveFont(Font.PLAIN, 14.0f);
+        JLabel nagLabel = new JLabel(tr("Aerial imagery might be misaligned. Please check its offset using GPS tracks!"));
+        UrlLabel detailsList = new UrlLabel(tr("http://wiki.openstreetmap.org/wiki/Using_Imagery"), tr("Details..."));
+        nagLabel.setLabelFor(detailsList);
+        nagLabel.setFont(font);
+        detailsList.setFont(font);
+
+        JButton closeButton = new JButton(ImageProvider.get("misc", "black_x"));
+        closeButton.setContentAreaFilled(false);
+        closeButton.setRolloverEnabled(true);
+        closeButton.setBorderPainted(false);
+        closeButton.setToolTipText(tr("Hide this message and never show it again"));
+        closeButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                if (Main.isDisplayingMapView()) {
+                    Main.map.removeTopPanel(AlignImageryPanel.class);
+                    Main.pref.put(PREF, false);
+                }
+            }
+        });
+
+        setLayout(new GridBagLayout());
+        if (!oneLine) { // tune for small screens
+            add(nagLabel, GBC.std(1, 1).fill());
+            add(detailsList, GBC.std(1, 2).fill());
+            add(closeButton, GBC.std(2, 1).span(1,2).anchor(GBC.EAST));
+        } else {
+            add(nagLabel, GBC.std(1,1).fill());
+            add(detailsList, GBC.std(2,1).fill());
+            add(closeButton, GBC.std(3,1).anchor(GBC.EAST));
+        }
+        setBorder(new CompoundBorder(new EtchedBorder(EtchedBorder.LOWERED), new EmptyBorder(12, 12, 12, 12)));
+        setBackground(new Color(224, 236, 249));
+    }
+
+    public static void addNagPanelIfNeeded() {
+        if (Main.isDisplayingMapView() && !Main.pref.getBoolean("expert") && Main.pref.getBoolean(PREF, true)) {
+            if (Main.map.getTopPanel(AlignImageryPanel.class) == null) {
+                double w = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
+                AlignImageryPanel p = new AlignImageryPanel(w > 1300);
+                Main.map.addTopPanel(p);
+            }
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling layers displaying geottaged pictures.
+ */
+package org.openstreetmap.josm.gui.layer.geoimage;
Index: trunk/src/org/openstreetmap/josm/gui/layer/gpx/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/gpx/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/layer/gpx/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling <a href="http://wiki.openstreetmap.org/wiki/GPX">GPX</a> layers.
+ */
+package org.openstreetmap.josm.gui.layer.gpx;
Index: trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/layer/markerlayer/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling marker layers. Markers are GPS points with a name and, optionally, a symbol code attached.
+ */
+package org.openstreetmap.josm.gui.layer.markerlayer;
Index: trunk/src/org/openstreetmap/josm/gui/layer/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/layer/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling the different kinds of map layers.
+ */
+package org.openstreetmap.josm.gui.layer;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/package-info.java	(revision 8469)
@@ -0,0 +1,8 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Drawing system based on <a href="https://wiki.openstreetmap.org/wiki/MapCSS/0.2">MapCSS</a> map styles.
+ * This is the default system, and the only one maintained.
+ * For reference, see <a href="https://josm.openstreetmap.de/wiki/Help/Styles/MapCSSImplementation">JOSM wiki</a>
+ */
+package org.openstreetmap.josm.gui.mappaint.mapcss;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/package-info.java	(revision 8469)
@@ -0,0 +1,11 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Drawing system allowing to display and render OSM map data in a user-friendly and customizable way, through map styles.<br>
+ * Two implementations are provided:
+ * <ul>
+ * <li>XML: this was the system used by default JOSM map style for a long time. Kept for compatibility but not maintained anymore</li>
+ * <li>MapCSS: new default system, more powerful than XML, and easier to use to write map styles. Only system maintained</li>
+ * </ul>
+ */
+package org.openstreetmap.josm.gui.mappaint;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/xml/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/xml/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/xml/package-info.java	(revision 8469)
@@ -0,0 +1,7 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Drawing system based on XML map styles. This is a legacy system, not maintained anymore.
+ * For reference, see <a href="https://josm.openstreetmap.de/wiki/Styles/LegacyStandard">JOSM wiki</a>
+ */
+package org.openstreetmap.josm.gui.mappaint.xml;
Index: trunk/src/org/openstreetmap/josm/gui/oauth/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/oauth/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/oauth/package-info.java	(revision 8469)
@@ -0,0 +1,7 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI classes for handling OAuth authentication to OSM API.
+ * Backend is <a href="https://github.com/mttkay/signpost">OAuth Signpost</a>.
+ */
+package org.openstreetmap.josm.gui.oauth;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 8468)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 8469)
@@ -41,5 +41,5 @@
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.Preferences.Setting;
-import org.openstreetmap.josm.gui.actionsupport.LogShowDialog;
+import org.openstreetmap.josm.gui.dialogs.LogShowDialog;
 import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
Index: trunk/src/org/openstreetmap/josm/gui/progress/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/progress/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/progress/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI classes for displaying long tasks background advancement in a progress bar, and a way to cancel them.
+ */
+package org.openstreetmap.josm.gui.progress;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling autocompletion of tags.
+ */
+package org.openstreetmap.josm.gui.tagging.ac;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/package-info.java	(revision 8469)
@@ -0,0 +1,7 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides classes for handling edition of OSM tags: tagging presets, tag tables, tag editors.
+ * Autocompletion of tags is dealt with a subpackage.
+ */
+package org.openstreetmap.josm.gui.tagging;
Index: trunk/src/org/openstreetmap/josm/gui/util/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/util/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI utility classes.
+ */
+package org.openstreetmap.josm.gui.util;
Index: trunk/src/org/openstreetmap/josm/gui/widgets/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/package-info.java	(revision 8469)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/package-info.java	(revision 8469)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides GUI widgets customized for JOSM needs.
+ */
+package org.openstreetmap.josm.gui.widgets;
