Index: /trunk/resources/images/listsearch.svg
===================================================================
--- /trunk/resources/images/listsearch.svg	(revision 17768)
+++ /trunk/resources/images/listsearch.svg	(revision 17768)
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="16"
+   height="16"
+   viewBox="0 0 16 16"
+   id="svg2"
+   version="1.1"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="search4.svg">
+  <defs
+     id="defs4" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="44.823578"
+     inkscape:cx="5.4076728"
+     inkscape:cy="11.303007"
+     inkscape:document-units="px"
+     inkscape:current-layer="layer1"
+     showgrid="true"
+     units="px"
+     inkscape:window-width="1680"
+     inkscape:window-height="987"
+     inkscape:window-x="-8"
+     inkscape:window-y="-8"
+     inkscape:window-maximized="1"
+     viewbox-height="16">
+    <inkscape:grid
+       type="xygrid"
+       id="grid4136"
+       originx="0"
+       originy="0"
+       spacingx="1"
+       spacingy="1" />
+  </sodipodi:namedview>
+  <metadata
+     id="metadata7">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+        <cc:license
+           rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
+      </cc:Work>
+      <cc:License
+         rdf:about="http://creativecommons.org/publicdomain/zero/1.0/">
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Reproduction" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#Distribution" />
+        <cc:permits
+           rdf:resource="http://creativecommons.org/ns#DerivativeWorks" />
+      </cc:License>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-1037.3622)">
+    <circle
+       style="opacity:1;fill:none;fill-opacity:0;fill-rule:nonzero;stroke:#999999;stroke-width:1.2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:1;stroke-opacity:1;paint-order:normal"
+       id="path816"
+       cx="5.5"
+       cy="1042.8622"
+       r="3.9935553" />
+    <path
+       style="fill:none;stroke:#999999;stroke-width:1.3;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+       d="m 14,1051.3622 -5,-5"
+       id="path818"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/NotesDialog.java	(revision 17768)
@@ -53,4 +53,5 @@
 import org.openstreetmap.josm.gui.util.DocumentAdapter;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
