From c001a3128d666db1ba9efc226d1247da1dfa8c91 Mon Sep 17 00:00:00 2001
From: latlon team <info@lat-lon.de>
Date: Tue, 18 Feb 2025 09:37:11 +0000
Subject: [PATCH] Code drop

- XPLANBOX-3701 - disable chunk encoding, ensure startup if bucket policy cannot be set (eed3d7ce1)
- XPLANBOX-3696 - Update tests with internalId and enhance assertions for planStatus (7337c0999)
- XPLANBOX-3696 - Enhance assertion to check if not requested status is not returned (252ac98fd)
- XPLANBOX-3562 - renamed Query param planStatus and splitted values in v2 (not comma separated) in SoapUI-Tests (f6618f75f)
- XPLANBOX-3562 - implemented support of multiple planStatus query params, renamed planStatus param (6139a7a07)
- XPLANBOX-3696 - Enhance v1 SoapUI tests to test internalId and planstatus parameters in /plans TestCase (c1192f0ae)
- XPLANBOX-3696 - Disable test GET BP 6.0.2 pI getByPlanIdNoResult (c0f90aea9)
- XPLANBOX-3696 - Enhance v2 /plans tests by two new parameter tests and four tests checking empty results (negative verification) (344d1fddb)
- XPLANBOX-3696 - Implement assertions for new parameters of /plans path in OpenAPI document in v1 and v2 test suites (b75116f9a)
- XPLANBOX-3562 - implemented filter parameter internalId and planstatus (db92d4dc0)

Co-authored-by: Dirk Stenger <stenger@lat-lon.de>
Co-authored-by: Lyn Elisa Goltz <goltz@lat-lon.de>

Dropped from commit: 677f1992e8dfeb962d1d625d2903616ed640e4f0
---
 .../de/latlon/xplan/commons/s3/S3Storage.java |   32 +-
 .../s3/config/AmazonS3ReadOnlyContext.java    |   15 +-
 .../manager/db/repository/PlanRepository.java |   19 +-
 .../db/repository/PlanRepositoryTest.java     |   88 +-
 .../xplan/manager/database/XPlanDao.java      |   15 +-
 .../manager/database/XPlanDbAdapter.java      |   24 +-
 .../api/manager/handler/PlanHandler.java      |   11 +-
 .../api/manager/openapi/v1/ApiV1Config.java   |    2 +-
 .../api/manager/openapi/v2/ApiV2Config.java   |    2 +-
 .../xplanbox/api/manager/v1/PlansApi.java     |   22 +-
 .../api/manager/v1/model/PlanStatusEnum.java  |    5 +
 .../xplanbox/api/manager/v2/PlansApi2.java    |   24 +-
 .../src/main/resources/application.properties |    1 +
 .../api/manager/config/TestContext.java       |   16 +-
 .../api/manager/handler/PlanHandlerTest.java  |   35 +-
 .../xplanbox/api/manager/v1/PlansApiTest.java |   10 +
 .../api/manager/v2/PlansApi2Test.java         |   10 +
 .../xplan-manager-api-soapui-project.xml      | 1161 +++++++++++++++--
 .../src/main/resources/application.properties |    1 +
 .../src/main/resources/application.properties |    1 +
 20 files changed, 1287 insertions(+), 207 deletions(-)

