diff --git a/src/org/openstreetmap/josm/actions/search/SearchAction.java b/src/org/openstreetmap/josm/actions/search/SearchAction.java
index 7b9ca85..4cfdcd2 100644
--- a/src/org/openstreetmap/josm/actions/search/SearchAction.java
+++ b/src/org/openstreetmap/josm/actions/search/SearchAction.java
@@ -7,10 +7,13 @@ import static org.openstreetmap.josm.tools.I18n.tr;
 import static org.openstreetmap.josm.tools.I18n.trc;
 
 import java.awt.Dimension;
+import java.awt.FlowLayout;
 import java.awt.Font;
 import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -19,12 +22,8 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
-import javax.swing.ButtonGroup;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JRadioButton;
+import javax.swing.*;
+import javax.swing.text.BadLocationException;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ActionParameter;
@@ -153,6 +152,28 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
         }
     }
 
+    private static class SearchKeywordLabel extends JLabel {
+
+        public SearchKeywordLabel(final HistoryComboBox hcb, final String text, String description) {
+            super("<html><style>td{border:1px solid gray;" + (text.contains("img") ? "background:#99ff99;" : "") + "</style><table><tr><td><code>"
+                    + text
+                    + "</code></td></tr></table></html>");
+            setToolTipText("<html>" + description + "</html>");
+            addMouseListener(new MouseAdapter() {
+
+                @Override
+                public void mouseClicked(MouseEvent e) {
+                    try {
+                        JTextField tf = (JTextField) hcb.getEditor().getEditorComponent();
+                        tf.getDocument().insertString(tf.getCaretPosition(), " " + text, null);
+                    } catch (BadLocationException ex) {
+                        throw new RuntimeException(ex.getMessage(), ex);
+                    }
+                }
+            });
+        }
+    }
+
     public static SearchSetting showSearchDialog(SearchSetting initialValues) {
         if (initialValues == null) {
             initialValues = new SearchSetting();
@@ -205,7 +226,7 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
             left.add(addOnToolbar, GBC.eol()); 
         }
 
-        JPanel right = new JPanel();
+        JPanel right = new JPanel(new GridBagLayout());
         DescriptionTextBuilder descriptionText = new DescriptionTextBuilder();
         descriptionText.append("<html><style>li.header{font-size:110%; list-style-type:none; margin-top:5px;}</style><ul>");
         descriptionText.appendItem(tr("<b>Baker Street</b> - ''Baker'' and ''Street'' in any key"));
@@ -216,31 +237,7 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
         descriptionText.appendItem(tr("<b>key=*</b> - key ''key'' with any value. Try also <b>*=value</b>, <b>key=</b>, <b>*=*</b>, <b>*=</b>"));
         descriptionText.appendItem(tr("<b>key:</b> - key ''key'' set to any value"));
         descriptionText.appendItem(tr("<b>key?</b> - key ''key'' with the value ''yes'', ''true'', ''1'' or ''on''"));
-        if(Main.pref.getBoolean("expert", false))
-        {
-            descriptionText.appendItemHeader(tr("Special targets"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>type:</b>... - objects with corresponding type (<b>node</b>, <b>way</b>, <b>relation</b>)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>user:</b>... - objects changed by user"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>user:anonymous</b> - objects changed by anonymous users"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>id:</b>... - objects with given ID (0 for new objects)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>version:</b>... - objects with given version (0 objects without an assigned version)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>changeset:</b>... - objects with given changeset ID (0 objects without an assigned changeset)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>nodes:</b>... - objects with given number of nodes (<b>nodes:</b>count, <b>nodes:</b>min-max, <b>nodes:</b>min- or <b>nodes:</b>-max)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>tags:</b>... - objects with given number of tags (<b>tags:</b>count, <b>tags:</b>min-max, <b>tags:</b>min- or <b>tags:</b>-max)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>role:</b>... - objects with given role in a relation"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>timestamp:</b>timestamp - objects with this last modification timestamp (2009-11-12T14:51:09Z, 2009-11-12 or T14:51 ...)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>timestamp:</b>min/max - objects with last modification within range"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>areasize:</b>... - closed ways with given area in m\u00b2 (<b>areasize:</b>min-max or <b>areasize:</b>max)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>modified</b> - all changed objects"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>selected</b> - all selected objects"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>incomplete</b> - all incomplete objects"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>untagged</b> - all untagged objects"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>closed</b> - all closed ways (a node is not considered closed)"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>child <i>expr</i></b> - all children of objects matching the expression"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>parent <i>expr</i></b> - all parents of objects matching the expression"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>(all)indownloadedarea</b> - objects (and all its way nodes / relation members) in downloaded area"));
-            /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("<b>(all)inview</b> - objects (and all its way nodes / relation members) in current view"));
-        }
+
         /* I18n: don't translate the bold text keyword */ descriptionText.appendItem(tr("Use <b>|</b> or <b>OR</b> to combine with logical or"));
         descriptionText.appendItem(tr("Use <b>\"</b> to quote operators (e.g. if key contains <b>:</b>)")
                 + "<br/>"
@@ -249,7 +246,39 @@ public class SearchAction extends JosmAction implements ParameterizedAction {
         descriptionText.append("</ul></html>");
         JLabel description = new JLabel(descriptionText.toString());
         description.setFont(description.getFont().deriveFont(Font.PLAIN));
-        right.add(description);
+        right.add(description,GBC.eol());
+
+        if (Main.pref.getBoolean("expert", false)) {
+            JPanel ext = new JPanel(new GridBagLayout());
+            right.add(ext, GBC.eol().fill(GBC.HORIZONTAL));
+            final GBC same = GBC.std().insets(0, 0, 5, 5);
+            final GBC next = GBC.eol().fill(GBC.HORIZONTAL).insets(0, 0, 5, 5);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "<img src=\"http://josm.openstreetmap.de/export/4326/josm/trunk/images/Mf_node.png\">type:node", tr("all nodes")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "<img src=\"http://josm.openstreetmap.de/export/4326/josm/trunk/images/Mf_way.png\">type:way", tr("all ways")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "<img src=\"http://josm.openstreetmap.de/export/4326/josm/trunk/images/Mf_relation.png\">type:relation", tr("all relations")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "<img src=\"http://josm.openstreetmap.de/export/4326/josm/trunk/images/Mf_closedway.png\">closed", tr("all closed ways")), next);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "user:", tr("objects changed by user")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "user:anonymous", tr("objects changed by anonymous users")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "id:", tr("objects with given ID (0 for new objects)")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "version:", tr("objects with given version (0 objects without an assigned version)")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "changeset:", tr("objects with given changeset ID (0 objects without an assigned changeset)")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "timestamp:2008/2011-02-04T12", tr("objects with last modification timestamp within range")), next);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "nodes:20-", tr("objects with at least 20 nodes")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "tags:5-10", tr("objects having 5 to 10 tags")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "role:", tr("objects with given role in a relation")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "areasize:-100", tr("closed ways with an area of 100 m\u00b2")), next);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "modified", tr("all modified objects")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "new", tr("all new objects")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "selected", tr("all selected objects")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "incomplete", tr("all incomplete objects")), next);
+            //ext.add(new SearchKeywordLabel(hcbSearchString, "untagged", tr("all untagged objects"))); // == "tags:0"?
+            ext.add(new SearchKeywordLabel(hcbSearchString, "child building", tr("all children of objects matching the expression (e.g., building)")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "parent bus_stop", tr("all parents of objects matching the expression (e.g., bus_stop)")), next);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "inview", tr("objects in current view")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "allinview", tr("objects (and all its way nodes / relation members) in current view")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "indownloadedarea", tr("objects in downloaded area")), same);
+            ext.add(new SearchKeywordLabel(hcbSearchString, "allindownloadedarea", tr("objects (and all its way nodes / relation members) in downloaded area")), next);
+        }
 
         final JPanel p = new JPanel(new GridBagLayout());
         p.add(top, GBC.eol().fill(GBC.HORIZONTAL).insets(5, 5, 5, 0));
