diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 1602977b91dedf617f521b72fd8239e1dd31e2e3..1ca81acf95e0e7ade693b0b2431b7962eedba884 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -3,76 +3,12 @@ variables:
 
 stages:
   - test
-  - compliance
-  - build
+  - documentation
 
 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"
 
-code-quality-master:
-  image: golangci/golangci-lint:latest-alpine
-  stage: test
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
-    - if: $CI_DEFAULT_BRANCH
-  script:
-    # writes golangci-lint output to gl-code-quality-report.json
-    - golangci-lint run --config .ci/.golangci-master.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
-
-
-code-quality:
-  image: golangci/golangci-lint:latest-alpine
-  stage: test
-  allow_failure: true
-  rules:
-    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
-  script:
-    # writes golangci-lint output to gl-code-quality-report.json
-    - golangci-lint run --config .ci/.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
-
-Documentation:
-  before_script:
-    - pwd
-  image:
-    name: pandoc/latex
-    entrypoint:
-    - ''
-  stage: build
-  rules:
-    - changes:
-      - documentation/design/*.md
-  script:
-  - cd documentation/design
-  - pandoc --filter pandoc-citeproc --bibliography=bibliography.bib --csl=acm-sig-proceedings.csl
-    --variable papersize=a4paper -s *.md -o documentation.pdf
-  artifacts:
-    paths:
-    - documentation/design/documentation.pdf
-
-sast:
-  variables:
-    SAST_ANALYZER_IMAGE_TAG: '2'
-    SAST_EXCLUDED_PATHS: spec, test, tests, tmp
-    SEARCH_MAX_DEPTH: '4'
-  stage: compliance
-
-license_scanning:
-  stage: compliance
-
-gemnasium-dependency_scanning:
-  stage: compliance
-
 include:
-  - template: Security/SAST.gitlab-ci.yml
-  - template: Dependency-Scanning.gitlab-ci.yml
-  - template: Security/License-Scanning.gitlab-ci.yml
+  - local: '/build/ci/.code-quality-ci.yml'
+  - local: '/build/ci/.documentation-ci.yml'
+  - local: '/build/ci/.security-and-compliance-ci.yml'
diff --git a/cliInterface/gosdnCLI.pb.go b/api/proto/gosdnCLI.pb.go
similarity index 100%
rename from cliInterface/gosdnCLI.pb.go
rename to api/proto/gosdnCLI.pb.go
diff --git a/cliInterface/gosdnCLI.proto b/api/proto/gosdnCLI.proto
similarity index 100%
rename from cliInterface/gosdnCLI.proto
rename to api/proto/gosdnCLI.proto
diff --git a/cliInterface/gosdnCLI_grpc.pb.go b/api/proto/gosdnCLI_grpc.pb.go
similarity index 100%
rename from cliInterface/gosdnCLI_grpc.pb.go
rename to api/proto/gosdnCLI_grpc.pb.go
diff --git a/build/ci/.code-quality-ci.yml b/build/ci/.code-quality-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ab2aa8d7b3f5a988e5827b08c82c5a32459bdd94
--- /dev/null
+++ b/build/ci/.code-quality-ci.yml
@@ -0,0 +1,30 @@
+code-quality-master:
+  image: golangci/golangci-lint:latest-alpine
+  stage: test
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == $CI_DEFAULT_BRANCH
+    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
+  script:
+    # writes golangci-lint output to gl-code-quality-report.json
+    - golangci-lint run --config build/ci/.golangci-config/.golangci-master.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
+
+
+code-quality:
+  image: golangci/golangci-lint:latest-alpine
+  stage: test
+  allow_failure: true
+  rules:
+    - if: $CI_PIPELINE_SOURCE == "merge_request_event" && $CI_MERGE_REQUEST_TARGET_BRANCH_NAME != $CI_DEFAULT_BRANCH
+  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/.documentation-ci.yml b/build/ci/.documentation-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..cd9bbc427f9afacd78c3f4ec6be1f3cf9544c844
--- /dev/null
+++ b/build/ci/.documentation-ci.yml
@@ -0,0 +1,44 @@
+documentation:pdf:
+  before_script:
+    - pwd
+  image:
+    name: pandoc/latex
+    entrypoint:
+    - ''
+  stage: documentation
+  rules:
+    - changes:
+      - documentation/design/*.md
+  script:
+  - cd documentation/design
+  - pandoc --filter pandoc-citeproc --bibliography=bibliography.bib --csl=acm-sig-proceedings.csl
+    --variable papersize=a4paper -s *.md -o documentation.pdf
+  artifacts:
+    paths:
+    - documentation/design/documentation.pdf
+
+.mdbook_common: &rust
+  before_script:
+      - cargo install mdbook
+  image:
+    name: rust:latest
+  stage: documentation
+  script:
+  - mdbook build documentation --dest-dir public
+  cache:
+    paths:
+    - /root/.cargo/
+
+documentation:static:
+  rules:
+    - if: '$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH'
+  artifacts:
+    paths:
+      - documentation/public
+    expire_in: 1 week
+  <<: *rust
+
+documentation:test:
+  rules:
+    - if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
+  <<: *rust
diff --git a/.ci/.golangci-master.yml b/build/ci/.golangci-config/.golangci-master.yml
similarity index 100%
rename from .ci/.golangci-master.yml
rename to build/ci/.golangci-config/.golangci-master.yml
diff --git a/.ci/.golangci.yml b/build/ci/.golangci-config/.golangci.yml
similarity index 100%
rename from .ci/.golangci.yml
rename to build/ci/.golangci-config/.golangci.yml
diff --git a/.ci/.runlint.sh b/build/ci/.golangci-config/.runlint.sh
similarity index 92%
rename from .ci/.runlint.sh
rename to build/ci/.golangci-config/.runlint.sh
index 224a4061c57de8f914c3fce374ce49f68b3b9062..7b0012a32e7d08ffa9de118104d51f8d129c6aee 100755
--- a/.ci/.runlint.sh
+++ b/build/ci/.golangci-config/.runlint.sh
@@ -1,4 +1,4 @@
 golangci-lint run\
   --config .ci/.golangci-master.yml\
   --out-format code-climate |\
-  jq -r '.[] | "\(.location.path):\(.location.lines.begin) \(.description)"'
\ No newline at end of file
+  jq -r '.[] | "\(.location.path):\(.location.lines.begin) \(.description)"'
diff --git a/build/ci/.security-and-compliance-ci.yml b/build/ci/.security-and-compliance-ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3e98b739e62763538a6e6fe0d5bcf9259b91fbbd
--- /dev/null
+++ b/build/ci/.security-and-compliance-ci.yml
@@ -0,0 +1,10 @@
+sast:
+  variables:
+    SAST_ANALYZER_IMAGE_TAG: '2'
+    SAST_EXCLUDED_PATHS: spec, test, tests, tmp
+    SEARCH_MAX_DEPTH: '4'
+
+include:
+  - template: Security/SAST.gitlab-ci.yml
+  - template: Dependency-Scanning.gitlab-ci.yml
+  - template: Security/License-Scanning.gitlab-ci.yml
diff --git a/gosdn-cli/gosdn-cli.go b/cmd/gosdn-cli/main.go
similarity index 99%
rename from gosdn-cli/gosdn-cli.go
rename to cmd/gosdn-cli/main.go
index bc6763c5b5777705815f93144674c4bc3a9dd4fb..7d5fba138033b12362ded30da3c24e7d8adcfecf 100644
--- a/gosdn-cli/gosdn-cli.go
+++ b/cmd/gosdn-cli/main.go
@@ -1,7 +1,7 @@
 package main
 
 import (
-	pb "code.fbi.h-da.de/cocsn/gosdn/cliInterface"
+	pb "code.fbi.h-da.de/cocsn/gosdn/api/proto"
 	"code.fbi.h-da.de/cocsn/gosdn/log"
 	"context"
 	"flag"
diff --git a/main.go b/cmd/gosdn/main.go
similarity index 100%
rename from main.go
rename to cmd/gosdn/main.go
diff --git a/clients.toml b/configs/clients.toml
similarity index 100%
rename from clients.toml
rename to configs/clients.toml
diff --git a/gosdn.toml b/configs/gosdn.toml
similarity index 71%
rename from gosdn.toml
rename to configs/gosdn.toml
index 7fe3795e751421e29f26eb7e02d9dc3571163a61..26d755b34702b3733efb841a7d0e3148e4d0a30c 100644
--- a/gosdn.toml
+++ b/configs/gosdn.toml
@@ -1,4 +1,4 @@
 #example gosdn.toml
 CliSocket       = "localhost:55055"
 DatabaseSocket  = "bolt://141.100.70.170:7687"
-ConfigPath      = "./gosdn.toml"
\ No newline at end of file
+ConfigPath      = "./configs/gosdn.toml"
diff --git a/database/database.go b/database/client.go
similarity index 100%
rename from database/database.go
rename to database/client.go
diff --git a/documentation/SUMMARY.md b/documentation/SUMMARY.md
new file mode 100644
index 0000000000000000000000000000000000000000..b528cff5f125ce637633ddfc2de3d8179241c91e
--- /dev/null
+++ b/documentation/SUMMARY.md
@@ -0,0 +1,7 @@
+# goSDN Documentation
+
+- [Introduction](design/01-introduction.md)
+- [Related Work](design/02-related-work.md)
+- [Theoretical Background](design/03-theoretical-background.md)
+- [Conceptual Design](design/04-conceptual-design.md)
+- [Implementation](design/05-implementation.md)
\ No newline at end of file
diff --git a/documentation/book.toml b/documentation/book.toml
new file mode 100644
index 0000000000000000000000000000000000000000..5fc5101df8827a1188fd8c26c6346633e470fcea
--- /dev/null
+++ b/documentation/book.toml
@@ -0,0 +1,10 @@
+[book]
+authors = ["Martin Stiemerling", "Manuel Kieweg", "Malte Bauch"]
+language = "en"
+multilingual = false
+src = "."
+
+[output.html]
+git-repository-url = "https://code.fbi.h-da.de/cocsn/gosdn"
+git-repository-icon = "fa-gitlab"
+site-url = "/public/"
\ No newline at end of file
diff --git a/nucleus/cli-handling.go b/nucleus/cli-handling.go
index 9c5886980801ba10d37d52ae46f7b90bfdad1575..5296e0e001312ef586cbdabec514d5a80f94820b 100644
--- a/nucleus/cli-handling.go
+++ b/nucleus/cli-handling.go
@@ -7,9 +7,9 @@
 package nucleus
 
 import (
-	pb "code.fbi.h-da.de/cocsn/gosdn/cliInterface"
+	pb "code.fbi.h-da.de/cocsn/gosdn/api/proto"
 	"code.fbi.h-da.de/cocsn/gosdn/log"
-	"code.fbi.h-da.de/cocsn/gosdn/restconf/client/ciena"
+	"code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/client/ciena"
 	"context"
 	"google.golang.org/grpc"
 	"net"
diff --git a/nucleus/controller.go b/nucleus/controller.go
index f5f0997efec9bb4272b25f7cf4475e0bdbc06f7c..5072dfbbdff572f9026e62a04a8e005c219cc3a0 100644
--- a/nucleus/controller.go
+++ b/nucleus/controller.go
@@ -4,7 +4,7 @@ import (
 	"code.fbi.h-da.de/cocsn/gosdn/database"
 	"code.fbi.h-da.de/cocsn/gosdn/log"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
-	"code.fbi.h-da.de/cocsn/gosdn/restconf/client/ciena"
+	"code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/client/ciena"
 	"github.com/BurntSushi/toml"
 	"os"
 )
@@ -74,7 +74,7 @@ func (c *Core) Shutdown() {
 
 func (c *Core) readControllerConfig(configFileController string) error {
 	if configFileController == "" {
-		configFileController = "gosdn.toml"
+		configFileController = "configs/gosdn.toml"
 	}
 	if _, err := os.Stat(configFileController); err != nil {
 		return err
@@ -93,7 +93,7 @@ func (c *Core) readControllerConfig(configFileController string) error {
 
 func (c *Core) readClientConfig(configFileClient string) error {
 	if configFileClient == "" {
-		configFileClient = "clients.toml"
+		configFileClient = "configs/clients.toml"
 	}
 	if _, err := os.Stat(configFileClient); err != nil {
 		return err
diff --git a/restconf/client/ciena/client.go b/sbi/restconf/client/ciena/client.go
similarity index 98%
rename from restconf/client/ciena/client.go
rename to sbi/restconf/client/ciena/client.go
index 072413d144f5b6db3944cd5984201cf9a02fc3d7..6e9a772c9cd56960e75544578249dbb7cb23aef7 100644
--- a/restconf/client/ciena/client.go
+++ b/sbi/restconf/client/ciena/client.go
@@ -5,7 +5,7 @@ import (
 	"code.fbi.h-da.de/cocsn/gosdn/database"
 	"code.fbi.h-da.de/cocsn/gosdn/log"
 	"code.fbi.h-da.de/cocsn/gosdn/nucleus/interfaces"
-	"code.fbi.h-da.de/cocsn/gosdn/restconf/util"
+	"code.fbi.h-da.de/cocsn/gosdn/sbi/restconf/util"
 	apiclient "code.fbi.h-da.de/cocsn/swagger/apis/mcp/client"
 	"crypto/tls"
 	"github.com/go-openapi/runtime"
diff --git a/restconf/util/unmarshal.go b/sbi/restconf/util/unmarshal.go
similarity index 100%
rename from restconf/util/unmarshal.go
rename to sbi/restconf/util/unmarshal.go