diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 017cfc5cbfa6fa67cb4eabc367a32021923def23..b800004d1867b66585bed411656ca89c74070da2 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -13,7 +13,9 @@ variables:
   CACHE_IMAGE_BUILDER: $CI_REGISTRY_IMAGE:builder
   BRANCH_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
   DEV_IMAGE: $CI_REGISTRY_IMAGE:cpu-basic-dev-testing
-    
+  CI_REGISTRY_PUBIMG: $CI_REGISTRY_IMAGE/$OTBTF_VERSION
+  DOCKERHUB_IMAGE_BASE: mdl4eo/ptbtf${OTBTF_VERSION}
+  
 workflow:
   rules:
     - if: $CI_MERGE_REQUEST_ID || $CI_COMMIT_REF_NAME =~ /master/ # Execute jobs in merge request context, or commit in master branch
@@ -23,20 +25,25 @@ stages:
   - Static Analysis
   - Test
   - Applications Test
+  - Update dev image
   - Ship
 
-docker image:
-  stage: Build
+.docker_build_base:
   allow_failure: false
   tags: [godzilla]
   image: docker/compose:latest
-  except:
-    - develop
   services:
     - name: docker:dind
   before_script:
     - echo -n $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
   timeout: 10 hours
+
+
+docker image:
+  extends: .docker_build_base
+  except:
+    - develop
+    - master
   script:
     - >
       docker build
@@ -149,34 +156,70 @@ sr4rs:
     - export PYTHONPATH=$PYTHONPATH:$PWD/sr4rs
     - python -m pytest --junitxml=$ARTIFACT_TEST_DIR/report_sr4rs.xml $OTBTF_SRC/test/sr4rs_unittest.py
 
-deploy:
-  stage: Ship
-  only:
+deploy_cpu-dev-testing:
+  stage: Update dev image
+  extends: .docker_build_base
+  except:
     - master
-  tags: [godzilla]
-  image: docker/compose:latest
-  services:
-    - name: docker:dind
-  variables:
-    CI_REGISTRY_PUBIMG: $CI_REGISTRY_IMAGE/$OTBTF_VERSION
-  before_script:
-    - echo -n $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
-  timeout: 10 hours
   script:
-    - echo "Shippping!"
     - docker pull $BRANCH_IMAGE
     - docker tag $BRANCH_IMAGE $DEV_IMAGE
     - docker push $DEV_IMAGE
-    - docker build --network='host' --tag $CI_REGISTRY_PUBIMG:cpu-basic --build-arg BASE_IMG=ubuntu:20.04 --build-arg BZL_CONFIGS="" .  # cpu-basic
-    - docker push $CI_REGISTRY_PUBIMG:cpu-basic
-    - docker build --network='host' --tag $CI_REGISTRY_PUBIMG:cpu-basic-dev --build-arg BASE_IMG=ubuntu:20.04 --build-arg BZL_CONFIGS="" --build-arg KEEP_SRC_OTB=true .  # cpu-basic-dev
-    - docker push $CI_REGISTRY_PUBIMG:cpu-basic-dev
-    - docker build --network='host' --tag $CI_REGISTRY_PUBIMG:gpu --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 .  # gpu
-    - docker push $CI_REGISTRY_PUBIMG:gpu
-    - docker build --network='host' --tag $CI_REGISTRY_PUBIMG:gpu-dev --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 --build-arg KEEP_SRC_OTB=true .  # gpu-dev
-    - docker push $CI_REGISTRY_PUBIMG:gpu-dev
-    - docker build --network='host' --tag $CI_REGISTRY_PUBIMG:gpu-basic --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 --build-arg BZL_CONFIGS="" .  # gpu-basic
-    - docker push $CI_REGISTRY_PUBIMG:gpu-basic
-    - docker build --network='host' --tag $CI_REGISTRY_PUBIMG:gpu-basic-dev --build-arg BZL_CONFIGS="" --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 --build-arg KEEP_SRC_OTB=true .  # gpu-basic-dev
-    - docker push $CI_REGISTRY_PUBIMG:gpu-basic-dev
+
+.ship base:
+  extends: .docker_build_base
+  stage: Ship
+  only:
+    - master
+
+deploy_cpu:
+  extends: .ship base
+  variables:
+    IMAGE_CPU: $CI_REGISTRY_PUBIMG:cpu
+    IMAGE_CPUDEV: $CI_REGISTRY_PUBIMG:cpu-dev
+    DOCKERHUB_CPU: $DOCKERHUB_IMAGE_BASE:cpu
+    DOCKERHUB_CPUDEV: $DOCKERHUB_IMAGE_BASE:cpu-dev
+  script:
+    # cpu
+    - docker build --network='host' --tag $IMAGE_CPU --build-arg BASE_IMG=ubuntu:20.04 --build-arg BZL_CONFIGS="" .
+    - docker push $IMAGE_CPU
+    # cpu-dev
+    - docker build --network='host' --tag $IMAGE_CPUDEV --build-arg BASE_IMG=ubuntu:20.04 --build-arg BZL_CONFIGS="" --build-arg KEEP_SRC_OTB=true .
+    - docker push $IMAGE_CPUDEV
+    # push images on dockerhub
+    - echo -n $DOCKERHUB_TOKEN | docker login -u mdl4eo --password-stdin
+    - docker tag $IMAGE_CPU $DOCKERHUB_CPU
+    - docker push $DOCKERHUB_CPU
+    - docker tag $IMAGE_CPUDEV $DOCKERHUB_CPUDEV
+    - docker push $DOCKERHUB_CPUDEV
+
+deploy_gpu:
+  extends: .ship base
+  variables:
+    IMAGE_GPU: $CI_REGISTRY_PUBIMG:gpu
+    IMAGE_GPUDEV: $CI_REGISTRY_PUBIMG:gpu-dev
+    IMAGE_GPUOPT: $CI_REGISTRY_PUBIMG:gpu-opt
+    IMAGE_GPUOPTDEV: $CI_REGISTRY_PUBIMG:gpu-opt-dev
+    DOCKERHUB_GPU: $DOCKERHUB_IMAGE_BASE:gpu
+    DOCKERHUB_GPUDEV: $DOCKERHUB_IMAGE_BASE:gpu-dev
+  script:
+    # gpu-opt
+    - docker build --network='host' --tag $IMAGE_GPUOPT --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 .
+    - docker push $IMAGE_GPUOPT
+    # gpu-opt-dev
+    - docker build --network='host' --tag $IMAGE_GPUOPTDEV --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 --build-arg KEEP_SRC_OTB=true .
+    - docker push $IMAGE_GPUOPTDEV
+    # gpu-basic
+    - docker build --network='host' --tag $IMAGE_GPU --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 --build-arg BZL_CONFIGS="" .
+    - docker push $IMAGE_GPU
+    # gpu-basic-dev
+    - docker build --network='host' --tag $IMAGE_GPUDEV --build-arg BZL_CONFIGS="" --build-arg BASE_IMG=nvidia/cuda:11.2.2-cudnn8-devel-ubuntu20.04 --build-arg KEEP_SRC_OTB=true .
+    - docker push $IMAGE_GPUDEV
+    # push gpu-basic* images on dockerhub
+    - echo -n $DOCKERHUB_TOKEN | docker login -u mdl4eo --password-stdin
+    - docker tag $IMAGE_GPU $DOCKERHUB_GPU
+    - docker push $DOCKERHUB_GPU
+    - docker tag $IMAGE_GPUDEV $DOCKERHUB_GPUDEV
+    - docker push $DOCKERHUB_GPUDEV
+