diff --git a/_modules/jenkins_common.py b/_modules/jenkins_common.py
index 64c5544..c7446fa 100644
--- a/_modules/jenkins_common.py
+++ b/_modules/jenkins_common.py
@@ -1,6 +1,7 @@
 import logging
 
 from salt.exceptions import SaltInvocationError
+from string import Template
 
 try:
     import bcrypt
@@ -32,7 +33,8 @@
     return True
 
 
-def call_groovy_script(script, props, username=None, password=None, success_status_codes=[200]):
+def call_groovy_script(script, props, username=None,
+                       password=None, success_status_codes=[200]):
     """
     Common method for call Jenkins groovy script API
 
@@ -80,15 +82,16 @@
     return ret
 
 
-def render_groovy_script(script, props):
+def render_groovy_script(script_template, props):
     """
     Helper method for rendering groovy script with props
 
-    :param script: groovy script template
+    :param script_template: groovy script template
     :param props: groovy script properties
     :returns: generated groovy script
     """
-    return script.format(**props)
+    template = Template(script_template)
+    return template.safe_substitute(props)
 
 
 def get_api_crumb(jenkins_url=None, jenkins_user=None, jenkins_password=None):
diff --git a/_states/jenkins_approval.py b/_states/jenkins_approval.py
index e4b21b4..2764745 100644
--- a/_states/jenkins_approval.py
+++ b/_states/jenkins_approval.py
@@ -1,51 +1,52 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 approve_signature_groovy = """\
 import org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval
 import org.jenkinsci.plugins.scriptsecurity.scripts.languages.GroovyLanguage
 import org.jenkinsci.plugins.scriptsecurity.scripts.ApprovalContext
-def signature = '{signature}'
+def signature = '${signature}'
 def scriptApproval = ScriptApproval.get()
 def approvedSignatures = Arrays.asList(scriptApproval.approvedSignatures)
-if(approvedSignatures.contains(signature)){{
+if(approvedSignatures.contains(signature)){
     print("EXISTS")
-}}else{{
-    try{{
+}else{
+    try{
         scriptApproval.pendingSignatures.add(new ScriptApproval.PendingSignature(signature, false, ApprovalContext.create()))
         scriptApproval.approveSignature(signature)
-        if(Arrays.asList(scriptApproval.approvedSignatures).contains(signature)){{
+        if(Arrays.asList(scriptApproval.approvedSignatures).contains(signature)){
             print("SUCCESS")
-        }}else{{
+        }else{
             print("FAILED")
-        }}
-    }}catch(e){{
+        }
+    }catch(e){
         print(e)
-    }}
-}}
-""" # noqa
+    }
+}
+"""  # noqa
 
 deny_signature_groovy = """\
 import org.jenkinsci.plugins.scriptsecurity.scripts.ScriptApproval
 import org.jenkinsci.plugins.scriptsecurity.scripts.languages.GroovyLanguage
 import org.jenkinsci.plugins.scriptsecurity.scripts.ApprovalContext
-def signature = '{signature}'
+def signature = '${signature}'
 def scriptApproval = ScriptApproval.get()
 def approvedSignatures = Arrays.asList(scriptApproval.approvedSignatures)
-if(approvedSignatures.contains(signature)){{
-    try{{
+if(approvedSignatures.contains(signature)){
+    try{
         scriptApproval.denySignature(signature)
-        if(!scriptApproval.approvedSignatures.contains(signature)){{
+        if(!scriptApproval.approvedSignatures.contains(signature)){
             print("SUCCESS")
-        }}else{{
+        }else{
             print("FAILED")
-        }}
-    }}catch(e){{
+        }
+    }catch(e){
         print(e)
-    }}
-}}else{{
+    }
+}else{
     print("NOT PRESENT")
-}}
+}
 
 
 """
@@ -81,22 +82,25 @@
     if test:
         status = "SUCCESS"
         ret['changes'][name] = status
-        ret['comment'] = 'Jenkins script approval config %s %s' % (name, status.lower())
+        ret['comment'] = 'Jenkins script approval config %s %s' % (
+            name, status.lower())
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
-            approve_signature_groovy, {"signature":name})
-        if call_result["code"] == 200 and call_result["msg"] in ["SUCCESS", "EXISTS"]:
+            approve_signature_groovy, {"signature": name})
+        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 script approval config %s %s' % (name, status.lower())
+            ret['comment'] = 'Jenkins script approval config %s %s' % (
+                name, status.lower())
             result = True
         else:
             status = 'FAILED'
             logger.error(
                 "Jenkins script approval API call failure: %s", call_result["msg"])
             ret['comment'] = 'Jenkins script approval API call failure: %s' % (call_result[
-                                                                           "msg"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
 
@@ -119,21 +123,24 @@
     if test:
         status = "SUCCESS"
         ret['changes'][name] = status
-        ret['comment'] = 'Jenkins script approval config %s %s' % (name, status.lower())
+        ret['comment'] = 'Jenkins script approval config %s %s' % (
+            name, status.lower())
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
-            deny_signature_groovy, {"signature":name})
-        if call_result["code"] == 200 and call_result["msg"] in ["SUCCESS", "NOT PRESENT"]:
+            deny_signature_groovy, {"signature": name})
+        if call_result["code"] == 200 and call_result["msg"] in [
+                "SUCCESS", "NOT PRESENT"]:
             status = call_result["msg"]
             if status == "SUCCESS":
                 ret['changes'][name] = status
