Index: src/org/openstreetmap/josm/actions/PreferencesAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/PreferencesAction.java   (revision 1741)
+++ src/org/openstreetmap/josm/actions/PreferencesAction.java   (working copy)
@@ -78,5 +78,6 @@
         dlg.setVisible(true);
         if (pane.getValue() instanceof Integer && (Integer)pane.getValue() == JOptionPane.OK_OPTION)
             prefDlg.ok();
+        dlg.dispose();
     }
 }
Index: src/org/openstreetmap/josm/gui/preferences/prefJPanel.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/prefJPanel.java  (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/prefJPanel.java  (working copy)
@@ -85,11 +85,11 @@
             for (int i = 0; i < 65534; i++) {
                 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: src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java  (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java  (working copy)
@@ -53,48 +53,7 @@
 import org.openstreetmap.josm.tools.GBC;
 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 {
 
     /**
      * Key: Registered name (property "toolbar" of action).
@@ -103,257 +62,367 @@
     private Map<String, Action> actions = new HashMap<String, Action>();
     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 ToolbarPreferences() {
-        control.setFloatable(false);
+    public static class Settings implements PreferenceSetting {
 
-        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;
-            }
-        });
+        private final class Move implements ActionListener {
+            public void actionPerformed(ActionEvent e) {
+                if (e.getActionCommand().equals("<") && actionsTree.getSelectionCount() > 0) {
 
-        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");
+                    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);
+                    }
                 }
-                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);
+        }
+
+        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 };
             }
-        });
 
-        selectedList.setDragEnabled(true);
-        selectedList.setTransferHandler(new TransferHandler() {
-            @Override
-            protected Transferable createTransferable(JComponent c) {
-                return new ActionTransferable(((JList)c).getSelectedValues());
+            public ActionTransferable(Object[] actions) {
+                this.actions = actions;
             }
 
-            @Override
-            public int getSourceActions(JComponent c) {
-                return TransferHandler.MOVE;
+            public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+                return actions;
             }
 
-            @Override
-            public boolean canImport(JComponent comp, DataFlavor[] transferFlavors) {
-                for (DataFlavor f : transferFlavors) {
-                    if (ACTION_FLAVOR.equals(f)) {
-                        return true;
-                    }
-                }
-                return false;
+            public DataFlavor[] getTransferDataFlavors() {
+                return flavors;
             }
 
-            @Override
-            public void exportAsDrag(JComponent comp, InputEvent e, int action) {
-                super.exportAsDrag(comp, e, action);
-                movingComponent = "list";
+            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;
 
-            @Override
-            public boolean importData(JComponent comp, Transferable t) {
-                try {
-                    int dropIndex = selectedList.locationToIndex(selectedList.getMousePosition(true));
-                    Object[] draggedData = (Object[]) t.getTransferData(ACTION_FLAVOR);
+        private JButton upButton;
+        private JButton downButton;
 
-                    Object leadItem = dropIndex >= 0 ? selected.elementAt(dropIndex) : null;
-                    int dataLength = draggedData.length;
+        private String movingComponent;
 
-                    if (leadItem != null)
-                        for (int i = 0; i < dataLength; i++)
-                            if (leadItem.equals(draggedData[i]))
-                                return false;
+        public Settings(DefaultMutableTreeNode rootActionsNode) {
+            actionsTreeModel = new DefaultTreeModel(rootActionsNode);
+            actionsTree = new JTree(actionsTreeModel);
+        }
 
-                    int dragLeadIndex = -1;
-                    boolean localDrop = "list".equals(movingComponent);
+        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;
+        }
 
-                    if (localDrop) {
-                        dragLeadIndex = selected.indexOf(draggedData[0]);
-                        for (int i = 0; i < dataLength; i++)
-                            selected.removeElement(draggedData[i]);
+        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"));
                     }
-                    int[] indices = new int[dataLength];
+                    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;
+                }
+            });
 
-                    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;
-                        }
+            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 {
-                        for (int i = 0; i < dataLength; i++) {
-                            selected.add(dropIndex, draggedData[i]);
-                            indices[i] = dropIndex + i;
+                        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;
                         }
                     }
-                    selectedList.clearSelection();
-                    selectedList.setSelectedIndices(indices);
-                    movingComponent = "";
-                    return true;
-                } catch (Exception e) {
-                    e.printStackTrace();
+                    return false;
                 }
-                return false;
-            }
+
+                @Override
+                public void exportAsDrag(JComponent comp, InputEvent e, int action) {
+                    super.exportAsDrag(comp, e, action);
+                    movingComponent = "list";
+                }
 
-            @Override
-            protected void exportDone(JComponent source, Transferable data, int action) {
-                if (movingComponent.equals("list")) {
+                @Override
+                public boolean importData(JComponent comp, Transferable t) {
                     try {
-                        Object[] draggedData = (Object[]) data.getTransferData(ACTION_FLAVOR);
-                        boolean localDrop = selected.contains(draggedData[0]);
+                        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[] indices = selectedList.getSelectedIndices();
-                            Arrays.sort(indices);
-                            for (int i = indices.length - 1; i >= 0; i--) {
-                                selected.remove(indices[i]);
+                            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();
                     }
-                    movingComponent = "";
+                    return false;
                 }
-            }
-        });
 
-        actionsTree.setTransferHandler(new TransferHandler() {
-            private static final long serialVersionUID = 1L;
+                @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 = "";
+                    }
+                }
+            });
 
-            @Override
-            public int getSourceActions( JComponent c ){
-                return TransferHandler.MOVE;
-            }
+            actionsTree.setTransferHandler(new TransferHandler() {
+                private static final long serialVersionUID = 1L;
 
-            @Override
-            protected void exportDone(JComponent source, Transferable data, int action) {
-            }
+                @Override
+                public int getSourceActions( JComponent c ){
+                    return TransferHandler.MOVE;
+                }
 
-            @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"));
+                @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());
                 }
-                return new ActionTransferable(dragActions.toArray());
-            }
-        });
-        actionsTree.setDragEnabled(true);
-    }
+            });
+            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 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 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 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));
+            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 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));
+        }
+
+        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")));
             }
-        });
-        p.add(left);
-        p.add(buttons);
-        p.add(right);
+            Main.pref.putCollection("toolbar", t);
+            Main.toolbar.refreshToolbarControl();
+            return false;
+        }
 
-        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);
-        }
+    public ToolbarPreferences() {
+        control.setFloatable(false);
     }
 
+
     private void loadAction(DefaultMutableTreeNode node, MenuElement menu) {
         Object userObject = null;
         MenuElement menuElement = menu;
@@ -395,44 +464,15 @@
                 rootActionsNode.add(new DefaultMutableTreeNode(a.getValue()));
         }
         rootActionsNode.add(new DefaultMutableTreeNode(null));
-        actionsTree.updateUI();
-        actionsTree.setRootVisible(false);
-        actionsTree.expandPath(new TreePath(rootActionsNode));
     }
 
     private static final String[] deftoolbar = {"open", "save", "exportgpx", "|",
     "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;
-    }
-
     /**
      * @return The parameter (for better chaining)
      */
@@ -462,30 +502,4 @@
     private static DataFlavor ACTION_FLAVOR = new DataFlavor(
             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: src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java  (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/AdvancedPreference.java  (working copy)
@@ -33,6 +33,12 @@
 
 public class AdvancedPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new AdvancedPreference();
+        }
+    }
+
     private Map<String,String> orig;
     private Map<String,String> defaults;
     private DefaultTableModel model;
Index: src/org/openstreetmap/josm/gui/preferences/LafPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/LafPreference.java   (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/LafPreference.java   (working copy)
@@ -24,6 +24,12 @@
 
 public class LafPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new LafPreference();
+        }
+    }
+
     /**
      * ComboBox with all look and feels.
      */
Index: src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java    (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java    (working copy)
@@ -6,9 +6,11 @@
 import java.awt.Font;
 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;
 import javax.swing.JComponent;
@@ -32,7 +34,8 @@
  */
 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
     public final JPanel display = createPreferenceTab("display", tr("Display Settings"), tr("Various settings that influence the visual representation of the whole program."));
@@ -40,7 +43,7 @@
     public final JPanel map = createPreferenceTab("map", I18n.tr("Map Settings"), I18n.tr("Settings for the map projection and data interpretation."));
     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();
 
     /**
      * Construct a JPanel for the preference settings. Layout is GridBagLayout
@@ -104,6 +107,15 @@
      */
     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();) {
             try {
@@ -117,26 +129,40 @@
         }
     }
 
+    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: src/org/openstreetmap/josm/gui/preferences/ColorPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ColorPreference.java (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/ColorPreference.java (working copy)
@@ -9,15 +9,16 @@
 import java.awt.GridBagLayout;
 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;
 import javax.swing.JColorChooser;
@@ -30,18 +31,24 @@
 import javax.swing.event.ListSelectionEvent;
 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;
     private JTable colors;
     private ArrayList<String> del = new ArrayList<String>();
Index: src/org/openstreetmap/josm/gui/preferences/AudioPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/AudioPreference.java (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/AudioPreference.java (working copy)
@@ -23,6 +23,13 @@
  */
 
 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."));
     private JCheckBox markerAudioTraceVisible = new JCheckBox(tr("Display live audio trace."));
Index: src/org/openstreetmap/josm/gui/preferences/PreferenceSettingFactory.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/PreferenceSettingFactory.java    (revision 0)
+++ src/org/openstreetmap/josm/gui/preferences/PreferenceSettingFactory.java    (revision 0)
@@ -0,0 +1,8 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+public interface PreferenceSettingFactory {
+
+    PreferenceSetting createPreferenceSetting();
+
+}

Property changes on: src/org/openstreetmap/josm/gui/preferences/PreferenceSettingFactory.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: src/org/openstreetmap/josm/gui/preferences/PluginPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/PluginPreference.java    (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/PluginPreference.java    (working copy)
@@ -27,6 +27,12 @@
 
 public class PluginPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new PluginPreference();
+        }
+    }
+
     private JPanel plugin;
     private JPanel pluginPanel = new NoHorizontalScrollPanel(new GridBagLayout());
     private PreferenceDialog gui;
@@ -116,7 +122,7 @@
         return selection.finish();
     }
 
-    class NoHorizontalScrollPanel extends JPanel implements Scrollable {
+    private static class NoHorizontalScrollPanel extends JPanel implements Scrollable {
         public NoHorizontalScrollPanel(GridBagLayout gridBagLayout) {
             super(gridBagLayout);
         }
Index: src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java  (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/ServerAccessPreference.java  (working copy)
@@ -14,6 +14,12 @@
 
 public class ServerAccessPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new ServerAccessPreference();
+        }
+    }
+
     /**
      * Editfield for the Base url to the REST API from OSM.
      */
Index: src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java   (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java   (working copy)
@@ -4,20 +4,20 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
 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.JTextField;
 import javax.swing.JScrollPane;
-import javax.swing.JPanel;
-import javax.swing.Box;
+import javax.swing.JTextField;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
@@ -26,6 +26,12 @@
 
 public class DrawingPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new DrawingPreference();
+        }
+    }
+
     private ButtonGroup gpsLinesGroup;
     private JRadioButton drawRawGpsLinesAll = new JRadioButton(tr("All"));
     private JRadioButton drawRawGpsLinesLocal = new JRadioButton(tr("Local files"));
Index: src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java    (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java    (working copy)
@@ -12,14 +12,20 @@
 import javax.swing.JPanel;
 
 import org.openstreetmap.josm.Main;
-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.data.projection.Mercator;
+import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.tools.GBC;
 
 public class ProjectionPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new ProjectionPreference();
+        }
+    }
+
     /**
      * Combobox with all projections available
      */
Index: src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java  (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java  (working copy)
@@ -5,6 +5,12 @@
 
 public class MapPaintPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new MapPaintPreference();
+        }
+    }
+
     public void addGui(final PreferenceDialog gui) {
         // this is intended for a future configuration panel for mappaint!
     }
Index: src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java (working copy)
@@ -33,6 +33,12 @@
 
 public class TaggingPresetPreference implements PreferenceSetting {
 
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new TaggingPresetPreference();
+        }
+    }
+
     public static Collection<TaggingPreset> taggingPresets;
     private JList taggingPresetSources;
     private JCheckBox sortMenu;
