Index: trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 8812)
+++ trunk/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java	(revision 8813)
@@ -4,4 +4,5 @@
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Comparator;
@@ -47,22 +48,22 @@
         importers = new ArrayList<>();
 
-        String[] importerNames = {
-                "org.openstreetmap.josm.io.OsmImporter",
-                "org.openstreetmap.josm.io.OsmGzipImporter",
-                "org.openstreetmap.josm.io.OsmZipImporter",
-                "org.openstreetmap.josm.io.OsmChangeImporter",
-                "org.openstreetmap.josm.io.GpxImporter",
-                "org.openstreetmap.josm.io.NMEAImporter",
-                "org.openstreetmap.josm.io.NoteImporter",
-                "org.openstreetmap.josm.io.OsmBzip2Importer",
-                "org.openstreetmap.josm.io.JpgImporter",
-                "org.openstreetmap.josm.io.WMSLayerImporter",
-                "org.openstreetmap.josm.io.AllFormatsImporter",
-                "org.openstreetmap.josm.io.session.SessionImporter"
-        };
-
-        for (String classname : importerNames) {
+        final List<Class<? extends FileImporter>> importerNames = Arrays.asList(
+                org.openstreetmap.josm.io.OsmImporter.class,
+                org.openstreetmap.josm.io.OsmGzipImporter.class,
+                org.openstreetmap.josm.io.OsmZipImporter.class,
+                org.openstreetmap.josm.io.OsmChangeImporter.class,
+                org.openstreetmap.josm.io.GpxImporter.class,
+                org.openstreetmap.josm.io.NMEAImporter.class,
+                org.openstreetmap.josm.io.NoteImporter.class,
+                org.openstreetmap.josm.io.OsmBzip2Importer.class,
+                org.openstreetmap.josm.io.JpgImporter.class,
+                org.openstreetmap.josm.io.WMSLayerImporter.class,
+                org.openstreetmap.josm.io.AllFormatsImporter.class,
+                org.openstreetmap.josm.io.session.SessionImporter.class
+        );
+
+        for (final Class<? extends FileImporter> importerClass : importerNames) {
             try {
-                FileImporter importer = (FileImporter) Class.forName(classname).newInstance();
+                FileImporter importer = importerClass.newInstance();
                 importers.add(importer);
                 MapView.addLayerChangeListener(importer);
@@ -92,17 +93,18 @@
         exporters = new ArrayList<>();
 
-        String[] exporterNames = {
-                "org.openstreetmap.josm.io.GpxExporter",
-                "org.openstreetmap.josm.io.OsmExporter",
-                "org.openstreetmap.josm.io.OsmGzipExporter",
-                "org.openstreetmap.josm.io.OsmBzip2Exporter",
-                "org.openstreetmap.josm.io.GeoJSONExporter",
-                "org.openstreetmap.josm.io.WMSLayerExporter",
-                "org.openstreetmap.josm.io.NoteExporter"
-        };
-
-        for (String classname : exporterNames) {
+        final List<Class<? extends FileExporter>> exporterClasses = Arrays.asList(
+                org.openstreetmap.josm.io.GpxExporter.class,
+                org.openstreetmap.josm.io.OsmExporter.class,
+                org.openstreetmap.josm.io.OsmGzipExporter.class,
+                org.openstreetmap.josm.io.OsmBzip2Exporter.class,
+                org.openstreetmap.josm.io.GeoJSONExporter.CurrentProjection.class, // needs to be considered earlier than GeoJSONExporter
+                org.openstreetmap.josm.io.GeoJSONExporter.class,
+                org.openstreetmap.josm.io.WMSLayerExporter.class,
+                org.openstreetmap.josm.io.NoteExporter.class
+        );
+
+        for (final Class<? extends FileExporter> exporterClass : exporterClasses) {
             try {
-                FileExporter exporter = (FileExporter) Class.forName(classname).newInstance();
+                FileExporter exporter = exporterClass.newInstance();
                 exporters.add(exporter);
                 MapView.addLayerChangeListener(exporter);
Index: trunk/src/org/openstreetmap/josm/io/GeoJSONExporter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/GeoJSONExporter.java	(revision 8812)
+++ trunk/src/org/openstreetmap/josm/io/GeoJSONExporter.java	(revision 8813)
@@ -10,18 +10,39 @@
 import java.nio.file.Files;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExtensionFileFilter;
+import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
+import org.openstreetmap.josm.tools.Utils;
 
 public class GeoJSONExporter extends FileExporter {
 
+    protected final Projection projection;
     public static final ExtensionFileFilter FILE_FILTER = new ExtensionFileFilter(
             "geojson,json", "geojson", tr("GeoJSON Files") + " (*.geojson *.json)");
+    public static final ExtensionFileFilter FILE_FILTER_PROJECTED = new ExtensionFileFilter(
+            "proj.geojson", "proj.geojson", tr("Projected GeoJSON Files") + " (*.proj.geojson)");
 
     /**
-     * Constructs a new {@code GeoJSONExporter}.
+     * A GeoJSON exporter which obtains the current map projection when exporting ({@link #exportData(File, Layer)}).
+     */
+    public static class CurrentProjection extends GeoJSONExporter {
+        public CurrentProjection() {
+            super(FILE_FILTER_PROJECTED, null);
+        }
+    }
+
+    /**
+     * Constructs a new {@code GeoJSONExporter} with WGS84 projection.
      */
     public GeoJSONExporter() {
-        super(FILE_FILTER);
+        this(FILE_FILTER, ProjectionPreference.wgs84.getProjection());
+    }
+
+    private GeoJSONExporter(ExtensionFileFilter fileFilter, Projection projection) {
+        super(fileFilter);
+        this.projection = projection;
     }
 
@@ -29,5 +50,5 @@
     public void exportData(File file, Layer layer) throws IOException {
         if (layer instanceof OsmDataLayer) {
-            String json = new GeoJSONWriter((OsmDataLayer) layer).write();
+            String json = new GeoJSONWriter((OsmDataLayer) layer, Utils.firstNonNull(projection, Main.getProjection())).write();
             try (Writer out = Files.newBufferedWriter(file.toPath(), StandardCharsets.UTF_8)) {
                 out.write(json);
Index: trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java	(revision 8812)
+++ trunk/src/org/openstreetmap/josm/io/GeoJSONWriter.java	(revision 8813)
@@ -15,4 +15,5 @@
 
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -24,4 +25,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 
@@ -31,5 +33,6 @@
 public class GeoJSONWriter {
 
-    private OsmDataLayer layer;
+    private final OsmDataLayer layer;
+    private final Projection projection;
     private static final boolean skipEmptyNodes = true;
 
@@ -37,7 +40,9 @@
      * Constructs a new {@code GeoJSONWriter}.
      * @param layer The OSM data layer to save
+     * @param projection The projection to use for coordinates
      */
-    public GeoJSONWriter(OsmDataLayer layer) {
+    public GeoJSONWriter(OsmDataLayer layer, Projection projection) {
         this.layer = layer;
+        this.projection = projection;
     }
 
@@ -63,4 +68,5 @@
             JsonObjectBuilder object = Json.createObjectBuilder()
                     .add("type", "FeatureCollection")
+                    .add("crs", Json.createObjectBuilder().add("type", "name").add("name", projection.toCode()))
                     .add("generator", "JOSM");
             appendLayerBounds(layer.data, object);
@@ -71,5 +77,5 @@
     }
 
-    private static class GeometryPrimitiveVisitor implements PrimitiveVisitor {
+    private class GeometryPrimitiveVisitor implements PrimitiveVisitor {
 
         private final JsonObjectBuilder geomObj;
@@ -84,5 +90,5 @@
             LatLon ll = n.getCoor();
             if (ll != null) {
-                geomObj.add("coordinates", getCoorArray(n.getCoor()));
+                geomObj.add("coordinates", getCoorArray(Json.createArrayBuilder(), n.getCoor()));
             }
         }
@@ -96,5 +102,5 @@
                     LatLon ll = n.getCoor();
                     if (ll != null) {
-                        array.add(getCoorArray(ll));
+                        array.add(getCoorArray(Json.createArrayBuilder(), ll));
                     }
                 }
@@ -106,11 +112,15 @@
         public void visit(IRelation r) {
         }
-
-        private JsonArrayBuilder getCoorArray(LatLon c) {
-            return Json.createArrayBuilder().add(c.lon()).add(c.lat());
-        }
     }
 
-    protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
+    private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, LatLon c) {
+        return getCoorArray(builder, projection.latlon2eastNorth(c));
+    }
+
+    private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, EastNorth c) {
+        return builder.add(c.getX()).add(c.getY());
+    }
+
+    protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
         if (p.isIncomplete()) {
             return;
@@ -136,5 +146,5 @@
     }
 
-    protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
+    protected void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
         if (ds != null) {
             Iterator<Bounds> it = ds.getDataSourceBounds().iterator();
@@ -149,13 +159,14 @@
     }
 
-    protected static void appendBounds(Bounds b, JsonObjectBuilder object) {
+    protected void appendBounds(Bounds b, JsonObjectBuilder object) {
         if (b != null) {
-            object.add("bbox", Json.createArrayBuilder()
-                    .add(b.getMinLon()).add(b.getMinLat())
-                    .add(b.getMaxLon()).add(b.getMaxLat()));
+            JsonArrayBuilder builder = Json.createArrayBuilder();
+            getCoorArray(builder, b.getMin());
+            getCoorArray(builder, b.getMax());
+            object.add("bbox", builder);
         }
     }
 
-    protected static void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {
+    protected void appendLayerFeatures(DataSet ds, JsonObjectBuilder object) {
         JsonArrayBuilder array = Json.createArrayBuilder();
         if (ds != null) {
