diff --git a/test-salt-formulas-pipeline.groovy b/test-salt-formulas-pipeline.groovy
index d088030..c3a2e51 100644
--- a/test-salt-formulas-pipeline.groovy
+++ b/test-salt-formulas-pipeline.groovy
@@ -25,7 +25,7 @@
     defaultGitUrl = null
 }
 
-def checkouted = false;
+def checkouted = false
 
 node("python") {
   try{
@@ -41,73 +41,79 @@
     stage("checkout") {
       if (gerritRef) {
         // job is triggered by Gerrit
-        // test if change aren't already merged
         def gerritChange = gerrit.getGerritChange(GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, CREDENTIALS_ID)
-        def merged = gerritChange.status == "MERGED"
-        if(!merged){
-          checkouted = gerrit.gerritPatchsetCheckout ([
-            credentialsId : CREDENTIALS_ID
-          ])
-        } else{
-          common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to test them")
+        // test WIP contains in commit message
+        if(gerritChange.commitMessage.contains("WIP")){
+          common.successMsg("Commit message contains WIP, skipping tests") // do nothing
+        }else{
+          // test if change aren't already merged
+          def merged = gerritChange.status == "MERGED"
+          if(!merged){
+            checkouted = gerrit.gerritPatchsetCheckout ([
+              credentialsId : CREDENTIALS_ID
+            ])
+          } else{
+            common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to test them")
+          }
         }
       } else if(defaultGitRef && defaultGitUrl) {
           checkouted = gerrit.gerritPatchsetCheckout(defaultGitUrl, defaultGitRef, "HEAD", CREDENTIALS_ID)
-      }
-      if(!checkouted){
+      } else {
         throw new Exception("Cannot checkout gerrit patchset, GERRIT_REFSPEC and DEFAULT_GIT_REF is null")
       }
     }
     stage("test") {
       if(checkouted){
-        wrap([$class: 'AnsiColorBuildWrapper']) {
-          sh("make clean")
-          sh("[ $SALT_VERSION != 'latest' ] || export SALT_VERSION=''; make test")
+          wrap([$class: 'AnsiColorBuildWrapper']) {
+            sh("make clean")
+            sh("[ $SALT_VERSION != 'latest' ] || export SALT_VERSION=''; make test")
         }
       }
     }
     stage("kitchen") {
-      if (fileExists(".kitchen.yml")) {
-        common.infoMsg(".kitchen.yml found, running kitchen tests")
-        ruby.ensureRubyEnv()
-        def kitchenEnvs = []
-        if(fileExists(".travis.yml")){
-          common.infoMsg(".travis.yml found, running custom kitchen init")
-          def kitchenConfigYML = readYaml(file: ".travis.yml")
-          kitchenEnvs=kitchenConfigYML["env"]
-          def kitchenInit = kitchenConfigYML["install"]
-          def kitchenInstalled = false
-          if(kitchenInit && !kitchenInit.isEmpty()){
-            for(int i=0;i<kitchenInit.size();i++){
-              if(kitchenInit[i].trim().startsWith("test -e Gemfile")){ //found Gemfile config
-                common.infoMsg("Custom Gemfile configuration found, using them")
-                ruby.installKitchen(kitchenInit[i].trim())
-                kitchenInstalled = true
+      if(checkouted){
+        if (fileExists(".kitchen.yml")) {
+          common.infoMsg(".kitchen.yml found, running kitchen tests")
+          ruby.ensureRubyEnv()
+          def kitchenEnvs = []
+          if(fileExists(".travis.yml")){
+            common.infoMsg(".travis.yml found, running custom kitchen init")
+            def kitchenConfigYML = readYaml(file: ".travis.yml")
+            kitchenEnvs=kitchenConfigYML["env"]
+            def kitchenInit = kitchenConfigYML["install"]
+            def kitchenInstalled = false
+            if(kitchenInit && !kitchenInit.isEmpty()){
+              for(int i=0;i<kitchenInit.size();i++){
+                if(kitchenInit[i].trim().startsWith("test -e Gemfile")){ //found Gemfile config
+                  common.infoMsg("Custom Gemfile configuration found, using them")
+                  ruby.installKitchen(kitchenInit[i].trim())
+                  kitchenInstalled = true
+                }
               }
             }
-          }
-          if(!kitchenInstalled){
-            ruby.installKitchen()
-          }
-        }else{
-          common.infoMsg(".travis.yml not found, running default kitchen init")
-          ruby.installKitchen()
-        }
-        common.infoMsg("Running kitchen testing, parallel mode: " + KITCHEN_TESTS_PARALLEL.toBoolean())
-        wrap([$class: 'AnsiColorBuildWrapper']) {
-          if(kitchenEnvs && !kitchenEnvs.isEmpty()){
-            common.infoMsg("Found multiple environment, first running kitchen without custom env")
-            ruby.runKitchenTests("", KITCHEN_TESTS_PARALLEL.toBoolean())
-            for(int i=0;i<kitchenEnvs.size();i++){
-              common.infoMsg("Found multiple environment, kitchen running with env: " + kitchenEnvs[i])
-              ruby.runKitchenTests(kitchenEnvs[i], KITCHEN_TESTS_PARALLEL.toBoolean())
+            if(!kitchenInstalled){
+              ruby.installKitchen()
             }
           }else{
-            ruby.runKitchenTests("", KITCHEN_TESTS_PARALLEL.toBoolean())
+            common.infoMsg(".travis.yml not found, running default kitchen init")
+            ruby.installKitchen()
           }
+          common.infoMsg("Running kitchen testing, parallel mode: " + KITCHEN_TESTS_PARALLEL.toBoolean())
+          wrap([$class: 'AnsiColorBuildWrapper']) {
+            if(kitchenEnvs && !kitchenEnvs.isEmpty()){
+              common.infoMsg("Found multiple environment, first running kitchen without custom env")
+              ruby.runKitchenTests("", KITCHEN_TESTS_PARALLEL.toBoolean())
+              for(int i=0;i<kitchenEnvs.size();i++){
+                common.infoMsg("Found multiple environment, kitchen running with env: " + kitchenEnvs[i])
+                ruby.runKitchenTests(kitchenEnvs[i], KITCHEN_TESTS_PARALLEL.toBoolean())
+              }
+            }else{
+              ruby.runKitchenTests("", KITCHEN_TESTS_PARALLEL.toBoolean())
+            }
+          }
+        } else {
+          common.infoMsg(".kitchen.yml not found")
         }
-      } else {
-        common.infoMsg(".kitchen.yml not found")
       }
     }
   } catch (Throwable e) {
diff --git a/test-salt-models-pipeline.groovy b/test-salt-models-pipeline.groovy
index fe08e75..c6f1a71 100644
--- a/test-salt-models-pipeline.groovy
+++ b/test-salt-models-pipeline.groovy
@@ -29,7 +29,6 @@
     defaultGitUrl = null
 }
 def checkouted = false
-def merged = false
 node("python") {
   try{
     stage("stop old tests"){
@@ -46,18 +45,25 @@
         // job is triggered by Gerrit
         // test if change aren't already merged
         def gerritChange = gerrit.getGerritChange(GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, CREDENTIALS_ID)
-        merged = gerritChange.status == "MERGED"
-        if(!merged){
-          checkouted = gerrit.gerritPatchsetCheckout ([
-            credentialsId : CREDENTIALS_ID
-          ])
-        } else{
-          common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to test them")
+        // test WIP contains in commit message
+        if (gerritChange.commitMessage.contains("WIP")) {
+          common.successMsg("Commit message contains WIP, skipping tests") // do nothing
+        } else {
+          def merged = gerritChange.status == "MERGED"
+          if(!merged){
+            checkouted = gerrit.gerritPatchsetCheckout ([
+              credentialsId : CREDENTIALS_ID
+            ])
+          } else{
+            common.successMsg("Change ${GERRIT_CHANGE_NUMBER} is already merged, no need to test them")
+          }
         }
       } else if(defaultGitRef && defaultGitUrl) {
           checkouted = gerrit.gerritPatchsetCheckout(defaultGitUrl, defaultGitRef, "HEAD", CREDENTIALS_ID)
+      } else {
+        throw new Exception("Cannot checkout gerrit patchset, GERRIT_REFSPEC and DEFAULT_GIT_REF is null")
       }
-      if(checkouted){
+      if(checkouted) {
         if (fileExists('classes/system')) {
           ssh.prepareSshAgentKey(CREDENTIALS_ID)
           dir('classes/system') {
@@ -66,13 +72,11 @@
           }
           ssh.agentSh("git submodule init; git submodule sync; git submodule update --recursive")
         }
-      }else if(!merged){
-        throw new Exception("Cannot checkout gerrit patchset, GERRIT_REFSPEC and DEFAULT_GIT_REF is null")
       }
     }
 
     stage("test-nodes") {
-      if(!merged){
+      if(checkouted) {
         def workspace = common.getWorkspace()
         def nodes = sh(script: "find ./nodes -type f -name 'cfg*.yml'", returnStdout: true).tokenize()
         def buildSteps = [:]
@@ -104,7 +108,7 @@
   def jenkinsUtils = new com.mirantis.mk.JenkinsUtils()
   def triggeredBuilds= gerrit.getGerritTriggeredBuilds(jenkinsUtils.getJobRunningBuilds(jobName), gerritChangeNumber, excludePatchsetNumber)
   def buildNums =[]
-  for(int i=0;i<triggeredBuilds.size();i++){
+  for (int i=0; i<triggeredBuilds.size(); i++) {
       buildNums.add(triggeredBuilds[i].number)
   }
   return buildNums
