diff --git a/build/ci/.build-container.yml b/build/ci/.build-container.yml
index 3dcaaeec1eb75beeabfe3ef5f38d67fd304b280e..51e208283d1936345dddc03ed102a17fe7c1e63d 100644
--- a/build/ci/.build-container.yml
+++ b/build/ci/.build-container.yml
@@ -6,7 +6,7 @@ variables:
   DOCKER_TLS_CERTDIR: "/certs"
   DOCKER_IMAGE_SHA: $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
 
-.deploy: &deploy
+.build: &build
   before_script:
     - echo "override global before script"
   image: docker:19.03.12
@@ -18,54 +18,31 @@ variables:
       docker build \
         --build-arg GITLAB_USER=$GO_MODULES_USER \
         --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN \
-        -t $DOCKER_IMAGE_SHA .
+        -t $DOCKER_IMAGE_SHA $PATH
     - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
     - docker tag $DOCKER_IMAGE_SHA $TAG
     - docker push $TAG
 
-deploy:develop:
+build:develop:
   variables:
     TAG: $CI_REGISTRY_IMAGE:develop
-    HOOK: $PORTAINER_HOOK_DEVELOP
+    PATH: build/dockerfiles/staging
   rules:
     - if: $CI_COMMIT_BRANCH == "develop"
-  <<: *deploy
+  <<: *build
 
-deploy:latest:
+build:merge-request:
   variables:
-    TAG: $CI_REGISTRY_IMAGE:latest
-    HOOK: $PORTAINER_HOOK_LATEST
-  rules:
-    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
-  <<: *deploy
-
-.deploy:mr: &deploy-mr
-  before_script:
-    - echo "override global before script"
-  image: docker:19.03.12
-  stage: build
-  tags:
-    - dind
-  script:
-    - >
-      docker build \
-        --build-arg GITLAB_USER=$GO_MODULES_USER \
-        --build-arg GITLAB_TOKEN=$GO_MODULES_ACCESS_TOKEN \
-        -t $DOCKER_IMAGE_SHA .
-    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY
-    - docker tag $DOCKER_IMAGE_SHA $TAG
-    - docker push $TAG
-
-deploy:merge-request:master:
-  variables:
-    TAG: $CI_REGISTRY_IMAGE:mr-master
+    TAG: $CI_REGISTRY_IMAGE:merge-request
+    PATH: build/dockerfiles/staging
   rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
-  <<: *deploy-mr
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
+  <<: *build
 
-deploy:merge-mr:develop:
+build:latest:
   variables:
-    TAG: $CI_REGISTRY_IMAGE:mr-develop
+    TAG: $CI_REGISTRY_IMAGE:latest
+    PATH: build/dockerfiles/production
   rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
-  <<: *deploy-mr
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  <<: *build
\ No newline at end of file
diff --git a/build/ci/.terraform-ci.yml b/build/ci/.terraform-ci.yml
index 5a025809c65770b8eb17328c796af1155eaa31db..014c4502bcfe6126d5b6476f916d2eefc23953dc 100644
--- a/build/ci/.terraform-ci.yml
+++ b/build/ci/.terraform-ci.yml
@@ -21,12 +21,9 @@ cache:
     - export TF_VAR_tls_cert=${DOCKER_TLS_CERT}
     - export TF_VAR_tls_ca_cert=${DOCKER_TLS_CA}
   rules:
-    - 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 || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop')
       variables:
-        TF_VAR_container_tag: $CI_REGISTRY_IMAGE:mr-master
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
-      variables:
-        TF_VAR_container_tag: $CI_REGISTRY_IMAGE:mr-develop
+        TF_VAR_container_tag: $CI_REGISTRY_IMAGE:merge-request
     - if: $CI_COMMIT_BRANCH == "integration-test"
     - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
 
