diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 78d4fbdd29dfd13411968c8f050bac9b732ed7d7..359c58968b128ab6a8e042c920da771253235b4e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,6 @@
 variables:
   SECURE_ANALYZERS_PREFIX: registry.gitlab.com/gitlab-org/security-products/analyzers
-  DOCKER_IMAGE_SHA: ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}
+  DOCKER_IMAGE_SHA: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
 
 workflow:
   rules:
@@ -31,4 +31,3 @@ include:
   - local: '/build/ci/.containerlab-ci.yml'
   - local: '/build/ci/.uml-autogen-ci.yml'
   - local: '/build/ci/.deploy-k8s.yml'
-
diff --git a/build/ci/.containerlab-ci.yml b/build/ci/.containerlab-ci.yml
index 9a06ec3b3aaf9e63b8f9f153126bb46e67b428c4..aa1528eff1bd676870ee454d79c49af5cdef8643 100644
--- a/build/ci/.containerlab-ci.yml
+++ b/build/ci/.containerlab-ci.yml
@@ -1,66 +1,86 @@
 variables:
   CEOS_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE/ceos:latest"
-  CLAB_INT1_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/int01.clab.yml"
-  CLAB_NAME: "clab${CI_PIPELINE_IID}"
+  GOSDN_CONTAINER_IMAGE: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
   CLAB_DIR: "/mnt"
+  CLAB_NAME: "clab${CI_PIPELINE_IID}"
 
+# Templates for Job Types
+.containerlab_deploy: &containerlab_deploy
+  stage: apply
+  tags:
+    - shell
+  before_script:
+    - cd ${CLAB_DIR}
+    - export PATH="${PATH}:${CI_PROJECT_DIR}/build/ci/scripts"
+    - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
+    - echo ${GOSDN_CONTAINER_IMAGE}
+    - docker pull ${GOSDN_CONTAINER_IMAGE}
+    - docker pull ${CEOS_CONTAINER_IMAGE}
 
-.containerlab_rules: &containerlab_rules
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop')
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-    - if: $CI_NIGHTLY
-
-
-containerlab:template:
-  extends: .containerlab_rules
+.containerlab_template: &containerlab_template
   image: alpine:latest
   stage: build
   before_script:
-    - echo "Override global before_script"
-  script:
-    - ./build/ci/generate_octet.sh $CI_COMMIT_SHA >> $(pwd)/firstOctet
-    - ./build/ci/generate_octet.sh $CI_PIPELINE_ID >> $(pwd)/secondOctet
-    - export firstOctet=$(cat $(pwd)/firstOctet)
-    - export secondOctet=$(cat $(pwd)/secondOctet)
+    - export PATH="${PATH}:${CI_PROJECT_DIR}/build/ci/scripts"
+    - firstOctet=$(generate_octet.sh $CI_COMMIT_SHA)
+    - secondOctet=$(generate_octet.sh $CI_PIPELINE_ID)
     - export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24"
+  script:
     - |
       sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_CONTAINER_IMAGE}|g" \
-          -e "s|@@GOSDN_CONTAINER_IMAGE@@|${DOCKER_IMAGE_SHA}|g" \
+          -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_CONTAINER_IMAGE}|g" \
           -e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \
           -e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \
-          ${CLAB_INT1_TEMPLATE} > ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
+          ${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml
     - cat ${CLAB_NAME}.clab.yml
   artifacts:
     name: ${CLAB_NAME}
     paths:
-      - ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
+      - ${CLAB_NAME}.clab.yml
 
-containerlab:deploy:
-  extends:
-    - .containerlab_rules
-  stage: apply
-  needs: ["containerlab:template", "build-docker"]
-  tags:
-    - shell
-  before_script:
-    - cd ${CLAB_DIR}
-    - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
-    - echo $DOCKER_IMAGE_SHA
-    - docker pull $DOCKER_IMAGE_SHA
-    - docker pull ${CEOS_CONTAINER_IMAGE}
+# JOBS
+containerlab:template:integration:
+  extends: .containerlab_template
+  variables:
+    CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/int01.clab.tmpl.yml"
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop')
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_NIGHTLY
+
+
+containerlab:deploy:integration:
+  extends: .containerlab_deploy
+  needs: ["containerlab:template:integration", "build-docker"]
   script:
     - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
-    - echo "GOSDN_HTTP_PORT=$(docker inspect -f '{{ (index (index .NetworkSettings.Ports "8080/tcp") 0).HostPort }}' clab-${CLAB_NAME}-gosdn)" >> ${CI_PROJECT_DIR}/build.env
-    - echo "GOSDN_GRPC_PORT=$(docker inspect -f '{{ (index (index .NetworkSettings.Ports "55055/tcp") 0).HostPort }}' clab-${CLAB_NAME}-gosdn)" >> ${CI_PROJECT_DIR}/build.env
-    - echo "CEOS1_PORT=$(docker inspect -f '{{ (index (index .NetworkSettings.Ports "6030/tcp") 0).HostPort }}' clab-${CLAB_NAME}-ceos1)" >> ${CI_PROJECT_DIR}/build.env
-  dependencies:
-    - containerlab:template
+    - |
+      echo -e "\
+      GOSDN_HTTP_PORT=$(docker_host_port 8080 clab-${CLAB_NAME}-gosdn)\n\
+      GOSDN_GRPC_PORT=$(docker_host_port 55055 clab-${CLAB_NAME}-gosdn)\n\
+      CEOS1_PORT=$(docker_host_port 6030 clab-${CLAB_NAME}-ceos1)" \
+      > ${CI_PROJECT_DIR}/build.env
+    - cat ${CI_PROJECT_DIR}/build.env
   artifacts:
     reports:
       dotenv: ${CI_PROJECT_DIR}/build.env
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop')
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+    - if: $CI_NIGHTLY
+
 
 containerlab:destroy:
+  stage: .post
+  tags:
+    - shell
+  before_script:
+    - cd ${CLAB_DIR}
+  script:
+    - sudo containerlab destroy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
+    - docker volume rm -f ${CLAB_NAME}-volume
+    - docker image rm -f ${GOSDN_CONTAINER_IMAGE}
+  allow_failure: true
   rules:
     - if: $CI_PIPELINE_SOURCE == "merge_request_event" && ($CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop')
       when: always
@@ -68,15 +88,44 @@ containerlab:destroy:
       when: always
     - if: $CI_NIGHTLY
       when: always
+
+
+containerlab:template:develop:
+  extends: .containerlab_template
+  variables:
+    CLAB_NAME: "dev"
+    CLAB_TEMPLATE: "${CI_PROJECT_DIR}/test/containerlab/dev.clab.tmpl.yml"
+    GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop"
+  rules:
+    - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null
+
+
+containerlab:deploy:develop:
+  extends:
+    - .containerlab_deploy
+  needs: ["containerlab:template:develop", "build-docker"]
+  variables:
+    CLAB_NAME: "dev"
+    GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop"
+  script:
+    - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
+  rules:
+    - if: $CI_COMMIT_BRANCH == 'develop' && $CI_NIGHTLY == null
+
+
+containerlab:clean:
   stage: .post
   tags:
     - shell
   before_script:
     - cd ${CLAB_DIR}
   script:
-    - sudo containerlab destroy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
-    - docker volume rm -f ${CLAB_NAME}-volume
-    - docker image rm -f ${DOCKER_IMAGE_SHA}
+    - docker kill $(docker ps -q) || true
+    - docker rm $(docker ps -a -q) || true
+    - docker rmi $(docker images | grep 'registry.code.fbi.h-da.de/danet/gosdn ' | awk '{print $3}') || true
+    - sudo rm -rf ${CLAB_DIR}/* || true
+    - sudo sed -i 's|.*clab.*||g' /etc/hosts
   allow_failure: true
-  dependencies:
-    - containerlab:template
+  rules:
+    - if: $CI_SCHEDULE_CLEAN
+      when: always
diff --git a/build/ci/.test.yml b/build/ci/.test.yml
index 27da996575feee87b94af17606b4bee2d435c7d8..9531c7717b98bc8d4da7f7aa748247827ce54c53 100644
--- a/build/ci/.test.yml
+++ b/build/ci/.test.yml
@@ -2,7 +2,7 @@
   image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
   stage: integration-test
   needs:
-    - job: "containerlab:deploy"
+    - job: "containerlab:deploy:integration"
   variables:
     GOSDN_LOG: "nolog"
     GOSDN_TEST_API_ENDPOINT: "141.100.70.178:${GOSDN_GRPC_PORT}"
@@ -18,7 +18,7 @@
 integration-test:nucleus:
   <<: *integration-test
   script:
-    - ${CI_PROJECT_DIR}/build/ci/wait-for-it.sh ${GOSDN_TEST_ENDPOINT} -s -t 180 -- echo "CEOS is up"
+    - ${CI_PROJECT_DIR}/build/ci/scripts/wait-for-it.sh ${GOSDN_TEST_ENDPOINT} -s -t 180 -- echo "CEOS is up"
     - cd ./test/integration
     - go test -race -v -run TestGnmi_SetIntegration
     - go test -race -v -run TestGnmi_GetIntegration
diff --git a/build/ci/scripts/docker_host_port.sh b/build/ci/scripts/docker_host_port.sh
new file mode 100644
index 0000000000000000000000000000000000000000..42ac183f4263c80e1120884b524233952b05e229
--- /dev/null
+++ b/build/ci/scripts/docker_host_port.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+TEMPLATE="{{ (index (index .NetworkSettings.Ports \"${1}/tcp\") 0).HostPort }}"
+docker inspect -f "${TEMPLATE}" ${2}
diff --git a/build/ci/generate_octet.bash b/build/ci/scripts/generate_octet.bash
similarity index 100%
rename from build/ci/generate_octet.bash
rename to build/ci/scripts/generate_octet.bash
diff --git a/build/ci/generate_octet.sh b/build/ci/scripts/generate_octet.sh
similarity index 100%
rename from build/ci/generate_octet.sh
rename to build/ci/scripts/generate_octet.sh
diff --git a/build/ci/wait-for-it.sh b/build/ci/scripts/wait-for-it.sh
similarity index 100%
rename from build/ci/wait-for-it.sh
rename to build/ci/scripts/wait-for-it.sh
diff --git a/test/containerlab/dev.clab.tmpl.yml b/test/containerlab/dev.clab.tmpl.yml
new file mode 100644
index 0000000000000000000000000000000000000000..985bd75394a310f93eac3dc276bcd10274126700
--- /dev/null
+++ b/test/containerlab/dev.clab.tmpl.yml
@@ -0,0 +1,30 @@
+# topology documentation: http://containerlab.srlinux.dev/lab-examples/srl-ceos/
+name: @@CLAB_NAME@@
+
+mgmt:
+  network: clab-@@CLAB_NAME@@
+  ipv4_subnet: @@CLAB_MGMT_SUBNET@@
+
+topology:
+  kinds:
+    ceos:
+      image: @@CEOS_CONTAINER_IMAGE@@
+  nodes:
+    ceos1:
+      kind: ceos
+    ceos2:
+      kind: ceos
+    ceos3:
+      kind: ceos
+
+    gosdn:
+      kind: linux
+      image: @@GOSDN_CONTAINER_IMAGE@@
+      ports:
+        - 8080:8080
+        - 55055:55055
+
+  links:
+    - endpoints: ["ceos1:eth1", "ceos2:eth1"]
+    - endpoints: ["ceos1:eth2", "ceos3:eth1"]
+    - endpoints: ["ceos2:eth2", "ceos3:eth2"]
diff --git a/test/containerlab/int01.clab.yml b/test/containerlab/int01.clab.tmpl.yml
similarity index 100%
rename from test/containerlab/int01.clab.yml
rename to test/containerlab/int01.clab.tmpl.yml