diff --git a/vars/volthaInfraDeploy.groovy b/vars/volthaInfraDeploy.groovy
index 189b562..e76a93a 100644
--- a/vars/volthaInfraDeploy.groovy
+++ b/vars/volthaInfraDeploy.groovy
@@ -1,5 +1,5 @@
 #!/usr/bin/env groovy
-
+// -----------------------------------------------------------------------
 // usage
 //
 // stage('test stage') {
@@ -9,12 +9,66 @@
 //     ])
 //   }
 // }
+// -----------------------------------------------------------------------
 
-def call(Map config) {
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def getIam(String func)
+{
+    // Cannot rely on a stack trace due to jenkins manipulation
+    String src = 'vars/volthaInfraDeploy.groovy'
+    String iam = [src, func].join('::')
+    return iam
+}
 
-    String iam = 'vars/volthaInfraDeploy.groovy'
+// -----------------------------------------------------------------------
+// Intent: Display and interact with kubernetes namespaces.
+// -----------------------------------------------------------------------
+def doKubeNamespaces()
+{
+    String iam = getIam('doKubeNamespaces')
     println("** ${iam}: ENTER")
-    
+
+    /*
+     [joey] - should pre-existing hint the env is tainted (?)
+     05:24:57  + kubectl create namespace infra
+     05:24:57  Error from server (AlreadyExists): namespaces "infra" already exists
+     05:24:57  error: failed to create configmap: configmaps "kube-config" already exists
+
+     [joey] Thinking we should:
+            o A special case exists  (create namespace)
+            o helm upgrade --install (inital update)
+     */
+
+    namespaces = sh(
+	script: 'kubectl get namespaces',
+	returnStdout: true
+    ).trim()
+    print(namespaces)
+
+    // Document prior to removal
+    namespaces.each{namespace ->
+	namespaces = sh("kubectl describe namespaces ${namespace}")
+    }
+
+    /*
+     // [TODO] Remove if safe op: clean state and avoids a special case.
+    namespaces.each{namespace ->
+	namespaces = sh("kubectl delete namespaces ${namespace}")
+    }
+     */
+
+    println("** ${iam}: LEAVE")    
+    return
+}
+
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def process(Map config)
+{
+    String iam = getIam('process')
+    println("** ${iam}: ENTER")
+
     // NOTE use params or directule extraHelmFlags??
     def defaultConfig = [
       onosReplica: 1,
@@ -30,10 +84,6 @@
       kubeconfig: null, // location of the kubernetes config file, if null we assume it's stored in the $KUBECONFIG environment variable
     ]
 
-    if (!config) {
-        config = [:]
-    }
-
     def cfg = defaultConfig + config
 
     def volthaInfraChart = "onf/voltha-infra"
@@ -55,12 +105,7 @@
       kubeconfig = env.KUBECONFIG
     }
 
-    /*
-     [joey] - should pre-existing hint the env is tainted (?)
-     05:24:57  + kubectl create namespace infra
-     05:24:57  Error from server (AlreadyExists): namespaces "infra" already exists
-     05:24:57  error: failed to create configmap: configmaps "kube-config" already exists
-     */
+    doKubeNamespaces() // WIP: joey
 
     sh """
     kubectl create namespace ${cfg.infraNamespace} || true
@@ -85,5 +130,34 @@
           -f $WORKSPACE/voltha-helm-charts/examples/${serviceConfigFile}-values.yaml ${cfg.extraHelmFlags}
     """
 
-    println("** ${iam}: LEAVE")    
+    return
 }
+
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def call(Map config)
+{
+    String iam = getIam('main')
+    println("** ${iam}: ENTER")
+
+    if (!config) {
+        config = [:]
+    }
+
+    try
+    {
+	process(config)
+    }
+    catch (Exception err)
+    {
+	println("** ${iam}: EXCEPTION ${err}")
+	throw err
+    }
+    finally
+    {
+	println("** ${iam}: LEAVE")
+    }
+    return
+}
+
+// [EOF]
diff --git a/vars/volthaStackDeploy.groovy b/vars/volthaStackDeploy.groovy
index eb6ab0b..5e511d0 100644
--- a/vars/volthaStackDeploy.groovy
+++ b/vars/volthaStackDeploy.groovy
@@ -1,10 +1,18 @@
 #!/usr/bin/env groovy
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def getIam(String func)
+{
+    // Cannot rely on a stack trace due to jenkins manipulation
+    String src = 'vars/volthaStackDeploy.groovy'
+    String iam = [src, func].join('::')
+    return iam
+}
 
-def call(Map config) {
-
-    String iam = 'vars/volthaStackDeploy.groovy'
-    println("** ${iam}: ENTER")
-
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def process(Map config)
+{
     // note that I can't define this outside the function as there's no global scope in Groovy
     def defaultConfig = [
       bbsimReplica: 1,
@@ -21,10 +29,6 @@
       adaptersToWait: 2,
     ]
 
-    if (!config) {
-        config = [:]
-    }
-
     def cfg = defaultConfig + config
 
     def volthaStackChart = "onf/voltha-stack"
@@ -126,5 +130,34 @@
         done
     """
 
-    println("** ${iam}: LEAVE")
+    return
 }
+
+// -----------------------------------------------------------------------
+// -----------------------------------------------------------------------
+def call(Map config)
+{
+    String iam = getIam('main')
+    println("** ${iam}: ENTER")
+
+    if (!config) {
+        config = [:]
+    }
+
+    try
+    {
+	process(config)
+    }
+    catch (Exception err)
+    {
+	println("** ${iam}: EXCEPTION ${err}")
+	throw err
+    }
+    finally
+    {
+	println("** ${iam}: LEAVE")
+    }
+    return
+}
+
+// [EOF]
diff --git a/vars/waitForAdapters.groovy b/vars/waitForAdapters.groovy
index ecd1f10..3c441da 100644
--- a/vars/waitForAdapters.groovy
+++ b/vars/waitForAdapters.groovy
@@ -6,6 +6,7 @@
 // -----------------------------------------------------------------------
 def getIam(String func)
 {
+    // Cannot rely on a stack trace due to jenkins manipulation
     String src = 'vars/waitForAdapters.groovy'
     String iam = [src, func].join('::')
     return iam
@@ -69,7 +70,9 @@
     {
 	String elapsed = adapters[i]
 	if (debug)
+	{
 	    println("** ${iam} Checking elapsed[$i]: $elapsed")
+	}
 
 	if (! elapsed) // empty string or null
 	{
@@ -127,7 +130,9 @@
     }
 
     if (debug)
+    {
 	println("** ${iam} return: [$ans]")
+    }
     return ans
 } // getAdaptersState
 
@@ -193,7 +198,9 @@
 	// ----------------------------------------------------------
 	countdown -= 1
 	if (1 > countdown)
+	{
 	    throw new Exception("ERROR: Timed out waiting on adapter startup")
+	}
     }
 
     println("** ${iam}: Tearing down port forwarding")
@@ -213,7 +220,7 @@
 // -----------------------------------------------------------------------
 def call(Map config)
 {
-    String iam = getIam('process')
+    String iam = getIam('main')
     println("** ${iam}: ENTER")
 
     if (!config) {
