You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2022/03/02 00:28:28 UTC

[camel-karavan] branch main updated: Backward (#205)

This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git


The following commit(s) were added to refs/heads/main by this push:
     new 9d1f63b  Backward (#205)
9d1f63b is described below

commit 9d1f63bbb63fcb68dc91aab69b81dfc3205a7ff0
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Tue Mar 1 19:28:22 2022 -0500

    Backward (#205)
    
    * Latest Models and API
    
    * First try
---
 karavan-core/src/core/api/CamelDefinitionYaml.ts  |  41 +++--
 karavan-core/src/core/model/CamelDefinition.ts    |   9 +-
 karavan-core/src/core/model/CamelMetadata.ts      | 194 +++++++++++-----------
 karavan-core/test/backward.spec.ts                |  74 +++++++++
 karavan-core/test/backward.yaml                   |  47 ++++++
 karavan-core/test/backward2.yaml                  |  32 ++++
 karavan-core/test/cloneDefinition.spec.ts         |   9 +-
 karavan-core/test/dependencies.spec.ts            |   2 +-
 karavan-core/test/expression.spec.ts              |  53 ++++++
 karavan-demo/xxx-yaml.yaml                        |  26 +++
 karavan-designer/src/App.tsx                      |   1 +
 karavan-designer/src/designer/KaravanDesigner.tsx |   9 +-
 karavan-designer/src/designer/karavan.css         |   7 +
 karavan-vscode/package.json                       |   5 +
 karavan-vscode/src/extension.ts                   |   4 +
 karavan-vscode/webview/App.tsx                    |   8 +-
 16 files changed, 398 insertions(+), 123 deletions(-)

diff --git a/karavan-core/src/core/api/CamelDefinitionYaml.ts b/karavan-core/src/core/api/CamelDefinitionYaml.ts
index 3ed294f..3d1bc18 100644
--- a/karavan-core/src/core/api/CamelDefinitionYaml.ts
+++ b/karavan-core/src/core/api/CamelDefinitionYaml.ts
@@ -22,7 +22,7 @@ import {CamelDefinitionYamlStep} from "./CamelDefinitionYamlStep";
 
 export class CamelDefinitionYaml {
 
-    static integrationToYaml = (integration: Integration): string => {
+    static integrationToYaml = (integration: Integration, backward: boolean = false): string => {
         const clone: any = CamelUtil.cloneIntegration(integration);
         const flows = integration.spec.flows
         clone.spec.flows = flows?.map((f: any) => CamelDefinitionYaml.cleanupElement(f)).filter(x => Object.keys(x).length !== 0);
@@ -34,11 +34,11 @@ export class CamelDefinitionYaml {
         if (integration.crd) {
             delete clone.crd
             const i = JSON.parse(JSON.stringify(clone, null, 3)); // fix undefined in string attributes
-            const text = CamelDefinitionYaml.yamlDump(i);
+            const text = CamelDefinitionYaml.yamlDump(i, backward);
             return text;
         } else {
             const f = JSON.parse(JSON.stringify(clone.spec.flows, null, 3));
-            const text = CamelDefinitionYaml.yamlDump(f);
+            const text = CamelDefinitionYaml.yamlDump(f, backward);
             if (clone.spec.dependencies && clone.spec.dependencies.length > 0) {
                 const modeline = this.generateModeline(clone.spec.dependencies);
                 return modeline.concat('\n', text);
@@ -117,7 +117,7 @@ export class CamelDefinitionYaml {
         return result
     }
 
-    static yamlDump = (integration: Integration): string => {
+    static yamlDump = (integration: Integration, backward: boolean = false): string => {
         return yaml.dump(integration,
             {
                 noRefs: false,
@@ -132,18 +132,22 @@ export class CamelDefinitionYaml {
                     else if (a > b) return 1
                     else return 0;
                 },
-                replacer: this.replacer
+                replacer: (key, value) => this.replacer(key, value, backward)
             });
     }
 
-    static replacer = (key: string, value: any): any => {
+    static replacer = (key: string, value: any, backward: boolean = false): any => {
         if (typeof value === 'object' && (value.hasOwnProperty('stepName') || value.hasOwnProperty('inArray')  || value.hasOwnProperty('inSteps'))) {
             const stepNameField = value.hasOwnProperty('stepName') ? 'stepName' : 'step-name';
             const stepName = value[stepNameField];
             let newValue: any = JSON.parse(JSON.stringify(value));
+            if (backward && stepName === 'route'){
+                newValue.steps = newValue.from.steps;
+                delete newValue.from.steps;
+            }
             delete newValue[stepNameField];
             if ((value.inArray && !value.inSteps)
-                || key === 'expression'
+                || stepName === 'expression'
                 || key === 'from') {
                 delete newValue.inArray;
                 delete newValue.inSteps;
@@ -160,19 +164,19 @@ export class CamelDefinitionYaml {
         }
     }
 
-    static yamlToIntegration = (filename: string, text: string): Integration => {
+    static yamlToIntegration = (filename: string, text: string, backward: boolean = false): Integration => {
         const integration: Integration = Integration.createNew(filename);
         const fromYaml: any = yaml.load(text);
         const camelized: any = CamelUtil.camelizeObject(fromYaml);
         if (Array.isArray(camelized)) {
             integration.crd = false;
             const flows: any[] = camelized;
-            integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(flows));
+            integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(flows, backward));
             integration.spec.dependencies = this.modelineToDependency(text);
         } else {
             integration.crd = true;
             const int: Integration = new Integration({...camelized});
-            integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(int.spec.flows || []));
+            integration.spec.flows?.push(...CamelDefinitionYaml.flowsToCamelElements(int.spec.flows || [], backward));
             integration.spec.dependencies = this.dependenciesToDependency(int.spec.dependencies);
         }
         return integration;
@@ -200,14 +204,27 @@ export class CamelDefinitionYaml {
         return result;
     }
 
-    static flowsToCamelElements = (flows: any[]): any[] => {
+    static flowsToCamelElements = (flows: any[], backward: boolean = false): any[] => {
         const result: any[] = [];
         flows.filter((e: any) => e.hasOwnProperty('restConfiguration'))
             .forEach((f: any) => result.push(CamelDefinitionYamlStep.readRestConfigurationDefinition(f.restConfiguration)));
         flows.filter((e: any) => e.hasOwnProperty('rest'))
             .forEach((f: any) => result.push(CamelDefinitionYamlStep.readRestDefinition(f.rest)));
         flows.filter((e: any) => e.hasOwnProperty('route'))
-            .forEach((f: any) => result.push(CamelDefinitionYamlStep.readRouteDefinition(f.route)));
+            .forEach((f: any) => {
+                if (backward){
+                    const route = f.route;
+                    if (route.from.steps && Array.isArray(route.from.steps)){
+                        route.from.steps.push(...route.steps);
+                    } else {
+                        route.from.steps = [...route.steps];
+                    }
+                    delete route.steps;
+                    result.push(CamelDefinitionYamlStep.readRouteDefinition(route));
+                } else {
+                    result.push(CamelDefinitionYamlStep.readRouteDefinition(f.route));
+                }
+            });
         flows.filter((e: any) => e.hasOwnProperty('from'))
             .forEach((f: any) =>  result.push(CamelDefinitionYamlStep.readRouteDefinition(new RouteDefinition({from: f.from}))));
         flows.filter((e: any) => e.hasOwnProperty('beans'))
diff --git a/karavan-core/src/core/model/CamelDefinition.ts b/karavan-core/src/core/model/CamelDefinition.ts
index 3cfd6e8..6c54ad7 100644
--- a/karavan-core/src/core/model/CamelDefinition.ts
+++ b/karavan-core/src/core/model/CamelDefinition.ts
@@ -2162,8 +2162,8 @@ export class CryptoDataFormat extends CamelElement {
     initVectorRef?: string;
     keyRef?: string;
     id?: string;
-    buffersize?: number;
-    algorithm?: string
+    algorithm?: string;
+    bufferSize?: number
     public constructor(init?: Partial<CryptoDataFormat>) {
         super('CryptoDataFormat')
         Object.assign(this, init)
@@ -2376,6 +2376,7 @@ export class JacksonXMLDataFormat extends CamelElement {
     prettyPrint?: boolean;
     jsonView?: string;
     dataFormatName?: string = 'jacksonXml';
+    timezone?: string;
     moduleClassNames?: string;
     allowJmsType?: boolean;
     enableFeatures?: string;
@@ -3148,7 +3149,7 @@ export class WeightedLoadBalancerDefinition extends CamelElement {
     stepName?: string = 'weightedLoadBalancer';
     id?: string;
     distributionRatio: string = '';
-    roundRobin?: string
+    roundRobin?: boolean
     public constructor(init?: Partial<WeightedLoadBalancerDefinition>) {
         super('WeightedLoadBalancerDefinition')
         Object.assign(this, init)
@@ -3462,7 +3463,6 @@ export class RestConfigurationDefinition extends CamelElement {
     useXForwardHeaders?: boolean;
     apiHost?: string;
     contextPath?: string;
-    apiContextRouteId?: string;
     component?: string;
     dataFormatProperty?: RestPropertyDefinition[] = [];
     bindingMode?: string;
@@ -3584,7 +3584,6 @@ export class DataFormatTransformerDefinition extends CamelElement {
     syslog?: SyslogDataFormat;
     zipFile?: ZipFileDataFormat;
     jaxb?: JaxbDataFormat;
-    ref?: string;
     rss?: RssDataFormat;
     fromType?: string;
     stepName?: string = 'dataFormatTransformer';
diff --git a/karavan-core/src/core/model/CamelMetadata.ts b/karavan-core/src/core/model/CamelMetadata.ts
index 4060fd4..62bb02e 100644
--- a/karavan-core/src/core/model/CamelMetadata.ts
+++ b/karavan-core/src/core/model/CamelMetadata.ts
@@ -102,8 +102,8 @@ export const DataFormats: [string, string, string][] = [
     ['grok','Grok',"Unmarshal unstructured data to objects using Logstash based Grok patterns."],
     ['gzipDeflater','GZip Deflater',"Compress and decompress messages using java.util.zip.GZIPStream."],
     ['hl7','HL7',"Marshal and unmarshal HL7 (Health Care) model objects using the HL7 MLLP codec."],
-    ['ical','iCal',"Marshal and unmarshal iCal (.ics) documents to/from model objects provided by the iCal4j library."],
-    ['jacksonXml','Jackson XML',"Unmarshal a XML payloads to POJOs and back using XMLMapper extension of Jackson."],
+    ['ical','iCal',"Marshal and unmarshal iCal (.ics) documents to/from model objects."],
+    ['jacksonXml','Jackson XML',"Unmarshal an XML payloads to POJOs and back using XMLMapper extension of Jackson."],
     ['jaxb','JAXB',"Unmarshal XML payloads to POJOs and back using JAXB2 XML marshalling standard."],
     ['json','JSon',"Marshal POJOs to JSON and back."],
     ['jsonApi','JSonApi',"Marshal and unmarshal JSON:API resources using JSONAPI-Converter library."],
@@ -136,10 +136,10 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('tarFile', 'TarFileDataFormat', 'Tar File', "Archive files into tarballs or extract files from tarballs.", 'dataformat,transformation,file', [
-        new PropertyMeta('usingIterator', 'Using Iterator', "If the tar file has more then one entry, the setting this option to true, allows to work with the splitter EIP, to split the data using an iterator in a streaming mode.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If the tar file has more then one entry, setting this option to true, allows to get the iterator even if the directory is empty", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('usingIterator', 'Using Iterator', "If the tar file has more than one entry, the setting this option to true, allows working with the splitter EIP, to split the data using an iterator in a streaming mode.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If the tar file has more than one entry, setting this option to true, allows to get the iterator even if the directory is empty", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('preservePathElements', 'Preserve Path Elements', "If the file name contains path elements, setting this option to true, allows the path to be maintained in the tar file.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set the maximum decompressed size of a tar file (in bytes). The default value if not specified corresponds to 1 gigabyte. An IOException will be thrown if the decompressed size exceeds this amount. Set to -1 to disable setting a maximum decompressed size.", 'number', '', '1073741824', false, false, false, false, ''),
+        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set the maximum decompressed size of a tar file (in bytes). The default value if not specified corresponds to 1 gigabyte. An IOException will be thrown if the decompressed size exceeds this amount. Set to -1 to disable setting a maximum decompressed size.", 'number', '', '1073741824', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('cbor', 'CBORDataFormat', 'CBOR', "Unmarshal a CBOR payload to POJO and back.", 'dataformat,transformation,json', [
@@ -158,10 +158,10 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('soap', 'SoapDataFormat', 'SOAP', "Marshal Java objects to SOAP messages and back.", 'dataformat,transformation,xml', [
         new PropertyMeta('contextPath', 'Context Path', "Package name where your JAXB classes are located.", 'string', '', '', true, false, false, false, ''),
         new PropertyMeta('encoding', 'Encoding', "To overrule and use a specific encoding", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('elementNameStrategyRef', 'Element Name Strategy Ref', "Refers to an element strategy to lookup from the registry. An element name strategy is used for two purposes. The first is to find a xml element name for a given object and soap action when marshaling the object into a SOAP message. The second is to find an Exception class for a given soap fault name. The following three element strategy class name is provided out of the box. QNameStrategy - Uses a fixed qNa [...]
+        new PropertyMeta('elementNameStrategyRef', 'Element Name Strategy Ref', "Refers to an element strategy to lookup from the registry. An element name strategy is used for two purposes. The first is to find a xml element name for a given object and soap action when marshaling the object into a SOAP message. The second is to find an Exception class for a given soap fault name. The following three element strategy class name is provided out of the box. QNameStrategy - Uses a fixed qNa [...]
         new PropertyMeta('version', 'Version', "SOAP version should either be 1.1 or 1.2. Is by default 1.1", 'string', '1.1, 1.2', '1.1', false, false, false, false, ''),
-        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When marshalling using JAXB or SOAP then the JAXB implementation will automatic assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, Camel allows you to refer to a map which contains the desired mapping.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('schema', 'Schema', "To validate against an existing schema. Your can use the prefix classpath:, file: or http: to specify how the resource should by resolved. You can separate multiple schema files by using the ',' character.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When marshalling using JAXB or SOAP then the JAXB implementation will automatic assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, Camel allows you to refer to a map which contains the desired mapping.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('schema', 'Schema', "To validate against an existing schema. Your can use the prefix classpath:, file: or http: to specify how the resource should be resolved. You can separate multiple schema files by using the ',' character.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('lzf', 'LZFDataFormat', 'LZF Deflate Compression', "Compress and decompress streams using LZF deflate algorithm.", 'dataformat,transformation', [
@@ -169,20 +169,20 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('univocityFixed', 'UniVocityFixedDataFormat', 'uniVocity Fixed Length', "Marshal and unmarshal Java objects from and to fixed length records using UniVocity Parsers.", 'dataformat,transformation,csv', [
+        new PropertyMeta('padding', 'Padding', "The padding character. The default value is a space", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('skipTrailingCharsUntilNewline', 'Skip Trailing Chars Until Newline', "Whether or not the trailing characters until new line must be ignored. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('recordEndsOnNewline', 'Record Ends On Newline', "Whether or not the record ends on new line. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('padding', 'Padding', "The padding character. The default value is a space", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('nullValue', 'Null Value', "The string representation of a null value. The default value is null", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('nullValue', 'Null Value', "The string representation of a null value. The default value is null", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('skipEmptyLines', 'Skip Empty Lines', "Whether or not the empty lines must be ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreTrailingWhitespaces', 'Ignore Trailing Whitespaces', "Whether or not the trailing white spaces must ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreLeadingWhitespaces', 'Ignore Leading Whitespaces', "Whether or not the leading white spaces must be ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('headersDisabled', 'Headers Disabled', "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('headerExtractionEnabled', 'Header Extraction Enabled', "Whether or not the header must be read in the first line of the test document The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', "The maximum number of record to read.", 'number', '', '', false, false, false, false, ''),
-        new PropertyMeta('emptyValue', 'Empty Value', "The String representation of an empty value", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('lineSeparator', 'Line Separator', "The line separator of the files The default value is to use the JVM platform line separator", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('normalizedLineSeparator', 'Normalized Line Separator', "The normalized line separator of the files The default value is a new line character.", 'string', '', '\n', false, false, false, false, ''),
-        new PropertyMeta('comment', 'Comment', "The comment symbol. The default value is #", 'string', '', '#', false, false, false, false, ''),
+        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', "The maximum number of record to read.", 'number', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('emptyValue', 'Empty Value', "The String representation of an empty value", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('lineSeparator', 'Line Separator', "The line separator of the files The default value is to use the JVM platform line separator", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('normalizedLineSeparator', 'Normalized Line Separator', "The normalized line separator of the files The default value is a new line character.", 'string', '', '\n', false, false, false, false, 'advanced'),
+        new PropertyMeta('comment', 'Comment', "The comment symbol. The default value is #", 'string', '', '#', false, false, false, false, 'advanced'),
         new PropertyMeta('lazyLoad', 'Lazy Load', "Whether the unmarshalling should produce an iterator that reads the lines on the fly or if all the lines must be read at one. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('asMap', 'As Map', "Whether the unmarshalling should produce maps for the lines values instead of lists. It requires to have header (either defined or collected). The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
@@ -205,7 +205,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that matches a enum from com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, or com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the unmarshalling. This should only be enabled when desired to be used.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, false, false, 'advanced'),
-        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object Mapper', "If set to true then Jackson will lookup for an objectMapper into the registry", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object Mapper', "If set to true then Jackson will lookup for an objectMapper into the registry", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema resolver used to lookup schemas for the data in transit.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema Resolver', "When not disabled, the SchemaResolver will be looked up into the registry", 'boolean', '', 'true', false, false, false, false, 'advanced'),
@@ -218,46 +218,47 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('gzipDeflater', 'GzipDeflaterDataFormat', 'GZip Deflater', "Compress and decompress messages using java.util.zip.GZIPStream.", 'dataformat,transformation', [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
-    new ElementMeta('jacksonXml', 'JacksonXMLDataFormat', 'Jackson XML', "Unmarshal a XML payloads to POJOs and back using XMLMapper extension of Jackson.", 'dataformat,transformation,xml', [
-        new PropertyMeta('xmlMapper', 'Xml Mapper', "Lookup and use the existing XmlMapper with the given id.", 'string', '', '', false, false, false, false, ''),
+    new ElementMeta('jacksonXml', 'JacksonXMLDataFormat', 'Jackson XML', "Unmarshal an XML payloads to POJOs and back using XMLMapper extension of Jackson.", 'dataformat,transformation,xml', [
+        new PropertyMeta('xmlMapper', 'Xml Mapper', "Lookup and use the existing XmlMapper with the given id.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('prettyPrint', 'Pretty Print', "To enable pretty printing output nicely formatted. Is by default false.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the java type to use when unmarshalling", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the unmarshalling. This should only be enabled when desired to be used.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('jsonView', 'Json View', "When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson you can use JSON views to accomplish this. This option is to refer to the class which has JsonView annotations", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('include', 'Include', "If you want to marshal a pojo to JSON, and the pojo has some fields with null values. And you want to skip these null values, you can set this option to NON_NULL", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to unmarshal to.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('collectionType', 'Collection Type', "Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but allows to use different collection types than java.util.Collection based as default.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to unmarshal to.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
+        new PropertyMeta('collectionType', 'Collection Type', "Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but allows to use different collection types than java.util.Collection based as default.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('useList', 'Use List', "To unmarshal to a List of Map or a List of Pojo.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('enableJaxbAnnotationModule', 'Enable Jaxb Annotation Module', "Whether to enable the JAXB annotations module when using jackson. When enabled then JAXB annotations can be used by Jackson.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class names. Multiple classes can be separated by comma.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('enableJaxbAnnotationModule', 'Enable Jaxb Annotation Module', "Whether to enable the JAXB annotations module when using jackson. When enabled then JAXB annotations can be used by Jackson.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class names. Multiple classes can be separated by comma.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('enableFeatures', 'Enable Features', "Set of features to enable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that matches a enum from com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, or com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that matches a enum from com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, or com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated by comma", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the unmarshalling. This should only be enabled when desired to be used.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('protobuf', 'ProtobufDataFormat', 'Protobuf', "Serialize and deserialize Java objects using Google's Protocol buffers.", 'dataformat,transformation', [
         new PropertyMeta('instanceClass', 'Instance Class', "Name of class to use when unmarshalling", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('contentTypeFormat', 'Content Type Format', "Defines a content type format in which protobuf message will be serialized/deserialized from(to) the Java been. The format can either be native or json for either native protobuf or json fields representation. The default value is native.", 'string', 'native, json', 'native', false, false, false, false, ''),
-        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
-        new PropertyMeta('library', 'Library', "Which Protobuf library to use.", 'string', 'google-protobuf, jackson', 'GoogleProtobuf', false, false, false, false, ''),
-        new PropertyMeta('objectMapper', 'Object Mapper', "Lookup and use the existing ObjectMapper with the given id when using Jackson.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('objectMapper', 'Object Mapper', "Lookup and use the existing ObjectMapper with the given id when using Jackson.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('useDefaultObjectMapper', 'Use Default Object Mapper', "Whether to lookup and use default Jackson ObjectMapper from the registry.", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object Mapper', "If set to true then Jackson will lookup for an objectMapper into the registry", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('library', 'Library', "Which Protobuf library to use.", 'string', 'google-protobuf, jackson', 'GoogleProtobuf', false, false, false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the java type to use when unmarshalling", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('jsonView', 'Json View', "When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson you can use JSON views to accomplish this. This option is to refer to the class which has JsonView annotations", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('include', 'Include', "If you want to marshal a pojo to JSON, and the pojo has some fields with null values. And you want to skip these null values, you can set this option to NON_NULL", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to unmarshal to.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to unmarshal to.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('collectionType', 'Collection Type', "Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but allows to use different collection types than java.util.Collection based as default.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('useList', 'Use List', "To unmarshal to a List of Map or a List of Pojo.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class names. Multiple classes can be separated by comma.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class names. Multiple classes can be separated by comma.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('enableFeatures', 'Enable Features', "Set of features to enable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that matches a enum from com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, or com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that matches a enum from com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, or com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the unmarshalling. This should only be enabled when desired to be used.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object Mapper', "If set to true then Jackson will lookup for an objectMapper into the registry", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema resolver used to lookup schemas for the data in transit.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema Resolver', "When not disabled, the SchemaResolver will be looked up into the registry", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use the Timezone when marshalling/unmarshalling.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema resolver used to lookup schemas for the data in transit.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema Resolver', "When not disabled, the SchemaResolver will be looked up into the registry", 'boolean', '', 'true', false, false, false, false, 'advanced'),
+        new PropertyMeta('contentTypeFormat', 'Content Type Format', "Defines a content type format in which protobuf message will be serialized/deserialized from(to) the Java been. The format can either be native or json for either native protobuf or json fields representation. The default value is native.", 'string', 'native, json', 'native', false, false, false, false, ''),
+        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('bindy', 'BindyDataFormat', 'Bindy', "Marshal and unmarshal Java beans from and to flat payloads (such as CSV, delimited, fixed length formats, or FIX messages).", 'dataformat,transformation,csv', [
@@ -269,44 +270,44 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('xmlSecurity', 'XMLSecurityDataFormat', 'XML Security', "Encrypt and decrypt XML payloads using Apache Santuario.", 'dataformat,transformation,xml', [
-        new PropertyMeta('xmlCipherAlgorithm', 'Xml Cipher Algorithm', "The cipher algorithm to be used for encryption/decryption of the XML message content. The available choices are: XMLCipher.TRIPLEDES XMLCipher.AES_128 XMLCipher.AES_128_GCM XMLCipher.AES_192 XMLCipher.AES_192_GCM XMLCipher.AES_256 XMLCipher.AES_256_GCM XMLCipher.SEED_128 XMLCipher.CAMELLIA_128 XMLCipher.CAMELLIA_192 XMLCipher.CAMELLIA_256 The default value is XMLCipher.AES_256_GCM", 'string', '', 'AES-256-GCM', false [...]
+        new PropertyMeta('xmlCipherAlgorithm', 'Xml Cipher Algorithm', "The cipher algorithm to be used for encryption/decryption of the XML message content. The available choices are: XMLCipher.TRIPLEDES XMLCipher.AES_128 XMLCipher.AES_128_GCM XMLCipher.AES_192 XMLCipher.AES_192_GCM XMLCipher.AES_256 XMLCipher.AES_256_GCM XMLCipher.SEED_128 XMLCipher.CAMELLIA_128 XMLCipher.CAMELLIA_192 XMLCipher.CAMELLIA_256 The default value is XMLCipher.AES_256_GCM", 'string', 'TRIPLEDES, AES_128, AES [...]
         new PropertyMeta('passPhrase', 'Pass Phrase', "A String used as passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The passPhrase needs to be put together in conjunction with the appropriate encryption algorithm. For example using TRIPLEDES the passPhase can be a Only another 24 Byte key", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('passPhraseByte', 'Pass Phrase Byte', "A byte used as passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The passPhrase needs to be put together in conjunction with the appropriate encryption algorithm. For example using TRIPLEDES the passPhase can be a Only another 24 Byte key", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('passPhraseByte', 'Pass Phrase Byte', "A byte used as passPhrase to encrypt/decrypt content. The passPhrase has to be provided. The passPhrase needs to be put together in conjunction with the appropriate encryption algorithm. For example using TRIPLEDES the passPhase can be a Only another 24 Byte key", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('secureTag', 'Secure Tag', "The XPath reference to the XML Element selected for encryption/decryption. If no tag is specified, the entire payload is encrypted/decrypted.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('secureTagContents', 'Secure Tag Contents', "A boolean value to specify whether the XML Element is to be encrypted or the contents of the XML Element false = Element Level true = Element Content Level", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('keyCipherAlgorithm', 'Key Cipher Algorithm', "The cipher algorithm to be used for encryption/decryption of the asymmetric key. The available choices are: XMLCipher.RSA_v1dot5 XMLCipher.RSA_OAEP XMLCipher.RSA_OAEP_11 The default value is XMLCipher.RSA_OAEP", 'string', '', 'RSA_OAEP', false, false, false, false, ''),
+        new PropertyMeta('secureTagContents', 'Secure Tag Contents', "A boolean value to specify whether the XML Element is to be encrypted or the contents of the XML Element. false = Element Level. true = Element Content Level.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('keyCipherAlgorithm', 'Key Cipher Algorithm', "The cipher algorithm to be used for encryption/decryption of the asymmetric key. The available choices are: XMLCipher.RSA_v1dot5 XMLCipher.RSA_OAEP XMLCipher.RSA_OAEP_11 The default value is XMLCipher.RSA_OAEP", 'string', 'RSA_v1dot5, RSA_OAEP, RSA_OAEP_11', 'RSA_OAEP', false, false, false, false, ''),
         new PropertyMeta('recipientKeyAlias', 'Recipient Key Alias', "The key alias to be used when retrieving the recipient's public or private key from a KeyStore when performing asymmetric key encryption or decryption.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('keyOrTrustStoreParametersRef', 'Key Or Trust Store Parameters Ref', "Refers to a KeyStore instance to lookup in the registry, which is used for configuration options for creating and loading a KeyStore instance that represents the sender's trustStore or recipient's keyStore.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('keyPassword', 'Key Password', "The password to be used for retrieving the private key from the KeyStore. This key is used for asymmetric decryption.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('digestAlgorithm', 'Digest Algorithm', "The digest algorithm to use with the RSA OAEP algorithm. The available choices are: XMLCipher.SHA1 XMLCipher.SHA256 XMLCipher.SHA512 The default value is XMLCipher.SHA1", 'string', '', 'SHA1', false, false, false, false, ''),
-        new PropertyMeta('mgfAlgorithm', 'Mgf Algorithm', "The MGF Algorithm to use with the RSA OAEP algorithm. The available choices are: EncryptionConstants.MGF1_SHA1 EncryptionConstants.MGF1_SHA256 EncryptionConstants.MGF1_SHA512 The default value is EncryptionConstants.MGF1_SHA1", 'string', '', 'MGF1_SHA1', false, false, false, false, ''),
+        new PropertyMeta('digestAlgorithm', 'Digest Algorithm', "The digest algorithm to use with the RSA OAEP algorithm. The available choices are: XMLCipher.SHA1 XMLCipher.SHA256 XMLCipher.SHA512 The default value is XMLCipher.SHA1", 'string', 'SHA1, SHA256, SHA512', 'SHA1', false, false, false, false, ''),
+        new PropertyMeta('mgfAlgorithm', 'Mgf Algorithm', "The MGF Algorithm to use with the RSA OAEP algorithm. The available choices are: EncryptionConstants.MGF1_SHA1 EncryptionConstants.MGF1_SHA256 EncryptionConstants.MGF1_SHA512 The default value is EncryptionConstants.MGF1_SHA1", 'string', 'MGF1_SHA1, MGF1_SHA256, MGF1_SHA512', 'MGF1_SHA1', false, false, false, false, ''),
         new PropertyMeta('addKeyValueForEncryptedKey', 'Add Key Value For Encrypted Key', "Whether to add the public key used to encrypt the session key as a KeyValue in the EncryptedKey structure or not.", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('json', 'JsonDataFormat', 'JSon', "Marshal POJOs to JSON and back.", 'dataformat,transformation,json', [
         new PropertyMeta('objectMapper', 'Object Mapper', "Lookup and use the existing ObjectMapper with the given id when using Jackson.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('useDefaultObjectMapper', 'Use Default Object Mapper', "Whether to lookup and use default Jackson ObjectMapper from the registry.", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object Mapper', "If set to true then Jackson will lookup for an objectMapper into the registry", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('prettyPrint', 'Pretty Print', "To enable pretty printing output nicely formatted. Is by default false.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('library', 'Library', "Which json library to use.", 'string', 'fastjson, gson, jackson, johnzon, jsonb, x-stream', 'Jackson', false, false, false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the java type to use when unmarshalling", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('jsonView', 'Json View', "When marshalling a POJO to JSON you might want to exclude certain fields from the JSON output. With Jackson you can use JSON views to accomplish this. This option is to refer to the class which has JsonView annotations", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('include', 'Include', "If you want to marshal a pojo to JSON, and the pojo has some fields with null values. And you want to skip these null values, you can set this option to NON_NULL", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to unmarshal to.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowJmsType', 'Allow Jms Type', "Used for JMS users to allow the JMSType header from the JMS spec to specify a FQN classname to use to unmarshal to.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('collectionType', 'Collection Type', "Refers to a custom collection type to lookup in the registry to use. This option should rarely be used, but allows to use different collection types than java.util.Collection based as default.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('useList', 'Use List', "To unmarshal to a List of Map or a List of Pojo.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class names. Multiple classes can be separated by comma.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('moduleClassNames', 'Module Class Names', "To use custom Jackson modules com.fasterxml.jackson.databind.Module specified as a String with FQN class names. Multiple classes can be separated by comma.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('moduleRefs', 'Module Refs', "To use custom Jackson modules referred from the Camel registry. Multiple modules can be separated by comma.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('enableFeatures', 'Enable Features', "Set of features to enable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that matches a enum from com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, or com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated by comma", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('disableFeatures', 'Disable Features', "Set of features to disable on the Jackson com.fasterxml.jackson.databind.ObjectMapper. The features should be a name that matches a enum from com.fasterxml.jackson.databind.SerializationFeature, com.fasterxml.jackson.databind.DeserializationFeature, or com.fasterxml.jackson.databind.MapperFeature Multiple features can be separated by comma", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('permissions', 'Permissions', "Adds permissions that controls which Java packages and classes XStream is allowed to use during unmarshal from xml/json to Java beans. A permission must be configured either here or globally using a JVM system property. The permission can be specified in a syntax where a plus sign is allow, and minus sign is deny. Wildcards is supported by using . as prefix. For example to allow com.foo and all subpackages then specfy com.foo.. Mult [...]
+        new PropertyMeta('permissions', 'Permissions', "Adds permissions that controls which Java packages and classes XStream is allowed to use during unmarshal from xml/json to Java beans. A permission must be configured either here or globally using a JVM system property. The permission can be specified in a syntax where a plus sign is allow, and minus sign is deny. Wildcards is supported by using . as prefix. For example to allow com.foo and all subpackages then specfy com.foo.. Mult [...]
         new PropertyMeta('allowUnmarshallType', 'Allow Unmarshall Type', "If enabled then Jackson is allowed to attempt to use the CamelJacksonUnmarshalType header during the unmarshalling. This should only be enabled when desired to be used.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use the Timezone when marshalling/unmarshalling. This option will have no effect on the others Json DataFormat, like gson, fastjson and xstream.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('autoDiscoverObjectMapper', 'Auto Discover Object Mapper', "If set to true then Jackson will lookup for an objectMapper into the registry", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('timezone', 'Timezone', "If set then Jackson will use the Timezone when marshalling/unmarshalling. This option will have no effect on the others Json DataFormat, like gson, fastjson and xstream.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('dropRootNode', 'Drop Root Node', "Whether XStream will drop the root node in the generated JSon. You may want to enable this when using POJOs; as then the written object will include the class name as root node, which is often not intended to be written in the JSON output.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
-        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema resolver used to lookup schemas for the data in transit.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema Resolver', "When not disabled, the SchemaResolver will be looked up into the registry", 'boolean', '', 'true', false, false, false, false, ''),
+        new PropertyMeta('schemaResolver', 'Schema Resolver', "Optional schema resolver used to lookup schemas for the data in transit.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('autoDiscoverSchemaResolver', 'Auto Discover Schema Resolver', "When not disabled, the SchemaResolver will be looked up into the registry", 'boolean', '', 'true', false, false, false, false, 'advanced'),
         new PropertyMeta('namingStrategy', 'Naming Strategy', "If set then Jackson will use the the defined Property Naming Strategy.Possible values are: LOWER_CAMEL_CASE, LOWER_DOT_CASE, LOWER_CASE, KEBAB_CASE, SNAKE_CASE and UPPER_CAMEL_CASE", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('beanio', 'BeanioDataFormat', 'BeanIO', "Marshal and unmarshal Java beans to and from flat files (such as CSV, delimited, or fixed length formats).", 'dataformat,transformation,csv', [
@@ -329,7 +330,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('tidyMarkup', 'TidyMarkupDataFormat', 'TidyMarkup', "Parse (potentially invalid) HTML into valid HTML or DOM.", 'dataformat,transformation', [
-        new PropertyMeta('dataObjectType', 'Data Object Type', "What data type to unmarshal as, can either be org.w3c.dom.Node or java.lang.String. Is by default org.w3c.dom.Node", 'string', '', 'org.w3c.dom.Node', false, false, false, false, ''),
+        new PropertyMeta('dataObjectType', 'Data Object Type', "What data type to unmarshal as, can either be org.w3c.dom.Node or java.lang.String. Is by default org.w3c.dom.Node", 'string', 'org.w3c.dom.Node, java.lang.String', 'org.w3c.dom.Node', false, false, false, false, ''),
         new PropertyMeta('omitXmlDeclaration', 'Omit Xml Declaration', "When returning a String, do we omit the XML declaration in the top.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
@@ -350,7 +351,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('zipDeflater', 'ZipDeflaterDataFormat', 'Zip Deflater', "Compress and decompress streams using java.util.zip.Deflater and java.util.zip.Inflater.", 'dataformat,transformation', [
-        new PropertyMeta('compressionLevel', 'Compression Level', "To specify a specific compression between 0-9. -1 is default compression, 0 is no compression, and 9 is the best compression.", 'number', '', '-1', false, false, false, false, ''),
+        new PropertyMeta('compressionLevel', 'Compression Level', "To specify a specific compression between 0-9. -1 is default compression, 0 is no compression, and 9 is the best compression.", 'number', '-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9', '-1', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('asn1', 'ASN1DataFormat', 'ASN.1 File', "Encode and decode data structures using Abstract Syntax Notation One (ASN.1).", 'dataformat,transformation,file', [
@@ -367,9 +368,9 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('xstream', 'XStreamDataFormat', 'XStream', "Marshal and unmarshal POJOs to/from XML using XStream library.", 'dataformat,transformation,xml,json', [
         new PropertyMeta('permissions', 'Permissions', "Adds permissions that controls which Java packages and classes XStream is allowed to use during unmarshal from xml/json to Java beans. A permission must be configured either here or globally using a JVM system property. The permission can be specified in a syntax where a plus sign is allow, and minus sign is deny. Wildcards is supported by using . as prefix. For example to allow com.foo and all subpackages then specify com.foo.. Mul [...]
         new PropertyMeta('encoding', 'Encoding', "Sets the encoding to use", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('driver', 'Driver', "To use a custom XStream driver. The instance must be of type com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('driverRef', 'Driver Ref', "To refer to a custom XStream driver to lookup in the registry. The instance must be of type com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('mode', 'Mode', "Mode for dealing with duplicate references The possible values are: NO_REFERENCES ID_REFERENCES XPATH_RELATIVE_REFERENCES XPATH_ABSOLUTE_REFERENCES SINGLE_NODE_XPATH_RELATIVE_REFERENCES SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('driver', 'Driver', "To use a custom XStream driver. The instance must be of type com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('driverRef', 'Driver Ref', "To refer to a custom XStream driver to lookup in the registry. The instance must be of type com.thoughtworks.xstream.io.HierarchicalStreamDriver", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('mode', 'Mode', "Mode for dealing with duplicate references The possible values are: NO_REFERENCES ID_REFERENCES XPATH_RELATIVE_REFERENCES XPATH_ABSOLUTE_REFERENCES SINGLE_NODE_XPATH_RELATIVE_REFERENCES SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES", 'string', 'NO_REFERENCES, ID_REFERENCES, XPATH_RELATIVE_REFERENCES, XPATH_ABSOLUTE_REFERENCES, SINGLE_NODE_XPATH_RELATIVE_REFERENCES, SINGLE_NODE_XPATH_ABSOLUTE_REFERENCES', '', false, false, false, false, 'advanced'),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('converters', 'Converters', "List of class names for using custom XStream converters. The classes must be of type com.thoughtworks.xstream.converters.Converter", 'PropertyDefinition', '', '', false, false, true, true, ''),
         new PropertyMeta('aliases', 'Aliases', "Alias a Class to a shorter name to be used in XML elements.", 'PropertyDefinition', '', '', false, false, true, true, ''),
@@ -380,16 +381,16 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('yaml', 'YAMLDataFormat', 'YAML', "Marshal and unmarshal Java objects to and from YAML.", 'dataformat,transformation,yaml', [
         new PropertyMeta('library', 'Library', "Which yaml library to use. By default it is SnakeYAML", 'string', 'snake-yaml', 'SnakeYAML', false, false, false, false, ''),
         new PropertyMeta('unmarshalType', 'Unmarshal Type', "Class name of the java type to use when unmarshalling", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('constructor', 'Constructor', "BaseConstructor to construct incoming documents.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('representer', 'Representer', "Representer to emit outgoing objects.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('dumperOptions', 'Dumper Options', "DumperOptions to configure outgoing objects.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('resolver', 'Resolver', "Resolver to detect implicit type", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('constructor', 'Constructor', "BaseConstructor to construct incoming documents.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('representer', 'Representer', "Representer to emit outgoing objects.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('dumperOptions', 'Dumper Options', "DumperOptions to configure outgoing objects.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('resolver', 'Resolver', "Resolver to detect implicit type", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('useApplicationContextClassLoader', 'Use Application Context Class Loader', "Use ApplicationContextClassLoader as custom ClassLoader", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('prettyFlow', 'Pretty Flow', "Force the emitter to produce a pretty YAML document when using the flow style.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('allowAnyType', 'Allow Any Type', "Allow any class to be un-marshaled", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('typeFilter', 'Type Filter', "Set the types SnakeYAML is allowed to un-marshall", 'YAMLTypeFilterDefinition', '', '', false, false, true, true, ''),
-        new PropertyMeta('maxAliasesForCollections', 'Max Aliases For Collections', "Set the maximum amount of aliases allowed for collections.", 'number', '', '50', false, false, false, false, ''),
-        new PropertyMeta('allowRecursiveKeys', 'Allow Recursive Keys', "Set whether recursive keys are allowed.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('maxAliasesForCollections', 'Max Aliases For Collections', "Set the maximum amount of aliases allowed for collections.", 'number', '', '50', false, false, false, false, 'advanced'),
+        new PropertyMeta('allowRecursiveKeys', 'Allow Recursive Keys', "Set whether recursive keys are allowed.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('custom', 'CustomDataFormat', 'Custom', "Delegate to a custom org.apache.camel.spi.DataFormat implementation via Camel registry.", 'dataformat,transformation', [
@@ -406,7 +407,7 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('urlSafe', 'Url Safe', "Instead of emitting '' and '/' we emit '-' and '_' respectively. urlSafe is only applied to encode operations. Decoding seamlessly handles both modes. Is by default false.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
-    new ElementMeta('ical', 'IcalDataFormat', 'iCal', "Marshal and unmarshal iCal (.ics) documents to/from model objects provided by the iCal4j library.", 'dataformat,transformation', [
+    new ElementMeta('ical', 'IcalDataFormat', 'iCal', "Marshal and unmarshal iCal (.ics) documents to/from model objects.", 'dataformat,transformation', [
         new PropertyMeta('validating', 'Validating', "Whether to validate.", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
@@ -419,54 +420,54 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('cryptoProvider', 'Crypto Provider', "The name of the JCE Security Provider that should be used.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('initVectorRef', 'Init Vector Ref', "Refers to a byte array containing the Initialization Vector that will be used to initialize the Cipher.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('algorithmParameterRef', 'Algorithm Parameter Ref', "A JCE AlgorithmParameterSpec used to initialize the Cipher. Will lookup the type using the given name as a java.security.spec.AlgorithmParameterSpec type.", 'string', '', '', false, false, false, false, 'advanced'),
-        new PropertyMeta('buffersize', 'buffersize', "buffersize", 'number', '', '', false, false, false, false, ''),
+        new PropertyMeta('bufferSize', 'Buffer Size', "The size of the buffer used in the signature process.", 'number', '', '4096', false, false, false, false, ''),
         new PropertyMeta('macAlgorithm', 'Mac Algorithm', "The JCE algorithm name indicating the Message Authentication algorithm.", 'string', '', 'HmacSHA1', false, false, false, false, ''),
         new PropertyMeta('shouldAppendHmac', 'shouldAppendHmac', "shouldAppendHmac", 'boolean', '', '', false, false, false, false, ''),
         new PropertyMeta('inline', 'Inline', "Flag indicating that the configured IV should be inlined into the encrypted data stream. Is by default false.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('zipFile', 'ZipFileDataFormat', 'Zip File', "Compression and decompress streams using java.util.zip.ZipStream.", 'dataformat,transformation,file', [
-        new PropertyMeta('usingIterator', 'Using Iterator', "If the zip file has more then one entry, the setting this option to true, allows to work with the splitter EIP, to split the data using an iterator in a streaming mode.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If the zip file has more then one entry, setting this option to true, allows to get the iterator even if the directory is empty", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('usingIterator', 'Using Iterator', "If the zip file has more than one entry, the setting this option to true, allows working with the splitter EIP, to split the data using an iterator in a streaming mode.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('allowEmptyDirectory', 'Allow Empty Directory', "If the zip file has more than one entry, setting this option to true, allows to get the iterator even if the directory is empty", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('preservePathElements', 'Preserve Path Elements', "If the file name contains path elements, setting this option to true, allows the path to be maintained in the zip file.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set the maximum decompressed size of a zip file (in bytes). The default value if not specified corresponds to 1 gigabyte. An IOException will be thrown if the decompressed size exceeds this amount. Set to -1 to disable setting a maximum decompressed size.", 'number', '', '1073741824', false, false, false, false, ''),
+        new PropertyMeta('maxDecompressedSize', 'Max Decompressed Size', "Set the maximum decompressed size of a zip file (in bytes). The default value if not specified corresponds to 1 gigabyte. An IOException will be thrown if the decompressed size exceeds this amount. Set to -1 to disable setting a maximum decompressed size.", 'number', '', '1073741824', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('jaxb', 'JaxbDataFormat', 'JAXB', "Unmarshal XML payloads to POJOs and back using JAXB2 XML marshalling standard.", 'dataformat,transformation,xml', [
         new PropertyMeta('contextPath', 'Context Path', "Package name where your JAXB classes are located.", 'string', '', '', true, false, false, false, ''),
         new PropertyMeta('contextPathIsClassName', 'Context Path Is Class Name', "This can be set to true to mark that the contextPath is referring to a classname and not a package name.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('schema', 'Schema', "To validate against an existing schema. Your can use the prefix classpath:, file: or http: to specify how the resource should by resolved. You can separate multiple schema files by using the ',' character.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('schema', 'Schema', "To validate against an existing schema. Your can use the prefix classpath:, file: or http: to specify how the resource should be resolved. You can separate multiple schema files by using the ',' character.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('schemaSeverityLevel', 'Schema Severity Level', "Sets the schema severity level to use when validating against a schema. This level determines the minimum severity error that triggers JAXB to stop continue parsing. The default value of 0 (warning) means that any error (warning, error or fatal error) will trigger JAXB to stop. There are the following three levels: 0=warning, 1=error, 2=fatal error.", 'number', '0, 1, 2', '0', false, false, false, false, ''),
         new PropertyMeta('prettyPrint', 'Pretty Print', "To enable pretty printing output nicely formatted. Is by default false.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('objectFactory', 'Object Factory', "Whether to allow using ObjectFactory classes to create the POJO classes during marshalling. This only applies to POJO classes that has not been annotated with JAXB and providing jaxb.index descriptor files.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('objectFactory', 'Object Factory', "Whether to allow using ObjectFactory classes to create the POJO classes during marshalling. This only applies to POJO classes that has not been annotated with JAXB and providing jaxb.index descriptor files.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('ignoreJaxbElement', 'ignoreJaxbElement', "ignoreJaxbElement", 'boolean', '', '', false, false, false, false, ''),
         new PropertyMeta('mustBeJaxbElement', 'mustBeJaxbElement', "mustBeJaxbElement", 'boolean', '', '', false, false, false, false, ''),
-        new PropertyMeta('filterNonXmlChars', 'Filter Non Xml Chars', "To ignore non xml characheters and replace them with an empty space.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('filterNonXmlChars', 'Filter Non Xml Chars', "To ignore non xml characheters and replace them with an empty space.", 'boolean', '', 'false', false, false, false, false, 'advanced'),
         new PropertyMeta('encoding', 'Encoding', "To overrule and use a specific encoding", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('fragment', 'Fragment', "To turn on marshalling XML fragment trees. By default JAXB looks for XmlRootElement annotation on given class to operate on whole XML tree. This is useful but not always - sometimes generated code does not have XmlRootElement annotation, sometimes you need unmarshall only part of tree. In that case you can use partial unmarshalling. To enable this behaviours you need set property partClass. Camel will pass this class to JAXB's unmarshaler [...]
-        new PropertyMeta('partClass', 'Part Class', "Name of class used for fragment parsing. See more details at the fragment option.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('partNamespace', 'Part Namespace', "XML namespace to use for fragment parsing. See more details at the fragment option.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When marshalling using JAXB or SOAP then the JAXB implementation will automatic assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, Camel allows you to refer to a map which contains the desired mapping.", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('fragment', 'Fragment', "To turn on marshalling XML fragment trees. By default JAXB looks for XmlRootElement annotation on given class to operate on whole XML tree. This is useful but not always - sometimes generated code does not have XmlRootElement annotation, sometimes you need unmarshall only part of tree. In that case you can use partial unmarshalling. To enable this behaviours you need set property partClass. Camel will pass this class to JAXB's unmarshaler [...]
+        new PropertyMeta('partClass', 'Part Class', "Name of class used for fragment parsing. See more details at the fragment option.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('partNamespace', 'Part Namespace', "XML namespace to use for fragment parsing. See more details at the fragment option.", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('namespacePrefixRef', 'Namespace Prefix Ref', "When marshalling using JAXB or SOAP then the JAXB implementation will automatic assign namespace prefixes, such as ns2, ns3, ns4 etc. To control this mapping, Camel allows you to refer to a map which contains the desired mapping.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('xmlStreamWriterWrapper', 'Xml Stream Writer Wrapper', "To use a custom xml stream writer.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('schemaLocation', 'Schema Location', "To define the location of the schema", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('noNamespaceSchemaLocation', 'No Namespace Schema Location', "To define the location of the namespaceless schema", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('noNamespaceSchemaLocation', 'No Namespace Schema Location', "To define the location of the namespaceless schema", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('jaxbProviderProperties', 'Jaxb Provider Properties', "Refers to a custom java.util.Map to lookup in the registry containing custom JAXB provider properties to be used with the JAXB marshaller.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('contentTypeHeader', 'Content Type Header', "Whether the data format should set the Content-Type header with the type from the data format. For example application/xml for data formats marshalling to XML, or application/json for data formats marshalling to JSON", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('univocityTsv', 'UniVocityTsvDataFormat', 'uniVocity TSV', "Marshal and unmarshal Java objects from and to TSV (Tab-Separated Values) records using UniVocity Parsers.", 'dataformat,transformation,csv', [
-        new PropertyMeta('escapeChar', 'Escape Char', "The escape character.", 'string', '', '\\', false, false, false, false, ''),
-        new PropertyMeta('nullValue', 'Null Value', "The string representation of a null value. The default value is null", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('escapeChar', 'Escape Char', "The escape character.", 'string', '', '\\', false, false, false, false, 'advanced'),
+        new PropertyMeta('nullValue', 'Null Value', "The string representation of a null value. The default value is null", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('skipEmptyLines', 'Skip Empty Lines', "Whether or not the empty lines must be ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreTrailingWhitespaces', 'Ignore Trailing Whitespaces', "Whether or not the trailing white spaces must ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreLeadingWhitespaces', 'Ignore Leading Whitespaces', "Whether or not the leading white spaces must be ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('headersDisabled', 'Headers Disabled', "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('headerExtractionEnabled', 'Header Extraction Enabled', "Whether or not the header must be read in the first line of the test document The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', "The maximum number of record to read.", 'number', '', '', false, false, false, false, ''),
-        new PropertyMeta('emptyValue', 'Empty Value', "The String representation of an empty value", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('lineSeparator', 'Line Separator', "The line separator of the files The default value is to use the JVM platform line separator", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('normalizedLineSeparator', 'Normalized Line Separator', "The normalized line separator of the files The default value is a new line character.", 'string', '', '\n', false, false, false, false, ''),
-        new PropertyMeta('comment', 'Comment', "The comment symbol. The default value is #", 'string', '', '#', false, false, false, false, ''),
+        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', "The maximum number of record to read.", 'number', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('emptyValue', 'Empty Value', "The String representation of an empty value", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('lineSeparator', 'Line Separator', "The line separator of the files The default value is to use the JVM platform line separator", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('normalizedLineSeparator', 'Normalized Line Separator', "The normalized line separator of the files The default value is a new line character.", 'string', '', '\n', false, false, false, false, 'advanced'),
+        new PropertyMeta('comment', 'Comment', "The comment symbol. The default value is #", 'string', '', '#', false, false, false, false, 'advanced'),
         new PropertyMeta('lazyLoad', 'Lazy Load', "Whether the unmarshalling should produce an iterator that reads the lines on the fly or if all the lines must be read at one. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('asMap', 'As Map', "Whether the unmarshalling should produce maps for the lines values instead of lists. It requires to have header (either defined or collected). The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
@@ -497,21 +498,21 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
     new ElementMeta('univocityCsv', 'UniVocityCsvDataFormat', 'uniVocity CSV', "Marshal and unmarshal Java objects from and to CSV (Comma Separated Values) using UniVocity Parsers.", 'dataformat,transformation,csv', [
-        new PropertyMeta('quoteAllFields', 'Quote All Fields', "Whether or not all values must be quoted when writing them.", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('quote', 'Quote', "The quote symbol.", 'string', '', '"', false, false, false, false, ''),
-        new PropertyMeta('quoteEscape', 'Quote Escape', "The quote escape symbol", 'string', '', '"', false, false, false, false, ''),
         new PropertyMeta('delimiter', 'Delimiter', "The delimiter of values", 'string', '', ',', false, false, false, false, ''),
-        new PropertyMeta('nullValue', 'Null Value', "The string representation of a null value. The default value is null", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('quoteAllFields', 'Quote All Fields', "Whether or not all values must be quoted when writing them.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('quote', 'Quote', "The quote symbol.", 'string', '', '"', false, false, false, false, 'advanced'),
+        new PropertyMeta('quoteEscape', 'Quote Escape', "The quote escape symbol", 'string', '', '"', false, false, false, false, 'advanced'),
+        new PropertyMeta('nullValue', 'Null Value', "The string representation of a null value. The default value is null", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('skipEmptyLines', 'Skip Empty Lines', "Whether or not the empty lines must be ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreTrailingWhitespaces', 'Ignore Trailing Whitespaces', "Whether or not the trailing white spaces must ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('ignoreLeadingWhitespaces', 'Ignore Leading Whitespaces', "Whether or not the leading white spaces must be ignored. The default value is true", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('headersDisabled', 'Headers Disabled', "Whether or not the headers are disabled. When defined, this option explicitly sets the headers as null which indicates that there is no header. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('headerExtractionEnabled', 'Header Extraction Enabled', "Whether or not the header must be read in the first line of the test document The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', "The maximum number of record to read.", 'number', '', '', false, false, false, false, ''),
-        new PropertyMeta('emptyValue', 'Empty Value', "The String representation of an empty value", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('lineSeparator', 'Line Separator', "The line separator of the files The default value is to use the JVM platform line separator", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('normalizedLineSeparator', 'Normalized Line Separator', "The normalized line separator of the files The default value is a new line character.", 'string', '', '\n', false, false, false, false, ''),
-        new PropertyMeta('comment', 'Comment', "The comment symbol. The default value is #", 'string', '', '#', false, false, false, false, ''),
+        new PropertyMeta('numberOfRecordsToRead', 'Number Of Records To Read', "The maximum number of record to read.", 'number', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('emptyValue', 'Empty Value', "The String representation of an empty value", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('lineSeparator', 'Line Separator', "The line separator of the files The default value is to use the JVM platform line separator", 'string', '', '', false, false, false, false, 'advanced'),
+        new PropertyMeta('normalizedLineSeparator', 'Normalized Line Separator', "The normalized line separator of the files The default value is a new line character.", 'string', '', '\n', false, false, false, false, 'advanced'),
+        new PropertyMeta('comment', 'Comment', "The comment symbol. The default value is #", 'string', '', '#', false, false, false, false, 'advanced'),
         new PropertyMeta('lazyLoad', 'Lazy Load', "Whether the unmarshalling should produce an iterator that reads the lines on the fly or if all the lines must be read at one. The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('asMap', 'As Map', "Whether the unmarshalling should produce maps for the lines values instead of lists. It requires to have header (either defined or collected). The default value is false", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
@@ -578,11 +579,11 @@ export const CamelDataFormatMetadata: ElementMeta[] = [
     new ElementMeta('flatpack', 'FlatpackDataFormat', 'Flatpack', "Marshal and unmarshal Java lists and maps to/from flat files (such as CSV, delimited, or fixed length formats) using Flatpack library.", 'dataformat,transformation,csv', [
         new PropertyMeta('definition', 'Definition', "The flatpack pzmap configuration file. Can be omitted in simpler situations, but its preferred to use the pzmap.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('fixed', 'Fixed', "Delimited or fixed. Is by default false = delimited", 'boolean', '', 'false', false, false, false, false, ''),
-        new PropertyMeta('ignoreFirstRecord', 'Ignore First Record', "Whether the first line is ignored for delimited files (for the column headers). Is by default true.", 'boolean', '', 'true', false, false, false, false, ''),
-        new PropertyMeta('textQualifier', 'Text Qualifier', "If the text is qualified with a character. Uses quote character by default.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('delimiter', 'Delimiter', "The delimiter char (could be ; , or similar)", 'string', '', ',', false, false, false, false, ''),
+        new PropertyMeta('ignoreFirstRecord', 'Ignore First Record', "Whether the first line is ignored for delimited files (for the column headers). Is by default true.", 'boolean', '', 'true', false, false, false, false, ''),
         new PropertyMeta('allowShortLines', 'Allow Short Lines', "Allows for lines to be shorter than expected and ignores the extra characters", 'boolean', '', 'false', false, false, false, false, ''),
         new PropertyMeta('ignoreExtraColumns', 'Ignore Extra Columns', "Allows for lines to be longer than expected and ignores the extra characters.", 'boolean', '', 'false', false, false, false, false, ''),
+        new PropertyMeta('textQualifier', 'Text Qualifier', "If the text is qualified with a character. Uses quote character by default.", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('parserFactoryRef', 'Parser Factory Ref', "References to a custom parser factory to lookup in the registry", 'string', '', '', false, false, false, false, 'advanced'),
         new PropertyMeta('id', 'Id', "The id of this node", 'string', '', '', false, false, false, false, ''),
     ]),
@@ -833,18 +834,17 @@ export const CamelModelMetadata: ElementMeta[] = [
         new PropertyMeta('ref', 'Ref', "Reference to the rest-dsl", 'string', '', '', true, false, false, false, ''),
     ]),
     new ElementMeta('restConfiguration', 'RestConfigurationDefinition', 'Rest Configuration', "To configure rest", 'rest', [
-        new PropertyMeta('component', 'Component', "The Camel Rest component to use for the REST transport (consumer), such as netty-http, jetty, servlet, undertow. If no component has been explicit configured, then Camel will lookup if there is a Camel component that integrates with the Rest DSL, or if a org.apache.camel.spi.RestConsumerFactory is registered in the registry. If either one is found, then that is being used.", 'string', '', '', false, false, false, false, ''),
-        new PropertyMeta('apiComponent', 'Api Component', "The name of the Camel component to use as the REST API. If no API Component has been explicit configured, then Camel will lookup if there is a Camel component responsible for servicing and generating the REST API documentation, or if a org.apache.camel.spi.RestApiProcessorFactory is registered in the registry. If either one is found, then that is being used.", 'string', '', '', false, false, false, false, 'consumer,advanced'),
-        new PropertyMeta('producerComponent', 'Producer Component', "Sets the name of the Camel component to use as the REST producer", 'string', '', '', false, false, false, false, 'producer,advanced'),
+        new PropertyMeta('component', 'Component', "The Camel Rest component to use for the REST transport (consumer), such as netty-http, jetty, servlet, undertow. If no component has been explicit configured, then Camel will lookup if there is a Camel component that integrates with the Rest DSL, or if a org.apache.camel.spi.RestConsumerFactory is registered in the registry. If either one is found, then that is being used.", 'string', 'platform-http, servlet, jetty, undertow, netty-http [...]
+        new PropertyMeta('apiComponent', 'Api Component', "The name of the Camel component to use as the REST API. If no API Component has been explicit configured, then Camel will lookup if there is a Camel component responsible for servicing and generating the REST API documentation, or if a org.apache.camel.spi.RestApiProcessorFactory is registered in the registry. If either one is found, then that is being used.", 'string', 'openapi, swagger', '', false, false, false, false, 'consume [...]
+        new PropertyMeta('producerComponent', 'Producer Component', "Sets the name of the Camel component to use as the REST producer", 'string', 'vertx-http, http, undertow, netty-http', '', false, false, false, false, 'producer,advanced'),
         new PropertyMeta('scheme', 'Scheme', "The scheme to use for exposing the REST service. Usually http or https is supported. The default value is http", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('host', 'Host', "The hostname to use for exposing the REST service.", 'string', '', '', false, false, false, false, ''),
         new PropertyMeta('port', 'Port', "The port number to use for exposing the REST service. Notice if you use servlet component then the port number configured here does not apply, as the port number in use is the actual port number the servlet component is using. eg if using Apache Tomcat its the tomcat http port, if using Apache Karaf its the HTTP service in Karaf that uses port 8181 by default etc. Though in those situations setting the port number here, allows tooling and JMX to  [...]
-        new PropertyMeta('apiHost', 'Api Host', "To use a specific hostname for the API documentation (such as swagger or openapi) This can be used to override the generated host with this configured hostname", 'string', '', '', false, false, false, false, ''),
+        new PropertyMeta('apiHost', 'Api Host', "To use a specific hostname for the API documentation (such as swagger or openapi) This can be used to override the generated host with this configured hostname", 'string', '', '', false, false, false, false, 'consumer,advanced'),
         new PropertyMeta('useXForwardHeaders', 'Use XForward Headers', "Whether to use X-Forward headers for Host and related setting. The default value is true.", 'boolean', '', 'true', false, false, false, false, 'consumer,advanced'),
         new PropertyMeta('producerApiDoc', 'Producer Api Doc', "Sets the location of the api document the REST producer will use to validate the REST uri and query parameters are valid accordingly to the api document. The location of the api document is loaded from classpath by default, but you can use file: or http: to refer to resources to load from file or http url.", 'string', '', '', false, false, false, false, 'producer,advanced'),
         new PropertyMeta('contextPath', 'Context Path', "Sets a leading context-path the REST services will be using. This can be used when using components such as camel-servlet where the deployed web application is deployed using a context-path. Or for components such as camel-jetty or camel-netty-http that includes a HTTP server.", 'string', '', '', false, false, false, false, 'consumer'),
         new PropertyMeta('apiContextPath', 'Api Context Path', "Sets a leading API context-path the REST API services will be using. This can be used when using components such as camel-servlet where the deployed web application is deployed using a context-path.", 'string', '', '', false, false, false, false, 'consumer'),
-        new PropertyMeta('apiContextRouteId', 'Api Context Route Id', "Sets the route id to use for the route that services the REST API. The route will by default use an auto assigned route id.", 'string', '', '', false, false, false, false, 'consumer'),
         new PropertyMeta('apiVendorExtension', 'Api Vendor Extension', "Whether vendor extension is enabled in the Rest APIs. If enabled then Camel will include additional information as vendor extension (eg keys starting with x-) such as route ids, class names etc. Not all 3rd party API gateways and tools supports vendor-extensions when importing your API docs.", 'boolean', '', 'false', false, false, false, false, 'consumer,advanced'),
         new PropertyMeta('hostNameResolver', 'Host Name Resolver', "If no hostname has been explicit configured, then this resolver is used to compute the hostname the REST service will be using.", 'string', 'all-local-ip, local-host-name, local-ip', 'allLocalIp', false, false, false, false, 'consumer,advanced'),
         new PropertyMeta('bindingMode', 'Binding Mode', "Sets the binding mode to use. The default value is off", 'string', 'off, auto, json, xml, json_xml', 'off', false, false, false, false, ''),
diff --git a/karavan-core/test/backward.spec.ts b/karavan-core/test/backward.spec.ts
new file mode 100644
index 0000000..bc79998
--- /dev/null
+++ b/karavan-core/test/backward.spec.ts
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {expect} from 'chai';
+import * as fs from 'fs';
+import 'mocha';
+import {CamelDefinitionYaml} from "../src/core/api/CamelDefinitionYaml";
+import {
+    ChoiceDefinition,
+    ExpressionDefinition,
+    FromDefinition,
+    LogDefinition,
+    OtherwiseDefinition,
+    SimpleExpression,
+    ToDefinition,
+    WhenDefinition
+} from "../src/core/model/CamelDefinition";
+import { RouteDefinition} from "../src/core/model/CamelDefinition";
+import {Integration} from "../src/core/model/IntegrationDefinition";
+
+describe('Backward for Camel version < 3.16.x', () => {
+
+    it('Object -> YAML', () => {
+        const i1 = Integration.createNew("test")
+
+        const when1 = new WhenDefinition({
+            expression: new ExpressionDefinition({simple: new SimpleExpression({expression:'${body} != null'})}),
+            steps: [new LogDefinition({logName: 'log11', message: "hello11"})]
+        })
+        const when2 = new WhenDefinition({
+            expression: new ExpressionDefinition({simple: '${body} == null'}),
+            steps: [new LogDefinition({logName: 'log22', message: "hello22"})]
+        })
+        const otherwise = new OtherwiseDefinition({steps: [new LogDefinition({logName: 'logX', message: "helloX"})]})
+        const choice = new ChoiceDefinition({when: [when1, when2], otherwise: otherwise})
+
+        const flow1 = new FromDefinition({uri: "direct1"});
+        flow1.steps?.push(choice);
+        flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
+        flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
+        flow1.parameters = {httpMethodRestrict: 'POST'}
+        i1.spec.flows?.push(new RouteDefinition({from: flow1}));
+
+        const flow2 = new FromDefinition({uri: "direct2"});
+        flow2.steps?.push(new LogDefinition({logName: 'log1', message: "hello1"}));
+        flow2.steps?.push(new LogDefinition({logName: 'log2', message: "hello2"}));
+
+        i1.spec.flows?.push(new RouteDefinition({from: flow2}));
+        const yaml1 = CamelDefinitionYaml.integrationToYaml(i1, true);
+        const yaml2 = fs.readFileSync('test/backward.yaml',{encoding:'utf8', flag:'r'});
+        expect(yaml1).to.equal(yaml2);
+    });
+
+    it('YAML -> Object', () => {
+        const yaml2 = fs.readFileSync('test/backward2.yaml',{encoding:'utf8', flag:'r'});
+        const i = CamelDefinitionYaml.yamlToIntegration("kafka2trinobatch.yaml", yaml2, true);
+        expect(i.spec.flows?.[0].from.steps.length).to.equal(2);
+    });
+
+
+});
\ No newline at end of file
diff --git a/karavan-core/test/backward.yaml b/karavan-core/test/backward.yaml
new file mode 100644
index 0000000..ac24364
--- /dev/null
+++ b/karavan-core/test/backward.yaml
@@ -0,0 +1,47 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: test
+spec:
+  flows:
+    - route:
+        steps:
+          - choice:
+              when:
+                - expression:
+                    simple:
+                      expression: ${body} != null
+                  steps:
+                    - log:
+                        message: hello11
+                        logName: log11
+                - expression:
+                    simple: ${body} == null
+                  steps:
+                    - log:
+                        message: hello22
+                        logName: log22
+              otherwise:
+                otherwise:
+                  steps:
+                    - log:
+                        message: helloX
+                        logName: logX
+          - to:
+              uri: kamelet:kamelet2
+          - to:
+              uri: kamelet:kamelet2
+        from:
+          uri: direct1
+          parameters:
+            httpMethodRestrict: POST
+    - route:
+        steps:
+          - log:
+              message: hello1
+              logName: log1
+          - log:
+              message: hello2
+              logName: log2
+        from:
+          uri: direct2
diff --git a/karavan-core/test/backward2.yaml b/karavan-core/test/backward2.yaml
new file mode 100644
index 0000000..3da42fe
--- /dev/null
+++ b/karavan-core/test/backward2.yaml
@@ -0,0 +1,32 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: kafka2trinobatch.yaml
+spec:
+  flows:
+    - route:
+        from:
+          uri: kafka:dynamic-pnc-logs
+        steps:
+          - log:
+              message: '"Processing ${body}'
+              loggingLevel: INFO
+          - aggregate:
+              steps:
+                - to:
+                    uri: >-
+                      sql:insert into iceberg.kafka.pnc_logs (message,
+                      timestamp) values (:#${body}, current_timestamp)
+                    parameters:
+                      batch: true
+                      useMessageBodyForSql: false
+              correlationExpression: {}
+              strategyRef: >-
+                #class:org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy
+              expression:
+                constant: {}
+              completionSize: 20
+              completionTimeout: '10000'
+  dependencies:
+    - mvn:io.trino:trino-jdbc:368
+    - mvn:org.apache.commons:commons-dbcp2:2.9.0
diff --git a/karavan-core/test/cloneDefinition.spec.ts b/karavan-core/test/cloneDefinition.spec.ts
index 707f28f..16ccc7e 100644
--- a/karavan-core/test/cloneDefinition.spec.ts
+++ b/karavan-core/test/cloneDefinition.spec.ts
@@ -24,6 +24,7 @@ import { FilterDefinition, LogDefinition, ChoiceDefinition,
 import {CamelDefinitionApi} from "../src/core/api/CamelDefinitionApi";
 import {ExpressionDefinition} from "../src/core/model/CamelDefinition";
 import {Integration, CamelElement} from "../src/core/model/IntegrationDefinition";
+import {RouteDefinition} from "../lib/model/CamelDefinition";
 
 describe('Clone', () => {
 
@@ -46,20 +47,20 @@ describe('Clone', () => {
         flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
         flow1.steps?.push(new ToDefinition({uri: 'kamelet:kamelet2'}));
         flow1.parameters = {httpMethodRestrict: 'POST'}
-        i1.spec.flows?.push(flow1);
+        i1.spec.flows?.push(new RouteDefinition({from: flow1}));
 
         const flow2 = new FromDefinition({uri: "direct2"});
         flow2.steps?.push(new LogDefinition({logName: 'log1', message: "hello1"}));
         flow2.steps?.push(new LogDefinition({logName: 'log2', message: "hello2"}));
 
-        i1.spec.flows?.push(flow2);
+        i1.spec.flows?.push(new RouteDefinition({from: flow2}));
         const i2 = cloneIntegration(i1);
 
         expect(i1.metadata.name).to.equal(i2.metadata.name);
         expect(i1.spec.flows?.length).to.equal(i2.spec.flows?.length);
         if (i1.spec.flows && i2.spec.flows){
-            const f1:FromDefinition = i1.spec.flows[0];
-            const f2:FromDefinition = i2.spec.flows[0];
+            const f1:FromDefinition = i1.spec.flows[0].from;
+            const f2:FromDefinition = i2.spec.flows[0].from;
             expect(f1.parameters?.httpMethodRestrict).to.equal(f2.parameters?.httpMethodRestrict);
             expect(f1.steps.length).to.equal(f2.steps.length);
 
diff --git a/karavan-core/test/dependencies.spec.ts b/karavan-core/test/dependencies.spec.ts
index 5cc8a86..d511b6e 100644
--- a/karavan-core/test/dependencies.spec.ts
+++ b/karavan-core/test/dependencies.spec.ts
@@ -81,7 +81,7 @@ describe('Read/write dependencies', () => {
             expect(i.spec.dependencies[0].version).to.equal("2.9.0");
         }
         i.crd = false
-        console.log(CamelDefinitionYaml.integrationToYaml(i))
+        // console.log(CamelDefinitionYaml.integrationToYaml(i))
     });
 
 });
\ No newline at end of file
diff --git a/karavan-core/test/expression.spec.ts b/karavan-core/test/expression.spec.ts
new file mode 100644
index 0000000..9d80b62
--- /dev/null
+++ b/karavan-core/test/expression.spec.ts
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import {expect} from 'chai';
+import * as fs from 'fs';
+import 'mocha';
+import {CamelDefinitionYaml} from "../src/core/api/CamelDefinitionYaml";
+import {
+    ChoiceDefinition,
+    ExpressionDefinition,
+    FromDefinition,
+    LogDefinition,
+    OtherwiseDefinition,
+    SimpleExpression,
+    ToDefinition,
+    WhenDefinition
+} from "../src/core/model/CamelDefinition";
+import { RouteDefinition} from "../src/core/model/CamelDefinition";
+import {Integration} from "../src/core/model/IntegrationDefinition";
+import {AggregateDefinition} from "../lib/model/CamelDefinition";
+
+describe('Expression to yaml', () => {
+
+    it('Aggregate Expression', () => {
+        const i1 = Integration.createNew("test")
+
+        const agg = new AggregateDefinition({
+            correlationExpression: new ExpressionDefinition({simple: new SimpleExpression({expression:'${body} != null'})}),
+            steps: [new LogDefinition({logName: 'log11', message: "hello11"})]
+        })
+
+        const flow1 = new FromDefinition({uri: "direct1"});
+        flow1.steps?.push(agg);
+        i1.spec.flows?.push(new RouteDefinition({from: flow1}));
+
+        const yaml1 = CamelDefinitionYaml.integrationToYaml(i1, false);
+        console.log(yaml1)
+    });
+
+});
\ No newline at end of file
diff --git a/karavan-demo/xxx-yaml.yaml b/karavan-demo/xxx-yaml.yaml
new file mode 100644
index 0000000..06fd7bb
--- /dev/null
+++ b/karavan-demo/xxx-yaml.yaml
@@ -0,0 +1,26 @@
+apiVersion: camel.apache.org/v1
+kind: Integration
+metadata:
+  name: xxx-yaml.yaml
+spec:
+  flows:
+    - route:
+        steps:
+          - log:
+              message: ${body}
+          - aggregate:
+              steps:
+                - log:
+                    message: Aggregated ${body}
+              aggregationStrategy: >-
+                #class:org.apache.camel.processor.aggregate.GroupedBodyAggregationStrategy
+              completionSize: 2
+              correlationExpression:
+                simple:
+                  expressionSubElement:
+                    expression: ${body}
+        from:
+          uri: kamelet:timer-source
+          parameters:
+            message: hello
+            period: 2000
diff --git a/karavan-designer/src/App.tsx b/karavan-designer/src/App.tsx
index e03b2c6..ca15b49 100644
--- a/karavan-designer/src/App.tsx
+++ b/karavan-designer/src/App.tsx
@@ -247,6 +247,7 @@ class App extends React.Component<Props, State> {
                                  onSave={(filename, yaml) => this.save(filename, yaml)}
                                  borderColor="#fb8824"
                                  borderColorSelected="#303284"
+                                 backward={true}
                                  dark={document.body.className.includes('vscode-dark')}
                 />
             </Page>
diff --git a/karavan-designer/src/designer/KaravanDesigner.tsx b/karavan-designer/src/designer/KaravanDesigner.tsx
index ad24ea3..d9fdb71 100644
--- a/karavan-designer/src/designer/KaravanDesigner.tsx
+++ b/karavan-designer/src/designer/KaravanDesigner.tsx
@@ -16,7 +16,7 @@
  */
 import React from 'react';
 import {
-    Badge,
+    Badge, Label,
     PageSection, Tab, Tabs, TabTitleIcon, TabTitleText, Tooltip,
 } from '@patternfly/react-core';
 import './karavan.css';
@@ -31,6 +31,7 @@ import {ErrorDesigner} from "./error/ErrorDesigner";
 import {TemplatesDesigner} from "./templates/TemplatesDesigner";
 import {ExceptionDesigner} from "./exception/ExceptionDesigner";
 import {DependenciesDesigner} from "./dependencies/DependenciesDesigner";
+import InfoCircleIcon from '@patternfly/react-icons/dist/esm/icons/info-circle-icon';
 
 interface Props {
     onSave?: (filename: string, yaml: string) => void
@@ -39,6 +40,7 @@ interface Props {
     borderColor: string
     borderColorSelected: string
     dark: boolean
+    backward?: boolean
 }
 
 interface State {
@@ -52,7 +54,7 @@ export class KaravanDesigner extends React.Component<Props, State> {
     public state: State = {
         tab: 'routes',
         integration: this.props.yaml
-            ? CamelDefinitionYaml.yamlToIntegration(this.props.filename, this.props.yaml)
+            ? CamelDefinitionYaml.yamlToIntegration(this.props.filename, this.props.yaml, this.props.backward)
             : Integration.createNew(this.props.filename),
         key: "",
     };
@@ -69,7 +71,7 @@ export class KaravanDesigner extends React.Component<Props, State> {
 
     getCode = (integration: Integration): string => {
         const clone = CamelUtil.cloneIntegration(integration);
-        return CamelDefinitionYaml.integrationToYaml(clone);
+        return CamelDefinitionYaml.integrationToYaml(clone, this.props.backward);
     }
 
     getTab(title: string, tooltip: string, icon: string) {
@@ -180,6 +182,7 @@ export class KaravanDesigner extends React.Component<Props, State> {
         const tab = this.state.tab;
         return (
             <PageSection className="page" isFilled padding={{default: 'noPadding'}}>
+                {this.props.backward && <Label className="backward" variant="outline" color="orange" isCompact={true} icon={<InfoCircleIcon />}>Backward</Label>}
                 <Tabs className="main-tabs" activeKey={tab} onSelect={(event, tabIndex) => this.setState({tab: tabIndex.toString()})} style={{width: "100%"}}>
                     <Tab eventKey='routes' title={this.getTab("Routes", "Integration flows", "routes")}></Tab>
                     <Tab eventKey='rest' title={this.getTab("REST", "REST services", "rest")}></Tab>
diff --git a/karavan-designer/src/designer/karavan.css b/karavan-designer/src/designer/karavan.css
index ee976b5..0396062 100644
--- a/karavan-designer/src/designer/karavan.css
+++ b/karavan-designer/src/designer/karavan.css
@@ -22,6 +22,13 @@
     height: 36px;
 }
 
+.karavan .backward {
+    position: absolute;
+    top: 10px;
+    right: 10px;
+    z-index: 100;
+}
+
 .karavan .header-button {
     margin-left: var(--pf-c-page__header-tools--MarginRight);
 }
diff --git a/karavan-vscode/package.json b/karavan-vscode/package.json
index 35d58c7..f2afd58 100644
--- a/karavan-vscode/package.json
+++ b/karavan-vscode/package.json
@@ -78,6 +78,11 @@
           "default": "true",
           "description": "Reload routes on change"
         },
+        "camel.backward": {
+          "type": "boolean",
+          "default": false,
+          "description": "Compatibility with Camel version < 3.16"
+        },
         "Karavan.kameletsPath": {
           "type": "string",
           "default": "",
diff --git a/karavan-vscode/src/extension.ts b/karavan-vscode/src/extension.ts
index cfc757e..14bf78a 100644
--- a/karavan-vscode/src/extension.ts
+++ b/karavan-vscode/src/extension.ts
@@ -119,6 +119,10 @@ function openKaravanWebView(context: vscode.ExtensionContext, webviewContent: st
         "icons/icon.svg"
     );
 
+    // Send backward compatibility
+    const backward = vscode.workspace.getConfiguration().get("camel.backward");
+    if (backward) panel.webview.postMessage({ command: 'backward'});
+
     // Read and send Kamelets
     panel.webview.postMessage({ command: 'kamelets', kamelets: readKamelets(context) });
 
diff --git a/karavan-vscode/webview/App.tsx b/karavan-vscode/webview/App.tsx
index 1c23036..bb3681a 100644
--- a/karavan-vscode/webview/App.tsx
+++ b/karavan-vscode/webview/App.tsx
@@ -32,6 +32,7 @@ interface State {
   relativePath: string
   yaml: string
   key: string
+  backward: boolean
 }
 
 class App extends React.Component<Props, State> {
@@ -40,7 +41,8 @@ class App extends React.Component<Props, State> {
     filename: '',
     relativePath: '',
     yaml: '',
-    key: ''
+    key: '',
+    backward: false
   };
 
 
@@ -48,6 +50,9 @@ class App extends React.Component<Props, State> {
     window.addEventListener('message', event => {
       const message = event.data; // The JSON data our extension sent
       switch (message.command) {
+        case 'backward':
+          this.setState({backward: true});
+          break;
         case 'kamelets':
           KameletApi.saveKamelets(message.kamelets);
           break;
@@ -78,6 +83,7 @@ class App extends React.Component<Props, State> {
       <Page className="karavan">
          <KaravanDesigner 
           key={this.state.key} 
+          backward={this.state.backward}
           filename={this.state.filename} 
           yaml={this.state.yaml} 
           onSave={(filename, yaml) => this.save(filename, yaml)}