-            ret['comment'] = 'Jenkins script approval config %s %s' % (name, status.lower())
+            ret['comment'] = 'Jenkins script approval config %s %s' % (
+                name, status.lower())
             result = True
         else:
             status = 'FAILED'
             logger.error(
                 "Jenkins script approval API call failure: %s", call_result["msg"])
             ret['comment'] = 'Jenkins script approval lib API call failure: %s' % (call_result[
-                                                                           "msg"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
diff --git a/_states/jenkins_artifactory.py b/_states/jenkins_artifactory.py
index 38ce6c2..daccc2e 100644
--- a/_states/jenkins_artifactory.py
+++ b/_states/jenkins_artifactory.py
@@ -1,4 +1,5 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 add_artifactory_groovy = u"""\
@@ -8,42 +9,42 @@
 def inst = Jenkins.getInstance()
 def desc = inst.getDescriptor("org.jfrog.hudson.ArtifactoryBuilder")
 // empty artifactory servers is not empty list but null, but find can be called on null
-def server =  desc.getArtifactoryServers().find{{it -> it.name.equals("{name}")}}
+def server =  desc.getArtifactoryServers().find{it -> it.name.equals("${name}")}
 if(server &&
-   server.getName().equals("{name}") &&
-   server.getUrl().equals("{serverUrl}") &&
-   (server.getDeployerCredentialsConfig() == null || server.getDeployerCredentialsConfig().getCredentialsId().equals("{credentialsId}")) &&
-   (server.getResolverCredentialsConfig() == null || server.getResolverCredentialsConfig().getCredentialsId().equals("{credentialsId}"))){{
+   server.getName().equals("${name}") &&
+   server.getUrl().equals("${serverUrl}") &&
+   (server.getDeployerCredentialsConfig() == null || server.getDeployerCredentialsConfig().getCredentialsId().equals("${credentialsId}")) &&
+   (server.getResolverCredentialsConfig() == null || server.getResolverCredentialsConfig().getCredentialsId().equals("${credentialsId}"))){
         print("EXISTS")
-}}else{{
+}else{
     // we must care about null here
-    if(desc.getArtifactoryServers() != null && !desc.getArtifactoryServers().isEmpty()){{
-        desc.getArtifactoryServers().removeIf{{it -> it.name.equals("{name}")}}
-    }}else{{
+    if(desc.getArtifactoryServers() != null && !desc.getArtifactoryServers().isEmpty()){
+        desc.getArtifactoryServers().removeIf{it -> it.name.equals("${name}")}
+    }else{
         desc.setArtifactoryServers([])
-    }}
+    }
     def newServer = new ArtifactoryServer(
-      "{name}",
-      "{serverUrl}",
-      new CredentialsConfig("", "", "{credentialsId}"),
-      new CredentialsConfig("", "", "{credentialsId}"),
+      "${name}",
+      "${serverUrl}",
+      new CredentialsConfig("", "", "${credentialsId}"),
+      new CredentialsConfig("", "", "${credentialsId}"),
       300,
       false,
       null)
     desc.getArtifactoryServers().add(newServer)
     desc.save()
     print("ADDED/CHANGED")
-}}
+}
 """  # noqa
 
 delete_artifactory_groovy = u"""\
 def inst = Jenkins.getInstance()
 def desc = inst.getDescriptor("org.jfrog.hudson.ArtifactoryBuilder")
-if(desc.getArtifactoryServers().removeIf{{it -> it.name.equals("{name}")}}){{
+if(desc.getArtifactoryServers().removeIf{it -> it.name.equals("${name}")}){
     print("REMOVED")
-}}else{{
+}else{
     print("NOT PRESENT")
-}}
+}
 """  # noqa
 
 
@@ -68,7 +69,8 @@
     :param credential_id: artifactory server credential id
     :returns: salt-specified state dict
     """
-    return _plugin_call(name, url, credential_id, add_artifactory_groovy, ["ADDED/CHANGED", "EXISTS"], **kwargs)
+    return _plugin_call(name, url, credential_id, add_artifactory_groovy, [
+                        "ADDED/CHANGED", "EXISTS"], **kwargs)
 
 
 def absent(name, **kwargs):
@@ -78,7 +80,8 @@
     :param name: artifactory server name
     :returns: salt-specified state dict
     """
-    return _plugin_call(name, None, None, delete_artifactory_groovy, ["REMOVED", "NOT PRESENT"], **kwargs)
+    return _plugin_call(name, None, None, delete_artifactory_groovy, [
+                        "REMOVED", "NOT PRESENT"], **kwargs)
 
 
 def _plugin_call(name, url, credentialsId, template, success_msgs, **kwargs):
diff --git a/_states/jenkins_credential.py b/_states/jenkins_credential.py
index b2470fc..0a6287a 100644
--- a/_states/jenkins_credential.py
+++ b/_states/jenkins_credential.py
@@ -1,4 +1,5 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 create_credential_groovy = u"""\
@@ -9,48 +10,48 @@
         com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
         Jenkins.instance
     )
-def key = \"\"\"{key}
+def key = \"\"\"${key}
 \"\"\"
 
-def result = creds.find{{
+def result = creds.find{
   (it instanceof com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl &&
-    it.username == "{username}" &&
-    it.id == "{name}" &&
-    it.description == "{desc}" &&
-    it.password.toString() == "{password}") ||
+    it.username == "${username}" &&
+    it.id == "${name}" &&
+    it.description == "${desc}" &&
+    it.password.toString() == "${password}") ||
   (it instanceof com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey &&
-    it.username == "{username}" &&
-    it.id == "{name}" &&
-    ("{password}" == "" || it.passphrase.toString() == "{password}") &&
-    it.description == "{desc}" &&
+    it.username == "${username}" &&
+    it.id == "${name}" &&
+    ("${password}" == "" || it.passphrase.toString() == "${password}") &&
+    it.description == "${desc}" &&
     it.privateKeySource.privateKey.equals(key.trim()))
-}}
+}
 
-if(result){{
+if(result){
     print("EXISTS")
-}}else{{
+}else{
     domain = Domain.global()
     store = Jenkins.instance.getExtensionList(
       'com.cloudbees.plugins.credentials.SystemCredentialsProvider'
     )[0].getStore()
 
-    credentials_new = new {clazz}(
+    credentials_new = new ${clazz}(
       {params}
     )
     // remove credentails with same if before created new one, if exists
     def existingCreds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
         com.cloudbees.plugins.credentials.common.StandardUsernameCredentials.class,
-        Jenkins.instance).find{{it -> it.id.equals("{name}")}}
-    if(existingCreds){{
+        Jenkins.instance).find{it -> it.id.equals("${name}")}
+    if(existingCreds){
         store.removeCredentials(domain, existingCreds)
-    }}
+    }
     ret = store.addCredentials(domain, credentials_new)
-    if (ret) {{
+    if (ret) {
       print("CREATED");
-    }} else {{
+    } else {
         print("FAILED");
-    }}
-}}
+    }
+}
 """  # noqa
 
 
@@ -103,7 +104,8 @@
 
         call_result = __salt__['jenkins_common.call_groovy_script'](
             create_credential_groovy, {"name": name, "username": username, "password": password if password else "", "clazz": clazz, "params": params, "key": key if key else "", "desc": desc if desc else ""})
-        if call_result["code"] == 200 and call_result["msg"] in ["CREATED", "EXISTS"]:
+        if call_result["code"] == 200 and call_result["msg"] in [
+                "CREATED", "EXISTS"]:
             status = call_result["msg"]
             if call_result["msg"] == "CREATED":
                 ret['changes'][name] = status
diff --git a/_states/jenkins_job.py b/_states/jenkins_job.py
index 6f72d9d..dccac86 100644
--- a/_states/jenkins_job.py
+++ b/_states/jenkins_job.py
@@ -15,10 +15,10 @@
 
 # Jenkins
 try:
-  import jenkins
-  HAS_JENKINS = True
+    import jenkins
+    HAS_JENKINS = True
 except ImportError:
-  HAS_JENKINS = False
+    HAS_JENKINS = False
 
 log = logging.getLogger(__name__)
 
@@ -27,7 +27,12 @@
     '''
     Only load if jenkins_common module exist.
     '''
-    if HAS_JENKINS and 'jenkins_common.call_groovy_script' not in __salt__:
+    if not HAS_JENKINS:
+        return (
+            False,
+            'The jenkins_job state module cannot be loaded: '
+            'python Jenkins API client could not be imported')
+    if 'jenkins_common.call_groovy_script' not in __salt__:
         return (
             False,
             'The jenkins_job state module cannot be loaded: '
@@ -71,7 +76,6 @@
             else:
                 raise e
 
-
         if _job_exists:
             buf = six.moves.StringIO(_current_job_config)
             oldXMLstring = buf.read()
@@ -151,7 +155,7 @@
            'changes': {},
            'comment': "Cleanup not necessary"}
     list_jobs_groovy = """\
-        print(Jenkins.instance.items.collect{{it -> it.name}})
+        print(Jenkins.instance.items.collect{it -> it.name})
     """
     deleted_jobs = []
     if test:
@@ -159,7 +163,8 @@
         ret['changes'][name] = status
         ret['comment'] = 'Jobs %s' % status.lower()
     else:
-        call_result = __salt__['jenkins_common.call_groovy_script'](list_jobs_groovy,{})
+        call_result = __salt__['jenkins_common.call_groovy_script'](
+            list_jobs_groovy, {})
         if call_result["code"] == 200:
             existing_jobs = call_result["msg"]
             if existing_jobs:
diff --git a/_states/jenkins_lib.py b/_states/jenkins_lib.py
index 88f1a47..46970f5 100644
--- a/_states/jenkins_lib.py
+++ b/_states/jenkins_lib.py
@@ -1,4 +1,5 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 config_global_libs_groovy = """\
@@ -7,47 +8,47 @@
 import jenkins.plugins.git.GitSCMSource;
 
 def globalLibsDesc = Jenkins.getInstance().getDescriptor("org.jenkinsci.plugins.workflow.libs.GlobalLibraries")
-def existingLib = globalLibsDesc.get().getLibraries().find{{
+def existingLib = globalLibsDesc.get().getLibraries().find{
   (!it.retriever.class.name.equals("org.jenkinsci.plugins.workflow.libs.SCMSourceRetriever") || 
-   it.retriever.scm.remote.equals("{url}") &&
-   it.retriever.scm.credentialsId.equals("{credential_id}")) &&
-   it.name.equals("{lib_name}") &&
-   it.defaultVersion.equals("{branch}") &&
+   it.retriever.scm.remote.equals("${url}") &&
+   it.retriever.scm.credentialsId.equals("${credential_id}")) &&
+   it.name.equals("${lib_name}") &&
+   it.defaultVersion.equals("${branch}") &&
    it.implicit == true
-}}
-if(existingLib){{
+}
+if(existingLib){
     print("EXISTS")
-}}else{{
+}else{
     SCMSourceRetriever retriever = new SCMSourceRetriever(new GitSCMSource(
-        "{lib_name}",
-        "{url}",
-        "{credential_id}",
+        "${lib_name}",
+        "${url}",
+        "${credential_id}",
         "*",
         "",
         false))
-    LibraryConfiguration library = new LibraryConfiguration("{lib_name}", retriever)
-    library.setDefaultVersion("{branch}")
+    LibraryConfiguration library = new LibraryConfiguration("${lib_name}", retriever)
+    library.setDefaultVersion("${branch}")
     library.setImplicit({implicit})
-    if(globalLibsDesc.get().getLibraries().isEmpty()){{
+    if(globalLibsDesc.get().getLibraries().isEmpty()){
       globalLibsDesc.get().setLibraries([library])
-    }}else{{
-      globalLibsDesc.get().getLibraries().removeIf{{ it.name.equals("{lib_name}")}}
+    }else{
+      globalLibsDesc.get().getLibraries().removeIf{ it.name.equals("${lib_name}")}
       globalLibsDesc.get().getLibraries().add(library)
-    }}
+    }
     globalLibsDesc.save()
     print("SUCCESS")
-}}
-""" # noqa
+}
+"""  # noqa
 
 remove_global_libs_groovy = """\
 def globalLibsDesc = Jenkins.getInstance().getDescriptor("org.jenkinsci.plugins.workflow.libs.GlobalLibraries")
-def existingLib = globalLibsDesc.get().getLibraries().removeIf{{it.name.equals("{lib_name}")}}
-if(existingLib){{
+def existingLib = globalLibsDesc.get().getLibraries().removeIf{it.name.equals("${lib_name}")}
+if(existingLib){
     globalLibsDesc.save()
     print("DELETED")
-}}else{{
+}else{
     print("NOT PRESENT")
-}}
+}
 """
 
 
@@ -63,7 +64,8 @@
     return True
 
 
-def present(name, url, branch="master", credential_id="", implicit=True, **kwargs):
+def present(name, url, branch="master",
+            credential_id="", implicit=True, **kwargs):
     """
     Jenkins Global pipeline library present state method
 
@@ -85,27 +87,30 @@
     if test:
         status = "SUCCESS"
         ret['changes'][name] = status
-        ret['comment'] = 'Jenkins pipeline lib config %s %s' % (name, status.lower())
+        ret['comment'] = 'Jenkins pipeline lib config %s %s' % (
+            name, status.lower())
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
-            config_global_libs_groovy, {"lib_name":name,
-                                  "url": url,
-                                  "branch": branch,
-                                  "credential_id": credential_id if credential_id else "",
-                                  "implicit": "true" if implicit else "false"
-                                  })
-        if call_result["code"] == 200 and call_result["msg"] in ["SUCCESS", "EXISTS"]:
+            config_global_libs_groovy, {"lib_name": name,
+                                        "url": url,
+                                        "branch": branch,
+                                        "credential_id": credential_id if credential_id else "",
+                                        "implicit": "true" if implicit else "false"
+                                        })
+        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 pipeline lib config %s %s' % (name, status.lower())
+            ret['comment'] = 'Jenkins pipeline lib config %s %s' % (
+                name, status.lower())
             result = True
         else:
             status = 'FAILED'
             logger.error(
                 "Jenkins pipeline lib API call failure: %s", call_result["msg"])
             ret['comment'] = 'Jenkins pipeline lib API call failure: %s' % (call_result[
-                                                                           "msg"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
 
@@ -128,21 +133,24 @@
     if test:
         status = "SUCCESS"
         ret['changes'][name] = status
-        ret['comment'] = 'Jenkins pipeline lib config %s %s' % (name, status.lower())
+        ret['comment'] = 'Jenkins pipeline lib config %s %s' % (
+            name, status.lower())
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
-            remove_global_libs_groovy, {"lib_name":name})
-        if call_result["code"] == 200 and call_result["msg"] in ["DELETED", "NOT PRESENT"]:
+            remove_global_libs_groovy, {"lib_name": name})
+        if call_result["code"] == 200 and call_result["msg"] in [
+                "DELETED", "NOT PRESENT"]:
             status = call_result["msg"]
             if status == "DELETED":
                 ret['changes'][name] = status
