Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 30582)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/datasets/AbstractDataSetHandler.java	(revision 30583)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.plugins.opendata.core.io.geographic.DefaultShpHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.geographic.GmlHandler;
+import org.openstreetmap.josm.plugins.opendata.core.io.geographic.MifHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.geographic.ShpHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.tabular.CsvHandler;
@@ -440,4 +441,16 @@
 	}
 
+    // --------- MIF handling ---------
+    
+    private MifHandler mifHandler;
+
+    public final void setMifHandler(MifHandler handler) {
+        mifHandler = handler;
+    }
+    
+    public final MifHandler getMifHandler() {
+        return mifHandler;
+    }
+
 	// --------- GML handling ---------
 	
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ChooserLauncher.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ChooserLauncher.java	(revision 30583)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ChooserLauncher.java	(revision 30583)
@@ -0,0 +1,37 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.opendata.core.gui;
+
+import java.awt.Component;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+import org.openstreetmap.josm.gui.util.GuiHelper;
+
+public final class ChooserLauncher implements Runnable {
+
+    private Projection proj = null;
+    private final ProgressMonitor progressMonitor;
+
+    private ChooserLauncher(ProgressMonitor progressMonitor) {
+        this.progressMonitor = progressMonitor;
+    }
+
+    @Override
+    public void run() {
+        Component parent = progressMonitor == null ? Main.parent : progressMonitor.getWindowParent();
+        ProjectionChooser dialog = (ProjectionChooser) new ProjectionChooser(parent).showDialog();
+        if (dialog.getValue() == 1) {
+            proj = dialog.getProjection();
+        }
+    }
+    
+    public static Projection askForProjection(ProgressMonitor pm) {
+        ChooserLauncher launcher = new ChooserLauncher(pm);
+        GuiHelper.runInEDTAndWait(launcher);
+        if (launcher.proj == null) {
+            return null; // User clicked Cancel
+        }
+        return launcher.proj;
+    }
+}
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ProjectionChooser.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ProjectionChooser.java	(revision 30583)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/gui/ProjectionChooser.java	(revision 30583)
@@ -0,0 +1,158 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.opendata.core.gui;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.GridBagLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.BorderFactory;
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.coor.CoordinateFormat;
+import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.preferences.projection.ProjectionChoice;
+import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
+import org.openstreetmap.josm.gui.preferences.projection.SubPrefsOptions;
+import org.openstreetmap.josm.tools.GBC;
+
+/**
+ * Projection chooser, ugly copy-paste of ProjectionPreference.
+ * FIXME: to be refactored in core for reuse by plugins.
+ */
+public class ProjectionChooser extends ExtendedDialog {
+
+    /**
+     * Combobox with all projections available
+     */
+    private final JComboBox<ProjectionChoice> projectionCombo = new JComboBox<>(
+            ProjectionPreference.getProjectionChoices().toArray(new ProjectionChoice[0]));
+
+    /**
+     * This variable holds the JPanel with the projection's preferences. If the
+     * selected projection does not implement this, it will be set to an empty
+     * Panel.
+     */
+    private JPanel projSubPrefPanel;
+    private JPanel projSubPrefPanelWrapper = new JPanel(new GridBagLayout());
+
+    private JLabel projectionCodeLabel;
+    private Component projectionCodeGlue;
+    private JLabel projectionCode = new JLabel();
+    private JLabel projectionNameLabel;
+    private Component projectionNameGlue;
+    private JLabel projectionName = new JLabel();
+    private JLabel bounds = new JLabel();
+    
+    /**
+     * This is the panel holding all projection preferences
+     */
+    private final JPanel projPanel = new JPanel(new GridBagLayout());
+
+    /**
+     * The GridBagConstraints for the Panel containing the ProjectionSubPrefs.
+     * This is required twice in the code, creating it here keeps both occurrences
+     * in sync
+     */
+    private static final GBC projSubPrefPanelGBC = GBC.std().fill(GBC.BOTH).weight(1.0, 1.0);
+
+	public ProjectionChooser(Component parent) {
+		this(parent, tr("Projection method"), new String[] {tr("OK"), tr("Cancel")});
+	}
+	
+	protected ProjectionChooser(Component parent, String title, String[] buttonTexts) {
+		super(parent, title, buttonTexts);
+		setMinimumSize(new Dimension(600, 200));
+		addGui();
+	}
+	
+	public void addGui() {
+        projPanel.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
+        projPanel.setLayout(new GridBagLayout());
+        projPanel.add(new JLabel(tr("Projection method")), GBC.std().insets(5,5,0,5));
+        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(projectionCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
+        projPanel.add(projectionCodeLabel = new JLabel(tr("Projection code")), GBC.std().insets(25,5,0,5));
+        projPanel.add(projectionCodeGlue = GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(projectionCode, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
+        projPanel.add(projectionNameLabel = new JLabel(tr("Projection name")), GBC.std().insets(25,5,0,5));
+        projPanel.add(projectionNameGlue = GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(projectionName, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
+        projPanel.add(new JLabel(tr("Bounds")), GBC.std().insets(25,5,0,5));
+        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(bounds, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
+        projPanel.add(projSubPrefPanelWrapper, GBC.eol().fill(GBC.HORIZONTAL).insets(20,5,5,5));
+
+        selectedProjectionChanged((ProjectionChoice) projectionCombo.getSelectedItem());
+        projectionCombo.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                ProjectionChoice pc = (ProjectionChoice) projectionCombo.getSelectedItem();
+                selectedProjectionChanged(pc);
+            }
+        });
+        setContent(projPanel);
+	}
+	
+	private void selectedProjectionChanged(final ProjectionChoice pc) {
+        // Don't try to update if we're still starting up
+        int size = projPanel.getComponentCount();
+        if(size < 1)
+            return;
+
+        final ActionListener listener = new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                updateMeta(pc);
+            }
+        };
+
+        // Replace old panel with new one
+        projSubPrefPanelWrapper.removeAll();
+        projSubPrefPanel = pc.getPreferencePanel(listener);
+        projSubPrefPanelWrapper.add(projSubPrefPanel, projSubPrefPanelGBC);
+        projPanel.revalidate();
+        projSubPrefPanel.repaint();
+        updateMeta(pc);
+    }
+	
+    private void updateMeta(ProjectionChoice pc) {
+        pc.setPreferences(pc.getPreferences(projSubPrefPanel));
+        Projection proj = pc.getProjection();
+        projectionCode.setText(proj.toCode());
+        projectionName.setText(proj.toString());
+        Bounds b = proj.getWorldBoundsLatLon();
+        CoordinateFormat cf = CoordinateFormat.getDefaultFormat();
+        bounds.setText(b.getMin().lonToString(cf)+", "+b.getMin().latToString(cf)+" : "+b.getMax().lonToString(cf)+", "+b.getMax().latToString(cf));
+        boolean showCode = true;
+        boolean showName = false;
+        if (pc instanceof SubPrefsOptions) {
+            showCode = ((SubPrefsOptions) pc).showProjectionCode();
+            showName = ((SubPrefsOptions) pc).showProjectionName();
+        }
+        projectionCodeLabel.setVisible(showCode);
+        projectionCodeGlue.setVisible(showCode);
+        projectionCode.setVisible(showCode);
+        projectionNameLabel.setVisible(showName);
+        projectionNameGlue.setVisible(showName);
+        projectionName.setVisible(showName);
+    }
+
+    public Projection getProjection() {
+		ProjectionChoice pc = (ProjectionChoice) projectionCombo.getSelectedItem();
+		if (pc != null) {
+		    Main.info("Chosen projection: "+pc+" ("+pc.getProjection()+")");
+		    return pc.getProjection();
+		} else {
+		    return null;
+		}
+	}
+}
Index: plications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionChooser.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/ProjectionChooser.java	(revision 30582)
+++ 	(revision )
@@ -1,56 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins.opendata.core.io;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Component;
-import java.awt.GridBagLayout;
-
-import javax.swing.BorderFactory;
-import javax.swing.JComboBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-
-import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.preferences.projection.ProjectionChoice;
-import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
-import org.openstreetmap.josm.tools.GBC;
-
-public class ProjectionChooser extends ExtendedDialog {
-
-    /**
-     * This is the panel holding all projection preferences
-     */
-    private final JPanel projPanel = new JPanel(new GridBagLayout());
-    
-    /**
-     * Combobox with all projections available
-     */
-    private final JComboBox<ProjectionChoice> projectionCombo = new JComboBox<>(
-            ProjectionPreference.getProjectionChoices().toArray(new ProjectionChoice[0]));
-
-	public ProjectionChooser(Component parent) {
-		this(parent, tr("Projection method"), new String[] {tr("OK"), tr("Cancel")});
-	}
-	
-	protected ProjectionChooser(Component parent, String title,
-			String[] buttonTexts) {
-		super(parent, title, buttonTexts);
-		addGui();
-	}
-	
-	public void addGui() {
-        projPanel.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
-        projPanel.setLayout(new GridBagLayout());
-        projPanel.add(new JLabel(tr("Projection method")), GBC.std().insets(5,5,0,5));
-        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
-        projPanel.add(projectionCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
-        setContent(projPanel);
-	}
-	
-	public Projection getProjection() {
-		ProjectionChoice choice = (ProjectionChoice) projectionCombo.getSelectedItem();
-		return choice != null ? choice.getProjection() : null;
-	}
-}
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultMifHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultMifHandler.java	(revision 30583)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/DefaultMifHandler.java	(revision 30583)
@@ -0,0 +1,28 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.opendata.core.io.geographic;
+
+import org.opengis.referencing.FactoryException;
+import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.referencing.operation.MathTransform;
+import org.openstreetmap.josm.data.projection.Projection;
+
+public class DefaultMifHandler extends DefaultGeographicHandler implements MifHandler {
+
+    private Projection nonEarthProj;
+    
+    @Override
+    public MathTransform findMathTransform(CoordinateReferenceSystem sourceCRS, CoordinateReferenceSystem targetCRS, boolean lenient)
+            throws FactoryException {
+        return null;
+    }
+
+    @Override
+    public void setCoordSysNonEarthProjection(Projection p) {
+        nonEarthProj = p;
+    }
+
+    @Override
+    public Projection getCoordSysNonEarthProjection() {
+        return nonEarthProj;
+    }
+}
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifHandler.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifHandler.java	(revision 30583)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifHandler.java	(revision 30583)
@@ -0,0 +1,11 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.opendata.core.io.geographic;
+
+import org.openstreetmap.josm.data.projection.Projection;
+
+public interface MifHandler extends GeographicHandler {
+
+    public void setCoordSysNonEarthProjection(Projection p);
+    
+    public Projection getCoordSysNonEarthProjection();
+}
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java	(revision 30582)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReader.java	(revision 30583)
@@ -29,7 +29,9 @@
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
 import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
+import org.openstreetmap.josm.plugins.opendata.core.gui.ChooserLauncher;
 import org.openstreetmap.josm.plugins.opendata.core.io.InputStreamReaderUnbuffered;
 import org.openstreetmap.josm.plugins.opendata.core.util.OdUtils;
@@ -53,4 +55,6 @@
         END_POLYLINE
     }
+    
+    private final AbstractDataSetHandler handler;
     
     private File file;
@@ -91,7 +95,11 @@
     private int numsections = -1;
     
+    private MifReader(AbstractDataSetHandler handler) {
+        this.handler = handler;
+    }
+    
     public static DataSet parseDataSet(InputStream in, File file,
             AbstractDataSetHandler handler, ProgressMonitor instance) throws IOException {
-        return new MifReader().parse(in, file, instance, Charset.forName(OdConstants.ISO8859_15));
+        return new MifReader(handler).parse(in, file, instance, Charset.forName(OdConstants.ISO8859_15));
     }
 
@@ -327,6 +335,9 @@
             // Use syntax 2 to explicitly define a non-Earth coordinate system, such as the coordinate system used in a floor plan or other CAD drawing. 
             
-            // FIXME: allow user to choose projection ?
-            josmProj = new CustomProjection(null);
+            if (handler != null && handler.getMifHandler() != null && handler.getMifHandler().getCoordSysNonEarthProjection() != null) {
+                josmProj = handler.getMifHandler().getCoordSysNonEarthProjection();
+            } else {
+                josmProj = ChooserLauncher.askForProjection(NullProgressMonitor.INSTANCE);
+            }
             break;
         case "layout":
Index: /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java
===================================================================
--- /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 30582)
+++ /applications/editors/josm/plugins/opendata/src/org/openstreetmap/josm/plugins/opendata/core/io/tabular/SpreadSheetReader.java	(revision 30583)
@@ -4,5 +4,4 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.Component;
 import java.awt.GraphicsEnvironment;
 import java.io.IOException;
