Index: unk/src/org/openstreetmap/josm/plugins/PluginDescription.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginDescription.java	(revision 1587)
+++ 	(revision )
@@ -1,32 +1,0 @@
-//License: GPL. Copyright 2007 by Immanuel Scholz and others
-package org.openstreetmap.josm.plugins;
-
-/**
-* Only the plugin name, its jar location and the description.
-* In other words, this is the minimal requirement the plugin preference page
-* needs to show the plugin as available
-*
-* @author imi
-*/
-public class PluginDescription implements Comparable<Object> {
-    // Note: All the following need to be public instance variables of
-    // type String.  (Plugin description XMLs from the server are parsed
-    // with tools.XmlObjectParser, which uses reflection to access them.)
-    public String name;
-    public String description;
-    public String resource;
-    public String version;
-    public PluginDescription(String name, String description, String resource, String version) {
-        this.name = name;
-        this.description = description;
-        this.resource = resource;
-        this.version = version;
-    }
-    public PluginDescription() {
-    }
-    public int compareTo(Object n) {
-        if(n instanceof PluginDescription)
-            return name.compareToIgnoreCase(((PluginDescription)n).name);
-        return -1;
-    }
-}
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginDownloader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginDownloader.java	(revision 1587)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginDownloader.java	(revision 1588)
@@ -34,9 +34,9 @@
 
     private static final class UpdateTask extends PleaseWaitRunnable {
-        private final Collection<PluginDescription> toUpdate;
+        private final Collection<PluginInformation> toUpdate;
         private String errors = "";
         private int count = 0;
 
-        private UpdateTask(Collection<PluginDescription> toUpdate) {
+        private UpdateTask(Collection<PluginInformation> toUpdate) {
             super(tr("Update Plugins"));
             this.toUpdate = toUpdate;
@@ -58,7 +58,7 @@
             if (!pluginDir.exists())
                 pluginDir.mkdirs();
-            for (PluginDescription d : toUpdate) {
+            for (PluginInformation d : toUpdate) {
                 File pluginFile = new File(pluginDir, d.name + ".jar.new");
-                if (download(d.resource, pluginFile))
+                if (download(d.downloadlink, pluginFile))
                     count++;
                 else
@@ -69,7 +69,5 @@
     }
 
-    private static final Pattern wiki = Pattern.compile("^</td></tr><tr><td><a class=\"ext-link\" href=\"([^\"]*)\"><span class=\"icon\">([^<]*)</span></a></td><td>([^<]*)</td><td>([^<].*)</td><td>(.*)");
-
-    private final static String[] pluginSites = {"http://josm.openstreetmap.de/wiki/Plugins"};
+    private final static String[] pluginSites = {"http://josm.openstreetmap.de/plugin"};
 
     public static Collection<String> getSites() {
@@ -83,17 +81,16 @@
         int count = 0;
         for (String site : getSites()) {
+        /* TODO: remove old site files (everything except .jar) */
             try {
                 BufferedReader r = new BufferedReader(new InputStreamReader(new URL(site).openStream()));
-                CharSequence txt;
-                if (site.toLowerCase().endsWith(".xml"))
-                    txt = readXml(r);
-                else
-                    txt = readWiki(r);
+                StringBuilder b = new StringBuilder();
+                for (String line = r.readLine(); line != null; line = r.readLine())
+                    b.append(line+"\n");
                 r.close();
                 new File(Main.pref.getPreferencesDir()+"plugins").mkdir();
                 FileWriter out = new FileWriter(new File(Main.pref
                         .getPluginsDirFile(), count + "-site-"
-                        + site.replaceAll("[/:\\\\ <>|]", "_") + ".xml"));
-                out.append(txt);
+                        + site.replaceAll("[/:\\\\ <>|]", "_") + ".txt"));
+                out.append(b);
                 out.close();
                 count++;
@@ -104,37 +101,12 @@
     }
 
-    private static CharSequence readXml(BufferedReader r) throws IOException {
-        StringBuilder b = new StringBuilder();
-        for (String line = r.readLine(); line != null; line = r.readLine())
-            b.append(line+"\n");
-        return b;
-    }
-
-    private static CharSequence readWiki(BufferedReader r) throws IOException {
-        StringBuilder b = new StringBuilder("<plugins>\n");
-        for (String line = r.readLine(); line != null; line = r.readLine()) {
-            Matcher m = wiki.matcher(line);
-            if (!m.matches())
-                continue;
-            b.append("  <plugin>\n");
-            b.append("    <name>"+escape(m.group(2))+"</name>\n");
-            b.append("    <resource>"+escape(m.group(1))+"</resource>\n");
-            b.append("    <author>"+escape(m.group(3))+"</author>\n");
-            b.append("    <description>"+escape(m.group(4))+"</description>\n");
-            b.append("    <version>"+escape(m.group(5))+"</version>\n");
-            b.append("  </plugin>\n");
-        }
-        b.append("</plugins>\n");
-        return b;
-    }
-
     private static String escape(String s) {
         return s.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
     }
 
-    public static boolean downloadPlugin(PluginDescription pd) {
+    public static boolean downloadPlugin(PluginInformation pd) {
         File file = new File(Main.pref.getPluginsDirFile(), pd.name + ".jar");
-        if (!download(pd.resource, file)) {
-            JOptionPane.showMessageDialog(Main.parent, tr("Could not download plugin: {0} from {1}", pd.name, pd.resource));
+        if (!download(pd.downloadlink, file)) {
+            JOptionPane.showMessageDialog(Main.parent, tr("Could not download plugin: {0} from {1}", pd.name, pd.downloadlink));
         } else {
             try {
@@ -171,5 +143,5 @@
     }
 
-    public static void update(Collection<PluginDescription> update) {
+    public static void update(Collection<PluginInformation> update) {
         Main.worker.execute(new UpdateTask(update));
     }
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 1587)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 1588)
@@ -35,4 +35,5 @@
     public final String className;
     public final String requires;
+    public final String link;
     public final String description;
     public final boolean early;
@@ -40,4 +41,5 @@
     public final int stage;
     public final String version;
+    public String downloadlink = null;
     public final List<URL> libraries = new LinkedList<URL>();
 
@@ -76,8 +78,21 @@
             }
             if (manifest != null) {
+                String s;
+                String lang = Main.getLanguageCode()+"_";
                 Attributes attr = manifest.getMainAttributes();
                 className = attr.getValue("Plugin-Class");
+                s = attr.getValue(lang+"Plugin-Link");
+                if(s == null)
+                    s = attr.getValue("Plugin-Link");
+                link = s;
                 requires = attr.getValue("Plugin-Requires");
-                description = attr.getValue("Plugin-Description");
+                s = attr.getValue(lang+"Plugin-Description");
+                if(s == null)
+                {
+                    s = attr.getValue("Plugin-Description");
+                    if(s != null)
+                        s = tr(s);
+                }
+                description = s;
                 early = Boolean.parseBoolean(attr.getValue("Plugin-Early"));
                 String stageStr = attr.getValue("Plugin-Stage");
@@ -106,8 +121,9 @@
                 className = null;
                 mainversion = null;
-                description = tr("unknown");
+                description = null;
                 early = false;
                 stage = 50;
                 requires = null;
+                link = null;
                 version = null;
                 author = null;
@@ -121,4 +137,12 @@
             throw new PluginException(null, name, e);
         }
+    }
+
+    public String getLinkDescription()
+    {
+        String d = description == null ? tr("no description available") : description;
+        if(link != null)
+            d += " <A HREF=\""+link+"\">"+tr("More details")+"</A>";
+        return d;
     }
 
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginSelection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginSelection.java	(revision 1587)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginSelection.java	(revision 1588)
@@ -10,4 +10,6 @@
 import java.awt.event.ActionListener;
 
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.io.FileReader;
@@ -39,10 +41,9 @@
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.tools.OpenBrowser;
-import org.openstreetmap.josm.tools.XmlObjectParser.Uniform;
 
 public class PluginSelection {
 
     private Map<String, Boolean> pluginMap;
-    private Map<String, PluginDescription> availablePlugins;
+    private Map<String, PluginInformation> availablePlugins;
 
     public void updateDescription(JPanel pluginPanel) {
@@ -63,8 +64,8 @@
         drawPanel(pluginPanel);
 
-        Set<PluginDescription> toUpdate = new HashSet<PluginDescription>();
+        Set<PluginInformation> toUpdate = new HashSet<PluginInformation>();
         StringBuilder toUpdateStr = new StringBuilder();
         for (PluginProxy proxy : PluginHandler.pluginList) {
-            PluginDescription description = availablePlugins.get(proxy.info.name);
+            PluginInformation description = availablePlugins.get(proxy.info.name);
             if (description != null && (description.version == null || description.version.equals("")) ?
             (proxy.info.version != null && proxy.info.version.equals("")) : !description.version.equals(proxy.info.version)) {
@@ -77,9 +78,9 @@
             done = true;
         } else {
-            int answer = new ExtendedDialog(Main.parent, 
-                        tr("Update"), 
+            int answer = new ExtendedDialog(Main.parent,
+                        tr("Update"),
                         tr("Update the following plugins:\n\n{0}", toUpdateStr.toString()),
-                        new String[] {tr("Update Plugins"), tr("Cancel")}, 
-                        new String[] {"dialogs/refresh.png", "cancel.png"}).getValue();  
+                        new String[] {tr("Update Plugins"), tr("Cancel")},
+                        new String[] {"dialogs/refresh.png", "cancel.png"}).getValue();
             if (answer == 1) {
                 PluginDownloader.update(toUpdate);
@@ -93,5 +94,5 @@
 
     public Boolean finish() {
-        Collection<PluginDescription> toDownload = new LinkedList<PluginDescription>();
+        Collection<PluginInformation> toDownload = new LinkedList<PluginInformation>();
         String msg = "";
         for (Entry<String, Boolean> entry : pluginMap.entrySet()) {
@@ -102,14 +103,14 @@
         }
         if (!toDownload.isEmpty()) {
-            int answer = new ExtendedDialog(Main.parent, 
+            int answer = new ExtendedDialog(Main.parent,
                         tr("Download missing plugins"),
                         tr("Download the following plugins?\n\n{0}", msg),
-                        new String[] {tr("Download Plugins"), tr("Cancel")}, 
-                        new String[] {"download.png", "cancel.png"}).getValue();  
+                        new String[] {tr("Download Plugins"), tr("Cancel")},
+                        new String[] {"download.png", "cancel.png"}).getValue();
             if (answer != 1)
-                for (PluginDescription pd : toDownload)
+                for (PluginInformation pd : toDownload)
                     pluginMap.put(pd.name, false);
             else
-                for (PluginDescription pd : toDownload)
+                for (PluginInformation pd : toDownload)
                     if (!PluginDownloader.downloadPlugin(pd))
                         pluginMap.put(pd.name, false);
@@ -145,5 +146,5 @@
 
         int row = 0;
-        for (final PluginDescription plugin : availablePlugins.values()) {
+        for (final PluginInformation plugin : availablePlugins.values()) {
             boolean enabled = (enabledPlugins != null) && enabledPlugins.contains(plugin.name);
             if (pluginMap.get(plugin.name) == null)
@@ -174,10 +175,10 @@
             pluginPanel.add(pluginCheck, gbc);
 
-            pluginCheck.setToolTipText(plugin.resource != null ? ""+plugin.resource : tr("Plugin bundled with JOSM"));
+            pluginCheck.setToolTipText(plugin.downloadlink != null ? ""+plugin.downloadlink : tr("Plugin bundled with JOSM"));
 
             JEditorPane description = new JEditorPane();
             description.setContentType("text/html");
             description.setEditable(false);
-            description.setText("<html><i>"+(plugin.description==null?tr("no description available"):plugin.description)+"</i></html>");
+            description.setText("<html><i>"+plugin.getLinkDescription()+"</i></html>");
             description.setBorder(BorderFactory.createEmptyBorder(0,20,0,0));
             description.setBackground(UIManager.getColor("Panel.background"));
@@ -205,12 +206,12 @@
                         if ((getLoaded(plugin.name) == null) && (plinfo != null)) {
                             try {
-                                int answer = new ExtendedDialog(Main.parent, 
-                                    tr("Plugin already exists"), 
+                                int answer = new ExtendedDialog(Main.parent,
+                                    tr("Plugin already exists"),
                                     tr("Plugin archive already available. Do you want to download"
                                         + " the current version by deleting existing archive?\n\n{0}",
                                         plinfo.file.getCanonicalPath()),
-                                    new String[] {tr("Delete and Download"), tr("Cancel")}, 
-                                    new String[] {"download.png", "cancel.png"}).getValue();      
-                                    
+                                    new String[] {tr("Delete and Download"), tr("Cancel")},
+                                    new String[] {"download.png", "cancel.png"}).getValue();
+
                                 if (answer == 1) {
                                     if (!plinfo.file.delete()) {
@@ -247,6 +248,6 @@
     }
 
-    private Map<String, PluginDescription> getAvailablePlugins() {
-        SortedMap<String, PluginDescription> availablePlugins = new TreeMap<String, PluginDescription>(new Comparator<String>(){
+    private Map<String, PluginInformation> getAvailablePlugins() {
+        SortedMap<String, PluginInformation> availablePlugins = new TreeMap<String, PluginInformation>(new Comparator<String>(){
             public int compare(String o1, String o2) {
                 return o1.compareToIgnoreCase(o2);
@@ -260,21 +261,55 @@
                     if (!f.isFile())
                         continue;
-                    if (f.getName().endsWith(".jar")) {
+                    String fname = f.getName();
+                    if (fname.endsWith(".jar")) {
                         try {
-                            PluginInformation info = new PluginInformation(f);
+                            PluginInformation info = new PluginInformation(f,fname.substring(0,fname.length()-4), null);
                             if (!availablePlugins.containsKey(info.name))
-                                availablePlugins.put(info.name, new PluginDescription(
-                                    info.name,
-                                    info.description,
-                                    PluginInformation.fileToURL(f).toString(),
-                                    info.version));
+                                availablePlugins.put(info.name, info);
                         } catch (PluginException x) {
                         }
-                    } else if (f.getName().matches("^[0-9]+-site.*\\.xml$")) {
+                    } else if (fname.matches("^[0-9]+-site.*\\.txt$")) {
                         try {
-                            Uniform<PluginDescription> parser = new Uniform<PluginDescription>(new FileReader(f), "plugin", PluginDescription.class);
-                            for (PluginDescription pd : parser)
-                                if (!availablePlugins.containsKey(pd.name))
-                                    availablePlugins.put(pd.name, pd);
+                            BufferedReader r = new BufferedReader(new FileReader(f));
+                            String name = null;
+                            String url = null;
+                            String manifest = null;
+                            for (String line = r.readLine(); line != null; line = r.readLine())
+                            {
+                                if(line.startsWith("\t"))
+                                {
+                                    line = line.substring(1);
+                                    if(line.length() > 70)
+                                    {
+                                        manifest += line.substring(0,70)+"\n";
+                                        line = " " + line.substring(70);
+                                    }
+                                    manifest += line+"\n";
+                                }
+                                else
+                                {
+                                    if(name != null)
+                                    {
+                                        PluginInformation info = new PluginInformation(null, name.substring(0,name.length()-4),
+                                        new ByteArrayInputStream(manifest.getBytes()));
+                                        info.downloadlink = url;
+                                        if(!availablePlugins.containsKey(info.name))
+                                            availablePlugins.put(info.name, info);
+                                        manifest = null;
+                                    }
+                                    String x[] = line.split(";");
+                                    name = x[0];
+                                    url = x[1];
+                                }
+                            }
+                            if(name != null)
+                            {
+                                PluginInformation info = new PluginInformation(null, name.substring(0,name.length()-4),
+                                new ByteArrayInputStream(manifest.getBytes()));
+                                info.downloadlink = url;
+                                if(!availablePlugins.containsKey(info.name))
+                                    availablePlugins.put(info.name, info);
+                            }
+                            r.close();
                         } catch (Exception e) {
                             e.printStackTrace();
@@ -287,10 +322,5 @@
         for (PluginProxy proxy : PluginHandler.pluginList)
             if (!availablePlugins.containsKey(proxy.info.name))
-                availablePlugins.put(proxy.info.name, new PluginDescription(
-                        proxy.info.name,
-                        proxy.info.description,
-                        proxy.info.file == null ? null :
-                            PluginInformation.fileToURL(proxy.info.file).toString(),
-                        proxy.info.version));
+                availablePlugins.put(proxy.info.name, proxy.info);
         return availablePlugins;
     }
