diff --git a/aptly-promote-pipeline.groovy b/aptly-promote-pipeline.groovy
index 7c1cd42..00d41b8 100644
--- a/aptly-promote-pipeline.groovy
+++ b/aptly-promote-pipeline.groovy
@@ -20,9 +20,7 @@
   try{
     stage("promote") {
       lock("aptly-api") {
-        wrap([$class: 'AnsiColorBuildWrapper']) {
-          aptly.promotePublish(APTLY_URL, SOURCE, TARGET, RECREATE, components, packages, DIFF_ONLY)
-        }
+        aptly.promotePublish(APTLY_URL, SOURCE, TARGET, RECREATE, components, packages, DIFF_ONLY)
       }
     }
   } catch (Throwable e) {
diff --git a/gating-pipeline.groovy b/gating-pipeline.groovy
index 68c1095..c113d28 100644
--- a/gating-pipeline.groovy
+++ b/gating-pipeline.groovy
@@ -21,31 +21,29 @@
         // test max CodeReview
         if(gerrit.patchsetHasApproval(gerritChange.currentPatchSet,"Code-Review", "+")){
           doSubmit = true
-          wrap([$class: 'AnsiColorBuildWrapper']) {
-            def gerritProjectArray = GERRIT_PROJECT.tokenize("/")
-            def gerritProject = gerritProjectArray[gerritProjectArray.size() - 1]
-            def jobsNamespace = JOBS_NAMESPACE
-            def plural_namespaces = ['salt-formulas', 'salt-models']
-            // remove plural s on the end of job namespace
-            if (JOBS_NAMESPACE in plural_namespaces){
-              jobsNamespace = JOBS_NAMESPACE.substring(0, JOBS_NAMESPACE.length() - 1)
-            }
-            // salt-formulas tests have -latest on end of the name
-            if(JOBS_NAMESPACE.equals("salt-formulas")){
-              gerritProject=gerritProject+"-latest"
-            }
-            def testJob = String.format("test-%s-%s", jobsNamespace, gerritProject)
-            if (_jobExists(testJob)) {
-              common.infoMsg("Test job ${testJob} found, running")
-              def patchsetVerified =  gerrit.patchsetHasApproval(gerritChange.currentPatchSet,"Verified", "+")
-              build job: testJob, parameters: [
-                [$class: 'StringParameterValue', name: 'DEFAULT_GIT_URL', value: "${GERRIT_SCHEME}://${GERRIT_NAME}@${GERRIT_HOST}:${GERRIT_PORT}/${GERRIT_PROJECT}"],
-                [$class: 'StringParameterValue', name: 'DEFAULT_GIT_REF', value: GERRIT_REFSPEC]
-              ]
-              giveVerify = true
-            } else {
-              common.infoMsg("Test job ${testJob} not found")
-            }
+          def gerritProjectArray = GERRIT_PROJECT.tokenize("/")
+          def gerritProject = gerritProjectArray[gerritProjectArray.size() - 1]
+          def jobsNamespace = JOBS_NAMESPACE
+          def plural_namespaces = ['salt-formulas', 'salt-models']
+          // remove plural s on the end of job namespace
+          if (JOBS_NAMESPACE in plural_namespaces){
+            jobsNamespace = JOBS_NAMESPACE.substring(0, JOBS_NAMESPACE.length() - 1)
+          }
+          // salt-formulas tests have -latest on end of the name
+          if(JOBS_NAMESPACE.equals("salt-formulas")){
+            gerritProject=gerritProject+"-latest"
+          }
+          def testJob = String.format("test-%s-%s", jobsNamespace, gerritProject)
+          if (_jobExists(testJob)) {
+            common.infoMsg("Test job ${testJob} found, running")
+            def patchsetVerified =  gerrit.patchsetHasApproval(gerritChange.currentPatchSet,"Verified", "+")
+            build job: testJob, parameters: [
+              [$class: 'StringParameterValue', name: 'DEFAULT_GIT_URL', value: "${GERRIT_SCHEME}://${GERRIT_NAME}@${GERRIT_HOST}:${GERRIT_PORT}/${GERRIT_PROJECT}"],
+              [$class: 'StringParameterValue', name: 'DEFAULT_GIT_REF', value: GERRIT_REFSPEC]
+            ]
+            giveVerify = true
+          } else {
+            common.infoMsg("Test job ${testJob} not found")
           }
         } else {
           common.errorMsg("Change don't have a CodeReview, skipping gate")
diff --git a/test-salt-formulas-pipeline.groovy b/test-salt-formulas-pipeline.groovy
index 0a44247..8ad5f1c 100644
--- a/test-salt-formulas-pipeline.groovy
+++ b/test-salt-formulas-pipeline.groovy
@@ -58,10 +58,8 @@
     }
     stage("test") {
       if(checkouted){
-          wrap([$class: 'AnsiColorBuildWrapper']) {
-            sh("make clean")
-            sh("[ $SALT_VERSION != 'latest' ] || export SALT_VERSION=''; make test")
-        }
+        sh("make clean")
+        sh("[ $SALT_VERSION != 'latest' ] || export SALT_VERSION=''; make test")
       }
     }
     stage("kitchen") {
@@ -96,21 +94,20 @@
             ruby.installKitchen()
           }
           common.infoMsg("Running kitchen testing, parallel mode: " + KITCHEN_TESTS_PARALLEL.toBoolean())
-          wrap([$class: 'AnsiColorBuildWrapper']) {
-            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(CUSTOM_KITCHEN_ENVS != null && CUSTOM_KITCHEN_ENVS != ''){
+              filteredEnvs = CUSTOM_KITCHEN_ENVS.tokenize('\n')
             } else {
-              ruby.runKitchenTests("", KITCHEN_TESTS_PARALLEL.toBoolean())
+              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())
+            }
+          } else {
+            ruby.runKitchenTests("", KITCHEN_TESTS_PARALLEL.toBoolean())
           }
         } else {
           common.infoMsg(".kitchen.yml not found")
