Index: core/src/org/openstreetmap/josm/Main.java
===================================================================
--- core/src/org/openstreetmap/josm/Main.java	(revision 5663)
+++ core/src/org/openstreetmap/josm/Main.java	(working copy)
@@ -4,6 +4,7 @@
 
 import java.awt.BorderLayout;
 import java.awt.Component;
+import java.awt.Font;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.Window;
@@ -20,6 +21,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Enumeration;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -39,6 +41,7 @@
 import javax.swing.JTextArea;
 import javax.swing.KeyStroke;
 import javax.swing.UIManager;
+import javax.swing.plaf.FontUIResource;
 
 import org.openstreetmap.gui.jmapviewer.FeatureAdapter;
 import org.openstreetmap.josm.actions.JosmAction;
@@ -515,6 +518,17 @@
             menu.redo.setEnabled(redoSize > 0);
         }
     };
+    
+    protected static void setUIFont(FontUIResource f) {
+        Enumeration<?> keys = UIManager.getDefaults().keys();
+        while (keys.hasMoreElements()) {
+            Object key = keys.nextElement();
+            Object value = UIManager.get(key);
+            if (value != null && value instanceof FontUIResource) {
+                UIManager.put(key, f);
+            }
+        }
+    }
 
     /**
      * Should be called before the main constructor to setup some parameter stuff
@@ -537,6 +551,15 @@
                 System.out.println("Look and Feel not supported: " + laf);
                 Main.pref.put("laf", defaultlaf);
             }
+            String fontName = Main.pref.get("font");
+            if (fontName != null) {
+                Font font = Font.decode(fontName);
+                if (font != null) {
+                    setUIFont(new FontUIResource(font));
+                } else {
+                    System.out.println("Font not found: " + fontName);
+                }
+            }
             toolbar = new ToolbarPreferences();
             contentPanePrivate.updateUI();
             panel.updateUI();
Index: core/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java
===================================================================
--- core/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(revision 5663)
+++ core/src/org/openstreetmap/josm/gui/preferences/display/LafPreference.java	(working copy)
@@ -4,6 +4,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.awt.Component;
+import java.awt.Font;
 import java.awt.GridBagLayout;
 
 import javax.swing.BorderFactory;
@@ -25,6 +26,7 @@
 import org.openstreetmap.josm.gui.preferences.PreferenceTabbedPane;
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
+import org.openstreetmap.josm.gui.widgets.FontChooser;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -40,6 +42,7 @@
      * ComboBox with all look and feels.
      */
     private JosmComboBox lafCombo;
+    private FontChooser fontCombo;
     public JPanel panel;
     private JCheckBox showSplashScreen = new JCheckBox(tr("Show splash screen at startup"));
     private JCheckBox showID = new JCheckBox(tr("Show object ID in selection lists"));
@@ -49,6 +52,7 @@
 
     public void addGui(PreferenceTabbedPane gui) {
         lafCombo = new JosmComboBox(UIManager.getInstalledLookAndFeels());
+        fontCombo = new FontChooser();
 
         // let's try to load additional LookAndFeels and put them into the list
         try {
@@ -70,6 +74,16 @@
                 break;
             }
         }
+        
+        String font = Main.pref.get("font");
+        if (font != null) {
+            for (int i = 1; i < fontCombo.getItemCount(); ++i) {
+                if (((Font)fontCombo.getItemAt(i)).getFontName().equals(font)) {
+                    fontCombo.setSelectedIndex(i);
+                    break;
+                }
+            }
+        }
 
         final ListCellRenderer oldRenderer = lafCombo.getRenderer();
         lafCombo.setRenderer(new DefaultListCellRenderer(){
@@ -113,10 +127,19 @@
         panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
         panel.add(lafCombo, GBC.eol().fill(GBC.HORIZONTAL));
 
+        addExpertComponent(new JLabel(tr("Font")), GBC.std().insets(20, 0, 0, 0));
+        addExpertComponent(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+        addExpertComponent(fontCombo, GBC.eol().fill(GBC.HORIZONTAL));
+
         JScrollPane scrollpane = new JScrollPane(panel);
         scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
         gui.getDisplayPreference().addSubTab(this, tr("Look and Feel"), scrollpane);
     }
+    
+    private void addExpertComponent(Component c, GBC constraints) {
+        ExpertToggleAction.addVisibilitySwitcher(c);
+        panel.add(c, constraints);
+    }
 
     public boolean ok() {
         boolean mod = false;
@@ -125,6 +148,7 @@
         Main.pref.put("osm-primitives.localize-name", showLocalizedName.isSelected());
         Main.pref.put("modeless", modeless.isSelected());
         Main.pref.put("dialog.dynamic.buttons", dynamicButtons.isSelected());
+        mod |= Main.pref.put("font", fontCombo.getSelectedFont() != null ? fontCombo.getSelectedFont().getFontName() : null);
         mod |= Main.pref.put("laf", ((LookAndFeelInfo)lafCombo.getSelectedItem()).getClassName());
         return mod;
     }
Index: core/src/org/openstreetmap/josm/gui/widgets/FontChooser.java
===================================================================
--- core/src/org/openstreetmap/josm/gui/widgets/FontChooser.java	(revision 0)
+++ core/src/org/openstreetmap/josm/gui/widgets/FontChooser.java	(working copy)
@@ -0,0 +1,75 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.GraphicsEnvironment;
+import java.util.Arrays;
+import java.util.Comparator;
+
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.JComboBox;
+import javax.swing.JList;
+import javax.swing.ListCellRenderer;
+
+/**
+ * A Combobox that displays the available fonts in their own font. 
+ * @since 5664
+ */
+public class FontChooser extends JComboBox {
+
+    /**
+     * Constructor
+     */
+    public FontChooser() {
+
+        final Font[] fonts = GraphicsEnvironment
+                .getLocalGraphicsEnvironment()
+                .getAllFonts();
+
+        Arrays.sort(fonts, new Comparator<Font>() {
+            @Override
+            public int compare(Font f1, Font f2) {
+                return f1.getName().compareTo(f2.getName());
+            }
+        });
+        
+        addItem(null);
+
+        for (Font font : fonts) {
+            if (font.canDisplayUpTo(font.getName()) == -1) {
+                addItem(font);
+            }
+        }
+        
+        setRenderer(new FontCellRenderer());
+    }
+    
+    private static class FontCellRenderer implements ListCellRenderer {
+        
+        protected DefaultListCellRenderer renderer = new DefaultListCellRenderer();
+        
+        @Override
+        public Component getListCellRendererComponent(JList list, Object value,
+            int index, boolean isSelected, boolean cellHasFocus) {
+            Font font = (Font) value;
+            final Component result = renderer.getListCellRendererComponent(list, 
+                    font == null ? tr("Default (Auto determined)") : font.getName(), 
+                            index, isSelected, cellHasFocus);
+            if (font != null && result != null) {
+                result.setFont(font.deriveFont(result.getFont().getSize2D()));
+            }
+            return result;
+        }
+    }
+    
+    /**
+     * Get the selected font, or null if the default font (first choice) has been selected.
+     * @return The selected font, or null if the default font (first choice) has been selected.
+     */
+    public final Font getSelectedFont() {
+        return (Font) getSelectedItem();
+    }
+}
