Index: /trunk/src/org/openstreetmap/josm/data/ImageData.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/ImageData.java	(revision 15347)
+++ /trunk/src/org/openstreetmap/josm/data/ImageData.java	(revision 15348)
@@ -263,4 +263,19 @@
 
     /**
+     * Remove the current selected image from the list
+     * @since 15348
+     */
+    public void removeSelectedImages() {
+        List<ImageEntry> selected = getSelectedImages();
+        if (selected.isEmpty()) {
+            return;
+        }
+        for (ImageEntry img: getSelectedImages()) {
+            data.remove(img);
+        }
+        setSelectedImageIndex(-1, true);
+    }
+
+    /**
      * Determines if the image is selected
      * @param image the {@link ImageEntry} image
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 15347)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 15348)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.BorderLayout;
@@ -289,6 +290,6 @@
     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),
+            super(null, new ImageProvider("dialogs", "delete"), tr("Remove photo(s) from layer"), Shortcut.registerShortcut(
+                    "geoimage:deleteimagefromlayer", tr("Geoimage: {0}", tr("Remove photo(s) from layer")), KeyEvent.VK_DELETE, Shortcut.SHIFT),
                   false, null, false);
         }
@@ -297,5 +298,5 @@
         public void actionPerformed(ActionEvent e) {
             if (currentData != null) {
-                currentData.removeSelectedImage();
+                currentData.removeSelectedImages();
             }
         }
@@ -304,7 +305,7 @@
     private class ImageRemoveFromDiskAction extends JosmAction {
         ImageRemoveFromDiskAction() {
-            super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete image file from disk"),
+            super(null, new ImageProvider("dialogs", "geoimage/deletefromdisk"), tr("Delete photo file(s) from disk"),
                   Shortcut.registerShortcut(
-                    "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete File from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT),
+                    "geoimage:deletefilefromdisk", tr("Geoimage: {0}", tr("Delete file(s) from disk")), KeyEvent.VK_DELETE, Shortcut.CTRL_SHIFT),
                   false, null, false);
         }
@@ -313,5 +314,6 @@
         public void actionPerformed(ActionEvent e) {
             if (currentData != null && currentData.getSelectedImage() != null) {
-                ImageEntry toDelete = currentData.getSelectedImage();
+                List<ImageEntry> toDelete = currentData.getSelectedImages();
+                int size = toDelete.size();
 
                 int result = new ExtendedDialog(
@@ -320,6 +322,9 @@
                         tr("Cancel"), tr("Delete"))
                         .setButtonIcons("cancel", "dialogs/delete")
-                        .setContent(new JLabel("<html><h3>" + tr("Delete the file {0} from disk?", toDelete.getFile().getName())
-                                + "<p>" + tr("The image file will be permanently lost!") + "</h3></html>",
+                        .setContent(new JLabel("<html><h3>"
+                                + trn("Delete the file from disk?",
+                                      "Delete the {0} files from disk?", size, size)
+                                + "<p>" + trn("The image file will be permanently lost!",
+                                              "The images files will be permanently lost!", size) + "</h3></html>",
                                 ImageProvider.get("dialogs/geoimage/deletefromdisk"), SwingConstants.LEFT))
                         .toggleEnable("geoimage.deleteimagefromdisk")
@@ -330,15 +335,16 @@
 
                 if (result == 2) {
-                    currentData.removeSelectedImage();
-
-                    if (Utils.deleteFile(toDelete.getFile())) {
-                        Logging.info("File " + toDelete.getFile() + " deleted.");
-                    } else {
-                        JOptionPane.showMessageDialog(
-                                MainApplication.getMainFrame(),
-                                tr("Image file could not be deleted."),
-                                tr("Error"),
-                                JOptionPane.ERROR_MESSAGE
-                                );
+                    currentData.removeSelectedImages();
+                    for (ImageEntry delete : toDelete) {
+                        if (Utils.deleteFile(delete.getFile())) {
+                            Logging.info("File " + delete.getFile() + " deleted.");
+                        } else {
+                            JOptionPane.showMessageDialog(
+                                    MainApplication.getMainFrame(),
+                                    tr("Image file could not be deleted."),
+                                    tr("Error"),
+                                    JOptionPane.ERROR_MESSAGE
+                                    );
+                        }
                     }
                 }
@@ -497,4 +503,5 @@
             imgDisplay.setOsdText(osd.toString());
         } else {
+            boolean hasMultipleImages = entries != null && entries.size() > 1;
             // if this method is called to reinitialize dialog content with a blank image,
             // do not actually show the dialog again with a blank image if currently hidden (fix #10672)
@@ -504,8 +511,8 @@
             setNextEnabled(false);
             setPreviousEnabled(false);
-            btnDelete.setEnabled(false);
-            btnDeleteFromDisk.setEnabled(false);
+            btnDelete.setEnabled(hasMultipleImages);
+            btnDeleteFromDisk.setEnabled(hasMultipleImages);
             btnCopyPath.setEnabled(false);
-            if (entries != null && entries.size() > 1) {
+            if (hasMultipleImages) {
                 imgDisplay.setEmptyText(tr("Multiple images selected"));
                 btnFirst.setEnabled(!isFirstImageSelected(data));
Index: /trunk/test/unit/org/openstreetmap/josm/data/ImageDataTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/ImageDataTest.java	(revision 15347)
+++ /trunk/test/unit/org/openstreetmap/josm/data/ImageDataTest.java	(revision 15348)
@@ -183,5 +183,18 @@
 
     @Test
-    public void testRemoveSelectedWithImageTriggerListener() {
+    public void testRemoveSelectedImages() {
+        List<ImageEntry> list = getOneImage();
+        list.add(new ImageEntry());
+
+        ImageData data = new ImageData(list);
+        data.selectFirstImage();
+        data.addImageToSelection(list.get(1));
+        data.removeSelectedImages();
+        assertEquals(0, data.getImages().size());
+        assertEquals(0, data.getSelectedImages().size());
+    }
+
+    @Test
+    public void testRemoveSelectedImageTriggerListener() {
         List<ImageEntry> list = getOneImage();
         list.add(new ImageEntry());
@@ -200,4 +213,24 @@
         data.selectFirstImage();
         data.removeSelectedImage();
+    }
+
+    @Test
+    public void testRemoveSelectedImagesTriggerListener() {
+        List<ImageEntry> list = getOneImage();
+        list.add(new ImageEntry());
+        ImageData data = new ImageData(list);
+        ImageDataUpdateListener listener = new ImageDataUpdateListener() {
+            @Override
+            public void selectedImageChanged(ImageData data) {}
+
+            @Override
+            public void imageDataUpdated(ImageData data) {}
+        };
+        new Expectations(listener) {{
+            listener.selectedImageChanged(data); times = 2;
+        }};
+        data.addImageDataUpdateListener(listener);
+        data.selectFirstImage();
+        data.removeSelectedImages();
     }
 
