diff --git a/src/ddns/providers.py b/src/ddns/providers.py
index 46d8a67..690516f 100644
--- a/src/ddns/providers.py
+++ b/src/ddns/providers.py
@@ -802,16 +802,54 @@ class DDNSProviderDtDNS(DDNSProvider):
 		raise DDNSUpdateError
 
 
-class DDNSProviderDuckDNS(DDNSProtocolDynDNS2, DDNSProvider):
+class DDNSProviderDuckDNS(DDNSProvider):
 	handle    = "duckdns.org"
 	name      = "Duck DNS"
 	website   = "http://www.duckdns.org/"
-	protocols = ("ipv4",)
+	protocols = ("ipv6", "ipv4",)
 
 	# Information about the format of the request is to be found
-	# https://www.duckdns.org/install.jsp
+	# https://www.duckdns.org/spec.jsp
+
+	# ipv4 / ipv6 records are automatically removed during the update
+	# process ( clear=true ) and the ipv4 / ipv6 addresses appended.
+	url = "https://www.duckdns.org/update"
+
+	def update(self):
+		# Raise an error if no auth details are given.
+		if not self.token:
+			raise DDNSConfigurationError
+
+		data =  {
+			"domains" : self.hostname,
+			"token"    : self.token,
+			"ipv6" : self.get_address("ipv6", "-"),
+			"ip" : self.get_address("ipv4", "-"),
+                        "clear" : "true",
+		}
+
+		# Send update to the server.
+		response = self.send_request(self.url, data=data)
+
+		# Get the full response message.
+		output = response.read().decode()
+
+		# Remove all leading and trailing whitespace.
+		output = output.strip()
 
-	url = "https://www.duckdns.org/nic/update"
+		print(output)
+
+		# Handle success messages.
+		if output == "OK":
+			return
+
+		# The provider does not give detailed information
+		# if the update fails. Only a "KO" will be sent back.
+		if output == "KO":
+			raise DDNSUpdateError
+
+		# If we got here, some other update error happened.
+		raise DDNSUpdateError
 
 
 class DDNSProviderDyFi(DDNSProtocolDynDNS2, DDNSProvider):
