diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7f9bc173870ede2c0fda21355d01f2f9af767c1d..fed5f03c6b2cb01eac321de8b9dd3ced6de83569 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,7 +8,6 @@ stages:
     - build
     - test
     - analyze
-    - apply
     - integration-test
     - build-release
     - .post
@@ -18,7 +17,7 @@ include:
     - local: "/.gitlab/ci/.code-quality-ci.yml"
     - local: "/.gitlab/ci/.security-and-compliance-ci.yml"
     - local: "/.gitlab/ci/.test.yml"
-    - local: "/.gitlab/ci/.containerlab-ci.yml"
+    - local: "/.gitlab/ci/.integration-test-containerlab.yml"
     - local: "/.gitlab/ci/.integration-test.yml"
     - local: "/.gitlab/ci/.uml-autogen-ci.yml"
     - local: "/.gitlab/ci/.build-release.yml"
diff --git a/.gitlab/ci/.containerlab-ci.yml b/.gitlab/ci/.containerlab-ci.yml
deleted file mode 100644
index 3b0c201e4b222782f60a3790be0f38f599544a4e..0000000000000000000000000000000000000000
--- a/.gitlab/ci/.containerlab-ci.yml
+++ /dev/null
@@ -1,129 +0,0 @@
-variables:
-    CLAB_DIR: "/mnt"
-    CLAB_NAME: "clab${CI_PIPELINE_IID}"
-
-# Templates for Job Types
-.containerlab_deploy: &containerlab_deploy
-    stage: apply
-    rules:
-        - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
-          when: never
-        - when: on_success
-    tags:
-        - shell
-    before_script:
-        - cd ${CLAB_DIR}
-        - export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/ci/scripts"
-        - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
-        - echo ${GOSDN_IMAGE}
-        - docker pull ${GOSDN_IMAGE}
-        - docker pull ${CEOS_IMAGE}
-
-.containerlab_template: &containerlab_template
-    image: ${CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX}/alpine:latest
-    stage: build
-    rules:
-        - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
-          when: never
-        - when: on_success
-    before_script:
-        - export PATH="${PATH}:${CI_PROJECT_DIR}/.gitlab/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_IMAGE}|g" \
-                -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \
-                -e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \
-                -e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \
-                ${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml
-        - cat ${CLAB_NAME}.clab.yml
-    artifacts:
-        name: ${CLAB_NAME}
-        paths:
-            - ${CLAB_NAME}.clab.yml
-
-# JOBS
-containerlab:template:integration:
-    extends: .containerlab_template
-    variables:
-        CLAB_TEMPLATE: "${CI_PROJECT_DIR}/controller/test/containerlab/int01.clab.tmpl.yml"
-
-containerlab:deploy:integration:
-    extends: .containerlab_deploy
-    needs: ["containerlab:template:integration", "build-image"]
-    script:
-        - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
-        - |
-            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
-
-containerlab:destroy:
-    rules:
-        - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
-          when: never
-        - when: always
-    stage: .post
-    tags:
-        - shell
-    needs:
-        [
-            "containerlab:deploy:integration",
-            "integration-test:nucleus",
-            "integration-test:api",
-            "containerlab:template:integration",
-        ]
-    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_IMAGE}
-    allow_failure: true
-
-#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-image"]
-#  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:
-        - 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}/clab-* || true
-        - sudo sed -i 's|.*clab.*||g' /etc/hosts
-    allow_failure: true
-    rules:
-        - if: $CI_SCHEDULE_CLEAN
-          when: always
diff --git a/.gitlab/ci/.integration-test-containerlab.yml b/.gitlab/ci/.integration-test-containerlab.yml
new file mode 100644
index 0000000000000000000000000000000000000000..000af8c0f052dfc3fdcf583e7f9f4c6c85f7c3f3
--- /dev/null
+++ b/.gitlab/ci/.integration-test-containerlab.yml
@@ -0,0 +1,84 @@
+variables:
+    CLAB_TEMPLATE: "${CI_PROJECT_DIR}/controller/test/containerlab/int01.clab.tmpl.yml"
+    CLAB_DIR: "/home/gitlab-runner/clab"
+    CLAB_NAME: "clab${CI_PIPELINE_IID}"
+
+containerlab-deploy:
+    stage: integration-test
+    rules:
+        - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
+          when: never
+        - when: on_success
+    tags:
+        - shell-containerlab
+    needs: ["build-image", "build-testing-image"]
+    script:
+        - firstOctet=$(python3 ${CI_PROJECT_DIR}/.gitlab/ci/scripts/generate_octet.py $CI_COMMIT_SHA)
+        - secondOctet=$(python3 ${CI_PROJECT_DIR}/.gitlab/ci/scripts/generate_octet.py $CI_PIPELINE_ID)
+        - export CLAB_MGMT_SUBNET="172.$firstOctet.$secondOctet.0/24"
+        - cd ${CLAB_DIR}
+        - ls -la
+        - |
+            sed -e "s|@@CEOS_CONTAINER_IMAGE@@|${CEOS_IMAGE}|g" \
+                -e "s|@@GOSDN_CONTAINER_IMAGE@@|${GOSDN_IMAGE}|g" \
+                -e "s|@@CLAB_NAME@@|${CLAB_NAME}|g" \
+                -e "s|@@CLAB_MGMT_SUBNET@@|${CLAB_MGMT_SUBNET}|g" \
+                ${CLAB_TEMPLATE} > ${CLAB_NAME}.clab.yml
+        - cat ${CLAB_NAME}.clab.yml
+        - echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
+        - echo ${GOSDN_IMAGE}
+        - docker pull ${GOSDN_IMAGE}
+        - docker pull ${CEOS_IMAGE}
+        - sudo containerlab deploy --topo ${CLAB_DIR}/${CLAB_NAME}.clab.yml --reconfigure
+        - |
+            echo -e "\
+            GOSDN_HTTP_PORT=$(${CI_PROJECT_DIR}/.gitlab/ci/scripts/docker_host_port 8080 clab-${CLAB_NAME}-gosdn)\n\
+            GOSDN_GRPC_PORT=$(${CI_PROJECT_DIR}/.gitlab/ci/scripts/docker_host_port 55055 clab-${CLAB_NAME}-gosdn)\n\
+            CEOS1_PORT=$(${CI_PROJECT_DIR}/.gitlab/ci/scripts/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
+
+
+containerlab-destroy:
+    rules:
+        - if: '$CI_PIPELINE_SOURCE != "merge_request_event"'
+          when: never
+        - when: always
+    stage: integration-test
+    tags:
+        - shell-containerlab
+    needs:
+        [
+            "containerlab-deploy",
+            "integration-test:nucleus",
+            "integration-test:api"
+
+        ]
+    before_script:
+        - cd ${CLAB_DIR}
+    script:
+        - sudo containerlab destroy --topo ${CLAB_DIR}/${CLAB_NAME}.clab.yml
+        - docker volume rm -f ${CLAB_NAME}-volume
+        - rm ${CLAB_DIR}/${CLAB_NAME}.clab.yml
+    allow_failure: true
+
+
+#containerlab:clean:
+#    stage: .post
+#    tags:
+#        - shell-containerlab
+#    before_script:
+#        - cd ${CLAB_DIR}
+#    script:
+#        - 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}/clab-* || true
+#        - sudo sed -i 's|.*clab.*||g' /etc/hosts
+#    allow_failure: true
+#    rules:
+#        - if: $CI_SCHEDULE_CLEAN
+#          when: always
diff --git a/.gitlab/ci/.integration-test.yml b/.gitlab/ci/.integration-test.yml
index 1069f78aa2aefbf7d99caa7bb4e1b3ea34aebb30..2f6ee1b73eb43fbfef02a8259ece988b7536f2a0 100644
--- a/.gitlab/ci/.integration-test.yml
+++ b/.gitlab/ci/.integration-test.yml
@@ -6,13 +6,11 @@
           when: never
         - when: on_success
     needs:
