diff --git a/.github/workflows/staging-ci-cd.yml b/.github/workflows/staging-ci-cd.yml
index b9f2245a1ecb24e75818e76ec49a7ccfddf507ff..95a10373bc6c94abfd4c9d8940703f30fe81ac66 100644
--- a/.github/workflows/staging-ci-cd.yml
+++ b/.github/workflows/staging-ci-cd.yml
@@ -1,78 +1,92 @@
-name: CI/CD Pipeline for Staging
+name: Github CI
 
 on:
   push:
     branches:
       - staging
-  pull_request:
-    branches:
-      - staging
 
 jobs:
   build:
+    name: Build
     runs-on: ubuntu-latest
-
     steps:
-      - name: Checkout code
-        uses: actions/checkout@v2
-
-      - name: Set up JDK 21 (using Zulufx)
-        uses: actions/setup-java@v2
+      - name: Checkout Repository
+        uses: actions/checkout@v4
+      - name: Set up JDK 21
+        uses: actions/setup-java@v4
         with:
-          java-version: '21'
-          distribution: 'zulu'
-          java-package: jdk
-          architecture: x64
-
+          distribution: "temurin"
+          java-version: "21"
+          cache: "maven"
+      - name: Cache Maven dependencies
+        uses: actions/cache@v4
+        with:
+          path: ~/.m2
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
       - name: Build with Maven
