Index: src/org/openstreetmap/josm/data/ImageData.java
===================================================================
--- src/org/openstreetmap/josm/data/ImageData.java	(revision 15341)
+++ src/org/openstreetmap/josm/data/ImageData.java	(working copy)
@@ -262,6 +262,20 @@
     }
 
     /**
+     * Remove the current selected image from the list
+     */
+    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
      * @return {@code true} is the image is selected, {@code false} otherwise
Index: src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(revision 15341)
+++ src/org/openstreetmap/josm/gui/layer/geoimage/ImageViewerDialog.java	(working copy)
@@ -2,6 +2,7 @@
 package org.openstreetmap.josm.gui.layer.geoimage;
 
 import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.BorderLayout;
 import java.awt.Component;
@@ -288,8 +289,8 @@
 
     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);
         }
 
@@ -296,7 +297,7 @@
         @Override
         public void actionPerformed(ActionEvent e) {
             if (currentData != null) {
-                currentData.removeSelectedImage();
+                currentData.removeSelectedImages();
             }
         }
     }
@@ -303,9 +304,9 @@
 
     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);
         }
 
@@ -312,7 +313,7 @@
         @Override
         public void actionPerformed(ActionEvent e) {
             if (currentData != null && currentData.getSelectedImage() != null) {
-                ImageEntry toDelete = currentData.getSelectedImage();
+                List<ImageEntry> toDelete = currentData.getSelectedImages();
 
                 int result = new ExtendedDialog(
                         MainApplication.getMainFrame(),
@@ -319,8 +320,11 @@
                         tr("Delete image file from disk"),
                         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?", toDelete.size(), toDelete.size())
+                                + "<p>" + trn("The image file will be permanently lost!",
+                                              "The images files will be permanently lost!", toDelete.size()) + "</h3></html>",
                                 ImageProvider.get("dialogs/geoimage/deletefromdisk"), SwingConstants.LEFT))
                         .toggleEnable("geoimage.deleteimagefromdisk")
                         .setCancelButton(1)
@@ -329,17 +333,18 @@
                         .getValue();
 
                 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
+                                    );
+                        }
                     }
                 }
             }
@@ -496,6 +501,7 @@
 
             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)
             setTitle(tr("Geotagged Images"));
@@ -503,10 +509,10 @@
             imgDisplay.setOsdText("");
             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));
                 btnLast.setEnabled(!isLastImageSelected(data));
Index: test/unit/org/openstreetmap/josm/data/ImageDataTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/ImageDataTest.java	(revision 15341)
+++ test/unit/org/openstreetmap/josm/data/ImageDataTest.java	(working copy)
@@ -182,10 +182,23 @@
     }
 
     @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());
+        ImageData data = new ImageData(list);
         ImageDataUpdateListener listener = new ImageDataUpdateListener() {
             @Override
             public void selectedImageChanged(ImageData data) {}
@@ -202,6 +215,26 @@
     }
 
     @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();
+    }
+
+    @Test
     public void testRemoveImageAndTriggerListener() {
         List<ImageEntry> list = getOneImage();
         ImageData data = new ImageData(list);
