From 5a036af9c8264e48f37a8472bf43e0467aab7490 Mon Sep 17 00:00:00 2001 From: Thorsten Schlathoelter Date: Wed, 29 Jan 2025 23:47:39 +0100 Subject: [PATCH] fix: finalize documentation of open api --- connectors/citrus-openapi/README.md | 6 - .../openapi/OpenApiRepository.java | 50 - .../openapi/OpenApiSpecification.java | 146 ++- .../OpenApiClientRequestActionBuilder.java | 9 +- .../OpenApiClientResponseActionBuilder.java | 5 - .../OpenApiServerResponseActionBuilder.java | 22 +- .../actions/OpenApiSpecificationSource.java | 28 +- .../openapi/random/RandomConfiguration.java | 16 +- .../citrusframework/openapi/xml/OpenApi.java | 116 +- .../openapi/OpenApiRepositoryTest.java | 33 - .../openapi/OpenApiSpecificationTest.java | 51 +- .../openapi/OpenApiTestDataGeneratorTest.java | 11 +- .../openapi/integration/OpenApiClientIT.java | 1 - .../openapi/xml/OpenApiClientTest.java | 2 +- .../openapi/xml/openapi-client-test.xml | 12 + .../schema/xml/testcase/citrus-testcase.xsd | 14 + src/manual/connector-openapi.adoc | 1027 +++++++++++++---- .../RestApiSendMessageActionParser.java | 7 + .../citrus-test-api-generator-core/README.md | 108 -- .../openapi/generator/CitrusJavaCodegen.java | 8 +- .../main/resources/java-citrus/api.mustache | 4 +- .../java-citrus/namespace_handler.mustache | 2 +- .../resources/java-citrus/schema.mustache | 9 + .../generator/CitrusJavaCodegenTest.java | 6 +- .../openapi/generator/GeneratedRestApiIT.java | 35 +- .../resources/apis/petstore-extended-v3.yaml | 29 +- .../rest/extpetstore/model/Category.java | 2 +- .../extpetstore/model/HistoricalData.java | 2 +- .../rest/extpetstore/model/Pet.java | 2 +- .../rest/extpetstore/model/PetIdentifier.java | 2 +- .../rest/extpetstore/model/Tag.java | 2 +- .../model/VaccinationDocumentResult.java | 2 +- .../rest/extpetstore/request/ExtPetApi.java | 137 ++- .../spring/ExtPetStoreBeanConfiguration.java | 2 +- .../spring/ExtPetStoreNamespaceHandler.java | 8 +- .../rest/petstore/model/Address.java | 2 +- .../rest/petstore/model/Category.java | 2 +- .../rest/petstore/model/Customer.java | 2 +- .../rest/petstore/model/ModelApiResponse.java | 2 +- .../rest/petstore/model/Order.java | 2 +- .../expectedgen/rest/petstore/model/Pet.java | 2 +- .../expectedgen/rest/petstore/model/Tag.java | 2 +- .../expectedgen/rest/petstore/model/User.java | 2 +- .../rest/petstore/request/PetApi.java | 2 +- .../rest/petstore/request/StoreApi.java | 2 +- .../rest/petstore/request/UserApi.java | 2 +- .../spring/PetStoreBeanConfiguration.java | 2 +- .../spring/PetStoreNamespaceHandler.java | 2 +- .../request/BookServiceSoapApi.java | 2 +- .../spring/BookServiceBeanConfiguration.java | 2 +- .../spring/BookServiceNamespaceHandler.java | 2 +- .../withoutOperationIdTest.xml | 43 + .../maven/plugin/TestApiGeneratorMojo.java | 2 - .../plugin/TestApiGeneratorMojoUnitTest.java | 3 +- .../pom-full-config.xml | 2 - .../pom-with-overriding-config.xml | 1 - tools/jbang/dist/CitrusJBang.java | 4 +- 57 files changed, 1466 insertions(+), 537 deletions(-) delete mode 100644 connectors/citrus-openapi/README.md delete mode 100644 test-api-generator/citrus-test-api-generator-core/README.md create mode 100644 test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/GeneratedApiTest/withoutOperationIdTest.xml diff --git a/connectors/citrus-openapi/README.md b/connectors/citrus-openapi/README.md deleted file mode 100644 index 7669d15a9e..0000000000 --- a/connectors/citrus-openapi/README.md +++ /dev/null @@ -1,6 +0,0 @@ -// TODO -OpenApiServerRequest -- SchemaValidation is active by default (also in other scenarios) - -Oas Validation now by ValidationFramework -- no control response message is created any more \ No newline at end of file diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiRepository.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiRepository.java index 788635ebeb..c346c479c5 100644 --- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiRepository.java +++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiRepository.java @@ -17,7 +17,6 @@ package org.citrusframework.openapi; import static java.lang.String.format; -import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.synchronizedList; import static org.citrusframework.openapi.OpenApiSettings.isNeglectBasePathGlobally; import static org.citrusframework.openapi.OpenApiSettings.isRequestValidationEnabledGlobally; @@ -25,13 +24,8 @@ import jakarta.annotation.Nullable; import jakarta.validation.constraints.NotNull; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import org.citrusframework.exceptions.CitrusRuntimeException; import org.citrusframework.openapi.validation.OpenApiValidationPolicy; import org.citrusframework.repository.BaseRepository; @@ -83,50 +77,7 @@ public OpenApiRepository() { super(DEFAULT_NAME); } - /** - * @param openApiResource the OpenAPI resource from which to determine the alias - * @return an {@code Optional} containing the resource alias if it can be resolved, otherwise an - * empty {@code Optional} - */ - // Package protection for testing - static Optional determineResourceAlias(Resource openApiResource) { - String resourceAlias = null; - - try { - File file = openApiResource.getFile(); - if (file != null) { - resourceAlias = file.getName(); - int index = resourceAlias.lastIndexOf("."); - if (index != -1 && index != resourceAlias.length() - 1) { - resourceAlias = resourceAlias.substring(0, index); - } - return Optional.of(resourceAlias); - } - } catch (Exception e) { - // Ignore and try with url - } - try { - URL url = openApiResource.getURL(); - if (url != null) { - String urlString = URLDecoder.decode(url.getPath(), UTF_8).replace("\\", "/"); - int index = urlString.lastIndexOf("/"); - resourceAlias = urlString; - if (index != -1 && index != urlString.length() - 1) { - resourceAlias = resourceAlias.substring(index + 1); - } - index = resourceAlias.lastIndexOf("."); - if (index != -1 && index != resourceAlias.length() - 1) { - resourceAlias = resourceAlias.substring(0, index); - } - - } - } catch (MalformedURLException e) { - logger.error("Unable to determine resource alias from resource!", e); - } - - return Optional.ofNullable(resourceAlias); - } public List getOpenApiSpecifications() { return openApiSpecifications; @@ -210,7 +161,6 @@ public void addRepository(Resource openApiResource) { try { OpenApiSpecification openApiSpecification = OpenApiSpecification.from(openApiResource, validationPolicy); - determineResourceAlias(openApiResource).ifPresent(openApiSpecification::addAlias); openApiSpecification.setApiRequestValidationEnabled(requestValidationEnabled); openApiSpecification.setApiResponseValidationEnabled(responseValidationEnabled); openApiSpecification.setRootContextPath(rootContextPath); diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiSpecification.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiSpecification.java index b3e4585fe4..03a7b04880 100644 --- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiSpecification.java +++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/OpenApiSpecification.java @@ -17,9 +17,12 @@ package org.citrusframework.openapi; import static java.lang.String.format; +import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Collections.emptySet; import static java.util.Collections.singletonList; import static java.util.Collections.synchronizedSet; +import static org.citrusframework.openapi.OpenApiSettings.getRequestAutoFillRandomValues; +import static org.citrusframework.openapi.OpenApiSettings.getResponseAutoFillRandomValues; import static org.citrusframework.openapi.OpenApiSettings.isGenerateOptionalFieldsGlobally; import static org.citrusframework.openapi.OpenApiSettings.isNeglectBasePathGlobally; import static org.citrusframework.openapi.OpenApiSettings.isRequestValidationEnabledGlobally; @@ -29,13 +32,16 @@ import static org.citrusframework.util.StringUtils.hasText; import static org.citrusframework.util.StringUtils.isEmpty; +import io.apicurio.datamodels.core.models.Extension; import io.apicurio.datamodels.core.models.common.Info; import io.apicurio.datamodels.openapi.models.OasDocument; import io.apicurio.datamodels.openapi.models.OasOperation; import io.apicurio.datamodels.openapi.models.OasPathItem; +import java.io.File; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; +import java.net.URLDecoder; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -86,8 +92,9 @@ public class OpenApiSpecification { private static final String HTTP = "http"; /** - * A unique identifier (UID) for this specification at runtime. The UID is generated based on the SHA - * of the OpenAPI document combined with the full context path to which the API is attached. + * A unique identifier (UID) for this specification at runtime. The UID is generated based on + * the SHA of the OpenAPI document combined with the full context path to which the API is + * attached. * * @see OpenApiSpecification#determineUid for detailed information on how the UID is generated. */ @@ -145,8 +152,22 @@ public class OpenApiSpecification { private OasDocument openApiDoc; private OpenApiValidationContext openApiValidationContext; + + /** + * Generate optional attributes when generating random schema objects. + */ private boolean generateOptionalFields = isGenerateOptionalFieldsGlobally(); + /** + * Autofill parameters and body of request with random data. + */ + private AutoFillType requestAutoFill = getRequestAutoFillRandomValues(); + + /** + * Autofill parameters and body of response with random data. + */ + private AutoFillType responseAutoFill = getResponseAutoFillRandomValues(); + /** * Flag to indicate, whether request validation is enabled on api level. Api level overrules * global level and may be overruled by request level. @@ -174,7 +195,8 @@ public OpenApiSpecification(OpenApiValidationPolicy openApiValidationPolicy) { } /** - * Creates an OpenAPI specification instance from the given URL applying the default validation policy. + * Creates an OpenAPI specification instance from the given URL applying the default validation + * policy. * * @param specUrl the URL pointing to the OpenAPI specification to load * @return an OpenApiSpecification instance populated with the document and validation context @@ -196,13 +218,20 @@ public static OpenApiSpecification from(String specUrl, OpenApiSpecification specification = new OpenApiSpecification(openApiValidationPolicy); specification.setSpecUrl(specUrl); + try { + determineUrlAlias(new URL(specUrl)).ifPresent(specification::addAlias); + } catch (MalformedURLException e) { + // Ignore; + } + return specification; } /** - * Creates an OpenAPI specification instance from the given URL applying the default validation policy. + * Creates an OpenAPI specification instance from the given URL applying the default validation + * policy. * - * @param specUrl the URL pointing to the OpenAPI specification to load + * @param specUrl the URL pointing to the OpenAPI specification to load * @return an OpenApiSpecification instance populated with the document and validation context */ public static OpenApiSpecification from(URL specUrl) { @@ -227,9 +256,12 @@ public static OpenApiSpecification from(URL specUrl, openApiDoc = OpenApiResourceLoader.fromWebResource(specUrl); } - openApiValidationContext = OpenApiValidationContextLoader.fromSpec(OasModelHelper.toJson(openApiDoc), openApiValidationPolicy); + openApiValidationContext = OpenApiValidationContextLoader.fromSpec( + OasModelHelper.toJson(openApiDoc), openApiValidationPolicy); specification.setOpenApiValidationContext(openApiValidationContext); + determineUrlAlias(specUrl).ifPresent(specification::addAlias); + specification.setSpecUrl(specUrl.toString()); specification.initPathLookups(); specification.setOpenApiDoc(openApiDoc); @@ -267,9 +299,12 @@ public static OpenApiSpecification from(Resource resource, OasDocument openApiDoc = OpenApiResourceLoader.fromFile(resource); specification.setOpenApiValidationContext( - OpenApiValidationContextLoader.fromSpec(OasModelHelper.toJson(openApiDoc), openApiValidationPolicy)); + OpenApiValidationContextLoader.fromSpec(OasModelHelper.toJson(openApiDoc), + openApiValidationPolicy)); specification.setOpenApiDoc(openApiDoc); + determineResourceAlias(resource).ifPresent(specification::addAlias); + String schemeToUse = Optional.ofNullable(OasModelHelper.getSchemes(openApiDoc)) .orElse(singletonList(HTTP)) .stream() @@ -377,7 +412,6 @@ public synchronized OasDocument getOpenApiDoc(TestContext context) { Resource resource = Resources.create(resolvedSpecUrl); initApiDoc(() -> OpenApiResourceLoader.fromFile(resource)); - if (requestUrl == null) { String schemeToUse = Optional.ofNullable(OasModelHelper.getSchemes(openApiDoc)) .orElse(singletonList(HTTP)) @@ -550,6 +584,32 @@ public void setGenerateOptionalFields(boolean generateOptionalFields) { this.generateOptionalFields = generateOptionalFields; } + public AutoFillType getRequestAutoFill() { + return requestAutoFill; + } + + public void setRequestAutoFill(AutoFillType requestAutoFill) { + this.requestAutoFill = requestAutoFill; + } + + public OpenApiSpecification requestAutoFill(AutoFillType requestAutoFill) { + setRequestAutoFill(requestAutoFill); + return this; + } + + public AutoFillType getResponseAutoFill() { + return responseAutoFill; + } + + public void setResponseAutoFill(AutoFillType responseAutoFill) { + this.responseAutoFill = responseAutoFill; + } + + public OpenApiSpecification responseAutoFill(AutoFillType responseAutoFill) { + setResponseAutoFill(responseAutoFill); + return this; + } + public String getRootContextPath() { return rootContextPath; } @@ -605,6 +665,11 @@ private Collection collectAliases(OasDocument document) { } } + Extension xAlias = info.getExtension("x-citrus-alias"); + if (xAlias != null && xAlias.value != null) { + set.add(xAlias.value.toString()); + } + return set; } @@ -643,14 +708,14 @@ public void initOpenApiDoc(TestContext context) { */ public String getFullPath(OasPathItem oasPathItem) { return appendSegmentToUrlPath(rootContextPath, - getFullBasePath(oasPathItem)); + getFullBasePath(oasPathItem)); } /** * Get the full base-path for the given {@link OasPathItem}. *

- * The full base-path is constructed by concatenating the base path (if - * applicable), and the path of the given {@code oasPathItem}. The resulting format is: + * The full base-path is constructed by concatenating the base path (if applicable), and the + * path of the given {@code oasPathItem}. The resulting format is: *

*
      * /basePath/pathItemPath
@@ -658,12 +723,11 @@ public String getFullPath(OasPathItem oasPathItem) {
      * If the base path is to be neglected, it is excluded from the final constructed path.
      *
      * @param oasPathItem the OpenAPI path item whose full base-path is to be constructed
-     * @return the full base URL path, consisting of the base path, and the given path
-     * item
+     * @return the full base URL path, consisting of the base path, and the given path item
      */
     public String getFullBasePath(OasPathItem oasPathItem) {
         return appendSegmentToUrlPath(
-                getApplicableBasePath(), oasPathItem.getPath());
+            getApplicableBasePath(), oasPathItem.getPath());
     }
 
 
@@ -721,4 +785,58 @@ public OpenApiSpecification alias(String alias) {
         addAlias(alias);
         return this;
     }
+
+    /**
+     * @param openApiResource the OpenAPI resource from which to determine the alias
+     * @return an {@code Optional} containing the resource alias if it can be resolved, otherwise an
+     * empty {@code Optional}
+     */
+    // Package protection for testing
+    static Optional determineResourceAlias(Resource openApiResource) {
+        String resourceAlias = null;
+
+        try {
+            File file = openApiResource.getFile();
+            if (file != null) {
+                resourceAlias = file.getName();
+                int index = resourceAlias.lastIndexOf(".");
+                if (index != -1 && index != resourceAlias.length() - 1) {
+                    resourceAlias = resourceAlias.substring(0, index);
+                }
+                return Optional.of(resourceAlias);
+            }
+        } catch (Exception e) {
+            // Ignore and try with url
+        }
+
+        try {
+            URL url = openApiResource.getURL();
+            return determineUrlAlias(url);
+        } catch (MalformedURLException e) {
+            logger.error("Unable to determine resource alias from resource!", e);
+        }
+
+        return Optional.ofNullable(resourceAlias);
+    }
+
+    static Optional determineUrlAlias(URL url) {
+        String resourceAlias = null;
+
+        if (url != null) {
+            String urlString = URLDecoder.decode(url.getPath(), UTF_8).replace("\\", "/");
+            int index = urlString.lastIndexOf("/");
+            resourceAlias = urlString;
+            if (index != -1 && index != urlString.length() - 1) {
+                resourceAlias = resourceAlias.substring(index + 1);
+            }
+            index = resourceAlias.lastIndexOf(".");
+            if (index != -1 && index != resourceAlias.length() - 1) {
+                resourceAlias = resourceAlias.substring(0, index);
+            }
+
+        }
+
+        return Optional.ofNullable(resourceAlias);
+    }
+
 }
diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientRequestActionBuilder.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientRequestActionBuilder.java
index 84f5305214..d9f2994b29 100644
--- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientRequestActionBuilder.java
+++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientRequestActionBuilder.java
@@ -36,7 +36,6 @@
 import org.citrusframework.http.message.HttpMessageBuilder;
 import org.citrusframework.message.Message;
 import org.citrusframework.openapi.AutoFillType;
-import org.citrusframework.openapi.OpenApiSettings;
 import org.citrusframework.openapi.OpenApiSpecification;
 import org.citrusframework.openapi.model.OasModelHelper;
 import org.citrusframework.openapi.model.OperationPathAdapter;
@@ -129,8 +128,7 @@ public static class OpenApiClientRequestMessageBuilder extends HttpMessageBuilde
 
         private final String operationId;
 
