diff --git a/Makefile b/Makefile
index d166862..3af6b3d 100644
--- a/Makefile
+++ b/Makefile
@@ -34,6 +34,7 @@
 	@echo "make release-major  - Generate new major release"
 	@echo "make release-minor  - Generate new minor release"
 	@echo "make changelog      - Show changes since last release"
+	@echo "make test-model-validate      - Run salt jsonschema validation"
 
 install:
 	# Formula
@@ -41,6 +42,7 @@
 	cp -a $(FORMULANAME) $(DESTDIR)/$(SALTENVDIR)/
 	[ ! -d _modules ] || cp -a _modules $(DESTDIR)/$(SALTENVDIR)/
 	[ ! -d _states ] || cp -a _states $(DESTDIR)/$(SALTENVDIR)/ || true
+	[ ! -d _engines ] || cp -a _engines $(DESTDIR)/$(SALTENVDIR)/ || true
 	[ ! -d _grains ] || cp -a _grains $(DESTDIR)/$(SALTENVDIR)/ || true
 	# Metadata
 	[ -d $(DESTDIR)/$(RECLASSDIR)/service/$(FORMULANAME) ] || mkdir -p $(DESTDIR)/$(RECLASSDIR)/service/$(FORMULANAME)
@@ -52,6 +54,10 @@
 test:
 	[ ! -d tests ] || (cd tests; ./run_tests.sh)
 
+test-model-validate:
+	# TODO make it actually fail
+	[ ! -d $(FORMULANAME)/schemas/ ] || (cd tests; ./run_tests.sh model-validate)
+
 release-major: check-changes
 	@echo "Current version is $(VERSION), new version is $(NEW_MAJOR_VERSION)"
 	@[ $(VERSION_MAJOR) != $(NEW_MAJOR_VERSION) ] || (echo "Major version $(NEW_MAJOR_VERSION) already released, nothing to do. Do you want release-minor?" && exit 1)
@@ -119,4 +125,4 @@
 	[ ! -x "$(shell which kitchen)" ] || kitchen destroy
 	[ ! -d .kitchen ] || rm -rf .kitchen
 	[ ! -d tests/build ] || rm -rf tests/build
-	[ ! -d build ] || rm -rf build
+	[ ! -d build ] || rm -rf build
\ No newline at end of file
diff --git a/README.rst b/README.rst
index c5df377..69a295d 100644
--- a/README.rst
+++ b/README.rst
@@ -815,6 +815,10 @@
             email: "jenkins@domain.local"
             auth_key_file: "/var/jenkins_home/.ssh/id_rsa"
             frontendURL: "https://gerrit.domain.local"
+            build_current_patches_only: true
+            abort_new_patchsets: false
+            abort_manual_patchsets: false
+            abort_same_topic: false
             authkey: |
               SOMESSHKEY
           server2:
@@ -824,6 +828,10 @@
             email: "jenkins@domain.local"
             auth_key_file: "/var/jenkins_home/.ssh/id_rsa"
             frontendURL: "https://gerrit2.domain.local"
+            build_current_patches_only: true
+            abort_new_patchsets: false
+            abort_manual_patchsets: false
+            abort_same_topic: false
             authkey: |
               SOMESSHKEY
 