+import org.openstreetmap.josm.gui.widgets.FilterField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -233,4 +234,5 @@
     private JosmTextField setupFilter() {
         final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
+        FilterField.setSearchIcon(f);
         f.setToolTipText(tr("Note filter"));
         f.getDocument().addDocumentListener(DocumentAdapter.create(ignore -> {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 17768)
@@ -85,4 +85,5 @@
 import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
+import org.openstreetmap.josm.gui.widgets.FilterField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
@@ -322,4 +323,5 @@
     private JosmTextField setupFilter() {
         final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
+        FilterField.setSearchIcon(f);
         f.setToolTipText(tr("Relation list filter"));
         final CompileSearchTextDecorator decorator = CompileSearchTextDecorator.decorate(f);
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 17768)
@@ -107,4 +107,5 @@
 import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator;
 import org.openstreetmap.josm.gui.widgets.DisableShortcutsOnFocusGainedTextField;
+import org.openstreetmap.josm.gui.widgets.FilterField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
@@ -544,4 +545,5 @@
     private JosmTextField setupFilter() {
         final JosmTextField f = new DisableShortcutsOnFocusGainedTextField();
+        FilterField.setSearchIcon(f);
         f.setToolTipText(tr("Tag filter"));
         final CompileSearchTextDecorator decorator = CompileSearchTextDecorator.decorate(f);
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 17768)
@@ -27,5 +27,4 @@
 import javax.swing.JButton;
 import javax.swing.JFileChooser;
-import javax.swing.JLabel;
 import javax.swing.JMenu;
 import javax.swing.JOptionPane;
@@ -54,4 +53,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
+import org.openstreetmap.josm.gui.widgets.FilterField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -168,9 +168,6 @@
         final JPanel txtFilterPanel = new JPanel(new GridBagLayout());
         p.add(txtFilterPanel, GBC.eol().fill(GBC.HORIZONTAL));
-        txtFilter = new JosmTextField();
-        JLabel lbFilter = new JLabel(tr("Search:"));
-        lbFilter.setLabelFor(txtFilter);
-        txtFilterPanel.add(lbFilter, GBC.std().insets(0, 0, 5, 0));
-        txtFilterPanel.add(txtFilter, GBC.eol().fill(GBC.HORIZONTAL));
+        txtFilter = new FilterField();
+        txtFilterPanel.add(txtFilter, GBC.eol().insets(0, 0, 0, 5).fill(GBC.HORIZONTAL));
         txtFilter.getDocument().addDocumentListener(DocumentAdapter.create(ignore -> applyFilter()));
         readPreferences(Preferences.main());
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/display/ColorPreference.java	(revision 17768)
@@ -373,5 +373,5 @@
         JPanel panel = new JPanel(new GridBagLayout());
         panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
-        panel.add(colorFilter, GBC.eol().fill(HORIZONTAL));
+        panel.add(colorFilter, GBC.eol().insets(0, 0, 0, 5).fill(HORIZONTAL));
         JScrollPane scrollpane = new JScrollPane(colors);
         scrollpane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/plugin/PluginPreference.java	(revision 17768)
@@ -9,8 +9,6 @@
 import java.awt.BorderLayout;
 import java.awt.Component;
-import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.GridLayout;
-import java.awt.Insets;
 import java.awt.event.ActionEvent;
 import java.awt.event.ComponentAdapter;
@@ -28,5 +26,4 @@
 
 import javax.swing.AbstractAction;
-import javax.swing.BorderFactory;
 import javax.swing.ButtonGroup;
 import javax.swing.DefaultListModel;
@@ -167,37 +164,23 @@
     private JPanel buildSearchFieldPanel() {
         JPanel pnl = new JPanel(new GridBagLayout());
-        pnl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
-        GridBagConstraints gc = new GridBagConstraints();
-
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        gc.fill = HORIZONTAL;
-        gc.weightx = 0.0;
-        gc.insets = new Insets(0, 0, 0, 3);
         pnl.add(GBC.glue(0, 0));
 
-        gc.weightx = 1.0;
         ButtonGroup bg = new ButtonGroup();
         JPanel radios = new JPanel();
-        addRadioButton(bg, radios, new JRadioButton(trc("plugins", "All"), true), gc, PluginInstallation.ALL);
-        addRadioButton(bg, radios, new JRadioButton(trc("plugins", "Installed")), gc, PluginInstallation.INSTALLED);
-        addRadioButton(bg, radios, new JRadioButton(trc("plugins", "Available")), gc, PluginInstallation.AVAILABLE);
-        pnl.add(radios, gc);
-
-        gc.gridx = 0;
-        gc.weightx = 0.0;
-        pnl.add(new JLabel(tr("Search:")), gc);
-
-        gc.gridx = 1;
-        gc.weightx = 1.0;
+        addRadioButton(bg, radios, new JRadioButton(trc("plugins", "All"), true), PluginInstallation.ALL);
+        addRadioButton(bg, radios, new JRadioButton(trc("plugins", "Installed")), PluginInstallation.INSTALLED);
+        addRadioButton(bg, radios, new JRadioButton(trc("plugins", "Available")), PluginInstallation.AVAILABLE);
+        pnl.add(radios, GBC.eol().fill(HORIZONTAL));
+
         pnl.add(new FilterField().filter(expr -> {
             model.filterDisplayedPlugins(expr);
             pnlPluginPreferences.refreshView();
-        }), gc);
+        }), GBC.eol().insets(0, 0, 0, 5).fill(HORIZONTAL));
         return pnl;
     }
 
