diff --git a/test-salt-formulas-env.groovy b/test-salt-formulas-env.groovy
new file mode 100644
index 0000000..c278538
--- /dev/null
+++ b/test-salt-formulas-env.groovy
@@ -0,0 +1,96 @@
+/**
+ * Test salt formulas pipeline
+ *  DEFAULT_GIT_REF
+ *  DEFAULT_GIT_URL
+ *  CREDENTIALS_ID
+ */
+def common = new com.mirantis.mk.Common()
+def ruby = new com.mirantis.mk.Ruby()
+
+def defaultGitRef, defaultGitUrl
+try {
+  defaultGitRef = DEFAULT_GIT_REF
+  defaultGitUrl = DEFAULT_GIT_URL
+} catch (MissingPropertyException e) {
+  defaultGitRef = null
+  defaultGitUrl = null
+}
+
+def checkouted = false
+
+node("python") {
+  try {
+    stage("checkout") {
+      if (defaultGitRef && defaultGitUrl) {
+        checkouted = gerrit.gerritPatchsetCheckout(defaultGitUrl, defaultGitRef, "HEAD", CREDENTIALS_ID)
+      } else {
+        throw new Exception("Cannot checkout gerrit patchset, DEFAULT_GIT_REF is null")
+      }
+    }
+    stage("test") {
+      if (checkouted) {
+        sh("make clean")
+        sh("[ $SALT_VERSION != 'latest' ] || export SALT_VERSION=''; make test")
+      }
+    }
+    stage("kitchen") {
+      if (checkouted) {
+        if (fileExists(".kitchen.yml")) {
+          common.infoMsg(".kitchen.yml found, running kitchen tests")
+          ruby.ensureRubyEnv()
+          if (fileExists(".travis.yml")) {
+            common.infoMsg(".travis.yml found, running custom kitchen init")
+            def kitchenConfigYML = readYaml(file: ".travis.yml")
+            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 part of kitchen test")
+          if (common.validInputParam(KITCHEN_ENV)) {
+            def cleanEnv = KITCHEN_ENV.replaceAll("\\s?SUITE=[^\\s]*", "")
+            def suitePattern = java.util.regex.Pattern.compile("\\s?SUITE=([^\\s]*)")
+            def suiteMatcher = suitePattern.matcher(KITCHEN_ENV)
+            if (suiteMatcher.find()) {
+              def suite = suiteMatcher.group(1)
+              def cleanSuite = suite.replaceAll("_", "-")
+              common.infoMsg("Running kitchen test with environment:" + filteredEnvs.trim())
+              ruby.runKitchenTests(cleanEnv, cleanSuite)
+            } else {
+              common.warningMsg("No SUITE was found. Running with all suites.")
+              ruby.runKitchenTests(cleanEnv, "")
+            }
+          } else {
+            throw new Exception("KITCHEN_ENV parameter is empty or invalid. This may indicate wrong env settings of initial test job or .travis.yml file.")
+          }
+        } else {
+          throw new Exception(".kitchen.yml file not found, no kitchen tests triggered.")
+        }
+      }
+    }
+  } catch (Throwable e) {
+    // If there was an error or exception thrown, the build failed
+    currentBuild.result = "FAILURE"
+    ruby.runKitchenCommand("destroy")
+    throw e
+  } finally {
+    if (currentBuild.result == "FAILURE" && fileExists(".kitchen/logs/kitchen.log")) {
+      common.errorMsg("----------------KITCHEN LOG:---------------")
+      println readFile(".kitchen/logs/kitchen.log")
+    }
+    common.sendNotification(currentBuild.result, "", ["slack"])
+  }
+}
\ No newline at end of file
diff --git a/test-salt-formulas-pipeline.groovy b/test-salt-formulas-pipeline.groovy
index 1fb62ad..32a6538 100644
--- a/test-salt-formulas-pipeline.groovy
+++ b/test-salt-formulas-pipeline.groovy
@@ -16,116 +16,122 @@
   gerritRef = null
 }
 
