Merge "[VOL-3780] Clean the port-forward in the correct order in the physical build jobs for VOLTHA PODs"
diff --git a/global-jjb b/global-jjb
index 5dc3432..5a6965f 160000
--- a/global-jjb
+++ b/global-jjb
@@ -1 +1 @@
-Subproject commit 5dc3432cae2f13d9e5151a00a76a78ce73d92d70
+Subproject commit 5a6965f43f220bf6002bfde60897afd216f52ab0
diff --git a/jjb/api-test.yaml b/jjb/api-test.yaml
index 145a4fa..7e7275e 100644
--- a/jjb/api-test.yaml
+++ b/jjb/api-test.yaml
@@ -29,7 +29,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
diff --git a/jjb/bbr.yaml b/jjb/bbr.yaml
index f5bd5c9..14b4caa 100644
--- a/jjb/bbr.yaml
+++ b/jjb/bbr.yaml
@@ -48,5 +48,5 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
diff --git a/jjb/charts.yaml b/jjb/charts.yaml
index 9908e7c..9999d4b 100644
--- a/jjb/charts.yaml
+++ b/jjb/charts.yaml
@@ -45,7 +45,7 @@
           choosing-strategy: 'gerrit'
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
 
-    node: 'ubuntu16.04-basebuild-2c-4g'
+    node: 'ubuntu18.04-basebuild-2c-4g'
     project-type: freestyle
     concurrent: false
 
@@ -153,7 +153,7 @@
           choosing-strategy: gerrit
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
 
-    node: 'ubuntu16.04-basebuild-2c-4g'
+    node: 'ubuntu18.04-basebuild-2c-4g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/ci-management/ci-management.yaml b/jjb/ci-management/ci-management.yaml
index 476e37b..f73d9b5 100644
--- a/jjb/ci-management/ci-management.yaml
+++ b/jjb/ci-management/ci-management.yaml
@@ -3,20 +3,13 @@
     archive-artifacts: '**/*.log'
     branch: 'master'
     build-timeout: '60'
-    build-node: 'centos7-basebuild-1c-1g'
+    build-node: 'ubuntu18.04-basebuild-1c-1g'
 
     jobs:
       - '{project-name}-ci-jobs'
-      - '{project-name}-packer-jobs':
-          platforms:
-            - 'centos-7'
-            - 'ubuntu-16.04'
-          templates:
-            - basebuild
 
     name: ci-management-jobs
     project: 'ci-management'
     project-name: 'ci-management'
 
     jjb-version: 3.2.0
-    packer-version: 1.2.4
diff --git a/jjb/ci-management/packer.yaml b/jjb/ci-management/packer.yaml
new file mode 100644
index 0000000..83b6d18
--- /dev/null
+++ b/jjb/ci-management/packer.yaml
@@ -0,0 +1,20 @@
+- project:
+    archive-artifacts: '**/*.log'
+    branch: 'master'
+    build-timeout: '60'
+    build-node: 'ubuntu18.04-basebuild-1c-1g'
+
+    jobs:
+      - '{project-name}-packer-jobs':
+          platforms:
+            - 'ubuntu-18.04'
+          templates:
+            - basebuild_1804
+
+    name: packer-jobs
+    project: 'ci-management'
+    project-name: 'ci-management-ami'
+
+    jjb-version: 3.2.0
+    packer-version: 1.6.5
+    packer-builder: aws
diff --git a/jjb/defaults.yaml b/jjb/defaults.yaml
index 34cb3e1..b26ea25 100644
--- a/jjb/defaults.yaml
+++ b/jjb/defaults.yaml
@@ -56,7 +56,7 @@
     # The most frequently used type of Build Executor. Name is per the LF global-jjb.
     # See build node types under "Cloud > Amazon EC2" at
     #  https://jenkins.opencord.org/configure
-    build-node: ubuntu16.04-basebuild-1c-1g
+    build-node: ubuntu18.04-basebuild-1c-1g
 
     # CORD Gerrit server definition, set in configuration
     gerrit-server-name: 'CORD Gerrit'
diff --git a/jjb/device-management.yaml b/jjb/device-management.yaml
index dcbf82b..1c6d46f 100644
--- a/jjb/device-management.yaml
+++ b/jjb/device-management.yaml
@@ -43,7 +43,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
diff --git a/jjb/docker-publish.yaml b/jjb/docker-publish.yaml
index d264eb9..dc0185c 100644
--- a/jjb/docker-publish.yaml
+++ b/jjb/docker-publish.yaml
@@ -28,7 +28,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-1c-2g'
+          default: 'ubuntu18.04-basebuild-1c-2g'
           description: 'Name of the Jenkins build executor to run the job on'
 
       - string:
diff --git a/jjb/gui-unit.yaml b/jjb/gui-unit.yaml
index 6cb5c2e..bb10618 100644
--- a/jjb/gui-unit.yaml
+++ b/jjb/gui-unit.yaml
@@ -40,7 +40,7 @@
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
 
     # `npm install` fails on 1Gb RAM
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/maven.yaml b/jjb/maven.yaml
index 195c9e3..c62e185 100644
--- a/jjb/maven.yaml
+++ b/jjb/maven.yaml
@@ -8,7 +8,7 @@
       <!-- Managed by Jenkins Job Builder -->
       Created by {id} job-template from ci-management/jjb/maven.yaml
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
 
     parameters:
@@ -81,7 +81,7 @@
       <!-- Managed by Jenkins Job Builder -->
       Created by {id} job-template from ci-management/jjb/maven.yaml
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
 
     parameters:
diff --git a/jjb/omec-ci.yaml b/jjb/omec-ci.yaml
index d78f5ae..fa09154 100644
--- a/jjb/omec-ci.yaml
+++ b/jjb/omec-ci.yaml
@@ -94,14 +94,14 @@
           pipeline-file: 'Jenkinsfile-omec-install-ngic-rtc-vnf.groovy'
       - 'omec-fossa':
           pipeline-file: 'omec-fossa-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-reuse':
           pipeline-file: 'omec-reuse-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'docker-publish-github':
           build-timeout: 30
           docker-repo: 'omecproject'
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
       - 'omec-container'
 
 # for c3po
@@ -131,14 +131,14 @@
           pipeline-file: 'Jenkinsfile-omec-install-c3po-hss-vnf.groovy'
       - 'omec-fossa':
           pipeline-file: 'omec-fossa-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-reuse':
           pipeline-file: 'omec-reuse-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'docker-publish-github':
           build-timeout: 30
           docker-repo: 'omecproject'
