Index: /trunk/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java	(revision 15409)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java	(revision 15410)
@@ -63,9 +63,12 @@
     static final QName QN_OWS_HTTP                = new QName(OWS_NS_URL, "HTTP");
     static final QName QN_OWS_IDENTIFIER          = new QName(OWS_NS_URL, "Identifier");
+    static final QName QN_OWS_LOWER_CORNER        = new QName(OWS_NS_URL, "LowerCorner");
     static final QName QN_OWS_OPERATION           = new QName(OWS_NS_URL, "Operation");
     static final QName QN_OWS_OPERATIONS_METADATA = new QName(OWS_NS_URL, "OperationsMetadata");
     static final QName QN_OWS_SUPPORTED_CRS       = new QName(OWS_NS_URL, "SupportedCRS");
     static final QName QN_OWS_TITLE               = new QName(OWS_NS_URL, "Title");
+    static final QName QN_OWS_UPPER_CORNER        = new QName(OWS_NS_URL, "UpperCorner");
     static final QName QN_OWS_VALUE               = new QName(OWS_NS_URL, "Value");
+    static final QName QN_OWS_WGS84_BOUNDING_BOX  = new QName(OWS_NS_URL, "WGS84BoundingBox");
     // CHECKSTYLE.ON: SingleSpaceSeparator
 
Index: /trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(revision 15409)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(revision 15410)
@@ -6,8 +6,11 @@
 import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_HTTP;
 import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_IDENTIFIER;
+import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_LOWER_CORNER;
 import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_OPERATION;
 import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_OPERATIONS_METADATA;
 import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_SUPPORTED_CRS;
 import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_TITLE;
+import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_UPPER_CORNER;
+import static org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.QN_OWS_WGS84_BOUNDING_BOX;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -33,4 +36,5 @@
 import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiFunction;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -56,4 +60,5 @@
 import org.openstreetmap.josm.data.imagery.GetCapabilitiesParseHelper.TransferMode;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
+import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionRegistry;
@@ -211,4 +216,5 @@
         private String baseUrl;
         private String style;
+        private BBox bbox;
         private final Collection<String> tileMatrixSetLinks = new ArrayList<>();
         private final Collection<Dimension> dimensions = new ArrayList<>();
@@ -221,4 +227,5 @@
             baseUrl = l.baseUrl;
             style = l.style;
+            bbox = l.bbox;
             tileMatrixSet = new TileMatrixSet(l.tileMatrixSet);
             dimensions.addAll(l.dimensions);
@@ -276,4 +283,13 @@
         public int getMaxZoom() {
             return tileMatrixSet != null ? tileMatrixSet.getMaxZoom() : 0;
+        }
+
+        /**
+         * Returns the WGS84 bounding box.
+         * @return WGS84 bounding box
+         * @since 15410
+         */
+        public BBox getBbox() {
+            return bbox;
         }
     }
@@ -355,4 +371,11 @@
                 if (first.getMaxZoom() < info.getMaxZoom()) {
                     first = layers.stream().filter(l -> l.getMaxZoom() >= info.getMaxZoom()).findFirst().orElse(first);
+                }
+                // If center of josm bbox not in layer bbox, try to find a better layer
+                if (info.getBounds() != null && first.getBbox() != null) {
+                    LatLon center = info.getBounds().getCenter();
+                    if (!first.getBbox().bounds(center)) {
+                        first = layers.stream().filter(l -> l.getBbox().bounds(center)).findFirst().orElse(first);
+                    }
                 }
                 this.defaultLayer = new DefaultLayer(info.getImageryType(), first.identifier, first.style, first.tileMatrixSet.identifier);
@@ -568,4 +591,6 @@
                     } else if (QN_TILEMATRIX_SET_LINK.equals(qName)) {
                         layer.tileMatrixSetLinks.add(parseTileMatrixSetLink(reader));
+                    } else if (QN_OWS_WGS84_BOUNDING_BOX.equals(qName)) {
+                        layer.bbox = parseBoundingBox(reader);
                     } else {
                         GetCapabilitiesParseHelper.moveReaderToEndCurrentTag(reader);
@@ -688,10 +713,5 @@
                     ret.scaleDenominator = Double.parseDouble(reader.getElementText());
                 } else if (QN_TOPLEFT_CORNER.equals(qName)) {
-                    String[] topLeftCorner = reader.getElementText().split(" ");
-                    if (matrixProj.switchXY()) {
-                        ret.topLeftCorner = new EastNorth(Double.parseDouble(topLeftCorner[1]), Double.parseDouble(topLeftCorner[0]));
-                    } else {
-                        ret.topLeftCorner = new EastNorth(Double.parseDouble(topLeftCorner[0]), Double.parseDouble(topLeftCorner[1]));
-                    }
+                    ret.topLeftCorner = parseEastNorth(reader.getElementText(), matrixProj.switchXY());
                 } else if (QN_TILE_HEIGHT.equals(qName)) {
                     ret.tileHeight = Integer.parseInt(reader.getElementText());
@@ -710,4 +730,49 @@
         }
         return ret;
+    }
+
+    private static <T> T parseCoor(String coor, boolean switchXY, BiFunction<String, String, T> function) {
+        String[] parts = coor.split(" ");
+        if (switchXY) {
+            return function.apply(parts[1], parts[0]);
+        } else {
+            return function.apply(parts[0], parts[1]);
+        }
+    }
+
+    private static EastNorth parseEastNorth(String coor, boolean switchXY) {
+        return parseCoor(coor, switchXY, (e, n) -> new EastNorth(Double.parseDouble(e), Double.parseDouble(n)));
+    }
+
+    private static LatLon parseLatLon(String coor, boolean switchXY) {
+        return parseCoor(coor, switchXY, (lon, lat) -> new LatLon(Double.parseDouble(lat), Double.parseDouble(lon)));
+    }
+
+    /**
+     * Parses WGS84BoundingBox section. Returns when reader is on WGS84BoundingBox closing tag.
+     * @param reader StAX reader instance
+     * @return WGS84 bounding box
+     * @throws XMLStreamException See {@link XMLStreamReader}
+     */
+    private static BBox parseBoundingBox(XMLStreamReader reader) throws XMLStreamException {
+        LatLon lowerCorner = null;
+        LatLon upperCorner = null;
+        for (int event = reader.getEventType();
+                reader.hasNext() && !(event == XMLStreamReader.END_ELEMENT &&
+                        QN_OWS_WGS84_BOUNDING_BOX.equals(reader.getName()));
+                event = reader.next()) {
+            if (event == XMLStreamReader.START_ELEMENT) {
+                QName qName = reader.getName();
+                if (QN_OWS_LOWER_CORNER.equals(qName)) {
+                    lowerCorner = parseLatLon(reader.getElementText(), false);
+                } else if (QN_OWS_UPPER_CORNER.equals(qName)) {
+                    upperCorner = parseLatLon(reader.getElementText(), false);
+                }
+            }
+        }
+        if (lowerCorner != null && upperCorner != null) {
+            return new BBox(lowerCorner, upperCorner);
+        }
+        return null;
     }
 
