diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 359c58968b128ab6a8e042c920da771253235b4e..391afe1b0cce65bd4d29734d34e8fae853075e2e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,14 +2,6 @@ variables:
   SECURE_ANALYZERS_PREFIX: registry.gitlab.com/gitlab-org/security-products/analyzers
   DOCKER_IMAGE_SHA: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
 
-workflow:
-  rules:
-    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
-    - if: '$CI_PIPELINE_SOURCE == "schedule"'
-    - if: '$CI_COMMIT_BRANCH && $CI_OPEN_MERGE_REQUESTS && $CI_PIPELINE_SOURCE == "push" && $CI_COMMIT_BRANCH != "develop" && $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH'
-      when: never
-    - if: '$CI_COMMIT_BRANCH'
-
 stages:
   - .pre
   - build
@@ -19,15 +11,22 @@ stages:
   - deploy
   - .post
 
+workflow:
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+      when: never
+    - when: always
+
 default:
   before_script:
     - git config --global url."https://$GO_MODULES_USER:$GO_MODULES_ACCESS_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
 
 include:
-  - local: '/build/ci/.code-quality-ci.yml'
-  - local: '/build/ci/.security-and-compliance-ci.yml'
-  - local: '/build/ci/.build-container.yml'
-  - local: '/build/ci/.test.yml'
-  - local: '/build/ci/.containerlab-ci.yml'
-  - local: '/build/ci/.uml-autogen-ci.yml'
-  - local: '/build/ci/.deploy-k8s.yml'
+  - local: '/.gitlab/ci/.build-container.yml'
+  - 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.yml'
+  - local: '/.gitlab/ci/.uml-autogen-ci.yml'
+  - local: '/.gitlab/ci/.deploy-k8s.yml'
diff --git a/build/ci/.build-container.yml b/.gitlab/ci/.build-container.yml
similarity index 61%
rename from build/ci/.build-container.yml
rename to .gitlab/ci/.build-container.yml
index 4631379e13ce426f68e53e45a0cbededb75f6d37..85c948fd1dbcc61b041e6320ab11864be283a4ff 100644
--- a/build/ci/.build-container.yml
+++ b/.gitlab/ci/.build-container.yml
@@ -7,32 +7,23 @@ build-docker:
   stage: build
   allow_failure: false
   needs: []
+  variables:
+    TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_BRANCH
   tags:
     - shell-builder
 
   rules:
-    - if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == null
-      variables:
-        TAG: $CI_REGISTRY_IMAGE:develop
-        BUILDARGS: -race
-    - if: $CI_NIGHTLY == "develop"
-      variables:
-        TAG: $CI_REGISTRY_IMAGE:nightly-develop
-        BUILDARGS: -race
-    - if: $CI_NIGHTLY == "mainline"
-      variables:
-        TAG: $CI_REGISTRY_IMAGE:nightly
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
-      variables:
-        TAG: $CI_REGISTRY_IMAGE:merge-request
-        BUILDARGS: -race
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_NIGHTLY == null
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
       variables:
         TAG: $CI_REGISTRY_IMAGE:latest
-    - if: '$CI_COMMIT_BRANCH'
+    - if: $CI_COMMIT_BRANCH == "develop"
       variables:
-        TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_BRANCH
-      
+        TAG: $CI_REGISTRY_IMAGE:develop
+        BUILDARGS: -race
+    - when: always
+    - variables:
+        TAG: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_NAME
+ 
   script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker build --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t $DOCKER_IMAGE_SHA .
diff --git a/.gitlab/ci/.code-quality-ci.yml b/.gitlab/ci/.code-quality-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3236cb127f9c0073307f045f41f6313297622e88
--- /dev/null
+++ b/.gitlab/ci/.code-quality-ci.yml
@@ -0,0 +1,11 @@
+code-quality:
+  image: golangci/golangci-lint:latest-alpine
+  stage: test
+  script:
+    # writes golangci-lint output to gl-code-quality-report.json
+    - golangci-lint run --config .gitlab/ci/.golangci-config/.golangci.yml --out-format code-climate | tee gl-code-quality-report.json
+  artifacts:
+    reports:
+      codequality: gl-code-quality-report.json
+    paths:
+      - gl-code-quality-report.json
diff --git a/build/ci/.containerlab-ci.yml b/.gitlab/ci/.containerlab-ci.yml
similarity index 63%
rename from build/ci/.containerlab-ci.yml
rename to .gitlab/ci/.containerlab-ci.yml
index db038c76a60d1f4f5d396f551dd30df08c95aabf..0c2c18c7bee3cc486eabf75020c92293876ebe70 100644
--- a/build/ci/.containerlab-ci.yml
+++ b/.gitlab/ci/.containerlab-ci.yml
@@ -11,7 +11,7 @@ variables:
     - shell
   before_script:
     - cd ${CLAB_DIR}