Index: src/org/openstreetmap/josm/gui/preferences/FilePreferences.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/FilePreferences.java (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/FilePreferences.java (working copy)
@@ -18,6 +18,12 @@
  */
 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"));
 
     public void addGui(PreferenceDialog gui) {
Index: src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java  (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/LanguagePreference.java  (working copy)
@@ -19,6 +19,13 @@
 import org.openstreetmap.josm.tools.I18n;
 
 public class LanguagePreference implements PreferenceSetting {
+
+    public static class Factory implements PreferenceSettingFactory {
+        public PreferenceSetting createPreferenceSetting() {
+            return new LanguagePreference();
+        }
+    }
+
     /**
      * ComboBox with all available Translations
      */
@@ -53,12 +60,8 @@
             }
         });
 
-        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));
         panel.add(langCombo, GBC.eol().fill(GBC.HORIZONTAL));
Index: src/org/openstreetmap/josm/gui/preferences/ProxyPreferences.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ProxyPreferences.java    (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/ProxyPreferences.java    (working copy)
@@ -19,6 +19,12 @@
 
 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";
     public static final String PROXY_HOST = "proxy.host";
     public static final String PROXY_PORT = "proxy.port";
Index: src/org/openstreetmap/josm/gui/preferences/ShortcutPreference.java
===================================================================
--- src/org/openstreetmap/josm/gui/preferences/ShortcutPreference.java  (revision 1741)
+++ src/org/openstreetmap/josm/gui/preferences/ShortcutPreference.java  (working copy)
@@ -3,17 +3,22 @@
 
 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) {
         // icon source: http://www.iconfinder.net/index.php?q=key&page=icondetails&iconid=8553&size=128&q=key&s12=on&s16=on&s22=on&s32=on&s48=on&s64=on&s128=on
         // icon licence: GPL
@@ -34,7 +39,7 @@
     }
 
     // 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")};
         private Collection<Shortcut> data;
Index: src/org/openstreetmap/josm/plugins/PluginPreferenceFactory.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginPreferenceFactory.java (revision 0)
+++ src/org/openstreetmap/josm/plugins/PluginPreferenceFactory.java (revision 0)
@@ -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();
+    }
+
+}

Property changes on: src/org/openstreetmap/josm/plugins/PluginPreferenceFactory.java
___________________________________________________________________
Added: svn:mime-type
   + text/plain

Index: src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginHandler.java   (revision 1741)
+++ src/org/openstreetmap/josm/plugins/PluginHandler.java   (working copy)
@@ -8,14 +8,14 @@
 import java.awt.event.ActionEvent;
 import java.net.URL;
 import java.net.URLClassLoader;
-import java.util.Arrays;
 import java.util.ArrayList;
+import java.util.Arrays;
 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;
 import javax.swing.BorderFactory;
@@ -30,10 +30,10 @@
 
 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;
 
@@ -175,12 +175,10 @@
         for (PluginProxy p : pluginList)
             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));
         }
     }
 
