diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fbfd9697a58c9f55d1d4dd8d2f98fd1e29cc4ea6..78d4fbdd29dfd13411968c8f050bac9b732ed7d7 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,8 +12,8 @@ workflow:
 
 stages:
   - .pre
-  - test
   - build
+  - test
   - apply
   - integration-test
   - deploy
@@ -29,5 +29,6 @@ include:
   - local: '/build/ci/.build-container.yml'
   - local: '/build/ci/.test.yml'
   - local: '/build/ci/.containerlab-ci.yml'
-  - local: '/build/ci/.deploy-k8s.yml'
   - local: '/build/ci/.uml-autogen-ci.yml'
+  - local: '/build/ci/.deploy-k8s.yml'
+
diff --git a/Dockerfile b/Dockerfile
index b8a7b9cab2bfcbec7da50a41abda0e0e445167cf..4233e034dff757050c178529ea8f9c429cf50e53 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,18 +1,34 @@
-FROM golang:1.16-buster AS builder
+FROM golang:1.16-buster AS installer
 ARG GITLAB_USER
 ARG GITLAB_TOKEN
 ARG BUILDARGS
-WORKDIR /src/gosdn
-COPY . .
+
 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"
+
+WORKDIR /src/gosdn
+COPY go.* ./
+RUN go mod download
+
+FROM installer as builder
+
+COPY controller.go .
+COPY http.go .
+COPY ./api ./api
+COPY ./cmd ./cmd
+COPY ./database ./database
+COPY ./forks ./forks
+COPY ./interfaces ./interfaces
+COPY ./northbound ./northbound
+COPY ./nucleus ./nucleus
+
 RUN GOOS=linux go build $BUILDARGS ./cmd/gosdn
 
 FROM debian:latest
 EXPOSE 8080
 EXPOSE 55055
 COPY --from=builder /src/gosdn/gosdn .
-COPY --from=builder /src/gosdn/configs ./configs
+COPY ./configs ./configs
 
 ENTRYPOINT [ "./gosdn" ]
 CMD [""]
diff --git a/build/ci/.build-container.yml b/build/ci/.build-container.yml
index 12dfb819df09e377633a89e1c7db23484925b2a0..642139656967655780033dc337cac8a420a10b5b 100644
--- a/build/ci/.build-container.yml
+++ b/build/ci/.build-container.yml
@@ -1,64 +1,40 @@
 variables:
   DOCKER_TLS_CERTDIR: "/certs"
 
-.build: &build
+build-docker:
   before_script:
     - echo "override global before script"
-  image: docker:19.03.12
-  services:
-  - name: docker:19.03.12-dind
-    command: ["--registry-mirror", "http://141.100.70.170:6000", "--dns", "1.1.1.1"]
   stage: build
+  allow_failure: false
+  needs: []
   tags:
-    - dind
-  script:
-    - docker info
-    - >
-      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 login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
-    - docker push $DOCKER_IMAGE_SHA
-    - docker tag $DOCKER_IMAGE_SHA $TAG
-    - docker tag $DOCKER_IMAGE_SHA registry.code.fbi.h-da.de/cocsn/gosdn:${CI_PIPELINE_ID}
-    - docker push $TAG
+    - shell-builder
 
-build:develop:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:develop
-    BUILDARGS: -race
   rules:
     - if: $CI_COMMIT_BRANCH == "develop" && $CI_NIGHTLY == null
-  <<: *build
-
-build:nightly:develop:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:nightly-develop
-    BUILDARGS: -race
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:develop
+        BUILDARGS: -race
     - if: $CI_NIGHTLY == "develop"
-  <<: *build
-
-build:nightly:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:nightly
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:nightly-develop
+        BUILDARGS: -race
     - if: $CI_NIGHTLY == "mainline"
-  <<: *build
-
-build:merge-request:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:merge-request
-    BUILDARGS: -race
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:nightly
     - if: $CI_PIPELINE_SOURCE == "merge_request_event"
-  <<: *build
-
-build:latest:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:latest
-  rules:
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:merge-request
+        BUILDARGS: -race
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_NIGHTLY == null
-  <<: *build
\ No newline at end of file
+      variables:
+        TAG: $CI_REGISTRY_IMAGE:latest
+      
+  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 .
+   - docker push $DOCKER_IMAGE_SHA
+   - docker tag $DOCKER_IMAGE_SHA $TAG
+   - docker push $TAG
+   - docker build --target installer --build-arg GITLAB_USER=$GO_MODULES_USER --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN --build-arg BUILDARGS=$BUILDARGS -t registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID} .
+   - docker push registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID}
\ No newline at end of file
diff --git a/build/ci/.containerlab-ci.yml b/build/ci/.containerlab-ci.yml
index dd69edc646669eec082e1974340839cc9f99dd47..f968e0a136f22c954d7d0077fafe1cee99924a86 100644
--- a/build/ci/.containerlab-ci.yml
+++ b/build/ci/.containerlab-ci.yml
@@ -48,12 +48,12 @@ containerlab:template:
     paths:
       - ${CI_PROJECT_DIR}/${CLAB_NAME}.clab.yml
 
-
 containerlab:deploy:
   extends:
     - .containerlab_template
     - .containerlab_rules
   stage: apply
+  needs: ["containerlab:template", "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
diff --git a/build/ci/.deploy-k8s.yml b/build/ci/.deploy-k8s.yml
index 9642ce0cac4f6cd0fc379fda9921c9e30f9fe61f..8f3458606261bff2f0c39a45eacfa20b2062d06f 100644
--- a/build/ci/.deploy-k8s.yml
+++ b/build/ci/.deploy-k8s.yml
@@ -27,7 +27,7 @@ deploy:develop:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:develop"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
@@ -37,7 +37,7 @@ deploy:latest:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:latest"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
@@ -47,7 +47,7 @@ deploy:nightly:mainline:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:latest"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
@@ -57,7 +57,7 @@ deploy:nightly:develop:
   <<: *deploy
   stage: deploy
   needs:
-    - job: "build:latest"
+    - job: "build-docker"
     - job: "build:k8s-bot"
       artifacts: true
   rules:
diff --git a/build/ci/.test.yml b/build/ci/.test.yml
index 65ef4b5e85f22990b2a7a5e5f652f052dab37f84..106d29b7893283c1d9751fd7c1aad12c7bf999c0 100644
--- a/build/ci/.test.yml
+++ b/build/ci/.test.yml
@@ -1,5 +1,5 @@
 .integration-test: &integration-test
-  image: golang:1.16
+  image: registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID}
   stage: integration-test
   needs:
     - job: "containerlab:deploy"
@@ -34,7 +34,7 @@ integration-test:api:
     - go test -race -v -run TestApiIntegration
 
 .test: &test
-  image: golang:1.16
+  image: registry.code.fbi.h-da.de/cocsn/gosdn:testing_${CI_PIPELINE_ID}
   stage: test
   allow_failure: true
   variables:
@@ -55,6 +55,7 @@ unit-test:
   <<: *test
 
 controller-test:
+  image: golang:1.16
   script:
     - go test -race -v -run TestRun
   <<: *test