diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 0000000000000000000000000000000000000000..fee485d0b465a720847a86aa6c382e785ce23833
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,13 @@
+.git
+.gitlab
+build
+documentation
+mocks
+test
+.cobra.yaml
+.dockeringore
+.gitlab-ci.yaml
+ARCHITECTURE.md
+CONTRIBUTING.md
+Dockerfile.alpine
+README.md
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 391afe1b0cce65bd4d29734d34e8fae853075e2e..105784d85b11f231e4f6b2b3a7236f85673d9629 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,6 +1,8 @@
 variables:
-  SECURE_ANALYZERS_PREFIX: registry.gitlab.com/gitlab-org/security-products/analyzers
-  DOCKER_IMAGE_SHA: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
+  GOSDN_IMAGE: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
+  GOSDN_TESTING_IMAGE: "${CI_REGISTRY_IMAGE}:testing_${CI_COMMIT_SHA}"
+  CEOS_IMAGE: "$CI_REGISTRY_IMAGE/ceos:latest"
+  GOLANG_VERSION: "1.16"
 
 stages:
   - .pre
@@ -17,10 +19,6 @@ workflow:
       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: '/.gitlab/ci/.build-container.yml'
   - local: '/.gitlab/ci/.code-quality-ci.yml'
@@ -29,4 +27,4 @@ include:
   - 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'
+#  - local: '/.gitlab/ci/.deploy-k8s.yml'
diff --git a/.gitlab/ci/.build-container.yml b/.gitlab/ci/.build-container.yml
index 40066b9a85468bc75ec606ffacd543bcd37cddae..99c7cb1e20520343f459e89396936463537e2d84 100644
--- a/.gitlab/ci/.build-container.yml
+++ b/.gitlab/ci/.build-container.yml
@@ -1,17 +1,10 @@
-variables:
-  DOCKER_TLS_CERTDIR: "/certs"
-
-build-docker:
-  before_script:
-    - echo "override global before script"
+.build: &build
   stage: build
-  allow_failure: false
-  needs: []
+  image:
+    name: gcr.io/kaniko-project/executor:debug
+    entrypoint: [ "" ]
   variables:
     TAG: $CI_COMMIT_BRANCH
-  tags:
-    - shell-builder
-
   rules:
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
       variables:
@@ -21,17 +14,33 @@ build-docker:
         TAG: develop
         BUILDARGS: -race
     - when: always
-    - variables:
-        TAG: $CI_COMMIT_SHA
- 
+  before_script:
+      # replace all slashes in the tag with hyphen, because slashes are not allowed in tags
+    - TAG=${TAG//\//-}
+    - mkdir -p /kaniko/.docker
+    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}" >/kaniko/.docker/config.json
+  needs: []
+
+build-testing-image:
+  script:
+    - /kaniko/executor
+      --cache=true
+      --context "$CI_PROJECT_DIR"
+      --dockerfile "Dockerfile"
+      --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
+      --build-arg "BUILDARGS=$BUILDARGS"
+      --destination "$GOSDN_TESTING_IMAGE"
+      --target "installer"
+  <<: *build
+
+build-image:
   script:
-  # replace all slashes in the tag with hyphen, because slashes are not allowed in tags
-   - TAG=${TAG//\//-}
-   - TARGET=$CI_REGISTRY_IMAGE:$TAG
-   - 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 .
-   - docker push $DOCKER_IMAGE_SHA
-   - docker tag $DOCKER_IMAGE_SHA $TARGET
-   - docker push $TARGET
-   - docker build --target installer --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID} .
-   - docker push ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
+    - /kaniko/executor
+      --cache=true
+      --context "$CI_PROJECT_DIR"
+      --dockerfile "Dockerfile"
+      --build-arg "GOLANG_VERSION=$GOLANG_VERSION"
+      --build-arg "BUILDARGS=$BUILDARGS"
+      --destination "$GOSDN_IMAGE"
+      --destination "$CI_REGISTRY_IMAGE:$TAG"
+  <<: *build
diff --git a/.gitlab/ci/.code-quality-ci.yml b/.gitlab/ci/.code-quality-ci.yml
index 3236cb127f9c0073307f045f41f6313297622e88..dec181fcd6a0a091a2a368409530dedf2ed10316 100644
--- a/.gitlab/ci/.code-quality-ci.yml
+++ b/.gitlab/ci/.code-quality-ci.yml
@@ -9,3 +9,5 @@ code-quality:
       codequality: gl-code-quality-report.json
     paths:
       - gl-code-quality-report.json
+  needs: []
+  
\ No newline at end of file
diff --git a/.gitlab/ci/.containerlab-ci.yml b/.gitlab/ci/.containerlab-ci.yml
index 7123202ce1f3e02e744ef925e4c141d256ae4843..e459e6a8b48da4fa3d7275d1d9faf974cabdb26b 100644
--- a/.gitlab/ci/.containerlab-ci.yml
+++ b/.gitlab/ci/.containerlab-ci.yml
@@ -1,6 +1,4 @@
 variables:
-  CEOS_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE/ceos:latest"
-  GOSDN_CONTAINER_IMAGE: "${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}"
   CLAB_DIR: "/mnt"
   CLAB_NAME: "clab${CI_PIPELINE_IID}"
 
@@ -13,9 +11,9 @@ variables:
     - 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_CONTAINER_IMAGE}
-    - docker pull ${GOSDN_CONTAINER_IMAGE}
-    - docker pull ${CEOS_CONTAINER_IMAGE}
+    - echo ${GOSDN_IMAGE}
+    - docker pull ${GOSDN_IMAGE}
+    - docker pull ${CEOS_IMAGE}
 
 .containerlab_template: &containerlab_template
   image: alpine:latest
