Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 16393)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialogManager.java	(revision 16394)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.Component;
@@ -9,8 +10,8 @@
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Objects;
@@ -29,4 +30,5 @@
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
+import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
 import org.openstreetmap.josm.tools.Logging;
@@ -59,5 +61,5 @@
     private static HistoryBrowserDialogManager instance;
 
-    private final Map<Long, HistoryBrowserDialog> dialogs = new HashMap<>();
+    private final LinkedHashMap<Long, HistoryBrowserDialog> dialogs = new LinkedHashMap<>();
 
     private final Predicate<PrimitiveId> unloadedHistoryPredicate = new UnloadedHistoryPredicate();
@@ -144,4 +146,9 @@
         dialog.setVisible(false);
         dialog.dispose();
+
+        if (!dialogs.isEmpty()) {
+            // see #17270: set focus to last dialog
+            new LinkedList<>(dialogs.values()).getLast().toFront();
+        }
     }
 
@@ -225,4 +232,15 @@
      */
     public void showHistory(Component parent, final Collection<? extends PrimitiveId> primitives) {
+        if (primitives.size() > Config.getPref().getInt("warn.open.maxhistory", 5) &&
+                /* I18N english text for value 1 makes no real sense, never called for values <= maxhistory (usually 5) */
+                JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(MainApplication.getMainFrame(),
+                        "<html>" + trn(
+                                "You are about to open <b>{0}</b> history dialog.<br/>Do you want to continue?",
+                                "You are about to open <b>{0}</b> different history dialogs simultaneously.<br/>Do you want to continue?",
+                                primitives.size(), primitives.size()) + "</html>",
+                        tr("Confirmation"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE)) {
+            return;
+        }
+
         final List<PrimitiveId> realPrimitives = new ArrayList<>(primitives);
         hooks.forEach(h -> h.modifyRequestedIds(realPrimitives));
