Index: /trunk/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java	(revision 13731)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/GetCapabilitiesParseHelper.java	(revision 13732)
@@ -6,4 +6,5 @@
 import java.net.URL;
 import java.util.Locale;
+import java.util.function.BiFunction;
 
 import javax.xml.namespace.QName;
@@ -112,4 +113,38 @@
 
     /**
+     * Returns whole content of the element that reader is pointing at, including other XML elements within (with their tags).
+     *
+     * @param reader XMLStreamReader that should point to start of element
+     * @return content of current tag
+     * @throws XMLStreamException
+     */
+    public static String getElementTextWithSubtags(XMLStreamReader reader) throws XMLStreamException {
+        StringBuilder ret = new StringBuilder();
+        int level = 0;
+        QName tag = reader.getName();
+        for (int event = reader.getEventType(); reader.hasNext(); event = reader.next()) {
+            if (XMLStreamReader.START_ELEMENT == event) {
+                if (level > 0) {
+                    ret.append("<" + reader.getLocalName() +">");
+                }
+                level += 1;
+            } else if (XMLStreamReader.END_ELEMENT == event) {
+                level -= 1;
+                if (level == 0 && tag.equals(reader.getName())) {
+                    return ret.toString();
+                }
+                ret.append("</" + reader.getLocalName() +">");
+            } else if (XMLStreamReader.CHARACTERS == event) {
+                ret.append(reader.getText());
+            }
+            if (level < 0) {
+                throw new IllegalStateException("WMTS Parser error - moveReaderToEndCurrentTag failed to find closing tag");
+            }
+        }
+        throw new IllegalStateException("WMTS Parser error - moveReaderToEndCurrentTag failed to find closing tag");
+    }
+
+
+    /**
      * Moves reader to first occurrence of the structure equivalent of Xpath tags[0]/tags[1]../tags[n]. If fails to find
      * moves the reader to the closing tag of current tag
@@ -121,4 +156,19 @@
      */
     public static boolean moveReaderToTag(XMLStreamReader reader, QName... tags) throws XMLStreamException {
+        return moveReaderToTag(reader, QName::equals, tags);
+    }
+
+    /**
+     * Moves reader to first occurrence of the structure equivalent of Xpath tags[0]/tags[1]../tags[n]. If fails to find
+     * moves the reader to the closing tag of current tag
+     *
+     * @param tags array of tags
+     * @param reader XMLStreamReader which should be moved
+     * @param equalsFunc function to check equality of the tags
+     * @return true if tag was found, false otherwise
+     * @throws XMLStreamException See {@link XMLStreamReader}
+     */
+    public static boolean moveReaderToTag(XMLStreamReader reader,
+            BiFunction<QName, QName, Boolean> equalsFunc, QName... tags) throws XMLStreamException {
         QName stopTag = reader.getName();
         int currentLevel = 0;
@@ -128,12 +178,12 @@
 
         for (int event = 0; //skip current element, so we will not skip it as a whole
-                reader.hasNext() && !(event == XMLStreamReader.END_ELEMENT && stopTag.equals(reader.getName()));
+                reader.hasNext() && !(event == XMLStreamReader.END_ELEMENT && equalsFunc.apply(stopTag, reader.getName()));
                 event = reader.next()) {
-            if (event == XMLStreamReader.END_ELEMENT && skipTag != null && skipTag.equals(reader.getName())) {
+            if (event == XMLStreamReader.END_ELEMENT && skipTag != null && equalsFunc.apply(skipTag, reader.getName())) {
                 skipTag = null;
             }
             if (skipTag == null) {
                 if (event == XMLStreamReader.START_ELEMENT) {
-                    if (searchTag.equals(reader.getName())) {
+                    if (equalsFunc.apply(searchTag, reader.getName())) {
                         currentLevel += 1;
                         if (currentLevel >= tags.length) {
@@ -147,5 +197,5 @@
                 }
 
-                if (event == XMLStreamReader.END_ELEMENT && parentTag != null && parentTag.equals(reader.getName())) {
+                if (event == XMLStreamReader.END_ELEMENT && parentTag != null && equalsFunc.apply(parentTag, reader.getName())) {
                     currentLevel -= 1;
                     searchTag = parentTag;
@@ -209,4 +259,3 @@
         return crsIdentifier;
     }
-
 }
