Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 13264)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 13265)
@@ -348,4 +348,5 @@
             }
         }
+        toolBarActions.removeAll();
         for (int i = 0; i < toolBarToggle.getComponentCount(); ++i) {
             if (toolBarToggle.getComponent(i) instanceof Destroyable) {
@@ -353,8 +354,13 @@
             }
         }
+        toolBarToggle.removeAll();
 
         statusLine.destroy();
         mapView.destroy();
         keyDetector.unregister();
+
+        allDialogs.clear();
+        allDialogButtons.clear();
+        allMapModeButtons.clear();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(revision 13264)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/DialogsPanel.java	(revision 13265)
@@ -330,4 +330,7 @@
             }
         }
+        mSpltPane.removeAll();
+        allDialogs.clear();
+        panels.clear();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 13264)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 13265)
@@ -50,6 +50,4 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
-import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
-import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.ParametrizedEnumProperty;
@@ -70,4 +68,6 @@
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
+import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
@@ -288,5 +288,5 @@
 
         private ToggleDialogAction(String name, String iconName, String tooltip, Shortcut shortcut) {
-            super(name, iconName, tooltip, shortcut, false);
+            super(name, iconName, tooltip, shortcut, false, false);
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 13264)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 13265)
@@ -63,8 +63,5 @@
 import org.openstreetmap.josm.gui.layer.JumpToMarkerActions.JumpToPreviousMarker;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
-import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
+import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -102,4 +99,5 @@
     private MouseMotionAdapter mouseMotionAdapter;
     private MapModeChangeListener mapModeListener;
+    private ActiveLayerChangeListener activeLayerChangeListener;
 
     /** Mouse position where the last image was selected. */
@@ -992,40 +990,11 @@
         mapModeListener.mapModeChange(null, MainApplication.getMap().mapMode);
 
-        MainApplication.getLayerManager().addActiveLayerChangeListener(e -> {
+        activeLayerChangeListener = e -> {
             if (MainApplication.getLayerManager().getActiveLayer() == this) {
                 // only in select mode it is possible to click the images
                 MainApplication.getMap().selectSelectTool(false);
             }
-        });
-
-        MainApplication.getLayerManager().addLayerChangeListener(new LayerChangeListener() {
-            @Override
-            public void layerAdded(LayerAddEvent e) {
-                // Do nothing
-            }
-
-            @Override
-            public void layerRemoving(LayerRemoveEvent e) {
-                if (e.getRemovedLayer() == GeoImageLayer.this) {
-                    stopLoadThumbs();
-                    MapView mapView = MainApplication.getMap().mapView;
-                    mapView.removeMouseListener(mouseAdapter);
-                    mapView.removeMouseMotionListener(mouseMotionAdapter);
-                    MapFrame.removeMapModeChangeListener(mapModeListener);
-                    currentPhoto = -1;
-                    if (data != null) {
-                        data.clear();
-                    }
-                    data = null;
-                    // stop listening to layer change events
-                    MainApplication.getLayerManager().removeLayerChangeListener(this);
-                }
-            }
-
-            @Override
-            public void layerOrderChanged(LayerOrderChangeEvent e) {
-                // Do nothing
-            }
-        });
+        };
+        MainApplication.getLayerManager().addActiveLayerChangeListener(activeLayerChangeListener);
 
         MapFrame map = MainApplication.getMap();
@@ -1036,7 +1005,28 @@
 
     @Override
+    public synchronized void destroy() {
+        super.destroy();
+        stopLoadThumbs();
+        MapView mapView = MainApplication.getMap().mapView;
+        mapView.removeMouseListener(mouseAdapter);
+        mapView.removeMouseMotionListener(mouseMotionAdapter);
+        MapFrame.removeMapModeChangeListener(mapModeListener);
+        MainApplication.getLayerManager().removeActiveLayerChangeListener(activeLayerChangeListener);
+        currentPhoto = -1;
+        if (data != null) {
+            data.clear();
+        }
+        data = null;
+    }
+
+    @Override
     public LayerPainter attachToMapView(MapViewEvent event) {
         MapView.addZoomChangeListener(this);
-        return super.attachToMapView(event);
+        return new CompatibilityModeLayerPainter() {
+            @Override
+            public void detachFromMapView(MapViewEvent event) {
+                MapView.removeZoomChangeListener(GeoImageLayer.this);
+            }
+        };
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 13264)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplay.java	(revision 13265)
@@ -34,4 +34,5 @@
 import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.ExifReader;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -43,5 +44,5 @@
  * Offers basic mouse interaction (zoom, drag) and on-screen text.
  */
