diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2fccb5d3081d485b6b21649db2b976ea2e457a5f..a6d38e74b8452ca7c78195b3aa34bbd0b128cc83 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -10,8 +10,8 @@ workflow:
   - when: always
 
 variables:
-  MAVEN_OPTS: "-Xmx500m -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN"
-  MAVEN_CLI_OPTS: "--batch-mode -DinstallAtEnd=true -DdeployAtEnd=true -DskipDeployBigArtefact=true -s $CI_PROJECT_DIR/ci_settings.xml"
+  MAVEN_OPTS: "-Xmx500m -XX:+UseSerialGC -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN"
+  MAVEN_CLI_OPTS: "--batch-mode -DskipDeployBigArtefact=true -s $CI_PROJECT_DIR/ci_settings.xml"
 
 stages:
 - build
@@ -30,6 +30,8 @@ maven-build:
   rules:
   - if: $OPERATION != null
     when: never 
+  - if: $CI_COMMIT_TAG != null
+    when: never 
   - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH
     variables:
       MAVEN_GOAL: "install"
@@ -42,19 +44,25 @@ maven-build:
   image: registry.opencode.de/diplanung/ozgxplanung/mvn-build-image:latest
   script:
   - mvn package -Dxplan-tests.maven.deploy.skip=true -Pdocker,skipAll -pl $mvnProjects -am
+  - ci/readEnvPropsForKanikoBuilds.sh > build.env
   - find . -name docker-build.tar | xargs gzip
   - set -o pipefail; find . -name docker-build.tar.gz | grep . | xargs du -h
   rules:
   - if: $CI_PIPELINE_SOURCE == 'schedule'
     when: never 
+  - if: $CI_COMMIT_TAG != null
+    when: on_success
   - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH
     when: never
   - when: on_success 
   artifacts:
     expire_in: 1 hour
+    reports:
+      dotenv: build.env
   variables:
     UPSTREAM_REF: $CI_COMMIT_REF_NAME
 
+
 maven-prepare-docker-contexts-apis-and-inspire-plu:
   extends: .maven-prepare-docker-contexts
   variables:
@@ -96,23 +104,15 @@ maven-prepare-docker-contexts-others:
 include: ci/all-kaniko-builds.gitlab-ci.yml
 
 
-maven-release:
-#  image: maven:3.8.6-jdk-11
+maven-deploy-release:
   image: registry.opencode.de/diplanung/ozgxplanung/mvn-build-image:latest
-  stage: deploy
-  only:
-    - main
-  when: manual
-  before_script:
-  - mkdir -p ~/.ssh/
-  - cp $DEPLOY_PRIVATE_KEY ~/.ssh/id_rsa && chmod 600 ~/.ssh/id_rsa
-  - cp $KNOWN_HOSTS ~/.ssh/known_hosts
-  - apt-get update && apt-get install -y git
-  - git config --global user.email "noreply@gitlab.opencode.de"
-  - git config --global user.name "xplanung GitLab CI"
-  - git checkout -B "$CI_COMMIT_REF_NAME"
+  stage: build:jvm
+  rules:
+  - if: $OPERATION != null
+    when: never 
+  - if: $CI_COMMIT_TAG != null
   script:
-  - mvn release:prepare release:perform $MAVEN_CLI_OPTS -DscmReleaseCommitComment="release @{releaseLabel}" -DtagNameFormat="v@{project.version}"
+  - mvn $MAVEN_CLI_OPTS deploy -PskipAll -Dxplan-tests.maven.deploy.skip=true
 
 gitlab-release:
   stage: deploy
@@ -120,9 +120,9 @@ gitlab-release:
   rules:
   - if: $OPERATION != null
     when: never 
-  - if: $CI_COMMIT_TAG
+  - if: $CI_COMMIT_TAG != null
   script:
-  - echo "Running the release job for $CI_COMMIT_TAG"
+  - echo "Running job gitlab-release for $CI_COMMIT_TAG"
   release:
     tag_name: $CI_COMMIT_TAG
     name: 'Release $CI_COMMIT_TAG'
diff --git a/ci/all-kaniko-builds.gitlab-ci.yml b/ci/all-kaniko-builds.gitlab-ci.yml
index 959dd308c367fae55177ae6214c287b2d037bcc4..0a6c703acb2182e446fdd659f5f614dc00970e15 100644
--- a/ci/all-kaniko-builds.gitlab-ci.yml
+++ b/ci/all-kaniko-builds.gitlab-ci.yml
@@ -5,15 +5,17 @@
     name: gcr.io/kaniko-project/executor:v1.9.0-debug
     entrypoint: [""]
   script:
-  - /kaniko/executor --context=tar://${CI_PROJECT_DIR}/$tarGzFile --destination=$destination:$dockerTag
+  - /kaniko/executor --context=tar://${CI_PROJECT_DIR}/$tarGzFile --destination=$destination:$xplanboxVersion
     --build-arg="BUILD_DATE='$(date --utc +'%Y-%m-%d %H:%M:%SZ')'"
     --build-arg="DOCKER_IMAGE_NAME=$dockerImageName"
     --build-arg="GIT_REVISION=${CI_COMMIT_SHA}"
     --build-arg="XPLANBOX_IMAGE_NAME_PREFIX=${CI_REGISTRY_IMAGE}/xplanbox"
-    --build-arg="XPLANBOX_VERSION=${dockerTag}"
+    --build-arg="XPLANBOX_VERSION=${xplanboxVersion}"
   rules:
   - if: $CI_PIPELINE_SOURCE == 'schedule'
     when: never 
+  - if: $CI_COMMIT_TAG != null
+    when: on_success
   - if: $CI_COMMIT_REF_NAME != $CI_DEFAULT_BRANCH
     when: never 
   - when: on_success 
@@ -30,6 +32,7 @@ kaniko:xplan-cli-docker:
     tarGzFile: xplan-cli/xplan-cli-docker/target/docker/xplanbox/xplan-cli/tmp/docker-build.tar.gz
   needs:
     - maven-prepare-docker-contexts-cli
+    - kaniko:xplan-docker-volume-init
 
 kaniko:xplan-db-updater:
   extends: .kaniko:build
diff --git a/ci/readEnvPropsForKanikoBuilds.sh b/ci/readEnvPropsForKanikoBuilds.sh
new file mode 100755
index 0000000000000000000000000000000000000000..cb003d077cb032e6367d889b898779c0b0882c47
--- /dev/null
+++ b/ci/readEnvPropsForKanikoBuilds.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+# to be run in a folder with pom.xml
+
+xplanboxVersion=$(mvn -N help:evaluate -Dexpression=project.version -q -DforceStdout)
+
+echo -n "xplanboxVersion=$([[ $xplanboxVersion == *SNAPSHOT ]] && echo 'latest' || echo $xplanboxVersion)
+"
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index ba76e2f214b9ecb17a0c33ddd7b76da79123a673..86b31e35f0f09698efe068aad0c696dadb4373e2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -60,6 +60,7 @@
     <module>xplan-core</module>
     <module>xplan-documentation</module>
     <module>xplan-resources</module>
+    <module>xplan-security</module>
     <module>xplan-tests</module>
     <module>xplan-webapps</module>
     <module>xplan-webservices</module>
@@ -1366,6 +1367,16 @@
           </exclusion>
         </exclusions>
       </dependency>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-security</artifactId>
+        <version>${spring-boot.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-test</artifactId>
+        <version>${spring-boot.version}</version>
+      </dependency>
       <!-- Spring Security -->
       <dependency>
         <groupId>org.springframework.security</groupId>
diff --git a/xplan-api/pom.xml b/xplan-api/pom.xml
index c32f764c83e52e80f57122271a0e59518ec0198c..b900feb70a5039e2227ccac2aeaaecc677dfc9c4 100644
--- a/xplan-api/pom.xml
+++ b/xplan-api/pom.xml
@@ -43,14 +43,14 @@
             <resource>
               <directory>src/main/webapp</directory>
               <includes>
-                <include>version.txt</include>
+                <include>**/version.txt</include>
               </includes>
               <filtering>true</filtering>
             </resource>
             <resource>
               <directory>src/main/webapp</directory>
               <excludes>
-                <exclude>version.txt</exclude>
+                <exclude>**/version.txt</exclude>
               </excludes>
               <filtering>false</filtering>
             </resource>
diff --git a/xplan-api/xplan-api-dokumente/.maven-dockerignore b/xplan-api/xplan-api-dokumente/.maven-dockerignore
deleted file mode 100644
index c31d316e2fa767833ca4d802db7c259b5dd61b02..0000000000000000000000000000000000000000
--- a/xplan-api/xplan-api-dokumente/.maven-dockerignore
+++ /dev/null
@@ -1,18 +0,0 @@
-.classpath
-.dockerignore
-.project
-.settings/**
-
-pom.xml
-src/**
-target/*.jar.original
-target/classes/**
-target/dependency-maven-plugin-markers/**
-target/docker
-target/generated-sources/**
-target/generated-test-sources/**
-target/m2e-wtp/**
-target/maven-*/**
-target/surefire-reports/**
-target/test-classes/**
-target/xplan-api-dokumente-*/*/**
\ No newline at end of file
diff --git a/xplan-api/xplan-api-dokumente/.maven-dockerinclude b/xplan-api/xplan-api-dokumente/.maven-dockerinclude
new file mode 100644
index 0000000000000000000000000000000000000000..fb59421b161353180fcfc72c9e17db8c759869c1
--- /dev/null
+++ b/xplan-api/xplan-api-dokumente/.maven-dockerinclude
@@ -0,0 +1,2 @@
+run.sh
+target/*-repackaged.war
\ No newline at end of file
diff --git a/xplan-api/xplan-api-dokumente/Dockerfile b/xplan-api/xplan-api-dokumente/Dockerfile
index aa8aa56441931585e819af929aa29f408d782643..1a69e8c573e21d234655eae7ae143b955fd15277 100644
--- a/xplan-api/xplan-api-dokumente/Dockerfile
+++ b/xplan-api/xplan-api-dokumente/Dockerfile
@@ -7,7 +7,7 @@ FROM eclipse-temurin:11.0.21_9-jre-alpine
 ARG BUILD_DATE=?
 ARG DOCKER_IMAGE_NAME=?
 ARG GIT_REVISION=?
-ARG JAR_FILE=target/*.jar
+ARG WAR_FILE=target/*-repackaged.war
 ARG XPLANBOX_VERSION=latest
 
 # see https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
@@ -34,7 +34,7 @@ ENV JAVA_ADDITIONAL_ARG_JMX_EXPORTER='-javaagent:$JMX_EXPORTER_DIR/jmx_prometheu
 ENV JAVA_ADDITIONAL_ARG_APP="-DXPLANBOX_CONFIG=/xplanbox/xplan-dokumenten-config/ -Duser.timezone=Europe/Berlin"
 ENV DEEGREE_WORKSPACE_ROOT=/xplanbox/deegree
 
-COPY ${JAR_FILE} /xplanbox/app.jar
+COPY ${WAR_FILE} /xplanbox/app.war
 COPY run.sh /xplanbox/
 
 USER 1001
diff --git a/xplan-api/xplan-api-dokumente/pom.xml b/xplan-api/xplan-api-dokumente/pom.xml
index 9077b397a8a9e1fe9792c8f090fad96ec24b296f..f548a13ffc5d862a6f7234a61c50c8c3489432c6 100755
--- a/xplan-api/xplan-api-dokumente/pom.xml
+++ b/xplan-api/xplan-api-dokumente/pom.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>xplan-api-dokumente</artifactId>
-  <packaging>jar</packaging>
+  <packaging>war</packaging>
 
   <parent>
     <groupId>de.latlon.product.xplanbox</groupId>
@@ -21,12 +22,15 @@
       </dependency>
     </dependencies>
   </dependencyManagement>
-  
+
   <build>
-	<plugins>
+    <plugins>
       <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
+        <configuration>
+          <classifier>repackaged</classifier>
+        </configuration>
         <executions>
           <execution>
             <goals>
@@ -51,16 +55,16 @@
         </executions>
       </plugin>
       <plugin>
-		  <groupId>org.apache.maven.plugins</groupId>
-		  <artifactId>maven-jar-plugin</artifactId>
-		  <configuration>
-            <archive>
-              <manifest>
-                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-              </manifest>
-            </archive>
-		  </configuration>
-	  </plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+            </manifest>
+          </archive>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 
@@ -199,10 +203,10 @@
       <artifactId>jersey-test-framework-core</artifactId>
       <scope>test</scope>
       <exclusions>
-      	<exclusion>
-      		<groupId>junit</groupId>
-      		<artifactId>junit</artifactId>
-      	</exclusion>
+        <exclusion>
+          <groupId>junit</groupId>
+          <artifactId>junit</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>
@@ -210,10 +214,10 @@
       <artifactId>jersey-test-framework-provider-inmemory</artifactId>
       <scope>test</scope>
       <exclusions>
-      	<exclusion>
-      		<groupId>junit</groupId>
-      		<artifactId>junit</artifactId>
-      	</exclusion>
+        <exclusion>
+          <groupId>junit</groupId>
+          <artifactId>junit</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>
diff --git a/xplan-api/xplan-api-dokumente/run.sh b/xplan-api/xplan-api-dokumente/run.sh
index d12d67ccd8497bb2b4bc582a7eb5b75e5160e792..9da77a35839ad040f46d7781afa3084db7bb46af 100755
--- a/xplan-api/xplan-api-dokumente/run.sh
+++ b/xplan-api/xplan-api-dokumente/run.sh
@@ -7,4 +7,4 @@ if [ -n "${ALL_ADDITIONAL_ARGS}" ]; then
     echo "xPlanBox JAVA_OPTS set: $JAVA_OPTS"
 fi
 
-exec java $JAVA_OPTS -jar /xplanbox/app.jar
+exec java $JAVA_OPTS -jar /xplanbox/app.war
diff --git a/xplan-api/xplan-api-dokumente/src/main/webapp/version.txt b/xplan-api/xplan-api-dokumente/src/main/webapp/xdokumente/version.txt
similarity index 100%
rename from xplan-api/xplan-api-dokumente/src/main/webapp/version.txt
rename to xplan-api/xplan-api-dokumente/src/main/webapp/xdokumente/version.txt
diff --git a/xplan-api/xplan-api-manager/.maven-dockerignore b/xplan-api/xplan-api-manager/.maven-dockerignore
deleted file mode 100644
index c31d316e2fa767833ca4d802db7c259b5dd61b02..0000000000000000000000000000000000000000
--- a/xplan-api/xplan-api-manager/.maven-dockerignore
+++ /dev/null
@@ -1,18 +0,0 @@
-.classpath
-.dockerignore
-.project
-.settings/**
-
-pom.xml
-src/**
-target/*.jar.original
-target/classes/**
-target/dependency-maven-plugin-markers/**
-target/docker
-target/generated-sources/**
-target/generated-test-sources/**
-target/m2e-wtp/**
-target/maven-*/**
-target/surefire-reports/**
-target/test-classes/**
-target/xplan-api-dokumente-*/*/**
\ No newline at end of file
diff --git a/xplan-api/xplan-api-manager/.maven-dockerinclude b/xplan-api/xplan-api-manager/.maven-dockerinclude
new file mode 100644
index 0000000000000000000000000000000000000000..fb59421b161353180fcfc72c9e17db8c759869c1
--- /dev/null
+++ b/xplan-api/xplan-api-manager/.maven-dockerinclude
@@ -0,0 +1,2 @@
+run.sh
+target/*-repackaged.war
\ No newline at end of file
diff --git a/xplan-api/xplan-api-manager/Dockerfile b/xplan-api/xplan-api-manager/Dockerfile
index 1c343ab7e67f4445008e7c8e04f16798759d14dc..28905fbf080351abd666b0997e5455f82c3ec1a3 100644
--- a/xplan-api/xplan-api-manager/Dockerfile
+++ b/xplan-api/xplan-api-manager/Dockerfile
@@ -5,7 +5,7 @@ FROM ${XPLANBOX_IMAGE_NAME_PREFIX}/xplan-docker-tomcat-gdal:$XPLANBOX_VERSION
 ARG BUILD_DATE=?
 ARG DOCKER_IMAGE_NAME=?
 ARG GIT_REVISION=?
-ARG JAR_FILE=target/*.jar
+ARG WAR_FILE=target/*-repackaged.war
 ARG XPLANBOX_VERSION=latest
 
 # see https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
@@ -24,7 +24,7 @@ ENV DEEGREE_WORKSPACE_ROOT=/xplanbox/deegree
 
 ENV JAVA_ADDITIONAL_ARG_APP="-DXPLANBOX_CONFIG=/xplanbox/xplan-manager-config/ -Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl -Djts.overlay=ng"
 
-COPY ${JAR_FILE} /xplanbox/app.jar
+COPY ${WAR_FILE} /xplanbox/app.war
 COPY run.sh /xplanbox/
 
 USER 1001
diff --git a/xplan-api/xplan-api-manager/pom.xml b/xplan-api/xplan-api-manager/pom.xml
index 0f95df35f061cd17c663da5f5bf2f0b776f94f61..5c5f1c025eabed7edb8af7d58e165176142c66c4 100644
--- a/xplan-api/xplan-api-manager/pom.xml
+++ b/xplan-api/xplan-api-manager/pom.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>xplan-api-manager</artifactId>
-  <packaging>jar</packaging>
+  <packaging>war</packaging>
 
   <parent>
     <groupId>de.latlon.product.xplanbox</groupId>
@@ -21,13 +22,16 @@
       </dependency>
     </dependencies>
   </dependencyManagement>
-  
+
   <build>
     <plugins>
       <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
-       <executions>
+        <configuration>
+          <classifier>repackaged</classifier>
+        </configuration>
+        <executions>
           <execution>
             <goals>
               <goal>repackage</goal>
@@ -51,15 +55,15 @@
         </executions>
       </plugin>
       <plugin>
-          <groupId>org.apache.maven.plugins</groupId>
-          <artifactId>maven-jar-plugin</artifactId>
-          <configuration>
-            <archive>
-              <manifest>
-                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-              </manifest>
-            </archive>
-          </configuration>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+            </manifest>
+          </archive>
+        </configuration>
       </plugin>
     </plugins>
   </build>
@@ -74,6 +78,11 @@
       <groupId>de.latlon.product.xplanbox</groupId>
       <artifactId>xplan-api-commons</artifactId>
     </dependency>
+    <dependency>
+      <groupId>de.latlon.product.xplanbox</groupId>
+      <artifactId>xplan-security</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <!-- deegree -->
     <dependency>
       <groupId>de.latlon</groupId>
@@ -166,10 +175,10 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       <exclusions>
-          <exclusion>
-              <groupId>org.apache.tomcat.embed</groupId>
-              <artifactId>tomcat-embed-el</artifactId>
-          </exclusion>
+        <exclusion>
+          <groupId>org.apache.tomcat.embed</groupId>
+          <artifactId>tomcat-embed-el</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <!-- logging -->
@@ -223,26 +232,26 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-test</artifactId>
       <scope>test</scope>
-        <exclusions>
-          <exclusion>
-            <groupId>*</groupId>
-              <artifactId>*</artifactId>
-            </exclusion>
-        </exclusions>
+      <exclusions>
+        <exclusion>
+          <groupId>*</groupId>
+          <artifactId>*</artifactId>
+        </exclusion>
+      </exclusions>
     </dependency>
     <dependency>
       <groupId>org.glassfish.jersey.test-framework</groupId>
       <artifactId>jersey-test-framework-core</artifactId>
       <scope>test</scope>
       <exclusions>
-          <exclusion>
-              <groupId>org.hamcrest</groupId>
-              <artifactId>hamcrest-core</artifactId>
-          </exclusion>
-          <exclusion>
-              <groupId>junit</groupId>
-              <artifactId>junit</artifactId>
-          </exclusion>
+        <exclusion>
+          <groupId>org.hamcrest</groupId>
+          <artifactId>hamcrest-core</artifactId>
+        </exclusion>
+        <exclusion>
+          <groupId>junit</groupId>
+          <artifactId>junit</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>
@@ -250,10 +259,10 @@
       <artifactId>jersey-test-framework-provider-inmemory</artifactId>
       <scope>test</scope>
       <exclusions>
-          <exclusion>
-              <groupId>junit</groupId>
-              <artifactId>junit</artifactId>
-          </exclusion>
+        <exclusion>
+          <groupId>junit</groupId>
+          <artifactId>junit</artifactId>
+        </exclusion>
       </exclusions>
     </dependency>
     <dependency>
diff --git a/xplan-api/xplan-api-manager/run.sh b/xplan-api/xplan-api-manager/run.sh
index d12d67ccd8497bb2b4bc582a7eb5b75e5160e792..9da77a35839ad040f46d7781afa3084db7bb46af 100755
--- a/xplan-api/xplan-api-manager/run.sh
+++ b/xplan-api/xplan-api-manager/run.sh
@@ -7,4 +7,4 @@ if [ -n "${ALL_ADDITIONAL_ARGS}" ]; then
     echo "xPlanBox JAVA_OPTS set: $JAVA_OPTS"
 fi
 
-exec java $JAVA_OPTS -jar /xplanbox/app.jar
+exec java $JAVA_OPTS -jar /xplanbox/app.war
diff --git a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java
index a520bda0cd2cc5b37a970f292f157838d924120c..d817847a574bb83d0418b1ce681abc6495837720 100644
--- a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java
+++ b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/SpringBootApp.java
@@ -25,11 +25,13 @@ import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
 import org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
 @ComponentScan(basePackages = { "de.latlon.xplanbox.api.manager.config" })
-@EnableAutoConfiguration(exclude = { QuartzAutoConfiguration.class, LiquibaseAutoConfiguration.class })
+@EnableAutoConfiguration(
+		exclude = { QuartzAutoConfiguration.class, LiquibaseAutoConfiguration.class, SecurityAutoConfiguration.class })
 public class SpringBootApp {
 
 	public static void main(String[] args) {
diff --git a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java
index ff89e7d0a42b2bfa48b983c8a7b69666ca261d15..8f6cf17a75892d73e84782d601b24117e6d998a5 100644
--- a/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java
+++ b/xplan-api/xplan-api-manager/src/main/java/de/latlon/xplanbox/api/manager/config/ApplicationContext.java
@@ -81,6 +81,7 @@ import de.latlon.xplan.validator.semantic.xquery.XQuerySemanticValidator;
 import de.latlon.xplan.validator.syntactic.SyntacticValidator;
 import de.latlon.xplan.validator.syntactic.SyntacticValidatorImpl;
 import de.latlon.xplanbox.api.commons.handler.SystemConfigHandler;
+import de.latlon.xplanbox.security.config.SecurityContext;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationEventPublisher;
@@ -108,7 +109,7 @@ import static de.latlon.xplan.manager.workspace.WorkspaceUtils.DEFAULT_XPLANSYN_
  */
 @Configuration
 @ComponentScan(basePackages = { "de.latlon.xplanbox.api.manager.handler" })
-@Import({ JpaContext.class, RasterStorageContext.class, AmazonS3RasterStorageContext.class,
+@Import({ SecurityContext.class, JpaContext.class, RasterStorageContext.class, AmazonS3RasterStorageContext.class,
 		DocumentStorageContext.class, StorageCleanUpContext.class })
 public class ApplicationContext {
 
diff --git a/xplan-api/xplan-api-manager/src/main/webapp/version.txt b/xplan-api/xplan-api-manager/src/main/webapp/xmanager/version.txt
similarity index 100%
rename from xplan-api/xplan-api-manager/src/main/webapp/version.txt
rename to xplan-api/xplan-api-manager/src/main/webapp/xmanager/version.txt
diff --git a/xplan-api/xplan-api-validator/.maven-dockerignore b/xplan-api/xplan-api-validator/.maven-dockerignore
deleted file mode 100644
index c10873ac5b13bb0a3559ff43e4c9e9c44dc63b3a..0000000000000000000000000000000000000000
--- a/xplan-api/xplan-api-validator/.maven-dockerignore
+++ /dev/null
@@ -1,19 +0,0 @@
-# 2023-02-07: excludes allow to reduce tar size from 217M to 98M 
-.classpath
-.dockerignore
-.project
-.settings/**
-
-pom.xml
-src/**
-target/*.jar.original
-target/classes/**
-target/dependency-maven-plugin-markers/**
-target/docker
-target/generated-sources/**
-target/generated-test-sources/**
-target/m2e-wtp/**
-target/maven-*/**
-target/surefire-reports/**
-target/test-classes/**
-target/xplan-api-validator-*/*/**
diff --git a/xplan-api/xplan-api-validator/.maven-dockerinclude b/xplan-api/xplan-api-validator/.maven-dockerinclude
new file mode 100644
index 0000000000000000000000000000000000000000..fb59421b161353180fcfc72c9e17db8c759869c1
--- /dev/null
+++ b/xplan-api/xplan-api-validator/.maven-dockerinclude
@@ -0,0 +1,2 @@
+run.sh
+target/*-repackaged.war
\ No newline at end of file
diff --git a/xplan-api/xplan-api-validator/Dockerfile b/xplan-api/xplan-api-validator/Dockerfile
index c236f94bbda1070691df8d17b1c1d871da7d4ba9..8006e14dd477bd897df79dbbcf1bdf47b824d999 100644
--- a/xplan-api/xplan-api-validator/Dockerfile
+++ b/xplan-api/xplan-api-validator/Dockerfile
@@ -7,7 +7,7 @@ FROM eclipse-temurin:11.0.21_9-jre-alpine
 ARG BUILD_DATE=?
 ARG DOCKER_IMAGE_NAME=?
 ARG GIT_REVISION=?
-ARG JAR_FILE=target/*.jar
+ARG WAR_FILE=target/*-repackaged.war
 ARG XPLANBOX_VERSION=latest
 
 # see https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
@@ -34,7 +34,7 @@ ENV JAVA_ADDITIONAL_ARG_JMX_EXPORTER='-javaagent:$JMX_EXPORTER_DIR/jmx_prometheu
 ENV JAVA_ADDITIONAL_ARG_APP="-DXPLANBOX_CONFIG=/xplanbox/xplan-validator-config/ -Djavax.xml.transform.TransformerFactory=net.sf.saxon.TransformerFactoryImpl -Djts.overlay=ng -Duser.timezone=Europe/Berlin"
 ENV DEEGREE_WORKSPACE_ROOT=/xplanbox/deegree
 
-COPY ${JAR_FILE} /xplanbox/app.jar
+COPY ${WAR_FILE} /xplanbox/app.war
 COPY run.sh /xplanbox/
 
 USER 1001
diff --git a/xplan-api/xplan-api-validator/pom.xml b/xplan-api/xplan-api-validator/pom.xml
index 994a97cbff1d6eb5a4c48e451c8a530c7da13736..3a2dc2c74673d15d1baf118c4aaa8357cb7c1fee 100755
--- a/xplan-api/xplan-api-validator/pom.xml
+++ b/xplan-api/xplan-api-validator/pom.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>xplan-api-validator</artifactId>
-  <packaging>jar</packaging>
+  <packaging>war</packaging>
 
   <parent>
     <groupId>de.latlon.product.xplanbox</groupId>
@@ -43,7 +44,9 @@
             <port>8080</port>
             <idleTimeout>60000</idleTimeout>
           </httpConnector>
-          <jvmArgs>--illegal-access=warn --add-opens java.base/java.lang=ALL-UNNAMED -Dorg.eclipse.jetty.webapp.LEVEL=DEBUG -Dcatalina.base=${project.basedir}/target</jvmArgs>
+          <jvmArgs>--illegal-access=warn --add-opens java.base/java.lang=ALL-UNNAMED
+            -Dorg.eclipse.jetty.webapp.LEVEL=DEBUG -Dcatalina.base=${project.basedir}/target
+          </jvmArgs>
         </configuration>
         <!--
         <executions>
@@ -71,13 +74,16 @@
       <plugin>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-maven-plugin</artifactId>
-            <executions>
-                <execution>
-                    <goals>
-                        <goal>repackage</goal>
-                    </goals>
-                </execution>
-            </executions>
+        <configuration>
+          <classifier>repackaged</classifier>
+        </configuration>
+        <executions>
+          <execution>
+            <goals>
+              <goal>repackage</goal>
+            </goals>
+          </execution>
+        </executions>
       </plugin>
       <plugin><!-- redeclare here to run *after* spring-boot repackage -->
         <groupId>io.fabric8</groupId>
@@ -95,16 +101,16 @@
         </executions>
       </plugin>
       <plugin>
-		  <groupId>org.apache.maven.plugins</groupId>
-		  <artifactId>maven-jar-plugin</artifactId>
-		  <configuration>
-            <archive>
-              <manifest>
-                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-              </manifest>
-            </archive>
-		  </configuration>
-	  </plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifest>
+              <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+            </manifest>
+          </archive>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
   <dependencies>
@@ -127,6 +133,11 @@
       <groupId>de.latlon.product.xplanbox</groupId>
       <artifactId>xplan-api-commons</artifactId>
     </dependency>
+    <dependency>
+      <groupId>de.latlon.product.xplanbox</groupId>
+      <artifactId>xplan-security</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <!-- XPlanung -->
     <dependency>
       <groupId>de.xleitstelle.xplanung</groupId>
@@ -221,7 +232,7 @@
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
     </dependency>
-    
+
     <!-- logging -->
     <dependency>
       <groupId>org.slf4j</groupId>
diff --git a/xplan-api/xplan-api-validator/run.sh b/xplan-api/xplan-api-validator/run.sh
index d12d67ccd8497bb2b4bc582a7eb5b75e5160e792..9da77a35839ad040f46d7781afa3084db7bb46af 100755
--- a/xplan-api/xplan-api-validator/run.sh
+++ b/xplan-api/xplan-api-validator/run.sh
@@ -7,4 +7,4 @@ if [ -n "${ALL_ADDITIONAL_ARGS}" ]; then
     echo "xPlanBox JAVA_OPTS set: $JAVA_OPTS"
 fi
 
-exec java $JAVA_OPTS -jar /xplanbox/app.jar
+exec java $JAVA_OPTS -jar /xplanbox/app.war
diff --git a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java
index 675eed1e3aad21c42f2eb6f29d7622ef32cfe95a..efb3215d534a2022f4c31669c939c35c83c49131 100644
--- a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java
+++ b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/SpringBootApp.java
@@ -21,11 +21,14 @@
 package de.latlon.xplanbox.api.validator;
 
 import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
 @ComponentScan(basePackages = { "de.latlon.xplanbox.api.validator.config" })
+@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class })
 public class SpringBootApp {
 
 	public static void main(String[] args) {
diff --git a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java
index fc4c339c3ca6054578d24b54441598896322275d..cfb8b7a10b2a3f01ecc83ecaf834a3101e9a3d64 100644
--- a/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java
+++ b/xplan-api/xplan-api-validator/src/main/java/de/latlon/xplanbox/api/validator/config/ApplicationContext.java
@@ -20,22 +20,6 @@
  */
 package de.latlon.xplanbox.api.validator.config;
 
-import static java.nio.file.Files.createTempDirectory;
-
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-import org.springframework.core.io.ResourceLoader;
-
 import de.latlon.xplan.commons.configuration.PropertiesLoader;
 import de.latlon.xplan.commons.configuration.SystemPropertyPropertiesLoader;
 import de.latlon.xplan.manager.web.shared.ConfigurationException;
@@ -57,13 +41,29 @@ import de.latlon.xplan.validator.syntactic.SyntacticValidator;
 import de.latlon.xplan.validator.syntactic.SyntacticValidatorImpl;
 import de.latlon.xplan.validator.wms.config.ValidatorWmsContext;
 import de.latlon.xplanbox.api.commons.handler.SystemConfigHandler;
+import de.latlon.xplanbox.security.config.SecurityContext;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.core.io.ResourceLoader;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import static java.nio.file.Files.createTempDirectory;
 
 /**
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 @Configuration
 @ComponentScan(basePackages = { "de.latlon.xplanbox.api.validator.handler", "de.latlon.xplanbox.api.validator.v1" })
-@Import(ValidatorWmsContext.class)
+@Import({ SecurityContext.class, ValidatorWmsContext.class })
 public class ApplicationContext {
 
 	@Autowired
diff --git a/xplan-api/xplan-api-validator/src/main/webapp/version.txt b/xplan-api/xplan-api-validator/src/main/webapp/xvalidator/version.txt
similarity index 100%
rename from xplan-api/xplan-api-validator/src/main/webapp/version.txt
rename to xplan-api/xplan-api-validator/src/main/webapp/xvalidator/version.txt
diff --git a/xplan-cli/xplan-transform-cli/pom.xml b/xplan-cli/xplan-transform-cli/pom.xml
index daa772796257057b2a3a65334037543b4b62dd18..ed8eb4c8386c3d5fac43a8214a96a3e34b724191 100644
--- a/xplan-cli/xplan-transform-cli/pom.xml
+++ b/xplan-cli/xplan-transform-cli/pom.xml
@@ -3,6 +3,7 @@
   <modelVersion>4.0.0</modelVersion>
   <artifactId>xplan-transform-cli</artifactId>
   <description>Kommandozeilentool fuer die Transformation zwischen XPlanGML Versionen</description>
+  <!-- XPlanTransformCLI is deprecated and will be removed in a future version. -->
 
   <parent>
     <groupId>de.latlon.product.xplanbox</groupId>
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java
index 4439f0302f27dfcac06353af251dc712963cafa7..8b013b097cab459a6d611092f13a7c4eefe8c8bd 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformAllExecutor.java
@@ -32,6 +32,7 @@ import java.sql.SQLException;
 import static de.latlon.xplan.commons.cli.DatabaseUtils.closeQuietly;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public class TransformAllExecutor {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java
index 9889d23d3689e8b828a9d8ae998ff3af2a16f130..5ddf8985f7dcf627d462eab39765ea646ce9d23e 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformApplicationRunner.java
@@ -45,6 +45,7 @@ import static java.nio.file.Files.exists;
 import static java.nio.file.Files.isDirectory;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 @Component
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformationSynchronizer.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformationSynchronizer.java
index 5d3d941984867ddc20c7c51c00daa8707c594058..258ec085cefbc5b618c9a879b87d8939560a84b7 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformationSynchronizer.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformationSynchronizer.java
@@ -57,6 +57,7 @@ import static de.latlon.xplan.commons.XPlanVersion.XPLAN_41;
 import static de.latlon.xplan.transform.cli.TransformApplicationRunner.LOG_TABLE_NAME;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public class TransformationSynchronizer implements Synchronizer {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformingValidator.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformingValidator.java
index 1769cb36baa637ea473131d4a6f6c009631f4b70..06ffe5d1d8bd175c66a8728e76bf448a80d63b8f 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformingValidator.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/TransformingValidator.java
@@ -42,6 +42,7 @@ import java.io.IOException;
 import java.io.InputStream;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public class TransformingValidator {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/ValidateExecutor.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/ValidateExecutor.java
index 2d13dbd5d451a0a4144c21d0d5511a5827736b07..a463c55571701f49541fd2367fd7ab3228e410c2 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/ValidateExecutor.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/ValidateExecutor.java
@@ -32,6 +32,7 @@ import java.util.List;
 import static de.latlon.xplan.commons.XPlanVersion.XPLAN_41;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public class ValidateExecutor {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/XPlanTransformCLI.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/XPlanTransformCLI.java
index b9d0347c58e173a6530e4c8663029aea82e91f3a..a2e0fb760786748f2a80b3d5e915539ee187df23 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/XPlanTransformCLI.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/XPlanTransformCLI.java
@@ -20,18 +20,16 @@
  */
 package de.latlon.xplan.transform.cli;
 
-import de.latlon.xplan.transform.cli.config.ApplicationContext;
 import org.springframework.boot.Banner;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
 
 import static de.latlon.xplan.transform.cli.TransformApplicationRunner.LOG_TABLE_NAME;
 
 /**
  * Kommandozeilenwerkzeug (command line interface) zum Verwalten von XPlanArchiven.
  *
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:schneider@occamlabs.de">Markus Schneider</a>
  * @since 1.0
  */
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/config/ApplicationContext.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/config/ApplicationContext.java
index ad93bd480eea98f4be9b5538debc72d262c39f0f..9aeb92d13b7e023ca03ccd4bbacb782ccfb99894 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/config/ApplicationContext.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/config/ApplicationContext.java
@@ -58,6 +58,7 @@ import static de.latlon.xplan.manager.workspace.WorkspaceUtils.instantiateWorksp
 /**
  * Spring Application Context for initialising TransformTool components.
  *
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz</a>
  */
 @Configuration
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/CsvTransformationResultWriter.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/CsvTransformationResultWriter.java
index 234277f8f7b9eea986d9059855cba87fa700c5bf..3f0a66cd145642477908c914f697f2b248454317 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/CsvTransformationResultWriter.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/CsvTransformationResultWriter.java
@@ -40,6 +40,7 @@ import static java.nio.file.Files.newOutputStream;
 import static org.apache.commons.io.IOUtils.write;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public class CsvTransformationResultWriter implements TransformationResultWriter {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/FileTransformationResultWriter.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/FileTransformationResultWriter.java
index 7c55188b8daa72b111ab158410322462e8a14e58..dbfd1138a69a1b4e7242d800c422d969059f8907 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/FileTransformationResultWriter.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/FileTransformationResultWriter.java
@@ -37,6 +37,7 @@ import static java.nio.file.Files.newOutputStream;
 import static org.apache.commons.io.IOUtils.write;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public class FileTransformationResultWriter implements TransformationResultWriter {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformationResultWriter.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformationResultWriter.java
index 1b5ebd5f058e6b923d7d163d44aec24f1407cba7..d3d535a7a8ba1fc36d37d948d9c07d1a06a50ffd 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformationResultWriter.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformationResultWriter.java
@@ -26,6 +26,7 @@ import de.latlon.xplan.validator.syntactic.report.SyntacticValidatorResult;
 import java.io.Closeable;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public interface TransformationResultWriter extends Closeable {
diff --git a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformingValidationResult.java b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformingValidationResult.java
index aee61dffacc9d2c07f0efab6bb2ecb24282ee1a8..49e2fdf37f7d0be4cf6144e1e0ae28e50c4d7629 100644
--- a/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformingValidationResult.java
+++ b/xplan-cli/xplan-transform-cli/src/main/java/de/latlon/xplan/transform/cli/result/TransformingValidationResult.java
@@ -25,6 +25,7 @@ import de.latlon.xplan.manager.web.shared.XPlan;
 import de.latlon.xplan.validator.syntactic.report.SyntacticValidatorResult;
 
 /**
+ * @deprecated will be removed in a future version.
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  */
 public class TransformingValidationResult {
diff --git a/xplan-documentation/xplan-benutzerhandbuch/src/main/asciidoc/XPlanTransform_CLI.adoc b/xplan-documentation/xplan-benutzerhandbuch/src/main/asciidoc/XPlanTransform_CLI.adoc
index 863c5b48710f16c08375a4c42917e81fc1c3070c..fc232679023b003b113e2c11eb35ec96553fea41 100644
--- a/xplan-documentation/xplan-benutzerhandbuch/src/main/asciidoc/XPlanTransform_CLI.adoc
+++ b/xplan-documentation/xplan-benutzerhandbuch/src/main/asciidoc/XPlanTransform_CLI.adoc
@@ -5,12 +5,9 @@ Die Komponente XPlanTransformCLI ist ein Kommandozeilenwerkzeug, welches dem Fac
 
 Die transformierten Pläne können entweder syntaktisch validiert und das Validierungsergebnis in eine CSV-Datei geschrieben werden oder die transformierten Pläne werden in die entsprechende Datenhaltung eingespielt.
 
-[NOTE]
-====
+NOTE: Unterstützt wird derzeit die Transformation von XPlanGML 4.1 nach XPlanGML 5.1
 
-Unterstützt wird derzeit die Transformation von XPlanGML 4.1 nach XPlanGML 5.1
-
-====
+IMPORTANT: Das XPlanTransformCLI ist veraltet und wird in zukünftigen Versionen der xPlanBox entfernt
 
 [[xplantransform-cli-installation]]
 === Installation
diff --git a/xplan-documentation/xplan-betriebshandbuch/src/main/asciidoc/architektur.adoc b/xplan-documentation/xplan-betriebshandbuch/src/main/asciidoc/architektur.adoc
index f5436b8458feeb3a0ce3b1da4c66fc17e1171a4a..a441d88fc49dd90564eb8aac9bf837cad0f1c2ad 100644
--- a/xplan-documentation/xplan-betriebshandbuch/src/main/asciidoc/architektur.adoc
+++ b/xplan-documentation/xplan-betriebshandbuch/src/main/asciidoc/architektur.adoc
@@ -88,6 +88,8 @@ welches dem Fachadministrator der xPlanBox ermöglicht,
 bereits über den XPlanManagerWeb oder das XPlanManagerCLI
 importierte Pläne in eine aktuellere XPlanGML-Version zu transformieren und in der <<xplandb>> zu speichern.
 
+IMPORTANT: Das XPlanTransformCLI ist veraltet und wird in zukünftigen Versionen der xPlanBox entfernt.
+
 [[xplanevaluationschemasynchronize-cli]]
 === XPlanAuswerteschemaCLI
 
diff --git a/xplan-security/pom.xml b/xplan-security/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7b928556b436f59b4851d0c59c71d7a91f60fd37
--- /dev/null
+++ b/xplan-security/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>xplan-security</artifactId>
+
+  <parent>
+    <groupId>de.latlon.product.xplanbox</groupId>
+    <artifactId>xplanbox</artifactId>
+    <version>7.1-SNAPSHOT</version>
+  </parent>
+
+  <dependencies>
+    <dependency>
+      <groupId>javax.servlet</groupId>
+      <artifactId>javax.servlet-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-security</artifactId>
+    </dependency>
+    <!-- logging -->
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <!-- test -->
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.springframework.boot</groupId>
+      <artifactId>spring-boot-starter-test</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..7721fac23399fc423cb17bcbaf44b3557512bf66
--- /dev/null
+++ b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/PropertiesFileUserDetailsManager.java
@@ -0,0 +1,79 @@
+package de.latlon.xplanbox.security.authentication;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.security.core.userdetails.User;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.provisioning.UserDetailsManager;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+import java.util.stream.Collectors;
+
+/**
+ * {@link UserDetailsManager} managing user details from properties file
+ *
+ * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
+ * @since 7.1
+ */
+public class PropertiesFileUserDetailsManager implements UserDetailsManager {
+
+	private static final Logger LOG = LoggerFactory.getLogger(PropertiesFileUserDetailsManager.class);
+
+	private final Map<String, String> usersAndEncryptedPasswords;
+
+	public PropertiesFileUserDetailsManager(String userPropertiesFile, PasswordEncoder passwordEncoder)
+			throws SecurityConfigurationException {
+		try (FileInputStream inputStream = new FileInputStream(userPropertiesFile)) {
+			Properties users = new Properties();
+			users.load(inputStream);
+			this.usersAndEncryptedPasswords = users.entrySet()
+				.stream()
+				.collect(Collectors.toMap(entry -> (String) entry.getKey(),
+						entry -> passwordEncoder.encode((String) entry.getValue())));
+		}
+		catch (IOException e) {
+			LOG.error("Properties file with users could not be read. ", e);
+			throw new SecurityConfigurationException(e);
+		}
+	}
+
+	@Override
+	public void createUser(UserDetails user) {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void updateUser(UserDetails user) {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void deleteUser(String username) {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public void changePassword(String oldPassword, String newPassword) {
+		throw new UnsupportedOperationException();
+	}
+
+	@Override
+	public boolean userExists(String username) {
+		return usersAndEncryptedPasswords.containsKey(username);
+	}
+
+	@Override
+	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
+		if (!userExists(username)) {
+			throw new UsernameNotFoundException(username);
+		}
+		String password = this.usersAndEncryptedPasswords.get(username);
+		return User.withUsername(username).password(password).roles("USER_ROLE").build();
+	}
+
+}
diff --git a/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/SecurityConfigurationException.java b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/SecurityConfigurationException.java
new file mode 100644
index 0000000000000000000000000000000000000000..b7b9da4d2bdae0711729905f024a1dfae7c134ec
--- /dev/null
+++ b/xplan-security/src/main/java/de/latlon/xplanbox/security/authentication/SecurityConfigurationException.java
@@ -0,0 +1,15 @@
+package de.latlon.xplanbox.security.authentication;
+
+/**
+ * Indicates a misconfiguration in the security module.
+ *
+ * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
+ * @since 7.1
+ */
+public class SecurityConfigurationException extends Exception {
+
+	public SecurityConfigurationException(Throwable e) {
+		super(e);
+	}
+
+}
diff --git a/xplan-security/src/main/java/de/latlon/xplanbox/security/config/SecurityContext.java b/xplan-security/src/main/java/de/latlon/xplanbox/security/config/SecurityContext.java
new file mode 100644
index 0000000000000000000000000000000000000000..1bebe7c5513d2729cfa1b98b4297a3734627af09
--- /dev/null
+++ b/xplan-security/src/main/java/de/latlon/xplanbox/security/config/SecurityContext.java
@@ -0,0 +1,49 @@
+package de.latlon.xplanbox.security.config;
+
+import de.latlon.xplanbox.security.authentication.PropertiesFileUserDetailsManager;
+import de.latlon.xplanbox.security.authentication.SecurityConfigurationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.web.SecurityFilterChain;
+
+/**
+ * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
+ * @since 7.1
+ */
+@EnableWebSecurity
+@Configuration
+@Profile("enableSecurity")
+@ComponentScan(basePackages = { "de.latlon.xplanbox.security" })
+public class SecurityContext {
+
+	private static final Logger LOG = LoggerFactory.getLogger(SecurityContext.class);
+
+	@Bean
+	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
+		LOG.info("Configure security.");
+		http.csrf((csrf) -> csrf.disable()).authorizeRequests().anyRequest().authenticated().and().httpBasic();
+		return http.build();
+	}
+
+	@Bean
+	public PropertiesFileUserDetailsManager userDetailsService(
+			@Value("#{environment.XPLAN_SECURITY_USER_PROPERTIES_FILE}") String userPropertiesFile,
+			PasswordEncoder passwordEncoder) throws SecurityConfigurationException {
+		return new PropertiesFileUserDetailsManager(userPropertiesFile, passwordEncoder);
+	}
+
+	@Bean
+	public PasswordEncoder passwordEncoder() {
+		return new BCryptPasswordEncoder();
+	}
+
+}
\ No newline at end of file
diff --git a/xplan-security/src/test/java/de/latlon/xplanbox/security/config/SecurityContextTest.java b/xplan-security/src/test/java/de/latlon/xplanbox/security/config/SecurityContextTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4705d2f1e2940594d14c3a62163ed1a251e46d46
--- /dev/null
+++ b/xplan-security/src/test/java/de/latlon/xplanbox/security/config/SecurityContextTest.java
@@ -0,0 +1,19 @@
+package de.latlon.xplanbox.security.config;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+
+/**
+ * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
+ */
+@SpringBootTest
+@ContextConfiguration(classes = SecurityContext.class)
+public class SecurityContextTest {
+
+	@Test
+	public void contextLoad() {
+
+	}
+
+}
diff --git a/xplan-tests/xplan-tests-soapui/pom.xml b/xplan-tests/xplan-tests-soapui/pom.xml
index cb2cb464956f5ab467c78e02021f294257fc5fcd..081c6d3f09240f3f2d80430757ea54bfa614244f 100644
--- a/xplan-tests/xplan-tests-soapui/pom.xml
+++ b/xplan-tests/xplan-tests-soapui/pom.xml
@@ -90,6 +90,7 @@
                   <settingsFile>${basedir}/src/main/resources/soapui-settings.xml</settingsFile>
                   <outputFolder>${project.build.directory}/soapui</outputFolder>
                   <junitReport>true</junitReport>
+                  <exportAll>true</exportAll>
                   <testFailIgnore>true</testFailIgnore>
                   <endpoint>${endpoint}</endpoint>
                   <username>${username}</username>
diff --git a/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh b/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh
index c199bb8c10ca63dd3f5ec8847f3df61b389b0f83..0caa5c19c3557774d1c5e331c2f6eb0c16d30e3a 100755
--- a/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh
+++ b/xplan-tests/xplan-tests-soapui/runAllSoapUiTests.sh
@@ -48,7 +48,7 @@ echo "Transforming to PDF $REPORT_PATH_PDF..."
 sed -i 's/display:none;//' target/site/surefire-report.html
 weasyprint file://$PWD/target/site/surefire-report.html $REPORT_PATH_PDF
 REPORT_PATH_TAR=target/test-report.tar.gz
-tar cfz $REPORT_PATH_TAR -C target/site .
+tar cfz $REPORT_PATH_TAR -C target site soapui
 
 if [ "$XPLAN_UPLOAD_TEST_REPORT" = "true" ];
 then
diff --git a/xplan-webapps/xplan-root/Dockerfile b/xplan-webapps/xplan-root/Dockerfile
index f0817e221516f6d2a9afd16155078e108cff79bb..b2d3abfe2f4d9b576fa969ebe3081eedad1191bc 100644
--- a/xplan-webapps/xplan-root/Dockerfile
+++ b/xplan-webapps/xplan-root/Dockerfile
@@ -1,5 +1,22 @@
 FROM httpd:2.4.58-alpine
+ARG BUILD_DATE=?
+ARG DOCKER_IMAGE_NAME=?
+ARG GIT_REVISION=?
+ARG WEB_CONTEXT=ROOT
+ARG XPLANBOX_VERSION=latest
 
+# see https://github.com/opencontainers/image-spec/blob/main/annotations.md#pre-defined-annotation-keys
+LABEL "org.opencontainers.image.created"="$BUILD_DATE" \
+	"org.opencontainers.image.description"="ozgxplanung xPlanBox component" \
+	"org.opencontainers.image.licenses"="GNU Affero General Public License & others" \
+	"org.opencontainers.image.ref.name"="$DOCKER_IMAGE_NAME" \
+	"org.opencontainers.image.revision"="$GIT_REVISION" \
+	"org.opencontainers.image.title"="ozgxplanung - $DOCKER_IMAGE_NAME" \
+	"org.opencontainers.image.url"="https://gitlab.opencode.de/diplanung/ozgxplanung" \
+	"org.opencontainers.image.vendor"="lat/lon GmbH" \
+	"org.opencontainers.image.version"="$XPLANBOX_VERSION"
+
+RUN apk add -U tzdata
 ENV TZ=Europe/Berlin
 
-COPY target/xplan-root-*-default /usr/local/apache2/htdocs/
\ No newline at end of file
+COPY target/xplan-root-*-default /usr/local/apache2/htdocs/