Index: /trunk/src/org/openstreetmap/josm/actions/PreferencesAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PreferencesAction.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/actions/PreferencesAction.java	(revision 1742)
@@ -79,4 +79,5 @@
         if (pane.getValue() instanceof Integer && (Integer)pane.getValue() == JOptionPane.OK_OPTION)
             prefDlg.ok();
+        dlg.dispose();
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java	(revision 1742)
@@ -33,4 +33,10 @@
 
 public class AdvancedPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new AdvancedPreference();
+        }
+    }
 
     private Map<String,String> orig;
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/AudioPreference.java	(revision 1742)
@@ -24,4 +24,11 @@
 
 public class AudioPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new AudioPreference();
+        }
+    }
+
     private JCheckBox audioMenuVisible = new JCheckBox(tr("Display the Audio menu."));
     private JCheckBox markerButtonLabels = new JCheckBox(tr("Label audio (and image and web) markers."));
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ColorPreference.java	(revision 1742)
@@ -10,13 +10,14 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.TreeMap;
 import java.util.Vector;
-
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.swing.BorderFactory;
 import javax.swing.Box;
 import javax.swing.JButton;
@@ -31,15 +32,21 @@
 import javax.swing.table.DefaultTableModel;
 import javax.swing.table.TableCellRenderer;
-import javax.swing.BorderFactory;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.visitor.MapPaintVisitor;
-import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.gui.MapScaler;
 import org.openstreetmap.josm.gui.dialogs.ConflictDialog;
+import org.openstreetmap.josm.gui.layer.markerlayer.MarkerLayer;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.GBC;
 
 public class ColorPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new ColorPreference();
+        }
+    }
+
 
     private DefaultTableModel tableModel;
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 1742)
@@ -5,18 +5,18 @@
 
 import java.awt.Dimension;
+import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
-import java.awt.GridBagLayout;
 
 import javax.swing.BorderFactory;
+import javax.swing.Box;
 import javax.swing.ButtonGroup;
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
 import javax.swing.JLabel;
+import javax.swing.JPanel;
 import javax.swing.JRadioButton;
+import javax.swing.JScrollPane;
 import javax.swing.JTextField;
-import javax.swing.JScrollPane;
-import javax.swing.JPanel;
-import javax.swing.Box;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -26,4 +26,10 @@
 
 public class DrawingPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new DrawingPreference();
+        }
+    }
 
     private ButtonGroup gpsLinesGroup;
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/FilePreferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/FilePreferences.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/FilePreferences.java	(revision 1742)
@@ -19,4 +19,10 @@
 public class FilePreferences implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new FilePreferences();
+        }
+    }
+
     private JCheckBox keepBackup = new JCheckBox(tr("Keep backup files"));
 
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java	(revision 1742)
@@ -24,4 +24,10 @@
 
 public class LafPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new LafPreference();