-            ret['comment'] = 'Jenkins pipeline lib config %s %s' % (name, status.lower())
+            ret['comment'] = 'Jenkins pipeline lib config %s %s' % (
+                name, status.lower())
             result = True
         else:
             status = 'FAILED'
             logger.error(
                 "Jenkins pipeline lib API call failure: %s", call_result["msg"])
             ret['comment'] = 'Jenkins pipeline lib API call failure: %s' % (call_result[
-                                                                           "msg"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
diff --git a/_states/jenkins_node.py b/_states/jenkins_node.py
index aa54efd..cb88fa8 100644
--- a/_states/jenkins_node.py
+++ b/_states/jenkins_node.py
@@ -1,6 +1,6 @@
 import logging
-logger = logging.getLogger(__name__)
 
+logger = logging.getLogger(__name__)
 
 create_node_groovy = u"""\
 import jenkins.model.*
@@ -8,48 +8,48 @@
 import hudson.slaves.*
 import hudson.plugins.sshslaves.*
 
-def result=Jenkins.instance.slaves.find{{
+def result=Jenkins.instance.slaves.find{
  it.name == '{name}' &&
  it.numExecutors == {num_executors} &&
- it.nodeDescription == "{desc}" &&
- it.remoteFS == "{remote_home}" &&
- it.labelString == "{label}" &&
+ it.nodeDescription == "${desc}" &&
+ it.remoteFS == "${remote_home}" &&
+ it.labelString == "${label}" &&
  it.mode == Node.Mode.{node_mode} &&
  it.launcher.getClass().getName().equals({launcher}.getClass().getName()) &&
- it.retentionStrategy.getClass().getName().equals(new hudson.slaves.RetentionStrategy.{ret_strategy}().getClass().getName())}}
-if(result){{
+ it.retentionStrategy.getClass().getName().equals(new hudson.slaves.RetentionStrategy.${ret_strategy}().getClass().getName())}
+if(result){
     print("EXISTS")
-}}else{{
+}else{
   Slave slave = new DumbSlave(
-                    "{name}",
-                    "{desc}",
-                    "{remote_home}",
-                    "{num_executors}",
-                    Node.Mode.{node_mode},
-                    "{label}",
-                    {launcher},
-                    new RetentionStrategy.{ret_strategy}(),
+                    "${name}",
+                    "${desc}",
+                    "${remote_home}",
+                    "${num_executors}",
+                    Node.Mode.${node_mode},
+                    "${label}",
+                    ${launcher},
+                    new RetentionStrategy.${ret_strategy}(),
                     new LinkedList())
   Jenkins.instance.addNode(slave)
   print("CREATED")
-}}
+}
 """  # noqa
 
 create_lbl_groovy = u"""\
 hudson = hudson.model.Hudson.instance
 updated = false
-hudson.slaves.find {{ slave -> slave.nodeName.equals("{name}")
-  if({append}){{
-    slave.labelString = slave.labelString + " " + "{lbl_text}"
-  }}else{{
-    slave.labelString = "{lbl_text}"
-  }}
+hudson.slaves.find { slave -> slave.nodeName.equals("${name}")
+  if({append}){
+    slave.labelString = slave.labelString + " " + "${lbl_text}"
+  }else{
+    slave.labelString = "${lbl_text}"
+  }
   updated = true
-  print "{lbl_text}"
-}}
-if(!updated){{
+  print "${lbl_text}"
+}
+if(!updated){
     print "FAILED"
-}}
+}
 hudson.save()
 """  # noqa
 
@@ -57,26 +57,26 @@
 def instance = Jenkins.instance
 def changed = false
 
-if(Jenkins.instance.numExecutors != {num_executors}){{
-    Jenkins.instance.setNumExecutors({num_executors})
+if(Jenkins.instance.numExecutors != ${num_executors}){
+    Jenkins.instance.setNumExecutors(${num_executors})
     changed = true
-}}
+}
 
-if(!Jenkins.instance.mode.name.equals(new String("{node_mode}").toUpperCase())){{
-    Jenkins.instance.setMode(Node.Mode.{node_mode})
+if(!Jenkins.instance.mode.name.equals(new String("${node_mode}").toUpperCase())){
+    Jenkins.instance.setMode(Node.Mode.${node_mode})
     changed = true
-}}
+}
 
-if(!Jenkins.instance.labelString.equals("{labels}")){{
-    Jenkins.instance.setLabelString("{labels}")
+if(!Jenkins.instance.labelString.equals("${labels}")){
+    Jenkins.instance.setLabelString("${labels}")
     changed = true
-}}
-if(changed){{
+}
+if(changed){
     Jenkins.instance.save()
     print("CREATED")
-}}else{{
+}else{
     print("EXISTS")
-}}
+}
 """
 
 
@@ -115,7 +115,8 @@
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
             create_lbl_groovy, {'name': name, 'lbl_text': lbl_text, 'append': "true" if append else "false"})
-        if call_result["code"] == 200 and call_result["msg"].strip() == lbl_text:
+        if call_result["code"] == 200 and call_result["msg"].strip(
+        ) == lbl_text:
             status = "CREATED"
             ret['changes'][name] = status
             ret['comment'] = 'Label %s %s ' % (name, status.lower())
@@ -130,7 +131,8 @@
     return ret
 
 
-def present(name, remote_home, launcher, num_executors="1", node_mode="Normal", desc="", labels=[], ret_strategy="Always"):
+def present(name, remote_home, launcher, num_executors="1",
+            node_mode="Normal", desc="", labels=[], ret_strategy="Always"):
     """
     Jenkins node state method
 
@@ -176,7 +178,8 @@
                 "launcher": launcher_string,
                 "node_mode": node_mode.upper(),
                 "ret_strategy": ret_strategy if ret_strategy else "Always"})
