Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 18247)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayer.java	(revision 18248)
@@ -166,5 +166,5 @@
      */
     public GeoImageLayer(final List<ImageEntry> data, GpxData gpxData, final String name, boolean useThumbs) {
-        super(name != null ? name : tr("Geotagged Images"));
+        super(!Utils.isBlank(name) ? name : tr("Geotagged Images"));
         this.data = new ImageData(data);
         this.gpxData = gpxData;
Index: /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java	(revision 18247)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/geoimage/ImagesLoader.java	(revision 18248)
@@ -12,8 +12,12 @@
 import java.util.LinkedHashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
+import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 import javax.swing.JOptionPane;
 
+import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
@@ -34,9 +38,11 @@
 
     private boolean canceled;
-    private GeoImageLayer layer;
+    private final List<GeoImageLayer> layers = new ArrayList<>();
     private final Collection<File> selection;
     private final Set<String> loadedDirectories = new HashSet<>();
     private final Set<String> errorMessages;
     private final GpxLayer gpxLayer;
+
+    private static final BooleanProperty PROP_ONE_LAYER_PER_FOLDER = new BooleanProperty("geoimage.one-layer-per-folder", false);
 
     /**
@@ -73,5 +79,5 @@
 
         // read the image files
-        List<ImageEntry> entries = new ArrayList<>(files.size());
+        Map<String, List<ImageEntry>> entries = new TreeMap<>();
 
         for (File f : files) {
@@ -86,7 +92,12 @@
             ImageEntry e = new ImageEntry(f);
             e.extractExif();
-            entries.add(e);
+            File parentFile = f.getParentFile();
+            entries.computeIfAbsent(parentFile != null ? parentFile.getName() : "", x -> new ArrayList<>()).add(e);
         }
-        layer = new GeoImageLayer(entries, gpxLayer);
+        if (Boolean.TRUE.equals(PROP_ONE_LAYER_PER_FOLDER.get())) {
+            entries.entrySet().stream().map(e -> new GeoImageLayer(e.getValue(), gpxLayer, e.getKey())).forEach(layers::add);
+        } else {
+            layers.add(new GeoImageLayer(entries.values().stream().flatMap(List<ImageEntry>::stream).collect(Collectors.toList()), gpxLayer));
+        }
         files.clear();
     }
@@ -160,5 +171,5 @@
                     );
         }
-        if (layer != null) {
+        for (GeoImageLayer layer : layers) {
             MainApplication.getLayerManager().addLayer(layer);
 