+def parallelGroupSize
+try {
+  parallelGroupSize = Integer.valueOf(PARALLEL_GROUP_SIZE)
+} catch (MissingPropertyException e) {
+  parallelGroupSize = 4
+}
+
 def defaultGitRef, defaultGitUrl
 try {
-    defaultGitRef = DEFAULT_GIT_REF
-    defaultGitUrl = DEFAULT_GIT_URL
+  defaultGitRef = DEFAULT_GIT_REF
+  defaultGitUrl = DEFAULT_GIT_URL
 } catch (MissingPropertyException e) {
-    defaultGitRef = null
-    defaultGitUrl = null
+  defaultGitRef = null
+  defaultGitUrl = null
 }
 
 def checkouted = false
 
 node("python") {
-  try{
+  try {
     stage("checkout") {
       if (gerritRef) {
         // job is triggered by Gerrit
         def gerritChange = gerrit.getGerritChange(GERRIT_NAME, GERRIT_HOST, GERRIT_CHANGE_NUMBER, CREDENTIALS_ID, true)
         // test if gerrit change is already Verified
-        if(gerrit.patchsetHasApproval(gerritChange.currentPatchSet,"Verified","+")){
+        if (gerrit.patchsetHasApproval(gerritChange.currentPatchSet, "Verified", "+")) {
           common.successMsg("Gerrit change ${GERRIT_CHANGE_NUMBER} patchset ${GERRIT_PATCHSET_NUMBER} already has Verified, skipping tests") // do nothing
-        // test WIP contains in commit message
-        }else if(gerritChange.commitMessage.contains("WIP")){
+          // test WIP contains in commit message
+        } else if (gerritChange.commitMessage.contains("WIP")) {
           common.successMsg("Commit message contains WIP, skipping tests") // do nothing
-        }else{
+        } else {
           // test if change aren't already merged
           def merged = gerritChange.status == "MERGED"
-          if(!merged){
-            checkouted = gerrit.gerritPatchsetCheckout ([
-              credentialsId : CREDENTIALS_ID
+          if (!merged) {
+            checkouted = gerrit.gerritPatchsetCheckout([
+              credentialsId: CREDENTIALS_ID
             ])
-          } else{
+          } 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 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")
       }
     }
     stage("test") {
-      if(checkouted){
+      if (checkouted) {
         sh("make clean")
         sh("[ $SALT_VERSION != 'latest' ] || export SALT_VERSION=''; make test")
       }
     }
     stage("kitchen") {
-      if(checkouted){
+      if (checkouted) {
         if (fileExists(".kitchen.yml")) {
           common.infoMsg(".kitchen.yml found, running kitchen tests")
           ruby.ensureRubyEnv()
           def kitchenEnvs = []
           def filteredEnvs = []
-          if(fileExists(".travis.yml")){
-            common.infoMsg(".travis.yml found, running custom kitchen init")
+          if (fileExists(".travis.yml")) {
+            common.infoMsg(".travis.yml file found.")
             def kitchenConfigYML = readYaml(file: ".travis.yml")
-            if(kitchenConfigYML.containsKey("env")){
-              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())
-
-          if(CUSTOM_KITCHEN_ENVS != null && CUSTOM_KITCHEN_ENVS != ''){
-              filteredEnvs = CUSTOM_KITCHEN_ENVS.tokenize('\n')
-            } else {
-              filteredEnvs = ruby.filterKitchenEnvs(kitchenEnvs).unique()
-            }
-            // Allow custom filteredEnvs in case of empty kitchenEnvs
-          if((kitchenEnvs && !kitchenEnvs.isEmpty() && !filteredEnvs.isEmpty()) || ((kitchenEnvs==null || kitchenEnvs=='') && !filteredEnvs.isEmpty())){
-            for(int i=0; i<filteredEnvs.size(); i++){
-              common.infoMsg("Found " + filteredEnvs.size() + " environment, kitchen running with env number " + (i+1) + ": " + filteredEnvs[i].trim())
-              ruby.runKitchenTests(filteredEnvs[i].trim(), KITCHEN_TESTS_PARALLEL.toBoolean())
+            if (kitchenConfigYML.containsKey("env")) {
+              kitchenEnvs = kitchenConfigYML["env"]
             }
           } else {
-            ruby.runKitchenTests("", KITCHEN_TESTS_PARALLEL.toBoolean())
+            common.warningMsg(".travis.yml file not found, suites must be passed via CUSTOM_KITCHEN_ENVS parameter.")
           }
-        } else {
-          common.infoMsg(".kitchen.yml not found")
+          common.infoMsg("Running kitchen testing in parallel mode")
+          if (CUSTOM_KITCHEN_ENVS != null && CUSTOM_KITCHEN_ENVS != '') {
+            kitchenEnvs = CUSTOM_KITCHEN_ENVS.tokenize('\n')
+            common.infoMsg("CUSTOM_KITCHEN_ENVS not empty. Running with custom enviroments: ${kitchenEnvs}")
+          }
+          if (kitchenEnvs != null && kitchenEnvs != '') {
+            common.infoMsg("Found " + kitchenEnvs.size() + " environment(s)")
+            for (int i = 0; i < kitchenEnvs.size(); i++) {
+              def acc = 0
+              if (acc >= parallelGroupSize) {
+                parallel kitchenTestRuns
+                kitchenTestRuns = [: ]
+                acc = 0
+              }
+              def testEnv = kitchenEnvs[i]
+              kitchenTestRuns[testEnv] = {
+                build job: "test-salt-formulas-env", parameters: [
+                  [$class: 'StringParameterValue', name: 'CREDENTIALS_ID', value: CREDENTIALS_ID],
+                  [$class: 'StringParameterValue', name: 'KITCHEN_ENV', value: testEnv],
+                  [$class: 'StringParameterValue', name: 'DEFAULT_GIT_REF', value: DEFAULT_GIT_REF],
+                  [$class: 'StringParameterValue', name: 'DEFAULT_GIT_URL', value: DEFAULT_GIT_URL],
+                  [$class: 'StringParameterValue', name: 'SALT_OPTS', value: SALT_OPTS],
+                  [$class: 'StringParameterValue', name: 'SALT_VERSION', value: SALT_VERSION]
+                ]
+              }
+              acc++;
+            }
+            if (acc != 0) {
+              parallel kitchenTestRuns
+            }
+          } else {
+            common.warningMsg(".kitchen.yml file not found, no kitchen tests triggered.")
+          }
         }
       }
     }
   } catch (Throwable e) {
-     // If there was an error or exception thrown, the build failed
-     currentBuild.result = "FAILURE"
-     currentBuild.description = currentBuild.description ? e.message + " " + currentBuild.description : e.message
-     ruby.runKitchenCommand("destroy")
-     throw e
+    // If there was an error or exception thrown, the build failed
+    currentBuild.result = "FAILURE"
+    currentBuild.description = currentBuild.description ? e.message + " " + currentBuild.description : e.message
+    ruby.runKitchenCommand("destroy")
+    throw e
   } finally {
-     if(currentBuild.result == "FAILURE" && fileExists(".kitchen/logs/kitchen.log")){
-        common.errorMsg("----------------KITCHEN LOG:---------------")
-        println readFile(".kitchen/logs/kitchen.log")
-     }
-     common.sendNotification(currentBuild.result,"",["slack"])
+    if (currentBuild.result == "FAILURE" && fileExists(".kitchen/logs/kitchen.log")) {
+      common.errorMsg("----------------KITCHEN LOG:---------------")
+      println readFile(".kitchen/logs/kitchen.log")
+    }
+    common.sendNotification(currentBuild.result, "", ["slack"])
   }
-}
-
+}
\ No newline at end of file