-        if call_result["code"] == 200 and call_result["msg"] in ["CREATED", "EXISTS"]:
+        if call_result["code"] == 200 and call_result["msg"] in [
+                "CREATED", "EXISTS"]:
             status = call_result["msg"]
             if call_result["msg"] == "CREATED":
                 ret['changes'][name] = status
@@ -217,7 +220,8 @@
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
             configure_master_groovy, {'num_executors': num_executors, 'labels': " ".join(labels), 'node_mode': node_mode.upper()})
-        if call_result["code"] == 200 and call_result["msg"] in ["CREATED", "EXISTS"]:
+        if call_result["code"] == 200 and call_result["msg"] in [
+                "CREATED", "EXISTS"]:
             status = call_result["msg"]
             if status == "CREATED":
                 ret['changes'][name] = status
diff --git a/_states/jenkins_plugin.py b/_states/jenkins_plugin.py
index cb54633..d9fe8e9 100644
--- a/_states/jenkins_plugin.py
+++ b/_states/jenkins_plugin.py
@@ -1,4 +1,5 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 install_plugin_groovy = """\
@@ -8,43 +9,43 @@
 def logger = Logger.getLogger("")
 def installed = false
 def exists = false
-def pluginName="{plugin}"
+def pluginName="${plugin}"
 def instance = Jenkins.getInstance()
 def pm = instance.getPluginManager()
 def uc = instance.getUpdateCenter()
-def needUpdateSites(maxOldInSec = 1800){{
+def needUpdateSites(maxOldInSec = 1800){
   long oldestTs = 0
-  for (UpdateSite s : Jenkins.instance.updateCenter.siteList) {{
-    if(oldestTs == 0 || s.getDataTimestamp()<oldestTs){{
+  for (UpdateSite s : Jenkins.instance.updateCenter.siteList) {
+    if(oldestTs == 0 || s.getDataTimestamp()<oldestTs){
        oldestTs = s.getDataTimestamp()
-    }}
-  }}
+    }
+  }
    return (System.currentTimeMillis()-oldestTs)/1000 > maxOldInSec
-}}
+}
 
-if (!pm.getPlugin(pluginName)) {{
-  if(needUpdateSites()) {{
+if (!pm.getPlugin(pluginName)) {
+  if(needUpdateSites()) {
      uc.updateAllSites()
-  }}
+  }
   def plugin = uc.getPlugin(pluginName)
-  if (plugin) {{
+  if (plugin) {
     plugin.deploy()
     installed = true
-  }}
-}}else{{
+  }
+}else{
     exists = true
     print("EXISTS")
-}}
-if (installed) {{
+}
+if (installed) {
   instance.save()
-  if({restart}){{
+  if({restart}){
       instance.doSafeRestart()
-   }}
+   }
   print("INSTALLED")
-}}else if(!exists){{
+}else if(!exists){
   print("FAILED")
-}}
-""" # noqa
+}
+"""  # noqa
 
 remove_plugin_groovy = """
 import jenkins.model.*
