Index: trunk/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java	(revision 18922)
+++ trunk/src/org/openstreetmap/josm/gui/ConditionalOptionPaneUtil.java	(revision 18923)
@@ -5,5 +5,4 @@
 
 import java.awt.Component;
-import java.awt.Dialog;
 import java.awt.GridBagLayout;
 import java.util.HashMap;
@@ -16,7 +15,6 @@
 import javax.swing.JPanel;
 import javax.swing.JRadioButton;
-import javax.swing.event.AncestorEvent;
-import javax.swing.event.AncestorListener;
-
+
+import org.openstreetmap.josm.gui.util.WindowOnTopListener;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -43,4 +41,6 @@
     /** a set indication that (preference key) is or may be stored for the currently active bulk operation */
     private static final Set<String> immediateActive = new HashSet<>();
+    /** The prefix for config options */
+    private static final String CONFIG_PREFIX = "message.";
 
     /**
@@ -61,5 +61,7 @@
         return Utils.firstNonNull(immediateChoices.get(prefKey),
                 sessionChoices.get(prefKey),
-                !Config.getPref().getBoolean("message." + prefKey, true) ? Config.getPref().getInt("message." + prefKey + ".value", -1) : -1
+                !Config.getPref().getBoolean(CONFIG_PREFIX + prefKey, true)
+                        ? Config.getPref().getInt(CONFIG_PREFIX + prefKey + ".value", -1)
+                        : -1
         );
     }
@@ -228,6 +230,6 @@
                     break;
                 case PERMANENT:
-                    Config.getPref().putBoolean("message." + prefKey, false);
-                    Config.getPref().putInt("message." + prefKey + ".value", value);
+                    Config.getPref().putBoolean(CONFIG_PREFIX + prefKey, false);
+                    Config.getPref().putInt(CONFIG_PREFIX + prefKey + ".value", value);
                     break;
             }
@@ -288,44 +290,21 @@
             add(cbStandard, GBC.eol());
 
-            this.addAncestorListener(new AncestorListener() {
-                boolean wasAlwaysOnTop;
-                @Override
-                public void ancestorAdded(AncestorEvent event) {
-                    if (event.getAncestor() instanceof Dialog) {
-                        Dialog dialog = (Dialog) event.getAncestor();
-                        wasAlwaysOnTop = dialog.isAlwaysOnTop();
-                        if (dialog.isVisible() && dialog.isModal()) {
-                            dialog.setAlwaysOnTop(true);
-                        }
-                    }
-                }
-
-                @Override
-                public void ancestorRemoved(AncestorEvent event) {
-                    if (event.getAncestor() instanceof Dialog) {
-                        Dialog dialog = (Dialog) event.getAncestor();
-                        if (dialog.isVisible() && dialog.isModal()) {
-                            dialog.setAlwaysOnTop(wasAlwaysOnTop);
-                        }
-                    }
-                }
-
-                @Override
-                public void ancestorMoved(AncestorEvent event) {
-                    // Do nothing
-                }
-            });
+            this.addAncestorListener(new WindowOnTopListener());
         }
 
         NotShowAgain getNotShowAgain() {
-            return cbStandard.isSelected()
-                    ? NotShowAgain.NO
-                    : cbShowImmediateDialog.isSelected()
-                    ? NotShowAgain.OPERATION
-                    : cbShowSessionDialog.isSelected()
-                    ? NotShowAgain.SESSION
-                    : cbShowPermanentDialog.isSelected()
-                    ? NotShowAgain.PERMANENT
-                    : null;
+            if (cbStandard.isSelected()) {
+                return NotShowAgain.NO;
+            }
+            if (cbShowImmediateDialog.isSelected()) {
+                return NotShowAgain.OPERATION;
+            }
+            if (cbShowSessionDialog.isSelected()) {
+                return NotShowAgain.SESSION;
+            }
+            if (cbShowPermanentDialog.isSelected()) {
+                return NotShowAgain.PERMANENT;
+            }
+            return null;
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/ExtendedDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ExtendedDialog.java	(revision 18922)
+++ trunk/src/org/openstreetmap/josm/gui/ExtendedDialog.java	(revision 18923)
@@ -31,4 +31,5 @@
 import javax.swing.KeyStroke;
 import javax.swing.UIManager;
+import javax.swing.WindowConstants;
 
 import org.openstreetmap.josm.gui.help.HelpBrowser;
@@ -36,4 +37,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
+import org.openstreetmap.josm.gui.util.WindowOnTopListener;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
 import org.openstreetmap.josm.io.NetworkManager;
@@ -48,17 +50,17 @@
 /**
  * General configurable dialog window.
- *
+ * <p>
  * If dialog is modal, you can use {@link #getValue()} to retrieve the
  * button index. Note that the user can close the dialog
  * by other means. This is usually equivalent to cancel action.
- *
+ * <p>
  * For non-modal dialogs, {@link #buttonAction(int, ActionEvent)} can be overridden.
- *
+ * <p>
  * There are various options, see below.
- *
+ * <p>
  * Note: The button indices are counted from 1 and upwards.
  * So for {@link #getValue()}, {@link #setDefaultButton(int)} and
  * {@link #setCancelButton} the first button has index 1.
- *
+ * <p>
  * Simple example:
  * <pre>
@@ -85,5 +87,5 @@
     private int toggleValue = -1;
     private ConditionalOptionPaneUtil.MessagePanel togglePanel;
-    private final Component parent;
+    private final Component parentComponent;
     private Component content;
     private final String[] bTexts;
@@ -94,5 +96,5 @@
     protected JButton defaultButton;
     private transient Icon icon;
-    private final boolean modal;
+    private final boolean isModal;
     private boolean focusOnDefaultButton;
 
@@ -158,9 +160,9 @@
     public ExtendedDialog(Component parent, String title, String[] buttonTexts, boolean modal, boolean disposeOnClose) {
         super(searchRealParent(parent), title, modal ? ModalityType.DOCUMENT_MODAL : ModalityType.MODELESS);
-        this.parent = parent;
-        this.modal = modal;
+        this.parentComponent = parent;
+        this.isModal = modal;
         bTexts = Utils.copyArray(buttonTexts);
         if (disposeOnClose) {
-            setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
+            setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
         }
         this.disposeOnClose = disposeOnClose;
@@ -372,5 +374,5 @@
 
         setSize(d);
-        setLocationRelativeTo(parent);
+        setLocationRelativeTo(parentComponent);
     }
 
@@ -401,6 +403,6 @@
         Dimension screenSize = GuiHelper.getScreenSize();
         Dimension x = new Dimension(screenSize.width*2/3, screenSize.height*2/3);
-        if (parent != null && parent.isVisible()) {
-            x = GuiHelper.getFrameForComponent(parent).getSize();
+        if (parentComponent != null && parentComponent.isVisible()) {
+            x = GuiHelper.getFrameForComponent(parentComponent).getSize();
         }
         return x;
@@ -462,4 +464,5 @@
         if (visible && isModal()) {
             this.setAlwaysOnTop(true);
+            this.addWindowFocusListener(new WindowOnTopListener());
         }
         super.setVisible(visible);
@@ -479,5 +482,5 @@
     @Override
     public ExtendedDialog toggleEnable(String togglePref) {
-        if (!modal) {
+        if (!isModal) {
             throw new IllegalStateException();
         }
@@ -495,5 +498,5 @@
     @Override
     public ExtendedDialog setCancelButton(Integer... cancelButtonIdx) {
-        this.cancelButtonIdx = new HashSet<>(Arrays.<Integer>asList(cancelButtonIdx));
+        this.cancelButtonIdx = new HashSet<>(Arrays.asList(cancelButtonIdx));
         return this;
     }
Index: trunk/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java	(revision 18922)
+++ trunk/src/org/openstreetmap/josm/gui/HelpAwareOptionPane.java	(revision 18923)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
+import org.openstreetmap.josm.gui.util.WindowOnTopListener;
 import org.openstreetmap.josm.gui.widgets.HtmlPanel;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -353,4 +354,5 @@
         if (dialog.isModal()) {
             dialog.setAlwaysOnTop(true);
+            dialog.addWindowFocusListener(new WindowOnTopListener());
         }
         dialog.setVisible(true);
Index: trunk/src/org/openstreetmap/josm/gui/util/WindowOnTopListener.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/util/WindowOnTopListener.java	(revision 18923)
+++ trunk/src/org/openstreetmap/josm/gui/util/WindowOnTopListener.java	(revision 18923)
@@ -0,0 +1,74 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.util;
+
+import java.awt.Container;
+import java.awt.Dialog;
+import java.awt.Window;
+import java.awt.event.WindowEvent;
+import java.awt.event.WindowFocusListener;
+
+import javax.swing.event.AncestorEvent;
+import javax.swing.event.AncestorListener;
+
+/**
+ * A listener for windows that block other inputs, to ensure they are always on top
+ * @since 18923
+ */
+public class WindowOnTopListener implements AncestorListener, WindowFocusListener {
+
+    /**
+     * {@code true} indicates that the window was always on top prior to the change
+     */
+    private boolean wasAlwaysOnTop;
+    @Override
+    public void windowGainedFocus(WindowEvent e) {
+        final Window window = e.getWindow();
+        if (window != null && window.isAlwaysOnTop() != wasAlwaysOnTop) {
+            window.setAlwaysOnTop(wasAlwaysOnTop);
+        }
+    }
+
+    @Override
+    public void windowLostFocus(WindowEvent e) {
+        final Window window = e.getWindow();
+        if (window != null) {
+            wasAlwaysOnTop = window.isAlwaysOnTop();
+        }
+    }
+
+    @Override
+    public void ancestorAdded(AncestorEvent event) {
+        final Container ancestor = event.getAncestor();
+        if (ancestor instanceof Dialog) {
+            Dialog dialog = (Dialog) ancestor;
+            wasAlwaysOnTop = dialog.isAlwaysOnTop();
+            if (dialog.isVisible() && dialog.isModal()) {
+                dialog.setAlwaysOnTop(true);
+            }
+        }
+        if (ancestor instanceof Window) {
+            Window window = (Window) ancestor;
+            window.addWindowFocusListener(this);
+        }
+    }
+
+    @Override
+    public void ancestorRemoved(AncestorEvent event) {
+        final Container ancestor = event.getAncestor();
+        if (ancestor instanceof Dialog) {
+            Dialog dialog = (Dialog) ancestor;
+            if (dialog.isVisible() && dialog.isModal()) {
+                dialog.setAlwaysOnTop(wasAlwaysOnTop);
+            }
+        }
+        if (ancestor instanceof Window) {
+            Window window = (Window) ancestor;
+            window.removeWindowFocusListener(this);
+        }
+    }
+
+    @Override
+    public void ancestorMoved(AncestorEvent event) {
+        // Do nothing
+    }
+}
