Index: applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignInputDialog.java
===================================================================
--- applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignInputDialog.java	(revision 21967)
+++ applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignInputDialog.java	(revision 21995)
@@ -33,8 +33,11 @@
 import javax.swing.Scrollable;
 import javax.swing.SwingConstants;
+import javax.swing.SwingUtilities;
 import javax.swing.border.Border;
 import javax.swing.border.EtchedBorder;
 import javax.swing.event.DocumentEvent;
 import javax.swing.event.DocumentListener;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
 import javax.swing.table.AbstractTableModel;
 
@@ -49,4 +52,5 @@
 import org.openstreetmap.josm.plugins.roadsigns.Sign.SignParameter;
 import org.openstreetmap.josm.plugins.roadsigns.Sign.Tag;
+import org.openstreetmap.josm.tools.OpenBrowser;
 import org.openstreetmap.josm.tools.Pair;
 
@@ -74,4 +78,5 @@
     private JPanel pnlPossibleSupplements;
     private JEditorPane info;
+    private JScrollPane scrollInfo;
 
     public RoadSignInputDialog(List<Sign> signs) {
@@ -126,5 +131,4 @@
         pnlSignSelection.setLayout(fLayout);
 
-        
         pnlPossibleSigns = new FixedWidthPanel();
         pnlPossibleSupplements = new FixedWidthPanel();
@@ -146,8 +150,19 @@
         info.setEditable(false);
         info.setContentType("text/html");
-        info.setText("");
+        info.setText(" ");
         info.setBackground(this.getBackground());
-        JScrollPane scroll3 = new JScrollPane(info, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
-        multiSplitPane.add(scroll3, "bottom");
+        info.addHyperlinkListener(new HyperlinkListener() {
+            public void hyperlinkUpdate(HyperlinkEvent e) {
+                if (e == null || e.getURL() == null)
+                    return;
+                System.err.println(e.getURL());
+                if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
+                    OpenBrowser.displayUrl(e.getURL().toString());
+                }
+            }
+        });
+
+        scrollInfo = new JScrollPane(info, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED, JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
+        multiSplitPane.add(scrollInfo, "bottom");
 
         return multiSplitPane;
@@ -162,4 +177,11 @@
         for (Sign s : signs) {
             JLabel lbl = new JLabel(s.getIcon());
+            String tt = "<html>"+s.name;
+            String ref = s.getDefaultRef();
+            if (ref != null) {
+                tt += "  <i><small>("+ref+")</small></i>";
+            }
+            tt += "</html>";
+            lbl.setToolTipText(tt);
             s.label = lbl;
             lbl.addMouseListener(new SignClickListener(s));
@@ -621,27 +643,43 @@
         @Override
         public void mouseClicked(MouseEvent e) {
+            info.setText(longText());
+            /* scroll up again */
+            SwingUtilities.invokeLater(new Runnable(){
+                public void run() {
+                    scrollInfo.getVerticalScrollBar().setValue(0);
+                }
+            });
             sel.add(sign);
         }
 
-        @Override
-        public void mouseEntered(MouseEvent e) {
+        private String longText() {
             StringBuilder txt = new StringBuilder();
-            txt.append("<p><b><large>");
-            txt.append(sign.name);
-            txt.append("</large></b>");
+            txt.append(sign.long_name == null ? sign.name : sign.long_name);
             String ref = sign.getDefaultRef();
             if (ref != null) {
                 txt.append("  <i><small>("+ref+")</small></i>");
             }
-            txt.append("</p>");
-//            if (sign.long_name != null) {
-//                txt.append("<i><smaller>("+sign.long_name+")</smaller></i>");
-//            }
-            info.setText(txt.toString());
-        }
-
-        @Override
-        public void mouseExited(MouseEvent e) {
-            info.setText("");
+
+            if (sign.help != null) {
+                txt.append("<p>");
+                txt.append(sign.help);
+                txt.append("</p>");
+            }
+
+            if (sign.wiki != null || sign.loc_wiki != null) {
+                String wikiPrefix = "http://wiki.openstreetmap.org/wiki/";
+                txt.append("<p>");
+                if (sign.loc_wiki != null) {
+                    String link = wikiPrefix+sign.loc_wiki;
+                    txt.append("<a href=\""+link+"\">"+link+"</a>");
+                    txt.append("<br>");
+                }
+                if (sign.wiki != null && ! sign.wiki.equals(sign.loc_wiki)) {
+                    String link = wikiPrefix+sign.wiki;
+                    txt.append("<a href=\""+link+"\">"+link+"</a>");
+                }
+                txt.append("</p>");
+            }
+            return txt.toString();
         }
     }
@@ -660,47 +698,47 @@
         @Override
         public void setBounds(int x, int y, int width, int height) {
-			super.setBounds(x, y, getParent().getWidth(), height);
-		}
+            super.setBounds(x, y, getParent().getWidth(), height);
+        }
 
         @Override
-		public Dimension getPreferredSize() {
-			return new Dimension(getWidth(), getPreferredHeight());
-		}
-
-		public Dimension getPreferredScrollableViewportSize() {
-			return super.getPreferredSize();
-		}
-
-		public int getScrollableUnitIncrement( Rectangle visibleRect, int orientation, int direction ) {
+        public Dimension getPreferredSize() {
+            return new Dimension(getWidth(), getPreferredHeight());
+        }
+
+        public Dimension getPreferredScrollableViewportSize() {
+            return super.getPreferredSize();
+        }
+
+        public int getScrollableUnitIncrement( Rectangle visibleRect, int orientation, int direction ) {
             final int FRAC = 20;
-			int inc = (orientation == SwingConstants.VERTICAL ? getParent().getHeight() : getParent().getWidth()) / FRAC;
-			return Math.max(inc, 1);
-		}
-
-		public int getScrollableBlockIncrement( Rectangle visibleRect, int orientation, int direction ) {
-			return orientation == SwingConstants.VERTICAL ? getParent().getHeight() : getParent().getWidth();
-		}
-
-		public boolean getScrollableTracksViewportWidth() {
-			return true;
-		}
-
-		public boolean getScrollableTracksViewportHeight() {
-			return false;
-		}
-
-		private int getPreferredHeight() {
-			int prefH = 0;
+            int inc = (orientation == SwingConstants.VERTICAL ? getParent().getHeight() : getParent().getWidth()) / FRAC;
+            return Math.max(inc, 1);
+        }
+
+        public int getScrollableBlockIncrement( Rectangle visibleRect, int orientation, int direction ) {
+            return orientation == SwingConstants.VERTICAL ? getParent().getHeight() : getParent().getWidth();
+        }
+
+        public boolean getScrollableTracksViewportWidth() {
+            return true;
+        }
+
+        public boolean getScrollableTracksViewportHeight() {
+            return false;
+        }
+
+        private int getPreferredHeight() {
+            int prefH = 0;
             int num = getComponentCount();
-			for (int i = 0; i < num; ++i) {
-				Rectangle rect = getComponent(i).getBounds();
-				int h = rect.y + rect.height;
-				if (h > prefH) {
-					prefH = h;
-                }
-			}
-			prefH += ((FlowLayout) getLayout()).getVgap();
-			return prefH;
-		}
+            for (int i = 0; i < num; ++i) {
+                Rectangle rect = getComponent(i).getBounds();
+                int h = rect.y + rect.height;
+                if (h > prefH) {
+                    prefH = h;
+                }
+            }
+            prefH += ((FlowLayout) getLayout()).getVgap();
+            return prefH;
+        }
     }
 }