-        run: mvn clean install
+        run: |
+          mvn clean package -DskipTests
+      - name: Upload Artifact
+        uses: actions/upload-artifact@v4
+        with:
+          name: java-app
+          path: target/*.jar
 
+  test:
+    name: Test
+    runs-on: ubuntu-latest
+    needs: build
+    steps:
+      - name: Checkout Repository
+        uses: actions/checkout@v4
+      - name: Set up JDK 21
+        uses: actions/setup-java@v4
+        with:
+          distribution: "temurin"
+          java-version: "21"
+          cache: "maven"
+      - name: Cache Maven dependencies
+        uses: actions/cache@v4
+        with:
+          path: ~/.m2
+          key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
+          restore-keys: |
+            ${{ runner.os }}-maven-
       - name: Run Unit Tests
         run: mvn test
-
-      - name: Run Regression Tests (JUnit 5, TestContainers)
+      - name: Generate Coverage Report
+        run: mvn jacoco:report
+      - name: Run Regression Tests
         run: mvn test -P regression-tests
+      - name: Run Integration Tests
+        run: mvn verify -P integration-tests
+      - name: Run User Acceptance Tests
+        run: mvn test -P uat
 
-  build-and-deliver:
+  publish:
+    name: Publish Docker Image
     runs-on: ubuntu-latest
+    needs: test
     steps:
-      - name: Checkout Code
-        uses: actions/checkout@v3
-
-      - name: Install the gcloud CLI
-        uses: google-github-actions/setup-gcloud@v2
+      - name: Checkout Repository
+        uses: actions/checkout@v4
+      - name: check directory
+        run: ls -al
+      - name: Download Artifact
+        uses: actions/download-artifact@v4
         with:
-          project_id: ${{ secrets.GOOGLE_PROJECT }}
-          service_account_key: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
-          export_default_credentials: true
-
-      - name: Authenticate with GCP
-        uses: google-github-actions/auth@v1
-        with:
-          credentials_json: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}
-
-      - name: Build and Push Docker Image
-        env:
-          PRODUCTION: staging
-          GOOGLE_PROJECT: ${{ secrets.GOOGLE_PROJECT }}
-          JDBC_STAGING_DATABASE_PASSWORD: ${{ secrets.JDBC_STAGING_DATABASE_PASSWORD }}
-          JDBC_STAGING_DATABASE_URL: ${{ secrets.JDBC_STAGING_DATABASE_URL }}
-          JDBC_STAGING_DATABASE_USERNAME: ${{ secrets.JDBC_STAGING_DATABASE_USERNAME }}
-        run: |
-          gcloud auth configure-docker us-central1-docker.pkg.dev
-          docker build --build-arg PRODUCTION=$PRODUCTION --build-arg JDBC_STAGING_DATABASE_PASSWORD=$JDBC_STAGING_DATABASE_PASSWORD --build-arg JDBC_STAGING_DATABASE_URL=$JDBC_STAGING_DATABASE_URL --build-arg JDBC_STAGING_DATABASE_USERNAME=$JDBC_STAGING_DATABASE_USERNAME -t us-central1-docker.pkg.dev/$GOOGLE_PROJECT/staging-repository/authentication:latest .
-          docker push us-central1-docker.pkg.dev/$GOOGLE_PROJECT/staging-repository/authentication:latest
-
-      - name: Install required components
-        run: |
-          gcloud components update
-          gcloud components install gke-gcloud-auth-plugin
-
-      - name: Deploy to GKE
+          name: java-app
+      - name: check directory
+        run: ls -al
+      - name: Docker login
         env:
-          GOOGLE_PROJECT: ${{ secrets.GOOGLE_PROJECT }}
-          GOOGLE_REPOSiTORY: staging-repository
+          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
+        run: echo "$DOCKER_PASSWORD" | docker login -u ${{ secrets.REGISTRY_USER }} --password-stdin docker.io
+      - name: Set Docker BuildKit
+        run: export DOCKER_BUILDKIT=1
+      - name: Build Docker Image
         run: |
-          gcloud container clusters get-credentials safetypin-staging --region asia-southeast2
-          sed -i "s/GOOGLE_PROJECT/$GOOGLE_PROJECT/g" staging.yaml
-          kubectl apply -f staging.yaml
\ No newline at end of file
+          docker build -t ${{ secrets.REGISTRY_USER }}/${{ secrets.IMAGE_NAME }}:${{ secrets.IMAGE_TAG }} .
+          docker push ${{ secrets.REGISTRY_USER }}/${{ secrets.IMAGE_NAME }}:${{ secrets.IMAGE_TAG }}
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index fcc2364a5f41ab24e97fdb0a084feb527cd94c45..6a846b1248e7443a45b58a1570a88506c2066144 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,30 +1,6 @@
-# Step 1: Use Maven to build the JAR inside Docker
-FROM maven:3.9.6-eclipse-temurin-21 AS builder
-WORKDIR /app
-COPY . .
-RUN mvn clean package -DskipTests
-
-# Step 2: Use OpenJDK 21 to run the application
 FROM openjdk:21-jdk-slim
 
-# Setup envs
-ARG PRODUCTION
-ARG JDBC_DATABASE_PASSWORD
-ARG JDBC_DATABASE_URL
-ARG JDBC_DATABASE_USERNAME
-ARG JDBC_STAGING_DATABASE_USERNAME
-ARG JDBC_STAGING_DATABASE_URL
-ARG JDBC_STAGING_DATABASE_URL
-
-ENV PRODUCTION ${PRODUCTION}
-ENV JDBC_DATABASE_PASSWORD ${JDBC_DATABASE_PASSWORD}
-ENV JDBC_DATABASE_URL ${JDBC_DATABASE_URL}
-ENV JDBC_DATABASE_USERNAME ${JDBC_DATABASE_USERNAME}
-ENV JDBC_STAGING_DATABASE_PASSWORD ${JDBC_STAGING_DATABASE_PASSWORD}
-ENV JDBC_STAGING_DATABASE_URL ${JDBC_STAGING_DATABASE_URL}
-ENV JDBC_STAGING_DATABASE_USERNAME ${JDBC_STAGING_DATABASE_USERNAME}
-
 WORKDIR /app
-COPY --from=builder /app/target/authentication-0.1.jar app.jar
+COPY ./authentication-0.1.jar /app/app.jar
 EXPOSE 8080
 CMD ["java", "-jar", "app.jar"]
diff --git a/src/main/java/com/safetypin/authentication/model/User.java b/src/main/java/com/safetypin/authentication/model/User.java
index 7fd5f65f99ed01e7058afb07ad8b8dbb267984c2..7ed54255db5afb7689e43245651b806c05f1adde 100644
--- a/src/main/java/com/safetypin/authentication/model/User.java
+++ b/src/main/java/com/safetypin/authentication/model/User.java
@@ -27,7 +27,7 @@ public class User {
     // May be null for social login users
     @Setter
     @Getter
-    @Column(nullable = false)
+    @Column(nullable = true)
     private String password;
 
     @Setter