diff --git a/jjb/pipeline/voltha/master/bbsim-tests.groovy b/jjb/pipeline/voltha/master/bbsim-tests.groovy
index c056614..8ff8e6b 100644
--- a/jjb/pipeline/voltha/master/bbsim-tests.groovy
+++ b/jjb/pipeline/voltha/master/bbsim-tests.groovy
@@ -25,7 +25,7 @@
 //------------------//
 //---]  GLOBAL  [---//
 //------------------//
-def clusterName = "kind-ci"
+def clusterName = 'kind-ci'
 
 // -----------------------------------------------------------------------
 // -----------------------------------------------------------------------
@@ -38,15 +38,14 @@
 // Intent: Due to lack of a reliable stack trace, construct a literal.
 //         Jenkins will re-write the call stack for serialization.
 // -----------------------------------------------------------------------
-def getIam(String func)
-{
+String getIam(String func) {
     String branch_name = getBranchName()
     String src = [
         'ci-management',
         'jjb',
         'pipeline',
         'voltha',
-	branch_name,
+        branch_name,
         'bbsim-tests.groovy'
     ].join('/')
 
@@ -86,20 +85,20 @@
     println("** ${iam}: ENTER")
     try
     {
-	println("** ${iam} Running installKind(name): ENTER")
-	installKind(name)
-	println("** ${iam} Running installKind(name): LEAVE")
-	ans = True // iff
+        println("** ${iam} Running installKind(name): ENTER")
+        installKind(name)
+        println("** ${iam} Running installKind(name): LEAVE")
+        ans = True // iff
     }
     catch (Exception err)
     {
-	ans = False
-	println("** ${iam}: EXCEPTION ${err}")
-	throw err
+        ans = False
+        println("** ${iam}: EXCEPTION ${err}")
+        throw err
     }
     finally
     {
-	println("** ${iam}: ENTER")
+        println("** ${iam}: ENTER")
     }
 
     return(ans)
@@ -114,18 +113,16 @@
     def volthaNamespace = "voltha"
     def logsDir = "$WORKSPACE/${testTarget}"
 
-    /*
     stage('IAM')
     {
         script
         {
-	    // Announce ourselves for log usability
-	    String iam = getIam('execute_test')
-	    println("${iam}: ENTER")
-	    println("${iam}: LEAVE")
+            // Announce ourselves for log usability
+            String iam = getIam('execute_test')
+            println("${iam}: ENTER")
+            println("${iam}: LEAVE")
         }
     }
-     */
     
     stage('Cleanup')
     {
@@ -156,16 +153,7 @@
         println(" ** Running: ${cmd}:\n")
         sh("${cmd}")
         // if (! my_install_kail())
-	//    throw new Exception('installKail() failed')
-    }
-
-    stage ('Install Kind')
-    {
-        steps
-	{
-	    String branch_name = getBranchName()
-	    install_kind(branch_name)
-	}
+        //    throw new Exception('installKail() failed')
     }
 
     stage('Deploy common infrastructure')
@@ -183,12 +171,12 @@
 
     stage('Deploy Voltha')
     {
-	if (teardown)
-	{
-	    timeout(10)
-	    {
-		script
-		{
+        if (teardown)
+        {
+            timeout(10)
+            {
+                script
+                {
           sh """
           mkdir -p ${logsDir}
           _TAG=kail-startup kail -n ${infraNamespace} -n ${volthaNamespace} > ${logsDir}/onos-voltha-startup-combined.log &
@@ -198,28 +186,28 @@
           def localCharts = false
 
           if (volthaHelmChartsChange != ""
-	      || gerritProject == "voltha-helm-charts"
-	      || isReleaseBranch(branch) // branch != 'master'
+              || gerritProject == "voltha-helm-charts"
+              || isReleaseBranch(branch) // branch != 'master'
           ) {
             localCharts = true
           }
-	  String branch_name = getBranchName()
+          String branch_name = getBranchName()
           Boolean is_release = isReleaseBranch(branch)
-		    println([
-			" ** localCharts=${localCharts}",
-			"branch_name=${branch_name}",
-			"branch=${branch}",
-			"branch=isReleaseBranch=${is_release}",
-		    ].join(', '))
+                    println([
+                        " ** localCharts=${localCharts}",
+                        "branch_name=${branch_name}",
+                        "branch=${branch}",
+                        "branch=isReleaseBranch=${is_release}",
+                    ].join(', '))
 
           // NOTE temporary workaround expose ONOS node ports
-	  def localHelmFlags = extraHelmFlags.trim()
-		  + " --set global.log_level=${logLevel.toUpperCase()} "
-		  + " --set onos-classic.onosSshPort=30115 "
-		  + " --set onos-classic.onosApiPort=30120 "
-		  + " --set onos-classic.onosOfPort=31653 "
-		  + " --set onos-classic.individualOpenFlowNodePorts=true "
-		  + testSpecificHelmFlags
+          def localHelmFlags = extraHelmFlags.trim()
+                  + " --set global.log_level=${logLevel.toUpperCase()} "
+                  + " --set onos-classic.onosSshPort=30115 "
+                  + " --set onos-classic.onosApiPort=30120 "
+                  + " --set onos-classic.onosOfPort=31653 "
+                  + " --set onos-classic.individualOpenFlowNodePorts=true "
+                  + testSpecificHelmFlags
 
           if (gerritProject != "") {
             localHelmFlags = "${localHelmFlags} " + getVolthaImageFlags("${gerritProject}")
@@ -237,22 +225,22 @@
             ])
         }
 
-	// -----------------------------------------------------------------------
-	// Intent: Replacing P_IDS with pgrep/pkill is a step forward.
-	// Why not simply use a pid file, capture _TAG=kail-startup above
-	// Grep runs the risk of terminating stray commands (??-good <=> bad-??)
-	// -----------------------------------------------------------------------
-	println('Try out the pgrep/pkill commands')
-	def stream = sh(
+        // -----------------------------------------------------------------------
+        // Intent: Replacing P_IDS with pgrep/pkill is a step forward.
+        // Why not simply use a pid file, capture _TAG=kail-startup above
+        // Grep runs the risk of terminating stray commands (??-good <=> bad-??)
+        // -----------------------------------------------------------------------
+	echo 'Try out pgrep/pkill commands'
+        def stream = sh(
             returnStatus:false,
             returnStdout:true,
-	    script: '''pgrep --list-full kail-startup || true'''
-	)
-	println("** pgrep output: ${stream}")
+            script: '''pgrep --list-full kail-startup || true'''
+        )
+        println("** pgrep output: ${stream}")
 
-	// -----------------------------------------------------------------------
-	// stop logging
-	// -----------------------------------------------------------------------
+        // -----------------------------------------------------------------------
+        // stop logging
+        // -----------------------------------------------------------------------
         sh """
           P_IDS="\$(ps e -ww -A | grep "_TAG=kail-startup" | grep -v grep | awk '{print \$1}')"
           if [ -n "\$P_IDS" ]; then
@@ -349,17 +337,28 @@
 // -----------------------------------------------------------------------
 def collectArtifacts(exitStatus)
 {
+    echo '''
+
+** -----------------------------------------------------------------------
+** collectArtifacts
+** -----------------------------------------------------------------------
+'''
+
   getPodsInfo("$WORKSPACE/${exitStatus}")
+
   sh """
   kubectl logs -n voltha -l app.kubernetes.io/part-of=voltha > $WORKSPACE/${exitStatus}/voltha.log
   """
+
   archiveArtifacts artifacts: '**/*.log,**/*.gz,**/*.txt,**/*.html,**/voltha-pods-mem-consumption-att/*,**/voltha-pods-mem-consumption-dt/*,**/voltha-pods-mem-consumption-tt/*'
+
   sh '''
     sync
     [[ $(pgrep --count kail) -gt 0 ]] && pkill --echo kail
     which voltctl
     md5sum $(which voltctl)
   '''
+
   step([$class: 'RobotPublisher',
     disableArchiveOutput: false,
     logFileName: "**/*/log*.html",
@@ -412,21 +411,39 @@
             }
         }
 
-	steps
-	{
-	    // NOTE that the correct patch has already been checked out
-	    // during the getVolthaCode step
-	    buildVolthaComponent("${gerritProject}")
+        steps
+        {
+            // NOTE that the correct patch has already been checked out
+            // during the getVolthaCode step
+            buildVolthaComponent("${gerritProject}")
         }
     }
 
+    // -----------------------------------------------------------------------
+    // Intent: Install early so stage('Create K8s Cluster') will not
+    //   fail on bogus "script.sh: line 1: kind: command not found".
+    // -----------------------------------------------------------------------
+    stage ('Install Kind')
+    {
+        steps
+        {
+            script
+            {
+                String branch_name = getBranchName()
+                install_kind(branch_name)
+            } // script
+        } // steps
+    } // stage
+
+    // -----------------------------------------------------------------------
+    // -----------------------------------------------------------------------
     stage('Create K8s Cluster')
     {
         steps
         {
             script
             {
-	        def clusterExists = sh(
+                def clusterExists = sh(
                     returnStdout: true,
                     script: """kind get clusters | grep "${clusterName}" | wc -l""")
 
@@ -438,38 +455,44 @@
         } // steps
     } // stage('Create K8s Cluster')
 
-        stage('Replace voltctl')
-        {
-            // if the project is voltctl, override the downloaded one with the built one
-            when {
-                expression {
-                    return gerritProject == "voltctl"
-                }
-            }
-
-	    // Hmmmm(?) where did the voltctl download happen ?
-	    // Likely Makefile but would be helpful to document here.
-            steps
-	    {
-		println("${iam} Running: installVoltctl($branch)")
-                installVoltctl("$branch")
-            } // steps
-        } // stage
-
-        stage('Load image in kind nodes')
-        {
-            when {
-                expression {
-                    return !gerritProject.isEmpty()
-                }
-            }
-            steps {
-                loadToKind()
+    // -----------------------------------------------------------------------
+    // -----------------------------------------------------------------------
+    stage('Replace voltctl')
+    {
+        // if the project is voltctl, override the downloaded one with the built one
+        when {
+            expression {
+                return gerritProject == "voltctl"
             }
         }
 
-        stage('Parse and execute tests')
+        // Hmmmm(?) where did the voltctl download happen ?
+        // Likely Makefile but would be helpful to document here.
+        steps
         {
+            println("${iam} Running: installVoltctl($branch)")
+            installVoltctl("$branch")
+        } // steps
+    } // stage
+
+    // -----------------------------------------------------------------------
+    // -----------------------------------------------------------------------
+    stage('Load image in kind nodes')
+    {
+        when {
+            expression {
+                return !gerritProject.isEmpty()
+            }
+        }
+        steps {
+            loadToKind()
+        } // steps
+    } // stage
+
+    // -----------------------------------------------------------------------
+    // -----------------------------------------------------------------------
+    stage('Parse and execute tests')
+    {
             steps {
                 script {
                     def tests = readYaml text: testTargets
diff --git a/makefiles/lint/groovy.mk b/makefiles/lint/groovy/include.mk
similarity index 100%
rename from makefiles/lint/groovy.mk
rename to makefiles/lint/groovy/include.mk
diff --git a/makefiles/lint/groovy/install.mk b/makefiles/lint/groovy/install.mk
index 7843e8f..fcfa8d6 100644
--- a/makefiles/lint/groovy/install.mk
+++ b/makefiles/lint/groovy/install.mk
@@ -1,4 +1,49 @@
+# -*- makefile -*-
+# -----------------------------------------------------------------------
+# Copyright 2022-2023 Open Networking Foundation (ONF) and the ONF Contributors
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# -----------------------------------------------------------------------
 
-# curl -O -L https://npmjs.org/install.sh
-# sh install
-# curl -L https://npmjs.org/install.sh | sh
+##-------------------##
+##---]  GLOBALS  [---##
+##-------------------##
+lint-groovy-cmds += $(shell which npm-groovy-lint)
+lint-groovy-cmds += $(HOME)/.npm/bin/npm-groovy-lint
+lint-groovy-cmds += /usr/bin/npm-groovy-lint
+# lint-groovy-cmds += /dev/null#                     # force existence
+
+lint-groovy-cmd = $(firstword $(wildcard $(lint-groovy-cmds)))
+
+##-------------------##
+##---]  TARGETS  [---##
+##-------------------##
+ifndef NO-LINT-GROOVY
+
+  lint : lint-groovy
+endif
+
+## -----------------------------------------------------------------------
+## Intent: Install npm-groovy-lint
+## -----------------------------------------------------------------------
+$(lint-groovy-cmd) : lint-groovy-install
+lint-groovy-install:
+
+## -----------------------------------------------------------------------
+## Intent: Display command help
+## -----------------------------------------------------------------------
+help-summary ::
+	@echo '  lint-groovy-install          Syntax check groovy sources'
+
+# [EOF]
+
diff --git a/makefiles/lint/groovy/urls b/makefiles/lint/groovy/urls
index aa5c5eb..4d9ba27 100644
--- a/makefiles/lint/groovy/urls
+++ b/makefiles/lint/groovy/urls
@@ -5,4 +5,7 @@
 
 https://github.com/nvuillam/npm-groovy-lint
 
+# Homepage
+installhttps://nvuillam.github.io/npm-groovy-lint/
+
 # [EOF]
diff --git a/makefiles/lint/include.mk b/makefiles/lint/include.mk
index 7cfed79..e928fc3 100644
--- a/makefiles/lint/include.mk
+++ b/makefiles/lint/include.mk
@@ -28,7 +28,7 @@
 	@echo "[LINT]"
 
 include $(ONF_MAKEDIR)/lint/doc8/include.mk
-include $(ONF_MAKEDIR)/lint/groovy.mk
+include $(ONF_MAKEDIR)/lint/groovy/include.mk
 include $(ONF_MAKEDIR)/lint/jjb.mk
 include $(ONF_MAKEDIR)/lint/json.mk
 include $(ONF_MAKEDIR)/lint/license/include.mk
diff --git a/vars/showCommands.groovy b/vars/showCommands.groovy
index 58108ea..9e83ab9 100644
--- a/vars/showCommands.groovy
+++ b/vars/showCommands.groovy
@@ -27,7 +27,7 @@
 // -----------------------------------------------------------------------
 // -----------------------------------------------------------------------
 void run_cmd(String command) {
-    String buffer [
+    String buffer = [
         "Running command: $command",
     ]
 
