Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18704)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 18705)
@@ -176,4 +176,12 @@
             registerOnLayer(l);
         }
+        // This listener gets called _prior to_ the reorder event. If we do not delay the execution of the
+        // model update, then the image will change instead of remaining the same.
+        this.layers.getModel().addChangeListener(l -> MainApplication.worker.execute(() -> GuiHelper.runInEDT(() -> {
+            Component selected = this.layers.getSelectedComponent();
+            if (selected instanceof MoveImgDisplayPanel) {
+                ((MoveImgDisplayPanel<?>) selected).fireModelUpdate();
+            }
+        })));
     }
 
@@ -298,6 +306,4 @@
     private void addButtonsForImageLayers() {
         List<MoveImgDisplayPanel<?>> alreadyAdded = this.getImageTabs().collect(Collectors.toList());
-        // Avoid the setVisible call recursively calling this method and adding duplicates
-        alreadyAdded.forEach(m -> m.finishedAddingButtons = false);
         List<Layer> availableLayers = MainApplication.getLayerManager().getLayers();
         List<IGeoImageLayer> geoImageLayers = availableLayers.stream()
@@ -323,7 +329,5 @@
                         int index = layers.indexOfTabComponent(source);
                         if (index >= 0) {
-                            getImageTabs().forEach(m -> m.finishedAddingButtons = false);
                             removeImageTab(((MoveImgDisplayPanel<?>) layers.getComponentAt(index)).layer);
-                            getImageTabs().forEach(m -> m.finishedAddingButtons = true);
                             getImageTabs().forEach(m -> m.setVisible(m.isVisible()));
                             return;
@@ -343,6 +347,4 @@
                 .collect(Collectors.toList()).forEach(this::removeImageTab);
 
-        // This is need to avoid the first button becoming visible, and then recalling this method.
-        this.getImageTabs().forEach(m -> m.finishedAddingButtons = true);
         // After that, trigger the visibility set code
         this.getImageTabs().forEach(m -> m.setVisible(m.isVisible()));
@@ -765,9 +767,4 @@
         private final ImageDisplay imgDisplay;
 
-        /**
-         * The purpose of this field is to avoid having the same tab added to the dialog multiple times. This is only a problem when the dialog
-         * has multiple tabs on initialization (like from a session).
-         */
-        boolean finishedAddingButtons;
         MoveImgDisplayPanel(ImageDisplay imgDisplay, T layer) {
             super(new BorderLayout());
@@ -776,10 +773,11 @@
         }
 
-        @Override
-        public void setVisible(boolean visible) {
-            super.setVisible(visible);
+        /**
+         * Call when the selection model updates
+         */
+        void fireModelUpdate() {
             JTabbedPane layers = ImageViewerDialog.getInstance().layers;
             int index = layers.indexOfComponent(this);
-            if (visible && this.finishedAddingButtons) {
+            if (this == layers.getSelectedComponent()) {
                 if (!this.layer.getSelection().isEmpty() && !this.layer.getSelection().contains(ImageViewerDialog.getCurrentImage())) {
                     ImageViewerDialog.getInstance().displayImages(this.layer.getSelection());
