diff --git a/jenkins/build-config-infra-health.jpl b/jenkins/build-config-infra-health.jpl
deleted file mode 100644
index 912c60f..0000000
--- a/jenkins/build-config-infra-health.jpl
+++ /dev/null
@@ -1,124 +0,0 @@
-#!/usr/bin/env groovy
-//-------------------------------------------------------------------------------
-// Copyright (c) 2020, Arm Limited and Contributors. All rights reserved.
-//
-// SPDX-License-Identifier: BSD-3-Clause
-//
-//-------------------------------------------------------------------------------
-
-@Library('trustedfirmware') _
-import org.trustedfirmware.Gerrit
-
-def nodeLabel = "docker-amd64-tf-m-bionic"
-if (env.COMPILER == "ARMCLANG") {
-  nodeLabel = "docker-amd64-tf-m-bionic"
-}
-
-node(nodeLabel) {
-  stage("Init") {
-    cleanWs()
-    dir("trusted-firmware-m") {
-      checkout(
-        poll: false,
-        scm: [
-          $class: 'GitSCM',
-          branches: [[name: '$GERRIT_BRANCH']],
-          extensions: [[$class: 'BuildChooserSetting', buildChooser: [$class: 'GerritTriggerBuildChooser']]],
-          userRemoteConfigs: [[
-            credentialsId: 'GIT_SSH_KEY',
-            refspec: '$GERRIT_REFSPEC', url: '$CODE_REPO'
-          ]]
-        ])
-    }
-    dir("tf-m-ci-scripts") {
-      checkout(
-        poll: false,
-        scm: [
-          $class: 'GitSCM',
-          branches: [[name: '$CI_SCRIPTS_BRANCH']],
-          extensions: [[$class: 'BuildChooserSetting', buildChooser: [$class: 'GerritTriggerBuildChooser']]],
-          userRemoteConfigs: [[
-            credentialsId: 'GIT_SSH_KEY',
-            refspec: '$CI_SCRIPTS_REFSPEC', url: '$CI_SCRIPTS_REPO'
-          ]]
-        ])
-    }
-    dir("mbedtls") {
-      checkout(
-        changelog: false,
-        poll: false,
-        scm: [
-          $class: 'GitSCM',
-          branches: [[name: 'FETCH_HEAD']],
-          userRemoteConfigs: [[
-            refspec: 'refs/tags/$MBEDTLS_VERSION',
-            url: params.MBEDTLS_URL
-          ]]
-        ]
-      )
-    }
-    dir("mcuboot") {
-      checkout(
-        changelog: false,
-        poll: false,
-        scm: [
-          $class: 'GitSCM',
-          branches: [[name: 'FETCH_HEAD']],
-          userRemoteConfigs: [[
-            refspec: '$MCUBOOT_REFSPEC',
-            url: params.MCUBOOT_URL
-          ]]
-        ]
-      )
-    }
-    dir("tf-m-tests") {
-      checkout(
-        changelog: false,
-        poll: false,
-        scm: [
-          $class: 'GitSCM',
-          branches: [[name: 'FETCH_HEAD']],
-          userRemoteConfigs: [[
-            refspec: '$TFM_TESTS_REFSPEC',
-            url: params.TFM_TESTS_URL
-          ]]
-        ]
-      )
-    }
-    if (env.PSA_API_SUITE != "") {
-      dir("psa-arch-tests") {
-        checkout(
-          changelog: false,
-          poll: false,
-          scm: [
-            $class: 'GitSCM',
-            branches: [[name: 'FETCH_HEAD']],
-            userRemoteConfigs: [[
-              refspec: '$PSA_ARCH_TESTS_VERSION',
-              url: params.PSA_ARCH_TESTS_URL
-            ]]
-          ]
-        )
-      }
-    }
-  }
-  try {
-    verify = 1
-    stage("Build") {
-      sh "tf-m-ci-scripts/run-build.sh"
-    }
-    stage("Post") {
-      archiveArtifacts 'trusted-firmware-m/build/bin/**'
-      archiveArtifacts 'trusted-firmware-m/build/install/export/**'
-    }
-  } catch (Exception e) {
-    manager.buildFailure()
-    verify = -1
-  } finally {
-    g = new Gerrit()
-    g.verifyStatusInWorkspace(verify, env.CONFIG_NAME, 'build')
-    def buildStatus = (verify == 1) ? 'Successful' : 'Failed'
-    //g.commentInWorkspace("Build configuration ${env.CONFIG_NAME} ${buildStatus}: ${env.RUN_DISPLAY_URL}")
-    cleanWs()
-  }
-}
diff --git a/jenkins/ci-infra-health.jpl b/jenkins/ci-infra-health.jpl
deleted file mode 100644
index 6008af6..0000000
--- a/jenkins/ci-infra-health.jpl
+++ /dev/null
@@ -1,470 +0,0 @@
-#!/usr/bin/env groovy
-//-------------------------------------------------------------------------------
-// Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
-//
-// SPDX-License-Identifier: BSD-3-Clause
-//
-//-------------------------------------------------------------------------------
-
-@Library('trustedfirmware') _
-import org.trustedfirmware.Gerrit
-import org.trustedfirmware.Summary
-
-mapPlatform = ["cypress/psoc64":       "psoc64",
-               "arm/mps2/an519":       "AN519",
-               "arm/mps2/an521":       "AN521",
-               "arm/mps2/an539":       "AN539",
-               "arm/mps2/sse-200_aws": "SSE-200_AWS",
-               "arm/mps3/an524":       "AN524",
-               "arm/musca_a":          "MUSCA_A",
-               "arm/musca_b1":         "MUSCA_B1",
-               "arm/musca_s1":         "MUSCA_S1"]
-
-mapCompiler = ["toolchain_GNUARM.cmake":   "GNUARM",
-               "toolchain_ARMCLANG.cmake": "ARMCLANG"]
-
-mapBL2 = ["True":  "--bl2",
-          "False": ""]
-
-mapTestPsaApi = ["OFF":                      "",
-                 "INTERNAL_TRUSTED_STORAGE": "ITS",
-                 "PROTECTED_STORAGE":        "PS",
-                 "CRYPTO":                   "Crypto",
-                 "INITIAL_ATTESTATION":      "Attest",
-                 "IPC":                      "FF"]
-
-// BL2, NS, PSA_API, ISOLATION_LEVEL, TEST_REG, TEST_PSA_API, PROFILE, CONFIG_NAME
-mapConfigs = [
-  ["True", "True", "False", "1", "False", "OFF",                      "N.A",            "Default"],
-  ["True", "True", "True",  "1", "False", "OFF",                      "N.A",            "CoreIPC"],
-  ["True", "True", "True",  "2", "False", "OFF",                      "N.A",            "CoreIPCTfmLevel2"],
-  ["True", "True", "True",  "3", "False", "OFF",                      "N.A",            "CoreIPCTfmLevel3"],
-  ["True", "True", "False", "1", "False", "OFF",                      "profile_small",  "DefaultProfileS"],
-  ["True", "True", "True",  "2", "False", "OFF",                      "profile_medium", "DefaultProfileM"],
-  ["True", "True", "False", "1", "True",  "OFF",                      "N.A",            "Regression"],
-  ["True", "True", "True",  "1", "True",  "OFF",                      "N.A",            "RegressionIPC"],
-  ["True", "True", "True",  "2", "True",  "OFF",                      "N.A",            "RegressionIPCTfmLevel2"],
-  ["True", "True", "True",  "3", "True",  "OFF",                      "N.A",            "RegressionIPCTfmLevel3"],
-  ["True", "True", "False", "1", "True",  "OFF",                      "profile_small",  "RegressionProfileS"],
-  ["True", "True", "True",  "2", "True",  "OFF",                      "profile_medium", "RegressionProfileM"],
-  ["True", "True", "False", "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTest (ITS)"],
-  ["True", "True", "False", "1", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTest (PS)"],
-  ["True", "True", "False", "1", "False", "CRYPTO",                   "N.A",            "PsaApiTest (Crypto)"],
-  ["True", "True", "False", "1", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTest (Attest)"],
-  ["True", "True", "False", "1", "False", "IPC",                      "N.A",            "PsaApiTest (FF)"],
-  ["True", "True", "True",  "1", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTestIPC (ITS)"],
-  ["True", "True", "True",  "1", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTestIPC (PS)"],
-  ["True", "True", "True",  "1", "False", "CRYPTO",                   "N.A",            "PsaApiTestIPC (Crypto)"],
-  ["True", "True", "True",  "1", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTestIPC (Attest)"],
-  ["True", "True", "True",  "1", "False", "IPC",                      "N.A",            "PsaApiTestIPC (FF)"],
-  ["True", "True", "True",  "2", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTestIPCTfmLevel2 (ITS)"],
-  ["True", "True", "True",  "2", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTestIPCTfmLevel2 (PS)"],
-  ["True", "True", "True",  "2", "False", "CRYPTO",                   "N.A",            "PsaApiTestIPCTfmLevel2 (Crypto)"],
-  ["True", "True", "True",  "2", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTestIPCTfmLevel2 (Attest)"],
-  ["True", "True", "True",  "2", "False", "IPC",                      "N.A",            "PsaApiTestIPCTfmLevel2 (FF)"],
-  ["True", "True", "True",  "3", "False", "INTERNAL_TRUSTED_STORAGE", "N.A",            "PsaApiTestIPCTfmLevel3 (ITS)"],
-  ["True", "True", "True",  "3", "False", "PROTECTED_STORAGE",        "N.A",            "PsaApiTestIPCTfmLevel3 (PS)"],
-  ["True", "True", "True",  "3", "False", "CRYPTO",                   "N.A",            "PsaApiTestIPCTfmLevel3 (Crypto)"],
-  ["True", "True", "True",  "3", "False", "INITIAL_ATTESTATION",      "N.A",            "PsaApiTestIPCTfmLevel3 (Attest)"],
-  ["True", "True", "True",  "3", "False", "IPC",                      "N.A",            "PsaApiTestIPCTfmLevel3 (FF)"],
-]
-
-def generateLavaParam(build_params) {
-  def params = []
-  params += string(name: "TARGET_PLATFORM", \
-                   value: mapPlatform[build_params["TFM_PLATFORM"]])
-  params += string(name: "COMPILER", \
-                   value: mapCompiler[build_params["TOOLCHAIN_FILE"]])
-  params += string(name: "PSA_API_SUITE", \
-                   value: mapTestPsaApi[build_params["TEST_PSA_API"]])
-
-  configName = "Config"
-  config_params = [build_params["BL2"], build_params["NS"], \
-                   build_params["PSA_API"], build_params["ISOLATION_LEVEL"], \
-                   build_params["TEST_REGRESSION"], build_params["TEST_PSA_API"], \
-                   build_params["PROFILE"]]
-  for (config in mapConfigs) {
-    if (config_params == config[0..6]) {
-      configName += config[7].split(' ')[0]
-      break
-    }
-  }
-  if (configName == "Config") {
-    configName = "ConfigDefault"
-  }
-  params += string(name: "PROJ_CONFIG", value: configName)
-
-  return params
-}
-
-def listConfigs(ci_scripts_dir, config_list, filter_group) {
-  dir(ci_scripts_dir) {
-    echo "Obtaining list of configs."
-    echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}"
-    def build_config_list_raw = sh(script: """\
-python3 ./configs.py -g ${filter_group.replace(" ", " -g ")}
-""", returnStdout: true).trim()
-    def build_config_list = build_config_list_raw.tokenize('\n')
-    config_list.addAll(build_config_list)
-  }
-}
-
-def buildConfig(ci_scripts_dir, config, filter_group, results) {
-  def params = []
-  def params_collection = [:]
-  def build_config_params
-  dir(ci_scripts_dir) {
-    echo "Obtaining build configuration for config ${config}"
-    echo "Running: python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}"
-    build_config_params = sh(script: """\
-python3 ./configs.py -g ${filter_group.replace(" ", " -g ")} ${config}
-""", returnStdout: true).trim()
-  }
-  def lines = build_config_params.tokenize('\n')
-  for (String line : lines) {
-    def key, value
-    (key, value) = line.tokenize('=')
-    params += string(name: key, value: value)
-    params_collection[key] = value
-  }
-  params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
-  params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
-  params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
-  params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
-  params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
-  params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
-  params += string(name: 'CODE_REPO', value: env.CODE_REPO)
-  params += string(name: 'CODE_COVERAGE_EN', value: env.CODE_COVERAGE_EN)
-  params += string(name: 'TFM_TESTS_REFSPEC', value: env.TFM_TESTS_REFSPEC)
-  params += string(name: 'CI_SCRIPTS_REFSPEC', value: env.CI_SCRIPTS_REFSPEC)
-  params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
-  return { -> results
-    def build_res = build(job: 'tf-m-build-config-infra-health', parameters: params, propagate: false)
-    def build_info = [build_res, config, params_collection]
-    results['builds'][build_res.number] = build_info
-    def build_url = build_res.getAbsoluteUrl()
-    print("${build_res.number}: ${config} ${build_res.result} ${build_url}")
-    failure_states = ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]
-    if (build_res.result in failure_states) {
-      error("Build failed at ${build_url}")
-    }
-    else if (params_collection["NS"] == "False" ||
-             params_collection["PARTITION_PS"] == "OFF") {
-      print("LAVA is not needed for ${build_url}")
-    }
-    else {
-      print("Doing LAVA stuff for ${build_url}")
-      params += generateLavaParam(params_collection)
-      params += string(name: 'BUILD_NUMBER', value: "${build_res.number}")
-      params += string(name: 'BUILD_URL', value: build_url)
-      params += string(name: 'LAVA_URL', value: env.LAVA_URL)
-      params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
-      params += string(name: 'LAVA_CREDENTIALS', value: env.LAVA_CREDENTIALS)
-      def lava_res = build(job: 'tf-m-lava-submit', parameters: params, propagate: false)
-      if (lava_res.result in failure_states) {
-        error("LAVA Create and Submit failed at ${lava_res.getAbsoluteUrl()}")
-      }
-      else {
-        results['lava_jobs'] += lava_res.getDescription()
-      }
-    }
-  }
-}
-
-def buildDocs(results) {
-  def params = []
-  params += string(name: 'GERRIT_BRANCH', value: env.GERRIT_BRANCH)
-  params += string(name: 'GERRIT_HOST', value: env.GERRIT_HOST)
-  params += string(name: 'GERRIT_CHANGE_NUMBER', value: env.GERRIT_CHANGE_NUMBER)
-  params += string(name: 'GERRIT_PATCHSET_REVISION', value: env.GERRIT_PATCHSET_REVISION)
-  params += string(name: 'GERRIT_REFSPEC', value: env.GERRIT_REFSPEC)
-  params += string(name: 'MBEDTLS_VERSION', value: env.MBEDTLS_VERSION)
-  params += string(name: 'CODE_REPO', value: env.CODE_REPO)
-  params += string(name: 'CI_SCRIPTS_BRANCH', value: env.CI_SCRIPTS_BRANCH)
-  return { -> results
-    def res = build(job: 'tf-m-build-docs-infra-health', parameters: params, propagate:false)
-    print("${res.number}: Docs ${res.result} ${res.getAbsoluteUrl()}")
-    results['docs'] = [res.number, res.result, params]
-    if (res.result in ["FAILURE", "ABORTED", "UNSTABLE", "NOT_BUILT"]) {
-      error("Build failed at ${res.getAbsoluteUrl()}")
-    }
-  }
-}
-
-def emailNotification(results, stage) {
-  script {
-   if (env.JOB_NAME.equals("tf-m-nightly") && !env.EMAIL_NOTIFICATION.equals('')) {
-      def result = "Fail."
-      if (results == true) {
-        result = "Success."
-        print("Skip sending as ${result} for ${stage}")
-      }
-      else {
-        emailext (
-            subject: ("Job ${env.JOB_NAME} ${stage} ${env.BUILD_NUMBER} ${result}"),
-            body: "Check console output at ${env.BUILD_URL}",
-            to: "${EMAIL_NOTIFICATION}"
-        )
-      }
-    }
-  } /* script */
-}
-
-@NonCPS
-def generateCsvContent(results) {
-  def resultsParam = []
-  results.each { result ->
-    resultsParam.add([result.value[1], \
-                      result.value[0].getResult(), \
-                      result.value[2]['TARGET_PLATFORM'], \
-                      result.value[2]['COMPILER'], \
-                      result.value[2]['PROJ_CONFIG'], \
-                      result.value[2]['CMAKE_BUILD_TYPE'], \
-                      result.value[2]['BL2'], \
-                      result.value[2]['PSA_API_SUITE']])
-  }
-  def configs = [] as Set
-  resultsParam.each { result ->
-    if (result[2] == 'MUSCA_B1') {
-      if (result[0].contains('_OTP_')) {
-        result[2] += '_OTP'
-      }
-    }
-    if (result[6] == 'True') {
-      result[6] = 'BL2'
-    }
-    else {
-      result[6] = 'NOBL2'
-    }
-    config = result[4]
-    if (result[7] != "''") {
-      config += ' (' + result[7] + ') '
-    }
-    configs.add(config)
-    result.add(config)
-  }
-  configs.sort()
-  def csvContent = []
-  resultsParam.each { result ->
-    def configExists = false
-    for (csvLine in csvContent) {
-      if (csvLine[0] == result[2] && \
-          csvLine[1] == result[3] && \
-          csvLine[2] == result[5] && \
-          csvLine[3] == result[6]) {
-            csvLine[4][result[8]] = result[1]
-            configExists = true
-            break
-          }
-    }
-    if (!configExists) {
-      csvContent.add([result[2], result[3], result[5], result[6], [:]])
-      csvContent.last()[4][result[8]] = result[1]
-    }
-  }
-  csvContent.sort{a,b -> a[0] <=> b[0] ?: a[1] <=> b[1] ?: a[2] <=> b[2] ?: a[3] <=> b[3]}
-  def csvTable = [['Platform', 'Compiler', 'Cmake Build Type', 'BL2']]
-  csvTable[0] += configs
-  def currentPlatform = ''
-  def currentCompiler = ''
-  def currentBuild = ''
-  csvContent.each { csvLine ->
-    // Modify CSV output format for a better layout
-    if (currentPlatform == csvLine[0]) {
-      csvTable.add([''])
-    }
-    else {
-      csvTable.add([csvLine[0]])
-      currentPlatform = csvLine[0]
-      currentCompiler = ''
-      currentBuild = ''
-    }
-    if (currentCompiler == csvLine[1]) {
-      csvTable.last().add('')
-    }
-    else {
-      csvTable.last().add(csvLine[1])
-      currentCompiler = csvLine[1]
-      currentBuild = ''
-    }
-    if (currentBuild == csvLine[2]) {
-      csvTable.last().add('')
-    }
-    else {
-      csvTable.last().add(csvLine[2])
-      currentBuild = csvLine[2]
-    }
-    csvTable.last().add(csvLine[3])
-    configs.each { config ->
-      if (csvLine[4].containsKey(config)) {
-        csvTable.last().add(csvLine[4][config])
-      }
-      else {
-        csvTable.last().add('N/A')
-      }
-    }
-  }
-  return csvTable
-}
-
-def generateBuildCsv(results) {
-  def csvContent = generateCsvContent(results)
-  node("master") {
-    writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
-    archiveArtifacts 'build_results.csv'
-  }
-}
-
-def buildCsv(results) {
-  def summary = new Summary();
-  def csvContent = summary.getBuildCsv(results)
-  node("master") {
-    writeCSV file: 'build_results.csv', records: csvContent, format: CSVFormat.EXCEL
-    archiveArtifacts 'build_results.csv'
-  }
-}
-
-def writeSummary(results) {
-  def summary = new Summary();
-  def buildLinks = summary.getLinks(results)
-  node("master") {
-    writeFile file: "build_links.html", text: buildLinks
-    archiveArtifacts 'build_links.html'
-  }
-}
-
-def lineInString(string, match) {
-  def lines = string.split("\n")
-  def result = lines.findAll { it.contains(match) }
-  return result[0]
-}
-
-def getResult(string, match) {
-  line = lineInString(string, match)
-  a = line.split(match)[1].split(' ')
-  score = a[0]
-  if (a.size() > 1)
-  {
-    fail_text = a[1..-1].join(" ")
-    return [score, fail_text]
-  }
-  return [score, ""]
-}
-
-def submitJobsToList(results) {
-  def all_jobs = []
-  for (String result : results){
-    jobs_s = result.split('JOBS: ')
-    if (jobs_s.size() > 1) {
-      all_jobs += jobs_s[1]
-    }
-  }
-  return(all_jobs)
-}
-
-def configs = []
-def builds = [:]
-def results = [:]
-
-node("docker-amd64-tf-m-bionic") {
-  stage("Init") {
-    cleanWs()
-    dir("tf-m-ci-scripts") {
-      checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
-    }
-  }
-  stage("Configs") {
-    // Populate configs
-    listConfigs('tf-m-ci-scripts', configs, env.FILTER_GROUP)
-    results['builds'] = [:]
-    results['lava_jobs'] = []
-    for (config in configs) {
-      builds[config] = buildConfig("tf-m-ci-scripts", config, env.FILTER_GROUP, results)
-    }
-    // builds["docs"] = buildDocs(results) # Build Docs is not necessary in Infra-Health
-  }
-}
-
-stage("Builds") {
-  def verify = 1
-  def success = true
-  try {
-    parallel(builds)
-  } catch (Exception e) {
-    print(e)
-    manager.buildFailure()
-    verify = -1
-    success = false
-  } finally {
-    print("Verifying status")
-    emailNotification(success, 'Build')
-    g = new Gerrit()
-    g.verifyStatus(verify, 'tf-m-build', 'build')
-    print("Building CSV")
-    generateBuildCsv(results['builds'])
-    writeSummary(results['builds'])
-  }
-}
-
-node("docker-amd64-tf-m-bionic") {
-  stage("Copy Docs") {
-    if (env.JOB_NAME.equals("tf-m-build-and-test")) {
-      step([$class: 'CopyArtifact', projectName: 'tf-m-build-docs',
-      selector: specific("${results['docs'][0]}"), target: './docs/',
-      optional: true])
-      archiveArtifacts artifacts: 'docs/**', allowEmptyArchive: true
-    }
-    else {
-      print("No doc copy for job: ${env.JOB_NAME}")
-    }
-  }
-  stage("Tests") {
-    dir("tf-m-ci-scripts") {
-      checkout([$class: 'GitSCM', branches: [[name: '$CI_SCRIPTS_BRANCH']], userRemoteConfigs: [[credentialsId: 'GIT_SSH_KEY', url: '$CI_SCRIPTS_REPO']]])
-    }
-    def all_jobs = []
-    def success = true
-    print("Wait for LAVA results here...")
-    try {
-      all_jobs = submitJobsToList(results['lava_jobs'])
-      if (all_jobs.size() > 0) {
-        dir("tf-m-ci-scripts") {
-          withCredentials([usernamePassword(credentialsId: env.LAVA_CREDENTIALS, passwordVariable: 'LAVA_TOKEN', usernameVariable: 'LAVA_USER')]) {
-            output = sh(script: """./lava_helper/lava_wait_jobs.py --job-ids ${all_jobs.join(",")} \
-  --lava-url ${env.LAVA_URL} --lava-user ${LAVA_USER} --lava-token ${LAVA_TOKEN} \
-  --artifacts-path lava_artifacts --lava-timeout 7200 \
-  """, returnStdout: true).trim()
-            archiveArtifacts artifacts: 'test_summary.*', allowEmptyArchive: true
-            print(output)
-            g = new Gerrit()
-            def (boot_result, boot_output) = getResult(output, 'BOOT_RESULT: ')
-            if (boot_result) {
-              g.verifyStatus(boot_result, "lava_boot", "test")
-            }
-            def (test_result, test_output) = getResult(output, 'TEST_RESULT: ')
-            if (test_result) {
-              g.verifyStatus(test_result, "lava_test", "test")
-            }
-            if (boot_result.toInteger() < 1 || test_result.toInteger() < 1) {
-              error("Marking job as failed due to failed boots: ${boot_output} or tests: ${test_output}")
-            }
-          }
-        }
-      }
-      else {
-        print("There were no LAVA jobs to test.")
-      }
-    }
-    catch (Exception e) {
-      print("ERROR: ${e}")
-      success = false
-    } finally {
-      archiveArtifacts artifacts: 'tf-m-ci-scripts/lava_artifacts/**', allowEmptyArchive: true
-      emailNotification(success, 'Test')
-      cleanWs()
-      if (!success) {
-        error("There was an Error waiting for LAVA jobs")
-      }
-    }
-  }
-}