@@ -54,27 +55,27 @@
 def installed = false
 def initialized = false
 
-def pluginName="{plugin}"
+def pluginName="${plugin}"
 def instance = Jenkins.getInstance()
 def pm = instance.getPluginManager()
 
 def actPlugin = pm.getPlugin(pluginName)
-if (!actPlugin) {{
+if (!actPlugin) {
    def pluginToInstall = Jenkins.instance.updateCenter.getPlugin(pluginName)
-   if(!pluginToInstall){{
+   if(!pluginToInstall){
       print("FAILED")
-   }}else{{
+   }else{
       print("NOT PRESENT")
-   }}
-}} else {{
+   }
+} else {
    actPlugin.disable()
    actPlugin.archive.delete()
-   if({restart}){{
+   if({restart}){
       instance.doSafeRestart()
-   }}
+   }
    print("REMOVED")
-}}
-""" # noqa
+}
+"""  # noqa
 
 
 def __virtual__():
@@ -97,7 +98,8 @@
     :param restart: do you want to restart jenkins after plugin install?
     :returns: salt-specified state dict
     """
-    return _plugin_call(name, restart, install_plugin_groovy, ["INSTALLED", "EXISTS"])
+    return _plugin_call(name, restart, install_plugin_groovy, [
+                        "INSTALLED", "EXISTS"])
 
 
 def absent(name, restart=False):
@@ -108,7 +110,8 @@
     :param restart: do you want to restart jenkins after plugin remove?
     :returns: salt-specified state dict
     """
-    return _plugin_call(name, restart, remove_plugin_groovy, ["REMOVED", "NOT PRESENT"])
+    return _plugin_call(name, restart, remove_plugin_groovy, [
+                        "REMOVED", "NOT PRESENT"])
 
 
 def _plugin_call(name, restart, template, success_msgs):
@@ -131,13 +134,14 @@
             status = call_result["msg"]
             if status == success_msgs[0]:
                 ret['changes'][name] = status
-            ret['comment'] = 'Jenkins plugin %s %s%s' % (name, status.lower(), ", jenkins restarted" if status == success_msgs[0] and restart else "")
+            ret['comment'] = 'Jenkins plugin %s %s%s' % (name, status.lower(
+            ), ", jenkins restarted" if status == success_msgs[0] and restart else "")
             result = True
         else:
             status = 'FAILED'
             logger.error(
                 "Jenkins plugin API call failure: %s", call_result["msg"])
             ret['comment'] = 'Jenkins plugin API call failure: %s' % (call_result[
-                                                                           "msg"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
diff --git a/_states/jenkins_security.py b/_states/jenkins_security.py
index 6442e2b..98e8a70 100644
--- a/_states/jenkins_security.py
+++ b/_states/jenkins_security.py
@@ -1,4 +1,5 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 set_ldap_groovy = """\
@@ -6,24 +7,24 @@
 import hudson.security.*
 import org.jenkinsci.plugins.*
 
-def server = '{server}'
-def rootDN = '{rootDN}'
-def userSearchBase = '{userSearchBase}'
-def userSearch = '{userSearch}'
-def groupSearchBase = '{groupSearchBase}'
-def managerDN = '{managerDN}'
-def managerPassword = '{managerPassword}'
+def server = '${server}'
+def rootDN = '${rootDN}'
+def userSearchBase = '${userSearchBase}'
+def userSearch = '${userSearch}'
+def groupSearchBase = '${groupSearchBase}'
+def managerDN = '${managerDN}'
+def managerPassword = '${managerPassword}'
 boolean inhibitInferRootDN = {inhibitInferRootDN}
 
-try{{
+try{
 ldapRealm = Class.forName("hudson.security.LDAPSecurityRealm").getConstructor(String.class, String.class, String.class, String.class, String.class, String.class, String.class, Boolean.TYPE)
 .newInstance(server, rootDN, userSearchBase, userSearch, groupSearchBase, managerDN, managerPassword, inhibitInferRootDN) 
 Jenkins.instance.setSecurityRealm(ldapRealm)
 Jenkins.instance.save()
 print("SUCCESS")
-}}catch(ClassNotFoundException e){{
+}catch(ClassNotFoundException e){
     print("Cannot instantiate LDAPSecurityRealm, maybe ldap plugin not installed")
-}}
+}
 """  # noqa
 
 set_matrix_groovy = """\
@@ -32,15 +33,15 @@
 import com.cloudbees.plugins.credentials.*
 
 def instance = Jenkins.getInstance()
-try{{
-def strategy = Class.forName("hudson.security.{matrix_class}").newInstance()
-{strategies}
+try{
+def strategy = Class.forName("hudson.security.${matrix_class}").newInstance()
+${strategies}
 instance.setAuthorizationStrategy(strategy)
 instance.save()
 print("SUCCESS")
-}}catch(ClassNotFoundException e){{
-    print("Cannot instantiate {matrix_class}, maybe auth-matrix plugin not installed")
-}}
+}catch(ClassNotFoundException e){
+    print("Cannot instantiate ${matrix_class}, maybe auth-matrix plugin not installed")
+}
 """  # noqa
 
 
@@ -56,7 +57,8 @@
     return True
 
 
-def ldap(name, server, root_dn, user_search_base, manager_dn, manager_password, user_search="", group_search_base="", inhibit_infer_root_dn=False):
+def ldap(name, server, root_dn, user_search_base, manager_dn, manager_password,
+         user_search="", group_search_base="", inhibit_infer_root_dn=False):
     """
     Jenkins ldap state method
 
@@ -93,7 +95,7 @@
                               "managerDN": manager_dn if manager_dn else "",
                               "managerPassword": manager_password if manager_password else "",
                               "userSearch": user_search if user_search else "",
-                              "groupSearchBase": group_search_base if group_search_base else "", 
+                              "groupSearchBase": group_search_base if group_search_base else "",
                               "inhibitInferRootDN": "true" if inhibit_infer_root_dn else "false"})
         if call_result["code"] == 200 and call_result["msg"] == "SUCCESS":
             status = call_result["msg"]
@@ -155,7 +157,8 @@
 
 def _build_strategies(permissions):
     strategies_str = ""
-    for strategy in _to_strategies_list("strategy.add({},\"{}\")", _to_one_dict(permissions, "")):
+    for strategy in _to_strategies_list(
+            "strategy.add({},\"{}\")", _to_one_dict(permissions, "")):
         strategies_str += "{}\n".format(strategy)
     return strategies_str
 
diff --git a/_states/jenkins_slack.py b/_states/jenkins_slack.py
index cbe52ec..d0d5636 100644
--- a/_states/jenkins_slack.py
+++ b/_states/jenkins_slack.py
@@ -1,29 +1,30 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 config_slack_groovy = """\
 jenkins = jenkins.model.Jenkins.getInstance()
-try{{
+try{
 slack = jenkins.getDescriptorByType(jenkins.plugins.slack.SlackNotifier.DescriptorImpl)
-if(slack.teamDomain.equals("{team_domain}") &&
-   slack.token.equals("{token}") &&
-   slack.tokenCredentialId.equals("{token_credential_id}") &&
-   slack.room.equals("{room}") &&
-   slack.sendAs.equals("{send_as}")){{
+if(slack.teamDomain.equals("${team_domain}") &&
+   slack.token.equals("${token}") &&
+   slack.tokenCredentialId.equals("${token_credential_id}") &&
+   slack.room.equals("${room}") &&
+   slack.sendAs.equals("${send_as}")){
         print("EXISTS")
-}}else{{
-    slack.teamDomain = "{team_domain}"
-    slack.token = "{token}"
-    slack.tokenCredentialId = "{token_credential_id}"
-    slack.room = "{room}"
-    slack.sendAs = "{send_as}"
+}else{
+    slack.teamDomain = "${team_domain}"
+    slack.token = "${token}"
+    slack.tokenCredentialId = "${token_credential_id}"
+    slack.room = "${room}"
+    slack.sendAs = "${send_as}"
     slack.save()
     print("SUCCESS")
-}}
-}}catch(all){{
+}
+}catch(all){
     print("Cannot instantiate Jenkins Slack plugin, maybe plugin is not installed")
-}}
-""" # noqa
+}
+"""  # noqa
 
 
 def __virtual__():
@@ -38,7 +39,8 @@
     return True
 
 
-def config(name, team_domain, token, token_credential_id="", room="", send_as=None):
+def config(name, team_domain, token,
+           token_credential_id="", room="", send_as=None):
     """
     Jenkins Slack config state method
 
@@ -64,22 +66,24 @@
         ret['comment'] = 'Jenkins Slack config %s %s' % (name, status.lower())
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
-            config_slack_groovy, {"team_domain":team_domain,
-                                  "token":token,
+            config_slack_groovy, {"team_domain": team_domain,
+                                  "token": token,
                                   "token_credential_id": token_credential_id if token_credential_id else "",
                                   "room": room if room else "",
                                   "send_as": send_as if send_as else ""})
-        if call_result["code"] == 200 and call_result["msg"] in ["SUCCESS", "EXISTS"]:
+        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 Slack config %s %s' % (name, status.lower())
+            ret['comment'] = 'Jenkins Slack config %s %s' % (
+                name, status.lower())
             result = True
         else:
             status = 'FAILED'
             logger.error(
                 "Jenkins slack API call failure: %s", call_result["msg"])
             ret['comment'] = 'Jenkins slack API call failure: %s' % (call_result[
-                                                                           "msg"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
diff --git a/_states/jenkins_smtp.py b/_states/jenkins_smtp.py
index f27972e..b3029b7 100644
--- a/_states/jenkins_smtp.py
+++ b/_states/jenkins_smtp.py
@@ -1,48 +1,49 @@
 import logging
+
 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}"))){{
+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}")
-        }}
+    }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
+"""  # noqa
 
 set_admin_email_groovy = """
 def jenkinsLocationConfiguration = JenkinsLocationConfiguration.get()
-if(jenkinsLocationConfiguration.getAdminAddress().equals("{email}")){{
+if(jenkinsLocationConfiguration.getAdminAddress().equals("${email}")){
     print("EXISTS")
-}}else{{
-    jenkinsLocationConfiguration.setAdminAddress("{email}")
+}else{
+    jenkinsLocationConfiguration.setAdminAddress("${email}")
     jenkinsLocationConfiguration.save()
     print("SUCCESS")
-}}
-""" # noqa
+}
+"""  # noqa
 
 
 def __virtual__():
@@ -57,7 +58,8 @@
     return True
 
 
-def config(name, host, username, password, reply_to=None, port=25, ssl=False, charset="UTF-8"):
+def config(name, host, username, password, reply_to=None,
+           port=25, ssl=False, charset="UTF-8"):
     """
     Jenkins SMTP server config state method
 
@@ -85,24 +87,26 @@
         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, 
+            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"]:
+        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())
+            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"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
 
@@ -125,15 +129,18 @@
     if test:
         status = "SUCCESS"
         ret['changes'][name] = status
-        ret['comment'] = 'Jenkins admin email config %s %s' % (name, status.lower())
+        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"]:
+        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())
+            ret['comment'] = 'Jenkins admin email config %s %s' % (
+                name, status.lower())
             result = True
         else:
             status = 'FAILED'
diff --git a/_states/jenkins_theme.py b/_states/jenkins_theme.py
index 2f0208b..c27b0a2 100644
--- a/_states/jenkins_theme.py
+++ b/_states/jenkins_theme.py
@@ -2,26 +2,27 @@
 logger = logging.getLogger(__name__)
 
 set_theme_groovy = """\
-try{{
-    if(Class.forName("org.codefirst.SimpleThemeDecorator")){{
+try{
+    if(Class.forName("org.codefirst.SimpleThemeDecorator")){
         def state;
-        for (pd in PageDecorator.all()) {{
-          if (pd instanceof org.codefirst.SimpleThemeDecorator) {{
-            if(!pd.cssUrl.equals("{css_url}") || !pd.jsUrl.equals("{js_url}")){{
-                pd.cssUrl = "{css_url}"
-                pd.jsUrl = "{js_url}"
+        for (pd in PageDecorator.all()) {
+          if (pd instanceof org.codefirst.SimpleThemeDecorator) {
+            if(!pd.cssUrl.equals("${css_url}") || !pd.jsUrl.equals("${js_url}")){
+                pd.cssUrl = "${css_url}"
+                pd.jsUrl = "${js_url}"
                 state="SUCCESS"
-            }}else{{
+            }else{
                 state="EXISTS"
-            }}
-          }}
-        }}
+            }
+          }
+        }
         print(state)
-    }}
-}}catch(ClassNotFoundException e){{
+    }
+}catch(ClassNotFoundException e){
     print("Cannot user SimpleThemeDecorator, maybe Simple Theme Plugin not installed")
-}}
-""" # noqa
+}
+"""  # noqa
+
 
 def __virtual__():
     '''
@@ -59,17 +60,19 @@
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
             set_theme_groovy, {"css_url": css_url, "js_url": js_url})
-        if call_result["code"] == 200 and call_result["msg"] in ["SUCCESS", "EXISTS"]:
+        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 theme config %s %s' % (name, status.lower())
+            ret['comment'] = 'Jenkins theme config %s %s' % (
+                name, status.lower())
             result = True
         else:
             status = 'FAILED'
             logger.error(
                 "Jenkins theme API call failure: %s", call_result["msg"])
             ret['comment'] = 'Jenkins theme API call failure: %s' % (call_result[
-                                                                           "msg"])
+                "msg"])
     ret['result'] = None if test else result
     return ret
diff --git a/_states/jenkins_user.py b/_states/jenkins_user.py
index c2f2d9b..ed34877 100644
--- a/_states/jenkins_user.py
+++ b/_states/jenkins_user.py
@@ -1,40 +1,41 @@
 import logging
+
 logger = logging.getLogger(__name__)
 
 create_admin_groovy = u"""\
 import jenkins.model.*
 import hudson.security.*
 def instance = Jenkins.getInstance()
