Index: trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(revision 13745)
+++ trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(revision 13746)
@@ -4,6 +4,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.GridBagLayout;
 import java.awt.Point;
+import java.awt.event.InputMethodEvent;
+import java.awt.event.InputMethodListener;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -29,9 +30,11 @@
 
 import javax.imageio.ImageIO;
+import javax.swing.JLabel;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
+import javax.swing.RowFilter;
 import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableRowSorter;
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamException;
@@ -57,4 +60,6 @@
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.layer.NativeScaleLayer.ScaleList;
+import org.openstreetmap.josm.gui.layer.imagery.WMTSLayerSelection;
+import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -170,4 +175,12 @@
             return identifier;
         }
+
+        /**
+         *
+         * @return projection of this tileMatrix
+         */
+        public String getCrs() {
+            return crs;
+        }
     }
 
@@ -264,21 +277,15 @@
     private static final class SelectLayerDialog extends ExtendedDialog {
         private final transient List<Entry<String, List<Layer>>> layers;
-        private final JTable list;
+        private final WMTSLayerSelection list;
 
         SelectLayerDialog(Collection<Layer> layers) {
             super(Main.parent, tr("Select WMTS layer"), tr("Add layers"), tr("Cancel"));
             this.layers = groupLayersByNameAndTileMatrixSet(layers);
-            this.list = getLayerSelectionPanel(this.layers);
-            JPanel panel = new JPanel(new GridBagLayout());
-            panel.add(new JScrollPane(this.list), GBC.eol().fill());
-            setContent(panel);
+            this.list = new WMTSLayerSelection(this.layers);
+            setContent(list);
         }
 
         public DefaultLayer getSelectedLayer() {
-            int index = list.getSelectedRow();
-            if (index < 0) {
-                return null; //nothing selected
-            }
-            Layer selectedLayer = layers.get(list.convertRowIndexToModel(index)).getValue().get(0);
+            Layer selectedLayer = list.getSelectedLayer();
             return new DefaultLayer(ImageryType.WMTS, selectedLayer.identifier, selectedLayer.style, selectedLayer.tileMatrixSet.identifier);
         }
@@ -951,5 +958,5 @@
     }
 
-    public static JTable getLayerSelectionPanel(List<Entry<String, List<Layer>>> layers) {
+    public static JPanel getLayerSelectionPanel(List<Entry<String, List<Layer>>> layers) {
         JTable list = new JTable(
                 new AbstractTableModel() {
@@ -1002,5 +1009,21 @@
         list.setRowSelectionAllowed(true);
         list.setColumnSelectionAllowed(false);
-        return list;
+        JPanel ret = new JPanel();
+        ret.add(new JLabel(tr("Filter layers:")), GBC.eol().fill(GBC.HORIZONTAL));
+        final JosmTextArea filter = new JosmTextArea();
+        filter.addInputMethodListener(new InputMethodListener() {
+            @SuppressWarnings({ "unchecked", "rawtypes" })
+            @Override
+            public void inputMethodTextChanged(InputMethodEvent event) {
+                ((TableRowSorter) list.getRowSorter()).setRowFilter(RowFilter.regexFilter(filter.getText()));
+            }
+
+            @Override
+            public void caretPositionChanged(InputMethodEvent event) {
+                return;
+            }
+        });
+        ret.add(list, GBC.eol().fill());
+        return ret;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMTSLayerPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMTSLayerPanel.java	(revision 13745)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/imagery/AddWMTSLayerPanel.java	(revision 13746)
@@ -4,5 +4,4 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.Dimension;
 import java.awt.GridBagLayout;
 import java.io.IOException;
@@ -16,6 +15,4 @@
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
 
 import org.openstreetmap.josm.data.imagery.DefaultLayer;
@@ -26,4 +23,5 @@
 import org.openstreetmap.josm.data.imagery.WMTSTileSource.Layer;
 import org.openstreetmap.josm.data.imagery.WMTSTileSource.WMTSGetCapabilitiesException;
+import org.openstreetmap.josm.gui.layer.imagery.WMTSLayerSelection;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -36,5 +34,5 @@
 public class AddWMTSLayerPanel extends AddImageryPanel {
     private final transient JPanel layerPanel = new JPanel(new GridBagLayout());
-    private transient JTable layerTable;
+    private transient WMTSLayerSelection layerTable;
     private final JCheckBox setDefaultLayer = new JCheckBox(tr("Set default layer?"));
     private List<Entry<String, List<Layer>>> layers;
@@ -69,9 +67,7 @@
                 WMTSCapabilities capabilities = WMTSTileSource.getCapabilities(rawUrl.getText(), getCommonHeaders());
                 layers = WMTSTileSource.groupLayersByNameAndTileMatrixSet(capabilities.getLayers());
-                layerTable = WMTSTileSource.getLayerSelectionPanel(layers);
+                layerTable = new WMTSLayerSelection(layers);
                 layerPanel.removeAll();
-                JScrollPane scrollPane = new JScrollPane(layerTable);
-                scrollPane.setPreferredSize(new Dimension(100, 100));
-                layerPanel.add(scrollPane, GBC.eol().fill());
+                layerPanel.add(layerTable, GBC.eol().fill());
                 layerPanel.revalidate();
             } catch (IOException | WMTSGetCapabilitiesException ex) {
@@ -93,9 +89,5 @@
                 throw new IllegalArgumentException(tr("You need to get fetch layers"));
             }
-            int index = layerTable.getSelectedRow();
-            if (index < 0) {
-                throw new IllegalArgumentException(tr("Invalid layer selected. Index: {1}", index));
-            }
-            Layer selectedLayer = layers.get(layerTable.convertRowIndexToModel(index)).getValue().get(0);
+            Layer selectedLayer = layerTable.getSelectedLayer();
             ret.setDefaultLayers(
                     Collections.<DefaultLayer>singletonList(
