diff --git a/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java b/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
index df273c0..ee9d167 100644
--- a/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
+++ b/src/org/openstreetmap/josm/actions/ExtensionFileFilter.java
@@ -91,19 +91,20 @@
 
         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"
+        Class[] exporterClasses = {
+                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 (String classname : exporterNames) {
+        for (Class exporterClass : exporterClasses) {
             try {
-                FileExporter exporter = (FileExporter) Class.forName(classname).newInstance();
+                FileExporter exporter = (FileExporter) exporterClass.newInstance();
                 exporters.add(exporter);
                 MapView.addLayerChangeListener(exporter);
             } catch (Exception e) {
diff --git a/src/org/openstreetmap/josm/io/GeoJSONExporter.java b/src/org/openstreetmap/josm/io/GeoJSONExporter.java
index f439848..eebecdd 100644
--- a/src/org/openstreetmap/josm/io/GeoJSONExporter.java
+++ b/src/org/openstreetmap/josm/io/GeoJSONExporter.java
@@ -9,26 +9,44 @@
 import java.nio.charset.StandardCharsets;
 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)");
+
+    public static class CurrentProjection extends GeoJSONExporter {
+        public CurrentProjection() {
+            super(FILE_FILTER_PROJECTED, null);
+        }
+    }
 
     /**
-     * Constructs a new {@code GeoJSONExporter}.
+     * 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;
     }
 
     @Override
     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);
             }
diff --git a/src/org/openstreetmap/josm/io/GeoJSONWriter.java b/src/org/openstreetmap/josm/io/GeoJSONWriter.java
index a248abd..22c57d2 100644
--- a/src/org/openstreetmap/josm/io/GeoJSONWriter.java
+++ b/src/org/openstreetmap/josm/io/GeoJSONWriter.java
@@ -14,6 +14,7 @@
 import javax.json.stream.JsonGenerator;
 
 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;
 import org.openstreetmap.josm.data.osm.INode;
@@ -23,6 +24,7 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 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;
 
 /**
@@ -30,15 +32,18 @@
  */
 public class GeoJSONWriter {
 
-    private OsmDataLayer layer;
+    private final OsmDataLayer layer;
+    private final Projection projection;
     private static final boolean skipEmptyNodes = true;
 
     /**
      * 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;
     }
 
     /**
@@ -62,6 +67,7 @@ public String write(boolean pretty) {
         try (JsonWriter writer = Json.createWriterFactory(config).createWriter(stringWriter)) {
             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);
             appendLayerFeatures(layer.data, object);
@@ -70,7 +76,7 @@ public String write(boolean pretty) {
         }
     }
 
-    private static class GeometryPrimitiveVisitor implements PrimitiveVisitor {
+    private class GeometryPrimitiveVisitor implements PrimitiveVisitor {
 
         private final JsonObjectBuilder geomObj;
 
@@ -83,7 +89,7 @@ public void visit(INode n) {
             geomObj.add("type", "Point");
             LatLon ll = n.getCoor();
             if (ll != null) {
-                geomObj.add("coordinates", getCoorArray(n.getCoor()));
+                geomObj.add("coordinates", getCoorArray(Json.createArrayBuilder(), n.getCoor()));
             }
         }
 
@@ -95,7 +101,7 @@ public void visit(IWay w) {
                 for (Node n : ((Way) w).getNodes()) {
                     LatLon ll = n.getCoor();
                     if (ll != null) {
-                        array.add(getCoorArray(ll));
+                        array.add(getCoorArray(Json.createArrayBuilder(), ll));
                     }
                 }
                 geomObj.add("coordinates", array);
@@ -105,13 +111,17 @@ public void visit(IWay w) {
         @Override
         public void visit(IRelation r) {
         }
+    }
+
+    private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, LatLon c) {
+        return getCoorArray(builder, projection.latlon2eastNorth(c));
+    }
 
-        private JsonArrayBuilder getCoorArray(LatLon c) {
-            return Json.createArrayBuilder().add(c.lon()).add(c.lat());
-        }
+    private JsonArrayBuilder getCoorArray(JsonArrayBuilder builder, EastNorth c) {
+        return builder.add(c.getX()).add(c.getY());
     }
 
-    protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
+    protected void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
         if (p.isIncomplete()) {
             return;
         } else if (skipEmptyNodes && p instanceof Node && p.getKeys().isEmpty()) {
@@ -135,7 +145,7 @@ protected static void appendPrimitive(OsmPrimitive p, JsonArrayBuilder array) {
                 .add("geometry", geomObj));
     }
 
-    protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
+    protected void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
         if (ds != null) {
             Iterator<Bounds> it = ds.getDataSourceBounds().iterator();
             if (it.hasNext()) {
@@ -148,15 +158,16 @@ protected static void appendLayerBounds(DataSet ds, JsonObjectBuilder object) {
         }
     }
 
-    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) {
             for (Node n : ds.getNodes()) {