-public class ImageDisplay extends JComponent implements PreferenceChangedListener {
+public class ImageDisplay extends JComponent implements Destroyable, PreferenceChangedListener {
 
     /** The file that is currently displayed */
@@ -63,4 +64,6 @@
     /** The tracker to load the images */
     private final MediaTracker tracker = new MediaTracker(this);
+
+    private final ImgDisplayMouseListener mouseListener = new ImgDisplayMouseListener();
 
     private String osdText;
@@ -663,5 +666,4 @@
      */
     public ImageDisplay() {
-        ImgDisplayMouseListener mouseListener = new ImgDisplayMouseListener();
         addMouseListener(mouseListener);
         addMouseWheelListener(mouseListener);
@@ -669,4 +671,12 @@
         Config.getPref().addPreferenceChangeListener(this);
         preferenceChanged(null);
+    }
+
+    @Override
+    public void destroy() {
+        removeMouseListener(mouseListener);
+        removeMouseWheelListener(mouseListener);
+        removeMouseMotionListener(mouseListener);
+        Config.getPref().removePreferenceChangeListener(this);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 13264)
+++ trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 13265)
@@ -15,11 +15,10 @@
 import java.text.SimpleDateFormat;
 
-import javax.swing.AbstractAction;
 import javax.swing.Box;
 import javax.swing.JButton;
-import javax.swing.JComponent;
 import javax.swing.JPanel;
 import javax.swing.JToggleButton;
 
+import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.DialogsPanel.Action;
@@ -41,14 +40,14 @@
 public final class ImageViewerDialog extends ToggleDialog implements LayerChangeListener, ActiveLayerChangeListener {
 
-    private static final String COMMAND_ZOOM = "zoom";
-    private static final String COMMAND_CENTERVIEW = "centre";
-    private static final String COMMAND_NEXT = "next";
-    private static final String COMMAND_REMOVE = "remove";
-    private static final String COMMAND_REMOVE_FROM_DISK = "removefromdisk";
-    private static final String COMMAND_PREVIOUS = "previous";
-    private static final String COMMAND_COLLAPSE = "collapse";
-    private static final String COMMAND_FIRST = "first";
-    private static final String COMMAND_LAST = "last";
-    private static final String COMMAND_COPY_PATH = "copypath";
+    private final ImageZoomAction imageZoomAction = new ImageZoomAction();
+    private final ImageCenterViewAction imageCenterViewAction = new ImageCenterViewAction();
+    private final ImageNextAction imageNextAction = new ImageNextAction();
+    private final ImageRemoveAction imageRemoveAction = new ImageRemoveAction();
+    private final ImageRemoveFromDiskAction imageRemoveFromDiskAction = new ImageRemoveFromDiskAction();
+    private final ImagePreviousAction imagePreviousAction = new ImagePreviousAction();
+    private final ImageCollapseAction imageCollapseAction = new ImageCollapseAction();
+    private final ImageFirstAction imageFirstAction = new ImageFirstAction();
+    private final ImageLastAction imageLastAction = new ImageLastAction();
+    private final ImageCopyPathAction imageCopyPathAction = new ImageCopyPathAction();
 
     private final ImageDisplay imgDisplay = new ImageDisplay();
@@ -90,78 +89,28 @@
         Dimension buttonDim = new Dimension(26, 26);
 
-        ImageAction prevAction = new ImageAction(COMMAND_PREVIOUS, new ImageProvider("dialogs", "previous"), tr("Previous"));
-        btnPrevious = new JButton(prevAction);
+        btnPrevious = new JButton(imagePreviousAction);
         btnPrevious.setPreferredSize(buttonDim);
-        Shortcut scPrev = Shortcut.registerShortcut(
-                "geoimage:previous", tr("Geoimage: {0}", tr("Show previous Image")), KeyEvent.VK_PAGE_UP, Shortcut.DIRECT);
-        final String previousImage = "Previous Image";
-        MainApplication.registerActionShortcut(prevAction, scPrev);
-        btnPrevious.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scPrev.getKeyStroke(), previousImage);
-        btnPrevious.getActionMap().put(previousImage, prevAction);
         btnPrevious.setEnabled(false);
 
-        final String removePhoto = tr("Remove photo from layer");
-        ImageAction delAction = new ImageAction(COMMAND_REMOVE, new ImageProvider("dialogs", "delete"), removePhoto);
-        JButton btnDelete = new JButton(delAction);
+        JButton btnDelete = new JButton(imageRemoveAction);
         btnDelete.setPreferredSize(buttonDim);
-        Shortcut scDelete = Shortcut.registerShortcut(
-                "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo from layer")), KeyEvent.VK_DELETE, Shortcut.SHIFT);
-        MainApplication.registerActionShortcut(delAction, scDelete);
-        btnDelete.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scDelete.getKeyStroke(), removePhoto);
-        btnDelete.getActionMap().put(removePhoto, delAction);
-
-        ImageAction delFromDiskAction = new ImageAction(COMMAND_REMOVE_FROM_DISK,
-                new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete image file from disk"));
-        JButton btnDeleteFromDisk = new JButton(delFromDiskAction);
+
+        JButton btnDeleteFromDisk = new JButton(imageRemoveFromDiskAction);
         btnDeleteFromDisk.setPreferredSize(buttonDim);
-        Shortcut scDeleteFromDisk = Shortcut.registerShortcut(
-                "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete File from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT);
-        final String deleteImage = "Delete image file from disk";
-        MainApplication.registerActionShortcut(delFromDiskAction, scDeleteFromDisk);
-        btnDeleteFromDisk.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scDeleteFromDisk.getKeyStroke(), deleteImage);
-        btnDeleteFromDisk.getActionMap().put(deleteImage, delFromDiskAction);
-
-        ImageAction copyPathAction = new ImageAction(COMMAND_COPY_PATH, new ImageProvider("copy"), tr("Copy image path"));
-        JButton btnCopyPath = new JButton(copyPathAction);
+
+        JButton btnCopyPath = new JButton(imageCopyPathAction);
         btnCopyPath.setPreferredSize(buttonDim);
-        Shortcut scCopyPath = Shortcut.registerShortcut(
-                "geoimage:copypath", tr("Geoimage: {0}", tr("Copy image path")), KeyEvent.VK_C, Shortcut.ALT_CTRL_SHIFT);
-        final String copyImage = "Copy image path";
-        MainApplication.registerActionShortcut(copyPathAction, scCopyPath);
-        btnCopyPath.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scCopyPath.getKeyStroke(), copyImage);
-        btnCopyPath.getActionMap().put(copyImage, copyPathAction);
-
-        ImageAction nextAction = new ImageAction(COMMAND_NEXT, new ImageProvider("dialogs", "next"), tr("Next"));
-        btnNext = new JButton(nextAction);
+
+        btnNext = new JButton(imageNextAction);
         btnNext.setPreferredSize(buttonDim);
