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:
