diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7b2885e9cf11a5bdb710a07bf639511810320b53..43392807c3d88aed530af1314dbec75879e5257c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,9 +1,15 @@
+
+# THIS FILE IS AUTOGENERATED BY THE DEVENVSHELL
+# DO NOT EDIT THIS FILE MANUALLY
+# INSTEAD EDIT THE DEVENVSHELL CONFIGURATION FILE devenv.nix
+# AND OPEN A SHELL WITH THE COMMAND devenv shell
+#
+
 image: docker-registry.schukai.com:443/nixos-ci-devenv:latest
 
 services:
   - docker:dind
 
-
 variables:
   # The repo name as used in
   # https://github.com/nix-community/NUR/blob/master/repos.json
@@ -13,7 +19,6 @@ variables:
   DOCKER_DRIVER: overlay2
   GIT_DEPTH: 10
 
-
 stages:
   - test
   - deploy 
diff --git a/Taskfile.yml b/Taskfile.yml
index 7febe83e7b63269468299d999d7aac31118ef44f..b7313f4d13319627727838e8df5302c52eefc042 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -1,3 +1,10 @@
+
+# THIS FILE IS AUTOGENERATED BY THE DEVENVSHELL
+# DO NOT EDIT THIS FILE MANUALLY
+# INSTEAD EDIT THE DEVENVSHELL CONFIGURATION FILE devenv.nix 
+# AND OPEN A SHELL WITH THE COMMAND devenv shell
+#
+# Information about the task runner can be found here:
 # https://taskfile.dev
 
 version: '3'
@@ -5,13 +12,16 @@ version: '3'
 tasks:
   default:
     cmds:
-      - task --list-all
+      - task --list
     silent: true
+    
   test:
     desc: Execute unit tests in Go.
-    cmds:  
+    cmds:
       - echo "Execute unit tests in Go."
       - go test -cover -v ./...
+      - go test -bench -v ./...
+      - go test -race -v ./...
 
   test-fuzz:
     desc: Conduct fuzzing tests.#
@@ -23,8 +33,15 @@ tasks:
     desc: Attach license headers to Go files.
     cmds:
       - echo "Attach license headers to Go files."
