diff --git a/_states/jenkins_smtp.py b/_states/jenkins_smtp.py
index 45f0244..687f254 100644
--- a/_states/jenkins_smtp.py
+++ b/_states/jenkins_smtp.py
@@ -1,51 +1,8 @@
 import logging
+import json
 
 logger = logging.getLogger(__name__)
 
-set_smtp_groovy = """\
-def result = ""
-for(desc in [Jenkins.getInstance().getDescriptor("hudson.plugins.emailext.ExtendedEmailPublisher"),Jenkins.getInstance().getDescriptor("hudson.tasks.Mailer")]){
-    if(desc.getSmtpServer().equals("${host}") &&
-       ((desc instanceof hudson.plugins.emailext.ExtendedEmailPublisherDescriptor && desc.getSmtpAuthUsername().equals("${username}")) ||
-        (desc instanceof hudson.tasks.Mailer$DescriptorImpl && desc.getSmtpAuthUserName().equals("${username}"))) &&
-       desc.getSmtpAuthPassword().toString().equals("${password}") &&
-       desc.getSmtpPort().equals("${port}") &&
-       desc.getUseSsl() == ${ssl} &&
-       desc.getCharset().equals("${charset}") &&
-       (!${reply_to_exists} || desc.getReplyAddress().equals("${reply_to}"))){
-            result = "EXISTS"
-    }else{
-        desc.setSmtpAuth("${username}", "${password}")
-        desc.setUseSsl(${ssl})
-        if(desc instanceof hudson.plugins.emailext.ExtendedEmailPublisherDescriptor){
-            desc.setSmtpServer("${host}")
-        }else{
-            desc.setSmtpHost("${host}")
-        }
-        desc.setSmtpPort("${port}")
-        desc.setCharset("${charset}")
-        if(${reply_to_exists}){
-            desc.setReplyToAddress("${reply_to}")
-        }
-        desc.save()
-        result = "SUCCESS"
-    }
-}
-print(result)
-"""  # noqa
-
-set_admin_email_groovy = """
-def jenkinsLocationConfiguration = JenkinsLocationConfiguration.get()
-if(jenkinsLocationConfiguration.getAdminAddress().equals("${email}")){
-    print("EXISTS")
-}else{
-    jenkinsLocationConfiguration.setAdminAddress("${email}")
-    jenkinsLocationConfiguration.save()
-    print("SUCCESS")
-}
-"""  # noqa
-
-
 def __virtual__():
     '''
     Only load if jenkins_common module exist.
@@ -73,42 +30,25 @@
     :param charset: SMTP charset (optional, default UTF-8)
     :returns: salt-specified state dict
     """
-    test = __opts__['test']  # noqa
-    ret = {
-        'name': name,
-        'changes': {},
-        'result': False,
-        'comment': '',
-    }
-    result = False
-    if test:
-        status = "SUCCESS"
-        ret['changes'][name] = status
-        ret['comment'] = 'Jenkins SMTP config %s %s' % (name, status.lower())
-    else:
-        call_result = __salt__['jenkins_common.call_groovy_script'](
-            set_smtp_groovy, {"username": username, "password": password, "host": host,
-                              "reply_to_exists": "true" if reply_to else "false",
-                              "reply_to": reply_to,
-                              "port": port if port else 25,
-                              "ssl": "true" if ssl else "false",
-                              "charset": charset if charset else "UTF-8"})
-        if call_result["code"] == 200 and call_result["msg"] in [
-                "SUCCESS", "EXISTS"]:
-            status = call_result["msg"]
-            if status == "SUCCESS":
-                ret['changes'][name] = status
-            ret['comment'] = 'Jenkins smtp config %s %s' % (
-                name, status.lower())
-            result = True
-        else:
-            status = 'FAILED'
-            logger.error(
-                "Jenkins smtp API call failure: %s", call_result["msg"])
-            ret['comment'] = 'Jenkins smtp API call failure: %s' % (call_result[
-                "msg"])
-    ret['result'] = None if test else result
-    return ret
+
+    template = __salt__['jenkins_common.load_template'](
+        'salt://jenkins/files/groovy/smtp.template',
+        __env__)
+
+    return __salt__['jenkins_common.api_call'](name, template,
+                        ['CHANGED', 'EXISTS'],
+                        {'params': json.dumps({
+                            'username': username,
+                            'password': password,
+                            'host': host,
+                            'useReplyTo': True if reply_to else False,
+                            'replyTo': reply_to,
+                            'port': port if port else 25,
+                            'ssl': True if ssl else False,
+                            'charset': charset if charset else 'UTF-8'
+                            })
+                        },
+                        'SMTP config')
 
 
 def admin_email(name, email):
@@ -118,35 +58,12 @@
     :param name: jenkins admin email
     :returns: salt-specified state dict
     """
-    test = __opts__['test']  # noqa
-    ret = {
-        'name': name,
-        'changes': {},
-        'result': False,
-        'comment': '',
-    }
-    result = False
-    if test:
-        status = "SUCCESS"
-        ret['changes'][name] = status
-        ret['comment'] = 'Jenkins admin email config %s %s' % (
-            name, status.lower())
-    else:
-        call_result = __salt__['jenkins_common.call_groovy_script'](
-            set_admin_email_groovy, {"email": email})
-        if call_result["code"] == 200 and call_result["msg"] in [
-                "SUCCESS", "EXISTS"]:
-            status = call_result["msg"]
-            if status == "SUCCESS":
-                ret['changes'][name] = status
-            ret['comment'] = 'Jenkins admin email config %s %s' % (
-                name, status.lower())
-            result = True
-        else:
-            status = 'FAILED'
-            logger.error(
-                "Jenkins admin email API call failure: %s", call_result["msg"])
-            ret['comment'] = 'Jenkins admin email API call failure: %s' % (call_result[
-                                                                           "msg"])
-    ret['result'] = None if test else result
-    return ret
+
+    template = __salt__['jenkins_common.load_template'](
+        'salt://jenkins/files/groovy/admin_email.template',
+        __env__)
+
+    return __salt__['jenkins_common.api_call'](name, template,
+                        ['CHANGED', 'EXISTS'],
+                        {'email': email},
+                        'Admin email config')