@@ -27,8 +25,8 @@ variables:
     - 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@@|${GOSDN_CONTAINER_IMAGE}|g" \
+      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
@@ -47,7 +45,7 @@ containerlab:template:integration:
 
 containerlab:deploy:integration:
   extends: .containerlab_deploy
-  needs: ["containerlab:template:integration", "build-docker"]
+  needs: ["containerlab:template:integration", "build-image"]
   script:
     - sudo containerlab deploy --topo ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml --reconfigure
     - |
@@ -77,7 +75,7 @@ containerlab:destroy:
   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}
+    - docker image rm -f ${GOSDN_IMAGE}
   allow_failure: true
   when: always
 
@@ -95,7 +93,7 @@ containerlab:destroy:
 #containerlab:deploy:develop:
 #  extends:
 #    - .containerlab_deploy
-#  needs: ["containerlab:template:develop", "build-docker"]
+#  needs: ["containerlab:template:develop", "build-image"]
 #  variables:
 #    CLAB_NAME: "dev"
 #    GOSDN_CONTAINER_IMAGE: "$CI_REGISTRY_IMAGE:develop"
diff --git a/.gitlab/ci/.deploy-k8s.yml b/.gitlab/ci/.deploy-k8s.yml
index 8f3458606261bff2f0c39a45eacfa20b2062d06f..bac4bcbbe1e466d32866bdef4690632cdf451121 100644
--- a/.gitlab/ci/.deploy-k8s.yml
+++ b/.gitlab/ci/.deploy-k8s.yml
@@ -1,6 +1,6 @@
 build:k8s-bot:
   stage: build
-  image: golang:1.16
+  image: golang:$GOLANG_VERSION
   rules:
     - if: $CI_COMMIT_BRANCH == "develop"
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
diff --git a/.gitlab/ci/.integration-test.yml b/.gitlab/ci/.integration-test.yml
index 64873357b3e3df9a954120b76bcf63d1620c59b9..1a09ae14e4153ac9acaf77d73b11772c9d9f6c60 100644
--- a/.gitlab/ci/.integration-test.yml
+++ b/.gitlab/ci/.integration-test.yml
@@ -1,5 +1,5 @@
 .integration-test: &integration-test
-  image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
+  image: $GOSDN_TESTING_IMAGE
   stage: integration-test
   needs:
     - job: "containerlab:deploy:integration"
diff --git a/.gitlab/ci/.test.yml b/.gitlab/ci/.test.yml
index b8cbe03a7fd44af3bc9ba4513e1e99c7c37416ac..81316ea511814332257554626a8962d0805a908c 100644
--- a/.gitlab/ci/.test.yml
+++ b/.gitlab/ci/.test.yml
@@ -1,19 +1,27 @@
 .test: &test
-  image: ${CI_REGISTRY_IMAGE}:testing_${CI_PIPELINE_ID}
+  image: $GOSDN_TESTING_IMAGE
   stage: test
   variables:
     GOSDN_LOG: "nolog"
     GOSDN_CHANGE_TIMEOUT: "100ms"
+  before_script:
+    - go get gotest.tools/gotestsum
+  artifacts:
+    when: always
+    reports:
+      junit: report.xml
+  needs:
+    - build-testing-image
 
 unit-test:
   script:
-    - go test -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out
+    - gotestsum --junitfile report.xml --format testname -- -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v -coverprofile=coverage.out 
+    # -short -race $(go list ./... | grep -v /forks/ | grep -v /mocks ) -v
   after_script:
     - go tool cover -func=coverage.out
   <<: *test
 
 controller-test:
-  image: golang:1.16
   script:
-    - go test -race -v -run TestRun
+    - gotestsum --junitfile report.xml --format testname -- -race -v -run TestRun
   <<: *test
diff --git a/.gitlab/ci/.uml-autogen-ci.yml b/.gitlab/ci/.uml-autogen-ci.yml
index 28ee54f267fe971524185099089dcffde1a07cca..cd7db4c9dceb8716b47f27401b940159157b26d3 100644
--- a/.gitlab/ci/.uml-autogen-ci.yml
+++ b/.gitlab/ci/.uml-autogen-ci.yml
@@ -1,5 +1,5 @@
 goplantuml:
-    image: golang:1.14
+    image: golang:$GOLANG_VERSION
     stage: .post
     only:
         - develop
diff --git a/Dockerfile b/Dockerfile
index dd077fc7c5b790e77d29ca9352c98bc4e59dd05c..48ab0f161f61439459a792aac584ee7c82132630 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,11 +1,7 @@
-FROM golang:1.16-buster AS installer
-ARG GITLAB_USER
-ARG GITLAB_TOKEN
+ARG GOLANG_VERSION=1.16
 ARG BUILDARGS
 
-RUN apt-get update && apt-get install -y git
-RUN git config --global url."https://$GITLAB_USER:$GITLAB_TOKEN@code.fbi.h-da.de".insteadOf "https://code.fbi.h-da.de"
-RUN go env -w GOPRIVATE=code.fbi.h-da.de/*
+FROM golang:$GOLANG_VERSION-buster AS installer
 
 WORKDIR /src/gosdn
 COPY go.* ./
@@ -13,17 +9,11 @@ RUN go mod download
 
 FROM installer as builder
 
-COPY *.go ./
-COPY ./api ./api
-COPY ./cmd ./cmd
-COPY ./interfaces ./interfaces
-COPY ./northbound ./northbound
-COPY ./nucleus ./nucleus
-COPY ./store ./store
+COPY . ./
 
 RUN GOOS=linux go build $BUILDARGS ./cmd/gosdn
 
-FROM debian:latest
+FROM debian:bullseye
 EXPOSE 8080
 EXPOSE 55055
 COPY --from=builder /src/gosdn/gosdn .