Index: /trunk/build.xml
===================================================================
--- /trunk/build.xml	(revision 15376)
+++ /trunk/build.xml	(revision 15377)
@@ -806,4 +806,6 @@
             <ignore classname="org.fusesource.*"/>
             <ignore classname="org.gdal.*"/>
+            <ignore classname="org.geotools.data.h2.*"/>
+            <ignore classname="org.geotools.gce.imagemosaic.*"/>
             <ignore classname="org.hibernate.*"/>
             <ignore classname="org.hsqldb.*"/>
Index: /trunk/src/org/openstreetmap/josm/data/osm/Tags.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Tags.java	(revision 15376)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Tags.java	(revision 15377)
@@ -42,3 +42,23 @@
         return values;
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(key, values);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null || getClass() != obj.getClass())
+            return false;
+        Tags other = (Tags) obj;
+        return Objects.equals(key, other.key) && Objects.equals(values, other.values);
+    }
+
+    @Override
+    public String toString() {
+        return "Tags [key=" + key + ", values=" + values + ']';
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 15376)
+++ /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionExporter.java	(revision 15377)
@@ -8,4 +8,5 @@
 import java.nio.charset.StandardCharsets;
 
+import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.OsmWriter;
@@ -28,12 +29,22 @@
     @Override
     protected void addDataFile(OutputStream out) {
+        export(layer.data, out);
+    }
+
+    /**
+     * Exports OSM data to the given output stream.
+     * @param data data set
+     * @param out output stream
+     * @since 15377
+     */
+    public static void export(DataSet data, OutputStream out) {
         Writer writer = new OutputStreamWriter(out, StandardCharsets.UTF_8);
-        OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, layer.data.getVersion());
-        layer.data.getReadLock().lock();
+        OsmWriter w = OsmWriterFactory.createOsmWriter(new PrintWriter(writer), false, data.getVersion());
+        data.getReadLock().lock();
         try {
-            w.write(layer.data);
+            w.write(data);
             w.flush();
         } finally {
-            layer.data.getReadLock().unlock();
+            data.getReadLock().unlock();
         }
     }
Index: /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java	(revision 15376)
+++ /trunk/src/org/openstreetmap/josm/io/session/OsmDataSessionImporter.java	(revision 15377)
@@ -29,8 +29,31 @@
     @Override
     public Layer load(Element elem, ImportSupport support, ProgressMonitor progressMonitor) throws IOException, IllegalDataException {
+        checkMetaVersion(elem);
+        String fileStr = extractFileName(elem, support);
+        return importData(new OsmImporter(), support, fileStr, progressMonitor);
+    }
+
+    /**
+     * Checks that element defines the expected version number.
+     * @param elem element to check
+     * @throws IllegalDataException if version is not the expected one
+     * @since 15377
+     */
+    public static void checkMetaVersion(Element elem) throws IllegalDataException {
         String version = elem.getAttribute("version");
         if (!"0.1".equals(version)) {
             throw new IllegalDataException(tr("Version ''{0}'' of meta data for osm data layer is not supported. Expected: 0.1", version));
         }
+    }
+
+    /**
+     * Extract file name from element.
+     * @param elem element to parse
+     * @param support import/export support
+     * @return file name, if present
+     * @throws IllegalDataException if file name missing or empty
+     * @since 15377
+     */
+    public static String extractFileName(Element elem, ImportSupport support) throws IllegalDataException {
         try {
             XPathFactory xPathFactory = XPathFactory.newInstance();
@@ -41,16 +64,30 @@
                 throw new IllegalDataException(tr("File name expected for layer no. {0}", support.getLayerIndex()));
             }
-
-            OsmImporter importer = new OsmImporter();
-            try (InputStream in = support.getInputStream(fileStr)) {
-                OsmImporter.OsmImporterData importData = importer.loadLayer(in, support.getFile(fileStr), support.getLayerName(),
-                        progressMonitor);
-
-                support.addPostLayersTask(importData.getPostLayerTask());
-                return importData.getLayer();
-            }
+            return fileStr;
         } catch (XPathExpressionException e) {
             throw new IllegalDataException(e);
         }
     }
+
+    /**
+     * Import data as a new layer.
+     * @param osmImporter OSM importer
+     * @param support import/export support
+     * @param fileStr file name to import
+     * @param progressMonitor progress monitor
+     * @return new layer
+     * @throws IOException in case of I/O error
+     * @throws IllegalDataException in case of illegal data
+     * @since 15377
+     */
+    public static Layer importData(OsmImporter osmImporter, ImportSupport support, String fileStr, ProgressMonitor progressMonitor)
+            throws IOException, IllegalDataException {
+        try (InputStream in = support.getInputStream(fileStr)) {
+            OsmImporter.OsmImporterData importData = osmImporter.loadLayer(
+                    in, support.getFile(fileStr), support.getLayerName(), progressMonitor);
+
+            support.addPostLayersTask(importData.getPostLayerTask());
+            return importData.getLayer();
+        }
+    }
 }
