Index: src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 11213)
+++ src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(working copy)
@@ -10,6 +10,8 @@
 import java.awt.event.ActionEvent;
 import java.io.IOException;
 import java.net.MalformedURLException;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -22,6 +24,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
+import org.openstreetmap.josm.data.imagery.WMTSTileSource;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.layer.AlignImageryPanel;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
@@ -30,6 +33,7 @@
 import org.openstreetmap.josm.io.imagery.WMSImagery;
 import org.openstreetmap.josm.io.imagery.WMSImagery.LayerDetails;
 import org.openstreetmap.josm.io.imagery.WMSImagery.WMSGetCapabilitiesException;
+import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -63,12 +67,60 @@
         }
     }
 
+    /**
+     * Converts general ImageryInfo to specific one, that does not need any user action to initialize
+     * see: https://josm.openstreetmap.de/ticket/13868
+     * @param info
+     * @return
+     */
+    private ImageryInfo convertImagery(ImageryInfo info) {
+        try {
+            switch(info.getImageryType()) {
+            case WMS_ENDPOINT:
+                // convert to WMS type
+                return getWMSLayerInfo();
+            case WMTS:
+                // specify which layer to use
+                String layerId = new WMTSTileSource(info).userSelectLayer();
+                if (layerId != null) {
+                    ImageryInfo copy = new ImageryInfo(info);
+                    Collection<String> defaultLayers = new ArrayList<>(1);
+                    defaultLayers.add(layerId);
+                    copy.setDefaultLayers(defaultLayers);
+                    return copy;
+                }
+                // layer not selected - refuse to add
+                return null;
+            default:
+                return info;
+            }
+        } catch (MalformedURLException ex) {
+            if (!GraphicsEnvironment.isHeadless()) {
+                JOptionPane.showMessageDialog(Main.parent, tr("Invalid service URL."),
+                        tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
+            }
+            Main.error(ex, false);
+        } catch (IOException ex) {
+            if (!GraphicsEnvironment.isHeadless()) {
+                JOptionPane.showMessageDialog(Main.parent, tr("Could not retrieve WMS layer list."),
+                        tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
+            }
+            Main.error(ex, false);
+        } catch (WMSGetCapabilitiesException ex) {
+            if (!GraphicsEnvironment.isHeadless()) {
+                JOptionPane.showMessageDialog(Main.parent, tr("Could not parse WMS layer list."),
+                        tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
+            }
+            Main.error(ex, "Could not parse WMS layer list. Incoming data:\n"+ex.getIncomingData());
+        }
+        return null;
+    }
+
     @Override
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled()) return;
         try {
-            final ImageryInfo infoToAdd = ImageryType.WMS_ENDPOINT.equals(info.getImageryType())
-                    ? getWMSLayerInfo() : info;
+            final ImageryInfo infoToAdd = convertImagery(info);
             if (infoToAdd != null) {
                 Main.getLayerManager().addLayer(ImageryLayer.create(infoToAdd));
                 AlignImageryPanel.addNagPanelIfNeeded(infoToAdd);
@@ -84,73 +136,53 @@
         }
     }
 
-    protected ImageryInfo getWMSLayerInfo() {
-        try {
-            assert ImageryType.WMS_ENDPOINT.equals(info.getImageryType());
-            final WMSImagery wms = new WMSImagery();
-            wms.attemptGetCapabilities(info.getUrl());
+    protected ImageryInfo getWMSLayerInfo() throws IOException, WMSGetCapabilitiesException {
+        CheckParameterUtil.ensureThat(ImageryType.WMS_ENDPOINT.equals(info.getImageryType()), "wms_endpoint imagery type expected");
 
-            final WMSLayerTree tree = new WMSLayerTree();
-            tree.updateTree(wms);
-            List<String> wmsFormats = wms.getFormats();
-            final JComboBox<String> formats = new JComboBox<>(wmsFormats.toArray(new String[wmsFormats.size()]));
-            formats.setSelectedItem(wms.getPreferredFormats());
-            formats.setToolTipText(tr("Select image format for WMS layer"));
+        final WMSImagery wms = new WMSImagery();
+        wms.attemptGetCapabilities(info.getUrl());
 
-            if (!GraphicsEnvironment.isHeadless()) {
-                if (1 != new ExtendedDialog(Main.parent, tr("Select WMS layers"), new String[]{tr("Add layers"), tr("Cancel")}) { {
-                    final JScrollPane scrollPane = new JScrollPane(tree.getLayerTree());
-                    scrollPane.setPreferredSize(new Dimension(400, 400));
-                    final JPanel panel = new JPanel(new GridBagLayout());
-                    panel.add(scrollPane, GBC.eol().fill());
-                    panel.add(formats, GBC.eol().fill(GBC.HORIZONTAL));
-                    setContent(panel);
-                } }.showDialog().getValue()) {
-                    return null;
-                }
-            }
+        final WMSLayerTree tree = new WMSLayerTree();
+        tree.updateTree(wms);
+        List<String> wmsFormats = wms.getFormats();
+        final JComboBox<String> formats = new JComboBox<>(wmsFormats.toArray(new String[wmsFormats.size()]));
+        formats.setSelectedItem(wms.getPreferredFormats());
+        formats.setToolTipText(tr("Select image format for WMS layer"));
 
-            final String url = wms.buildGetMapUrl(
-                    tree.getSelectedLayers(), (String) formats.getSelectedItem());
-            Set<String> supportedCrs = new HashSet<>();
-            boolean first = true;
-            StringBuilder layersString = new StringBuilder();
-            for (LayerDetails layer: tree.getSelectedLayers()) {
-                if (first) {
-                    supportedCrs.addAll(layer.getProjections());
-                    first = false;
-                }
-                layersString.append(layer.name);
-                layersString.append(", ");
-                supportedCrs.retainAll(layer.getProjections());
+        if (!GraphicsEnvironment.isHeadless()) {
+            if (1 != new ExtendedDialog(Main.parent, tr("Select WMS layers"), new String[]{tr("Add layers"), tr("Cancel")}) { {
+                final JScrollPane scrollPane = new JScrollPane(tree.getLayerTree());
+                scrollPane.setPreferredSize(new Dimension(400, 400));
+                final JPanel panel = new JPanel(new GridBagLayout());
+                panel.add(scrollPane, GBC.eol().fill());
+                panel.add(formats, GBC.eol().fill(GBC.HORIZONTAL));
+                setContent(panel);
+            } }.showDialog().getValue()) {
+                return null;
             }
+        }
 
-            ImageryInfo ret = new ImageryInfo(info.getName(), url, "wms", info.getEulaAcceptanceRequired(), info.getCookies());
-            if (layersString.length() > 2) {
-                ret.setName(ret.getName() + ' ' + layersString.substring(0, layersString.length() - 2));
+        final String url = wms.buildGetMapUrl(
+                tree.getSelectedLayers(), (String) formats.getSelectedItem());
+        Set<String> supportedCrs = new HashSet<>();
+        boolean first = true;
+        StringBuilder layersString = new StringBuilder();
+        for (LayerDetails layer: tree.getSelectedLayers()) {
+            if (first) {
+                supportedCrs.addAll(layer.getProjections());
+                first = false;
             }
-            ret.setServerProjections(supportedCrs);
-            return ret;
-        } catch (MalformedURLException ex) {
-            if (!GraphicsEnvironment.isHeadless()) {
-                JOptionPane.showMessageDialog(Main.parent, tr("Invalid service URL."),
-                        tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
-            }
-            Main.error(ex, false);
-        } catch (IOException ex) {
-            if (!GraphicsEnvironment.isHeadless()) {
-                JOptionPane.showMessageDialog(Main.parent, tr("Could not retrieve WMS layer list."),
-                        tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
-            }
-            Main.error(ex, false);
-        } catch (WMSGetCapabilitiesException ex) {
-            if (!GraphicsEnvironment.isHeadless()) {
-                JOptionPane.showMessageDialog(Main.parent, tr("Could not parse WMS layer list."),
-                        tr("WMS Error"), JOptionPane.ERROR_MESSAGE);
-            }
-            Main.error(ex, "Could not parse WMS layer list. Incoming data:\n"+ex.getIncomingData());
+            layersString.append(layer.name);
+            layersString.append(", ");
+            supportedCrs.retainAll(layer.getProjections());
         }
-        return null;
+
+        ImageryInfo ret = new ImageryInfo(info.getName(), url, "wms", info.getEulaAcceptanceRequired(), info.getCookies());
+        if (layersString.length() > 2) {
+            ret.setName(ret.getName() + ' ' + layersString.substring(0, layersString.length() - 2));
+        }
+        ret.setServerProjections(supportedCrs);
+        return ret;
     }
 
     @Override
Index: src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 11213)
+++ src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(working copy)
@@ -16,6 +16,7 @@
 import java.util.TreeSet;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import javax.swing.ImageIcon;
 
@@ -192,6 +193,8 @@
     private String icon;
     private boolean isGeoreferenceValid;
     private boolean isEpsg4326To3857Supported;
+    /** which layers should be activated by default on layer addition. **/
+    private Collection<String> defaultLayers = Collections.emptyList();
     // when adding a field, also adapt the ImageryInfo(ImageryInfo)
     // and ImageryInfo(ImageryPreferenceEntry) constructor, equals method, and ImageryPreferenceEntry
 
@@ -226,6 +229,8 @@
         @pref Map<String, String> metadataHeaders;
         @pref boolean valid_georeference;
         @pref boolean supports_epsg_4326_to_3857_conversion;
+        // TODO: disabled until change of layers is implemented
+        // @pref String default_layers;
 
         /**
          * Constructs a new empty WMS {@code ImageryPreferenceEntry}.
@@ -270,16 +275,7 @@
                     shapes = shapesString.toString();
                 }
             }
-            if (!i.serverProjections.isEmpty()) {
-                StringBuilder val = new StringBuilder();
-                for (String p : i.serverProjections) {
-                    if (val.length() > 0) {
-                        val.append(',');
-                    }
-                    val.append(p);
-                }
-                projections = val.toString();
-            }
+            projections = i.serverProjections.stream().collect(Collectors.joining(","));
             if (i.noTileHeaders != null && !i.noTileHeaders.isEmpty()) {
                 noTileHeaders = new MultiMap<>(i.noTileHeaders);
             }
@@ -296,6 +292,8 @@
 
             valid_georeference = i.isGeoreferenceValid();
             supports_epsg_4326_to_3857_conversion = i.isEpsg4326To3857Supported();
+            // TODO disabled until change of layers is implemented
+            // default_layers = i.defaultLayers.stream().collect(Collectors.joining(","));
         }
 
         @Override
@@ -422,6 +420,8 @@
         metadataHeaders = e.metadataHeaders;
         isEpsg4326To3857Supported = e.supports_epsg_4326_to_3857_conversion;
         isGeoreferenceValid = e.valid_georeference;
+        // TODO disabled until change of layers is implemented
+        // defaultLayers = Arrays.asList(e.default_layers.split(","));
     }
 
     /**
@@ -453,6 +453,7 @@
         this.metadataHeaders = i.metadataHeaders;
         this.isEpsg4326To3857Supported = i.isEpsg4326To3857Supported;
         this.isGeoreferenceValid = i.isGeoreferenceValid;
+        this.defaultLayers = i.defaultLayers;
     }
 
     @Override
@@ -496,7 +497,8 @@
                 Objects.equals(this.description, other.description) &&
                 Objects.equals(this.noTileHeaders, other.noTileHeaders) &&
                 Objects.equals(this.noTileChecksums, other.noTileChecksums) &&
-                Objects.equals(this.metadataHeaders, other.metadataHeaders);
+                Objects.equals(this.metadataHeaders, other.metadataHeaders) &&
+                Objects.equals(this.defaultLayers, other.defaultLayers);
     }
 
     @Override
@@ -1146,4 +1148,22 @@
        }
        return l;
     }
+
+    /**
+     * Returns default layers that should be shown for this Imagery (if at all supported by imagery provider)
+     * If no layer is set to default and there is more than one imagery available, then user will be asked to choose the layer
+     * to work on
+     * @return Collection of the layer names
+     */
+    public Collection<String> getDefaultLayers() {
+        return defaultLayers;
+    }
+
+    /**
+     * Sets the default layers that user will work with
+     * @param layers
+     */
+    public void setDefaultLayers(Collection<String> layers) {
+        this.defaultLayers = layers;
+    }
 }
Index: src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
===================================================================
--- src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(revision 11213)
+++ src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(working copy)
@@ -15,6 +15,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.SortedSet;
 import java.util.Stack;
@@ -22,6 +23,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Collectors;
 
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
@@ -158,12 +160,12 @@
     }
 
     private static final class SelectLayerDialog extends ExtendedDialog {
-        private final transient Layer[] layers;
+        private final transient List<Entry<String,List<Layer>>> layers;
         private final JTable list;
 
         SelectLayerDialog(Collection<Layer> layers) {
             super(Main.parent, tr("Select WMTS layer"), new String[]{tr("Add layers"), tr("Cancel")});
-            this.layers = layers.toArray(new Layer[layers.size()]);
+            this.layers = groupLayersByName(layers);
             //getLayersTable(layers, Main.getProjection())
             this.list = new JTable(
                     new AbstractTableModel() {
@@ -171,11 +173,17 @@
                         public Object getValueAt(int rowIndex, int columnIndex) {
                             switch (columnIndex) {
                             case 0:
-                                return SelectLayerDialog.this.layers[rowIndex].name;
+                                return SelectLayerDialog.this.layers.get(rowIndex).getKey();
                             case 1:
-                                return SelectLayerDialog.this.layers[rowIndex].tileMatrixSet.crs;
+                                return SelectLayerDialog.this.layers.get(rowIndex).getValue()
+                                        .stream()
+                                        .map(x -> x.tileMatrixSet.crs)
+                                        .collect(Collectors.joining(", "));
                             case 2:
-                                return SelectLayerDialog.this.layers[rowIndex].tileMatrixSet.identifier;
+                                return SelectLayerDialog.this.layers.get(rowIndex).getValue()
+                                        .stream()
+                                        .map(x -> x.tileMatrixSet.identifier)
+                                        .collect(Collectors.joining(", "));
                             default:
                                 throw new IllegalArgumentException();
                             }
@@ -183,7 +191,7 @@
 
                         @Override
                         public int getRowCount() {
-                            return SelectLayerDialog.this.layers.length;
+                            return SelectLayerDialog.this.layers.size();
                         }
 
                         @Override
@@ -195,8 +203,8 @@
                         public String getColumnName(int column) {
                             switch (column) {
                             case 0: return tr("Layer name");
-                            case 1: return tr("Projection");
-                            case 2: return tr("Matrix set identifier");
+                            case 1: return tr("Projections");
+                            case 2: return tr("Matrix set identifiers");
                             default:
                                 throw new IllegalArgumentException();
                             }
@@ -215,12 +223,17 @@
             setContent(panel);
         }
 
-        public Layer getSelectedLayer() {
+        private List<Entry<String, List<Layer>>> groupLayersByName(Collection<Layer> layers) {
+            Map<String, List<Layer>> layerByName = layers.stream().collect(Collectors.groupingBy(x -> x.name));
+            return layerByName.entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toList());
+        }
+
+        public String getSelectedLayer() {
             int index = list.getSelectedRow();
             if (index < 0) {
                 return null; //nothing selected
             }
-            return layers[index];
+            return layers.get(index).getKey();
         }
     }
 
@@ -233,6 +246,8 @@
 
     private ScaleList nativeScaleList;
 
+    private String defaultLayer;
+
     /**
      * Creates a tile source based on imagery info
      * @param info imagery info
@@ -241,27 +256,31 @@
      */
     public WMTSTileSource(ImageryInfo info) throws IOException {
         super(info);
+        CheckParameterUtil.ensureThat(info.getDefaultLayers().size() < 2, "At most 1 default layer for WMTS is supported");
+
         this.baseUrl = GetCapabilitiesParseHelper.normalizeCapabilitiesUrl(handleTemplate(info.getUrl()));
         this.layers = getCapabilities();
+        this.defaultLayer = info.getDefaultLayers().isEmpty() ? null : info.getDefaultLayers().iterator().next();
         if (this.layers.isEmpty())
             throw new IllegalArgumentException(tr("No layers defined by getCapabilities document: {0}", info.getUrl()));
     }
 
-    private static Layer userSelectLayer(Collection<Layer> layers) {
-        if (layers.size() == 1)
-            return layers.iterator().next();
-        Layer ret = null;
+    /**
+     * Creates a dialog based on this tile source with all available layers and returns the name of selected layer
+     * @return Name of selected layer
+     */
+    public String userSelectLayer() {
+        Collection<String> layerNames = layers.stream().map(x -> x.name).collect(Collectors.toSet());
 
+        // if there is only one layer name no point in asking
+        if (layerNames.size() == 1)
+            return layerNames.iterator().next();
+
         final SelectLayerDialog layerSelection = new SelectLayerDialog(layers);
         if (layerSelection.showDialog().getValue() == 1) {
-            ret = layerSelection.getSelectedLayer();
-            // TODO: save layer information into ImageryInfo / ImageryPreferences?
+            return layerSelection.getSelectedLayer();
         }
-        if (ret == null) {
-            // user canceled operation or did not choose any layer
-            throw new IllegalArgumentException(tr("No layer selected"));
-        }
-        return ret;
+        return null;
     }
 
     private String handleTemplate(String url) {
@@ -535,9 +554,10 @@
     public void initProjection(Projection proj) {
         // getLayers will return only layers matching the name, if the user already choose the layer
         // so we will not ask the user again to chose the layer, if he just changes projection
-        Collection<Layer> candidates = getLayers(currentLayer != null ? currentLayer.name : null, proj.toCode());
-        if (!candidates.isEmpty()) {
-            Layer newLayer = userSelectLayer(candidates);
+        Collection<Layer> candidates = getLayers(currentLayer != null ? currentLayer.name : defaultLayer, proj.toCode());
+        if (candidates.size() == 1) {
+
+            Layer newLayer = candidates.iterator().next();
             if (newLayer != null) {
                 this.currentTileMatrixSet = newLayer.tileMatrixSet;
                 this.currentLayer = newLayer;
