Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 10957)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialog.java	(revision 10958)
@@ -36,4 +36,6 @@
 
     private final ApplyResolutionAction applyResolutionAction = new ApplyResolutionAction();
+
+    private boolean isRegistered;
 
     /**
@@ -65,12 +67,21 @@
     }
 
-    private void registerListeners() {
-        resolver.addPropertyChangeListener(applyResolutionAction);
-        resolver.registerListeners();
-    }
-
-    private void unregisterListeners() {
-        resolver.removePropertyChangeListener(applyResolutionAction);
-        resolver.unregisterListeners();
+    private synchronized void registerListeners() {
+        if (!isRegistered) {
+            resolver.addPropertyChangeListener(applyResolutionAction);
+            resolver.registerListeners();
+            isRegistered = true;
+        }
+    }
+
+    private synchronized void unregisterListeners() {
+        // See #13479 - See https://bugs.openjdk.java.net/browse/JDK-4387314
+        // Owner window keep a list of owned windows, and does not remove the references when the child is disposed.
+        // There's no easy way to remove ourselves from this list, so we must keep track of register state
+        if (isRegistered) {
+            resolver.removePropertyChangeListener(applyResolutionAction);
+            resolver.unregisterListeners();
+            isRegistered = false;
+        }
     }
 