-    private void addRadioButton(ButtonGroup bg, JPanel pnl, JRadioButton rb, GridBagConstraints gc, PluginInstallation value) {
+    private void addRadioButton(ButtonGroup bg, JPanel pnl, JRadioButton rb, PluginInstallation value) {
         bg.add(rb);
-        pnl.add(rb, gc);
+        pnl.add(rb, GBC.std());
         rb.addActionListener(e -> {
             model.filterDisplayedPlugins(value);
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/projection/CodeSelectionPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/projection/CodeSelectionPanel.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/projection/CodeSelectionPanel.java	(revision 17768)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.gui.preferences.projection.CodeProjectionChoice.CodeComparator;
 import org.openstreetmap.josm.gui.util.TableHelper;
+import org.openstreetmap.josm.gui.widgets.FilterField;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.tools.GBC;
@@ -32,5 +33,5 @@
 public class CodeSelectionPanel extends JPanel implements ListSelectionListener, DocumentListener {
 
-    private final JosmTextField filter = new JosmTextField(30);
+    private final JosmTextField filter = new FilterField();
     private final ProjectionCodeModel model = new ProjectionCodeModel();
     private JTable table;
@@ -104,5 +105,5 @@
 
         this.setLayout(new GridBagLayout());
-        this.add(filter, GBC.eol().weight(1.0, 0.0));
+        this.add(filter, GBC.eol().fill(GBC.HORIZONTAL).weight(1.0, 0.0));
         this.add(scroll, GBC.eol().fill(GBC.HORIZONTAL));
     }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/shortcut/PrefJPanel.java	(revision 17768)
@@ -8,8 +8,6 @@
 import java.awt.Component;
 import java.awt.Dimension;
-import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
 import java.awt.GridLayout;
-import java.awt.Insets;
 import java.awt.Toolkit;
 import java.awt.event.KeyEvent;
@@ -21,5 +19,4 @@
 
 import javax.swing.AbstractAction;
-import javax.swing.BorderFactory;
 import javax.swing.BoxLayout;
 import javax.swing.DefaultComboBoxModel;
@@ -44,4 +41,5 @@
 import org.openstreetmap.josm.gui.widgets.FilterField;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
+import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.KeyboardUtils;
 import org.openstreetmap.josm.tools.Logging;
@@ -251,17 +249,6 @@
         // copied from PluginPreference
         JPanel pnl = new JPanel(new GridBagLayout());
-        pnl.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
-        GridBagConstraints gc = new GridBagConstraints();
-
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weightx = 0.0;
-        gc.insets = new Insets(0, 0, 0, 5);
-        pnl.add(new JLabel(tr("Search:")), gc);
-
-        gc.gridx = 1;
-        gc.weightx = 1.0;
-        pnl.add(filterField, gc);
-        pnl.setMaximumSize(new Dimension(300, 10));
+        pnl.add(filterField, GBC.eol().insets(0, 0, 0, 5).fill(GBC.HORIZONTAL));
+        pnl.setMaximumSize(new Dimension(Integer.MAX_VALUE, 10));
         return pnl;
     }
Index: /trunk/src/org/openstreetmap/josm/gui/widgets/FilterField.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/widgets/FilterField.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/widgets/FilterField.java	(revision 17768)
@@ -18,4 +18,5 @@
 import javax.swing.table.TableRowSorter;
 
+import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.Utils;
@@ -31,6 +32,16 @@
      */
     public FilterField() {
+        setSearchIcon(this);
         setToolTipText(tr("Enter a search expression"));
         SelectAllOnFocusGainedDecorator.decorate(this);
+    }
+
+    /**
+     * Sets the search icon for the given text field
+     * @param textField the text field
+     * @since 17768
+     */
+    public static void setSearchIcon(JosmTextField textField) {
+        textField.setIcon(ImageProvider.get("listsearch"));
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/widgets/JosmTextField.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/widgets/JosmTextField.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/widgets/JosmTextField.java	(revision 17768)
@@ -11,5 +11,8 @@
 import java.awt.event.FocusListener;
 
+import javax.swing.BorderFactory;
+import javax.swing.Icon;
 import javax.swing.JTextField;
+import javax.swing.border.Border;
 import javax.swing.text.Document;
 
@@ -31,4 +34,6 @@
     private final PopupMenuLauncher launcher;
     private String hint;
+    private Icon icon;
+    private int leftInsets;
 
     /**
@@ -149,4 +154,28 @@
 
     /**
+     * Returns the icon to display
+     * @return the icon to display
+     * @since 17768
+     */
+    public Icon getIcon() {
+        return icon;
+    }
+
+    /**
+     * Sets the icon to display
+     * @param icon the icon to set
+     * @since 17768
+     */
+    public void setIcon(Icon icon) {
+        this.icon = icon;
+        if (icon != null) {
+            this.leftInsets = getInsets().left;
+            Border original = getBorder();
+            Border margin = BorderFactory.createEmptyBorder(0, icon.getIconWidth(), 0, 0);
+            setBorder(original == null ? margin : BorderFactory.createCompoundBorder(original, margin));
+        }
+    }
+
+    /**
      * Empties the internal undo manager.
      * @since 14977
@@ -159,4 +188,8 @@
     public void paint(Graphics g) {
         super.paint(g);
+        if (icon != null) {
+            int h = getHeight() - icon.getIconHeight();
+            icon.paintIcon(this, g, Math.min(leftInsets, h / 2), h / 2);
+        }
         if (hint != null && !hint.isEmpty() && getText().isEmpty() && !isFocusOwner()) {
             // Taken from http://stackoverflow.com/a/24571681/2257172
Index: /trunk/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java	(revision 17767)
+++ /trunk/src/org/openstreetmap/josm/gui/widgets/SearchTextResultListPanel.java	(revision 17768)
@@ -43,5 +43,5 @@
         super(new BorderLayout());
 
-        edSearchText = new JosmTextField();
+        edSearchText = new FilterField();
         edSearchText.getDocument().addDocumentListener(DocumentAdapter.create(ignore -> filterItems()));
         edSearchText.addKeyListener(new KeyAdapter() {
