Index: src/org/openstreetmap/josm/io/session/SessionWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/session/SessionWriter.java	(revision 18948)
+++ src/org/openstreetmap/josm/io/session/SessionWriter.java	(working copy)
@@ -275,32 +275,37 @@
         }
         root.appendChild(layersEl);
 
-        for (int index = 0; index < layers.size(); ++index) {
-            Layer layer = layers.get(index);
-            SessionLayerExporter exporter = exporters.get(layer);
-            ExportSupport support = new ExportSupport(doc, index+1);
-            Element el = exporter.export(support);
-            if (el == null) continue;
-            el.setAttribute("index", Integer.toString(index+1));
-            el.setAttribute("name", layer.getName());
-            el.setAttribute("visible", Boolean.toString(layer.isVisible()));
-            if (!Utils.equalsEpsilon(layer.getOpacity(), 1.0)) {
-                el.setAttribute("opacity", Double.toString(layer.getOpacity()));
-            }
-            Set<Layer> deps = dependencies.get(layer);
-            final String depends = deps == null ? "" : deps.stream().map(depLayer -> {
-                int depIndex = layers.indexOf(depLayer);
-                if (depIndex == -1) {
-                    Logging.warn("Unable to find " + depLayer);
-                    return null;
-                } else {
-                    return Integer.toString(depIndex+1);
+        for (int stage = 0; stage < 2; stage++) {
+            for (int index = 0; index < layers.size(); ++index) {
+                Layer layer = layers.get(index);
+                SessionLayerExporter exporter = exporters.get(layer);
+                final boolean isImage = exporter instanceof GeoImageSessionExporter;
+                if (stage == 0 && isImage || stage == 1 && !isImage)
+                    continue;
+                ExportSupport support = new ExportSupport(doc, index+1);
+                Element el = exporter.export(support);
+                if (el == null) continue;
+                el.setAttribute("index", Integer.toString(index+1));
+                el.setAttribute("name", layer.getName());
+                el.setAttribute("visible", Boolean.toString(layer.isVisible()));
+                if (!Utils.equalsEpsilon(layer.getOpacity(), 1.0)) {
+                    el.setAttribute("opacity", Double.toString(layer.getOpacity()));
                 }
-            }).filter(Objects::nonNull).collect(Collectors.joining(","));
-            if (!depends.isEmpty()) {
-                el.setAttribute("depends", depends);
+                Set<Layer> deps = dependencies.get(layer);
+                final String depends = deps == null ? "" : deps.stream().map(depLayer -> {
+                    int depIndex = layers.indexOf(depLayer);
+                    if (depIndex == -1) {
+                        Logging.warn("Unable to find " + depLayer);
+                        return null;
+                    } else {
+                        return Integer.toString(depIndex+1);
+                    }
+                }).filter(Objects::nonNull).collect(Collectors.joining(","));
+                if (!depends.isEmpty()) {
+                    el.setAttribute("depends", depends);
+                }
+                layersEl.appendChild(el);
             }
-            layersEl.appendChild(el);
         }
         return doc;
     }