-          build-node: 'ubuntu16.04-basebuild-8c-15g'
+          build-node: 'ubuntu18.04-basebuild-8c-15g'
       - 'omec-container'
       - 'omec-container-remote':
           pod: 'dev'
@@ -168,14 +168,14 @@
           pipeline-file: 'Jenkinsfile-omec-install-openmme-vnf.groovy'
       - 'omec-fossa':
           pipeline-file: 'omec-fossa-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-reuse':
           pipeline-file: 'omec-reuse-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'docker-publish-github':
           build-timeout: 30
           docker-repo: 'omecproject'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
 
 # for nucleus
 - project:
@@ -200,17 +200,17 @@
           pipeline-file: 'Jenkinsfile-omec-install-Nucleus-vnf.groovy'
       - 'omec-fossa':
           pipeline-file: 'omec-fossa-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-reuse':
           pipeline-file: 'omec-reuse-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-cppcheck':
           pipeline-file: 'omec-cppcheck.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'docker-publish-github':
           build-timeout: 60
           docker-repo: 'omecproject'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-container'
       - 'omec-container-remote':
           pod: 'dev'
@@ -233,10 +233,10 @@
     jobs:
       - 'omec-fossa':
           pipeline-file: 'omec-fossa-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-reuse':
           pipeline-file: 'omec-reuse-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
 
 # for ignite
 - project:
@@ -254,10 +254,10 @@
     jobs:
       - 'omec-fossa':
           pipeline-file: 'omec-fossa-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-reuse':
           pipeline-file: 'omec-reuse-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
 
 # for upf-epc
 - project:
@@ -274,14 +274,14 @@
     jobs:
       - 'omec-fossa':
           pipeline-file: 'omec-fossa-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'omec-reuse':
           pipeline-file: 'omec-reuse-scan.groovy'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
       - 'docker-publish-github':
           build-timeout: 30
           docker-repo: 'omecproject'
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           extraEnvironmentVars: CPU=haswell
       - 'omec-container'
       - 'omec-container-remote':
diff --git a/jjb/onos-app-release.yaml b/jjb/onos-app-release.yaml
index 92cf4f1..e168556 100644
--- a/jjb/onos-app-release.yaml
+++ b/jjb/onos-app-release.yaml
@@ -69,7 +69,7 @@
           default: '{jdk-distribution}'
           description: 'Distribution of the JDK to use with update-java-alternatives'
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: pipeline
     concurrent: true
 
diff --git a/jjb/pipeline/onos-app-release.groovy b/jjb/pipeline/onos-app-release.groovy
index ee14658..f8d87de 100644
--- a/jjb/pipeline/onos-app-release.groovy
+++ b/jjb/pipeline/onos-app-release.groovy
@@ -42,7 +42,7 @@
 
 // TODO: use the declarative pipeline syntax, like all other groovy files.
 //  This implementation is based on the legacy cord-onos-publisher/Jenkinsfile.release