Index: applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignsPlugin.java
===================================================================
--- applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignsPlugin.java	(revision 21967)
+++ applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignsPlugin.java	(revision 21995)
@@ -31,7 +31,7 @@
 
 public class RoadSignsPlugin extends Plugin {
-
     private static boolean presetsLoaded = false;
     public static List<Sign> signs;
+    static List<String> iconDirs;
 
     public RoadSignsPlugin(PluginInformation info) {
@@ -68,6 +68,13 @@
         presetsLoaded=true;
         List<String> files = new ArrayList<String>(
-                                   Main.pref.getCollection("plugin.roadsign.sources",
-                                        Collections.<String>singletonList("resource://data/defaultroadsignpreset.xml")));
+                Main.pref.getCollection("plugin.roadsign.sources",
+                    Collections.<String>singletonList("resource://data/defaultroadsignpreset.xml")));
+        iconDirs = new ArrayList<String>(
+                Main.pref.getCollection("plugin.roadsign.icon.sources", Collections.<String>emptySet()));
+
+        if (Main.pref.getBoolean("plugin.roadsign.use_default_icon_source", true)) {
+            iconDirs.add("resource://images/");
+        }
+
         for (String source : files) {
             try {
Index: applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignsReader.java
===================================================================
--- applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignsReader.java	(revision 21967)
+++ applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/RoadSignsReader.java	(revision 21995)
@@ -107,4 +107,9 @@
                     curSign.isSupplementing = true;
                 }
+
+                curSign.wiki = atts.getValue("wiki");
+                curSign.loc_wiki = getLocalized(atts, "wiki");
+
+                curSign.help = getLocalized(atts, "help");
 
             } else if (curSign != null && qname.equals("tag")) {
Index: applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/Sign.java
===================================================================
--- applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/Sign.java	(revision 21967)
+++ applications/editors/josm/plugins/roadsigns/src/org/openstreetmap/josm/plugins/roadsigns/Sign.java	(revision 21995)
@@ -30,4 +30,7 @@
     public List<SignParameter> params = new ArrayList<SignParameter>();
     public boolean isSupplementing;
+    public String loc_wiki;
+    public String wiki;
+    public String help;
 
     public JLabel label; // FIXME: don't put gui stuff here
@@ -78,5 +81,5 @@
     public ImageIcon getIcon() {
         if (icon == null) {
-            icon = ImageProvider.get(iconURL);
+            icon = ImageProvider.getIfAvailable(RoadSignsPlugin.iconDirs, "plugin.sign."+id, null, iconURL, null);
         }
         return icon;
