diff --git a/Jenkinsfile.new b/Jenkinsfile.new
new file mode 100644
index 0000000..eb0aacb
--- /dev/null
+++ b/Jenkinsfile.new
@@ -0,0 +1,189 @@
+/*
+  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, either express or
+  implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+*/
+
+def DEFAULT_MODULE_NAME = 'devops'
+
+pipeline {
+  agent { label 'pool' }
+  options { disableConcurrentBuilds() }
+  parameters {
+    // Core Gerrit / multibranch inputs
+    string(name: 'GERRIT_BRANCH', defaultValue: env.BRANCH_NAME ?: 'master', description: '')
+    string(name: 'GERRIT_PROJECT', defaultValue: 'osm/devops', description: '')
+    string(name: 'GERRIT_REFSPEC', defaultValue: env.GERRIT_REFSPEC ?: '', description: '')
+    string(name: 'GERRIT_PATCHSET_REVISION', defaultValue: env.GERRIT_PATCHSET_REVISION ?: '', description: '')
+    string(name: 'DOCKER_ARGS', defaultValue: '', description: 'Extra docker args for docker run')
+
+    // E2E test parameters
+    string(name: 'OPENSTACK_BASE_IMAGE', defaultValue: 'ubuntu22.04', description: '')
+    string(name: 'OPENSTACK_OSM_FLAVOR', defaultValue: 'osm.sanity', description: '')
+    string(name: 'MODULE_NAME', defaultValue: 'devops', description: 'Name of the module under test')
+
+    // Pipeline control flags
+    booleanParam(name: 'DO_INSTALL', defaultValue: true, description: '')
+    booleanParam(name: 'DO_DOCKERPUSH', defaultValue: true, description: '')
+    booleanParam(name: 'DO_ROBOT', defaultValue: true, description: '')
+    booleanParam(name: 'SAVE_CONTAINER_ON_FAIL', defaultValue: false, description: '')
+    booleanParam(name: 'SAVE_CONTAINER_ON_PASS', defaultValue: false, description: '')
+
+    // Docker image configuration
+    string(name: 'IMAGENAME', defaultValue: 'opensourcemano/devops', description: 'Image name for publish (reserved)')
+  }
+  environment {
+    MDG = "${params.GERRIT_PROJECT?.contains('/') ? params.GERRIT_PROJECT.split('/')[1] : params.GERRIT_PROJECT}"
+    CONTAINER_NAME = "${params.GERRIT_PROJECT}-${params.GERRIT_BRANCH}".toLowerCase()
+    TEST_IMAGE = 'overdrive3000/tox-osm:v1.6'
+    DOCKER_REGISTRY = 'osm.etsi.org:5050/devops/cicd/'
+  }
+  stages {
+    stage('Prepare') { steps { sh 'env' } }
+
+    stage('Checkout') {
+      steps {
+        checkout scm
+        script {
+          sh "git fetch --tags"
+          if (params.GERRIT_REFSPEC?.trim()) { sh "git fetch origin ${params.GERRIT_REFSPEC}" }
+          if (params.GERRIT_PATCHSET_REVISION?.trim()) { sh "git checkout -f ${params.GERRIT_PATCHSET_REVISION}" }
+          sh "sudo git clean -dfx || git clean -dfx"
+        }
+      }
+    }
+
+    stage('License Scan') {
+      steps {
+        script {
+          def isMergeJob = env.JOB_NAME?.contains('merge')
+          if (!isMergeJob) { sh 'devops/tools/license_scan.sh' } else { echo 'skip the scan for merge' }
+        }
+      }
+    }
+
+    stage('Prepare Test Image') {
+      steps {
+        script {
+          // Use shared test image from registry; no local build needed
+          sh "docker pull ${env.TEST_IMAGE} || true"
+        }
+      }
+    }
+
+    stage('Tests') {
+      steps {
+        script {
+          def UID = sh(returnStdout: true, script: 'id -u').trim()
+          def GID = sh(returnStdout: true, script: 'id -g').trim()
+          def common = "-v ${env.WORKSPACE}:/tests -e UID=${UID} -e GID=${GID} " + (params.DOCKER_ARGS ?: '')
+
+          stage('Helm Tests') {
+            sh """
+              docker run --rm ${common} \
+                ${env.TEST_IMAGE} \
+                /tests/devops-stages/stage-test.sh
+            """
+            if (fileExists('coverage.xml')) { cobertura coberturaReportFile: 'coverage.xml' }
+            if (fileExists('nosetests.xml')) { junit 'nosetests.xml' }
+          }
+
+          stage('Changelog') {
+            sh 'mkdir -p changelog'
+            sh """
+              docker run --rm ${common} \
+                ${env.TEST_IMAGE} \
+                /bin/sh -lc 'devops/tools/generatechangelog-pipeline.sh > /tests/changelog/changelog-${MDG}.html'
+            """
+          }
+        }
+      }
+    }
+
+    stage('Build & Push Image') {
+      when { expression { return params.DO_DOCKERPUSH } }
+      steps {
+        script {
+          def moduleName = (env.MDG ?: DEFAULT_MODULE_NAME).toLowerCase()
+
+          if (!params.GERRIT_BRANCH) {
+            error 'GERRIT_BRANCH is required to tag the Docker image'
+          }
+          def sanitizedBranchName = params.GERRIT_BRANCH
+            .toLowerCase()
+            .replaceAll('[^a-z0-9._-]', '-')
+          def baseTagPrefix = "osm-${sanitizedBranchName}"
+          def buildNumber = env.BUILD_NUMBER ?: '0'
+          def isMergeJob = env.JOB_NAME?.contains('merge')
+          // Remove promotion logic from this stage
+          def moduleTags = []
+          if (isMergeJob) {
+            moduleTags << "${baseTagPrefix}-merge-${buildNumber}"
+          } else {
+            moduleTags << "${baseTagPrefix}-patchset-${buildNumber}"
+          }
+
+          def imageName = params.IMAGENAME ?: "opensourcemano/${moduleName}"
+          def primaryLocalImage = "${imageName}:${moduleTags[0]}"
+
+          withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'gitlab-registry',
+                            usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD']]) {
+            sh """
+              docker build -f Dockerfile -t ${primaryLocalImage} .
+            """
+            sh "docker login ${env.DOCKER_REGISTRY.split('/')[0]} -u ${USERNAME} -p ${PASSWORD}"
+            // Push build-scope tag(s) only. Promotion happens after tests.
+            moduleTags.each { tag ->
+              def localImage = "${imageName}:${tag}"
+              def remoteImage = "${env.DOCKER_REGISTRY}${imageName}:${tag}"
+              sh "docker tag ${localImage} ${remoteImage}"
+              sh "docker push ${remoteImage}"
+            }
+            // Stash the built image id for later promotion without rebuild
+            env.BUILT_IMAGE = primaryLocalImage
+            env.BUILT_TAG = moduleTags[0]
+          }
+        }
+      }
+    }
+
+    stage('E2E Test (robot)') {
+      when { expression { return params.DO_ROBOT && !env.JOB_NAME.contains('merge') } }
+      steps {
+        script {
+          def dowstreamJob = "osm-e2e/${params.GERRIT_BRANCH ?: 'master'}"
+          build job: dowstreamJob,
+            parameters: [
+              string(name: 'GERRIT_BRANCH', value: params.GERRIT_BRANCH ?: 'master'),
+              string(name: 'GERRIT_REFSPEC', value: params.GERRIT_REFSPEC ?: ''),
+              string(name: 'OPENSTACK_BASE_IMAGE', value: params.OPENSTACK_BASE_IMAGE),
+              string(name: 'OPENSTACK_OSM_FLAVOR', value: params.OPENSTACK_OSM_FLAVOR),
+              string(name: 'MODULE_NAME', value: params.MODULE_NAME ?: 'devops'),
+              string(name: 'CONTAINER_NAME', value: env.BUILT_TAG),
+              booleanParam(name: 'DO_ROBOT', value: params.DO_ROBOT),
+              booleanParam(name: 'DO_INSTALL', value: params.DO_INSTALL),
+              booleanParam(name: 'SAVE_CONTAINER_ON_FAIL', value: params.SAVE_CONTAINER_ON_FAIL),
+              booleanParam(name: 'SAVE_CONTAINER_ON_PASS', value: params.SAVE_CONTAINER_ON_PASS)
+            ]
+        }
+      }
+    }
+  }
+
+  post {
+    always {
+      // cleanWs()
+      deleteDir()
+    }
+  }
+}
+
