Index: /trunk/src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java	(revision 4838)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/MapPaintPreference.java	(revision 4839)
@@ -6,4 +6,5 @@
 
 import java.awt.GridBagLayout;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -28,4 +29,13 @@
     private JCheckBox enableIconDefault;
 
+    private static final List<SourceProvider> styleSourceProviders = new ArrayList<SourceProvider>();
+
+    public static final boolean registerSourceProvider(SourceProvider provider) {
+        if (provider != null) {
+            return styleSourceProviders.add(provider);
+        }
+        return false;
+    }
+    
     public static class Factory implements PreferenceSettingFactory {
         public PreferenceSetting createPreferenceSetting() {
@@ -67,5 +77,5 @@
 
         public MapPaintSourceEditor() {
-            super(true, "http://josm.openstreetmap.de/styles");
+            super(true, "http://josm.openstreetmap.de/styles", styleSourceProviders);
         }
 
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 4838)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 4839)
@@ -85,12 +85,14 @@
     final protected boolean isMapPaint;
 
-    protected JTable tblActiveSources;
-    protected ActiveSourcesModel activeSourcesModel;
-    protected JList lstAvailableSources;
-    protected AvailableSourcesListModel availableSourcesModel;
-    protected JTable tblIconPaths = null;
-    protected IconPathTableModel iconPathsModel;
+    protected final JTable tblActiveSources;
+    protected final ActiveSourcesModel activeSourcesModel;
+    protected final JList lstAvailableSources;
+    protected final AvailableSourcesListModel availableSourcesModel;
+    protected final JTable tblIconPaths;
+    protected final IconPathTableModel iconPathsModel;
+    protected final String availableSourcesUrl;
+    protected final List<SourceProvider> sourceProviders;
+
     protected boolean sourcesInitiallyLoaded;
-    protected String availableSourcesUrl;
 
     /**
@@ -99,13 +101,15 @@
      *  for TaggingPresetPreference subclass
      * @param availableSourcesUrl the URL to the list of available sources
+     * @param sourceProviders the list of additional source providers, from plugins
      */
-    public SourceEditor(final boolean isMapPaint, final String availableSourcesUrl) {
+    public SourceEditor(final boolean isMapPaint, final String availableSourcesUrl, final List<SourceProvider> sourceProviders) {
 
         this.isMapPaint = isMapPaint;
         DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
-        lstAvailableSources = new JList(availableSourcesModel = new AvailableSourcesListModel(selectionModel));
-        lstAvailableSources.setSelectionModel(selectionModel);
-        lstAvailableSources.setCellRenderer(new SourceEntryListCellRenderer());
+        this.lstAvailableSources = new JList(availableSourcesModel = new AvailableSourcesListModel(selectionModel));
+        this.lstAvailableSources.setSelectionModel(selectionModel);
+        this.lstAvailableSources.setCellRenderer(new SourceEntryListCellRenderer());
         this.availableSourcesUrl = availableSourcesUrl;
+        this.sourceProviders = sourceProviders;
 
         selectionModel = new DefaultListSelectionModel();
@@ -263,5 +267,5 @@
         bottomLeftTB.setBorderPainted(false);
         bottomLeftTB.setOpaque(false);
-        bottomLeftTB.add(new ReloadSourcesAction(availableSourcesUrl));
+        bottomLeftTB.add(new ReloadSourcesAction(availableSourcesUrl, sourceProviders));
         bottomLeftTB.add(Box.createHorizontalGlue());
         add(bottomLeftTB, gbc);
@@ -412,11 +416,11 @@
     }
 
-    protected void reloadAvailableSources(String url) {
-        Main.worker.submit(new SourceLoader(url));
+    protected void reloadAvailableSources(String url, List<SourceProvider> sourceProviders) {
+        Main.worker.submit(new SourceLoader(url, sourceProviders));
     }
 
     public void initiallyLoadAvailableSources() {
         if (!sourcesInitiallyLoaded) {
-            reloadAvailableSources(this.availableSourcesUrl);
+            reloadAvailableSources(availableSourcesUrl, sourceProviders);
         }
         sourcesInitiallyLoaded = true;
@@ -907,15 +911,17 @@
 
     class ReloadSourcesAction extends AbstractAction {
-        private String url;
-        public ReloadSourcesAction(String url) {
+        private final String url;
+        private final List<SourceProvider> sourceProviders;
+        public ReloadSourcesAction(String url, List<SourceProvider> sourceProviders) {
             putValue(NAME, tr("Reload"));
             putValue(SHORT_DESCRIPTION, tr(getStr(I18nString.RELOAD_ALL_AVAILABLE), url));
             putValue(SMALL_ICON, ImageProvider.get("dialogs", "refresh"));
             this.url = url;
+            this.sourceProviders = sourceProviders;
         }
 
         public void actionPerformed(ActionEvent e) {
             MirroredInputStream.cleanup(url);
-            reloadAvailableSources(url);
+            reloadAvailableSources(url, sourceProviders);
         }
     }
@@ -1096,12 +1102,14 @@
 
     class SourceLoader extends PleaseWaitRunnable {
-        private String url;
+        private final String url;
+        private final List<SourceProvider> sourceProviders;
         private BufferedReader reader;
         private boolean canceled;
         private final List<ExtendedSourceEntry> sources = new ArrayList<ExtendedSourceEntry>();
 
-        public SourceLoader(String url) {
+        public SourceLoader(String url, List<SourceProvider> sourceProviders) {
             super(tr(getStr(I18nString.LOADING_SOURCES_FROM), url));
             this.url = url;
+            this.sourceProviders = sourceProviders;
         }
 
@@ -1138,4 +1146,13 @@
             try {
                 sources.addAll(getDefault());
+                
+                for (SourceProvider provider : sourceProviders) {
+                    for (SourceEntry src : provider.getSources()) {
+                        if (src instanceof ExtendedSourceEntry) {
+                            sources.add((ExtendedSourceEntry) src);
+                        }
+                    }
+                }
+                
                 MirroredInputStream stream = new MirroredInputStream(url);
                 InputStreamReader r;
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/SourceProvider.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/SourceProvider.java	(revision 4839)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/SourceProvider.java	(revision 4839)
@@ -0,0 +1,9 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+import java.util.Collection;
+
+public interface SourceProvider {
+
+    public Collection<SourceEntry> getSources();
+}
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java	(revision 4838)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/TaggingPresetPreference.java	(revision 4839)
@@ -46,7 +46,15 @@
     }
 
+    private static final List<SourceProvider> presetSourceProviders = new ArrayList<SourceProvider>();
     public static Collection<TaggingPreset> taggingPresets;
     private SourceEditor sources;
     private JCheckBox sortMenu;
+    
+    public static final boolean registerSourceProvider(SourceProvider provider) {
+        if (provider != null) {
+            return presetSourceProviders.add(provider);
+        }
+        return false;
+    }
 
     private ValidationListener validationListener = new ValidationListener() {
@@ -167,5 +175,5 @@
 
         public TaggingPresetSourceEditor() {
-            super(false, "http://josm.openstreetmap.de/presets");
+            super(false, "http://josm.openstreetmap.de/presets", presetSourceProviders);
         }
 
