diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
index 8d3b0c9c3ac5a43f61799a6bdfea45d96d16e804..e914d3707d6d33d6de82c82d30d0419ce5a385b0 100644
--- a/.devcontainer/Dockerfile
+++ b/.devcontainer/Dockerfile
@@ -1,22 +1,42 @@
 # The devcontainer will be based on Python
 # The base container already has entrypoint, vscode user account, etc. out of the box
-FROM mcr.microsoft.com/devcontainers/python:3-bookworm
+FROM mcr.microsoft.com/vscode/devcontainers/base:bullseye
 
-# containelab version will be set in devcontainer.json
+# Containerlab version will be set in devcontainer.json
 ARG _CLAB_VERSION
 
-# install some basic tools inside the container
-# adjust this list based on your demands
+# Set permissions for mounts in devcontainer.json
+RUN mkdir /home/vscode/.vscode-server/
+RUN mkdir /home/vscode/.vscode-server/bin
+RUN chown -R vscode:vscode /home/vscode/.vscode-server
+
+# Update and install some basic tools inside the container
+# Adjust this list based on your demands
 RUN apt-get update \
+    && apt-get upgrade -y \
     && apt-get install -y --no-install-recommends \
     sshpass \
     curl \
     iputils-ping \
     htop \
+    zsh \
+    nano \
+    vim \
+    tmux \
+    nload \
+    yamllint \
     && rm -rf /var/lib/apt/lists/* \
     && rm -Rf /usr/share/doc && rm -Rf /usr/share/man \
     && apt-get clean
 
-# install preferred version of the containerlab
-RUN bash -c "$(curl -sL https://get.containerlab.dev)" -- -v ${_CLAB_VERSION} \
-    && pip3 install --user yamllint
+# Install oh-my-zsh for more terminal features and set is as primary shell
+ENV SHELL /bin/zsh
+RUN wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | zsh || true
+
+# Set editor
+RUN echo "export VISUAL='nano'" >> .zshrc
+RUN echo "export EDITOR='nano'" >> .zshrc
+
+# Install preferred version of the containerlab
+RUN bash -c "$(curl -sL https://get.containerlab.dev)" -- -v ${_CLAB_VERSION}
+    #&& pip3 install --user yamllint
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index cead6f4e83eb71387deac4e57a33b5322e990fd8..04456ca256fdb3f89734a22aaafef6cc7ad574a4 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,7 +1,7 @@
 // For format details, see https://aka.ms/devcontainer.json. For config options, see the
     // README at: https://github.com/devcontainers/templates/tree/main/src/python
     {
-        "name": "clab-for-arm",
+        "name": "goSDN-develop-clab-go",
         "build": {
             "dockerfile": "Dockerfile",
             "args": {
@@ -10,7 +10,7 @@
         },
         "features": {
             // Containerlab will run in a docker-in-docker container
-            // it is also possible to use docker-outside-docker feature
+            // It is also possible to use docker-outside-docker feature
             "ghcr.io/devcontainers/features/docker-in-docker:2.7.0": {
                 "version": "latest"
             },
@@ -18,7 +18,7 @@
                     "version": "1.21"
                 }
         },
-        // add any required extensions that must be pre-installed in the devcontainer
+        // Add any required extensions that must be pre-installed in the devcontainer
         "customizations": {
             "vscode": {
                 "extensions": [
@@ -27,8 +27,17 @@
 					"EditorConfig.EditorConfig",
 					"eamodio.gitlens",
 					"ms-vscode.makefile-tools",
-					"redhat.vscode-yaml"
+					"redhat.vscode-yaml",
+					"valentjn.vscode-ltex"
 				]
             }
-        }
+        },
+        "mounts": [
+            // Source: https://github.com/microsoft/vscode-remote-release/issues/5823
+            // Creates a named volume `vscode-home-dir` mounted to /home/vscode. Survives a rebuild.
+            // Creates an anonymous volume mounted to /home/vscode/.vscode-server. Gets destroyed on rebuild, which allows vscode to reinstall the extensions and dotfiles.
+            "source=vscode-home-dir,target=/home/vscode,type=volume",
+            "source=docker-root-config,target=/root/.docker,type=volume",
+            "target=/home/vscode/.vscode-server,type=volume",
+        ]
     }
diff --git a/.golangci.yml b/.golangci.yml
index 3310e8fad651ee579e72225dd716a7a9e598383f..05a93c5fd6dac9a09312a7d783db806137d8aa0a 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -2,8 +2,8 @@ variables:
     GOLANG_VERSION: "1.21"
 run:
     go: $GOLANG_VERSION
-    concurrency: 4
-    timeout: 15m
+    concurrency: 8
+    timeout: 20m
     issues-exit-code: 1
     # directories to be ignored by linters
     skip-dirs:
diff --git a/README.md b/README.md
index 3ab3886cee1b70166549d6af3cf3abd5687974c0..9afdfb4845438cf43c3453efcf2f80f4c659031a 100644
--- a/README.md
+++ b/README.md
@@ -188,12 +188,12 @@ For goSDN:
 - `defaultjwtduration`: duration of how long session tokens will be valid, provide an integer for the desired hours, example: 24 for tokens that should be valid for one day
 - `log-level`: set to `'debug'` for a better level of information
 - `help`: print the description of all available flags
-- `tlscertfile`: path to a signed certificate, if set goSDN will use this in combination with a key file to setup TLS connections with communication partners
-- `tlskeyfile`: path to a private key, if set goSDN will use this in combination with a signed cert file to setup TLS connections with communication partners
+- `tlscertfile`: path to a signed certificate, if set goSDN will use this in combination with a key file to set up TLS connections with communication partners
+- `tlskeyfile`: path to a private key, if set goSDN will use this in combination with a signed cert file to set up TLS connections with communication partners
 
 For the storage system:
 
-- `databaseconnection`: address of the database, only add this parameter if you want to use a database. Currently only mongoDB is supported.
+- `databaseconnection`: address of the database, only add this parameter if you want to use a database. Currently, only mongoDB is supported.
 - `filesystempathtostores`: set this path if the controller should use only the file store system, does not support all entities currently.\
 **Note**: if the database connection is set as well, this parameter will be ignored.
 - `plugin-folder`: path to where the plugins are/should be stored.
@@ -208,7 +208,7 @@ For the event system (RabbitMQ broker):
 
 For the plugin registry:
 
-- `plugin-registry`: ip adress and port of the plugin-registry
+- `plugin-registry`: IP address and port of the plugin-registry
 
 ---
 
@@ -227,28 +227,39 @@ Information about how to use the CLI is provided in the `cli` folder, see [here]
 
 ## Development Tutorial
 
-There are several options on how to create a dev environment. A more classic way or the option to use devcontainers with VSCode.
+There are several options on how to develop. There is the classic way to install everything on your machine or the option to use dev containers (locally or remotely) with VSCode.
 
-### Devcontainer - local
+### Dev container
 
 For this method you only need `docker` and `vscode` with the plugin `Dev Containers` from Microsoft installed.
 After you installed the required tools, you can simply open the folder in the dev container.
-Either you click on `Open in Container` if a pop-up appears on the bottom right, or by selecting `Open in Container` after clicking on `Remote Explorer` in the left bar in VSCode. Please note: depending on your internet connection and the performance of the device, the initial creation of the container can take several minuts or longer! Furthermore the initial git discovery of every submodule in this repo (if installed) can also take some minutes.
+Either you click on `Open in Container` if a pop-up appears on the bottom right, or by selecting `Open in Container` after clicking on `Remote Explorer` in the left bar in VSCode. Please note: depending on your internet connection and the performance of the device, the initial creation of the container can take several minutes or longer! Furthermore, the initial git discovery of every submodule in this repo (if installed) can also take some minutes.
 
-The devcontainer has everything you need in it (even relevant VSCode plugins), so you should not need anything more.
-Please keep in mind that this setup is not tested thoroughly!
+Keep in mind that containerlab also needs sudo in the dev container, so you need to log in via `sudo docker login registry.code.fbi.h-da.de`
 
-### Devcontainer - remote
+The dev container has everything you need in it (even relevant VSCode plugins), so you should not need anything more.
+As per the default configuration you will get access to a `zsh` shell with `oh-my-zsh` installed. Everything happening in your user home folder `/home/vscode` in the dev container is persistent in a docker volume. This means, that you can customize your `.zshrc` or configure a different shell. Your `zsh history` is also saved, but not synchronized with the history on your own machine. This is by design because of the idea of separation, but can be changed by mounting your local history file into the dev container.
 
-If for example your local device is not very performant, an ARM device or youw ant for other reasons use a remote device to develop, you can use the devcontainer setup remotely via SSH on a different device/server.
+The volume also means, that caches for things like `golang-ci lint` are persistent.
 
-TBD.
+Furthermore, the folder `/root/docker` is a persistent volume, so that `docker login` credentials for root (used by containerlab) are also persistent.
+
+
+### Dev container - remote
+
+If for example your local device is not very performant, an ARM device, or you want to use a remote device for other reasons to develop, you can use the dev container setup remotely via SSH on a different device/server.
+
+You will need the plugins `Remote Development` and `Dev Containers` for VSCode and the target host needs `docker` installed.
+Your local machine doesn't need docker!
+To use this setup, connect to a remote host via SSH. Afterwards, you can use the dev containers just as you would locally.
 
 ### Classic
 
 The classic installation requires `go`, `docker`, `docker compose` and `containerlab`.
 To help with developing there is a small script available, which helps to create the complete dev environment.
 
+### Create a dev environment
+
 For a quick start simply use `make start-dev-env` to start everything. This can take a while. Afterwards, you see the output of goSDN, to stop it hit Ctrl+C. To stop everything else use `make stop-dev-env`.
 
 If you want more control over your environment, you can use the `manage_virt_env.sh` script directly.
@@ -268,9 +279,9 @@ Example usages:
 
 `./scripts/manage_virt_env.sh --mode stop --topology dev_env_data/clab/basic_two_aristas.yaml`
 
-### Backup and restore your mongodb
+### Backup and restore your mongoDB
 
-If you are using the mongodb provided via the `docker-compose.yaml`, you can easily back up and restore your data via two scripts.
+If you are using the mongoDB provided via the `docker-compose.yaml`, you can easily back up and restore your data via two scripts.
 
 ```bash
 ./scripts/backup_mongo_volume.sh $(suffix_of_backup)
@@ -280,12 +291,12 @@ If you are using the mongodb provided via the `docker-compose.yaml`, you can eas
 ./scripts/restore_mongo_volume.sh $(suffix_of_backup)
 ```
 
-Keep in mind that a restore will restart the mongodb container.
+Keep in mind that a restore will restart the mongoDB container.
 
 ### Developing SDN applications
 
 To develop applications, we provide a framework that can be found [here](https://code.fbi.h-da.de/danet/gosdn/-/tree/master/application-framework) within this repository.
 
-The framework provides some basic code to easily setup the subscription to the event system of the controller, so that your application can get notified via the events published by the RabbitMQ server about information you would like to receive. This includes functions to register and subscribe to the used server. The information you receive includes changes on network elements like if a value of a YANG path changes or other changes like additions or deletions of entities.
+The framework provides some basic code to easily set up the subscription to the event system of the controller, so that your application can get notified via the events published by the RabbitMQ server about information you would like to receive. This includes functions to register and subscribe to the used server. The information you receive includes changes on network elements like if a value of a YANG path changes or other changes like additions or deletions of entities.
 
 Examples where the application framework is used can be found [here](https://code.fbi.h-da.de/danet/gosdn/-/tree/master/applications).