diff --git a/_states/jenkins_gerrit.py b/_states/jenkins_gerrit.py
index 26b1259..a2b0e95 100644
--- a/_states/jenkins_gerrit.py
+++ b/_states/jenkins_gerrit.py
@@ -15,7 +15,10 @@
 
 
 def present(name, hostname, username, frontendurl, auth_key_file, authkey,
-            port="29418", auth_key_file_password=None, email="", proxy=""):
+            port="29418", build_current_patches_only="false",
+            abort_new_patchsets="false", abort_manual_patchsets="false",
+            abort_same_topic="false", auth_key_file_password=None, email="",
+            proxy=""):
     """
     Jenkins gerrit-trigger state method
 
@@ -26,6 +29,10 @@
     :param port: server ssh port
     :param proxy: proxy url (optional)
     :param frontendurl: server frontend URL
+    :param build_current_patches_only: build current patches only (optional)
+    :abort_new_patchsets: abort new patchsets (optional)
+    :abort_manual_patchsets: abort manual patchsets (optional)
+    :abort_same_topic: abort same topic (optional)
     :param auth_key_file: path to key file
     :param authkey: ssh key
     :param auth_key_file_password: password for keyfile (optional)
@@ -35,7 +42,7 @@
         'salt://jenkins/files/groovy/gerrit.template',
         __env__)
     return __salt__['jenkins_common.api_call'](name, template,
-                        ["CREATED", "EXISTS"],
+                        ["CREATED", "CHANGED", "SKIPPED"],
                         {
                             "name": name,
                             "hostname": hostname,
@@ -44,8 +51,12 @@
                             "username": username,
                             "email": email if email else "",
                             "frontendurl": frontendurl,
+                            "build_current_patches_only": build_current_patches_only if build_current_patches_only else "false",
+                            "abort_new_patchsets": abort_new_patchsets if abort_new_patchsets else "false",
+                            "abort_manual_patchsets": abort_manual_patchsets if abort_manual_patchsets else "false",
+                            "abort_same_topic": abort_same_topic if abort_same_topic else "false",
                             "auth_key_file": auth_key_file,
                             "authkey": authkey,
-                            "auth_key_file_password": auth_key_file_password if auth_key_file_password else None
+                            "auth_key_file_password": auth_key_file_password if auth_key_file_password else ""
                         },
                         "Gerrit server")
diff --git a/jenkins/client/gerrit.sls b/jenkins/client/gerrit.sls
index c540b20..24c4abf 100644
--- a/jenkins/client/gerrit.sls
+++ b/jenkins/client/gerrit.sls
@@ -11,6 +11,10 @@
   - email: {{ gerrit.get('email', '') }}
   - auth_key_file: {{ gerrit.get('auth_key_file', '') }}
   - frontendurl: {{ gerrit.get('frontendURL','') }}
+  - build_current_patches_only: {{ gerrit.get('build_current_patches_only', 'false') }}
+  - abort_new_patchsets: {{ gerrit.get('abort_new_patchsets', 'false') }}
+  - abort_manual_patchsets: {{ gerrit.get('abort_manual_patchsets', 'false') }}
+  - abort_same_topic: {{ gerrit.get('abort_same_topic', 'false') }}
   {%- if gerrit.authkey is defined %}
   - authkey: |
       {{ gerrit.get('authkey','')|indent(6) }}
diff --git a/jenkins/files/groovy/gerrit.template b/jenkins/files/groovy/gerrit.template
index 1895494..a6583a1 100644
--- a/jenkins/files/groovy/gerrit.template
+++ b/jenkins/files/groovy/gerrit.template
@@ -1,56 +1,91 @@
 #!groovy
-import jenkins.model.*;
-import net.sf.json.*;
-import com.sonyericsson.hudson.plugins.gerrit.trigger.*;
+import jenkins.model.Jenkins
+import com.sonyericsson.hudson.plugins.gerrit.trigger.GerritServer
+import com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl
+import com.sonyericsson.hudson.plugins.gerrit.trigger.VerdictCategory
+import com.sonyericsson.hudson.plugins.gerrit.trigger.config.Config
 
-if ( Jenkins.instance.pluginManager.activePlugins.find { it.shortName == "gerrit-trigger" } != null ) {
-    def gerritPlugin = Jenkins.instance.getPlugin(com.sonyericsson.hudson.plugins.gerrit.trigger.PluginImpl.class)
-    gerritPlugin.getPluginConfig().setNumberOfReceivingWorkerThreads(3)
-    gerritPlugin.getPluginConfig().setNumberOfSendingWorkerThreads(1)
+def authkey = """${authkey}
+"""
+def serverName = "${name}"
 
-    def authkey = """${authkey}
-    """
+def newGerritConfig = new Config()
+newGerritConfig.with {
+setGerritHostName("${hostname}")
+setGerritUserName("${username}")
+setGerritFrontEndURL("${frontendurl}")
+setGerritSshPort(("${port}").toInteger())
+setGerritProxy("${proxy}")
+setGerritEMail("${email}")
+buildCurrentPatchesOnly.setEnabled(("${build_current_patches_only}").toBoolean())
+buildCurrentPatchesOnly.setAbortNewPatchsets(("${abort_new_patchsets}").toBoolean())
+buildCurrentPatchesOnly.setAbortManualPatchsets(("${abort_manual_patchsets}").toBoolean())
+buildCurrentPatchesOnly.setAbortSameTopic(("${abort_same_topic}").toBoolean())
+setGerritAuthKeyFilePassword("${auth_key_file_password}")
+}
 
-    def serverName = "${name}"
-    def gerritServer = new GerritServer(serverName)
+def gerritAuthKeyFile = new File("${auth_key_file}")
+gerritAuthKeyFile.write(authkey)
+if ( gerritAuthKeyFile.exists() ) {
+     newGerritConfig.setGerritAuthKeyFile(gerritAuthKeyFile)
+}
 
+def newCategories = newGerritConfig.getCategories()
+if (!newCategories) {
+    categories = new LinkedList<VerdictCategory>()
+}
+if (newCategories.isEmpty()) {
+    newCategories.add(new VerdictCategory('Code-Review', 'Code Review'))
+    newCategories.add(new VerdictCategory('Verified', 'Verified'))
+}
+
+Boolean compareObjects( Object a, b) {
+    String aXML = Jenkins.XSTREAM.toXML(a).replaceAll(/\{AQA[^\}]+\}/) {
+                      hudson.util.Secret.decrypt(it) }
+    String bXML = Jenkins.XSTREAM.toXML(b).replaceAll(/\{AQA[^\}]+\}/) {
+                      hudson.util.Secret.decrypt(it) }
+    return aXML == bXML
+}
+
+if ( Jenkins.instance.pluginManager.activePlugins.find { it.shortName == 'gerrit-trigger' } != null ) {
+    def gerritPlugin = Jenkins.instance.getPlugin(PluginImpl)
     def gerritTriggerPlugin = PluginImpl.getInstance()
     def gerritServers = gerritTriggerPlugin.getServerNames()
+
+    def gerritServer = gerritPlugin.getServer(serverName)
+    def newGerritServer = new GerritServer(serverName)
+
+    newGerritConfig.setCategories(newCategories)
+
     def gerritServerExists = false
     gerritServers.each {
         serverName = (String) it
-        if ( serverName == gerritServer.getName() ) {
+        if ( serverName == newGerritServer.getName() ) {
             gerritServerExists = true
         }
     }
-    if (!gerritServerExists){
 
-        def triggerConfig = new config.Config()
+    newGerritServer.setConfig(newGerritConfig)
 
-        triggerConfig.setGerritHostName("${hostname}")
-        triggerConfig.setGerritUserName("${username}")
-        triggerConfig.setGerritFrontEndURL("${frontendurl}")
-        triggerConfig.setGerritSshPort(${port})
-        triggerConfig.setGerritProxy("${proxy}")
-        triggerConfig.setGerritEMail("${email}")
-
-        def gerritAuthKeyFile = new File("${auth_key_file}")
-        gerritAuthKeyFile.write(authkey)
-        if ( gerritAuthKeyFile.exists() ) {
-            triggerConfig.setGerritAuthKeyFile(gerritAuthKeyFile)
+    if (gerritServerExists){
+        if (compareObjects(gerritServer, newGerritServer)) {
+            print('SKIPPED')
+        } else {
+            if (gerritServer) {
+                gerritServer.setConfig(newGerritServer.getConfig())
+            } else {
+                gerritPlugin.addServer(newGerritServer)
+            }
+            newGerritServer.start()
+            newGerritServer.startConnection()
+            Jenkins.instance.save()
+            print('CHANGED')
         }
-
-        triggerConfig.setGerritAuthKeyFilePassword("${auth_key_file_password}")
-
-        gerritServer.setConfig(triggerConfig)
-
-        gerritPlugin.addServer(gerritServer)
-        gerritServer.start()
-        gerritServer.startConnection()
+    } else {
+        gerritPlugin.addServer(newGerritServer)
+        print('CREATED')
+        newGerritServer.start()
+        newGerritServer.startConnection()
         Jenkins.instance.save()
-        print("CREATED")
-    }
-    else {
-        print("EXISTS")
     }
 }
diff --git a/metadata.yml b/metadata.yml
index dcda74c..0954897 100644
--- a/metadata.yml
+++ b/metadata.yml
@@ -1,3 +1,8 @@
 name: "jenkins"
 version: "2017.8"
 source: "https://github.com/salt-formulas/salt-formula-jenkins"
+dependencies:
+- name: java
+  source: "https://github.com/salt-formulas/salt-formula-java"
+- name: linux
+  source: "https://github.com/salt-formulas/salt-formula-linux"
\ No newline at end of file
diff --git a/tests/pillar/client.sls b/tests/pillar/client.sls
new file mode 100644
index 0000000..d1078a5
--- /dev/null
+++ b/tests/pillar/client.sls
@@ -0,0 +1,69 @@
+jenkins:
+  client:
+    enabled: true
+    master:
+      host: jenkins.example.com
+      port: 80
+      protocol: http
+    job:
+      jobname:
+        type: workflow
+        param:
+          bool_param:
+            type: boolean
+            description: true/false
+            default: true
+          string_param:
+            type: string
+            description: 1 liner
+            default: default_string
+          text_param:
+            type: text
+            description: multi-liner
+            default: default_text
+      jobname_scm:
+        type: workflow-scm
+        concurrent: false
+        scm:
+          type: git
+          url: https://github.com/jenkinsci/docker.git
+          branch: master
+          script: Jenkinsfile
+          github:
+            url: https://github.com/jenkinsci/docker
+            name: "Jenkins Docker Image"
+        trigger:
+          timer:
+            spec: "H H * * *"
+          github:
+          pollscm:
+            spec: "H/15 * * * *"
+          reverse:
+            projects:
+              - test1
+              - test2
+            state: SUCCESS
+        param:
+          bool_param:
+            type: boolean
+            description: true/false
+            default: true
+          string_param:
+            type: string
+            description: 1 liner
+            default: default_string
+          text_param:
+            type: text
+            description: multi-liner
+            default: default_text
+    approved_scripts:
+      - method groovy.json.JsonSlurperClassic parseText java.lang.String
+java:
+  environment:
+    enabled: true
+    version: '10'
+    release: '0.1'
+    build: '10'
+    oracle_hash: 'fb4372174a714e6b8c52526dc134031e'
+    platform: oracle-java
+    development: true
\ No newline at end of file
diff --git a/tests/pillar/master.sls b/tests/pillar/master.sls
new file mode 100644
index 0000000..00f0cdd
--- /dev/null
+++ b/tests/pillar/master.sls
@@ -0,0 +1,53 @@
+jenkins:
+  master:
+    enabled: true
+    mode: EXCLUSIVE
+    no_config: false
+    slaves:
+      - name: slave01
+        label: pbuilder
+        executors: 2
+      - name: slave02
+        label: image_builder
+        mode: EXCLUSIVE
+        executors: 2
+    views:
+      - name: "Package builds"
+        regex: "debian-build-.*"
+      - name: "Contrail builds"
+        regex: "contrail-build-.*"
+      - name: "Aptly"
+        regex: "aptly-.*"
+    plugins:
+    - name: slack
+    - name: extended-choice-parameter
+    - name: rebuild
+    - name: test-stability
+    email:
+      engine: "smtp"
+      host: "smtp.domain.com"
+      user: "user@domain.cz"
+      password: "smtp-password"
+      port: 25
+    http:
+      port: 80
+    approved_scripts:
+      - method groovy.json.JsonSlurperClassic parseText java.lang.String
+    user:
+      admin:
+        api_token: xxxxxxxxxx
+        password: admin_password
+        email: admin@domain.com
+      user01:
+        api_token: xxxxxxxxxx
+        password: user_password
+        email: user01@domain.com
+java:
+  environment:
+    enabled: true
+    version: '10'
+    release: '0.1'
+    build: '10'
+    oracle_hash: 'fb4372174a714e6b8c52526dc134031e'
+    platform: oracle-java
+    development: true
\ No newline at end of file
diff --git a/tests/pillar/slave.sls b/tests/pillar/slave.sls
new file mode 100644
index 0000000..fe00f46
--- /dev/null
+++ b/tests/pillar/slave.sls
@@ -0,0 +1,39 @@
+jenkins:
+  slave:
+    enabled: true
+    master:
+      host: jenkins.example.com
+      port: 80
+      protocol: http
+    user:
+      name: jenkins_slave
+      password: dexiech6AepohthaiHook2iesh7ol5ook4Ov3leid3yek6daid2ooNg3Ee2oKeYo
+    gpg:
+      keypair_id: A76882D3
+      public_key: |
+        -----BEGIN PGP PUBLIC KEY BLOCK-----
+        ...
+      private_key: |
+        -----BEGIN PGP PRIVATE KEY BLOCK-----
+        ...
+java:
+  environment:
+    enabled: true
+    version: '10'
+    release: '0.1'
+    build: '10'
+    oracle_hash: 'fb4372174a714e6b8c52526dc134031e'
+    platform: oracle-java
+    development: true
+linux:
+  system:
+    enabled: true
+    user:
+      not_a_jenkins:
+        enabled: true
+        name: notJenkins
+        sudo: false
+        uid: 9991
+        full_name: Not A. Jenkins
+        home: /home/notjenkins
+        home_dir_mode: 755
\ No newline at end of file
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
new file mode 100755
index 0000000..4a7ce6e
--- /dev/null
+++ b/tests/run_tests.sh
@@ -0,0 +1,274 @@
+#!/usr/bin/env bash
+
+###
+# Script requirments:
+#apt-get install -y python-yaml virtualenv git
+
+set -e
+[ -n "$DEBUG" ] && set -x
+
+CURDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+METADATA=${CURDIR}/../metadata.yml
+FORMULA_NAME=$(cat $METADATA | python -c "import sys,yaml; print yaml.load(sys.stdin)['name']")
+FORMULA_META_DIR=${CURDIR}/../${FORMULA_NAME}/meta
+
+## Overrideable parameters
+PILLARDIR=${PILLARDIR:-${CURDIR}/pillar}
+BUILDDIR=${BUILDDIR:-${CURDIR}/build}
+VENV_DIR=${VENV_DIR:-${BUILDDIR}/virtualenv}
+MOCK_BIN_DIR=${MOCK_BIN_DIR:-${CURDIR}/mock_bin}
+DEPSDIR=${BUILDDIR}/deps
+SCHEMARDIR=${SCHEMARDIR:-"${CURDIR}/../${FORMULA_NAME}/schemas/"}
+
+SALT_FILE_DIR=${SALT_FILE_DIR:-${BUILDDIR}/file_root}
+SALT_PILLAR_DIR=${SALT_PILLAR_DIR:-${BUILDDIR}/pillar_root}
+SALT_CONFIG_DIR=${SALT_CONFIG_DIR:-${BUILDDIR}/salt}
+SALT_CACHE_DIR=${SALT_CACHE_DIR:-${SALT_CONFIG_DIR}/cache}
+SALT_CACHE_EXTMODS_DIR=${SALT_CACHE_EXTMODS_DIR:-${SALT_CONFIG_DIR}/cache_master_extmods}
+
+SALT_OPTS="${SALT_OPTS} --retcode-passthrough --local -c ${SALT_CONFIG_DIR} --log-file=/dev/null"
+
+if [ "x${SALT_VERSION}" != "x" ]; then
+    PIP_SALT_VERSION="==${SALT_VERSION}"
+fi
+
+## Functions
+log_info() {
+    echo -e "[INFO] $*"
+}
+
+log_err() {
+    echo -e "[ERROR] $*" >&2
+}
+
+setup_virtualenv() {
+    log_info "Setting up Python virtualenv"
+    dependency_check virtualenv
+    virtualenv $VENV_DIR
+    source ${VENV_DIR}/bin/activate
+    python -m pip install salt${PIP_SALT_VERSION}
+    python -m pip install jsonschema
+    if [[ -f ${CURDIR}/pip_requirements.txt ]]; then
+       python -m pip install -r ${CURDIR}/pip_requirements.txt
+    fi
+}
+
+setup_mock_bin() {
+    # If some state requires a binary, a lightweight replacement for
+    # such binary can be put into MOCK_BIN_DIR for test purposes
+    if [ -d "${MOCK_BIN_DIR}" ]; then
+        PATH="${MOCK_BIN_DIR}:$PATH"
+        export PATH
+    fi
+}
+
+setup_pillar() {
+    [ ! -d ${SALT_PILLAR_DIR} ] && mkdir -p ${SALT_PILLAR_DIR}
+    echo "base:" > ${SALT_PILLAR_DIR}/top.sls
+    for pillar in ${PILLARDIR}/*; do
+        grep ${FORMULA_NAME}: ${pillar} &>/dev/null || continue
+        state_name=$(basename ${pillar%.sls})
+        echo -e "  ${state_name}:\n    - ${state_name}" >> ${SALT_PILLAR_DIR}/top.sls
+    done
+}
+
+setup_salt() {
+    [ ! -d ${SALT_FILE_DIR} ] && mkdir -p ${SALT_FILE_DIR}
+    [ ! -d ${SALT_CONFIG_DIR} ] && mkdir -p ${SALT_CONFIG_DIR}
+    [ ! -d ${SALT_CACHE_DIR} ] && mkdir -p ${SALT_CACHE_DIR}
+    [ ! -d ${SALT_CACHE_EXTMODS_DIR} ] && mkdir -p ${SALT_CACHE_EXTMODS_DIR}
+
+    echo "base:" > ${SALT_FILE_DIR}/top.sls
+    for pillar in ${PILLARDIR}/*.sls; do
+        grep ${FORMULA_NAME}: ${pillar} &>/dev/null || continue
+        state_name=$(basename ${pillar%.sls})
+        echo -e "  ${state_name}:\n    - ${FORMULA_NAME}" >> ${SALT_FILE_DIR}/top.sls
+    done
+
+    cat << EOF > ${SALT_CONFIG_DIR}/minion
+file_client: local
+cachedir: ${SALT_CACHE_DIR}
+extension_modules:  ${SALT_CACHE_EXTMODS_DIR}
+verify_env: False
+minion_id_caching: False
+
+file_roots:
+  base:
+  - ${SALT_FILE_DIR}
+  - ${CURDIR}/..
+
+pillar_roots:
+  base:
+  - ${SALT_PILLAR_DIR}
+  - ${PILLARDIR}
+EOF
+}
+
+fetch_dependency() {
+    # example: fetch_dependency "linux:https://github.com/salt-formulas/salt-formula-linux"
+    dep_name="$(echo $1|cut -d : -f 1)"
+    dep_source="$(echo $1|cut -d : -f 2-)"
+    dep_root="${DEPSDIR}/$(basename $dep_source .git)"
+    dep_metadata="${dep_root}/metadata.yml"
+
+    dependency_check git
+    [ -d $dep_root ] && { log_info "Dependency $dep_name already fetched"; return 0; }
+
+    log_info "Fetching dependency $dep_name"
+    [ ! -d ${DEPSDIR} ] && mkdir -p ${DEPSDIR}
+    git clone $dep_source ${DEPSDIR}/$(basename $dep_source .git)
+    ln -s ${dep_root}/${dep_name} ${SALT_FILE_DIR}/${dep_name}
+
+    METADATA="${dep_metadata}" install_dependencies
+}
+
+link_modules(){
+    # Link modules *.py files to temporary salt-root
+    local SALT_ROOT=${1:-$SALT_FILE_DIR}
+    local SALT_ENV=${2:-$DEPSDIR}
+
+    mkdir -p "${SALT_ROOT}/_modules/"
+    # from git, development versions
+    find ${SALT_ENV} -maxdepth 3 -mindepth 3 -path '*_modules*' -iname "*.py" -type f -print0 | while read -d $'\0' file; do
+      ln -fs $(readlink -e ${file}) "$SALT_ROOT"/_modules/$(basename ${file}) ;
+    done
+    salt_run saltutil.sync_all
+}
+
+install_dependencies() {
+    grep -E "^dependencies:" ${METADATA} >/dev/null || return 0
+    (python - | while read dep; do fetch_dependency "$dep"; done) << EOF
+import sys,yaml
+for dep in yaml.load(open('${METADATA}', 'ro'))['dependencies']:
+    print '%s:%s' % (dep["name"], dep["source"])
+EOF
+}
+
+clean() {
+    log_info "Cleaning up ${BUILDDIR}"
+    [ -d ${BUILDDIR} ] && rm -rf ${BUILDDIR} || exit 0
+}
+
+salt_run() {
+    [ -e ${VENV_DIR}/bin/activate ] && source ${VENV_DIR}/bin/activate
+    python $(which salt-call) ${SALT_OPTS} $*
+}
+
+prepare() {
+    [ -d ${BUILDDIR} ] && mkdir -p ${BUILDDIR}
+
+    [[ ! -f "${VENV_DIR}/bin/activate" ]] && setup_virtualenv
+    setup_mock_bin
+    setup_pillar
+    setup_salt
+    install_dependencies
+    link_modules
+}
+
+lint_releasenotes() {
+    [[ ! -f "${VENV_DIR}/bin/activate" ]] && setup_virtualenv
+    source ${VENV_DIR}/bin/activate
+    python -m pip install reno
+    reno lint ${CURDIR}/../
+}
+
+lint() {
+#    lint_releasenotes
+    log_err "TODO: lint_releasenotes"
+}
+
+run() {
+    for pillar in ${PILLARDIR}/*.sls; do
+        grep ${FORMULA_NAME}: ${pillar} &>/dev/null || continue
+        state_name=$(basename ${pillar%.sls})
+        salt_run grains.set 'noservices' False force=True
+
+        echo "Checking state ${FORMULA_NAME}.${state_name} ..."
+        salt_run --id=${state_name} state.show_sls ${FORMULA_NAME} || (log_err "Execution of ${FORMULA_NAME}.${state_name} failed"; exit 1)
+
+        # Check that all files in 'meta' folder can be rendered using any valid pillar
+        for meta in `find ${FORMULA_META_DIR} -type f`; do
+            meta_name=$(basename ${meta})
+            echo "Checking meta ${meta_name} ..."
+            salt_run --out=quiet --id=${state_name} cp.get_template ${meta} ${SALT_CACHE_DIR}/${meta_name} \
+              || { log_err "Failed to render meta ${meta} using pillar ${FORMULA_NAME}.${state_name}"; exit 1; }
+            cat ${SALT_CACHE_DIR}/${meta_name}
+        done
+    done
+}
+
+real_run() {
+    for pillar in ${PILLARDIR}/*.sls; do
+        state_name=$(basename ${pillar%.sls})
+        salt_run --id=${state_name} state.sls ${FORMULA_NAME} || { log_err "Execution of ${FORMULA_NAME}.${state_name} failed"; exit 1; }
+    done
+}
+
+run_model_validate(){
+    if [ -d ${SCHEMARDIR} ]; then
+      # model validator require py modules
+      fetch_dependency "salt:https://github.com/salt-formulas/salt-formula-salt"
+      link_modules
+      # Rendered Example:
+      # python $(which salt-call) --local -c /test1/maas/tests/build/salt --id=maas_cluster modelschema.model_validate maas cluster
+      for role in ${SCHEMARDIR}/*.yaml; do
+          state_name=$(basename "${role%*.yaml}")
+          minion_id="${state_name}"
+          salt_run saltutil.clear_cache; salt_run saltutil.refresh_pillar; salt_run saltutil.sync_all;
+          salt_run -m ${DEPSDIR}/salt-formula-salt --id=${minion_id} modelschema.model_validate ${FORMULA_NAME} ${state_name} || { log_err "Execution of ${FORMULA_NAME}.${state_name} failed"; exit 1 ; }
+      done
+    else
+      log_info "${SCHEMARDIR} not found!";
+    fi
+}
+
+dependency_check() {
+  local DEPENDENCY_COMMANDS=$*
+
+  for DEPENDENCY_COMMAND in $DEPENDENCY_COMMANDS; do
+    which $DEPENDENCY_COMMAND > /dev/null || ( log_err "Command \"$DEPENDENCY_COMMAND\" can not be found in default path."; exit 1; )
+  done
+}
+
+_atexit() {
+    RETVAL=$?
+    trap true INT TERM EXIT
+
+    if [ $RETVAL -ne 0 ]; then
+        log_err "Execution failed"
+    else
+        log_info "Execution successful"
+    fi
+    return $RETVAL
+}
+
+## Main
+trap _atexit INT TERM EXIT
+
+case $1 in
+    clean)
+        clean
+        ;;
+    prepare)
+        prepare
+        ;;
+    lint)
+        lint
+        ;;
+    run)
+        run
+        ;;
+    real-run)
+        real_run
+        ;;
+    model-validate)
+       prepare
+       run_model_validate
+        ;;
+    *)
+        prepare
+#        lint
+        run
+        run_model_validate
+        ;;
+esac
\ No newline at end of file