@@ -23,8 +22,7 @@
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
-import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.io.AbstractReader;
 import org.openstreetmap.josm.plugins.opendata.core.OdConstants;
-import org.openstreetmap.josm.plugins.opendata.core.io.ProjectionChooser;
+import org.openstreetmap.josm.plugins.opendata.core.gui.ChooserLauncher;
 import org.openstreetmap.josm.plugins.opendata.core.io.ProjectionPatterns;
 
@@ -78,23 +76,4 @@
         }
         return col;
-	}
-	
-	private class ChooserLauncher implements Runnable {
-
-	    public Projection proj = null;
-        private final ProgressMonitor progressMonitor;
-	    
-        public ChooserLauncher(ProgressMonitor progressMonitor) {
-            this.progressMonitor = progressMonitor;
-        }
-
-        @Override
-        public void run() {
-            Component parent = progressMonitor == null ? Main.parent : progressMonitor.getWindowParent();
-            ProjectionChooser dialog = (ProjectionChooser) new ProjectionChooser(parent).showDialog();
-            if (dialog.getValue() == 1) {
-                proj = dialog.getProjection();
-            }
-        }
 	}
 	
@@ -153,11 +132,10 @@
 			    }
 				// TODO: filter proposed projections with min/max values ?
-			    ChooserLauncher launcher = new ChooserLauncher(progressMonitor);
-			    GuiHelper.runInEDTAndWait(launcher);
-				if (launcher.proj == null) {
+                Projection p = ChooserLauncher.askForProjection(progressMonitor);
+				if (p == null) {
 					return null; // User clicked Cancel
 				}
 		        for (CoordinateColumns c : columns) {
-		            c.proj = launcher.proj;
+		            c.proj = p;
 		        }
 			}
Index: /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReaderTest.java
===================================================================
--- /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReaderTest.java	(revision 30582)
+++ /applications/editors/josm/plugins/opendata/test/unit/org/openstreetmap/josm/plugins/opendata/core/io/geographic/MifReaderTest.java	(revision 30583)
@@ -11,4 +11,7 @@
 import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.projection.Projections;
+import org.openstreetmap.josm.plugins.opendata.core.datasets.AbstractDataSetHandler;
 import org.openstreetmap.josm.plugins.opendata.core.io.NonRegFunctionalTests;
 
@@ -26,4 +29,20 @@
     }
     
+    private static AbstractDataSetHandler newHandler(final String epsgCode) {
+        AbstractDataSetHandler handler = new AbstractDataSetHandler() {
+            @Override
+            public boolean acceptsFilename(String filename) {
+                return true;
+            }
+            @Override
+            public void updateDataSet(DataSet ds) {
+            }
+        };
+        DefaultMifHandler mifHandler = new DefaultMifHandler();
+        mifHandler.setCoordSysNonEarthProjection(Projections.getProjectionByCode(epsgCode));
+        handler.setMifHandler(mifHandler);
+        return handler;
+    }
+    
     /**
      * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/9592">#9592</a>
@@ -34,5 +53,5 @@
         File file = new File(TestUtils.getRegressionDataFile(9592, "bg.mif"));
         try (InputStream is = new FileInputStream(file)) {
-            NonRegFunctionalTests.testGeneric("#9592", MifReader.parseDataSet(is, file, null, null));
+            NonRegFunctionalTests.testGeneric("#9592", MifReader.parseDataSet(is, file, newHandler("EPSG:32635"), null));
         }
     }