-    - export PATH="${PATH}:${CI_PROJECT_DIR}/build/ci/scripts"
+    - 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_CONTAINER_IMAGE}
     - docker pull ${GOSDN_CONTAINER_IMAGE}
@@ -21,7 +21,7 @@ variables:
   image: alpine:latest
   stage: build
   before_script:
-    - export PATH="${PATH}:${CI_PROJECT_DIR}/build/ci/scripts"
+    - 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"
@@ -43,10 +43,6 @@ 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:
@@ -64,16 +60,13 @@ containerlab:deploy:integration:
   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
+  needs: ["containerlab:deploy:integration", "integration-test:nucleus", "integration-test:api", "containerlab:template:integration"]
   before_script:
     - cd ${CLAB_DIR}
   script:
@@ -81,36 +74,30 @@ containerlab:destroy:
     - 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
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-      when: always
-    - if: $CI_NIGHTLY
-      when: always
+  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: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:
diff --git a/build/ci/.deploy-k8s.yml b/.gitlab/ci/.deploy-k8s.yml
similarity index 100%
rename from build/ci/.deploy-k8s.yml
rename to .gitlab/ci/.deploy-k8s.yml
diff --git a/build/ci/.golangci-config/.golangci.yml b/.gitlab/ci/.golangci-config/.golangci.yml
similarity index 89%
rename from build/ci/.golangci-config/.golangci.yml
rename to .gitlab/ci/.golangci-config/.golangci.yml
index e9ea64defdbb908d5d1892ff7f8351aaa6cc7a6a..1a2b9183717c0c1a95b8782e15a5189ee2059c10 100644
--- a/build/ci/.golangci-config/.golangci.yml
+++ b/.gitlab/ci/.golangci-config/.golangci.yml
@@ -27,13 +27,9 @@ linters:
   enable:
     - gofmt
     - goimports
+    - revive 
     - gocyclo
     - govet
-    - unused
-    - staticcheck
-    - typecheck
-    - revive
-    - whitespace
 issues:
   exclude-use-default: false
   max-issues-per-linter: 0
diff --git a/build/ci/.golangci-config/.runlint.sh b/.gitlab/ci/.golangci-config/.runlint.sh
similarity index 100%
rename from build/ci/.golangci-config/.runlint.sh
rename to .gitlab/ci/.golangci-config/.runlint.sh
diff --git a/.gitlab/ci/.integration-test.yml b/.gitlab/ci/.integration-test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..49ce918e3f88db7fff8fccbdd156c9f8f828d817
--- /dev/null
+++ b/.gitlab/ci/.integration-test.yml
@@ -0,0 +1,31 @@
+.integration-test: &integration-test
+  image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
+  stage: integration-test
+  needs:
+    - job: "containerlab:deploy:integration"
+  variables:
+    GOSDN_LOG: "nolog"
+    GOSDN_TEST_API_ENDPOINT: "141.100.70.178:${GOSDN_GRPC_PORT}"
+    GOSDN_TEST_ENDPOINT: "141.100.70.178:${CEOS1_PORT}"
+    GOSDN_TEST_USER: "admin"
+    GOSDN_TEST_PASSWORD: "admin"
+
+
+integration-test:nucleus:
+  <<: *integration-test
+  script:
+    - ${CI_PROJECT_DIR}/.gitlab/ci/scripts/wait-for-it.sh ${GOSDN_TEST_ENDPOINT} -s -t 180 -- echo "CEOS is up"
+    - sleep 30
+    - cd ./test/integration
+    - go test -race -v -run TestGnmi_SetIntegration
+    - go test -race -v -run TestGnmi_GetIntegration
+    - go test -race -v -run TestGnmi_SubscribeIntegration
+    - go test -race -v -run TestGnmi_CapabilitiesIntegration
+
+integration-test:api:
+  <<: *integration-test
+  variables:
+    K8S_OP: "getenv"
+  script:
+    - cd ./api
+    - go test -race -v -run TestApiIntegration
diff --git a/build/ci/.security-and-compliance-ci.yml b/.gitlab/ci/.security-and-compliance-ci.yml
similarity index 100%
rename from build/ci/.security-and-compliance-ci.yml
rename to .gitlab/ci/.security-and-compliance-ci.yml
diff --git a/.gitlab/ci/.test.yml b/.gitlab/ci/.test.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b8cbe03a7fd44af3bc9ba4513e1e99c7c37416ac
--- /dev/null
+++ b/.gitlab/ci/.test.yml
@@ -0,0 +1,19 @@
+.test: &test
+  image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
+  stage: test
+  variables:
+    GOSDN_LOG: "nolog"
+    GOSDN_CHANGE_TIMEOUT: "100ms"
+
+unit-test:
+  script:
+    - go test -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out
+  after_script:
+    - go tool cover -func=coverage.out
+  <<: *test
+
+controller-test:
+  image: golang:1.16
+  script:
+    - go test -race -v -run TestRun
+  <<: *test
diff --git a/build/ci/.uml-autogen-ci.yml b/.gitlab/ci/.uml-autogen-ci.yml
similarity index 100%
rename from build/ci/.uml-autogen-ci.yml
rename to .gitlab/ci/.uml-autogen-ci.yml
diff --git a/build/ci/scripts/docker_host_port b/.gitlab/ci/scripts/docker_host_port
similarity index 100%
rename from build/ci/scripts/docker_host_port
rename to .gitlab/ci/scripts/docker_host_port
diff --git a/build/ci/scripts/generate_octet.sh b/.gitlab/ci/scripts/generate_octet.sh
similarity index 93%
rename from build/ci/scripts/generate_octet.sh
rename to .gitlab/ci/scripts/generate_octet.sh
index 6cad5addc30badad963ee2e9d6dfe4f96fdc6aad..9d5dce7312a7ab516bd01d208ac961d5e23fe955 100755
--- a/build/ci/scripts/generate_octet.sh
+++ b/.gitlab/ci/scripts/generate_octet.sh
@@ -10,4 +10,4 @@ decimal_value=${decimal_value/-/}
 
 octet=$(((decimal_value % 255)))
 