-        // TODO: document me
-        private AutoFillType autoFill = OpenApiSettings.getRequestAutoFillRandomValues();
+        private AutoFillType autoFill ;
 
         public OpenApiClientRequestMessageBuilder(HttpMessage httpMessage,
             OpenApiSpecificationSource openApiSpec,
@@ -149,6 +147,11 @@ public OpenApiClientRequestMessageBuilder autoFill(AutoFillType autoFill) {
         public Message build(TestContext context, String messageType) {
             OpenApiSpecification openApiSpecification = openApiSpecificationSource.resolve(
                 context.getReferenceResolver());
+
+            if (autoFill == null) {
+                autoFill = openApiSpecification.getRequestAutoFill();
+            }
+
             openApiSpecification.initOpenApiDoc(context);
             openApiSpecification.getOperation(operationId, context)
                 .ifPresentOrElse(operationPathAdapter ->
diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientResponseActionBuilder.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientResponseActionBuilder.java
index 1fcf16e964..b57061a912 100644
--- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientResponseActionBuilder.java
+++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiClientResponseActionBuilder.java
@@ -80,11 +80,6 @@ public OpenApiClientResponseActionBuilder(OpenApiSpecificationSource openApiSpec
         this.operationId = operationId;
 
         // Set json as default instead of xml. This is most common for rest.
-        // TODO: we need to specify the type on message builder support level. So actually we need to
-        // 1. determine the response from operationId and statusCode
-        // 2. If status code is missing, take the most probable as response as determined by OasModelHelper.getResponseForRandomGeneration
-        // 3. Determine message type from response and set it on builder support
-        // If we do not set a proper type here, validations may not even be executed. E.g. simple json message validation.
         this.getMessageBuilderSupport().type(JSON);
     }
 
diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiServerResponseActionBuilder.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiServerResponseActionBuilder.java
index 99a304a62a..d7e509a254 100644
--- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiServerResponseActionBuilder.java
+++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiServerResponseActionBuilder.java
@@ -18,6 +18,8 @@
 
 import static java.lang.Integer.parseInt;
 import static java.util.Collections.singletonMap;
+import static org.citrusframework.openapi.AutoFillType.NONE;
+import static org.citrusframework.openapi.AutoFillType.REQUIRED;
 import static org.citrusframework.openapi.OpenApiMessageType.RESPONSE;
 import static org.citrusframework.openapi.OpenApiTestDataGenerator.createOutboundPayload;
 import static org.citrusframework.openapi.OpenApiTestDataGenerator.createRandomValueExpression;
@@ -145,7 +147,7 @@ private static class OpenApiServerResponseMessageBuilder extends HttpMessageBuil
         private final String statusCode;
         private final String accept;
 
-        private AutoFillType autoFillType = OpenApiSettings.getResponseAutoFillRandomValues();
+        private AutoFillType autoFill;
 
         public OpenApiServerResponseMessageBuilder(HttpMessage httpMessage,
             OpenApiSpecificationSource openApiSpecificationSource,
@@ -159,9 +161,8 @@ public OpenApiServerResponseMessageBuilder(HttpMessage httpMessage,
             this.accept = accept;
         }
 
-        // TODO: properly document autofill feature
         public OpenApiServerResponseMessageBuilder autoFill(AutoFillType autoFillType) {
-            this.autoFillType = autoFillType;
+            this.autoFill = autoFillType;
             return this;
         }
 
@@ -169,6 +170,11 @@ public OpenApiServerResponseMessageBuilder autoFill(AutoFillType autoFillType) {
         public Message build(TestContext context, String messageType) {
             OpenApiSpecification openApiSpecification = openApiSpecificationSource.resolve(
                 context.getReferenceResolver());
+
+            if (autoFill == null) {
+                 autoFill = OpenApiSettings.getResponseAutoFillRandomValues();
+            }
+
             if (STATUS_CODE_PATTERN.matcher(statusCode).matches()) {
                 getMessage().status(HttpStatus.valueOf(parseInt(statusCode)));
             } else {
@@ -208,7 +214,7 @@ private void buildResponse(TestContext context, OpenApiSpecification openApiSpec
             if (responseForRandomGeneration.isPresent()) {
                 OasResponse oasResponse = responseForRandomGeneration.get();
 
-                if (autoFillType != AutoFillType.NONE) {
+                if (autoFill != NONE) {
                     buildRandomHeaders(context, openApiSpecification, oasResponse);
                     buildRandomPayload(openApiSpecification, operation, oasResponse);
                 }
@@ -227,7 +233,7 @@ private void buildResponse(TestContext context, OpenApiSpecification openApiSpec
 
         private void buildRandomHeaders(TestContext context,
             OpenApiSpecification openApiSpecification, OasResponse response) {
-            if (autoFillType == AutoFillType.NONE) {
+            if (autoFill == NONE) {
                 return;
             }
 
@@ -236,10 +242,10 @@ private void buildRandomHeaders(TestContext context,
                 entry.getKey());
 
             Map headersToFill;
-            if (openApiSpecification.isGenerateOptionalFields()) {
-                headersToFill = OasModelHelper.getHeaders(response);
-            } else {
+            if (autoFill == REQUIRED) {
                 headersToFill = OasModelHelper.getRequiredHeaders(response);
+            } else {
+                headersToFill = OasModelHelper.getHeaders(response);
             }
 
             headersToFill.entrySet().stream()
diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiSpecificationSource.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiSpecificationSource.java
index 931e142156..bf86e0ce54 100644
--- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiSpecificationSource.java
+++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/actions/OpenApiSpecificationSource.java
@@ -1,15 +1,14 @@
 package org.citrusframework.openapi.actions;
 
+import static org.citrusframework.util.StringUtils.isEmpty;
+
+import java.util.Objects;
 import org.citrusframework.exceptions.CitrusRuntimeException;
 import org.citrusframework.openapi.OpenApiRepository;
 import org.citrusframework.openapi.OpenApiSpecification;
 import org.citrusframework.openapi.util.OpenApiUtils;
 import org.citrusframework.spi.ReferenceResolver;
 
-import java.util.Objects;
-
-import static org.citrusframework.util.StringUtils.isEmpty;
-
 /**
  * The {@code OpenApiSpecificationSource} class is responsible for managing and resolving an
  * {@link OpenApiSpecification} instance. It can either directly contain an
@@ -36,18 +35,21 @@ public OpenApiSpecification resolve(ReferenceResolver resolver) {
 
             if (!isEmpty(openApiAlias)) {
                 openApiSpecification = resolver.resolveAll(OpenApiRepository.class).values()
-                        .stream()
-                        .map(openApiRepository -> openApiRepository.openApi(openApiAlias)).
-                        filter(Objects::nonNull).
-                        findFirst()
+                    .stream()
+                    .map(openApiRepository -> openApiRepository.openApi(openApiAlias)).
+                    filter(Objects::nonNull).
+                    findFirst()
+                    .orElseGet(() -> resolver.resolveAll(OpenApiSpecification.class).values().stream()
+                        .filter(specification -> specification.getAliases().contains(openApiAlias))
+                        .findFirst()
                         .orElseThrow(() ->
-                                new CitrusRuntimeException(
-                                        "Unable to resolve OpenApiSpecification from alias '%s'. Known aliases for open api specs are '%s'".formatted(
-                                                openApiAlias, OpenApiUtils.getKnownOpenApiAliases(resolver)))
-                        );
+                            new CitrusRuntimeException(
+                                "Unable to resolve OpenApiSpecification from alias '%s'. Known aliases for open api specs are '%s'".formatted(
+                                    openApiAlias, OpenApiUtils.getKnownOpenApiAliases(resolver)))
+                        ));
             } else {
                 throw new CitrusRuntimeException(
-                        "Unable to resolve OpenApiSpecification. Neither OpenAPI spec, nor OpenAPI  alias are specified.");
+                    "Unable to resolve OpenApiSpecification. Neither OpenAPI spec, nor OpenAPI  alias are specified.");
             }
         }
 
diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/random/RandomConfiguration.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/random/RandomConfiguration.java
index 80adcb690a..c7d1a64346 100644
--- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/random/RandomConfiguration.java
+++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/random/RandomConfiguration.java
@@ -37,14 +37,14 @@ private RandomConfiguration() {
 
         // Note that the order of generators in the list is relevant, as the list is traversed from start to end, to find the first matching generator for a schema, and some generators match for less significant schemas.
         generators.add(new RandomEnumGenerator());
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, FORMAT_DATE).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:currentDate('yyyy-MM-dd')")));
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, FORMAT_DATE_TIME).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:currentDate('yyyy-MM-dd'T'hh:mm:ssZ')")));
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, FORMAT_UUID).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomUUID()")));
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, "email").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + EMAIL_PATTERN + "')")));
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, "uri").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + URI_PATTERN + "')")));
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, "hostname").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + HOSTNAME_PATTERN + "')")));
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, "ipv4").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + IPV4_PATTERN + "')")));
-        generators.add(RandomGeneratorBuilder.randomGeneratorBuilder(TYPE_STRING, "ipv6").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + IPV6_PATTERN + "')")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, FORMAT_DATE).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:currentDate('yyyy-MM-dd')")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, FORMAT_DATE_TIME).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:currentDate('yyyy-MM-dd'T'hh:mm:ssZ')")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, FORMAT_UUID).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomUUID()")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, "email").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + EMAIL_PATTERN + "')")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, "uri").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + URI_PATTERN + "')")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, "hostname").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + HOSTNAME_PATTERN + "')")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, "ipv4").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + IPV4_PATTERN + "')")));
+        generators.add(randomGeneratorBuilder(TYPE_STRING, "ipv6").build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + IPV6_PATTERN + "')")));
         generators.add(randomGeneratorBuilder().withType(TYPE_STRING).withPattern(ANY).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimpleQuoted("citrus:randomPattern('" + schema.pattern + "')")));
         generators.add(randomGeneratorBuilder().withType(TYPE_BOOLEAN).build((randomContext, schema) -> randomContext.getRandomModelBuilder().appendSimple("citrus:randomEnumValue('true', 'false')")));
         generators.add(new RandomStringGenerator());
diff --git a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/xml/OpenApi.java b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/xml/OpenApi.java
index 01615e438b..f7060d44b4 100644
--- a/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/xml/OpenApi.java
+++ b/connectors/citrus-openapi/src/main/java/org/citrusframework/openapi/xml/OpenApi.java
@@ -22,30 +22,30 @@
 import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlRootElement;
 import jakarta.xml.bind.annotation.XmlType;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
 import org.citrusframework.TestAction;
 import org.citrusframework.TestActionBuilder;
 import org.citrusframework.actions.ReceiveMessageAction;
 import org.citrusframework.actions.SendMessageAction;
 import org.citrusframework.endpoint.resolver.EndpointUriResolver;
 import org.citrusframework.exceptions.CitrusRuntimeException;
-import org.citrusframework.http.actions.HttpServerResponseActionBuilder;
 import org.citrusframework.http.message.HttpMessageHeaders;
+import org.citrusframework.openapi.AutoFillType;
 import org.citrusframework.openapi.actions.OpenApiActionBuilder;
 import org.citrusframework.openapi.actions.OpenApiClientActionBuilder;
 import org.citrusframework.openapi.actions.OpenApiClientRequestActionBuilder;
 import org.citrusframework.openapi.actions.OpenApiClientResponseActionBuilder;
 import org.citrusframework.openapi.actions.OpenApiServerActionBuilder;
 import org.citrusframework.openapi.actions.OpenApiServerRequestActionBuilder;
+import org.citrusframework.openapi.actions.OpenApiServerResponseActionBuilder;
 import org.citrusframework.spi.ReferenceResolver;
 import org.citrusframework.spi.ReferenceResolverAware;
 import org.citrusframework.xml.actions.Message;
 import org.citrusframework.xml.actions.Receive;
 import org.citrusframework.xml.actions.Send;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-
 @XmlRootElement(name = "openapi")
 public class OpenApi implements TestActionBuilder, ReferenceResolverAware {
 
@@ -92,11 +92,19 @@ public OpenApi setHttpServer(String httpServer) {
     @XmlElement(name = "send-request")
     public OpenApi setSendRequest(ClientRequest request) {
         OpenApiClientRequestActionBuilder requestBuilder =
-                asClientBuilder().send(request.getOperation());
+            asClientBuilder().send(request.getOperation());
 
         requestBuilder.name("openapi:send-request");
         requestBuilder.description(description);
 
+        if (request.getSchemaValidation() != null) {
+            requestBuilder.schemaValidation(request.getSchemaValidation());
+        }
+
+        if (request.getAutoFill() != null) {
+            requestBuilder.autoFill(request.getAutoFill());
+        }
+
         send = new Send(requestBuilder) {
             @Override
             protected SendMessageAction doBuild() {
@@ -124,11 +132,15 @@ protected SendMessageAction doBuild() {
     @XmlElement(name = "receive-response")
     public OpenApi setReceiveResponse(ClientResponse response) {
         OpenApiClientResponseActionBuilder responseBuilder =
-                asClientBuilder().receive(response.getOperation(), response.getStatus());
+            asClientBuilder().receive(response.getOperation(), response.getStatus());
 
         responseBuilder.name("openapi:receive-response");
         responseBuilder.description(description);
 
+        if (response.getSchemaValidation() != null) {
+            responseBuilder.schemaValidation(response.getSchemaValidation());
+        }
+
         receive = new Receive(responseBuilder) {
             @Override
             protected ReceiveMessageAction doBuild() {
@@ -166,11 +178,15 @@ protected ReceiveMessageAction doBuild() {
     @XmlElement(name = "receive-request")
     public OpenApi setReceiveRequest(ServerRequest request) {
         OpenApiServerRequestActionBuilder requestBuilder =
-                asServerBuilder().receive(request.getOperation());
+            asServerBuilder().receive(request.getOperation());
 
         requestBuilder.name("openapi:receive-request");
         requestBuilder.description(description);
 
+        if (request.getSchemaValidation() != null) {
+            requestBuilder.schemaValidation(request.getSchemaValidation());
+        }
+
         receive = new Receive(requestBuilder) {
             @Override
             protected ReceiveMessageAction doBuild() {
@@ -205,12 +221,20 @@ protected ReceiveMessageAction doBuild() {
 
     @XmlElement(name = "send-response")
     public OpenApi setSendResponse(ServerResponse response) {
-        HttpServerResponseActionBuilder responseBuilder =
-                asServerBuilder().send(response.getOperation(), response.getStatus());
+        OpenApiServerResponseActionBuilder  responseBuilder =
+            asServerBuilder().send(response.getOperation(), response.getStatus());
 
         responseBuilder.name("openapi:send-response");
         responseBuilder.description(description);
 
+        if (response.getSchemaValidation() != null) {
+            responseBuilder.schemaValidation(response.getSchemaValidation());
+        }
+
+        if (response.getAutoFill() != null) {
+            responseBuilder.autoFill(response.getAutoFill());
+        }
+
         send = new Send(responseBuilder) {
             @Override
             protected SendMessageAction doBuild() {
@@ -266,7 +290,7 @@ private OpenApiClientActionBuilder asClientBuilder() {
         }
 
         throw new CitrusRuntimeException(String.format("Failed to convert '%s' to openapi client action builder",
-                Optional.ofNullable(builder).map(Object::getClass).map(Class::getName).orElse("null")));
+            Optional.ofNullable(builder).map(Object::getClass).map(Class::getName).orElse("null")));
     }
 
     /**
@@ -280,7 +304,7 @@ private OpenApiServerActionBuilder asServerBuilder() {
         }
 
         throw new CitrusRuntimeException(String.format("Failed to convert '%s' to openapi server action builder",
-                Optional.ofNullable(builder).map(Object::getClass).map(Class::getName).orElse("null")));
+            Optional.ofNullable(builder).map(Object::getClass).map(Class::getName).orElse("null")));
     }
 
     @XmlAccessorType(XmlAccessType.FIELD)
@@ -292,6 +316,10 @@ public static class ClientRequest {
         protected String uri;
         @XmlAttribute(name = "fork")
         protected Boolean fork;
+        @XmlAttribute(name = "schemaValidation")
+        protected Boolean schemaValidation;
+        @XmlAttribute(name = "autofill")
+        protected AutoFillType autoFill;
 
         @XmlElement
         protected Message.Extract extract;
@@ -320,6 +348,14 @@ public void setFork(Boolean fork) {
             this.fork = fork;
         }
 
+        public Boolean getSchemaValidation() {
+            return schemaValidation;
+        }
+
+        public void setSchemaValidation(Boolean schemaValidation) {
+            this.schemaValidation = schemaValidation;
+        }
+
         public Message.Extract getExtract() {
             return extract;
         }
@@ -327,6 +363,15 @@ public Message.Extract getExtract() {
         public void setExtract(Message.Extract extract) {
             this.extract = extract;
         }
+
+        public AutoFillType getAutoFill() {
+            return autoFill;
+        }
+
+        public void setAutoFill(AutoFillType autoFill) {
+            this.autoFill = autoFill;
+        }
+
     }
 
     @XmlAccessorType(XmlAccessType.FIELD)
@@ -353,6 +398,9 @@ public static class ServerRequest {
         @XmlAttribute(name = "header-validators")
         protected String headerValidators;
 
+        @XmlAttribute(name = "schemaValidation")
+        protected Boolean schemaValidation;
+
         @XmlElement
         protected Receive.Selector selector;
 
@@ -437,6 +485,15 @@ public Message.Extract getExtract() {
         public void setExtract(Message.Extract extract) {
             this.extract = extract;
         }
+
+        public Boolean getSchemaValidation() {
+            return schemaValidation;
+        }
+
+        public void setSchemaValidation(Boolean schemaValidation) {
+            this.schemaValidation = schemaValidation;
+        }
+
     }
 
     @XmlAccessorType(XmlAccessType.FIELD)
@@ -448,6 +505,12 @@ public static class ServerResponse {
         @XmlAttribute
         protected String status = "200";
 
+        @XmlAttribute(name = "schemaValidation")
+        protected Boolean schemaValidation;
+
+        @XmlAttribute(name = "autofill")
+        protected AutoFillType autoFill;
+
         @XmlElement
         protected Message.Extract extract;
 
@@ -474,6 +537,23 @@ public Message.Extract getExtract() {
         public void setExtract(Message.Extract extract) {
             this.extract = extract;
         }
+
+        public Boolean getSchemaValidation() {
+            return schemaValidation;
+        }
+
+        public void setSchemaValidation(Boolean schemaValidation) {
+            this.schemaValidation = schemaValidation;
+        }
+
+        public AutoFillType getAutoFill() {
+            return autoFill;
+        }
+
+        public void setAutoFill(AutoFillType autoFill) {
+            this.autoFill = autoFill;
+        }
+
     }
 
     @XmlAccessorType(XmlAccessType.FIELD)
@@ -503,6 +583,9 @@ public static class ClientResponse {
         @XmlAttribute(name = "header-validators")
         protected String headerValidators;
 
+        @XmlAttribute(name = "schemaValidation")
+        protected Boolean schemaValidation;
+
         @XmlElement
         protected Receive.Selector selector;
 
@@ -599,5 +682,14 @@ public Message.Extract getExtract() {
         public void setExtract(Message.Extract extract) {
             this.extract = extract;
         }
+
+        public Boolean getSchemaValidation() {
+            return schemaValidation;
+        }
+
+        public void setSchemaValidation(Boolean schemaValidation) {
+            this.schemaValidation = schemaValidation;
+        }
+
     }
 }
diff --git a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiRepositoryTest.java b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiRepositoryTest.java
index 817b06825d..fe846a6f59 100644
--- a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiRepositoryTest.java
+++ b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiRepositoryTest.java
@@ -17,22 +17,14 @@
 package org.citrusframework.openapi;
 
 import static java.util.Collections.singletonList;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.mock;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertThrows;
 import static org.testng.Assert.assertTrue;
 
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.util.List;
-import java.util.Optional;
 import org.citrusframework.openapi.validation.OpenApiValidationPolicy;
-import org.citrusframework.spi.Resource;
 import org.testng.annotations.Test;
 
 public class OpenApiRepositoryTest {
@@ -89,31 +81,6 @@ public void shouldFailOnFaultyOpenApiRepositoryByStrictValidation() {
         assertThrows(openApiRepository::initialize);
     }
 
-    @Test
-    public void shouldResolveResourceAliasFromFile() {
-        File fileMock = mock();
-        doReturn("MyApi.json").when(fileMock).getName();
-        Resource resourceMock = mock();
-        doReturn(fileMock).when(resourceMock).getFile();
-
-        Optional alias = OpenApiRepository.determineResourceAlias(resourceMock);
-        assertTrue(alias.isPresent());
-        assertEquals(alias.get(), "MyApi");
-    }
-
-    @Test
-    public void shouldResolveResourceAliasFromUrl() throws MalformedURLException {
-        URL urlMock = mock();
-        doReturn("/C:/segment1/segment2/MyApi.json").when(urlMock).getPath();
-        Resource resourceMock = mock();
-        doThrow(new RuntimeException("Forced Exception")).when(resourceMock).getFile();
-        doReturn(urlMock).when(resourceMock).getURL();
-
-        Optional alias = OpenApiRepository.determineResourceAlias(resourceMock);
-        assertTrue(alias.isPresent());
-        assertEquals(alias.get(), "MyApi");
-    }
-
     @Test
     public void shouldSetAndProvideProperties() {
         // Given
diff --git a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiSpecificationTest.java b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiSpecificationTest.java
index 9025e528dd..ae49846a53 100644
--- a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiSpecificationTest.java
+++ b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiSpecificationTest.java
@@ -16,13 +16,17 @@
 
 package org.citrusframework.openapi;
 
+import static org.citrusframework.openapi.OpenApiSpecification.determineResourceAlias;
 import static org.citrusframework.openapi.validation.OpenApiValidationPolicy.IGNORE;
 import static org.citrusframework.openapi.validation.OpenApiValidationPolicy.REPORT;
 import static org.citrusframework.openapi.validation.OpenApiValidationPolicy.STRICT;
 import static org.citrusframework.util.FileUtils.readToString;
 import static org.mockito.AdditionalAnswers.returnsFirstArg;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.isA;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
@@ -33,7 +37,9 @@
 
 import io.apicurio.datamodels.openapi.models.OasDocument;
 import java.io.ByteArrayInputStream;
+import java.io.File;
 import java.io.IOException;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.Optional;
@@ -108,11 +114,9 @@ private static URL mockUrlConnection(String urlString) {
                     invocation -> new ByteArrayInputStream(PING_API_STRING.getBytes(
                             StandardCharsets.UTF_8)));
 
-            URL urlMock = mock();
-            when(urlMock.getProtocol()).thenReturn(urlString.substring(0, urlString.indexOf(":")));
-            when(urlMock.toString()).thenReturn(urlString);
-            when(urlMock.openConnection()).thenReturn(httpsURLConnectionMock);
-            return urlMock;
+            URL urlSpy = spy(new URL(urlString));
+            when(urlSpy.openConnection()).thenReturn(httpsURLConnectionMock);
+            return urlSpy;
         } catch (Exception e) {
             throw new CitrusRuntimeException("Unable to mock spec url!", e);
         }
@@ -429,18 +433,6 @@ public void shouldSetRootContextPathNeglectingBasePathAndReinitialize() {
         assertEquals(pongOperationPathAdapter.get().fullPath(), "/root/pong/{id}");
     }
 
-    @Test
-    public void shouldSeAndProvideProperties() {
-
-        openApiSpecification.setGenerateOptionalFields(true);
-
-        assertTrue(openApiSpecification.isGenerateOptionalFields());
-
-        openApiSpecification.setGenerateOptionalFields(false);
-
-        assertFalse(openApiSpecification.isGenerateOptionalFields());
-    }
-
     @Test
     public void shouldReturnSpecUrlInAbsenceOfRequestUrl() {
 
@@ -455,4 +447,29 @@ public void shouldReturnSpecUrlInAbsenceOfRequestUrl() {
         assertEquals(openApiSpecification.getSpecUrl(), "/ping-api.yaml");
         assertEquals(openApiSpecification.getRequestUrl(), "http://or.citrus.sample");
     }
+
+    @Test
+    public void testResolveResourceAliasFromFile() {
+        File fileMock = mock();
+        doReturn("MyApi.json").when(fileMock).getName();
+        Resource resourceMock = mock();
+        doReturn(fileMock).when(resourceMock).getFile();
+
+        Optional alias = determineResourceAlias(resourceMock);
+        assertTrue(alias.isPresent());
+        assertEquals(alias.get(), "MyApi");
+    }
+
+    @Test
+    public void testResolveResourceAliasFromUrl() throws MalformedURLException {
+        URL urlMock = mock();
+        doReturn("/C:/segment1/segment2/MyApi.json").when(urlMock).getPath();
+        Resource resourceMock = mock();
+        doThrow(new RuntimeException("Forced Exception")).when(resourceMock).getFile();
+        doReturn(urlMock).when(resourceMock).getURL();
+
+        Optional alias = determineResourceAlias(resourceMock);
+        assertTrue(alias.isPresent());
+        assertEquals(alias.get(), "MyApi");
+    }
 }
diff --git a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiTestDataGeneratorTest.java b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiTestDataGeneratorTest.java
index 3f8ff4f9d8..23d180eddb 100644
--- a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiTestDataGeneratorTest.java
+++ b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/OpenApiTestDataGeneratorTest.java
@@ -48,6 +48,7 @@
 import static org.citrusframework.openapi.OpenApiConstants.TYPE_INTEGER;
 import static org.citrusframework.openapi.OpenApiConstants.TYPE_NUMBER;
 import static org.citrusframework.openapi.OpenApiConstants.TYPE_STRING;
+import static org.citrusframework.openapi.OpenApiTestDataGenerator.createOutboundPayload;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -226,7 +227,7 @@ public void testRandomNumber(String type,
         testSchema.exclusiveMaximum = exclusiveMaximum;
 
         for (int i = 0; i < 1000; i++) {
-            String randomValue = OpenApiTestDataGenerator.createOutboundPayload(
+            String randomValue = createOutboundPayload(
                     testSchema, openApiSpecification);
             String finalRandomValue = testContext.resolveDynamicValue(randomValue);
             BigDecimal value = new BigDecimal(finalRandomValue);
@@ -291,7 +292,7 @@ public void testPingApiSchemas(String schemaType) throws IOException {
         assertNotNull(schema);
 
         for (int i = 0; i < 100; i++) {
-            String randomValue = OpenApiTestDataGenerator.createOutboundPayload(schema, openApiSpecification);
+            String randomValue = createOutboundPayload(schema, openApiSpecification);
             assertNotNull(randomValue);
 
             String finalJsonAsText = testContext.replaceDynamicContentInString(randomValue);
@@ -324,7 +325,7 @@ public void testArray() {
         arraySchema.items = stringSchema;
 
         for (int i = 0; i < 10; i++) {
-            String randomValue = OpenApiTestDataGenerator.createOutboundPayload(arraySchema, openApiSpecification);
+            String randomValue = createOutboundPayload(arraySchema, openApiSpecification);
             int nElements = StringUtils.countMatches(randomValue, "citrus:randomString");
             assertTrue(nElements > 0);
         }
@@ -344,7 +345,7 @@ public void testArrayMinItems() {
         arraySchema.items = stringSchema;
 
         for (int i = 0; i < 10; i++) {
-            String randomValue = OpenApiTestDataGenerator.createOutboundPayload(arraySchema, openApiSpecification);
+            String randomValue = createOutboundPayload(arraySchema, openApiSpecification);
             int nElements = StringUtils.countMatches(randomValue, "citrus:randomString(15)");
             assertTrue(nElements <= 5);
         }
@@ -366,7 +367,7 @@ public void testArrayMaxItems() {
 
         Pattern pattern = Pattern.compile("citrus:randomString\\(1[0-5],MIXED,true,10\\)");
         for (int i = 0; i < 100; i++) {
-            String randomArrayValue = OpenApiTestDataGenerator.createOutboundPayload(arraySchema, openApiSpecification);
+            String randomArrayValue = createOutboundPayload(arraySchema, openApiSpecification);
 
             Matcher matcher = pattern.matcher(randomArrayValue);
             int matches = 0;
diff --git a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/integration/OpenApiClientIT.java b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/integration/OpenApiClientIT.java
index 6b563cf507..1b49c3c1bf 100644
--- a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/integration/OpenApiClientIT.java
+++ b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/integration/OpenApiClientIT.java
@@ -72,7 +72,6 @@ public void shouldExecuteGetPetById() {
         when(openapi("petstore-v3")
             .client(httpClient)
             .send("getPetById")
-            .autoFill(AutoFillType.ALL)
             .message()
             .fork(true));
 
diff --git a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/xml/OpenApiClientTest.java b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/xml/OpenApiClientTest.java
index 598590e947..768c957d4b 100644
--- a/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/xml/OpenApiClientTest.java
+++ b/connectors/citrus-openapi/src/test/java/org/citrusframework/openapi/xml/OpenApiClientTest.java
@@ -151,7 +151,7 @@ public void shouldLoadOpenApiClientActions() throws IOException {
         Assert.assertEquals(result.getName(), "OpenApiClientTest");
         Assert.assertEquals(result.getMetaInfo().getAuthor(), "Christoph");
         Assert.assertEquals(result.getMetaInfo().getStatus(), TestCaseMetaInfo.Status.FINAL);
-        Assert.assertEquals(result.getActionCount(), 4L);
+        Assert.assertEquals(result.getActionCount(), 6L);
         Assert.assertEquals(result.getTestAction(0).getClass(), SendMessageAction.class);
         Assert.assertEquals(result.getTestAction(0).getName(), "openapi:send-request");
 
diff --git a/connectors/citrus-openapi/src/test/resources/org/citrusframework/openapi/xml/openapi-client-test.xml b/connectors/citrus-openapi/src/test/resources/org/citrusframework/openapi/xml/openapi-client-test.xml
index 019c1a9e07..48837d6301 100644
--- a/connectors/citrus-openapi/src/test/resources/org/citrusframework/openapi/xml/openapi-client-test.xml
+++ b/connectors/citrus-openapi/src/test/resources/org/citrusframework/openapi/xml/openapi-client-test.xml
@@ -37,5 +37,17 @@
     
       
     
+
+    
+      
+        
+          
+        
+      
+    
+
+    
+      
+    
   
 
diff --git a/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd b/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd
index 74eb05ebfc..f3d92d87a5 100644
--- a/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd
+++ b/runtime/citrus-xml/src/main/resources/org/citrusframework/schema/xml/testcase/citrus-testcase.xsd
@@ -1412,6 +1412,14 @@
     
   
 
+  
+    
+      
+      
+      
+    
+  
+
   
     
       
@@ -1430,6 +1438,7 @@
             
             
             
+            
           
         
         
@@ -1447,6 +1456,7 @@
             
             
             
+            
           
         
         
@@ -1457,6 +1467,8 @@
             
             
             
+            
+            
           
         
         
@@ -1466,6 +1478,8 @@
             
             
             
+            
+            
           
         
       
diff --git a/src/manual/connector-openapi.adoc b/src/manual/connector-openapi.adoc
index a70bdba30e..f79c43f801 100644
--- a/src/manual/connector-openapi.adoc
+++ b/src/manual/connector-openapi.adoc
@@ -7,11 +7,11 @@ The generated message data follows the rules of a given operation in the specifi
 In particular, the message body is generated according to the given Json schema rules in that specification.
 This way users may do contract-driven testing where the client and the server ensure the conformity with the contract to obey to the same specification rules.
 
-Taking it a step further, Citrus OpenAPI offers a TestAPI generator powered by OpenApiGenerator. This
-generator produces the necessary Builders, which define explicit actions for each operation in a given
-OpenAPI. These actions enable access to any operation within the OpenAPI, making it ideal for testing
-the API itself or interacting with other supporting services. The current implementation of Citrus
-TestAPI uses Maven for generation and Spring for integration. For more details, please refer to
+Taking it a step further, Citrus OpenAPI offers a TestAPI generator powered by OpenApiGenerator.
+This generator produces the necessary Builders, which define explicit actions for each operation in a given OpenAPI.
+These actions enable access to any operation within the OpenAPI, making it ideal for testing the API itself or interacting with other supporting services.
+The current implementation of Citrus TestAPI uses Maven for generation and Spring for integration.
+For more details, please refer to
 <> .
 
 NOTE: The OpenAPI support in Citrus gets enabled by adding a separate Maven module as dependency to your project
@@ -36,10 +36,40 @@ Or you may just point the OpenAPI components to a local specification file.
 
 Citrus supports OpenAPI on both client and server components so the next sections will describe the usage for each of those.
 
+[[openapi-specification-settings]]
+== OpenAPI specification settings
+
+The `OpenApiSettings` class provides configuration settings for controlling various aspects of OpenAPI request and response validation and random data generation.
+These settings can be controlled globally through system properties or environment variables.
+The following table outlines the available configuration options:
+
+|===
+| Parameter Name                                | Environment Variable Name                      | Description
+
+| `citrus.openapi.validation.enabled.request`    | `CITRUS_OPENAPI_VALIDATION_DISABLE_REQUEST`     | Controls whether request validation is enabled for OpenAPI operations.
+| `citrus.openapi.validation.enabled.response`   | `CITRUS_OPENAPI_VALIDATION_DISABLE_RESPONSE`    | Controls whether response validation is enabled for OpenAPI operations.
+| `citrus.openapi.neglect.base.path`             | `CITRUS_OPENAPI_NEGLECT_BASE_PATH`              | Determines whether to neglect the base path when building openration paths.
+| `citrus.openapi.request.fill.random.values`    | `CITRUS_OPENAPI_REQUEST_FILL_RANDOM_VALUES`     | Specifies whether to automatically fill missing values in request bodies with random data. One of `REQUIRED` (default) `ALL` or `NONE`)
+| `citrus.openapi.response.fill.random.values`   | `CITRUS_OPENAPI_RESPONSE_FILL_RANDOM_VALUES`    | Specifies whether to automatically fill missing values in response bodies with random data. One of `REQUIRED` (default) `ALL` or `NONE`)
+| `citrus.openapi.generate.optional.fields`      | `CITRUS_OPENAPI_GENERATE_OPTIONAL_FIELDS`        | Enables or disables the generation of optional fields in the OpenAPI Json requests and responses.
+| `citrus.openapi.validation.policy`             | `CITRUS_OPENAPI_VALIDATION_POLICY`              | Defines the validation policy for OpenAPI operations (e.g., `FAIL`, `REPORT`, `IGNORE`).
+|===
+
+
 [[openapi-repository]]
 == OpenAPI specification repositories
 
-An OpenApiRepository can be used to manage OpenAPI specifications.
+An OpenApiRepository provides a centralized way to manage OpenAPI specifications within a test environment.
+When bound to a bean container, it automatically makes registered specifications available for message
+validation in conjunction with messages send by actions created by OpenApiActionBuilders. These built actions
+ensure that all necessary validation information is present, enabling seamless verification without additional user input.
+
+While an OpenApiRepository is particularly useful for loading multiple OpenAPI definitions from a specified
+location, in many cases, directly registering an individual OpenApiSpecification within the bean container
+is sufficient.
+Any registered specification—whether added individually or via a repository—will be considered during message validation.
+
+This approach simplifies OpenAPI-based validation in Citrus, ensuring that test messages conform to their expected structure without requiring manual intervention.
 
 .Java
 [source,java,indent=0,role="primary"]
@@ -74,7 +104,7 @@ public OpenApiRepository petstoreOpenApiRepository() {
 |===
 |Property | Description | Default
 
-| locations | Defines the location(s) of the OpenAPI specification files. May be one file or a directory. E.g. `classpath:org/citrusframework/openapi/petstore/*.json` |
+| locations | Defines the location(s) of the OpenAPI specification files. May be one file or a directory. E.g. `classpath:org/citrusframework/openapi/petstore/*.json`. Note that when loading more than one OpenAPI via a repository, care must be taken with respect to the context paths of the OpenAPIs. See the context path configuration properties of the repository and the following <<_hooking_the_operation_path>> chapter.  |
 | rootContextPath | Sets the root context path for the API, which overrides any context path defined within the specification itself. | Use the context path specified in the first server element of the OpenApi.
 | validationPolicy | Controls the handling of validation errors. The available options are: +
 - `FAIL`: Causes the test to fail when validation errors occur. +
@@ -87,49 +117,72 @@ public OpenApiRepository petstoreOpenApiRepository() {
 
 === Hooking the Operation Path
 
-The final path used for an operation during testing is built based on the OpenAPI specification's `basePath`,
-the `rootContextPath` configuration, and the `neglectBasePath` setting. The path construction follows these rules:
+In OpenAPI, an operation represents a single API endpoint, typically corresponding to an HTTP method (e.g., GET, POST) and a specific path.
+The path defines how the client interacts with the API and often includes dynamic parameters.
+These paths are defined relative to the API's base URL and are an essential part of structuring API interactions.
+
+The OpenAPI specification allows defining a server URL, which acts as the root of the API. This URL
+may include a basePath, which serves as a prefix for all operation paths.
+If more than one server is specified, the first one will be used.
+Additionally, applications may define a context path, which can be used to namespace APIs when deployed in different environments.
+In the following, this context path is denoted rootContextPath.
+It is a user-specified value that can be assigned to an OpenApiRepository or to an OpenApiSpecification itself.
+
+The final path used for an operation during testing is built based on the OpenAPI specification's `basePath`, the `rootContextPath`.
+For most flexibility, Citrus provides several options to configure the final operation path:
 
 1. **Default Path Construction**:
 - By default, the path is constructed using the `basePath` from the OpenAPI specification (if defined) combined with the `operationPath`.
-- For example, if the `basePath` is `/v1/petstore` and the operation path is `/pet`, the final path will be:
-```
-/v1/petstore/pet
-```
+- For example, if the `basePath` is `/v1/petstore` and the operation path is `/pet`, the final path will be: `*/v1/petstore/pet*`
 
 2. **When `rootContextPath` is Set**:
 - If a `rootContextPath` is provided, it will be prepended to the `basePath` (if present) and the `operationPath`.
-- If the `basePath` is `/v1/petstore`, the `operationPath` is `/pet`, and the `rootContextPath` is `/api`, the resulting path will be:
-```
-/api/v1/petstore/pet
-```
+- or example, if the `basePath` is `/v1/petstore`, the `operationPath` is `/pet`, and the `rootContextPath` is `/api`, the resulting path will be: `*/api/v1/petstore/pet*`
 
 3. **When `neglectBasePath` is Set**:
 - If `neglectBasePath` is set to `true`, the `basePath` is ignored, and only the `operationPath` and `rootContextPath` is used.
-- For example, if the `basePath` is `/v1/petstore` and the `operationPath` is `/pet`, and the `rootContextPath` is `/api`, setting `neglectBasePath=true` will result in the path:
-```
-/api/pet
-```
+- For example, if the `basePath` is `/v1/petstore` and the `operationPath` is `/pet`, and the `rootContextPath` is `/api`, setting `neglectBasePath=true` will result in the path: `*/api/pet*` +
+Likewise, if the `rootContextPath` is not set, the resulting path will be the `operationPath` only: `*/pet*`
+
+These properties allow for flexible configuration of the OpenAPI repository, enabling you to customize how API validation is handled and how the OpenAPI specifications are loaded into the system.
 
-Likewise, if the `rootContextPath` is not set, the resulting path will be the `operationPath` only:
-```
-/pet
-```
+[[openapi-specification]]
+== OpenAPI aliases
 
+You can refer to registered OpenAPI specification by an alias.
+That way, you can register a specification in your preferred bean container and refer to it, rather than instantiating a specification over and over in all your tests.
+The specification can then be resolved at runtime when needed.
 
-These properties allow for flexible configuration of the OpenAPI repository, enabling you to customize how API validation is handled and how the OpenAPI specifications are loaded into the system.
+The following aliases are derived from the specification.
+
+1. If the specification has an info element with a title, the title will be assigned as alias: `Swagger Petstore`
+2. If the specification has an info element with a version and a title, the title plus version will be assigned as alias: `Swagger Petstore/1.0.1`
+3. If the specification is loaded from a `Resource` via an OpenAPIRepository, the resource name without file extension will be added as alias: `petstore-v3`
+4. If the specification has an extension named `x-citrus-alias`, the value of this extension will be assigned as alias.
+5. For technical reasons, a unique-id will also be added as alias.
+This unique-id alias is determined from the document SHA value and the full context path, to which the specification is mounted, making it unique, even if the same API is used at different mount-points.
+Note that this unique-id alias is used internally during validation, to identify the OpenAPI specification that relates to a specific message.
+
+Citrus will try to resolve the specification from a given alias by querying all registered OpenApiRepositories as well as all registered OpenApiSpecifications.
 
+[[openapi-specification]]
+== XML Support
+
+This is a brief note on the XML support of OpenAPI. Due to the comprehensive <>  approach
+with Spring support, which covers all aspects of OpenAPI, the plain XML support has not yet been fully
+implemented. We recommend using the generated TestAPI with Spring, instead of plain XML for better functionality and coverage.
 
 [[openapi-client]]
 == OpenAPI client
 
-On the client side Citrus uses the OpenAPI specification to generate a proper HTTP request that is sent to the server.
-The user just gives a valid operationId from the specification every thing else is automatically generated.
-The Citrus client message will use the proper request path (e.g. `/petstore/v3/pet`) and Content-Type (e.g. `applicaiton/json`) according to the specification rules.
+On the client side, Citrus uses the OpenAPI specification to generate the appropriate HTTP request sent to the server.
+While you can manually configure every aspect of the message sent by the client, it’s also possible to auto-generate the message from the specification.
+In either case, the client will automatically use the correct request path (e.g., `/petstore/v3/pet`) and Content-Type (e.g., `application/json`) based on the specification.
 
-Of course, you can also validate the HTTP response message with auto generated validation.
-The user just gives the expected HTTP status code that is also described in the specification (e.g. 200 OK).
-The response data used as expected message content is then also generated from the specification.
+A response is automatically validated against the corresponding response defined in the OpenAPI specification
+for the given status code.
+You just specify the expected HTTP status code, which must match one defined in the specification (e.g., 200 OK), and validation will be performed automatically.
+For more details see <>.
 
 As an example the following OpenAPI specification defines the operation `getPetById`.
 
@@ -207,10 +260,12 @@ Pet:
 # ...
 ----
 
-In a testcase Citrus is able to leverage this information in order to send a proper request and validate the response based on the OpenAPI specification.
+In a testcase Citrus is able to leverage this information in order to send a proper request and validate
+the response based on the OpenAPI specification.
 
 .Java
 [source,java,indent=0,role="primary"]
+
 ----
 private final HttpClient httpClient = new HttpClientBuilder()
             .requestUrl("http://localhost:%d".formatted(port))
@@ -282,37 +337,202 @@ actions:
 ----
 
-    
+    
 
 ----
 
-In this very first example The client uses the OpenAPI specification to generate a proper GET HTTP request for the `getPetById` operation.
-The request is sent to the server using the request URL path `/petstore/v3/pet/${petId}` as declared in the OpenAPI specification.
+In this very first example The client uses the OpenAPI specification to generate a proper GET HTTP request
+for the `getPetById` operation. The request is sent to the server using the request URL path `/petstore/v3/pet/${petId}`
+as declared in the OpenAPI specification.
 
-The resulting HTTP response from the server is verified on the client by giving the operationId and the expected status `200`.
-The OpenAPI client generates the expected control message from the given Json schema in the OpenAPI specification.
+It is also possible to reference a given specification by one of its aliases. In the following example,
+this is demonstrated through the usage of either an OpenApiRepository or an OpenApiSpecification. Note
+that it is sufficient to register the specification using either method. The `openapi` call then accepts
+a string argument representing one of the specification's aliases..
 
-The generated control message contains validation matchers and expressions as follows.
+.Java
+[source,java,indent=0,role="primary"]
 
-.Generated control message body
-[source,json]
 ----
-{
-  "id": "@isNumber()@",
-  "name": "@notEmpty()@",
-  "category": {
-    "id": "@isNumber()@",
-    "name": "@notEmpty()@"
-  },
-  "photoUrls": "@notEmpty()@",
-  "tags":  "@ignore@",
-  "status": "@matches(sold|pending|available)@"
+private final HttpClient httpClient = new HttpClientBuilder()
+            .requestUrl("http://localhost:%d".formatted(port))
+            .build();
+
+@BindToRegistry
+private OpenApiRepository openApiRepository = new OpenApiRepository()
+            .locations(singletonList(
+                "classpath:org/citrusframework/openapi/petstore/petstore-v3.json"))
+            .neglectBasePath(true)
+            .validationPolicy(OpenApiValidationPolicy.REPORT);
+
+@BindToRegistry
+private OpenApiSpecification openApiSpecification = OpenApiSpecification
+            .from(Resources.create("classpath:org/citrusframework/openapi/petstore/petstore-v3.json"), OpenApiValidationPolicy.REPORT)
+            .neglectBasePath(true);
+
+@CitrusTest
+public void openApiClientTest() {
+    variable("petId", "1001");
+    when(openapi("petstore-v3")
+        .client(httpClient)
+        .send("getPetById"));
+
+    then(openapi("petstore-v3")
+        .client(httpClient)
+        .receive("getPetById", HttpStatus.OK));
 }
 ----
 
-This control message meets the rules defined by the OpenAPI Json schema specification for the pet object.
-For instance the enum field `status` is validated with a matching expression.
-In case the OpenAPI specification changes the generated control message will change accordingly.
+[[openapi-client]]
+=== Message Content
+
+All variables that match the parameters of the operation will be automatically assigned to the constructed method.
+For example, in the samples above, the `petId` will be assigned to the corresponding path parameter.
+The same applies to `header`, `query`, and `cookie` parameters. Additionally, it is also possible to
+specify parameters and body at the message level.
+
+For example, setting the `verbose` query parameter at the message level in the sample below has the
+same effect as specifying a `verbose` variable.
+
+.Java
+[source,java,indent=0,role="primary"]
+----
+@CitrusTest
+public void openApiClientTest() {
+    variable("petId", "1001");
+    when(openapi("petstore-v3")
+        .client(httpClient)
+        .send("getPetById")
+        .message()
+        .header("verbose", "true"));
+
+    then(openapi("petstore-v3")
+        .client(httpClient)
+        .receive("getPetById", HttpStatus.OK));
+}
+----
+
+[[openapi-autofill]]
+=== Autofill
+
+As all parameters and the body are defined in the OpenAPI specification, it is possible to autofill
+missing values. Autofill works by generating random, schema-conforming values for parameters and the body.
+The ability to create random values based on OpenAPI schema definitions has been significantly enhanced
+compared to the previous implementations. It now respects constraints such as `min/max` definitions for
+numbers, composite patterns like `oneOf`, `anyOf`, and `allOf`, `arrays`, and specific patterns like
+`email`, `URI`, `hostname`, `IPv4`, and `IPv6`. Regular expression patterns for strings are properly
+generated using the `com.github.mifmif:generex` library.
+
+Note that random message generation has limitations. For example, in the case of complex schemas containing
+nested objects, the random generator currently stops if it encounters the same object type during generation,
+in order to avoid infinite recursion.
+
+There are three autofill modes:
+
+|===
+|Mode | Description
+|  `REQUIRED` | Autofills only the required parts of the message, such as required body attributes, and required header, query, cookie, and path parameters. This is the default mode.
+|  `ALL` | Autofills all parts of the message, including both required and optional parameters and body attributes.
+|  `NONE` | No autofill is applied. All missing parameters and body must be explicitly provided.
+|===
+
+The autofill mode is supported at client and server and can be specified at send the send message:
+
+.Java
+[source,java,indent=0,role="primary"]
+----
+@CitrusTest
+public void openApiClientTest() {
+    // This request is invalid because no body will be generated
+    when(openapi("petstore-v3")
+        .client(httpClient)
+        .send("addPet")
+        .autoFill(AutoFillType.NONE));
+}
+----
+
+.XML
+[source,xml,indent=0,role="secondary"]
+----
+
+    
+        
+    
+    
+        
+          
+          
+        
+    
+
+----
+
+[[openapi-validation]]
+=== Validation
+
+The foundation of the OpenAPI validation concept is the OpenAPI validator provided by `com.atlassian.oai:swagger-request-validator-core`.
+This concept applies to both client-side and server-side implementations, covering both requests and responses.
+It includes parameter validation as well as message validation, with the latter being limited to messages
+based on schema definitions in the OpenAPI specification
+
+Since most use cases require sent and received messages to conform to the specification, schema validation
+is `enabled by default`. This ensures that parameter values and the body are valid not only in terms
+of type but also with respect to other constraints, such as minimum and maximum values, patterns,
+composites (`oneOf`, `anyOf`, `allOf`), and other restrictions.
+
+Unlike the previous validation implementation in Citrus, no explicit control message is involved in the validation.
+Technically, the OpenAPI validation is implemented as a Citrus SchemaValidation, similar to JSON and XML
+validation. However, you can still use the standard message validation features of Citrus to
+validate the explicit content of the body or header parameters.
+
+If you intentionally want to send or receive invalid data to test the response behavior or error handling
+of your service, you can disable the validation as follows:
+
+.Java
+[source,java,indent=0,role="primary"]
+----
+@CitrusTest
+public void openApiClientTest() {
+    variable("petId", "invalid-string-as-pet-id");
+
+    // Although the petId is not an integer, this call will not fail due to disabled schema validation
+    when(openapi("petstore-v3")
+        .client(httpClient)
+        .send("getPetById")
+        .schemaValidation(false));
+
+    then(openapi("petstore-v3")
+        .client(httpClient)
+        .receive("getPetById", HttpStatus.OK))
+        .schemaValidation(false);
+}
+----
+
+.XML
+[source,xml,indent=0,role="secondary"]
+----
+
+    
+        
+        
+        
+    
+    
+        
+          
+          
+        
+    
+
+----
+
+Of course, the resulting HTTP response from the server is also verified against the OpenAPI specification.
+Programmatically, verification is configured by providing the `operationId` and the expected `status`.
+From this, the expected response is determined and validated against the actual response.
+
+Response schema validation can also be disabled, as shown in the previous example.
 
 This completes the client side OpenAPI support.
 Now let's have a closer look at the server side OpenAPI support in the next section.
@@ -320,8 +540,10 @@ Now let's have a closer look at the server side OpenAPI support in the next sect
 [[openapi-server]]
 == OpenAPI server
 
-On the server side Citrus is able to verify incoming requests based on the OpenAPI specification.
-The expected request message content as well as the expected resource URL path and the Content-Type are automatically validated.
+As already mentioned in chapter <>, Citrus is able to verify incoming requests and
+outgoing responses, based on the OpenAPI specification. The expected request message content as well
+as the expected resource URL path, query, header, cookie parameters and the Content-Type are automatically
+validated.
 
 .Java
 [source,java,indent=0,role="primary"]
@@ -405,91 +627,185 @@ actions:
 
 The example above uses the `addPet` operation defined in the OpenAPI specification.
 The operation expects a HTTP POST request with a pet object as message payload.
-The OpenAPI server generates an expected Json message body according to the specification.
+The OpenAPI server validates the incoming message using `com.atlassian.oai:swagger-request-validator-core`.
 This ensures that the incoming client request meets the Json schema rules for the pet object.
-Also, the server will verify the HTTP request method, the Content-Type header as well as the used resource path `/petstore/v3/pet`.
+Also, the server will verify the HTTP request method, the Content-Type header as well as the used
+resource path `/petstore/v3/pet`. For more information check chapter <>.
 
 The given HTTP status code defines the response that should be sent by the server.
-The server will generate a proper response according to the OpenAPI specification.
-This also includes a potential response message body (e.g. pet object).
+The server will generate a proper response according to the OpenAPI specification and the autofill mode
+described in chapter <>. This also includes a potential response message body (e.g. pet object).
+
+Note that the OpenAPI specification does not require all possible responses to be defined. Therefore,
+a response for a given operation and status code may not always be specified by the OpenAPI specification.
+In such cases, Citrus will fail to generate a valid random response, and you will need to specify the response manually.
+
+In case validation is unwanted, it can always be turned off for server side send and receive. Again, see
+<> for details.
 
 [[openapi-test-api-generator]]
-=== OpenAPI Test API Generator
+== OpenAPI Test API Generator
+
+For a deeper integration with a given OpenAPI, Citrus offers the ability to generate a dedicated
+TestAPI, providing test actions tailored to the specific operations of the OpenAPI under evaluation.
+These actions can be used with both XML and Java DSL.
 
-For an even deeper integration with a given OpenAPI, Citrus offers the possibility to generate a dedicated Test API which provides test actions tailored to the specific operations of the OpenAPI under evaluation.
-These actions can be used in XML or Java DSL.
-The functionality is provided by the `Citrus OpenAPI Test API Generator` which  leverages the link:https://github.com/swagger-api/swagger-codegen/tree/master[OpenAPI Code Generator] to generate code, but provides custom templates tailored for seamless integration within the Citrus framework.
+Please note the following restrictions:
+- Only OpenApiClient send/receive is implemented
+- XML integration is only available for Spring Framework
 
-The generator provides the following features:
+The TestAPI functionality is provided by the https://github.com/citrusframework/citrus/tree/main/test-api-generator[Citrus OpenAPI TestAPI Generator]
+module, which utilizes the link:https://github.com/swagger-api/swagger-codegen/tree/master[OpenAPI Code Generator]
+to generate the necessary code. Citrus provides the following modules to build and run the TestAPI code:
 
-* generation of a Test API
-** from OpenAPI Specification
-** [TODO #1163] from WSDL via an intermediate step that generates a "light" OpenApi specification from a WSDL
-* integration into <>
-** integration into XML editors via generated XSD
-*** schema validation
-*** auto completion
-* integration into <> via Java DSL [TODO #1161]
+|===
+| Artifact            | Purpose
 
-The following directory structure/table specifies the files, which are generated by the generator.
-Note that the `Prefix` is a configuration parameter which should uniquely identify a generated API.
-It is specified in the build configuration for the Test API.
+| `citrus-test-api-core`  | Runtime dependencies of Citrus TestAPI feature.
+| `citrus-test-api-generator-core`  | Citrus specific generator `org.citrusframework.openapi.generator.CitrusJavaCodegen` and required
+https://github.com/citrusframework/citrus/tree/main/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus[mustache templates].
+| `citrus-test-api-generator-maven-plugin`  | The maven plugin used to build the TestAPI.
 
-.Generated Folder Structure
+|===
+
+
+The generator offers the following features:
+
+* Generation of a TestAPI
+** From OpenAPI Specification
+** From WSDL
+* Integration into Citrus XML test cases:
+** Integration into XML editors via dedicated generated XSD for:
+*** Schema validation
+*** Auto-completion
+* Integration into Citrus Java test cases via Java DSL
+
+Keep in mind that a generated TestAPI not only serves as a powerful tool for calling and validating
+the operations of your system under test, but also streamlines access to other supporting libraries
+that offer an OpenAPI specification, enhancing the overall integration and testing experience.
+
+[[openapi-test-api-when-to-use]]
+=== When to use a TestAPI
+
+Using a TestAPI simplifies testing OpenAPI-based services but introduces additional configuration overhead.
+It is essential to have a solid understanding of Maven and managing generated code.
+
+If you're writing multiple tests for a service, investing time in the following chapters will be worthwhile.
+However, if you only need a basic smoke test, using plain Citrus features may be the better choice.
+
+[[openapi-test-api-wsdl]]
+=== TestAPI from WSDL
+
+Citrus also supports the generation of a TestAPI from a WSDL. The WSDL is parsed, and a simple OpenAPI
+specification is generated, which includes an OpenAPI operation for each WSDL binding. Using specific
+code generation templates, the generator provides WS-specific action builders that can be used in both
+Java DSL and XML. All this happens behind the scenes, if you specifiy a WSDL as source and use the
+`citrus-test-api-generator-maven-plugin` for code generation.
+
+Note that there is currently no support for generating random messages. Also, the WSDL is not yet
+properly registered with an `XsdSchemaRepository`, nor are the actions configured for schema validation.
+Therefore, out of the box validation is currently not supported.
+
+[[openapi-test-api-files]]
+=== Generated Files
+
+The following directory structure depicts the files that are produced during code generation. Note
+that the `Prefix` in folder and file-names is a placeholder for a specific value configured by a
+parameter in the build configuration. This value should uniquely identify an API to avoid name clashes.
+
+.Generated Folder Structure and Files
 [source]
 ----
 target/
-├───generated-test-resources/
-│   ├───META-INF/
-│   │   ├───spring.handlers
-│   │   └───spring.schemas
-│   └───schema/
-│       └───xsd/
-│           └───prefix-api.xsd
-└───generated-test-sources/
-    └───org/
-        └───citrusframework/
-            └───automation/
-                └───prefix/
-                    ├───api/
-                    │   └───MyApi.java
-                    ├───citrus/
-                    │   ├───extension/
-                    │   │   └───PrefixNamespaceHandler.java
-                    │   ├───PrefixAbstractTestRequest.java
-                    │   └───PrefixBeanDefinitionParser.java
-                    ├───model/
-                    │   ├───MyReqTypeA.java
-                    │   └───MyReqTypeB.java
-                    └───spring/
-                        └───PrefixBeanConfiguration.java
+â””generated-test-sources/
+ â”” openapi/
+    ├ .openapi-generator/                             // OpenApiGenerator Metafiles
+    ├ docs/                                           // Standard OpenApiGenerator
+    │                                                 // documentation
+    â”” src/
+       ├ main/
+       │   ├ java/
+       │   │   └ org/                                 // default
+       │   │      └ citrusframework/                  //   TestAPI
+       │   │         └ automation/                    //     package structure
+       │   │            │
+       │   │            └ prefix/                     // Api prefix as specified in Maven
+       │   │               │                          // build
+       │   │               │
+       │   │               └ version/                 // Optional version as specified in
+       │   │                  │                       // Maven build
+       │   │                  ├ api/
+       │   │                  │  └ PrefixApi.java     // The dedicated api action builder
+       │   │                  │
+       │   │                  ├ model/                // Model classes generated for
+       │   │                  │  ├ TypeA.java         // schema components
+       │   │                  │  └ TypeB.java
+       │   │                  ├ spring/
+       │   │                  │  ├ PrefixBeanConfiguration.java  // Spring BeanConfiguration
+       │   │                  │  │                            // providing OpenApiSpecification
+       │   │                  │  │                            // and PrefixApi bean
+       │   │                  │  │
+       │   │                  │  └ PrefixNamespaceHandler.java   // Spring NamespaceHandler for
+       │   │                  │                                  // XML integration
+       │   │                  │
+       │   │                  └ PrefixApi.java        // OpenApiSpecification provider
+       │   └ resources/
+       │       ├ META-INF/                            // Spring Integration files
+       │       │  ├ spring.handlers
+       │       │  └ spring.schemas
+       │       ├ org/
+       │       │  └ citrusframework/
+       │       │     └ automation/
+       │       │        ├ apiprefix/
+       │       │           └ version/
+       │       │              └ prefix_openApi.yml    // Copy of the OpenAPI specification
+       │       │                                      // for validation purposes
+       │       └ schema/
+       │          └ xsd
+       │             └ prefix-api.xsd                 // Generated XSD schema for XML
+       │                                              // integration
+       │
+       â”” test                                         // Unused
 ----
 
 |===
 | File                                | Content
 
+| `PrefixApi.java`                    | The class containing the dedicated TestAPI action builder and actions.
+| `TypeA.java, TypeB.java`            | Model files generated with respect to the schema components of the OpenAPI.
+| `PrefixBeanConfiguration.java`      | A Spring @Configuration class, that provides an OpenApiRepository with the Specification and an instance of PrefixApi.
+| `PrefixNamespaceHandler.java`       | A Spring class, that registers bean definition parsers for TestAPI XML elements.
+| `PrefixApi.java`                    | Provides static access to an instance of the TestAPI OpenAPI specification.
 | `spring.handlers`                   | Spring namespace handler configuration, that contains all NamespaceHandlers for all generated APIs.
 | `spring.schemas`                    | Spring schema definitions, with mappings of namespaces to schemas for all generated APIs.
-| `prefix-api.xsd`                    | XSD schema for the integration of the Test API into XML.
-| `PrefixNamespaceHandler.java`       | A Spring class, that registers bean definition parsers for Test API XML elements.
-| `PrefixAbstractTestRequest.java`    | Abstract superclass of all Test API actions.
-| `PrefixBeanDefinitionParser.java`   | Spring bean definition parser, responsible for parsing Test API XML elements into test actions.
-| `MyReqTypeA.java, MyReqTypeB.java`  | Model files generated with respect to the schema definition of the OpenAPI.
-| `PrefixBeanConfiguration.java`      | A Spring @Configuration class, that registers all Test API actions as Spring beans.
+| `prefix-openApi.yml`                | The OpenAPI source that was used to build the TestAPI.
+| `prefix-api.xsd`                    | XSD schema for the integration of the TestAPI into XML.
 |===
 
-==== Configuration of Test API Generation
+[[openapi-test-api-generator]]
+=== Configuration of TestAPI Generation
+
+Code generation is typically integrated into the build process, and for the `Citrus TestAPI Generator`,
+this is accomplished using a Maven or Gradle plugin. While the standard `org.openapitools:openapi-generator-maven-plugin`
+can be used for this purpose, configuring it, especially for multiple APIs, can be cumbersome and complex.
+However, it is certainly possible, and a sample configuration is available in the
+https://github.com/citrusframework/citrus/tree/main/test-api-generator/citrus-test-api-generator-core/pom.xml/[module descriptor].
 
-Code generation is typically performed during the build process.
-For the Citrus Test API Generator, it is carried out by a Maven or Gradle plugin.
-While the standard generator plugin, `org.openapitools:openapi-generator-maven-plugin`, can be employed for this purpose, configuring it can be cumbersome, especially when dealing with multiple APIs.
-To address this challenge, Citrus offers its own adaptation of this standard generator plugin.
-This `Citrus OpenAPI Generator Plugin` simplifies the configuration of test API generation by providing predefined defaults and supporting the generation of multiple APIs.
-Additionally, it enhances support for generating Spring integration files (`spring.handlers` and `spring.schemas`), as described above.
-It is thereby facilitating the integration of generated APIs into Spring-based applications.
-Consequently, utilizing the Citrus Generator Plugin is recommended in most scenarios.
+To streamline this process, Citrus provides its own adaptation of the standard generator plugin: the
+`Citrus OpenAPI Generator Plugin`. This plugin simplifies TestAPI generation by offering sensible
+default configurations and better support for generating multiple APIs. It also enhances integration
+with Spring by automatically generating Spring-specific files (`spring.handlers` and `spring.schemas`),
+making it easier to integrate the generated APIs into Spring-based applications.
 
-The following shows the configuration of test api generation for different scenarios:
+Given these advantages, the Citrus OpenAPI Generator Plugin is recommended in most scenarios as it
+greatly simplifies the configuration process and improves overall flexibility.
+
+The plugin is thoroughly tested across a wide variety of configurations. For additional details, you
+can refer to
+https://github.com/citrusframework/citrus/tree/main/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest[these]
+sample project build descriptors used for testing.
+
+The following section provides a configuration example for basic TestAPI generation scenarios:
 
 .Citrus OpenAPI Generator Plugin - multiple APIs, minimal configuration
 [source,xml,indent=0,role="primary"]
@@ -531,23 +847,41 @@ The following shows the configuration of test api generation for different scena
 
     citrus-test-api-generator-maven-plugin
     
-        
+        
+        
+            b
+            otherOption
+        
+        
         
-            my-generated-sources
-            my-generated-resources
             myschema/xsd
             src/main/resources/META-INF
             
                 Full
                 api/test-api.yml
                 org.mypackage.%PREFIX%.api
-                myEndpoint
                 org.mypackage.%PREFIX%.invoker
                 org.mypackage.%PREFIX%.model
-                "http://company/citrus-test-api/myNamespace"
+                myEndpoint
+                
+                    "http://company/citrus-test-api/myNamespace"
                 
+                v1
+                
+                a=b,c=d
+                
+                    
+                    generated-sources
+                    generated-resources
+                
             
         
+        
+        myschema/xsd
+        
+        src/main/resource-mod/META-INF-MOD
     
     
         
@@ -596,9 +930,15 @@ The following shows the configuration of test api generation for different scena
             
                 ${project.basedir}/src/test/resources/apis/petstore.yaml
                 
-                    org.citrusframework.openapi.generator.rest.petstore
-                    org.citrusframework.openapi.generator.rest.petstore.request
-                    org.citrusframework.openapi.generator.rest.petstore.model
+                    
+                        org.citrusframework.openapi.generator.rest.petstore
+                    
+                    
+                        org.citrusframework.openapi.generator.rest.petstore.request
+                    
+                    
+                        org.citrusframework.openapi.generator.rest.petstore.model
+                    
                     PetStore
                     petStoreEndpoint
                 
@@ -611,13 +951,20 @@ The following shows the configuration of test api generation for different scena
                 generate
             
             
-                ${project.basedir}/src/test/resources/org/citrusframework/openapi/generator/SimpleWsdlToOpenApiTransformerTest/BookService-generated.yaml
+                
+                    ${project.basedir}/src/test/resources/org/citrusframework/openapi/generator/SimpleWsdlToOpenApiTransformerTest/BookService-generated.yaml
+                
                 
                     SOAP
-                    org.citrusframework.openapi.generator.soap.bookservice
-                    org.citrusframework.openapi.generator.soap.bookservice.request
-                    org.citrusframework.openapi.generator.soap.bookservice.model
-                    SoapSample
+                    
+                        org.citrusframework.openapi.generator.soap.bookservice
+                    
+                    
+                        org.citrusframework.openapi.generator.soap.bookservice.request
+                    
+                    
+                        org.citrusframework.openapi.generator.soap.bookservice.model
+                    
                     OpenApiFromWsdl
                     soapSampleEndpoint
                 
@@ -630,74 +977,106 @@ The following shows the configuration of test api generation for different scena
 These are the primary elements you can configure in the `` section:
 
 |===
-| Configuration element            | Maven Property                                                | Description                                                      | Default Value
-
-| `schemaFolder`                   | `citrus.test.api.generator.schema.folder`                     | Location of the generated XSD schemas                            | `schema/xsd/%VERSION%`
-| `resourceFolder`                 | `citrus.test.api.generator.resource.folder`                   | Location into which the resources are generated                  | `generated-resources`
-| `sourceFolder`                   | `citrus.test.api.generator.source.folder`                     | Location into which the sources are generated                    | `generated-sources`
-| `metaInfFolder`                  | `citrus.test.api.generator.meta.inf.folder`                   | Location into which spring meta files are generated/updated      | `target/generated-test-resources/META-INF`
-| `generateSpringIntegrationFiles` | `citrus.test.api.generator.generate.spring.integration.files` | Specifies whether spring integration files should be generated   | `true`
-| Nested `` element         |                                                               |                                                                  |
-| `prefix`                         | `citrus.test.api.generator.prefix`                            | Specifies the prefix used for the test API, typically an acronym | (no default, **required**)
-| `source`                         | `citrus.test.api.generator.source`                            | Specifies the source of the test API                             | (no default, **required**)
-| `version`                        | `citrus.test.api.generator.version`                           | Specifies the version of the API, may be `null`                  | (none)
-| `endpoint`                       | `citrus.test.api.generator.endpoint`                          | Specifies the endpoint of the test API                           | `applicationServiceClient`
-| `type`                           | `citrus.test.api.generator.type`                              | Specifies the type of the test API                               | `REST`, other option is `SOAP`
-| `useTags`                        | `citrus.test.api.generator.use.tags`                          | Specifies whether tags should be used by the generator           | `true`
-| `invokerPackage`                 | `citrus.test.api.generator.invoker.package`                   | Package for the test API classes                                 | `org.citrusframework.automation.%PREFIX%.%VERSION%`
-| `apiPackage`                     | `citrus.test.api.generator.api.package`                       | Package for the test API interface classes                       | `org.citrusframework.automation.%PREFIX%.%VERSION%.api`
-| `modelPackage`                   | `citrus.test.api.generator.model.package`                     | Package for the test API model classes                           | `org.citrusframework.automation.%PREFIX%.%VERSION%.model`
-| `targetXmlnsNamespace`           | `citrus.test.api.generator.namespace`                         | XML namespace used by the API                                    | `http://www.citrusframework.org/schema/%VERSION%/%PREFIX%-api`
+| Configuration element            | Maven Property   (ns = citrus.test.api.generator)                                             | Description                                                      | Default Value
+
+| `schemaFolder`                   | `ns.schema.folder`                     | Location of the generated XSD schemas                            | `schema/xsd/%VERSION%`
+| `metaInfFolder`                  | `ns.meta.inf.folder`                   | Location into which spring meta files are generated/updated      | `target/generated-test-resources/META-INF`
+| `generateSpringIntegrationFiles` | `ns.generate.spring.integration.files` | Specifies whether spring integration files should be generated   | `true`
+
+4+| Nested `` element
+| `prefix`                         | `ns.prefix`                            | Specifies the prefix used for the TestAPI, typically an acronym. | (no default, **required**)
+| `source`                         | `ns.source`                            | Specifies the source of the TestAPI.                             | (no default, **required**)
+| `version`                        | `ns.version`                           | Specifies the version of the API, may be `null`.                  | (none)
+| `endpoint`                       | `ns.endpoint`                          | Specifies the default endpoint name of the TestAPI.                           | `%PREFIX%Endpoint`
+| `type`                           | `ns.type`                              | Specifies the type of the TestAPI.                               | `REST`, other option is `SOAP`
+| `useTags`                        | `ns.use.tags`                          | Specifies whether the generator should generate an API class per tag name. | `true`
+| `invokerPackage`                 | `ns.invoker.package`                   | Package for the TestAPI classes.                                 | `org.citrusframework.automation.%PREFIX%.%VERSION%`
+| `apiPackage`                     | `ns.api.package`                       | Package for the TestAPI interface classes.                       | `org.citrusframework.automation.%PREFIX%.%VERSION%.api`
+| `modelPackage`                   | `ns.model.package`                     | Package for the TestAPI model classes.                           | `org.citrusframework.automation.%PREFIX%.%VERSION%.model`
+| `targetXmlnsNamespace`           | `ns.namespace`                         | XML namespace used by the API.                                    | `http://www.citrusframework.org/schema/%VERSION%/%PREFIX%-api`
+| Nested `` element 3+|  https://openapi-generator.tech/docs/generators/java[OpenAPI Generator Options]
+| `resourceFolder`                 |                    | Location into which the resources are generated                  | Dependend on the phase in which the source is generated:
+-`target/generated-sources/openapi/src/main/java`
+-`target/generated-test-sources/openapi/src/main/java`
+| `sourceFolder`                   |                      | Location into which the sources are generated                    | Dependend on the phase in which the source is generated:
+-`target/generated-sources/openapi/src/main/resources`
+-`target/generated-test-sources/openapi/src/main/resources`
+|  `` 3+|  https://openapi-generator.tech/docs/globals[OpenAPI Generator global Config Options]
 |===
 
 Note: `%PREFIX%` and `%VERSION%` are placeholders that will be replaced by their specific values as configured.
 The plugin performs a conversion to lowercase for `PREFIX` used in package names and in `targetXmlnsNamespace`.
 
+[[openapi-test-api-generator-run]]
 ==== Running the generator
 
 To run the generator, execute the following command in your project directory:
 
 [source,bash]
 ----
-mvn citrus-test-api-generator-maven-plugin:create-test-api
+mvn citrus-test-api-generator:create-test-api
 ----
 
 This command will generate the classes and XSD files as configured for your APIs in the specified locations.
 
+[[openapi-test-api-generator-spring-meta]]
 ==== Spring meta file generation
 
-The `citrus-test-api-generator-maven-plugin` supports the generation of Spring integration files, specifically `spring.handlers` and `spring.schemas`.
-These files are essential for Spring applications utilizing XML configuration.
-The generated Spring integration files serve the purpose of mapping custom XML namespaces to their corresponding namespace handler and schema locations.
-This mapping allows Spring to properly parse and validate XML configuration files containing custom elements and attributes.
+The `citrus-test-api-generator-maven-plugin` supports the generation of essential Spring integration
+files, namely `spring.handlers` and `spring.schemas`. These files play a crucial role for Spring applications
+that use XML configuration.
 
+The generated Spring integration files provide mappings between custom XML namespaces and their
+corresponding namespace handlers and schema locations. This mapping enables Spring to correctly parse
+and validate XML configuration files that contain custom elements and attributes, ensuring seamless
+integration with your Spring-based application.
+
+[[openapi-test-api-generator-spring-meta-config]]
 ===== Configuration
 
-The maven plugin generates these Spring integration files based on the provided configuration in the `citrus-test-api-generator-maven-plugin` section of the `pom.xml` file.
-For each API specified, the plugin writes entries into the `spring.handlers` and `spring.schemas` files according to the configured XML namespaces and their corresponding handlers and schemas.
+The `citrus-test-api-generator-maven-plugin` generates the Spring integration files based on the
+configuration provided in the `citrus-test-api-generator-maven-plugin` section of the pom.xml file.
+For each API defined, the plugin generates entries in the `spring.handlers` and `spring.schemas` files,
+mapping XML namespaces to their respective handlers and schema locations.
+
+===== Meta File Update Process
 
-===== Important Consideration
+If you are running your TestAPI alongside a non-generated API and need to modify the existing
+`spring.handlers` and `spring.schemas` files from your non-generated source code, you should point
+the metaInfoFolder to the location of your existing META-INF folder (e.g., src/test/resources/META-INF).
+This ensures that the plugin updates the existing files without overwriting any content.
 
-When there are other non-generated Spring schemas or handlers present in the `META-INF` folder, it's crucial to ensure that the `metaInfFolder` configuration points to the existing `META-INF` directory in the main resources, which is usually `src/main/resources/META-INF`.
-This ensures that the plugin correctly updates the existing files without overwriting them.
+To distinguish the generated schemas from the non-generated ones during the metafile update process,
+the plugin checks for namespace URLs containing the segment `citrus-test-schemas`. When updating the
+files, all schemas that match this segment will be removed, while the other schemas will be preserved.
+After that, the plugin will add the namespaces for the generated TestAPI according to the configuration.
 
-To identify generated schemas, their namespace should include the following segment `citrus-test-schema`.
-During updates of the meta files, the generator filters out lines containing this segment from existing files and then re-adds them, preserving any non-generated content.
+===== Usage
 
-==== Usage
+Once generated, the `spring.handlers` and `spring.schemas` files, along with any existing
+non-generated content, should be included in the classpath of your Spring application.
+During runtime, Spring will pick up and use these files to resolve custom XML namespaces and handle elements
+accordingly. This automatically happens if one of the following folders is chosen:
 
-Once generated, the `spring.handlers` and `spring.schemas` files, along with any existing non-generated content, should be included in the resources of your Spring application.
-During runtime, Spring will use these files to resolve custom XML namespaces and handle elements accordingly.
-This automatically happens if one of the following folders is chosen:
+- target/generated-sources/openapi/src/main/resources/META-INF
+- target/generated-test-sources/openapi/src/main/resources/META-INF (`default`)
+- src/main/resources/META-INF - for mixing existing meta files with generated
+- src/test/resources/META-INF - for mixing existing meta files with generated
 
--   `target/generated-test-resources/META-INF` (default)
--   `target/generated-resources/META-INF` for pure testing projects that provide their code on main rather than test
--   `src/main/resources/META-INF` - for mixing existing meta files with generated
+For the directories listed above, the resources folder is included in the classpath by default, depending
+on whether tests are executed. For other directories, the Citrus TestAPI generator plugin automatically
+adds them to the classpath.
 
-==== Configuration of the Test Classpath
+If your IDE fails to resolve the files, you may need to manually configure the directories as source
+or resource folders. Additionally, consider adding a Maven build step to ensure these folders are handled
+correctly during the build process.
 
-In case you choose to generate the API into `generated-test` folders, the maven build requires further configuration to add the `generated-test` folders to the classpath.
-The link:https://www.mojohaus.org/build-helper-maven-plugin/usage.html[build-helper-maven-plugin] is used to accomplish this configuration step.
+==== Configuration of the Classpath for using TestAPI
+
+In case you encounter issues with the classpath when running your TestAPI, you may want to manually
+configure the classpath to contain the generated sources/resources. You can use the
+link:https://www.mojohaus.org/build-helper-maven-plugin/usage.html[build-helper-maven-plugin] plugin to do so.
+Explicit definition of these classpath entries should solve all related issues.
 
 .Configuration of `build-helper-maven-plugin`
 [source,xml]
@@ -716,7 +1095,7 @@ The link:https://www.mojohaus.org/build-helper-maven-plugin/usage.html[build-hel
                
                
                   
-                     ${project.build.directory}/generated-test-sources
+                     ${project.build.directory}/generated-test-sources/openapi/src/main/java
                   
                
             
@@ -729,7 +1108,7 @@ The link:https://www.mojohaus.org/build-helper-maven-plugin/usage.html[build-hel
                
                   
                      
-                        ${project.build.directory}/generated-test-resources
+                        ${project.build.directory}/generated-test-sources/openapi/src/main/resources
                      
                   
                
@@ -742,11 +1121,33 @@ The link:https://www.mojohaus.org/build-helper-maven-plugin/usage.html[build-hel
 
 ==== Sample usage
 
-To utilize the test API in XML, it's necessary to import the respective namespace.
+To utilize the TestAPI in XML, it's necessary to import the respective namespace.
 Once imported, requests can be directly employed as actions, as illustrated in the sample below.
 Further examples can be found here `org.citrusframework.openapi.generator.GeneratedApiIT`.
 
-.XML DSL
+.Java
+[source,java,indent=0,role="primary"]
+----
+@ExtendWith(CitrusSpringExtension.class)
+@SpringBootTest(classes = {PetStoreBeanConfiguration.class, CitrusSpringConfig.class})
+class GetPetByIdTest {
+
+    @Autowired
+    private ApplicationContext applicationContext;
+
+    @Autowired
+    private PetApi petApi;
+
+    @Test
+    @CitrusTest
+    void testByJsonPath(@CitrusResource TestCaseRunner runner) {
+        runner.when(petApi.sendGetPetById(1234L));
+        runner.then(petApi.receiveGetPetById(OK));
+    }
+}
+----
+
+.XML
 [source,xml,indent=0,role="secondary"]
 ----
 
     
         
-            
-                
-                    
-                    
-                
-            
+            
+            
         
     
 
 ----
 
-To utilize the test API in Java, it's necessary to import the API configuration, that provides the respective request actions.
-The request to test can then be configured and autowired, as illustrated in the sample below.
-Further examples can be found here: `org.citrusframework.openapi.generator.GetPetByIdIT`.
+To use the TestAPI in Java, you need to import the relevant API configuration, which provides the necessary request actions.
+In the example above, this configuration is named PetStoreBeanConfiguration.
+Once imported, you can autowire the API and use its builder methods to create dedicated actions for your operations.
 
-.Java DSL
-[source,java,indent=0,role="secondary"]
-----
-@ExtendWith(CitrusSpringExtension.class)
-@SpringBootTest(classes = {PetStoreBeanConfiguration.class, CitrusSpringConfig.class})
-class GetPetByIdTest {
+*Type-Safe Action Builders*
 
-    @Autowired
-    private ApplicationContext applicationContext;
+The Java DSL offers type-safe methods for all required parameters.
+For example, the `getPetById` operation requires a valid petId of type long, as shown in the sample.
+This ensures that all parameters are correctly typed, providing compile-time validation and reducing the risk of errors.
 
-    @Autowired
-    private GetPetByIdRequest getPetByIdRequest;
+*Dynamic Content with String Expressions*
 
-    @Test
-    @CitrusTest
-    void testByJsonPath(@CitrusResource TestCaseRunner runner) {
+In addition to type-safe builder methods, there is another version of each action that allows you to
+pass string expressions, which are dynamically resolved by Citrus at runtime.
+These methods have the same name as their type-safe counterparts, but they end with a `$`.
+For instance, if the type-safe method is getPetById(long petId), the dynamic method would be getPetById$(String petId).
 
-        // Given
-        getPetByIdRequest.setPetId("1234");
+The reason for the $ in the method name is related to the underlying code generation mechanism, which facilitates dynamic content substitution during runtime.
 
-        // Then
-        getPetByIdRequest.setResponseStatus(HttpStatus.OK.value());
-        getPetByIdRequest.setResponseReasonPhrase(HttpStatus.OK.getReasonPhrase());
+*Example: Type-Safe vs Dynamic Method*
+Both method calls achieve the same outcome, but one provides type safety at compile-time, while the other allows for dynamic content resolution at runtime:
 
-        // Assert body by json path
-        getPetByIdRequest.setResponseValue(Map.of("$.name", "Snoopy"));
+- *Type-Safe:* getPetById(123L);
+- *Dynamic:* getPetById$("123");
 
-        // When
-        runner.$(getPetByIdRequest);
-    }
+In both cases, the correct action is created, but the former ensures type correctness at compile time, while the latter allows flexibility with dynamic values.
+
+
+==== OpenAPI Default Endpoint
+
+It is possible to specify a default endpoint for a generated TestAPI.
+The endpoint needs to be registered as bean and will be resolved when needed.
+The name of the endpoint can be specified as configuration parameter in the <> config options.
+If not specified a default name is derived from the TestAPI prefix as follows:
+
+Endpointname: `prefixEndpoint`
+
+Because of the default endpoint option, it is not required to specify the endpoint in the action builder.
+If omitted, the endpoint will be resolved at runtime.
+Failure in specification of a default endpoint will result in an exception at runtime.
+
+The following shows an example of how to specify two endpoints for the same server:
+
+.Java
+[source,java,indent=0,role="primary"]
+----
+@Bean(name = {"petstoreEndpoint", "extpetstoreEndpoint"})
+public HttpClient applicationServiceClient() {
+    return new HttpClientBuilder()
+        .requestUrl("http://localhost:8080")
+        .handleCookies(true)
+        .build();
 }
 ----
+
+.XML
+[source,xml,indent=0,role="secondary"]
+----
+
+
+----
+
+==== OpenAPI Security
+
+An OpenAPI may contain security specifications which can be referenced by operations.
+Several schemes exist, of which Citrus currently supports:
+
+- Basic Authentication
+- Bearer Authentication
+- Api Key Authentication
+
+The following snippet shows the definition of these security schemes in an OpenAPI.
+
+.Yaml
+[source,yaml,indent=0,role="primary"]
+----
+openapi: 3.0.2
+info:
+title: Extended Petstore API
+description: "This API extends the standard Petstore API. Although the operations\
+\ may not be meaningful in\na real-world context, they are designed to showcase\
+\ various advanced OpenAPI features that \nare not present in the standard Petstore\
+\ API.\n"
+version: 1.0.0
+servers:
+- url: http://localhost:9000/api/v3/ext
+....
+components:
+  securitySchemes:
+    basicAuth:
+      type: http
+      scheme: basic
+    bearerAuth:
+      type: http
+      scheme: bearer
+      bearerFormat: JWT
+    api_key_header:
+      type: apiKey
+      description: Header api key description
+      name: api_key_header
+      in: header
+    api_key_cookie:
+      type: apiKey
+      description: Cookie api key description
+      name: api_key_cookie
+      in: cookie
+    api_key_query:
+      type: apiKey
+      description: Query api key description
+      name: api_key_query
+      in: query
+----
+
+===== Basic Authentication
+
+Citrus supports Basic Authentication by specifying the following properties per authenticated TestAPI:
+
+.Properties
+[source,properties,indent=0,role="primary"]
+----
+extpetstore.basic.username=extUser
+extpetstore.basic.password=extPassword
+----
+
+The properties must be prefixed with the API prefix in lower case.
+
+If present, these values will automatically be added as authorization headers to each call of relevant operations.
+
+In addition, it is possible to set the values on the operation action builder, possibly overwriting the above defaults:
+
+.Java
+[source,java,indent=0,role="primary"]
+----
+ runner.when(extPetApi
+  .sendGetPetByIdWithBasicAuthentication$("${petId}", "true")
+  .basicAuthUsername("admin")
+  .basicAuthPassword("topSecret")
+  .fork(true));
+----
+
+.XML
+[source,xml,indent=0,role="secondary"]
+----
+
+----
+
+===== Bearer Authentication
+
+For bearer authentication, a bearer token may be specified using the following property:
+
+.Properties
+[source,properties,indent=0,role="primary"]
+----
+extpetstore.bearer.token=defaultBearerToken
+----
+
+The property must be prefixed with the API prefix in lower case.
+
+If present, this value will automatically be added as `Authorization Bearer Header`  to each call of relevant operations.
+
+In addition, it is possible to set this value on the operation action builder, possibly overwriting the above default:
+
+.Java
+[source,java,indent=0,role="primary"]
+----
+ runner.when(extPetApi
+  .sendGetPetByIdWithBasicAuthentication$("${petId}", "true")
+  .basicAuthBearer("bearerToken")
+  .fork(true));
+----
+
+.XML
+[source,xml,indent=0,role="secondary"]
+----
+
+----
+
+==== API Key Authentication
+
+Citrus supports API Key Authentication by specifying the following properties per authenticated TestAPI:
+
+.Properties
+[source,properties,indent=0,role="primary"]
+----
+# Whether the api key should be Base64 encoded or not
+extpetstore.base64-encode-api-key=true
+extpetstore.api-key-query=defaultTopSecretQueryApiKey
+extpetstore.api-key-header=defaultTopSecretHeaderApiKey
+extpetstore.api-key-cookie=defaultTopSecretCookieApiKey
+----
+
+The properties must be prefixed with the API prefix in lower case.
+
+If present, these values will automatically be added as a query, header or cookie to each call of relevant operations.
+
+In addition, it is possible to set the values on the operation action builder, possibly overwriting the above defaults:
+
+.Java
+[source,java,indent=0,role="primary"]
+----
+runner.when(extPetApi
+    .sendGetPetByIdWithApiKeyAuthentication$("${petId}", "false")
+    .apiKeyHeader("TopSecretHeader")
+    .apiKeyCookie("TopSecretCookie")
+    .apiKeyQuery("TopSecretQuery")
+    .fork(true));
+----
+
+Note that only one type of parameter (query, header or cookie) should be specified in a real world scenario.
+
+.XML
+[source,xml,indent=0,role="secondary"]
+----
+
+----
+
+
+=== TestAPI  Configuration and Usage Samples
+
+The Citrus TestAPI module includes numerous tests that serve as excellent starting points.
+
+- The https://github.com/citrusframework/citrus/tree/main/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest[TestApiGeneratorMojoIntegrationTest]
+folder contains various Maven configurations for specifcation of TestAPI generation.
+
+- The https://github.com/citrusframework/citrus/tree/main/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/GeneratedRestApiIT.java[GeneratedRestApiIT]
+is the primary integration test for the Citrus TestAPI in a REST environment. +
+It includes over 100 tests written in both `Java DSL` and `XML`, covering all aspects of the generated TestAPI. +
+The https://github.com/citrusframework/citrus/tree/main/test-api-generator/citrus-test-api-generator-core/src/test/resources/apis/petstore-extended-v3.yaml[ExtendedPetAPI]
+provides a range of specific operations for testing, all of which are thoroughly covered in this test.
+
+- For SOAP integration, the https://github.com/citrusframework/citrus/tree/main/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/GeneratedSoapApiIT.java[GeneratedSoapApiIT]
+serves as the main integration test for Citrus TestAPI in a SOAP environment.
diff --git a/test-api-generator/citrus-test-api-core/src/main/java/org/citrusframework/openapi/testapi/spring/RestApiSendMessageActionParser.java b/test-api-generator/citrus-test-api-core/src/main/java/org/citrusframework/openapi/testapi/spring/RestApiSendMessageActionParser.java
index 9353672ca9..82f8d1f1c2 100644
--- a/test-api-generator/citrus-test-api-core/src/main/java/org/citrusframework/openapi/testapi/spring/RestApiSendMessageActionParser.java
+++ b/test-api-generator/citrus-test-api-core/src/main/java/org/citrusframework/openapi/testapi/spring/RestApiSendMessageActionParser.java
@@ -35,6 +35,7 @@
 import org.citrusframework.http.config.xml.HttpSendRequestActionParser;
 import org.citrusframework.http.message.HttpMessage;
 import org.citrusframework.http.message.HttpMessageBuilder;
+import org.citrusframework.openapi.AutoFillType;
 import org.citrusframework.openapi.OpenApiSpecification;
 import org.citrusframework.openapi.actions.OpenApiClientRequestActionBuilder.OpenApiClientRequestMessageBuilder;
 import org.citrusframework.openapi.actions.OpenApiSpecificationSource;
@@ -138,6 +139,8 @@ protected BeanDefinitionBuilder createBeanDefinitionBuilder(final Element elemen
             beanDefinitionBuilder);
         beanDefinitionBuilder.addConstructorArgValue(actionBuilder.getBeanDefinition());
 
+        beanDefinitionBuilder.addPropertyValue("autoFill", element.getAttribute("autofill"));
+
         setDefaultEndpoint(beanDefinitionBuilder);
 
         Element receive = getChildElementByTagName(element, "receive");
@@ -399,5 +402,9 @@ public HttpClientRequestActionBuilder getBuilder() {
         public void setBuilder(RestApiSendMessageActionBuilder builder) {
             this.builder = builder;
         }
+
+        public void setAutoFill(AutoFillType autoFill) {
+            this.builder.autoFill(autoFill);
+        }
     }
 }
diff --git a/test-api-generator/citrus-test-api-generator-core/README.md b/test-api-generator/citrus-test-api-generator-core/README.md
deleted file mode 100644
index 72f5c7a381..0000000000
--- a/test-api-generator/citrus-test-api-generator-core/README.md
+++ /dev/null
@@ -1,108 +0,0 @@
-TODO document the OpenApiSpecification retrieval strategy
-    - An OpenApiRepository does not have a unique name (and can exist in several versions). Therefore,
-      retrieval of a specifc spec from a repository is not trivial. For this, the alias concept has 
-      been introduced. Aliases are determined from the spec (e.g. the name of the spec, the resource 
-      name from which the spec was loaded without extension). Also, the name of the repository itself
-      can be used for retrieval, IF the repository contains only one spec. Otherwise, this would not be
-      ambiguous.
-TODO: document properties for security and others
-TODO: document default properties for the endpoint -> prefix with lowercase 
-
-## Generated Java Code for API Testing
-
-The code generator creates Java classes from an OpenAPI specification to facilitate API testing using the Citrus framework. 
-The Java classes represent Citrus Send and Receive ActionBuilders for each operation of the OpenAPI. Each builder provides
-setter for the actual operation parameters. In general a type-safe method is provided, that reflects the correct operation type.
-In addition a setter in string representation is provided to allow for citrus dynamic content setting using string expressions.
-For each builder a specific operation is added to ...
-A type-safe method providing the correct java type and a non type-safe method using a string type, allowing the usage of citrus expressions for the respective content.
-
-1. **Type-Safe Parameter Method**: This method accepts the required parameters directly.
-2. **String-Based Parameter Method**: This method accepts parameters as strings to allow for dynamic content.
-
-Method names of non type-safe methods are prepended with a `$`. This is mainly to avoid conflicts.
-
-### Structure of the Generated API Class
-
-For each API operation, the generated class includes:
-
-1. **Builder with Type-Safe Required Parameters**: A method that takes the required parameters directly and returns a builder configured with these parameters.
-
-2. **Builder with Parameters as Strings**: A method that takes parameters as strings, allowing dynamic replacements via the Citrus framework. The method name is suffixed with `$` to distinguish it from the type-safe version.
-
-### Example
-
-Consider an operation to delete a pet with the following parameter:
-- `petId` (required, type `Long`)
-
-The generated Java API class might look like this:
-
-```java
-public class PetsApi {
-
-    /**
-     * Builder with type safe required parameters.
-     */
-    public DeletePetRequestActionBuilder sendDeletePet(Long petId) {
-        DeletePetRequestActionBuilder builder = new DeletePetRequestActionBuilder(openApiSpecification, petId);
-        builder.endpoint(httpClient);
-        return builder;
-    }
-
-    /**
-     * Builder with required parameters as string, allowing dynamic content using citrus expressions.
-     */
-    public DeletePetRequestActionBuilder sendDeletePet$(String petIdExpression) {
-        DeletePetRequestActionBuilder builder = new DeletePetRequestActionBuilder(petIdExpression, openApiSpecification);
-        builder.endpoint(httpClient);
-        return builder;
-    }
-}
-```
-
-## Known issues
-
-## Validation
-
-It is known, that the used OpenAPI validator is not able to validate certain situations.
-E.g. certain array encoding situations related to object encoding 
-
-## Variable processing
-
-Processing of variables in case of parameter serialization, in some cases causes problems. For example, it  
-is not possible to assign a json string to a variable and path it into an object into the current 
-parameter serialization mechanism. This expects a real json, which cannot be resolved. To solve this issue,
-serialization of arrays must happen as late as possible. Maybe it is feasible to create an OpenApiEndpointConfiguration
-with a respective message converter.
-
-## Handling of Array Parameters
-
-Currently, all array parameters are handled in explode mode, regardless of the `explode` setting specified
-in the API definition. This means that each item in an array will be serialized as a separate query 
-parameter, even if the `explode` setting is set to `false` in the OpenAPI specification.
-
-### Example
-
-Suppose the OpenAPI specification defines an array parameter named `status` with the following attributes:
-
-```yaml
-parameters:
-  - name: status
-    in: query
-    description: Status values that need to be considered for filter
-    required: false
-    explode: false
-    schema:
-      type: string
-      default: available
-      enum:
-        - available
-        - pending
-        - sold
-```
-
-Despite the explode: false setting, the request will be serialized as follows:
-
-```
-?status=available&status=pending&status=sold
-```
\ No newline at end of file
diff --git a/test-api-generator/citrus-test-api-generator-core/src/main/java/org/citrusframework/openapi/generator/CitrusJavaCodegen.java b/test-api-generator/citrus-test-api-generator-core/src/main/java/org/citrusframework/openapi/generator/CitrusJavaCodegen.java
index 4da01c693e..b060c3e7ba 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/main/java/org/citrusframework/openapi/generator/CitrusJavaCodegen.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/main/java/org/citrusframework/openapi/generator/CitrusJavaCodegen.java
@@ -272,8 +272,8 @@ public CodegenType getTag() {
     @Override
     public void processOpts() {
         super.processOpts();
-        setupEndpoint();
         setupApiPrefix();
+        setupEndpoint();
         setupNamespace();
         setupFolders();
         setupApiType();
@@ -282,10 +282,8 @@ public void processOpts() {
     }
 
     private void setupEndpoint() {
-        if (additionalProperties.containsKey(API_ENDPOINT)) {
-            this.setHttpClient(additionalProperties.get(API_ENDPOINT).toString());
-        }
-        additionalProperties.put(API_ENDPOINT, httpClient);
+        additionalProperties.computeIfAbsent(API_ENDPOINT, k->apiPrefix+"Endpoint");
+        this.setHttpClient(additionalProperties.get(API_ENDPOINT).toString());
     }
 
     private void setupApiPrefix() {
diff --git a/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/api.mustache b/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/api.mustache
index 9500cacff1..3c889c78b9 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/api.mustache
+++ b/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/api.mustache
@@ -220,7 +220,7 @@ public class {{classname}} implements GeneratedApi
 
         private static final String ENDPOINT = "{{#rootContextPath}}{{rootContextPath}}{{/rootContextPath}}{{^neglectBasePath}}{{basePathWithoutHost}}{{/neglectBasePath}}{{path}}";
 
-        private static final String OPERATION_NAME = "{{operationId}}";
+        private static final String OPERATION_NAME = "{{#operationIdOriginal}}{{operationId}}{{/operationIdOriginal}}{{^operationIdOriginal}}{{#lambda.uppercase}}{{httpMethod}}{{/lambda.uppercase}}_{{#rootContextPath}}{{rootContextPath}}{{/rootContextPath}}{{^neglectBasePath}}{{basePathWithoutHost}}{{/neglectBasePath}}{{path}}{{/operationIdOriginal}}";
         {{#hasApiKeyAuth}}
 
         @Value("${" + "{{#lambda.lowercase}}{{prefix}}{{/lambda.lowercase}}.base64-encode-api-key:#{false}}")
@@ -604,7 +604,7 @@ public class {{classname}} implements GeneratedApi
 
         private static final String ENDPOINT = "{{#rootContextPath}}{{rootContextPath}}{{/rootContextPath}}{{^neglectBasePath}}{{basePathWithoutHost}}{{/neglectBasePath}}{{path}}";
 
-        private static final String OPERATION_NAME = "{{operationId}}";
+        private static final String OPERATION_NAME = "{{#operationIdOriginal}}{{operationId}}{{/operationIdOriginal}}{{^operationIdOriginal}}{{#lambda.uppercase}}{{httpMethod}}{{/lambda.uppercase}}_{{#rootContextPath}}{{rootContextPath}}{{/rootContextPath}}{{^neglectBasePath}}{{basePathWithoutHost}}{{/neglectBasePath}}{{path}}{{/operationIdOriginal}}";
 
         public {{operationIdCamelCase}}ReceiveActionBuilder({{classname}} {{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}},  String statusCode) {
             super({{#lambda.camelcase}}{{classname}}{{/lambda.camelcase}}, {{#lambda.camelcase}}{{prefix}}{{/lambda.camelcase}}Specification, METHOD, ENDPOINT, OPERATION_NAME, statusCode);
diff --git a/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/namespace_handler.mustache b/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/namespace_handler.mustache
index b4576a59d8..40c3e5e3d1 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/namespace_handler.mustache
+++ b/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/namespace_handler.mustache
@@ -43,7 +43,7 @@ public class {{#lambda.titlecase}}{{prefix}}{{/lambda.titlecase}}NamespaceHandle
         {{#operations}}
         {{#operation}}
 
-            registerOperationParsers({{classname}}.class,"{{#lambda.kebabcase}}{{operationId}}{{/lambda.kebabcase}}", "{{operationIdOriginal}}", "{{path}}",
+            registerOperationParsers({{classname}}.class,"{{#lambda.kebabcase}}{{operationId}}{{/lambda.kebabcase}}", "{{#operationIdOriginal}}{{operationId}}{{/operationIdOriginal}}{{^operationIdOriginal}}{{#lambda.uppercase}}{{httpMethod}}{{/lambda.uppercase}}_{{#rootContextPath}}{{rootContextPath}}{{/rootContextPath}}{{^neglectBasePath}}{{basePathWithoutHost}}{{/neglectBasePath}}{{path}}{{/operationIdOriginal}}", "{{path}}",
                 {{classname}}.{{operationIdCamelCase}}SendActionBuilder.class,
                 {{classname}}.{{operationIdCamelCase}}ReceiveActionBuilder.class,
                 new String[]{ {{#requiredNonBodyParams}}"{{paramName}}{{^isString}}{{/isString}}"{{^-last}}, {{/-last}}{{/requiredNonBodyParams}} },
diff --git a/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/schema.mustache b/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/schema.mustache
index 64e0738760..54ab56c2f7 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/schema.mustache
+++ b/test-api-generator/citrus-test-api-generator-core/src/main/resources/java-citrus/schema.mustache
@@ -27,6 +27,14 @@
         schemaLocation="http://www.citrusframework.org/schema/http/testcase/citrus-http-testcase.xsd"
     />
 
+    
+        
+            
+            
+            
+        
+    
+
     
         
             
@@ -48,6 +56,7 @@
         
         
         
+        
     
 
     
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/CitrusJavaCodegenTest.java b/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/CitrusJavaCodegenTest.java
index f8f23ca1a2..5e12e63c91 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/CitrusJavaCodegenTest.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/CitrusJavaCodegenTest.java
@@ -170,11 +170,13 @@ void testFromOperation() {
         Operation operation = Mockito.mock(Operation.class);
         List servers = Collections.emptyList();
 
-        CodegenOperation codegenOperation = codegen.fromOperation("/path", "GET", operation, servers);
+        CodegenOperation codegenOperation = codegen.fromOperation("/path/segment1/{param1}/segment3/{param2}", "GET", operation, servers);
         assertThat(codegenOperation)
                 .isInstanceOf(CustomCodegenOperation.class)
                 .hasFieldOrPropertyWithValue("httpMethod", "GET")
-                .hasFieldOrPropertyWithValue("path", "/path");
+                .hasFieldOrPropertyWithValue("path", "/path/segment1/{param1}/segment3/{param2}")
+                .hasFieldOrPropertyWithValue("operationId", "pathSegment1Param1Segment3Param2GET")
+                .hasFieldOrPropertyWithValue("operationIdOriginal", null);
     }
 
     @Test
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/GeneratedRestApiIT.java b/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/GeneratedRestApiIT.java
index d51316443a..00e6a91c93 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/GeneratedRestApiIT.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/java/org/citrusframework/openapi/generator/GeneratedRestApiIT.java
@@ -243,6 +243,39 @@ public ApiActionBuilderCustomizer petApiCustomizer() {
         }
     }
 
+    @Nested
+    class OperationWithoutOperationId {
+
+        @Test
+        @CitrusTestSource(type = TestLoader.SPRING, packageName = "org.citrusframework.openapi.generator.GeneratedApiTest", name = "withoutOperationIdTest")
+        void xml() {
+        }
+
+        @Test
+        void java_operation_without_operationId(@CitrusResource TestCaseRunner runner) {
+            runner.variable("petId", "1234");
+
+            runner.when(extPetApi.sendPetWithoutOperationIdPetIdGet(1234)
+                .fork(true));
+            runner.then(http().server(httpServer)
+                .receive()
+                .get("/api/v3/ext/pet/without-operation-id/1234")
+                .message());
+
+            runner.then(http().server(httpServer)
+                .send()
+                .response(OK)
+                .message()
+                .contentType(APPLICATION_JSON_VALUE)
+                .body(Resources.create(
+                    "classpath:org/citrusframework/openapi/generator/GeneratedApiTest/payloads/getPetById_response.json"))
+                .contentType(APPLICATION_JSON_VALUE));
+
+            runner.when(extPetApi
+                .receivePetWithoutOperationIdPetIdGet(OK));
+
+        }
+    }
     /**
      * Demonstrates usage of parameter serialization according to
      * ...
@@ -2501,7 +2534,7 @@ void java(@CitrusResource TestCaseRunner runner) {
 
             runner.then(http().server(otherHttpServer)
                 .receive()
-                .get("/api/v3/ext/pet/simple/object/uuid/" + uuid.toString())
+                .get("/api/v3/ext/pet/simple/object/uuid/" + uuid)
                 .message()
                 .accept("@contains('application/json')@"));
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/apis/petstore-extended-v3.yaml b/test-api-generator/citrus-test-api-generator-core/src/test/resources/apis/petstore-extended-v3.yaml
index da8ceca2fe..255b98d238 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/apis/petstore-extended-v3.yaml
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/apis/petstore-extended-v3.yaml
@@ -2,13 +2,38 @@ openapi: 3.0.2
 info:
     title: Extended Petstore API
     description: |
-        This is an extended version of the Petstore API which includes additional operations, 
-        such as updating a pet using form data and managing vaccination records.
+        This API extends the standard Petstore API. Although the operations may not be meaningful in
+        a real-world context, they are designed to showcase various advanced OpenAPI features that 
+        are not present in the standard Petstore API.
     version: 1.0.0
 servers:
     -   url: http://localhost:9000/api/v3/ext
 
 paths:
+    /pet/without-operation-id/{petId}:
+        get:
+            tags:
+                - extPet
+            summary: Get a pet by id. This operation has no operationId.
+            description: "Returns pet by ID using. This operation has no operationId."
+            parameters:
+                -   name: petId
+                    in: path
+                    description: ID of pet to return
+                    required: true
+                    schema:
+                        type: integer
+            responses:
+                '200':
+                    description: Successful operation
+                    content:
+                        application/json:
+                            schema:
+                                $ref: './petstore-v3.yaml#/components/schemas/Pet'
+                '400':
+                    description: Invalid ID supplied
+                '404':
+                    description: Pet not found
     /pet/simple/object/uuid/{petUuid}:
         get:
             tags:
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Category.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Category.java
index f87ae2279b..25c79ddbb6 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Category.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Category.java
@@ -24,7 +24,7 @@
 /**
  * Category
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Category {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/HistoricalData.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/HistoricalData.java
index e4d8b586d7..a4966efcb1 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/HistoricalData.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/HistoricalData.java
@@ -25,7 +25,7 @@
 /**
  * Additional historical data for a vaccination report, not contained in internal storage. 
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class HistoricalData {
   private LocalDate lastVaccinationDate;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Pet.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Pet.java
index c124787b5a..19a5293f83 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Pet.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Pet.java
@@ -29,7 +29,7 @@
 /**
  * Pet
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Pet {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/PetIdentifier.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/PetIdentifier.java
index e214406d81..49117bed19 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/PetIdentifier.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/PetIdentifier.java
@@ -24,7 +24,7 @@
 /**
  * PetIdentifier
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class PetIdentifier {
   private String _name;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Tag.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Tag.java
index f133cd3e31..c95a7058f5 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Tag.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/Tag.java
@@ -24,7 +24,7 @@
 /**
  * Tag
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Tag {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/VaccinationDocumentResult.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/VaccinationDocumentResult.java
index 4955814194..4600b1ece3 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/VaccinationDocumentResult.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/model/VaccinationDocumentResult.java
@@ -24,7 +24,7 @@
 /**
  * VaccinationDocumentResult
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class VaccinationDocumentResult {
   private String documentId;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/request/ExtPetApi.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/request/ExtPetApi.java
index b85817a1ff..79f431441a 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/request/ExtPetApi.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/request/ExtPetApi.java
@@ -43,7 +43,7 @@
 import org.citrusframework.openapi.generator.rest.extpetstore.model.VaccinationDocumentResult;
 
 @SuppressWarnings("unused")
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class ExtPetApi implements GeneratedApi
 {
 
@@ -815,6 +815,28 @@ public GetPetWithSimpleStyleObjectHeaderReceiveActionBuilder receiveGetPetWithSi
         return new GetPetWithSimpleStyleObjectHeaderReceiveActionBuilder(this,  statusCode);
     }
 
+    /**
+     * Builder with type safe required parameters.
+     */
+    public PetWithoutOperationIdPetIdGetSendActionBuilder sendPetWithoutOperationIdPetIdGet(Integer petId)   {
+            return new PetWithoutOperationIdPetIdGetSendActionBuilder(this, petId);
+    }
+
+    /**
+     * Builder with required parameters as string, allowing dynamic content using citrus expressions.
+     */
+    public PetWithoutOperationIdPetIdGetSendActionBuilder sendPetWithoutOperationIdPetIdGet$(String petIdExpression )   {
+            return new PetWithoutOperationIdPetIdGetSendActionBuilder(petIdExpression, this);
+    }
+
+    public PetWithoutOperationIdPetIdGetReceiveActionBuilder receivePetWithoutOperationIdPetIdGet(@NotNull HttpStatus statusCode)   {
+        return new PetWithoutOperationIdPetIdGetReceiveActionBuilder(this, Integer.toString(statusCode.value()));
+    }
+
+    public PetWithoutOperationIdPetIdGetReceiveActionBuilder receivePetWithoutOperationIdPetIdGet(@NotNull String statusCode)   {
+        return new PetWithoutOperationIdPetIdGetReceiveActionBuilder(this,  statusCode);
+    }
+
     /**
      * Builder with type safe required parameters.
      */
@@ -4751,6 +4773,119 @@ public ReceiveMessageAction doBuild() {
 
     }
 
+    public static class PetWithoutOperationIdPetIdGetSendActionBuilder extends
+                RestApiSendMessageActionBuilder implements GeneratedApiOperationInfo {
+
+        private static final String METHOD = "GET";
+
+        private static final String ENDPOINT = "/api/v3/ext/pet/without-operation-id/{petId}";
+
+        private static final String OPERATION_NAME = "GET_/api/v3/ext/pet/without-operation-id/{petId}";
+
+        /**
+         * Constructor with type safe required parameters.
+         */
+        public PetWithoutOperationIdPetIdGetSendActionBuilder(ExtPetApi extPetApi, Integer petId) {
+            super(extPetApi, extPetStoreSpecification, METHOD, ENDPOINT, OPERATION_NAME);
+            pathParameter("petId", petId, ParameterStyle.SIMPLE, false, false);
+        }
+
+        /**
+         * Constructor with required parameters as string to allow for dynamic content.
+         */
+            public PetWithoutOperationIdPetIdGetSendActionBuilder(String petIdExpression, ExtPetApi extPetApi) {
+            super(extPetApi, extPetStoreSpecification,  METHOD, ENDPOINT, OPERATION_NAME);
+            pathParameter("petId", petIdExpression, ParameterStyle.SIMPLE, false, false);
+        }
+
+        @Override
+        public String getOperationName() {
+            return OPERATION_NAME;
+        }
+
+        @Override
+        public String getMethod() {
+            return METHOD;
+        }
+
+        @Override
+        public String getPath() {
+            return ENDPOINT;
+        }
+
+        /**
+         * Constructor with required parameters as string to allow for dynamic content.
+         */
+        public PetWithoutOperationIdPetIdGetSendActionBuilder(ExtPetApi extPetApi, TestApiClientRequestMessageBuilder messageBuilder, String petIdExpression) {
+            super(extPetApi, extPetStoreSpecification, messageBuilder, messageBuilder.getMessage(), METHOD, ENDPOINT, OPERATION_NAME);
+            pathParameter("petId", petIdExpression, ParameterStyle.SIMPLE, false, false);
+        }
+
+        public PetWithoutOperationIdPetIdGetSendActionBuilder petId(Integer petId) {
+            pathParameter("petId", petId, ParameterStyle.SIMPLE, false, false);
+            return this;
+        }
+
+        public PetWithoutOperationIdPetIdGetSendActionBuilder petId(String petIdExpression) {
+            pathParameter("petId", petIdExpression, ParameterStyle.SIMPLE, false, false);
+                return this;
+        }
+
+        @Override
+        public SendMessageAction doBuild() {
+
+            if (getCustomizers() != null) {
+                getCustomizers().forEach(customizer -> customizer.customizeRequestBuilder(this, this));
+            }
+
+            return super.doBuild();
+        }
+    }
+
+    public static class PetWithoutOperationIdPetIdGetReceiveActionBuilder extends
+                        RestApiReceiveMessageActionBuilder implements GeneratedApiOperationInfo {
+
+        private static final String METHOD = "GET";
+
+        private static final String ENDPOINT = "/api/v3/ext/pet/without-operation-id/{petId}";
+
+        private static final String OPERATION_NAME = "GET_/api/v3/ext/pet/without-operation-id/{petId}";
+
+        public PetWithoutOperationIdPetIdGetReceiveActionBuilder(ExtPetApi extPetApi,  String statusCode) {
+            super(extPetApi, extPetStoreSpecification, METHOD, ENDPOINT, OPERATION_NAME, statusCode);
+        }
+
+        public PetWithoutOperationIdPetIdGetReceiveActionBuilder(ExtPetApi extPetApi, OpenApiClientResponseMessageBuilder messageBuilder) {
+            super(extPetApi, extPetStoreSpecification, messageBuilder, messageBuilder.getMessage(), METHOD, ENDPOINT, OPERATION_NAME);
+        }
+
+        @Override
+        public String getOperationName() {
+            return OPERATION_NAME;
+        }
+
+        @Override
+        public String getMethod() {
+            return METHOD;
+        }
+
+        @Override
+        public String getPath() {
+            return ENDPOINT;
+        }
+
+        @Override
+        public ReceiveMessageAction doBuild() {
+
+            if (getCustomizers() != null) {
+                getCustomizers().forEach(customizer -> customizer.customizeResponseBuilder(this, this));
+            }
+
+            return super.doBuild();
+        }
+
+    }
+
     public static class PostVaccinationDocumentSendActionBuilder extends
                 RestApiSendMessageActionBuilder implements GeneratedApiOperationInfo {
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreBeanConfiguration.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreBeanConfiguration.java
index 793bb8fc8e..0ca6dbfd28 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreBeanConfiguration.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreBeanConfiguration.java
@@ -15,7 +15,7 @@
 import org.citrusframework.openapi.generator.rest.extpetstore.ExtPetStoreOpenApi;
 
 @Configuration
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class ExtPetStoreBeanConfiguration {
 
     @Bean
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreNamespaceHandler.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreNamespaceHandler.java
index 6c56c475d2..d1147d9d86 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreNamespaceHandler.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/extpetstore/spring/ExtPetStoreNamespaceHandler.java
@@ -12,7 +12,7 @@
 import org.citrusframework.openapi.testapi.GeneratedApi;
 import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
 
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.512935700+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.524898+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class ExtPetStoreNamespaceHandler extends NamespaceHandlerSupport {
 
     @Override
@@ -204,6 +204,12 @@ public void init() {
                 new String[]{ "petId" },
             new String[]{  });
 
+            registerOperationParsers(ExtPetApi.class,"pet-without-operation-id-pet-id-get", "GET_/api/v3/ext/pet/without-operation-id/{petId}", "/pet/without-operation-id/{petId}",
+                ExtPetApi.PetWithoutOperationIdPetIdGetSendActionBuilder.class,
+                ExtPetApi.PetWithoutOperationIdPetIdGetReceiveActionBuilder.class,
+                new String[]{ "petId" },
+            new String[]{  });
+
             registerOperationParsers(ExtPetApi.class,"post-vaccination-document", "postVaccinationDocument", "/pet/vaccination/{bucket}/{filename}",
                 ExtPetApi.PostVaccinationDocumentSendActionBuilder.class,
                 ExtPetApi.PostVaccinationDocumentReceiveActionBuilder.class,
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Address.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Address.java
index 79cbc4a5b9..c3c9eeac45 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Address.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Address.java
@@ -24,7 +24,7 @@
 /**
  * Address
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Address {
   private String street;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Category.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Category.java
index adb7ab5b4a..54bfb4c0ed 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Category.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Category.java
@@ -24,7 +24,7 @@
 /**
  * Category
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Category {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Customer.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Customer.java
index 304150abb7..aaa350d108 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Customer.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Customer.java
@@ -28,7 +28,7 @@
 /**
  * Customer
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Customer {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/ModelApiResponse.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/ModelApiResponse.java
index 178c3a56fa..829c0d4384 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/ModelApiResponse.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/ModelApiResponse.java
@@ -24,7 +24,7 @@
 /**
  * ModelApiResponse
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class ModelApiResponse {
   private Integer code;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Order.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Order.java
index 4d2916f2ff..ca29b9d1ca 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Order.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Order.java
@@ -25,7 +25,7 @@
 /**
  * Order
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Order {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Pet.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Pet.java
index 3863a75cb4..6241feff86 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Pet.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Pet.java
@@ -29,7 +29,7 @@
 /**
  * Pet
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Pet {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Tag.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Tag.java
index d0779114f5..2139697852 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Tag.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/Tag.java
@@ -24,7 +24,7 @@
 /**
  * Tag
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class Tag {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/User.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/User.java
index fb5338f6b8..34509d8ac4 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/User.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/model/User.java
@@ -24,7 +24,7 @@
 /**
  * User
  */
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class User {
   private Long id;
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/PetApi.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/PetApi.java
index dd944f0e25..17f78a1a90 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/PetApi.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/PetApi.java
@@ -38,7 +38,7 @@
 import org.citrusframework.openapi.generator.rest.petstore.model.Pet;
 
 @SuppressWarnings("unused")
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class PetApi implements GeneratedApi
 {
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/StoreApi.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/StoreApi.java
index e3997dbece..3359f32ed3 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/StoreApi.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/StoreApi.java
@@ -37,7 +37,7 @@
 import org.citrusframework.openapi.generator.rest.petstore.model.Order;
 
 @SuppressWarnings("unused")
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class StoreApi implements GeneratedApi
 {
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/UserApi.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/UserApi.java
index 0a36c15896..1d8d085cb5 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/UserApi.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/request/UserApi.java
@@ -38,7 +38,7 @@
 import org.citrusframework.openapi.generator.rest.petstore.model.User;
 
 @SuppressWarnings("unused")
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class UserApi implements GeneratedApi
 {
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreBeanConfiguration.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreBeanConfiguration.java
index 96e9fae6cf..c37e2a3481 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreBeanConfiguration.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreBeanConfiguration.java
@@ -17,7 +17,7 @@
 import org.citrusframework.openapi.generator.rest.petstore.PetStoreOpenApi;
 
 @Configuration
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class PetStoreBeanConfiguration {
 
     @Bean
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreNamespaceHandler.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreNamespaceHandler.java
index 4155d1ad5d..f441d37cf9 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreNamespaceHandler.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/rest/petstore/spring/PetStoreNamespaceHandler.java
@@ -14,7 +14,7 @@
 import org.citrusframework.openapi.testapi.GeneratedApi;
 import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
 
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:06.769523100+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:47.794716200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class PetStoreNamespaceHandler extends NamespaceHandlerSupport {
 
     @Override
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/request/BookServiceSoapApi.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/request/BookServiceSoapApi.java
index 4e76813642..505b022375 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/request/BookServiceSoapApi.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/request/BookServiceSoapApi.java
@@ -17,7 +17,7 @@
 import org.citrusframework.openapi.testapi.SoapApiSendMessageActionBuilder;
 
 @SuppressWarnings("unused")
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.870607200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.920209500+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class BookServiceSoapApi implements GeneratedApi
 {
 
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceBeanConfiguration.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceBeanConfiguration.java
index 96e2616ee2..f27f214ca1 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceBeanConfiguration.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceBeanConfiguration.java
@@ -15,7 +15,7 @@
 import org.citrusframework.openapi.generator.soap.bookservice.BookServiceOpenApi;
 
 @Configuration
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.870607200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.920209500+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class BookServiceBeanConfiguration {
 
     @Bean
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceNamespaceHandler.java b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceNamespaceHandler.java
index 610ef9a276..36eac4ee50 100644
--- a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceNamespaceHandler.java
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/ExpectedCodeGenIT/expectedgen/soap/bookservice/spring/BookServiceNamespaceHandler.java
@@ -10,7 +10,7 @@
 import org.citrusframework.openapi.testapi.GeneratedApi;
 import org.springframework.beans.factory.xml.NamespaceHandlerSupport;
 
-@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-23T18:00:07.870607200+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
+@jakarta.annotation.Generated(value = "org.citrusframework.openapi.generator.CitrusJavaCodegen", date = "2025-01-29T23:14:48.920209500+01:00[Europe/Zurich]", comments = "Generator version: 7.9.0")
 public class BookServiceNamespaceHandler extends NamespaceHandlerSupport {
 
     @Override
diff --git a/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/GeneratedApiTest/withoutOperationIdTest.xml b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/GeneratedApiTest/withoutOperationIdTest.xml
new file mode 100644
index 0000000000..1a7ce6d1f5
--- /dev/null
+++ b/test-api-generator/citrus-test-api-generator-core/src/test/resources/org/citrusframework/openapi/generator/GeneratedApiTest/withoutOperationIdTest.xml
@@ -0,0 +1,43 @@
+
+    
+        
+            
+                
+            
+
+            
+                
+                    
+                
+            
+
+            
+                
+            
+
+            
+                
+                    
+                
+                
+                    
+                
+            
+
+        
+    
+
diff --git a/test-api-generator/citrus-test-api-generator-maven-plugin/src/main/java/org/citrusframework/maven/plugin/TestApiGeneratorMojo.java b/test-api-generator/citrus-test-api-generator-maven-plugin/src/main/java/org/citrusframework/maven/plugin/TestApiGeneratorMojo.java
index 26e3eb508f..dcd546ca06 100644
--- a/test-api-generator/citrus-test-api-generator-maven-plugin/src/main/java/org/citrusframework/maven/plugin/TestApiGeneratorMojo.java
+++ b/test-api-generator/citrus-test-api-generator-maven-plugin/src/main/java/org/citrusframework/maven/plugin/TestApiGeneratorMojo.java
@@ -401,8 +401,6 @@ public enum ApiType {
         REST, SOAP
     }
 
-    // TODO: document all configuration properties
-
     /**
      * Note that the default values are not properly set by maven processor. Therefore, the default
      * values have been assigned additionally on field level.
diff --git a/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/java/org/citrusframework/maven/plugin/TestApiGeneratorMojoUnitTest.java b/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/java/org/citrusframework/maven/plugin/TestApiGeneratorMojoUnitTest.java
index e864da5b46..9d313cc84d 100644
--- a/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/java/org/citrusframework/maven/plugin/TestApiGeneratorMojoUnitTest.java
+++ b/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/java/org/citrusframework/maven/plugin/TestApiGeneratorMojoUnitTest.java
@@ -55,8 +55,7 @@ class TestApiGeneratorMojoUnitTest extends AbstractMojoTestCase {
 
     @Mock
     private MojoExecution mojoExecutionMock;
-// TODO: test real world scenario with prefix=manageBooking and prefix=ManageBooking (should result in ManageBookingNamespaceHandler instead of manageBookingNamespaceHandler. Also check namespace name it contains managebooking - is that reasonable, also the api yaml cannot be loaded because of capital letters )?
-    // TODO: Account Number as OpenAPI Parameter Name is allowed but leads to error as the space needs to be url encoded.
+
     static Stream replaceDynamicVarsInPattern() {
         return Stream.of(
             arguments("%PREFIX%-aa-%VERSION%", "MyPrefix", "1", false, "MyPrefix-aa-1"),
diff --git a/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-full-config.xml b/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-full-config.xml
index d030deee4b..4e447e6f8c 100644
--- a/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-full-config.xml
+++ b/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-full-config.xml
@@ -32,10 +32,8 @@
                             a=b,c=d
                             /a/b/c/d
                             
-                                
                                 b
                                 d
-                                
                                 target/pom-full-config/target/generated-sources-mod/openapi-mod
                                 src/main/java-mod
                                 src/main/resource-mod
diff --git a/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-with-overriding-config.xml b/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-with-overriding-config.xml
index c3675ca22c..754c2fcffa 100644
--- a/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-with-overriding-config.xml
+++ b/test-api-generator/citrus-test-api-generator-maven-plugin/src/test/resources/TestApiGeneratorMojoIntegrationTest/pom-with-overriding-config.xml
@@ -25,7 +25,6 @@
                             Minimal
                             api/test-api.yml
                             
-                                
                                 b
                                 d
                             
diff --git a/tools/jbang/dist/CitrusJBang.java b/tools/jbang/dist/CitrusJBang.java
index 665c9e924d..c2d5c5a44e 100755
--- a/tools/jbang/dist/CitrusJBang.java
+++ b/tools/jbang/dist/CitrusJBang.java
@@ -18,8 +18,8 @@
 
 //JAVA 17+
 //REPOS mavencentral
-//DEPS org.citrusframework:citrus-bom:${citrus.jbang.version:4.5.2}@pom
-//DEPS org.citrusframework:citrus-jbang:${citrus.jbang.version:4.5.2}
+//DEPS org.citrusframework:citrus-bom:${citrus.jbang.version:4.6.0-SNAPSHOT}@pom
+//DEPS org.citrusframework:citrus-jbang:${citrus.jbang.version:4.6.0-SNAPSHOT}
 //DEPS org.citrusframework:citrus-jbang-connector
 //DEPS org.citrusframework:citrus-groovy
 //DEPS org.citrusframework:citrus-xml