-        - job: "containerlab:deploy:integration"
-    tags:
-        - integration-test-docker
+        ["containerlab-deploy"]
     variables:
         GOSDN_LOG: "nolog"
-        GOSDN_TEST_API_ENDPOINT: "${CI_SERVER_IP}:${GOSDN_GRPC_PORT}"
-        CEOS_TEST_ENDPOINT: "${CI_SERVER_IP}:${CEOS1_PORT}"
+        GOSDN_TEST_API_ENDPOINT: "10.254.254.105:${GOSDN_GRPC_PORT}"
+        CEOS_TEST_ENDPOINT: "10.254.254.105:${CEOS1_PORT}"
         GOSDN_TEST_USER: "admin"
         GOSDN_TEST_PASSWORD: "admin"
 
@@ -30,3 +28,9 @@ integration-test:api:
     script:
         - cd controller/
         - make integration-test-api
+
+integration-test:cli:
+    <<: *integration-test
+    script:
+        - cd cli/
+        - echo "Your tests here"
diff --git a/.gitlab/ci/scripts/docker_host_port b/.gitlab/ci/scripts/docker_host_port
old mode 100644
new mode 100755
diff --git a/.gitlab/ci/scripts/generate_octet.py b/.gitlab/ci/scripts/generate_octet.py
new file mode 100755
index 0000000000000000000000000000000000000000..a0005706c869f2e5b2c63e9c8ff3ed508d86e73e
--- /dev/null
+++ b/.gitlab/ci/scripts/generate_octet.py
@@ -0,0 +1,19 @@
+import sys
+from hashlib import sha256
+
+input_data = sys.argv[1]
+
+# Hash input and store it as string
+hashed_string = sha256(bytes(input_data, encoding='utf8')).hexdigest()
+
+final_string = ""
+
+# Iterate over hash and take out all chars that are a number
+for character in hashed_string:
+    if character.isdigit():
+        final_string += character
+
+final_int = int(final_string)
+
+# Print number mod 256 to get a number between 0 and 255 for ip adress
+print(final_int % 256)
diff --git a/.gitlab/ci/scripts/generate_octet.sh b/.gitlab/ci/scripts/generate_octet.sh
deleted file mode 100755
index c45a368391175ea3bb39a1b09a2efc622ee56159..0000000000000000000000000000000000000000
--- a/.gitlab/ci/scripts/generate_octet.sh
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-
-input=$1
-
-hashed_value=$(echo $input | sha256sum | awk '{print $1}' )
-
-decimal_value=$((16#$hashed_value))
-decimal_value=${decimal_value/-/}
-
-octet=$(((decimal_value % 255)))
-
-echo -n $octet
diff --git a/controller/api/initialise_test.go b/controller/api/initialise_test.go
index abd0d518d4452c62c012a5e6a707289c6e690d60..499cb033e625ea7b157dd4fae9a00891a92db0e0 100644
--- a/controller/api/initialise_test.go
+++ b/controller/api/initialise_test.go
@@ -118,7 +118,7 @@ func bufDialer(context.Context, string) (net.Conn, error) {
 
 const testPath = "/system/config/hostname"
 
-var testAddress = "141.100.70.170:6030"
+var testAddress = "10.254.254.105:6030"
 var testAPIEndpoint = "gosdn-latest.apps.ocp.fbi.h-da.de"
 var testUsername = "admin"
 var testPassword = "arista"
diff --git a/controller/test/integration/nucleusIntegration_test.go b/controller/test/integration/nucleusIntegration_test.go
index 689c02c30c68353fe11bd6046728244e9094d364..402c2c94e7860ea485cf373f9c00f1664b29ffc3 100644
--- a/controller/test/integration/nucleusIntegration_test.go
+++ b/controller/test/integration/nucleusIntegration_test.go
@@ -29,7 +29,7 @@ const unreachable = "203.0.113.10:6030"
 const testPath = "/system/config/hostname"
 
 var modifiedHostname = "ceos3000"
-var testAddress = "141.100.70.170:6030"
+var testAddress = "10.254.254.105:6030"
 var testUsername = "admin"
 var testPassword = "arista"
 var opt *tpb.TransportOption