-node ('ubuntu16.04-basebuild-1c-2g') {
+node ('ubuntu18.04-basebuild-1c-2g') {
 
   sh 'echo Releasing ' + appRepo + ' repository on ' + branch + ' branch'
   sh 'echo Releasing version ' + version + ' with API version ' + apiVersion + ' and starting ' + nextVersion + '-SNAPSHOT with API version ' + nextApiVersion + '-SNAPSHOT'
diff --git a/jjb/triggered-api-test.yaml b/jjb/triggered-api-test.yaml
index 853fd5a..8e4cc33 100644
--- a/jjb/triggered-api-test.yaml
+++ b/jjb/triggered-api-test.yaml
@@ -30,7 +30,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
diff --git a/jjb/verify/abstract-olt.yaml b/jjb/verify/abstract-olt.yaml
index 3aab818..fcd9bff 100644
--- a/jjb/verify/abstract-olt.yaml
+++ b/jjb/verify/abstract-olt.yaml
@@ -51,7 +51,7 @@
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
           basedir: '{project}'
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/verify/bbsim-sadis-server.yaml b/jjb/verify/bbsim-sadis-server.yaml
index 0cc823b..0f095e5 100644
--- a/jjb/verify/bbsim-sadis-server.yaml
+++ b/jjb/verify/bbsim-sadis-server.yaml
@@ -23,7 +23,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_bbsim-sadis-server_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
           dest-gopath: "github.com/opencord"
           unit-test-targets: 'lint sca test'
           unit-test-keep-going: 'true'
diff --git a/jjb/verify/bbsim.yaml b/jjb/verify/bbsim.yaml
index 19b9c69..a9c1c91 100644
--- a/jjb/verify/bbsim.yaml
+++ b/jjb/verify/bbsim.yaml
@@ -24,7 +24,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_bbsim_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           dest-gopath: "github.com/opencord"
           unit-test-targets: 'lint sca test'
           unit-test-keep-going: 'true'
diff --git a/jjb/verify/device-management.yaml b/jjb/verify/device-management.yaml
index 58f2dec..0179a40 100644
--- a/jjb/verify/device-management.yaml
+++ b/jjb/verify/device-management.yaml
@@ -19,7 +19,7 @@
           dependency-jobs: 'verify_device-management_licensed'
       - 'make-unit-test':
           junit-allow-empty-results: true
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
       - 'device-management-patch-test':
           pipeline-script: 'voltha/master/device-management-mock-tests.groovy'
 
diff --git a/jjb/verify/ofagent-go.yaml b/jjb/verify/ofagent-go.yaml
index 458e030..c4a7b93 100644
--- a/jjb/verify/ofagent-go.yaml
+++ b/jjb/verify/ofagent-go.yaml
@@ -24,7 +24,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_ofagent-go_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           dest-gopath: "github.com/opencord"
           unit-test-targets: 'lint sca test'
           unit-test-keep-going: 'true'
diff --git a/jjb/verify/opendevice-manager.yaml b/jjb/verify/opendevice-manager.yaml
index 9ed0715..f3ee4b4 100644
--- a/jjb/verify/opendevice-manager.yaml
+++ b/jjb/verify/opendevice-manager.yaml
@@ -15,7 +15,7 @@
       - 'verify-licensed'
       - 'tag-collision-reject'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           unit-test-targets: 'test'
           # opendm-agent uses gtest which outputs in xunit format
           junit-allow-empty-results: true
diff --git a/jjb/verify/opendm-agent.yaml b/jjb/verify/opendm-agent.yaml
index ee5fce9..2d5a258 100644
--- a/jjb/verify/opendm-agent.yaml
+++ b/jjb/verify/opendm-agent.yaml
@@ -15,7 +15,7 @@
       - 'verify-licensed'
       - 'tag-collision-reject'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           unit-test-targets: 'test'
           # opendm-agent uses gtest which outputs in xunit format
           junit-allow-empty-results: true
diff --git a/jjb/verify/openolt-test.yaml b/jjb/verify/openolt-test.yaml
index c8ef753..67d0f99 100644
--- a/jjb/verify/openolt-test.yaml
+++ b/jjb/verify/openolt-test.yaml
@@ -16,7 +16,7 @@
       - 'verify-licensed'
       - 'tag-collision-reject'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           build-timeout: 60
           unit-test-targets: 'lint docker-build'
           junit-allow-empty-results: true
diff --git a/jjb/verify/openolt.yaml b/jjb/verify/openolt.yaml
index ef8ab38..04ae7b4 100644
--- a/jjb/verify/openolt.yaml
+++ b/jjb/verify/openolt.yaml
@@ -15,7 +15,7 @@
       - 'verify-licensed'
       - 'tag-collision-reject'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           unit-test-targets: 'test'
           # openolt uses gtest which outputs in xunit format
           junit-allow-empty-results: true
diff --git a/jjb/verify/osam.yaml b/jjb/verify/osam.yaml
index a89f1cc..4473e36 100644
--- a/jjb/verify/osam.yaml
+++ b/jjb/verify/osam.yaml
@@ -51,7 +51,7 @@
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
           basedir: '{basedir}'
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/verify/ponsim.yaml b/jjb/verify/ponsim.yaml
index 68cf602..527c0cd 100644
--- a/jjb/verify/ponsim.yaml
+++ b/jjb/verify/ponsim.yaml
@@ -18,7 +18,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_ponsim_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
           dest-gopath: "github.com/opencord"
           unit-test-targets: 'test docker-build'
           unit-test-keep-going: 'true'
diff --git a/jjb/verify/sadis-server.yaml b/jjb/verify/sadis-server.yaml
index 3d1b591..5edbd53 100644
--- a/jjb/verify/sadis-server.yaml
+++ b/jjb/verify/sadis-server.yaml
@@ -53,7 +53,7 @@
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
           basedir: '{project}'
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/verify/up4.yaml b/jjb/verify/up4.yaml
index 17788a6..dbb83bd 100644
--- a/jjb/verify/up4.yaml
+++ b/jjb/verify/up4.yaml
@@ -13,7 +13,7 @@
           stream: "master"
           # As we run integration tests with 3 ONOS instances,
           # we need a beefy node.
-          build-node: "ubuntu16.04-basebuild-8c-15g"
+          build-node: "ubuntu18.04-basebuild-8c-15g"
 
 - job-group:
     name: "up4-jobs"
diff --git a/jjb/verify/voltctl.yaml b/jjb/verify/voltctl.yaml
index d7fca71..8e925e0 100644
--- a/jjb/verify/voltctl.yaml
+++ b/jjb/verify/voltctl.yaml
@@ -20,7 +20,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_voltctl_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           unit-test-targets: 'lint sca test'
           unit-test-keep-going: 'true'
           dependency-jobs: 'verify_voltctl_tag-collision'
@@ -31,7 +31,7 @@
     name: 'post-submit-voltctl-jobs'
     jobs:
       - 'github-release':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           dependency-jobs: 'version-tag'
           github-organization: 'opencord'
           artifact-glob: 'release/*'
diff --git a/jjb/verify/voltha-api-server.yaml b/jjb/verify/voltha-api-server.yaml
index 58982e2..fe82286 100644
--- a/jjb/verify/voltha-api-server.yaml
+++ b/jjb/verify/voltha-api-server.yaml
@@ -20,7 +20,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_voltha-api-server_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           dest-gopath: "github.com/opencord"
           unit-test-targets: 'lint sca test'
           unit-test-keep-going: 'true'
diff --git a/jjb/verify/voltha-bbsim.yaml b/jjb/verify/voltha-bbsim.yaml
index 1ad61e9..5cdf7ad 100644
--- a/jjb/verify/voltha-bbsim.yaml
+++ b/jjb/verify/voltha-bbsim.yaml
@@ -21,7 +21,7 @@
           unit-test-targets: 'test'
           dest-gopath: "github.com/opencord"
           junit-allow-empty-results: true
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
 
 - job-group:
     name: 'publish-voltha-bbsim-jobs'
diff --git a/jjb/verify/voltha-go.yaml b/jjb/verify/voltha-go.yaml
index d3db340..26eaaf8 100644
--- a/jjb/verify/voltha-go.yaml
+++ b/jjb/verify/voltha-go.yaml
@@ -24,7 +24,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_voltha-go_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           build-timeout: 20
           dest-gopath: "github.com/opencord"
           name-extension: "-lint"
@@ -32,7 +32,7 @@
           unit-test-keep-going: 'true'
           junit-allow-empty-results: true
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           dest-gopath: "github.com/opencord"
           name-extension: "-tests"
           unit-test-targets: 'test'
diff --git a/jjb/verify/voltha-lib-go.yaml b/jjb/verify/voltha-lib-go.yaml
index d03b6d4..f6e2b7a 100644
--- a/jjb/verify/voltha-lib-go.yaml
+++ b/jjb/verify/voltha-lib-go.yaml
@@ -16,7 +16,7 @@
       - 'tag-collision-reject':
           dependency-jobs: 'verify_voltha-lib-go_licensed'
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           build-timeout: 20
           dest-gopath: "github.com/opencord"
           unit-test-targets: 'lint sca test'
diff --git a/jjb/verify/voltha-openolt-adapter.yaml b/jjb/verify/voltha-openolt-adapter.yaml
index f19edc7..90f0379 100644
--- a/jjb/verify/voltha-openolt-adapter.yaml
+++ b/jjb/verify/voltha-openolt-adapter.yaml
@@ -29,14 +29,14 @@
           unit-test-targets: 'lint sca'
           unit-test-keep-going: 'true'
           junit-allow-empty-results: true
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
       - 'make-unit-test':
           dest-gopath: "github.com/opencord"
           name-extension: "-tests"
           unit-test-targets: 'test'
           unit-test-keep-going: 'true'
           junit-allow-empty-results: true
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
 
 - job-group:
     name: 'verify-voltha-openolt-adapter-jobs-voltha-2.7'
diff --git a/jjb/verify/voltha-openonu-adapter-go.yaml b/jjb/verify/voltha-openonu-adapter-go.yaml
index 4746e97..b66aaa6 100644
--- a/jjb/verify/voltha-openonu-adapter-go.yaml
+++ b/jjb/verify/voltha-openonu-adapter-go.yaml
@@ -28,14 +28,14 @@
           unit-test-targets: 'lint sca'
           unit-test-keep-going: 'true'
           junit-allow-empty-results: true
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
       - 'make-unit-test':
           dest-gopath: "github.com/opencord"
           name-extension: "-tests"
           unit-test-targets: 'test'
           unit-test-keep-going: 'true'
           junit-allow-empty-results: true
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
 
 - job-group:
     name: 'verify-voltha-openonu-adapter-go-jobs-voltha-2.7'
diff --git a/jjb/verify/voltha-protos.yaml b/jjb/verify/voltha-protos.yaml
index aefda8b..14ebf9a 100644
--- a/jjb/verify/voltha-protos.yaml
+++ b/jjb/verify/voltha-protos.yaml
@@ -19,7 +19,7 @@
       - 'verify-licensed'
       - 'tag-collision-reject':
       - 'make-unit-test':
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
           build-timeout: 20
           unit-test-targets: 'test'
           unit-test-keep-going: 'true'
diff --git a/jjb/verify/voltha-system-tests.yaml b/jjb/verify/voltha-system-tests.yaml
index f7efbab..d3e409f 100644
--- a/jjb/verify/voltha-system-tests.yaml
+++ b/jjb/verify/voltha-system-tests.yaml
@@ -7,12 +7,15 @@
 
     jobs:
       - 'verify-voltha-system-tests-jobs':
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           branch-regexp: '{all-branches-regexp}'
       - 'verify-voltha-system-tests-jobs-voltha-2.7':
+          build-node:  'ubuntu18.04-basebuild-4c-8g'
           name-extension: '-voltha-2.7'
           override-branch: 'voltha-2.7'
           branch-regexp: '{kind-voltha-regexp}'
       - 'verify-voltha-system-tests-jobs-master':
+          build-node:  'ubuntu18.04-basebuild-4c-8g'
           branch-regexp: '^master$'
 
 - job-group:
diff --git a/jjb/verify/xos.yaml b/jjb/verify/xos.yaml
index ff385f5..b33d7d2 100644
--- a/jjb/verify/xos.yaml
+++ b/jjb/verify/xos.yaml
@@ -31,7 +31,7 @@
     jobs:
       - 'python-unit-test':
           build-timeout: 45
-          build-node: 'ubuntu16.04-basebuild-2c-4g'
+          build-node: 'ubuntu18.04-basebuild-2c-4g'
       - 'api-test':
           pipeline-script: 'xos-core.groovy'
 
diff --git a/jjb/voltha-e2e.yaml b/jjb/voltha-e2e.yaml
index d5b8bad..6b89909 100755
--- a/jjb/voltha-e2e.yaml
+++ b/jjb/voltha-e2e.yaml
@@ -72,7 +72,7 @@
       - 'voltha-periodic-test':
           name: 'periodic-voltha-openonu-go-test-bbsim'
           pipeline-script: 'voltha-openonu-go-test-bbsim.groovy'
-          build-node: 'ubuntu16.04-basebuild-8c-15g'
+          build-node: 'ubuntu18.04-basebuild-8c-15g'
           make-target: openonu-go-adapter-test
           make-target-1t4gemtest: 1t4gem-openonu-go-adapter-test
           make-target-1t8gemtest: 1t8gem-openonu-go-adapter-test
@@ -86,7 +86,7 @@
       - 'voltha-periodic-test':
           name: 'periodic-voltha-openonu-go-test-bbsim-2.7'
           pipeline-script: 'voltha-openonu-go-test-bbsim.groovy'
-          build-node: 'ubuntu16.04-basebuild-8c-15g'
+          build-node: 'ubuntu18.04-basebuild-8c-15g'
           make-target: openonu-go-adapter-test
           make-target-1t4gemtest: 1t4gem-openonu-go-adapter-test
           make-target-1t8gemtest: 1t8gem-openonu-go-adapter-test
@@ -100,7 +100,7 @@
       - 'voltha-periodic-test':
           name: 'periodic-voltha-multiple-olts-openonu-go-test-bbsim'
           pipeline-script: 'voltha-openonu-go-test-bbsim.groovy'
-          build-node: 'ubuntu16.04-basebuild-8c-15g'
+          build-node: 'ubuntu18.04-basebuild-8c-15g'
           make-target: openonu-go-adapter-multi-olt-test
           make-target-1t4gemtest: 1t4gem-openonu-go-adapter-multi-olt-test
           make-target-1t8gemtest: 1t8gem-openonu-go-adapter-multi-olt-test
@@ -117,7 +117,7 @@
       - 'voltha-periodic-test':
           name: 'periodic-voltha-multiple-olts-openonu-go-test-bbsim-2.7'
           pipeline-script: 'voltha-openonu-go-test-bbsim.groovy'
-          build-node: 'ubuntu16.04-basebuild-8c-15g'
+          build-node: 'ubuntu18.04-basebuild-8c-15g'
           make-target: openonu-go-adapter-multi-olt-test
           make-target-1t4gemtest: 1t4gem-openonu-go-adapter-multi-olt-test
           make-target-1t8gemtest: 1t8gem-openonu-go-adapter-multi-olt-test
@@ -166,7 +166,7 @@
       - 'voltha-periodic-test':
           name: 'periodic-voltha-etcd-test'
           pipeline-script: 'voltha-system-test-bbsim.groovy'
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           code-branch: 'master'
           make-target: sanity-multi-kind
           onus: 2
@@ -176,7 +176,7 @@
       - 'voltha-periodic-test':
           name: 'periodic-voltha-etcd-test-2.7'
           pipeline-script: 'voltha-system-test-bbsim.groovy'
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           code-branch: 'voltha-2.7'
           make-target: sanity-multi-kind
           onus: 2
@@ -208,7 +208,7 @@
 
       - 'voltha-periodic-test':
           name: 'nightly-voltha-DTflow-sanity-test'
-          build-node: 'ubuntu16.04-basebuild-4c-8g'
+          build-node: 'ubuntu18.04-basebuild-4c-8g'
           code-branch: 'master'
           make-target: sanity-kind-dt
           onus: 1
@@ -453,6 +453,7 @@
 - job-template:
     id: 'voltha-patch-test'
     name: 'verify_{project}_sanity-test{name-extension}'
+    build-node: 'ubuntu18.04-basebuild-4c-8g'
     override-branch: '$GERRIT_BRANCH'
     sandbox: true
     build-timeout: 20
@@ -479,7 +480,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: '{build-node}'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
@@ -747,7 +748,7 @@
               project-pattern: '^(voltha-openolt-adapter|voltha-openonu-adapter|voltha-openonu-adapter-go|voltha-go)$'
               branches:
                 - branch-compare-type: REG_EXP
-                  branch-pattern: '{all-branches-regexp}'
+                  branch-pattern: '{branch-pattern}'
 
 
 - job-template:
diff --git a/jjb/voltha-publish.yaml b/jjb/voltha-publish.yaml
index d8b8246..aa68028 100644
--- a/jjb/voltha-publish.yaml
+++ b/jjb/voltha-publish.yaml
@@ -9,7 +9,7 @@
       - 'voltha-publish':
           project-regexp: 'voltha'
           branch-regexp: '^(master|voltha-1.6|voltha-1.7)$'
-          build-node: 'ubuntu16.04-basebuild-1c-2g'
+          build-node: 'ubuntu18.04-basebuild-1c-2g'
           dependency-jobs: ''
 
 - job-template:
diff --git a/jjb/voltha-unit-test.yaml b/jjb/voltha-unit-test.yaml
index c2132fa..f4225a3 100644
--- a/jjb/voltha-unit-test.yaml
+++ b/jjb/voltha-unit-test.yaml
@@ -37,7 +37,7 @@
           choosing-strategy: gerrit
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
 
-    node: 'ubuntu16.04-basebuild-4c-8g'
+    node: 'ubuntu18.04-basebuild-4c-8g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/xos-auth.yaml b/jjb/xos-auth.yaml
index 6b035f9..63a81a1 100644
--- a/jjb/xos-auth.yaml
+++ b/jjb/xos-auth.yaml
@@ -32,7 +32,7 @@
           branch: '$GERRIT_BRANCH'
           destination-dir: 'cord'
 
-    node: 'ubuntu16.04-basebuild-4c-8g'
+    node: 'ubuntu18.04-basebuild-4c-8g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/xos-integration-tests.yaml b/jjb/xos-integration-tests.yaml
index c894947..b1cd814 100644
--- a/jjb/xos-integration-tests.yaml
+++ b/jjb/xos-integration-tests.yaml
@@ -33,7 +33,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
@@ -92,7 +92,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
@@ -151,7 +151,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
@@ -210,7 +210,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
diff --git a/jjb/xos-rest-gw-unit.yaml b/jjb/xos-rest-gw-unit.yaml
index 7b12ffe..5eac9ad 100644
--- a/jjb/xos-rest-gw-unit.yaml
+++ b/jjb/xos-rest-gw-unit.yaml
@@ -40,7 +40,7 @@
           choosing-strategy: gerrit
           jenkins-ssh-credential: '{jenkins-ssh-credential}'
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/xos-synchronizer-update.yaml b/jjb/xos-synchronizer-update.yaml
index 2f49512..3ac10c9 100644
--- a/jjb/xos-synchronizer-update.yaml
+++ b/jjb/xos-synchronizer-update.yaml
@@ -28,7 +28,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
diff --git a/jjb/xos-unit.yaml b/jjb/xos-unit.yaml
index 89fd6c1..12190b5 100644
--- a/jjb/xos-unit.yaml
+++ b/jjb/xos-unit.yaml
@@ -32,7 +32,7 @@
           branch: 'master'
           destination-dir: 'cord'
 
-    node: 'ubuntu16.04-basebuild-1c-2g'
+    node: 'ubuntu18.04-basebuild-1c-2g'
     project-type: freestyle
     concurrent: true
 
diff --git a/jjb/xos-upgrade.yaml b/jjb/xos-upgrade.yaml
index 506d5dd..4889246 100644
--- a/jjb/xos-upgrade.yaml
+++ b/jjb/xos-upgrade.yaml
@@ -29,7 +29,7 @@
     parameters:
       - string:
           name: buildNode
-          default: 'ubuntu16.04-basebuild-4c-8g'
+          default: 'ubuntu18.04-basebuild-4c-8g'
           description: 'Name of the Jenkins node to run the job on'
 
       - string:
diff --git a/packer/common-packer b/packer/common-packer
index 4a5b0cd..e96974f 160000
--- a/packer/common-packer
+++ b/packer/common-packer
@@ -1 +1 @@
-Subproject commit 4a5b0cd9032938194c4813fe36663ddee4f9e60e
+Subproject commit e96974fa52edb7d8e7f27d314155bd088255e07d
diff --git a/packer/provision/baseline.yaml b/packer/provision/baseline.yaml
new file mode 100644
index 0000000..1aad172
--- /dev/null
+++ b/packer/provision/baseline.yaml
@@ -0,0 +1,88 @@
+---
+- hosts: all
+  become_user: root
+  become_method: sudo
+
+  pre_tasks:
+    - include_role: name=lfit.system-update
+
+    - name: Install base packages
+      include_tasks: "{{item}}"
+      with_first_found:
+        - "install-base-pkgs-{{ansible_distribution}}.yaml"
+        - "install-base-pkgs-{{ansible_os_family}}.yaml"
+
+    - name: Allow jenkins user sudo access
+      copy:
+        dest: /etc/sudoers.d/89-jenkins-user-defaults
+        content: |
+          Defaults:jenkins !requiretty
+          jenkins ALL=(ALL) NOPASSWD:ALL
+        validate: /usr/sbin/visudo -cf %s
+      become: yes
+
+  roles:
+    - lfit.lf-recommended-tools
+    - lfit.lf-dev-libs
+    - lfit.haveged-install
+    - lfit.java-install
+    - lfit.python-install
+    - lfit.shellcheck-install
+    - lfit.sysstat-install
+
+  post_tasks:
+    - name: Update /etc/nss-switch.conf to map hostname with IP
+      # Update /etc/nss-switch.conf to map hostname with IP instead of using `localhost`
+      # from /etc/hosts which is required by some of the Java API's to avoid
+      # Java UnknownHostException: "Name or service not known" error.
+      replace:
+        path: /etc/nsswitch.conf
+        regexp: '^hosts:(\s+.*)?$'
+        replace: 'hosts:\1 myhostname'
+        backup: yes
+      become: yes
+
+    - name: Disable periodic updates
+      block:
+        - name: Set all periodic update options to 0
+          replace:
+            path: /etc/apt/apt.conf.d/10periodic
+            regexp: "1"
+            replace: "0"
+        - name: Set all auto update options to 0
+          replace:
+            path: /etc/apt/apt.conf.d/20auto-upgrades
+            regexp: "1"
+            replace: "0"
+        - name: Disable unattended upgrades
+          lineinfile:
+            path: /etc/apt/apt.conf.d/10periodic
+            regexp: "^APT::Periodic::Unattended-Upgrade"
+            line: 'APT::Periodic::Unattended-Upgrade "0";'
+            create: yes
+        - name: Uninstall unattended upgrades
+          apt:
+            name: unattended-upgrades
+            state: absent
+        - name: Prevent unattended upgrades from being installed
+          dpkg_selections:
+            name: unattended-upgrades
+            selection: hold
+        - name: Disable apt-daily.* systemd services
+          systemd:
+            name: "{{service}}"
+            enabled: no
+            masked: yes
+          with_items:
+            - apt-daily.service
+            - apt-daily.timer
+            - apt-daily-upgrade.service
+            - apt-daily-upgrade.timer
+          loop_control:
+            loop_var: service
+      when: ansible_distribution == 'Ubuntu'
+      become: yes
+
+    - name: System Reseal
+      script: system-reseal.sh
+      become: true
diff --git a/packer/provision/install-base-pkgs-Ubuntu.yaml b/packer/provision/install-base-pkgs-Ubuntu.yaml
new file mode 100644
index 0000000..2ab6308
--- /dev/null
+++ b/packer/provision/install-base-pkgs-Ubuntu.yaml
@@ -0,0 +1,15 @@
+# SPDX-FileCopyrightText: 2020 Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+---
+- name: Install base packages
+  apt:
+    name:
+      - build-essential
+      - devscripts
+      - dh-systemd
+      - equivs
+      - gdebi
+    state: latest
+  become: yes
diff --git a/packer/provision/local-builder.yaml b/packer/provision/local-builder.yaml
new file mode 100644
index 0000000..8315fa0
--- /dev/null
+++ b/packer/provision/local-builder.yaml
@@ -0,0 +1,6 @@
+# SPDX-FileCopyrightText: 2020 Open Networking Foundation <info@opennetworking.org>
+#
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+---
+- import_playbook: ../provision/baseline.yaml
diff --git a/packer/provision/onf-playbook.yaml b/packer/provision/onf-playbook.yaml
new file mode 100644
index 0000000..206fec8
--- /dev/null
+++ b/packer/provision/onf-playbook.yaml
@@ -0,0 +1,231 @@
+---
+# SPDX-FileCopyrightText: 2020 Open Networking Foundation <info@opennetworking.org>
+# SPDX-License-Identifier: LicenseRef-ONF-Member-Only-1.0
+
+- name: "Provision Packages for Jenkins image"
+  hosts: default
+  become: true
+
+  tasks:
+    - name: Install apt packages
+      apt:
+        name:
+          - "facter"
+          - "libxml2-utils"
+          - "bzip2"
+          - "curl"
+          - "ebtables"
+          - "enchant"
+          - "ethtool"
+          - "git"
+          - "graphviz"
+          - "jq"
+          - "kafkacat"
+          - "less"
+          - "libpcap-dev"
+          - "libxml2-utils"
+          - "maven"
+          - "ruby"
+          - "screen"
+          - "socat"
+          - "ssh"
+          - "sshpass"
+          - "zip"
+          # below four packages are required by npm
+          - "nodejs"
+          - "libssl1.0-dev"
+          - "nodejs-dev"
+          - "node-gyp"
+          - "npm"
+        state: "present"
+        update_cache: true
+        cache_valid_time: 3600
+
+    - name: Download repo launcher
+      get_url:
+        url: "https://gerrit.googlesource.com/git-repo/+/refs/tags/v2.12.2/repo?format=TEXT"
+        checksum: "sha256:f5afffcc9afae128efd2b325ff19544a0b78acceb33a2edf368ce2de94e8c33e"
+        dest: /tmp/repo.b64
+
+    - name: Decode and make repo launcher executable
+      shell:
+        cmd: |
+          base64 --decode /tmp/repo.b64 > /usr/local/bin/repo;
+          chmod 755 /usr/local/bin/repo
+        creates: /usr/local/bin/repo
+
+    - name: Download helm archive
+      get_url:
+        url: "https://get.helm.sh/helm-v3.5.2-linux-amd64.tar.gz"
+        checksum: "sha256:01b317c506f8b6ad60b11b1dc3f093276bb703281cb1ae01132752253ec706a2"
+        dest: "/tmp/helm.tgz"
+
+    - name: Unarchive helm
+      unarchive:
+        src: "/tmp/helm.tgz"
+        dest: "/tmp"
+        remote_src: yes
+
+    - name: Install helm binary
+      copy:
+        src: /tmp/linux-amd64/helm
+        dest: /usr/local/bin/helm
+        mode: "0755"
+        remote_src: yes
+
+    - name: Download/install kubectl binary
+      get_url:
+        url: "https://storage.googleapis.com/kubernetes-release/release/v1.18.15/bin/linux/amd64/kubectl"
+        checksum: "sha256:eb5a5dd0a72795942ab81d1e4331625e80a90002c8bb39b2cb15aa707a3812c6"
+        dest: /usr/local/bin/kubectl
+        mode: "0755"
+
+    - name: load /etc/docker/daemon.json from file
+      slurp:
+        src: /etc/docker/daemon.json
+      register: imported_var
+
+    - name: append more key/values
+      set_fact:
+        imported_var: "{{ imported_var.content|b64decode|from_json | default([]) | combine({ 'registry-mirrors': ['https://mirror.registry.opennetworking.org'] }) }}"
+
+    - name: write var to file
+      copy:
+        content: "{{ imported_var | to_nice_json }}"
+        dest: /etc/docker/daemon.json
+
+    - name: restart Docker service
+      systemd:
+        name: docker
+        state: restarted
+        daemon_reload: true
+
+    - name: Install multi python3 packages with version specifiers
+      pip:
+        name:
+          - ansible
+          - ansible-lint
+          - docker
+          - docker-compose
+          - git-review
+          - httpie
+          - netaddr
+          - pylint
+          - tox
+          - twine
+          - virtualenv
+          - yamllint
+        executable: pip3
+    - name: Install multi python2 packages with version specifiers
+      pip:
+        name:
+        - Jinja2
+        - coverage
+        - certifi
+        - cryptography
+        - git+https://github.com/linkchecker/linkchecker.git@v9.4.0
+        - graphviz
+        - isort
+        - more-itertools==5.0.0
+        - mock>2.0.0<2.1.0
+        - ndg-httpsclient
+        - nose2>0.9.0<0.10.0
+        - pyopenssl
+        - pexpect
+        - pyyaml>3.10.0<3.11.0
+        - requests>2.14.0<2.15.0
+        - robotframework
+        - robotframework-httplibrary
+        - robotframework-kafkalibrary
+        - robotframework-lint
+        - robotframework-requests
+        - robotframework-sshlibrary
+        - six
+        - urllib3
+
+    - name: Install multi ruby packages with version specifiers
+      gem:
+        name: mdl
+        version: 0.5.0
+
+    - name: Install gitbook-cli npm package with version specifiers
+      npm:
+        name: gitbook-cli
+        global: true
+
+    - name: Install markdownlint npm package with version specifiers
+      npm:
+        name: markdownlint
+        global: true
+
+    - name: Install typings npm package with version specifiers
+      npm:
+        name: typings
+        global: true
+
+    - name: Download minikube
+      get_url:
+        url: "https://storage.googleapis.com/minikube/releases/latest/minikube_1.18.0-0_amd64.deb"
+        checksum: "sha256:6e3918b601704014f3d0b0a09e3116f1ea528ac255525743a800b5f0b5856622"
+        dest: /tmp/minikube.deb
+
+    - name: Install minikube deb
+      apt:
+        deb: /tmp/minikube.deb
+
+    - name: Download protobuf
+      get_url:
+        url: "https://github.com/google/protobuf/releases/download/v3.7.0/protoc-3.7.0-linux-x86_64.zip"
+        checksum: "sha256:a1b8ed22d6dc53c5b8680a6f1760a305b33ef471bece482e92728f00ba2a2969"
+        dest: /tmp/protobuf.zip
+
+    - name: Unarchive protobuf
+      unarchive:
+        src: "/tmp/protobuf.zip"
+        dest: "/usr/local"
+        remote_src: yes
+
+    - name: Download pandoc
+      get_url:
+        url: "https://github.com/jgm/pandoc/releases/download/2.10.1/pandoc-2.10.1-1-amd64.deb"
+        checksum: "sha256:4515d6fe2bf8b82765d8dfa1e1b63ccb0ff3332d60389f948672eaa37932e936"
+        dest: /tmp/pandoc.deb
+
+    - name: Install pandoc deb
+      apt:
+        deb: /tmp/pandoc.deb
+
+    - name: Download yq
+      get_url:
+        url: "https://github.com/mikefarah/yq/releases/download/3.4.0/yq_linux_amd64"
+        checksum: "sha256:f6bd1536a743ab170b35c94ed4c7c4479763356bd543af5d391122f4af852460"
+        dest: /usr/local/bin/yq
+
+    - name: Change yq Permission
+      file:
+        path: /usr/local/bin/yq
+        mode: 0755
+
+    - name: Download hadolint
+      get_url:
+        url: "https://github.com/hadolint/hadolint/releases/download/v1.18.0/hadolint-Linux-x86_64"
+        checksum: "sha256:f9bc9de12438b463ca84e77fde70b07b155d4da07ca21bc3f4354a62c6199db4"
+        dest: /usr/local/bin/hadolint
+
+    - name: Change hadolint Permission
+      file:
+        path: /usr/local/bin/hadolint
+        mode: 0755
+
+    - name: Recursively remove download files and folders
+      file:
+        path: "{{ item }}"
+        state: absent
+      with_items:
+        - /tmp/linux-amd64
+        - /tmp/helm.tgz
+        - /tmp/minikube.deb
+        - /tmp/protobuf.zip
+        - /tmp/pandoc.deb
+        - /tmp/repo.b64
+        - /tmp/golang_1.16.3.tar.gz
diff --git a/packer/provision/system-reseal.sh b/packer/provision/system-reseal.sh
new file mode 100644
index 0000000..002edf5
--- /dev/null
+++ b/packer/provision/system-reseal.sh
@@ -0,0 +1,89 @@
+#!/bin/bash
+# SPDX-License-Identifier: EPL-1.0
+##############################################################################
+# Copyright (c) 2016 The Linux Foundation and others.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+##############################################################################
+# Cleans up VM as preparation for image snapshotting
+
+# vim: sw=2 ts=2 sts=2 et :
+
+rm -rf ~/.viminfo \
+    /etc/Pegasus/*.cnf \
+    /etc/Pegasus/*.crt \
+    /etc/Pegasus/*.csr \
+    /etc/Pegasus/*.pem \
+    /etc/Pegasus/*.srl \
+    /etc/ssh/ssh*key* \
+    /root/.ssh/* \
+    /root/anaconda-ks.cfg \
+    /root/anaconda-post.log \
+    /root/initial-setup-ks.cfg \
+    /root/install.log \
+    /root/install.log.syslog \
+    /tmp/packer \
+    /var/cache/fontconfig/* \
+    /var/cache/gdm/* \
+    /var/cache/man/* \
+    /var/lib/AccountService/users/* \
+    /var/lib/cloud/* \
+    /var/lib/fprint/* \
+    /var/lib/logrotate.status \
+    /var/log/*.log* \
+    /var/log/BackupPC/LOG \
+    /var/log/ConsoleKit/* \
+    /var/log/anaconda.syslog \
+    /var/log/anaconda/* \
+    /var/log/apache2/*_log \
+    /var/log/apache2/*_log-* \
+    /var/log/apt/* \
+    /var/log/aptitude* \
+    /var/log/audit/* \
+    /var/log/btmp* \
+    /var/log/ceph/*.log \
+    /var/log/chrony/*.log \
+    /var/log/cron* \
+    /var/log/cups/*_log \
+    /var/log/debug* \
+    /var/log/dmesg* \
+    /var/log/exim4/* \
+    /var/log/faillog* \
+    /var/log/gdm/* \
+    /var/log/glusterfs/*glusterd.vol.log \
+    /var/log/glusterfs/glusterfs.log \
+    /var/log/httpd/*log \
+    /var/log/installer/* \
+    /var/log/jetty/jetty-console.log \
+    /var/log/journal/* \
+    /var/log/lastlog* \
+    /var/log/libvirt/libvirtd.log \
+    /var/log/libvirt/lxc/*.log \
+    /var/log/libvirt/qemu/*.log \
+    /var/log/libvirt/uml/*.log \
+    /var/log/lightdm/* \
+    /var/log/mail/* \
+    /var/log/maillog* \
+    /var/log/messages* \
+    /var/log/ntp \
+    /var/log/ntpstats/* \
+    /var/log/ppp/connect-errors \
+    /var/log/rhsm/* \
+    /var/log/sa/* \
+    /var/log/secure* \
+    /var/log/setroubleshoot/*.log \
+    /var/log/spooler* \
+    /var/log/squid/*.log \
+    /var/log/syslog* \
+    /var/log/tallylog* \
+    /var/log/tuned/tuned.log \
+    /var/log/wtmp* \
+    /var/named/data/named.run
+
+# Force a system sync and sleep to get around any SSD issues
+echo "Forcing sync and sleep for 10sec"
+sync
+sleep 10
diff --git a/packer/templates/basebuild_1804.json b/packer/templates/basebuild_1804.json
new file mode 100644
index 0000000..668b282
--- /dev/null
+++ b/packer/templates/basebuild_1804.json
@@ -0,0 +1,88 @@
+{
+    "variables": {
+        "ansible_roles_path": ".galaxy",
+        "aws_access_key": null,
+        "aws_security_key": null,
+        "arch": "x86_64",
+        "cloud_user_data": null,
+        "distro": null,
+        "instance_type": "t2.medium",
+        "security_group_id": null,
+        "source_ami_filter_name": null,
+        "source_ami_filter_owner": null,
+        "source_ami_filter_product_code": "",
+        "subnet_id": null,
+        "ssh_user": null
+    },
+    "builders": [
+        {
+            "name": "aws",
+            "access_key": "{{user `aws_access_key`}}",
+            "ami_name": "{{user `distro`}} - basebuild - {{user `arch`}} - {{isotime \"20060102-1504\"}}",
+            "instance_type": "{{user `instance_type`}}",
+            "region": "us-west-2",
+            "secret_key": "{{user `aws_security_key`}}",
+            "security_group_id": "{{user `security_group_id`}}",
+            "source_ami_filter": {
+                "filters": {
+                    "name": "{{user `source_ami_filter_name`}}",
+                    "product-code": "{{user `source_ami_filter_product_code`}}",
+                    "architecture": "{{user `arch`}}",
+                    "root-device-type": "ebs",
+                    "virtualization-type": "hvm"
+                },
+                "most_recent": true,
+                "owners": ["{{user `source_ami_filter_owner`}}"]
+            },
+            "ssh_username": "{{user `ssh_user`}}",
+            "subnet_id": "{{user `subnet_id`}}",
+            "type": "amazon-ebs",
+            "user_data_file": "{{user `cloud_user_data`}}"
+        }
+    ],
+    "provisioners": [
+      {
+          "type": "shell-local",
+          "command": "./common-packer/ansible-galaxy.sh {{user `ansible_roles_path`}}"
+      },
+      {
+          "type": "ansible",
+          "user": "{{user `ssh_user`}}",
+          "playbook_file": "provision/local-builder.yaml",
+          "ansible_env_vars": [
+              "ANSIBLE_NOCOWS=1",
+              "ANSIBLE_PIPELINING=False",
+              "ANSIBLE_HOST_KEY_CHECKING=False",
+              "ANSIBLE_ROLES_PATH={{user `ansible_roles_path`}}",
+              "ANSIBLE_CALLBACK_WHITELIST=profile_tasks",
+              "ANSIBLE_STDOUT_CALLBACK=debug"
+          ]
+      },
+      {
+          "type": "ansible",
+          "user": "{{user `ssh_user`}}",
+          "playbook_file": "./common-packer/provision/local-docker.yaml",
+          "ansible_env_vars": [
+              "ANSIBLE_NOCOWS=1",
+              "ANSIBLE_PIPELINING=False",
+              "ANSIBLE_HOST_KEY_CHECKING=False",
+              "ANSIBLE_ROLES_PATH={{user `ansible_roles_path`}}",
+              "ANSIBLE_CALLBACK_WHITELIST=profile_tasks",
+              "ANSIBLE_STDOUT_CALLBACK=debug"
+          ]
+      },
+      {
+          "type": "ansible",
+          "user": "{{user `ssh_user`}}",
+          "playbook_file": "provision/onf-playbook.yaml",
+          "ansible_env_vars": [
+              "ANSIBLE_NOCOWS=1",
+              "ANSIBLE_PIPELINING=False",
+              "ANSIBLE_HOST_KEY_CHECKING=False",
+              "ANSIBLE_ROLES_PATH={{user `ansible_roles_path`}}",
+              "ANSIBLE_CALLBACK_WHITELIST=profile_tasks",
+              "ANSIBLE_STDOUT_CALLBACK=debug"
+          ]
+      }
+  ]
+}
diff --git a/packer/vars/ubuntu-18.04.json b/packer/vars/ubuntu-18.04.json
new file mode 100644
index 0000000..a1ee888
--- /dev/null
+++ b/packer/vars/ubuntu-18.04.json
@@ -0,0 +1,11 @@
+{
+  "source_ami_filter_name": "*ubuntu*18.04*",
+  "source_ami_filter_owner": "aws-marketplace",
+  "source_ami_filter_product_code": "3iplms73etrdhxdepv72l6ywj",
+
+  "ssh_user": "ubuntu",
+
+  "distro": "Ubuntu 18.04",
+  "arch": "x86_64",
+  "cloud_user_data": null
+}