-if(hudson.model.User.getAll().find{{u->u.fullName.equals("{username}")}}){{
+if(hudson.model.User.getAll().find{u->u.fullName.equals("${username}")}){
     print("EXISTS")
-}}else{{
+}else{
     def hudsonRealm = new HudsonPrivateSecurityRealm(false)
-    def result=hudsonRealm.createAccount("{username}","{password}")
+    def result=hudsonRealm.createAccount("${username}","${password}")
     instance.setSecurityRealm(hudsonRealm)
     def strategy = new hudson.security.FullControlOnceLoggedInAuthorizationStrategy()
     strategy.setAllowAnonymousRead(false)
     instance.setAuthorizationStrategy(strategy)
     instance.save()
-    if(result.toString().equals("{username}")){{
+    if(result.toString().equals("${username}")){
         print("SUCCESS")
-    }}else{{
+    }else{
         print("FAILED")
-    }}
-}}
+    }
+}
 """  # noqa
 
 
 create_user_groovy = u"""\
-if(hudson.model.User.getAll().find{{u->u.fullName.equals("{username}")}}){{
+if(hudson.model.User.getAll().find{u->u.fullName.equals("${username}")}){
     print("EXISTS")
-}}else{{
-    def result=jenkins.model.Jenkins.instance.securityRealm.createAccount("{username}", "{password}")
-    if(result.toString().equals("{username}")){{
+}else{
+    def result=jenkins.model.Jenkins.instance.securityRealm.createAccount("${username}", "${password}")
+    if(result.toString().equals("${username}")){
         print("SUCCESS")
-    }}else{{
+    }else{
         print("FAILED")
-    }}
-}}
+    }
+}
 """  # noqa
 
 
@@ -75,7 +76,8 @@
     else:
         call_result = __salt__['jenkins_common.call_groovy_script'](
             create_admin_groovy if admin else create_user_groovy, {"username": username, "password": password})
-        if call_result["code"] == 200 and call_result["msg"] in ["SUCCESS", "EXISTS"]:
+        if call_result["code"] == 200 and call_result["msg"] in [
+                "SUCCESS", "EXISTS"]:
             if call_result["msg"] == "SUCCESS":
                 status = "CREATED" if not admin else "ADMIN CREATED"
                 ret['changes'][username] = status
diff --git a/_states/jenkins_view.py b/_states/jenkins_view.py
index dc941e9..e229a11 100644
--- a/_states/jenkins_view.py
+++ b/_states/jenkins_view.py
@@ -1,73 +1,75 @@
 import logging
+
 from json import dumps
+
 logger = logging.getLogger(__name__)
 
 add_view_groovy = """\
 import java.util.stream.Collectors
 import org.jenkinsci.plugins.categorizedview.CategorizedJobsView
 import org.jenkinsci.plugins.categorizedview.GroupingRule