-        Shortcut scNext = Shortcut.registerShortcut(
-                "geoimage:next", tr("Geoimage: {0}", tr("Show next Image")), KeyEvent.VK_PAGE_DOWN, Shortcut.DIRECT);
-        final String nextImage = "Next Image";
-        MainApplication.registerActionShortcut(nextAction, scNext);
-        btnNext.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(scNext.getKeyStroke(), nextImage);
-        btnNext.getActionMap().put(nextImage, nextAction);
         btnNext.setEnabled(false);
 
-        MainApplication.registerActionShortcut(
-                new ImageAction(COMMAND_FIRST, null, null),
-                Shortcut.registerShortcut(
-                        "geoimage:first", tr("Geoimage: {0}", tr("Show first Image")), KeyEvent.VK_HOME, Shortcut.DIRECT)
-        );
-        MainApplication.registerActionShortcut(
-                new ImageAction(COMMAND_LAST, null, null),
-                Shortcut.registerShortcut(
-                        "geoimage:last", tr("Geoimage: {0}", tr("Show last Image")), KeyEvent.VK_END, Shortcut.DIRECT)
-        );
-
-        tbCentre = new JToggleButton(new ImageAction(COMMAND_CENTERVIEW,
-                new ImageProvider("dialogs", "centreview"), tr("Center view")));
+        tbCentre = new JToggleButton(imageCenterViewAction);
         tbCentre.setPreferredSize(buttonDim);
 
