Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5615)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 5616)
@@ -6,4 +6,6 @@
 import static org.openstreetmap.josm.tools.I18n.trn;
 
+import java.awt.BorderLayout;
+import java.awt.Color;
 import java.awt.Point;
 import java.awt.event.ActionEvent;
@@ -28,7 +30,13 @@
 import javax.swing.JList;
 import javax.swing.JMenuItem;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextField;
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
 import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.event.DocumentEvent;
+import javax.swing.event.DocumentListener;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
@@ -36,4 +44,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.SequenceCommand;
@@ -68,5 +77,7 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.InputMapUtils;
+import org.openstreetmap.josm.tools.Predicate;
 import org.openstreetmap.josm.tools.Shortcut;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -142,5 +153,40 @@
         displaylist.addListSelectionListener(selectAction);
 
-        createLayout(displaylist, true, Arrays.asList(new SideButton[] {
+        final JTextField filter = new JTextField();
+        filter.setToolTipText(tr("Relation list filter"));
+        filter.getDocument().addDocumentListener(new DocumentListener() {
+
+            private void setFilter() {
+                try {
+                    filter.setBackground(UIManager.getColor("TextField.background"));
+                    filter.setToolTipText(tr("Relation list filter"));
+                    model.setFilter(SearchCompiler.compile(filter.getText(), false, false));
+                } catch (SearchCompiler.ParseError ex) {
+                    filter.setBackground(new Color(255, 224, 224));
+                    filter.setToolTipText(ex.getMessage());
+                    model.setFilter(new SearchCompiler.Always());
+                }
+            }
+
+            @Override
+            public void insertUpdate(DocumentEvent e) {
+                setFilter();
+            }
+
+            @Override
+            public void removeUpdate(DocumentEvent e) {
+                setFilter();
+            }
+
+            @Override
+            public void changedUpdate(DocumentEvent e) {
+                setFilter();
+            }
+        });
+
+        JPanel pane = new JPanel(new BorderLayout());
+        pane.add(filter, BorderLayout.NORTH);
+        pane.add(new JScrollPane(displaylist), BorderLayout.CENTER);
+        createLayout(pane, false, Arrays.asList(new SideButton[]{
                 new SideButton(newAction, false),
                 new SideButton(editAction, false),
@@ -643,5 +689,7 @@
     private class RelationListModel extends AbstractListModel {
         private final ArrayList<Relation> relations = new ArrayList<Relation>();
+        private ArrayList<Relation> filteredRelations;
         private DefaultListSelectionModel selectionModel;
+        private SearchCompiler.Match filter;
 
         public RelationListModel(DefaultListSelectionModel selectionModel) {
@@ -760,11 +808,31 @@
         }
 
+        public void setFilter(final SearchCompiler.Match filter) {
+            this.filter = filter;
+            this.filteredRelations = new ArrayList<Relation>(Utils.filter(relations, new Predicate<Relation>() {
+                @Override
+                public boolean evaluate(Relation r) {
+                    return filter.match(r);
+                }
+            }));
+            List<Relation> sel = getSelectedRelations();
+            fireContentsChanged(this, 0, getSize());
+            setSelectedRelations(sel);
+            updateTitle();
+        }
+
+        private List<Relation> getVisibleRelations() {
+            return filteredRelations == null ? relations : filteredRelations;
+        }
+
+        @Override
         public Object getElementAt(int index) {
-            if (index < 0 || index >= relations.size()) return null;
-            return relations.get(index);
-        }
-
+            if (index < 0 || index >= getVisibleRelations().size()) return null;
+            return getVisibleRelations().get(index);
+        }
+
+        @Override
         public int getSize() {
-            return relations.size();
+            return getVisibleRelations().size();
         }
 
@@ -837,5 +905,7 @@
 
         public void updateTitle() {
-            if (getSize() > 0) {
+            if (relations.size() > 0 && relations.size() != getSize()) {
+                RelationListDialog.this.setTitle(tr("Relations: {0}/{1}", getSize(), relations.size()));
+            } else if (getSize() > 0) {
                 RelationListDialog.this.setTitle(tr("Relations: {0}", getSize()));
             } else {
