diff --git a/.travis.yml b/.travis.yml
index 6cdabe0..88378ba 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,3 +6,7 @@ before_install:
   - if [ $TRAVIS_CPU_ARCH = ppc64le ]; then
           sudo apt-get install maven ;
     fi
+
+cache:
+  directories:
+  - $HOME/.m2
diff --git a/Changelog b/Changelog
index 4af36de..7527119 100644
--- a/Changelog
+++ b/Changelog
@@ -1,5 +1,3 @@
-Fix security issue CWE-611
-
 1.12.0
 Add flag ACCEPT_NULL_DATES
 
diff --git a/debian/changelog b/debian/changelog
index 67472d7..dbaf5d0 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+axmlrpc (1.12.1+git20220216.1.ec19188-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Thu, 14 Apr 2022 21:06:09 -0000
+
 axmlrpc (1.12.1-1) unstable; urgency=medium
 
   * Team upload.
diff --git a/pom.xml b/pom.xml
index 6d6df40..5134cb4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>fr.turri</groupId>
 	<artifactId>aXMLRPC</artifactId>
-	<version>1.12.1</version>
+	<version>1.13.0-SNAPSHOT</version>
 	<packaging>jar</packaging>
 	<name>aXMLRPC</name>
 	<description>Lightweight Java XML-RPC working also on Android.</description>
@@ -34,7 +34,7 @@
 		<dependency>
 			<groupId>junit</groupId>
 			<artifactId>junit</artifactId>
-			<version>4.13.1</version>
+			<version>4.13.2</version>
 			<scope>test</scope>
 		</dependency>
 		<dependency>
@@ -45,7 +45,7 @@
         <dependency>
           <groupId>com.github.tomakehurst</groupId>
           <artifactId>wiremock-jre8</artifactId>
-          <version>2.27.2</version>
+          <version>2.28.0</version>
           <scope>test</scope>
         </dependency>
 	</dependencies>
@@ -53,7 +53,7 @@
         <connection>scm:git:https://github.com/gturri/aXMLRPC.git</connection>
         <developerConnection>scm:git:git@github.com:gturri/aXMLRPC.git</developerConnection>
         <url>https://github.com/gturri/aXMLRPC</url>
-        <tag>aXMLRPC-1.12.1</tag>
+        <tag>aXMLRPC-1.8.2</tag>
 	</scm>
     <build>
       <pluginManagement>
@@ -102,7 +102,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
-          <version>3.2.0</version>
+          <version>3.3.1</version>
           <executions>
             <execution>
               <id>attach-javadocs</id>
@@ -134,7 +134,7 @@
         <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-javadoc-plugin</artifactId>
-          <version>3.2.0</version>
+          <version>3.3.1</version>
           <reportSets>
             <reportSet>
               <reports>
@@ -174,7 +174,7 @@
             <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-javadoc-plugin</artifactId>
-              <version>3.2.0</version>
+              <version>3.3.1</version>
               <executions>
                 <execution>
                   <id>attach-javadocs</id>
@@ -187,7 +187,7 @@
             <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-gpg-plugin</artifactId>
-              <version>1.6</version>
+              <version>3.0.1</version>
               <executions>
                 <execution>
                   <id>sign-artifacts</id>
diff --git a/src/main/java/de/timroes/axmlrpc/ResponseParser.java b/src/main/java/de/timroes/axmlrpc/ResponseParser.java
index 6117937..6feef08 100644
--- a/src/main/java/de/timroes/axmlrpc/ResponseParser.java
+++ b/src/main/java/de/timroes/axmlrpc/ResponseParser.java
@@ -10,7 +10,6 @@ import java.util.Map;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.OutputKeys;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
@@ -46,17 +45,9 @@ public class ResponseParser {
 	public Object parse(SerializerHandler serializerHandler, InputStream response, boolean debugMode) throws XMLRPCException {
 
 		try {
-			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 
-			// Ensure the xml parser won't allow exploitation of the vuln CWE-611
-			// (described on https://cwe.mitre.org/data/definitions/611.html )
-			factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
-			factory.setExpandEntityReferences(false);
+			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
 			factory.setNamespaceAware(true);
-			factory.setXIncludeAware(false);
-			factory.setExpandEntityReferences(false);
-			// End of the configuration of the parser for CWE-611
-
 			DocumentBuilder builder = factory.newDocumentBuilder();
 			Document dom = builder.parse(response);
 			if (debugMode ){
diff --git a/src/test/java/de/timroes/TestResponseParser.java b/src/test/java/de/timroes/TestResponseParser.java
new file mode 100644
index 0000000..31fd97e
--- /dev/null
+++ b/src/test/java/de/timroes/TestResponseParser.java
@@ -0,0 +1,285 @@
+package de.timroes;
+
+import static org.junit.Assert.*;
+
+import de.timroes.axmlrpc.*;
+import de.timroes.axmlrpc.serializer.SerializerHandler;
+import org.junit.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class TestResponseParser {
+    public final static String xmlDecl = "<?xml version=\"1.0\"?>";
+    public final static SerializerHandler sh = new SerializerHandler(XMLRPCClient.FLAGS_NONE);
+
+
+    @Test
+    public void testSimpleResponse() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(xmlDecl +
+                "<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("toto", actual);
+    }
+
+    @Test
+    public void testWithTrailingWhitespaceInTags() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(xmlDecl +
+                "<methodResponse >" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param >" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("toto", actual);
+    }
+
+    @Test
+    public void testWithTrailingEndlineInTags() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(xmlDecl +
+                "<methodResponse\n>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param\n>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("toto", actual);
+    }
+
+    @Test
+    public void testWithTrailingTabInTags() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(xmlDecl +
+                "<methodResponse\t>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param\t>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("toto", actual);
+    }
+
+    @Test
+    public void testResponseWithNonAsciiCharacter() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(xmlDecl +
+                "<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>Aéris</string></value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("Aéris", actual);
+    }
+
+    @Test
+    public void testUTF16Response() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, bytesToStream((xmlDecl +
+                "<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>").getBytes(StandardCharsets.UTF_16)), false);
+        assertEquals("toto", actual);
+    }
+
+    @Test
+    public void testResponseWithComplexValue() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(xmlDecl +
+                "<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value>" +
+                "        <struct>" +
+                "          <member><name>intValue</name><value><i4>12</i4></value></member>" +
+                "          <member><name>otherIntValue</name><value><int>13</int></value></member>" +
+                "          <member><name>boolValue</name><value><boolean>1</boolean></value></member>" +
+                "          <member><name>strValue</name><value><string>toto</string></value></member>" +
+                "          <member><name>doubleValue</name><value><double>12.4</double></value></member>" +
+                "          <member><name>dateValue</name><value><dateTime.iso8601>20200908T0440Z</dateTime.iso8601></value></member>" +
+                // Don't test base64 because it seems assertEqual will do a reference equals on arrray of bytes so it's not easily testable here
+                // so we test it in a test below
+                //"          <member><name>base64Value</name><value><base64>QWVyaXM=</base64></value></member>" +
+                "          <member><name>nestedValue</name><value><struct> " +
+                "            <member><name>innerStrValue</name><value><string>inner</string></value></member>" +
+                "          </struct></value></member>" +
+                "        </struct>" +
+                "      </value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+
+        Map<Object, Object> expected = new TreeMap<>();
+        expected.put("intValue", 12);
+        expected.put("otherIntValue", 13);
+        expected.put("boolValue", true);
+        expected.put("strValue", "toto");
+        expected.put("doubleValue", 12.4);
+        expected.put("dateValue", new Date(1599540000000L));
+        Map<Object, Object> innerStruct = new TreeMap<>();
+        innerStruct.put("innerStrValue", "inner");
+        expected.put("nestedValue", innerStruct);
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testResponseWithBase64Value() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(xmlDecl +
+                "<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value>" +
+                "        <base64>QWVyaXM=</base64>" +
+                "      </value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+
+        String actualAsStr = new String((byte[]) actual, StandardCharsets.UTF_8);
+        assertEquals("Aeris", actualAsStr);
+    }
+
+    @Test
+    /**
+     * I'm not sure it really makes sense to support this case. But since I'm adding tests on code which existed
+     * for years, I guess it's better to avoid breaking retro compatibility.
+     */
+    public void testAcceptMissingHeader() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream("<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("toto", actual);
+    }
+
+    @Test
+    public void testXmlrpcError() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        try {
+            sut.parse(sh, strToStream("<methodResponse>" +
+                    "  <fault>" +
+                    "    <value>" +
+                    "      <struct>" +
+                    "        <member>" +
+                    "          <name>faultCode</name>" +
+                    "          <value><int>4</int></value>" +
+                    "        </member>" +
+                    "        <member>" +
+                    "          <name>faultString</name>" +
+                    "          <value><string>error X occurred</string></value>" +
+                    "        </member>" +
+                    "      </struct>" +
+                    "    </value>" +
+                    "  </fault>" +
+                    "</methodResponse>"), false);
+            fail("The previous call should have thrown");
+        } catch (XMLRPCServerException e){
+            assertEquals("error X occurred [4]", e.getMessage());
+            assertEquals(4, e.getErrorNr());
+        }
+    }
+
+    @Test
+    public void testResponseWithXmlComment() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream("<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <!--value><string>toto</string></value-->" +
+                "      <value><string>tata</string></value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("tata", actual);
+    }
+
+    @Test
+    public void testResponseWithInlineXmlComment() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream("<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>ti<!--blah-->ti</string></value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("titi", actual);
+    }
+
+    @Test
+    public void testResponseWithSpecialChars() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream("<methodResponse>" +
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>to&lt;to</string></value>" +
+                "    </param>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+        assertEquals("to<to", actual);
+    }
+
+    @Test(expected = XMLRPCException.class)
+    public void testErrorMissingMethodResponseTag() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream(
+                "  <params>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param>" +
+                "  </params>"), false);
+    }
+
+    @Test(expected = XMLRPCException.class)
+    public void testErrorMissingParamsTag() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream("<methodResponse>" +
+                "    <param>" +
+                "      <value><string>toto</string></value>" +
+                "    </param>" +
+                "</methodResponse>"), false);
+    }
+
+    @Test(expected = XMLRPCException.class)
+    public void testErrorMissingParamTag() throws Exception {
+        ResponseParser sut = new ResponseParser();
+        Object actual = sut.parse(sh, strToStream("<methodResponse>" +
+                "  <params>" +
+                "      <value><string>toto</string></value>" +
+                "  </params>" +
+                "</methodResponse>"), false);
+    }
+
+    private static InputStream strToStream(String str){
+        return bytesToStream(str.getBytes(StandardCharsets.UTF_8));
+    }
+
+    private static InputStream bytesToStream(byte[] bytes){
+        return new ByteArrayInputStream(bytes);
+    }
+}