-        JButton btnZoomBestFit = new JButton(new ImageAction(COMMAND_ZOOM,
-                new ImageProvider("dialogs", "zoom-best-fit"), tr("Zoom best fit and 1:1")));
+        JButton btnZoomBestFit = new JButton(imageZoomAction);
         btnZoomBestFit.setPreferredSize(buttonDim);
 
-        btnCollapse = new JButton(new ImageAction(COMMAND_COLLAPSE,
-                new ImageProvider("dialogs", "collapse"), tr("Move dialog to the side pane")));
+        btnCollapse = new JButton(imageCollapseAction);
         btnCollapse.setPreferredSize(new Dimension(20, 20));
         btnCollapse.setAlignmentY(Component.TOP_ALIGNMENT);
@@ -202,56 +151,163 @@
         MainApplication.getLayerManager().removeActiveLayerChangeListener(this);
         MainApplication.getLayerManager().removeLayerChangeListener(this);
+        // Manually destroy actions until JButtons are replaced by standard SideButtons
+        imageFirstAction.destroy();
+        imageLastAction.destroy();
+        imagePreviousAction.destroy();
+        imageNextAction.destroy();
+        imageCenterViewAction.destroy();
+        imageCollapseAction.destroy();
+        imageCopyPathAction.destroy();
+        imageRemoveAction.destroy();
+        imageRemoveFromDiskAction.destroy();
+        imageZoomAction.destroy();
         super.destroy();