diff --git a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java
index 6c7d68d84..663aed7b2 100644
--- a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java
+++ b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/S3Storage.java
@@ -72,18 +72,26 @@ public class S3Storage {
 
 	public void setBucketExpirationDate(String id, int expirationInDays) throws StorageException {
 		createBucketIfNotExists();
-		LifecycleRule rule = LifecycleRule.builder()
-			.id(id)
-			.expiration(LifecycleExpiration.builder().days(expirationInDays).build())
-			.status(ExpirationStatus.ENABLED)
-			.filter(LifecycleRuleFilter.builder().build())
-			.build();
-		BucketLifecycleConfiguration bucketLifecycleConfig = BucketLifecycleConfiguration.builder().rules(rule).build();
-		PutBucketLifecycleConfigurationRequest lifecycleRequest = PutBucketLifecycleConfigurationRequest.builder()
-			.bucket(bucketName)
-			.lifecycleConfiguration(bucketLifecycleConfig)
-			.build();
-		client.putBucketLifecycleConfiguration(lifecycleRequest);
+		try {
+			LifecycleRule rule = LifecycleRule.builder()
+				.id(id)
+				.expiration(LifecycleExpiration.builder().days(expirationInDays).build())
+				.status(ExpirationStatus.ENABLED)
+				.filter(LifecycleRuleFilter.builder().build())
+				.build();
+			BucketLifecycleConfiguration bucketLifecycleConfig = BucketLifecycleConfiguration.builder()
+				.rules(rule)
+				.build();
+			PutBucketLifecycleConfigurationRequest lifecycleRequest = PutBucketLifecycleConfigurationRequest.builder()
+				.bucket(bucketName)
+				.lifecycleConfiguration(bucketLifecycleConfig)
+				.build();
+			client.putBucketLifecycleConfiguration(lifecycleRequest);
+		}
+		catch (Exception e) {
+			LOG.warn("Could not set expiration date for bucket {} to {} days: {}", bucketName, expirationInDays,
+					e.getMessage());
+		}
 	}
 
 	/**
diff --git a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java
index 512e200a1..184da117d 100644
--- a/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java
+++ b/xplan-core/xplan-core-commons/src/main/java/de/latlon/xplan/commons/s3/config/AmazonS3ReadOnlyContext.java
@@ -35,6 +35,7 @@ import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
 import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
 import software.amazon.awssdk.regions.Region;
 import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.S3Configuration;
 
 /**
  * Spring configuration for using AWS S3 as a storage.
@@ -53,15 +54,21 @@ public class AmazonS3ReadOnlyContext {
 	@Bean(destroyMethod = "close")
 	public S3Client s3Client(AwsCredentialsProvider credentialsProvider,
 			@Value("${xplanbox.s3.region:#{environment.XPLAN_S3_REGION}}") String region,
-			@Value("${xplanbox.s3.endpoint.url:#{environment.XPLAN_S3_ENDPOINT}}") String endpointUrl)
+			@Value("${xplanbox.s3.endpoint.url:#{environment.XPLAN_S3_ENDPOINT}}") String endpointUrl,
+			@Value("${xplanbox.s3.chunkedEncodingEnabled:true}") boolean chunkedEncodingEnabled)
 			throws URISyntaxException {
-
 		if (endpointUrl == null || endpointUrl.isEmpty()) {
 			LOG.info("Using S3 region {}", region);
-			return S3Client.builder().credentialsProvider(credentialsProvider).region(Region.of(region)).build();
+			return S3Client.builder()
+				.serviceConfiguration(S3Configuration.builder().chunkedEncodingEnabled(chunkedEncodingEnabled).build())
+				.credentialsProvider(credentialsProvider)
+				.region(Region.of(region))
+				.build();
 		}
-		LOG.info("Using S3 url {} (region {})", endpointUrl);
+		LOG.info("Using S3 url {} (region {}) chunk encoding is {}", endpointUrl, region,
+				chunkedEncodingEnabled ? "enabled" : "disabled");
 		return S3Client.builder()
+			.serviceConfiguration(S3Configuration.builder().chunkedEncodingEnabled(chunkedEncodingEnabled).build())
 			.credentialsProvider(credentialsProvider)
 			.region(Region.of(region))
 			.endpointOverride(new URI(endpointUrl))
diff --git a/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java b/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java
index ce0a28399..79842d373 100644
--- a/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java
+++ b/xplan-core/xplan-core-manager-db/src/main/java/de/latlon/xplan/core/manager/db/repository/PlanRepository.java
@@ -20,31 +20,34 @@
  */
 package de.latlon.xplan.core.manager.db.repository;
 
+import java.util.List;
+
 import de.latlon.xplan.core.manager.db.model.Plan;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 import org.springframework.data.repository.query.Param;
 import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
-
 /**
  * @author <a href="mailto:goltz@lat-lon.de">Lyn Goltz </a>
  * @since 7.0
  */
 @Repository
 @Transactional
-public interface PlanRepository extends CrudRepository<Plan, Integer> {
+public interface PlanRepository extends CrudRepository<Plan, Integer>, JpaSpecificationExecutor<Plan> {
 
 	List<Plan> findByName(String name);
 
-	@Query(value = "from Plan as p where lower(p.name) like lower(concat('%', :name, '%'))")
-	List<Plan> findByNameLike(@Param("name") String name);
+	@Query(value = "from Plan as p where (lower(p.name) like lower(concat('%', :name, '%')) or :name is null) "
+			+ "and (p.internalid = :internalid or :internalid is null) " + "and p.planstatus in :planStatuses")
+	List<Plan> findBySearchParams(@Param("name") String name, @Param("internalid") String internalid,
+			@Param("planStatuses") List<String> planStatuses);
 
-	@Query(value = "from Plan as p where p.hasRaster = true AND wmssortdate=(SELECT min(wmssortdate) FROM Plan as p1 WHERE p1.wmssortdate IS NOT NULL AND p1.wmssortdate > :sortDate)")
-	List<Plan> findByPlanWithMoreRecentRasterPlan(@Param("sortDate") Date sortDate);
+	@Query(value = "from Plan as p where (lower(p.name) like lower(concat('%', :name, '%')) or :name is null) "
+			+ "and (p.internalid = :internalid or :internalid is null)")
+	List<Plan> findBySearchParams(@Param("name") String name, @Param("internalid") String internalid);
 
 	boolean existsPlanById(Integer id);
 
diff --git a/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java b/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java
index f83479a05..a24d0c0d7 100644
--- a/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java
+++ b/xplan-core/xplan-core-manager-db/src/test/java/de/latlon/xplan/core/manager/db/repository/PlanRepositoryTest.java
@@ -22,6 +22,8 @@ package de.latlon.xplan.core.manager.db.repository;
 
 import static de.latlon.xplan.commons.XPlanType.BP_Plan;
 import static de.latlon.xplan.commons.XPlanVersion.XPLAN_51;
+import static de.latlon.xplan.manager.web.shared.PlanStatus.ARCHIVIERT;
+import static de.latlon.xplan.manager.web.shared.PlanStatus.FESTGESTELLT;
 import static de.latlon.xplan.manager.web.shared.PlanStatus.IN_AUFSTELLUNG;
 import static java.nio.charset.StandardCharsets.UTF_8;
 import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -147,50 +149,43 @@ class PlanRepositoryTest {
 
 	@Test
 	@Commit
-	void verify_findByNameLike() {
+	void verify_findBySearchParams() {
 		assertFalse(TestTransaction.isFlaggedForRollback());
-		String name = "saveAndFindByLikeName";
-		Bereich bereich = new Bereich().nummer("0").name("test");
-		Feature feature = new Feature().num(1).fid("123");
-		Plan plan = new Plan().name(name)
-			.importDate(new Date())
-			.version(XPLAN_51)
-			.type(BP_Plan)
-			.hasRaster(false)
-			.bereiche(Collections.singleton(bereich))
-			.features(Collections.singleton(feature));
-		planRepository.save(plan);
-		List<Plan> existingPlan = planRepository.findByNameLike("iKEnAme");
-		assertFalse(existingPlan.isEmpty());
+		createAndSavePlan("saveAndFindByLikeName1", null, null);
+		createAndSavePlan("saveAndFindByLikeName2", "internalId1", null);
+		createAndSavePlan("saveAndFindByLikeName3", "internalId2", FESTGESTELLT);
+		createAndSavePlan("saveAndFindByLikeName4", null, IN_AUFSTELLUNG);
+		createAndSavePlan(null, null, ARCHIVIERT);
+		createAndSavePlan(null, "internalId3", null);
+		createAndSavePlan(null, "internalId4", FESTGESTELLT);
+		List<Plan> existingPlanByName = planRepository.findBySearchParams("iKEnAme", null);
+		assertFalse(existingPlanByName.isEmpty());
 
-		List<Plan> nonExistingPlan = planRepository.findByNameLike("unknown");
-		assertTrue(nonExistingPlan.isEmpty());
-	}
+		List<Plan> existingPlanByInternalId = planRepository.findBySearchParams(null, "internalId2");
+		assertFalse(existingPlanByInternalId.isEmpty());
 
-	@Test
-	@Commit
-	void verify_findByPlanWithMoreRecentRasterPlan() {
-		assertFalse(TestTransaction.isFlaggedForRollback());
-		Bereich bereich = new Bereich().nummer("0").name("test");
-		Feature feature = new Feature().num(1).fid("123");
-		Date wmsSortDate = new Date();
-		Plan plan = new Plan().name("saveAndFindPlanWithMoreRecentRasterPlan")
-			.importDate(new Date())
-			.version(XPLAN_51)
-			.type(BP_Plan)
-			.hasRaster(true)
-			.wmssortdate(wmsSortDate)
-			.bereiche(Collections.singleton(bereich))
-			.features(Collections.singleton(feature));
-		planRepository.save(plan);
+		List<Plan> existingPlanByPlanstatus = planRepository.findBySearchParams(null, null,
+				Collections.singletonList(FESTGESTELLT.getMessage()));
+		assertFalse(existingPlanByPlanstatus.isEmpty());
 
-		Date tomorrow = new Date(wmsSortDate.getTime() - (1000 * 60 * 60 * 24));
-		List<Plan> existingPlan = planRepository.findByPlanWithMoreRecentRasterPlan(tomorrow);
-		assertFalse(existingPlan.isEmpty());
+		List<Plan> existingPlanByNameAndPlanstatus = planRepository.findBySearchParams("veand", null,
+				Collections.singletonList(FESTGESTELLT.getMessage()));
+		assertFalse(existingPlanByNameAndPlanstatus.isEmpty());
 
-		Date yesterday = new Date(wmsSortDate.getTime() + (1000 * 60 * 60 * 24));
-		List<Plan> nonExistingPlan = planRepository.findByPlanWithMoreRecentRasterPlan(yesterday);
-		assertTrue(nonExistingPlan.isEmpty());
+		List<Plan> existingPlanByNameAndInternalId = planRepository.findBySearchParams("veand", "internalId1");
+		assertFalse(existingPlanByNameAndInternalId.isEmpty());
+
+		List<Plan> existingPlanByNameAndInternalIdAndPlanStatus = planRepository.findBySearchParams("veand",
+				"internalId2", Collections.singletonList(FESTGESTELLT.getMessage()));
+		assertFalse(existingPlanByNameAndInternalIdAndPlanStatus.isEmpty());
+
+		List<Plan> nonExistingPlanByNameAndInternalId = planRepository.findBySearchParams("unknown", "unknown");
+		assertTrue(nonExistingPlanByNameAndInternalId.isEmpty());
+
+		List<Plan> nonExistingPlanByNameAndInternalIdAndPlanstatus = planRepository.findBySearchParams(
+				"saveAndFindByLikeName2", "internalId1",
+				List.of(FESTGESTELLT.getMessage(), IN_AUFSTELLUNG.getMessage()));
+		assertTrue(nonExistingPlanByNameAndInternalIdAndPlanstatus.isEmpty());
 	}
 
 	@Test
@@ -246,4 +241,19 @@ class PlanRepositoryTest {
 		assertFalse(notPlanExists);
 	}
 
+	private void createAndSavePlan(String name, String internalId, PlanStatus planStatus) {
+		Bereich bereich = new Bereich().nummer("0").name("test");
+		Feature feature = new Feature().num(1).fid("123");
+		Plan plan = new Plan().name(name)
+			.internalid(internalId)
+			.planstatus(planStatus != null ? planStatus.getMessage() : null)
+			.importDate(new Date())
+			.version(XPLAN_51)
+			.type(BP_Plan)
+			.hasRaster(false)
+			.bereiche(Collections.singleton(bereich))
+			.features(Collections.singleton(feature));
+		planRepository.save(plan);
+	}
+
 }
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java
index fc65b6889..47c0eeb46 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDao.java
@@ -22,7 +22,6 @@ package de.latlon.xplan.manager.database;
 
 import java.io.InputStream;
 import java.sql.SQLException;
-import java.util.Date;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -160,18 +159,8 @@ public class XPlanDao {
 		return xPlanDbAdapter.getXPlanByName(planName);
 	}
 
-	public List<XPlan> getXPlansLikeName(String planName) {
-		return xPlanDbAdapter.getXPlansLikeName(planName);
-	}
-
-	/**
-	 * retrieves the id of the plan closest in future to the date passed
-	 * @param releaseDate minimal release date
-	 * @return id of plan with minimal release date
-	 * @throws SQLException
-	 */
-	public int getPlanIdOfMoreRecentRasterPlan(Date releaseDate) {
-		return xPlanDbAdapter.selectXPlanIdOfMoreRecentRasterPlan(releaseDate);
+	public List<XPlan> getXPlansBySearchParams(String planName, String internalId, List<PlanStatus> planStatuses) {
+		return xPlanDbAdapter.getXPlansBySearchParams(planName, internalId, planStatuses);
 	}
 
 	/**
diff --git a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java
index ea56708e7..a38ba2201 100644
--- a/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java
+++ b/xplan-core/xplan-core-manager/src/main/java/de/latlon/xplan/manager/database/XPlanDbAdapter.java
@@ -38,7 +38,6 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.file.Files;
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -279,27 +278,14 @@ public class XPlanDbAdapter {
 	}
 
 	@Transactional(readOnly = true)
-	public List<XPlan> getXPlansLikeName(String planName) {
-		List<Plan> plans = planRepository.findByNameLike(planName);
+	public List<XPlan> getXPlansBySearchParams(String planName, String internalId, List<PlanStatus> planStatuses) {
+		List<Plan> plans = planStatuses != null && !planStatuses.isEmpty()
+				? planRepository.findBySearchParams(planName, internalId,
+						planStatuses.stream().map(PlanStatus::getMessage).toList())
+				: planRepository.findBySearchParams(planName, internalId);
 		return plans.stream().map(plan -> convertToXPlan(plan)).collect(Collectors.toList());
 	}
 
-	/**
-	 * retrieves the id of the plan closest in future to the date passed
-	 * @param releaseDate minimal release date
-	 * @return id of plan with minimal release date, -1 if no such plan exists
-	 * @throws SQLException
-	 */
-	@Transactional(readOnly = true)
-	public int selectXPlanIdOfMoreRecentRasterPlan(Date releaseDate) {
-		if (releaseDate == null)
-			return -1;
-		List<Plan> plan = planRepository.findByPlanWithMoreRecentRasterPlan(releaseDate);
-		if (plan.isEmpty())
-			return -1;
-		return plan.get(0).getId();
-	}
-
 	/**
 	 * exports a plan
 	 * @param planId of plan to export
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java
index 7744f7897..4840af248 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/handler/PlanHandler.java
@@ -49,6 +49,7 @@ import de.latlon.xplanbox.api.commons.exception.InvalidPlanIdSyntax;
 import de.latlon.xplanbox.api.commons.exception.UnsupportedParameterValue;
 import de.latlon.xplanbox.api.manager.v1.model.Bereich;
 import de.latlon.xplanbox.api.manager.v1.model.Gemeinde;
+import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum;
 import de.latlon.xplanbox.api.manager.v1.model.StatusMessage;
 import de.latlon.xplanbox.security.authorization.AgsAccessor;
 import jakarta.inject.Singleton;
@@ -127,11 +128,11 @@ public class PlanHandler implements AgsAccessor {
 		return xPlanDao.getXPlanByName(planName);
 	}
 
-	public List<XPlan> findPlans(String planName) throws Exception {
-		LOG.info("Searching plan by name '{}'", StringUtils.normalizeSpace(planName));
-		if (planName != null)
-			return xPlanDao.getXPlansLikeName(planName);
-		return xPlanDao.getXPlanList();
+	public List<XPlan> findPlans(String planName, String internalId, List<PlanStatusEnum> planStatuses) {
+		LOG.info("Searching plan by name '{}', internalId '{}' and planstatus '{}'",
+				StringUtils.normalizeSpace(planName), StringUtils.normalizeSpace(internalId), planStatuses);
+		return xPlanDao.getXPlansBySearchParams(planName, internalId,
+				planStatuses != null ? planStatuses.stream().map(PlanStatusEnum::toPlanStatus).toList() : null);
 	}
 
 	public List<XPlan> findPlansById(List<Integer> planIds) throws Exception {
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java
index 930a39110..ec376485f 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v1/ApiV1Config.java
@@ -102,7 +102,7 @@ public class ApiV1Config extends AbstractApiConfig {
 
 	protected void addInfo(OpenAPI openApi, ManagerApiConfiguration managerApiConfiguration) {
 		openApi.setInfo(new Info().title("XPlanManagerAPI")
-			.version("1.5.0")
+			.version("1.6.0")
 			.description("XPlanManager REST API")
 			.termsOfService(getTermsOfService(managerApiConfiguration))
 			.license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html")));
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java
index 1e5d613ee..3a98bcf57 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/openapi/v2/ApiV2Config.java
@@ -103,7 +103,7 @@ public class ApiV2Config extends AbstractApiConfig {
 
 	protected void addInfo(OpenAPI openApi, ManagerApiConfiguration managerApiConfiguration) {
 		openApi.setInfo(new Info().title("XPlanManagerAPI")
-			.version("2.0.0")
+			.version("2.1.0")
 			.description("XPlanManager REST API v2")
 			.termsOfService(getTermsOfService(managerApiConfiguration))
 			.license(new License().name("Apache 2.0").url("http://www.apache.org/licenses/LICENSE-2.0.html")));
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java
index fba168eea..efba5119a 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/PlansApi.java
@@ -34,6 +34,7 @@ import de.latlon.xplanbox.api.manager.handler.PlanHandler;
 import de.latlon.xplanbox.api.manager.v1.model.Bereich;
 import de.latlon.xplanbox.api.manager.v1.model.Gemeinde;
 import de.latlon.xplanbox.api.manager.v1.model.PlanInfo;
+import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.media.ArraySchema;
@@ -72,24 +73,30 @@ public class PlansApi {
 	@GET
 	@Produces({ "application/json" })
 	@Operation(summary = "Search for plan by name",
-			description = "Returns a list of plans where the plan name contains the query string case insensitve",
+			description = "Returns a list of plans where the plan matches the passed query parameter",
 			tags = { "search" },
 			responses = {
 					@ApiResponse(responseCode = "200", description = "OK",
 							content = @Content(
 									array = @ArraySchema(schema = @Schema(implementation = PlanInfo.class)))),
 					@ApiResponse(responseCode = "406", description = "Requested format is not available") })
-	public Response findByNameOrId(
+	public Response searchPlans(
 			@QueryParam("planName") @Parameter(description = "The name of the plan to search for",
 					example = "bplan_123, fplan-123, rplan20200803") String planName,
+			@QueryParam("internalId") @Parameter(description = "The internalId of the plan to search for",
+					example = "ID_8ee57554-5f58-42ea-86a4-e9f4acd9d3c1") String internalId,
+			@QueryParam("planStatus") @Parameter(description = "The planStatus of the plan to search for",
+					example = "FESTGESTELLT") List<PlanStatusEnum> planStatuses,
 			@QueryParam("planId") @Parameter(description = "The ID of the plan to search for",
 					example = "1, 2, 42") List<Integer> planIds,
 			@QueryParam("includeGeltungsbereich") @DefaultValue("false") @Parameter(
 					description = "true if the geltungsbereichWGS84 should be included in the response, false otherwise (default: false).") boolean includeGeltungsbereich)
 			throws Exception {
-		if (planName != null && !planIds.isEmpty())
-			throw new InvalidSearch("Searching by name and id within the same request is not supported!");
-		List<XPlan> plans = searchByNameOrId(planName, planIds);
+		if ((planName != null || internalId != null || (planStatuses != null && !planStatuses.isEmpty()))
+				&& !planIds.isEmpty())
+			throw new InvalidSearch(
+					"Searching by planName, internalId or planstatus and id within the same request is not supported!");
+		List<XPlan> plans = searchPlans(planName, internalId, planStatuses, planIds);
 		List<PlanInfo> planInfos = plans.stream().map(xPlan -> {
 			List<Bereich> bereiche = planHandler.findBereiche(xPlan.getId());
 			List<Gemeinde> gemeinden = planHandler.findGemeinden(xPlan.getId());
@@ -103,11 +110,12 @@ public class PlansApi {
 		return Response.ok().entity(planInfos).build();
 	}
 
-	private List<XPlan> searchByNameOrId(String planName, List<Integer> planIds) throws Exception {
+	private List<XPlan> searchPlans(String planName, String internalId, List<PlanStatusEnum> planStatuses,
+			List<Integer> planIds) throws Exception {
 		if (!planIds.isEmpty()) {
 			return planHandler.findPlansById(planIds);
 		}
-		return planHandler.findPlans(planName);
+		return planHandler.findPlans(planName, internalId, planStatuses);
 	}
 
 }
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java
index 3430778e1..5d7eab259 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v1/model/PlanStatusEnum.java
@@ -22,6 +22,7 @@ package de.latlon.xplanbox.api.manager.v1.model;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonValue;
+import de.latlon.xplan.manager.web.shared.PlanStatus;
 
 /**
  * Enumeration for plan status.
@@ -59,4 +60,8 @@ public enum PlanStatusEnum {
 		throw new IllegalArgumentException("Unexpected value '" + value + "'");
 	}
 
+	public PlanStatus toPlanStatus() {
+		return PlanStatus.valueOf(value);
+	}
+
 }
diff --git a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java
index f093eaa61..c60f5f619 100644
--- a/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java
+++ b/xplan-manager/xplan-manager-api/src/main/java/de/latlon/xplanbox/api/manager/v2/PlansApi2.java
@@ -33,6 +33,7 @@ import de.latlon.xplanbox.api.manager.exception.InvalidSearch;
 import de.latlon.xplanbox.api.manager.handler.PlanHandler;
 import de.latlon.xplanbox.api.manager.v1.model.Bereich;
 import de.latlon.xplanbox.api.manager.v1.model.Gemeinde;
+import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum;
 import de.latlon.xplanbox.api.manager.v2.model.PlanInfo;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -68,24 +69,30 @@ public class PlansApi2 {
 	@GET
 	@Produces({ "application/json" })
 	@Operation(summary = "Search for plan by name",
-			description = "Returns a list of plans where the plan name contains the query string case insensitve",
+			description = "Returns a list of plans where the plan matches the passed query parameter",
 			tags = { "search" },
 			responses = {
 					@ApiResponse(responseCode = "200", description = "OK",
 							content = @Content(
 									array = @ArraySchema(schema = @Schema(implementation = PlanInfo.class)))),
 					@ApiResponse(responseCode = "406", description = "Requested format is not available") })
-	public Response findByNameOrId(
+	public Response searchPlans(
 			@QueryParam("planName") @Parameter(description = "The name of the plan to search for",
-					example = "bplan_123, fplan-123, rplan20200803") String planName,
+					example = "bplan_123") String planName,
+			@QueryParam("internalId") @Parameter(description = "The internalId of the plan to search for",
+					example = "ID_8ee57554-5f58-42ea-86a4-e9f4acd9d3c1") String internalId,
+			@QueryParam("planStatus") @Parameter(description = "The planStatuses of the plan to search for",
+					example = "FESTGESTELLT") List<PlanStatusEnum> planStatuses,
 			@QueryParam("planId") @Parameter(description = "The ID of the plan to search for",
 					example = "1, 2, 42") List<Integer> planIds,
 			@QueryParam("includeGeltungsbereich") @DefaultValue("false") @Parameter(
 					description = "true if the geltungsbereichWGS84 should be included in the response, false otherwise (default: false).") boolean includeGeltungsbereich)
 			throws Exception {
-		if (planName != null && !planIds.isEmpty())
-			throw new InvalidSearch("Searching by name and id within the same request is not supported!");
-		List<XPlan> plans = searchByNameOrId(planName, planIds);
+		if ((planName != null || internalId != null || (planStatuses != null && !planStatuses.isEmpty()))
+				&& !planIds.isEmpty())
+			throw new InvalidSearch(
+					"Searching by planName, internalId or planstatus and id within the same request is not supported!");
+		List<XPlan> plans = searchPlans(planName, internalId, planStatuses, planIds);
 		List<PlanInfo> planInfos = plans.stream().map(xPlan -> {
 			List<Bereich> bereiche = planHandler.findBereiche(xPlan.getId());
 			List<Gemeinde> gemeinden = planHandler.findGemeinden(xPlan.getId());
@@ -98,11 +105,12 @@ public class PlansApi2 {
 		return Response.ok().entity(planInfos).build();
 	}
 
-	private List<XPlan> searchByNameOrId(String planName, List<Integer> planIds) throws Exception {
+	private List<XPlan> searchPlans(String planName, String internalId, List<PlanStatusEnum> planStatuses,
+			List<Integer> planIds) throws Exception {
 		if (!planIds.isEmpty()) {
 			return planHandler.findPlansById(planIds);
 		}
-		return planHandler.findPlans(planName);
+		return planHandler.findPlans(planName, internalId, planStatuses);
 	}
 
 }
diff --git a/xplan-manager/xplan-manager-api/src/main/resources/application.properties b/xplan-manager/xplan-manager-api/src/main/resources/application.properties
index 83110655a..4adebb1b7 100644
--- a/xplan-manager/xplan-manager-api/src/main/resources/application.properties
+++ b/xplan-manager/xplan-manager-api/src/main/resources/application.properties
@@ -46,6 +46,7 @@ xplanbox.s3.accessKeyId=${XPLAN_S3_ACCESS_KEY}
 xplanbox.s3.endpoint.url=${XPLAN_S3_ENDPOINT}
 xplanbox.s3.region=${XPLAN_S3_REGION}
 xplanbox.s3.secretKey=${XPLAN_S3_SECRET_ACCESS_KEY}
+xplanbox.s3.chunkedEncodingEnabled=${XPLAN_S3_CHUNKENCODING_ENABLED:true}
 
 xplanbox.validation.profiles=${XPLAN_VALIDATION_PROFILES:}
 xplanbox.s3.bucket.validation=${XPLAN_S3_BUCKET_VALIDATION:validation}
diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java
index b69884006..916fc28c7 100644
--- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java
+++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/config/TestContext.java
@@ -39,7 +39,6 @@ import java.sql.DatabaseMetaData;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
@@ -234,6 +233,7 @@ public class TestContext {
 		XPlan mockPlan_5 = new XPlan("lplan_51", "5", "LP_Plan", "XPLAN_51");
 		XPlan mockPlan_6 = new XPlan("soplan_40", "6", "SO_Plan", "XPLAN_40");
 		XPlan mockPlan_7 = new XPlan("bplan_51", "7", "BP_Plan", "XPLAN_51");
+		mockPlan_2.setInternalId("ID_2_II");
 		mockPlan_123.setPlanStatus(FESTGESTELLT);
 		mockPlan_2.setPlanStatus(FESTGESTELLT);
 		mockPlan_3.setPlanStatus(FESTGESTELLT);
@@ -256,11 +256,17 @@ public class TestContext {
 		when(xplanDao.retrieveXPlanArtefact(7)).thenReturn(getClass().getResourceAsStream("/xplan51_ohneBereich.gml"))
 			.thenReturn(getClass().getResourceAsStream("/xplan51_ohneBereich.gml"));
 		when(xplanDao.existsPlan(123)).thenReturn(true);
-		List<XPlan> mockList = new ArrayList<>();
-		mockList.add(mockPlan_123);
+		List<XPlan> mockList = Collections.singletonList(mockPlan_123);
+		List<XPlan> allPlans = List.of(mockPlan_1, mockPlan_123, mockPlan_2, mockPlan_3, mockPlan_4, mockPlan_5,
+				mockPlan_6, mockPlan_7);
 		when(xplanDao.getXPlanByName("bplan_41")).thenReturn(mockList);
-		when(xplanDao.getXPlansLikeName("bplan_41")).thenReturn(mockList);
-		when(xplanDao.getXPlanList()).thenReturn(mockList);
+		when(xplanDao.getXPlansBySearchParams("bplan_41", null, Collections.emptyList())).thenReturn(mockList);
+		when(xplanDao.getXPlansBySearchParams(null, "ID_2_II", Collections.emptyList()))
+			.thenReturn(Collections.singletonList(mockPlan_2));
+		when(xplanDao.getXPlansBySearchParams(null, null, Collections.singletonList(FESTGESTELLT)))
+			.thenReturn(Collections.singletonList(mockPlan_3));
+		when(xplanDao.getXPlansBySearchParams(null, null, Collections.emptyList())).thenReturn(allPlans);
+		when(xplanDao.getXPlanList()).thenReturn(allPlans);
 		when(xplanDao.retrieveAllXPlanArtefacts(anyString())).thenReturn(mock(List.class));
 		when(xplanDao.retrieveAllXPlanArtefacts("42")).thenThrow(new PlanNotFoundException(42));
 		when(xplanDao.retrieveGeltungsbereichOfPlanWithId("123")).thenReturn(geltungsbereichWGS84());
diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java
index e5ba8a55a..51fe8899a 100644
--- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java
+++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/handler/PlanHandlerTest.java
@@ -23,6 +23,7 @@ package de.latlon.xplanbox.api.manager.handler;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
+import java.util.Collections;
 import java.util.List;
 
 import de.latlon.xplan.commons.archive.XPlanArchiveCreator;
@@ -32,6 +33,7 @@ import de.latlon.xplanbox.api.commons.exception.InvalidPlanIdSyntax;
 import de.latlon.xplanbox.api.manager.config.ApplicationContext;
 import de.latlon.xplanbox.api.manager.config.HsqlJpaContext;
 import de.latlon.xplanbox.api.manager.config.TestContext;
+import de.latlon.xplanbox.api.manager.v1.model.PlanStatusEnum;
 import de.latlon.xplanbox.api.manager.v1.model.StatusMessage;
 import jakarta.ws.rs.core.StreamingOutput;
 import org.junit.jupiter.api.Test;
@@ -70,7 +72,7 @@ class PlanHandlerTest {
 	}
 
 	@Test
-	void verifyThat_exportPlan_WithWrongIdThrowsException() throws Exception {
+	void verifyThat_exportPlan_WithWrongIdThrowsException() {
 		assertThrows(InvalidPlanId.class, () -> {
 			StreamingOutput planAsStream = planHandler.exportPlan("42");
 			assertThat(planAsStream).isNotNull();
@@ -84,39 +86,52 @@ class PlanHandlerTest {
 	}
 
 	@Test
-	void verifyThat_findPlanById_WithWrongIdFails() throws Exception {
+	void verifyThat_findPlanById_WithWrongIdFails() {
 		assertThrows(InvalidPlanId.class, () -> {
 			planHandler.findPlanById("42");
 		});
 	}
 
 	@Test
-	void verifyThat_findPlanByName() throws Exception {
+	void verifyThat_findPlanByName() {
 		List<XPlan> plans = planHandler.findPlansByName("bplan_41");
 		assertThat(plans).hasSize(1);
 		assertThat(plans.get(0).getId()).isEqualTo("123");
 	}
 
 	@Test
-	void verifyThat_findPlans() throws Exception {
-		List<XPlan> planList = planHandler.findPlans("bplan_41");
+	void verifyThat_findPlansByName() {
+		List<XPlan> planList = planHandler.findPlans("bplan_41", null, Collections.emptyList());
 		assertThat(planList).contains(new XPlan("bplan_41", "123", "BP_Plan", "XPLAN_41"));
 	}
 
 	@Test
-	void verifyThat_findPlans_ReturnsEmptyList() throws Exception {
-		List<XPlan> planList = planHandler.findPlans("xplan");
+	void verifyThat_findPlansByInternalId() {
+		List<XPlan> planList = planHandler.findPlans(null, "ID_2_II", Collections.emptyList());
+		assertThat(planList).contains(new XPlan("bplan_51", "2", "BP_Plan", "XPLAN_51"));
+	}
+
+	@Test
+	void verifyThat_findPlansByPlanstatus() {
+		List<XPlan> planList = planHandler.findPlans(null, null,
+				Collections.singletonList(PlanStatusEnum.FESTGESTELLT));
+		assertThat(planList).contains(new XPlan("bplan_53", "3", "BP_Plan", "XPLAN_53"));
+	}
+
+	@Test
+	void verifyThat_findPlans_ReturnsEmptyList() {
+		List<XPlan> planList = planHandler.findPlans("xplan", null, Collections.emptyList());
 		assertThat(planList).hasSize(0);
 	}
 
 	@Test
-	void verifyThat_findPlansWithNullName() throws Exception {
-		List<XPlan> planList = planHandler.findPlans(null);
+	void verifyThat_findPlansWithNullName() {
+		List<XPlan> planList = planHandler.findPlans(null, null, Collections.emptyList());
 		assertThat(planList).isNotEmpty();
 	}
 
 	@Test
-	void verifyThat_deleteWithNonIntegerFailes() {
+	void verifyThat_deleteWithNonIntegerFails() {
 		assertThrows(InvalidPlanIdSyntax.class, () -> planHandler.deletePlan("999999999999999999999"));
 	}
 
diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java
index ea986cca5..047526035 100644
--- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java
+++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v1/PlansApiTest.java
@@ -74,4 +74,14 @@ class PlansApiTest extends ManagerApiJerseyTest<PlansApi> {
 				"{\"id\":123,\"type\":\"BP_Plan\",\"version\":\"XPLAN_41\",\"planStatus\":\"FESTGESTELLT\",\"raster\":false,\"importDate\":null,\"inspirePublished\":false,\"bbox\":null,\"geltungsbereichWGS84\":{\"type\":\"Polygon\",\"bbox\":null,\"coordinates\":[[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0],[0.0,0.0]]]},");
 	}
 
+	@Test
+	void verifyThat_GetPlansByPlanStatus_ReturnCorrectStatus() {
+		Response response = target("/plans").queryParam("planStatus", "FESTGESTELLT")
+			.queryParam("planStatus", "ARCHIVIERT")
+			.request()
+			.accept(APPLICATION_JSON)
+			.get();
+		assertThat(response.getStatus()).isEqualTo(200);
+	}
+
 }
diff --git a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java
index 89eb92cec..fe30e5b0a 100644
--- a/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java
+++ b/xplan-manager/xplan-manager-api/src/test/java/de/latlon/xplanbox/api/manager/v2/PlansApi2Test.java
@@ -74,4 +74,14 @@ class PlansApi2Test extends ManagerApiJerseyTest<PlansApi2> {
 				"{\"id\":123,\"type\":\"BP_Plan\",\"version\":\"XPLAN_41\",\"planStatus\":\"FESTGESTELLT\",\"raster\":false,\"importDate\":null,\"inspirePublished\":false,\"bbox\":null,\"geltungsbereichWGS84\":{\"type\":\"Polygon\",\"bbox\":null,\"coordinates\":[[[0.0,0.0],[1.0,0.0],[1.0,1.0],[0.0,1.0],[0.0,0.0]]]},");
 	}
 
+	@Test
+	void verifyThat_GetPlansByPlanStatus_ReturnCorrectStatus() {
+		Response response = target("/plans").queryParam("planStatus", "FESTGESTELLT")
+			.queryParam("planStatus", "ARCHIVIERT")
+			.request()
+			.accept(APPLICATION_JSON)
+			.get();
+		assertThat(response.getStatus()).isEqualTo(200);
+	}
+
 }
diff --git a/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml b/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml
index 825545aa5..7bfad28b8 100644
--- a/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml
+++ b/xplan-tests/xplan-tests-soapui/src/main/resources/xplan-manager-api-soapui-project.xml
@@ -2060,6 +2060,48 @@ Search for plan by name</con:description>
           <con:params/>
           <con:element>data</con:element>
         </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>400</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>400</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>400</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>400</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>400</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>400</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>400</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
         <con:request name="Request 1" id="ba7c71b2-c264-4a61-b0b0-1146f2594e7e" mediaType="application/json">
           <con:settings/>
           <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
@@ -2082,6 +2124,106 @@ Search for plan by name</con:description>
           </con:parameterOrder>
         </con:request>
       </con:method>
+      <con:method name="findByInternalId" id="ff9ed0ac-3441-41a3-aaaf-21dbd87f3a70" method="GET">
+        <con:description>Returns a list of plans where the plan name contains the query string case insensitve
+Search for plan by name</con:description>
+        <con:settings/>
+        <con:parameters>
+          <con:parameter>
+            <con:name>internalId</con:name>
+            <con:style>QUERY</con:style>
+            <con:description>The name of the plan to search for</con:description>
+          </con:parameter>
+          <con:parameter>
+            <con:name>includeGeltungsbereich</con:name>
+            <con:value/>
+            <con:style>QUERY</con:style>
+            <con:default/>
+            <con:description xsi:nil="true"/>
+          </con:parameter>
+        </con:parameters>
+        <con:representation type="RESPONSE">
+          <con:mediaType>application/json</con:mediaType>
+          <con:status>200</con:status>
+          <con:params/>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>404</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:request name="Request 1" id="4c698a47-e7d1-4e83-bdf0-c61cfc21c738" mediaType="application/json">
+          <con:settings/>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
+          <con:request/>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:domain xsi:nil="true"/>
+            <con:authType>No Authorization</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters/>
+          <con:parameterOrder>
+            <con:entry>internalId</con:entry>
+            <con:entry>includeGeltungsbereich</con:entry>
+          </con:parameterOrder>
+        </con:request>
+      </con:method>
+      <con:method name="findByPlanStatus" id="ff9ed0ac-3441-41a3-aaaf-21dbd87f3a70" method="GET">
+        <con:description>Returns a list of plans where the plan name contains the query string case insensitve
+Search for plan by name</con:description>
+        <con:settings/>
+        <con:parameters>
+          <con:parameter>
+            <con:name>planStatus</con:name>
+            <con:value/>
+            <con:style>QUERY</con:style>
+            <con:default/>
+            <con:description>The name of the plan to search for</con:description>
+          </con:parameter>
+          <con:parameter>
+            <con:name>includeGeltungsbereich</con:name>
+            <con:value/>
+            <con:style>QUERY</con:style>
+            <con:default/>
+            <con:description xsi:nil="true"/>
+          </con:parameter>
+        </con:parameters>
+        <con:representation type="RESPONSE">
+          <con:mediaType>application/json</con:mediaType>
+          <con:status>200</con:status>
+          <con:params/>
+        </con:representation>
+        <con:representation type="FAULT">
+          <con:mediaType xsi:nil="true"/>
+          <con:status>404</con:status>
+          <con:params/>
+          <con:element>data</con:element>
+        </con:representation>
+        <con:request name="Request 1" id="4c698a47-e7d1-4e83-bdf0-c61cfc21c738" mediaType="application/json">
+          <con:settings/>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
+          <con:request/>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:domain xsi:nil="true"/>
+            <con:authType>No Authorization</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters>
+            <entry key="planStatus" value="" xmlns="http://eviware.com/soapui/config"/>
+          </con:parameters>
+          <con:parameterOrder>
+            <con:entry>planStatus</con:entry>
+            <con:entry>includeGeltungsbereich</con:entry>
+          </con:parameterOrder>
+        </con:request>
+      </con:method>
     </con:resource>
   </con:interface>
   <con:testSuite id="546177ed-bd4c-4071-b255-022d28f71ac6" name="Authorization Setup">
@@ -2275,6 +2417,24 @@ testRunner.testCase.testSuite.project.testSuiteList.each
                 <ignoreComments>false</ignoreComments>
               </con:configuration>
             </con:assertion>
+            <con:assertion type="JsonPath Match" id="374fd3c7-d785-4106-9f40-400f38989c7d" name="path /plans internalId parameter">
+              <con:configuration>
+                <path>$.paths./plans.get.parameters[?(@.name == 'internalId')].name</path>
+                <content>[internalId]</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="374fd3c7-d785-4106-9f40-400f38989c7d" name="path /plans planStatus parameter">
+              <con:configuration>
+                <path>$.paths./plans.get.parameters[?(@.name == 'planStatus')].name</path>
+                <content>[planStatus]</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
             <con:assertion type="JsonPath RegEx Match" id="d439e627-6cd0-4e22-9967-b1bc2f392af1" name="version">
               <con:configuration>
                 <path>$.info.version</path>
@@ -2850,6 +3010,7 @@ assert actualHeader != null</scriptText>
             <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
             <con:jmsPropertyConfig/>
             <con:parameters>
+              <con:entry key="internalId" value="soapui-internal-id-BP-41"/>
               <con:entry key="skipFlaechenschluss" value="true"/>
               <con:entry key="profiles" value=""/>
               <con:entry key="skipSemantisch" value="true"/>
@@ -7980,6 +8141,24 @@ assert actualHeader != null</scriptText>
                 <ignoreComments>false</ignoreComments>
               </con:configuration>
             </con:assertion>
+            <con:assertion type="JsonPath Match" id="a6ecb45b-6c24-49c3-97a9-c3197dc6a3a0" name="planStatus">
+              <con:configuration>
+                <path>$[0].planStatus</path>
+                <content>FESTGESTELLT</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="af928d7c-30d5-4901-8dc3-f3b4239afb30" name="internalId">
+              <con:configuration>
+                <path>$[0].xplanModelData.internalId</path>
+                <content>soapui-internal-id-BP-41</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
             <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="ags">
               <con:configuration>
                 <path>$[0].xplanModelData.ags</path>
@@ -8144,6 +8323,24 @@ assert actualHeader != null</scriptText>
                 <ignoreComments>false</ignoreComments>
               </con:configuration>
             </con:assertion>
+            <con:assertion type="JsonPath Match" id="2b2b88af-4aed-4bc7-9f7a-00873141e1cf" name="planStatus">
+              <con:configuration>
+                <path>$[0].planStatus</path>
+                <content>FESTGESTELLT</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="d1ba726b-e56b-4e24-a9cd-da3cee85f9c6" name="internalId">
+              <con:configuration>
+                <path>$[0].xplanModelData.internalId</path>
+                <content>soapui-internal-id-BP-41</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
             <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="ags">
               <con:configuration>
                 <path>$[0].xplanModelData.ags</path>
@@ -8290,6 +8487,15 @@ assert actualHeader != null</scriptText>
                 <ignoreComments>false</ignoreComments>
               </con:configuration>
             </con:assertion>
+            <con:assertion type="JsonPath Match" id="a3370515-e19f-4317-b06a-5ca50c5cb269" name="planStatus">
+              <con:configuration>
+                <path>$[0].planStatus</path>
+                <content>FESTGESTELLT</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
             <con:assertion type="JsonPath Match" id="11dca079-8e56-45f3-8591-4990d0f59978" name="ags">
               <con:configuration>
                 <path>$[0].xplanModelData.ags</path>
@@ -8412,86 +8618,304 @@ assert actualHeader != null</scriptText>
           </con:restRequest>
         </con:config>
       </con:testStep>
-      <con:testStep type="restrequest" name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="60bb9823-bfc2-4bae-bdce-a8fda7507667">
+      <con:testStep type="restrequest" name="GET BP 4.1 iI findByInternalId" id="d6906818-3fac-4f46-a462-f7b7500c692e">
         <con:settings/>
-        <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="invalidPlanIdAndPlanName" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-          <con:restRequest name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="ba7c71b2-c264-4a61-b0b0-1146f2594e7e" mediaType="application/json">
+        <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="findByInternalId" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:restRequest name="GET BP 4.1 iI findByInternalId" id="653c7a59-0292-405d-8596-a225f505b1fb" mediaType="application/json">
             <con:settings>
               <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting>
             </con:settings>
             <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
             <con:request/>
             <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plans</con:originalUri>
-            <con:assertion type="Valid HTTP Status Codes" id="200d0bb7-3731-4077-857e-d470e6d261d6" name="Valid HTTP Status Codes">
+            <con:assertion type="Valid HTTP Status Codes" id="7c256da6-27a4-473d-8c2d-bf06f2bba366" name="Valid HTTP Status Codes">
               <con:configuration>
-                <codes>400</codes>
+                <codes>200</codes>
               </con:configuration>
             </con:assertion>
-            <con:credentials>
-              <con:username>${#Project#username}</con:username>
-              <con:password>${#Project#password}</con:password>
-              <con:domain xsi:nil="true"/>
-              <con:authType>No Authorization</con:authType>
-            </con:credentials>
-            <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
-            <con:jmsPropertyConfig/>
-            <con:parameters>
-              <con:entry key="includeGeltungsbereich" value=""/>
-              <con:entry key="planName" value="XPlanManagerAPI-Test"/>
-              <con:entry key="planId" value="${#TestSuite#currentPlanIdMultiplePlansHafenCity14}"/>
-            </con:parameters>
-            <con:parameterOrder>
-              <con:entry>planId</con:entry>
-              <con:entry>planName</con:entry>
-              <con:entry>includeGeltungsbereich</con:entry>
-            </con:parameterOrder>
-          </con:restRequest>
-        </con:config>
-      </con:testStep>
-      <con:properties/>
-    </con:testCase>
-    <con:testCase id="c6fda1ed-fa1f-4c4a-961f-f0358047598a" failOnError="false" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="/plan/{planId}/aenderungen/ TestCase" searchProperties="true" timeout="0" wsrmEnabled="false" wsrmVersion="1.0" wsrmAckTo="" amfAuthorisation="false" amfEndpoint="" amfLogin="" amfPassword="">
-      <con:description>TestCase generated for REST Resource [/plan/{planId}/aenderung/] located at [/plan/{planId}/aenderung/]</con:description>
-      <con:settings/>
-      <con:testStep type="restrequest" name="GET BP 5.0 pI currentStatus" id="d3ed7782-4011-4476-afaa-a06874f55efe">
-        <con:settings/>
-        <con:config service="XPlanManagerAPI" resourcePath="/plan/{planId}/aenderungen" methodName="getAenderung" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
-          <con:restRequest name="GET BP 5.0 pI currentStatus" id="a6a96284-b3ed-448c-9668-ab61b1d29b90" mediaType="application/json">
-            <con:settings>
-              <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting>
-            </con:settings>
-            <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
-            <con:request/>
-            <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plan//aenderung/</con:originalUri>
-            <con:assertion type="Valid HTTP Status Codes" id="0e64eb81-e36a-40be-a6d8-759b75afa07a" name="Valid HTTP Status Codes">
+            <con:assertion type="JsonPath Match" id="8a5449af-71b6-49e9-81c3-7ae4f704dec1" name="id">
               <con:configuration>
-                <codes>200</codes>
+                <path>$.[0]id</path>
+                <content>${#TestSuite#currentPlanIdImport}</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
               </con:configuration>
             </con:assertion>
-            <con:assertion type="JsonPath Match" id="56315f47-3003-4d77-a911-09224aae6ff4" name="JsonPath Match">
+            <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="type">
               <con:configuration>
-                <path>$.aendert[0].planName</path>
-                <content>BPlan Demo-Gemeinde</content>
+                <path>$.[0]type</path>
+                <content>BP_Plan</content>
                 <allowWildcards>false</allowWildcards>
                 <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
                 <ignoreComments>false</ignoreComments>
               </con:configuration>
             </con:assertion>
-            <con:credentials>
-              <con:username>${#Project#username}</con:username>
-              <con:password>${#Project#password}</con:password>
-              <con:domain xsi:nil="true"/>
-              <con:authType>No Authorization</con:authType>
-            </con:credentials>
-            <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
-            <con:jmsPropertyConfig/>
-            <con:parameters>
-              <entry key="planId" value="${#TestSuite#currentPlanIdAenderung}" xmlns="http://eviware.com/soapui/config"/>
-            </con:parameters>
-          </con:restRequest>
-        </con:config>
-      </con:testStep>
-      <con:testStep type="restrequest" name="PUT BP 5.0 pI modifyStatusXSSExpectError400" id="e69f4d01-9afb-4cb0-b50d-838a0e6dc931">
+            <con:assertion type="JsonPath Match" id="a6ecb45b-6c24-49c3-97a9-c3197dc6a3a0" name="planStatus">
+              <con:configuration>
+                <path>$[0].planStatus</path>
+                <content>FESTGESTELLT</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="af928d7c-30d5-4901-8dc3-f3b4239afb30" name="internalId">
+              <con:configuration>
+                <path>$[0].xplanModelData.internalId</path>
+                <content>soapui-internal-id-BP-41</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="ags">
+              <con:configuration>
+                <path>$[0].xplanModelData.ags</path>
+                <content>02000000</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="gemeindeName">
+              <con:configuration>
+                <path>$[0].xplanModelData.gemeindeName</path>
+                <content>Hamburg</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="gemeinden.gemeindeName">
+              <con:configuration>
+                <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path>
+                <content>Hamburg</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="4e49f759-7fd9-4f6c-951e-09cd193baaf4" name="gemeinden.ortsteilName">
+              <con:configuration>
+                <path>$[0].xplanModelData.gemeinden[0].ortsteilName</path>
+                <content>Bezirk Eimsbüttel Ortsteil 320</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self">
+              <con:configuration>
+                <path>$[0].links[?(@.rel == 'self' &amp;&amp; (@.type == 'application/json'))].href</path>
+                <content>true</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+                <regEx>^.*/api/v1/plan/.*$</regEx>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count">
+              <con:configuration>
+                <path>$[0].links[?(@.rel == 'self')]</path>
+                <content>1</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link alternate xml">
+              <con:configuration>
+                <path>$[0].links[?(@.rel == 'alternate' &amp;&amp; @.type == 'application/xml')].href</path>
+                <content>true</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+                <regEx>^.*/api/v1/plan/.*$</regEx>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link alternate zip">
+              <con:configuration>
+                <path>$[0].links[?(@.rel == 'alternate' &amp;&amp; @.type == 'application/zip')].href</path>
+                <content>true</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+                <regEx>^.*/api/v1/plan/.*$</regEx>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link alternate count">
+              <con:configuration>
+                <path>$[0].links[?(@.rel == 'alternate')]</path>
+                <content>2</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath RegEx Match" id="4a57e07a-a8c7-4341-92cd-ce53cb3a5cc2" name="link planwerkwms">
+              <con:configuration>
+                <path>$[0].links[?(@.rel == 'planwerkwms')].href</path>
+                <content>true</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+                <regEx>^.*/services/planwerkwms/planname/.*$</regEx>
+              </con:configuration>
+            </con:assertion>
+            <con:credentials>
+              <con:username>${#Project#username}</con:username>
+              <con:password>${#Project#password}</con:password>
+              <con:domain xsi:nil="true"/>
+              <con:authType>No Authorization</con:authType>
+            </con:credentials>
+            <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+            <con:jmsPropertyConfig/>
+            <con:parameters>
+              <con:entry key="includeGeltungsbereich" value=""/>
+              <con:entry key="internalId" value="soapui-internal-id-BP-41"/>
+            </con:parameters>
+            <con:parameterOrder>
+              <con:entry>internalId</con:entry>
+              <con:entry>includeGeltungsbereich</con:entry>
+            </con:parameterOrder>
+          </con:restRequest>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="restrequest" name="GET XX X.X pS findByPlanStatus" id="5b7db0a1-0e64-40c9-b2e7-f5a885c94bfa">
+        <con:settings/>
+        <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="findByPlanStatus" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:restRequest name="GET XX X.X pS findByPlanStatus" id="d916a64f-7bd0-408d-9ebf-5fabc9a2dab1" mediaType="application/json">
+            <con:settings>
+              <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting>
+            </con:settings>
+            <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
+            <con:request/>
+            <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plans</con:originalUri>
+            <con:assertion type="Valid HTTP Status Codes" id="19bc0b9a-e121-4a54-a603-e7ea4fcefc73" name="Valid HTTP Status Codes">
+              <con:configuration>
+                <codes>200</codes>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="11dca079-8e56-45f3-8591-4990d0f59978" name="planStatus">
+              <con:configuration>
+                <path>$[0].planStatus</path>
+                <content>FESTGESTELLT</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="2ed49aac-f4fd-4df3-9408-92fde0b64f39" name="planStatusNotInAufstellungAndArchiviert">
+              <con:configuration>
+                <path>$[?(@.planStatus == 'IN_AUFSTELLUNG' || @.planStatus == 'ARCHIVIERT')].planStatus</path>
+                <content>[]</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:credentials>
+              <con:username>${#Project#username}</con:username>
+              <con:password>${#Project#password}</con:password>
+              <con:domain xsi:nil="true"/>
+              <con:authType>No Authorization</con:authType>
+            </con:credentials>
+            <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+            <con:jmsPropertyConfig/>
+            <con:parameters>
+              <con:entry key="includeGeltungsbereich" value=""/>
+              <con:entry key="internalId" value="soapui-test-id"/>
+              <con:entry key="planStatus" value="FESTGESTELLT"/>
+              <con:entry key="planId" value="${#TestSuite#currentPlanIdMultiplePlansHafenCity14}"/>
+            </con:parameters>
+            <con:parameterOrder>
+              <con:entry>includeGeltungsbereich</con:entry>
+              <con:entry>planStatus</con:entry>
+            </con:parameterOrder>
+          </con:restRequest>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="restrequest" name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="60bb9823-bfc2-4bae-bdce-a8fda7507667">
+        <con:settings/>
+        <con:config service="XPlanManagerAPI" resourcePath="/plans" methodName="invalidPlanIdAndPlanName" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:restRequest name="GET BP 5.4 pI,pN invalidPlanNameExpectError400" id="ba7c71b2-c264-4a61-b0b0-1146f2594e7e" mediaType="application/json">
+            <con:settings>
+              <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting>
+            </con:settings>
+            <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
+            <con:request/>
+            <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plans</con:originalUri>
+            <con:assertion type="Valid HTTP Status Codes" id="200d0bb7-3731-4077-857e-d470e6d261d6" name="Valid HTTP Status Codes">
+              <con:configuration>
+                <codes>400</codes>
+              </con:configuration>
+            </con:assertion>
+            <con:credentials>
+              <con:username>${#Project#username}</con:username>
+              <con:password>${#Project#password}</con:password>
+              <con:domain xsi:nil="true"/>
+              <con:authType>No Authorization</con:authType>
+            </con:credentials>
+            <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+            <con:jmsPropertyConfig/>
+            <con:parameters>
+              <con:entry key="includeGeltungsbereich" value=""/>
+              <con:entry key="planName" value="XPlanManagerAPI-Test"/>
+              <con:entry key="planId" value="${#TestSuite#currentPlanIdMultiplePlansHafenCity14}"/>
+            </con:parameters>
+            <con:parameterOrder>
+              <con:entry>planId</con:entry>
+              <con:entry>planName</con:entry>
+              <con:entry>includeGeltungsbereich</con:entry>
+            </con:parameterOrder>
+          </con:restRequest>
+        </con:config>
+      </con:testStep>
+      <con:properties/>
+    </con:testCase>
+    <con:testCase id="c6fda1ed-fa1f-4c4a-961f-f0358047598a" failOnError="false" failTestCaseOnErrors="true" keepSession="false" maxResults="0" name="/plan/{planId}/aenderungen/ TestCase" searchProperties="true" timeout="0" wsrmEnabled="false" wsrmVersion="1.0" wsrmAckTo="" amfAuthorisation="false" amfEndpoint="" amfLogin="" amfPassword="">
+      <con:description>TestCase generated for REST Resource [/plan/{planId}/aenderung/] located at [/plan/{planId}/aenderung/]</con:description>
+      <con:settings/>
+      <con:testStep type="restrequest" name="GET BP 5.0 pI currentStatus" id="d3ed7782-4011-4476-afaa-a06874f55efe">
+        <con:settings/>
+        <con:config service="XPlanManagerAPI" resourcePath="/plan/{planId}/aenderungen" methodName="getAenderung" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:restRequest name="GET BP 5.0 pI currentStatus" id="a6a96284-b3ed-448c-9668-ab61b1d29b90" mediaType="application/json">
+            <con:settings>
+              <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;xml-fragment/></con:setting>
+            </con:settings>
+            <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/xmanager/api/v1</con:endpoint>
+            <con:request/>
+            <con:originalUri>http://localhost/xplan-manager-api/xmanager/api/v1/plan//aenderung/</con:originalUri>
+            <con:assertion type="Valid HTTP Status Codes" id="0e64eb81-e36a-40be-a6d8-759b75afa07a" name="Valid HTTP Status Codes">
+              <con:configuration>
+                <codes>200</codes>
+              </con:configuration>
+            </con:assertion>
+            <con:assertion type="JsonPath Match" id="56315f47-3003-4d77-a911-09224aae6ff4" name="JsonPath Match">
+              <con:configuration>
+                <path>$.aendert[0].planName</path>
+                <content>BPlan Demo-Gemeinde</content>
+                <allowWildcards>false</allowWildcards>
+                <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+                <ignoreComments>false</ignoreComments>
+              </con:configuration>
+            </con:assertion>
+            <con:credentials>
+              <con:username>${#Project#username}</con:username>
+              <con:password>${#Project#password}</con:password>
+              <con:domain xsi:nil="true"/>
+              <con:authType>No Authorization</con:authType>
+            </con:credentials>
+            <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+            <con:jmsPropertyConfig/>
+            <con:parameters>
+              <entry key="planId" value="${#TestSuite#currentPlanIdAenderung}" xmlns="http://eviware.com/soapui/config"/>
+            </con:parameters>
+          </con:restRequest>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="restrequest" name="PUT BP 5.0 pI modifyStatusXSSExpectError400" id="e69f4d01-9afb-4cb0-b50d-838a0e6dc931">
         <con:settings/>
         <con:config service="XPlanManagerAPI" resourcePath="/plan/{planId}/aenderungen" methodName="replaceAenderung" xsi:type="con:RestRequestStep" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <con:restRequest name="PUT BP 5.0 pI modifyStatusXSSExpectError400" id="753e70a8-62cd-41c0-a640-3158cc4a249e" mediaType="application/json" postQueryString="false">
@@ -22870,19 +23294,37 @@ assert expectedHeader == actualHeader</scriptText>
               <ignoreComments>false</ignoreComments>
             </con:configuration>
           </con:assertion>
-          <con:assertion type="JsonPath Match" id="338faceb-131f-43eb-bf38-2bf035ec149f" name="path /report/{uuid}">
+          <con:assertion type="JsonPath Match" id="255bad80-de80-4f80-a730-02eb6ca8cd9a" name="path /plans internalId parameter">
             <con:configuration>
-              <path>$.paths./report/{uuid}.get.operationId</path>
-              <content>reportByUuid</content>
+              <path>$.paths./plans.get.parameters[?(@.name == 'internalId')].name</path>
+              <content>[internalId]</content>
               <allowWildcards>false</allowWildcards>
               <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
               <ignoreComments>false</ignoreComments>
             </con:configuration>
           </con:assertion>
-          <con:assertion type="JsonPath Match" id="2397109c-69bb-40f6-9b5a-2f5db5d69ade" name="path /report/{uuid}/geomfindings">
+          <con:assertion type="JsonPath Match" id="255bad80-de80-4f80-a730-02eb6ca8cd9a" name="path /plans planStatus parameter">
             <con:configuration>
-              <path>$.paths./report/{uuid}/geomfindings.get.operationId</path>
-              <content>geomfindingsByUuid</content>
+              <path>$.paths./plans.get.parameters[?(@.name == 'planStatus')].name</path>
+              <content>[planStatus]</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="338faceb-131f-43eb-bf38-2bf035ec149f" name="path /report/{uuid}">
+            <con:configuration>
+              <path>$.paths./report/{uuid}.get.operationId</path>
+              <content>reportByUuid</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="2397109c-69bb-40f6-9b5a-2f5db5d69ade" name="path /report/{uuid}/geomfindings">
+            <con:configuration>
+              <path>$.paths./report/{uuid}/geomfindings.get.operationId</path>
+              <content>geomfindingsByUuid</content>
               <allowWildcards>false</allowWildcards>
               <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
               <ignoreComments>false</ignoreComments>
@@ -24383,6 +24825,15 @@ if( ++context.loopIndex &lt; 40 &amp;&amp; json.status != "VALIDATION_FAILED" ){
               <ignoreComments>false</ignoreComments>
             </con:configuration>
           </con:assertion>
+          <con:assertion type="JsonPath Match" id="26c4f63b-5966-47de-9a7f-c217d50feaa9" name="internalId">
+            <con:configuration>
+              <path>$[0].xplanModelData.internalId</path>
+              <content>soapui-test-id</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
           <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags">
             <con:configuration>
               <path>$[0].xplanModelData.gemeinden[0].ags</path>
@@ -24472,9 +24923,55 @@ if( ++context.loopIndex &lt; 40 &amp;&amp; json.status != "VALIDATION_FAILED" ){
           </con:parameters>
         </con:config>
       </con:testStep>
-      <con:testStep type="httprequest" name="GET BP 6.0.2 pI getByPlanId" id="075daffd-664c-441f-b138-6fe75430bc69">
+      <con:testStep type="httprequest" name="GET BP 6.0.2 pN getByPlanNameNoResult" id="1f2ea819-c0b0-4e3b-a3b8-5dd8f808c771">
         <con:settings/>
-        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pI getByPlanId" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pN getByPlanNameNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:settings>
+            <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting>
+          </con:settings>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint>
+          <con:request/>
+          <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes">
+            <con:configuration>
+              <codes>200</codes>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="bc4fee9b-67a9-4af7-b18b-1dfade4b8a74" name="emptyArray">
+            <con:configuration>
+              <path>$</path>
+              <content>[]</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
+            <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
+            <con:preemptive>true</con:preemptive>
+            <con:authType>Preemptive</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters>
+            <con:parameter>
+              <con:name>planName</con:name>
+              <con:value>no-result</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+            <con:parameter>
+              <con:name>includeGeltungsbereich</con:name>
+              <con:value>true</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+          </con:parameters>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="httprequest" name="GET BP 6.0.2 iI getByInternalId" id="12c9788b-58e7-4cc7-a30a-63cbda2686a4">
+        <con:settings/>
+        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 iI getByInternalId" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
           <con:settings>
             <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting>
           </con:settings>
@@ -24512,6 +25009,15 @@ if( ++context.loopIndex &lt; 40 &amp;&amp; json.status != "VALIDATION_FAILED" ){
               <ignoreComments>false</ignoreComments>
             </con:configuration>
           </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="internalId">
+            <con:configuration>
+              <path>$[0].xplanModelData.internalId</path>
+              <content>soapui-test-id</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
           <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags">
             <con:configuration>
               <path>$[0].xplanModelData.gemeinden[0].ags</path>
@@ -24549,7 +25055,7 @@ if( ++context.loopIndex &lt; 40 &amp;&amp; json.status != "VALIDATION_FAILED" ){
               <ignoreComments>false</ignoreComments>
             </con:configuration>
           </con:assertion>
-          <con:assertion type="JsonPath RegEx Match" id="c4de6278-26a0-4499-b07a-a01eb57cafd2" name="link planwerkwms">
+          <con:assertion type="JsonPath RegEx Match" id="39a75872-c3c6-4fe9-ac53-858e3008c208" name="link planwerkwms">
             <con:configuration>
               <path>$[0].links[?(@.rel == 'planwerkwms')].href</path>
               <content>true</content>
@@ -24559,10 +25065,19 @@ if( ++context.loopIndex &lt; 40 &amp;&amp; json.status != "VALIDATION_FAILED" ){
               <regEx>^.*/services/planwerkwms/planname/.*$</regEx>
             </con:configuration>
           </con:assertion>
-          <con:assertion type="XPath Match" id="c49ca5e9-39d5-475d-b721-c32dc9fe86e5" name="geltungsbereichWGS84">
+          <con:assertion type="JsonPath Match" id="57fc059a-8898-4adf-9161-588cdaa49fbf" name="geltungsbereichWGS84.type">
             <con:configuration>
-              <path>exists(//*:geltungsbereichWGS84)</path>
-              <content>false</content>
+              <path>$[0].geltungsbereichWGS84.type</path>
+              <content>Polygon</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Existence Match" id="4e500b26-89ef-4749-b0fd-707dc9ec031a" name="geltungsbereichWGS84.coordinates exists">
+            <con:configuration>
+              <path>$[0].geltungsbereichWGS84.coordinates</path>
+              <content>true</content>
               <allowWildcards>false</allowWildcards>
               <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
               <ignoreComments>false</ignoreComments>
@@ -24580,8 +25095,504 @@ if( ++context.loopIndex &lt; 40 &amp;&amp; json.status != "VALIDATION_FAILED" ){
           <con:jmsPropertyConfig/>
           <con:parameters>
             <con:parameter>
-              <con:name>planId</con:name>
-              <con:value>${#TestSuite#planId}</con:value>
+              <con:name>internalId</con:name>
+              <con:value>soapui-test-id</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+            <con:parameter>
+              <con:name>includeGeltungsbereich</con:name>
+              <con:value>true</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+          </con:parameters>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="httprequest" name="GET BP 6.0.2 iI getByInternalIdNoResult" id="dfa4da6b-1d1e-4dd6-896c-084266fc51ee">
+        <con:settings/>
+        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 iI getByInternalIdNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:settings>
+            <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting>
+          </con:settings>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint>
+          <con:request/>
+          <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes">
+            <con:configuration>
+              <codes>200</codes>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="1ab16b67-2dbd-400a-b4cc-ba27a9518d41" name="emptyArray">
+            <con:configuration>
+              <path>$</path>
+              <content>[]</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
+            <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
+            <con:preemptive>true</con:preemptive>
+            <con:authType>Preemptive</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters>
+            <con:parameter>
+              <con:name>internalId</con:name>
+              <con:value>no-result</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+            <con:parameter>
+              <con:name>includeGeltungsbereich</con:name>
+              <con:value>true</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+          </con:parameters>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="httprequest" name="GET BP 6.0.2 pS getByPlanStatus" id="83408d13-be80-4fea-942b-0d7f538d2c43">
+        <con:settings/>
+        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pS getByPlanStatus" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:settings>
+            <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting>
+          </con:settings>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint>
+          <con:request/>
+          <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes">
+            <con:configuration>
+              <codes>200</codes>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="type">
+            <con:configuration>
+              <path>$[0].type</path>
+              <content>BP_Plan</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="version">
+            <con:configuration>
+              <path>$[0].version</path>
+              <content>XPLAN_60</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="planStatus">
+            <con:configuration>
+              <path>$[0].planStatus</path>
+              <content>FESTGESTELLT</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="internalId">
+            <con:configuration>
+              <path>$[0].xplanModelData.internalId</path>
+              <content>soapui-test-id</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags">
+            <con:configuration>
+              <path>$[0].xplanModelData.gemeinden[0].ags</path>
+              <content>02000000</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.gemeindeName">
+            <con:configuration>
+              <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path>
+              <content>Freie und Hansestadt Hamburg</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'self' &amp;&amp; (@.type == 'application/json'))].href</path>
+              <content>true</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+              <regEx>^.*/api/v2/plan/.*$</regEx>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'self')]</path>
+              <content>1</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath RegEx Match" id="39a75872-c3c6-4fe9-ac53-858e3008c208" name="link planwerkwms">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'planwerkwms')].href</path>
+              <content>true</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+              <regEx>^.*/services/planwerkwms/planname/.*$</regEx>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="57fc059a-8898-4adf-9161-588cdaa49fbf" name="geltungsbereichWGS84.type">
+            <con:configuration>
+              <path>$[0].geltungsbereichWGS84.type</path>
+              <content>Polygon</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Existence Match" id="4e500b26-89ef-4749-b0fd-707dc9ec031a" name="geltungsbereichWGS84.coordinates exists">
+            <con:configuration>
+              <path>$[0].geltungsbereichWGS84.coordinates</path>
+              <content>true</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
+            <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
+            <con:preemptive>true</con:preemptive>
+            <con:authType>Preemptive</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters>
+            <con:parameter required="false" disableUrlEncoding="false">
+              <con:name>includeGeltungsbereich</con:name>
+              <con:value>true</con:value>
+              <con:style>QUERY</con:style>
+              <con:type xmlns:xs="http://www.w3.org/2001/XMLSchema">xs:string</con:type>
+              <con:default/>
+              <con:description xsi:nil="true"/>
+            </con:parameter>
+            <con:parameter>
+              <con:name>planStatus</con:name>
+              <con:value>FESTGESTELLT</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+            <con:parameter>
+              <con:name>planStatus</con:name>
+              <con:value>ARCHIVIERT</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+            <con:parameter>
+              <con:name>planStatus</con:name>
+              <con:value>IN_AUFSTELLUNG</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+          </con:parameters>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="httprequest" name="GET BP 6.0.2 pS getByPlanStatusNoResult" id="04f8be4c-639f-460b-bea4-db0589fd906f">
+        <con:settings/>
+        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pS getByPlanStatusNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:settings>
+            <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting>
+          </con:settings>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint>
+          <con:request/>
+          <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes">
+            <con:configuration>
+              <codes>200</codes>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="cef1f4c8-cdcd-4f3b-be2c-3034bf5468c5" name="planStatusNotFestgestelltAndArchiviert">
+            <con:configuration>
+              <path>$[?(@.planStatus == 'FESTGESTELLT' || @.planStatus == 'ARCHIVIERT')].planStatus</path>
+              <content>[]</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
+            <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
+            <con:preemptive>true</con:preemptive>
+            <con:authType>Preemptive</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters>
+            <con:parameter>
+              <con:name>planStatus</con:name>
+              <con:value>IN_AUFSTELLUNG</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+            <con:parameter>
+              <con:name>includeGeltungsbereich</con:name>
+              <con:value>true</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+          </con:parameters>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="httprequest" name="GET BP 6.0.2 pI getByPlanId" id="075daffd-664c-441f-b138-6fe75430bc69">
+        <con:settings/>
+        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pI getByPlanId" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:settings>
+            <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting>
+          </con:settings>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint>
+          <con:request/>
+          <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes">
+            <con:configuration>
+              <codes>200</codes>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="type">
+            <con:configuration>
+              <path>$[0].type</path>
+              <content>BP_Plan</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="version">
+            <con:configuration>
+              <path>$[0].version</path>
+              <content>XPLAN_60</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="planStatus">
+            <con:configuration>
+              <path>$[0].planStatus</path>
+              <content>FESTGESTELLT</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="a7b8842d-363f-48ee-b3d3-495b76150b86" name="internalId">
+            <con:configuration>
+              <path>$[0].xplanModelData.internalId</path>
+              <content>soapui-test-id</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags">
+            <con:configuration>
+              <path>$[0].xplanModelData.gemeinden[0].ags</path>
+              <content>02000000</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.gemeindeName">
+            <con:configuration>
+              <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path>
+              <content>Freie und Hansestadt Hamburg</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'self' &amp;&amp; (@.type == 'application/json'))].href</path>
+              <content>true</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+              <regEx>^.*/api/v2/plan/.*$</regEx>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'self')]</path>
+              <content>1</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath RegEx Match" id="c4de6278-26a0-4499-b07a-a01eb57cafd2" name="link planwerkwms">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'planwerkwms')].href</path>
+              <content>true</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+              <regEx>^.*/services/planwerkwms/planname/.*$</regEx>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="XPath Match" id="c49ca5e9-39d5-475d-b721-c32dc9fe86e5" name="geltungsbereichWGS84">
+            <con:configuration>
+              <path>exists(//*:geltungsbereichWGS84)</path>
+              <content>false</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
+            <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
+            <con:preemptive>true</con:preemptive>
+            <con:authType>Preemptive</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters>
+            <con:parameter>
+              <con:name>planId</con:name>
+              <con:value>${#TestSuite#planId}</con:value>
+              <con:style>QUERY</con:style>
+            </con:parameter>
+          </con:parameters>
+        </con:config>
+      </con:testStep>
+      <con:testStep type="httprequest" name="GET BP 6.0.2 pI getByPlanIdNoResult" id="3977ff62-7e54-4c63-8e38-105af0dc632c" disabled="true">
+        <con:settings/>
+        <con:config method="GET" xsi:type="con:HttpRequest" id="241a13cd-fc19-4992-83ba-d7e6b56b3743" name="GET BP 6.0.2 pI getByPlanIdNoResult" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+          <con:settings>
+            <con:setting id="com.eviware.soapui.impl.wsdl.WsdlRequest@request-headers">&lt;entry key="Accept" value="application/json" xmlns="http://eviware.com/soapui/config"/></con:setting>
+          </con:settings>
+          <con:endpoint>${#Project#baseUrlManagerApi}/xplan-manager-api/api/v2/plans</con:endpoint>
+          <con:request/>
+          <con:assertion type="Valid HTTP Status Codes" id="e21d229a-4da0-46d6-95ba-9d521f98ad6d" name="Valid HTTP Status Codes">
+            <con:configuration>
+              <codes>200</codes>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="type">
+            <con:configuration>
+              <path>$[0].type</path>
+              <content>BP_Plan</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="version">
+            <con:configuration>
+              <path>$[0].version</path>
+              <content>XPLAN_60</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="planStatus">
+            <con:configuration>
+              <path>$[0].planStatus</path>
+              <content>FESTGESTELLT</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="a7b8842d-363f-48ee-b3d3-495b76150b86" name="internalId">
+            <con:configuration>
+              <path>$[0].xplanModelData.internalId</path>
+              <content>soapui-test-id</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.ags">
+            <con:configuration>
+              <path>$[0].xplanModelData.gemeinden[0].ags</path>
+              <content>02000000</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Match" id="6045130d-e4df-49a7-883b-3688df7dc91b" name="gemeinden.gemeindeName">
+            <con:configuration>
+              <path>$[0].xplanModelData.gemeinden[0].gemeindeName</path>
+              <content>Freie und Hansestadt Hamburg</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath RegEx Match" id="661feb7b-2379-46aa-a994-f7034df08aaf" name="link self">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'self' &amp;&amp; (@.type == 'application/json'))].href</path>
+              <content>true</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+              <regEx>^.*/api/v2/plan/.*$</regEx>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath Count" id="1f02b841-df99-4f50-bc12-f75834e396e0" name="link self count">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'self')]</path>
+              <content>1</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="JsonPath RegEx Match" id="c4de6278-26a0-4499-b07a-a01eb57cafd2" name="link planwerkwms">
+            <con:configuration>
+              <path>$[0].links[?(@.rel == 'planwerkwms')].href</path>
+              <content>true</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+              <regEx>^.*/services/planwerkwms/planname/.*$</regEx>
+            </con:configuration>
+          </con:assertion>
+          <con:assertion type="XPath Match" id="c49ca5e9-39d5-475d-b721-c32dc9fe86e5" name="geltungsbereichWGS84">
+            <con:configuration>
+              <path>exists(//*:geltungsbereichWGS84)</path>
+              <content>false</content>
+              <allowWildcards>false</allowWildcards>
+              <ignoreNamspaceDifferences>false</ignoreNamspaceDifferences>
+              <ignoreComments>false</ignoreComments>
+            </con:configuration>
+          </con:assertion>
+          <con:credentials>
+            <con:username>${#Project#username}</con:username>
+            <con:password>${#Project#password}</con:password>
+            <con:selectedAuthProfile>Basic</con:selectedAuthProfile>
+            <con:addedBasicAuthenticationTypes>Basic</con:addedBasicAuthenticationTypes>
+            <con:preemptive>true</con:preemptive>
+            <con:authType>Preemptive</con:authType>
+          </con:credentials>
+          <con:jmsConfig JMSDeliveryMode="PERSISTENT"/>
+          <con:jmsPropertyConfig/>
+          <con:parameters>
+            <con:parameter>
+              <con:name>planId</con:name>
+              <con:value>999999999</con:value>
               <con:style>QUERY</con:style>
             </con:parameter>
           </con:parameters>
diff --git a/xplan-validator/xplan-validator-api/src/main/resources/application.properties b/xplan-validator/xplan-validator-api/src/main/resources/application.properties
index 8d571c0c9..306cb0274 100644
--- a/xplan-validator/xplan-validator-api/src/main/resources/application.properties
+++ b/xplan-validator/xplan-validator-api/src/main/resources/application.properties
@@ -47,6 +47,7 @@ xplanbox.s3.accessKeyId=${XPLAN_S3_ACCESS_KEY}
 xplanbox.s3.endpoint.url=${XPLAN_S3_ENDPOINT}
 xplanbox.s3.region=${XPLAN_S3_REGION}
 xplanbox.s3.secretKey=${XPLAN_S3_SECRET_ACCESS_KEY}
+xplanbox.s3.chunkedEncodingEnabled=${XPLAN_S3_CHUNKENCODING_ENABLED:true}
 
 xplanbox.validation.profiles=${XPLAN_VALIDATION_PROFILES:}
 xplanbox.s3.bucket.validation=${XPLAN_S3_BUCKET_VALIDATION:validation}
diff --git a/xplan-validator/xplan-validator-executor/src/main/resources/application.properties b/xplan-validator/xplan-validator-executor/src/main/resources/application.properties
index 768094edc..8e08692ca 100644
--- a/xplan-validator/xplan-validator-executor/src/main/resources/application.properties
+++ b/xplan-validator/xplan-validator-executor/src/main/resources/application.properties
@@ -46,6 +46,7 @@ xplanbox.s3.accessKeyId=${XPLAN_S3_ACCESS_KEY}
 xplanbox.s3.endpoint.url=${XPLAN_S3_ENDPOINT}
 xplanbox.s3.region=${XPLAN_S3_REGION}
 xplanbox.s3.secretKey=${XPLAN_S3_SECRET_ACCESS_KEY}
+xplanbox.s3.chunkedEncodingEnabled=${XPLAN_S3_CHUNKENCODING_ENABLED:true}
 
 xplanbox.validation.profiles=${XPLAN_VALIDATION_PROFILES:}
 xplanbox.s3.bucket.validation=${XPLAN_S3_BUCKET_VALIDATION:validation}
-- 
GitLab