diff --git a/dnsapi/dns_plesk.sh b/dnsapi/dns_plesk.sh
new file mode 100644
index 00000000..5896f80b
--- /dev/null
+++ b/dnsapi/dns_plesk.sh
@@ -0,0 +1,148 @@
+#!/usr/bin/env sh
+
+#
+#PLESK_Host="host.com"
+#
+#PLESK_User="sdfsdfsdfljlbjkljlkjsdfoiwje"
+#
+#PLESK_Password="xxxx@sss.com"
+
+
+######## Public functions #####################
+
+#Usage: add _acme-challenge.www.domain.com "XKrxpRBosdIKFzxW_CT3KLZNf6q0HG9i01zxXp5CPBs"
+dns_plesk_add() {
+ fulldomain=$1
+ txtvalue=$2
+
+ PLESK_Host="${CF_Key:-$(_readaccountconf_mutable PLESK_Host)}"
+ PLESK_SiteName="${CF_Key:-$(_readaccountconf_mutable PLESK_SiteName)}"
+ PLESK_User="${CF_Key:-$(_readaccountconf_mutable PLESK_User)}"
+ PLESK_Password="${CF_Key:-$(_readaccountconf_mutable PLESK_Password)}"
+
+ if [ -z "$PLESK_Host" ] || [ -z "$PLESK_User" ] || [ -z "$PLESK_Password"] || [ -z "$PLESK_SiteName"]; then
+ PLESK_Host=""
+ PLESK_User=""
+ PLESK_Password=""
+ PLESK_SiteName=""
+ _err "You didn't specify a plesk credentials yet."
+ _err "Please create the key and try again."
+ return 1
+ fi
+
+ #save the api key and email to the account conf file.
+ _saveaccountconf_mutable PLESK_Host "$PLESK_Host"
+ _saveaccountconf_mutable PLESK_User "$PLESK_User"
+ _saveaccountconf_mutable PLESK_Password "$PLESK_Password"
+ _saveaccountconf_mutable PLESK_SiteName "$PLESK_SiteName"
+
+ _debug "First detect the root zone"
+ if ! _get_root "$fulldomain"; then
+ _err "invalid domain"
+ return 1
+ fi
+ _debug _domain_id "$_domain_id"
+ _debug _sub_domain "$_sub_domain"
+ _debug _domain "$_domain"
+
+ _info "Adding record"
+ add_txt_record $_domain_id $_sub_domain $txtvalue
+
+}
+
+
+function plesk_api() {
+ local request="$1"
+
+ export _H1="HTTP_AUTH_LOGIN: $PLESK_User"
+ export _H2="HTTP_AUTH_PASSWD: $PLESK_Password"
+ export _H3="content-Type: text/xml"
+ export _H4="HTTP_PRETTY_PRINT: true"
+
+ response="$(_post $request "https://$PLESK_Host:8443/enterprise/control/agent.php" "" "POST")"
+ _debug2 "response" "$response"
+ return 0
+
+}
+
+function add_txt_record() {
+ local site_id=$1
+ local subdomain=$2
+ local txt_value=$3
+ local request="$site_idTXT$subdomain$txt_value"
+ plesk_api $request
+
+ if ! _contains "${response}" 'ok'; then
+ return 1
+ fi
+ return 0
+}
+
+function get_domain_list() {
+ local request=''
+
+ plesk_api $request
+
+ if ! _contains "${response}" 'ok'; then
+ return 1
+ fi
+
+ _plesk_domain_names=($(echo "${response}" | sed -nr 's_(.*)_\1_p'));
+ _plesk_domain_ids=($(echo "${response}"| sed -nr 's_(.*)_\1_p'));
+ _plesk_domain_ids=("${_plesk_domain_ids[@]:1}")
+
+}
+
+ #urls=($(sed -nr 's_(.*)_\1_p' resp.txt)); echo ${urls[@]}
+
+#domain.com
+#returns
+# _plesk_site_id=22
+function get_site_id() {
+ local site_name=$1
+ request="$site_name"
+ plesk_api $request
+ echo $resonse
+ _plesk_site_id="$(echo $response | grep -Po '(?<=).*?(?=)')"
+ return 0
+}
+
+#_acme-challenge.www.domain.com
+#returns
+# _sub_domain=_acme-challenge.www
+# _domain=domain.com
+# _domain_id=sdjkglgdfewsdfg
+_get_root() {
+ domain=$1
+ i=2
+ p=1
+
+ get_domain_list
+
+ while true; do
+ h=$(printf "%s" "$domain" | cut -d . -f $i-100)
+ _debug h "$h"
+ if [ -z "$h" ]; then
+ #not valid
+ return 1
+ fi
+
+ j=0
+ for item in "${_plesk_domain_names[@]}"
+ do
+ _debug "item" $item
+ if [ "$h" = "$item" ]; then
+
+ _sub_domain=$(printf "%s" "$domain" | cut -d . -f 1-$p)
+ _domain="$h"
+ _domain_id=${_plesk_domain_ids[$j]}
+ return 0
+ fi
+ j=$(_math "$j" +1)
+ done
+ p=$i
+ i=$(_math "$i" + 1)
+ done
+ return 1
+}
+