-    }
-
-    class ImageAction extends AbstractAction {
-        private final String action;
-
-        ImageAction(String action, ImageProvider provider, String toolTipText) {
-            this.action = action;
-            putValue(SHORT_DESCRIPTION, toolTipText);
-            if (provider != null) {
-                provider.getResource().attachImageIcon(this, true);
-            }
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            if (COMMAND_NEXT.equals(action)) {
-                if (currentLayer != null) {
-                    currentLayer.showNextPhoto();
-                }
-            } else if (COMMAND_PREVIOUS.equals(action)) {
-                if (currentLayer != null) {
-                    currentLayer.showPreviousPhoto();
-                }
-            } else if (COMMAND_FIRST.equals(action) && currentLayer != null) {
+        dialog = null;
+    }
+
+    private class ImageNextAction extends JosmAction {
+        ImageNextAction() {
+            super(null, new ImageProvider("dialogs", "next"), tr("Next"), Shortcut.registerShortcut(
+                    "geoimage:next", tr("Geoimage: {0}", tr("Show next Image")), KeyEvent.VK_PAGE_DOWN, Shortcut.DIRECT),
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentLayer != null) {
+                currentLayer.showNextPhoto();
+            }
+        }
+    }
+
+    private class ImagePreviousAction extends JosmAction {
+        ImagePreviousAction() {
+            super(null, new ImageProvider("dialogs", "previous"), tr("Previous"), Shortcut.registerShortcut(
+                    "geoimage:previous", tr("Geoimage: {0}", tr("Show previous Image")), KeyEvent.VK_PAGE_UP, Shortcut.DIRECT),
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentLayer != null) {
+                currentLayer.showPreviousPhoto();
+            }
+        }
+    }
+
+    private class ImageFirstAction extends JosmAction {
+        ImageFirstAction() {
+            super(null, (ImageProvider) null, null, Shortcut.registerShortcut(
+                    "geoimage:first", tr("Geoimage: {0}", tr("Show first Image")), KeyEvent.VK_HOME, Shortcut.DIRECT),
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentLayer != null) {
                 currentLayer.showFirstPhoto();
-            } else if (COMMAND_LAST.equals(action) && currentLayer != null) {
+            }
+        }
+    }
+
+    private class ImageLastAction extends JosmAction {
+        ImageLastAction() {
+            super(null, (ImageProvider) null, null, Shortcut.registerShortcut(
+                    "geoimage:last", tr("Geoimage: {0}", tr("Show last Image")), KeyEvent.VK_END, Shortcut.DIRECT),
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentLayer != null) {
                 currentLayer.showLastPhoto();
-            } else if (COMMAND_CENTERVIEW.equals(action)) {
-                final JToggleButton button = (JToggleButton) e.getSource();
-                centerView = button.isEnabled() && button.isSelected();
-                if (centerView && currentEntry != null && currentEntry.getPos() != null) {
-                    MainApplication.getMap().mapView.zoomTo(currentEntry.getPos());
-                }
-            } else if (COMMAND_ZOOM.equals(action)) {
-                imgDisplay.zoomBestFitOrOne();
-            } else if (COMMAND_REMOVE.equals(action)) {
-                if (currentLayer != null) {
-                    currentLayer.removeCurrentPhoto();
-                }
-            } else if (COMMAND_REMOVE_FROM_DISK.equals(action)) {
-                if (currentLayer != null) {
-                    currentLayer.removeCurrentPhotoFromDisk();
-                }
-            } else if (COMMAND_COPY_PATH.equals(action)) {
-                if (currentLayer != null) {
-                    currentLayer.copyCurrentPhotoPath();
-                }
-            } else if (COMMAND_COLLAPSE.equals(action)) {
-                collapseButtonClicked = true;
-                detachedDialog.getToolkit().getSystemEventQueue().postEvent(new WindowEvent(detachedDialog, WindowEvent.WINDOW_CLOSING));
-            }
+            }
+        }
+    }
+
+    private class ImageCenterViewAction extends JosmAction {
+        ImageCenterViewAction() {
+            super(null, new ImageProvider("dialogs", "centreview"), tr("Center view"), null,
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            final JToggleButton button = (JToggleButton) e.getSource();
+            centerView = button.isEnabled() && button.isSelected();
+            if (centerView && currentEntry != null && currentEntry.getPos() != null) {
+                MainApplication.getMap().mapView.zoomTo(currentEntry.getPos());
+            }
+        }
+    }
+
+    private class ImageZoomAction extends JosmAction {
+        ImageZoomAction() {
+            super(null, new ImageProvider("dialogs", "zoom-best-fit"), tr("Zoom best fit and 1:1"), null,
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            imgDisplay.zoomBestFitOrOne();
+        }
+    }
+
+    private class ImageRemoveAction extends JosmAction {
+        ImageRemoveAction() {
+            super(null, new ImageProvider("dialogs", "delete"), tr("Remove photo from layer"), Shortcut.registerShortcut(
+                    "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo from layer")), KeyEvent.VK_DELETE, Shortcut.SHIFT),
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentLayer != null) {
+                currentLayer.removeCurrentPhoto();
+            }
+        }
+    }
+
+    private class ImageRemoveFromDiskAction extends JosmAction {
+        ImageRemoveFromDiskAction() {
+            super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete image file from disk"),
+                  Shortcut.registerShortcut(
+                    "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete File from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT),
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentLayer != null) {
+                currentLayer.removeCurrentPhotoFromDisk();
+            }
+        }
+    }
+
+    private class ImageCopyPathAction extends JosmAction {
+        ImageCopyPathAction() {
+            super(null, new ImageProvider("copy"), tr("Copy image path"), Shortcut.registerShortcut(
+                    "geoimage:copypath", tr("Geoimage: {0}", tr("Copy image path")), KeyEvent.VK_C, Shortcut.ALT_CTRL_SHIFT),
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (currentLayer != null) {
+                currentLayer.copyCurrentPhotoPath();
+            }
+        }
+    }
+
+    private class ImageCollapseAction extends JosmAction {
+        ImageCollapseAction() {
+            super(null, new ImageProvider("dialogs", "collapse"), tr("Move dialog to the side pane"), null,
+                  false, null, false);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            collapseButtonClicked = true;
+            detachedDialog.getToolkit().getSystemEventQueue().postEvent(new WindowEvent(detachedDialog, WindowEvent.WINDOW_CLOSING));
         }
     }
@@ -455,4 +511,3 @@
         }
     }
-
 }
Index: trunk/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java	(revision 13264)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/MultiSplitLayout.java	(revision 13265)
@@ -245,4 +245,6 @@
         if (name != null) {
             childMap.remove(name);
+        } else {
+            childMap.values().removeIf(child::equals);
         }
     }