-echo -n $octet
\ No newline at end of file
+echo -n $octet
diff --git a/build/ci/scripts/wait-for-it.sh b/.gitlab/ci/scripts/wait-for-it.sh
similarity index 100%
rename from build/ci/scripts/wait-for-it.sh
rename to .gitlab/ci/scripts/wait-for-it.sh
diff --git a/build/ci/.code-quality-ci.yml b/build/ci/.code-quality-ci.yml
deleted file mode 100644
index 3e5c205d954965a11da9e0961b1fc6aad8639c14..0000000000000000000000000000000000000000
--- a/build/ci/.code-quality-ci.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-code-quality:
-  image: golangci/golangci-lint:v1.42-alpine
-  stage: test
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-    - if: $CI_COMMIT_BRANCH == "develop"
-  script:
-    # writes golangci-lint output to gl-code-quality-report.json
-    - golangci-lint run --config build/ci/.golangci-config/.golangci.yml --out-format code-climate | tee gl-code-quality-report.json
-  artifacts:
-    reports:
-      codequality: gl-code-quality-report.json
-    paths:
-      - gl-code-quality-report.json
diff --git a/build/ci/.test.yml b/build/ci/.test.yml
deleted file mode 100644
index 9531c7717b98bc8d4da7f7aa748247827ce54c53..0000000000000000000000000000000000000000
--- a/build/ci/.test.yml
+++ /dev/null
@@ -1,61 +0,0 @@
-.integration-test: &integration-test
-  image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
-  stage: integration-test
-  needs:
-    - job: "containerlab:deploy:integration"
-  variables:
-    GOSDN_LOG: "nolog"
-    GOSDN_TEST_API_ENDPOINT: "141.100.70.178:${GOSDN_GRPC_PORT}"
-    GOSDN_TEST_ENDPOINT: "141.100.70.178:${CEOS1_PORT}"
-    GOSDN_TEST_USER: "admin"
-    GOSDN_TEST_PASSWORD: "admin"
-  rules:
-    - if: $CI_NIGHTLY
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
-      allow_failure: true
-
-integration-test:nucleus:
-  <<: *integration-test
-  script:
-    - ${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
-    - go test -race -v -run TestGnmi_SubscribeIntegration
-    - go test -race -v -run TestGnmi_CapabilitiesIntegration
-
-integration-test:api:
-  <<: *integration-test
-  variables:
-    K8S_OP: "getenv"
-  script:
-    - cd ./api
-    - go test -race -v -run TestApiIntegration
-
-.test: &test
-  image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
-  stage: test
-  allow_failure: true
-  variables:
-    GOSDN_LOG: "nolog"
-    GOSDN_CHANGE_TIMEOUT: "100ms"
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
-    - if: $CI_NIGHTLY
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH
-      allow_failure: true
-
-unit-test:
-  script:
-    - go test -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out
-  after_script:
-    - go tool cover -func=coverage.out
-  <<: *test
-
-controller-test:
-  image: golang:1.16
-  script:
-    - go test -race -v -run TestRun
-  <<: *test
diff --git a/build/ci/scripts/generate_octet.bash b/build/ci/scripts/generate_octet.bash
deleted file mode 100755
index 8becfc98b0c47025b445f7216ee935d37b2e4c88..0000000000000000000000000000000000000000
--- a/build/ci/scripts/generate_octet.bash
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-input=$1
-#trailing_backspace=$2
-
-hashed_value=$(echo $input | sha256sum | awk '{print $1}' )
-
-decimal_value=$((16#$hashed_value))
-decimal_value=${decimal_value/-/}
-
-octet=$(((decimal_value % 255)))
-
-echo -n $octet
\ No newline at end of file