Index: trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(revision 12223)
+++ trunk/src/org/openstreetmap/josm/data/imagery/WMTSTileSource.java	(revision 12224)
@@ -74,4 +74,6 @@
     // CHECKSTYLE.OFF: SingleSpaceSeparator
     private static final QName QN_CONTENTS            = new QName(WMTSTileSource.WMTS_NS_URL, "Contents");
+    private static final QName QN_DEFAULT             = new QName(WMTSTileSource.WMTS_NS_URL, "Default");
+    private static final QName QN_DIMENSION           = new QName(WMTSTileSource.WMTS_NS_URL, "Dimension");
     private static final QName QN_FORMAT              = new QName(WMTSTileSource.WMTS_NS_URL, "Format");
     private static final QName QN_LAYER               = new QName(WMTSTileSource.WMTS_NS_URL, "Layer");
@@ -87,4 +89,5 @@
     private static final QName QN_TILE_HEIGHT         = new QName(WMTSTileSource.WMTS_NS_URL, "TileHeight");
     private static final QName QN_TOPLEFT_CORNER      = new QName(WMTSTileSource.WMTS_NS_URL, "TopLeftCorner");
+    private static final QName QN_VALUE               = new QName(WMTSTileSource.WMTS_NS_URL, "Value");
     // CHECKSTYLE.ON: SingleSpaceSeparator
 
@@ -142,5 +145,10 @@
             identifier = builder.identifier;
         }
-
+    }
+
+    private static class Dimension {
+        private String identifier;
+        private String defaultValue;
+        private final List<String> values = new ArrayList<>();
     }
 
@@ -153,4 +161,5 @@
         private String style;
         private final Collection<String> tileMatrixSetLinks = new ArrayList<>();
+        private final Collection<Dimension> dimensions = new ArrayList<>();
 
         Layer(Layer l) {
@@ -162,4 +171,5 @@
             style = l.style;
             tileMatrixSet = new TileMatrixSet(l.tileMatrixSet);
+            dimensions.addAll(l.dimensions);
         }
 
@@ -458,6 +468,8 @@
                             tagStack.push(reader.getName()); // keep tagStack in sync
                         }
+                    } else if (QN_DIMENSION.equals(reader.getName())) {
+                        layer.dimensions.add(parseDimension(reader));
                     } else if (QN_TILEMATRIX_SET_LINK.equals(reader.getName())) {
-                        layer.tileMatrixSetLinks.add(praseTileMatrixSetLink(reader));
+                        layer.tileMatrixSetLinks.add(parseTileMatrixSetLink(reader));
                     } else {
                         GetCapabilitiesParseHelper.moveReaderToEndCurrentTag(reader);
@@ -488,4 +500,30 @@
 
     /**
+     * Gets Dimension value. Returns when reader is on Dimension closing tag
+     *
+     * @param reader StAX reader instance
+     * @return dimension
+     * @throws XMLStreamException See {@link XMLStreamReader}
+     */
+    private static Dimension parseDimension(XMLStreamReader reader) throws XMLStreamException {
+        Dimension ret = new Dimension();
+        for (int event = reader.getEventType();
+                reader.hasNext() && !(event == XMLStreamReader.END_ELEMENT &&
+                        QN_DIMENSION.equals(reader.getName()));
+                event = reader.next()) {
+            if (event == XMLStreamReader.START_ELEMENT) {
+                if (GetCapabilitiesParseHelper.QN_OWS_IDENTIFIER.equals(reader.getName())) {
+                    ret.identifier = reader.getElementText();
+                } else if (QN_DEFAULT.equals(reader.getName())) {
+                    ret.defaultValue = reader.getElementText();
+                } else if (QN_VALUE.equals(reader.getName())) {
+                    ret.values.add(reader.getElementText());
+                }
+            }
+        }
+        return ret;
+    }
+
+    /**
      * Gets TileMatrixSetLink value. Returns when reader is on TileMatrixSetLink closing tag
      *
@@ -494,5 +532,5 @@
      * @throws XMLStreamException See {@link XMLStreamReader}
      */
-    private static String praseTileMatrixSetLink(XMLStreamReader reader) throws XMLStreamException {
+    private static String parseTileMatrixSetLink(XMLStreamReader reader) throws XMLStreamException {
         String ret = null;
         for (int event = reader.getEventType();
@@ -718,5 +756,5 @@
         }
 
-        return url.replaceAll("\\{layer\\}", this.currentLayer.identifier)
+        url = url.replaceAll("\\{layer\\}", this.currentLayer.identifier)
                 .replaceAll("\\{format\\}", this.currentLayer.format)
                 .replaceAll("\\{TileMatrixSet\\}", this.currentTileMatrixSet.identifier)
@@ -725,4 +763,10 @@
                 .replaceAll("\\{TileCol\\}", Integer.toString(tilex))
                 .replaceAll("(?i)\\{style\\}", this.currentLayer.style);
+
+        for (Dimension d : currentLayer.dimensions) {
+            url = url.replaceAll("\\{"+d.identifier+"\\}", d.defaultValue);
+        }
+
+        return url;
     }
 
@@ -935,4 +979,8 @@
     }
 
+    /**
+     * Returns the tile projection.
+     * @return the tile projection
+     */
     public Projection getTileProjection() {
         return tileProjection;