-view = Jenkins.instance.getView("{view_name}")
-if(view){{
-  if(view.getClass().getName().equals("hudson.model.ListView")){{
-    include_regex="{include_regex}"
-    if(include_regex != "" && !view.getIncludeRegex().equals(include_regex)){{
+view = Jenkins.instance.getView("${view_name}")
+if(view){
+  if(view.getClass().getName().equals("hudson.model.ListView")){
+    include_regex="${include_regex}"
+    if(include_regex != "" && !view.getIncludeRegex().equals(include_regex)){
         view.setIncludeRegex(include_regex)
         print("ADDED/CHANGED")
-    }}else{{
+    }else{
         print("EXISTS")
-    }}
-  }}else if(view.getClass().getName().equals("org.jenkinsci.plugins.categorizedview.CategorizedJobsView")){{
+    }
+  }else if(view.getClass().getName().equals("org.jenkinsci.plugins.categorizedview.CategorizedJobsView")){
     def jsonSlurper = new groovy.json.JsonSlurper()
-    def inputCategories = jsonSlurper.parseText('{categories_string}')
-    def groupRegexes = inputCategories.stream().map{{e -> e["group_regex"]}}.collect(Collectors.toList())
-    def namingRules = inputCategories.stream().map{{e -> e["naming_rule"]}}.collect(Collectors.toList())
+    def inputCategories = jsonSlurper.parseText('${categories_string}')
+    def groupRegexes = inputCategories.stream().map{e -> e["group_regex"]}.collect(Collectors.toList())
+    def namingRules = inputCategories.stream().map{e -> e["naming_rule"]}.collect(Collectors.toList())
     def actualCategories = view.categorizationCriteria
     def equals = !actualCategories.isEmpty()
-    def include_regex="{include_regex}"
-    if(include_regex != "" && !view.getIncludeRegex().equals(include_regex)){{
+    def include_regex="${include_regex}"
+    if(include_regex != "" && !view.getIncludeRegex().equals(include_regex)){
         view.setIncludeRegex(include_regex)
         equals = false
-    }}
-    for(int i=0;i<actualCategories.size();i++){{
-      if(!groupRegexes.contains(actualCategories[i].groupRegex) || !namingRules.contains(actualCategories[i].namingRule)){{
+    }
+    for(int i=0;i<actualCategories.size();i++){
+      if(!groupRegexes.contains(actualCategories[i].groupRegex) || !namingRules.contains(actualCategories[i].namingRule)){
         equals = false
-      }}
-    }}
-    if(!equals){{
+      }
+    }
+    if(!equals){
       view.categorizationCriteria.clear()
-      for(int i=0;i<inputCategories.size();i++){{
+      for(int i=0;i<inputCategories.size();i++){
         view.categorizationCriteria.add(new GroupingRule(inputCategories[i].group_regex,inputCategories[i].naming_rule))
-      }}
+      }
       print("ADDED/CHANGED")
-    }}else{{
+    }else{
       print("EXISTS")
-    }}
-  }}else{{
+    }
+  }else{
     print("EXISTS")
-  }}
-}}else{{
-  try{{
-    {view_def}
+  }
+}else{
+  try{
+    ${view_def}
     Jenkins.instance.addView(view)
     print("ADDED/CHANGED")
-  }}catch(Exception e){{
+  }catch(Exception e){
     print("FAILED")
-  }}
-}}
+  }
+}
 """  # noqa
 
 remove_view_groovy = """\