+      - go install github.com/google/addlicense@latest
       - addlicense -c "schukai GmbH" -s -l "AGPL-3.0" ./*.go
     silent: true
+    
+  check-licenses:
+    desc: Check license headers of Go files.
+    silent: true
+    cmds:
+      - go-licenses save "$(get-go-default-packages)"  --ignore "gitlab.schukai.com"  --force --save_path ${DEVENV_ROOT}/licenses/
 
   check:
     desc: Confirm repository status.
@@ -32,17 +49,11 @@ tasks:
       - git diff-index --quiet HEAD || (echo "There are uncommitted changes after running make. Please commit or stash them before running make."; exit 1)
     silent: true
 
-  build:
-    desc: Compile the application,
+  commit:
+    desc: Commit changes to the repository.
     aliases:
-      - b
-    vars:
-      DEVENV_ROOT:
-        sh: echo "$DEVENV_ROOT"
-    
+      - c
+      - ci
+      - git-commit
     cmds:
-      - devenv shell build-app
-    sources:
-      - source/**/*.go
-      - source/**/*.mod
-      - dist/**      
+      - do-git-commit
diff --git a/devenv.nix b/devenv.nix
index 2568f0c76e7a3ebc2003ee009c7d0bfa6dc3e41c..efd4d9b7b93079d1aa4247ee0d940d5fe8f465b6 100644
--- a/devenv.nix
+++ b/devenv.nix
@@ -1,149 +1,638 @@
-{ pkgs, inputs, phps, lib, config, modulesPath,... }:
+{ pkgs, inputs, phps, lib, config, modulesPath, ... }:
 
 {
-
   # https://devenv.sh/packages/
-  packages = [
+  packages = with pkgs; [
     inputs.version.defaultPackage."${builtins.currentSystem}"
-    pkgs.git
-    pkgs.gcc12
-    pkgs.go-task
-    pkgs.blackbox
-    pkgs.blackbox-terminal
-    pkgs.jq
-    pkgs.delve
-    pkgs.gdlv
-    pkgs.wget
-    pkgs.glab
-    pkgs.unixtools.xxd
-    pkgs.libffi
-    pkgs.zlib
-    pkgs.procps
-    pkgs.php81Extensions.xdebug
-    pkgs.ranger
-    pkgs.meld
-    pkgs.gnused
-    pkgs.coreutils-full
-    pkgs.gnugrep
-    pkgs.gnumake
-    pkgs.util-linux
-    pkgs.httpie
-    pkgs.netcat
-    pkgs.memcached
-    pkgs.fd    
+    appimage-run
+    blackbox
+    blackbox-terminal
+    coreutils-full
+    dbeaver
+    delve
+    dialog
+    drill
+    exa
+    fd
+    fd
+    gcc12
+    gdlv
+    git
+    glab
+    gnugrep
+    gnumake
+    gnused
+    go-licenses
+    go-task
+    gum
+    httpie
+    hurl
+    jq
+    libffi
+    logrotate
+    meld
+    memcached
+    netcat
+    nixfmt
+    procps
+    ranger
+    unixtools.xxd
+    unzip
+    util-linux
+    wget
+    zlib
   ];
 
-
   # https://devenv.sh/languages/
   # languages.nix.enable = true;
-  languages = {
-    go = { enable = true; };
-  };
-  
-   difftastic.enable = true;
+  languages = { go = { enable = true; }; };
+
+  difftastic.enable = true;
+
+  scripts.get-go-default-packages.exec = ''
+    #!${pkgs.bash}/bin/bash
+    echo $(awk -F ' ' '/^module / { print $2 }' go.mod)
+  '';
 
-    
   # This script is executed when the app is built
   # You can use it to build the app  
-  scripts.test-lib.exec =  ''
-#!${pkgs.bash}/bin/bash
-#set -euo pipefail
-set -x
-
-PATH="''${PATH}":${pkgs.coreutils}/bin
-PATH="''${PATH}":${pkgs.findutils}/bin
-PATH="''${PATH}":${pkgs.jq}/bin/
-PATH="''${PATH}":${pkgs.rsync}/bin/
-PATH="''${PATH}":${pkgs.bash}/bin/
-PATH="''${PATH}":${pkgs.curl}/bin/
-PATH="''${PATH}":${pkgs.moreutils}/bin/
-PATH="''${PATH}":${pkgs.gnutar}/bin
-PATH="''${PATH}":${pkgs.gzip}/bin/
-PATH="''${PATH}":${pkgs.procps}/bin/
-PATH="''${PATH}":${pkgs.exa}/bin/
-PATH="''${PATH}":${pkgs.git}/bin/
-PATH="''${PATH}":${pkgs.gnugrep}/bin/
-PATH="''${PATH}":${inputs.version.defaultPackage."${builtins.currentSystem}"}/bin/
-
-export -f PATH
-
-task test
-
-'';
+  scripts.test-lib.exec = ''
+    #!${pkgs.bash}/bin/bash
+    #set -euo pipefail
+    set -x
+
+    PATH="''${PATH}":${pkgs.coreutils}/bin
+    PATH="''${PATH}":${pkgs.findutils}/bin
+    PATH="''${PATH}":${pkgs.jq}/bin/
+    PATH="''${PATH}":${pkgs.rsync}/bin/
+    PATH="''${PATH}":${pkgs.bash}/bin/
+    PATH="''${PATH}":${pkgs.curl}/bin/
+    PATH="''${PATH}":${pkgs.moreutils}/bin/
+    PATH="''${PATH}":${pkgs.gnutar}/bin
+    PATH="''${PATH}":${pkgs.gzip}/bin/
+    PATH="''${PATH}":${pkgs.procps}/bin/
+    PATH="''${PATH}":${pkgs.exa}/bin/
+    PATH="''${PATH}":${pkgs.git}/bin/
+    PATH="''${PATH}":${pkgs.gnugrep}/bin/
+    PATH="''${PATH}":${
+      inputs.version.defaultPackage."${builtins.currentSystem}"
+    }/bin/
+
+    export PATH
+
+    task test
+
+  '';
 
   # This scritp is used to deploy the app to the gitlab registry
   # It is used by the gitlab-ci.yml file
   # The environment variables are set in the gitlab project settings
-  scripts.deploy-lib.exec =  ''
-#!${pkgs.bash}/bin/bash
-
-PATH="''${PATH}":${pkgs.coreutils}/bin
-PATH="''${PATH}":${pkgs.jq}/bin/
-PATH="''${PATH}":${pkgs.curl}/bin/
-PATH="''${PATH}":${pkgs.moreutils}/bin/
-PATH="''${PATH}":${pkgs.gnutar}/bin
-PATH="''${PATH}":${pkgs.gzip}/bin/
-PATH="''${PATH}":${pkgs.exa}/bin/
-PATH="''${PATH}":${pkgs.git}/bin/
-PATH="''${PATH}":${inputs.version.defaultPackage."${builtins.currentSystem}"}/bin/
-
-export PATH
-
-if [[ -f .env-gitlab-ci ]]; then
-    source .env-gitlab-ci
-    rm .env-gitlab-ci
-fi
-
-set -x
-## if $HOME not set, set it to current directory
-if [[ -z "''${HOME}" ]]; then
-    HOME=$(pwd)
-fi
-
-export HOME
-
-git config user.email "''${GITLAB_USER_EMAIL}"
-git config user.name "''${GITLAB_USER_NAME:-"Gitlab CI"}"
-git config pull.rebase true
-git config http.sslVerify "false"
-git remote set-url origin https://pad:''${GITLAB_TOKEN}@''${CI_REPOSITORY_URL#*@}
-
-git fetch --all --tags --unshallow
-git reset --hard origin/master
-git checkout $CI_COMMIT_REF_NAME
-git pull origin $CI_COMMIT_REF_NAME
-
-if [ ! -z "''${CI_PROJECT_DIR}" ]; then
-    echo "CI_PROJECT_DIR is set, using it as project root."
-    project_root=$(realpath "''${CI_PROJECT_DIR}")/
-elif [ ! -z "''${DEVENV_ROOT}" ]; then
-    echo "DEVENV_ROOT is set, using it as project root."
-    project_root=$(realpath "''${DEVENV_ROOT}")/
-else
-    echo "Error: DEVENV_ROOT or CI_PROJECT_DIR environment variables are not set."
-    exit 1  
-fi
-
-if [ ! -d "''${project_root}" ]; then
-    echo "Error: Project root directory does not seem to be valid."
-    echo "Check the DEVENV_ROOT or CI_PROJECT_DIR environment variables."
-    exit 1
-fi
-
-if [ -z "'CI_JOB_TOKEN" ]; then
-    echo "Error: CI_JOB_TOKEN variable is not set."
-    exit 1
-fi
-
-git --no-pager log --decorate=short --pretty=oneline
-gitVersion=v$(version predict)
-git tag -a $gitVersion -m"chore: bump version" 
-git --no-pager log --decorate=short --pretty=oneline
-git push -o ci.skip origin ''${CI_COMMIT_REF_NAME} --tags
-
-echo "done"
-
-'';
+  scripts.deploy-lib.exec = ''
+    #!${pkgs.bash}/bin/bash
+
+    PATH="''${PATH}":${pkgs.coreutils}/bin
+    PATH="''${PATH}":${pkgs.jq}/bin/
+    PATH="''${PATH}":${pkgs.curl}/bin/
+    PATH="''${PATH}":${pkgs.moreutils}/bin/
+    PATH="''${PATH}":${pkgs.gnutar}/bin
+    PATH="''${PATH}":${pkgs.gzip}/bin/
+    PATH="''${PATH}":${pkgs.exa}/bin/
+    PATH="''${PATH}":${pkgs.git}/bin/
+    PATH="''${PATH}":${
+      inputs.version.defaultPackage."${builtins.currentSystem}"
+    }/bin/
+
+    export PATH
+
+    if [[ -f .env-gitlab-ci ]]; then
+        source .env-gitlab-ci
+        rm .env-gitlab-ci
+    fi
+
+    set -x
+    ## if $HOME not set, set it to current directory
+    if [[ -z "''${HOME}" ]]; then
+        HOME=$(pwd)
+    fi
+
+    export HOME
+
+    git config user.email "''${GITLAB_USER_EMAIL}"
+    git config user.name "''${GITLAB_USER_NAME:-"Gitlab CI"}"
+    git config pull.rebase true
+    git config http.sslVerify "false"
+    git remote set-url origin https://pad:''${GITLAB_TOKEN}@''${CI_REPOSITORY_URL#*@}
+
+    git fetch --all --tags --unshallow
+    git reset --hard origin/master
+    git checkout $CI_COMMIT_REF_NAME
+    git pull origin $CI_COMMIT_REF_NAME
+
+    if [ ! -z "''${CI_PROJECT_DIR}" ]; then
+        echo "CI_PROJECT_DIR is set, using it as project root."
+        project_root=$(realpath "''${CI_PROJECT_DIR}")/
+    elif [ ! -z "''${DEVENV_ROOT}" ]; then
+        echo "DEVENV_ROOT is set, using it as project root."
+        project_root=$(realpath "''${DEVENV_ROOT}")/
+    else
+        echo "Error: DEVENV_ROOT or CI_PROJECT_DIR environment variables are not set."
+        exit 1  
+    fi
+
+    if [ ! -d "''${project_root}" ]; then
+        echo "Error: Project root directory does not seem to be valid."
+        echo "Check the DEVENV_ROOT or CI_PROJECT_DIR environment variables."
+        exit 1
+    fi
+
+    if [ -z "'CI_JOB_TOKEN" ]; then
+        echo "Error: CI_JOB_TOKEN variable is not set."
+        exit 1
+    fi
+
+    git --no-pager log --decorate=short --pretty=oneline
+    gitVersion=v$(version predict)
+    git tag -a $gitVersion -m"chore: bump version" 
+    git --no-pager log --decorate=short --pretty=oneline
+    git push -o ci.skip origin ''${CI_COMMIT_REF_NAME} --tags
+
+    echo "done"
+
+  '';
+
+  enterShell = ''
+        
+    cat <<'EOF' > Taskfile.yml
+
+    # THIS FILE IS AUTOGENERATED BY THE DEVENVSHELL
+    # DO NOT EDIT THIS FILE MANUALLY
+    # INSTEAD EDIT THE DEVENVSHELL CONFIGURATION FILE devenv.nix 
+    # AND OPEN A SHELL WITH THE COMMAND devenv shell
+    #
+    # Information about the task runner can be found here:
+    # https://taskfile.dev
+
+    version: '3'
+
+    tasks:
+      default:
+        cmds:
+          - task --list
+        silent: true
+        
+      test:
+        desc: Execute unit tests in Go.
+        cmds:
+          - echo "Execute unit tests in Go."
+          - go test -cover -v ./...
+          - go test -bench -v ./...
+          - go test -race -v ./...
+
+      test-fuzz:
+        desc: Conduct fuzzing tests.#
+        cmds:  
+          - echo "Conduct fuzzing tests."
+          - go test -v -fuzztime=30s -fuzz=Fuzz ./...
+
+      add-licenses:
+        desc: Attach license headers to Go files.
+        cmds:
+          - echo "Attach license headers to Go files."
+          - go install github.com/google/addlicense@latest
+          - addlicense -c "schukai GmbH" -s -l "AGPL-3.0" ./*.go
+        silent: true
+        
+      check-licenses:
+        desc: Check license headers of Go files.
+        silent: true
+        cmds:
+          - go-licenses save "$(get-go-default-packages)"  --ignore "gitlab.schukai.com"  --force --save_path ''${DEVENV_ROOT}/licenses/
+
+      check:
+        desc: Confirm repository status.
+        cmds:
+          - git diff-index --quiet HEAD || (echo "There are uncommitted changes after running make. Please commit or stash them before running make."; exit 1)
+        silent: true
+
+      commit:
+        desc: Commit changes to the repository.
+        aliases:
+          - c
+          - ci
+          - git-commit
+        cmds:
+          - do-git-commit
+    EOF
+
+    cat <<'EOF' > .gitlab-ci.yml
+
+    # THIS FILE IS AUTOGENERATED BY THE DEVENVSHELL
+    # DO NOT EDIT THIS FILE MANUALLY
+    # INSTEAD EDIT THE DEVENVSHELL CONFIGURATION FILE devenv.nix
+    # AND OPEN A SHELL WITH THE COMMAND devenv shell
+    #
+
+    image: docker-registry.schukai.com:443/nixos-ci-devenv:latest
+
+    services:
+      - docker:dind
+
+    variables:
+      # The repo name as used in
+      # https://github.com/nix-community/NUR/blob/master/repos.json
+      NIXOS_VERSION: "23.05"
+      NIXPKGS_ALLOW_UNFREE: "1"
+      NIXPKGS_ALLOW_INSECURE: "1"
+      DOCKER_DRIVER: overlay2
+      GIT_DEPTH: 10
+
+    stages:
+      - test
+      - deploy 
+
+    before_script:
+      - nix shell nixpkgs#coreutils-full -c mkdir -p /certs/client/
+      - nix shell nixpkgs#coreutils-full -c ln -fs /etc/ssl/certs/ca-bundle.crt /certs/client/ca.pem
+      - echo > .env-gitlab-ci
+      - variables=("HOME=$HOME" "CI_COMMIT_REF_NAME=$CI_COMMIT_REF_NAME" "CI_REPOSITORY_URL=$CI_REPOSITORY_URL" "GITLAB_TOKEN=$GITLAB_TOKEN" "CI_JOB_TOKEN=$CI_JOB_TOKEN" "GITLAB_USER_EMAIL=$GITLAB_USER_EMAIL" "GITLAB_USER_NAME=\"$GITLAB_USER_NAME\"" "CI_REGISTRY_USER=$CI_REGISTRY_USER" "CI_PROJECT_ID=$CI_PROJECT_ID" "CI_PROJECT_DIR=$CI_PROJECT_DIR" "CI_API_V4_URL=$CI_API_V4_URL" "CI_PROJECT_NAME=$CI_PROJECT_NAME" "CI_COMMIT_SHORT_SHA=$CI_COMMIT_SHORT_SHA"); for var in "''${variables[@]}"; do echo "$var" >> .env-gitlab-ci; done
+      - cat .env-gitlab-ci
+
+    after_script:
+      - if [ -f .env-gitlab-ci ]; then rm .env-gitlab-ci; fi
+
+    test:
+      stage: test
+      tags:
+        - nixos
+      script:
+        - devenv shell test-lib
+
+      cache:
+        - key: nixos
+          paths:
+            - /nix/store
+      
+      artifacts:
+        paths:
+          - dist
+
+    deploy:
+      stage: deploy
+      tags:
+        - nixos
+      script:
+        - devenv shell -c deploy-lib
+
+      when: on_success
+
+      cache:
+        - key: nixos
+          paths:
+            - /nix/store
+
+
+      artifacts:
+        paths:
+          - dist   
+    EOF
+
+       
+        
+  '';
+
+  scripts.do-git-commit.exec = ''
+    #!/usr/bin/env bash
+
+    # Define colors if the terminal supports it
+    if [ -t 1 ]; then
+      RED='\033[0;31m'
+      GREEN='\033[0;32m'
+      RESET='\033[0m'
+      BOLD='\033[1m'
+    else
+      RED=""
+      GREEN=""
+      RESET=""
+    fi
+
+    step=1
+
+    reset
+    clear
+
+    # create random log file
+    LOGFILE="$(mktemp)"
+    if [ $? -ne 0 ]; then
+      echo -e "''${RED}✖ Could not create temporary log file. Exiting.''${RESET}"
+      exit 1
+    fi
+
+    log_and_display() {
+      echo -e "''${GREEN}==> $step. $1''${RESET}" | tee -a $LOGFILE
+      step=$((step + 1))
+    }
+
+    log_error_and_display() {
+      echo -e "''${RED}==> $step. $1''${RESET}" | tee -a $LOGFILE
+    }
+
+    printLogfileAndExit() {
+      exit_code=$1
+      echo -e "\n\n========================================\n\n\n"
+
+      echo -e "\n\n''${BOLD}Git and GitLab Automation Script''${RESET}\n\nI have performed the following actions:\n\n"
+      cat "$LOGFILE"
+
+      # Optional: Remove log file
+      rm -f "$LOGFILE"
+
+      if [ $exit_code -eq 0 ]; then
+        echo -e "\n''${GREEN}✔''${RESET} All actions were successful" | tee -a $LOGFILE
+      elif [ $exit_code -eq -1 ]; then
+        echo -e "\n''${RED}✖''${RESET} The script was manually cancelled" | tee -a $LOGFILE
+        exit_code=0
+      else
+        echo -e "\n''${RED}✖''${RESET} Some actions failed" | tee -a $LOGFILE
+      fi
+
+      exit $exit_code
+    }
+
+    print_headline() {
+      local title=$1
+      local underline=$(printf '─%.0s' $(seq 1 ''${#title}))
+      echo -e "\n\n''${BOLD}''${title}\n''${underline}''${RESET}\n"
+    }
+
+    do_cancel() {
+      echo -e "''${RED}==> ✖ Cancelled.''${RESET}" | tee -a $LOGFILE
+      printLogfileAndExit -1
+    }
+
+    # Function for unified logging and display
+    log_action() {
+      if [ $? -eq 0 ]; then
+        echo -e "    ''${GREEN}✔''${RESET} $1: Successful" | tee -a $LOGFILE
+      else
+        echo -e "    ''${RED}✖''${RESET} $1: Failed" | tee -a $LOGFILE
+        printLogfileAndExit 1
+      fi
+    }
+
+    print_what_to_do() {
+      echo -e "\n\nWhat do you want to do?\n"
+    }
+
+    git_status=$(git status --porcelain)
+    if [[ -z "$git_status" ]]; then
+      log_error_and_display "No changes to commit. Exiting."
+      printLogfileAndExit 0
+    fi
+
+    print_headline "Choose commit type"
+    selection=$(gum choose "feat: (new feature for the user, not a new feature for build script)" "fix: (bug fix for the user, not a fix to a build script)" "chore: (updating grunt tasks etc.; no production code change)" "docs: (changes to the documentation)" "style: (formatting, missing semi colons, etc; no production code change)" "refactor: (refactoring production code, eg. renaming a variable)" "test: (adding missing tests, refactoring tests; no production code change)" "Cancel")
+
+    commit_type=$(echo "$selection" | awk -F':' '{print $1}')
+
+    if [[ "$commit_type" == "Cancel" ]]; then
+      do_cancel
+    fi
+
+    log_and_display "You chose the commit type: $commit_type"
+
+    # NEXT STEP ISSUE HANDLING ############################################################################################################
+    #log_and_display "Issue handling"
+
+    gitlabIssues=()
+    while IFS= read -r line; do
+      if [[ $line =~ ^# ]]; then
+        id=$(echo "$line" | awk '{print substr($1, 2)}')
+        title=$(echo "$line" | awk -F'about' '{print $1}' | awk '{$1=$2=""; print substr($0, 3)}')
+        gitlabIssues+=("$id > $title")
+      fi
+    done < <(gum spin --spinner dot --show-output --title "Ask gitlab ..." -- glab issue list --output-format=details)
+
+    ## if issues are available, ask if user wants to use an existing issue or create a new one
+    createOption="Create new issue"
+    existingOption="Use existing issue"
+    cancelOption="Cancel"
+
+    print_headline "Choose issue handling"
+    if [ ''${#gitlabIssues[@]} -eq 0 ]; then
+      log_and_display "There are no issues available."
+
+      print_what_to_do
+      choice=$(gum choose "$createOption" "$cancelOption")
+
+    else
+      log_and_display "There are ''${#gitlabIssues[@]} issues available."
+      print_what_to_do
+      choice=$(gum choose "$createOption" "$existingOption" "$cancelOption")
+    fi
+
+    if [[ "$choice" == "$cancelOption" ]]; then
+      do_cancel
+    fi
+
+    ## array of issue ids
+    work_on_issue_ids=()
+
+    issue_text=""
+
+    if [[ "$choice" == "$createOption" ]]; then
+      print_headline "Create new issue"
+      issue_text=$(gum input --placeholder "Enter issue title")
+      echo -e "Enter issue description. ''${RED}End with Ctrl+D''${RESET}\n"
+      issue_description=$(gum write --placeholder "Enter issue description. End with Ctrl+D")
+      
+      if [[ -z "$issue_text" ]]; then
+        log_error_and_display "Issue title is empty. Exiting."
+        printLogfileAndExit 1
+      fi
+
+      log_and_display "You entered the issue title: $issue_text"
+      log_and_display "You entered the issue description: $issue_description"
+      echo -e "\n"
+
+      gum confirm "Do you want to create this issue?"
+      # gum confirm exits with status 0 if confirmed and status 1 if cancelled.
+      if [ $? -eq 1 ]; then
+        do_cancel
+      fi
+
+      issue_output=$(glab issue create -t"$issue_text" --no-editor --description "$issue_description")
+      issue_id=$(echo "$issue_output" | grep -oP '(?<=/issues/)\d+')
+
+      work_on_issue_ids+=("$issue_id")
+
+      log_action "glab issue with id $issue_id created"
+
+    else
+
+      print_headline "Use existing issue"
+      echo -e "Select issue with arrow keys and press tab or space to select. Press enter to confirm.\n"
+      issue_ids=$(gum choose --no-limit "''${gitlabIssues[@]}")
+
+      # assign issue_ids to work_on_issue_ids. iterate over lines and take integer from beginning of line
+      while IFS= read -r line; do
+        work_on_issue_ids+=($(echo "$line" | grep -oP '^\d+'))
+      done <<<"$issue_ids"
+
+    fi
+
+    if [ ''${#work_on_issue_ids[@]} -eq 0 ]; then
+      log_and_display "No issue selected. Exiting."
+      printLogfileAndExit 0
+    fi 
+
+    # NEXT STEP COMMIT MESSAGE ############################################################################################################
+    # print work_on_issue_ids
+    work_on_issue_ids_string=""
+    for i in "''${work_on_issue_ids[@]}"; do
+      work_on_issue_ids_string+="#$i "
+    done
+
+    log_and_display "You chose to work on the following issues: ''${work_on_issue_ids_string}"
+
+
+    print_headline "Check for changes to commit"
+
+    # ' ' = unmodified
+    # M = modified
+    # T = file type changed (regular file, symbolic link or submodule)
+    # A = added
+    # D = deleted
+    # R = renamed
+    # C = copied (if config option status.renames is set to "copies")
+    # U = updated but unmerged
+    # https://man.freebsd.org/cgi/man.cgi?query=git-status&sektion=1&manpath=freebsd-release-ports
+
+    count_all_changes=$(echo "$git_status" | wc -l)
+    count_staged_changes=$(echo "$git_status" | grep -c '^M')
+    count_new_staged_files=$(echo "$git_status" | grep -c '^A')
+    count_staged_changes=$((count_staged_changes + count_new_staged_files))
+
+
+
+    git_options_all="All $count_all_changes changes"
+    git_options_staged="Only the $count_staged_changes staged changes"
+    git_options_select_files="Select files"
+    git_options_cancel="Cancel"
+
+    git_options_array=()
+    if [[ $count_all_changes -gt 0 ]]; then
+      git_options_array+=("$git_options_all")
+    fi
+
+    if [[ $count_staged_changes -gt 0 ]]; then
+      git_options_array+=("$git_options_staged")
+    fi
+
+    git_options_array+=( "$git_options_select_files" )
+    git_options_array+=( "$git_options_cancel" )
+
+
+    selection=$(gum choose "''${git_options_array[@]}")
+    if [[ "$selection" == "$git_options_cancel" ]]; then
+      do_cancel
+    fi
+
+    if [[ "$selection" == "$git_options_all" ]]; then
+      git add -A
+      echo "1"
+    elif [[ "$selection" == "$git_options_select_files" ]]; then
+
+      files=()
+      while IFS= read -r line; do
+        files+=("$line")
+      done <<<"$git_status"
+        
+      selected_files=$(gum choose --no-limit "''${files[@]}")
+      
+      # no files selected
+      if [[ -z "$selected_files" ]]; then
+        log_and_display "No files selected. Exiting."
+        printLogfileAndExit 0
+      fi
+
+      # add selected files
+      while IFS= read -r line; do
+        ## git proclimne could have letter, ? or ! at the beginning of the line
+        file=$(echo "$line" | awk '{print $2}')
+        if [[ -z "$file" || ! -f "$file" ]]; then
+          log_and_display "No file found in line: $line"
+          continue
+        fi
+        
+        git add "$file"
+      done <<<"$selected_files"
+      
+    fi
+
+    ## count staged changes again and print
+    count_staged_changes=$(echo "$git_status" | grep -c '^M')
+    count_new_staged_files=$(echo "$git_status" | grep -c '^A')
+    count_staged_changes=$((count_staged_changes + count_new_staged_files))
+
+    log_and_display "You have $count_staged_changes staged changes to commit."
+
+    # NEXT STEP COMMIT MESSAGE ############################################################################################################
+
+    print_headline "Enter commit message"
+    commit_message=$(gum input --placeholder "Enter commit message" --value "$commit_type: $issue_text $work_on_issue_ids_string")
+
+    if [[ -z "$commit_message" ]]; then
+      log_error_and_display "Commit message is empty. Exiting."
+      printLogfileAndExit 1
+    fi
+
+    log_and_display "You entered the commit message: $commit_message"
+
+    gum confirm "Do you want to commit with this message?"
+    if [ $? -eq 1 ]; then
+      do_cancel
+    fi
+
+    # NEXT STEP COMMIT ####################################################################################################################
+    print_headline "Committing changes"
+
+    if ! git commit -m "$commit_message" ; then
+      log_error_and_display "Commit failed. Exiting."
+      printLogfileAndExit 1
+    fi
+
+    log_and_display "Commit successful."
+
+    # NEXT STEP PUSH ######################################################################################################################
+
+    print_headline "Pushing changes"
+
+    if ! git push ; then
+      log_error_and_display "Push failed. Exiting."
+      printLogfileAndExit 1
+    fi
+
+    log_and_display "Push successful."
+
+    # Close issue ######################################################################################################################
+
+    print_headline "Closing issues"
+
+    for issue_id in "''${work_on_issue_ids[@]}"; do
+      
+      gum confirm "Do you want to close issue #$issue_id?"
+      if [ $? -eq 1 ]; then
+        continue
+      fi
+      
+      if ! glab issue close "$issue_id" ; then
+        log_error_and_display "Closing issue $issue_id failed. Exiting."
+      else
+        log_and_display "Closing issue $issue_id successful."  
+      fi
+    done
 
+    printLogfileAndExit 0
+  '';
 
 }
diff --git a/go.mod b/go.mod
index b50b1cfc225ce5faecb176826b2008cc59f37686..c1ef92fa59f71efb087450993a543429a67b9c10 100644
--- a/go.mod
+++ b/go.mod
@@ -3,16 +3,16 @@ module gitlab.schukai.com/oss/libraries/go/markup/html
 go 1.20
 
 require (
-	github.com/andybalholm/cascadia v1.3.1
+	github.com/andybalholm/cascadia v1.3.2
 	github.com/stretchr/testify v1.8.1
 	gitlab.schukai.com/oss/libraries/go/utilities/data.git v0.2.0
-	golang.org/x/net v0.8.0
+	golang.org/x/net v0.15.0
 )
 
 require (
 	github.com/davecgh/go-spew v1.1.1 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/volker-schukai/tokenizer v1.0.0 // indirect
-	gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.5.2 // indirect
+	gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.8.1 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff --git a/go.sum b/go.sum
index d7e1ba25acdd0b021b4fb533d17da9ec15f1c627..c451ff2df02a6e5515ed93e2da9e26643f444ed6 100644
--- a/go.sum
+++ b/go.sum
@@ -1,5 +1,7 @@
 github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
+github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -15,22 +17,57 @@ github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKs
 github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
 github.com/volker-schukai/tokenizer v1.0.0 h1:wF4haFoCodq7lgAk8c+th/DZmpFpL2WVD8wDzAGU1mA=
 github.com/volker-schukai/tokenizer v1.0.0/go.mod h1:LPw7lLIxUnZgeg96818N7IvwLE1x8ya31J/Aa0aCq9M=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 gitlab.schukai.com/oss/libraries/go/utilities/data.git v0.2.0 h1:JVxMHiA8zFVjJDhNl65XeYrhdMkzB+5dyrBUEZ982WU=
 gitlab.schukai.com/oss/libraries/go/utilities/data.git v0.2.0/go.mod h1:BsR4Y9jsvISplkW6UoLFRGxQX69/AUmP1SXRwWhx31o=
 gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.4.0 h1:eAEsq3lsHwMe5Zz71vNab5csPtp8S+i5zFPmNnDPFDg=
 gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.4.0/go.mod h1:UvdD4NAf3gLKYafabJD7e9ZCOetzM9JZ9y4GkZukPVU=
 gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.5.2 h1:R+dL2NJCM+AQNPK4DPDmfvx1eomi1Xb1dl0XKEFj7Ek=
 gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.5.2/go.mod h1:UvdD4NAf3gLKYafabJD7e9ZCOetzM9JZ9y4GkZukPVU=
+gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.8.1 h1:A3KvLvu4rV3OstgEn6xHulhQaXawVvzFzbafYHWHUfs=
+gitlab.schukai.com/oss/libraries/go/utilities/pathfinder v0.8.1/go.mod h1:MqCBFv7DXKoBE2rZDc51LGvl2QI7Kz0D+XkQ0izj+ws=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU=
 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.8.0 h1:Zrh2ngAOFYneWTAIAPethzeaQLuHwhuBkuV6ZiRnUaQ=
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
+golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
+golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=