+        }
+    }
 
     /**
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java	(revision 1742)
@@ -20,4 +20,11 @@
 
 public class LanguagePreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new LanguagePreference();
+        }
+    }
+
     /**
      * ComboBox with all available Translations
@@ -54,10 +61,6 @@
         });
 
-        JPanel panel = null;
-        for(PreferenceSetting s : PreferenceDialog.settings)
-        {
-            if(s instanceof LafPreference)
-                panel = ((LafPreference)s).panel;
-        }
+        LafPreference lafPreference = gui.getSetting(LafPreference.class);
+        JPanel panel = lafPreference.panel;
         panel.add(new JLabel(tr("Language")), GBC.std().insets(20, 0, 0, 0));
         panel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java	(revision 1742)
@@ -5,4 +5,10 @@
 
 public class MapPaintPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new MapPaintPreference();
+        }
+    }
 
     public void addGui(final PreferenceDialog gui) {
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/PluginPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/PluginPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/PluginPreference.java	(revision 1742)
@@ -27,4 +27,10 @@
 
 public class PluginPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new PluginPreference();
+        }
+    }
 
     private JPanel plugin;
@@ -117,5 +123,5 @@
     }
 
-    class NoHorizontalScrollPanel extends JPanel implements Scrollable {
+    private static class NoHorizontalScrollPanel extends JPanel implements Scrollable {
         public NoHorizontalScrollPanel(GridBagLayout gridBagLayout) {
             super(gridBagLayout);
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 1742)
@@ -7,7 +7,9 @@
 import java.awt.GridBagLayout;
 import java.awt.ScrollPane;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 
 import javax.swing.BorderFactory;
@@ -33,5 +35,6 @@
 public class PreferenceDialog extends JTabbedPane {
 
-    public final static Collection<PreferenceSetting> settings = new LinkedList<PreferenceSetting>();
+    private final static Collection<PreferenceSettingFactory> settingsFactory = new LinkedList<PreferenceSettingFactory>();
+    private final List<PreferenceSetting> settings = new ArrayList<PreferenceSetting>();
 
     // some common tabs
@@ -41,5 +44,5 @@
     public final JPanel audio = createPreferenceTab("audio", I18n.tr("Audio Settings"), I18n.tr("Settings for the audio player and audio markers."));
 
-  public final javax.swing.JTabbedPane displaycontent = new javax.swing.JTabbedPane();
+    public final javax.swing.JTabbedPane displaycontent = new javax.swing.JTabbedPane();
 
     /**
@@ -105,4 +108,13 @@
     public PreferenceDialog() {
         super(JTabbedPane.LEFT, JTabbedPane.SCROLL_TAB_LAYOUT);
+
+        for (PreferenceSettingFactory factory:settingsFactory) {
+
+            PreferenceSetting setting = factory.createPreferenceSetting();
+            if (setting != null) {
+                settings.add(factory.createPreferenceSetting());
+            }
+        }
+
         display.add(displaycontent, GBC.eol().fill(GBC.BOTH));
         for (Iterator<PreferenceSetting> it = settings.iterator(); it.hasNext();) {
@@ -118,25 +130,39 @@
     }
 
+    public List<PreferenceSetting> getSettings() {
+        return settings;
+    }
+
+    @SuppressWarnings("unchecked")
+    public <T>  T getSetting(Class<? extends T> clazz) {
+        for (PreferenceSetting setting:settings) {
+            if (clazz.isAssignableFrom(setting.getClass())) {
+                return (T)setting;
+            }
+        }
+        return null;
+    }
+
     static {
         // order is important!
-        settings.add(new DrawingPreference());
-        settings.add(new ColorPreference());
-        settings.add(new LafPreference());
-        settings.add(new LanguagePreference());
-        settings.add(new MapPaintPreference());
-        settings.add(new ServerAccessPreference());
-        settings.add(new FilePreferences());
-        settings.add(new ProxyPreferences());
-        settings.add(new ProjectionPreference());
-        settings.add(new TaggingPresetPreference());
-        settings.add(new PluginPreference());
-        settings.add(Main.toolbar);
-        settings.add(new AudioPreference());
-        settings.add(new ShortcutPreference());
+        settingsFactory.add(new DrawingPreference.Factory());
+        settingsFactory.add(new ColorPreference.Factory());
+        settingsFactory.add(new LafPreference.Factory());
+        settingsFactory.add(new LanguagePreference.Factory());
+        settingsFactory.add(new MapPaintPreference.Factory());
+        settingsFactory.add(new ServerAccessPreference.Factory());
+        settingsFactory.add(new FilePreferences.Factory());
+        settingsFactory.add(new ProxyPreferences.Factory());
+        settingsFactory.add(new ProjectionPreference.Factory());
+        settingsFactory.add(new TaggingPresetPreference.Factory());
+        settingsFactory.add(new PluginPreference.Factory());
+        settingsFactory.add(Main.toolbar);
+        settingsFactory.add(new AudioPreference.Factory());
+        settingsFactory.add(new ShortcutPreference.Factory());
 
-        PluginHandler.getPreferenceSetting(settings);
+        PluginHandler.getPreferenceSetting(settingsFactory);
 
         // always the last: advanced tab
-        settings.add(new AdvancedPreference());
+        settingsFactory.add(new AdvancedPreference.Factory());
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceSettingFactory.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceSettingFactory.java	(revision 1742)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceSettingFactory.java	(revision 1742)
@@ -0,0 +1,8 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+public interface PreferenceSettingFactory {
+
+    PreferenceSetting createPreferenceSetting();
+
+}
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 1742)
@@ -13,11 +13,17 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.coor.LatLon.CoordinateFormat;
+import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.projection.Mercator;
 import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.data.coor.LatLon.CoordinateFormat;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.tools.GBC;
 
 public class ProjectionPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new ProjectionPreference();
+        }
+    }
 
     /**
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ProxyPreferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ProxyPreferences.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ProxyPreferences.java	(revision 1742)
@@ -19,4 +19,10 @@
 
 public class ProxyPreferences implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new ProxyPreferences();
+        }
+    }
 
     public static final String PROXY_ENABLE = "proxy.enable";
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java	(revision 1742)
@@ -14,4 +14,10 @@
 
 public class ServerAccessPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new ServerAccessPreference();
+        }
+    }
 
     /**
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ShortcutPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ShortcutPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ShortcutPreference.java	(revision 1742)
@@ -4,14 +4,19 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.util.Collection;
+
 import javax.swing.JPanel;
 import javax.swing.table.AbstractTableModel;
 
-import java.util.Collection;
-
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.gui.preferences.prefJPanel;
 
 public class ShortcutPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new ShortcutPreference();
+        }
+    }
 
     public void addGui(PreferenceDialog gui) {
@@ -35,5 +40,5 @@
 
     // Maybe move this to prefPanel? There's no need for it to be here.
-    private class scListModel extends AbstractTableModel {
+    private static class scListModel extends AbstractTableModel {
 //      private String[] columnNames = new String[]{tr("Action"), tr("Shortcut"), tr("Group"), tr("ID")};
         private String[] columnNames = new String[]{tr("Action"), tr("Shortcut")};
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java	(revision 1742)
@@ -33,4 +33,10 @@
 
 public class TaggingPresetPreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new TaggingPresetPreference();
+        }
+    }
 
     public static Collection<TaggingPreset> taggingPresets;
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 1742)
@@ -54,46 +54,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 
-public class ToolbarPreferences implements PreferenceSetting {
-
-    private final class Move implements ActionListener {
-        public void actionPerformed(ActionEvent e) {
-            if (e.getActionCommand().equals("<") && actionsTree.getSelectionCount() > 0) {
-
-                int leadItem = selected.getSize();
-                if (selectedList.getSelectedIndex() != -1) {
-                    int[] indices = selectedList.getSelectedIndices();
-                    leadItem = indices[indices.length - 1];
-                }
-                for (TreePath selectedAction : actionsTree.getSelectionPaths()) {
-                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectedAction.getLastPathComponent();
-                    if (node.getUserObject() == null)
-                        selected.add(leadItem++, null);
-                    else if (node.getUserObject() == null || node.getUserObject() instanceof Action)
-                        selected.add(leadItem++, ((Action)node.getUserObject()).getValue("toolbar"));
-                }
-            } else if (e.getActionCommand().equals(">") && selectedList.getSelectedIndex() != -1) {
-                while (selectedList.getSelectedIndex() != -1) {
-                    selected.remove(selectedList.getSelectedIndex());
-                }
-            } else if (e.getActionCommand().equals("up")) {
-                int i = selectedList.getSelectedIndex();
-                Object o = selected.get(i);
-                if (i != 0) {
-                    selected.remove(i);
-                    selected.add(i-1, o);
-                    selectedList.setSelectedIndex(i-1);
-                }
-            } else if (e.getActionCommand().equals("down")) {
-                int i = selectedList.getSelectedIndex();
-                Object o = selected.get(i);
-                if (i != selected.size()-1) {
-                    selected.remove(i);
-                    selected.add(i+1, o);
-                    selectedList.setSelectedIndex(i+1);
-                }
-            }
-        }
-    }
-    private Move moveAction = new Move();
+public class ToolbarPreferences implements PreferenceSettingFactory {
 
     /**
@@ -104,254 +63,364 @@
     private Map<String, Action> regactions = new HashMap<String, Action>();
 
-    private DefaultListModel selected = new DefaultListModel();
-
     private DefaultMutableTreeNode rootActionsNode = new DefaultMutableTreeNode("Actions");
-    private DefaultTreeModel actionsTreeModel = new DefaultTreeModel(rootActionsNode);
-    private JTree actionsTree = new JTree(actionsTreeModel);
-    private JList selectedList = new JList(selected);
-
-    private String movingComponent;
 
     public JToolBar control = new JToolBar();
 
-    private JButton upButton;
-    private JButton downButton;
+    public PreferenceSetting createPreferenceSetting() {
+        return new Settings(rootActionsNode);
+    }
+
+    public static class Settings implements PreferenceSetting {
+
+        private final class Move implements ActionListener {
+            public void actionPerformed(ActionEvent e) {
+                if (e.getActionCommand().equals("<") && actionsTree.getSelectionCount() > 0) {
+
+                    int leadItem = selected.getSize();
+                    if (selectedList.getSelectedIndex() != -1) {
+                        int[] indices = selectedList.getSelectedIndices();
+                        leadItem = indices[indices.length - 1];
+                    }
+                    for (TreePath selectedAction : actionsTree.getSelectionPaths()) {
+                        DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectedAction.getLastPathComponent();
+                        if (node.getUserObject() == null)
+                            selected.add(leadItem++, null);
+                        else if (node.getUserObject() == null || node.getUserObject() instanceof Action)
+                            selected.add(leadItem++, ((Action)node.getUserObject()).getValue("toolbar"));
+                    }
+                } else if (e.getActionCommand().equals(">") && selectedList.getSelectedIndex() != -1) {
+                    while (selectedList.getSelectedIndex() != -1) {
+                        selected.remove(selectedList.getSelectedIndex());
+                    }
+                } else if (e.getActionCommand().equals("up")) {
+                    int i = selectedList.getSelectedIndex();
+                    Object o = selected.get(i);
+                    if (i != 0) {
+                        selected.remove(i);
+                        selected.add(i-1, o);
+                        selectedList.setSelectedIndex(i-1);
+                    }
+                } else if (e.getActionCommand().equals("down")) {
+                    int i = selectedList.getSelectedIndex();
+                    Object o = selected.get(i);
+                    if (i != selected.size()-1) {
+                        selected.remove(i);
+                        selected.add(i+1, o);
+                        selectedList.setSelectedIndex(i+1);
+                    }
+                }
+            }
+        }
+
+        private static class ActionTransferable implements Transferable {
+
+            private DataFlavor[] flavors = new DataFlavor[] { ACTION_FLAVOR };
+
+            private Object[] actions;
+
+            public ActionTransferable(Action action) {
+                this.actions = new Action[] { action };
+            }
+
+            public ActionTransferable(Object[] actions) {
+                this.actions = actions;
+            }
+
+            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+                return actions;
+            }
+
+            public DataFlavor[] getTransferDataFlavors() {
+                return flavors;
+            }
+
+            public boolean isDataFlavorSupported(DataFlavor flavor) {
+                return flavors[0] == flavor;
+            }
+        }
+
+        private final Move moveAction = new Move();
+
+        private final DefaultListModel selected = new DefaultListModel();
+        private final JList selectedList = new JList(selected);
+
+        private final DefaultTreeModel actionsTreeModel;
+        private final JTree actionsTree;
+
+        private JButton upButton;
+        private JButton downButton;
+
+        private String movingComponent;
+
+        public Settings(DefaultMutableTreeNode rootActionsNode) {
+            actionsTreeModel = new DefaultTreeModel(rootActionsNode);
+            actionsTree = new JTree(actionsTreeModel);
+        }
+
+        private JButton createButton(String name) {
+            JButton b = new JButton();
+            if (name.equals("up"))
+                b.setIcon(ImageProvider.get("dialogs", "up"));
+            else if (name.equals("down"))
+                b.setIcon(ImageProvider.get("dialogs", "down"));
+            else
+                b.setText(name);
+            b.addActionListener(moveAction);
+            b.setActionCommand(name);
+            return b;
+        }
+
+        public void addGui(PreferenceDialog gui) {
+            actionsTree.setCellRenderer(new DefaultTreeCellRenderer() {
+                @Override
+                public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
+                        boolean leaf, int row, boolean hasFocus) {
+                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
+                    JLabel comp = (JLabel) super.getTreeCellRendererComponent(
+                            tree, value, sel, expanded, leaf, row, hasFocus);
+                    if (node.getUserObject() == null) {
+                        comp.setText(tr("Separator"));
+                        comp.setIcon(ImageProvider.get("preferences/separator"));
+                    }
+                    else if (node.getUserObject() instanceof Action) {
+                        Action action = (Action) node.getUserObject();
+                        comp.setText((String) action.getValue(Action.NAME));
+                        comp.setIcon((Icon) action.getValue(Action.SMALL_ICON));
+                    }
+                    return comp;
+                }
+            });
+
+            ListCellRenderer renderer = new DefaultListCellRenderer(){
+                @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+                    String s;
+                    Icon i;
+                    if (value != null) {
+                        Action action = Main.toolbar.getAction((String)value);
+                        s = (String) action.getValue(Action.NAME);
+                        i = (Icon) action.getValue(Action.SMALL_ICON);
+                    } else {
+                        i = ImageProvider.get("preferences/separator");
+                        s = tr("Separator");
+                    }
+                    JLabel l = (JLabel)super.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
+                    l.setIcon(i);
+                    return l;
+                }
+            };
+            selectedList.setCellRenderer(renderer);
+            selectedList.addListSelectionListener(new ListSelectionListener(){
+                public void valueChanged(ListSelectionEvent e) {
+                    boolean sel = selectedList.getSelectedIndex() != -1;
+                    if (sel)
+                        actionsTree.clearSelection();
+                    upButton.setEnabled(sel);
+                    downButton.setEnabled(sel);
+                }
+            });
+
+            selectedList.setDragEnabled(true);
+            selectedList.setTransferHandler(new TransferHandler() {
+                @Override
+                protected Transferable createTransferable(JComponent c) {
+                    return new ActionTransferable(((JList)c).getSelectedValues());
+                }
+
+                @Override
+                public int getSourceActions(JComponent c) {
+                    return TransferHandler.MOVE;
+                }
+
+                @Override
+                public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
+                    for (DataFlavor f : transferFlavors) {
+                        if (ACTION_FLAVOR.equals(f)) {
+                            return true;
+                        }
+                    }
+                    return false;
+                }
+
+                @Override
+                public void exportAsDrag(JComponent comp, InputEvent e, int action) {
+                    super.exportAsDrag(comp, e, action);
+                    movingComponent = "list";
+                }
+
+                @Override
+                public boolean importData(JComponent comp, Transferable t) {
+                    try {
+                        int dropIndex = selectedList.locationToIndex(selectedList.getMousePosition(true));
+                        Object[] draggedData = (Object[]) t.getTransferData(ACTION_FLAVOR);
+
+                        Object leadItem = dropIndex >= 0 ? selected.elementAt(dropIndex) : null;
+                        int dataLength = draggedData.length;
+
+                        if (leadItem != null)
+                            for (int i = 0; i < dataLength; i++)
+                                if (leadItem.equals(draggedData[i]))
+                                    return false;
+
+                        int dragLeadIndex = -1;
+                        boolean localDrop = "list".equals(movingComponent);
+
+                        if (localDrop) {
+                            dragLeadIndex = selected.indexOf(draggedData[0]);
+                            for (int i = 0; i < dataLength; i++)
+                                selected.removeElement(draggedData[i]);
+                        }
+                        int[] indices = new int[dataLength];
+
+                        if (localDrop) {
+                            int adjustedLeadIndex = selected.indexOf(leadItem);
+                            int insertionAdjustment = dragLeadIndex <= adjustedLeadIndex ? 1 : 0;
+                            for (int i = 0; i < dataLength; i++) {
+                                selected.insertElementAt(draggedData[i], adjustedLeadIndex + insertionAdjustment + i);
+                                indices[i] = adjustedLeadIndex + insertionAdjustment + i;
+                            }
+                        } else {
+                            for (int i = 0; i < dataLength; i++) {
+                                selected.add(dropIndex, draggedData[i]);
+                                indices[i] = dropIndex + i;
+                            }
+                        }
+                        selectedList.clearSelection();
+                        selectedList.setSelectedIndices(indices);
+                        movingComponent = "";
+                        return true;
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    return false;
+                }
+
+                @Override
+                protected void exportDone(JComponent source, Transferable data, int action) {
+                    if (movingComponent.equals("list")) {
+                        try {
+                            Object[] draggedData = (Object[]) data.getTransferData(ACTION_FLAVOR);
+                            boolean localDrop = selected.contains(draggedData[0]);
+                            if (localDrop) {
+                                int[] indices = selectedList.getSelectedIndices();
+                                Arrays.sort(indices);
+                                for (int i = indices.length - 1; i >= 0; i--) {
+                                    selected.remove(indices[i]);
+                                }
+                            }
+                        } catch (Exception e) {
+                            e.printStackTrace();
+                        }
+                        movingComponent = "";
+                    }
+                }
+            });
+
+            actionsTree.setTransferHandler(new TransferHandler() {
+                private static final long serialVersionUID = 1L;
+
+                @Override
+                public int getSourceActions( JComponent c ){
+                    return TransferHandler.MOVE;
+                }
+
+                @Override
+                protected void exportDone(JComponent source, Transferable data, int action) {
+                }
+
+                @Override
+                protected Transferable createTransferable(JComponent c) {
+                    TreePath[] paths = actionsTree.getSelectionPaths();
+                    List<String> dragActions = new LinkedList<String>();
+                    for (TreePath path : paths) {
+                        DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
+                        Object obj = node.getUserObject();
+                        if (obj == null) {
+                            dragActions.add(null);
+                        }
+                        else if (obj instanceof Action) {
+                            dragActions.add((String) ((Action) obj).getValue("toolbar"));
+                        }
+                    }
+                    return new ActionTransferable(dragActions.toArray());
+                }
+            });
+            actionsTree.setDragEnabled(true);
+
+            final JPanel left = new JPanel(new GridBagLayout());
+            left.add(new JLabel(tr("Toolbar")), GBC.eol());
+            left.add(new JScrollPane(selectedList), GBC.std().fill(GBC.BOTH));
+
+            final JPanel right = new JPanel(new GridBagLayout());
+            right.add(new JLabel(tr("Available")), GBC.eol());
+            right.add(new JScrollPane(actionsTree), GBC.eol().fill(GBC.BOTH));
+
+            final JPanel buttons = new JPanel(new GridLayout(6,1));
+            buttons.add(upButton = createButton("up"));
+            buttons.add(createButton("<"));
+            buttons.add(createButton(">"));
+            buttons.add(downButton = createButton("down"));
+            upButton.setEnabled(false);
+            downButton.setEnabled(false);
+
+            final JPanel p = new JPanel();
+            p.setLayout(new LayoutManager(){
+                public void addLayoutComponent(String name, Component comp) {}
+                public void removeLayoutComponent(Component comp) {}
+                public Dimension minimumLayoutSize(Container parent) {
+                    Dimension l = left.getMinimumSize();
+                    Dimension r = right.getMinimumSize();
+                    Dimension b = buttons.getMinimumSize();
+                    return new Dimension(l.width+b.width+10+r.width,l.height+b.height+10+r.height);
+                }
+                public Dimension preferredLayoutSize(Container parent) {
+                    Dimension l = new Dimension(200, 200); //left.getPreferredSize();
+                    Dimension r = new Dimension(200, 200); //right.getPreferredSize();
+                    return new Dimension(l.width+r.width+10+buttons.getPreferredSize().width,Math.max(l.height, r.height));
+                }
+                public void layoutContainer(Container parent) {
+                    Dimension d = p.getSize();
+                    Dimension b = buttons.getPreferredSize();
+                    int width = (d.width-10-b.width)/2;
+                    left.setBounds(new Rectangle(0,0,width,d.height));
+                    right.setBounds(new Rectangle(width+10+b.width,0,width,d.height));
+                    buttons.setBounds(new Rectangle(width+5, d.height/2-b.height/2, b.width, b.height));
+                }
+            });
+            p.add(left);
+            p.add(buttons);
+            p.add(right);
+
+            JPanel panel = gui.createPreferenceTab("toolbar", tr("Toolbar customization"),
+                    tr("Customize the elements on the toolbar."), false);
+            panel.add(p, GBC.eol().fill(GBC.BOTH));
+
+            selected.removeAllElements();
+            for (String s : getToolString()) {
+                if (s.equals("|"))
+                    selected.addElement(null);
+                else if (Main.toolbar.getAction(s) != null)
+                    selected.addElement(s);
+            }
+        }
+
+        public boolean ok() {
+            Collection<String> t = new LinkedList<String>();
+            for (int i = 0; i < selected.size(); ++i) {
+                if (selected.get(i) == null)
+                    t.add("|");
+                else
+                    t.add((String)((Main.toolbar.getAction((String)selected.get(i))).getValue("toolbar")));
+            }
+            Main.pref.putCollection("toolbar", t);
+            Main.toolbar.refreshToolbarControl();
+            return false;
+        }
+
+    }
 
     public ToolbarPreferences() {
         control.setFloatable(false);
-
-        actionsTree.setCellRenderer(new DefaultTreeCellRenderer() {
-            @Override
-            public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
-                    boolean leaf, int row, boolean hasFocus) {
-                DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
-                JLabel comp = (JLabel) super.getTreeCellRendererComponent(
-                        tree, value, sel, expanded, leaf, row, hasFocus);
-                if (node.getUserObject() == null) {
-                    comp.setText(tr("Separator"));
-                    comp.setIcon(ImageProvider.get("preferences/separator"));
-                }
-                else if (node.getUserObject() instanceof Action) {
-                    Action action = (Action) node.getUserObject();
-                    comp.setText((String) action.getValue(Action.NAME));
-                    comp.setIcon((Icon) action.getValue(Action.SMALL_ICON));
-                }
-                return comp;
-            }
-        });
-
-        ListCellRenderer renderer = new DefaultListCellRenderer(){
-            @Override public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
-                String s;
-                Icon i;
-                if (value != null) {
-                    Action action = getAction((String)value);
-                    s = (String) action.getValue(Action.NAME);
-                    i = (Icon) action.getValue(Action.SMALL_ICON);
-                } else {
-                    i = ImageProvider.get("preferences/separator");
-                    s = tr("Separator");
-                }
-                JLabel l = (JLabel)super.getListCellRendererComponent(list, s, index, isSelected, cellHasFocus);
-                l.setIcon(i);
-                return l;
-            }
-        };
-        selectedList.setCellRenderer(renderer);
-        selectedList.addListSelectionListener(new ListSelectionListener(){
-            public void valueChanged(ListSelectionEvent e) {
-                boolean sel = selectedList.getSelectedIndex() != -1;
-                if (sel)
-                    actionsTree.clearSelection();
-                upButton.setEnabled(sel);
-                downButton.setEnabled(sel);
-            }
-        });
-
-        selectedList.setDragEnabled(true);
-        selectedList.setTransferHandler(new TransferHandler() {
-            @Override
-            protected Transferable createTransferable(JComponent c) {
-                return new ActionTransferable(((JList)c).getSelectedValues());
-            }
-
-            @Override
-            public int getSourceActions(JComponent c) {
-                return TransferHandler.MOVE;
-            }
-
-            @Override
-            public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
-                for (DataFlavor f : transferFlavors) {
-                    if (ACTION_FLAVOR.equals(f)) {
-                        return true;
-                    }
-                }
-                return false;
-            }
-
-            @Override
-            public void exportAsDrag(JComponent comp, InputEvent e, int action) {
-                super.exportAsDrag(comp, e, action);
-                movingComponent = "list";
-            }
-
-            @Override
-            public boolean importData(JComponent comp, Transferable t) {
-                try {
-                    int dropIndex = selectedList.locationToIndex(selectedList.getMousePosition(true));
-                    Object[] draggedData = (Object[]) t.getTransferData(ACTION_FLAVOR);
-
-                    Object leadItem = dropIndex >= 0 ? selected.elementAt(dropIndex) : null;
-                    int dataLength = draggedData.length;
-
-                    if (leadItem != null)
-                        for (int i = 0; i < dataLength; i++)
-                            if (leadItem.equals(draggedData[i]))
-                                return false;
-
-                    int dragLeadIndex = -1;
-                    boolean localDrop = "list".equals(movingComponent);
-
-                    if (localDrop) {
-                        dragLeadIndex = selected.indexOf(draggedData[0]);
-                        for (int i = 0; i < dataLength; i++)
-                            selected.removeElement(draggedData[i]);
-                    }
-                    int[] indices = new int[dataLength];
-
-                    if (localDrop) {
-                        int adjustedLeadIndex = selected.indexOf(leadItem);
-                        int insertionAdjustment = dragLeadIndex <= adjustedLeadIndex ? 1 : 0;
-                        for (int i = 0; i < dataLength; i++) {
-                            selected.insertElementAt(draggedData[i], adjustedLeadIndex + insertionAdjustment + i);
-                            indices[i] = adjustedLeadIndex + insertionAdjustment + i;
-                        }
-                    } else {
-                        for (int i = 0; i < dataLength; i++) {
-                            selected.add(dropIndex, draggedData[i]);
-                            indices[i] = dropIndex + i;
-                        }
-                    }
-                    selectedList.clearSelection();
-                    selectedList.setSelectedIndices(indices);
-                    movingComponent = "";
-                    return true;
-                } catch (Exception e) {
-                    e.printStackTrace();
-                }
-                return false;
-            }
-
-            @Override
-            protected void exportDone(JComponent source, Transferable data, int action) {
-                if (movingComponent.equals("list")) {
-                    try {
-                        Object[] draggedData = (Object[]) data.getTransferData(ACTION_FLAVOR);
-                        boolean localDrop = selected.contains(draggedData[0]);
-                        if (localDrop) {
-                            int[] indices = selectedList.getSelectedIndices();
-                            Arrays.sort(indices);
-                            for (int i = indices.length - 1; i >= 0; i--) {
-                                selected.remove(indices[i]);
-                            }
-                        }
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                    movingComponent = "";
-                }
-            }
-        });
-
-        actionsTree.setTransferHandler(new TransferHandler() {
-            private static final long serialVersionUID = 1L;
-
-            @Override
-            public int getSourceActions( JComponent c ){
-                return TransferHandler.MOVE;
-            }
-
-            @Override
-            protected void exportDone(JComponent source, Transferable data, int action) {
-            }
-
-            @Override
-            protected Transferable createTransferable(JComponent c) {
-                TreePath[] paths = actionsTree.getSelectionPaths();
-                List<String> dragActions = new LinkedList<String>();
-                for (TreePath path : paths) {
-                    DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
-                    Object obj = node.getUserObject();
-                    if (obj == null) {
-                        dragActions.add(null);
-                    }
-                    else if (obj instanceof Action) {
-                        dragActions.add((String) ((Action) obj).getValue("toolbar"));
-                    }
-                }
-                return new ActionTransferable(dragActions.toArray());
-            }
-        });
-        actionsTree.setDragEnabled(true);
-    }
-
-    public void addGui(PreferenceDialog gui) {
-        final JPanel left = new JPanel(new GridBagLayout());
-        left.add(new JLabel(tr("Toolbar")), GBC.eol());
-        left.add(new JScrollPane(selectedList), GBC.std().fill(GBC.BOTH));
-
-        final JPanel right = new JPanel(new GridBagLayout());
-        right.add(new JLabel(tr("Available")), GBC.eol());
-        right.add(new JScrollPane(actionsTree), GBC.eol().fill(GBC.BOTH));
-
-        final JPanel buttons = new JPanel(new GridLayout(6,1));
-        buttons.add(upButton = createButton("up"));
-        buttons.add(createButton("<"));
-        buttons.add(createButton(">"));
-        buttons.add(downButton = createButton("down"));
-        upButton.setEnabled(false);
-        downButton.setEnabled(false);
-
-        final JPanel p = new JPanel();
-        p.setLayout(new LayoutManager(){
-            public void addLayoutComponent(String name, Component comp) {}
-            public void removeLayoutComponent(Component comp) {}
-            public Dimension minimumLayoutSize(Container parent) {
-                Dimension l = left.getMinimumSize();
-                Dimension r = right.getMinimumSize();
-                Dimension b = buttons.getMinimumSize();
-                return new Dimension(l.width+b.width+10+r.width,l.height+b.height+10+r.height);
-            }
-            public Dimension preferredLayoutSize(Container parent) {
-                Dimension l = new Dimension(200, 200); //left.getPreferredSize();
-                Dimension r = new Dimension(200, 200); //right.getPreferredSize();
-                return new Dimension(l.width+r.width+10+buttons.getPreferredSize().width,Math.max(l.height, r.height));
-            }
-            public void layoutContainer(Container parent) {
-                Dimension d = p.getSize();
-                Dimension b = buttons.getPreferredSize();
-                int width = (d.width-10-b.width)/2;
-                left.setBounds(new Rectangle(0,0,width,d.height));
-                right.setBounds(new Rectangle(width+10+b.width,0,width,d.height));
-                buttons.setBounds(new Rectangle(width+5, d.height/2-b.height/2, b.width, b.height));
-            }
-        });
-        p.add(left);
-        p.add(buttons);
-        p.add(right);
-
-        JPanel panel = gui.createPreferenceTab("toolbar", tr("Toolbar customization"),
-                tr("Customize the elements on the toolbar."), false);
-        panel.add(p, GBC.eol().fill(GBC.BOTH));
-
-        selected.removeAllElements();
-        for (String s : getToolString()) {
-            if (s.equals("|"))
-                selected.addElement(null);
-            else if (getAction(s) != null)
-                selected.addElement(s);
-        }
-    }
+    }
+
 
     private void loadAction(DefaultMutableTreeNode node, MenuElement menu) {
@@ -396,7 +465,4 @@
         }
         rootActionsNode.add(new DefaultMutableTreeNode(null));
-        actionsTree.updateUI();
-        actionsTree.setRootVisible(false);
-        actionsTree.expandPath(new TreePath(rootActionsNode));
     }
 
@@ -404,32 +470,6 @@
     "download", "upload", "|", "undo", "redo", "|", "preference"};
 
-    private Collection<String> getToolString() {
+    private static Collection<String> getToolString() {
         return Main.pref.getCollection("toolbar", Arrays.asList(deftoolbar));
-    }
-
-    private JButton createButton(String name) {
-        JButton b = new JButton();
-        if (name.equals("up"))
-            b.setIcon(ImageProvider.get("dialogs", "up"));
-        else if (name.equals("down"))
-            b.setIcon(ImageProvider.get("dialogs", "down"));
-        else
-            b.setText(name);
-        b.addActionListener(moveAction);
-        b.setActionCommand(name);
-        return b;
-    }
-
-    public boolean ok() {
-        Collection<String> t = new LinkedList<String>();
-        for (int i = 0; i < selected.size(); ++i) {
-            if (selected.get(i) == null)
-                t.add("|");
-            else
-                t.add((String)((getAction((String)selected.get(i))).getValue("toolbar")));
-        }
-        Main.pref.putCollection("toolbar", t);
-        refreshToolbarControl();
-        return false;
     }
 
@@ -463,29 +503,3 @@
             AbstractAction.class, "ActionItem");
 
-    private class ActionTransferable implements Transferable {
-
-        private DataFlavor[] flavors = new DataFlavor[] { ACTION_FLAVOR };
-
-        private Object[] actions;
-
-        public ActionTransferable(Action action) {
-            this.actions = new Action[] { action };
-        }
-
-        public ActionTransferable(Object[] actions) {
-            this.actions = actions;
-        }
-
-        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
-            return actions;
-        }
-
-        public DataFlavor[] getTransferDataFlavors() {
-            return flavors;
-        }
-
-        public boolean isDataFlavorSupported(DataFlavor flavor) {
-            return flavors[0] == flavor;
-        }
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/prefJPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/prefJPanel.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/prefJPanel.java	(revision 1742)
@@ -86,9 +86,9 @@
                 String s = KeyEvent.getKeyText(i);
                 if (s != null && s.length() > 0 && !s.contains("Unknown")) {
-                    list.put(new Integer(i), s);
+                    list.put(Integer.valueOf(i), s);
                     //System.out.println(i+": "+s);
                 }
             }
-            list.put(new Integer(-1), "");
+            list.put(Integer.valueOf(-1), "");
             return list;
         }
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 1741)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 1742)
@@ -9,12 +9,12 @@
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.SortedMap;
 import java.util.TreeMap;
+import java.util.Map.Entry;
 
 import javax.swing.AbstractAction;
@@ -31,8 +31,8 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AboutAction;
+import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.download.DownloadSelection;
-import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -176,10 +176,8 @@
             p.addDownloadSelection(downloadSelections);
     }
-    public static void getPreferenceSetting(Collection<PreferenceSetting> settings)
+    public static void getPreferenceSetting(Collection<PreferenceSettingFactory> settings)
     {
         for (PluginProxy plugin : pluginList) {
-            PreferenceSetting p = plugin.getPreferenceSetting();
-            if (p != null)
-                settings.add(p);
+            settings.add(new PluginPreferenceFactory(plugin));
         }
     }
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginPreferenceFactory.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginPreferenceFactory.java	(revision 1742)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginPreferenceFactory.java	(revision 1742)
@@ -0,0 +1,19 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins;
+
+import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
+import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
+
+public class PluginPreferenceFactory implements PreferenceSettingFactory {
+
+    private final PluginProxy plugin;
+
+    public PluginPreferenceFactory(PluginProxy plugin) {
+        this.plugin = plugin;
+    }
+
+    public PreferenceSetting createPreferenceSetting() {
+        return plugin.getPreferenceSetting();
+    }
+
+}