-view = Jenkins.instance.getView("{view_name}")
-if(view){{
-  try{{
+view = Jenkins.instance.getView("${view_name}")
+if(view){
+  try{
     Jenkins.instance.deleteView(view)
     print("REMOVED")
-  }}catch(Exception e){{
+  }catch(Exception e){
     print("FAILED")
-  }}
-}}else{{
+  }
+}else{
   print("NOT PRESENT")
-}}
+}
 """  # noqa
 
 
@@ -91,7 +93,8 @@
     :param type: view type (default ListView)
     :returns: salt-specified state dict
     """
-    return _plugin_call(name, type, add_view_groovy, ["ADDED/CHANGED", "EXISTS"], **kwargs)
+    return _plugin_call(name, type, add_view_groovy, [
+                        "ADDED/CHANGED", "EXISTS"], **kwargs)
 
 
 def absent(name, **kwargs):
@@ -101,7 +104,8 @@
     :param name: view name
     :returns: salt-specified state dict
     """
-    return _plugin_call(name, None, remove_view_groovy, ["REMOVED", "NOT PRESENT"], **kwargs)
+    return _plugin_call(name, None, remove_view_groovy, [
+                        "REMOVED", "NOT PRESENT"], **kwargs)
 
 
 def _plugin_call(name, type, template, success_msgs, **kwargs):