diff --git a/build/dockerfiles/production/Dockerfile b/build/dockerfiles/production/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..4e90a5a77bc40d69b7d43366173e76c3d6a251ef
--- /dev/null
+++ b/build/dockerfiles/production/Dockerfile
@@ -0,0 +1,18 @@
+FROM golang:1.15-alpine AS builder
+ARG GITLAB_USER
+ARG GITLAB_TOKEN
+WORKDIR /src/gosdn
+COPY . .
+RUN apk add 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 mod download
+RUN CGO_ENABLED=0 GOOS=linux go build ./cmd/gosdn
+
+FROM alpine:latest
+EXPOSE 8443
+EXPOSE 55055
+COPY --from=builder /src/gosdn/gosdn .
+COPY --from=builder /src/gosdn/configs ./configs
+
+ENTRYPOINT [ "./gosdn" ]
+CMD [""]
diff --git a/build/dockerfiles/staging/Dockerfile b/build/dockerfiles/staging/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..bb1503026edf39ef061288b7e60b2b5c68f5acea
--- /dev/null
+++ b/build/dockerfiles/staging/Dockerfile
@@ -0,0 +1,18 @@
+FROM golang:1.15-alpine AS builder
+ARG GITLAB_USER
+ARG GITLAB_TOKEN
+WORKDIR /src/gosdn
+COPY . .
+RUN apk add 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 mod download
+RUN CGO_ENABLED=0 GOOS=linux go build -race ./cmd/gosdn
+
+FROM alpine:latest
+EXPOSE 8443
+EXPOSE 55055
+COPY --from=builder /src/gosdn/gosdn .
+COPY --from=builder /src/gosdn/configs ./configs
+
+ENTRYPOINT [ "./gosdn" ]
+CMD [""]
diff --git a/nucleus/controller.go b/nucleus/controller.go
index bb928f4ae44ba399da1b7e3262e7700380eb546d..e8fb8413c499a85ae435c9c65a6c9474cf9f0cf5 100644
--- a/nucleus/controller.go
+++ b/nucleus/controller.go
@@ -47,19 +47,8 @@ func initialize() error {
 	}
 
 	// TODO: Start grpc listener here
-	if err := httpAPI(); err != nil {
-		return err
-	}
-
-	attachDatabase()
-
-	return nil
-}
 
-// deprecated
-// attachDatabase connects to the database and passes the connection to the controller core
-func attachDatabase() {
-	c.database = database.NewDatabaseClient()
+	return httpAPI()
 }
 
 // createSouthboundInterfaces initializes the controller with its supported SBIs
@@ -87,9 +76,11 @@ func createPrincipalNetworkDomain(sbi SouthboundInterface) error {
 // Run calls initialize to start the controller
 func Run(ctx context.Context) error {
 	var initError error
+	coreLock.Lock()
 	coreOnce.Do(func() {
 		initError = initialize()
 	})
+	coreLock.Unlock()
 	if initError != nil {
 		log.WithFields(log.Fields{}).Error(initError)
 		return initError
diff --git a/nucleus/http.go b/nucleus/http.go
index 41fea9aaa78245df4bf991451beb65743dc5b127..c4419fb7906b1b0d094725cc122db3c47ee12c68 100644
--- a/nucleus/http.go
+++ b/nucleus/http.go
@@ -9,12 +9,9 @@ import (
 	log "github.com/sirupsen/logrus"
 	"net/http"
 	"net/url"
-	"sync"
 	"time"
 )
 
-var httpOnce sync.Once
-
 func stopHttpServer() error {
 	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
 	defer cancel()
@@ -34,16 +31,11 @@ func registerHttpHandler() {
 }
 
 // deprecated
-func httpAPI() (err error) {
-	coreLock.Lock()
-	defer coreLock.Unlock()
-	httpOnce.Do(registerHttpHandler)
+func httpAPI() error {
+	registerHttpHandler()
 	c.httpServer = &http.Server{Addr: ":8080"}
 	go func() {
-		err = c.httpServer.ListenAndServe()
-		if err != nil {
-			return
-		}
+		log.Info(c.httpServer.ListenAndServe())
 	}()
 	return nil
 }
diff --git a/nucleus/inizalize_test.go b/nucleus/initialise_test.go
similarity index 98%
rename from nucleus/inizalize_test.go
rename to nucleus/initialise_test.go
index e551b4472352413e8af3cadb6dcabcef7ba9a3e5..16e0f2f02df749093da38d2278e787615ab1fcd8 100644
--- a/nucleus/inizalize_test.go
+++ b/nucleus/initialise_test.go
@@ -45,6 +45,12 @@ var gnmiAddress = "141.100.70.171:6030"
 // TODO: Move somewhere more sensible
 func TestMain(m *testing.M) {
 	log.SetReportCaller(true)
+
+
+	if os.Getenv("GOSDN_LOG") == "nolog" {
+		log.SetLevel(log.PanicLevel)
+	}
+
 	gnmiMessages = map[string]pb.Message{
 		"../test/proto/cap-resp-arista-ceos":                  &gpb.CapabilityResponse{},
 		"../test/proto/req-full-node":                         &gpb.GetRequest{},