--- /dev/null
+commit 78046ffe2187d91c61d6c2f910249b8a5be71b08
+Author: Stefan Schantl <stefan.schantl@ipfire.org>
+Date: Wed Oct 22 21:39:09 2014 +0200
+
+ Add changeip.com as new provider.
+
+ Fixes #10639.
+
+diff --git a/README b/README
+index 5944102..6a06f4b 100644
+--- a/README
++++ b/README
+@@ -49,6 +49,7 @@ INSTALLATION:
+
+ SUPPORTED PROVIDERS:
+ all-inkl.com
++ changeip.com
+ dhs.org
+ dns.lightningwirelabs.com
+ dnspark.com
+diff --git a/ddns.conf.sample b/ddns.conf.sample
+index d3ac53f..0048a46 100644
+--- a/ddns.conf.sample
++++ b/ddns.conf.sample
+@@ -30,6 +30,11 @@
+ # secret = XYZ
+ # ttl = 60
+
++# [test.changeip.com]
++# provider = changeip.com
++# username = user
++# password = pass
++
+ # [test.dhs.org]
+ # provider = dhs.org
+ # username = user
+diff --git a/src/ddns/providers.py b/src/ddns/providers.py
+index 1e88995..587d5ff 100644
+--- a/src/ddns/providers.py
++++ b/src/ddns/providers.py
+@@ -539,6 +539,44 @@ class DDNSProviderBindNsupdate(DDNSProvider):
+ return "\n".join(scriptlet)
+
+
++class DDNSProviderChangeIP(DDNSProvider):
++ handle = "changeip.com"
++ name = "ChangeIP.com"
++ website = "https://changeip.com"
++ protocols = ("ipv4",)
++
++ # Detailed information about the update api can be found here.
++ # http://www.changeip.com/accounts/knowledgebase.php?action=displayarticle&id=34
++
++ url = "https://nic.changeip.com/nic/update"
++ can_remove_records = False
++
++ def update_protocol(self, proto):
++ data = {
++ "hostname" : self.hostname,
++ "myip" : self.get_address(proto),
++ }
++
++ # Send update to the server.
++ try:
++ response = self.send_request(self.url, username=self.username, password=self.password,
++ data=data)
++
++ # Handle error codes.
++ except urllib2.HTTPError, e:
++ if e.code == 422:
++ raise DDNSRequestError(_("Domain not found."))
++
++ raise
++
++ # Handle success message.
++ if response.code == 200:
++ return
++
++ # If we got here, some other update error happened.
++ raise DDNSUpdateError(_("Server response: %s") % output)
++
++
+ class DDNSProviderDHS(DDNSProvider):
+ handle = "dhs.org"
+ name = "DHS International"
--- /dev/null
+commit 25f39b4e437627bd1a49393280271d59ad28b86e
+Author: Stefan Schantl <stefan.schantl@ipfire.org>
+Date: Mon Jan 5 21:37:55 2015 +0100
+
+ spdns.de: Fix authentication.
+
+ There was a simple copy and paste issue which prevents a
+ correct authentication with username and password against the
+ providers API.
+
+diff --git a/src/ddns/providers.py b/src/ddns/providers.py
+index 587d5ff..bcfb088 100644
+--- a/src/ddns/providers.py
++++ b/src/ddns/providers.py
+@@ -1271,7 +1271,7 @@ class DDNSProviderSPDNS(DDNSProtocolDynDNS2, DDNSProvider):
+
+ @property
+ def password(self):
+- return self.get("username") or self.token
++ return self.get("password") or self.token
+
+
+ class DDNSProviderStrato(DDNSProtocolDynDNS2, DDNSProvider):