You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ig...@apache.org on 2020/10/15 14:43:07 UTC

[camel] branch master updated: CAMEL-15689 - Add camel-atlasmap component (#4447)

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

igarashitm pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new c09aedb  CAMEL-15689 - Add camel-atlasmap component (#4447)
c09aedb is described below

commit c09aedb78c5f34e80d0d0f4e2ff846e53516fc69
Author: Tomohisa Igarashi <tm...@gmail.com>
AuthorDate: Thu Oct 15 10:42:55 2020 -0400

    CAMEL-15689 - Add camel-atlasmap component (#4447)
---
 bom/camel-bom/pom.xml                              |   5 +
 camel-dependencies/pom.xml                         |   1 +
 .../org/apache/camel/catalog/components.properties |   1 +
 .../apache/camel/catalog/components/atlasmap.json  |  41 ++
 .../org/apache/camel/catalog/docs.properties       |   1 +
 .../camel/catalog/docs/atlasmap-component.adoc     | 116 ++++++
 components/camel-atlasmap/pom.xml                  | 134 +++++++
 .../atlasmap/AtlasMapComponentConfigurer.java      |  60 +++
 .../atlasmap/AtlasMapEndpointConfigurer.java       |  89 +++++
 .../atlasmap/AtlasMapEndpointUriFactory.java       |  70 ++++
 .../services/org/apache/camel/component.properties |   7 +
 .../services/org/apache/camel/component/atlasmap   |   2 +
 .../org/apache/camel/configurer/atlasmap-component |   2 +
 .../org/apache/camel/configurer/atlasmap-endpoint  |   2 +
 .../org/apache/camel/urifactory/atlasmap-endpoint  |   2 +
 .../apache/camel/component/atlasmap/atlasmap.json  |  41 ++
 .../src/main/docs/atlasmap-component.adoc          | 116 ++++++
 .../component/atlasmap/AtlasMapComponent.java      |  78 ++++
 .../component/atlasmap/AtlasMapConstants.java      |  32 ++
 .../camel/component/atlasmap/AtlasMapEndpoint.java | 444 +++++++++++++++++++++
 .../atlasmap/CamelAtlasPropertyStrategy.java       |  92 +++++
 .../component/atlasmap/AtlasMapEndpointTest.java   | 200 ++++++++++
 .../atlasmap/AtlasMapExtractMappingsTest.java      |  71 ++++
 .../component/atlasmap/AtlasMapJavaToJsonTest.java |  59 +++
 .../camel/component/atlasmap/AtlasMapJsonTest.java |  56 +++
 .../component/atlasmap/AtlasMapJsonToJavaTest.java |  50 +++
 .../atlasmap/AtlasMapJsonToXmlSchemaTest.java      |  67 ++++
 .../component/atlasmap/AtlasMapMultiDocsTest.java  | 190 +++++++++
 .../component/atlasmap/AtlasMapMultiNSTest.java    |  71 ++++
 .../component/atlasmap/AtlasMapSingleDocTest.java  |  59 +++
 .../camel/component/atlasmap/AtlasMapTest.java     |  81 ++++
 .../atlasmap/AtlasMapXmlToXmlDefaultNsTest.java    |  64 +++
 .../component/atlasmap/AtlasMapXmlToXmlTest.java   |  66 +++
 .../atlasmap/CamelAtlasPropertyStrategyTest.java   |  90 +++++
 .../org/apache/camel/component/atlasmap/Pojo.java  |  31 ++
 .../org/apache/camel/component/atlasmap/Util.java  |  40 ++
 .../src/test/resources/adm/atlasmap-mapping-n.adm  | Bin 0 -> 5416 bytes
 .../src/test/resources/adm/atlasmap-mapping.adm    | Bin 0 -> 5235 bytes
 .../json-schema-source-to-xml-schema-target.adm    | Bin 0 -> 2237 bytes
 .../atlasmapping-java-to-json.json                 |  56 +++
 .../atlasmapping-json-to-java.json                 |  56 +++
 .../atlasmapping-json/atlasmapping-multidocs.json  | 255 ++++++++++++
 .../atlasmapping-json/atlasmapping-multins.json    |  52 +++
 .../atlasmapping-json/atlasmapping-singledoc.json  |  65 +++
 .../atlasmapping-json/atlasmapping-xml-to-xml.json |  66 +++
 .../resources/atlasmapping-json/atlasmapping.json  |  95 +++++
 .../AtlasMapExtractMappingsTest-context.xml        |  39 ++
 .../context/AtlasMapJavaToJsonTest-context.xml     |  34 ++
 .../resources/context/AtlasMapJsonTest-context.xml |  34 ++
 .../context/AtlasMapJsonToJavaTest-context.xml     |  34 ++
 .../AtlasMapJsonToXmlSchemaTest-context.xml        |  34 ++
 .../context/AtlasMapMultiDocsTest-context.xml      |  49 +++
 .../context/AtlasMapMultiNSTest-context.xml        |  34 ++
 .../context/AtlasMapSingleDocTest-context.xml      |  34 ++
 .../resources/context/AtlasMapTest-context.xml     |  34 ++
 .../context/AtlasMapXmlToXmlTest-context.xml       |  34 ++
 .../src/test/resources/json-source.json            |  47 +++
 .../src/test/resources/log4j2.properties           |  28 ++
 .../src/test/resources/xml-target-schemaset.xml    |  98 +++++
 components/pom.xml                                 |   1 +
 core/camel-allcomponents/pom.xml                   |   4 +
 .../component/ComponentsBuilderFactory.java        |  11 +
 .../dsl/AtlasmapComponentBuilderFactory.java       | 124 ++++++
 .../src/generated/resources/metadata.json          |  22 +
 .../builder/endpoint/EndpointBuilderFactory.java   |   1 +
 .../camel/builder/endpoint/EndpointBuilders.java   |   1 +
 .../builder/endpoint/StaticEndpointBuilders.java   |  49 +++
 .../dsl/AtlasMapEndpointBuilderFactory.java        | 358 +++++++++++++++++
 docs/components/modules/ROOT/nav.adoc              |   1 +
 .../modules/ROOT/pages/atlasmap-component.adoc     | 118 ++++++
 parent/pom.xml                                     |   6 +
 71 files changed, 4405 insertions(+)

diff --git a/bom/camel-bom/pom.xml b/bom/camel-bom/pom.xml
index cc1539a..68af4c7 100644
--- a/bom/camel-bom/pom.xml
+++ b/bom/camel-bom/pom.xml
@@ -98,6 +98,11 @@
       </dependency>
       <dependency>
         <groupId>org.apache.camel</groupId>
+        <artifactId>camel-atlasmap</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.camel</groupId>
         <artifactId>camel-atmos</artifactId>
         <version>${project.version}</version>
       </dependency>
diff --git a/camel-dependencies/pom.xml b/camel-dependencies/pom.xml
index 9ac4897..d5a1822 100644
--- a/camel-dependencies/pom.xml
+++ b/camel-dependencies/pom.xml
@@ -58,6 +58,7 @@
     <aspectj-version>1.9.6</aspectj-version>
     <assertj-version>3.17.2</assertj-version>
     <asterisk-java-version>1.0.0-final</asterisk-java-version>
+    <atlasmap-version>2.1.0</atlasmap-version>
     <atlassian-fugue-version>3.0.0</atlassian-fugue-version>
     <atmos-client-version>3.1.0</atmos-client-version>
     <atmosphere-version>2.6.1</atmosphere-version>
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
index 09c54a2..aaf039c 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components.properties
@@ -7,6 +7,7 @@ apns
 arangodb
 as2
 asterisk
+atlasmap
 atmos
 atmosphere-websocket
 atom
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/atlasmap.json b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/atlasmap.json
new file mode 100644
index 0000000..309ad2a
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/atlasmap.json
@@ -0,0 +1,41 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "atlasmap",
+    "title": "AtlasMap",
+    "description": "Transforms the message using an AtlasMap transformation.",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "label": "transformation",
+    "javaType": "org.apache.camel.component.atlasmap.AtlasMapComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-atlasmap",
+    "version": "3.6.0-SNAPSHOT",
+    "scheme": "atlasmap",
+    "extendsScheme": "",
+    "syntax": "atlasmap:resourceUri",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the r [...]
+    "atlasContextFactory": { "kind": "property", "displayName": "Atlas Context Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "io.atlasmap.api.AtlasContextFactory", "deprecated": false, "secret": false, "description": "To use the AtlasContextFactory otherwise a new engine is created." },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": true, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" }
+  },
+  "properties": {
+    "resourceUri": { "kind": "path", "displayName": "Resource Uri", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will call a method on a  [...]
+    "allowContextMapAll": { "kind": "parameter", "displayName": "Allow Context Map All", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. Doing so impose a p [...]
+    "contentCache": { "kind": "parameter", "displayName": "Content Cache", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether to use resource content cache or not" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the  [...]
+    "sourceMapName": { "kind": "parameter", "displayName": "Source Map Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The Exchange property name for a source message map which hold java.util.Map&lt;String, Message&gt; where the key is AtlasMap Document ID. AtlasMap consumes Message bodies as source documents, as well as message headers as source properties where the scope  [...]
+    "targetMapMode": { "kind": "parameter", "displayName": "Target Map Mode", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.atlasmap.AtlasMapEndpoint.TargetMapMode", "enum": [ "MAP", "MESSAGE_HEADER", "EXCHANGE_PROPERTY" ], "deprecated": false, "secret": false, "defaultValue": "MAP", "description": "TargetMapMode enum value to specify how multiple target documents are delivered if exist. 'MAP': Stores them into a java.util. [...]
+    "targetMapName": { "kind": "parameter", "displayName": "Target Map Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The Exchange property name for a target document map which hold java.util.Map&lt;String, Object&gt; where the key is AtlasMap Document ID. AtlasMap populates multiple target documents into this map." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "propertiesFile": { "kind": "parameter", "displayName": "Properties File", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The URI of the properties file which is used for AtlasContextFactory initialization." },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }
+  }
+}
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
index adb36cf..1020490 100644
--- a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs.properties
@@ -9,6 +9,7 @@ arangodb-component
 as2-component
 asn1-dataformat
 asterisk-component
+atlasmap-component
 atmos-component
 atmosphere-websocket-component
 atom-component
diff --git a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/atlasmap-component.adoc b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/atlasmap-component.adoc
new file mode 100644
index 0000000..da68e9d
--- /dev/null
+++ b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/docs/atlasmap-component.adoc
@@ -0,0 +1,116 @@
+[[atlasmap-component]]
+= AtlasMap Component
+:docTitle: AtlasMap
+:artifactId: camel-atlasmap
+:description: Transforms the message using an AtlasMap transformation.
+:since: 3.7
+:supportLevel: Preview
+:component-header: Only producer is supported
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/components/atlasmap.adoc[]
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The AtlasMap component allows you to process data mapping using an
+http://www.atlasmap.io/[AtlasMap] data mapping definition. It could be
+either an ADM archive file or mapping definition JSON file.
+
+Maven users will need to add the following dependency to their `pom.xml`
+for this component:
+
+[source,xml]
+------------------------------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-atlasmap</artifactId>
+    <version>x.x.x</version>
+    <!-- use the same version as your Camel core version -->
+</dependency>
+------------------------------------------------------------
+
+== URI format
+
+[source,java]
+---------------------------
+atlasmap:mappingName[?options]
+---------------------------
+
+Where *mappingName* is the classpath-local URI of the AtlasMap
+mapping definition, either ADM archive file or mapping definition JSON file
+ to process.
+
+== Options
+
+
+// component options: START
+The AtlasMap component supports 3 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *atlasContextFactory* (advanced) | To use the AtlasContextFactory otherwise a new engine is created. |  | AtlasContextFactory
+| *basicPropertyBinding* (advanced) | *Deprecated* Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+|===
+// component options: END
+
+
+
+
+// endpoint options: START
+The AtlasMap endpoint is configured using URI syntax:
+
+----
+atlasmap:resourceUri
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *resourceUri* | *Required* Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will call a method on a bean to be used as the resource. For bean you can specify the method name after dot, eg bean:myBean.myMethod. |  | String
+|===
+
+
+=== Query Parameters (9 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *allowContextMapAll* (producer) | Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. Doing so impose a potential security risk as this opens access to the full power of CamelContext API. | false | boolean
+| *contentCache* (producer) | Sets whether to use resource content cache or not | false | boolean
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *sourceMapName* (producer) | The Exchange property name for a source message map which hold java.util.Map&lt;String, Message&gt; where the key is AtlasMap Document ID. AtlasMap consumes Message bodies as source documents, as well as message headers as source properties where the scope equals to Document ID. |  | String
+| *targetMapMode* (producer) | TargetMapMode enum value to specify how multiple target documents are delivered if exist. 'MAP': Stores them into a java.util.Map, and the java.util.Map is set to an exchange property if 'targetMapName' is specified, otherwise message body. 'MESSAGE_HEADER': Stores them into message headers. 'EXCHANGE_PROPERTY': Stores them into exchange properties. ). There are 3 enums and the value can be one of: MAP, MESSAGE_HEADER, EXCHANGE_PROPERTY | MAP | TargetMapMode
+| *targetMapName* (producer) | The Exchange property name for a target document map which hold java.util.Map&lt;String, Object&gt; where the key is AtlasMap Document ID. AtlasMap populates multiple target documents into this map. |  | String
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *propertiesFile* (advanced) | The URI of the properties file which is used for AtlasContextFactory initialization. |  | String
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+|===
+// endpoint options: END
+
+
+
+
+== Samples
+
+For example you could use something like
+
+[source,java]
+--------------------------------------
+from("activemq:My.Queue").
+  to("atlasmap:atlasmap-mapping.adm");
+--------------------------------------
+
+where you can export an ADM archive file from AtlasMap Data Mapper UI.
+
+
+include::camel-spring-boot::page$atlasmap-starter.adoc[]
diff --git a/components/camel-atlasmap/pom.xml b/components/camel-atlasmap/pom.xml
new file mode 100644
index 0000000..e3cf2b0
--- /dev/null
+++ b/components/camel-atlasmap/pom.xml
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.camel</groupId>
+        <artifactId>components</artifactId>
+        <version>3.6.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>camel-atlasmap</artifactId>
+    <packaging>jar</packaging>
+    <name>Camel :: AtlasMap</name>
+    <description>Camel AtlasMap support</description>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-support</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-mock</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-api</artifactId>
+            <version>${atlasmap-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-core</artifactId>
+            <version>${atlasmap-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-java-module</artifactId>
+            <version>${atlasmap-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-json-module</artifactId>
+            <version>${atlasmap-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-xml-module</artifactId>
+            <version>${atlasmap-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-csv-module</artifactId>
+            <version>${atlasmap-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-dfdl-module</artifactId>
+            <version>${atlasmap-version}</version>
+        </dependency>
+
+        <!-- test dependencies -->
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-java-test-model</artifactId>
+            <version>${atlasmap-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-xml-test-model</artifactId>
+            <version>${atlasmap-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>io.atlasmap</groupId>
+            <artifactId>atlas-xml-core</artifactId>
+            <version>${atlasmap-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-test-spring-junit5</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-junit-jupiter</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.logging.log4j</groupId>
+            <artifactId>log4j-slf4j-impl</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.twitter4j</groupId>
+            <artifactId>twitter4j-core</artifactId>
+            <version>${twitter4j-version}</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.xmlunit</groupId>
+            <artifactId>xmlunit-core</artifactId>
+            <version>${xmlunit-version}</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapComponentConfigurer.java b/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapComponentConfigurer.java
new file mode 100644
index 0000000..7e1a86b
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapComponentConfigurer.java
@@ -0,0 +1,60 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atlasmap;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtlasMapComponentConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    private static final Map<String, Object> ALL_OPTIONS;
+    static {
+        Map<String, Object> map = new CaseInsensitiveMap();
+        map.put("lazyStartProducer", boolean.class);
+        map.put("atlasContextFactory", io.atlasmap.api.AtlasContextFactory.class);
+        map.put("basicPropertyBinding", boolean.class);
+        ALL_OPTIONS = map;
+    }
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        AtlasMapComponent target = (AtlasMapComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "atlascontextfactory":
+        case "atlasContextFactory": target.setAtlasContextFactory(property(camelContext, io.atlasmap.api.AtlasContextFactory.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        return ALL_OPTIONS;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        AtlasMapComponent target = (AtlasMapComponent) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "atlascontextfactory":
+        case "atlasContextFactory": return target.getAtlasContextFactory();
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapEndpointConfigurer.java b/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapEndpointConfigurer.java
new file mode 100644
index 0000000..cafdca5
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapEndpointConfigurer.java
@@ -0,0 +1,89 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atlasmap;
+
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.spi.GeneratedPropertyConfigurer;
+import org.apache.camel.spi.PropertyConfigurerGetter;
+import org.apache.camel.util.CaseInsensitiveMap;
+import org.apache.camel.support.component.PropertyConfigurerSupport;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@SuppressWarnings("unchecked")
+public class AtlasMapEndpointConfigurer extends PropertyConfigurerSupport implements GeneratedPropertyConfigurer, PropertyConfigurerGetter {
+
+    private static final Map<String, Object> ALL_OPTIONS;
+    static {
+        Map<String, Object> map = new CaseInsensitiveMap();
+        map.put("resourceUri", java.lang.String.class);
+        map.put("allowContextMapAll", boolean.class);
+        map.put("contentCache", boolean.class);
+        map.put("lazyStartProducer", boolean.class);
+        map.put("sourceMapName", java.lang.String.class);
+        map.put("targetMapMode", org.apache.camel.component.atlasmap.AtlasMapEndpoint.TargetMapMode.class);
+        map.put("targetMapName", java.lang.String.class);
+        map.put("basicPropertyBinding", boolean.class);
+        map.put("propertiesFile", java.lang.String.class);
+        map.put("synchronous", boolean.class);
+        ALL_OPTIONS = map;
+    }
+
+    @Override
+    public boolean configure(CamelContext camelContext, Object obj, String name, Object value, boolean ignoreCase) {
+        AtlasMapEndpoint target = (AtlasMapEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "allowcontextmapall":
+        case "allowContextMapAll": target.setAllowContextMapAll(property(camelContext, boolean.class, value)); return true;
+        case "basicpropertybinding":
+        case "basicPropertyBinding": target.setBasicPropertyBinding(property(camelContext, boolean.class, value)); return true;
+        case "contentcache":
+        case "contentCache": target.setContentCache(property(camelContext, boolean.class, value)); return true;
+        case "lazystartproducer":
+        case "lazyStartProducer": target.setLazyStartProducer(property(camelContext, boolean.class, value)); return true;
+        case "propertiesfile":
+        case "propertiesFile": target.setPropertiesFile(property(camelContext, java.lang.String.class, value)); return true;
+        case "sourcemapname":
+        case "sourceMapName": target.setSourceMapName(property(camelContext, java.lang.String.class, value)); return true;
+        case "synchronous": target.setSynchronous(property(camelContext, boolean.class, value)); return true;
+        case "targetmapmode":
+        case "targetMapMode": target.setTargetMapMode(property(camelContext, org.apache.camel.component.atlasmap.AtlasMapEndpoint.TargetMapMode.class, value)); return true;
+        case "targetmapname":
+        case "targetMapName": target.setTargetMapName(property(camelContext, java.lang.String.class, value)); return true;
+        default: return false;
+        }
+    }
+
+    @Override
+    public Map<String, Object> getAllOptions(Object target) {
+        return ALL_OPTIONS;
+    }
+
+    @Override
+    public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
+        AtlasMapEndpoint target = (AtlasMapEndpoint) obj;
+        switch (ignoreCase ? name.toLowerCase() : name) {
+        case "allowcontextmapall":
+        case "allowContextMapAll": return target.isAllowContextMapAll();
+        case "basicpropertybinding":
+        case "basicPropertyBinding": return target.isBasicPropertyBinding();
+        case "contentcache":
+        case "contentCache": return target.isContentCache();
+        case "lazystartproducer":
+        case "lazyStartProducer": return target.isLazyStartProducer();
+        case "propertiesfile":
+        case "propertiesFile": return target.getPropertiesFile();
+        case "sourcemapname":
+        case "sourceMapName": return target.getSourceMapName();
+        case "synchronous": return target.isSynchronous();
+        case "targetmapmode":
+        case "targetMapMode": return target.getTargetMapMode();
+        case "targetmapname":
+        case "targetMapName": return target.getTargetMapName();
+        default: return null;
+        }
+    }
+}
+
diff --git a/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapEndpointUriFactory.java b/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapEndpointUriFactory.java
new file mode 100644
index 0000000..f1e30b7
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/java/org/apache/camel/component/atlasmap/AtlasMapEndpointUriFactory.java
@@ -0,0 +1,70 @@
+/* Generated by camel build tools - do NOT edit this file! */
+package org.apache.camel.component.atlasmap;
+
+import java.net.URISyntaxException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.camel.spi.EndpointUriFactory;
+
+/**
+ * Generated by camel build tools - do NOT edit this file!
+ */
+public class AtlasMapEndpointUriFactory extends org.apache.camel.support.component.EndpointUriFactorySupport implements EndpointUriFactory {
+
+    private static final String BASE = ":resourceUri";
+
+    private static final Set<String> PROPERTY_NAMES;
+    private static final Set<String> SECRET_PROPERTY_NAMES;
+    static {
+        Set<String> props = new HashSet<>(10);
+        props.add("basicPropertyBinding");
+        props.add("propertiesFile");
+        props.add("targetMapMode");
+        props.add("lazyStartProducer");
+        props.add("sourceMapName");
+        props.add("synchronous");
+        props.add("contentCache");
+        props.add("allowContextMapAll");
+        props.add("targetMapName");
+        props.add("resourceUri");
+        PROPERTY_NAMES = Collections.unmodifiableSet(props);
+        SECRET_PROPERTY_NAMES = Collections.emptySet();
+    }
+
+    @Override
+    public boolean isEnabled(String scheme) {
+        return "atlasmap".equals(scheme);
+    }
+
+    @Override
+    public String buildUri(String scheme, Map<String, Object> properties) throws URISyntaxException {
+        String syntax = scheme + BASE;
+        String uri = syntax;
+
+        Map<String, Object> copy = new HashMap<>(properties);
+
+        uri = buildPathParameter(syntax, uri, "resourceUri", null, true, copy);
+        uri = buildQueryParameters(uri, copy);
+        return uri;
+    }
+
+    @Override
+    public Set<String> propertyNames() {
+        return PROPERTY_NAMES;
+    }
+
+    @Override
+    public Set<String> secretPropertyNames() {
+        return SECRET_PROPERTY_NAMES;
+    }
+
+    @Override
+    public boolean isLenientProperties() {
+        return false;
+    }
+}
+
diff --git a/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/component.properties b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/component.properties
new file mode 100644
index 0000000..ee127d4
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/component.properties
@@ -0,0 +1,7 @@
+# Generated by camel build tools - do NOT edit this file!
+components=atlasmap
+groupId=org.apache.camel
+artifactId=camel-atlasmap
+version=3.6.0-SNAPSHOT
+projectName=Camel :: AtlasMap
+projectDescription=Camel AtlasMap support
diff --git a/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/component/atlasmap b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/component/atlasmap
new file mode 100644
index 0000000..406d04c
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/component/atlasmap
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atlasmap.AtlasMapComponent
diff --git a/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/configurer/atlasmap-component b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/configurer/atlasmap-component
new file mode 100644
index 0000000..efa1c2a
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/configurer/atlasmap-component
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atlasmap.AtlasMapComponentConfigurer
diff --git a/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/configurer/atlasmap-endpoint b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/configurer/atlasmap-endpoint
new file mode 100644
index 0000000..453e071
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/configurer/atlasmap-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atlasmap.AtlasMapEndpointConfigurer
diff --git a/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/urifactory/atlasmap-endpoint b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/urifactory/atlasmap-endpoint
new file mode 100644
index 0000000..bbe5046
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/resources/META-INF/services/org/apache/camel/urifactory/atlasmap-endpoint
@@ -0,0 +1,2 @@
+# Generated by camel build tools - do NOT edit this file!
+class=org.apache.camel.component.atlasmap.AtlasMapEndpointUriFactory
diff --git a/components/camel-atlasmap/src/generated/resources/org/apache/camel/component/atlasmap/atlasmap.json b/components/camel-atlasmap/src/generated/resources/org/apache/camel/component/atlasmap/atlasmap.json
new file mode 100644
index 0000000..309ad2a
--- /dev/null
+++ b/components/camel-atlasmap/src/generated/resources/org/apache/camel/component/atlasmap/atlasmap.json
@@ -0,0 +1,41 @@
+{
+  "component": {
+    "kind": "component",
+    "name": "atlasmap",
+    "title": "AtlasMap",
+    "description": "Transforms the message using an AtlasMap transformation.",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "label": "transformation",
+    "javaType": "org.apache.camel.component.atlasmap.AtlasMapComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-atlasmap",
+    "version": "3.6.0-SNAPSHOT",
+    "scheme": "atlasmap",
+    "extendsScheme": "",
+    "syntax": "atlasmap:resourceUri",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false
+  },
+  "componentProperties": {
+    "lazyStartProducer": { "kind": "property", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the r [...]
+    "atlasContextFactory": { "kind": "property", "displayName": "Atlas Context Factory", "group": "advanced", "label": "advanced", "required": false, "type": "object", "javaType": "io.atlasmap.api.AtlasContextFactory", "deprecated": false, "secret": false, "description": "To use the AtlasContextFactory otherwise a new engine is created." },
+    "basicPropertyBinding": { "kind": "property", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": true, "secret": false, "defaultValue": false, "description": "Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" }
+  },
+  "properties": {
+    "resourceUri": { "kind": "path", "displayName": "Resource Uri", "group": "producer", "label": "", "required": true, "type": "string", "javaType": "java.lang.String", "deprecated": false, "deprecationNote": "", "secret": false, "description": "Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will call a method on a  [...]
+    "allowContextMapAll": { "kind": "parameter", "displayName": "Allow Context Map All", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. Doing so impose a p [...]
+    "contentCache": { "kind": "parameter", "displayName": "Content Cache", "group": "producer", "label": "", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether to use resource content cache or not" },
+    "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer", "label": "producer", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the  [...]
+    "sourceMapName": { "kind": "parameter", "displayName": "Source Map Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The Exchange property name for a source message map which hold java.util.Map&lt;String, Message&gt; where the key is AtlasMap Document ID. AtlasMap consumes Message bodies as source documents, as well as message headers as source properties where the scope  [...]
+    "targetMapMode": { "kind": "parameter", "displayName": "Target Map Mode", "group": "producer", "label": "", "required": false, "type": "object", "javaType": "org.apache.camel.component.atlasmap.AtlasMapEndpoint.TargetMapMode", "enum": [ "MAP", "MESSAGE_HEADER", "EXCHANGE_PROPERTY" ], "deprecated": false, "secret": false, "defaultValue": "MAP", "description": "TargetMapMode enum value to specify how multiple target documents are delivered if exist. 'MAP': Stores them into a java.util. [...]
+    "targetMapName": { "kind": "parameter", "displayName": "Target Map Name", "group": "producer", "label": "", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The Exchange property name for a target document map which hold java.util.Map&lt;String, Object&gt; where the key is AtlasMap Document ID. AtlasMap populates multiple target documents into this map." },
+    "basicPropertyBinding": { "kind": "parameter", "displayName": "Basic Property Binding", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities" },
+    "propertiesFile": { "kind": "parameter", "displayName": "Properties File", "group": "advanced", "label": "advanced", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "secret": false, "description": "The URI of the properties file which is used for AtlasContextFactory initialization." },
+    "synchronous": { "kind": "parameter", "displayName": "Synchronous", "group": "advanced", "label": "advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "secret": false, "defaultValue": false, "description": "Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported)." }
+  }
+}
diff --git a/components/camel-atlasmap/src/main/docs/atlasmap-component.adoc b/components/camel-atlasmap/src/main/docs/atlasmap-component.adoc
new file mode 100644
index 0000000..da68e9d
--- /dev/null
+++ b/components/camel-atlasmap/src/main/docs/atlasmap-component.adoc
@@ -0,0 +1,116 @@
+[[atlasmap-component]]
+= AtlasMap Component
+:docTitle: AtlasMap
+:artifactId: camel-atlasmap
+:description: Transforms the message using an AtlasMap transformation.
+:since: 3.7
+:supportLevel: Preview
+:component-header: Only producer is supported
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/components/atlasmap.adoc[]
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The AtlasMap component allows you to process data mapping using an
+http://www.atlasmap.io/[AtlasMap] data mapping definition. It could be
+either an ADM archive file or mapping definition JSON file.
+
+Maven users will need to add the following dependency to their `pom.xml`
+for this component:
+
+[source,xml]
+------------------------------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-atlasmap</artifactId>
+    <version>x.x.x</version>
+    <!-- use the same version as your Camel core version -->
+</dependency>
+------------------------------------------------------------
+
+== URI format
+
+[source,java]
+---------------------------
+atlasmap:mappingName[?options]
+---------------------------
+
+Where *mappingName* is the classpath-local URI of the AtlasMap
+mapping definition, either ADM archive file or mapping definition JSON file
+ to process.
+
+== Options
+
+
+// component options: START
+The AtlasMap component supports 3 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *atlasContextFactory* (advanced) | To use the AtlasContextFactory otherwise a new engine is created. |  | AtlasContextFactory
+| *basicPropertyBinding* (advanced) | *Deprecated* Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+|===
+// component options: END
+
+
+
+
+// endpoint options: START
+The AtlasMap endpoint is configured using URI syntax:
+
+----
+atlasmap:resourceUri
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *resourceUri* | *Required* Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will call a method on a bean to be used as the resource. For bean you can specify the method name after dot, eg bean:myBean.myMethod. |  | String
+|===
+
+
+=== Query Parameters (9 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *allowContextMapAll* (producer) | Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. Doing so impose a potential security risk as this opens access to the full power of CamelContext API. | false | boolean
+| *contentCache* (producer) | Sets whether to use resource content cache or not | false | boolean
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *sourceMapName* (producer) | The Exchange property name for a source message map which hold java.util.Map&lt;String, Message&gt; where the key is AtlasMap Document ID. AtlasMap consumes Message bodies as source documents, as well as message headers as source properties where the scope equals to Document ID. |  | String
+| *targetMapMode* (producer) | TargetMapMode enum value to specify how multiple target documents are delivered if exist. 'MAP': Stores them into a java.util.Map, and the java.util.Map is set to an exchange property if 'targetMapName' is specified, otherwise message body. 'MESSAGE_HEADER': Stores them into message headers. 'EXCHANGE_PROPERTY': Stores them into exchange properties. ). There are 3 enums and the value can be one of: MAP, MESSAGE_HEADER, EXCHANGE_PROPERTY | MAP | TargetMapMode
+| *targetMapName* (producer) | The Exchange property name for a target document map which hold java.util.Map&lt;String, Object&gt; where the key is AtlasMap Document ID. AtlasMap populates multiple target documents into this map. |  | String
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *propertiesFile* (advanced) | The URI of the properties file which is used for AtlasContextFactory initialization. |  | String
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+|===
+// endpoint options: END
+
+
+
+
+== Samples
+
+For example you could use something like
+
+[source,java]
+--------------------------------------
+from("activemq:My.Queue").
+  to("atlasmap:atlasmap-mapping.adm");
+--------------------------------------
+
+where you can export an ADM archive file from AtlasMap Data Mapper UI.
+
+
+include::camel-spring-boot::page$atlasmap-starter.adoc[]
diff --git a/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapComponent.java b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapComponent.java
new file mode 100644
index 0000000..85ef957
--- /dev/null
+++ b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapComponent.java
@@ -0,0 +1,78 @@
+/*
+ * 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.
+ */
+
+package org.apache.camel.component.atlasmap;
+
+import java.util.Map;
+
+import io.atlasmap.api.AtlasContextFactory;
+import org.apache.camel.Endpoint;
+import org.apache.camel.component.atlasmap.AtlasMapEndpoint.TargetMapMode;
+import org.apache.camel.spi.Metadata;
+import org.apache.camel.spi.annotations.Component;
+import org.apache.camel.support.DefaultComponent;
+import org.apache.camel.support.ResourceHelper;
+
+/**
+ * The <a href="http://camel.apache.org/atlasmap-component.html">AtlasMap Component</a> is for working with AtlasMap
+ * Data Mapper.
+ */
+@Component("atlasmap")
+public class AtlasMapComponent extends DefaultComponent {
+
+    @Metadata(label = "advanced")
+    private AtlasContextFactory atlasContextFactory;
+
+    public AtlasContextFactory getAtlasContextFactory() {
+        return atlasContextFactory;
+    }
+
+    /**
+     * To use the {@link AtlasContextFactory} otherwise a new engine is created.
+     * 
+     * @param atlasContextFactory {@link AtlasContextFactory}
+     */
+    public void setAtlasContextFactory(AtlasContextFactory atlasContextFactory) {
+        this.atlasContextFactory = atlasContextFactory;
+    }
+
+    protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
+        boolean cache = getAndRemoveParameter(parameters, "contentCache", Boolean.class, Boolean.TRUE);
+        String sourceMapName = getAndRemoveParameter(parameters, "sourceMapName", String.class);
+        String targetMapName = getAndRemoveParameter(parameters, "targetMapName", String.class);
+        TargetMapMode targetMapMode = getAndRemoveParameter(parameters, "targetMapMode", TargetMapMode.class);
+
+        AtlasMapEndpoint endpoint = new AtlasMapEndpoint(uri, this, remaining);
+        setProperties(endpoint, parameters);
+        endpoint.setContentCache(cache);
+        endpoint.setSourceMapName(sourceMapName);
+        endpoint.setTargetMapName(targetMapName);
+        endpoint.setAtlasContextFactory(getAtlasContextFactory());
+        if (targetMapMode != null) {
+            endpoint.setTargetMapMode(targetMapMode);
+        }
+
+        // if its a http resource then append any remaining parameters and update the
+        // resource uri
+        if (ResourceHelper.isHttpUri(remaining)) {
+            String remainingAndParameters = ResourceHelper.appendParameters(remaining, parameters);
+            endpoint.setResourceUri(remainingAndParameters);
+        }
+
+        return endpoint;
+    }
+}
diff --git a/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapConstants.java b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapConstants.java
new file mode 100644
index 0000000..c948fb6
--- /dev/null
+++ b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapConstants.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+/**
+ * AtlasMap Constants.
+ */
+public final class AtlasMapConstants {
+
+    public static final String ATLAS_RESOURCE_URI = "CamelAtlasResourceUri";
+    public static final String ATLAS_MAPPING = "CamelAtlasMapping";
+    public static final String ATLAS_SOURCE_MAP = "CamelAtlasSourceMap";
+    public static final String ATLAS_TARGET_MAP = "CamelAtlasTargetMap";
+
+    private AtlasMapConstants() {
+    }
+
+}
diff --git a/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapEndpoint.java b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapEndpoint.java
new file mode 100644
index 0000000..3a759eb
--- /dev/null
+++ b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/AtlasMapEndpoint.java
@@ -0,0 +1,444 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import io.atlasmap.api.AtlasContext;
+import io.atlasmap.api.AtlasContextFactory;
+import io.atlasmap.api.AtlasException;
+import io.atlasmap.api.AtlasSession;
+import io.atlasmap.core.DefaultAtlasContextFactory;
+import io.atlasmap.v2.Audit;
+import io.atlasmap.v2.DataSource;
+import io.atlasmap.v2.DataSourceType;
+import org.apache.camel.Category;
+import org.apache.camel.Exchange;
+import org.apache.camel.ExchangePattern;
+import org.apache.camel.Message;
+import org.apache.camel.component.ResourceEndpoint;
+import org.apache.camel.spi.UriEndpoint;
+import org.apache.camel.spi.UriParam;
+import org.apache.camel.support.MessageHelper;
+import org.apache.camel.support.ResourceHelper;
+import org.apache.camel.util.IOHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static io.atlasmap.api.AtlasContextFactory.Format.ADM;
+import static io.atlasmap.api.AtlasContextFactory.Format.JSON;
+
+/**
+ * Transforms the message using an AtlasMap transformation.
+ */
+@UriEndpoint(firstVersion = "3.7.0", scheme = "atlasmap", title = "AtlasMap", syntax = "atlasmap:resourceUri",
+             producerOnly = true, category = { Category.TRANSFORMATION })
+public class AtlasMapEndpoint extends ResourceEndpoint {
+
+    public static final String CONTENT_TYPE_JSON = "application/json";
+    public static final String CONTENT_TYPE_XML = "application/xml";
+
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasMapEndpoint.class);
+    private AtlasContextFactory atlasContextFactory;
+    private AtlasContext atlasContext;
+
+    @UriParam(label = "advanced")
+    private String propertiesFile;
+    @UriParam
+    private String sourceMapName;
+    @UriParam
+    private String targetMapName;
+    @UriParam(defaultValue = "MAP")
+    private TargetMapMode targetMapMode = TargetMapMode.MAP;
+
+    public enum TargetMapMode {
+        MAP,
+        MESSAGE_HEADER,
+        EXCHANGE_PROPERTY;
+    }
+
+    public AtlasMapEndpoint(String uri, AtlasMapComponent component, String resourceUri) {
+        super(uri, component, resourceUri);
+    }
+
+    @Override
+    public boolean isSingleton() {
+        return true;
+    }
+
+    @Override
+    public ExchangePattern getExchangePattern() {
+        return ExchangePattern.InOut;
+    }
+
+    @Override
+    protected String createEndpointUri() {
+        return "atlasmap:" + getResourceUri();
+    }
+
+    public AtlasContextFactory getAtlasContextFactory() {
+        return this.atlasContextFactory;
+    }
+
+    public void setAtlasContextFactory(AtlasContextFactory atlasContextFactory) {
+        this.atlasContextFactory = atlasContextFactory;
+    }
+
+    public AtlasContext getAtlasContext() {
+        return this.atlasContext;
+    }
+
+    public void setAtlasContext(AtlasContext atlasContext) {
+        this.atlasContext = atlasContext;
+    }
+
+    /**
+     * The URI of the properties file which is used for AtlasContextFactory initialization.
+     * 
+     * @param file property file path
+     */
+    public void setPropertiesFile(String file) {
+        propertiesFile = file;
+    }
+
+    public String getPropertiesFile() {
+        return propertiesFile;
+    }
+
+    /**
+     * The Exchange property name for a source message map which hold <code>java.util.Map&lt;String, Message&gt;</code>
+     * where the key is AtlasMap Document ID. AtlasMap consumes Message bodies as source documents, as well as message
+     * headers as source properties where the scope equals to Document ID.
+     * 
+     * @param name Exchange property name for source map
+     */
+    public void setSourceMapName(String name) {
+        this.sourceMapName = name;
+    }
+
+    public String getSourceMapName() {
+        return this.sourceMapName;
+    }
+
+    /**
+     * The Exchange property name for a target document map which hold <code>java.util.Map&lt;String, Object&gt;</code>
+     * where the key is AtlasMap Document ID. AtlasMap populates multiple target documents into this map.
+     * 
+     * @param name Exchange property name for target map
+     */
+    public void setTargetMapName(String name) {
+        this.targetMapName = name;
+    }
+
+    public String getTargetMapName() {
+        return this.targetMapName;
+    }
+
+    /**
+     * {@link TargetMapMode} enum value to specify how multiple target documents are delivered if exist.
+     * <ul>
+     * <li>'MAP': Stores them into a java.util.Map, and the java.util.Map is set to an exchange" property if
+     * 'targetMapName' is specified, otherwise message body.</li>"
+     * <li>'MESSAGE_HEADER': Stores them into message headers.</li>"
+     * <li>'EXCHANGE_PROPERTY': Stores them into exchange properties.</li>
+     * </ul>
+     * ")
+     * 
+     * @param mode {@link TargetMapMode}
+     */
+    public void setTargetMapMode(TargetMapMode mode) {
+        this.targetMapMode = mode;
+    }
+
+    public TargetMapMode getTargetMapMode() {
+        return this.targetMapMode;
+    }
+
+    public AtlasMapEndpoint findOrCreateEndpoint(String uri, String newResourceUri) {
+        String newUri = uri.replace(getResourceUri(), newResourceUri);
+        log.debug("Getting endpoint with URI: {}", newUri);
+        return getCamelContext().getEndpoint(newUri, AtlasMapEndpoint.class);
+    }
+
+    @Override
+    protected void onExchange(Exchange exchange) throws Exception {
+        Message incomingMessage = exchange.getIn();
+        String newResourceUri = incomingMessage.getHeader(AtlasMapConstants.ATLAS_RESOURCE_URI, String.class);
+        if (newResourceUri != null) {
+            incomingMessage.removeHeader(AtlasMapConstants.ATLAS_RESOURCE_URI);
+
+            log.debug("{} set to {} creating new endpoint to handle exchange", AtlasMapConstants.ATLAS_RESOURCE_URI,
+                    newResourceUri);
+            AtlasMapEndpoint newEndpoint = findOrCreateEndpoint(getEndpointUri(), newResourceUri);
+            newEndpoint.onExchange(exchange);
+            return;
+        }
+
+        AtlasSession atlasSession = getOrCreateAtlasContext(incomingMessage).createSession();
+        populateSourceDocuments(exchange, atlasSession);
+        atlasSession.getAtlasContext().process(atlasSession);
+
+        List<Audit> errors = new ArrayList<>();
+        for (Audit audit : atlasSession.getAudits().getAudit()) {
+            switch (audit.getStatus()) {
+                case ERROR:
+                    errors.add(audit);
+                    break;
+                case WARN:
+                    LOG.warn("{}: Document='{}(ID:{})', path='{}'",
+                            audit.getMessage(), audit.getDocName(), audit.getDocId(), audit.getPath());
+                    break;
+                default:
+                    LOG.info("{}: Document='{}(ID:{})', path='{}'",
+                            audit.getMessage(), audit.getDocName(), audit.getDocId(), audit.getPath());
+            }
+        }
+        if (!errors.isEmpty()) {
+            StringBuilder buf = new StringBuilder("Errors: ");
+            errors.stream().forEach(a -> buf.append(
+                    String.format("[%s: Document='%s(ID:%s)', path='%s'], ",
+                            a.getMessage(), a.getDocName(), a.getDocId(), a.getPath())));
+            throw new AtlasException(buf.toString());
+        }
+
+        populateTargetDocuments(atlasSession, exchange);
+    }
+
+    private AtlasContext getOrCreateAtlasContext(Message incomingMessage) throws Exception {
+        String path = getResourceUri();
+        ObjectHelper.notNull(path, "mappingUri");
+
+        String content = incomingMessage.getHeader(AtlasMapConstants.ATLAS_MAPPING, String.class);
+        if (content != null) {
+            // use content from header
+            InputStream is = new ByteArrayInputStream(content.getBytes());
+            if (log.isDebugEnabled()) {
+                log.debug("Atlas mapping content read from header {} for endpoint {}", AtlasMapConstants.ATLAS_MAPPING,
+                        getEndpointUri());
+            }
+            // remove the header to avoid it being propagated in the routing
+            incomingMessage.removeHeader(AtlasMapConstants.ATLAS_MAPPING);
+            return getOrCreateAtlasContextFactory().createContext(JSON, is);
+        } else if (getAtlasContext() != null) {
+            // no mapping specified in header, and found an existing context
+            return getAtlasContext();
+        }
+
+        // No mapping in header, and no existing context. Create new one from resourceUri
+        if (log.isDebugEnabled()) {
+            log.debug("Atlas mapping content read from resourceUri: {} for endpoint {}",
+                    new Object[] { path, getEndpointUri() });
+        }
+        atlasContext = getOrCreateAtlasContextFactory().createContext(
+                path.toLowerCase().endsWith("adm") ? ADM : JSON, getResourceAsInputStream());
+        return atlasContext;
+    }
+
+    private synchronized AtlasContextFactory getOrCreateAtlasContextFactory() throws Exception {
+        if (atlasContextFactory != null) {
+            return atlasContextFactory;
+        }
+
+        atlasContextFactory = DefaultAtlasContextFactory.getInstance();
+        atlasContextFactory.addClassLoader(getCamelContext().getApplicationContextClassLoader());
+        // load the properties from property file which may overrides the default ones
+        if (ObjectHelper.isNotEmpty(getPropertiesFile())) {
+            Properties properties = new Properties();
+            InputStream reader = ResourceHelper.resolveMandatoryResourceAsInputStream(getCamelContext(),
+                    getPropertiesFile());
+            try {
+                properties.load(reader);
+                log.info("Loaded the Atlas properties file " + getPropertiesFile());
+            } finally {
+                IOHelper.close(reader, getPropertiesFile(), log);
+            }
+            log.debug("Initializing AtlasContextFactory with properties {}", properties);
+            atlasContextFactory.setProperties(properties);
+        }
+        return atlasContextFactory;
+    }
+
+    private void populateSourceDocuments(Exchange exchange, AtlasSession session) {
+        if (session.getMapping().getDataSource() == null) {
+            return;
+        }
+
+        Message inMessage = exchange.getIn();
+        CamelAtlasPropertyStrategy propertyStrategy = new CamelAtlasPropertyStrategy();
+        propertyStrategy.setCurrentSourceMessage(inMessage);
+        propertyStrategy.setTargetMessage(exchange.getMessage());
+        propertyStrategy.setExchange(exchange);
+        session.setAtlasPropertyStrategy(propertyStrategy);
+
+        DataSource[] sourceDataSources = session.getMapping().getDataSource().stream()
+                .filter(ds -> ds.getDataSourceType() == DataSourceType.SOURCE)
+                .toArray(DataSource[]::new);
+        if (sourceDataSources.length == 0) {
+            session.setDefaultSourceDocument(inMessage.getBody());
+            return;
+        }
+
+        if (sourceDataSources.length == 1) {
+            String docId = sourceDataSources[0].getId();
+            Object payload = extractPayload(sourceDataSources[0], inMessage);
+            if (docId == null || docId.isEmpty()) {
+                session.setDefaultSourceDocument(payload);
+            } else {
+                session.setSourceDocument(docId, payload);
+                propertyStrategy.setSourceMessage(docId, inMessage);
+            }
+            return;
+        }
+
+        Map<String, Message> sourceMessages = null;
+        Map<String, Object> sourceDocuments = null;
+        if (sourceMapName != null) {
+            sourceMessages = exchange.getProperty(sourceMapName, Map.class);
+        }
+        if (sourceMessages == null) {
+            Object body = inMessage.getBody();
+            if (body instanceof Map) {
+                sourceDocuments = (Map<String, Object>) body;
+            } else {
+                session.setDefaultSourceDocument(body);
+            }
+        }
+        for (DataSource ds : sourceDataSources) {
+            String docId = ds.getId();
+            if (docId == null || docId.isEmpty()) {
+                Object payload = extractPayload(ds, inMessage);
+                session.setDefaultSourceDocument(payload);
+            } else if (sourceMessages != null) {
+                Object payload = extractPayload(ds, sourceMessages.get(docId));
+                session.setSourceDocument(docId, payload);
+                propertyStrategy.setSourceMessage(docId, sourceMessages.get(docId));
+            } else if (sourceDocuments != null) {
+                Object payload = sourceDocuments.get(docId);
+                session.setSourceDocument(docId, payload);
+            } else if (inMessage.getHeaders().containsKey(docId)) {
+                Object payload = inMessage.getHeader(docId);
+                session.setSourceDocument(docId, payload);
+            } else if (exchange.getProperties().containsKey(docId)) {
+                Object payload = exchange.getProperty(docId);
+                session.setSourceDocument(docId, payload);
+            } else {
+                LOG.warn("Ignoring missing source document: '{}(ID:{})'", ds.getName(), ds.getId());
+            }
+        }
+    }
+
+    private Object extractPayload(final DataSource dataSource, Message message) {
+        if (dataSource == null || message == null) {
+            return null;
+        }
+        Object body = null;
+
+        if (dataSource != null && dataSource.getUri() != null
+                && !(dataSource.getUri().startsWith("atlas:core")
+                        || dataSource.getUri().startsWith("atlas:java"))) {
+            body = message.getBody(String.class);
+        } else {
+            body = message.getBody();
+        }
+
+        //Just in case, prepare for future calls
+        MessageHelper.resetStreamCache(message);
+
+        return body;
+    }
+
+    private void populateTargetDocuments(AtlasSession session, Exchange exchange) {
+        Message message = exchange.getMessage();
+
+        if (session.getMapping().getDataSource() == null) {
+            return;
+        }
+        DataSource[] targetDataSources = session.getMapping().getDataSource().stream()
+                .filter(ds -> ds.getDataSourceType() == DataSourceType.TARGET)
+                .toArray(DataSource[]::new);
+
+        if (targetDataSources.length == 0) {
+            Object newBody = session.getDefaultTargetDocument();
+            message.setBody(newBody);
+            return;
+        }
+
+        if (targetDataSources.length == 1) {
+            String docId = targetDataSources[0].getId();
+            if (docId == null || docId.isEmpty()) {
+                Object newBody = session.getDefaultTargetDocument();
+                message.setBody(newBody);
+            } else {
+                Object newBody = session.getTargetDocument(docId);
+                message.setBody(newBody);
+            }
+            setContentType(targetDataSources[0], message);
+            return;
+        }
+
+        Map<String, Object> targetDocuments = new HashMap<>();
+        for (DataSource ds : targetDataSources) {
+            String docId = ds.getId();
+            if (docId == null || docId.isEmpty()) {
+                targetDocuments.put(io.atlasmap.api.AtlasConstants.DEFAULT_TARGET_DOCUMENT_ID,
+                        session.getDefaultTargetDocument());
+                Object newBody = session.getDefaultTargetDocument();
+                message.setBody(newBody);
+                setContentType(ds, message);
+            } else {
+                targetDocuments.put(docId, session.getTargetDocument(docId));
+            }
+        }
+        switch (targetMapMode) {
+            case MAP:
+                if (targetMapName != null) {
+                    exchange.setProperty(targetMapName, targetDocuments);
+                } else {
+                    message.setBody(targetDocuments);
+                }
+                break;
+            case MESSAGE_HEADER:
+                targetDocuments.remove(io.atlasmap.api.AtlasConstants.DEFAULT_TARGET_DOCUMENT_ID);
+                message.getHeaders().putAll(targetDocuments);
+                break;
+            case EXCHANGE_PROPERTY:
+                targetDocuments.remove(io.atlasmap.api.AtlasConstants.DEFAULT_TARGET_DOCUMENT_ID);
+                exchange.getProperties().putAll(targetDocuments);
+                break;
+            default:
+                throw new IllegalArgumentException("Unknown targetMapMode: " + targetMapMode.name());
+        }
+    }
+
+    private void setContentType(DataSource ds, Message message) {
+        if (ds.getUri() == null) {
+            return;
+        }
+        if (ds.getUri().startsWith("atlas:json")) {
+            message.setHeader(Exchange.CONTENT_TYPE, CONTENT_TYPE_JSON);
+        } else if (ds.getUri().startsWith("atlas:xml")) {
+            message.setHeader(Exchange.CONTENT_TYPE, CONTENT_TYPE_XML);
+        }
+    }
+}
diff --git a/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategy.java b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategy.java
new file mode 100644
index 0000000..0170654
--- /dev/null
+++ b/components/camel-atlasmap/src/main/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategy.java
@@ -0,0 +1,92 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.atlasmap.api.AtlasConversionException;
+import io.atlasmap.api.AtlasSession;
+import io.atlasmap.api.AtlasUnsupportedException;
+import io.atlasmap.core.DefaultAtlasPropertyStrategy;
+import io.atlasmap.v2.PropertyField;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+
+/**
+ * AtlasMap property strategy to map Camel message headers and exchange properties to/from AtlasMap properties.
+ *
+ */
+public class CamelAtlasPropertyStrategy extends DefaultAtlasPropertyStrategy {
+
+    public static final String SCOPE_EXCHANGE_PROPERTY = "camelExchangeProperty";
+    public static final String SCOPE_CURRENT_MESSAGE_HEADER = "current";
+
+    private Exchange camelExchange;
+    private Map<String, Message> sourceMessageMap = new HashMap<>();
+    private Message camelTargetMessage;
+
+    @Override
+    public void readProperty(AtlasSession session, PropertyField propertyField)
+            throws AtlasUnsupportedException, AtlasConversionException {
+
+        String scope = propertyField.getScope();
+        String key = propertyField.getName();
+        Map<String, Object> target = null;
+        if (scope == null && sourceMessageMap.containsKey(SCOPE_CURRENT_MESSAGE_HEADER)) {
+            target = sourceMessageMap.get(SCOPE_CURRENT_MESSAGE_HEADER).getHeaders();
+        } else if (SCOPE_EXCHANGE_PROPERTY.equals(scope)) {
+            target = this.camelExchange.getProperties();
+        } else if (sourceMessageMap.containsKey(scope)) {
+            target = sourceMessageMap.get(scope).getHeaders();
+        }
+        if (target != null && target.containsKey(key)) {
+            propertyField.setValue(target.get(key));
+        } else {
+            super.readProperty(session, propertyField);
+        }
+    }
+
+    @Override
+    public void writeProperty(AtlasSession session, PropertyField propertyField) {
+        String scope = propertyField.getScope();
+        String key = propertyField.getName();
+        Object value = propertyField.getValue();
+        if (SCOPE_EXCHANGE_PROPERTY.equals(scope)) {
+            this.camelExchange.setProperty(key, value);
+        } else {
+            this.camelTargetMessage.setHeader(key, value);
+        }
+    }
+
+    public void setExchange(Exchange ex) {
+        this.camelExchange = ex;
+    }
+
+    public void setSourceMessage(String documentId, Message msg) {
+        sourceMessageMap.put(documentId, msg);
+    }
+
+    public void setCurrentSourceMessage(Message msg) {
+        sourceMessageMap.put(SCOPE_CURRENT_MESSAGE_HEADER, msg);
+    }
+
+    public void setTargetMessage(Message msg) {
+        this.camelTargetMessage = msg;
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapEndpointTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapEndpointTest.java
new file mode 100644
index 0000000..53144ea
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapEndpointTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import io.atlasmap.api.AtlasContext;
+import io.atlasmap.api.AtlasSession;
+import io.atlasmap.v2.AtlasMapping;
+import io.atlasmap.v2.Audits;
+import io.atlasmap.v2.DataSource;
+import io.atlasmap.v2.DataSourceType;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.junit.jupiter.api.Test;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+import org.opentest4j.AssertionFailedError;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+public class AtlasMapEndpointTest {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasMapEndpointTest.class);
+
+    @Test
+    public void testNoDataSource() throws Exception {
+        perform(new ArrayList<>(), null, null, false);
+    }
+
+    @Test
+    public void testDocId() throws Exception {
+        List<DataSource> ds = new ArrayList<>();
+        DataSource source = new DataSource();
+        source.setDataSourceType(DataSourceType.SOURCE);
+        source.setId("my-source-doc");
+        ds.add(source);
+        DataSource target = new DataSource();
+        target.setDataSourceType(DataSourceType.TARGET);
+        target.setId("my-target-doc");
+        ds.add(target);
+        perform(ds, "my-source-doc", "my-target-doc", false);
+    }
+
+    @Test
+    public void noConversionIfNoDataSource() throws Exception {
+        assertThrows(AssertionFailedError.class, () -> {
+            perform(new ArrayList<>(), null, null, true);
+        });
+    }
+
+    @Test
+    public void noConversionIfJavaDataSource() throws Exception {
+        final List<DataSource> dataSources = new ArrayList<>();
+        final DataSource dataSource = new DataSource();
+        dataSource.setDataSourceType(DataSourceType.SOURCE);
+        dataSource.setUri("atlas:java:some.Type");
+        dataSources.add(dataSource);
+        assertThrows(AssertionFailedError.class, () -> {
+            perform(dataSources, null, null, true);
+        });
+    }
+
+    @Test
+    public void doConversionIfJsonDataSource() throws Exception {
+        final List<DataSource> dataSources = new ArrayList<>();
+        final DataSource dataSource = new DataSource();
+        dataSource.setDataSourceType(DataSourceType.SOURCE);
+        dataSource.setUri("atlas:json:SomeType");
+        dataSources.add(dataSource);
+        perform(dataSources, null, null, true);
+    }
+
+    @Test
+    public void noConversionIfJsonTargetDataSource() throws Exception {
+        final List<DataSource> dataSources = new ArrayList<>();
+        final DataSource dataSource = new DataSource();
+        dataSource.setDataSourceType(DataSourceType.TARGET);
+        dataSource.setUri("atlas:json:SomeType");
+        dataSources.add(dataSource);
+        assertThrows(AssertionFailedError.class, () -> {
+            perform(dataSources, null, null, true);
+        });
+    }
+
+    @Test
+    public void doConversionIfXmlDataSource() throws Exception {
+        final List<DataSource> dataSources = new ArrayList<>();
+        final DataSource dataSource = new DataSource();
+        dataSource.setDataSourceType(DataSourceType.SOURCE);
+        dataSource.setUri("atlas:xml:SomeType");
+        dataSources.add(dataSource);
+        perform(dataSources, null, null, true);
+    }
+
+    @Test
+    public void noConversionIfXmlTargetDataSource() throws Exception {
+        final List<DataSource> dataSources = new ArrayList<>();
+        final DataSource dataSource = new DataSource();
+        dataSource.setDataSourceType(DataSourceType.TARGET);
+        dataSource.setUri("atlas:xml:SomeType");
+        dataSources.add(dataSource);
+        assertThrows(AssertionFailedError.class, () -> {
+            perform(dataSources, null, null, true);
+        });
+    }
+
+    private void perform(List<DataSource> dataSources, String sourceDocId, String targetDocId, boolean fromStream)
+            throws Exception {
+        final AtlasMapping mapping = new AtlasMapping();
+        mapping.getDataSource().addAll(dataSources);
+        final AtlasContext context = spy(AtlasContext.class);
+        final AtlasSession session = spy(AtlasSession.class);
+        when(context.createSession()).thenReturn(session);
+        when(session.getAtlasContext()).thenReturn(context);
+        when(session.getMapping()).thenReturn(mapping);
+        when(session.getAudits()).thenReturn(new Audits());
+        final AtlasMapEndpoint endpoint = new AtlasMapEndpoint("atlasmap:test.xml", new AtlasMapComponent(), "test.xml");
+        endpoint.setAtlasContext(context);
+        final Exchange exchange = spy(Exchange.class);
+        final Message inMessage = spy(Message.class);
+        when(inMessage.getBody()).thenReturn(fromStream ? new ByteArrayInputStream("{test}".getBytes()) : "{test}");
+        when(inMessage.getBody(String.class)).thenReturn("{test}");
+        when(exchange.getIn()).thenReturn(inMessage);
+        if (sourceDocId == null) {
+            doAnswer(new Answer<Void>() {
+                @Override
+                public Void answer(InvocationOnMock invocation) {
+                    LOG.debug("setDefaultSourceDocument({})", invocation.getArgument(0).toString());
+                    assertEquals("{test}", invocation.getArgument(0).toString());
+                    return null;
+                }
+            }).when(session).setDefaultSourceDocument(any());
+        } else {
+            doAnswer(new Answer<Void>() {
+                @Override
+                public Void answer(InvocationOnMock invocation) {
+                    LOG.debug("setSourceDocument({}, {})", invocation.getArgument(0), invocation.getArgument(1));
+                    assertEquals(sourceDocId, invocation.getArgument(0));
+                    assertEquals("{test}", invocation.getArgument(1));
+                    return null;
+                }
+            }).when(session).setSourceDocument(any(), any());
+        }
+        final Message outMessage = spy(Message.class);
+        doAnswer(new Answer<Void>() {
+            @Override
+            public Void answer(InvocationOnMock invocation) {
+                LOG.debug("setBody({})", invocation.getArgument(0).toString());
+                assertEquals("<target/>", invocation.getArgument(0));
+                return null;
+            }
+        }).when(outMessage).setBody(any());
+        doNothing().when(outMessage).setHeaders(any());
+        if (targetDocId == null) {
+            when(session.getDefaultTargetDocument()).thenAnswer(new Answer<Object>() {
+                @Override
+                public Object answer(InvocationOnMock invocation) throws Throwable {
+                    LOG.debug("getDefaultTargetDocument()");
+                    return "<target/>";
+                }
+            });
+        } else {
+            when(session.getTargetDocument(any())).thenAnswer(new Answer<Object>() {
+                @Override
+                public Object answer(InvocationOnMock invocation) throws Throwable {
+                    LOG.debug("getTargetDocument({})", invocation.getArgument(0).toString());
+                    assertEquals(targetDocId, invocation.getArgument(0));
+                    return "<target/>";
+                }
+            });
+        }
+        when(exchange.getMessage()).thenReturn(outMessage);
+        endpoint.onExchange(exchange);
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapExtractMappingsTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapExtractMappingsTest.java
new file mode 100644
index 0000000..a40fb09
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapExtractMappingsTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.io.ByteArrayInputStream;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class AtlasMapExtractMappingsTest extends CamelSpringTestSupport {
+
+    private static final String EXPECTED_BODY = "{\"order\":{\"orderId\":\"A123\"}}";
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapExtractMappingsTest-context.xml");
+    }
+
+    @Test
+    public void testXMLMappingsExtraction() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start",
+                new ByteArrayInputStream("{ \"order\": { \"orderId\": \"A123\" }}".getBytes()));
+
+        assertMockEndpointsSatisfied();
+
+        final Object body = result.getExchanges().get(0).getIn().getBody();
+        assertEquals(EXPECTED_BODY, body);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testXMLMappingsExtractionNumberedMappingFile() throws Exception {
+        MockEndpoint resultN = getMockEndpoint("mock:result-n");
+        resultN.setExpectedCount(1);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start-n",
+                new ByteArrayInputStream("{ \"order\": { \"orderId\": \"A123\" }}".getBytes()));
+
+        assertMockEndpointsSatisfied();
+
+        final Object body = resultN.getExchanges().get(0).getIn().getBody();
+        assertEquals(EXPECTED_BODY, body);
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJavaToJsonTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJavaToJsonTest.java
new file mode 100644
index 0000000..c10a4f9
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJavaToJsonTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class AtlasMapJavaToJsonTest extends CamelSpringTestSupport {
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapJavaToJsonTest-context.xml");
+    }
+
+    @Test
+    public void testMocksAreValid() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start", Util.generateMockTwitterStatus());
+
+        assertMockEndpointsSatisfied();
+        Message msg = result.getExchanges().get(0).getIn();
+        assertEquals("application/json", msg.getHeader(Exchange.CONTENT_TYPE));
+        Object body = msg.getBody();
+        assertEquals(String.class, body.getClass());
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode sfJson = mapper.readTree((String) body);
+        assertNotNull(sfJson.get("TwitterScreenName__c"));
+        assertEquals("bobvila1982", sfJson.get("TwitterScreenName__c").asText());
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonTest.java
new file mode 100644
index 0000000..82f8662
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class AtlasMapJsonTest extends CamelSpringTestSupport {
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapJsonTest-context.xml");
+    }
+
+    @Test
+    public void testMocksAreValid() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start", Util.generateMockTwitterStatus());
+
+        assertMockEndpointsSatisfied();
+        Object body = result.getExchanges().get(0).getIn().getBody();
+        assertEquals(String.class, body.getClass());
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode outJson = mapper.readTree((String) body);
+        assertEquals("Bob", outJson.get("FirstName").asText());
+        assertEquals("Vila", outJson.get("LastName").asText());
+        assertEquals("bobvila1982", outJson.get("Title").asText());
+        assertEquals("Let's build a house!", outJson.get("Description").asText());
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonToJavaTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonToJavaTest.java
new file mode 100644
index 0000000..bfb15f7
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonToJavaTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.io.ByteArrayInputStream;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class AtlasMapJsonToJavaTest extends CamelSpringTestSupport {
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapJsonToJavaTest-context.xml");
+    }
+
+    @Test
+    public void testMocksAreValid() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        final ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start", new ByteArrayInputStream("{\"field1\":\"value1\"}".getBytes()));
+
+        assertMockEndpointsSatisfied();
+        final Object body = result.getExchanges().get(0).getIn().getBody();
+        assertEquals(Pojo.class, body.getClass());
+        assertEquals("value1", ((Pojo) body).getField1());
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonToXmlSchemaTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonToXmlSchemaTest.java
new file mode 100644
index 0000000..ae8b165
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapJsonToXmlSchemaTest.java
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.io.InputStream;
+import java.io.StringReader;
+
+import javax.xml.transform.stream.StreamSource;
+import javax.xml.validation.Validator;
+
+import io.atlasmap.xml.core.schema.AtlasXmlSchemaSetParser;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class AtlasMapJsonToXmlSchemaTest extends CamelSpringTestSupport {
+    private static final Logger LOG = LoggerFactory.getLogger(AtlasMapJsonToXmlSchemaTest.class);
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapJsonToXmlSchemaTest-context.xml");
+    }
+
+    @Test
+    public void test() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        final ProducerTemplate producerTemplate = context.createProducerTemplate();
+        ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+        InputStream payloadIs = tccl.getResourceAsStream("json-source.json");
+        producerTemplate.sendBody("direct:start", payloadIs);
+
+        assertMockEndpointsSatisfied();
+        final String body = result.getExchanges().get(0).getIn().getBody(String.class);
+        assertNotNull(body);
+        LOG.debug(">>>>> {}", body);
+
+        InputStream schemaIs = tccl.getResourceAsStream("xml-target-schemaset.xml");
+        AtlasXmlSchemaSetParser schemaParser = new AtlasXmlSchemaSetParser(tccl);
+        Validator validator = schemaParser.createSchema(schemaIs).newValidator();
+        StreamSource source = new StreamSource(new StringReader(body));
+        validator.validate(source);
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiDocsTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiDocsTest.java
new file mode 100644
index 0000000..afe876c
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiDocsTest.java
@@ -0,0 +1,190 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.atlasmap.java.test.SourceContact;
+import org.apache.camel.Endpoint;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.support.DefaultMessage;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.xmlunit.builder.Input;
+import org.xmlunit.xpath.JAXPXPathEngine;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class AtlasMapMultiDocsTest extends CamelSpringTestSupport {
+
+    private static final String JSON_SOURCE = "{" +
+                                              "\"firstName\": \"JsonFirstName\"," +
+                                              "\"lastName\": \"JsonLastName\"," +
+                                              "\"phoneNumber\": \"JsonPhoneNumber\"," +
+                                              "\"zipCode\": \"JsonZipCode\"" +
+                                              "}";
+
+    private static final String XML_SOURCE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                                             "<ns:Contact xmlns:ns=\"http://atlasmap.io/xml/test/v2\"\n" +
+                                             "    xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" +
+                                             "    firstName=\"XmlFirstName\" lastName=\"XmlLastName\"\n" +
+                                             "    phoneNumber=\"XmlPhoneNumber\" zipCode=\"XmlZipCode\" />\n";
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapMultiDocsTest-context.xml");
+    }
+
+    @Test
+    public void test() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        Map<String, Message> sourceMap = new HashMap<>();
+        SourceContact javaSource = new SourceContact();
+        javaSource.setFirstName("JavaFirstName");
+        javaSource.setLastName("JavaLastName");
+        javaSource.setPhoneNumber("JavaPhoneNumber");
+        javaSource.setZipCode("JavaZipCode");
+        Message msg = new DefaultMessage(context);
+        msg.setBody(javaSource);
+        msg.setHeader("testProp", "java-source-header");
+        sourceMap.put("DOCID:JAVA:CONTACT:S", msg);
+        msg = new DefaultMessage(context);
+        msg.setBody(JSON_SOURCE);
+        msg.setHeader("testProp", "json-source-header");
+        sourceMap.put("DOCID:JSON:CONTACT:S", msg);
+        msg = new DefaultMessage(context);
+        msg.setBody(XML_SOURCE);
+        msg.setHeader("testProp", "xml-source-header");
+        sourceMap.put("DOCID:XML:CONTACT:S", msg);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBodyAndProperty("direct:start", null, "CAPTURED_OUT_MESSAGES_MAP", sourceMap);
+
+        assertMockEndpointsSatisfied();
+        Exchange exchange = result.getExchanges().get(0);
+        Map<?, ?> targetMap = exchange.getProperty("TARGET_MESSAGES_MAP", Map.class);
+
+        verifyTargetDocs(targetMap);
+
+        assertEquals("java-source-header", exchange.getProperty("target-exchange"));
+        assertEquals("json-source-header", exchange.getProperty("testProp"));
+        assertEquals("xml-source-header", exchange.getIn().getHeader("testProp"));
+    }
+
+    @Test
+    public void testBody() throws Exception {
+        MockEndpoint resultBody = getMockEndpoint("mock:result-body");
+        resultBody.setExpectedCount(1);
+
+        Map<String, Object> sourceMap = new HashMap<>();
+        SourceContact javaSource = new SourceContact();
+        javaSource.setFirstName("JavaFirstName");
+        javaSource.setLastName("JavaLastName");
+        javaSource.setPhoneNumber("JavaPhoneNumber");
+        javaSource.setZipCode("JavaZipCode");
+        sourceMap.put("DOCID:JAVA:CONTACT:S", javaSource);
+        sourceMap.put("DOCID:JSON:CONTACT:S", JSON_SOURCE);
+        sourceMap.put("DOCID:XML:CONTACT:S", XML_SOURCE);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start-body", sourceMap);
+
+        assertMockEndpointsSatisfied();
+        Exchange exchange = resultBody.getExchanges().get(0);
+        Map<?, ?> targetMap = exchange.getIn().getBody(Map.class);
+
+        verifyTargetDocs(targetMap);
+    }
+
+    @Test
+    public void testHeaderDocs() throws Exception {
+        MockEndpoint resultBody = getMockEndpoint("mock:result-body");
+        resultBody.setExpectedCount(1);
+
+        Map<String, Object> sourceMap = new HashMap<>();
+        SourceContact javaSource = new SourceContact();
+        javaSource.setFirstName("JavaFirstName");
+        javaSource.setLastName("JavaLastName");
+        javaSource.setPhoneNumber("JavaPhoneNumber");
+        javaSource.setZipCode("JavaZipCode");
+        sourceMap.put("DOCID:JAVA:CONTACT:S", javaSource);
+        sourceMap.put("DOCID:JSON:CONTACT:S", JSON_SOURCE);
+        sourceMap.put("DOCID:XML:CONTACT:S", XML_SOURCE);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBodyAndHeaders("direct:start-header", null, sourceMap);
+
+        assertMockEndpointsSatisfied();
+        Exchange exchange = resultBody.getExchanges().get(0);
+        verifyTargetDocs(exchange.getIn().getHeaders());
+    }
+
+    @Test
+    public void testExchangePropertyDocs() throws Exception {
+        MockEndpoint resultBody = getMockEndpoint("mock:result-body");
+        resultBody.setExpectedCount(1);
+
+        Map<String, Object> sourceMap = new HashMap<>();
+        SourceContact javaSource = new SourceContact();
+        javaSource.setFirstName("JavaFirstName");
+        javaSource.setLastName("JavaLastName");
+        javaSource.setPhoneNumber("JavaPhoneNumber");
+        javaSource.setZipCode("JavaZipCode");
+        sourceMap.put("DOCID:JAVA:CONTACT:S", javaSource);
+        sourceMap.put("DOCID:JSON:CONTACT:S", JSON_SOURCE);
+        sourceMap.put("DOCID:XML:CONTACT:S", XML_SOURCE);
+
+        Endpoint ep = context.getEndpoint("direct:start-exchange-property");
+        Exchange ex = ep.createExchange();
+        ex.getProperties().putAll(sourceMap);
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.send(ep, ex);
+
+        assertMockEndpointsSatisfied();
+        Exchange exchange = resultBody.getExchanges().get(0);
+        verifyTargetDocs(exchange.getProperties());
+    }
+
+    private void verifyTargetDocs(Map<?, ?> targetMap) throws Exception {
+        String jsonTarget = (String) targetMap.get("DOCID:JSON:CONTACT:T");
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode jsonTargetNode = mapper.readTree(jsonTarget);
+        assertEquals("JsonFirstName", jsonTargetNode.get("firstName").asText());
+        assertEquals("JavaLastName", jsonTargetNode.get("lastName").asText());
+        assertEquals("XmlPhoneNumber", jsonTargetNode.get("phoneNumber").asText());
+
+        String xmlTarget = (String) targetMap.get("DOCID:XML:CONTACT:T");
+        HashMap<String, String> ns = new HashMap<>();
+        ns.put("ns", "http://atlasmap.io/xml/test/v2");
+        JAXPXPathEngine xpath = new JAXPXPathEngine();
+        xpath.setNamespaceContext(ns);
+        assertEquals("XmlFirstName", xpath.evaluate("/Contact/@firstName", Input.fromString(xmlTarget).build()));
+        assertEquals("JsonLastName", xpath.evaluate("/Contact/@lastName", Input.fromString(xmlTarget).build()));
+        assertEquals("JavaPhoneNumber", xpath.evaluate("/Contact/@phoneNumber", Input.fromString(xmlTarget).build()));
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiNSTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiNSTest.java
new file mode 100644
index 0000000..3c2d141
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapMultiNSTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import io.atlasmap.java.test.SourceContact;
+import org.apache.camel.Exchange;
+import org.apache.camel.Message;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.xmlunit.builder.DiffBuilder;
+import org.xmlunit.builder.Input;
+import org.xmlunit.diff.Diff;
+
+public class AtlasMapMultiNSTest extends CamelSpringTestSupport {
+
+    private static final String XML_EXPECTED = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
+                                               "<tns:request xmlns:tns=\"http://syndesis.io/v1/swagger-connector-template/request\">\n"
+                                               +
+                                               "  <tns:body>\n" +
+                                               "    <Pet>\n" +
+                                               "      <name>Jackson</name>\n" +
+                                               "    </Pet>\n" +
+                                               "  </tns:body>\n" +
+                                               "</tns:request>";
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapMultiNSTest-context.xml");
+    }
+
+    @Test
+    public void test() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        SourceContact c = new SourceContact();
+        c.setFirstName("Jackson");
+        producerTemplate.sendBody("direct:start", c);
+
+        assertMockEndpointsSatisfied();
+        Message message = result.getExchanges().get(0).getIn();
+        Assertions.assertEquals("application/xml", message.getHeader(Exchange.CONTENT_TYPE));
+        String out = message.getBody(String.class);
+        Assertions.assertNotNull(out);
+        Diff d = DiffBuilder.compare(Input.fromString(XML_EXPECTED).build())
+                .withTest(Input.fromString(out).build())
+                .ignoreWhitespace().build();
+        Assertions.assertFalse(d.hasDifferences(), d.toString() + ": " + out);
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapSingleDocTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapSingleDocTest.java
new file mode 100644
index 0000000..2eba85b
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapSingleDocTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.util.Map;
+
+import io.atlasmap.java.test.SourceContact;
+import io.atlasmap.java.test.TargetContact;
+import org.apache.camel.Exchange;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class AtlasMapSingleDocTest extends CamelSpringTestSupport {
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapSingleDocTest-context.xml");
+    }
+
+    @Test
+    public void test() throws Exception {
+        SourceContact javaSource = new SourceContact();
+        javaSource.setFirstName("JavaFirstName");
+        javaSource.setLastName("JavaLastName");
+        javaSource.setPhoneNumber("JavaPhoneNumber");
+        javaSource.setZipCode("JavaZipCode");
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start", javaSource);
+
+        assertMockEndpointsSatisfied();
+        MockEndpoint result = getMockEndpoint("mock:result");
+        Exchange exchange = result.getExchanges().get(0);
+        Map<?, ?> targetMap = exchange.getIn().getBody(Map.class);
+        TargetContact javaTarget = (TargetContact) targetMap.get("DOCID:JAVA:CONTACT:T");
+        assertEquals("JavaFirstName", javaTarget.getFirstName());
+
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapTest.java
new file mode 100644
index 0000000..1d0d782
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapTest.java
@@ -0,0 +1,81 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import twitter4j.Status;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.Mockito.when;
+
+public class AtlasMapTest extends CamelSpringTestSupport {
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapTest-context.xml");
+    }
+
+    @Test
+    public void testMocksAreValid() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start", Util.generateMockTwitterStatus());
+
+        assertMockEndpointsSatisfied();
+        Object body = result.getExchanges().get(0).getIn().getBody();
+        assertEquals(String.class, body.getClass());
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode outJson = mapper.readTree((String) body);
+        assertEquals("Bob", outJson.get("FirstName").asText());
+        assertEquals("Vila", outJson.get("LastName").asText());
+        assertEquals("bobvila1982", outJson.get("Title").asText());
+        assertEquals("Let's build a house!", outJson.get("Description").asText());
+        assertEquals("const foobar", outJson.get("Constant").asText());
+    }
+
+    @Test
+    public void testSeparateNotSucceed() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        ProducerTemplate producerTemplate = context.createProducerTemplate();
+        Status s = Util.generateMockTwitterStatus();
+        when(s.getUser().getName()).thenReturn("BobVila");
+        producerTemplate.sendBody("direct:start", s);
+
+        MockEndpoint.assertIsSatisfied(context);
+        Object body = result.getExchanges().get(0).getIn().getBody();
+        assertEquals(String.class, body.getClass());
+        ObjectMapper mapper = new ObjectMapper();
+        JsonNode outJson = mapper.readTree((String) body);
+        assertEquals("BobVila", outJson.get("FirstName").asText());
+        assertNull(outJson.get("LastName"));
+        assertEquals("bobvila1982", outJson.get("Title").asText());
+        assertEquals("Let's build a house!", outJson.get("Description").asText());
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapXmlToXmlDefaultNsTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapXmlToXmlDefaultNsTest.java
new file mode 100644
index 0000000..26f387a
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapXmlToXmlDefaultNsTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.io.ByteArrayInputStream;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.xmlunit.builder.DiffBuilder;
+import org.xmlunit.builder.Input;
+import org.xmlunit.diff.Diff;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class AtlasMapXmlToXmlDefaultNsTest extends CamelSpringTestSupport {
+
+    private static final String XML_EXPECTED
+            = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><tns:Patient xmlns:tns=\"http://hl7.org/fhir\"><tns:id value=\"101138\"/></tns:Patient>";
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapXmlToXmlTest-context.xml");
+    }
+
+    @Test
+    public void testMocksAreValid() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        final ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start", new ByteArrayInputStream(
+                "<Patient xmlns=\"http://hl7.org/fhir\"><id value=\"101138\"></id></Patient>".getBytes()));
+
+        assertMockEndpointsSatisfied();
+        final String body = result.getExchanges().get(0).getIn().getBody(String.class);
+
+        assertNotNull(body);
+
+        Diff d = DiffBuilder.compare(Input.fromString(XML_EXPECTED).build())
+                .withTest(Input.fromString(body).build())
+                .ignoreWhitespace().build();
+        assertFalse(d.hasDifferences(), d.toString() + ": " + body);
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapXmlToXmlTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapXmlToXmlTest.java
new file mode 100644
index 0000000..12e8241
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/AtlasMapXmlToXmlTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import java.io.ByteArrayInputStream;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.junit5.CamelSpringTestSupport;
+import org.junit.jupiter.api.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+import org.xmlunit.builder.DiffBuilder;
+import org.xmlunit.builder.Input;
+import org.xmlunit.diff.Diff;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+public class AtlasMapXmlToXmlTest extends CamelSpringTestSupport {
+
+    private static final String XML_EXPECTED
+            = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><tns:Patient xmlns:tns=\"http://hl7.org/fhir\"><tns:id value=\"101138\"/></tns:Patient>";
+
+    @Override
+    protected AbstractApplicationContext createApplicationContext() {
+        return new ClassPathXmlApplicationContext("context/AtlasMapXmlToXmlTest-context.xml");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testMocksAreValid() throws Exception {
+        MockEndpoint result = getMockEndpoint("mock:result");
+        result.setExpectedCount(1);
+
+        final ProducerTemplate producerTemplate = context.createProducerTemplate();
+        producerTemplate.sendBody("direct:start", new ByteArrayInputStream(
+                "<tns:Patient xmlns:tns=\"http://hl7.org/fhir\"><tns:id value=\"101138\"></tns:id></tns:Patient>".getBytes()));
+
+        assertMockEndpointsSatisfied();
+        final String body = result.getExchanges().get(0).getIn().getBody(String.class);
+
+        assertNotNull(body);
+
+        Diff d = DiffBuilder.compare(Input.fromString(XML_EXPECTED).build())
+                .withTest(Input.fromString(body).build())
+                .ignoreWhitespace().build();
+        assertFalse(d.hasDifferences(), d.toString() + ": " + body);
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategyTest.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategyTest.java
new file mode 100644
index 0000000..68ea4ed
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/CamelAtlasPropertyStrategyTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import io.atlasmap.api.AtlasSession;
+import io.atlasmap.core.DefaultAtlasSession;
+import io.atlasmap.v2.PropertyField;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.support.DefaultExchange;
+import org.apache.camel.support.DefaultMessage;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class CamelAtlasPropertyStrategyTest {
+
+    @Test
+    public void testRead() throws Exception {
+        CamelAtlasPropertyStrategy strategy = new CamelAtlasPropertyStrategy();
+        DefaultCamelContext context = new DefaultCamelContext();
+        DefaultExchange exchange = new DefaultExchange(context);
+        exchange.setProperty("testProp", "testProp-exchangeProperty");
+        strategy.setExchange(exchange);
+        DefaultMessage currentMessage = new DefaultMessage(exchange);
+        currentMessage.setHeader("testProp", "testProp-currentMessage");
+        strategy.setCurrentSourceMessage(currentMessage);
+        DefaultMessage message1 = new DefaultMessage(exchange);
+        message1.setHeader("testProp", "testProp-message1");
+        strategy.setSourceMessage("Doc1", message1);
+        DefaultMessage message2 = new DefaultMessage(exchange);
+        message2.setHeader("testProp", "testProp-message2");
+        strategy.setSourceMessage("Doc2", message2);
+        AtlasSession session = mock(AtlasSession.class);
+        when(session.getAtlasPropertyStrategy()).thenReturn(strategy);
+        PropertyField propertyField = new PropertyField();
+        propertyField.setName("testProp");
+        strategy.readProperty(session, propertyField);
+        assertEquals("testProp-currentMessage", propertyField.getValue());
+        propertyField.setScope(CamelAtlasPropertyStrategy.SCOPE_EXCHANGE_PROPERTY);
+        strategy.readProperty(session, propertyField);
+        assertEquals("testProp-exchangeProperty", propertyField.getValue());
+        propertyField.setScope("Doc1");
+        strategy.readProperty(session, propertyField);
+        assertEquals("testProp-message1", propertyField.getValue());
+        propertyField.setScope("Doc2");
+        strategy.readProperty(session, propertyField);
+        assertEquals("testProp-message2", propertyField.getValue());
+    }
+
+    @Test
+    public void testWrite() throws Exception {
+        CamelAtlasPropertyStrategy strategy = new CamelAtlasPropertyStrategy();
+        DefaultCamelContext context = new DefaultCamelContext();
+        DefaultExchange exchange = new DefaultExchange(context);
+        strategy.setExchange(exchange);
+        DefaultMessage message = new DefaultMessage(exchange);
+        strategy.setTargetMessage(message);
+        PropertyField propertyField = new PropertyField();
+        propertyField.setName("testProp-message");
+        propertyField.setValue("testValue");
+        AtlasSession session = mock(DefaultAtlasSession.class);
+        when(session.getAtlasPropertyStrategy()).thenReturn(strategy);
+        strategy.writeProperty(session, propertyField);
+        propertyField.setName("testProp-exchange");
+        propertyField.setScope(CamelAtlasPropertyStrategy.SCOPE_EXCHANGE_PROPERTY);
+        strategy.writeProperty(session, propertyField);
+        assertEquals("testValue", message.getHeader("testProp-message"));
+        assertNull(message.getHeader("testProp-exchange"));
+        assertNull(exchange.getProperty("testProp-message"));
+        assertEquals("testValue", exchange.getProperty("testProp-exchange"));
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/Pojo.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/Pojo.java
new file mode 100644
index 0000000..7edddaa
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/Pojo.java
@@ -0,0 +1,31 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+public class Pojo {
+
+    private String field1;
+
+    public String getField1() {
+        return field1;
+    }
+
+    public void setField1(final String field1) {
+        this.field1 = field1;
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/Util.java b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/Util.java
new file mode 100644
index 0000000..ff956c22
--- /dev/null
+++ b/components/camel-atlasmap/src/test/java/org/apache/camel/component/atlasmap/Util.java
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+package org.apache.camel.component.atlasmap;
+
+import twitter4j.Status;
+import twitter4j.User;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public final class Util {
+
+    private Util() {
+    }
+
+    public static Status generateMockTwitterStatus() {
+        Status status = mock(Status.class);
+        User user = mock(User.class);
+        when(user.getName()).thenReturn("Bob Vila");
+        when(user.getScreenName()).thenReturn("bobvila1982");
+        when(status.getUser()).thenReturn(user);
+        when(status.getText()).thenReturn("Let's build a house!");
+        return status;
+    }
+
+}
diff --git a/components/camel-atlasmap/src/test/resources/adm/atlasmap-mapping-n.adm b/components/camel-atlasmap/src/test/resources/adm/atlasmap-mapping-n.adm
new file mode 100644
index 0000000..e6bf68d
Binary files /dev/null and b/components/camel-atlasmap/src/test/resources/adm/atlasmap-mapping-n.adm differ
diff --git a/components/camel-atlasmap/src/test/resources/adm/atlasmap-mapping.adm b/components/camel-atlasmap/src/test/resources/adm/atlasmap-mapping.adm
new file mode 100644
index 0000000..0744b9e
Binary files /dev/null and b/components/camel-atlasmap/src/test/resources/adm/atlasmap-mapping.adm differ
diff --git a/components/camel-atlasmap/src/test/resources/adm/json-schema-source-to-xml-schema-target.adm b/components/camel-atlasmap/src/test/resources/adm/json-schema-source-to-xml-schema-target.adm
new file mode 100644
index 0000000..645094a
Binary files /dev/null and b/components/camel-atlasmap/src/test/resources/adm/json-schema-source-to-xml-schema-target.adm differ
diff --git a/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-java-to-json.json b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-java-to-json.json
new file mode 100644
index 0000000..95a327c
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-java-to-json.json
@@ -0,0 +1,56 @@
+{
+  "AtlasMapping": {
+    "jsonType": "io.atlasmap.v2.AtlasMapping",
+    "dataSource": [
+      {
+        "jsonType": "io.atlasmap.v2.DataSource",
+        "id": "twitter4j.Status",
+        "uri": "atlas:java?className=twitter4j.Status",
+        "dataSourceType": "SOURCE"
+      },
+      {
+        "jsonType": "io.atlasmap.json.v2.JsonDataSource",
+        "id": "Contact",
+        "uri": "atlas:json:Contact",
+        "dataSourceType": "TARGET",
+        "template": null
+      }
+    ],
+    "mappings": {
+      "mapping": [
+        {
+          "jsonType": "io.atlasmap.v2.Mapping",
+          "mappingType": "MAP",
+          "inputField": [
+            {
+              "jsonType": "io.atlasmap.java.v2.JavaField",
+              "name": "screenName",
+              "path": "/user/screenName",
+              "fieldType": "STRING",
+              "docId": "twitter4j.Status"
+            }
+          ],
+          "outputField": [
+            {
+              "jsonType": "io.atlasmap.json.v2.JsonComplexType",
+              "name": "TwitterScreenName__c",
+              "path": "/TwitterScreenName__c",
+              "fieldType": "STRING",
+              "docId": "Contact",
+              "userCreated": false
+            }
+          ]
+        }
+      ]
+    },
+    "name": "UI.246440",
+    "lookupTables": {
+      "lookupTable": [
+      ]
+    },
+    "properties": {
+      "property": [
+      ]
+    }
+  }
+}
diff --git a/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-json-to-java.json b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-json-to-java.json
new file mode 100644
index 0000000..c688af5
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-json-to-java.json
@@ -0,0 +1,56 @@
+{
+  "AtlasMapping": {
+    "jsonType": "io.atlasmap.v2.AtlasMapping",
+    "dataSource": [
+      {
+        "jsonType": "io.atlasmap.json.v2.JsonDataSource",
+        "id": "Contact",
+        "uri": "atlas:json:Json",
+        "dataSourceType": "SOURCE",
+        "template": null
+      },
+      {
+        "jsonType": "io.atlasmap.v2.DataSource",
+        "id": "twitter4j.Status",
+        "uri": "atlas:java?className=org.apache.camel.component.atlasmap.Pojo",
+        "dataSourceType": "TARGET"
+      }
+    ],
+    "mappings": {
+      "mapping": [
+        {
+          "jsonType": "io.atlasmap.v2.Mapping",
+          "mappingType": "MAP",
+          "inputField": [
+            {
+              "jsonType": "io.atlasmap.json.v2.JsonComplexType",
+              "name": "field1",
+              "path": "/field1",
+              "fieldType": "STRING",
+              "docId": "Contact",
+              "userCreated": false
+            }
+          ],
+          "outputField": [
+            {
+              "jsonType": "io.atlasmap.java.v2.JavaField",
+              "name": "field1",
+              "path": "/field1",
+              "fieldType": "STRING",
+              "docId": "twitter4j.Status"
+            }
+          ]
+        }
+      ]
+    },
+    "name": "UI.246440",
+    "lookupTables": {
+      "lookupTable": [
+      ]
+    },
+    "properties": {
+      "property": [
+      ]
+    }
+  }
+}
diff --git a/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-multidocs.json b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-multidocs.json
new file mode 100644
index 0000000..266bd21
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-multidocs.json
@@ -0,0 +1,255 @@
+{
+  "AtlasMapping" : {
+    "jsonType" : "io.atlasmap.v2.AtlasMapping",
+    "dataSource" : [ {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JAVA:CONTACT:S",
+      "uri" : "atlas:java?className=io.atlasmap.java.test.SourceContact",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JSON:CONTACT:S",
+      "uri" : "atlas:json:JSONContact",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:XML:CONTACT:S",
+      "uri" : "atlas:xml:XMLContact",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JAVA:CONTACT:T",
+      "uri" : "atlas:java?className=io.atlasmap.java.test.TargetContact",
+      "dataSourceType" : "TARGET"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JSON:CONTACT:T",
+      "uri" : "atlas:json:JSONContact",
+      "dataSourceType" : "TARGET"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:XML:CONTACT:T",
+      "uri" : "atlas:xml:XMLContact",
+      "dataSourceType" : "TARGET"
+    } ],
+    "mappings" : {
+      "mapping" : [ {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:S",
+          "path" : "/firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName",
+          "getMethod" : "getFirstName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:T",
+          "path" : "/firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName",
+          "setMethod" : "setFirstName"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:S",
+          "path" : "/lastName",
+          "fieldType" : "STRING",
+          "name" : "lastName",
+          "getMethod" : "getLastName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "docId" : "DOCID:JSON:CONTACT:T",
+          "path" : "/lastName",
+          "fieldType" : "STRING",
+          "name" : "lastName"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:S",
+          "path" : "/phoneNumber",
+          "fieldType" : "STRING",
+          "name" : "phoneNumber",
+          "getMethod" : "getPhoneNumber"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.xml.v2.XmlField",
+          "docId" : "DOCID:XML:CONTACT:T",
+          "path" : "/Contact/@phoneNumber",
+          "fieldType" : "STRING",
+          "name" : "phoneNumber"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "docId" : "DOCID:JSON:CONTACT:S",
+          "path" : "/firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "docId" : "DOCID:JSON:CONTACT:T",
+          "path" : "/firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "docId" : "DOCID:JSON:CONTACT:S",
+          "path" : "/lastName",
+          "fieldType" : "STRING",
+          "name" : "lastName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.xml.v2.XmlField",
+          "docId" : "DOCID:XML:CONTACT:T",
+          "path" : "/Contact/@lastName",
+          "fieldType" : "STRING",
+          "name" : "lastName"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "docId" : "DOCID:JSON:CONTACT:S",
+          "path" : "/phoneNumber",
+          "fieldType" : "STRING",
+          "name" : "phoneNumber"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:T",
+          "path" : "/phoneNumber",
+          "fieldType" : "STRING",
+          "name" : "phoneNumber",
+          "setMethod" : "setPhoneNumber"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.xml.v2.XmlField",
+          "docId" : "DOCID:XML:CONTACT:S",
+          "path" : "/Contact/@firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.xml.v2.XmlField",
+          "docId" : "DOCID:XML:CONTACT:T",
+          "path" : "/Contact/@firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.xml.v2.XmlField",
+          "docId" : "DOCID:XML:CONTACT:S",
+          "path" : "/Contact/@lastName",
+          "fieldType" : "STRING",
+          "name" : "lastName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:T",
+          "path" : "/lastName",
+          "fieldType" : "STRING",
+          "name" : "lastName",
+          "setMethod" : "setLastName"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.xml.v2.XmlField",
+          "docId" : "DOCID:XML:CONTACT:S",
+          "path" : "/Contact/@phoneNumber",
+          "fieldType" : "STRING",
+          "name" : "phoneNumber"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "docId" : "DOCID:JSON:CONTACT:T",
+          "path" : "/phoneNumber",
+          "fieldType" : "STRING",
+          "name" : "phoneNumber"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.v2.PropertyField",
+          "path" : "/testProp",
+          "fieldType" : "STRING",
+          "scope" : "DOCID:JAVA:CONTACT:S",
+          "name" : "testProp"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.v2.PropertyField",
+          "path" : "/target-exchange",
+          "fieldType" : "STRING",
+          "scope" : "camelExchangeProperty",
+          "name" : "target-exchange"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.v2.PropertyField",
+          "path" : "/testProp",
+          "fieldType" : "STRING",
+          "scope" : "DOCID:JSON:CONTACT:S",
+          "name" : "testProp"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.v2.PropertyField",
+          "path" : "/testProp",
+          "fieldType" : "STRING",
+          "scope" : "camelExchangeProperty",
+          "name" : "testProp"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.v2.PropertyField",
+          "path" : "/testProp",
+          "fieldType" : "STRING",
+          "scope" : "DOCID:XML:CONTACT:S",
+          "name" : "testProp"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.v2.PropertyField",
+          "path" : "/testProp",
+          "fieldType" : "STRING",
+          "name" : "testProp"
+        } ]
+      } ]
+    },
+    "lookupTables" : {
+      "lookupTable" : [ ]
+    },
+    "properties" : {
+      "property" : [ ]
+    },
+    "name" : "mockMapping"
+  }
+}
diff --git a/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-multins.json b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-multins.json
new file mode 100644
index 0000000..5e02d89
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-multins.json
@@ -0,0 +1,52 @@
+{
+  "AtlasMapping" : {
+    "jsonType" : "io.atlasmap.v2.AtlasMapping",
+    "dataSource" : [ {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "SourceContact",
+      "uri" : "atlas:java:SourceContact?className=io.atlasmap.java.test.SourceContact",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.xml.v2.XmlDataSource",
+      "id" : "XMLSchemaTarget",
+      "uri" : "atlas:xml:XMLSchemaTarget",
+      "dataSourceType" : "TARGET",
+      "xmlNamespaces" : {
+        "xmlNamespace" : [ {
+          "alias" : "tns",
+          "uri" : "http://syndesis.io/v1/swagger-connector-template/request"
+        } ]
+      }
+    } ],
+    "mappings" : {
+      "mapping" : [ {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "SourceContact",
+          "path" : "/firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName",
+          "getMethod" : "getFirstName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.xml.v2.XmlField",
+          "docId" : "XMLSchemaTarget",
+          "path" : "/tns:request/tns:body/Pet/name",
+          "fieldType" : "STRING",
+          "name" : "name",
+          "userCreated" : false
+        } ],
+        "id" : "mapping.222691"
+      } ]
+    },
+    "lookupTables" : {
+      "lookupTable" : [ ]
+    },
+    "properties" : {
+      "property" : [ ]
+    },
+    "name" : "UI.860284"
+  }
+}
diff --git a/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-singledoc.json b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-singledoc.json
new file mode 100644
index 0000000..2175e75
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-singledoc.json
@@ -0,0 +1,65 @@
+{
+  "AtlasMapping" : {
+    "jsonType" : "io.atlasmap.v2.AtlasMapping",
+    "dataSource" : [ {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JAVA:CONTACT:S",
+      "uri" : "atlas:java?className=io.atlasmap.java.test.SourceContact",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JSON:CONTACT:S",
+      "uri" : "atlas:json:JSONContact",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:XML:CONTACT:S",
+      "uri" : "atlas:xml:XMLContact",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JAVA:CONTACT:T",
+      "uri" : "atlas:java?className=io.atlasmap.java.test.TargetContact",
+      "dataSourceType" : "TARGET"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:JSON:CONTACT:T",
+      "uri" : "atlas:json:JSONContact",
+      "dataSourceType" : "TARGET"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "id" : "DOCID:XML:CONTACT:T",
+      "uri" : "atlas:xml:XMLContact",
+      "dataSourceType" : "TARGET"
+    } ],
+    "mappings" : {
+      "mapping" : [ {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:S",
+          "path" : "/firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName",
+          "getMethod" : "getFirstName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "docId" : "DOCID:JAVA:CONTACT:T",
+          "path" : "/firstName",
+          "fieldType" : "STRING",
+          "name" : "firstName",
+          "setMethod" : "setFirstName"
+        } ]
+      } ]
+    },
+    "lookupTables" : {
+      "lookupTable" : [ ]
+    },
+    "properties" : {
+      "property" : [ ]
+    },
+    "name" : "mockMapping"
+  }
+}
diff --git a/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-xml-to-xml.json b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-xml-to-xml.json
new file mode 100644
index 0000000..a744e95
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping-xml-to-xml.json
@@ -0,0 +1,66 @@
+{
+  "AtlasMapping": {
+    "dataSource": [
+      {
+        "dataSourceType": "SOURCE",
+        "id": "-LO2lWtkzmk816-JEluS",
+        "jsonType": "io.atlasmap.xml.v2.XmlDataSource",
+        "uri": "atlas:xml:-LO2lWtkzmk816-JEluS",
+        "xmlNamespaces": {
+          "xmlNamespace": [
+            {
+              "alias": "tns",
+              "uri": "http://hl7.org/fhir"
+            }
+          ]
+        }
+      },
+      {
+        "dataSourceType": "TARGET",
+        "id": "-LO2lU-dzmk816-JEluS",
+        "jsonType": "io.atlasmap.xml.v2.XmlDataSource",
+        "uri": "atlas:xml:-LO2lU-dzmk816-JEluS",
+        "xmlNamespaces": {
+          "xmlNamespace": [
+            {
+              "alias": "tns",
+              "targetNamespace": true,
+              "uri": "http://hl7.org/fhir"
+            }
+          ]
+        }
+      }
+    ],
+    "jsonType": "io.atlasmap.v2.AtlasMapping",
+    "mappings": {
+      "mapping": [
+        {
+          "id": "mapping.431884",
+          "inputField": [
+            {
+              "docId": "-LO2lWtkzmk816-JEluS",
+              "fieldType": "STRING",
+              "jsonType": "io.atlasmap.xml.v2.XmlField",
+              "name": "value",
+              "path": "/tns:Patient/tns:id/@value",
+              "userCreated": false
+            }
+          ],
+          "jsonType": "io.atlasmap.v2.Mapping",
+          "mappingType": "MAP",
+          "outputField": [
+            {
+              "docId": "-LO2lU-dzmk816-JEluS",
+              "fieldType": "STRING",
+              "jsonType": "io.atlasmap.xml.v2.XmlField",
+              "name": "value",
+              "path": "/tns:Patient/tns:id/@value",
+              "userCreated": false
+            }
+          ]
+        }
+      ]
+    },
+    "name": "UI.266964"
+  }
+}
diff --git a/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping.json b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping.json
new file mode 100644
index 0000000..d938e0c
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/atlasmapping-json/atlasmapping.json
@@ -0,0 +1,95 @@
+{
+  "AtlasMapping" : {
+    "jsonType" : "io.atlasmap.v2.AtlasMapping",
+    "dataSource" : [ {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "uri" : "atlas:java?className=twitter4j.Status",
+      "dataSourceType" : "SOURCE"
+    }, {
+      "jsonType" : "io.atlasmap.v2.DataSource",
+      "uri" : "atlas:json:JSONContact",
+      "dataSourceType" : "TARGET"
+    } ],
+    "mappings" : {
+      "mapping" : [ {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "SEPARATE",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "path" : "/User/name",
+          "fieldType" : "STRING",
+          "name" : "Name",
+          "getMethod" : "getName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "index" : 0,
+          "path" : "/FirstName",
+          "fieldType" : "STRING",
+          "name" : "FirstName"
+        }, {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "index" : 1,
+          "path" : "/LastName",
+          "fieldType" : "STRING",
+          "name" : "LastName"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "path" : "/Text",
+          "fieldType" : "STRING",
+          "name" : "Text",
+          "getMethod" : "getText"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "path" : "/Description",
+          "fieldType" : "STRING",
+          "name" : "Description"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.java.v2.JavaField",
+          "path" : "/User/screenName",
+          "fieldType" : "STRING",
+          "name" : "ScreenName",
+          "getMethod" : "getScreenName"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "path" : "/Title",
+          "fieldType" : "STRING",
+          "name" : "Title"
+        } ]
+      }, {
+        "jsonType" : "io.atlasmap.v2.Mapping",
+        "mappingType" : "MAP",
+        "inputField" : [ {
+          "jsonType" : "io.atlasmap.v2.ConstantField",
+          "value" : "const foobar",
+          "docId" : "DOC.Constants.973849",
+          "path" : "/foobar",
+          "fieldType" : "STRING"
+        } ],
+        "outputField" : [ {
+          "jsonType" : "io.atlasmap.json.v2.JsonField",
+          "path" : "/Constant",
+          "fieldType" : "STRING",
+          "name" : "Constant"
+        } ]
+      } ]
+    },
+    "lookupTables" : {
+      "lookupTable" : [ ]
+    },
+    "properties" : {
+      "property" : [ ]
+    },
+    "name" : "mockMapping"
+  }
+}
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapExtractMappingsTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapExtractMappingsTest-context.xml
new file mode 100644
index 0000000..026368c
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapExtractMappingsTest-context.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:adm/atlasmap-mapping.adm" />
+            <to uri="mock:result" />
+        </route>
+        <route>
+            <from uri="direct:start-n" />
+            <to uri="atlasmap:adm/atlasmap-mapping-n.adm" />
+            <to uri="mock:result-n" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapJavaToJsonTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapJavaToJsonTest-context.xml
new file mode 100644
index 0000000..f3c4a94
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapJavaToJsonTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-java-to-json.json" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonTest-context.xml
new file mode 100644
index 0000000..bbb860e
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping.json" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonToJavaTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonToJavaTest-context.xml
new file mode 100644
index 0000000..2f1271b
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonToJavaTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-json-to-java.json" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonToXmlSchemaTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonToXmlSchemaTest-context.xml
new file mode 100644
index 0000000..528fed6
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapJsonToXmlSchemaTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:adm/json-schema-source-to-xml-schema-target.adm" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapMultiDocsTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapMultiDocsTest-context.xml
new file mode 100644
index 0000000..eab04e7
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapMultiDocsTest-context.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-multidocs.json?sourceMapName=CAPTURED_OUT_MESSAGES_MAP&amp;targetMapName=TARGET_MESSAGES_MAP" />
+            <to uri="mock:result" />
+        </route>
+        <route>
+            <from uri="direct:start-body" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-multidocs.json" />
+            <to uri="mock:result-body" />
+        </route>
+        <route>
+            <from uri="direct:start-header" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-multidocs.json?targetMapMode=MESSAGE_HEADER" />
+            <to uri="mock:result-body" />
+        </route>
+        <route>
+            <from uri="direct:start-exchange-property" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-multidocs.json?targetMapMode=EXCHANGE_PROPERTY" />
+            <to uri="mock:result-body" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapMultiNSTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapMultiNSTest-context.xml
new file mode 100644
index 0000000..198d54d
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapMultiNSTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-multins.json" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapSingleDocTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapSingleDocTest-context.xml
new file mode 100644
index 0000000..ea7ab94
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapSingleDocTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-singledoc.json" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapTest-context.xml
new file mode 100644
index 0000000..bbb860e
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping.json" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/context/AtlasMapXmlToXmlTest-context.xml b/components/camel-atlasmap/src/test/resources/context/AtlasMapXmlToXmlTest-context.xml
new file mode 100644
index 0000000..077eb24
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/context/AtlasMapXmlToXmlTest-context.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="
+       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
+       http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">
+
+    <camelContext xmlns="http://camel.apache.org/schema/spring">
+        <route>
+            <from uri="direct:start" />
+            <to uri="atlasmap:atlasmapping-json/atlasmapping-xml-to-xml.json" />
+            <to uri="mock:result" />
+        </route>
+    </camelContext>
+
+</beans>
diff --git a/components/camel-atlasmap/src/test/resources/json-source.json b/components/camel-atlasmap/src/test/resources/json-source.json
new file mode 100644
index 0000000..40e76ed
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/json-source.json
@@ -0,0 +1,47 @@
+{
+  "order": {
+    "address": {
+      "street": "123 any st",
+      "city": "Austin",
+      "state": "TX",
+      "zip": "78626"
+    },
+    "contact": {
+      "firstName": "james",
+      "lastName": "smith",
+      "phone": "512-123-1234"
+    },
+    "orderId": "123"
+  },
+  "primitives": {
+    "stringPrimitive": "some value",
+    "booleanPrimitive": true,
+    "numberPrimitive": 24
+  },
+  "addressList": [
+    {
+      "street": "123 any st",
+      "city": "Austin",
+      "state": "TX",
+      "zip": "78626"
+    },
+    {
+      "street": "123 any st",
+      "city": "Austin",
+      "state": "TX",
+      "zip": "78626"
+    },
+    {
+      "street": "123 any st",
+      "city": "Austin",
+      "state": "TX",
+      "zip": "78626"
+    },
+    {
+      "street": "123 any st",
+      "city": "Austin",
+      "state": "TX",
+      "zip": "78626"
+    }
+  ]
+}
diff --git a/components/camel-atlasmap/src/test/resources/log4j2.properties b/components/camel-atlasmap/src/test/resources/log4j2.properties
new file mode 100644
index 0000000..21a3e48
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/log4j2.properties
@@ -0,0 +1,28 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+
+appender.file.type = File
+appender.file.name = file
+appender.file.fileName = target/camel-atlasmap-test.log
+appender.file.layout.type = PatternLayout
+appender.file.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+appender.out.type = Console
+appender.out.name = out
+appender.out.layout.type = PatternLayout
+appender.out.layout.pattern = %d [%-15.15t] %-5p %-30.30c{1} - %m%n
+rootLogger.level = INFO
+rootLogger.appenderRef.file.ref = file
diff --git a/components/camel-atlasmap/src/test/resources/xml-target-schemaset.xml b/components/camel-atlasmap/src/test/resources/xml-target-schemaset.xml
new file mode 100644
index 0000000..a9ca2e8
--- /dev/null
+++ b/components/camel-atlasmap/src/test/resources/xml-target-schemaset.xml
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    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.
+
+-->
+<d:SchemaSet xmlns:d="http://atlasmap.io/xml/schemaset/v2"
+    xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+    <xsd:schema
+        targetNamespace="http://syndesis.io/v1/swagger-connector-template/request"
+        elementFormDefault="qualified">
+        <xsd:element name="request">
+            <xsd:complexType>
+                <xsd:sequence>
+                    <xsd:element name="body">
+                        <xsd:complexType>
+                            <xsd:sequence>
+                                <xsd:element ref="Pet" />
+                            </xsd:sequence>
+                        </xsd:complexType>
+                    </xsd:element>
+                </xsd:sequence>
+            </xsd:complexType>
+        </xsd:element>
+    </xsd:schema>
+    <d:AdditionalSchemas>
+        <xsd:schema>
+            <xsd:element name="Pet">
+                <xsd:complexType>
+                    <xsd:sequence>
+                        <xsd:element name="id"
+                            type="xsd:decimal" minOccurs="0" />
+                        <xsd:element name="Category">
+                            <xsd:complexType>
+                                <xsd:sequence>
+                                    <xsd:element name="id"
+                                        type="xsd:decimal" minOccurs="0" />
+                                    <xsd:element name="name"
+                                        type="xsd:string" />
+                                </xsd:sequence>
+                            </xsd:complexType>
+                        </xsd:element>
+                        <xsd:element name="name"
+                            type="xsd:string" />
+                        <xsd:element name="photoUrl"
+                            minOccurs="0">
+                            <xsd:complexType>
+                                <xsd:sequence>
+                                    <xsd:element
+                                        name="photoUrl"
+                                        type="xsd:string"
+                                        maxOccurs="unbounded"
+                                        minOccurs="0" />
+                                </xsd:sequence>
+                            </xsd:complexType>
+                        </xsd:element>
+                        <xsd:element name="tag"
+                            minOccurs="0">
+                            <xsd:complexType>
+                                <xsd:sequence>
+                                    <xsd:element name="Tag"
+                                        maxOccurs="unbounded"
+                                        minOccurs="0">
+                                        <xsd:complexType>
+                                            <xsd:sequence>
+                                                <xsd:element
+                                                    name="id"
+                                                    type="xsd:decimal" />
+                                                <xsd:element
+                                                    name="name"
+                                                    type="xsd:string" />
+                                            </xsd:sequence>
+                                        </xsd:complexType>
+                                    </xsd:element>
+                                </xsd:sequence>
+                            </xsd:complexType>
+                        </xsd:element>
+                        <xsd:element name="status"
+                            type="xsd:string" />
+                    </xsd:sequence>
+                </xsd:complexType>
+            </xsd:element>
+        </xsd:schema>
+    </d:AdditionalSchemas>
+</d:SchemaSet>
diff --git a/components/pom.xml b/components/pom.xml
index f6eb73a..f7aa5b2 100644
--- a/components/pom.xml
+++ b/components/pom.xml
@@ -99,6 +99,7 @@
         <module>camel-as2</module>
         <module>camel-asn1</module>
         <module>camel-asterisk</module>
+        <module>camel-atlasmap</module>
         <module>camel-atmos</module>
         <module>camel-atmosphere-websocket</module>
         <module>camel-atom</module>
diff --git a/core/camel-allcomponents/pom.xml b/core/camel-allcomponents/pom.xml
index 67c4b90..bea3f73 100644
--- a/core/camel-allcomponents/pom.xml
+++ b/core/camel-allcomponents/pom.xml
@@ -76,6 +76,10 @@
 		</dependency>
 		<dependency>
 			<groupId>org.apache.camel</groupId>
+			<artifactId>camel-atlasmap</artifactId>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.camel</groupId>
 			<artifactId>camel-atmos</artifactId>
 		</dependency>
 		<dependency>
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
index 5f64781..c18fcd2 100644
--- a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/ComponentsBuilderFactory.java
@@ -129,6 +129,17 @@ public interface ComponentsBuilderFactory {
         return org.apache.camel.builder.component.dsl.AsteriskComponentBuilderFactory.asterisk();
     }
     /**
+     * AtlasMap (camel-atlasmap)
+     * Transforms the message using an AtlasMap transformation.
+     * 
+     * Category: transformation
+     * Since: 3.7
+     * Maven coordinates: org.apache.camel:camel-atlasmap
+     */
+    static org.apache.camel.builder.component.dsl.AtlasmapComponentBuilderFactory.AtlasmapComponentBuilder atlasmap() {
+        return org.apache.camel.builder.component.dsl.AtlasmapComponentBuilderFactory.atlasmap();
+    }
+    /**
      * Atmos (camel-atmos)
      * Integrate with EMC's ViPR object data services using the Atmos Client.
      * 
diff --git a/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AtlasmapComponentBuilderFactory.java b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AtlasmapComponentBuilderFactory.java
new file mode 100644
index 0000000..db7e28f
--- /dev/null
+++ b/core/camel-componentdsl/src/generated/java/org/apache/camel/builder/component/dsl/AtlasmapComponentBuilderFactory.java
@@ -0,0 +1,124 @@
+/*
+ * 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.
+ */
+package org.apache.camel.builder.component.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.Component;
+import org.apache.camel.builder.component.AbstractComponentBuilder;
+import org.apache.camel.builder.component.ComponentBuilder;
+import org.apache.camel.component.atlasmap.AtlasMapComponent;
+
+/**
+ * Transforms the message using an AtlasMap transformation.
+ * 
+ * Generated by camel-package-maven-plugin - do not edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.ComponentDslMojo")
+public interface AtlasmapComponentBuilderFactory {
+
+    /**
+     * AtlasMap (camel-atlasmap)
+     * Transforms the message using an AtlasMap transformation.
+     * 
+     * Category: transformation
+     * Since: 3.7
+     * Maven coordinates: org.apache.camel:camel-atlasmap
+     */
+    static AtlasmapComponentBuilder atlasmap() {
+        return new AtlasmapComponentBuilderImpl();
+    }
+
+    /**
+     * Builder for the AtlasMap component.
+     */
+    interface AtlasmapComponentBuilder
+            extends
+                ComponentBuilder<AtlasMapComponent> {
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default AtlasmapComponentBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * To use the AtlasContextFactory otherwise a new engine is created.
+         * 
+         * The option is a: <code>io.atlasmap.api.AtlasContextFactory</code>
+         * type.
+         * 
+         * Group: advanced
+         */
+        default AtlasmapComponentBuilder atlasContextFactory(
+                io.atlasmap.api.AtlasContextFactory atlasContextFactory) {
+            doSetProperty("atlasContextFactory", atlasContextFactory);
+            return this;
+        }
+        /**
+         * Whether the component should use basic property binding (Camel 2.x)
+         * or the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        @Deprecated
+        default AtlasmapComponentBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+    }
+
+    class AtlasmapComponentBuilderImpl
+            extends
+                AbstractComponentBuilder<AtlasMapComponent>
+            implements
+                AtlasmapComponentBuilder {
+        @Override
+        protected AtlasMapComponent buildConcreteComponent() {
+            return new AtlasMapComponent();
+        }
+        @Override
+        protected boolean setPropertyOnComponent(
+                Component component,
+                String name,
+                Object value) {
+            switch (name) {
+            case "lazyStartProducer": ((AtlasMapComponent) component).setLazyStartProducer((boolean) value); return true;
+            case "atlasContextFactory": ((AtlasMapComponent) component).setAtlasContextFactory((io.atlasmap.api.AtlasContextFactory) value); return true;
+            case "basicPropertyBinding": ((AtlasMapComponent) component).setBasicPropertyBinding((boolean) value); return true;
+            default: return false;
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/core/camel-componentdsl/src/generated/resources/metadata.json b/core/camel-componentdsl/src/generated/resources/metadata.json
index 8d38fc3..f670cfc 100644
--- a/core/camel-componentdsl/src/generated/resources/metadata.json
+++ b/core/camel-componentdsl/src/generated/resources/metadata.json
@@ -201,6 +201,28 @@
     "producerOnly": false,
     "lenientProperties": false
   },
+  "AtlasmapComponentBuilderFactory": {
+    "kind": "component",
+    "name": "atlasmap",
+    "title": "AtlasMap",
+    "description": "Transforms the message using an AtlasMap transformation.",
+    "deprecated": false,
+    "firstVersion": "3.7.0",
+    "label": "transformation",
+    "javaType": "org.apache.camel.component.atlasmap.AtlasMapComponent",
+    "supportLevel": "Preview",
+    "groupId": "org.apache.camel",
+    "artifactId": "camel-atlasmap",
+    "version": "3.6.0-SNAPSHOT",
+    "scheme": "atlasmap",
+    "extendsScheme": "",
+    "syntax": "atlasmap:resourceUri",
+    "async": false,
+    "api": false,
+    "consumerOnly": false,
+    "producerOnly": true,
+    "lenientProperties": false
+  },
   "AtmosComponentBuilderFactory": {
     "kind": "component",
     "name": "atmos",
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
index 5c242fd..7294391 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilderFactory.java
@@ -38,6 +38,7 @@ public interface EndpointBuilderFactory
             org.apache.camel.builder.endpoint.dsl.ArangoDbEndpointBuilderFactory.ArangoDbBuilders,
             org.apache.camel.builder.endpoint.dsl.AsteriskEndpointBuilderFactory.AsteriskBuilders,
             org.apache.camel.builder.endpoint.dsl.Athena2EndpointBuilderFactory.Athena2Builders,
+            org.apache.camel.builder.endpoint.dsl.AtlasMapEndpointBuilderFactory.AtlasMapBuilders,
             org.apache.camel.builder.endpoint.dsl.AtmosEndpointBuilderFactory.AtmosBuilders,
             org.apache.camel.builder.endpoint.dsl.AtmosphereWebsocketEndpointBuilderFactory.AtmosphereWebsocketBuilders,
             org.apache.camel.builder.endpoint.dsl.AtomEndpointBuilderFactory.AtomBuilders,
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
index 7052b2f..9be13af 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/EndpointBuilders.java
@@ -35,6 +35,7 @@ public interface EndpointBuilders
             org.apache.camel.builder.endpoint.dsl.ArangoDbEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.AsteriskEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.Athena2EndpointBuilderFactory,
+            org.apache.camel.builder.endpoint.dsl.AtlasMapEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.AtmosEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.AtmosphereWebsocketEndpointBuilderFactory,
             org.apache.camel.builder.endpoint.dsl.AtomEndpointBuilderFactory,
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
index 16a0f47..d5e450c 100644
--- a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/StaticEndpointBuilders.java
@@ -390,6 +390,55 @@ public class StaticEndpointBuilders {
         return org.apache.camel.builder.endpoint.dsl.AsteriskEndpointBuilderFactory.endpointBuilder(componentName, path);
     }
     /**
+     * AtlasMap (camel-atlasmap)
+     * Transforms the message using an AtlasMap transformation.
+     * 
+     * Category: transformation
+     * Since: 3.7
+     * Maven coordinates: org.apache.camel:camel-atlasmap
+     * 
+     * Syntax: <code>atlasmap:resourceUri</code>
+     * 
+     * Path parameter: resourceUri (required)
+     * Path to the resource. You can prefix with: classpath, file, http, ref, or
+     * bean. classpath, file and http loads the resource using these protocols
+     * (classpath is default). ref will lookup the resource in the registry.
+     * bean will call a method on a bean to be used as the resource. For bean
+     * you can specify the method name after dot, eg bean:myBean.myMethod.
+     * 
+     * @param path resourceUri
+     */
+    public static org.apache.camel.builder.endpoint.dsl.AtlasMapEndpointBuilderFactory.AtlasMapEndpointBuilder atlasmap(
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.AtlasMapEndpointBuilderFactory.endpointBuilder("atlasmap", path);
+    }
+    /**
+     * AtlasMap (camel-atlasmap)
+     * Transforms the message using an AtlasMap transformation.
+     * 
+     * Category: transformation
+     * Since: 3.7
+     * Maven coordinates: org.apache.camel:camel-atlasmap
+     * 
+     * Syntax: <code>atlasmap:resourceUri</code>
+     * 
+     * Path parameter: resourceUri (required)
+     * Path to the resource. You can prefix with: classpath, file, http, ref, or
+     * bean. classpath, file and http loads the resource using these protocols
+     * (classpath is default). ref will lookup the resource in the registry.
+     * bean will call a method on a bean to be used as the resource. For bean
+     * you can specify the method name after dot, eg bean:myBean.myMethod.
+     * 
+     * @param componentName to use a custom component name for the endpoint
+     * instead of the default name
+     * @param path resourceUri
+     */
+    public static org.apache.camel.builder.endpoint.dsl.AtlasMapEndpointBuilderFactory.AtlasMapEndpointBuilder atlasmap(
+            String componentName,
+            String path) {
+        return org.apache.camel.builder.endpoint.dsl.AtlasMapEndpointBuilderFactory.endpointBuilder(componentName, path);
+    }
+    /**
      * Atmos (camel-atmos)
      * Integrate with EMC's ViPR object data services using the Atmos Client.
      * 
diff --git a/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AtlasMapEndpointBuilderFactory.java b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AtlasMapEndpointBuilderFactory.java
new file mode 100644
index 0000000..dc8c898
--- /dev/null
+++ b/core/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/AtlasMapEndpointBuilderFactory.java
@@ -0,0 +1,358 @@
+/*
+ * 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.
+ */
+package org.apache.camel.builder.endpoint.dsl;
+
+import javax.annotation.Generated;
+import org.apache.camel.builder.EndpointConsumerBuilder;
+import org.apache.camel.builder.EndpointProducerBuilder;
+import org.apache.camel.builder.endpoint.AbstractEndpointBuilder;
+
+/**
+ * Transforms the message using an AtlasMap transformation.
+ * 
+ * Generated by camel build tools - do NOT edit this file!
+ */
+@Generated("org.apache.camel.maven.packaging.EndpointDslMojo")
+public interface AtlasMapEndpointBuilderFactory {
+
+
+    /**
+     * Builder for endpoint for the AtlasMap component.
+     */
+    public interface AtlasMapEndpointBuilder extends EndpointProducerBuilder {
+        default AdvancedAtlasMapEndpointBuilder advanced() {
+            return (AdvancedAtlasMapEndpointBuilder) this;
+        }
+        /**
+         * Sets whether the context map should allow access to all details. By
+         * default only the message body and headers can be accessed. This
+         * option can be enabled for full access to the current Exchange and
+         * CamelContext. Doing so impose a potential security risk as this opens
+         * access to the full power of CamelContext API.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder allowContextMapAll(
+                boolean allowContextMapAll) {
+            doSetProperty("allowContextMapAll", allowContextMapAll);
+            return this;
+        }
+        /**
+         * Sets whether the context map should allow access to all details. By
+         * default only the message body and headers can be accessed. This
+         * option can be enabled for full access to the current Exchange and
+         * CamelContext. Doing so impose a potential security risk as this opens
+         * access to the full power of CamelContext API.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder allowContextMapAll(
+                String allowContextMapAll) {
+            doSetProperty("allowContextMapAll", allowContextMapAll);
+            return this;
+        }
+        /**
+         * Sets whether to use resource content cache or not.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder contentCache(boolean contentCache) {
+            doSetProperty("contentCache", contentCache);
+            return this;
+        }
+        /**
+         * Sets whether to use resource content cache or not.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder contentCache(String contentCache) {
+            doSetProperty("contentCache", contentCache);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder lazyStartProducer(
+                boolean lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * Whether the producer should be started lazy (on the first message).
+         * By starting lazy you can use this to allow CamelContext and routes to
+         * startup in situations where a producer may otherwise fail during
+         * starting and cause the route to fail being started. By deferring this
+         * startup to be lazy then the startup failure can be handled during
+         * routing messages via Camel's routing error handlers. Beware that when
+         * the first message is processed then creating and starting the
+         * producer may take a little time and prolong the total processing time
+         * of the processing.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder lazyStartProducer(
+                String lazyStartProducer) {
+            doSetProperty("lazyStartProducer", lazyStartProducer);
+            return this;
+        }
+        /**
+         * The Exchange property name for a source message map which hold
+         * java.util.Map&lt;String, Message&gt; where the key is AtlasMap
+         * Document ID. AtlasMap consumes Message bodies as source documents, as
+         * well as message headers as source properties where the scope equals
+         * to Document ID.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder sourceMapName(String sourceMapName) {
+            doSetProperty("sourceMapName", sourceMapName);
+            return this;
+        }
+        /**
+         * TargetMapMode enum value to specify how multiple target documents are
+         * delivered if exist. 'MAP': Stores them into a java.util.Map, and the
+         * java.util.Map is set to an exchange property if 'targetMapName' is
+         * specified, otherwise message body. 'MESSAGE_HEADER': Stores them into
+         * message headers. 'EXCHANGE_PROPERTY': Stores them into exchange
+         * properties. ).
+         * 
+         * The option is a:
+         * <code>org.apache.camel.component.atlasmap.AtlasMapEndpoint$TargetMapMode</code> type.
+         * 
+         * Default: MAP
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder targetMapMode(
+                TargetMapMode targetMapMode) {
+            doSetProperty("targetMapMode", targetMapMode);
+            return this;
+        }
+        /**
+         * TargetMapMode enum value to specify how multiple target documents are
+         * delivered if exist. 'MAP': Stores them into a java.util.Map, and the
+         * java.util.Map is set to an exchange property if 'targetMapName' is
+         * specified, otherwise message body. 'MESSAGE_HEADER': Stores them into
+         * message headers. 'EXCHANGE_PROPERTY': Stores them into exchange
+         * properties. ).
+         * 
+         * The option will be converted to a
+         * <code>org.apache.camel.component.atlasmap.AtlasMapEndpoint$TargetMapMode</code> type.
+         * 
+         * Default: MAP
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder targetMapMode(String targetMapMode) {
+            doSetProperty("targetMapMode", targetMapMode);
+            return this;
+        }
+        /**
+         * The Exchange property name for a target document map which hold
+         * java.util.Map&lt;String, Object&gt; where the key is AtlasMap
+         * Document ID. AtlasMap populates multiple target documents into this
+         * map.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: producer
+         */
+        default AtlasMapEndpointBuilder targetMapName(String targetMapName) {
+            doSetProperty("targetMapName", targetMapName);
+            return this;
+        }
+    }
+
+    /**
+     * Advanced builder for endpoint for the AtlasMap component.
+     */
+    public interface AdvancedAtlasMapEndpointBuilder
+            extends
+                EndpointProducerBuilder {
+        default AtlasMapEndpointBuilder basic() {
+            return (AtlasMapEndpointBuilder) this;
+        }
+        /**
+         * Whether the endpoint should use basic property binding (Camel 2.x) or
+         * the newer property binding with additional capabilities.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedAtlasMapEndpointBuilder basicPropertyBinding(
+                boolean basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * Whether the endpoint should use basic property binding (Camel 2.x) or
+         * the newer property binding with additional capabilities.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedAtlasMapEndpointBuilder basicPropertyBinding(
+                String basicPropertyBinding) {
+            doSetProperty("basicPropertyBinding", basicPropertyBinding);
+            return this;
+        }
+        /**
+         * The URI of the properties file which is used for AtlasContextFactory
+         * initialization.
+         * 
+         * The option is a: <code>java.lang.String</code> type.
+         * 
+         * Group: advanced
+         */
+        default AdvancedAtlasMapEndpointBuilder propertiesFile(
+                String propertiesFile) {
+            doSetProperty("propertiesFile", propertiesFile);
+            return this;
+        }
+        /**
+         * Sets whether synchronous processing should be strictly used, or Camel
+         * is allowed to use asynchronous processing (if supported).
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedAtlasMapEndpointBuilder synchronous(boolean synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+        /**
+         * Sets whether synchronous processing should be strictly used, or Camel
+         * is allowed to use asynchronous processing (if supported).
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: false
+         * Group: advanced
+         */
+        default AdvancedAtlasMapEndpointBuilder synchronous(String synchronous) {
+            doSetProperty("synchronous", synchronous);
+            return this;
+        }
+    }
+
+    /**
+     * Proxy enum for
+     * <code>org.apache.camel.component.atlasmap.AtlasMapEndpoint$TargetMapMode</code> enum.
+     */
+    enum TargetMapMode {
+        MAP,
+        MESSAGE_HEADER,
+        EXCHANGE_PROPERTY;
+    }
+
+    public interface AtlasMapBuilders {
+        /**
+         * AtlasMap (camel-atlasmap)
+         * Transforms the message using an AtlasMap transformation.
+         * 
+         * Category: transformation
+         * Since: 3.7
+         * Maven coordinates: org.apache.camel:camel-atlasmap
+         * 
+         * Syntax: <code>atlasmap:resourceUri</code>
+         * 
+         * Path parameter: resourceUri (required)
+         * Path to the resource. You can prefix with: classpath, file, http,
+         * ref, or bean. classpath, file and http loads the resource using these
+         * protocols (classpath is default). ref will lookup the resource in the
+         * registry. bean will call a method on a bean to be used as the
+         * resource. For bean you can specify the method name after dot, eg
+         * bean:myBean.myMethod.
+         * 
+         * @param path resourceUri
+         */
+        default AtlasMapEndpointBuilder atlasmap(String path) {
+            return AtlasMapEndpointBuilderFactory.endpointBuilder("atlasmap", path);
+        }
+        /**
+         * AtlasMap (camel-atlasmap)
+         * Transforms the message using an AtlasMap transformation.
+         * 
+         * Category: transformation
+         * Since: 3.7
+         * Maven coordinates: org.apache.camel:camel-atlasmap
+         * 
+         * Syntax: <code>atlasmap:resourceUri</code>
+         * 
+         * Path parameter: resourceUri (required)
+         * Path to the resource. You can prefix with: classpath, file, http,
+         * ref, or bean. classpath, file and http loads the resource using these
+         * protocols (classpath is default). ref will lookup the resource in the
+         * registry. bean will call a method on a bean to be used as the
+         * resource. For bean you can specify the method name after dot, eg
+         * bean:myBean.myMethod.
+         * 
+         * @param componentName to use a custom component name for the endpoint
+         * instead of the default name
+         * @param path resourceUri
+         */
+        default AtlasMapEndpointBuilder atlasmap(
+                String componentName,
+                String path) {
+            return AtlasMapEndpointBuilderFactory.endpointBuilder(componentName, path);
+        }
+    }
+    static AtlasMapEndpointBuilder endpointBuilder(
+            String componentName,
+            String path) {
+        class AtlasMapEndpointBuilderImpl extends AbstractEndpointBuilder implements AtlasMapEndpointBuilder, AdvancedAtlasMapEndpointBuilder {
+            public AtlasMapEndpointBuilderImpl(String path) {
+                super(componentName, path);
+            }
+        }
+        return new AtlasMapEndpointBuilderImpl(path);
+    }
+}
\ No newline at end of file
diff --git a/docs/components/modules/ROOT/nav.adoc b/docs/components/modules/ROOT/nav.adoc
index 1fc770a..9d0e732 100644
--- a/docs/components/modules/ROOT/nav.adoc
+++ b/docs/components/modules/ROOT/nav.adoc
@@ -10,6 +10,7 @@
 ** xref:asterisk-component.adoc[Asterisk]
 ** xref:ahc-component.adoc[Async HTTP Client (AHC)]
 ** xref:ahc-ws-component.adoc[Async HTTP Client (AHC) Websocket]
+** xref:atlasmap-component.adoc[AtlasMap]
 ** xref:atmos-component.adoc[Atmos]
 ** xref:atmosphere-websocket-component.adoc[Atmosphere Websocket]
 ** xref:atom-component.adoc[Atom]
diff --git a/docs/components/modules/ROOT/pages/atlasmap-component.adoc b/docs/components/modules/ROOT/pages/atlasmap-component.adoc
new file mode 100644
index 0000000..f2d2521
--- /dev/null
+++ b/docs/components/modules/ROOT/pages/atlasmap-component.adoc
@@ -0,0 +1,118 @@
+[[atlasmap-component]]
+= AtlasMap Component
+//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
+:page-source: components/camel-atlasmap/src/main/docs/atlasmap-component.adoc
+:docTitle: AtlasMap
+:artifactId: camel-atlasmap
+:description: Transforms the message using an AtlasMap transformation.
+:since: 3.7
+:supportLevel: Preview
+:component-header: Only producer is supported
+include::{cq-version}@camel-quarkus:ROOT:partial$reference/components/atlasmap.adoc[]
+
+*Since Camel {since}*
+
+*{component-header}*
+
+The AtlasMap component allows you to process data mapping using an
+http://www.atlasmap.io/[AtlasMap] data mapping definition. It could be
+either an ADM archive file or mapping definition JSON file.
+
+Maven users will need to add the following dependency to their `pom.xml`
+for this component:
+
+[source,xml]
+------------------------------------------------------------
+<dependency>
+    <groupId>org.apache.camel</groupId>
+    <artifactId>camel-atlasmap</artifactId>
+    <version>x.x.x</version>
+    <!-- use the same version as your Camel core version -->
+</dependency>
+------------------------------------------------------------
+
+== URI format
+
+[source,java]
+---------------------------
+atlasmap:mappingName[?options]
+---------------------------
+
+Where *mappingName* is the classpath-local URI of the AtlasMap
+mapping definition, either ADM archive file or mapping definition JSON file
+ to process.
+
+== Options
+
+
+// component options: START
+The AtlasMap component supports 3 options, which are listed below.
+
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *atlasContextFactory* (advanced) | To use the AtlasContextFactory otherwise a new engine is created. |  | AtlasContextFactory
+| *basicPropertyBinding* (advanced) | *Deprecated* Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+|===
+// component options: END
+
+
+
+
+// endpoint options: START
+The AtlasMap endpoint is configured using URI syntax:
+
+----
+atlasmap:resourceUri
+----
+
+with the following path and query parameters:
+
+=== Path Parameters (1 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *resourceUri* | *Required* Path to the resource. You can prefix with: classpath, file, http, ref, or bean. classpath, file and http loads the resource using these protocols (classpath is default). ref will lookup the resource in the registry. bean will call a method on a bean to be used as the resource. For bean you can specify the method name after dot, eg bean:myBean.myMethod. |  | String
+|===
+
+
+=== Query Parameters (9 parameters):
+
+
+[width="100%",cols="2,5,^1,2",options="header"]
+|===
+| Name | Description | Default | Type
+| *allowContextMapAll* (producer) | Sets whether the context map should allow access to all details. By default only the message body and headers can be accessed. This option can be enabled for full access to the current Exchange and CamelContext. Doing so impose a potential security risk as this opens access to the full power of CamelContext API. | false | boolean
+| *contentCache* (producer) | Sets whether to use resource content cache or not | false | boolean
+| *lazyStartProducer* (producer) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and [...]
+| *sourceMapName* (producer) | The Exchange property name for a source message map which hold java.util.Map&lt;String, Message&gt; where the key is AtlasMap Document ID. AtlasMap consumes Message bodies as source documents, as well as message headers as source properties where the scope equals to Document ID. |  | String
+| *targetMapMode* (producer) | TargetMapMode enum value to specify how multiple target documents are delivered if exist. 'MAP': Stores them into a java.util.Map, and the java.util.Map is set to an exchange property if 'targetMapName' is specified, otherwise message body. 'MESSAGE_HEADER': Stores them into message headers. 'EXCHANGE_PROPERTY': Stores them into exchange properties. ). There are 3 enums and the value can be one of: MAP, MESSAGE_HEADER, EXCHANGE_PROPERTY | MAP | TargetMapMode
+| *targetMapName* (producer) | The Exchange property name for a target document map which hold java.util.Map&lt;String, Object&gt; where the key is AtlasMap Document ID. AtlasMap populates multiple target documents into this map. |  | String
+| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
+| *propertiesFile* (advanced) | The URI of the properties file which is used for AtlasContextFactory initialization. |  | String
+| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
+|===
+// endpoint options: END
+
+
+
+
+== Samples
+
+For example you could use something like
+
+[source,java]
+--------------------------------------
+from("activemq:My.Queue").
+  to("atlasmap:atlasmap-mapping.adm");
+--------------------------------------
+
+where you can export an ADM archive file from AtlasMap Data Mapper UI.
+
+
+include::camel-spring-boot::page$atlasmap-starter.adoc[]
diff --git a/parent/pom.xml b/parent/pom.xml
index e0c41fd..b15413d 100644
--- a/parent/pom.xml
+++ b/parent/pom.xml
@@ -66,6 +66,7 @@
         <aspectj-version>1.9.6</aspectj-version>
         <assertj-version>3.17.2</assertj-version>
         <asterisk-java-version>1.0.0-final</asterisk-java-version>
+        <atlasmap-version>2.1.0</atlasmap-version>
         <atlassian-fugue-version>3.0.0</atlassian-fugue-version>
         <atmos-client-version>3.1.0</atmos-client-version>
         <atmosphere-version>2.6.1</atmosphere-version>
@@ -796,6 +797,11 @@
 			</dependency>
 			<dependency>
 				<groupId>org.apache.camel</groupId>
+				<artifactId>camel-atlasmap</artifactId>
+				<version>${project.version}</version>
+			</dependency>
+			<dependency>
+				<groupId>org.apache.camel</groupId>
 				<artifactId>camel-atmos</artifactId>
 				<version>${project.version}</version>
 			</dependency>