Implemented new jenkins_job states.
Added forgotten node enforcement statement.
Fixed PEP8 errors.
diff --git a/_states/jenkins_job.py b/_states/jenkins_job.py
new file mode 100644
index 0000000..e28bed8
--- /dev/null
+++ b/_states/jenkins_job.py
@@ -0,0 +1,108 @@
+# -*- coding: utf-8 -*-
+
+# Import Python libs
+from __future__ import absolute_import
+import difflib
+import logging
+
+# Import Salt libs
+import salt.ext.six as six
+import salt.utils
+
+# Import XML parser
+import xml.etree.ElementTree as ET
+
+log = logging.getLogger(__name__)
+
+
+def _elements_equal(e1, e2):
+    if e1.tag != e2.tag:
+        return False
+    if e1.text != e2.text:
+        return False
+    if e1.tail != e2.tail:
+        return False
+    if e1.attrib != e2.attrib:
+        return False
+    if len(e1) != len(e2):
+        return False
+    return all(_elements_equal(c1, c2) for c1, c2 in zip(e1, e2))
+
+
+def present(name,
+            config=None,
+            **kwargs):
+    '''
+    Ensure the job is present in the Jenkins
+    configured jobs
+    name
+        The unique name for the Jenkins job
+    config
+        The Salt URL for the file to use for
+        configuring the job.
+    '''
+
+    ret = {'name': name,
+           'result': True,
+           'changes': {},
+           'comment': ['Job {0} is up to date.'.format(name)]}
+
+    _job_exists = __salt__['jenkins.job_exists'](name)
+
+    if _job_exists:
+        _current_job_config = __salt__['jenkins.get_job_config'](name)
+        buf = six.moves.StringIO(_current_job_config)
+        oldXML = ET.fromstring(buf.read())
+
+        cached_source_path = __salt__['cp.cache_file'](config, __env__)
+        with salt.utils.fopen(cached_source_path) as _fp:
+            newXML = ET.fromstring(_fp.read())
+        if not _elements_equal(oldXML, newXML):
+            diff = difflib.unified_diff(
+                oldXML.tostring(), newXML.tostring(), lineterm='')
+            __salt__['jenkins.update_job'](name, config, __env__)
+            ret['changes'] = ''.join(diff)
+            ret['comment'].append('Job {0} updated.'.format(name))
+
+    else:
+        cached_source_path = __salt__['cp.cache_file'](config, __env__)
+        with salt.utils.fopen(cached_source_path) as _fp:
+            new_config_xml = _fp.read()
+
+        __salt__['jenkins.create_job'](name, config, __env__)
+
+        buf = six.moves.StringIO(new_config_xml)
+        _current_job_config = buf.readlines()
+
+        diff = difflib.unified_diff('', buf, lineterm='')
+        ret['changes'] = ''.join(diff)
+        ret['comment'].append('Job {0} added.'.format(name))
+
+    ret['comment'] = '\n'.join(ret['comment'])
+    return ret
+
+
+def absent(name,
+           **kwargs):
+    '''
+    Ensure the job is present in the Jenkins
+    configured jobs
+
+    name
+        The name of the Jenkins job to remove.
+
+    '''
+
+    ret = {'name': name,
+           'result': True,
+           'changes': {},
+           'comment': []}
+
+    _job_exists = __salt__['jenkins.job_exists'](name)
+
+    if _job_exists:
+        __salt__['jenkins.delete_job'](name)
+        ret['comment'] = 'Job {0} deleted.'.format(name)
+    else:
+        ret['comment'] = 'Job {0} already absent.'.format(name)
+    return ret
diff --git a/_states/jenkins_user.py b/_states/jenkins_user.py
index 6f37ec3..0441b42 100644
--- a/_states/jenkins_user.py
+++ b/_states/jenkins_user.py
@@ -21,6 +21,7 @@
 print(result)
 """  # noqa
 
+
 def present(name, username, password, admin=False):
     """
     Main jenkins users state method
@@ -47,7 +48,7 @@
         # try to call jenkins script api with given user and password to prove
         # his existence
         user_exists_result = __salt__['jenkins_common.call_groovy_script'](
-            "print(\"TEST\")", {"username": username}, username, password,[200, 401])
+            "print(\"TEST\")", {"username": username}, username, password, [200, 401])
         user_exists = user_exists_result and user_exists_result[
             "code"] == 200 and user_exists_result["msg"].count("TEST") == 1
         if not user_exists:
diff --git a/jenkins/client/init.sls b/jenkins/client/init.sls
index a31d0a1..a126e87 100644
--- a/jenkins/client/init.sls
+++ b/jenkins/client/init.sls
@@ -6,6 +6,7 @@
   - jenkins.client.job
   - jenkins.client.credential
   - jenkins.client.user
+  - jenkins.client.node
   
 jenkins_client_install:
   pkg.installed:
diff --git a/jenkins/client/job.sls b/jenkins/client/job.sls
index 8139299..3138d4d 100644
--- a/jenkins/client/job.sls
+++ b/jenkins/client/job.sls
@@ -19,7 +19,7 @@
     - file: jenkins_client_dirs
 
 jenkins_job_{{ job_name }}_present:
-  jenkins.present:
+  jenkins_job.present:
   - name: {{ job_name }}
   - config: {{ client.dir.jenkins_jobs_root }}/{{ job_name }}.xml
   - watch:
@@ -35,7 +35,7 @@
     - file: jenkins_client_dirs
 
 jenkins_job_{{ job_name }}_absent:
-  jenkins.absent:
+  jenkins_job.absent:
   - name: {{ job_name }}
   - watch:
     - file: /etc/salt/minion.d/_jenkins.conf